@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.
- package/README.md +1 -0
- package/package.json +1 -1
- package/symbols_mcp/skills/AUDIT.md +148 -174
- package/symbols_mcp/skills/BRAND_IDENTITY.md +75 -0
- package/symbols_mcp/skills/COMPONENTS.md +151 -306
- package/symbols_mcp/skills/COOKBOOK.md +850 -0
- package/symbols_mcp/skills/DEFAULT_COMPONENTS.md +3856 -0
- package/symbols_mcp/skills/DEFAULT_LIBRARY.md +301 -0
- package/symbols_mcp/skills/DESIGN_CRITIQUE.md +70 -59
- package/symbols_mcp/skills/DESIGN_DIRECTION.md +109 -175
- package/symbols_mcp/skills/DESIGN_SYSTEM.md +473 -181
- package/symbols_mcp/skills/DESIGN_SYSTEM_ARCHITECT.md +65 -57
- package/symbols_mcp/skills/DESIGN_TO_CODE.md +83 -64
- package/symbols_mcp/skills/DESIGN_TREND.md +62 -50
- package/symbols_mcp/skills/FIGMA_MATCHING.md +69 -58
- package/symbols_mcp/skills/LEARNINGS.md +374 -0
- package/symbols_mcp/skills/MARKETING_ASSETS.md +71 -59
- package/symbols_mcp/skills/MIGRATION.md +158 -117
- package/symbols_mcp/skills/PATTERNS.md +101 -74
- package/symbols_mcp/skills/PRESENTATION.md +78 -0
- package/symbols_mcp/skills/PROJECT_STRUCTURE.md +114 -116
- package/symbols_mcp/skills/RULES.md +179 -148
- package/symbols_mcp/skills/RUNNING_APPS.md +476 -0
- package/symbols_mcp/skills/SEO-METADATA.md +33 -18
- package/symbols_mcp/skills/SNIPPETS.md +598 -0
- package/symbols_mcp/skills/SSR-BRENDER.md +99 -0
- package/symbols_mcp/skills/SYNTAX.md +356 -298
- package/symbols_mcp/skills/BRAND_INDENTITY.md +0 -69
- package/symbols_mcp/skills/THE_PRESENTATION.md +0 -69
|
@@ -1,116 +1,52 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Component API Reference
|
|
2
2
|
|
|
3
|
-
|
|
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
|
|
10
|
-
|
|
11
|
-
| `Text`
|
|
12
|
-
| `Box`
|
|
13
|
-
| `Flex`
|
|
14
|
-
| `Grid`
|
|
15
|
-
| `Link`
|
|
16
|
-
| `Input`
|
|
17
|
-
| `Radio`
|
|
18
|
-
| `Checkbox` | `<input>`
|
|
19
|
-
| `Svg`
|
|
20
|
-
| `Icon`
|
|
21
|
-
| `IconText` | `<div>`
|
|
22
|
-
| `Button`
|
|
23
|
-
| `Img`
|
|
24
|
-
| `Iframe`
|
|
25
|
-
| `Video`
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
###
|
|
79
|
-
```js
|
|
80
|
-
Icon: { name: 'chevronRight', boxSize: 'A' }
|
|
81
|
-
```
|
|
82
|
-
Props: `name` (sprite symbol id), `size` / `boxSize`, `color`
|
|
31
|
+
### Svg rule
|
|
83
32
|
|
|
84
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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 `
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
-
|
|
73
|
+
---
|
|
151
74
|
|
|
152
|
-
|
|
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
|
|
177
|
-
|
|
178
|
-
| `Hr`
|
|
179
|
-
| `HrLegend`
|
|
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
|
|
191
|
-
|
|
192
|
-
| `IconButton`
|
|
193
|
-
| `IconButtonSet`
|
|
194
|
-
| `CounterButton`
|
|
195
|
-
| `CounterIconButton`
|
|
196
|
-
| `IconCounterButton`
|
|
197
|
-
| `UploadButton`
|
|
198
|
-
| `UploadIconButton`
|
|
199
|
-
| `SubmitButton`
|
|
200
|
-
| `ButtonSet`
|
|
201
|
-
| `ConfirmationButtons` | Yes/No pair
|
|
202
|
-
| `InputButton`
|
|
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
|
|
217
|
-
|
|
218
|
-
| `Avatar`
|
|
219
|
-
| `AvatarSet`
|
|
220
|
-
| `AvatarStatus`
|
|
221
|
-
| `AvatarHgroup`
|
|
222
|
-
| `AvatarBadgeHgroup`
|
|
223
|
-
| `AvatarChatPreview`
|
|
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
|
|
259
|
-
|
|
260
|
-
| `Field`
|
|
261
|
-
| `FieldCaption`
|
|
262
|
-
| `IconInput`
|
|
263
|
-
| `Select`
|
|
264
|
-
| `SelectPicker`
|
|
265
|
-
| `NumberPicker`
|
|
266
|
-
| `Search`
|
|
267
|
-
| `SearchDropdown`
|
|
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
|
|
286
|
-
|
|
287
|
-
| `ButtonHgroup`
|
|
288
|
-
| `IconHeading`
|
|
289
|
-
| `IconHgroup`
|
|
290
|
-
| `ImgHgroup`
|
|
291
|
-
| `SectionHeader`
|
|
292
|
-
| `ValueHeading`
|
|
293
|
-
| `IconTextSet`
|
|
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
|
|
185
|
+
Three flavors: **Check**, **Radio**, **Toggle** — each in caption, hgroup, and list variants.
|
|
307
186
|
|
|
308
|
-
| Component
|
|
309
|
-
|
|
310
|
-
| `CheckCaption`
|
|
311
|
-
| `CheckHgroup`
|
|
312
|
-
| `CheckCaptionList`
|
|
313
|
-
| `RadioCaption`
|
|
314
|
-
| `RadioHgroup`
|
|
315
|
-
| `ToggleCaption`
|
|
316
|
-
| `ToggleHgroup`
|
|
317
|
-
| `CheckStep`
|
|
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
|
-
|
|
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
|
|
336
|
-
|
|
337
|
-
| `Progress`
|
|
338
|
-
| `CircleProgress`
|
|
339
|
-
| `ValueProgress`
|
|
340
|
-
| `ProgressStepSet`
|
|
341
|
-
| `StatusDot`
|
|
342
|
-
| `Stars`
|
|
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
|
|
356
|
-
|
|
357
|
-
| `Link`
|
|
358
|
-
| `LinkSet`
|
|
359
|
-
| `Breadcrumb`
|
|
360
|
-
| `TabSet`
|
|
361
|
-
| `Pagination`
|
|
362
|
-
| `NavigationDots`
|
|
363
|
-
| `NavigationArrows` | Previous/next arrow buttons
|
|
364
|
-
| `ScrollableList`
|
|
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
|
|
378
|
-
|
|
379
|
-
| `Modal`
|
|
380
|
-
| `MessageModal` | Informational modal
|
|
381
|
-
| `Accordion`
|
|
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
|
|
396
|
-
|
|
397
|
-
| `UnitValue`
|
|
398
|
-
| `BulletCaption`
|
|
399
|
-
| `StoryCard`
|
|
400
|
-
| `ListingItem`
|
|
401
|
-
| `UserNavbar`
|
|
402
|
-
| `LoadingGif`
|
|
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
|
|
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: {} }` |
|