@symbo.ls/mcp 1.0.11 → 1.0.14

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,3856 @@
1
+ # Default Project Template — Complete Component Reference
2
+
3
+ All components from the default Symbols project template (default.symbo.ls).
4
+ These components are available in every project that includes the default library.
5
+ Reference them by PascalCase key name — no imports needed.
6
+
7
+ ---
8
+
9
+ ## Project Configuration
10
+
11
+ ### symbols.json
12
+ ```json
13
+ {
14
+ "key": "default-flattened.symbo.ls",
15
+ "dir": ".",
16
+ "bundler": "parcel"
17
+ }
18
+ ```
19
+
20
+ ### config.js
21
+ ```js
22
+ export default {
23
+ useReset: true,
24
+ useVariable: true,
25
+ useFontImport: true,
26
+ useIconSprite: true,
27
+ useSvgSprite: true,
28
+ useDefaultConfig: true,
29
+ useDocumentTheme: true,
30
+ verbose: false,
31
+ globalTheme: 'auto'
32
+ }
33
+ ```
34
+
35
+ ### context.js
36
+ ```js
37
+ import state from './state.js'
38
+ import dependencies from './dependencies.js'
39
+ import * as components from './components/index.js'
40
+ import * as snippets from './snippets/index.js'
41
+ import pages from './pages/index.js'
42
+ import * as functions from './functions/index.js'
43
+ import * as methods from './methods/index.js'
44
+ import designSystem from './designSystem/index.js'
45
+ import files from './files/index.js'
46
+
47
+ export default {
48
+ state,
49
+ dependencies,
50
+ components,
51
+ snippets,
52
+ pages,
53
+ functions,
54
+ methods,
55
+ designSystem,
56
+ files
57
+ }
58
+ ```
59
+
60
+ ### state.js
61
+ ```js
62
+ export default {};
63
+ ```
64
+
65
+ ### dependencies.js
66
+ ```js
67
+ export default {};
68
+ ```
69
+
70
+ ### envs.js
71
+ ```js
72
+ export default {}
73
+ ```
74
+
75
+ ### sharedLibraries.js
76
+ ```js
77
+ export default []
78
+ ```
79
+
80
+ ---
81
+
82
+ ## Design System
83
+
84
+ ### index.js (Design System entry)
85
+ ```js
86
+ import color from './color.js'
87
+ import gradient from './gradient.js'
88
+ import theme from './theme.js'
89
+ import font from './font.js'
90
+ import font_family from './font_family.js'
91
+ import typography from './typography.js'
92
+ import spacing from './spacing.js'
93
+ import timing from './timing.js'
94
+ import _class from './class.js'
95
+ import grid from './grid.js'
96
+ import icons from './icons.js'
97
+ import shape from './shape.js'
98
+ import reset from './reset.js'
99
+ import animation from './animation.js'
100
+ import media from './media.js'
101
+ import cases from './cases.js'
102
+
103
+ export default {
104
+ color: color,
105
+ gradient: gradient,
106
+ theme: theme,
107
+ font: font,
108
+ font_family: font_family,
109
+ typography: typography,
110
+ spacing: spacing,
111
+ timing: timing,
112
+ class: _class,
113
+ grid: grid,
114
+ icons: icons,
115
+ shape: shape,
116
+ reset: reset,
117
+ animation: animation,
118
+ media: media,
119
+ cases: cases,
120
+ }
121
+ ```
122
+
123
+ ### color
124
+ ```js
125
+ export default {
126
+ green: '#389d34',
127
+ red: '#e15c55',
128
+ yellow: '#EDCB38',
129
+ orange: '#e97c16',
130
+ transparent: 'rgba(0, 0, 0, 0)',
131
+ black: 'black',
132
+ gray: '#4e4e50',
133
+ white: '#ffffff',
134
+ title: [
135
+ '--gray 1 -168',
136
+ '--gray 1 +168',
137
+ ],
138
+ caption: [
139
+ '--gray 1 -68',
140
+ '--gray 1 +68',
141
+ ],
142
+ paragraph: [
143
+ '--gray 1 -42',
144
+ '--gray 1 +42',
145
+ ],
146
+ disabled: [
147
+ '--gray 1 -26',
148
+ '--gray 1 +26',
149
+ ],
150
+ line: [
151
+ '--gray 1 -16',
152
+ '--gray 1 +16',
153
+ ],
154
+ codGray: '#171717',
155
+ solitude: '#e5f1ff',
156
+ anakiwa: '#a3cdfd',
157
+ concrete: '#f2f2f2',
158
+ blue: '#0474f2',
159
+ phosphorus: '#4db852',
160
+ };
161
+ ```
162
+
163
+ ### gradient
164
+ ```js
165
+ export default {};
166
+ ```
167
+
168
+ ### theme
169
+ ```js
170
+ export default {
171
+ document: {
172
+ '@dark': {
173
+ background: 'codGray',
174
+ color: 'title',
175
+ },
176
+ '@light': {
177
+ background: 'gray 1 +168',
178
+ color: 'title',
179
+ },
180
+ },
181
+ dialog: {
182
+ '@dark': {
183
+ background: 'gray 0.95 -68',
184
+ color: 'title',
185
+ backdropFilter: 'blur(3px)',
186
+ borderColor: 'gray 0',
187
+ outlineColor: 'blue',
188
+ },
189
+ '@light': {
190
+ background: 'gray .95 +150',
191
+ color: 'title',
192
+ backdropFilter: 'blur(3px)',
193
+ borderColor: 'gray 0',
194
+ outlineColor: 'blue',
195
+ },
196
+ },
197
+ 'dialog-elevated': {
198
+ '@dark': {
199
+ color: 'title',
200
+ background: 'gray 1 +68',
201
+ borderColor: 'gray 0',
202
+ outlineColor: 'blue',
203
+ backgroundKey: 'caption',
204
+ },
205
+ '@light': {
206
+ color: 'title',
207
+ background: 'gray 0.95 +140',
208
+ borderColor: 'gray 0',
209
+ outlineColor: 'blue',
210
+ },
211
+ },
212
+ field: {
213
+ '@dark': {
214
+ color: 'white',
215
+ background: 'gray 0.95 -65',
216
+ '::placeholder': {
217
+ color: 'white 1 -78',
218
+ },
219
+ },
220
+ '@light': {
221
+ color: 'black',
222
+ '::placeholder': {
223
+ color: 'gray 1 -68',
224
+ },
225
+ },
226
+ },
227
+ 'field-dialog': {
228
+ '@dark': {
229
+ background: 'gray 1 -16',
230
+ color: 'title',
231
+ },
232
+ '@light': {
233
+ color: 'title',
234
+ background: 'gray 1 -96',
235
+ },
236
+ },
237
+ primary: {
238
+ '@dark': {
239
+ background: 'blue',
240
+ color: 'white',
241
+ },
242
+ '@light': {
243
+ color: 'white',
244
+ background: 'blue',
245
+ },
246
+ },
247
+ warning: {
248
+ '@dark': {
249
+ background: 'red',
250
+ color: 'white',
251
+ },
252
+ '@light': {
253
+ color: 'white',
254
+ background: 'red',
255
+ },
256
+ },
257
+ success: {
258
+ '@dark': {
259
+ background: 'green',
260
+ color: 'white',
261
+ },
262
+ '@light': {
263
+ background: 'green',
264
+ color: 'white',
265
+ },
266
+ },
267
+ none: {
268
+ color: 'none',
269
+ background: 'none',
270
+ },
271
+ transparent: {
272
+ color: 'currentColor',
273
+ background: 'transparent',
274
+ },
275
+ bordered: {
276
+ background: 'transparent',
277
+ '@dark': {
278
+ border: '1px solid #4e4e50',
279
+ },
280
+ '@light': {
281
+ border: '1px solid #a3cdfd',
282
+ },
283
+ },
284
+ };
285
+ ```
286
+
287
+ ### font
288
+ ```js
289
+ export default {};
290
+ ```
291
+
292
+ ### font_family
293
+ ```js
294
+ export default {
295
+ Default: {
296
+ isDefault: true,
297
+ value: [
298
+ 'San Francisco, Helvetica Neue, Helvetica, Arial',
299
+ ],
300
+ type: 'sans-serif',
301
+ },
302
+ };
303
+ ```
304
+
305
+ ### typography
306
+ ```js
307
+ export default {
308
+ '@default': {
309
+ base: 16,
310
+ ratio: 1.25,
311
+ range: [
312
+ -5,
313
+ 12,
314
+ ],
315
+ subSequence: true,
316
+ },
317
+ };
318
+ ```
319
+
320
+ ### spacing
321
+ ```js
322
+ export default {
323
+ '@default': {
324
+ base: 16,
325
+ ratio: 1.25,
326
+ range: [
327
+ -5,
328
+ 12,
329
+ ],
330
+ subSequence: true,
331
+ },
332
+ };
333
+ ```
334
+
335
+ ### TIMING
336
+ ```js
337
+ export default {
338
+ defaultBezier: 'cubic-bezier(.29, .67, .51, .97)',
339
+ };
340
+ ```
341
+
342
+ ### CLASS
343
+ ```js
344
+ export default {};
345
+ ```
346
+
347
+ ### GRID
348
+ ```js
349
+ export default {};
350
+ ```
351
+
352
+ ### icons
353
+ ```js
354
+ export default {
355
+ symbols: '<svg height="24" width="24"><path d="M13.843 2.7C19.063 2.7 23 6.366 23 11.228c0 3.754-2.862 6.584-6.658 6.584-3.287 0-5.007-2.318-5.007-4.609 0-2.395 1.923-4.344 4.287-4.344.566 0 1.023.12 1.309.223a.212.212 0 01.137.229l-.016.058-.514 1.18a.223.223 0 01-.245.13 2.965 2.965 0 00-.506-.046c-1.245 0-2.258 1.027-2.258 2.288 0 1.33 1.165 2.373 2.651 2.373 2.195 0 3.913-1.777 3.913-4.046 0-3.024-2.294-5.135-5.58-5.135-4.076 0-7.393 3.36-7.393 7.491a7.519 7.519 0 002.871 5.924l-4.96 3.18A12.042 12.042 0 012 14.7c0-6.617 5.313-12 11.843-12z" fill-rule="evenodd"/></svg>',
356
+ logo: '<svg height="24" width="24"><path d="M13.843 2.7C19.063 2.7 23 6.366 23 11.228c0 3.754-2.862 6.584-6.658 6.584-3.287 0-5.007-2.318-5.007-4.609 0-2.395 1.923-4.344 4.287-4.344.566 0 1.023.12 1.309.223a.212.212 0 01.137.229l-.016.058-.514 1.18a.223.223 0 01-.245.13 2.965 2.965 0 00-.506-.046c-1.245 0-2.258 1.027-2.258 2.288 0 1.33 1.165 2.373 2.651 2.373 2.195 0 3.913-1.777 3.913-4.046 0-3.024-2.294-5.135-5.58-5.135-4.076 0-7.393 3.36-7.393 7.491a7.519 7.519 0 002.871 5.924l-4.96 3.18A12.042 12.042 0 012 14.7c0-6.617 5.313-12 11.843-12z" fill-rule="evenodd"/></svg>',
357
+ arrowDownCircle: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-down-circle"><circle cx="12" cy="12" r="10"/><path d="M8 12l4 4 4-4M12 8v8"/></svg>',
358
+ arrowDownLeft: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-down-left"><path d="M17 7L7 17M17 17H7V7"/></svg>',
359
+ arrowDownRight: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-down-right"><path d="M7 7l10 10M17 7v10H7"/></svg>',
360
+ arrowDown: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-down"><path d="M12 5v14M19 12l-7 7-7-7"/></svg>',
361
+ arrowLeftCircle: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-left-circle"><circle cx="12" cy="12" r="10"/><path d="M12 8l-4 4 4 4M16 12H8"/></svg>',
362
+ arrowLeft: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-left"><path d="M19 12H5M12 19l-7-7 7-7"/></svg>',
363
+ arrowRight: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-right"><path d="M5 12h14M12 5l7 7-7 7"/></svg>',
364
+ arrowRightCircle: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-right-circle"><circle cx="12" cy="12" r="10"/><path d="M12 16l4-4-4-4M8 12h8"/></svg>',
365
+ arrowUpCircle: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-up-circle"><circle cx="12" cy="12" r="10"/><path d="M16 12l-4-4-4 4M12 16V8"/></svg>',
366
+ arrowUpLeft: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-up-left"><path d="M17 17L7 7M7 17V7h10"/></svg>',
367
+ arrowUpRight: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-up-right"><path d="M7 17L17 7M7 7h10v10"/></svg>',
368
+ arrowUp: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-up"><path d="M12 19V5M5 12l7-7 7 7"/></svg>',
369
+ checkCircle: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check-circle"><path d="M22 11.08V12a10 10 0 11-5.93-9.14"/><path d="M22 4L12 14.01l-3-3"/></svg>',
370
+ check: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><path d="M20 6L9 17l-5-5"/></svg>',
371
+ chevronDown: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-down"><path d="M6 9l6 6 6-6"/></svg>',
372
+ chevronLeft: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-left"><path d="M15 18l-6-6 6-6"/></svg>',
373
+ chevronRight: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right"><path d="M9 18l6-6-6-6"/></svg>',
374
+ chevronUp: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-up"><path d="M18 15l-6-6-6 6"/></svg>',
375
+ copy: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-copy"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>',
376
+ eyeOff: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-eye-off"><path d="M17.94 17.94A10.07 10.07 0 0112 20c-7 0-11-8-11-8a18.45 18.45 0 015.06-5.94M9.9 4.24A9.12 9.12 0 0112 4c7 0 11 8 11 8a18.5 18.5 0 01-2.16 3.19m-6.72-1.07a3 3 0 11-4.24-4.24M1 1l22 22"/></svg>',
377
+ eye: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-eye"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>',
378
+ info: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-info"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/></svg>',
379
+ lock: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-lock"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0110 0v4"/></svg>',
380
+ minus: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-minus"><path d="M5 12h14"/></svg>',
381
+ sun: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-sun"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>',
382
+ moon: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-moon"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>',
383
+ moreHorizontal: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-more-horizontal"><circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/></svg>',
384
+ moreVertical: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-more-vertical"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>',
385
+ send: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-send"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg>',
386
+ smile: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-smile"><circle cx="12" cy="12" r="10"/><path d="M8 14s1.5 2 4 2 4-2 4-2M9 9h.01M15 9h.01"/></svg>',
387
+ search: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-search"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>',
388
+ upload: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-upload"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4M17 8l-5-5-5 5M12 3v12"/></svg>',
389
+ video: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-video"><path d="M23 7l-7 5 7 5V7z"/><rect x="1" y="5" width="15" height="14" rx="2" ry="2"/></svg>',
390
+ x: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><path d="M18 6L6 18M6 6l12 12"/></svg>',
391
+ star: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-star"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>',
392
+ plus: '<svg width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-plus"><path d="M12 5v14M5 12h14"/></svg>',
393
+ };
394
+ ```
395
+
396
+ ### SHAPE
397
+ ```js
398
+ export default {};
399
+ ```
400
+
401
+ ### reset
402
+ ```js
403
+ export default {};
404
+ ```
405
+
406
+ ### ANIMATION
407
+ ```js
408
+ export default {
409
+ fadeInUp: {
410
+ from: {
411
+ transform: 'translate3d(0, 12.5%, 1px)',
412
+ opacity: 0,
413
+ },
414
+ to: {
415
+ transform: 'translate3d(0, 0, 1px)',
416
+ opacity: 1,
417
+ },
418
+ },
419
+ fadeOutDown: {
420
+ from: {
421
+ transform: 'translate3d(0, 0, 1px)',
422
+ opacity: 1,
423
+ },
424
+ to: {
425
+ transform: 'translate3d(0, 12.5%, 1px)',
426
+ opacity: 0,
427
+ },
428
+ },
429
+ marquee: {
430
+ from: {
431
+ transform: 'translate3d(0, 0, 1px)',
432
+ },
433
+ to: {
434
+ transform: 'translate3d(-50%, 0, 1px)',
435
+ },
436
+ },
437
+ };
438
+ ```
439
+
440
+ ### media
441
+ ```js
442
+ export default {};
443
+ ```
444
+
445
+ ### CASES
446
+ ```js
447
+ export default {
448
+ isSafari: () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent),
449
+ };
450
+ ```
451
+
452
+ ---
453
+
454
+ ## Components
455
+
456
+ ### Accordion
457
+ ```js
458
+ export const Accordion = {
459
+ state: {
460
+ activeAccordion: false,
461
+ },
462
+ ButtonParagraph: {
463
+ cursor: 'pointer',
464
+ gap: 'D1',
465
+ onClick: (event, element, state) => {
466
+ state.update({
467
+ activeAccordion: !state.activeAccordion
468
+ })
469
+
470
+ },
471
+ P: {
472
+ text: 'Question text one here',
473
+ },
474
+ Button: {
475
+ text: '',
476
+ Icon: {
477
+ name: 'chevronDown',
478
+ '.activeAccordion': {
479
+ transform: 'rotate(-180deg)',
480
+ },
481
+ transition: 'transform .3s ease',
482
+ },
483
+ },
484
+ },
485
+ P: {
486
+ text: 'Use a checkbox when users can select one option, multiple options, or no option from a list of a possible options',
487
+ margin: '0',
488
+ maxWidth: 'H',
489
+ minWidth: 'H',
490
+ position: 'absolute',
491
+ left: '0',
492
+ top: '2em',
493
+ transition: 'min-height .3s ease, max-height .3s ease, opacity .3s ease',
494
+ overflow: 'hidden',
495
+ '.activeAccordion': {
496
+ minHeight: '4em',
497
+ maxHeight: '10em',
498
+ opacity: '1',
499
+ },
500
+ '!activeAccordion': {
501
+ minHeight: '0',
502
+ maxHeight: '0',
503
+ opacity: '0',
504
+ },
505
+ },
506
+ flow: 'y',
507
+
508
+ gap: 'Y2',
509
+
510
+ position: 'relative',
511
+ };
512
+ ```
513
+
514
+ ### Avatar
515
+ ```js
516
+ export const Avatar = {
517
+ extends: 'smbls.Avatar',
518
+ boxSize: 'C2',
519
+ };
520
+ ```
521
+
522
+ ### AvatarBadgeHgroup
523
+ ```js
524
+ export const AvatarBadgeHgroup = {
525
+ Avatar: {},
526
+ Hgroup: {
527
+ gap: 'V2',
528
+ H: {
529
+ display: 'flex',
530
+ alignItems: 'center',
531
+ gap: 'Y',
532
+ Badge: {},
533
+ },
534
+ P: {},
535
+ },
536
+ extends: 'AvatarHgroup',
537
+ };
538
+ ```
539
+
540
+ ### AvatarChatPreview
541
+ ```js
542
+ export const AvatarChatPreview = {
543
+ Avatar: {},
544
+ Flex: {
545
+ flow: 'y',
546
+ flex: '1',
547
+ '> *': {
548
+ minWidth: '100%',
549
+ },
550
+ ValueHeading: {
551
+ H: {},
552
+ UnitValue: {
553
+ flow: 'row-reverse',
554
+ Unit: {
555
+ text: 'am',
556
+ },
557
+ Value: {
558
+ text: '2:20',
559
+ },
560
+ },
561
+ },
562
+ NotCounterParagraph: {
563
+ P: {
564
+ whiteSpace: 'nowrap',
565
+ overflow: 'hidden',
566
+ maxWidth: 'F2',
567
+ },
568
+ NotificationCounter: {},
569
+ },
570
+ },
571
+ gap: 'Z1',
572
+
573
+ minWidth: 'G3',
574
+
575
+ align: 'center flex-start',
576
+ };
577
+ ```
578
+
579
+ ### AvatarHeading
580
+ ```js
581
+ export const AvatarHeading = {
582
+ Avatar: {},
583
+ H: {
584
+ tag: 'h6',
585
+ lineHeight: '1em',
586
+ text: 'Heading',
587
+ },
588
+ gap: 'X2',
589
+
590
+ align: 'center flex-start',
591
+ };
592
+ ```
593
+
594
+ ### AvatarHgroup
595
+ ```js
596
+ export const AvatarHgroup = {
597
+ Avatar: {
598
+ margin: '-X - - -',
599
+ },
600
+ Hgroup: {
601
+ gap: 'X2',
602
+ H: {
603
+ tag: 'h6',
604
+ },
605
+ P: {},
606
+ },
607
+ gap: 'Z',
608
+
609
+ align: 'center flex-start',
610
+ };
611
+ ```
612
+
613
+ ### AvatarHgroupIconButton
614
+ ```js
615
+ export const AvatarHgroupIconButton = {
616
+ Avatar: {},
617
+ Hgroup: {
618
+ H: {
619
+ tag: 'h6',
620
+ },
621
+ P: {},
622
+ },
623
+ IconButton: {
624
+ margin: '- - - auto',
625
+ Icon: {
626
+ name: 'copy',
627
+ },
628
+ },
629
+ extends: 'AvatarHgroup',
630
+ minWidth: 'G+Z2',
631
+ };
632
+ ```
633
+
634
+ ### AvatarHgroupSelect
635
+ ```js
636
+ export const AvatarHgroupSelect = {
637
+ Avatar: {},
638
+ Hgroup: {
639
+ H: {},
640
+ P: {},
641
+ },
642
+ SelectPicker: {
643
+ margin: '- - - auto',
644
+ Select: {
645
+ 0: {
646
+ value: 'Goat',
647
+ },
648
+ 1: {
649
+ value: 'Icon',
650
+ },
651
+ },
652
+ },
653
+ extends: 'AvatarHgroup',
654
+ minWidth: 'G1',
655
+ };
656
+ ```
657
+
658
+ ### AvatarParagraph
659
+ ```js
660
+ export const AvatarParagraph = {
661
+ Avatar: {
662
+ boxSize: 'B1',
663
+ },
664
+ P: {
665
+ text: 'Can you join us today?',
666
+ margin: '0',
667
+ },
668
+ align: 'center flex-start',
669
+
670
+ gap: 'Y1',
671
+ };
672
+ ```
673
+
674
+ ### AvatarSelectPicker
675
+ ```js
676
+ export const AvatarSelectPicker = {
677
+ tag: 'label',
678
+ Avatar: {},
679
+ Select: {
680
+ fontSize: 'A',
681
+ boxSize: '100%',
682
+ padding: '- B+V2 - Z',
683
+ cursor: 'pointer',
684
+ outline: 'none',
685
+ appearance: 'none',
686
+ flex: '1',
687
+ zIndex: '2',
688
+ lineHeight: 1,
689
+ border: 'none',
690
+ background: 'none',
691
+ pointerEvents: 'All',
692
+ color: 'title',
693
+ ':focus-visible': {
694
+ outline: 'none',
695
+ },
696
+ children: [
697
+ {
698
+ text: 'Nikoloza',
699
+ value: 'Nikoloza',
700
+ },
701
+ {
702
+ text: 'Svinchy',
703
+ value: 'Svinchy',
704
+ },
705
+ ],
706
+ childProps: {
707
+ tag: 'option',
708
+ },
709
+ },
710
+ Icon: {
711
+ name: 'chevronDown',
712
+ position: 'absolute',
713
+ right: '0',
714
+ margin: 'V - - -',
715
+ fontSize: 'B',
716
+ },
717
+ round: '0',
718
+
719
+ align: 'center flex-start',
720
+
721
+ position: 'relative',
722
+ };
723
+ ```
724
+
725
+ ### AvatarSet
726
+ ```js
727
+ export const AvatarSet = {
728
+ display: 'flex',
729
+ childExtends: 'Avatar',
730
+ childProps: {
731
+ border: 'solid codGray',
732
+ borderWidth: 'X+W',
733
+ ':first-child': {
734
+ margin: '0 -Z1 0 0',
735
+ },
736
+ ':nth-child(2)': {
737
+ margin: '0 -Z1 0 0',
738
+ },
739
+ },
740
+ children: [
741
+ {},
742
+ {},
743
+ {},
744
+ ],
745
+ };
746
+ ```
747
+
748
+ ### AvatarSetChatPreview
749
+ ```js
750
+ export const AvatarSetChatPreview = {
751
+ AvatarSet: {
752
+ position: 'relative',
753
+ boxSize: 'fit-content C2',
754
+ border: '1px solid red',
755
+ margin: '-Y2 - - -',
756
+ childProps: {
757
+ boxSize: 'C C',
758
+ borderWidth: 'W',
759
+ display: 'block',
760
+ position: 'absolute',
761
+ top: '50%',
762
+ left: '50%',
763
+ transform: 'translate(-50%, -50%)',
764
+ ':first-child': {
765
+ margin: 'Z2 0 0 0',
766
+ },
767
+ ':nth-child(2)': {
768
+ margin: '0 0 0 Z1',
769
+ },
770
+ ':nth-child(3)': {
771
+ margin: '-W 0 0 -Z1',
772
+ },
773
+ },
774
+ },
775
+ Flex: {
776
+ flow: 'y',
777
+ flex: '1',
778
+ gap: 'W2',
779
+ '> *': {
780
+ minWidth: '100%',
781
+ },
782
+ ValueHeading: {
783
+ minWidth: '0',
784
+ maxWidth: '100%',
785
+ H: {
786
+ text: 'Design',
787
+ },
788
+ UnitValue: {
789
+ flow: 'row-reverse',
790
+ Unit: {
791
+ text: 'am',
792
+ },
793
+ Value: {
794
+ text: '2:20',
795
+ },
796
+ },
797
+ },
798
+ Flex: {
799
+ gap: 'X2',
800
+ Caption: {
801
+ text: 'nick:',
802
+ color: 'paragraph',
803
+ },
804
+ NotCounterParagraph: {
805
+ flex: '1',
806
+ justifyContent: 'space-between',
807
+ P: {
808
+ maxWidth: 'F2',
809
+ whiteSpace: 'nowrap',
810
+ overflow: 'hidden',
811
+ },
812
+ NotificationCounter: {},
813
+ },
814
+ },
815
+ },
816
+ gap: 'Z1',
817
+
818
+ minWidth: 'G3',
819
+
820
+ align: 'center flex-start',
821
+ };
822
+ ```
823
+
824
+ ### AvatarStatus
825
+ ```js
826
+ export const AvatarStatus = {
827
+ display: 'flex',
828
+ Avatar: {},
829
+ StatusDot: {
830
+ position: 'absolute',
831
+ bottom: 'W2',
832
+ right: '0',
833
+ },
834
+ position: 'relative',
835
+ };
836
+ ```
837
+
838
+ ### AvatarStatusChatPreview
839
+ ```js
840
+ export const AvatarStatusChatPreview = {
841
+ AvatarStatus: {
842
+ Avatar: {},
843
+ StatusDot: {},
844
+ },
845
+ Flex: {
846
+ flow: 'y',
847
+ flex: '1',
848
+ gap: 'W2',
849
+ '> *': {
850
+ minWidth: '100%',
851
+ },
852
+ ValueHeading: {
853
+ H: {},
854
+ UnitValue: {
855
+ flow: 'row-reverse',
856
+ Unit: {
857
+ text: 'am',
858
+ },
859
+ Value: {
860
+ text: '2:20',
861
+ },
862
+ },
863
+ },
864
+ NotCounterParagraph: {
865
+ P: {},
866
+ NotificationCounter: {},
867
+ },
868
+ },
869
+ gap: 'Z1',
870
+
871
+ minWidth: 'G3',
872
+
873
+ align: 'center flex-start',
874
+ };
875
+ ```
876
+
877
+ ### Badge
878
+ ```js
879
+ export const Badge = {
880
+ tag: 'label',
881
+ text: '-2.902',
882
+ align: 'center center',
883
+
884
+ theme: 'warning',
885
+
886
+ round: 'C',
887
+
888
+ lineHeight: '1em',
889
+
890
+ boxSizing: 'content-box',
891
+
892
+ padding: 'X1 Z1',
893
+
894
+ backgroundColor: '',
895
+
896
+ borderRadius: '',
897
+ };
898
+ ```
899
+
900
+ ### BadgeCaption
901
+ ```js
902
+ export const BadgeCaption = {
903
+ Caption: {
904
+ text: 'CAPTION',
905
+ },
906
+ Badge: {},
907
+ align: 'center flex-start',
908
+
909
+ gap: 'Y',
910
+ };
911
+ ```
912
+
913
+ ### BadgeParagraph
914
+ ```js
915
+ export const BadgeParagraph = {
916
+ P: {
917
+ margin: '0',
918
+ text: `Hey team, I've finished the re...`,
919
+ color: 'paragraph',
920
+ },
921
+ Badge: {},
922
+ align: 'center space-between',
923
+
924
+ gap: 'A',
925
+ };
926
+ ```
927
+
928
+ ### Breadcrumb
929
+ ```js
930
+ export const Breadcrumb = {
931
+ tag: 'nav',
932
+ childExtends: 'Link',
933
+ display: 'flex',
934
+ align: 'center',
935
+ childProps: {
936
+ fontWeight: '400',
937
+ textDecoration: 'none',
938
+ scrollToTop: false,
939
+ color: 'white 0.35',
940
+ '&[href]': {
941
+ color: 'title',
942
+ '&:hover': {
943
+ textDecoration: 'underline',
944
+ },
945
+ },
946
+ '&:not([href])': {
947
+ cursor: 'default',
948
+ },
949
+ '&:not(:first-child):before': {
950
+ content: '""',
951
+ display: 'inline-block',
952
+ width: '2px',
953
+ height: '2px',
954
+ borderRadius: '100%',
955
+ background: 'white',
956
+ verticalAlign: '0.2em',
957
+ marginInline: '.65em',
958
+ opacity: '.5',
959
+ },
960
+ },
961
+ children: (el, s, ctx) => {
962
+ const routeArr = (s.root.route || window.top.location.pathname).split('/').slice(1)
963
+ return routeArr
964
+ .map((text, i) => text === 'page' ? ({
965
+ href: '/pages',
966
+ text: 'Page'
967
+ }) : el.getData('pages')['/' + text] ? ({
968
+ href: '/' + routeArr.slice(0, i + 1).join('/'),
969
+ text: '/' + text
970
+ }) : ({
971
+ href: '/' + routeArr.slice(0, i + 1).join('/'),
972
+ text: i === 0 ? ctx.utils.toTitleCase(text) : text
973
+ }))
974
+ .filter((_, k) => {
975
+ const v = routeArr[k]
976
+ return !v.includes('-') && !v.includes('editor') && !v.includes('preview')
977
+ })
978
+ },
979
+ };
980
+ ```
981
+
982
+ ### BulletCaption
983
+ ```js
984
+ export const BulletCaption = {
985
+ tag: 'caption',
986
+ text: 'Orders history',
987
+ align: 'center flex-start',
988
+ gap: 'Y1',
989
+ ':before': {
990
+ content: '""',
991
+ boxSize: 'Z1',
992
+ background: 'blue',
993
+ round: 'A2',
994
+ },
995
+ };
996
+ ```
997
+
998
+ ### Button
999
+ ```js
1000
+ export const Button = {
1001
+ extends: 'smbls.Button',
1002
+ };
1003
+ ```
1004
+
1005
+ ### ButtonHeading
1006
+ ```js
1007
+ export const ButtonHeading = {
1008
+ H: {
1009
+ tag: 'h6',
1010
+ text: 'Heading',
1011
+ },
1012
+ Button: {
1013
+ text: 'Button',
1014
+ theme: 'dialog',
1015
+ },
1016
+ align: 'center flex-start',
1017
+
1018
+ gap: 'Z',
1019
+ };
1020
+ ```
1021
+
1022
+ ### ButtonHgroup
1023
+ ```js
1024
+ export const ButtonHgroup = {
1025
+ Hgroup: {
1026
+ gap: 'X2',
1027
+ H: {
1028
+ tag: 'h6',
1029
+ text: 'Heading',
1030
+ },
1031
+ P: {},
1032
+ },
1033
+ Button: {
1034
+ text: 'Button',
1035
+ theme: 'dialog',
1036
+ },
1037
+ align: 'flex-start flex-start',
1038
+
1039
+ gap: 'Z',
1040
+ };
1041
+ ```
1042
+
1043
+ ### ButtonParagraph
1044
+ ```js
1045
+ export const ButtonParagraph = {
1046
+ display: 'flex',
1047
+ P: {
1048
+ text: `Didn't get the code?`,
1049
+ color: 'caption',
1050
+ margin: '0',
1051
+ },
1052
+ Button: {
1053
+ padding: '0',
1054
+ theme: 'transparent',
1055
+ text: 'Click to Resend',
1056
+ },
1057
+ alignItems: 'center',
1058
+
1059
+ gap: 'X2',
1060
+ };
1061
+ ```
1062
+
1063
+ ### ButtonSet
1064
+ ```js
1065
+ export const ButtonSet = {
1066
+ childExtends: 'Button',
1067
+ gap: 'Z',
1068
+ align: 'center flex-start',
1069
+ childProps: {
1070
+ theme: 'dialog',
1071
+ padding: 'A1 B2',
1072
+ },
1073
+ children: [
1074
+ {
1075
+ text: 'BUTTON 1',
1076
+ },
1077
+ {
1078
+ text: 'BUTTEN 2',
1079
+ },
1080
+ ],
1081
+ };
1082
+ ```
1083
+
1084
+ ### Caption
1085
+ ```js
1086
+ export const Caption = {
1087
+ extends: 'smbls.Caption',
1088
+ text: 'It was the last day for our tribe, the year ends',
1089
+ };
1090
+ ```
1091
+
1092
+ ### CardNumberField
1093
+ ```js
1094
+ export const CardNumberField = {
1095
+ display: 'flex',
1096
+ state: {
1097
+ value: 'XXXXXXXXXXXXXXXX',
1098
+ },
1099
+ childExtends: 'FixedNumberField',
1100
+ gap: '0',
1101
+ childProps: {
1102
+ Input: {
1103
+ textAlign: 'center',
1104
+ padding: 'X2 X',
1105
+ round: '0',
1106
+ outline: 'none',
1107
+ value: (el, s) => {
1108
+ const index = parseInt(el.parent.key)
1109
+ const valueArray = s.value
1110
+ const inputValue = el.node.value.split('')
1111
+ for (let i = 0; i < 4; i++) {
1112
+ const charIndex = index * 4 + i
1113
+ const numericPattern = /^\d$/
1114
+ const char = valueArray[charIndex]
1115
+ const isNumeric = numericPattern.test(char)
1116
+ if (isNumeric) inputValue[i] = char
1117
+ }
1118
+ return inputValue.join('')
1119
+ },
1120
+ ':focus-visible': {
1121
+ outline: 'none',
1122
+ },
1123
+ onUpdate: (el, s) => {
1124
+ el.node.value = el.props.value(el, s)
1125
+ },
1126
+ onInput: (ev, el, s, ctx) => {
1127
+ const index = parseInt(el.parent.key)
1128
+ const valueArray = s.value.split('')
1129
+ const inputValue = el.node.value
1130
+ for (let i = 0; i < 4; i++) {
1131
+ const charIndex = index * 4 + i
1132
+ valueArray[charIndex] = inputValue[i] || 'X'
1133
+ }
1134
+ s.update({
1135
+ value: valueArray.join('')
1136
+ })
1137
+ ctx.components.FixedNumberField.Input.onInput(ev, el, s, ctx)
1138
+ },
1139
+ onPaste: (ev, el, s) => {
1140
+ console.log(ev)
1141
+ const handlePastedInput = (event, validationFn) => {
1142
+ event.preventDefault()
1143
+ const pastedText = event.clipboardData.getData('text/plain')
1144
+ const value = validationFn ? validationFn(pastedText) : pastedText
1145
+ s.update({
1146
+ value
1147
+ })
1148
+ }
1149
+ const numericOnlyPaste = (input) => {
1150
+ return input.replace(/[^\d]/g, '')
1151
+ }
1152
+ const maxLengthPaste = (input, maxLength = 12) => {
1153
+ return input.slice(0, maxLength)
1154
+ }
1155
+ return handlePastedInput(ev, (text) => {
1156
+ return maxLengthPaste(numericOnlyPaste(text));
1157
+ });
1158
+ },
1159
+ },
1160
+ ':first-child input': {
1161
+ padding: 'X2 X X2 A1',
1162
+ round: 'A 0 0 A',
1163
+ },
1164
+ ':last-child input': {
1165
+ padding: 'X2 A1 X2 X',
1166
+ round: '0 A A 0',
1167
+ },
1168
+ },
1169
+ children: [
1170
+ {},
1171
+ {},
1172
+ {},
1173
+ {},
1174
+ ],
1175
+ };
1176
+ ```
1177
+
1178
+ ### CheckCaption
1179
+ ```js
1180
+ export const CheckCaption = {
1181
+ Caption: {
1182
+ text: 'Caption',
1183
+ },
1184
+ Checkbox: {
1185
+ Input: {},
1186
+ Flex: {
1187
+ Icon: {
1188
+ name: 'check',
1189
+ },
1190
+ },
1191
+ },
1192
+ align: 'center flex-start',
1193
+
1194
+ gap: 'Z',
1195
+ };
1196
+ ```
1197
+
1198
+ ### CheckCaptionList
1199
+ ```js
1200
+ export const CheckCaptionList = {
1201
+ childExtends: 'CheckCaption',
1202
+ flow: 'y',
1203
+ gap: 'B',
1204
+ childProps: {
1205
+ Caption: {},
1206
+ Checkbox: {
1207
+ Input: {},
1208
+ Flex: {
1209
+ Icon: {
1210
+ name: 'check',
1211
+ },
1212
+ },
1213
+ },
1214
+ },
1215
+ children: [
1216
+ {},
1217
+ {},
1218
+ ],
1219
+ };
1220
+ ```
1221
+
1222
+ ### CheckHgroup
1223
+ ```js
1224
+ export const CheckHgroup = {
1225
+ display: 'flex',
1226
+ Hgroup: {
1227
+ gap: 'W2',
1228
+ H: {
1229
+ tag: 'h6',
1230
+ },
1231
+ P: {},
1232
+ },
1233
+ Checkbox: {
1234
+ Input: {},
1235
+ Flex: {
1236
+ Icon: {
1237
+ name: 'check',
1238
+ },
1239
+ },
1240
+ },
1241
+ gap: 'Z',
1242
+ };
1243
+ ```
1244
+
1245
+ ### CheckHgroupList
1246
+ ```js
1247
+ export const CheckHgroupList = {
1248
+ childExtends: 'CheckHgroup',
1249
+ flow: 'y',
1250
+ gap: 'B',
1251
+ childProps: {
1252
+ Hgroup: {
1253
+ gap: 'W2',
1254
+ H: {
1255
+ tag: 'h6',
1256
+ },
1257
+ P: {},
1258
+ },
1259
+ Checkbox: {
1260
+ Input: {},
1261
+ Flex: {
1262
+ Icon: {
1263
+ name: 'check',
1264
+ },
1265
+ },
1266
+ },
1267
+ },
1268
+ children: [
1269
+ {},
1270
+ {},
1271
+ ],
1272
+ };
1273
+ ```
1274
+
1275
+ ### CheckStep
1276
+ ```js
1277
+ export const CheckStep = {
1278
+ Icon: {
1279
+ name: 'check',
1280
+ theme: 'dialog',
1281
+ display: 'block',
1282
+ boxSizing: 'content-box',
1283
+ padding: 'Y2',
1284
+ round: '100%',
1285
+ },
1286
+ H6: {
1287
+ text: 'Step',
1288
+ },
1289
+ Progress: {
1290
+ minWidth: 'E',
1291
+ maxWidth: 'E',
1292
+ value: 0,
1293
+ height: 'V',
1294
+ '.isActive': {
1295
+ value: 1,
1296
+ },
1297
+ },
1298
+ align: 'center flex-start',
1299
+
1300
+ gap: 'Z',
1301
+ };
1302
+ ```
1303
+
1304
+ ### CheckStepSet
1305
+ ```js
1306
+ export const CheckStepSet = {
1307
+ display: 'flex',
1308
+ childExtends: 'CheckStep',
1309
+ gap: 'Z1',
1310
+ childProps: {
1311
+ Icon: {
1312
+ '.isActive': {
1313
+ theme: 'primary',
1314
+ },
1315
+ },
1316
+ Progress: {},
1317
+ ':last-child > progress': {
1318
+ hide: true,
1319
+ },
1320
+ },
1321
+ children: [
1322
+ {
1323
+ Icon: {
1324
+ isActive: true,
1325
+ },
1326
+ },
1327
+ {},
1328
+ ],
1329
+ };
1330
+ ```
1331
+
1332
+ ### CircleButton
1333
+ ```js
1334
+ export const CircleButton = {
1335
+ extends: 'SquareButton',
1336
+ round: 'C',
1337
+ };
1338
+ ```
1339
+
1340
+ ### CircleProgress
1341
+ ```js
1342
+ export const CircleProgress = {
1343
+ tag: 'progress',
1344
+ attr: {
1345
+ max: ({
1346
+ props
1347
+ }) => props.max,
1348
+ progress: ({
1349
+ props
1350
+ }) => props.progress,
1351
+ value: ({
1352
+ props
1353
+ }) => props.value,
1354
+ },
1355
+ boxSize: 'D D',
1356
+ value: 0.73,
1357
+ round: '100%',
1358
+ overflow: 'hidden',
1359
+ position: 'relative',
1360
+ '&::-webkit-progress-bar': {
1361
+ background: 'gray',
1362
+ },
1363
+ '&::-webkit-progress-value': {
1364
+ theme: 'primary',
1365
+ },
1366
+ ':after': {
1367
+ content: '""',
1368
+ position: 'absolute',
1369
+ width: 'B+B2',
1370
+ height: 'B+B2',
1371
+ round: '100%',
1372
+ top: '50%',
1373
+ left: '50%',
1374
+ transform: 'translate(-50%, -50%)',
1375
+ background: 'codGray',
1376
+ },
1377
+ };
1378
+ ```
1379
+
1380
+ ### ConfirmationButtons
1381
+ ```js
1382
+ export const ConfirmationButtons = {
1383
+ display: 'flex',
1384
+ childExtends: 'Button',
1385
+ gap: 'Y1',
1386
+ childProps: {
1387
+ theme: 'dialog',
1388
+ padding: 'Z1 B1',
1389
+ },
1390
+ children: [
1391
+ {
1392
+ text: 'No',
1393
+ },
1394
+ {
1395
+ text: 'YES',
1396
+ },
1397
+ ],
1398
+ };
1399
+ ```
1400
+
1401
+ ### CounterButton
1402
+ ```js
1403
+ export const CounterButton = {
1404
+ extends: 'Button',
1405
+ position: 'relative',
1406
+ align: 'center space-between',
1407
+ padding: 'Z Z Z A1',
1408
+ minWidth: 'F',
1409
+ theme: 'field',
1410
+ Span: {
1411
+ text: 'Button',
1412
+ },
1413
+ NotificationCounter: {
1414
+ text: '7',
1415
+ },
1416
+ };
1417
+ ```
1418
+
1419
+ ### CounterIconButton
1420
+ ```js
1421
+ export const CounterIconButton = {
1422
+ Icon: {
1423
+ name: 'smile',
1424
+ },
1425
+ NotificationCounter: {
1426
+ position: 'absolute',
1427
+ right: '-Y',
1428
+ top: '-W2',
1429
+ },
1430
+ extends: 'IconButton',
1431
+ position: 'relative',
1432
+ };
1433
+ ```
1434
+
1435
+ ### CounterParagraph
1436
+ ```js
1437
+ export const CounterParagraph = {
1438
+ P: {
1439
+ margin: '0',
1440
+ text: `Hey team, I've finished the re...`,
1441
+ color: 'paragraph',
1442
+ maxWidth: 'E3+D1',
1443
+ overflow: 'hidden',
1444
+ },
1445
+ NotificationCounter: {},
1446
+ align: 'center space-between',
1447
+ gap: 'B',
1448
+ };
1449
+ ```
1450
+
1451
+ ### Field
1452
+ ```js
1453
+ export const Field = {
1454
+ tag: 'label',
1455
+ Input: {
1456
+ round: 'C',
1457
+ padding: 'Z2 C Z2 A2',
1458
+ placeholder: 'Placeholder',
1459
+ minWidth: '100%',
1460
+ },
1461
+ Icon: {
1462
+ icon: 'info',
1463
+ fontSize: 'A2',
1464
+ lineHeight: '1em',
1465
+ position: 'absolute',
1466
+ right: 'Z2',
1467
+ opacity: '.45',
1468
+ },
1469
+ theme: 'field',
1470
+
1471
+ align: 'center flex-start',
1472
+
1473
+ round: 'D',
1474
+
1475
+ position: 'relative',
1476
+ };
1477
+ ```
1478
+
1479
+ ### FieldCaption
1480
+ ```js
1481
+ export const FieldCaption = {
1482
+ Caption: {
1483
+ tag: 'caption',
1484
+ text: 'Caption',
1485
+ lineHeight: '1em',
1486
+ fontSize: 'A',
1487
+ fontWeight: '400',
1488
+ padding: '- Y2 Z X',
1489
+ alignSelf: 'flex-start',
1490
+ whiteSpace: 'nowrap',
1491
+ textAlign: 'left',
1492
+ },
1493
+ Field: {
1494
+ width: '100%',
1495
+ Input: {},
1496
+ Icon: {},
1497
+ },
1498
+ flow: 'column',
1499
+
1500
+ boxSize: 'fit-content fit-content',
1501
+ };
1502
+ ```
1503
+
1504
+ ### FixedNumberField
1505
+ ```js
1506
+ export const FixedNumberField = {
1507
+ Input: {
1508
+ boxSize: 'B D',
1509
+ padding: 'X2 Z X2 A2',
1510
+ boxSizing: 'content-box',
1511
+ placeholder: '0000',
1512
+ letterSpacing: '.35em',
1513
+ maxlength: '4',
1514
+ textTransform: 'uppercase',
1515
+ style: {
1516
+ fontFamily: 'Courier, monospace',
1517
+ },
1518
+ onKeydown: (event, element, state) => {
1519
+ const numericPattern = /^\d$/;
1520
+ const navigationKeys = [
1521
+ "Backspace", "ArrowLeft", "ArrowRight", "Tab",
1522
+ "Delete", "Home", "End", "Enter", "Escape"
1523
+ ];
1524
+ const ctrlShortcuts = ["a", "c", "v", "x"];
1525
+
1526
+ const isNumeric = numericPattern.test(event.key);
1527
+ const isNavigationKey = navigationKeys.includes(event.key);
1528
+ const isCtrlShortcut = (event.metaKey || event.ctrlKey) && ctrlShortcuts.includes(event.key);
1529
+
1530
+ // Allow only numeric input, navigation keys, and Ctrl shortcuts
1531
+ if (!isNumeric && !isNavigationKey && !isCtrlShortcut) {
1532
+ event.preventDefault();
1533
+ }
1534
+ },
1535
+ onInput: (event, element, state) => {
1536
+ if (element.node.value.length === 0) {
1537
+ element.parent.previousElement()?.Input?.node.focus()
1538
+ }
1539
+ if (element.node.value.length > 3) {
1540
+ element.parent.nextElement()?.Input?.node.focus()
1541
+ }
1542
+ },
1543
+ },
1544
+ extends: 'InputField',
1545
+ };
1546
+ ```
1547
+
1548
+ ### Flex
1549
+ ```js
1550
+ export const Flex = {
1551
+ extends: 'smbls.Flex',
1552
+ flow: 'x',
1553
+ };
1554
+ ```
1555
+
1556
+ ### Footnote
1557
+ ```js
1558
+ export const Footnote = {
1559
+ text: 'Footnote',
1560
+ extends: 'smbls.Footnote',
1561
+ };
1562
+ ```
1563
+
1564
+ ### Gif
1565
+ ```js
1566
+ export const Gif = {
1567
+ extends: 'smbls.Img',
1568
+ src: 'https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWpmZDl5OXVzZGNjeHpuenRhZmNidHYzdzJiMXlkMmc3ODZwaHo1NiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/PkL0rQzXvMICwoKZGK/giphy.gif',
1569
+ };
1570
+ ```
1571
+
1572
+ ### Grid
1573
+ ```js
1574
+ export const Grid = {
1575
+ extends: 'smbls.Flex',
1576
+ };
1577
+ ```
1578
+
1579
+ ### Group
1580
+ ```js
1581
+ export const Group = {
1582
+ Title: {
1583
+ text: 'Field Title',
1584
+ color: 'caption',
1585
+ userSelect: 'none',
1586
+ whiteSpace: 'nowrap',
1587
+ },
1588
+ flow: 'y',
1589
+ align: 'flex-start',
1590
+ gap: 'Y1',
1591
+ minWidth: 'F',
1592
+ childProps: {
1593
+ width: '100%',
1594
+ },
1595
+ };
1596
+ ```
1597
+
1598
+ ### GroupField
1599
+ ```js
1600
+ export const GroupField = {
1601
+ tag: 'label',
1602
+ extends: 'Group',
1603
+ };
1604
+ ```
1605
+
1606
+ ### H1
1607
+ ```js
1608
+ export const H1 = {
1609
+ extends: 'smbls.H1',
1610
+ text: 'It was the last day for our tribe, the year ends',
1611
+ };
1612
+ ```
1613
+
1614
+ ### H2
1615
+ ```js
1616
+ export const H2 = {
1617
+ extends: 'smbls.H2',
1618
+ text: 'It was the last day for our tribe, the year ends',
1619
+ };
1620
+ ```
1621
+
1622
+ ### H3
1623
+ ```js
1624
+ export const H3 = {
1625
+ extends: 'smbls.H3',
1626
+ text: 'It was the last day for our tribe, the year ends',
1627
+ };
1628
+ ```
1629
+
1630
+ ### H4
1631
+ ```js
1632
+ export const H4 = {
1633
+ extends: 'smbls.H4',
1634
+ text: 'It was the last day for our tribe, the year ends',
1635
+ };
1636
+ ```
1637
+
1638
+ ### H5
1639
+ ```js
1640
+ export const H5 = {
1641
+ extends: 'smbls.H5',
1642
+ text: 'It was the last day for our tribe, the year ends',
1643
+ };
1644
+ ```
1645
+
1646
+ ### H6
1647
+ ```js
1648
+ export const H6 = {
1649
+ extends: 'smbls.H6',
1650
+ text: 'It was the last day for our tribe, the year ends',
1651
+ };
1652
+ ```
1653
+
1654
+ ### Headline
1655
+ ```js
1656
+ export const Headline = {
1657
+ text: 'Headline',
1658
+ extends: 'smbls.Headline',
1659
+ };
1660
+ ```
1661
+
1662
+ ### Hgroup
1663
+ ```js
1664
+ export const Hgroup = {
1665
+ extends: 'smbls.Hgroup',
1666
+ };
1667
+ ```
1668
+
1669
+ ### HgroupSteps
1670
+ ```js
1671
+ export const HgroupSteps = {
1672
+ Hgroup: {
1673
+ gap: 'Y1',
1674
+ H: {
1675
+ tag: 'h4',
1676
+ text: 'Symbols',
1677
+ },
1678
+ P: {
1679
+ text: 'The easiest way to build your own website',
1680
+ },
1681
+ },
1682
+ ProgressStepSet: {
1683
+ childProps: {
1684
+ flex: '1',
1685
+ },
1686
+ },
1687
+ flow: 'column',
1688
+
1689
+ gap: 'A1',
1690
+
1691
+ minWidth: 'G1',
1692
+
1693
+ maxWidth: 'H',
1694
+ };
1695
+ ```
1696
+
1697
+ ### Hr
1698
+ ```js
1699
+ export const Hr = {
1700
+ extends: 'smbls.Hr',
1701
+ minWidth: 'F',
1702
+ };
1703
+ ```
1704
+
1705
+ ### HrLegend
1706
+ ```js
1707
+ export const HrLegend = {
1708
+ display: 'flex',
1709
+ text: 'Or',
1710
+ minWidth: 'G',
1711
+ fontWeight: '500',
1712
+ alignItems: 'center',
1713
+ gap: 'A',
1714
+ ':before': {
1715
+ content: '""',
1716
+ height: 'V',
1717
+ theme: 'dialog',
1718
+ round: 'C',
1719
+ flex: '1',
1720
+ },
1721
+ ':after': {
1722
+ content: '""',
1723
+ height: 'V',
1724
+ theme: 'dialog',
1725
+ round: 'C',
1726
+ flex: '1',
1727
+ },
1728
+ };
1729
+ ```
1730
+
1731
+ ### Icon
1732
+ ```js
1733
+ export const Icon = {
1734
+ extends: 'smbls.Icon',
1735
+ };
1736
+ ```
1737
+
1738
+ ### IconButton
1739
+ ```js
1740
+ export const IconButton = {
1741
+ Icon: {
1742
+ name: 'smile',
1743
+ fontSize: 'A2',
1744
+ },
1745
+ extends: 'Button',
1746
+ padding: 'A',
1747
+
1748
+ aspectRatio: '1 / 1',
1749
+
1750
+ boxSize: 'fit-content fit-content',
1751
+
1752
+ round: '100%',
1753
+
1754
+ boxSizing: 'content-box',
1755
+
1756
+ align: 'center center',
1757
+
1758
+ theme: 'dialog',
1759
+ };
1760
+ ```
1761
+
1762
+ ### IconButtonHeading
1763
+ ```js
1764
+ export const IconButtonHeading = {
1765
+ H: {
1766
+ tag: 'h5',
1767
+ text: 'Heading',
1768
+ },
1769
+ IconButton: {},
1770
+ align: 'center flex-start',
1771
+
1772
+ gap: 'Z',
1773
+ };
1774
+ ```
1775
+
1776
+ ### IconButtonHgroup
1777
+ ```js
1778
+ export const IconButtonHgroup = {
1779
+ Hgroup: {
1780
+ gap: 'X2',
1781
+ H: {
1782
+ tag: 'h6',
1783
+ text: 'Heading',
1784
+ },
1785
+ P: {},
1786
+ },
1787
+ IconButton: {
1788
+ theme: 'dialog',
1789
+ },
1790
+ align: 'flex-start flex-start',
1791
+
1792
+ gap: 'Z',
1793
+ };
1794
+ ```
1795
+
1796
+ ### IconButtonSet
1797
+ ```js
1798
+ export const IconButtonSet = {
1799
+ display: 'flex',
1800
+ childExtends: 'IconButton',
1801
+ gap: 'Z',
1802
+ childProps: {
1803
+ Icon: {},
1804
+ },
1805
+ children: [
1806
+ {
1807
+ Icon: {
1808
+ name: 'sun',
1809
+ },
1810
+ },
1811
+ {
1812
+ Icon: {
1813
+ name: 'moon',
1814
+ },
1815
+ },
1816
+ ],
1817
+ };
1818
+ ```
1819
+
1820
+ ### IconCounterButton
1821
+ ```js
1822
+ export const IconCounterButton = {
1823
+ extends: 'Button',
1824
+ position: 'relative',
1825
+ align: 'center flex-start',
1826
+ padding: 'Z Z Z Z1',
1827
+ minWidth: 'F',
1828
+ theme: 'field',
1829
+ gap: 'Z',
1830
+ Icon: {
1831
+ display: 'block',
1832
+ name: 'info',
1833
+ },
1834
+ Span: {
1835
+ text: 'Button',
1836
+ },
1837
+ NotificationCounter: {
1838
+ text: '7',
1839
+ margin: '- - - auto',
1840
+ },
1841
+ };
1842
+ ```
1843
+
1844
+ ### IconHeading
1845
+ ```js
1846
+ export const IconHeading = {
1847
+ Icon: {
1848
+ name: 'logo',
1849
+ fontSize: 'C',
1850
+ },
1851
+ H: {
1852
+ tag: 'h5',
1853
+ text: 'Heading',
1854
+ lineHeight: '1em',
1855
+ fontWeight: '700',
1856
+ },
1857
+ gap: 'Z',
1858
+
1859
+ align: 'center flex-start',
1860
+ };
1861
+ ```
1862
+
1863
+ ### IconHgroup
1864
+ ```js
1865
+ export const IconHgroup = {
1866
+ Icon: {
1867
+ name: 'logo',
1868
+ display: 'block',
1869
+ color: 'blue',
1870
+ margin: '- X - -',
1871
+ fontSize: 'E',
1872
+ },
1873
+ Hgroup: {
1874
+ gap: 'Y',
1875
+ H: {
1876
+ tag: 'h2',
1877
+ },
1878
+ P: {},
1879
+ },
1880
+ gap: 'X',
1881
+
1882
+ align: 'flex-start',
1883
+ };
1884
+ ```
1885
+
1886
+ ### IconInput
1887
+ ```js
1888
+ export const IconInput = {
1889
+ tag: 'label',
1890
+ Input: {
1891
+ flex: '1',
1892
+ round: 'C',
1893
+ placeholder: 'Placeholder',
1894
+ padding: 'Z2 C Z2 A2',
1895
+ maxHeight: '100%',
1896
+ },
1897
+ Icon: {
1898
+ name: 'info',
1899
+ position: 'absolute',
1900
+ zIndex: '2',
1901
+ right: 'Z2',
1902
+ },
1903
+ minWidth: 'G',
1904
+
1905
+ align: 'center flex-start',
1906
+
1907
+ round: 'D',
1908
+
1909
+ position: 'relative',
1910
+ };
1911
+ ```
1912
+
1913
+ ### IconText
1914
+ ```js
1915
+ export const IconText = {
1916
+ extends: 'smbls.IconText',
1917
+ };
1918
+ ```
1919
+
1920
+ ### IcontextLink
1921
+ ```js
1922
+ export const IcontextLink = {
1923
+ text: 'Follow Symbols',
1924
+ Icon: {
1925
+ fontSize: 'B',
1926
+ name: 'logo',
1927
+ },
1928
+ extends: [
1929
+ 'Link',
1930
+ 'IconText',
1931
+ ],
1932
+ gap: 'Y',
1933
+
1934
+ maxHeight: '3em',
1935
+
1936
+ cursor: 'pointer',
1937
+
1938
+ round: 'D',
1939
+
1940
+ fontWeight: '500',
1941
+ };
1942
+ ```
1943
+
1944
+ ### IconTextSet
1945
+ ```js
1946
+ export const IconTextSet = {
1947
+ childExtends: [
1948
+ 'IconText',
1949
+ 'Flex',
1950
+ ],
1951
+ flow: 'y',
1952
+ gap: 'A',
1953
+ childProps: {
1954
+ align: 'center flex-start',
1955
+ gap: 'Y1',
1956
+ Icon: {},
1957
+ },
1958
+ children: [
1959
+ {
1960
+ Icon: {
1961
+ name: 'smile',
1962
+ },
1963
+ text: '+1 (555) 123-4567',
1964
+ },
1965
+ {
1966
+ Icon: {
1967
+ name: 'logo',
1968
+ },
1969
+ text: 'example@mail.com',
1970
+ },
1971
+ ],
1972
+ };
1973
+ ```
1974
+
1975
+ ### Img
1976
+ ```js
1977
+ export const Img = {
1978
+ extends: 'smbls.Img',
1979
+ src: 'https://placehold.co/200',
1980
+ };
1981
+ ```
1982
+
1983
+ ### ImgButton
1984
+ ```js
1985
+ export const ImgButton = {
1986
+ Img: {
1987
+ src: 'https://api.symbols.app/core/files/public/69325cf7ebee5529e0391f0b/download',
1988
+ boxSize: 'C1 D2',
1989
+ },
1990
+ extends: 'Button',
1991
+ theme: 'transparent',
1992
+
1993
+ padding: '0',
1994
+
1995
+ round: 'Z2',
1996
+
1997
+ overflow: 'hidden',
1998
+ };
1999
+ ```
2000
+
2001
+ ### ImgHeading
2002
+ ```js
2003
+ export const ImgHeading = {
2004
+ Img: {
2005
+ src: 'https://files-production-symbols-platform-development-en-d5-u3-p7x0.based.dev/fibd6dc13e/64be440c-ae12-4942-8da7-d772e06cb76c-b3013bf0-701c-4aff-b439-55d412265b2a-25215bc5-652d-40a7-8c99-af865865b74e.jpeg',
2006
+ widthL: 'auto',
2007
+ maxWidth: 'C',
2008
+ maxHeight: 'C',
2009
+ round: 'Z2',
2010
+ },
2011
+ H: {
2012
+ tag: 'h4',
2013
+ text: 'Heading',
2014
+ },
2015
+ align: 'center flex-start',
2016
+
2017
+ gap: 'Y1',
2018
+ };
2019
+ ```
2020
+
2021
+ ### ImgHeadingButton
2022
+ ```js
2023
+ export const ImgHeadingButton = {
2024
+ Img: {
2025
+ src: 'https://api.symbols.app/core/files/public/69325cf7ebee5529e0391f0b/download',
2026
+ boxSize: 'C1 D2',
2027
+ round: 'Z2',
2028
+ },
2029
+ H: {
2030
+ tag: 'h6',
2031
+ text: 'Heading',
2032
+ },
2033
+ extends: 'Button',
2034
+ theme: 'transparent',
2035
+
2036
+ flow: 'y',
2037
+
2038
+ gap: 'Z',
2039
+
2040
+ padding: '0',
2041
+
2042
+ round: '0',
2043
+ };
2044
+ ```
2045
+
2046
+ ### ImgHgroup
2047
+ ```js
2048
+ export const ImgHgroup = {
2049
+ Img: {
2050
+ src: 'https://api.symbols.app/core/files/public/69325cf7ebee5529e0391f0b/download',
2051
+ boxSize: 'C+Y1 C2',
2052
+ round: 'Z',
2053
+ margin: '-Y - - -',
2054
+ },
2055
+ Hgroup: {
2056
+ gap: 'W2',
2057
+ H: {
2058
+ tag: 'h5',
2059
+ },
2060
+ P: {},
2061
+ },
2062
+ align: 'center flex-start',
2063
+
2064
+ gap: 'Y1',
2065
+ };
2066
+ ```
2067
+
2068
+ ### InputButton
2069
+ ```js
2070
+ export const InputButton = {
2071
+ Input: {
2072
+ placeholder: 'Enter your email',
2073
+ minWidth: 'G+B1',
2074
+ },
2075
+ Button: {
2076
+ text: 'Sign up',
2077
+ theme: 'primary',
2078
+ },
2079
+ gap: 'Y2',
2080
+ align: 'center flex-start',
2081
+ height: 'C+X',
2082
+ '> *': {
2083
+ height: '100%',
2084
+ minHeight: '100%',
2085
+ maxHeight: '100%',
2086
+ },
2087
+ };
2088
+ ```
2089
+
2090
+ ### Italic
2091
+ ```js
2092
+ export const Italic = {
2093
+ text: 'Italic text',
2094
+ extends: 'smbls.Italic',
2095
+ };
2096
+ ```
2097
+
2098
+ ### KangorooButton
2099
+ ```js
2100
+ export const KangorooButton = {
2101
+ extends: 'Button',
2102
+ childExtends: 'IconText',
2103
+ padding: 'X',
2104
+ gap: 'A',
2105
+ };
2106
+ ```
2107
+
2108
+ ### LayerSimple
2109
+ ```js
2110
+ export const LayerSimple = {
2111
+ Title: {
2112
+ text: 'Checklist',
2113
+ },
2114
+ Flex: {
2115
+ flow: 'column',
2116
+ gap: 'A',
2117
+ childProps: {
2118
+ gap: 'X',
2119
+ align: 'center',
2120
+ },
2121
+ childExtends: {
2122
+ Icon: {
2123
+ color: 'inactive',
2124
+ gap: 'Y1',
2125
+ },
2126
+ Span: {
2127
+ color: 'white',
2128
+ padding: '- - - X2',
2129
+ },
2130
+ },
2131
+ children: () => [{
2132
+ Icon: {
2133
+ icon: 'check',
2134
+ },
2135
+ Span: {
2136
+ text: 'Sun',
2137
+ },
2138
+ },
2139
+ {
2140
+ Icon: {
2141
+ icon: 'check',
2142
+ },
2143
+ Span: {
2144
+ text: 'Moon',
2145
+ },
2146
+ },
2147
+ ],
2148
+ },
2149
+ extends: 'Group',
2150
+ padding: 'Z A A A',
2151
+
2152
+ margin: 'C -',
2153
+
2154
+ round: 'Z',
2155
+
2156
+ gap: 'A',
2157
+
2158
+ width: 'F1',
2159
+
2160
+ background: 'gray',
2161
+ };
2162
+ ```
2163
+
2164
+ ### Link
2165
+ ```js
2166
+ export const Link = {
2167
+ text: 'Link',
2168
+ extends: 'smbls.Link',
2169
+ };
2170
+ ```
2171
+
2172
+ ### LinkHgroup
2173
+ ```js
2174
+ export const LinkHgroup = {
2175
+ Hgroup: {
2176
+ gap: 'X2',
2177
+ H: {
2178
+ tag: 'h2',
2179
+ text: 'Tbilisi',
2180
+ },
2181
+ P: {
2182
+ text: '35 Vazha-pshavela avenue.',
2183
+ },
2184
+ },
2185
+ Link: {
2186
+ text: 'Get direction',
2187
+ },
2188
+ flow: 'y',
2189
+
2190
+ gap: 'Z',
2191
+ };
2192
+ ```
2193
+
2194
+ ### LinkParagraph
2195
+ ```js
2196
+ export const LinkParagraph = {
2197
+ display: 'flex',
2198
+ P: {
2199
+ text: 'You are agree',
2200
+ color: 'caption',
2201
+ margin: '0',
2202
+ },
2203
+ Link: {
2204
+ padding: '0',
2205
+ theme: 'transparent',
2206
+ text: 'Privacy policy',
2207
+ textDecoration: 'underline',
2208
+ fontWeight: '400',
2209
+ },
2210
+ alignItems: 'center',
2211
+
2212
+ gap: 'X2',
2213
+ };
2214
+ ```
2215
+
2216
+ ### LinkSet
2217
+ ```js
2218
+ export const LinkSet = {
2219
+ tag: 'nav',
2220
+ childExtends: 'Link',
2221
+ align: 'center flex-start',
2222
+ gap: 'A',
2223
+ childProps: {
2224
+ cursor: 'pointer',
2225
+ },
2226
+ children: [
2227
+ {
2228
+ text: 'Link 1',
2229
+ },
2230
+ {
2231
+ text: 'Link 2',
2232
+ },
2233
+ ],
2234
+ };
2235
+ ```
2236
+
2237
+ ### ListingItem
2238
+ ```js
2239
+ export const ListingItem = {
2240
+ display: 'flex',
2241
+ IconText: {
2242
+ color: 'paragraph',
2243
+ flow: 'column',
2244
+ gap: 'Z',
2245
+ padding: '0',
2246
+ tag: 'button',
2247
+ background: 'transparent',
2248
+ border: '0',
2249
+ fontSize: 'A',
2250
+ cursor: 'pointer',
2251
+ margin: 'W - -',
2252
+ Icon: {
2253
+ name: 'check',
2254
+ color: 'dim',
2255
+ '.isActive': {
2256
+ color: 'orange',
2257
+ },
2258
+ },
2259
+ '!isActive': {
2260
+ ':hover svg': {
2261
+ color: 'disabled',
2262
+ },
2263
+ },
2264
+ onClick: (ev, el, s) => {
2265
+ const isActive = s.isActive
2266
+ s.update({
2267
+ isActive: !isActive,
2268
+ upvotes: isActive ? s.upvotes - 1 : s.upvotes + 1
2269
+ })
2270
+ },
2271
+ },
2272
+ Hgroup: {
2273
+ H: {
2274
+ extends: 'Link',
2275
+ tag: 'h6',
2276
+ text: 'Flexbox in Editor',
2277
+ fontWeight: '700',
2278
+ },
2279
+ P: {
2280
+ text: null,
2281
+ childProps: {
2282
+ display: 'inline',
2283
+ },
2284
+ children: [
2285
+ 'by ',
2286
+ {
2287
+ Link: {
2288
+ text: 'kiaynwang',
2289
+ },
2290
+ },
2291
+ ' ',
2292
+ {
2293
+ Link: {
2294
+ text: '3 hours ago',
2295
+ },
2296
+ },
2297
+ ' . ',
2298
+ {
2299
+ Link: {
2300
+ text: '49 commnts',
2301
+ },
2302
+ },
2303
+ ],
2304
+ },
2305
+ },
2306
+ gap: 'A2',
2307
+
2308
+ alignItems: 'flex-start',
2309
+ };
2310
+ ```
2311
+
2312
+ ### LoadingGif
2313
+ ```js
2314
+ export const LoadingGif = {
2315
+ extends: 'Img',
2316
+ src: 'https://assets.symbo.ls/loading.gif',
2317
+ width: '3.2em',
2318
+ pointerEvents: 'none',
2319
+ opacity: '.35',
2320
+ zIndex: '-1',
2321
+ inCenter: true,
2322
+ '.inCenter': {
2323
+ position: 'absolute',
2324
+ top: '50%',
2325
+ left: '50%',
2326
+ transform: 'translate3d(-50%, -50%, 0)',
2327
+ },
2328
+ };
2329
+ ```
2330
+
2331
+ ### MessageModal
2332
+ ```js
2333
+ export const MessageModal = {
2334
+ Hgroup: {
2335
+ gap: 'A',
2336
+ H: {
2337
+ text: 'Message',
2338
+ },
2339
+ P: {
2340
+ text: 'Yes. If you change your mind and no longer wish to keep your iPhone, you have the option to return it to us. The returned iPhone must be in good condition and in the original packaging, which contains all accessories, manuals and instructions. Returns are subject to Apple\'s Sales and Refunds Policy.',
2341
+ },
2342
+ },
2343
+ IconButton: {
2344
+ Icon: {
2345
+ name: 'x',
2346
+ },
2347
+ },
2348
+ extends: 'Modal',
2349
+ maxWidth: 'H',
2350
+ };
2351
+ ```
2352
+
2353
+ ### Modal
2354
+ ```js
2355
+ export const Modal = {
2356
+ Hgroup: {
2357
+ gap: 'X1',
2358
+ H: {
2359
+ tag: 'h5',
2360
+ fontWeight: '700',
2361
+ },
2362
+ P: {},
2363
+ },
2364
+ IconButton: {
2365
+ position: 'absolute',
2366
+ right: 'X2',
2367
+ top: 'X2',
2368
+ round: '100%',
2369
+ $isSafari: {
2370
+ top: 'Z2',
2371
+ right: 'Z2',
2372
+ },
2373
+ Icon: {
2374
+ name: 'x',
2375
+ },
2376
+ },
2377
+ boxSize: 'fit-content',
2378
+
2379
+ align: 'stretch flex-start',
2380
+
2381
+ minWidth: 'G+B',
2382
+
2383
+ position: 'relative',
2384
+
2385
+ round: 'B',
2386
+
2387
+ theme: 'dialog',
2388
+
2389
+ flow: 'y',
2390
+
2391
+ padding: 'A2 A2 A1 A2',
2392
+
2393
+ borderStyle: 'none',
2394
+ };
2395
+ ```
2396
+
2397
+ ### NavigationArrows
2398
+ ```js
2399
+ export const NavigationArrows = {
2400
+ display: 'flex',
2401
+ childExtends: 'IconButton',
2402
+ gap: 'Z',
2403
+ childProps: {
2404
+ round: '100%',
2405
+ },
2406
+ children: [
2407
+ {
2408
+ Icon: {
2409
+ name: 'chevronLeft',
2410
+ },
2411
+ },
2412
+ {
2413
+ Icon: {
2414
+ name: 'chevronRight',
2415
+ },
2416
+ },
2417
+ ],
2418
+ };
2419
+ ```
2420
+
2421
+ ### NavigationDots
2422
+ ```js
2423
+ export const NavigationDots = {
2424
+ display: 'flex',
2425
+ tag: 'nav',
2426
+ childExtends: 'Link',
2427
+ gap: 'C1',
2428
+ childProps: {
2429
+ boxSize: 'Z',
2430
+ theme: 'dialog',
2431
+ round: '100%',
2432
+ cursor: 'pointer',
2433
+ text: '',
2434
+ '.isActive': {
2435
+ theme: 'primary',
2436
+ },
2437
+ ':active': {
2438
+ theme: 'primary',
2439
+ },
2440
+ },
2441
+ children: [
2442
+ {},
2443
+ {
2444
+ isActive: true,
2445
+ },
2446
+ ],
2447
+ };
2448
+ ```
2449
+
2450
+ ### NotCounterParagraph
2451
+ ```js
2452
+ export const NotCounterParagraph = {
2453
+ P: {
2454
+ margin: '0',
2455
+ text: `Hey team, I've finished the re...`,
2456
+ color: 'paragraph',
2457
+ maxWidth: 'E3+D1',
2458
+ overflow: 'hidden',
2459
+ },
2460
+ NotificationCounter: {},
2461
+ align: 'center space-between',
2462
+
2463
+ gap: 'B',
2464
+ };
2465
+ ```
2466
+
2467
+ ### NotificationCounter
2468
+ ```js
2469
+ export const NotificationCounter = {
2470
+ text: '3',
2471
+ widthRange: 'A',
2472
+
2473
+ theme: 'primary',
2474
+
2475
+ round: '100%',
2476
+
2477
+ aspectRatio: '1 / 1',
2478
+
2479
+ padding: 'W2',
2480
+
2481
+ lineHeight: '1em',
2482
+
2483
+ boxSizing: 'content-box',
2484
+
2485
+ align: 'center center',
2486
+ };
2487
+ ```
2488
+
2489
+ ### NumberPicker
2490
+ ```js
2491
+ export const NumberPicker = {
2492
+ state: {
2493
+ currentValue: 0,
2494
+ },
2495
+ Minus: {
2496
+ extends: 'IconButton',
2497
+ Icon: {
2498
+ name: 'minus',
2499
+ },
2500
+ onClick: (event, element, state) => {
2501
+ if (state.currentValue <= 0) return
2502
+ state.update({
2503
+ currentValue: state.currentValue - 1
2504
+ })
2505
+ },
2506
+ },
2507
+ Value: {
2508
+ text: '{{ currentValue }}',
2509
+ },
2510
+ Plus: {
2511
+ extends: 'IconButton',
2512
+ Icon: {
2513
+ name: 'plus',
2514
+ },
2515
+ onClick: (event, element, state) => {
2516
+ state.update({
2517
+ currentValue: state.currentValue + 1
2518
+ })
2519
+ },
2520
+ },
2521
+ align: 'center flex-start',
2522
+ gap: 'Z',
2523
+ '> button': {
2524
+ theme: 'transparent',
2525
+ },
2526
+ };
2527
+ ```
2528
+
2529
+ ### P
2530
+ ```js
2531
+ export const P = {
2532
+ extends: 'smbls.P',
2533
+ text: 'It was the last day for our tribe, the year ends',
2534
+ };
2535
+ ```
2536
+
2537
+ ### PackageFeatureItem
2538
+ ```js
2539
+ export const PackageFeatureItem = {
2540
+ display: 'flex',
2541
+ tag: 'label',
2542
+ Input: {
2543
+ display: 'none',
2544
+ type: 'checkbox',
2545
+ ':checked + hgroup': {
2546
+ outline: '1.5px solid #0079FD',
2547
+ },
2548
+ },
2549
+ Hgroup: {
2550
+ width: '100%',
2551
+ padding: 'A1',
2552
+ round: 'A1',
2553
+ outline: '1.5px, solid, --color-line-dark',
2554
+ Icon: {
2555
+ order: '-1',
2556
+ margin: '- - A2',
2557
+ name: 'logo',
2558
+ },
2559
+ },
2560
+ cursor: 'pointer',
2561
+ };
2562
+ ```
2563
+
2564
+ ### Pagination
2565
+ ```js
2566
+ export const Pagination = {
2567
+ Left: {
2568
+ extends: 'IconButton',
2569
+ Icon: {
2570
+ name: 'chevronLeft',
2571
+ },
2572
+ onClick: (event, element, state) => {
2573
+ state.update({})
2574
+ },
2575
+ },
2576
+ Flex: {
2577
+ gap: 'Z',
2578
+ childProps: {
2579
+ aspectRatio: '1 / 1',
2580
+ boxSize: 'C+Y2 C+Y2',
2581
+ round: '100%',
2582
+ padding: 'A',
2583
+ theme: 'field',
2584
+ isActive: (element, state) => state.active === parseInt(element.key),
2585
+ '.isActive': {
2586
+ theme: 'primary',
2587
+ },
2588
+ },
2589
+ childExtends: 'Button',
2590
+ children: [
2591
+ {
2592
+ text: '1',
2593
+ },
2594
+ {
2595
+ text: '2',
2596
+ },
2597
+ {
2598
+ text: '3',
2599
+ },
2600
+ {
2601
+ text: '4',
2602
+ },
2603
+ {
2604
+ text: '5',
2605
+ },
2606
+ ],
2607
+ },
2608
+ Right: {
2609
+ extends: 'IconButton',
2610
+ Icon: {
2611
+ name: 'chevronRight',
2612
+ },
2613
+ onClick: (event, element, state) => {
2614
+ state.update({})
2615
+ },
2616
+ },
2617
+ gap: 'A',
2618
+
2619
+ align: 'center flex-start',
2620
+ };
2621
+ ```
2622
+
2623
+ ### Pills
2624
+ ```js
2625
+ export const Pills = {
2626
+ display: 'flex',
2627
+ childExtends: 'Link',
2628
+ gap: 'C1',
2629
+ childProps: {
2630
+ boxSize: 'Z',
2631
+ round: '100%',
2632
+ cursor: 'pointer',
2633
+ text: '',
2634
+ '.isActive': {
2635
+ theme: 'primary',
2636
+ },
2637
+ '!isActive': {
2638
+ theme: 'tertiary',
2639
+ },
2640
+ ':active': {
2641
+ theme: 'primary',
2642
+ },
2643
+ },
2644
+ children: [
2645
+ {},
2646
+ {
2647
+ isActive: true,
2648
+ },
2649
+ ],
2650
+ tag: 'nav',
2651
+ };
2652
+ ```
2653
+
2654
+ ### Progress
2655
+ ```js
2656
+ export const Progress = {
2657
+ tag: 'progress',
2658
+ attr: {
2659
+ max: ({
2660
+ props
2661
+ }) => props.max,
2662
+ progress: ({
2663
+ props
2664
+ }) => props.progress,
2665
+ value: ({
2666
+ props
2667
+ }) => props.value,
2668
+ },
2669
+ height: 'X',
2670
+ minWidth: 'F3',
2671
+ round: 'Y',
2672
+ overflow: 'hidden',
2673
+ '::-webkit-progress-bar': {
2674
+ '@dark': {
2675
+ background: 'gray',
2676
+ },
2677
+ '@light': {
2678
+ background: 'hurricane',
2679
+ },
2680
+ },
2681
+ '::-webkit-progress-value': {
2682
+ borderRadius: 'Y',
2683
+ theme: 'primary',
2684
+ },
2685
+ };
2686
+ ```
2687
+
2688
+ ### ProgressStepSet
2689
+ ```js
2690
+ export const ProgressStepSet = {
2691
+ display: 'flex',
2692
+ childExtends: 'Progress',
2693
+ gap: 'A',
2694
+ childProps: {
2695
+ minWidth: 'C',
2696
+ },
2697
+ children: [
2698
+ {
2699
+ value: 0.7,
2700
+ },
2701
+ {},
2702
+ ],
2703
+ };
2704
+ ```
2705
+
2706
+ ### RadioCaption
2707
+ ```js
2708
+ export const RadioCaption = {
2709
+ Caption: {
2710
+ text: 'Caption',
2711
+ },
2712
+ Radio: {
2713
+ Input: {},
2714
+ FLex: {
2715
+ ':after': {},
2716
+ },
2717
+ },
2718
+ align: 'center flex-start',
2719
+
2720
+ gap: 'Z',
2721
+ };
2722
+ ```
2723
+
2724
+ ### RadioCaptionList
2725
+ ```js
2726
+ export const RadioCaptionList = {
2727
+ childExtends: 'RadioCaption',
2728
+ flow: 'y',
2729
+ gap: 'B',
2730
+ childProps: {
2731
+ Caption: {
2732
+ text: 'Caption',
2733
+ },
2734
+ Radio: {
2735
+ Input: {},
2736
+ FLex: {
2737
+ ':after': {},
2738
+ },
2739
+ },
2740
+ },
2741
+ children: [
2742
+ {},
2743
+ {},
2744
+ ],
2745
+ };
2746
+ ```
2747
+
2748
+ ### RadioHgroup
2749
+ ```js
2750
+ export const RadioHgroup = {
2751
+ display: 'flex',
2752
+ Hgroup: {
2753
+ gap: 'W2',
2754
+ H: {
2755
+ tag: 'h6',
2756
+ },
2757
+ P: {},
2758
+ },
2759
+ Radio: {
2760
+ Input: {},
2761
+ FLex: {
2762
+ ':after': {},
2763
+ },
2764
+ },
2765
+ gap: 'Z',
2766
+ };
2767
+ ```
2768
+
2769
+ ### RadioHgroupList
2770
+ ```js
2771
+ export const RadioHgroupList = {
2772
+ childExtends: 'RadioHgroup',
2773
+ flow: 'y',
2774
+ gap: 'B',
2775
+ childProps: {
2776
+ Hgroup: {
2777
+ gap: 'W2',
2778
+ H: {
2779
+ tag: 'h6',
2780
+ },
2781
+ P: {},
2782
+ },
2783
+ Radio: {
2784
+ Input: {},
2785
+ FLex: {
2786
+ ':after': {},
2787
+ },
2788
+ },
2789
+ },
2790
+ children: [
2791
+ {},
2792
+ {},
2793
+ ],
2794
+ };
2795
+ ```
2796
+
2797
+ ### RadioMark
2798
+ ```js
2799
+ export const RadioMark = {
2800
+ padding: 'Z1',
2801
+ theme: 'primary',
2802
+ round: '100%',
2803
+ boxSize: 'fit-content',
2804
+ ':after': {
2805
+ content: '""',
2806
+ boxSize: 'Z1',
2807
+ background: 'white',
2808
+ round: '100%',
2809
+ display: 'block',
2810
+ },
2811
+ };
2812
+ ```
2813
+
2814
+ ### RadioStep
2815
+ ```js
2816
+ export const RadioStep = {
2817
+ RadioMark: {
2818
+ theme: 'field',
2819
+ '.isActive': {
2820
+ theme: 'primary',
2821
+ },
2822
+ ':after': {},
2823
+ },
2824
+ H6: {
2825
+ text: 'Step',
2826
+ },
2827
+ Progress: {
2828
+ minWidth: 'E',
2829
+ maxWidth: 'E',
2830
+ value: 0,
2831
+ height: 'V',
2832
+ margin: '- - - W',
2833
+ '.isActive': {
2834
+ value: 1,
2835
+ },
2836
+ },
2837
+ align: 'center flex-start',
2838
+
2839
+ gap: 'Y2',
2840
+ };
2841
+ ```
2842
+
2843
+ ### RadioSteps
2844
+ ```js
2845
+ export const RadioSteps = {
2846
+ display: 'flex',
2847
+ childExtends: 'RadioStep',
2848
+ gap: 'Z1',
2849
+ childProps: {
2850
+ RadioMark: {},
2851
+ Progress: {},
2852
+ ':last-child > progress': {
2853
+ hide: true,
2854
+ },
2855
+ },
2856
+ children: [
2857
+ {
2858
+ RadioMark: {
2859
+ isActive: true,
2860
+ },
2861
+ },
2862
+ {},
2863
+ ],
2864
+ };
2865
+ ```
2866
+
2867
+ ### ScrollableList
2868
+ ```js
2869
+ export const ScrollableList = {
2870
+ tag: 'nav',
2871
+ Flex: {
2872
+ maxHeight: 'D2',
2873
+ overflowY: 'auto',
2874
+ flow: 'y',
2875
+ padding: 'Z -',
2876
+ style: {
2877
+ listStyleType: 'none',
2878
+ '::-webkit-scrollbar': {
2879
+ display: 'none',
2880
+ },
2881
+ },
2882
+ childProps: {
2883
+ padding: 'Y1 A',
2884
+ cursor: 'pointer',
2885
+ align: 'flex-start',
2886
+ textAlign: 'left',
2887
+ fontWeight: '700',
2888
+ round: '0',
2889
+ theme: 'dialog',
2890
+ fontSize: 'C',
2891
+ ':hover': {
2892
+ theme: 'dialog-elevated',
2893
+ },
2894
+ },
2895
+ childExtends: 'Button',
2896
+ children: [
2897
+ {
2898
+ text: 'Item One',
2899
+ },
2900
+ {
2901
+ text: 'Item Two',
2902
+ },
2903
+ ],
2904
+ },
2905
+ position: 'relative',
2906
+ overflow: 'hidden',
2907
+ theme: 'field',
2908
+ round: 'A2',
2909
+ minWidth: 'F1',
2910
+ ':before, &:after': {
2911
+ content: '""',
2912
+ position: 'absolute',
2913
+ boxSize: 'B 100%',
2914
+ zIndex: '2',
2915
+ left: '0',
2916
+ pointerEvents: 'none',
2917
+ },
2918
+ ':before': {
2919
+ top: '0',
2920
+ '@light': {
2921
+ background: 'linear-gradient(to bottom, #ebecf2 0%, transparent 100%)',
2922
+ },
2923
+ '@dark': {
2924
+ background: 'linear-gradient(to bottom, #171717 0%, transparent 100%)',
2925
+ },
2926
+ },
2927
+ ':after': {
2928
+ bottom: '-3px',
2929
+ '@light': {
2930
+ background: 'linear-gradient(to top, #ebecf2 0%, transparent 100%)',
2931
+ },
2932
+ '@dark': {
2933
+ background: 'linear-gradient(to top, #171717 0%, transparent 100%)',
2934
+ },
2935
+ },
2936
+ };
2937
+ ```
2938
+
2939
+ ### Scrollbar
2940
+ ```js
2941
+ export const Scrollbar = {
2942
+ display: 'flex',
2943
+ TrackContainer: {
2944
+ opacity: 1,
2945
+ transition: 'A defaultBezier opacity',
2946
+ flex: '1',
2947
+ margin: '- C1 - -',
2948
+ position: 'relative',
2949
+ background: 'red',
2950
+ height: 'fit-content',
2951
+ alignSelf: 'center',
2952
+ Track: {
2953
+ position: 'absolute',
2954
+ theme: 'field',
2955
+ round: 'A',
2956
+ height: '2px',
2957
+ background: '#d9d7d7 .5',
2958
+ left: '0',
2959
+ transformOrigin: 'left',
2960
+ width: '15%',
2961
+ },
2962
+ },
2963
+ NavigationArrows: {
2964
+ childProps: {
2965
+ padding: 'Z Z',
2966
+ Icon: {
2967
+ fontSize: 'B1',
2968
+ },
2969
+ },
2970
+ },
2971
+ minWidth: 'I',
2972
+ };
2973
+ ```
2974
+
2975
+ ### Search
2976
+ ```js
2977
+ export const Search = {
2978
+ tag: 'search',
2979
+ Input: {
2980
+ type: 'search',
2981
+ placeholder: 'Type a command or search',
2982
+ width: '100%',
2983
+ padding: 'Z2 C+W2 Z2 A2',
2984
+ theme: 'transparent',
2985
+ ':focus ~ button': {
2986
+ opacity: '1',
2987
+ },
2988
+ },
2989
+ Icon: {
2990
+ name: 'search',
2991
+ position: 'absolute',
2992
+ right: 'Z+W2',
2993
+ fontSize: 'B',
2994
+ },
2995
+ minWidth: 'G+A2',
2996
+
2997
+ gap: 'Z',
2998
+
2999
+ theme: 'field',
3000
+
3001
+ round: 'D2',
3002
+
3003
+ align: 'center flex-start',
3004
+
3005
+ position: 'relative',
3006
+ };
3007
+ ```
3008
+
3009
+ ### SearchDropdown
3010
+ ```js
3011
+ export const SearchDropdown = {
3012
+ state: {
3013
+ isOpen: false,
3014
+ selected: 'Search and Select',
3015
+ data: [
3016
+ 'Los Angeles',
3017
+ 'New York',
3018
+ 'San Fransisco',
3019
+ 'San Diego',
3020
+ ],
3021
+ filtered: [
3022
+ ],
3023
+ searchValue: '',
3024
+ },
3025
+ SelectedContainer: {
3026
+ text: '{{ selected }}',
3027
+ padding: 'Z A2',
3028
+ minHeight: 'B2',
3029
+ position: 'relative',
3030
+ cursor: 'pointer',
3031
+ color: 'caption',
3032
+ isSelected: (el, s) => s.selected !== 'Search and Select',
3033
+ '.isSelected': {
3034
+ color: 'blue',
3035
+ },
3036
+ onClick: (e, el, s) => s.toggle('isOpen'),
3037
+ },
3038
+ Options: {
3039
+ show: (el, s) => s.isOpen,
3040
+ borderWidth: '1px 0 0 0',
3041
+ borderStyle: 'solid',
3042
+ borderColor: 'line .35',
3043
+ padding: 'Z Z2',
3044
+ theme: 'dialog',
3045
+ flexFlow: 'y',
3046
+ round: '0 0 A2 A2',
3047
+ Input: {
3048
+ theme: 'field-dialog',
3049
+ placeholder: 'Search and Select',
3050
+ padding: 'Y2 A',
3051
+ margin: '- -Y',
3052
+ display: 'block',
3053
+ minWidth: '',
3054
+ boxSizing: 'border-box',
3055
+ border: 'none',
3056
+ outline: 'none',
3057
+ onInput: (e, el, state) => {
3058
+ const value = e.target.value.trim().toLowerCase()
3059
+ const filtered = state.data.filter(item =>
3060
+ item.toLowerCase().includes(value))
3061
+ state.replace({
3062
+ searchValue: value,
3063
+ filtered: filtered
3064
+ })
3065
+ },
3066
+ },
3067
+ Results: {
3068
+ marginTop: 'X',
3069
+ show: (el, s) => !!s.searchValue && s.filtered.length,
3070
+ children: (el, s) => s.filtered,
3071
+ childrenAs: 'state',
3072
+ childProps: {
3073
+ padding: 'Z',
3074
+ text: '{{ value }}',
3075
+ onClick: (ev, el, s) => {
3076
+ s.parent.update({
3077
+ selected: s.value,
3078
+ isOpen: false,
3079
+ searchValue: '',
3080
+ })
3081
+ },
3082
+ },
3083
+ },
3084
+ Placeholder: {
3085
+ padding: 'Z',
3086
+ show: (el, s) => !s.searchValue,
3087
+ text: 'Enter name to search',
3088
+ color: 'disabled',
3089
+ },
3090
+ NoResults: {
3091
+ padding: 'Z',
3092
+ show: (el, s) => !!s.searchValue && !s.filtered.length,
3093
+ text: 'No results found',
3094
+ color: 'disabled',
3095
+ },
3096
+ },
3097
+ position: 'relative',
3098
+
3099
+ width: 'G3',
3100
+
3101
+ theme: 'field',
3102
+
3103
+ round: 'A2',
3104
+ };
3105
+ ```
3106
+
3107
+ ### SearchDropdown_copy
3108
+ ```js
3109
+ export const SearchDropdown_copy = {
3110
+ state: {
3111
+ isOpen: false,
3112
+ selected: 'Search and Select',
3113
+ data: [
3114
+ 'Los Angeles',
3115
+ 'New York',
3116
+ 'San Fransisco',
3117
+ 'San Diego',
3118
+ ],
3119
+ filtered: [
3120
+ ],
3121
+ searchValue: '',
3122
+ },
3123
+ SelectedContainer: {
3124
+ text: '{{ selected }}',
3125
+ padding: 'Z A2',
3126
+ background: '#f5f5f5',
3127
+ color: 'black',
3128
+ borderBottom: '1px solid #ccc',
3129
+ minHeight: 'B2',
3130
+ position: 'relative',
3131
+ cursor: 'pointer',
3132
+ isSelected: (el, s) => s.selected !== 'Search and Select',
3133
+ '.isSelected': {
3134
+ color: 'title',
3135
+ },
3136
+ onClick: (e, el, s) => s.toggle('isOpen'),
3137
+ },
3138
+ Options: {
3139
+ show: (el, s) => s.isOpen,
3140
+ borderWidth: '1px 0 0 0',
3141
+ borderStyle: 'solid',
3142
+ borderColor: 'line .35',
3143
+ padding: 'Z Z2',
3144
+ theme: 'dialog',
3145
+ flexFlow: 'y',
3146
+ round: '0 0 A2 A2',
3147
+ Input: {
3148
+ theme: 'field-dialog',
3149
+ placeholder: 'Search and Select',
3150
+ padding: 'Y2 A',
3151
+ margin: '- -Y',
3152
+ display: 'block',
3153
+ minWidth: '',
3154
+ boxSizing: 'border-box',
3155
+ border: 'none',
3156
+ outline: 'none',
3157
+ onInput: (e, el, state) => {
3158
+ const value = e.target.value.trim().toLowerCase()
3159
+ const filtered = state.data.filter(item =>
3160
+ item.toLowerCase().includes(value))
3161
+ state.replace({
3162
+ searchValue: value,
3163
+ filtered: filtered
3164
+ })
3165
+ },
3166
+ },
3167
+ Results: {
3168
+ marginTop: 'X',
3169
+ show: (el, s) => !!s.searchValue && s.filtered.length,
3170
+ children: (el, s) => s.filtered,
3171
+ childrenAs: 'state',
3172
+ childProps: {
3173
+ padding: 'Z',
3174
+ text: '{{ value }}',
3175
+ onClick: (ev, el, s) => {
3176
+ s.parent.update({
3177
+ selected: s.value,
3178
+ isOpen: false,
3179
+ searchValue: '',
3180
+ })
3181
+ },
3182
+ },
3183
+ },
3184
+ Placeholder: {
3185
+ padding: 'Z',
3186
+ show: (el, s) => !s.searchValue,
3187
+ text: 'Enter name to search',
3188
+ color: 'disabled',
3189
+ },
3190
+ NoResults: {
3191
+ padding: 'Z',
3192
+ show: (el, s) => !!s.searchValue && !s.filtered.length,
3193
+ text: 'No results found',
3194
+ color: 'disabled',
3195
+ },
3196
+ },
3197
+ color: 'black',
3198
+
3199
+ position: 'relative',
3200
+
3201
+ width: 'G3',
3202
+
3203
+ theme: 'field',
3204
+
3205
+ round: 'A2',
3206
+ };
3207
+ ```
3208
+
3209
+ ### SectionHeader
3210
+ ```js
3211
+ export const SectionHeader = {
3212
+ display: 'flex',
3213
+ tag: 'header',
3214
+ Hgroup: {},
3215
+ IconButtonSet: {},
3216
+ gap: 'C1',
3217
+ };
3218
+ ```
3219
+
3220
+ ### Select
3221
+ ```js
3222
+ export const Select = {
3223
+ extends: 'smbls.Select',
3224
+ };
3225
+ ```
3226
+
3227
+ ### SelectField
3228
+ ```js
3229
+ export const SelectField = {
3230
+ Select: {
3231
+ children: [
3232
+ {
3233
+ value: '',
3234
+ text: 'Select one...',
3235
+ },
3236
+ {
3237
+ value: 'mazda',
3238
+ text: 'Mazda',
3239
+ },
3240
+ {
3241
+ value: 'bmw',
3242
+ text: 'BMW',
3243
+ },
3244
+ ],
3245
+ },
3246
+ Icon: {
3247
+ margin: '- Z2 - -',
3248
+ },
3249
+ extends: 'SelectPicker',
3250
+ theme: 'field',
3251
+
3252
+ minWidth: 'G',
3253
+
3254
+ padding: 'A A1',
3255
+
3256
+ round: 'D',
3257
+ };
3258
+ ```
3259
+
3260
+ ### SelectHgroup
3261
+ ```js
3262
+ export const SelectHgroup = {
3263
+ display: 'flex',
3264
+ Hgroup: {
3265
+ gap: 'V2',
3266
+ H: {
3267
+ tag: 'h6',
3268
+ },
3269
+ P: {},
3270
+ },
3271
+ SelectPicker: {
3272
+ margin: '- - - auto',
3273
+ Select: {
3274
+ children: () => [{
3275
+ value: 'Goat',
3276
+ },
3277
+ {
3278
+ value: 'Icon',
3279
+ },
3280
+ ],
3281
+ },
3282
+ },
3283
+ gap: 'C',
3284
+ };
3285
+ ```
3286
+
3287
+ ### SelectPicker
3288
+ ```js
3289
+ export const SelectPicker = {
3290
+ tag: 'label',
3291
+ round: '0',
3292
+ align: 'center flex-start',
3293
+ position: 'relative',
3294
+ Select: {
3295
+ fontSize: 'A',
3296
+ boxSize: '100%',
3297
+ padding: '- B+V2 - -',
3298
+ cursor: 'pointer',
3299
+ outline: 'none',
3300
+ appearance: 'none',
3301
+ flex: '1',
3302
+ zIndex: '2',
3303
+ lineHeight: 1,
3304
+ border: 'none',
3305
+ background: 'none',
3306
+ pointerEvents: 'All',
3307
+ color: 'title',
3308
+ ':focus-visible': {
3309
+ outline: 'none',
3310
+ },
3311
+ children: [
3312
+ {
3313
+ text: 'Nikoloza',
3314
+ value: 'Nikoloza',
3315
+ },
3316
+ {
3317
+ text: 'Svinchy',
3318
+ value: 'Svinchy',
3319
+ },
3320
+ ],
3321
+ childProps: {
3322
+ tag: 'option',
3323
+ },
3324
+ },
3325
+ Icon: {
3326
+ name: 'chevronDown',
3327
+ position: 'absolute',
3328
+ right: '0',
3329
+ margin: 'V - - -',
3330
+ fontSize: 'B',
3331
+ },
3332
+ };
3333
+ ```
3334
+
3335
+ ### SquareButton
3336
+ ```js
3337
+ export const SquareButton = {
3338
+ extends: 'Button',
3339
+ fontSize: 'A',
3340
+ width: 'A',
3341
+ padding: 'Z',
3342
+ aspectRatio: '1 / 1',
3343
+ icon: 'smile',
3344
+ boxSize: 'fit-content fit-content',
3345
+ justifyContent: 'center',
3346
+ round: 'Z',
3347
+ boxSizing: 'content-box',
3348
+ };
3349
+ ```
3350
+
3351
+ ### Stars
3352
+ ```js
3353
+ export const Stars = {
3354
+ display: 'flex',
3355
+ childExtends: 'Icon',
3356
+ fontSize: 'B',
3357
+ gap: 'W',
3358
+ children: [
3359
+ {
3360
+ name: 'star',
3361
+ },
3362
+ {
3363
+ name: 'star',
3364
+ },
3365
+ {
3366
+ name: 'star',
3367
+ },
3368
+ {
3369
+ name: 'star',
3370
+ },
3371
+ {
3372
+ name: 'star',
3373
+ },
3374
+ ],
3375
+ };
3376
+ ```
3377
+
3378
+ ### StatusDot
3379
+ ```js
3380
+ export const StatusDot = {
3381
+ widthRange: 'A+W',
3382
+ aspectRatio: '1/1',
3383
+ theme: 'success',
3384
+ round: '100%',
3385
+ '@dark': {
3386
+ border: 'solid codGray',
3387
+ borderWidth: 'X1',
3388
+ },
3389
+ '@light': {
3390
+ border: 'solid concrete',
3391
+ borderWidth: 'X1',
3392
+ },
3393
+ };
3394
+ ```
3395
+
3396
+ ### StoryCard
3397
+ ```js
3398
+ export const StoryCard = {
3399
+ display: 'flex',
3400
+ Img: {
3401
+ src: 'https://files-production-symbols-platform-development-en-d5-u3-p7x0.based.dev/fibd6dc13e/64be440c-ae12-4942-8da7-d772e06cb76c-b3013bf0-701c-4aff-b439-55d412265b2a-25215bc5-652d-40a7-8c99-af865865b74e.jpeg',
3402
+ boxSize: '100%',
3403
+ zIndex: '2',
3404
+ round: 'A',
3405
+ },
3406
+ Icon: {
3407
+ icon: 'smile',
3408
+ position: 'absolute',
3409
+ zIndex: '2',
3410
+ top: '35%',
3411
+ left: '50%',
3412
+ fontSize: 'J1+F1',
3413
+ transform: 'translate(-50%, -50%)',
3414
+ color: 'white',
3415
+ },
3416
+ HgroupSteps: {
3417
+ position: 'absolute',
3418
+ bottom: '0',
3419
+ left: '0',
3420
+ zIndex: '2',
3421
+ minWidth: '100%',
3422
+ maxWidth: '100%',
3423
+ round: '0',
3424
+ padding: 'B1',
3425
+ theme: 'field',
3426
+ Hgroup: {
3427
+ H: {
3428
+ text: 'Symbols',
3429
+ },
3430
+ P: {
3431
+ color: 'white .65',
3432
+ },
3433
+ },
3434
+ ProgressStepSet: {
3435
+ childProps: {
3436
+ theme: 'field-dialog',
3437
+ },
3438
+ children: () => [{}, {}],
3439
+ },
3440
+ },
3441
+ position: 'relative',
3442
+
3443
+ round: 'B2',
3444
+
3445
+ boxSize: 'H1 G3',
3446
+
3447
+ alignSelf: 'flex-start',
3448
+
3449
+ overflow: 'hidden',
3450
+ };
3451
+ ```
3452
+
3453
+ ### Strong
3454
+ ```js
3455
+ export const Strong = {
3456
+ text: 'Strong text',
3457
+ extends: 'smbls.Strong',
3458
+ };
3459
+ ```
3460
+
3461
+ ### Subhead
3462
+ ```js
3463
+ export const Subhead = {
3464
+ text: 'Subhead',
3465
+ extends: 'smbls.Subhead',
3466
+ };
3467
+ ```
3468
+
3469
+ ### SubmitButton
3470
+ ```js
3471
+ export const SubmitButton = {
3472
+ extends: 'Input',
3473
+ type: 'submit',
3474
+
3475
+ value: 'Submit',
3476
+
3477
+ padding: 'Z2 B',
3478
+ };
3479
+ ```
3480
+
3481
+ ### TabSet
3482
+ ```js
3483
+ export const TabSet = {
3484
+ display: 'flex',
3485
+ childExtends: 'Button',
3486
+ padding: 'V2+V2',
3487
+ round: 'D',
3488
+ background: 'gray .1',
3489
+ width: 'fit-content',
3490
+ children: [
3491
+ {
3492
+ text: 'build',
3493
+ isActive: true,
3494
+ theme: 'dialog-elevated',
3495
+ },
3496
+ {
3497
+ text: 'test',
3498
+ },
3499
+ ],
3500
+ childProps: {
3501
+ Icon: null,
3502
+ round: 'D',
3503
+ fontWeight: '400',
3504
+ padding: 'Z B1',
3505
+ textTransform: 'capitalize',
3506
+ '.isActive': {
3507
+ theme: 'document',
3508
+ },
3509
+ theme: 'transparent',
3510
+ },
3511
+ };
3512
+ ```
3513
+
3514
+ ### TextareaIconButton
3515
+ ```js
3516
+ export const TextareaIconButton = {
3517
+ display: 'flex',
3518
+ Textarea: {
3519
+ minHeight: 'C+Y',
3520
+ maxHeight: 'C+Y',
3521
+ minWidth: 'G1',
3522
+ round: 'D',
3523
+ padding: 'A A A A2',
3524
+ },
3525
+ IconButton: {
3526
+ theme: 'primary',
3527
+ Icon: {
3528
+ name: 'send',
3529
+ },
3530
+ },
3531
+ gap: 'Y1',
3532
+ };
3533
+ ```
3534
+
3535
+ ### ToggleCaption
3536
+ ```js
3537
+ export const ToggleCaption = {
3538
+ Caption: {
3539
+ text: 'Caption',
3540
+ },
3541
+ Toggle: {
3542
+ Input: {},
3543
+ Flex: {
3544
+ ':after': {},
3545
+ },
3546
+ },
3547
+ align: 'center flex-start',
3548
+
3549
+ gap: 'Z',
3550
+ };
3551
+ ```
3552
+
3553
+ ### ToggleCaptionList
3554
+ ```js
3555
+ export const ToggleCaptionList = {
3556
+ childExtends: 'ToggleCaption',
3557
+ flow: 'y',
3558
+ gap: 'B',
3559
+ childProps: {
3560
+ Caption: {
3561
+ text: 'Caption',
3562
+ },
3563
+ Toggle: {
3564
+ Input: {},
3565
+ Flex: {
3566
+ ':after': {},
3567
+ },
3568
+ },
3569
+ },
3570
+ children: [
3571
+ {},
3572
+ {},
3573
+ ],
3574
+ };
3575
+ ```
3576
+
3577
+ ### ToggleHgroup
3578
+ ```js
3579
+ export const ToggleHgroup = {
3580
+ display: 'flex',
3581
+ Hgroup: {
3582
+ gap: 'W2',
3583
+ H: {
3584
+ tag: 'h6',
3585
+ },
3586
+ P: {},
3587
+ },
3588
+ Toggle: {
3589
+ margin: '- - - auto',
3590
+ Input: {},
3591
+ Flex: {
3592
+ after: {},
3593
+ },
3594
+ },
3595
+ gap: 'Z',
3596
+ };
3597
+ ```
3598
+
3599
+ ### ToggleHgroupList
3600
+ ```js
3601
+ export const ToggleHgroupList = {
3602
+ childExtends: 'ToggleHgroup',
3603
+ flow: 'y',
3604
+ gap: 'B',
3605
+ childProps: {
3606
+ Hgroup: {
3607
+ gap: 'W2',
3608
+ H: {
3609
+ tag: 'h6',
3610
+ },
3611
+ P: {},
3612
+ },
3613
+ Toggle: {
3614
+ margin: '- - - auto',
3615
+ Input: {},
3616
+ Flex: {
3617
+ after: {},
3618
+ },
3619
+ },
3620
+ },
3621
+ children: [
3622
+ {},
3623
+ {},
3624
+ ],
3625
+ };
3626
+ ```
3627
+
3628
+ ### U
3629
+ ```js
3630
+ export const U = {
3631
+ text: 'Underlined text',
3632
+ extends: 'smbls.Underline',
3633
+ };
3634
+ ```
3635
+
3636
+ ### UnitValue
3637
+ ```js
3638
+ export const UnitValue = {
3639
+ Unit: {
3640
+ text: '$',
3641
+ },
3642
+ Value: {
3643
+ text: '73',
3644
+ },
3645
+ align: 'center flex-start',
3646
+ gap: 'V',
3647
+ childProps: {
3648
+ lineHeight: '1em',
3649
+ color: 'title',
3650
+ },
3651
+ };
3652
+ ```
3653
+
3654
+ ### UploadButton
3655
+ ```js
3656
+ export const UploadButton = {
3657
+ text: 'Choose file',
3658
+ Input: {
3659
+ type: 'file',
3660
+ padding: '0',
3661
+ inset: '0 0 0 0',
3662
+ position: 'absolute',
3663
+ boxSize: '100% 100%',
3664
+ cursor: 'pointer',
3665
+ top: '0',
3666
+ left: '0',
3667
+ opacity: '0',
3668
+ },
3669
+ extends: 'Button',
3670
+ position: 'relative',
3671
+
3672
+ padding: '0',
3673
+
3674
+ cursor: 'pointer',
3675
+
3676
+ theme: 'transparent',
3677
+
3678
+ color: 'blue',
3679
+ };
3680
+ ```
3681
+
3682
+ ### UploadIconButton
3683
+ ```js
3684
+ export const UploadIconButton = {
3685
+ Icon: {
3686
+ name: 'upload',
3687
+ },
3688
+ Input: {
3689
+ type: 'file',
3690
+ padding: '0',
3691
+ inset: '0 0 0 0',
3692
+ position: 'absolute',
3693
+ boxSize: '100% 100%',
3694
+ cursor: 'pointer',
3695
+ top: '0',
3696
+ left: '0',
3697
+ opacity: '0',
3698
+ },
3699
+ extends: 'IconButton',
3700
+ position: 'relative',
3701
+
3702
+ padding: '0',
3703
+
3704
+ cursor: 'pointer',
3705
+ };
3706
+ ```
3707
+
3708
+ ### UserNavbar
3709
+ ```js
3710
+ export const UserNavbar = {
3711
+ AvatarStatus: {
3712
+ margin: '-W - - -',
3713
+ Avatar: {},
3714
+ Status: {},
3715
+ },
3716
+ Hgroup: {
3717
+ gap: 'W',
3718
+ H: {
3719
+ tag: 'h5',
3720
+ text: 'Nika Tomadze',
3721
+ },
3722
+ P: {
3723
+ text: 'active now',
3724
+ },
3725
+ },
3726
+ IconButtonSet: {
3727
+ margin: '- - - auto',
3728
+ childProps: {
3729
+ Icon: {},
3730
+ },
3731
+ children: () => [{}, {}],
3732
+ },
3733
+ minWidth: 'G2',
3734
+
3735
+ align: 'center flex-start',
3736
+
3737
+ gap: 'Z',
3738
+ };
3739
+ ```
3740
+
3741
+ ### ValueCircleProgress
3742
+ ```js
3743
+ export const ValueCircleProgress = {
3744
+ CircleProgress: {
3745
+ ':after': {},
3746
+ },
3747
+ UnitValue: {
3748
+ position: 'absolute',
3749
+ top: '50%',
3750
+ left: '50%',
3751
+ transform: 'translate(-50%, -50%)',
3752
+ flow: 'row-reverse',
3753
+ zIndex: '5',
3754
+ gap: 'V',
3755
+ Value: {
3756
+ text: '73',
3757
+ },
3758
+ Unit: {
3759
+ text: '%',
3760
+ },
3761
+ },
3762
+ border: '2',
3763
+ };
3764
+ ```
3765
+
3766
+ ### ValueHeading
3767
+ ```js
3768
+ export const ValueHeading = {
3769
+ H: {
3770
+ tag: 'h6',
3771
+ text: 'Kobe Bryant',
3772
+ },
3773
+ UnitValue: {
3774
+ margin: '- - - auto',
3775
+ Unit: {},
3776
+ Value: {},
3777
+ },
3778
+ minWidth: 'F3',
3779
+
3780
+ align: 'center space-between',
3781
+ };
3782
+ ```
3783
+
3784
+ ### ValueProgress
3785
+ ```js
3786
+ export const ValueProgress = {
3787
+ Progress: {
3788
+ maxWidth: '100%',
3789
+ flex: '1',
3790
+ value: 0.73,
3791
+ },
3792
+ UnitValue: {
3793
+ flow: 'row-reverse',
3794
+ color: 'paragraph',
3795
+ Value: {
3796
+ text: '73',
3797
+ },
3798
+ Unit: {
3799
+ text: '%',
3800
+ },
3801
+ },
3802
+ align: 'center flex-start',
3803
+
3804
+ gap: 'Y2',
3805
+ };
3806
+ ```
3807
+
3808
+ ### Video
3809
+ ```js
3810
+ export const Video = {
3811
+ extends: 'smbls.Video',
3812
+ src: 'https://examplefiles.org/files/video/mp4-example-video-download-640x480.mp4',
3813
+ };
3814
+ ```
3815
+
3816
+ ---
3817
+
3818
+ ## Pages
3819
+
3820
+ The pages index exports an empty object:
3821
+
3822
+ ```js
3823
+ export default {
3824
+
3825
+ }
3826
+ ```
3827
+
3828
+ ---
3829
+
3830
+ ## Functions
3831
+
3832
+ ### functions/index.js
3833
+ ```js
3834
+ export * from './fibonacciNumberByIndex.js';
3835
+ export * from './fibonacciNumberByIndexCopy.js';
3836
+ ```
3837
+
3838
+ ### fibonacciNumberByIndex
3839
+ ```js
3840
+ export const fibonacciNumberByIndex = {};
3841
+ ```
3842
+
3843
+ ### fibonacciNumberByIndexCopy
3844
+ ```js
3845
+ export const fibonacciNumberByIndexCopy = {};
3846
+ ```
3847
+
3848
+ ---
3849
+
3850
+ ## Snippets
3851
+
3852
+ The snippets index is empty (no exported snippets).
3853
+
3854
+ ```js
3855
+ // empty
3856
+ ```