@symbo.ls/mcp 1.0.11 → 1.0.13

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.
@@ -1,116 +1,52 @@
1
- # Symbols / DOMQL v3 — Component Reference
1
+ # Component API Reference
2
2
 
3
- All components use flattened props (no `props` wrapper) and `onX` v3 events. CSS props go at the top level and are auto-promoted to `element.props`.
3
+ Use flattened props (no `props` wrapper). CSS props go at the top level. Events use `onX` syntax.
4
4
 
5
5
  ---
6
6
 
7
7
  ## Built-in Atoms
8
8
 
9
- | Atom | HTML tag | Primary use |
10
- | ---------- | ------------ | ----------------------------- |
11
- | `Text` | `<span>` | Inline text content |
12
- | `Box` | `<div>` | Generic container |
13
- | `Flex` | `<div>` | Flexbox layout container |
14
- | `Grid` | `<div>` | CSS Grid layout container |
15
- | `Link` | `<a>` | Navigation / external link |
16
- | `Input` | `<input>` | Text input |
17
- | `Radio` | `<input>` | Radio button |
18
- | `Checkbox` | `<input>` | Checkbox |
19
- | `Svg` | `<svg>` | Raw SVG container |
20
- | `Icon` | `<svg>` | Icon from sprite |
21
- | `IconText` | `<div>` | Icon + text combo |
22
- | `Button` | `<button>` | Actionable control |
23
- | `Img` | `<img>` | Image element |
24
- | `Iframe` | `<iframe>` | Embedded content |
25
- | `Video` | `<video>` | Video player |
26
-
27
- ### Text
28
- ```js
29
- Text: { text: 'Hello', fontSize: 'B', color: 'title' }
30
- ```
31
- Props: `text`, `color`, `fontSize`, `fontWeight`, `lineHeight`, `letterSpacing`, `textTransform`, `textDecoration`, `textAlign`, `maxWidth`, `overflow`, `whiteSpace`
32
-
33
- ### Box
34
- ```js
35
- Box: { padding: 'A B', background: 'surface', borderRadius: 'B' }
36
- ```
37
- Props: `padding`, `margin`, `border`, `borderRadius`, `background`, `shadow`, `width`, `height`, `minWidth`, `maxWidth`, `minHeight`, `maxHeight`, `position`, `inset`, `top`, `right`, `bottom`, `left`, `overflow`, `zIndex`
38
-
39
- ### Flex
40
- ```js
41
- Flex: { flow: 'y', flexAlign: 'center space-between', gap: 'B' }
42
- ```
43
- Props: `flow` / `flexFlow`, `flexAlign` (**not** `align`), `alignItems`, `justifyContent`, `gap`, `flex`, `flexGrow`, `flexShrink`, `flexBasis`, `wrap`
44
-
45
- ### Grid
46
- ```js
47
- Grid: { columns: 'repeat(3, 1fr)', gap: 'A' }
48
- ```
49
- Props: `columns` / `gridTemplateColumns`, `rows` / `gridTemplateRows`, `gap`, `columnGap`, `rowGap`, `gridAutoFlow`, `gridAutoColumns`, `gridAutoRows`
50
-
51
- ### Link
52
- ```js
53
- Link: { text: 'Docs', href: '/docs' }
54
- ```
55
- Props: `href`, `target`, `rel`, `text`, `color`, `textDecoration`, `onClick`
56
-
57
- ### Input
58
- ```js
59
- Input: { type: 'text', name: 'title', placeholder: 'Enter title' }
60
- ```
61
- Props: `type`, `name`, `value`, `placeholder`, `required`, `disabled`, `onInput`, `onChange`, `onKeydown`, `padding`, `background`, `border`, `round`
62
-
63
- ### Radio / Checkbox
64
- ```js
65
- Checkbox: { name: 'agree', checked: true }
66
- Radio: { name: 'opt', value: 'a' }
67
- ```
68
- Props: `name`, `value`, `checked`, `disabled`, `onChange`
9
+ | Atom | HTML Tag | Props | Example |
10
+ |------|----------|-------|---------|
11
+ | `Text` | `<span>` | `text`, `color`, `fontSize`, `fontWeight`, `lineHeight`, `letterSpacing`, `textTransform`, `textDecoration`, `textAlign`, `maxWidth`, `overflow`, `whiteSpace` | `Text: { text: 'Hello', fontSize: 'B', color: 'title' }` |
12
+ | `Box` | `<div>` | `padding`, `margin`, `border`, `borderRadius`, `background`, `shadow`, `width`, `height`, `minWidth`, `maxWidth`, `minHeight`, `maxHeight`, `position`, `inset`, `top`, `right`, `bottom`, `left`, `overflow`, `zIndex` | `Box: { padding: 'A B', background: 'surface', borderRadius: 'B' }` |
13
+ | `Flex` | `<div>` | `flow`/`flexFlow`, `align`, `alignItems`, `justifyContent`, `gap`, `flex`, `flexGrow`, `flexShrink`, `flexBasis`, `wrap` | `Flex: { flow: 'y', align: 'center space-between', gap: 'B' }` |
14
+ | `Grid` | `<div>` | `columns`/`gridTemplateColumns`, `rows`/`gridTemplateRows`, `gap`, `columnGap`, `rowGap`, `gridAutoFlow`, `gridAutoColumns`, `gridAutoRows` | `Grid: { columns: 'repeat(3, 1fr)', gap: 'A' }` |
15
+ | `Link` | `<a>` | `href`, `target`, `rel`, `text`, `color`, `textDecoration`, `onClick` | `Link: { text: 'Docs', href: '/docs' }` |
16
+ | `Input` | `<input>` | `type`, `name`, `value`, `placeholder`, `required`, `disabled`, `onInput`, `onChange`, `onKeydown`, `padding`, `background`, `border`, `round` | `Input: { type: 'text', name: 'title', placeholder: 'Enter title' }` |
17
+ | `Radio` | `<input>` | `name`, `value`, `checked`, `disabled`, `onChange` | `Radio: { name: 'opt', value: 'a' }` |
18
+ | `Checkbox` | `<input>` | `name`, `value`, `checked`, `disabled`, `onChange` | `Checkbox: { name: 'agree', checked: true }` |
19
+ | `Svg` | `<svg>` | `html` (inline SVG markup), `width`, `height`, `viewBox`, `fill`, `stroke`. For non-icon SVGs only (decorative/structural). Use `Icon` for icons. | `Svg: { html: '<path d="..." />', viewBox: '0 0 24 24', width: '22', height: '22' }` |
20
+ | `Icon` | `<svg>` | `name` (sprite symbol id), `size`/`boxSize`, `color` | `Icon: { name: 'chevronRight', boxSize: 'A' }` |
21
+ | `IconText` | `<div>` | `icon`, `text`, `gap`, `align`, `color` | `IconText: { icon: 'search', text: 'Search', gap: 'Z' }` |
22
+ | `Button` | `<button>` | `text`, `icon`, `type`, `disabled`, `theme`, `padding`, `round`, `onClick`, `onSubmit` | `Button: { text: 'Save', theme: 'primary', type: 'submit' }` |
23
+ | `Img` | `<img>` | `src`, `alt`, `loading`, `width`, `height`, `boxSize`, `objectFit` | `Img: { src: '/logo.png', alt: 'Logo', boxSize: 'B' }` |
24
+ | `Iframe` | `<iframe>` | `src`, `width`, `height` | `Iframe: { src: 'https://example.com', width: '100%', height: '300px' }` |
25
+ | `Video` | `<video>` | `src`, `controls`, `width`, `height` | `Video: { src: '/demo.mp4', controls: true, width: '100%' }` |
69
26
 
70
- ### Svg
71
- ```js
72
- Svg: { html: '<path d="..." />', viewBox: '0 0 24 24', width: '22', height: '22' }
73
- ```
74
- Props: `html` (inline SVG markup), `width`, `height`, `viewBox`, `fill`, `stroke`
27
+ ### Img — file resolution
75
28
 
76
- **Rule**: Use `Svg` (not `Icon`) for SVGs inside `Button` or custom controls. Key MUST be `Svg`.
29
+ If `src` is not a valid URL, it resolves via `context.files[filename]`. Paths starting with `/files/` have the prefix stripped automatically (`/files/logo.png` looks up `"logo.png"` in context.files).
77
30
 
78
- ### Icon
79
- ```js
80
- Icon: { name: 'chevronRight', boxSize: 'A' }
81
- ```
82
- Props: `name` (sprite symbol id), `size` / `boxSize`, `color`
31
+ ### Svg rule
83
32
 
84
- ### IconText
85
- ```js
86
- IconText: { icon: 'search', text: 'Search', gap: 'Z' }
87
- ```
88
- Props: `icon`, `text`, `gap`, `flexAlign`, `color`
33
+ Use `Icon` (not `Svg`) for icons. `Icon: { name: 'iconName' }` references `designSystem.icons`. Use `Svg` only for decorative/structural SVGs that are not icons.
89
34
 
90
- ### Button
91
- ```js
92
- Button: { text: 'Save', theme: 'primary', type: 'submit' }
93
- ```
94
- Props: `text`, `icon`, `type`, `disabled`, `theme`, `padding`, `round`, `onClick`, `onSubmit`
35
+ ### Picture
95
36
 
96
- ### Img
97
- ```js
98
- Img: { src: '/logo.png', alt: 'Logo', boxSize: 'B' }
99
- ```
100
- Props: `src`, `alt`, `loading`, `width`, `height`, `boxSize`, `objectFit`
37
+ **CRITICAL**: `<picture>` does NOT support `src`. Never put `src` on Picture — it is silently ignored. Always put `src` on the `Img` child.
101
38
 
102
- The `src` attribute resolves through the files system: if the value is not a valid URL, it looks up `context.files[filename]` for embedded file data. Paths starting with `/files/` have the prefix stripped automatically (e.g., `/files/logo.png` looks up `"logo.png"` in context.files).
39
+ The Picture `Img` child can also read `src` from `element.parent.props.src` or `state.src`.
103
40
 
104
- ### Picture
105
41
  ```js
106
- // Basic usage — src goes on the Img child, NOT on Picture
42
+ // Basic
107
43
  Picture: {
108
44
  Img: { src: '/files/photo.jpg' },
109
45
  width: '100%',
110
46
  aspectRatio: '16/9'
111
47
  }
112
48
 
113
- // With theme-aware sources
49
+ // Theme-aware sources
114
50
  Picture: {
115
51
  extends: 'Picture',
116
52
  Img: { src: '/files/map-dark.svg' },
@@ -119,50 +55,39 @@ Picture: {
119
55
  }
120
56
  ```
121
57
 
122
- **Critical**: The HTML `<picture>` tag does NOT support `src` as an attribute. Never put `src` directly on a Picture component — it will be silently ignored. Always put `src` on the `Img` child inside the Picture.
123
-
124
- The Picture component's Img child can also read `src` from its parent's props (`element.parent.props.src`) or from state (`state.src`).
125
-
126
- ### Iframe
127
- ```js
128
- Iframe: { src: 'https://example.com', width: '100%', height: '300px' }
129
- ```
130
-
131
- ### Video
132
- ```js
133
- Video: { src: '/demo.mp4', controls: true, width: '100%' }
134
- ```
135
-
136
58
  ---
137
59
 
138
- ## Cross-cutting props (all atoms)
60
+ ## Cross-cutting Props (all atoms)
139
61
 
140
- All atoms support:
141
- - `@media` keys: `@mobile`, `@tablet`, `@tabletSm`, `@dark`, `@light`, etc.
142
- - Pseudo selectors: `:hover`, `:active`, `:focus-visible`, etc.
143
- - Conditional cases: `.isActive`, `.disabled`, `.hidden`, `!isActive`, etc.
144
- - `childProps` — one-level child overrides
145
- - `children` — arrays or nested object trees
146
- - `onInit`, `onRender`, `onUpdate`, `onStateUpdate`
62
+ All atoms support these additional features:
147
63
 
148
- ---
64
+ | Feature | Syntax |
65
+ |---------|--------|
66
+ | Media queries | `@mobile`, `@tablet`, `@tabletSm`, `@dark`, `@light` |
67
+ | Pseudo selectors | `:hover`, `:active`, `:focus-visible` |
68
+ | Conditional cases | `.isActive`, `.disabled`, `.hidden`, `!isActive` |
69
+ | Child overrides | `childProps` — one-level child overrides |
70
+ | Children | `children` — arrays or nested object trees |
71
+ | Lifecycle events | `onInit`, `onRender`, `onUpdate`, `onStateUpdate` |
149
72
 
150
- ## Typography Components
73
+ ---
151
74
 
152
- | Component | Tag | Use |
153
- | ---------- | --------- | ---------------------------- |
154
- | `H1`–`H6` | `<h1–h6>` | Semantic section headings |
155
- | `P` | `<p>` | Body paragraph text |
156
- | `Caption` | `<span>` | Small labels, hints |
157
- | `Headline` | `<span>` | Display-size heading |
158
- | `Subhead` | `<span>` | Sub-section text |
159
- | `Footnote` | `<span>` | Footer reference text |
160
- | `Strong` | `<strong>`| Bold inline emphasis |
161
- | `Italic` | `<em>` | Italic inline emphasis |
162
- | `U` | `<u>` | Underline inline emphasis |
75
+ ## Typography
163
76
 
164
77
  All accept a `text` prop.
165
78
 
79
+ | Component | Tag | Use |
80
+ |-----------|-----|-----|
81
+ | `H1`–`H6` | `<h1>`–`<h6>` | Semantic section headings |
82
+ | `P` | `<p>` | Body paragraph text |
83
+ | `Caption` | `<span>` | Small labels, hints |
84
+ | `Headline` | `<span>` | Display-size heading |
85
+ | `Subhead` | `<span>` | Sub-section text |
86
+ | `Footnote` | `<span>` | Footer reference text |
87
+ | `Strong` | `<strong>` | Bold inline emphasis |
88
+ | `Italic` | `<em>` | Italic inline emphasis |
89
+ | `U` | `<u>` | Underline inline emphasis |
90
+
166
91
  ```js
167
92
  H2: { text: 'Section title' }
168
93
  P: { text: 'Body copy goes here.' }
@@ -173,249 +98,169 @@ Caption: { text: 'Updated 3 days ago', color: 'caption' }
173
98
 
174
99
  ## Dividers
175
100
 
176
- | Component | Use |
177
- | ----------- | ------------------------------------- |
178
- | `Hr` | Visual horizontal rule |
179
- | `HrLegend` | Divider with centered label text |
180
-
181
- ```js
182
- Hr: { minWidth: 'F' }
183
- HrLegend: { text: 'Or' }
184
- ```
101
+ | Component | Use | Example |
102
+ |-----------|-----|---------|
103
+ | `Hr` | Horizontal rule | `Hr: { minWidth: 'F' }` |
104
+ | `HrLegend` | Divider with centered label | `HrLegend: { text: 'Or' }` |
185
105
 
186
106
  ---
187
107
 
188
108
  ## Buttons
189
109
 
190
- | Component | Use |
191
- | --------------------- | ------------------------------------------ |
192
- | `IconButton` | Icon-only circular button |
193
- | `IconButtonSet` | Group of icon buttons |
194
- | `CounterButton` | Button with notification badge |
195
- | `CounterIconButton` | Icon button with positioned badge |
196
- | `IconCounterButton` | Button with icon, label, and counter |
197
- | `UploadButton` | Text button that opens file picker |
198
- | `UploadIconButton` | Icon button that opens file picker |
199
- | `SubmitButton` | Form submit button |
200
- | `ButtonSet` | Group of buttons |
201
- | `ConfirmationButtons` | Yes/No pair |
202
- | `InputButton` | Email/text input with submit button inline |
203
-
204
- ```js
205
- IconButton: { Icon: { name: 'plus' }, theme: 'dialog' }
206
- ButtonSet: { children: [{ text: 'Cancel' }, { text: 'Save', theme: 'primary' }] }
207
- ConfirmationButtons: { children: [{ text: 'Cancel' }, { text: 'Delete', theme: 'warning' }] }
208
- InputButton: { Input: { placeholder: 'Enter email' }, Button: { text: 'Sign up' } }
209
- SubmitButton: { value: 'Create account' }
210
- ```
110
+ | Component | Use | Example |
111
+ |-----------|-----|---------|
112
+ | `IconButton` | Icon-only circular button | `IconButton: { Icon: { name: 'plus' }, theme: 'dialog' }` |
113
+ | `IconButtonSet` | Group of icon buttons | — |
114
+ | `CounterButton` | Button with notification badge | — |
115
+ | `CounterIconButton` | Icon button with positioned badge | — |
116
+ | `IconCounterButton` | Button with icon, label, and counter | — |
117
+ | `UploadButton` | Text button that opens file picker | — |
118
+ | `UploadIconButton` | Icon button that opens file picker | — |
119
+ | `SubmitButton` | Form submit button | `SubmitButton: { value: 'Create account' }` |
120
+ | `ButtonSet` | Group of buttons | `ButtonSet: { children: [{ text: 'Cancel' }, { text: 'Save', theme: 'primary' }] }` |
121
+ | `ConfirmationButtons` | Yes/No pair | `ConfirmationButtons: { children: [{ text: 'Cancel' }, { text: 'Delete', theme: 'warning' }] }` |
122
+ | `InputButton` | Input with inline submit button | `InputButton: { Input: { placeholder: 'Enter email' }, Button: { text: 'Sign up' } }` |
211
123
 
212
124
  ---
213
125
 
214
126
  ## Avatar
215
127
 
216
- | Component | Use |
217
- | -------------------------- | ----------------------------------------- |
218
- | `Avatar` | Single avatar image |
219
- | `AvatarSet` | Overlapping group of avatars |
220
- | `AvatarStatus` | Avatar with online/offline dot |
221
- | `AvatarHgroup` | Avatar + heading group (name + subtitle) |
222
- | `AvatarBadgeHgroup` | Avatar + heading + badge |
223
- | `AvatarChatPreview` | Avatar + message preview row |
224
-
225
- ```js
226
- Avatar: { boxSize: 'C2' }
227
- AvatarStatus: { Avatar: { boxSize: 'C' }, StatusDot: { theme: 'success' } }
228
- AvatarHgroup: { H: { text: 'Nika Tomadze' }, P: { text: 'Product Designer' } }
229
- AvatarChatPreview: {
230
- H: { text: 'Design Team' },
231
- P: { text: 'Can you join us today?' },
232
- Value: { text: '2:20' }
233
- }
234
- ```
128
+ | Component | Use | Example |
129
+ |-----------|-----|---------|
130
+ | `Avatar` | Single avatar image | `Avatar: { boxSize: 'C2' }` |
131
+ | `AvatarSet` | Overlapping group of avatars | — |
132
+ | `AvatarStatus` | Avatar with online/offline dot | `AvatarStatus: { Avatar: { boxSize: 'C' }, StatusDot: { theme: 'success' } }` |
133
+ | `AvatarHgroup` | Avatar + name + subtitle | `AvatarHgroup: { H: { text: 'Nika Tomadze' }, P: { text: 'Product Designer' } }` |
134
+ | `AvatarBadgeHgroup` | Avatar + heading + badge | — |
135
+ | `AvatarChatPreview` | Avatar + message preview row | `AvatarChatPreview: { H: { text: 'Design Team' }, P: { text: 'Can you join us today?' }, Value: { text: '2:20' } }` |
235
136
 
236
137
  ---
237
138
 
238
139
  ## Badge & Notification
239
140
 
240
- | Component | Use |
241
- | ---------------------- | -------------------------------------- |
242
- | `Badge` | Colored label (status, category) |
243
- | `BadgeCaption` | Caption label paired with a badge |
244
- | `NotificationCounter` | Circular number badge |
245
-
246
- ```js
247
- Badge: { text: 'New', theme: 'primary' }
248
- BadgeCaption: { Caption: { text: 'Status' }, Badge: { text: 'Active', theme: 'success' } }
249
- NotificationCounter: { text: '5' }
250
- ```
251
-
252
141
  Themes: `primary`, `warning`, `success`, `transparent`, `bordered`, `dialog`, `field`
253
142
 
143
+ | Component | Use | Example |
144
+ |-----------|-----|---------|
145
+ | `Badge` | Colored label (status, category) | `Badge: { text: 'New', theme: 'primary' }` |
146
+ | `BadgeCaption` | Caption paired with badge | `BadgeCaption: { Caption: { text: 'Status' }, Badge: { text: 'Active', theme: 'success' } }` |
147
+ | `NotificationCounter` | Circular number badge | `NotificationCounter: { text: '5' }` |
148
+
254
149
  ---
255
150
 
256
151
  ## Form & Input
257
152
 
258
- | Component | Use |
259
- | ------------------ | -------------------------------------------- |
260
- | `Field` | Styled input, optionally with trailing icon |
261
- | `FieldCaption` | Field with label above |
262
- | `IconInput` | Input with overlaid icon |
263
- | `Select` | Native select |
264
- | `SelectPicker` | Styled select with chevron |
265
- | `NumberPicker` | Increment/decrement control |
266
- | `Search` | Search input with icon |
267
- | `SearchDropdown` | Filterable dropdown with search inside |
268
- | `TextareaIconButton` | Textarea with send button |
269
-
270
- ```js
271
- Field: { Input: { placeholder: 'Enter name' }, Icon: { icon: 'user' } }
272
- FieldCaption: { Caption: { text: 'Email' }, Field: { Input: { placeholder: 'you@example.com' } } }
273
- SelectPicker: { Select: { children: [{ text: 'A', value: 'a' }, { text: 'B', value: 'b' }] } }
274
- Search: { Input: { placeholder: 'Search…' } }
275
- SearchDropdown: { state: { data: ['New York', 'Los Angeles'] } }
276
- TextareaIconButton: { Textarea: { placeholder: 'Write a message…' } }
277
- ```
153
+ | Component | Use | Example |
154
+ |-----------|-----|---------|
155
+ | `Field` | Styled input, optionally with trailing icon | `Field: { Input: { placeholder: 'Enter name' }, Icon: { icon: 'user' } }` |
156
+ | `FieldCaption` | Field with label above | `FieldCaption: { Caption: { text: 'Email' }, Field: { Input: { placeholder: 'you@example.com' } } }` |
157
+ | `IconInput` | Input with overlaid icon | — |
158
+ | `Select` | Native select | — |
159
+ | `SelectPicker` | Styled select with chevron | `SelectPicker: { Select: { children: [{ text: 'A', value: 'a' }, { text: 'B', value: 'b' }] } }` |
160
+ | `NumberPicker` | Increment/decrement control | — |
161
+ | `Search` | Search input with icon | `Search: { Input: { placeholder: 'Search…' } }` |
162
+ | `SearchDropdown` | Filterable dropdown with search | `SearchDropdown: { state: { data: ['New York', 'Los Angeles'] } }` |
163
+ | `TextareaIconButton` | Textarea with send button | `TextareaIconButton: { Textarea: { placeholder: 'Write a message…' } }` |
278
164
 
279
165
  ---
280
166
 
281
167
  ## Composition
282
168
 
283
- Pair a primary element (heading, icon, image) with text content or controls:
169
+ Pair a primary element (heading, icon, image) with text content or controls.
284
170
 
285
- | Component | Use |
286
- | ------------------ | ------------------------------------------ |
287
- | `ButtonHgroup` | Heading group + button |
288
- | `IconHeading` | Icon + heading |
289
- | `IconHgroup` | Large icon + heading group |
290
- | `ImgHgroup` | Image + heading group |
291
- | `SectionHeader` | Section header with icon buttons |
292
- | `ValueHeading` | Heading with trailing value/unit |
293
- | `IconTextSet` | List of icon + text pairs |
294
-
295
- ```js
296
- ButtonHgroup: { H: { text: 'Upgrade plan' }, P: { text: 'Get all features' }, Button: { text: 'Upgrade' } }
297
- ImgHgroup: { Img: { src: '/icon.png', boxSize: 'C' }, H: { text: 'Product' }, P: { text: 'Tagline' } }
298
- ValueHeading: { H: { tag: 'h6', text: 'Revenue' }, UnitValue: { Unit: { text: '$' }, Value: { text: '1,200' } } }
299
- SectionHeader: { Hgroup: { H: { text: 'Activity' } }, IconButtonSet: { children: [{ Icon: { name: 'filter' } }] } }
300
- ```
171
+ | Component | Use | Example |
172
+ |-----------|-----|---------|
173
+ | `ButtonHgroup` | Heading group + button | `ButtonHgroup: { H: { text: 'Upgrade plan' }, P: { text: 'Get all features' }, Button: { text: 'Upgrade' } }` |
174
+ | `IconHeading` | Icon + heading | — |
175
+ | `IconHgroup` | Large icon + heading group | — |
176
+ | `ImgHgroup` | Image + heading group | `ImgHgroup: { Img: { src: '/icon.png', boxSize: 'C' }, H: { text: 'Product' }, P: { text: 'Tagline' } }` |
177
+ | `SectionHeader` | Section header with icon buttons | `SectionHeader: { Hgroup: { H: { text: 'Activity' } }, IconButtonSet: { children: [{ Icon: { name: 'filter' } }] } }` |
178
+ | `ValueHeading` | Heading with trailing value/unit | `ValueHeading: { H: { tag: 'h6', text: 'Revenue' }, UnitValue: { Unit: { text: '$' }, Value: { text: '1,200' } } }` |
179
+ | `IconTextSet` | List of icon + text pairs | — |
301
180
 
302
181
  ---
303
182
 
304
183
  ## Selection
305
184
 
306
- Three flavors **Check**, **Radio**, **Toggle** — each in caption, hgroup, and list variants:
185
+ Three flavors: **Check**, **Radio**, **Toggle** — each in caption, hgroup, and list variants.
307
186
 
308
- | Component | Use |
309
- | ---------------------- | ---------------------------------- |
310
- | `CheckCaption` | Checkbox + short label |
311
- | `CheckHgroup` | Checkbox + title + description |
312
- | `CheckCaptionList` | Stacked list of CheckCaption |
313
- | `RadioCaption` | Radio + short label |
314
- | `RadioHgroup` | Radio + title + description |
315
- | `ToggleCaption` | Toggle switch + short label |
316
- | `ToggleHgroup` | Toggle switch + title + desc |
317
- | `CheckStep` / `RadioStep` | Step with completion state |
187
+ | Component | Use | Example |
188
+ |-----------|-----|---------|
189
+ | `CheckCaption` | Checkbox + short label | `CheckCaption: { Caption: { text: 'Accept terms' } }` |
190
+ | `CheckHgroup` | Checkbox + title + description | — |
191
+ | `CheckCaptionList` | Stacked list of CheckCaption | — |
192
+ | `RadioCaption` | Radio + short label | — |
193
+ | `RadioHgroup` | Radio + title + description | — |
194
+ | `ToggleCaption` | Toggle switch + short label | — |
195
+ | `ToggleHgroup` | Toggle switch + title + desc | `ToggleHgroup: { H: { text: 'Email alerts' }, P: { text: 'Sent daily' } }` |
196
+ | `CheckStep` | Step with completion state | `CheckStep: { H6: { text: 'Verify email' }, Progress: { value: 1 } }` |
197
+ | `RadioStep` | Step with completion state | — |
318
198
 
319
199
  ```js
320
- CheckCaption: { Caption: { text: 'Accept terms' } }
321
- ToggleHgroup: { H: { text: 'Email alerts' }, P: { text: 'Sent daily' } }
200
+ // ToggleHgroupList example
322
201
  ToggleHgroupList: {
323
202
  children: [
324
203
  { H: { text: 'Email alerts' }, P: { text: 'Sent daily' } },
325
204
  { H: { text: 'Push notifications' }, P: { text: 'Instant' } }
326
205
  ]
327
206
  }
328
- CheckStep: { H6: { text: 'Verify email' }, Progress: { value: 1 } }
329
207
  ```
330
208
 
331
209
  ---
332
210
 
333
211
  ## Progress & Status
334
212
 
335
- | Component | Use |
336
- | -------------------- | ------------------------------------ |
337
- | `Progress` | Linear progress bar (value 0–1) |
338
- | `CircleProgress` | Circular progress ring |
339
- | `ValueProgress` | Progress bar + readable label |
340
- | `ProgressStepSet` | Row of progress bars for steps |
341
- | `StatusDot` | Small colored indicator dot |
342
- | `Stars` | 5-star rating display |
343
-
344
- ```js
345
- Progress: { value: 0.6, height: 'X', round: 'Y' }
346
- CircleProgress: { value: 0.73, boxSize: 'D' }
347
- ValueProgress: { Progress: { value: 0.73 }, UnitValue: { Value: { text: '73' }, Unit: { text: '%' } } }
348
- StatusDot: { theme: 'success' }
349
- ```
213
+ | Component | Use | Example |
214
+ |-----------|-----|---------|
215
+ | `Progress` | Linear progress bar (value 0–1) | `Progress: { value: 0.6, height: 'X', round: 'Y' }` |
216
+ | `CircleProgress` | Circular progress ring | `CircleProgress: { value: 0.73, boxSize: 'D' }` |
217
+ | `ValueProgress` | Progress bar + readable label | `ValueProgress: { Progress: { value: 0.73 }, UnitValue: { Value: { text: '73' }, Unit: { text: '%' } } }` |
218
+ | `ProgressStepSet` | Row of progress bars for steps | — |
219
+ | `StatusDot` | Small colored indicator dot | `StatusDot: { theme: 'success' }` |
220
+ | `Stars` | 5-star rating display | — |
350
221
 
351
222
  ---
352
223
 
353
224
  ## Navigation & Links
354
225
 
355
- | Component | Use |
356
- | ------------------ | -------------------------------------- |
357
- | `Link` | Hyperlink |
358
- | `LinkSet` | Navigation list of links |
359
- | `Breadcrumb` | Breadcrumb path navigation |
360
- | `TabSet` | Horizontal tab bar |
361
- | `Pagination` | Numbered page controls |
362
- | `NavigationDots` | Dot indicators for carousels |
363
- | `NavigationArrows` | Previous/next arrow buttons |
364
- | `ScrollableList` | Vertically scrollable menu list |
365
-
366
- ```js
367
- LinkSet: { tag: 'nav', children: [{ text: 'Home', href: '/' }, { text: 'Docs', href: '/docs' }] }
368
- TabSet: { children: [{ text: 'Overview', isActive: true }, { text: 'Details' }] }
369
- Pagination: { Flex: { children: [{ text: '1', isActive: true }, { text: '2' }, { text: '3' }] } }
370
- Breadcrumb: { tag: 'nav' }
371
- ```
226
+ | Component | Use | Example |
227
+ |-----------|-----|---------|
228
+ | `Link` | Hyperlink | `Link: { text: 'Docs', href: '/docs' }` |
229
+ | `LinkSet` | Navigation list of links | `LinkSet: { tag: 'nav', children: [{ text: 'Home', href: '/' }, { text: 'Docs', href: '/docs' }] }` |
230
+ | `Breadcrumb` | Breadcrumb path navigation | `Breadcrumb: { tag: 'nav' }` |
231
+ | `TabSet` | Horizontal tab bar | `TabSet: { children: [{ text: 'Overview', isActive: true }, { text: 'Details' }] }` |
232
+ | `Pagination` | Numbered page controls | `Pagination: { Flex: { children: [{ text: '1', isActive: true }, { text: '2' }, { text: '3' }] } }` |
233
+ | `NavigationDots` | Dot indicators for carousels | — |
234
+ | `NavigationArrows` | Previous/next arrow buttons | — |
235
+ | `ScrollableList` | Vertically scrollable menu list | — |
372
236
 
373
237
  ---
374
238
 
375
239
  ## Overlay & Disclosure
376
240
 
377
- | Component | Use |
378
- | -------------- | --------------------------------- |
379
- | `Modal` | Dialog overlay container |
380
- | `MessageModal` | Informational modal |
381
- | `Accordion` | Expandable/collapsible section |
382
-
383
- ```js
384
- Modal: { Hgroup: { H: { text: 'Confirm action' } }, IconButton: { Icon: { name: 'x' } } }
385
- Accordion: {
386
- ButtonParagraph: { P: { text: 'How does billing work?' } },
387
- P: { text: 'You are billed monthly…' }
388
- }
389
- ```
241
+ | Component | Use | Example |
242
+ |-----------|-----|---------|
243
+ | `Modal` | Dialog overlay container | `Modal: { Hgroup: { H: { text: 'Confirm action' } }, IconButton: { Icon: { name: 'x' } } }` |
244
+ | `MessageModal` | Informational modal | — |
245
+ | `Accordion` | Expandable/collapsible section | `Accordion: { ButtonParagraph: { P: { text: 'How does billing work?' } }, P: { text: 'You are billed monthly…' } }` |
390
246
 
391
247
  ---
392
248
 
393
249
  ## Data Display
394
250
 
395
- | Component | Use |
396
- | ------------------ | ------------------------------------- |
397
- | `UnitValue` | Unit + value pair (price, stat, etc.) |
398
- | `BulletCaption` | Caption with colored bullet dot |
399
- | `StoryCard` | Full-bleed image card with overlay |
400
- | `ListingItem` | Post/listing row item |
401
- | `UserNavbar` | User profile row in navbar |
402
- | `LoadingGif` | Animated loading spinner |
403
-
404
- ```js
405
- UnitValue: { Unit: { text: '$' }, Value: { text: '99' } }
406
- BulletCaption: { text: 'Orders', ':before': { background: 'blue' } }
407
- UserNavbar: { H: { text: 'Nika Tomadze' }, P: { text: 'Product Designer' } }
408
- LoadingGif: { opacity: '.5', boxSize: 'B' }
409
- ```
251
+ | Component | Use | Example |
252
+ |-----------|-----|---------|
253
+ | `UnitValue` | Unit + value pair (price, stat) | `UnitValue: { Unit: { text: '$' }, Value: { text: '99' } }` |
254
+ | `BulletCaption` | Caption with colored bullet dot | `BulletCaption: { text: 'Orders', ':before': { background: 'blue' } }` |
255
+ | `StoryCard` | Full-bleed image card with overlay | — |
256
+ | `ListingItem` | Post/listing row item | — |
257
+ | `UserNavbar` | User profile row in navbar | `UserNavbar: { H: { text: 'Nika Tomadze' }, P: { text: 'Product Designer' } }` |
258
+ | `LoadingGif` | Animated loading spinner | `LoadingGif: { opacity: '.5', boxSize: 'B' }` |
410
259
 
411
260
  ---
412
261
 
413
262
  ## Misc
414
263
 
415
- | Component | Use |
416
- | ----------- | --------------------------------------- |
417
- | `Scrollbar` | Custom scrollbar with arrow navigation |
418
-
419
- ```js
420
- Scrollbar: { NavigationArrows: {} }
421
- ```
264
+ | Component | Use | Example |
265
+ |-----------|-----|---------|
266
+ | `Scrollbar` | Custom scrollbar with arrow navigation | `Scrollbar: { NavigationArrows: {} }` |