viberoom 0.5.8 → 0.6.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.
package/ui/tokens.js ADDED
@@ -0,0 +1,620 @@
1
+ // viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE
2
+ (() => {
3
+ "use strict";
4
+
5
+ const rgb = (hex) => {
6
+ const n = parseInt(hex.slice(1), 16);
7
+ return hex.length === 4
8
+ ? [((n >> 8) & 15) * 17, ((n >> 4) & 15) * 17, (n & 15) * 17]
9
+ : [(n >> 16) & 255, (n >> 8) & 255, n & 255];
10
+ };
11
+ const alpha = (hex, a) => `rgba(${rgb(hex).join(", ")}, ${a})`;
12
+ const mix = (a, b, t) => {
13
+ const [x, y, z] = rgb(a);
14
+ const [i, j, k] = rgb(b);
15
+ const at = (u, v) => Math.round(u + (v - u) * t);
16
+ return `#${[at(x, i), at(y, j), at(z, k)].map((v) => v.toString(16).padStart(2, "0")).join("")}`;
17
+ };
18
+
19
+ const pop = {
20
+ primary: "#5b5bf0",
21
+ primaryLight: "#6a6af7",
22
+ primaryDeep: "#4f4fe0",
23
+ primaryDark: "#4343cc",
24
+ violet: "#8b5cf6",
25
+ iris: "#6d5dfc",
26
+ ink: "#1c1b33",
27
+ ink2: "#2c2b4a",
28
+ ink3: "#5c5c80",
29
+ indigo: "#1f1d3a",
30
+ muted: "#8f8fb0",
31
+ faint: "#b3b3cc",
32
+ placeholder: "#a3a3c0",
33
+ grey: "#9ca3af",
34
+ white: "#ffffff",
35
+ black: "#000000",
36
+ bg: "#eef0fb",
37
+ soft: "#f6f6fb",
38
+ softer: "#f1f1f8",
39
+ lav: "#eef0fb",
40
+ lav2: "#e4e6fb",
41
+ canvasTop: "#fdfdff",
42
+ canvasMid: "#f7f7fe",
43
+ canvasBottom: "#f0f1fd",
44
+ shadowInk: "#322878",
45
+ mint: "#d9f7e8",
46
+ mint2: "#c4efdb",
47
+ mintTint: "#e4f7ee",
48
+ mintInk: "#1d8f6a",
49
+ forest: "#14533f",
50
+ green: "#2fc97e",
51
+ warm: "#fff3cc",
52
+ warm2: "#ffeaa8",
53
+ warmInk: "#b8860b",
54
+ bronze: "#5a4200",
55
+ amber: "#f5a524",
56
+ honey: "#ffcf8f",
57
+ spark: "#ffd166",
58
+ peach: "#ffe3cc",
59
+ peach2: "#ffe4d6",
60
+ orange: "#ff8a3d",
61
+ orangeLight: "#ff9447",
62
+ orangeDeep: "#e8642a",
63
+ orangeDark: "#c9461c",
64
+ ember: "#ff7a45",
65
+ emberDeep: "#f0452c",
66
+ rose: "#fff0ee",
67
+ rose2: "#ffe1dd",
68
+ roseInk: "#e0554a",
69
+ roseDark: "#c9463c",
70
+ pink: "#be185d",
71
+ pinkTint: "#fff1f7",
72
+ sky: "#dcefff",
73
+ blue: "#4f8ef7",
74
+ blueDeep: "#2a6fbf",
75
+ blueSoft: "#7aa7ff",
76
+ orchid: "#f3e4fb",
77
+ orchidInk: "#8a3fc2",
78
+ orchidMid: "#b06be0",
79
+ periwinkle: "#cdcdf9",
80
+ periwinkleDeep: "#a9a9f5",
81
+ deep: "#26244a",
82
+ deepGutter: "#211f43",
83
+ deepInk: "#f4f2ff",
84
+ deepMuted: "#7c78ad",
85
+ deepHead: "#e8e6ff",
86
+ deepMeta: "#a9a5d8",
87
+ lavGrey: "#c9c6ea",
88
+ lilac: "#b9a7ff",
89
+ seafoam: "#8fe3bd",
90
+ azure: "#9cd2ff",
91
+ salmon: "#ff9f9f",
92
+ magenta: "#f2b8ff",
93
+ };
94
+
95
+ const meaningOf = (p) => ({
96
+ stReady: p.mint, stReadyInk: p.mintInk, stReadyDot: p.green,
97
+ stWaiting: p.sky, stWaitingInk: p.blueDeep, stWaitingDot: p.blueSoft,
98
+ stThinking: p.warm, stThinkingInk: p.warmInk, stThinkingDot: p.amber,
99
+ stWriting: p.orchid, stWritingInk: p.orchidInk, stWritingDot: p.orchidMid,
100
+ stError: p.rose, stErrorInk: p.roseInk, stErrorDot: p.roseInk,
101
+ stAsleep: p.softer, stAsleepInk: p.muted, stAsleepDot: p.faint,
102
+ attention: p.orange,
103
+ attentionInk: p.orangeDark,
104
+ attentionGrad: `linear-gradient(135deg, ${p.orangeLight}, ${p.orangeDeep})`,
105
+ attentionShadow: `0 8px 18px -10px ${alpha(p.orangeDeep, 0.7)}`,
106
+ unreadGrad: `linear-gradient(135deg, ${p.ember}, ${p.emberDeep})`,
107
+ noteHover: p.warm2,
108
+ done: p.mint,
109
+ doneInk: p.mintInk,
110
+ doneHover: p.mint2,
111
+ tickMine: p.periwinkle,
112
+ tickMineView: p.periwinkleDeep,
113
+ tickFallback: p.grey,
114
+ unseenInk: p.pink,
115
+ unseenBg: p.pinkTint,
116
+ });
117
+
118
+ const aliasesOf = (p) => ({
119
+ gradPrimary: `linear-gradient(135deg, ${p.primaryLight}, ${p.primaryDeep})`,
120
+ panel: p.white,
121
+ card: p.white,
122
+ primarySoft: p.lav,
123
+ primarySofter: p.soft,
124
+ primaryGhost: alpha(p.primary, 0.1),
125
+ mintSoft: p.mint,
126
+ warn: p.amber,
127
+ warnSoft: p.warm,
128
+ danger: p.roseInk,
129
+ dangerSoft: p.rose,
130
+ dangerDark: p.roseDark,
131
+ info: p.blue,
132
+ infoSoft: p.sky,
133
+ muted2: p.faint,
134
+ panelSoft: p.soft,
135
+ panelTint: p.soft,
136
+ border: p.lav,
137
+ borderStrong: p.lav2,
138
+ mine: `linear-gradient(135deg, ${p.primaryLight}, ${p.primaryDeep})`,
139
+ mineBorder: "transparent",
140
+ text: p.ink,
141
+ ok: p.green,
142
+ });
143
+
144
+ const elevationOf = (p) => {
145
+ const edge = `0 2px 0 ${alpha(p.ink, 0.04)}`;
146
+ const tile = `0 4px 12px -4px ${alpha(p.ink, 0.15)}`;
147
+ const dialog = `0 30px 60px -30px ${alpha(p.shadowInk, 0.4)}`;
148
+ const primary = `0 8px 18px -8px ${alpha(p.primary, 0.8)}`;
149
+ return {
150
+ edge,
151
+ shadowTile: tile,
152
+ shadowPop: `0 10px 24px -10px ${alpha(p.ink, 0.25)}`,
153
+ shadowPrimary: primary,
154
+ shadowDialog: dialog,
155
+ shadow1: edge,
156
+ shadow2: dialog,
157
+ shadowCard: edge,
158
+ shadowCtl: "none",
159
+ shadowCtlHover: tile,
160
+ shadowGlow: primary,
161
+ shadowInset: "none",
162
+ shadowSoft: edge,
163
+ shadow: edge,
164
+ };
165
+ };
166
+
167
+ const canvasOf = (p) => ({
168
+ gradCanvas: `radial-gradient(900px 520px at 100% 100%, ${alpha(p.primary, 0.06)}, transparent 70%), radial-gradient(640px 380px at 0% 0%, ${alpha(p.green, 0.04)}, transparent 70%), linear-gradient(165deg, ${p.canvasTop} 0%, ${p.canvasMid} 55%, ${p.canvasBottom} 100%)`,
169
+ canvasPattern: `radial-gradient(circle at 1px 1px, ${alpha(p.primary, 0.13)} 0.9px, transparent 1.6px)`,
170
+ canvasPatternSize: "22px 22px",
171
+ gradPage: p.bg,
172
+ sbW: "8px",
173
+ sbThumb: alpha(p.primary, 0.22),
174
+ sbThumbHover: alpha(p.primary, 0.45),
175
+ });
176
+
177
+ const shape = {
178
+ rXs: "8px", rSm: "12px", rMd: "14px", rLg: "18px", rXl: "18px", rPill: "99px",
179
+ };
180
+ const type = {
181
+ font: '"Nunito", "Segoe UI", system-ui, -apple-system, Roboto, sans-serif',
182
+ mono: '"JetBrains Mono", ui-monospace, Consolas, "Courier New", monospace',
183
+ fsScale: "1",
184
+ fsXs: "calc(11px * var(--fs-scale))",
185
+ fsSm: "calc(12px * var(--fs-scale))",
186
+ fsMd: "calc(14px * var(--fs-scale))",
187
+ fsLg: "calc(16px * var(--fs-scale))",
188
+ fsXl: "calc(18px * var(--fs-scale))",
189
+ fs2xl: "calc(22px * var(--fs-scale))",
190
+ };
191
+ const motion = {
192
+ tFast: "120ms", tBase: "200ms", tSlow: "320ms",
193
+ easeOut: "cubic-bezier(0.2, 0.8, 0.2, 1)",
194
+ easePop: "cubic-bezier(0.34, 1.56, 0.64, 1)",
195
+ };
196
+
197
+ const elementsOf = (p) => ({
198
+ page: {
199
+ bg: p.bg,
200
+ ink: p.ink,
201
+ selection: p.lav2,
202
+ },
203
+ focus: {
204
+ ring: alpha(p.primary, 0.35),
205
+ },
206
+ link: {
207
+ ink: p.primary,
208
+ underline: alpha(p.primary, 0.35),
209
+ },
210
+ btn: {
211
+ bg: p.softer,
212
+ ink: p.ink3,
213
+ hoverBg: p.lav,
214
+ hoverInk: p.primary,
215
+ onPrimary: p.white,
216
+ secondaryBg: p.white,
217
+ softBg: p.lav,
218
+ softHoverBg: p.lav2,
219
+ ghostInk: p.muted,
220
+ ghostHoverBg: p.soft,
221
+ dangerBg: p.rose,
222
+ dangerInk: p.roseInk,
223
+ dangerHoverBg: p.rose2,
224
+ dangerSolidInk: p.white,
225
+ dangerSolidHoverBg: p.roseDark,
226
+ dangerSolidShadow: `0 8px 18px -8px ${alpha(p.roseInk, 0.8)}`,
227
+ spinnerTrack: alpha(p.white, 0.5),
228
+ spinnerHead: p.white,
229
+ spinnerTrackQuiet: p.lav2,
230
+ spinnerHeadQuiet: p.primary,
231
+ disabledOpacity: "0.45",
232
+ darkBg: alpha(p.white, 0.12),
233
+ darkInk: p.white,
234
+ darkHoverBg: p.primary,
235
+ warnInk: p.warmInk,
236
+ warnHoverBg: p.warm,
237
+ inverseBg: alpha(p.white, 0.92),
238
+ inverseInk: p.orangeDark,
239
+ inverseHoverBg: p.white,
240
+ linkInk: p.primary,
241
+ okBg: p.mint,
242
+ okInk: p.mintInk,
243
+ okHoverBg: p.mint2,
244
+ paperBg: p.white,
245
+ paperInk: p.ink3,
246
+ paperHoverBg: p.soft,
247
+ h: "42px",
248
+ hSm: "34px",
249
+ hXs: "24px",
250
+ hLg: "48px",
251
+ hCta: "46px",
252
+ fs: "calc(13px * var(--fs-scale))",
253
+ fsSm: "calc(12px * var(--fs-scale))",
254
+ fsLg: "calc(15px * var(--fs-scale))",
255
+ fsCta: "calc(14px * var(--fs-scale))",
256
+ },
257
+ iconButton: {
258
+ ink: p.muted,
259
+ hoverBg: p.soft,
260
+ hoverInk: p.primary,
261
+ disabledOpacity: "0.4",
262
+ size: "36px",
263
+ icon: "18px",
264
+ sizeSm: "30px",
265
+ iconSm: "16px",
266
+ sizeXs: "18px",
267
+ iconXs: "12px",
268
+ sizePrimary: "44px",
269
+ ghostInk: p.faint,
270
+ hoverBgStrong: p.primary,
271
+ inlineBg: p.lav2,
272
+ inlineInk: p.ink3,
273
+ inlineOnBg: alpha(p.primary, 0.1),
274
+ inlineOnInk: p.primary,
275
+ },
276
+ badge: {
277
+ bg: p.lav,
278
+ ink: p.primary,
279
+ attentionBg: p.warm,
280
+ attentionInk: p.warmInk,
281
+ mutedBg: p.softer,
282
+ mutedInk: p.muted,
283
+ outlineBorder: p.lav2,
284
+ outlineInk: p.muted,
285
+ fsXs: "calc(10px * var(--fs-scale))",
286
+ },
287
+ chip: {
288
+ bg: p.lav,
289
+ ink: p.primary,
290
+ hoverBg: p.lav2,
291
+ },
292
+ fileCard: {
293
+ bg: p.deep,
294
+ ink: p.deepInk,
295
+ headBg: alpha(p.white, 0.06),
296
+ headInk: p.deepHead,
297
+ headMeta: p.deepMeta,
298
+ noteInk: p.roseInk,
299
+ imageBodyBg: alpha(p.white, 0.04),
300
+ imageBg: p.white,
301
+ },
302
+ toolCall: {
303
+ readyBg: p.mint,
304
+ readyInk: p.mintInk,
305
+ errorBg: p.rose,
306
+ errorInk: p.roseInk,
307
+ thinkingBg: p.warm,
308
+ thinkingInk: p.warmInk,
309
+ pendingBg: p.lav,
310
+ pendingInk: p.primary,
311
+ bodyBg: p.white,
312
+ preBg: p.soft,
313
+ preInk: p.ink,
314
+ quietInk: p.muted,
315
+ fs: "calc(12px * var(--fs-scale))",
316
+ preFs: "calc(11.5px * var(--fs-scale))",
317
+ labelFs: "calc(10.5px * var(--fs-scale))",
318
+ },
319
+ toolFold: {
320
+ ink: p.muted,
321
+ bg: p.soft,
322
+ hoverBg: p.lav,
323
+ hoverInk: p.primary,
324
+ failedInk: p.roseInk,
325
+ fs: "calc(11px * var(--fs-scale))",
326
+ },
327
+ askCard: {
328
+ bg: p.warm,
329
+ ink: p.ink,
330
+ quietInk: p.muted,
331
+ resolvedOpacity: "0.7",
332
+ fs: "calc(13px * var(--fs-scale))",
333
+ kindFs: "calc(11px * var(--fs-scale))",
334
+ inputFs: "calc(11px * var(--fs-scale))",
335
+ outcomeFs: "calc(12px * var(--fs-scale))",
336
+ },
337
+ replyNote: {
338
+ ink: p.muted,
339
+ bg: p.soft,
340
+ attentionInk: p.warmInk,
341
+ attentionBg: p.warm,
342
+ fs: "calc(12px * var(--fs-scale))",
343
+ },
344
+ choice: {
345
+ bg: p.soft,
346
+ ink: p.ink3,
347
+ hoverBg: p.lav,
348
+ onInk: p.primary,
349
+ onBorder: p.primary,
350
+ quietInk: p.muted,
351
+ h: "32px",
352
+ },
353
+ control: {
354
+ knob: p.white,
355
+ knobShadow: `0 1px 3px ${alpha(p.ink, 0.25)}`,
356
+ boxBg: p.white,
357
+ tick: p.white,
358
+ },
359
+ tile: {
360
+ logoBg: p.white,
361
+ badgeBg: p.white,
362
+ badgeBorder: p.white,
363
+ ring: p.white,
364
+ markInk: p.white,
365
+ countInk: p.white,
366
+ },
367
+ roomMark: {
368
+ gradAngle: "135deg",
369
+ gradFrom: "72% 66%",
370
+ gradTo: "68% 52%",
371
+ emoji: "70% 93%",
372
+ },
373
+ pop: {
374
+ bg: p.white,
375
+ shadow: `0 10px 28px -12px ${alpha(p.ink, 0.45)}`,
376
+ arrowShadow: `3px 3px 4px -3px ${alpha(p.ink, 0.25)}`,
377
+ darkBg: p.ink2,
378
+ darkInk: p.white,
379
+ darkShadow: `0 6px 16px -6px ${alpha(p.ink, 0.6)}`,
380
+ },
381
+ dialog: {
382
+ backdrop: alpha(p.ink, 0.4),
383
+ },
384
+ scrim: {
385
+ bg: alpha(p.ink, 0.72),
386
+ shadow: `0 24px 60px -20px ${alpha(p.black, 0.6)}`,
387
+ imageBg: p.white,
388
+ },
389
+ toast: {
390
+ bg: p.ink,
391
+ ink: p.deepInk,
392
+ },
393
+ rail: {
394
+ logoShadow: `0 8px 18px -6px ${alpha(p.primary, 0.6)}`,
395
+ activeBg: p.white,
396
+ },
397
+ timeline: {
398
+ viewBg: alpha(p.primary, 0.07),
399
+ viewLeftBg: alpha(p.ink, 0.05),
400
+ tickBlend: p.white,
401
+ pinHalo: p.white,
402
+ flash: alpha(p.primary, 0.55),
403
+ flashOut: alpha(p.primary, 0),
404
+ },
405
+ bubble: {
406
+ bg: p.white,
407
+ ink: p.ink2,
408
+ shadow: `0 2px 0 ${alpha(p.ink, 0.06)}, 0 1px 3px ${alpha(p.ink, 0.04)}`,
409
+ mineBg: `linear-gradient(135deg, ${p.primaryLight}, ${p.primaryDeep})`,
410
+ mineInk: p.white,
411
+ mineSoftInk: alpha(p.white, 0.85),
412
+ mineWaitingInk: alpha(p.white, 0.92),
413
+ mineShadow: `0 8px 18px -10px ${alpha(p.primary, 0.7)}`,
414
+ mineRule: alpha(p.white, 0.35),
415
+ mineBorder: alpha(p.white, 0.35),
416
+ mineChipBg: alpha(p.white, 0.22),
417
+ mineCodeBg: alpha(p.white, 0.18),
418
+ mineThBg: alpha(p.white, 0.18),
419
+ mineLinkUnderline: alpha(p.white, 0.5),
420
+ mineQuoteBorder: alpha(p.white, 0.5),
421
+ mineBtnBg: alpha(p.white, 0.92),
422
+ mineBtnHoverBg: p.white,
423
+ mineGhostHoverBg: alpha(p.white, 0.18),
424
+ mineCtaBg: p.white,
425
+ mineCtaInk: p.primary,
426
+ insetBg: p.white,
427
+ propRowBg: alpha(p.white, 0.6),
428
+ },
429
+ quote: {
430
+ mineBg: alpha(p.white, 0.16),
431
+ mineBorder: alpha(p.white, 0.55),
432
+ mineHoverBg: alpha(p.white, 0.26),
433
+ mineHoverBorder: p.white,
434
+ mineHeadInk: alpha(p.white, 0.85),
435
+ mineTextInk: p.white,
436
+ },
437
+ attach: {
438
+ thumbBg: p.white,
439
+ thumbShadow: `0 1px 3px ${alpha(p.ink, 0.16)}`,
440
+ overlayBg: alpha(p.ink, 0.72),
441
+ overlayInk: p.white,
442
+ refBg: alpha(p.ink, 0.1),
443
+ mineRefBg: alpha(p.white, 0.24),
444
+ mineChipOpenBg: alpha(p.white, 0.42),
445
+ mineChipOpenInk: p.ink,
446
+ },
447
+ table: {
448
+ stripe: alpha(p.primary, 0.03),
449
+ },
450
+ code: {
451
+ bg: p.deep,
452
+ ink: p.deepInk,
453
+ gutterBg: p.deepGutter,
454
+ gutterInk: p.deepMuted,
455
+ lineMarkInk: p.honey,
456
+ lineMarkBg: alpha(p.honey, 0.16),
457
+ headBg: alpha(p.white, 0.06),
458
+ headInk: p.deepHead,
459
+ headMeta: p.deepMeta,
460
+ headBtnBg: alpha(p.white, 0.12),
461
+ headBtnInk: p.white,
462
+ bodyBg: alpha(p.white, 0.04),
463
+ sbTrack: alpha(p.black, 0.25),
464
+ sbThumb: alpha(p.white, 0.3),
465
+ sbThumbHover: alpha(p.white, 0.5),
466
+ sbFirefox: alpha(p.white, 0.35),
467
+ findHitBg: p.honey,
468
+ findHitInk: p.deep,
469
+ },
470
+ syntax: {
471
+ comment: p.muted,
472
+ punctuation: p.lavGrey,
473
+ keyword: p.lilac,
474
+ string: p.seafoam,
475
+ number: p.honey,
476
+ function: p.azure,
477
+ tag: p.salmon,
478
+ attr: p.magenta,
479
+ },
480
+ diagram: {
481
+ barBg: p.white,
482
+ barShadow: `0 12px 30px -12px ${alpha(p.black, 0.55)}`,
483
+ nodeShadow: alpha(p.ink, 0.1),
484
+ nodeInk: p.ink,
485
+ },
486
+ input: {
487
+ bg: p.white,
488
+ focusBorder: p.primary,
489
+ },
490
+ profile: {
491
+ bg: `linear-gradient(160deg, ${p.lav}, ${p.mintTint})`,
492
+ avatarBg: p.white,
493
+ badgeBg: p.white,
494
+ },
495
+ participant: {
496
+ fallback: p.grey,
497
+ humanInk: p.indigo,
498
+ avatarDefault: p.primary,
499
+ avatarGloss: p.white,
500
+ avatarLabelInk: p.white,
501
+ avatarBlend: p.white,
502
+ },
503
+ rowButton: {
504
+ size: "24px",
505
+ icon: "14px",
506
+ radius: "8px",
507
+ bg: p.softer,
508
+ ink: p.muted,
509
+ hoverBg: p.primary,
510
+ hoverInk: p.white,
511
+ disabledOpacity: "0.4",
512
+ },
513
+ hubRow: {
514
+ ink: p.muted,
515
+ attentionInk: p.warmInk,
516
+ errorInk: p.roseInk,
517
+ actionBg: p.mint,
518
+ actionInk: p.mintInk,
519
+ actionHoverBg: p.mint2,
520
+ faceSize: "18px",
521
+ },
522
+ hero: {
523
+ ink: p.white,
524
+ bg: `linear-gradient(120deg, ${p.primaryLight} 0%, ${p.primary} 45%, ${p.violet} 100%)`,
525
+ shadow: `0 18px 40px -22px ${alpha(p.primary, 0.9)}`,
526
+ blobA: alpha(p.white, 0.1),
527
+ blobB: alpha(p.green, 0.18),
528
+ ctaBg: p.white,
529
+ ctaShadow: `0 10px 22px -10px ${alpha(p.ink, 0.5)}`,
530
+ ghostBg: alpha(p.white, 0.16),
531
+ ghostHoverBg: alpha(p.white, 0.26),
532
+ faceBg: alpha(p.white, 0.55),
533
+ bubbleShadow: `0 10px 24px -14px ${alpha(p.ink, 0.6)}`,
534
+ bubble1Bg: p.white,
535
+ bubble2Bg: p.mint,
536
+ bubble2Ink: p.forest,
537
+ bubble3Bg: p.warm,
538
+ bubble3Ink: p.bronze,
539
+ spark: p.spark,
540
+ },
541
+ feature: {
542
+ emojiBg: alpha(p.white, 0.8),
543
+ peachBg: p.peach2,
544
+ },
545
+ step: {
546
+ bg: p.white,
547
+ numInk: p.white,
548
+ },
549
+ tpl: {
550
+ shadow: `0 1px 3px ${alpha(p.ink, 0.06)}`,
551
+ checkInk: p.white,
552
+ },
553
+ browser: {
554
+ themeColor: p.iris,
555
+ },
556
+ });
557
+
558
+ const popNodes = [
559
+ { fill: "#e4e6fb", stroke: "#5b5bf0" },
560
+ { fill: "#d9f7e8", stroke: "#1d8f6a" },
561
+ { fill: "#fff3cc", stroke: "#b8860b" },
562
+ { fill: "#ffe4d6", stroke: "#d2691e" },
563
+ { fill: "#ffe3ec", stroke: "#d6336c" },
564
+ { fill: "#dcefff", stroke: "#2a6fbf" },
565
+ { fill: "#f1e3fb", stroke: "#8a3fb8" },
566
+ ];
567
+ const diagrams = {
568
+ customBoxDefault: "#ece9ff",
569
+ presets: {
570
+ pop: { label: "Pop", palette: popNodes, primaryColor: "#e4e6fb", primaryBorderColor: "#5b5bf0", primaryTextColor: "#1c1b33", lineColor: "#8f8fb0", secondaryColor: "#d9f7e8", secondaryBorderColor: "#1d8f6a", tertiaryColor: "#fff3cc", tertiaryBorderColor: "#b8860b", textColor: "#1c1b33", clusterBkg: "#f8f8fd", clusterBorder: "#d9dbf5", edgeLabelBackground: "#ffffff", noteBkgColor: "#fff3cc", noteBorderColor: "#b8860b" },
571
+ lavender: { label: "Lavender", primaryColor: "#ece9ff", primaryBorderColor: "#6d5dfc", primaryTextColor: "#24223d", lineColor: "#5a4be0", secondaryColor: "#e3f8f2", secondaryBorderColor: "#39c6a3", tertiaryColor: "#fff4d6", tertiaryBorderColor: "#f5a524", textColor: "#24223d", clusterBkg: "#f7f6fc", clusterBorder: "#d6d1f5", edgeLabelBackground: "#ffffff" },
572
+ mint: { label: "Mint", primaryColor: "#e3f8f2", primaryBorderColor: "#39c6a3", primaryTextColor: "#0f3d33", lineColor: "#2a9d84", secondaryColor: "#ece9ff", secondaryBorderColor: "#6d5dfc", tertiaryColor: "#fff4d6", tertiaryBorderColor: "#f5a524", textColor: "#1b3a33", clusterBkg: "#f3fbf8", clusterBorder: "#b4ecdc", edgeLabelBackground: "#ffffff" },
573
+ sunset: { label: "Sunset", primaryColor: "#ffe9d6", primaryBorderColor: "#f5a524", primaryTextColor: "#4a2b00", lineColor: "#d97706", secondaryColor: "#ffe9ec", secondaryBorderColor: "#ef5b6b", tertiaryColor: "#ece9ff", tertiaryBorderColor: "#6d5dfc", textColor: "#3b2a1a", clusterBkg: "#fff8f0", clusterBorder: "#fde1c2", edgeLabelBackground: "#ffffff" },
574
+ slate: { label: "Slate", primaryColor: "#e9edf3", primaryBorderColor: "#64748b", primaryTextColor: "#1e293b", lineColor: "#475569", secondaryColor: "#f1f5f9", secondaryBorderColor: "#94a3b8", tertiaryColor: "#e2e8f0", tertiaryBorderColor: "#64748b", textColor: "#1e293b", clusterBkg: "#f8fafc", clusterBorder: "#cbd5e1", edgeLabelBackground: "#ffffff" },
575
+ },
576
+ };
577
+
578
+ const look = (id, label, scheme, palette) => ({
579
+ id,
580
+ label,
581
+ scheme,
582
+ palette,
583
+ meaning: meaningOf(palette),
584
+ aliases: aliasesOf(palette),
585
+ elevation: elevationOf(palette),
586
+ canvas: canvasOf(palette),
587
+ shape,
588
+ type,
589
+ motion,
590
+ elements: elementsOf(palette),
591
+ });
592
+
593
+ const looks = { pop: look("pop", "Pop", "light", pop) };
594
+
595
+ const FLAT = ["palette", "meaning", "aliases", "elevation", "canvas", "shape", "type", "motion"];
596
+ const kebab = (s) => s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([a-zA-Z])(\d)/g, "$1-$2").toLowerCase();
597
+
598
+ function cssGroups(theme) {
599
+ const seen = new Set();
600
+ const entry = (name, value) => {
601
+ if (seen.has(name)) throw new Error(`two tokens claim ${name}`);
602
+ seen.add(name);
603
+ return [name, String(value)];
604
+ };
605
+ const groups = FLAT.map((section) => ({
606
+ title: section,
607
+ entries: Object.entries(theme[section] || {}).map(([key, value]) => entry(`--${kebab(key)}`, value)),
608
+ }));
609
+ for (const [group, parts] of Object.entries(theme.elements)) {
610
+ groups.push({ title: `element: ${kebab(group)}`, entries: Object.entries(parts).map(([key, value]) => entry(`--${kebab(group)}-${kebab(key)}`, value)) });
611
+ }
612
+ return groups;
613
+ }
614
+
615
+ function cssVars(theme) {
616
+ return Object.fromEntries(cssGroups(theme).flatMap((g) => g.entries));
617
+ }
618
+
619
+ globalThis.VIBEROOM_TOKENS = { looks, current: looks.pop, diagrams, cssGroups, cssVars, alpha, mix, kebab };
620
+ })();