@adres/mgda-ui 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/brand-knowledge.json +451 -0
- package/knowledge/accordion.md +135 -0
- package/knowledge/activity-rings.md +123 -0
- package/knowledge/alert.md +184 -0
- package/knowledge/answer-actions.md +217 -0
- package/knowledge/aspect-ratio.md +82 -0
- package/knowledge/avatar.md +158 -0
- package/knowledge/badge.md +172 -0
- package/knowledge/bar-graph.md +167 -0
- package/knowledge/bento-grid.md +115 -0
- package/knowledge/blockquote.md +153 -0
- package/knowledge/box-list.md +177 -0
- package/knowledge/bullet-list.md +128 -0
- package/knowledge/button-group.md +179 -0
- package/knowledge/button.md +231 -0
- package/knowledge/calendar.md +168 -0
- package/knowledge/card.md +321 -0
- package/knowledge/cards-nav.md +170 -0
- package/knowledge/chain-of-thought.md +164 -0
- package/knowledge/chat-container.md +135 -0
- package/knowledge/chat-message.md +224 -0
- package/knowledge/checkbox-card.md +172 -0
- package/knowledge/checkbox.md +111 -0
- package/knowledge/citations.md +241 -0
- package/knowledge/combobox.md +265 -0
- package/knowledge/countdown-pill.md +153 -0
- package/knowledge/cta.md +118 -0
- package/knowledge/data-list.md +173 -0
- package/knowledge/data-table.md +220 -0
- package/knowledge/dialog.md +249 -0
- package/knowledge/drawer.md +236 -0
- package/knowledge/dropdown-menu.md +238 -0
- package/knowledge/dropzone.md +153 -0
- package/knowledge/email-chips-input.md +161 -0
- package/knowledge/empty-state.md +106 -0
- package/knowledge/entity-header.md +166 -0
- package/knowledge/feature-grid.md +120 -0
- package/knowledge/feedback-bar.md +127 -0
- package/knowledge/footer.md +116 -0
- package/knowledge/heading.md +189 -0
- package/knowledge/hero.md +361 -0
- package/knowledge/input-button.md +187 -0
- package/knowledge/input-group.md +185 -0
- package/knowledge/input.md +256 -0
- package/knowledge/inset.md +177 -0
- package/knowledge/kpi-card.md +206 -0
- package/knowledge/list-nav.md +181 -0
- package/knowledge/logo-cloud.md +102 -0
- package/knowledge/media-gallery.md +158 -0
- package/knowledge/message-actions.md +175 -0
- package/knowledge/nav-sidebar.md +225 -0
- package/knowledge/number-stepper.md +159 -0
- package/knowledge/page-header.md +109 -0
- package/knowledge/pagination.md +225 -0
- package/knowledge/popover.md +159 -0
- package/knowledge/pricing.md +132 -0
- package/knowledge/progress.md +156 -0
- package/knowledge/prompt-input.md +337 -0
- package/knowledge/prompt-suggestions.md +168 -0
- package/knowledge/quota-bar.md +160 -0
- package/knowledge/quote.md +116 -0
- package/knowledge/radio-card.md +172 -0
- package/knowledge/radio-group.md +135 -0
- package/knowledge/reasoning.md +142 -0
- package/knowledge/search.md +131 -0
- package/knowledge/section-nav.md +162 -0
- package/knowledge/segmented-control.md +181 -0
- package/knowledge/select-button.md +205 -0
- package/knowledge/select.md +210 -0
- package/knowledge/separator.md +75 -0
- package/knowledge/shimmer-text.md +140 -0
- package/knowledge/sidebar.md +227 -0
- package/knowledge/skeleton.md +142 -0
- package/knowledge/slider.md +133 -0
- package/knowledge/slideshow.md +159 -0
- package/knowledge/source.md +156 -0
- package/knowledge/spinner.md +120 -0
- package/knowledge/stat-strip.md +128 -0
- package/knowledge/stats.md +117 -0
- package/knowledge/step-indicator.md +157 -0
- package/knowledge/switch.md +88 -0
- package/knowledge/table.md +190 -0
- package/knowledge/tabs.md +169 -0
- package/knowledge/testimonials.md +115 -0
- package/knowledge/text-link.md +192 -0
- package/knowledge/text.md +194 -0
- package/knowledge/thinking-bar.md +115 -0
- package/knowledge/thinking-steps.md +140 -0
- package/knowledge/toaster.md +127 -0
- package/knowledge/toggle.md +113 -0
- package/knowledge/tool-call-card.md +241 -0
- package/knowledge/tooltip.md +120 -0
- package/knowledge/top-nav.md +138 -0
- package/knowledge.json +19854 -0
- package/package.json +94 -4
- package/src/components/accordion.stories.tsx +46 -0
- package/src/components/accordion.tsx +74 -0
- package/src/components/activity-rings.stories.tsx +73 -0
- package/src/components/activity-rings.tsx +121 -0
- package/src/components/alert.stories.tsx +43 -0
- package/src/components/alert.tsx +132 -0
- package/src/components/answer-actions.stories.tsx +54 -0
- package/src/components/answer-actions.test.tsx +37 -0
- package/src/components/answer-actions.tsx +313 -0
- package/src/components/aspect-ratio.stories.tsx +32 -0
- package/src/components/aspect-ratio.tsx +5 -0
- package/src/components/avatar.stories.tsx +40 -0
- package/src/components/avatar.tsx +154 -0
- package/src/components/badge.stories.tsx +27 -0
- package/src/components/badge.tsx +63 -0
- package/src/components/bar-graph.stories.tsx +28 -0
- package/src/components/bar-graph.tsx +204 -0
- package/src/components/bento-grid.stories.tsx +23 -0
- package/src/components/bento-grid.tsx +67 -0
- package/src/components/blockquote.stories.tsx +28 -0
- package/src/components/blockquote.tsx +88 -0
- package/src/components/box-list.stories.tsx +25 -0
- package/src/components/box-list.tsx +108 -0
- package/src/components/bullet-list.stories.tsx +22 -0
- package/src/components/bullet-list.tsx +101 -0
- package/src/components/button-group.stories.tsx +31 -0
- package/src/components/button-group.tsx +156 -0
- package/src/components/button.stories.tsx +66 -0
- package/src/components/button.test.ts +17 -0
- package/src/components/button.tsx +139 -0
- package/src/components/calendar.stories.tsx +25 -0
- package/src/components/calendar.tsx +367 -0
- package/src/components/card.stories.tsx +44 -0
- package/src/components/card.tsx +392 -0
- package/src/components/cards-nav.stories.tsx +35 -0
- package/src/components/cards-nav.tsx +115 -0
- package/src/components/chain-of-thought.stories.tsx +67 -0
- package/src/components/chain-of-thought.test.tsx +50 -0
- package/src/components/chain-of-thought.tsx +170 -0
- package/src/components/chat-container.stories.tsx +47 -0
- package/src/components/chat-container.test.tsx +49 -0
- package/src/components/chat-container.tsx +222 -0
- package/src/components/chat-message.stories.tsx +52 -0
- package/src/components/chat-message.test.tsx +36 -0
- package/src/components/chat-message.tsx +163 -0
- package/src/components/checkbox-card.stories.tsx +27 -0
- package/src/components/checkbox-card.tsx +200 -0
- package/src/components/checkbox.stories.tsx +26 -0
- package/src/components/checkbox.tsx +61 -0
- package/src/components/citations.stories.tsx +64 -0
- package/src/components/citations.test.tsx +61 -0
- package/src/components/citations.tsx +220 -0
- package/src/components/combobox.stories.tsx +184 -0
- package/src/components/combobox.test.tsx +82 -0
- package/src/components/combobox.tsx +407 -0
- package/src/components/countdown-pill.stories.tsx +24 -0
- package/src/components/countdown-pill.tsx +129 -0
- package/src/components/cta.stories.tsx +29 -0
- package/src/components/cta.tsx +52 -0
- package/src/components/data-list.stories.tsx +50 -0
- package/src/components/data-list.test.tsx +35 -0
- package/src/components/data-list.tsx +181 -0
- package/src/components/data-table.stories.tsx +29 -0
- package/src/components/data-table.tsx +200 -0
- package/src/components/dialog.stories.tsx +42 -0
- package/src/components/dialog.tsx +200 -0
- package/src/components/drawer.stories.tsx +48 -0
- package/src/components/drawer.tsx +385 -0
- package/src/components/dropdown-menu.stories.tsx +41 -0
- package/src/components/dropdown-menu.tsx +252 -0
- package/src/components/dropzone.stories.tsx +19 -0
- package/src/components/dropzone.tsx +250 -0
- package/src/components/email-chips-input.stories.tsx +135 -0
- package/src/components/email-chips-input.tsx +210 -0
- package/src/components/empty-state.stories.tsx +22 -0
- package/src/components/empty-state.tsx +35 -0
- package/src/components/entity-header.stories.tsx +43 -0
- package/src/components/entity-header.test.tsx +35 -0
- package/src/components/entity-header.tsx +92 -0
- package/src/components/feature-grid.stories.tsx +25 -0
- package/src/components/feature-grid.tsx +87 -0
- package/src/components/feedback-bar.stories.tsx +25 -0
- package/src/components/feedback-bar.test.tsx +24 -0
- package/src/components/feedback-bar.tsx +62 -0
- package/src/components/footer.stories.tsx +23 -0
- package/src/components/footer.tsx +78 -0
- package/src/components/heading.stories.tsx +45 -0
- package/src/components/heading.test.tsx +22 -0
- package/src/components/heading.tsx +77 -0
- package/src/components/hero.stories.tsx +38 -0
- package/src/components/hero.tsx +498 -0
- package/src/components/input-button.stories.tsx +19 -0
- package/src/components/input-button.tsx +112 -0
- package/src/components/input-group.stories.tsx +38 -0
- package/src/components/input-group.tsx +157 -0
- package/src/components/input.stories.tsx +31 -0
- package/src/components/input.tsx +284 -0
- package/src/components/inset.stories.tsx +29 -0
- package/src/components/inset.tsx +70 -0
- package/src/components/kpi-card.stories.tsx +29 -0
- package/src/components/kpi-card.tsx +284 -0
- package/src/components/list-nav.stories.tsx +22 -0
- package/src/components/list-nav.tsx +145 -0
- package/src/components/logo-cloud.stories.tsx +23 -0
- package/src/components/logo-cloud.tsx +42 -0
- package/src/components/media-gallery.stories.tsx +25 -0
- package/src/components/media-gallery.tsx +347 -0
- package/src/components/message-actions.stories.tsx +45 -0
- package/src/components/message-actions.test.tsx +32 -0
- package/src/components/message-actions.tsx +119 -0
- package/src/components/nav-sidebar.stories.tsx +58 -0
- package/src/components/nav-sidebar.test.tsx +54 -0
- package/src/components/nav-sidebar.tsx +462 -0
- package/src/components/number-stepper.stories.tsx +19 -0
- package/src/components/number-stepper.tsx +158 -0
- package/src/components/page-header.stories.tsx +25 -0
- package/src/components/page-header.tsx +64 -0
- package/src/components/pagination.stories.tsx +110 -0
- package/src/components/pagination.test.tsx +46 -0
- package/src/components/pagination.tsx +144 -0
- package/src/components/popover.stories.tsx +26 -0
- package/src/components/popover.tsx +62 -0
- package/src/components/pricing.stories.tsx +42 -0
- package/src/components/pricing.tsx +130 -0
- package/src/components/progress.stories.tsx +22 -0
- package/src/components/progress.tsx +189 -0
- package/src/components/prompt-input.stories.tsx +62 -0
- package/src/components/prompt-input.test.tsx +106 -0
- package/src/components/prompt-input.tsx +343 -0
- package/src/components/prompt-suggestions.stories.tsx +53 -0
- package/src/components/prompt-suggestions.test.tsx +37 -0
- package/src/components/prompt-suggestions.tsx +122 -0
- package/src/components/quota-bar.stories.tsx +19 -0
- package/src/components/quota-bar.tsx +191 -0
- package/src/components/quote.stories.tsx +18 -0
- package/src/components/quote.tsx +43 -0
- package/src/components/radio-card.stories.tsx +27 -0
- package/src/components/radio-card.tsx +225 -0
- package/src/components/radio-group.stories.tsx +32 -0
- package/src/components/radio-group.tsx +68 -0
- package/src/components/reasoning.stories.tsx +50 -0
- package/src/components/reasoning.test.tsx +48 -0
- package/src/components/reasoning.tsx +143 -0
- package/src/components/search.stories.tsx +18 -0
- package/src/components/search.tsx +133 -0
- package/src/components/section-nav.stories.tsx +59 -0
- package/src/components/section-nav.test.tsx +36 -0
- package/src/components/section-nav.tsx +146 -0
- package/src/components/segmented-control.stories.tsx +22 -0
- package/src/components/segmented-control.tsx +301 -0
- package/src/components/select-button.stories.tsx +27 -0
- package/src/components/select-button.tsx +174 -0
- package/src/components/select.stories.tsx +27 -0
- package/src/components/select.tsx +198 -0
- package/src/components/separator.stories.tsx +22 -0
- package/src/components/separator.tsx +23 -0
- package/src/components/shimmer-text.stories.tsx +23 -0
- package/src/components/shimmer-text.test.tsx +35 -0
- package/src/components/shimmer-text.tsx +43 -0
- package/src/components/sidebar.stories.tsx +25 -0
- package/src/components/sidebar.tsx +234 -0
- package/src/components/skeleton.stories.tsx +22 -0
- package/src/components/skeleton.tsx +96 -0
- package/src/components/slider.stories.tsx +20 -0
- package/src/components/slider.tsx +176 -0
- package/src/components/slideshow.stories.tsx +30 -0
- package/src/components/slideshow.tsx +291 -0
- package/src/components/source.stories.tsx +32 -0
- package/src/components/source.test.tsx +40 -0
- package/src/components/source.tsx +161 -0
- package/src/components/spinner.stories.tsx +19 -0
- package/src/components/spinner.tsx +76 -0
- package/src/components/stat-strip.stories.tsx +36 -0
- package/src/components/stat-strip.test.tsx +25 -0
- package/src/components/stat-strip.tsx +85 -0
- package/src/components/stats.stories.tsx +24 -0
- package/src/components/stats.tsx +83 -0
- package/src/components/step-indicator.stories.tsx +18 -0
- package/src/components/step-indicator.test.tsx +18 -0
- package/src/components/step-indicator.tsx +286 -0
- package/src/components/switch.stories.tsx +26 -0
- package/src/components/switch.tsx +32 -0
- package/src/components/table.stories.tsx +38 -0
- package/src/components/table.tsx +220 -0
- package/src/components/tabs.stories.tsx +25 -0
- package/src/components/tabs.tsx +276 -0
- package/src/components/testimonials.stories.tsx +22 -0
- package/src/components/testimonials.tsx +109 -0
- package/src/components/text-link.stories.tsx +47 -0
- package/src/components/text-link.test.tsx +18 -0
- package/src/components/text-link.tsx +88 -0
- package/src/components/text.stories.tsx +49 -0
- package/src/components/text.tsx +105 -0
- package/src/components/thinking-bar.stories.tsx +19 -0
- package/src/components/thinking-bar.test.tsx +27 -0
- package/src/components/thinking-bar.tsx +64 -0
- package/src/components/thinking-steps.stories.tsx +44 -0
- package/src/components/thinking-steps.test.tsx +42 -0
- package/src/components/thinking-steps.tsx +92 -0
- package/src/components/toaster.stories.tsx +80 -0
- package/src/components/toaster.tsx +36 -0
- package/src/components/toggle.stories.tsx +21 -0
- package/src/components/toggle.tsx +103 -0
- package/src/components/tool-call-card.stories.tsx +97 -0
- package/src/components/tool-call-card.test.tsx +88 -0
- package/src/components/tool-call-card.tsx +231 -0
- package/src/components/tooltip.stories.tsx +25 -0
- package/src/components/tooltip.tsx +43 -0
- package/src/components/top-nav.stories.tsx +20 -0
- package/src/components/top-nav.tsx +76 -0
- package/src/docs/Colors.stories.tsx +192 -0
- package/src/docs/GettingStarted.mdx +72 -0
- package/src/docs/Mcp.mdx +52 -0
- package/src/docs/Typography.stories.tsx +114 -0
- package/src/hooks/use-in-view.ts +32 -0
- package/src/hooks/use-reduced-motion.ts +26 -0
- package/src/index.ts +343 -0
- package/src/lib/cn.test.ts +67 -0
- package/src/lib/cn.ts +81 -0
- package/src/lib/motion.ts +109 -0
- package/src/lib/prefix-utilities.test.ts +56 -0
- package/src/lib/prefix-utilities.ts +50 -0
- package/src/styles/base.css +489 -0
- package/src/styles/motion.css +69 -0
- package/src/styles/overrides.css +44 -0
- package/src/styles/typography.css +173 -0
- package/src/theme/theme.css +391 -0
- package/src/theme/tokens.ts +29 -0
- package/src/theme/types.ts +26 -0
- package/README.md +0 -3
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
# >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
|
|
3
|
+
derived:
|
|
4
|
+
schemaVersion: 1
|
|
5
|
+
id: prompt-suggestions
|
|
6
|
+
sourceFile: packages/design-system/src/components/prompt-suggestions.tsx
|
|
7
|
+
client: true
|
|
8
|
+
category: web-app-ai
|
|
9
|
+
categoryFromBarrel: web-app-ai
|
|
10
|
+
barrelExported: true
|
|
11
|
+
importPath: "@adres/mgda-ui"
|
|
12
|
+
exports:
|
|
13
|
+
- name: StarterPromptItem
|
|
14
|
+
kind: type
|
|
15
|
+
- name: StarterPrompts
|
|
16
|
+
kind: component
|
|
17
|
+
typeText: "ForwardRefExoticComponent<StarterPromptsProps & RefAttributes<HTMLDivElement>>"
|
|
18
|
+
- name: StarterPromptsProps
|
|
19
|
+
kind: type
|
|
20
|
+
- name: SuggestionChips
|
|
21
|
+
kind: component
|
|
22
|
+
typeText: "ForwardRefExoticComponent<SuggestionChipsProps & RefAttributes<HTMLDivElement>>"
|
|
23
|
+
- name: SuggestionChipsProps
|
|
24
|
+
kind: type
|
|
25
|
+
primaryExport: StarterPrompts
|
|
26
|
+
subcomponents:
|
|
27
|
+
- SuggestionChips
|
|
28
|
+
props:
|
|
29
|
+
StarterPrompts:
|
|
30
|
+
- name: label
|
|
31
|
+
type: string
|
|
32
|
+
required: false
|
|
33
|
+
declaredIn: self
|
|
34
|
+
doc: "Accessible name of the group."
|
|
35
|
+
- name: onPick
|
|
36
|
+
type: "(prompt: string) => void"
|
|
37
|
+
required: true
|
|
38
|
+
declaredIn: self
|
|
39
|
+
- name: starters
|
|
40
|
+
type: "StarterPromptItem[]"
|
|
41
|
+
required: true
|
|
42
|
+
declaredIn: self
|
|
43
|
+
SuggestionChips:
|
|
44
|
+
- name: disabled
|
|
45
|
+
type: boolean
|
|
46
|
+
required: false
|
|
47
|
+
declaredIn: self
|
|
48
|
+
doc: "E.g. while the assistant replies."
|
|
49
|
+
- name: insert
|
|
50
|
+
type: boolean
|
|
51
|
+
required: false
|
|
52
|
+
declaredIn: self
|
|
53
|
+
doc: "Chips put the prompt in the composer for editing instead of sending it."
|
|
54
|
+
- name: label
|
|
55
|
+
type: string
|
|
56
|
+
required: false
|
|
57
|
+
declaredIn: self
|
|
58
|
+
doc: "Accessible name of the chip group."
|
|
59
|
+
- name: loading
|
|
60
|
+
type: boolean
|
|
61
|
+
required: false
|
|
62
|
+
declaredIn: self
|
|
63
|
+
doc: "Swaps each chip for a skeleton and marks the group busy."
|
|
64
|
+
- name: onPick
|
|
65
|
+
type: "(prompt: string) => void"
|
|
66
|
+
required: true
|
|
67
|
+
declaredIn: self
|
|
68
|
+
- name: onRefresh
|
|
69
|
+
type: "(() => void)"
|
|
70
|
+
required: false
|
|
71
|
+
declaredIn: self
|
|
72
|
+
doc: "Adds an \"Other suggestions\" button under the row."
|
|
73
|
+
- name: suggestions
|
|
74
|
+
type: "string[]"
|
|
75
|
+
required: true
|
|
76
|
+
declaredIn: self
|
|
77
|
+
- name: wrap
|
|
78
|
+
type: boolean
|
|
79
|
+
required: false
|
|
80
|
+
declaredIn: self
|
|
81
|
+
doc: "Wrap onto several lines instead of one horizontally scrolling row."
|
|
82
|
+
extendsProps:
|
|
83
|
+
- "Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\">"
|
|
84
|
+
variants: {}
|
|
85
|
+
variantSource: none
|
|
86
|
+
compoundVariants: []
|
|
87
|
+
sizeMaps: []
|
|
88
|
+
dataSlots:
|
|
89
|
+
- starter-prompts
|
|
90
|
+
- suggestion-chips
|
|
91
|
+
dependsOn:
|
|
92
|
+
internal:
|
|
93
|
+
- button
|
|
94
|
+
- skeleton
|
|
95
|
+
- text
|
|
96
|
+
lib:
|
|
97
|
+
- cn
|
|
98
|
+
hooks: []
|
|
99
|
+
external:
|
|
100
|
+
- lucide-react
|
|
101
|
+
- react
|
|
102
|
+
contexts: []
|
|
103
|
+
stories:
|
|
104
|
+
- exportName: Default
|
|
105
|
+
id: components-suggestionchips--default
|
|
106
|
+
- exportName: Wrapped
|
|
107
|
+
id: components-suggestionchips--wrapped
|
|
108
|
+
- exportName: Loading
|
|
109
|
+
id: components-suggestionchips--loading
|
|
110
|
+
- exportName: InsertTemplates
|
|
111
|
+
id: components-suggestionchips--insert-templates
|
|
112
|
+
- exportName: Starters
|
|
113
|
+
id: components-suggestionchips--starters
|
|
114
|
+
storybookTitle: Components/SuggestionChips
|
|
115
|
+
docsId: components-suggestionchips--documentation
|
|
116
|
+
argTypeOptions: {}
|
|
117
|
+
resolvedCleanly: true
|
|
118
|
+
contractHash: ac0e5c863c02
|
|
119
|
+
factsHash: "84189d4e0c67"
|
|
120
|
+
# >>> AUTHORED - humans own everything below this line. <<<
|
|
121
|
+
status: beta
|
|
122
|
+
summary: "Prompt suggestions for an assistant: a row of follow-up chips that send or insert a prompt, and an empty-state grid of starter prompts."
|
|
123
|
+
useWhen:
|
|
124
|
+
- "an assistant should offer follow-up questions after an answer"
|
|
125
|
+
- "an empty chat needs a few ways to start, each with a short title and the full prompt"
|
|
126
|
+
- "template prompts should drop into the composer for editing instead of sending"
|
|
127
|
+
useInstead:
|
|
128
|
+
- id: toggle
|
|
129
|
+
when: "the chips filter or select values rather than send a prompt"
|
|
130
|
+
- id: badge
|
|
131
|
+
when: "the chips are static labels, not actions"
|
|
132
|
+
related:
|
|
133
|
+
- chat-message
|
|
134
|
+
- button
|
|
135
|
+
a11y:
|
|
136
|
+
notes:
|
|
137
|
+
- "Each chip is a button whose name is the full prompt; insert-mode chips are named \"Edit prompt: ...\"."
|
|
138
|
+
- "Chip rows are role=\"group\" with a label, and aria-busy while loading; a live region announces loading."
|
|
139
|
+
- "StarterPrompts icons are decorative; the title names the starter."
|
|
140
|
+
radixHandles: false
|
|
141
|
+
pitfalls:
|
|
142
|
+
- "Pass the same suggestions while loading; their count sets how many skeletons show."
|
|
143
|
+
- "Disable the chips while the assistant is replying so a second prompt is not sent mid-answer."
|
|
144
|
+
- "Without wrap the row scrolls horizontally; use wrap when every chip must stay visible."
|
|
145
|
+
canonicalSnippet: |
|
|
146
|
+
import { StarterPrompts, SuggestionChips } from "@adres/mgda-ui"
|
|
147
|
+
|
|
148
|
+
<StarterPrompts starters={starters} onPick={send} />
|
|
149
|
+
<SuggestionChips suggestions={followUps} onPick={send} disabled={replying} onRefresh={nextRound} />
|
|
150
|
+
reviewedAt: 2026-10-06
|
|
151
|
+
reviewedAgainstContractHash: ac0e5c863c02
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Usage
|
|
155
|
+
|
|
156
|
+
`SuggestionChips` renders prompts as rounded outline buttons, in one
|
|
157
|
+
horizontally scrolling row or wrapped with `wrap`. `onPick` receives the
|
|
158
|
+
prompt. `loading` swaps the chips for skeletons, `disabled` locks them while
|
|
159
|
+
the assistant replies, `onRefresh` adds an "Other suggestions" button under
|
|
160
|
+
the row, and `insert` marks chips as templates to edit in the composer.
|
|
161
|
+
|
|
162
|
+
`StarterPrompts` is the empty-state version: a two-column grid of starters,
|
|
163
|
+
each an optional icon, a short title and the full prompt it sends.
|
|
164
|
+
|
|
165
|
+
## Anatomy
|
|
166
|
+
|
|
167
|
+
- `StarterPrompts` - empty-state grid of titled starters.
|
|
168
|
+
- `SuggestionChips` - follow-up or template chip row with loading and refresh.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
# >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
|
|
3
|
+
derived:
|
|
4
|
+
schemaVersion: 1
|
|
5
|
+
id: quota-bar
|
|
6
|
+
sourceFile: packages/design-system/src/components/quota-bar.tsx
|
|
7
|
+
client: true
|
|
8
|
+
category: web-app-patterns
|
|
9
|
+
categoryFromBarrel: web-app-patterns
|
|
10
|
+
barrelExported: true
|
|
11
|
+
importPath: "@adres/mgda-ui"
|
|
12
|
+
exports:
|
|
13
|
+
- name: QuotaBar
|
|
14
|
+
kind: component
|
|
15
|
+
typeText: "ForwardRefExoticComponent<QuotaBarProps & RefAttributes<HTMLDivElement>>"
|
|
16
|
+
- name: QuotaBarProps
|
|
17
|
+
kind: type
|
|
18
|
+
- name: QuotaBarShape
|
|
19
|
+
kind: type
|
|
20
|
+
primaryExport: QuotaBar
|
|
21
|
+
subcomponents: []
|
|
22
|
+
props:
|
|
23
|
+
QuotaBar:
|
|
24
|
+
- name: compact
|
|
25
|
+
type: boolean
|
|
26
|
+
required: false
|
|
27
|
+
declaredIn: self
|
|
28
|
+
doc: "Compact mode - uses a smaller bar / ring."
|
|
29
|
+
- name: ctaHref
|
|
30
|
+
type: string
|
|
31
|
+
required: false
|
|
32
|
+
declaredIn: self
|
|
33
|
+
doc: "When the quota is full, the full-state CTA renders as a link to this href. Use this OR `ctaOnClick`, not both."
|
|
34
|
+
- name: ctaLabel
|
|
35
|
+
type: string
|
|
36
|
+
required: false
|
|
37
|
+
declaredIn: self
|
|
38
|
+
doc: "Visible text for the full-state CTA. Defaults to \"Request More\"."
|
|
39
|
+
- name: ctaOnClick
|
|
40
|
+
type: "(() => void)"
|
|
41
|
+
required: false
|
|
42
|
+
declaredIn: self
|
|
43
|
+
doc: "When the quota is full, the full-state CTA renders as a button that fires this callback (use for non-routing actions like opening a Drawer)."
|
|
44
|
+
- name: fullLabel
|
|
45
|
+
type: string
|
|
46
|
+
required: false
|
|
47
|
+
declaredIn: self
|
|
48
|
+
doc: "Replaces the default \"No {unit} remaining\" string in the full state."
|
|
49
|
+
- name: remainingLabel
|
|
50
|
+
type: "((remaining: number) => string)"
|
|
51
|
+
required: false
|
|
52
|
+
declaredIn: self
|
|
53
|
+
doc: "Label shown next to the count when the quota is *not* full. Defaults to `\"{remaining} remaining\"`."
|
|
54
|
+
- name: ringSize
|
|
55
|
+
type: number
|
|
56
|
+
required: false
|
|
57
|
+
declaredIn: self
|
|
58
|
+
doc: "Ring-only: pixel diameter override (passes through to Progress)."
|
|
59
|
+
- name: shape
|
|
60
|
+
type: QuotaBarShape
|
|
61
|
+
required: false
|
|
62
|
+
declaredIn: self
|
|
63
|
+
doc: "Visual shape. `bar` (default) is a horizontal Progress with the caption underneath; `ring` puts a circular Progress on the inline-start side with the caption stacked beside it and the pct% inside the ring."
|
|
64
|
+
- name: strokeWidth
|
|
65
|
+
type: number
|
|
66
|
+
required: false
|
|
67
|
+
declaredIn: self
|
|
68
|
+
doc: "Ring-only: stroke width in pixels."
|
|
69
|
+
- name: total
|
|
70
|
+
type: number
|
|
71
|
+
required: true
|
|
72
|
+
declaredIn: self
|
|
73
|
+
doc: "Maximum allowed. When `used >= total`, the bar renders in the error variant and the \"full\" state is shown."
|
|
74
|
+
- name: unit
|
|
75
|
+
type: string
|
|
76
|
+
required: false
|
|
77
|
+
declaredIn: self
|
|
78
|
+
doc: "Unit label appended after the count - e.g. \"seats\", \"licences\", \"GB\". Used in the \"X / Y {unit} used\" sentence."
|
|
79
|
+
- name: used
|
|
80
|
+
type: number
|
|
81
|
+
required: true
|
|
82
|
+
declaredIn: self
|
|
83
|
+
doc: "Current usage."
|
|
84
|
+
extendsProps:
|
|
85
|
+
- "React.HTMLAttributes<HTMLDivElement>"
|
|
86
|
+
variants:
|
|
87
|
+
shape:
|
|
88
|
+
kind: enum
|
|
89
|
+
options:
|
|
90
|
+
- bar
|
|
91
|
+
- ring
|
|
92
|
+
default: bar
|
|
93
|
+
on: QuotaBar
|
|
94
|
+
variantSource: prop-union
|
|
95
|
+
compoundVariants: []
|
|
96
|
+
sizeMaps: []
|
|
97
|
+
dataSlots: []
|
|
98
|
+
dependsOn:
|
|
99
|
+
internal:
|
|
100
|
+
- progress
|
|
101
|
+
lib:
|
|
102
|
+
- cn
|
|
103
|
+
hooks: []
|
|
104
|
+
external:
|
|
105
|
+
- react
|
|
106
|
+
contexts: []
|
|
107
|
+
stories:
|
|
108
|
+
- exportName: Default
|
|
109
|
+
id: components-quotabar--default
|
|
110
|
+
storybookTitle: Components/QuotaBar
|
|
111
|
+
docsId: components-quotabar--documentation
|
|
112
|
+
argTypeOptions: {}
|
|
113
|
+
resolvedCleanly: true
|
|
114
|
+
contractHash: "0ed32271b362"
|
|
115
|
+
factsHash: "846a55440f72"
|
|
116
|
+
# >>> AUTHORED - humans own everything below this line. <<<
|
|
117
|
+
status: stable
|
|
118
|
+
summary: "A usage-vs-limit indicator: a Progress bar or ring plus a used/total-with-unit caption, with automatic warning and full states and an optional CTA."
|
|
119
|
+
useWhen:
|
|
120
|
+
- "showing usage against a limit with domain-specific wording - seats, licenses, storage, monthly sends - not a generic progress value"
|
|
121
|
+
useInstead:
|
|
122
|
+
- id: progress
|
|
123
|
+
when: "there is no usage/limit framing or CTA needed, just a raw percentage"
|
|
124
|
+
related:
|
|
125
|
+
- progress
|
|
126
|
+
a11y:
|
|
127
|
+
notes:
|
|
128
|
+
- "The centered percentage text inside the ring shape is aria-hidden - Progress underneath already exposes the real value via role=\"progressbar\" and aria-valuenow, so the visible percentage text is not a duplicate accessible announcement."
|
|
129
|
+
- "The full-state CTA renders as a real link (ctaHref) or button (ctaOnClick), never a styled span - it stays keyboard-focusable and operable like any other link or button."
|
|
130
|
+
radixHandles: false
|
|
131
|
+
pitfalls:
|
|
132
|
+
- "The variant and its warning/error coloring are entirely computed from used/total - there is no variant prop to override; a used value that exceeds total is clamped visually by the underlying Progress, but isFull and the caption text still key off the raw used >= total comparison."
|
|
133
|
+
- "Pass ctaHref or ctaOnClick, never both - the component does not validate this itself, so supplying both means ctaOnClick's button rendering wins (checked first) and ctaHref is silently ignored."
|
|
134
|
+
- "The percentage text inside a ring shape is hidden specifically for compact rings with no ringSize override, since the text would not fit - it is not hidden for compact bars, or for a compact ring given an explicit ringSize override."
|
|
135
|
+
- "remainingLabel and fullLabel let you fully localize or rephrase the non-full and full-state text, but the \"{used} / {total} {unit} used\" sentence itself has no override prop - customizing it means composing your own layout with Progress directly instead."
|
|
136
|
+
canonicalSnippet: |
|
|
137
|
+
import { QuotaBar } from "@adres/mgda-ui"
|
|
138
|
+
|
|
139
|
+
<QuotaBar used={8} total={10} unit="seats" ctaHref="/billing/upgrade" />
|
|
140
|
+
reviewedAt: 2026-09-01
|
|
141
|
+
reviewedAgainstContractHash: "0ed32271b362"
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Usage
|
|
145
|
+
|
|
146
|
+
`QuotaBar` shows usage against a limit with domain-appropriate wording -
|
|
147
|
+
seats, licenses, storage, emails sent this month - built on `Progress`
|
|
148
|
+
underneath plus a "{used} / {total} {unit} used" caption. Reach for
|
|
149
|
+
`Progress` directly instead when there is no usage/limit framing or CTA
|
|
150
|
+
needed, just a raw percentage.
|
|
151
|
+
|
|
152
|
+
The visual state escalates automatically from the `used`/`total` ratio:
|
|
153
|
+
`default` below 90%, `warning` from 90% up to (not including) full, and
|
|
154
|
+
`error` once `used >= total`, which also swaps in the full-state message and
|
|
155
|
+
an optional CTA - pass `ctaHref` or `ctaOnClick`, not both.
|
|
156
|
+
|
|
157
|
+
`shape="bar"` (default) stacks the caption underneath a horizontal Progress;
|
|
158
|
+
`shape="ring"` places a circular Progress beside the caption with the
|
|
159
|
+
percentage rendered inside the ring - hidden only when `compact` and no
|
|
160
|
+
`ringSize` override is given, since the text would not fit at that size.
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
# >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
|
|
3
|
+
derived:
|
|
4
|
+
schemaVersion: 1
|
|
5
|
+
id: quote
|
|
6
|
+
sourceFile: packages/design-system/src/components/quote.tsx
|
|
7
|
+
client: true
|
|
8
|
+
category: web-app-core-primitives
|
|
9
|
+
categoryFromBarrel: web-app-core-primitives
|
|
10
|
+
barrelExported: true
|
|
11
|
+
importPath: "@adres/mgda-ui"
|
|
12
|
+
exports:
|
|
13
|
+
- name: Quote
|
|
14
|
+
kind: component
|
|
15
|
+
typeText: "ForwardRefExoticComponent<QuoteProps & RefAttributes<HTMLQuoteElement>>"
|
|
16
|
+
- name: QuoteProps
|
|
17
|
+
kind: type
|
|
18
|
+
- name: quoteVariants
|
|
19
|
+
kind: variants
|
|
20
|
+
typeText: "(props?: (ConfigVariants<{ size: { sm: string; md: string; lg: string; xl: string; }; color: { default: string; muted: string; accent: string; }; }> & ClassProp) | undefined) => string"
|
|
21
|
+
primaryExport: Quote
|
|
22
|
+
subcomponents: []
|
|
23
|
+
props:
|
|
24
|
+
Quote:
|
|
25
|
+
- name: color
|
|
26
|
+
type: "\"accent\" | \"default\" | \"muted\""
|
|
27
|
+
required: false
|
|
28
|
+
declaredIn: self
|
|
29
|
+
variantKey: true
|
|
30
|
+
- name: size
|
|
31
|
+
type: "\"lg\" | \"md\" | \"sm\" | \"xl\""
|
|
32
|
+
required: false
|
|
33
|
+
declaredIn: self
|
|
34
|
+
variantKey: true
|
|
35
|
+
extendsProps:
|
|
36
|
+
- "Omit<React.HTMLAttributes<HTMLQuoteElement>, \"color\">"
|
|
37
|
+
- "VariantProps<typeof quoteVariants>"
|
|
38
|
+
variants:
|
|
39
|
+
size:
|
|
40
|
+
kind: enum
|
|
41
|
+
options:
|
|
42
|
+
- sm
|
|
43
|
+
- md
|
|
44
|
+
- lg
|
|
45
|
+
- xl
|
|
46
|
+
default: md
|
|
47
|
+
on: Quote
|
|
48
|
+
color:
|
|
49
|
+
kind: enum
|
|
50
|
+
options:
|
|
51
|
+
- default
|
|
52
|
+
- muted
|
|
53
|
+
- accent
|
|
54
|
+
default: default
|
|
55
|
+
on: Quote
|
|
56
|
+
variantSource: cva
|
|
57
|
+
compoundVariants: []
|
|
58
|
+
sizeMaps: []
|
|
59
|
+
dataSlots: []
|
|
60
|
+
dependsOn:
|
|
61
|
+
internal: []
|
|
62
|
+
lib:
|
|
63
|
+
- cn
|
|
64
|
+
hooks: []
|
|
65
|
+
external:
|
|
66
|
+
- class-variance-authority
|
|
67
|
+
- react
|
|
68
|
+
contexts: []
|
|
69
|
+
stories:
|
|
70
|
+
- exportName: Default
|
|
71
|
+
id: components-quote--default
|
|
72
|
+
storybookTitle: Components/Quote
|
|
73
|
+
docsId: components-quote--documentation
|
|
74
|
+
argTypeOptions: {}
|
|
75
|
+
resolvedCleanly: true
|
|
76
|
+
contractHash: e61f900e390e
|
|
77
|
+
factsHash: "1a61a7972f80"
|
|
78
|
+
# >>> AUTHORED - humans own everything below this line. <<<
|
|
79
|
+
status: stable
|
|
80
|
+
summary: "A short, inline quotation - renders the native q element, which browsers add quotation marks to automatically."
|
|
81
|
+
useWhen:
|
|
82
|
+
- "quoting a short phrase or sentence inline within surrounding text"
|
|
83
|
+
useInstead:
|
|
84
|
+
- id: blockquote
|
|
85
|
+
when: "the quotation is long enough to stand as its own block, especially with attribution"
|
|
86
|
+
- id: text
|
|
87
|
+
when: "the content is not actually a quotation"
|
|
88
|
+
related:
|
|
89
|
+
- blockquote
|
|
90
|
+
- text
|
|
91
|
+
a11y:
|
|
92
|
+
notes:
|
|
93
|
+
- "Renders the native q element - browsers insert quotation marks automatically via default CSS, so do not add literal quote characters in the children or they will be doubled."
|
|
94
|
+
radixHandles: false
|
|
95
|
+
pitfalls:
|
|
96
|
+
- "Wrapping the children in your own \"...\" characters double-quotes the text, since q already inserts marks via browser default styles."
|
|
97
|
+
- "color's default/muted/accent options are not shared with Blockquote's primary/neutral - the two quote-flavored primitives use different color vocabularies."
|
|
98
|
+
canonicalSnippet: |
|
|
99
|
+
import { Quote } from "@adres/mgda-ui"
|
|
100
|
+
|
|
101
|
+
<p>
|
|
102
|
+
As the saying goes, <Quote>less is more</Quote>.
|
|
103
|
+
</p>
|
|
104
|
+
reviewedAt: 2026-08-31
|
|
105
|
+
reviewedAgainstContractHash: e61f900e390e
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Usage
|
|
109
|
+
|
|
110
|
+
`Quote` is for a short quotation embedded inline within a sentence - it
|
|
111
|
+
renders the native `<q>` element, so the browser adds quotation marks
|
|
112
|
+
automatically rather than the component inserting literal characters. Do not
|
|
113
|
+
wrap the children in your own quote marks, or they will be doubled.
|
|
114
|
+
|
|
115
|
+
Reach for `Blockquote` instead once the quotation is long enough to stand on
|
|
116
|
+
its own as a block, especially with attribution.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
# >>> DERIVED - regenerated by `npm run knowledge:sync`. Do not edit. <<<
|
|
3
|
+
derived:
|
|
4
|
+
schemaVersion: 1
|
|
5
|
+
id: radio-card
|
|
6
|
+
sourceFile: packages/design-system/src/components/radio-card.tsx
|
|
7
|
+
client: true
|
|
8
|
+
category: web-app-form-controls
|
|
9
|
+
categoryFromBarrel: web-app-form-controls
|
|
10
|
+
barrelExported: true
|
|
11
|
+
importPath: "@adres/mgda-ui"
|
|
12
|
+
exports:
|
|
13
|
+
- name: RadioCard
|
|
14
|
+
kind: component
|
|
15
|
+
typeText: "ForwardRefExoticComponent<RadioCardProps & RefAttributes<HTMLButtonElement>>"
|
|
16
|
+
- name: RadioCardDescription
|
|
17
|
+
kind: component
|
|
18
|
+
typeText: "ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>>"
|
|
19
|
+
- name: RadioCardGroup
|
|
20
|
+
kind: component
|
|
21
|
+
typeText: "ForwardRefExoticComponent<RadioCardGroupProps & RefAttributes<HTMLDivElement>>"
|
|
22
|
+
- name: RadioCardGroupProps
|
|
23
|
+
kind: type
|
|
24
|
+
- name: RadioCardIcon
|
|
25
|
+
kind: component
|
|
26
|
+
typeText: "ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & RefAttributes<HTMLDivElement>>"
|
|
27
|
+
- name: RadioCardOrientation
|
|
28
|
+
kind: type
|
|
29
|
+
- name: RadioCardProps
|
|
30
|
+
kind: type
|
|
31
|
+
- name: RadioCardSize
|
|
32
|
+
kind: type
|
|
33
|
+
- name: RadioCardTitle
|
|
34
|
+
kind: component
|
|
35
|
+
typeText: "ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & RefAttributes<HTMLParagraphElement>>"
|
|
36
|
+
primaryExport: RadioCard
|
|
37
|
+
subcomponents:
|
|
38
|
+
- RadioCardDescription
|
|
39
|
+
- RadioCardGroup
|
|
40
|
+
- RadioCardIcon
|
|
41
|
+
- RadioCardTitle
|
|
42
|
+
props:
|
|
43
|
+
RadioCard:
|
|
44
|
+
- name: size
|
|
45
|
+
type: RadioCardSize
|
|
46
|
+
required: false
|
|
47
|
+
declaredIn: self
|
|
48
|
+
variantKey: true
|
|
49
|
+
RadioCardGroup:
|
|
50
|
+
- name: compact
|
|
51
|
+
type: boolean
|
|
52
|
+
required: false
|
|
53
|
+
declaredIn: self
|
|
54
|
+
- name: orientation
|
|
55
|
+
type: RadioCardOrientation
|
|
56
|
+
required: false
|
|
57
|
+
declaredIn: self
|
|
58
|
+
- name: size
|
|
59
|
+
type: RadioCardSize
|
|
60
|
+
required: false
|
|
61
|
+
declaredIn: self
|
|
62
|
+
variantKey: true
|
|
63
|
+
extendsProps:
|
|
64
|
+
- "React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>"
|
|
65
|
+
variants:
|
|
66
|
+
size:
|
|
67
|
+
kind: enum
|
|
68
|
+
options:
|
|
69
|
+
- sm
|
|
70
|
+
- base
|
|
71
|
+
- lg
|
|
72
|
+
- xl
|
|
73
|
+
default: base
|
|
74
|
+
on: RadioCard
|
|
75
|
+
variantSource: cva
|
|
76
|
+
compoundVariants: []
|
|
77
|
+
sizeMaps:
|
|
78
|
+
- COMPACT_LAYOUT
|
|
79
|
+
- INDICATOR_SIZE
|
|
80
|
+
dataSlots:
|
|
81
|
+
- radio-card-icon
|
|
82
|
+
- radio-card-off
|
|
83
|
+
- radio-card-on
|
|
84
|
+
- radio-card-title
|
|
85
|
+
dependsOn:
|
|
86
|
+
internal: []
|
|
87
|
+
lib:
|
|
88
|
+
- cn
|
|
89
|
+
hooks: []
|
|
90
|
+
external:
|
|
91
|
+
- "@radix-ui/react-radio-group"
|
|
92
|
+
- class-variance-authority
|
|
93
|
+
- lucide-react
|
|
94
|
+
- react
|
|
95
|
+
contexts:
|
|
96
|
+
- name: RadioCardGroupContext
|
|
97
|
+
type: RadioCardGroupContext
|
|
98
|
+
default: null
|
|
99
|
+
stories:
|
|
100
|
+
- exportName: Default
|
|
101
|
+
id: components-radiocard--default
|
|
102
|
+
storybookTitle: Components/RadioCard
|
|
103
|
+
docsId: components-radiocard--documentation
|
|
104
|
+
argTypeOptions: {}
|
|
105
|
+
resolvedCleanly: true
|
|
106
|
+
contractHash: "37b2d466668c"
|
|
107
|
+
factsHash: "88b41ad8dceb"
|
|
108
|
+
# >>> AUTHORED - humans own everything below this line. <<<
|
|
109
|
+
status: stable
|
|
110
|
+
summary: "A large clickable card acting as a radio button - a bordered surface with a title/description and a trailing indicator, for single-select option grids."
|
|
111
|
+
useWhen:
|
|
112
|
+
- "presenting mutually-exclusive options as prominent cards rather than plain radio buttons - pricing tiers, plan selection, any single choice worth describing"
|
|
113
|
+
useInstead:
|
|
114
|
+
- id: radio-group
|
|
115
|
+
when: "a compact list of options fits plain radio buttons and labels better than a full card"
|
|
116
|
+
- id: checkbox-card
|
|
117
|
+
when: "more than one option can be selected at once"
|
|
118
|
+
related:
|
|
119
|
+
- radio-group
|
|
120
|
+
- checkbox-card
|
|
121
|
+
a11y:
|
|
122
|
+
notes:
|
|
123
|
+
- "The actual Radix radio item is visually hidden (sr-only) inside a real label, so clicking anywhere on the card selects it, and the accessible name comes from RadioCardTitle/RadioCardDescription's text content."
|
|
124
|
+
- "RadioCardGroup is a real Radix RadioGroup.Root, so it already provides single-select group semantics and roving-tabindex - no extra role or ARIA is needed beyond what is built in."
|
|
125
|
+
keyboard:
|
|
126
|
+
- "Native Radix radio-group keyboard behavior: arrow keys move selection between cards, Tab enters or exits the group once."
|
|
127
|
+
radixHandles: true
|
|
128
|
+
pitfalls:
|
|
129
|
+
- "size options include xl, unlike CheckboxCard which stops at lg - the two sibling card patterns do not share an identical size scale."
|
|
130
|
+
- "RadioCardIcon exists specifically for an optional leading icon and drives its own checked-state color via data-slot - a plain icon element dropped in without RadioCardIcon will not pick up the selected-state tint."
|
|
131
|
+
- "compact mode collapses the cards into a connected strip (shared borders, only the first and last corners rounded), the same pattern CheckboxCard uses - size alone does not change this shape."
|
|
132
|
+
canonicalSnippet: |
|
|
133
|
+
import { RadioCard, RadioCardDescription, RadioCardGroup, RadioCardTitle } from "@adres/mgda-ui"
|
|
134
|
+
|
|
135
|
+
<RadioCardGroup defaultValue="monthly" className="ax:max-w-md">
|
|
136
|
+
<RadioCard value="monthly">
|
|
137
|
+
<RadioCardTitle>Monthly</RadioCardTitle>
|
|
138
|
+
<RadioCardDescription>Pay as you go each month.</RadioCardDescription>
|
|
139
|
+
</RadioCard>
|
|
140
|
+
<RadioCard value="yearly">
|
|
141
|
+
<RadioCardTitle>Yearly</RadioCardTitle>
|
|
142
|
+
<RadioCardDescription>Save 20% with annual billing.</RadioCardDescription>
|
|
143
|
+
</RadioCard>
|
|
144
|
+
</RadioCardGroup>
|
|
145
|
+
reviewedAt: 2026-08-31
|
|
146
|
+
reviewedAgainstContractHash: "37b2d466668c"
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Usage
|
|
150
|
+
|
|
151
|
+
`RadioCard` turns a radio option into a full clickable card - reach for it
|
|
152
|
+
when mutually-exclusive choices deserve more visual weight than plain radio
|
|
153
|
+
buttons (pricing tiers, plan selection, any single choice worth describing).
|
|
154
|
+
For a multi-select version of the same pattern, use `CheckboxCard` instead.
|
|
155
|
+
|
|
156
|
+
`RadioCardGroup` is a real Radix `RadioGroup.Root`, so `value`,
|
|
157
|
+
`defaultValue`, and `onValueChange` all work exactly as they would on a plain
|
|
158
|
+
`RadioGroup` - the group already provides single-select semantics and
|
|
159
|
+
roving-tabindex keyboard navigation.
|
|
160
|
+
|
|
161
|
+
Set `compact` to collapse the cards into a connected strip with shared
|
|
162
|
+
borders instead of a spaced grid, the same pattern `CheckboxCard` uses.
|
|
163
|
+
|
|
164
|
+
## Anatomy
|
|
165
|
+
|
|
166
|
+
| Part | Role |
|
|
167
|
+
| --- | --- |
|
|
168
|
+
| `RadioCardGroup` | The Radix RadioGroup root. Owns `size`, `compact`, `orientation`, plus the usual `value`/`onValueChange`. |
|
|
169
|
+
| `RadioCard` | One card. Wraps a visually-hidden Radix radio item in a real `<label>`, so the whole card is the click target. |
|
|
170
|
+
| `RadioCardIcon` | Optional leading icon. Its `data-slot` drives the checked-state color tint. |
|
|
171
|
+
| `RadioCardTitle` | The card's heading. Same checked-state tint mechanism as `RadioCardIcon`. |
|
|
172
|
+
| `RadioCardDescription` | Supporting text below the title. |
|