@symbo.ls/mcp 1.0.0 → 1.0.5
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/.claude/settings.local.json +9 -0
- package/README.md +46 -150
- package/bin/symbols-mcp.js +17 -0
- package/generate-mcpb.sh +17 -0
- package/manifest.json +67 -0
- package/package.json +8 -13
- package/publish.sh +51 -0
- package/pyproject.toml +4 -10
- package/server.json +32 -0
- package/symbols-mcp.mcpb +0 -0
- package/symbols_mcp/__init__.py +1 -1
- package/symbols_mcp/server.py +18 -773
- package/symbols_mcp/skills/AUDIT.md +287 -0
- package/symbols_mcp/skills/DEFAULT_COMPONENTS.md +1939 -0
- package/symbols_mcp/skills/DEFAULT_DESIGN_SYSTEM.md +468 -0
- package/symbols_mcp/skills/OPTIMIZATIONS_FOR_AGENT.md +253 -0
- package/symbols_mcp/skills/PROJECT_SETUP.md +217 -0
- package/symbols_mcp/skills/REMOTE_PREVIEW.md +144 -0
- package/symbols_mcp/skills/SEO-METADATA.md +110 -0
- package/uv.lock +826 -0
- package/.env.example +0 -16
- package/.env.railway +0 -13
- package/LICENSE +0 -21
- package/mcp.json +0 -57
- package/railway.toml +0 -26
- package/run.sh +0 -17
- package/symbols_mcp/skills/GARY_TAN.md +0 -80
- package/windsurf-mcp-config.json +0 -18
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# Default design system
|
|
2
|
+
|
|
3
|
+
This document describes every token defined in `smbls/designSystem/` and how they are used in Symbols/DOMQL v3.
|
|
4
|
+
|
|
5
|
+
## Files
|
|
6
|
+
|
|
7
|
+
| File | Purpose |
|
|
8
|
+
|------|---------|
|
|
9
|
+
| `COLOR.js` | Named color palette |
|
|
10
|
+
| `GRADIENT.js` | Gradient definitions (empty by default) |
|
|
11
|
+
| `THEME.js` | Semantic surface themes (document, dialog, field, primary…) |
|
|
12
|
+
| `FONT.js` | Custom font faces |
|
|
13
|
+
| `FONT_FAMILY.js` | Font family stacks |
|
|
14
|
+
| `TYPOGRAPHY.js` | Type scale configuration |
|
|
15
|
+
| `SPACING.js` | Spacing scale configuration |
|
|
16
|
+
| `TIMING.js` | Easing curves |
|
|
17
|
+
| `CLASS.js` | Utility CSS class overrides (empty by default) |
|
|
18
|
+
| `GRID.js` | Grid presets (empty by default) |
|
|
19
|
+
| `SHAPE.js` | Shape/border-radius presets (empty by default) |
|
|
20
|
+
| `ANIMATION.js` | Named keyframe animations |
|
|
21
|
+
| `MEDIA.js` | Custom media query breakpoints |
|
|
22
|
+
| `CASES.js` | Conditional cases (environment flags) |
|
|
23
|
+
| `RESET.js` | Global CSS reset overrides (empty by default) |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## COLOR
|
|
28
|
+
|
|
29
|
+
File: `smbls/designSystem/COLOR.js`
|
|
30
|
+
|
|
31
|
+
Named hex values and semantic adaptive colors used everywhere via `color`, `background`, `borderColor`, and `theme` props.
|
|
32
|
+
|
|
33
|
+
### Static colors
|
|
34
|
+
|
|
35
|
+
| Token | Value | Usage |
|
|
36
|
+
|-------|-------|-------|
|
|
37
|
+
| `green` | `#389d34` | Success states |
|
|
38
|
+
| `red` | `#e15c55` | Warning/error states |
|
|
39
|
+
| `yellow` | `#EDCB38` | Attention states |
|
|
40
|
+
| `orange` | `#e97c16` | Accent states |
|
|
41
|
+
| `blue` | `#0474f2` | Primary interactive color |
|
|
42
|
+
| `phosphorus` | `#4db852` | Alternate success |
|
|
43
|
+
| `black` | `black` | Pure black |
|
|
44
|
+
| `white` | `#ffffff` | Pure white |
|
|
45
|
+
| `gray` | `#4e4e50` | Neutral mid-tone base |
|
|
46
|
+
| `codGray` | `#171717` | Near-black page background |
|
|
47
|
+
| `solitude` | `#e5f1ff` | Light blue tint |
|
|
48
|
+
| `anakiwa` | `#a3cdfd` | Light blue accent |
|
|
49
|
+
| `concrete` | `#f2f2f2` | Light neutral |
|
|
50
|
+
| `transparent` | `rgba(0,0,0,0)` | Fully transparent |
|
|
51
|
+
|
|
52
|
+
### Adaptive semantic colors
|
|
53
|
+
|
|
54
|
+
These tokens resolve to different values in dark and light mode. The `[dark, light]` tuple is applied automatically via the theme system.
|
|
55
|
+
|
|
56
|
+
| Token | Dark value | Light value | Usage |
|
|
57
|
+
|-------|-----------|-------------|-------|
|
|
58
|
+
| `title` | `gray 1 −168` (near-white) | `gray 1 +168` (near-black) | Primary text |
|
|
59
|
+
| `caption` | `gray 1 −68` | `gray 1 +68` | Secondary/meta text |
|
|
60
|
+
| `paragraph` | `gray 1 −42` | `gray 1 +42` | Body copy |
|
|
61
|
+
| `disabled` | `gray 1 −26` | `gray 1 +26` | Disabled state text |
|
|
62
|
+
| `line` | `gray 1 −16` | `gray 1 +16` | Dividers and borders |
|
|
63
|
+
|
|
64
|
+
The `gray X ±Y` notation is a Symbols color function: start from `gray` at opacity `X`, then lighten or darken by `Y` steps.
|
|
65
|
+
|
|
66
|
+
### Usage in components
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
// Static color
|
|
70
|
+
Text: { color: 'blue' }
|
|
71
|
+
|
|
72
|
+
// Adaptive semantic color
|
|
73
|
+
Caption: { color: 'caption' }
|
|
74
|
+
|
|
75
|
+
// Inline tint/shade
|
|
76
|
+
Box: { background: 'gray 0.1' }
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## THEME
|
|
82
|
+
|
|
83
|
+
File: `smbls/designSystem/THEME.js`
|
|
84
|
+
|
|
85
|
+
Themes define paired `background` + `color` (and optional effects) for dark and light modes. Apply with `theme: 'name'` on any element.
|
|
86
|
+
|
|
87
|
+
### Available themes
|
|
88
|
+
|
|
89
|
+
#### `document`
|
|
90
|
+
|
|
91
|
+
The page root surface.
|
|
92
|
+
|
|
93
|
+
| Mode | Background | Text |
|
|
94
|
+
|------|-----------|------|
|
|
95
|
+
| dark | `codGray` (`#171717`) | `title` |
|
|
96
|
+
| light | `gray 1 +168` (near-white) | `title` |
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
Page: { extends: 'Flex', theme: 'document', minHeight: '100dvh' }
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### `dialog`
|
|
103
|
+
|
|
104
|
+
Elevated card or panel surface, with glass blur.
|
|
105
|
+
|
|
106
|
+
| Mode | Background | Text | Blur |
|
|
107
|
+
|------|-----------|------|------|
|
|
108
|
+
| dark | `gray 0.95 −68` | `title` | `blur(3px)` |
|
|
109
|
+
| light | `gray .95 +150` | `title` | `blur(3px)` |
|
|
110
|
+
|
|
111
|
+
```js
|
|
112
|
+
Card: { extends: 'Flex', theme: 'dialog', round: 'A', padding: 'A' }
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
#### `dialog-elevated`
|
|
116
|
+
|
|
117
|
+
Higher elevation than `dialog`, used for active/selected states in tab bars.
|
|
118
|
+
|
|
119
|
+
| Mode | Background | Text |
|
|
120
|
+
|------|-----------|------|
|
|
121
|
+
| dark | `gray 1 +68` | `title` |
|
|
122
|
+
| light | `gray 0.95 +140` | `title` |
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
Tab: { '.isActive': { theme: 'dialog-elevated' } }
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### `field`
|
|
129
|
+
|
|
130
|
+
Input control surface.
|
|
131
|
+
|
|
132
|
+
| Mode | Background | Text | Placeholder |
|
|
133
|
+
|------|-----------|------|-------------|
|
|
134
|
+
| dark | `gray 0.95 −65` | `white` | `white 1 −78` |
|
|
135
|
+
| light | transparent | `black` | `gray 1 −68` |
|
|
136
|
+
|
|
137
|
+
```js
|
|
138
|
+
Input: { theme: 'field' }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### `field-dialog`
|
|
142
|
+
|
|
143
|
+
Slightly elevated input variant, used inside dialog panels.
|
|
144
|
+
|
|
145
|
+
| Mode | Background | Text |
|
|
146
|
+
|------|-----------|------|
|
|
147
|
+
| dark | `gray 1 −16` | `title` |
|
|
148
|
+
| light | `gray 1 −96` | `title` |
|
|
149
|
+
|
|
150
|
+
#### `primary`
|
|
151
|
+
|
|
152
|
+
Main call-to-action color (blue background, white text).
|
|
153
|
+
|
|
154
|
+
| Mode | Background | Text |
|
|
155
|
+
|------|-----------|------|
|
|
156
|
+
| dark | `blue` | `white` |
|
|
157
|
+
| light | `blue` | `white` |
|
|
158
|
+
|
|
159
|
+
```js
|
|
160
|
+
Button: { theme: 'primary', text: 'Save' }
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### `warning`
|
|
164
|
+
|
|
165
|
+
Destructive or alert state (red background, white text).
|
|
166
|
+
|
|
167
|
+
| Mode | Background | Text |
|
|
168
|
+
|------|-----------|------|
|
|
169
|
+
| dark | `red` | `white` |
|
|
170
|
+
| light | `red` | `white` |
|
|
171
|
+
|
|
172
|
+
```js
|
|
173
|
+
Badge: { theme: 'warning', text: 'Error' }
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
#### `success`
|
|
177
|
+
|
|
178
|
+
Positive confirmation state (green background, white text).
|
|
179
|
+
|
|
180
|
+
| Mode | Background | Text |
|
|
181
|
+
|------|-----------|------|
|
|
182
|
+
| dark | `green` | `white` |
|
|
183
|
+
| light | `green` | `white` |
|
|
184
|
+
|
|
185
|
+
#### `transparent`
|
|
186
|
+
|
|
187
|
+
No background, inherits current text color.
|
|
188
|
+
|
|
189
|
+
```js
|
|
190
|
+
Button: { theme: 'transparent', text: 'Cancel' }
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
#### `bordered`
|
|
194
|
+
|
|
195
|
+
Transparent background with a 1 px border.
|
|
196
|
+
|
|
197
|
+
| Mode | Border |
|
|
198
|
+
|------|--------|
|
|
199
|
+
| dark | `1px solid #4e4e50` |
|
|
200
|
+
| light | `1px solid #a3cdfd` |
|
|
201
|
+
|
|
202
|
+
```js
|
|
203
|
+
Card: { theme: 'bordered' }
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### `none`
|
|
207
|
+
|
|
208
|
+
Resets both color and background to `none`.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## FONT
|
|
213
|
+
|
|
214
|
+
File: `smbls/designSystem/FONT.js`
|
|
215
|
+
|
|
216
|
+
Declares custom font faces loaded via the design system's `useFontImport` option.
|
|
217
|
+
|
|
218
|
+
| Font | URL | Weight | Variable |
|
|
219
|
+
|------|-----|--------|---------|
|
|
220
|
+
| `AvenirNext_Variable` | Symbols CDN | 400 | yes |
|
|
221
|
+
|
|
222
|
+
The variable font covers all weights from a single file. It is used as the default UI font across the design system.
|
|
223
|
+
|
|
224
|
+
```js
|
|
225
|
+
// In component
|
|
226
|
+
Text: { fontFamily: 'AvenirNext_Variable' }
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## FONT_FAMILY
|
|
232
|
+
|
|
233
|
+
File: `smbls/designSystem/FONT_FAMILY.js`
|
|
234
|
+
|
|
235
|
+
Defines font stack aliases.
|
|
236
|
+
|
|
237
|
+
| Token | Stack | Type | Default |
|
|
238
|
+
|-------|-------|------|---------|
|
|
239
|
+
| `Default` | `San Francisco, Helvetica Neue, Helvetica, Arial` | `sans-serif` | yes |
|
|
240
|
+
|
|
241
|
+
The `Default` stack is the system UI fallback used before `AvenirNext_Variable` loads.
|
|
242
|
+
|
|
243
|
+
```js
|
|
244
|
+
Text: { fontFamily: 'Default' }
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## TYPOGRAPHY
|
|
250
|
+
|
|
251
|
+
File: `smbls/designSystem/TYPOGRAPHY.js`
|
|
252
|
+
|
|
253
|
+
Controls the font-size scale used for all typographic tokens (`A`, `B`, `C`, `Z1`, `W2`, etc.).
|
|
254
|
+
|
|
255
|
+
```js
|
|
256
|
+
{
|
|
257
|
+
'@default': {
|
|
258
|
+
base: 16, // 16 px root font size
|
|
259
|
+
ratio: 1.25, // Major Third scale
|
|
260
|
+
range: [-5, 12],
|
|
261
|
+
subSequence: true
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
The scale generates tokens from `W4` (smallest) to `C2` (largest) using the Fibonacci-like progression:
|
|
267
|
+
|
|
268
|
+
| Token | Approx size |
|
|
269
|
+
|-------|------------|
|
|
270
|
+
| `W4`–`W1` | ~8–10 px |
|
|
271
|
+
| `W`–`Z4` | ~10–11 px |
|
|
272
|
+
| `Z3`–`Z` | ~11–12 px |
|
|
273
|
+
| `Y4`–`A` | ~12–16 px |
|
|
274
|
+
| `A1`–`B` | ~18–24 px |
|
|
275
|
+
| `B1`–`C` | ~28–40 px |
|
|
276
|
+
| `C1`–`C2` | ~48–64 px |
|
|
277
|
+
|
|
278
|
+
Use these tokens as `fontSize` values on any text element.
|
|
279
|
+
|
|
280
|
+
```js
|
|
281
|
+
Heading: { fontSize: 'C' }
|
|
282
|
+
Caption: { fontSize: 'Z2' }
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## SPACING
|
|
288
|
+
|
|
289
|
+
File: `smbls/designSystem/SPACING.js`
|
|
290
|
+
|
|
291
|
+
Controls the spacing scale used for all layout tokens (`padding`, `margin`, `gap`, `width`, `height`, `boxSize`, etc.).
|
|
292
|
+
|
|
293
|
+
```js
|
|
294
|
+
{
|
|
295
|
+
'@default': {
|
|
296
|
+
base: 16, // 16 px root unit
|
|
297
|
+
ratio: 1.618, // Golden Ratio
|
|
298
|
+
range: [-5, 15]
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
The Golden Ratio produces a wider scale than typography. Common tokens:
|
|
304
|
+
|
|
305
|
+
| Token | Approx value | Common use |
|
|
306
|
+
|-------|-------------|-----------|
|
|
307
|
+
| `W2`–`W` | 2–4 px | Micro gaps, offsets |
|
|
308
|
+
| `X4`–`X` | 4–6 px | Icon padding, tight gaps |
|
|
309
|
+
| `Y4`–`Y` | 6–10 px | Small gaps |
|
|
310
|
+
| `Z4`–`Z` | 10–16 px | Compact padding |
|
|
311
|
+
| `A`–`A4` | 16–26 px | Default padding, gutters |
|
|
312
|
+
| `B`–`B4` | 26–42 px | Section padding |
|
|
313
|
+
| `C`–`C4` | 42–68 px | Container padding, avatar sizes |
|
|
314
|
+
| `D`–`D4` | 68–110 px | Large sections |
|
|
315
|
+
| `E`–`F` | 110–178 px | Hero padding, max-widths |
|
|
316
|
+
| `G`–`H` | 178–288 px | Wide containers |
|
|
317
|
+
|
|
318
|
+
Compound tokens are written with `+` (e.g., `A+W2` means A plus the W2 step).
|
|
319
|
+
|
|
320
|
+
```js
|
|
321
|
+
Box: { padding: 'A B2' } // top/bottom A, left/right B2
|
|
322
|
+
Flex: { gap: 'Z' } // gap = ~16 px
|
|
323
|
+
Avatar: { boxSize: 'C2' } // ~68 px square
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## TIMING
|
|
329
|
+
|
|
330
|
+
File: `smbls/designSystem/TIMING.js`
|
|
331
|
+
|
|
332
|
+
Named easing curves for CSS transitions and animations.
|
|
333
|
+
|
|
334
|
+
| Token | Value | Character |
|
|
335
|
+
|-------|-------|-----------|
|
|
336
|
+
| `defaultBezier` | `cubic-bezier(.29, .67, .51, .97)` | Smooth ease-out |
|
|
337
|
+
|
|
338
|
+
```js
|
|
339
|
+
Box: { transition: 'B defaultBezier', transitionProperty: 'opacity, transform' }
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## ANIMATION
|
|
345
|
+
|
|
346
|
+
File: `smbls/designSystem/ANIMATION.js`
|
|
347
|
+
|
|
348
|
+
Named keyframe animations available via `animation` prop.
|
|
349
|
+
|
|
350
|
+
| Name | From | To | Use |
|
|
351
|
+
|------|------|----|-----|
|
|
352
|
+
| `fadeInUp` | `opacity: 0, translateY(12.5%)` | `opacity: 1, translateY(0)` | Entrance |
|
|
353
|
+
| `fadeOutDown` | `opacity: 1, translateY(0)` | `opacity: 0, translateY(12.5%)` | Exit |
|
|
354
|
+
| `marquee` | `translateX(0)` | `translateX(-50%)` | Scrolling ticker |
|
|
355
|
+
|
|
356
|
+
```js
|
|
357
|
+
Modal: { animation: 'fadeInUp B defaultBezier' }
|
|
358
|
+
Ticker: { animation: 'marquee 8s linear infinite' }
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## MEDIA
|
|
364
|
+
|
|
365
|
+
File: `smbls/designSystem/MEDIA.js`
|
|
366
|
+
|
|
367
|
+
Custom named breakpoints that extend the built-in set.
|
|
368
|
+
|
|
369
|
+
| Token | Query |
|
|
370
|
+
|-------|-------|
|
|
371
|
+
| `mobileL` | `min-width: 480px` |
|
|
372
|
+
| `tabletSm` | `min-width: 728px` |
|
|
373
|
+
|
|
374
|
+
Use with `@` prefix in any element:
|
|
375
|
+
|
|
376
|
+
```js
|
|
377
|
+
Grid: {
|
|
378
|
+
columns: '1fr',
|
|
379
|
+
'@tabletSm': { columns: 'repeat(2, 1fr)' },
|
|
380
|
+
'@mobileL': { columns: 'repeat(3, 1fr)' }
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
Built-in breakpoints from the default config also apply (`@mobile`, `@tablet`, `@desktop`, etc.).
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## CASES
|
|
389
|
+
|
|
390
|
+
File: `smbls/designSystem/CASES.js`
|
|
391
|
+
|
|
392
|
+
Conditional environment flags evaluated at runtime. Used as boolean props (`.caseName`) or state conditionals.
|
|
393
|
+
|
|
394
|
+
| Case | Condition |
|
|
395
|
+
|------|-----------|
|
|
396
|
+
| `isSafari` | `true` when the browser is Safari (not Chrome/Android) |
|
|
397
|
+
|
|
398
|
+
```js
|
|
399
|
+
Element: {
|
|
400
|
+
$isSafari: { top: 'Z2', right: 'Z2' }
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## Design system flags
|
|
407
|
+
|
|
408
|
+
Set in `smbls/designSystem/index.js`:
|
|
409
|
+
|
|
410
|
+
| Flag | Default | Effect |
|
|
411
|
+
|------|---------|--------|
|
|
412
|
+
| `useReset` | `true` | Apply a CSS reset |
|
|
413
|
+
| `useVariable` | `true` | Emit CSS custom properties for all tokens |
|
|
414
|
+
| `useFontImport` | `true` | Load `FONT` entries via `@font-face` |
|
|
415
|
+
| `useIconSprite` | `true` | Inline the `ICONS` SVG sprite into the DOM |
|
|
416
|
+
| `useSvgSprite` | `true` | Inline any SVG sprite definitions |
|
|
417
|
+
| `useDefaultConfig` | `true` | Merge the smbls default design system config |
|
|
418
|
+
| `useDocumentTheme` | `true` | Apply `document` theme to `<html>` |
|
|
419
|
+
| `verbose` | `false` | Suppress design system debug output |
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## Cross-cutting token conventions
|
|
424
|
+
|
|
425
|
+
### Shorthand spacing
|
|
426
|
+
|
|
427
|
+
Spacing props accept 1–4 tokens just like CSS shorthand:
|
|
428
|
+
|
|
429
|
+
```js
|
|
430
|
+
padding: 'A' // all sides
|
|
431
|
+
padding: 'A B' // vertical | horizontal
|
|
432
|
+
padding: 'A B C' // top | horizontal | bottom
|
|
433
|
+
padding: 'A B C D' // top | right | bottom | left
|
|
434
|
+
margin: '- - - auto' // use '-' to skip a side (no-op)
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Color modifier syntax
|
|
438
|
+
|
|
439
|
+
```
|
|
440
|
+
'gray 0.95 -68' // gray at 95% opacity, darkened by 68 steps
|
|
441
|
+
'gray 1 +168' // gray at full opacity, lightened by 168 steps
|
|
442
|
+
'white 1 -78' // white darkened 78 steps
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Theme + mode targeting
|
|
446
|
+
|
|
447
|
+
```js
|
|
448
|
+
Box: {
|
|
449
|
+
'@dark': { background: 'codGray' },
|
|
450
|
+
'@light': { background: 'concrete' }
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Responsive overrides
|
|
455
|
+
|
|
456
|
+
```js
|
|
457
|
+
Grid: {
|
|
458
|
+
columns: 'repeat(4, 1fr)',
|
|
459
|
+
'@tabletSm': { columns: 'repeat(2, 1fr)' },
|
|
460
|
+
'@mobileL': { columns: '1fr' }
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
## Supplemental
|
|
467
|
+
|
|
468
|
+
Component usage is documented in [DEFAULT_COMPONENTS.md](DEFAULT_COMPONENTS.md). Built-in atoms are documented in [BUILT_IN_COMPONENTS.md](BUILT_IN_COMPONENTS.md). General conventions are in [CLAUDE.md](CLAUDE.md).
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# Optimize Your Symbols Site for AI Agents
|
|
2
|
+
|
|
3
|
+
## A Practical Guide to Accessibility, ARIA, and Emerging Standards
|
|
4
|
+
|
|
5
|
+
### AI Skill Instruction for Coding Assistants
|
|
6
|
+
|
|
7
|
+
This document is the definitive guide for generating Symbols (DOMQL v3) code fully interpretable by AI agents, accessibility tools, and automated systems. All output must comply with the following rules and standards.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# 1. Semantic-First Architecture
|
|
12
|
+
|
|
13
|
+
Always generate semantic components instead of generic containers. Use these mappings:
|
|
14
|
+
|
|
15
|
+
| Intent | Required Component |
|
|
16
|
+
| ------------------------------------ | --------------------- |
|
|
17
|
+
| Page header | Header |
|
|
18
|
+
| Navigation | Nav |
|
|
19
|
+
| Primary content | Main |
|
|
20
|
+
| Standalone entity (product, article) | Article |
|
|
21
|
+
| Thematic grouping | Section |
|
|
22
|
+
| Sidebar | Aside |
|
|
23
|
+
| Footer | Footer |
|
|
24
|
+
| H1–H6 | Headings |
|
|
25
|
+
| P | Paragraphs |
|
|
26
|
+
| Button | Actions |
|
|
27
|
+
| Link | Navigation |
|
|
28
|
+
| Form | Transactional surface |
|
|
29
|
+
| Input / Select | User input |
|
|
30
|
+
|
|
31
|
+
Do not simulate meaning with generic divs or spans.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
# 2. DOMQL v3 Compliance
|
|
36
|
+
|
|
37
|
+
- Use DOMQL v3 syntax exclusively.
|
|
38
|
+
- Set HTML attributes via `attr`.
|
|
39
|
+
- Prefix event handlers with `on`.
|
|
40
|
+
- Ensure all critical content is server-rendered and visible in the initial HTML.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
# 3. Heading Discipline
|
|
45
|
+
|
|
46
|
+
- One H1 per page defining primary subject.
|
|
47
|
+
- Logical hierarchy: H1 → H2 → H3, etc.
|
|
48
|
+
- Nested headings should not skip levels.
|
|
49
|
+
|
|
50
|
+
Heading hierarchy is used by AI agents to determine page structure.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
# 4. Interactive Elements
|
|
55
|
+
|
|
56
|
+
- Use native elements: Button, Link, Form, Input, Select.
|
|
57
|
+
- If non-native interactive elements are unavoidable, declare:
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
attr: {
|
|
61
|
+
role: 'button',
|
|
62
|
+
tabindex: '0'
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- Do not rely on visual styling to indicate interactivity.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
# 5. Accessibility as Machine Interface
|
|
71
|
+
|
|
72
|
+
ARIA attributes define machine-readable state:
|
|
73
|
+
|
|
74
|
+
- `aria-busy`: reflects loading.
|
|
75
|
+
- `aria-label`: accessible name when visible text is insufficient.
|
|
76
|
+
- `aria-live`: indicates dynamic content.
|
|
77
|
+
- `autocomplete`: guides expected input format.
|
|
78
|
+
|
|
79
|
+
ARIA values must match actual runtime state.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
# 6. AI-Specific Markup (aid-\*)
|
|
84
|
+
|
|
85
|
+
Include aid-\* attributes to optimize machine parsing:
|
|
86
|
+
|
|
87
|
+
- `aid-type`: structural role (header, nav, main, content, complementary, interactive, modal, alert, search)
|
|
88
|
+
- `aid-desc`: concise machine-readable description
|
|
89
|
+
- `aid-state`: idle, loading, processing, done, error
|
|
90
|
+
- `aid-cnt-type`: product, service, info
|
|
91
|
+
|
|
92
|
+
State must accurately reflect dynamic changes.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
# 7. Structured Data (JSON-LD)
|
|
97
|
+
|
|
98
|
+
Include JSON-LD for entity representation:
|
|
99
|
+
|
|
100
|
+
- Organization
|
|
101
|
+
- Product / Service
|
|
102
|
+
- Article
|
|
103
|
+
- FAQPage
|
|
104
|
+
- BreadcrumbList
|
|
105
|
+
|
|
106
|
+
Structured data must match server-rendered content exactly.
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
export const StructuredData = {
|
|
110
|
+
tag: "script",
|
|
111
|
+
attr: { type: "application/ld+json" },
|
|
112
|
+
html: (el, s) =>
|
|
113
|
+
JSON.stringify({
|
|
114
|
+
"@context": "https://schema.org",
|
|
115
|
+
"@type": "Product",
|
|
116
|
+
name: s.name,
|
|
117
|
+
description: s.description,
|
|
118
|
+
offers: {
|
|
119
|
+
"@type": "Offer",
|
|
120
|
+
price: s.price,
|
|
121
|
+
priceCurrency: s.currency,
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
};
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
# 8. Form Construction Protocol
|
|
130
|
+
|
|
131
|
+
- Associate labels using `for` + `id` or nest input inside label.
|
|
132
|
+
- Define `name` and `type` attributes.
|
|
133
|
+
- Use `autocomplete` when relevant.
|
|
134
|
+
- Reflect submission state via `aria-busy` or `aid-state`.
|
|
135
|
+
|
|
136
|
+
Forms must be machine-submittable without heuristic inference.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
# 9. Explicit Identifiers
|
|
141
|
+
|
|
142
|
+
Use deterministic IDs and class names for reliable referencing:
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
attr: {
|
|
146
|
+
id: `entity-${s.id}`,
|
|
147
|
+
class: 'entity-card'
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
# 10. llms.txt Support
|
|
154
|
+
|
|
155
|
+
Provide `/llms.txt` for AI guidance:
|
|
156
|
+
|
|
157
|
+
```text
|
|
158
|
+
# Organization Name
|
|
159
|
+
# Purpose: Platform description
|
|
160
|
+
|
|
161
|
+
## Key pages
|
|
162
|
+
- /products
|
|
163
|
+
- /api/docs
|
|
164
|
+
- /support
|
|
165
|
+
|
|
166
|
+
## Preferred interactions
|
|
167
|
+
- /api/v2/ programmatic access
|
|
168
|
+
- /search?q= for search
|
|
169
|
+
|
|
170
|
+
## Data accuracy
|
|
171
|
+
- Prices, shipping, inventory levels
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
AI agents must use llms.txt for programmatic routing and content interpretation.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
# 11. Testing Instructions
|
|
179
|
+
|
|
180
|
+
### Manual Testing
|
|
181
|
+
|
|
182
|
+
- Ask AI agents to describe page content, locate products, report prices, and identify support channels.
|
|
183
|
+
|
|
184
|
+
### Automated Testing
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
export const testAgentComprehension = async function (url, prompt) {
|
|
188
|
+
const response = await fetch("https://api.agent-simulator.com/ask", {
|
|
189
|
+
method: "POST",
|
|
190
|
+
body: JSON.stringify({ url, prompt }),
|
|
191
|
+
});
|
|
192
|
+
return response.json();
|
|
193
|
+
};
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
# 12. Chrome WebMCP / Tool Exposure
|
|
199
|
+
|
|
200
|
+
Use descriptive attributes for AI-accessible tools:
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
export const CheckOrderTool = {
|
|
204
|
+
extends: "Form",
|
|
205
|
+
attr: {
|
|
206
|
+
"data-mcp-tool": "checkOrderStatus",
|
|
207
|
+
"data-mcp-description": "Check the status of an order by ID",
|
|
208
|
+
},
|
|
209
|
+
Input: { attr: { type: "text", name: "orderId", placeholder: "Order ID" } },
|
|
210
|
+
Button: { type: "submit", text: "Check" },
|
|
211
|
+
};
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
# 13. Infrastructure Awareness
|
|
217
|
+
|
|
218
|
+
- Expect bursty agent traffic.
|
|
219
|
+
- Horizontal scaling preferred.
|
|
220
|
+
- Sub-200ms response targets.
|
|
221
|
+
- Intelligent rate limiting for abusive requests.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
# 14. Failure Pattern Recognition
|
|
226
|
+
|
|
227
|
+
- Excessive divs without semantics
|
|
228
|
+
- Non-descriptive links
|
|
229
|
+
- Missing headings
|
|
230
|
+
- Critical content rendered client-side only
|
|
231
|
+
- Conflicting metadata
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
# 15. Output Verification Checklist
|
|
236
|
+
|
|
237
|
+
Ensure all generated code meets these requirements:
|
|
238
|
+
|
|
239
|
+
- Semantic components only
|
|
240
|
+
- One H1 per page
|
|
241
|
+
- Buttons for actions, Links for navigation
|
|
242
|
+
- Labeled and named forms
|
|
243
|
+
- Dynamic regions declare state
|
|
244
|
+
- JSON-LD matches content
|
|
245
|
+
- Server-rendered critical content
|
|
246
|
+
|
|
247
|
+
Any violation requires regeneration.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
# Operational Principle
|
|
252
|
+
|
|
253
|
+
Generate Symbols code assuming AI agents parse and act on it before human consumption. Structure, semantics, and state define AI comprehension, safety, and interoperability. Accessibility and aid-\* attributes are part of the machine contract.
|