| β
Done |
Pill chip |
components/PillChip.kt |
core-ui/PillChip.kt, feature/home/HomeFilters.kt |
Generic selectable capsule; selected/unselected colors are themed tokens with per-call overrides for tinted variants (filter rows). |
| β
Done |
Overlay card |
components/OverlayCard.kt |
core-ui/OverlayCard.kt |
Subtle rounded surface for media overlays. Defaults to AppTheme.colors.overlaySubtle + AppTheme.shapes.large. |
| β
Done |
Adaptive content container |
components/AdaptiveContentContainer.kt |
core-ui/AdaptiveContentContainer.kt |
Caps content width on tablets, pass-through on phones. Consumers pick a semantic max width from their own layout-dimension tokens. |
| β
Done |
Section header |
components/SectionHeader.kt |
core-ui/SectionHeader.kt |
Title + optional trailing text action. Reads AppTheme.typography.titleSmall and AppTheme.colors.primary. |
| β
Done |
Content row |
components/ContentRow.kt |
core-ui/WordCard.kt, feature/savedwords/SavedWordCard.kt |
Slot-based list row (title, optional secondary text, supporting text, leading + trailing content). Word-card-style usage is now a thin consumer wrapper. |
| π‘ Partial |
Level badge |
components/PillChip.kt (tier overload) + theme/LevelPalette.kt |
core-ui/SkillLevelBadge.kt, core-design/SkillLevelDesign.kt |
Generic tiered-badge component takes a LevelTier from a LevelPalette. Apps own the tierβdomain mapping (e.g., skill level β palette index). |
| π‘ Partial |
Sized skeleton block |
components/FeedbackComponents.kt::SkeletonBlock |
core-ui/GhostLoadingBlock.kt |
Parameterized height/width/shape variant of Skeleton. Shimmer animation is left to the consumer to keep core dependency-free. |
| β
Done |
Branded button variants |
components/PrimaryButton.kt, components/ActionComponents.kt::{SecondaryButton, TextButton} |
core-ui/NovalingoButton.kt |
Three-style enum collapses 1:1 into the library's three button components β no extra wrapper needed in consumers. |
| β³ Pending |
Search bar |
β |
core-ui/SearchBar.kt, feature/home/HomeSearchBar.kt |
Library already ships SearchField. Audit Novalingo's variant against it before adding a second component. |
| β³ Pending |
Empty state |
β |
core-ui/EmptyStateView.kt |
Library already ships EmptyState. Audit for icon/action parity before adding a second component. |
| β³ Pending |
Error retry state |
β |
core-ui/ErrorRetryView.kt, feature/player/PlayerErrorOverlay.kt |
Library already ships ErrorState. Audit for icon/action-button styling parity. |
| β
Done |
Typewriter text reveal |
compose-utils/TypewriterReveal.kt |
core-ui/aiassistant/AIAssistantChatLog.kt::AIMarkdownBubble |
rememberTypewriterReveal state hook: progressively reveals a growing target string (e.g. token-stream chunks) instead of popping in whole chunks; catches up on extension, restarts on divergence. Rendering-agnostic β returns the revealed prefix as State<String>, caller renders it with any text/markdown composable. |
| β³ Pending |
Chat bubble |
β |
core-ui/aiassistant/AIAssistantChatLog.kt::{AIUserBubble, AIAssistantBubble} |
Novalingo shares left/right-aligned message bubbles (fraction-width Row + Card, generic over a chat-turn interface) between its word and grammar AI assistants. Audit before extracting: needs a rendering-agnostic content slot (the app mixes plain Text and third-party Markdown rendering per state) and a turn-type contract this library shouldn't own. |