@symbo.ls/mcp 1.0.10 → 1.0.11
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/package.json +5 -2
- package/symbols_mcp/skills/COMPONENTS.md +421 -0
- package/symbols_mcp/skills/DESIGN_SYSTEM.md +430 -0
- package/symbols_mcp/skills/MIGRATION.md +520 -0
- package/symbols_mcp/skills/PATTERNS.md +509 -0
- package/symbols_mcp/skills/PROJECT_STRUCTURE.md +400 -0
- package/symbols_mcp/skills/RULES.md +488 -0
- package/symbols_mcp/skills/SEO-METADATA.md +41 -1
- package/symbols_mcp/skills/SYNTAX.md +777 -0
- package/symbols_mcp/skills/ACCESSIBILITY.md +0 -471
- package/symbols_mcp/skills/ACCESSIBILITY_AUDITORY.md +0 -70
- package/symbols_mcp/skills/AGENT_INSTRUCTIONS.md +0 -265
- package/symbols_mcp/skills/BUILT_IN_COMPONENTS.md +0 -304
- package/symbols_mcp/skills/CLAUDE.md +0 -2158
- package/symbols_mcp/skills/CLI_QUICK_START.md +0 -205
- package/symbols_mcp/skills/DEFAULT_COMPONENTS.md +0 -2002
- package/symbols_mcp/skills/DEFAULT_DESIGN_SYSTEM.md +0 -496
- package/symbols_mcp/skills/DESIGN_SYSTEM_CONFIG.md +0 -487
- package/symbols_mcp/skills/DESIGN_SYSTEM_IN_PROPS.md +0 -136
- package/symbols_mcp/skills/DOMQL_v2-v3_MIGRATION.md +0 -236
- package/symbols_mcp/skills/MIGRATE_TO_SYMBOLS.md +0 -634
- package/symbols_mcp/skills/OPTIMIZATIONS_FOR_AGENT.md +0 -253
- package/symbols_mcp/skills/PROJECT_SETUP.md +0 -217
- package/symbols_mcp/skills/QUICKSTART.md +0 -79
- package/symbols_mcp/skills/REMOTE_PREVIEW.md +0 -144
- package/symbols_mcp/skills/SYMBOLS_LOCAL_INSTRUCTIONS.md +0 -1405
- package/symbols_mcp/skills/UI_UX_PATTERNS.md +0 -68
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@symbo.ls/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.11",
|
|
4
4
|
"description": "MCP server for Symbols.app — documentation search and framework reference",
|
|
5
5
|
"mcpName": "io.github.symbo-ls/symbols-mcp",
|
|
6
6
|
"files": [
|
|
@@ -21,5 +21,8 @@
|
|
|
21
21
|
"ai",
|
|
22
22
|
"claude"
|
|
23
23
|
],
|
|
24
|
-
"license": "MIT"
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
}
|
|
25
28
|
}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
# Symbols / DOMQL v3 — Component Reference
|
|
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`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Built-in Atoms
|
|
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`
|
|
69
|
+
|
|
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`
|
|
75
|
+
|
|
76
|
+
**Rule**: Use `Svg` (not `Icon`) for SVGs inside `Button` or custom controls. Key MUST be `Svg`.
|
|
77
|
+
|
|
78
|
+
### Icon
|
|
79
|
+
```js
|
|
80
|
+
Icon: { name: 'chevronRight', boxSize: 'A' }
|
|
81
|
+
```
|
|
82
|
+
Props: `name` (sprite symbol id), `size` / `boxSize`, `color`
|
|
83
|
+
|
|
84
|
+
### IconText
|
|
85
|
+
```js
|
|
86
|
+
IconText: { icon: 'search', text: 'Search', gap: 'Z' }
|
|
87
|
+
```
|
|
88
|
+
Props: `icon`, `text`, `gap`, `flexAlign`, `color`
|
|
89
|
+
|
|
90
|
+
### Button
|
|
91
|
+
```js
|
|
92
|
+
Button: { text: 'Save', theme: 'primary', type: 'submit' }
|
|
93
|
+
```
|
|
94
|
+
Props: `text`, `icon`, `type`, `disabled`, `theme`, `padding`, `round`, `onClick`, `onSubmit`
|
|
95
|
+
|
|
96
|
+
### Img
|
|
97
|
+
```js
|
|
98
|
+
Img: { src: '/logo.png', alt: 'Logo', boxSize: 'B' }
|
|
99
|
+
```
|
|
100
|
+
Props: `src`, `alt`, `loading`, `width`, `height`, `boxSize`, `objectFit`
|
|
101
|
+
|
|
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).
|
|
103
|
+
|
|
104
|
+
### Picture
|
|
105
|
+
```js
|
|
106
|
+
// Basic usage — src goes on the Img child, NOT on Picture
|
|
107
|
+
Picture: {
|
|
108
|
+
Img: { src: '/files/photo.jpg' },
|
|
109
|
+
width: '100%',
|
|
110
|
+
aspectRatio: '16/9'
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// With theme-aware sources
|
|
114
|
+
Picture: {
|
|
115
|
+
extends: 'Picture',
|
|
116
|
+
Img: { src: '/files/map-dark.svg' },
|
|
117
|
+
'@dark': { srcset: '/files/map-dark.svg' },
|
|
118
|
+
'@light': { srcset: '/files/map-light.svg' }
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
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
|
+
---
|
|
137
|
+
|
|
138
|
+
## Cross-cutting props (all atoms)
|
|
139
|
+
|
|
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`
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Typography Components
|
|
151
|
+
|
|
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 |
|
|
163
|
+
|
|
164
|
+
All accept a `text` prop.
|
|
165
|
+
|
|
166
|
+
```js
|
|
167
|
+
H2: { text: 'Section title' }
|
|
168
|
+
P: { text: 'Body copy goes here.' }
|
|
169
|
+
Caption: { text: 'Updated 3 days ago', color: 'caption' }
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Dividers
|
|
175
|
+
|
|
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
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Buttons
|
|
189
|
+
|
|
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
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Avatar
|
|
215
|
+
|
|
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
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Badge & Notification
|
|
239
|
+
|
|
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
|
+
Themes: `primary`, `warning`, `success`, `transparent`, `bordered`, `dialog`, `field`
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Form & Input
|
|
257
|
+
|
|
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
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Composition
|
|
282
|
+
|
|
283
|
+
Pair a primary element (heading, icon, image) with text content or controls:
|
|
284
|
+
|
|
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
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## Selection
|
|
305
|
+
|
|
306
|
+
Three flavors — **Check**, **Radio**, **Toggle** — each in caption, hgroup, and list variants:
|
|
307
|
+
|
|
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 |
|
|
318
|
+
|
|
319
|
+
```js
|
|
320
|
+
CheckCaption: { Caption: { text: 'Accept terms' } }
|
|
321
|
+
ToggleHgroup: { H: { text: 'Email alerts' }, P: { text: 'Sent daily' } }
|
|
322
|
+
ToggleHgroupList: {
|
|
323
|
+
children: [
|
|
324
|
+
{ H: { text: 'Email alerts' }, P: { text: 'Sent daily' } },
|
|
325
|
+
{ H: { text: 'Push notifications' }, P: { text: 'Instant' } }
|
|
326
|
+
]
|
|
327
|
+
}
|
|
328
|
+
CheckStep: { H6: { text: 'Verify email' }, Progress: { value: 1 } }
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## Progress & Status
|
|
334
|
+
|
|
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
|
+
```
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Navigation & Links
|
|
354
|
+
|
|
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
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Overlay & Disclosure
|
|
376
|
+
|
|
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
|
+
```
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Data Display
|
|
394
|
+
|
|
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
|
+
```
|
|
410
|
+
|
|
411
|
+
---
|
|
412
|
+
|
|
413
|
+
## Misc
|
|
414
|
+
|
|
415
|
+
| Component | Use |
|
|
416
|
+
| ----------- | --------------------------------------- |
|
|
417
|
+
| `Scrollbar` | Custom scrollbar with arrow navigation |
|
|
418
|
+
|
|
419
|
+
```js
|
|
420
|
+
Scrollbar: { NavigationArrows: {} }
|
|
421
|
+
```
|