@profpowell/vb-design-system 0.1.0

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.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/dist/vb-design-system.css +993 -0
  4. package/dist/vb-design-system.js +4482 -0
  5. package/dist/vb-design-system.min.css +1 -0
  6. package/dist/vb-design-system.min.js +513 -0
  7. package/package.json +78 -0
  8. package/src/index.css +21 -0
  9. package/src/index.js +24 -0
  10. package/src/lib/bundle-registry.js +156 -0
  11. package/src/lib/vb-element.js +96 -0
  12. package/src/patterns/do-dont.css +86 -0
  13. package/src/patterns/token-table.css +67 -0
  14. package/src/utils/copy-init.js +287 -0
  15. package/src/web-components/accessibility-specimen/api.json +51 -0
  16. package/src/web-components/accessibility-specimen/logic.js +232 -0
  17. package/src/web-components/accessibility-specimen/static.html +41 -0
  18. package/src/web-components/accessibility-specimen/styles.css +156 -0
  19. package/src/web-components/brand-specimen/api.json +37 -0
  20. package/src/web-components/brand-specimen/logic.js +61 -0
  21. package/src/web-components/brand-specimen/static.html +77 -0
  22. package/src/web-components/brand-specimen/styles.css +10 -0
  23. package/src/web-components/breakpoint-specimen/api.json +44 -0
  24. package/src/web-components/breakpoint-specimen/logic.js +186 -0
  25. package/src/web-components/breakpoint-specimen/static.html +38 -0
  26. package/src/web-components/breakpoint-specimen/styles.css +180 -0
  27. package/src/web-components/color-palette/api.json +73 -0
  28. package/src/web-components/color-palette/logic.js +280 -0
  29. package/src/web-components/color-palette/static.html +54 -0
  30. package/src/web-components/color-palette/styles.css +113 -0
  31. package/src/web-components/color-picker/_color-utils.js +210 -0
  32. package/src/web-components/component-sampler/api.json +15 -0
  33. package/src/web-components/component-sampler/logic.js +120 -0
  34. package/src/web-components/component-sampler/static.html +47 -0
  35. package/src/web-components/component-sampler/styles.css +9 -0
  36. package/src/web-components/font-pairer/_font-data.js +95 -0
  37. package/src/web-components/font-pairer/api.json +56 -0
  38. package/src/web-components/font-pairer/logic.js +401 -0
  39. package/src/web-components/font-pairer/static.html +9 -0
  40. package/src/web-components/font-pairer/styles.css +10 -0
  41. package/src/web-components/gradient-builder/_gradient-utils.js +54 -0
  42. package/src/web-components/gradient-builder/api.json +63 -0
  43. package/src/web-components/gradient-builder/logic.js +261 -0
  44. package/src/web-components/gradient-builder/static.html +9 -0
  45. package/src/web-components/gradient-builder/styles.css +10 -0
  46. package/src/web-components/icon-set/api.json +39 -0
  47. package/src/web-components/icon-set/logic.js +133 -0
  48. package/src/web-components/icon-set/static.html +36 -0
  49. package/src/web-components/icon-set/styles.css +82 -0
  50. package/src/web-components/icon-specimen/api.json +46 -0
  51. package/src/web-components/icon-specimen/logic.js +67 -0
  52. package/src/web-components/icon-specimen/static.html +39 -0
  53. package/src/web-components/icon-specimen/styles.css +38 -0
  54. package/src/web-components/layout-specimen/api.json +12 -0
  55. package/src/web-components/layout-specimen/logic.js +219 -0
  56. package/src/web-components/layout-specimen/static.html +22 -0
  57. package/src/web-components/layout-specimen/styles.css +95 -0
  58. package/src/web-components/motion-specimen/api.json +54 -0
  59. package/src/web-components/motion-specimen/logic.js +146 -0
  60. package/src/web-components/motion-specimen/static.html +13 -0
  61. package/src/web-components/motion-specimen/styles.css +29 -0
  62. package/src/web-components/palette-generator/_palette-utils.js +133 -0
  63. package/src/web-components/palette-generator/api.json +79 -0
  64. package/src/web-components/palette-generator/logic.js +288 -0
  65. package/src/web-components/palette-generator/static.html +47 -0
  66. package/src/web-components/palette-generator/styles.css +36 -0
  67. package/src/web-components/semantic-palette/_color-math.js +149 -0
  68. package/src/web-components/semantic-palette/api.json +41 -0
  69. package/src/web-components/semantic-palette/logic.js +400 -0
  70. package/src/web-components/semantic-palette/static.html +42 -0
  71. package/src/web-components/semantic-palette/styles.css +20 -0
  72. package/src/web-components/spacing-specimen/api.json +63 -0
  73. package/src/web-components/spacing-specimen/logic.js +132 -0
  74. package/src/web-components/spacing-specimen/static.html +71 -0
  75. package/src/web-components/spacing-specimen/styles.css +58 -0
  76. package/src/web-components/theme-catalog/api.json +14 -0
  77. package/src/web-components/theme-catalog/logic.js +228 -0
  78. package/src/web-components/theme-catalog/static.html +15 -0
  79. package/src/web-components/theme-export/api.json +18 -0
  80. package/src/web-components/theme-export/dtcg-serialize.js +417 -0
  81. package/src/web-components/theme-export/logic.js +201 -0
  82. package/src/web-components/theme-export/static.html +12 -0
  83. package/src/web-components/theme-export/theme-css-parse.js +93 -0
  84. package/src/web-components/theme-import/api.json +14 -0
  85. package/src/web-components/theme-import/catalog/atlassian.tokens.json +303 -0
  86. package/src/web-components/theme-import/catalog/bootstrap.tokens.json +304 -0
  87. package/src/web-components/theme-import/catalog/carbon.tokens.json +301 -0
  88. package/src/web-components/theme-import/catalog/catppuccin-mocha.tokens.json +301 -0
  89. package/src/web-components/theme-import/catalog/govuk.tokens.json +301 -0
  90. package/src/web-components/theme-import/catalog/manifest.json +132 -0
  91. package/src/web-components/theme-import/catalog/material.tokens.json +289 -0
  92. package/src/web-components/theme-import/catalog/salesforce.tokens.json +301 -0
  93. package/src/web-components/theme-import/catalog/tailwind.tokens.json +302 -0
  94. package/src/web-components/theme-import/dtcg-deserialize.js +322 -0
  95. package/src/web-components/theme-import/logic.js +263 -0
  96. package/src/web-components/theme-import/static.html +15 -0
  97. package/src/web-components/token-specimen/api.json +24 -0
  98. package/src/web-components/token-specimen/logic.js +256 -0
  99. package/src/web-components/token-specimen/static.html +47 -0
  100. package/src/web-components/token-specimen/styles.css +10 -0
  101. package/src/web-components/type-specimen/api.json +91 -0
  102. package/src/web-components/type-specimen/logic.js +156 -0
  103. package/src/web-components/type-specimen/static.html +84 -0
  104. package/src/web-components/type-specimen/styles.css +131 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Tiny CSS parser for VB theme files.
3
+ *
4
+ * Pulls token declarations out of the `:root[data-theme~="{slug}"]` and
5
+ * the dark-mode override block from a single theme CSS file. Used by
6
+ * the build (Phase 2) to emit DTCG artifacts and by the round-trip
7
+ * regression tests.
8
+ *
9
+ * No DOM, no css parser dep. Walks braces to find block boundaries;
10
+ * uses a small regex over the block body for `--name: value;`
11
+ * declarations. Doesn't resolve `var()`, doesn't expand `light-dark()` —
12
+ * preserves the source-literal form which is exactly what DTCG export
13
+ * wants (the literal goes into $extensions, the resolved form into
14
+ * $value).
15
+ */
16
+
17
+ /**
18
+ * Extract the body of `:root[data-theme~="{slug}"]` (without the dark-mode
19
+ * variant). Walks braces so nested rules don't confuse the boundary.
20
+ * Returns '' if no matching block is found.
21
+ *
22
+ * @param {string} css
23
+ * @param {string} slug
24
+ * @returns {string}
25
+ */
26
+ export function extractBaseBlock(css, slug) {
27
+ return findBlock(css, `data-theme~="${slug}"]`, { excludeMode: true });
28
+ }
29
+
30
+ /**
31
+ * Extract the body of `[data-theme~="{slug}"][data-mode="dark"]` if present.
32
+ * Returns '' if no dark override block exists.
33
+ *
34
+ * @param {string} css
35
+ * @param {string} slug
36
+ * @returns {string}
37
+ */
38
+ export function extractDarkBlock(css, slug) {
39
+ return findBlock(css, `data-theme~="${slug}"][data-mode="dark"]`, {});
40
+ }
41
+
42
+ /**
43
+ * Pull `--name: value;` declarations out of a CSS block body.
44
+ * Stops a value at the next `;`, `{`, or `}` so nested rules are skipped
45
+ * cleanly. Brand themes don't nest token declarations; extreme themes
46
+ * occasionally do — this handles both.
47
+ *
48
+ * @param {string} blockBody
49
+ * @returns {Array<[string, string]>}
50
+ */
51
+ export function parseDeclarations(blockBody) {
52
+ /** @type {[string, string][]} */
53
+ const out = [];
54
+ const re = /(--[\w-]+)\s*:\s*([^;{}]+);/g;
55
+ let m;
56
+ while ((m = re.exec(blockBody)) !== null) {
57
+ out.push([m[1], m[2].trim()]);
58
+ }
59
+ return out;
60
+ }
61
+
62
+ /* ---------- internals ---------- */
63
+
64
+ function findBlock(css, selectorPattern, { excludeMode = false } = {}) {
65
+ let searchFrom = 0;
66
+ while (searchFrom < css.length) {
67
+ const idx = css.indexOf(selectorPattern, searchFrom);
68
+ if (idx === -1) return '';
69
+
70
+ // When extracting the base block, skip variants like
71
+ // [data-theme~="x"][data-mode="dark"] and any other compound selector.
72
+ if (excludeMode) {
73
+ const after = css.slice(idx + selectorPattern.length, idx + selectorPattern.length + 3);
74
+ if (after.startsWith('[')) {
75
+ searchFrom = idx + selectorPattern.length;
76
+ continue;
77
+ }
78
+ }
79
+
80
+ const braceStart = css.indexOf('{', idx);
81
+ if (braceStart === -1) return '';
82
+
83
+ let depth = 1;
84
+ let pos = braceStart + 1;
85
+ while (pos < css.length && depth > 0) {
86
+ if (css[pos] === '{') depth++;
87
+ else if (css[pos] === '}') depth--;
88
+ pos++;
89
+ }
90
+ return css.slice(braceStart + 1, pos - 1);
91
+ }
92
+ return '';
93
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "../../../schemas/api.schema.json",
3
+ "element": "theme-import",
4
+ "type": "web-component",
5
+ "description": "Apply a DTCG (Design Tokens Community Group, stable 2025.10) tokens.json file to a preview scope. Sibling of <theme-export>. Three input modes: paste, file, URL. Round-trip lossless for VB-authored DTCG via $extensions['com.vanilla-breeze'].",
6
+ "attributes": [
7
+ { "name": "target", "kind": "host-api", "purpose": "config", "type": "string", "default": "#preview", "description": "CSS selector for the scope to apply tokens to. Tokens are written as inline custom properties on this element." },
8
+ { "name": "placeholder", "kind": "host-api", "purpose": "config", "type": "string", "description": "Textarea placeholder for the paste input." }
9
+ ],
10
+ "events": [
11
+ { "name": "theme-import:applied", "description": "Fired after tokens are applied. detail: { tokens, applied, ignored, source }" },
12
+ { "name": "theme-import:error", "description": "Fired when parse / fetch / apply fails. detail: { error, phase }" }
13
+ ]
14
+ }
@@ -0,0 +1,303 @@
1
+ {
2
+ "color": {
3
+ "primary": {
4
+ "$type": "color",
5
+ "$value": {
6
+ "colorSpace": "srgb",
7
+ "components": [
8
+ 0,
9
+ 0.3216,
10
+ 0.8
11
+ ],
12
+ "hex": "#0052cc"
13
+ }
14
+ },
15
+ "primary-hover": {
16
+ "$type": "color",
17
+ "$value": {
18
+ "colorSpace": "srgb",
19
+ "components": [
20
+ 0.0275,
21
+ 0.2784,
22
+ 0.651
23
+ ],
24
+ "hex": "#0747a6"
25
+ }
26
+ },
27
+ "primary-active": {
28
+ "$type": "color",
29
+ "$value": {
30
+ "colorSpace": "srgb",
31
+ "components": [
32
+ 0.0196,
33
+ 0.2275,
34
+ 0.5451
35
+ ],
36
+ "hex": "#053a8b"
37
+ }
38
+ },
39
+ "secondary": {
40
+ "$type": "color",
41
+ "$value": {
42
+ "colorSpace": "srgb",
43
+ "components": [
44
+ 0.2588,
45
+ 0.3216,
46
+ 0.4314
47
+ ],
48
+ "hex": "#42526e"
49
+ }
50
+ },
51
+ "accent": {
52
+ "$type": "color",
53
+ "$value": {
54
+ "colorSpace": "srgb",
55
+ "components": [
56
+ 0.3961,
57
+ 0.3294,
58
+ 0.7529
59
+ ],
60
+ "hex": "#6554c0"
61
+ }
62
+ },
63
+ "background": {
64
+ "$type": "color",
65
+ "$value": {
66
+ "colorSpace": "srgb",
67
+ "components": [
68
+ 0.9804,
69
+ 0.9843,
70
+ 0.9882
71
+ ],
72
+ "hex": "#fafbfc"
73
+ }
74
+ },
75
+ "surface": {
76
+ "$type": "color",
77
+ "$value": {
78
+ "colorSpace": "srgb",
79
+ "components": [
80
+ 1,
81
+ 1,
82
+ 1
83
+ ],
84
+ "hex": "#ffffff"
85
+ }
86
+ },
87
+ "surface-raised": {
88
+ "$type": "color",
89
+ "$value": {
90
+ "colorSpace": "srgb",
91
+ "components": [
92
+ 0.9569,
93
+ 0.9608,
94
+ 0.9686
95
+ ],
96
+ "hex": "#f4f5f7"
97
+ }
98
+ },
99
+ "surface-sunken": {
100
+ "$type": "color",
101
+ "$value": {
102
+ "colorSpace": "srgb",
103
+ "components": [
104
+ 0.9216,
105
+ 0.9255,
106
+ 0.9412
107
+ ],
108
+ "hex": "#ebecf0"
109
+ }
110
+ },
111
+ "border": {
112
+ "$type": "color",
113
+ "$value": {
114
+ "colorSpace": "srgb",
115
+ "components": [
116
+ 0.8745,
117
+ 0.8824,
118
+ 0.902
119
+ ],
120
+ "hex": "#dfe1e6"
121
+ }
122
+ },
123
+ "border-subtle": {
124
+ "$type": "color",
125
+ "$value": {
126
+ "colorSpace": "srgb",
127
+ "components": [
128
+ 0.9216,
129
+ 0.9255,
130
+ 0.9412
131
+ ],
132
+ "hex": "#ebecf0"
133
+ }
134
+ },
135
+ "text": {
136
+ "$type": "color",
137
+ "$value": {
138
+ "colorSpace": "srgb",
139
+ "components": [
140
+ 0.0902,
141
+ 0.1686,
142
+ 0.302
143
+ ],
144
+ "hex": "#172b4d"
145
+ }
146
+ },
147
+ "text-muted": {
148
+ "$type": "color",
149
+ "$value": {
150
+ "colorSpace": "srgb",
151
+ "components": [
152
+ 0.3686,
153
+ 0.4235,
154
+ 0.5176
155
+ ],
156
+ "hex": "#5e6c84"
157
+ }
158
+ },
159
+ "text-on-primary": {
160
+ "$type": "color",
161
+ "$value": {
162
+ "colorSpace": "srgb",
163
+ "components": [
164
+ 1,
165
+ 1,
166
+ 1
167
+ ],
168
+ "hex": "#ffffff"
169
+ }
170
+ },
171
+ "error": {
172
+ "$type": "color",
173
+ "$value": {
174
+ "colorSpace": "srgb",
175
+ "components": [
176
+ 0.8706,
177
+ 0.2078,
178
+ 0.0431
179
+ ],
180
+ "hex": "#de350b"
181
+ }
182
+ },
183
+ "success": {
184
+ "$type": "color",
185
+ "$value": {
186
+ "colorSpace": "srgb",
187
+ "components": [
188
+ 0,
189
+ 0.5294,
190
+ 0.3529
191
+ ],
192
+ "hex": "#00875a"
193
+ }
194
+ },
195
+ "warning": {
196
+ "$type": "color",
197
+ "$value": {
198
+ "colorSpace": "srgb",
199
+ "components": [
200
+ 1,
201
+ 0.6706,
202
+ 0
203
+ ],
204
+ "hex": "#ffab00"
205
+ }
206
+ },
207
+ "info": {
208
+ "$type": "color",
209
+ "$value": {
210
+ "colorSpace": "srgb",
211
+ "components": [
212
+ 0,
213
+ 0.3961,
214
+ 1
215
+ ],
216
+ "hex": "#0065ff"
217
+ }
218
+ }
219
+ },
220
+ "typography": {
221
+ "family": {
222
+ "sans": {
223
+ "$type": "fontFamily",
224
+ "$value": [
225
+ "Charlie Display",
226
+ "-apple-system",
227
+ "BlinkMacSystemFont",
228
+ "Inter",
229
+ "sans-serif"
230
+ ]
231
+ }
232
+ },
233
+ "size": {
234
+ "md": {
235
+ "$type": "dimension",
236
+ "$value": {
237
+ "value": 0.875,
238
+ "unit": "rem"
239
+ }
240
+ }
241
+ },
242
+ "lineHeight": {
243
+ "normal": {
244
+ "$type": "number",
245
+ "$value": 1.4286
246
+ }
247
+ }
248
+ },
249
+ "border": {
250
+ "radius": {
251
+ "xs": {
252
+ "$type": "dimension",
253
+ "$value": {
254
+ "value": 0.1875,
255
+ "unit": "rem"
256
+ }
257
+ },
258
+ "s": {
259
+ "$type": "dimension",
260
+ "$value": {
261
+ "value": 0.1875,
262
+ "unit": "rem"
263
+ }
264
+ },
265
+ "m": {
266
+ "$type": "dimension",
267
+ "$value": {
268
+ "value": 0.1875,
269
+ "unit": "rem"
270
+ }
271
+ },
272
+ "l": {
273
+ "$type": "dimension",
274
+ "$value": {
275
+ "value": 0.25,
276
+ "unit": "rem"
277
+ }
278
+ },
279
+ "xl": {
280
+ "$type": "dimension",
281
+ "$value": {
282
+ "value": 0.5,
283
+ "unit": "rem"
284
+ }
285
+ }
286
+ }
287
+ },
288
+ "$extensions": {
289
+ "com.vanilla-breeze": {
290
+ "spec": "2025.10",
291
+ "vbVersion": "catalog-2026-05-15",
292
+ "catalog": true,
293
+ "source": {
294
+ "name": "Atlassian Design Tokens",
295
+ "homepage": "https://atlassian.design/",
296
+ "tokenSource": "https://atlassian.design/components/tokens/",
297
+ "license": "Apache-2.0",
298
+ "attribution": "© Atlassian Pty Ltd. Atlassian Design System.",
299
+ "syncedAt": "2026-05-15"
300
+ }
301
+ }
302
+ }
303
+ }
@@ -0,0 +1,304 @@
1
+ {
2
+ "color": {
3
+ "primary": {
4
+ "$type": "color",
5
+ "$value": {
6
+ "colorSpace": "srgb",
7
+ "components": [
8
+ 0.051,
9
+ 0.4314,
10
+ 0.9922
11
+ ],
12
+ "hex": "#0d6efd"
13
+ }
14
+ },
15
+ "primary-hover": {
16
+ "$type": "color",
17
+ "$value": {
18
+ "colorSpace": "srgb",
19
+ "components": [
20
+ 0.0431,
21
+ 0.3686,
22
+ 0.8431
23
+ ],
24
+ "hex": "#0b5ed7"
25
+ }
26
+ },
27
+ "primary-active": {
28
+ "$type": "color",
29
+ "$value": {
30
+ "colorSpace": "srgb",
31
+ "components": [
32
+ 0.0392,
33
+ 0.3451,
34
+ 0.7922
35
+ ],
36
+ "hex": "#0a58ca"
37
+ }
38
+ },
39
+ "secondary": {
40
+ "$type": "color",
41
+ "$value": {
42
+ "colorSpace": "srgb",
43
+ "components": [
44
+ 0.4235,
45
+ 0.4588,
46
+ 0.4902
47
+ ],
48
+ "hex": "#6c757d"
49
+ }
50
+ },
51
+ "accent": {
52
+ "$type": "color",
53
+ "$value": {
54
+ "colorSpace": "srgb",
55
+ "components": [
56
+ 0.4353,
57
+ 0.2588,
58
+ 0.7569
59
+ ],
60
+ "hex": "#6f42c1"
61
+ }
62
+ },
63
+ "background": {
64
+ "$type": "color",
65
+ "$value": {
66
+ "colorSpace": "srgb",
67
+ "components": [
68
+ 1,
69
+ 1,
70
+ 1
71
+ ],
72
+ "hex": "#ffffff"
73
+ }
74
+ },
75
+ "surface": {
76
+ "$type": "color",
77
+ "$value": {
78
+ "colorSpace": "srgb",
79
+ "components": [
80
+ 1,
81
+ 1,
82
+ 1
83
+ ],
84
+ "hex": "#ffffff"
85
+ }
86
+ },
87
+ "surface-raised": {
88
+ "$type": "color",
89
+ "$value": {
90
+ "colorSpace": "srgb",
91
+ "components": [
92
+ 0.9725,
93
+ 0.9765,
94
+ 0.9804
95
+ ],
96
+ "hex": "#f8f9fa"
97
+ }
98
+ },
99
+ "surface-sunken": {
100
+ "$type": "color",
101
+ "$value": {
102
+ "colorSpace": "srgb",
103
+ "components": [
104
+ 0.9137,
105
+ 0.9255,
106
+ 0.9373
107
+ ],
108
+ "hex": "#e9ecef"
109
+ }
110
+ },
111
+ "border": {
112
+ "$type": "color",
113
+ "$value": {
114
+ "colorSpace": "srgb",
115
+ "components": [
116
+ 0.8706,
117
+ 0.8863,
118
+ 0.902
119
+ ],
120
+ "hex": "#dee2e6"
121
+ }
122
+ },
123
+ "border-subtle": {
124
+ "$type": "color",
125
+ "$value": {
126
+ "colorSpace": "srgb",
127
+ "components": [
128
+ 0.9137,
129
+ 0.9255,
130
+ 0.9373
131
+ ],
132
+ "hex": "#e9ecef"
133
+ }
134
+ },
135
+ "text": {
136
+ "$type": "color",
137
+ "$value": {
138
+ "colorSpace": "srgb",
139
+ "components": [
140
+ 0.1294,
141
+ 0.1451,
142
+ 0.1608
143
+ ],
144
+ "hex": "#212529"
145
+ }
146
+ },
147
+ "text-muted": {
148
+ "$type": "color",
149
+ "$value": {
150
+ "colorSpace": "srgb",
151
+ "components": [
152
+ 0.4235,
153
+ 0.4588,
154
+ 0.4902
155
+ ],
156
+ "hex": "#6c757d"
157
+ }
158
+ },
159
+ "text-on-primary": {
160
+ "$type": "color",
161
+ "$value": {
162
+ "colorSpace": "srgb",
163
+ "components": [
164
+ 1,
165
+ 1,
166
+ 1
167
+ ],
168
+ "hex": "#ffffff"
169
+ }
170
+ },
171
+ "error": {
172
+ "$type": "color",
173
+ "$value": {
174
+ "colorSpace": "srgb",
175
+ "components": [
176
+ 0.8627,
177
+ 0.2078,
178
+ 0.2706
179
+ ],
180
+ "hex": "#dc3545"
181
+ }
182
+ },
183
+ "success": {
184
+ "$type": "color",
185
+ "$value": {
186
+ "colorSpace": "srgb",
187
+ "components": [
188
+ 0.098,
189
+ 0.5294,
190
+ 0.3294
191
+ ],
192
+ "hex": "#198754"
193
+ }
194
+ },
195
+ "warning": {
196
+ "$type": "color",
197
+ "$value": {
198
+ "colorSpace": "srgb",
199
+ "components": [
200
+ 1,
201
+ 0.7569,
202
+ 0.0275
203
+ ],
204
+ "hex": "#ffc107"
205
+ }
206
+ },
207
+ "info": {
208
+ "$type": "color",
209
+ "$value": {
210
+ "colorSpace": "srgb",
211
+ "components": [
212
+ 0.051,
213
+ 0.7922,
214
+ 0.9412
215
+ ],
216
+ "hex": "#0dcaf0"
217
+ }
218
+ }
219
+ },
220
+ "typography": {
221
+ "family": {
222
+ "sans": {
223
+ "$type": "fontFamily",
224
+ "$value": [
225
+ "system-ui",
226
+ "-apple-system",
227
+ "Segoe UI",
228
+ "Roboto",
229
+ "sans-serif"
230
+ ]
231
+ }
232
+ },
233
+ "size": {
234
+ "md": {
235
+ "$type": "dimension",
236
+ "$value": {
237
+ "value": 1,
238
+ "unit": "rem"
239
+ }
240
+ }
241
+ },
242
+ "lineHeight": {
243
+ "normal": {
244
+ "$type": "number",
245
+ "$value": 1.5
246
+ }
247
+ }
248
+ },
249
+ "border": {
250
+ "radius": {
251
+ "xs": {
252
+ "$type": "dimension",
253
+ "$value": {
254
+ "value": 0.2,
255
+ "unit": "rem"
256
+ }
257
+ },
258
+ "s": {
259
+ "$type": "dimension",
260
+ "$value": {
261
+ "value": 0.25,
262
+ "unit": "rem"
263
+ }
264
+ },
265
+ "m": {
266
+ "$type": "dimension",
267
+ "$value": {
268
+ "value": 0.375,
269
+ "unit": "rem"
270
+ }
271
+ },
272
+ "l": {
273
+ "$type": "dimension",
274
+ "$value": {
275
+ "value": 0.5,
276
+ "unit": "rem"
277
+ }
278
+ },
279
+ "xl": {
280
+ "$type": "dimension",
281
+ "$value": {
282
+ "value": 1,
283
+ "unit": "rem"
284
+ }
285
+ }
286
+ }
287
+ },
288
+ "$extensions": {
289
+ "com.vanilla-breeze": {
290
+ "spec": "2025.10",
291
+ "vbVersion": "catalog-2026-05-15",
292
+ "catalog": true,
293
+ "source": {
294
+ "name": "Bootstrap defaults",
295
+ "homepage": "https://getbootstrap.com/",
296
+ "tokenSource": "https://getbootstrap.com/docs/5.3/customize/color/",
297
+ "license": "MIT",
298
+ "attribution": "Bootstrap — © The Bootstrap Authors.",
299
+ "syncedAt": "2026-05-15",
300
+ "note": "Bootstrap does not publish DTCG natively; this entry is hand-synthesized from _variables.scss."
301
+ }
302
+ }
303
+ }
304
+ }