Files
Vitor PamplonaandClaude Opus 5.5 395af4dc9c chore(skills): consolidate 33 skills into 14, verified against the tree
The 33 descriptions (~16k chars, ~19k with paths) overran Codex's skill-list
budget (2% of the context window, or 8,000 chars when unknown), and a review
found most bodies stale: paths from before the commons/commonsUI moves, the
deleted legacy desktop app, a callback signer API that no longer exists, and
example APIs that were never in the tree.

Kept, rewritten and checked against the code (every path, class and command):
account-state (+feeds), amy-expert, android-expert, auth-signers,
compose-expert (+API style, Navigation 3 back stacks), desktop-expert
(+run/package), event-store-semantics (+NIP-50 search), find-missing-
translations, kotlin-coroutines (+structured concurrency, flow modeling),
kotlin-multiplatform (+Gradle, composable extraction), ngit-pr,
nip85-trusted-assertions, nostr-expert (+NIP lookup, generated NIP catalog),
relay-client.

Dropped: textbook Compose/Kotlin technique skills, kotlin-expert,
kotlin-types-value-class, gradle-expert, quartz-integration (external-facing;
see the Quartz docs commit), find-non-lambda-logs (audit finished; the rule is
now in AGENTS.md Kotlin Style), and the /nip, /desktop-run, /extract commands.
The skill list is now ~4k chars. Also drops .claude/core-skills-plan.md
(stale history) and repoints SearchableEvent's KDoc to event-store-semantics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 12:21:01 -04:00

4.3 KiB

Shared composables catalog

A starting map of reusable composables in commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/ui/ (paths below are relative to it). It is not exhaustive: ui/components/ alone has ~85 files. Before writing a new component, ls the folder and grep for the concept.

Avatars and images (components/)

Composable File Notes
UserAvatar(userHex, pictureUrl, size, modifier, ..., badge) UserAvatar.kt The user avatar. Reads LocalDisplaySettings for picture / robohash / GIF autoplay; optional BoxScope badge slot
RobohashFallbackAsyncImage(robot, model, ...) RobohashAsyncImage.kt Coil image with a robohash fallback
RobohashImage(robot, ...) RobohashImage.kt Robohash only; see icon-assets.md
MyAsyncImage(imageUrl, contentDescription, contentScale, mainImageModifier, loadedImageModifier, accountViewModel, onLoadingBackground, onError) MyAsyncImage.kt Coil image with the app's loading / error slots
ImageGallery(images, state, accountViewModel, ...) ImageGallery.kt Renders an ImageGalleryParagraph from the rich-text parser
UrlPreviewCard(url, previewInfo, ...) UrlPreviewCard.kt Link preview card

Rich text and notes

Composable File Notes
RichTextViewer(content, canPreview, quotesLeft, modifier, tags, backgroundColor, ...) components/RichTextViewer.kt Parses through CachedRichTextParser; see rich-text-parsing.md
NoteCompose(...) note/NoteCompose.kt The note card used by every feed; ui/note/ holds its parts and per-kind cards

Feeds (feeds/)

Composable File Notes
RefresheableFeedContentStateView(feedContentState, routeForLastRead, ..., accountViewModel, nav) FeedContentStateView.kt Standard pull-to-refresh feed over a FeedContentState
RenderFeedContentState(...), SaveableFeedContentState(...), SaveableGridFeedContentState(...) FeedContentStateView.kt Lower-level pieces: state switch, saved list / grid scroll
RefresheableBox(invalidateableContent | onRefresh, content: BoxScope.() -> Unit) RefresheableBox.kt Pull-to-refresh container
FeedEmpty(onRefresh), FeedError(...), LoadingFeed() FeedEmpty.kt, FeedError.kt, LoadingFeed.kt What feeds show for empty / error / loading
ShimmerPlaceholder(modifier), NoteCardSkeleton(modifier) components/ShimmerPlaceholder.kt Skeleton placeholders

components/LoadingState.kt also has generic LoadingState, EmptyState, ErrorState, FeedEmptyState, FeedErrorState; the app's feeds use the feeds/ versions above.

Containers, menus and dialogs (components/)

Composable File Notes
ClickableBox(modifier, onClick, [onLongClick], content), ToggleableBox(...) ClickableBox.kt Click / long-click / toggle containers
RoundedDropdownMenu(expanded, onDismissRequest, ..., content: ColumnScope.() -> Unit), RoundedMenuSection, RoundedMenuItemModifier RoundedDropdownMenu.kt The app's dropdown menu style
M3ActionDialog(title, onDismiss, content), M3ActionSection, M3ActionRow(icon, text, ...) M3ActionDialog.kt Action-sheet style dialog
TextSpinner(...), SpinnerSelectionDialog(...) TextSpinner.kt Option pickers over ImmutableList<TitleExplainer>
SwipeToDeleteContainer(...), SwipeToDeleteWithConfirmation(...) SwipeToDelete.kt Swipe-to-delete rows
HoverTooltip(text, content) HoverTooltip.kt Tooltip on pointer hover (desktop / laptops)
InformationDialog(obj, ...) InformationDialog.kt Shows a toast-manager error message
AddButton(modifier, text: StringResource, ...), RemoveButton(...) ActionButtons.kt Outlined add / remove buttons
LoadingAnimation(...) LoadingAnimation.kt Small animated loading indicator

Screens and layout

  • screens/PlaceholderScreens.kt: PlaceholderScreen(title, description, modifier) plus SearchPlaceholder, MessagesPlaceholder, NotificationsPlaceholder.
  • navigation/topbars/: TopBarWithBackButton, TopBarExtensibleWithBackButton, ActionTopBar, ShorterTopAppBar, UserDrawerSearchTopBar, FeedFilterSpinner.
  • layouts/ScreenLayout.kt: ScreenLayoutSpec, LocalScreenLayout, FeedContentMaxWidth.