@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.
@@ -0,0 +1,430 @@
1
+ # Symbols Design System — Tokens, Themes & Configuration
2
+
3
+ The design system lives in `designSystem/` and controls all visual tokens consumed by DOMQL props.
4
+
5
+ ---
6
+
7
+ ## Design System Files
8
+
9
+ | File | Purpose |
10
+ | ---------------- | ------------------------------------------------------------ |
11
+ | `COLOR.js` | Named color palette |
12
+ | `GRADIENT.js` | Gradient definitions |
13
+ | `THEME.js` | Semantic surface themes (document, dialog, field, primary…) |
14
+ | `FONT.js` | Custom font faces |
15
+ | `FONT_FAMILY.js` | Font family stacks |
16
+ | `TYPOGRAPHY.js` | Type scale (ratio + range) |
17
+ | `SPACING.js` | Spacing scale (ratio + range) |
18
+ | `TIMING.js` | Named easing curves |
19
+ | `CLASS.js` | Utility CSS class overrides |
20
+ | `ANIMATION.js` | Named keyframe animations |
21
+ | `MEDIA.js` | Custom media query breakpoints |
22
+ | `CASES.js` | Conditional environment flags |
23
+ | `RESET.js` | Global CSS reset overrides |
24
+
25
+ ---
26
+
27
+ ## How Tokens Are Used in Props
28
+
29
+ Props accept design tokens as strings. The system resolves them into CSS values via sequences, themes, and colors.
30
+
31
+ ```js
32
+ Card: {
33
+ padding: 'B C', // spacing token
34
+ background: 'primary.08', // color + opacity
35
+ borderRadius: 'B', // spacing token
36
+ shadow: 'soft', // shadow token
37
+ fontSize: 'B', // typography token
38
+ color: 'title' // adaptive color token
39
+ }
40
+ ```
41
+
42
+ ---
43
+
44
+ ## COLOR
45
+
46
+ ### Static colors
47
+
48
+ | Token | Value | Use |
49
+ | ------------ | --------------- | ------------------------ |
50
+ | `green` | `#389d34` | Success states |
51
+ | `red` | `#e15c55` | Warning/error states |
52
+ | `yellow` | `#EDCB38` | Attention states |
53
+ | `orange` | `#e97c16` | Accent states |
54
+ | `blue` | `#0474f2` | Primary interactive |
55
+ | `black` | `black` | Pure black |
56
+ | `white` | `#ffffff` | Pure white |
57
+ | `gray` | `#4e4e50` | Neutral mid-tone |
58
+ | `codGray` | `#171717` | Near-black page bg |
59
+ | `transparent`| `rgba(0,0,0,0)` | Fully transparent |
60
+
61
+ ### Adaptive semantic colors (dark/light aware)
62
+
63
+ | Token | Dark value | Light value | Use |
64
+ | ----------- | ------------------ | ------------------ | ------------------ |
65
+ | `title` | near-white | near-black | Primary text |
66
+ | `caption` | mid-gray | mid-gray | Secondary/meta |
67
+ | `paragraph` | lighter-gray | darker-gray | Body copy |
68
+ | `disabled` | dimmer-gray | dimmer-gray | Disabled state |
69
+ | `line` | subtle-gray | subtle-gray | Borders/dividers |
70
+
71
+ ### Color modifier syntax (dot-notation)
72
+
73
+ Color tokens use dot-notation for opacity and `+`/`-` for relative tone shifts, `=` for absolute lightness:
74
+
75
+ ```js
76
+ 'gray.95-68' // gray at 95% opacity, darkened 68 steps
77
+ 'gray+168' // gray at full opacity, lightened 168 steps
78
+ 'white-78' // white darkened 78 steps
79
+ 'primary.5' // primary at 50% opacity
80
+ 'primary+5' // shifted tone
81
+ 'gray=90' // gray at absolute 90% lightness
82
+ 'gray.5+15' // 50% opacity + 15 shade lighter
83
+ ```
84
+
85
+ Opacity rules:
86
+ - `.XX` always means `0.XX` — e.g., `.1` = 0.1, `.35` = 0.35, `.0` = 0.0
87
+ - Full opacity (1.0) = no modifier needed (just the color name)
88
+ - Raw CSS values (`rgba()`, `hsl()`, `#hex`) pass through unchanged
89
+
90
+ ### Usage in components
91
+
92
+ ```js
93
+ // Static
94
+ Text: { color: 'blue' }
95
+
96
+ // Adaptive semantic
97
+ Caption: { color: 'caption' }
98
+
99
+ // Inline tint
100
+ Box: { background: 'gray.1' }
101
+
102
+ // With tone modifier
103
+ Card: { background: 'gray.92+8' }
104
+ ```
105
+
106
+ ---
107
+
108
+ ## THEME
109
+
110
+ Apply with `theme: 'name'` on any element. Themes define `background` + `color` pairs per dark/light mode.
111
+
112
+ ### Available themes
113
+
114
+ | Theme | Use |
115
+ | ----------------- | ------------------------------------------------- |
116
+ | `document` | Page root surface |
117
+ | `dialog` | Elevated card/panel with glass blur |
118
+ | `dialog-elevated` | Higher elevation (selected tabs) |
119
+ | `field` | Input control surface |
120
+ | `field-dialog` | Slightly elevated input inside dialog |
121
+ | `primary` | CTA: blue background, white text |
122
+ | `warning` | Destructive/alert: red background, white text |
123
+ | `success` | Positive: green background, white text |
124
+ | `transparent` | No background, inherits text color |
125
+ | `bordered` | Transparent + 1px border |
126
+ | `none` | Resets both color and background to `none` |
127
+
128
+ ```js
129
+ Page: { extends: 'Flex', theme: 'document', minHeight: '100dvh' }
130
+ Card: { extends: 'Flex', theme: 'dialog', round: 'A', padding: 'A' }
131
+ Input: { theme: 'field' }
132
+ Button: { theme: 'primary', text: 'Save' }
133
+ Badge: { theme: 'warning', text: 'Error' }
134
+ Tab: { '.isActive': { theme: 'dialog-elevated' } }
135
+ ```
136
+
137
+ ### Custom theme definition
138
+
139
+ ```js
140
+ theme: {
141
+ button: {
142
+ color: 'text',
143
+ background: 'primary',
144
+ ':hover': { background: 'primary.85' },
145
+ ':active': { background: 'primary.75' },
146
+ '@dark': { background: 'primary.6' }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ---
152
+
153
+ ## TYPOGRAPHY — Type Scale
154
+
155
+ Scale is generated using a ratio (Major Third = 1.25 by default). Tokens map to the sequence:
156
+
157
+ | Token range | Approx size | Common use |
158
+ | ------------- | ----------- | --------------------------- |
159
+ | `W`–`W2` | ~8–10 px | Micro text |
160
+ | `Z`–`Z2` | ~10–12 px | Caption, footnote |
161
+ | `Y`–`A` | ~12–16 px | Body text, small headings |
162
+ | `A1`–`B` | ~18–24 px | Headings, large body |
163
+ | `B1`–`C` | ~28–40 px | Display headings |
164
+ | `C1`–`C2` | ~48–64 px | Hero headlines |
165
+
166
+ ```js
167
+ Heading: { fontSize: 'C' }
168
+ Caption: { fontSize: 'Z2' }
169
+ Body: { fontSize: 'A' }
170
+ ```
171
+
172
+ Config:
173
+ ```js
174
+ typography: {
175
+ base: 16, // root font size
176
+ ratio: 1.25, // Major Third scale
177
+ range: [-5, 12],
178
+ subSequence: true // enables B2, C1 etc.
179
+ }
180
+ ```
181
+
182
+ ---
183
+
184
+ ## SPACING — Layout Scale
185
+
186
+ Golden Ratio scale (1.618 by default). Used for `padding`, `margin`, `gap`, `width`, `height`, `boxSize`, `borderRadius`, etc.
187
+
188
+ | Token | Approx value | Common use |
189
+ | -------- | ------------ | ------------------------------- |
190
+ | `W`–`W2` | 2–4 px | Micro gaps, offsets |
191
+ | `X`–`X2` | 4–6 px | Icon padding, tight gaps |
192
+ | `Z`–`Z2` | 10–16 px | Compact padding |
193
+ | `A`–`A2` | 16–26 px | Default padding, gutters |
194
+ | `B`–`B2` | 26–42 px | Section padding |
195
+ | `C`–`C2` | 42–68 px | Container padding, avatar sizes |
196
+ | `D`–`D2` | 68–110 px | Large sections |
197
+ | `E`–`F` | 110–178 px | Hero padding, max-widths |
198
+
199
+ > **Sub-sequence rules:** Small sequences like `W` and `X` only have `W`, `W1`, `W2` and `X`, `X1`, `X2`. Sub-tokens like `W4`, `X4` do **not** exist. The `3` and `4` sub-steps (e.g. `A3`, `A4`, `B3`, `B4`) only appear in larger sequences starting from `A` and above where the jump between base tokens is big enough to warrant them.
200
+
201
+ ### Shorthand spacing
202
+
203
+ ```js
204
+ padding: 'A' // all sides
205
+ padding: 'A B' // vertical | horizontal
206
+ padding: 'A B C' // top | horizontal | bottom
207
+ padding: 'A B C D' // top | right | bottom | left
208
+ margin: '- - - auto' // use '-' to skip a side
209
+ ```
210
+
211
+ ### Math in spacing
212
+
213
+ ```js
214
+ Box: { padding: 'A+Z', margin: '-B', width: 'C+Z2' }
215
+ ```
216
+
217
+ ---
218
+
219
+ ## TIMING — Easing Curves
220
+
221
+ | Token | Value | Use |
222
+ | --------------- | ---------------------------------- | ---------------- |
223
+ | `defaultBezier` | `cubic-bezier(.29, .67, .51, .97)` | Smooth ease-out |
224
+
225
+ ```js
226
+ Box: { transition: 'B defaultBezier', transitionProperty: 'opacity, transform' }
227
+ ```
228
+
229
+ Timing scale (in ms): `base: 150, ratio: 1.333`
230
+
231
+ ---
232
+
233
+ ## ANIMATION
234
+
235
+ Named keyframe animations:
236
+
237
+ | Name | Effect | Use |
238
+ | ------------- | ------------------------------- | ---------------- |
239
+ | `fadeInUp` | Fade in + slide up from 12.5% | Entrance |
240
+ | `fadeOutDown` | Fade out + slide down to 12.5% | Exit |
241
+ | `marquee` | Scroll left by 50% | Ticker |
242
+
243
+ ```js
244
+ Modal: { animation: 'fadeInUp B defaultBezier' }
245
+ Ticker: { animation: 'marquee 8s linear infinite' }
246
+ ```
247
+
248
+ ---
249
+
250
+ ## MEDIA — Breakpoints
251
+
252
+ Built-in breakpoints:
253
+
254
+ | Token | Query | Direction |
255
+ | ---------- | ------------------------ | ------------ |
256
+ | `tv` | `min-width: 2780px` | up |
257
+ | `screenL` | `max-width: 1920px` | down |
258
+ | `tabletL` | `max-width: 1366px` | down |
259
+ | `tabletS` | `max-width: 1024px` | down |
260
+ | `mobileL` | `max-width: 768px` | down |
261
+ | `mobileM` | `max-width: 560px` | down |
262
+ | `mobileS` | `max-width: 480px` | down |
263
+ | `light` | `prefers-color-scheme: light` | — |
264
+ | `dark` | `prefers-color-scheme: dark` | — |
265
+
266
+ Add `<` suffix for min-width (upward): `tabletL<` = `min-width: 1366px`
267
+
268
+ ```js
269
+ Grid: {
270
+ columns: 'repeat(4, 1fr)',
271
+ '@tabletSm': { columns: 'repeat(2, 1fr)' },
272
+ '@mobileL': { columns: '1fr' }
273
+ }
274
+ Box: {
275
+ '@dark': { background: 'codGray' },
276
+ '@light': { background: 'concrete' }
277
+ }
278
+ ```
279
+
280
+ ---
281
+
282
+ ## CASES — Conditional Environment Flags
283
+
284
+ | Case | Condition |
285
+ | ---------- | ----------------------------------------- |
286
+ | `isSafari` | `true` when browser is Safari |
287
+
288
+ ```js
289
+ Element: { $isSafari: { top: 'Z2', right: 'Z2' } }
290
+ ```
291
+
292
+ ---
293
+
294
+ ## Design System Configuration
295
+
296
+ Define a single config object. Keys map directly to design system categories:
297
+
298
+ ```js
299
+ const designSystemConfig = {
300
+ color: {
301
+ primary: '#1f6feb',
302
+ text: ['#0b0b0b', '#f5f5f5'], // [dark, light] adaptive
303
+ accent: {
304
+ '@light': '#ff7a18',
305
+ '@dark': '#ffb347'
306
+ }
307
+ },
308
+ theme: {
309
+ document: { color: 'text', background: 'primary.02' },
310
+ button: { color: 'text', background: 'primary' }
311
+ },
312
+ typography: { base: 16, ratio: 1.25, subSequence: true },
313
+ spacing: { base: 16, ratio: 1.618, subSequence: true },
314
+ timing: { base: 150, ratio: 1.333, unit: 'ms' },
315
+ font: {
316
+ Inter: {
317
+ url: '/fonts/Inter-Variable.woff2',
318
+ isVariable: true,
319
+ fontWeight: '100 900'
320
+ }
321
+ },
322
+ font_family: {
323
+ primary: { value: ['Inter'], type: 'sans', isDefault: true }
324
+ },
325
+ icons: { search: '<svg>...</svg>' },
326
+ svg: { logo: '<svg>...</svg>' },
327
+ shadow: {
328
+ soft: 'black.15 0px 10px 30px 0px',
329
+ hard: ['black.25 0px 8px 16px 0px', 'black.35 0px 10px 24px 0px'] // [light, dark]
330
+ },
331
+ media: {
332
+ mobile: '(max-width: 768px)',
333
+ desktop: '(min-width: 1024px)'
334
+ },
335
+
336
+ // Configuration flags
337
+ useVariable: true, // emit CSS custom properties
338
+ useReset: true, // apply CSS reset
339
+ useFontImport: true, // load fonts via @font-face
340
+ useIconSprite: true, // inline SVG sprite
341
+ useDocumentTheme: true, // apply document theme to <html>
342
+ useDefaultConfig: true, // merge smbls default design system
343
+ globalTheme: 'dark', // force dark/light mode globally
344
+ }
345
+ ```
346
+
347
+ ### Valid top-level config keys
348
+
349
+ ```
350
+ color, gradient, theme, typography, spacing, timing,
351
+ font, font_family, icons, semantic_icons, svg, svg_data,
352
+ shadow, media, grid, class, reset, unit, animation, cases
353
+ ```
354
+
355
+ **Do NOT** wrap these under `props` or other wrappers.
356
+
357
+ ---
358
+
359
+ ## Fonts
360
+
361
+ ### Variable font (Google Fonts)
362
+ ```js
363
+ font: {
364
+ Inter: {
365
+ url: 'https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap',
366
+ isVariable: true,
367
+ fontWeight: '100 900'
368
+ }
369
+ }
370
+ ```
371
+
372
+ ### Variable font (self-hosted)
373
+ ```js
374
+ font: {
375
+ Inter: { url: '/fonts/Inter-Variable.woff2', isVariable: true, fontWeight: '100 900' }
376
+ }
377
+ ```
378
+
379
+ ### Traditional per-weight files
380
+ ```js
381
+ font: {
382
+ inter: {
383
+ 400: { url: '/fonts/Inter-Regular.woff2', fontWeight: 400 },
384
+ 700: { url: '/fonts/Inter-Bold.woff2', fontWeight: 700 }
385
+ }
386
+ }
387
+ ```
388
+
389
+ ---
390
+
391
+ ## Icons & SVG
392
+
393
+ ```js
394
+ icons: {
395
+ search: '<svg>...</svg>' // converted to sprite
396
+ },
397
+ semantic_icons: {
398
+ logo: true // NOT converted to sprite (used as-is)
399
+ },
400
+ svg: {
401
+ logo: '<svg>...</svg>' // general SVG assets
402
+ }
403
+ ```
404
+
405
+ Default icon set includes: `symbols`, `logo`, arrow variants, `check`, `checkCircle`, chevron variants, `copy`, `eye`, `eyeOff`, `info`, `lock`, `minus`, `plus`, `search`, `send`, `smile`, `star`, `sun`, `moon`, `upload`, `video`, `x`, `moreHorizontal`, `moreVertical`
406
+
407
+ ---
408
+
409
+ ## Design System Flags
410
+
411
+ | Flag | Default | Effect |
412
+ | ------------------ | ------- | ----------------------------------------- |
413
+ | `useReset` | `true` | Apply CSS reset |
414
+ | `useVariable` | `true` | Emit CSS custom properties for all tokens |
415
+ | `useFontImport` | `true` | Load FONT entries via @font-face |
416
+ | `useIconSprite` | `true` | Inline the ICONS SVG sprite into the DOM |
417
+ | `useSvgSprite` | `true` | Inline SVG sprite definitions |
418
+ | `useDefaultConfig` | `true` | Merge smbls default design system config |
419
+ | `useDocumentTheme` | `true` | Apply document theme to `<html>` |
420
+ | `verbose` | `false` | Suppress design system debug output |
421
+
422
+ ---
423
+
424
+ ## Common Mistakes
425
+
426
+ - Do not nest config under `props` or other wrappers
427
+ - Use `font_family` instead of `fontFamily`
428
+ - Define `typography` and `spacing` if you use tokens like `A`, `B2`, or `C+Z`
429
+ - Use named color tokens, not raw hex, for all interactive/semantic colors
430
+ - Use dot-notation for color opacity: `color: 'white.7'` (not `'white .7'`)