@velumo/renderer-dom 0.1.0-beta.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 (58) hide show
  1. package/dist/background-renderer.d.ts +16 -0
  2. package/dist/background-renderer.d.ts.map +1 -0
  3. package/dist/background-renderer.js +41 -0
  4. package/dist/background-renderer.js.map +1 -0
  5. package/dist/camera-adapter.d.ts +16 -0
  6. package/dist/camera-adapter.d.ts.map +1 -0
  7. package/dist/camera-adapter.js +13 -0
  8. package/dist/camera-adapter.js.map +1 -0
  9. package/dist/default-theme.d.ts +5 -0
  10. package/dist/default-theme.d.ts.map +1 -0
  11. package/dist/default-theme.js +579 -0
  12. package/dist/default-theme.js.map +1 -0
  13. package/dist/dom-renderer.d.ts +62 -0
  14. package/dist/dom-renderer.d.ts.map +1 -0
  15. package/dist/dom-renderer.js +306 -0
  16. package/dist/dom-renderer.js.map +1 -0
  17. package/dist/html-sanitize.d.ts +18 -0
  18. package/dist/html-sanitize.d.ts.map +1 -0
  19. package/dist/html-sanitize.js +379 -0
  20. package/dist/html-sanitize.js.map +1 -0
  21. package/dist/index.d.ts +12 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +10 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/layout-renderer.d.ts +16 -0
  26. package/dist/layout-renderer.d.ts.map +1 -0
  27. package/dist/layout-renderer.js +450 -0
  28. package/dist/layout-renderer.js.map +1 -0
  29. package/dist/slide-thumbnail.d.ts +63 -0
  30. package/dist/slide-thumbnail.d.ts.map +1 -0
  31. package/dist/slide-thumbnail.js +93 -0
  32. package/dist/slide-thumbnail.js.map +1 -0
  33. package/dist/spatial-renderer.d.ts +18 -0
  34. package/dist/spatial-renderer.d.ts.map +1 -0
  35. package/dist/spatial-renderer.js +36 -0
  36. package/dist/spatial-renderer.js.map +1 -0
  37. package/dist/theme-fonts.d.ts +8 -0
  38. package/dist/theme-fonts.d.ts.map +1 -0
  39. package/dist/theme-fonts.js +68 -0
  40. package/dist/theme-fonts.js.map +1 -0
  41. package/dist/theme-tokens.d.ts +3 -0
  42. package/dist/theme-tokens.d.ts.map +1 -0
  43. package/dist/theme-tokens.js +43 -0
  44. package/dist/theme-tokens.js.map +1 -0
  45. package/dist/tsconfig.tsbuildinfo +1 -0
  46. package/package.json +20 -0
  47. package/src/background-renderer.ts +77 -0
  48. package/src/camera-adapter.ts +21 -0
  49. package/src/default-theme.ts +582 -0
  50. package/src/dom-renderer.ts +486 -0
  51. package/src/html-sanitize.ts +446 -0
  52. package/src/index.ts +25 -0
  53. package/src/layout-renderer.ts +721 -0
  54. package/src/slide-thumbnail.ts +146 -0
  55. package/src/spatial-renderer.ts +62 -0
  56. package/src/theme-fonts.ts +75 -0
  57. package/src/theme-tokens.ts +66 -0
  58. package/tsconfig.json +10 -0
@@ -0,0 +1,582 @@
1
+ import type { Theme } from "@velumo/core";
2
+
3
+ export const defaultThemeId = "velumo-default";
4
+
5
+ export const defaultTheme: Theme = {
6
+ id: defaultThemeId,
7
+ tokens: {
8
+ colors: {
9
+ background: "#0b0e14",
10
+ foreground: "#e8edf4",
11
+ muted: "#9aa6b8",
12
+ accent: "#6ea8fe",
13
+ danger: "#ff6b6b",
14
+ magenta: "#ff6ba3",
15
+ cyan: "#5bd6f0",
16
+ purple: "#a98bff",
17
+ green: "#5fd398",
18
+ },
19
+ typography: {
20
+ heading: {
21
+ fontFamily: "ui-sans-serif, system-ui, sans-serif",
22
+ fontSize: "clamp(2.25rem, 5cqw, 4.5rem)",
23
+ lineHeight: 1.05,
24
+ fontWeight: 760,
25
+ letterSpacing: "-0.045em",
26
+ },
27
+ body: {
28
+ fontFamily: "ui-sans-serif, system-ui, sans-serif",
29
+ fontSize: "clamp(1.05rem, 1.7cqw, 1.35rem)",
30
+ lineHeight: 1.6,
31
+ fontWeight: 450,
32
+ },
33
+ caption: {
34
+ fontFamily: "ui-sans-serif, system-ui, sans-serif",
35
+ fontSize: "0.92rem",
36
+ lineHeight: 1.45,
37
+ fontWeight: 520,
38
+ letterSpacing: "0.02em",
39
+ },
40
+ },
41
+ spacing: {
42
+ xs: "0.375rem",
43
+ sm: "0.75rem",
44
+ md: "1.25rem",
45
+ lg: "2rem",
46
+ xl: "3rem",
47
+ },
48
+ radii: {
49
+ card: "1.25rem",
50
+ pill: "999px",
51
+ },
52
+ shadows: {
53
+ card: "0 24px 80px rgba(0, 0, 0, 0.45)",
54
+ },
55
+ motion: {
56
+ quick: {
57
+ duration: "140ms",
58
+ easing: "ease-out",
59
+ },
60
+ standard: {
61
+ duration: "260ms",
62
+ easing: "cubic-bezier(0.2, 0, 0, 1)",
63
+ },
64
+ },
65
+ surfaces: {
66
+ default: "#11151c",
67
+ muted: "#1a1f29",
68
+ card: "rgba(255, 255, 255, 0.04)",
69
+ accent: "rgba(110, 168, 254, 0.12)",
70
+ inverse: "#f8fafc",
71
+ danger: "rgba(255, 107, 107, 0.14)",
72
+ },
73
+ text: {
74
+ default: "#e8edf4",
75
+ muted: "#9aa6b8",
76
+ accent: "#9ec5ff",
77
+ inverse: "#0b0e14",
78
+ danger: "#ff8585",
79
+ },
80
+ },
81
+ };
82
+
83
+ export const defaultThemeCss = `
84
+ [data-velumo-renderer="dom"] {
85
+ box-sizing: border-box;
86
+ position: relative;
87
+ overflow: hidden;
88
+ scroll-padding: var(--velumo-spacing-xs, 0.375rem);
89
+ background: var(--velumo-color-background, #0b0e14);
90
+ color: var(--velumo-text-default, #e8edf4);
91
+ font-family: var(--velumo-typography-body-font-family, ui-sans-serif, system-ui, sans-serif);
92
+ font-size: var(--velumo-typography-body-font-size, 1.125rem);
93
+ line-height: var(--velumo-typography-body-line-height, 1.6);
94
+ /* Size containment makes the host's sizing of this root load-bearing: a host
95
+ MUST give the Velumo renderer root a definite size, or it collapses. All
96
+ shipped shells (CLI default, example, presenter preview, SlideThumbnail
97
+ surface) already do.*/
98
+ container-type: size;
99
+ container-name: velumo-slide;
100
+ --velumo-tone-default: var(--velumo-text-default, #e8edf4);
101
+ --velumo-tone-muted: var(--velumo-text-muted, #9aa6b8);
102
+ --velumo-tone-accent: var(--velumo-text-accent, #9ec5ff);
103
+ --velumo-tone-danger: var(--velumo-text-danger, #ff8585);
104
+ --velumo-tone-magenta: var(--velumo-color-magenta, #ff6ba3);
105
+ --velumo-tone-cyan: var(--velumo-color-cyan, #5bd6f0);
106
+ --velumo-tone-purple: var(--velumo-color-purple, #a98bff);
107
+ --velumo-tone-green: var(--velumo-color-green, #5fd398);
108
+ }
109
+
110
+ [data-velumo-renderer="dom"] *,
111
+ [data-velumo-renderer="dom"] *::before,
112
+ [data-velumo-renderer="dom"] *::after {
113
+ box-sizing: border-box;
114
+ }
115
+
116
+ [data-velumo-renderer="dom"] [data-velumo-slide-id] {
117
+ box-sizing: border-box;
118
+ position: relative;
119
+ width: 100%;
120
+ height: 100%;
121
+ margin: 0;
122
+ display: flex;
123
+ flex-direction: column;
124
+ padding: var(--velumo-margin-frame, clamp(2.5rem, 4.5cqh, 4rem)) var(--velumo-margin-frame-x, clamp(4rem, 8cqw, 8.5rem));
125
+ background: transparent;
126
+ overflow: hidden;
127
+ }
128
+
129
+ [data-velumo-renderer="dom"] [data-velumo-watermark] {
130
+ position: absolute;
131
+ top: var(--velumo-margin-frame, clamp(2.5rem, 4.5cqh, 4rem));
132
+ right: var(--velumo-margin-frame-x, clamp(4rem, 8cqw, 8.5rem));
133
+ z-index: 5;
134
+ pointer-events: none;
135
+ font-family: var(--velumo-font-mono, ui-monospace, "JetBrains Mono", monospace);
136
+ font-size: 0.72rem;
137
+ letter-spacing: 0.24em;
138
+ text-transform: uppercase;
139
+ color: color-mix(in srgb, var(--velumo-text-muted, #9aa6b8) 62%, transparent);
140
+ }
141
+
142
+ [data-velumo-renderer="dom"] [data-velumo-layout-root] {
143
+ display: flex;
144
+ flex-direction: column;
145
+ flex: 1;
146
+ min-height: 0;
147
+ }
148
+
149
+ [data-velumo-renderer="dom"] [data-velumo-layout="stack"],
150
+ [data-velumo-renderer="dom"] [data-velumo-layout="hero"],
151
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"] {
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: var(--velumo-spacing-md, 1.25rem);
155
+ flex: 1;
156
+ min-height: 0;
157
+ }
158
+ [data-velumo-renderer="dom"] [data-velumo-layout="stack"][data-velumo-stack-direction="horizontal"] {
159
+ flex-direction: row;
160
+ }
161
+
162
+ [data-velumo-renderer="dom"] [data-velumo-layout="hero"] {
163
+ justify-content: center;
164
+ }
165
+
166
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"] {
167
+ padding: var(--velumo-spacing-lg, 2rem);
168
+ border: 1px solid color-mix(in srgb, var(--velumo-color-muted, #9aa6b8) 18%, transparent);
169
+ border-radius: var(--velumo-radius-card, 1.25rem);
170
+ background: linear-gradient(180deg, color-mix(in srgb, var(--velumo-text-default, #e8edf4) 8%, transparent), color-mix(in srgb, var(--velumo-text-default, #e8edf4) 3%, transparent)), var(--velumo-surface-card, rgba(255, 255, 255, 0.04));
171
+ box-shadow: var(--velumo-shadow-card, 0 24px 80px rgba(0, 0, 0, 0.45));
172
+ }
173
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="muted"] { border-color: color-mix(in srgb, var(--velumo-tone-muted) 40%, transparent); }
174
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="accent"] { border-color: color-mix(in srgb, var(--velumo-tone-accent) 40%, transparent); }
175
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="danger"] { border-color: color-mix(in srgb, var(--velumo-tone-danger) 40%, transparent); }
176
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="magenta"] { border-color: color-mix(in srgb, var(--velumo-tone-magenta) 40%, transparent); }
177
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="cyan"] { border-color: color-mix(in srgb, var(--velumo-tone-cyan) 40%, transparent); }
178
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="purple"] { border-color: color-mix(in srgb, var(--velumo-tone-purple) 40%, transparent); }
179
+ [data-velumo-renderer="dom"] [data-velumo-layout="frame"][data-velumo-frame-tone="green"] { border-color: color-mix(in srgb, var(--velumo-tone-green) 40%, transparent); }
180
+
181
+ [data-velumo-renderer="dom"] [data-velumo-layout="stack"][data-velumo-stack-justify="center"] { justify-content: center; }
182
+ [data-velumo-renderer="dom"] [data-velumo-layout="stack"][data-velumo-stack-justify="between"] { justify-content: space-between; }
183
+ [data-velumo-renderer="dom"] [data-velumo-layout="stack"][data-velumo-stack-justify="end"] { justify-content: flex-end; }
184
+ [data-velumo-renderer="dom"] [data-velumo-stack-align="start"] { align-items: flex-start; }
185
+ [data-velumo-renderer="dom"] [data-velumo-stack-align="center"] { align-items: center; }
186
+ [data-velumo-renderer="dom"] [data-velumo-stack-align="end"] { align-items: flex-end; }
187
+ [data-velumo-renderer="dom"] [data-velumo-stack-align="stretch"] { align-items: stretch; }
188
+ [data-velumo-renderer="dom"] [data-velumo-layout="canvas"] { flex: 1; min-height: 0; }
189
+ [data-velumo-renderer="dom"] [data-velumo-slide-id]::after,
190
+ [data-velumo-renderer="dom"] [data-velumo-spatial="viewport"]::after {
191
+ content: "";
192
+ position: absolute;
193
+ inset: 0;
194
+ pointer-events: none;
195
+ z-index: 2;
196
+ background: radial-gradient(120% 120% at 50% 42%, transparent 55%, rgba(0, 0, 0, var(--velumo-vignette-strength, 0.5)) 100%);
197
+ mix-blend-mode: multiply;
198
+ }
199
+
200
+ [data-velumo-renderer="dom"] [data-velumo-layout="grid"] {
201
+ display: grid;
202
+ grid-template-columns: repeat(var(--velumo-layout-columns, 2), minmax(0, 1fr));
203
+ gap: var(--velumo-spacing-md, 1.25rem);
204
+ }
205
+
206
+ [data-velumo-renderer="dom"] [data-velumo-layout="split"] {
207
+ display: grid;
208
+ grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
209
+ gap: var(--velumo-spacing-lg, 2rem);
210
+ align-items: start;
211
+ }
212
+
213
+ [data-velumo-renderer="dom"] [data-velumo-element="heading"] {
214
+ margin: 0;
215
+ max-width: 20ch;
216
+ text-wrap: balance;
217
+ color: var(--velumo-text-default, #e8edf4);
218
+ font-family: var(--velumo-typography-heading-font-family, ui-sans-serif, system-ui, sans-serif);
219
+ font-size: var(--velumo-typography-heading-font-size, clamp(2.25rem, 5cqw, 4.5rem));
220
+ font-weight: var(--velumo-typography-heading-font-weight, 760);
221
+ letter-spacing: var(--velumo-typography-heading-letter-spacing, -0.045em);
222
+ line-height: var(--velumo-typography-heading-line-height, 1.05);
223
+ }
224
+ [data-velumo-renderer="dom"] [data-velumo-element="heading"][data-velumo-heading-size="display"] {
225
+ font-size: calc(var(--velumo-typography-heading-font-size, clamp(2.25rem, 5cqw, 4.5rem))*1.55);
226
+ line-height: 0.98;
227
+ }
228
+ [data-velumo-renderer="dom"] [data-velumo-element="heading"][data-velumo-heading-size="hero"] {
229
+ font-size: calc(var(--velumo-typography-heading-font-size, clamp(2.25rem, 5cqw, 4.5rem))*2.5);
230
+ line-height: 0.9;
231
+ }
232
+
233
+ [data-velumo-renderer="dom"] [data-velumo-element="text"] {
234
+ margin: 0;
235
+ max-width: 68ch;
236
+ color: var(--velumo-text-default, #e8edf4);
237
+ font-size: var(--velumo-typography-body-font-size, 1.125rem);
238
+ line-height: var(--velumo-typography-body-line-height, 1.6);
239
+ }
240
+
241
+ [data-velumo-renderer="dom"] [data-velumo-text-variant="lead"] {
242
+ color: var(--velumo-text-muted, #9aa6b8);
243
+ font-size: 1.3275rem;
244
+ }
245
+
246
+ [data-velumo-renderer="dom"] [data-velumo-text-variant="caption"] {
247
+ color: var(--velumo-text-muted, #9aa6b8);
248
+ font-size: var(--velumo-typography-caption-font-size, 0.92rem);
249
+ letter-spacing: var(--velumo-typography-caption-letter-spacing, 0.02em);
250
+ line-height: var(--velumo-typography-caption-line-height, 1.45);
251
+ }
252
+
253
+ [data-velumo-renderer="dom"] [data-velumo-element="media"] {
254
+ display: block;
255
+ max-width: 100%;
256
+ min-height: 8rem;
257
+ border-radius: var(--velumo-radius-card, 1.25rem);
258
+ background: var(--velumo-surface-muted, #1a1f29);
259
+ object-fit: contain;
260
+ }
261
+
262
+ [data-velumo-renderer="dom"] [data-velumo-media-fit="cover"] {
263
+ object-fit: cover;
264
+ }
265
+
266
+ [data-velumo-renderer="dom"] [data-velumo-media-fit="fill"] {
267
+ object-fit: fill;
268
+ }
269
+
270
+ [data-velumo-renderer="dom"] [data-velumo-element="callout"] {
271
+ display: grid;
272
+ gap: var(--velumo-spacing-sm, 0.75rem);
273
+ padding: var(--velumo-spacing-md, 1.25rem) var(--velumo-spacing-lg, 2rem);
274
+ border: 1px solid color-mix(in srgb, var(--velumo-text-default, #e8edf4) 12%, transparent);
275
+ border-left: 0.3rem solid var(--velumo-color-accent, #6ea8fe);
276
+ border-radius: var(--velumo-radius-card, 1.25rem);
277
+ background: linear-gradient(180deg, color-mix(in srgb, var(--velumo-text-default, #e8edf4) 9%, transparent), color-mix(in srgb, var(--velumo-text-default, #e8edf4) 4%, transparent));
278
+ box-shadow: var(--velumo-shadow-card, 0 24px 80px rgba(0, 0, 0, 0.45));
279
+ color: var(--velumo-text-default, #e8edf4);
280
+ }
281
+
282
+ [data-velumo-renderer="dom"] [data-velumo-callout-tone="info"] {
283
+ border-left-color: var(--velumo-color-cyan, #5bd6f0);
284
+ }
285
+
286
+ [data-velumo-renderer="dom"] [data-velumo-callout-tone="warning"] {
287
+ border-left-color: var(--velumo-color-magenta, #ff6ba3);
288
+ }
289
+
290
+ [data-velumo-renderer="dom"] [data-velumo-callout-tone="success"] {
291
+ border-left-color: var(--velumo-color-green, #5fd398);
292
+ }
293
+
294
+ [data-velumo-renderer="dom"] [data-velumo-callout-tone="quote"] {
295
+ border-left-color: var(--velumo-color-muted, #9aa6b8);
296
+ }
297
+
298
+ [data-velumo-renderer="dom"] [data-velumo-callout-tone="danger"] {
299
+ border-left-color: var(--velumo-color-danger, #ff6b6b);
300
+ }
301
+
302
+ [data-velumo-renderer="dom"] [data-velumo-layer-type="markdown"],
303
+ [data-velumo-renderer="dom"] [data-velumo-layer-type="html"] {
304
+ margin-top: var(--velumo-spacing-lg, 2rem);
305
+ color: var(--velumo-text-default, #e8edf4);
306
+ font-size: var(--velumo-typography-body-font-size, 1.125rem);
307
+ line-height: var(--velumo-typography-body-line-height, 1.6);
308
+ }
309
+
310
+ [data-velumo-renderer="dom"] [data-velumo-fragment="hidden"] {
311
+ display: none;
312
+ }
313
+
314
+ @media (prefers-reduced-motion: no-preference) {
315
+ @keyframes velumo-rise {
316
+ from { opacity: 0; transform: translateY(2rem); }
317
+ to { opacity: 1; transform: none; }
318
+ }
319
+ @keyframes velumo-fade {
320
+ from { opacity: 0; }
321
+ to { opacity: 1; }
322
+ }
323
+ @keyframes velumo-zoom {
324
+ from { opacity: 0; transform: scale(0.86); }
325
+ to { opacity: 1; transform: none; }
326
+ }
327
+ @keyframes velumo-draw {
328
+ from { opacity: 0; transform: scaleX(0); }
329
+ to { opacity: 1; transform: scaleX(1); }
330
+ }
331
+ @keyframes velumo-in-left {
332
+ from { opacity: 0; transform: translateX(-3rem); }
333
+ to { opacity: 1; transform: none; }
334
+ }
335
+ @keyframes velumo-in-right {
336
+ from { opacity: 0; transform: translateX(3rem); }
337
+ to { opacity: 1; transform: none; }
338
+ }
339
+
340
+ [data-velumo-renderer="dom"] [data-velumo-animation] {
341
+ animation-duration: var(--velumo-animation-duration, 0.8s);
342
+ animation-delay: var(--velumo-animation-delay, 0s);
343
+ animation-timing-function: var(--velumo-animation-easing, cubic-bezier(0.4, 0, 0.2, 1));
344
+ animation-fill-mode: both;
345
+ }
346
+ [data-velumo-renderer="dom"] [data-velumo-animation="rise"] { animation-name: velumo-rise; }
347
+ [data-velumo-renderer="dom"] [data-velumo-animation="fade"] { animation-name: velumo-fade; }
348
+ [data-velumo-renderer="dom"] [data-velumo-animation="zoom"] { animation-name: velumo-zoom; }
349
+ [data-velumo-renderer="dom"] [data-velumo-animation="draw"] { animation-name: velumo-draw; transform-origin: left center; }
350
+ [data-velumo-renderer="dom"] [data-velumo-animation="in-left"] { animation-name: velumo-in-left; }
351
+ [data-velumo-renderer="dom"] [data-velumo-animation="in-right"] { animation-name: velumo-in-right; }
352
+
353
+ @keyframes velumo-glow {
354
+ from { text-shadow: 0 0 28px rgba(255, 209, 102, 0.4), 0 0 60px rgba(255, 61, 127, 0.28); }
355
+ to { text-shadow: 0 0 40px rgba(255, 209, 102, 0.6), 0 0 96px rgba(255, 61, 127, 0.42); }
356
+ }
357
+ @keyframes velumo-blink {
358
+ 0%, 100% { opacity: 1; }
359
+ 50% { opacity: 0.35; }
360
+ }
361
+ @keyframes velumo-pulse {
362
+ 0%, 100% { opacity: 0.55; transform: none; }
363
+ 50% { opacity: 1; transform: scale(1.03); }
364
+ }
365
+ @keyframes velumo-sweep {
366
+ from { transform: translateX(-46%); }
367
+ to { transform: translateX(46%); }
368
+ }
369
+ [data-velumo-renderer="dom"] [data-velumo-animation="glow"] { animation: velumo-glow var(--velumo-animation-duration, 2.6s) var(--velumo-animation-easing, ease-in-out) var(--velumo-animation-delay, 0s) infinite alternate; }
370
+ [data-velumo-renderer="dom"] [data-velumo-animation="blink"] { animation: velumo-blink max(1s, var(--velumo-animation-duration, 1.4s)) var(--velumo-animation-easing, ease-in-out) var(--velumo-animation-delay, 0s) infinite; }
371
+ [data-velumo-renderer="dom"] [data-velumo-animation="pulse"] { animation: velumo-pulse var(--velumo-animation-duration, 2.4s) var(--velumo-animation-easing, ease-in-out) var(--velumo-animation-delay, 0s) infinite; }
372
+ [data-velumo-renderer="dom"] [data-velumo-animation="sweep"] { animation: velumo-sweep var(--velumo-animation-duration, 3.2s) var(--velumo-animation-easing, cubic-bezier(0.4, 0, 0.2, 1)) var(--velumo-animation-delay, 0s) infinite alternate; }
373
+ }
374
+
375
+ [data-velumo-thumbnail] [data-velumo-animation] { animation: none !important; }
376
+
377
+ [data-velumo-renderer="dom"] [data-velumo-text-transform="uppercase"] { text-transform: uppercase; }
378
+ [data-velumo-renderer="dom"] [data-velumo-text-transform="lowercase"] { text-transform: lowercase; }
379
+ [data-velumo-renderer="dom"] [data-velumo-text-transform="capitalize"] { text-transform: capitalize; }
380
+
381
+ [data-velumo-renderer="dom"] [data-velumo-text-decoration="underline"] { text-decoration: underline; }
382
+ [data-velumo-renderer="dom"] [data-velumo-text-decoration="line-through"] { text-decoration: line-through; }
383
+
384
+ [data-velumo-renderer="dom"] [data-velumo-text-glow] {
385
+ text-shadow: 0 0 0.4em currentColor, 0 0 1.2em currentColor;
386
+ }
387
+
388
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="muted"] { color: var(--velumo-text-muted, #9aa6b8); }
389
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="accent"] { color: var(--velumo-text-accent, #9ec5ff); }
390
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="danger"] { color: var(--velumo-text-danger, #ff8585); }
391
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="magenta"] { color: var(--velumo-color-magenta, #ff6ba3); }
392
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="cyan"] { color: var(--velumo-color-cyan, #5bd6f0); }
393
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="purple"] { color: var(--velumo-color-purple, #a98bff); }
394
+ [data-velumo-renderer="dom"] [data-velumo-text-tone="green"] { color: var(--velumo-color-green, #5fd398); }
395
+
396
+ [data-velumo-renderer="dom"] [data-velumo-element="badge"] {
397
+ display: inline-flex;
398
+ align-items: center;
399
+ gap: 0.5em;
400
+ padding: 0.35em 0.9em;
401
+ border-radius: 999px;
402
+ border: 1px solid color-mix(in srgb, currentColor 45%, transparent);
403
+ color: var(--velumo-text-default, #e8edf4);
404
+ font-size: 0.9em;
405
+ line-height: 1.2;
406
+ vertical-align: middle;
407
+ white-space: nowrap;
408
+ }
409
+ [data-velumo-renderer="dom"] [data-velumo-badge-mono] {
410
+ font-family: var(--velumo-font-mono, ui-monospace, "JetBrains Mono", monospace);
411
+ letter-spacing: 0.02em;
412
+ }
413
+ [data-velumo-renderer="dom"] [data-velumo-badge-variant="soft"] {
414
+ background: color-mix(in srgb, currentColor 12%, transparent);
415
+ }
416
+ [data-velumo-renderer="dom"] [data-velumo-badge-variant="solid"] {
417
+ background: color-mix(in srgb, currentColor 22%, transparent);
418
+ border-color: color-mix(in srgb, currentColor 60%, transparent);
419
+ }
420
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="muted"] { color: var(--velumo-text-muted, #9aa6b8); }
421
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="accent"] { color: var(--velumo-text-accent, #9ec5ff); }
422
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="danger"] { color: var(--velumo-text-danger, #ff8585); }
423
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="magenta"] { color: var(--velumo-color-magenta, #ff6ba3); }
424
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="cyan"] { color: var(--velumo-color-cyan, #5bd6f0); }
425
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="purple"] { color: var(--velumo-color-purple, #a98bff); }
426
+ [data-velumo-renderer="dom"] [data-velumo-badge-tone="green"] { color: var(--velumo-color-green, #5fd398); }
427
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot] {
428
+ width: 0.6em;
429
+ height: 0.6em;
430
+ border-radius: 999px;
431
+ flex: none;
432
+ background: currentColor;
433
+ box-shadow: 0 0 0.6em currentColor;
434
+ }
435
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="muted"] { color: var(--velumo-text-muted, #9aa6b8); }
436
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="accent"] { color: var(--velumo-text-accent, #9ec5ff); }
437
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="danger"] { color: var(--velumo-text-danger, #ff8585); }
438
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="magenta"] { color: var(--velumo-color-magenta, #ff6ba3); }
439
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="cyan"] { color: var(--velumo-color-cyan, #5bd6f0); }
440
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="purple"] { color: var(--velumo-color-purple, #a98bff); }
441
+ [data-velumo-renderer="dom"] [data-velumo-badge-dot="green"] { color: var(--velumo-color-green, #5fd398); }
442
+
443
+ [data-velumo-renderer="dom"] [data-velumo-element="rule"] {
444
+ display: block;
445
+ flex: none;
446
+ background: var(--velumo-tone-default);
447
+ }
448
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="muted"] { background: var(--velumo-tone-muted); }
449
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="accent"] { background: var(--velumo-tone-accent); }
450
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="danger"] { background: var(--velumo-tone-danger); }
451
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="magenta"] { background: var(--velumo-tone-magenta); }
452
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="cyan"] { background: var(--velumo-tone-cyan); }
453
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="purple"] { background: var(--velumo-tone-purple); }
454
+ [data-velumo-renderer="dom"] [data-velumo-rule-tone="green"] { background: var(--velumo-tone-green); }
455
+ [data-velumo-renderer="dom"] [data-velumo-rule-gradient] {
456
+ background: linear-gradient(90deg, var(--velumo-rule-from, var(--velumo-tone-default)), var(--velumo-rule-to, var(--velumo-tone-default)));
457
+ }
458
+
459
+ [data-velumo-renderer="dom"] pre[data-velumo-element="code"] {
460
+ margin: 0;
461
+ padding: 1.1rem 1.35rem;
462
+ border: 1px solid var(--velumo-color-muted, #9aa6b8);
463
+ border-radius: var(--velumo-radii-card, 0.75rem);
464
+ background: var(--velumo-surface-muted, #1a1f29);
465
+ color: var(--velumo-text-default, #e8edf4);
466
+ font-family: ui-monospace, SFMono-Regular, "JetBrains Mono", Menlo, Consolas, monospace;
467
+ font-size: 0.95em;
468
+ line-height: 1.6;
469
+ overflow: auto;
470
+ white-space: pre;
471
+ }
472
+ [data-velumo-renderer="dom"] [data-velumo-token="keyword"] { color: var(--velumo-color-purple, #a98bff); }
473
+ [data-velumo-renderer="dom"] [data-velumo-token="function"] { color: var(--velumo-text-accent, #9ec5ff); }
474
+ [data-velumo-renderer="dom"] [data-velumo-token="string"] { color: var(--velumo-color-green, #5fd398); }
475
+ [data-velumo-renderer="dom"] [data-velumo-token="number"] { color: var(--velumo-color-magenta, #ff6ba3); }
476
+ [data-velumo-renderer="dom"] [data-velumo-token="property"] { color: var(--velumo-color-cyan, #5bd6f0); }
477
+ [data-velumo-renderer="dom"] [data-velumo-token="comment"] { color: var(--velumo-text-muted, #9aa6b8); }
478
+ [data-velumo-renderer="dom"] [data-velumo-token="punctuation"] { color: var(--velumo-text-muted, #9aa6b8); }
479
+
480
+ [data-velumo-renderer="dom"] [data-velumo-element="icon"] {
481
+ display: inline-flex;
482
+ align-items: center;
483
+ justify-content: center;
484
+ width: 1.6em;
485
+ height: 1.6em;
486
+ border-radius: 999px;
487
+ background: color-mix(in srgb, currentColor 20%, transparent);
488
+ vertical-align: middle;
489
+ flex: none;
490
+ }
491
+ [data-velumo-renderer="dom"] [data-velumo-element="icon"]::before {
492
+ content: "";
493
+ display: block;
494
+ box-sizing: border-box;
495
+ }
496
+ [data-velumo-renderer="dom"] [data-velumo-icon="check"]::before {
497
+ width: 0.34em;
498
+ height: 0.62em;
499
+ border: solid currentColor;
500
+ border-width: 0 0.14em 0.14em 0;
501
+ transform: translateY(-0.07em) rotate(45deg);
502
+ }
503
+ [data-velumo-renderer="dom"] [data-velumo-icon="cross"] { position: relative; }
504
+ [data-velumo-renderer="dom"] [data-velumo-icon="cross"]::before,
505
+ [data-velumo-renderer="dom"] [data-velumo-icon="cross"]::after {
506
+ content: "";
507
+ position: absolute;
508
+ top: 50%;
509
+ left: 50%;
510
+ width: 0.72em;
511
+ height: 0.14em;
512
+ border-radius: 2px;
513
+ background: currentColor;
514
+ }
515
+ [data-velumo-renderer="dom"] [data-velumo-icon="cross"]::before { transform: translate(-50%, -50%) rotate(45deg); }
516
+ [data-velumo-renderer="dom"] [data-velumo-icon="cross"]::after { transform: translate(-50%, -50%) rotate(-45deg); }
517
+ [data-velumo-renderer="dom"] [data-velumo-icon="dash"]::before {
518
+ width: 0.72em;
519
+ height: 0.14em;
520
+ border-radius: 2px;
521
+ background: currentColor;
522
+ }
523
+ [data-velumo-renderer="dom"] [data-velumo-icon="ring"]::before {
524
+ width: 0.78em;
525
+ height: 0.78em;
526
+ border: 0.13em solid currentColor;
527
+ border-radius: 50%;
528
+ }
529
+ [data-velumo-renderer="dom"] [data-velumo-icon="dot"]::before {
530
+ width: 0.5em;
531
+ height: 0.5em;
532
+ background: currentColor;
533
+ border-radius: 50%;
534
+ }
535
+ [data-velumo-renderer="dom"] [data-velumo-icon="arrow"]::before {
536
+ width: 0.42em;
537
+ height: 0.42em;
538
+ border: solid currentColor;
539
+ border-width: 0.14em 0.14em 0 0;
540
+ transform: translateX(-0.08em) rotate(45deg);
541
+ }
542
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] {
543
+ display: flex;
544
+ flex-direction: column;
545
+ border: 1px solid var(--velumo-color-muted, #9aa6b8);
546
+ border-radius: var(--velumo-radii-card, 0.75rem);
547
+ background: var(--velumo-surface-muted, #1a1f29);
548
+ overflow: hidden;
549
+ }
550
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [role="row"] {
551
+ display: grid;
552
+ grid-template-columns: var(--velumo-table-columns, 1fr);
553
+ align-items: center;
554
+ padding: 0 1.4rem;
555
+ }
556
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [data-velumo-table-head] {
557
+ background: color-mix(in srgb, var(--velumo-text-default, #e8edf4) 8%, transparent);
558
+ border-bottom: 1px solid var(--velumo-color-muted, #9aa6b8);
559
+ }
560
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [role="rowgroup"] [role="row"] + [role="row"] {
561
+ border-top: 1px solid color-mix(in srgb, var(--velumo-text-default, #e8edf4) 8%, transparent);
562
+ }
563
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [role="cell"],
564
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [role="columnheader"] {
565
+ display: flex;
566
+ align-items: center;
567
+ align-self: stretch;
568
+ padding: 0.85rem 0;
569
+ }
570
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [role="columnheader"] {
571
+ font-weight: 650;
572
+ letter-spacing: 0.01em;
573
+ }
574
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [data-velumo-col-align="center"] { justify-content: center; }
575
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [data-velumo-col-align="end"] { justify-content: flex-end; }
576
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [data-velumo-col-emphasis] {
577
+ background: color-mix(in srgb, var(--velumo-text-accent, #6ea8fe) 10%, transparent);
578
+ }
579
+ [data-velumo-renderer="dom"] [data-velumo-layout="table"] [data-velumo-table-head] [data-velumo-col-emphasis] {
580
+ box-shadow: inset 0 0.18rem 0 0 var(--velumo-text-accent, #6ea8fe);
581
+ }
582
+ `.trim();