@teamblind-chorus/ui 1.0.0
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/LICENSE +21 -0
- package/README.md +112 -0
- package/agents/AGENTS.md +143 -0
- package/agents/DESIGN.md +1311 -0
- package/agents/LOVABLE.md +472 -0
- package/agents/anti-patterns.md +533 -0
- package/agents/catalog.md +232 -0
- package/agents/components/avatar-rail/avatar-rail.family.json +46 -0
- package/agents/components/avatar-rail/avatar-rail.md +103 -0
- package/agents/components/avatar-rail/avatar-rail.spec.json +160 -0
- package/agents/components/badge/badge.family.json +45 -0
- package/agents/components/badge/badge.md +10 -0
- package/agents/components/badge/role.md +100 -0
- package/agents/components/badge/role.spec.json +75 -0
- package/agents/components/badge/update.md +132 -0
- package/agents/components/badge/update.spec.json +114 -0
- package/agents/components/banner/banner.family.json +28 -0
- package/agents/components/banner/banner.md +136 -0
- package/agents/components/banner/banner.spec.json +136 -0
- package/agents/components/bottom-sheet/bottom-sheet.family.json +29 -0
- package/agents/components/bottom-sheet/bottom-sheet.md +176 -0
- package/agents/components/bottom-sheet/bottom-sheet.spec.json +168 -0
- package/agents/components/bubble/bubble.family.json +29 -0
- package/agents/components/bubble/bubble.md +134 -0
- package/agents/components/bubble/bubble.spec.json +91 -0
- package/agents/components/button/button.family.json +76 -0
- package/agents/components/button/button.md +31 -0
- package/agents/components/button/check.md +138 -0
- package/agents/components/button/check.spec.json +161 -0
- package/agents/components/button/fab.md +161 -0
- package/agents/components/button/fab.spec.json +106 -0
- package/agents/components/button/icon.md +141 -0
- package/agents/components/button/icon.spec.json +164 -0
- package/agents/components/button/standard.md +219 -0
- package/agents/components/button/standard.spec.json +205 -0
- package/agents/components/button/text.md +186 -0
- package/agents/components/button/text.spec.json +215 -0
- package/agents/components/button/toggle.md +108 -0
- package/agents/components/button/toggle.spec.json +124 -0
- package/agents/components/button/toolbar.md +189 -0
- package/agents/components/button/toolbar.spec.json +109 -0
- package/agents/components/carousel/carousel.family.json +41 -0
- package/agents/components/carousel/carousel.md +40 -0
- package/agents/components/carousel/post.md +148 -0
- package/agents/components/carousel/post.spec.json +229 -0
- package/agents/components/carousel/profile.md +184 -0
- package/agents/components/carousel/profile.spec.json +219 -0
- package/agents/components/chip/chip.family.json +37 -0
- package/agents/components/chip/chip.md +10 -0
- package/agents/components/chip/filter.md +212 -0
- package/agents/components/chip/filter.spec.json +124 -0
- package/agents/components/chip/tag.md +137 -0
- package/agents/components/chip/tag.spec.json +104 -0
- package/agents/components/dialog/dialog.family.json +29 -0
- package/agents/components/dialog/dialog.md +113 -0
- package/agents/components/dialog/dialog.spec.json +156 -0
- package/agents/components/directory-list/directory-list.family.json +46 -0
- package/agents/components/directory-list/directory-list.md +87 -0
- package/agents/components/directory-list/directory-list.spec.json +104 -0
- package/agents/components/divider/divider.family.json +28 -0
- package/agents/components/divider/divider.md +78 -0
- package/agents/components/divider/divider.spec.json +51 -0
- package/agents/components/feed/ad.md +108 -0
- package/agents/components/feed/ad.spec.json +187 -0
- package/agents/components/feed/feed.family.json +48 -0
- package/agents/components/feed/feed.md +30 -0
- package/agents/components/feed/post.md +240 -0
- package/agents/components/feed/post.spec.json +361 -0
- package/agents/components/form-field/form-field.family.json +50 -0
- package/agents/components/form-field/form-field.md +11 -0
- package/agents/components/form-field/input.md +198 -0
- package/agents/components/form-field/input.spec.json +202 -0
- package/agents/components/form-field/search.md +81 -0
- package/agents/components/form-field/search.spec.json +135 -0
- package/agents/components/form-field/select.md +101 -0
- package/agents/components/form-field/select.spec.json +194 -0
- package/agents/components/form-field/textarea.md +89 -0
- package/agents/components/form-field/textarea.spec.json +176 -0
- package/agents/components/header/header.family.json +43 -0
- package/agents/components/header/header.md +18 -0
- package/agents/components/header/main.md +101 -0
- package/agents/components/header/main.spec.json +117 -0
- package/agents/components/header/sub.md +129 -0
- package/agents/components/header/sub.spec.json +81 -0
- package/agents/components/list/accordion.md +183 -0
- package/agents/components/list/accordion.spec.json +201 -0
- package/agents/components/list/entry.md +280 -0
- package/agents/components/list/entry.spec.json +237 -0
- package/agents/components/list/list.family.json +75 -0
- package/agents/components/list/list.md +24 -0
- package/agents/components/list/radio.md +144 -0
- package/agents/components/list/radio.spec.json +186 -0
- package/agents/components/list/standard.md +262 -0
- package/agents/components/list/standard.spec.json +221 -0
- package/agents/components/metadata/compact.md +69 -0
- package/agents/components/metadata/compact.spec.json +69 -0
- package/agents/components/metadata/metadata.family.json +42 -0
- package/agents/components/metadata/metadata.md +26 -0
- package/agents/components/metadata/standard.md +104 -0
- package/agents/components/metadata/standard.spec.json +152 -0
- package/agents/components/nav-card/nav-card.family.json +29 -0
- package/agents/components/nav-card/nav-card.md +179 -0
- package/agents/components/nav-card/nav-card.spec.json +161 -0
- package/agents/components/nav-list/nav-list.family.json +46 -0
- package/agents/components/nav-list/nav-list.md +91 -0
- package/agents/components/nav-list/nav-list.spec.json +107 -0
- package/agents/components/navigation-bar/main.md +201 -0
- package/agents/components/navigation-bar/main.spec.json +109 -0
- package/agents/components/navigation-bar/navigation-bar.family.json +44 -0
- package/agents/components/navigation-bar/navigation-bar.md +21 -0
- package/agents/components/navigation-bar/search.md +96 -0
- package/agents/components/navigation-bar/search.spec.json +142 -0
- package/agents/components/navigation-bar/sub.md +174 -0
- package/agents/components/navigation-bar/sub.spec.json +123 -0
- package/agents/components/page-shell/page-shell.family.json +22 -0
- package/agents/components/page-shell/page-shell.md +51 -0
- package/agents/components/profile-header/profile-header.family.json +29 -0
- package/agents/components/profile-header/profile-header.md +149 -0
- package/agents/components/profile-header/profile-header.spec.json +200 -0
- package/agents/components/progress/progress.family.json +27 -0
- package/agents/components/progress/progress.md +38 -0
- package/agents/components/progress/progress.spec.json +67 -0
- package/agents/components/side-sheet/side-sheet.family.json +30 -0
- package/agents/components/side-sheet/side-sheet.md +154 -0
- package/agents/components/side-sheet/side-sheet.spec.json +109 -0
- package/agents/components/skeleton/skeleton.family.json +28 -0
- package/agents/components/skeleton/skeleton.md +123 -0
- package/agents/components/skeleton/skeleton.spec.json +73 -0
- package/agents/components/status-tag/status-tag.family.json +26 -0
- package/agents/components/status-tag/status-tag.md +114 -0
- package/agents/components/status-tag/status-tag.spec.json +69 -0
- package/agents/components/suggestion-list/suggestion-list.family.json +46 -0
- package/agents/components/suggestion-list/suggestion-list.md +91 -0
- package/agents/components/suggestion-list/suggestion-list.spec.json +178 -0
- package/agents/components/switch/switch.family.json +27 -0
- package/agents/components/switch/switch.md +114 -0
- package/agents/components/switch/switch.spec.json +123 -0
- package/agents/components/tab-bar/tab-bar.family.json +27 -0
- package/agents/components/tab-bar/tab-bar.md +178 -0
- package/agents/components/tab-bar/tab-bar.spec.json +184 -0
- package/agents/components/tabs/rounded.md +150 -0
- package/agents/components/tabs/rounded.spec.json +140 -0
- package/agents/components/tabs/segmented.md +114 -0
- package/agents/components/tabs/segmented.spec.json +100 -0
- package/agents/components/tabs/tabs.family.json +59 -0
- package/agents/components/tabs/tabs.md +18 -0
- package/agents/components/tabs/underline.md +147 -0
- package/agents/components/tabs/underline.spec.json +139 -0
- package/agents/components/thumbnail/thumbnail.family.json +28 -0
- package/agents/components/thumbnail/thumbnail.md +152 -0
- package/agents/components/thumbnail/thumbnail.spec.json +172 -0
- package/agents/components/toast/toast.family.json +28 -0
- package/agents/components/toast/toast.md +133 -0
- package/agents/components/toast/toast.spec.json +89 -0
- package/agents/components/tooltip/tooltip.family.json +29 -0
- package/agents/components/tooltip/tooltip.md +139 -0
- package/agents/components/tooltip/tooltip.spec.json +110 -0
- package/agents/compose.md +240 -0
- package/agents/icons.json +831 -0
- package/agents/images.md +66 -0
- package/agents/manifest.json +87 -0
- package/agents/patterns/README.md +59 -0
- package/agents/patterns/actions.md +50 -0
- package/agents/patterns/browsing.md +52 -0
- package/agents/patterns/communications.md +56 -0
- package/agents/patterns/layout.md +72 -0
- package/agents/patterns/modals.md +50 -0
- package/agents/patterns/visual.md +55 -0
- package/agents/reconstruct.md +55 -0
- package/agents/scoped-adoption.md +111 -0
- package/agents/tokens.usage.json +1657 -0
- package/agents/usage.json +422 -0
- package/dist/icons/index.cjs +1332 -0
- package/dist/icons/index.cjs.map +1 -0
- package/dist/icons/index.d.cts +228 -0
- package/dist/icons/index.d.ts +228 -0
- package/dist/icons/index.js +1114 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.cjs +5905 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +896 -0
- package/dist/index.d.ts +896 -0
- package/dist/index.js +5847 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +5765 -0
- package/eslint/README.md +79 -0
- package/eslint/index.js +78 -0
- package/eslint/rules.js +472 -0
- package/eslint/test.mjs +135 -0
- package/package.json +96 -0
- package/placeholder.png +0 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generated": "by packages/ui/scripts/build-usage.mjs — DO NOT EDIT. Run `npm run build-usage`.",
|
|
3
|
+
"purpose": "Authoritative family → React usage map. Every `import` below is parity-checked against packages/ui/src/index.js at build time, so 'is this family exported?' is answered HERE, never guessed. Read the per-sub `access`: a `variant` sub is reached with the `variant` prop on its parent import (there is no separate export for it — e.g. NO `<Fab>`, NO `<ListItem>`); a `named` sub is its own export. A failed `import { X }` for ONE component never means the catalog is unreliable — look the component up here.",
|
|
4
|
+
"from": "@teamblind-chorus/ui",
|
|
5
|
+
"families": {
|
|
6
|
+
"badge": {
|
|
7
|
+
"import": "Badge",
|
|
8
|
+
"from": "@teamblind-chorus/ui",
|
|
9
|
+
"note": "Both forms are the single `Badge` export selected by the `variant` prop — there is NO `<UpdateBadge>` or `<RoleBadge>` export. Default variant is `update`: count via children or `count`; render a dot (no number) with a `dot-*` size — there is no separate `Dot` element.",
|
|
10
|
+
"subs": {
|
|
11
|
+
"update": {
|
|
12
|
+
"access": "variant",
|
|
13
|
+
"on": "Badge",
|
|
14
|
+
"variant": "update",
|
|
15
|
+
"example": "<Badge size=\"medium\" count={3} />"
|
|
16
|
+
},
|
|
17
|
+
"role": {
|
|
18
|
+
"access": "variant",
|
|
19
|
+
"on": "Badge",
|
|
20
|
+
"variant": "role",
|
|
21
|
+
"example": "<Badge variant=\"role\">Verified</Badge>"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"banner": {
|
|
26
|
+
"import": "Banner",
|
|
27
|
+
"from": "@teamblind-chorus/ui",
|
|
28
|
+
"aliases": [
|
|
29
|
+
"Alert"
|
|
30
|
+
],
|
|
31
|
+
"note": "Body text is children, not a `body` prop; `action` is an object with `label` + `href`/`onClick`.",
|
|
32
|
+
"example": "<Banner appearance=\"default\" action={{ label, href }}>…</Banner>"
|
|
33
|
+
},
|
|
34
|
+
"bottom-sheet": {
|
|
35
|
+
"import": "BottomSheet",
|
|
36
|
+
"from": "@teamblind-chorus/ui",
|
|
37
|
+
"aliases": [
|
|
38
|
+
"Sheet",
|
|
39
|
+
"Drawer"
|
|
40
|
+
],
|
|
41
|
+
"note": "Controlled via `open` + `onClose`; actions are objects (`primaryAction`/`secondaryAction`), not children.",
|
|
42
|
+
"example": "<BottomSheet open onClose={close} title=\"…\" body=\"…\" primaryAction={{ label, onClick }} secondaryAction={{ label, onClick }} />"
|
|
43
|
+
},
|
|
44
|
+
"bubble": {
|
|
45
|
+
"import": "Bubble",
|
|
46
|
+
"from": "@teamblind-chorus/ui",
|
|
47
|
+
"note": "Label is children; ships no positioning — the host anchors it. `tailSide`/`tailAlign` pick the tail; there is no separate tail element.",
|
|
48
|
+
"example": "<Bubble tailSide=\"top\" tailAlign=\"center\">…</Bubble>"
|
|
49
|
+
},
|
|
50
|
+
"button": {
|
|
51
|
+
"import": "Button",
|
|
52
|
+
"from": "@teamblind-chorus/ui",
|
|
53
|
+
"note": "All button roles are the single `Button` export selected by the `variant` prop — there is NO `<Fab>`, `<IconButton>`, `<ToggleButton>`, or `<Toolbar>` export. An `import { Fab }` failure does NOT mean the family is missing; reach for `<Button variant=\"fab\">`.",
|
|
54
|
+
"subs": {
|
|
55
|
+
"standard": {
|
|
56
|
+
"access": "variant",
|
|
57
|
+
"on": "Button",
|
|
58
|
+
"variant": "standard",
|
|
59
|
+
"example": "<Button variant=\"standard\" … />"
|
|
60
|
+
},
|
|
61
|
+
"fab": {
|
|
62
|
+
"access": "variant",
|
|
63
|
+
"on": "Button",
|
|
64
|
+
"variant": "fab",
|
|
65
|
+
"example": "<Button variant=\"fab\" appearance=\"primary\" icon={<EditIcon />}>글쓰기</Button>"
|
|
66
|
+
},
|
|
67
|
+
"icon": {
|
|
68
|
+
"access": "variant",
|
|
69
|
+
"on": "Button",
|
|
70
|
+
"variant": "icon",
|
|
71
|
+
"example": "<Button variant=\"icon\" aria-label=\"…\" icon={<MoreIcon />} />"
|
|
72
|
+
},
|
|
73
|
+
"text": {
|
|
74
|
+
"access": "variant",
|
|
75
|
+
"on": "Button",
|
|
76
|
+
"variant": "text",
|
|
77
|
+
"example": "<Button variant=\"text\" … />"
|
|
78
|
+
},
|
|
79
|
+
"check": {
|
|
80
|
+
"access": "variant",
|
|
81
|
+
"on": "Button",
|
|
82
|
+
"variant": "check",
|
|
83
|
+
"example": "<Button variant=\"check\" … />"
|
|
84
|
+
},
|
|
85
|
+
"toggle": {
|
|
86
|
+
"access": "variant",
|
|
87
|
+
"on": "Button",
|
|
88
|
+
"variant": "toggle",
|
|
89
|
+
"example": "<Button variant=\"toggle\" … />"
|
|
90
|
+
},
|
|
91
|
+
"toolbar": {
|
|
92
|
+
"access": "variant",
|
|
93
|
+
"on": "Button",
|
|
94
|
+
"variant": "toolbar",
|
|
95
|
+
"example": "<Button variant=\"toolbar\" … />"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"suggestion-list": {
|
|
100
|
+
"import": "SuggestionList",
|
|
101
|
+
"from": "@teamblind-chorus/ui",
|
|
102
|
+
"aliases": [
|
|
103
|
+
"ChannelList"
|
|
104
|
+
],
|
|
105
|
+
"note": "Also exported as the deprecated alias `ChannelList`. Rows carry `name`/`followers`/`description`, not `label`.",
|
|
106
|
+
"example": "<SuggestionList label=\"…\" headerAction={{ label, href }} items={[{ value, name, followers, description, thumbnail, active, onToggle }]} />"
|
|
107
|
+
},
|
|
108
|
+
"avatar-rail": {
|
|
109
|
+
"import": "AvatarRail",
|
|
110
|
+
"from": "@teamblind-chorus/ui",
|
|
111
|
+
"aliases": [
|
|
112
|
+
"ChannelRail"
|
|
113
|
+
],
|
|
114
|
+
"note": "Also exported as the deprecated alias `ChannelRail`. Items route via `href`; the update dot lives on `thumbnail.updateDot`.",
|
|
115
|
+
"example": "<AvatarRail aria-label=\"…\" items={[{ value, label, href, thumbnail }]} trailingAction={{ label, href }} />"
|
|
116
|
+
},
|
|
117
|
+
"chip": {
|
|
118
|
+
"import": "Chip",
|
|
119
|
+
"from": "@teamblind-chorus/ui",
|
|
120
|
+
"note": "Both forms are the single `Chip` export selected by the `variant` prop — there is NO `<FilterChip>` or `<Tag>` export.",
|
|
121
|
+
"subs": {
|
|
122
|
+
"filter": {
|
|
123
|
+
"access": "variant",
|
|
124
|
+
"on": "Chip",
|
|
125
|
+
"variant": "filter",
|
|
126
|
+
"example": "<Chip variant=\"filter\" selected leadingIcon={<CheckedIcon />}>Selected</Chip>"
|
|
127
|
+
},
|
|
128
|
+
"tag": {
|
|
129
|
+
"access": "variant",
|
|
130
|
+
"on": "Chip",
|
|
131
|
+
"variant": "tag",
|
|
132
|
+
"example": "<Chip variant=\"tag\" trailingIcon={<XIcon />}>Newsletter</Chip>"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"dialog": {
|
|
137
|
+
"import": "Dialog",
|
|
138
|
+
"from": "@teamblind-chorus/ui",
|
|
139
|
+
"note": "Actions are `primaryAction` / `secondaryAction` descriptor objects ({ label, onClick }) — there are NO Button children.",
|
|
140
|
+
"example": "<Dialog open={open} onClose={() => setOpen(false)} title=\"…\" body=\"…\" primaryAction={{ label, onClick }} secondaryAction={{ label, onClick }} />"
|
|
141
|
+
},
|
|
142
|
+
"divider": {
|
|
143
|
+
"import": "Divider",
|
|
144
|
+
"from": "@teamblind-chorus/ui",
|
|
145
|
+
"example": "<Divider />"
|
|
146
|
+
},
|
|
147
|
+
"directory-list": {
|
|
148
|
+
"import": "DirectoryList",
|
|
149
|
+
"from": "@teamblind-chorus/ui",
|
|
150
|
+
"note": "Rows are an `items` array of descriptors (name/followers/description/thumbnail/active/onToggle) — there are NO List or row children.",
|
|
151
|
+
"example": "<DirectoryList label=\"…\" items={[{ value, name, followers, description, thumbnail: { src, alt }, active, onToggle }]} />"
|
|
152
|
+
},
|
|
153
|
+
"feed": {
|
|
154
|
+
"import": "Feed",
|
|
155
|
+
"from": "@teamblind-chorus/ui",
|
|
156
|
+
"note": "`feed / post` IS the `Feed` export; `feed / ad` is a separate `FeedAd` export. Every affordance threads through props — there is NO `<FeedItem>` child element.",
|
|
157
|
+
"subs": {
|
|
158
|
+
"post": {
|
|
159
|
+
"access": "named",
|
|
160
|
+
"import": "Feed",
|
|
161
|
+
"example": "<Feed channel=\"…\" thumbnail={{ src }} title=\"…\" body=\"…\" onClick={() => router.push(href)} />"
|
|
162
|
+
},
|
|
163
|
+
"ad": {
|
|
164
|
+
"access": "named",
|
|
165
|
+
"import": "FeedAd",
|
|
166
|
+
"example": "<FeedAd brand=\"…\" title=\"…\" media={{ src }} cta={…} />"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
"form-field": {
|
|
171
|
+
"import": "FormField",
|
|
172
|
+
"from": "@teamblind-chorus/ui",
|
|
173
|
+
"note": "Each variant is also exposed as a convenience named export (Input / Textarea / SearchBar / Select), all backed by `FormField`.",
|
|
174
|
+
"subs": {
|
|
175
|
+
"input": {
|
|
176
|
+
"access": "named",
|
|
177
|
+
"import": "Input",
|
|
178
|
+
"example": "<Input label=\"…\" value={v} onChange={setV} />"
|
|
179
|
+
},
|
|
180
|
+
"textarea": {
|
|
181
|
+
"access": "named",
|
|
182
|
+
"import": "Textarea",
|
|
183
|
+
"example": "<Textarea label=\"…\" value={v} onChange={setV} />"
|
|
184
|
+
},
|
|
185
|
+
"search": {
|
|
186
|
+
"access": "named",
|
|
187
|
+
"import": "SearchBar",
|
|
188
|
+
"example": "<SearchBar value={q} onChange={setQ} />"
|
|
189
|
+
},
|
|
190
|
+
"select": {
|
|
191
|
+
"access": "named",
|
|
192
|
+
"import": "Select",
|
|
193
|
+
"example": "<Select label=\"…\" value={v} onChange={setV} options={[…]} />"
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"header": {
|
|
198
|
+
"import": "Header",
|
|
199
|
+
"from": "@teamblind-chorus/ui",
|
|
200
|
+
"subs": {
|
|
201
|
+
"main": {
|
|
202
|
+
"access": "named",
|
|
203
|
+
"import": "Header",
|
|
204
|
+
"example": "<Header label=\"Recommended channels\" headerAction={{ label: 'See all', href: '#all' }} />"
|
|
205
|
+
},
|
|
206
|
+
"sub": {
|
|
207
|
+
"access": "named",
|
|
208
|
+
"import": "SubHeader",
|
|
209
|
+
"example": "<SubHeader label=\"Following\" />"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
"list": {
|
|
214
|
+
"import": "List",
|
|
215
|
+
"from": "@teamblind-chorus/ui",
|
|
216
|
+
"note": "Rows are an `items` descriptor *array* on `<List>` — there is NO `<ListItem>` export. A styled `<button>` row or a hand-rolled flex row is a reinvention of `list / entry`. `accordion` is the one sub that takes `<Accordion>` children.",
|
|
217
|
+
"subs": {
|
|
218
|
+
"standard": {
|
|
219
|
+
"access": "variant",
|
|
220
|
+
"on": "List",
|
|
221
|
+
"variant": "standard",
|
|
222
|
+
"example": "<List variant=\"standard\" items={[{ label, leadingIcon, trailing, onClick }]} />"
|
|
223
|
+
},
|
|
224
|
+
"radio": {
|
|
225
|
+
"access": "variant",
|
|
226
|
+
"on": "List",
|
|
227
|
+
"variant": "radio",
|
|
228
|
+
"example": "<List variant=\"radio\" value={v} onChange={setV} items={[{ label, value }]} />"
|
|
229
|
+
},
|
|
230
|
+
"entry": {
|
|
231
|
+
"access": "variant",
|
|
232
|
+
"on": "List",
|
|
233
|
+
"variant": "entry",
|
|
234
|
+
"example": "<List variant=\"entry\" items={[{ thumbnail, label, secondary, description, trailing, onClick }]} />"
|
|
235
|
+
},
|
|
236
|
+
"accordion": {
|
|
237
|
+
"access": "named",
|
|
238
|
+
"import": "Accordion",
|
|
239
|
+
"example": "<Accordion><Accordion.Item title=\"…\">…</Accordion.Item></Accordion>"
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
"metadata": {
|
|
244
|
+
"import": "Metadata",
|
|
245
|
+
"from": "@teamblind-chorus/ui",
|
|
246
|
+
"note": "Both shapes are the single `Metadata` export — the one-line comment shape is `variant=\"compact\"`, NOT a separate `<MetadataCompact>`. Leading thumbnail is the `avatar` prop (NOT `thumbnail`); the secondary line is either a `subtitle` string or a `meta` string array — not children.",
|
|
247
|
+
"subs": {
|
|
248
|
+
"standard": {
|
|
249
|
+
"access": "named",
|
|
250
|
+
"import": "Metadata",
|
|
251
|
+
"example": "<Metadata avatar={{ src, alt }} name=\"…\" nameHref=\"#\" timestamp=\"2h\" meta={[\"…\"]} />"
|
|
252
|
+
},
|
|
253
|
+
"compact": {
|
|
254
|
+
"access": "variant",
|
|
255
|
+
"on": "Metadata",
|
|
256
|
+
"variant": "compact",
|
|
257
|
+
"example": "<Metadata variant=\"compact\" meta={[\"Maple Mill Bakery\", \"ryestarter\"]} timestamp=\"35m\" />"
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"nav-card": {
|
|
262
|
+
"import": "NavCard",
|
|
263
|
+
"from": "@teamblind-chorus/ui",
|
|
264
|
+
"note": "The trailing drill-in chevron comes from `variant=\"nav\"`, not a trailing child; `leading` takes a node (Icon / Thumbnail).",
|
|
265
|
+
"example": "<NavCard variant=\"nav\" label=\"…\" supportingText=\"…\" leading={<Icon />} href=\"#\" />"
|
|
266
|
+
},
|
|
267
|
+
"nav-list": {
|
|
268
|
+
"import": "NavList",
|
|
269
|
+
"from": "@teamblind-chorus/ui",
|
|
270
|
+
"note": "Rows are a label-only `items` array (value/label + href or onClick) — no thumbnail key, and no List or row children; the trailing chevron is automatic.",
|
|
271
|
+
"example": "<NavList label=\"…\" items={[{ value, label, href }]} />"
|
|
272
|
+
},
|
|
273
|
+
"navigation-bar": {
|
|
274
|
+
"import": "NavigationBar",
|
|
275
|
+
"from": "@teamblind-chorus/ui",
|
|
276
|
+
"aliases": [
|
|
277
|
+
"AppBar"
|
|
278
|
+
],
|
|
279
|
+
"note": "All three bars are the single `NavigationBar` export selected by the `variant` prop — pass `onBack` to a `main` bar to turn it into a content-detail drill-in. Also exported as the alias `AppBar`.",
|
|
280
|
+
"subs": {
|
|
281
|
+
"main": {
|
|
282
|
+
"access": "variant",
|
|
283
|
+
"on": "NavigationBar",
|
|
284
|
+
"variant": "main",
|
|
285
|
+
"example": "<NavigationBar variant=\"main\" title=\"Home\" trailingActions={[{ icon, 'aria-label' }]} />"
|
|
286
|
+
},
|
|
287
|
+
"sub": {
|
|
288
|
+
"access": "variant",
|
|
289
|
+
"on": "NavigationBar",
|
|
290
|
+
"variant": "sub",
|
|
291
|
+
"example": "<NavigationBar variant=\"sub\" title=\"Edit profile\" leading={{ icon, 'aria-label' }} trailing={<Button variant=\"toolbar\">Save</Button>} />"
|
|
292
|
+
},
|
|
293
|
+
"search": {
|
|
294
|
+
"access": "variant",
|
|
295
|
+
"on": "NavigationBar",
|
|
296
|
+
"variant": "search",
|
|
297
|
+
"example": "<NavigationBar variant=\"search\" placeholder=\"Search by keyword\" onBack={() => {}} />"
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
"page-shell": {
|
|
302
|
+
"import": "PageShell",
|
|
303
|
+
"from": "@teamblind-chorus/ui",
|
|
304
|
+
"note": "Compose the bars INTO the shell — do NOT hand-roll a flex column, and do NOT add position:sticky/fixed to the bars (that double-applies their safe-area insets). The dev-only usePinnedBarGuard warns when a bar is rendered inside a scrolling region instead.",
|
|
305
|
+
"example": "<PageShell nav={<NavigationBar variant=\"home\" … />} tabBar={<TabBar … />}>… scrolling screen content …</PageShell>"
|
|
306
|
+
},
|
|
307
|
+
"profile-header": {
|
|
308
|
+
"import": "ProfileHeader",
|
|
309
|
+
"from": "@teamblind-chorus/ui",
|
|
310
|
+
"note": "Paints its own overlay NavigationBar — don't wrap one yourself; opt out with nav={false}. value props are strings.",
|
|
311
|
+
"example": "<ProfileHeader name=\"…\" avatar={{ src, alt }} cover={{ src, alt }} visibility=\"public\" followers=\"…\" />"
|
|
312
|
+
},
|
|
313
|
+
"progress": {
|
|
314
|
+
"import": "Progress",
|
|
315
|
+
"from": "@teamblind-chorus/ui",
|
|
316
|
+
"note": "value is a 0–1 ratio, not a 0–100 percent. Determinate only; the label lives on the host surface.",
|
|
317
|
+
"example": "<Progress value={0.4} aria-label=\"…\" />"
|
|
318
|
+
},
|
|
319
|
+
"carousel": {
|
|
320
|
+
"import": "Carousel",
|
|
321
|
+
"from": "@teamblind-chorus/ui",
|
|
322
|
+
"aliases": [
|
|
323
|
+
"Section"
|
|
324
|
+
],
|
|
325
|
+
"note": "Carousel is the labelled section *wrapper* (heading + see-all link). The cards are a separate export per sub — there is NO `<CarouselItem>`. Also exported as the deprecated alias `Section`.",
|
|
326
|
+
"subs": {
|
|
327
|
+
"post": {
|
|
328
|
+
"access": "named",
|
|
329
|
+
"import": "PostCarousel",
|
|
330
|
+
"example": "<Carousel label=\"…\"><PostCarousel items={[{ avatar, channel, title, body, views, onClick }]} /></Carousel>"
|
|
331
|
+
},
|
|
332
|
+
"profile": {
|
|
333
|
+
"access": "named",
|
|
334
|
+
"import": "ProfileCarousel",
|
|
335
|
+
"example": "<Carousel label=\"…\"><ProfileCarousel items={[{ avatar, name, meta, onFollowChange }]} /></Carousel>"
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
"side-sheet": {
|
|
340
|
+
"import": "SideSheet",
|
|
341
|
+
"from": "@teamblind-chorus/ui",
|
|
342
|
+
"aliases": [
|
|
343
|
+
"SideDrawer"
|
|
344
|
+
],
|
|
345
|
+
"note": "Portal-rendered; controlled via open/onClose. Free-form children — group canonical Header + List(entry) stacks in SideSheetGroup.",
|
|
346
|
+
"example": "<SideSheet open onClose={close} aria-label=\"…\" footer={…}><SideSheetGroup>…</SideSheetGroup></SideSheet>"
|
|
347
|
+
},
|
|
348
|
+
"skeleton": {
|
|
349
|
+
"import": "Skeleton",
|
|
350
|
+
"from": "@teamblind-chorus/ui",
|
|
351
|
+
"note": "shape defaults to text; width/height are consumer-supplied. Stack multiples in SkeletonGroup to mirror the loading content's rhythm.",
|
|
352
|
+
"example": "<Skeleton shape=\"block\" height={120} />"
|
|
353
|
+
},
|
|
354
|
+
"status-tag": {
|
|
355
|
+
"import": "StatusTag",
|
|
356
|
+
"from": "@teamblind-chorus/ui",
|
|
357
|
+
"note": "Decorative — never interactive. Takes label text as children; not a Chip and not a button.",
|
|
358
|
+
"example": "<StatusTag appearance=\"error\">Rejected</StatusTag>"
|
|
359
|
+
},
|
|
360
|
+
"switch": {
|
|
361
|
+
"import": "Switch",
|
|
362
|
+
"from": "@teamblind-chorus/ui",
|
|
363
|
+
"note": "Change handler is `onCheckedChange` (not `onChange`); instant commit, no confirmation step. Whole pill is the target — the thumb is decorative.",
|
|
364
|
+
"example": "<Switch checked={on} onCheckedChange={setOn} aria-label=\"…\" />"
|
|
365
|
+
},
|
|
366
|
+
"tab-bar": {
|
|
367
|
+
"import": "TabBar",
|
|
368
|
+
"from": "@teamblind-chorus/ui",
|
|
369
|
+
"aliases": [
|
|
370
|
+
"BottomNav"
|
|
371
|
+
],
|
|
372
|
+
"note": "Export is `TabBar`; destinations thread through the `items` array (each `{ value, label, icon, activeIcon }`) — there is NO `<Tab>` child element.",
|
|
373
|
+
"example": "<TabBar aria-label=\"…\" value={value} onChange={setValue} items={[{ value, label, icon, activeIcon }]} />"
|
|
374
|
+
},
|
|
375
|
+
"tabs": {
|
|
376
|
+
"import": "Tabs",
|
|
377
|
+
"from": "@teamblind-chorus/ui",
|
|
378
|
+
"note": "`<Tabs>` selects chrome by the `variant` prop; every tab MUST be a `<Tab value=…>` child (compound) — there is no per-variant tab export and bare text / raw <button> children do not work.",
|
|
379
|
+
"subs": {
|
|
380
|
+
"underline": {
|
|
381
|
+
"access": "variant",
|
|
382
|
+
"on": "Tabs",
|
|
383
|
+
"variant": "underline",
|
|
384
|
+
"example": "<Tabs variant=\"underline\" value={v} onChange={setV}><Tab value=\"a\">A</Tab><Tab value=\"b\">B</Tab></Tabs>"
|
|
385
|
+
},
|
|
386
|
+
"rounded": {
|
|
387
|
+
"access": "variant",
|
|
388
|
+
"on": "Tabs",
|
|
389
|
+
"variant": "rounded",
|
|
390
|
+
"example": "<Tabs variant=\"rounded\" … />"
|
|
391
|
+
},
|
|
392
|
+
"segmented": {
|
|
393
|
+
"access": "variant",
|
|
394
|
+
"on": "Tabs",
|
|
395
|
+
"variant": "segmented",
|
|
396
|
+
"example": "<Tabs variant=\"segmented\" … />"
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
"thumbnail": {
|
|
401
|
+
"import": "Thumbnail",
|
|
402
|
+
"from": "@teamblind-chorus/ui",
|
|
403
|
+
"aliases": [
|
|
404
|
+
"Avatar"
|
|
405
|
+
],
|
|
406
|
+
"note": "Pure circular image primitive (the channel/author avatar) — badges ride via the `updateDot` / `logoBadge` props, not children; carries no label of its own.",
|
|
407
|
+
"example": "<Thumbnail size={48} src=\"…\" alt=\"…\" />"
|
|
408
|
+
},
|
|
409
|
+
"toast": {
|
|
410
|
+
"import": "Toast",
|
|
411
|
+
"from": "@teamblind-chorus/ui",
|
|
412
|
+
"note": "Message is children, not a `message` prop; an action / dismiss control goes in the `trailing` slot (an inverse-appearance Button).",
|
|
413
|
+
"example": "<Toast trailing={<Button variant=\"text\" appearance=\"inverse\" onClick={() => {}}>Undo</Button>}>…</Toast>"
|
|
414
|
+
},
|
|
415
|
+
"tooltip": {
|
|
416
|
+
"import": "Tooltip",
|
|
417
|
+
"from": "@teamblind-chorus/ui",
|
|
418
|
+
"note": "Hint text is children, not a `text` prop; an optional action goes in the `action` slot (a node) — `placement` anchors the caret to the trigger.",
|
|
419
|
+
"example": "<Tooltip placement=\"top\" action={<Button variant=\"text\" appearance=\"onPrimary\" onClick={() => {}}>Got it</Button>}>…</Tooltip>"
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|