sid-ui 0.0.0-stage → 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 (116) hide show
  1. package/README.md +54 -2
  2. package/package.json +51 -4
  3. package/src/brand/BrandFooter.tsx +45 -0
  4. package/src/brand/BrandHeading.tsx +24 -0
  5. package/src/brand/BrandLockup.tsx +47 -0
  6. package/src/brand/JoinedLogo.tsx +67 -0
  7. package/src/brand/JoinedMark.tsx +76 -0
  8. package/src/brand/geometry.ts +26 -0
  9. package/src/brand/index.ts +11 -0
  10. package/src/brand/name.ts +5 -0
  11. package/src/brand/paint.tsx +56 -0
  12. package/src/components/Action.tsx +44 -0
  13. package/src/components/AddressSelector.tsx +99 -0
  14. package/src/components/BarChart.tsx +132 -0
  15. package/src/components/Calendar.tsx +284 -0
  16. package/src/components/CalendarAgenda.tsx +87 -0
  17. package/src/components/CalendarMonth.tsx +223 -0
  18. package/src/components/CalendarSchedule.tsx +210 -0
  19. package/src/components/Card.tsx +80 -0
  20. package/src/components/Charts.tsx +64 -0
  21. package/src/components/Chat.tsx +35 -0
  22. package/src/components/CitySelector.tsx +81 -0
  23. package/src/components/Clock.tsx +196 -0
  24. package/src/components/CodeInput.tsx +183 -0
  25. package/src/components/Container.tsx +20 -0
  26. package/src/components/Content.tsx +50 -0
  27. package/src/components/Data.tsx +43 -0
  28. package/src/components/DataInput.tsx +107 -0
  29. package/src/components/DateField.tsx +162 -0
  30. package/src/components/DonutChart.tsx +123 -0
  31. package/src/components/Drawer.tsx +110 -0
  32. package/src/components/Feedback.tsx +37 -0
  33. package/src/components/FileUploader.tsx +377 -0
  34. package/src/components/FunnelChart.tsx +83 -0
  35. package/src/components/Glyph.tsx +330 -0
  36. package/src/components/GoogleSignIn.tsx +67 -0
  37. package/src/components/GridSystem.tsx +131 -0
  38. package/src/components/HeatmapCalendar.tsx +167 -0
  39. package/src/components/KanbanBoard.tsx +421 -0
  40. package/src/components/Kpi.tsx +61 -0
  41. package/src/components/LayoutPrimitives.tsx +86 -0
  42. package/src/components/Lists.tsx +19 -0
  43. package/src/components/LocationSelector.tsx +49 -0
  44. package/src/components/MessageList.tsx +80 -0
  45. package/src/components/Nav.tsx +69 -0
  46. package/src/components/Navigation.tsx +52 -0
  47. package/src/components/Notification.tsx +115 -0
  48. package/src/components/NotificationTrigger.tsx +248 -0
  49. package/src/components/Overlay.tsx +50 -0
  50. package/src/components/Page.tsx +143 -0
  51. package/src/components/PageTabs.tsx +28 -0
  52. package/src/components/PickerShell.tsx +138 -0
  53. package/src/components/PillNav.tsx +194 -0
  54. package/src/components/Primitives.tsx +30 -0
  55. package/src/components/Rating.tsx +78 -0
  56. package/src/components/Responsive.tsx +128 -0
  57. package/src/components/ResponsiveFrame.tsx +122 -0
  58. package/src/components/Segment.tsx +190 -0
  59. package/src/components/Sparkline.tsx +52 -0
  60. package/src/components/StateSelector.tsx +39 -0
  61. package/src/components/Sticky.tsx +95 -0
  62. package/src/components/Table.tsx +344 -0
  63. package/src/components/ThemeToggle.tsx +48 -0
  64. package/src/components/Tile.tsx +23 -0
  65. package/src/components/TimeColumns.tsx +155 -0
  66. package/src/components/TimeDial.tsx +260 -0
  67. package/src/components/TimeField.tsx +196 -0
  68. package/src/components/TimeInput.tsx +213 -0
  69. package/src/components/TimeSlots.tsx +83 -0
  70. package/src/components/Timeline.tsx +111 -0
  71. package/src/components/TokenDemo.tsx +378 -0
  72. package/src/components/Tree.tsx +283 -0
  73. package/src/components/TrendChart.tsx +211 -0
  74. package/src/components/breakpoints.ts +42 -0
  75. package/src/components/calendarTypes.ts +26 -0
  76. package/src/components/chartMath.ts +125 -0
  77. package/src/components/chartParts.tsx +116 -0
  78. package/src/components/codeInputRules.ts +58 -0
  79. package/src/components/date.ts +87 -0
  80. package/src/components/hooks.ts +53 -0
  81. package/src/components/index.ts +195 -0
  82. package/src/components/kanban.ts +78 -0
  83. package/src/components/motion.ts +78 -0
  84. package/src/components/places-search.tsx +73 -0
  85. package/src/components/places.ts +209 -0
  86. package/src/components/size.ts +3 -0
  87. package/src/components/time.ts +83 -0
  88. package/src/components/useFileDrop.ts +104 -0
  89. package/src/places/geoapify.ts +129 -0
  90. package/src/styles/astryx.css +5 -0
  91. package/src/styles/components/brand.css +98 -0
  92. package/src/styles/components/calendar.css +680 -0
  93. package/src/styles/components/charts.css +659 -0
  94. package/src/styles/components/code-input.css +233 -0
  95. package/src/styles/components/google.css +11 -0
  96. package/src/styles/components/message-list.css +153 -0
  97. package/src/styles/components/notification.css +350 -0
  98. package/src/styles/components/picker.css +114 -0
  99. package/src/styles/components/pill-nav.css +179 -0
  100. package/src/styles/components/responsive.css +419 -0
  101. package/src/styles/components/sticky.css +23 -0
  102. package/src/styles/components/table.css +267 -0
  103. package/src/styles/components/time.css +526 -0
  104. package/src/styles/components/timeline.css +426 -0
  105. package/src/styles/components/tree.css +269 -0
  106. package/src/styles/components.css +423 -0
  107. package/src/styles/joined.css +4 -0
  108. package/src/styles/theme.css +79 -0
  109. package/src/styles/tokens.css +338 -0
  110. package/src/theme/JoinedProvider.tsx +50 -0
  111. package/src/theme/index.ts +3 -0
  112. package/src/theme/joined.d.ts +11 -0
  113. package/src/theme/joined.js +569 -0
  114. package/src/theme/joined.theme.ts +74 -0
  115. package/src/theme/joined.variants.d.ts +16 -0
  116. package/src/theme/theme.css +786 -0
@@ -0,0 +1,659 @@
1
+ /* SegmentBar — a proportion bar coloured from the theme's data tokens. */
2
+
3
+ .os-segments {
4
+ display: flex;
5
+ width: 100%;
6
+ flex-direction: column;
7
+ gap: var(--spacing-3);
8
+ }
9
+
10
+ .os-segment-track {
11
+ display: flex;
12
+ width: 100%;
13
+ gap: var(--spacing-0-5);
14
+ height: var(--spacing-2);
15
+ overflow: hidden;
16
+ border-radius: var(--radius-full);
17
+ background: var(--color-track);
18
+ }
19
+
20
+ .os-segment {
21
+ min-width: var(--spacing-1);
22
+ height: 100%;
23
+ border-radius: var(--radius-full);
24
+ transition: width var(--duration-slow) var(--ease-standard);
25
+ }
26
+
27
+ .os-segment[data-tone="blue"],
28
+ .os-segment-key[data-tone="blue"] {
29
+ background: var(--color-data-blue-3);
30
+ }
31
+ .os-segment[data-tone="green"],
32
+ .os-segment-key[data-tone="green"] {
33
+ background: var(--color-data-categorical-green);
34
+ }
35
+ .os-segment[data-tone="orange"],
36
+ .os-segment-key[data-tone="orange"] {
37
+ background: var(--color-data-categorical-orange);
38
+ }
39
+ .os-segment[data-tone="red"],
40
+ .os-segment-key[data-tone="red"] {
41
+ background: var(--color-data-categorical-red);
42
+ }
43
+ .os-segment[data-tone="neutral"],
44
+ .os-segment-key[data-tone="neutral"] {
45
+ background: var(--color-data-neutral);
46
+ }
47
+
48
+ .os-segment-legend {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ gap: var(--spacing-1) var(--spacing-4);
52
+ margin: 0;
53
+ padding: 0;
54
+ list-style: none;
55
+ color: var(--color-text-secondary);
56
+ font-size: var(--font-size-sm);
57
+ }
58
+
59
+ .os-segment-legend li {
60
+ display: inline-flex;
61
+ align-items: center;
62
+ gap: var(--spacing-1-5);
63
+ }
64
+
65
+ .os-segment-legend strong {
66
+ color: var(--color-text-primary);
67
+ font-weight: var(--font-weight-semibold);
68
+ }
69
+
70
+ .os-segment-key {
71
+ width: var(--spacing-2);
72
+ height: var(--spacing-2);
73
+ border-radius: var(--radius-full);
74
+ }
75
+
76
+ @media (prefers-reduced-motion: reduce) {
77
+ .os-segment {
78
+ transition: none;
79
+ }
80
+ }
81
+
82
+ /* ── Shared chart parts ───────────────────────────────────────────────
83
+ Tones resolve to the theme's data tokens in the fixed series order:
84
+ blue, orange, purple, green; red for loss, neutral for "other". Text
85
+ never wears a data colour — values and labels use text tokens. */
86
+
87
+ .os-chart {
88
+ position: relative;
89
+ display: flex;
90
+ width: 100%;
91
+ min-width: 0;
92
+ flex-direction: column;
93
+ gap: var(--spacing-3);
94
+ }
95
+
96
+ [data-tone="blue"] {
97
+ --os-chart-tone: var(--color-data-blue-3);
98
+ }
99
+ [data-tone="orange"] {
100
+ --os-chart-tone: var(--color-data-categorical-orange);
101
+ }
102
+ [data-tone="purple"] {
103
+ --os-chart-tone: var(--color-data-categorical-purple);
104
+ }
105
+ [data-tone="green"] {
106
+ --os-chart-tone: var(--color-data-categorical-green);
107
+ }
108
+ [data-tone="red"] {
109
+ --os-chart-tone: var(--color-data-categorical-red);
110
+ }
111
+ [data-tone="neutral"] {
112
+ --os-chart-tone: var(--color-data-neutral);
113
+ }
114
+ .os-segment[data-tone="purple"],
115
+ .os-segment-key[data-tone="purple"] {
116
+ background: var(--color-data-categorical-purple);
117
+ }
118
+
119
+ .os-chart-legend {
120
+ display: flex;
121
+ flex-wrap: wrap;
122
+ gap: var(--spacing-1) var(--spacing-4);
123
+ margin: 0;
124
+ padding: 0;
125
+ list-style: none;
126
+ color: var(--color-text-secondary);
127
+ font-size: var(--font-size-sm);
128
+ }
129
+
130
+ .os-chart-legend li {
131
+ display: inline-flex;
132
+ align-items: center;
133
+ gap: var(--spacing-1-5);
134
+ }
135
+
136
+ .os-chart-legend strong {
137
+ color: var(--color-text-primary);
138
+ font-weight: var(--font-weight-semibold);
139
+ }
140
+
141
+ .os-chart-key {
142
+ flex-shrink: 0;
143
+ width: var(--spacing-2);
144
+ height: var(--spacing-2);
145
+ border-radius: var(--radius-full);
146
+ background: var(--os-chart-tone);
147
+ }
148
+
149
+ .os-chart-key[data-mark="line"] {
150
+ width: var(--spacing-3);
151
+ height: var(--spacing-0-5);
152
+ }
153
+
154
+ .os-chart-frame {
155
+ position: relative;
156
+ width: 100%;
157
+ min-width: 0;
158
+ border-radius: var(--radius-inner);
159
+ }
160
+
161
+ .os-chart-frame:focus-visible {
162
+ outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
163
+ outline-offset: var(--spacing-1);
164
+ }
165
+
166
+ .os-chart-svg {
167
+ display: block;
168
+ overflow: visible;
169
+ }
170
+
171
+ .os-chart-grid {
172
+ stroke: var(--color-border);
173
+ stroke-width: 1;
174
+ shape-rendering: crispEdges;
175
+ }
176
+
177
+ .os-chart-axis {
178
+ fill: var(--color-text-secondary);
179
+ font-size: var(--font-size-xs);
180
+ font-variant-numeric: tabular-nums;
181
+ }
182
+
183
+ .os-chart-line {
184
+ fill: none;
185
+ stroke: var(--os-chart-tone);
186
+ stroke-width: 2;
187
+ stroke-linecap: round;
188
+ stroke-linejoin: round;
189
+ }
190
+
191
+ .os-chart-area {
192
+ fill: var(--os-chart-tone);
193
+ fill-opacity: 0.1;
194
+ stroke: none;
195
+ }
196
+
197
+ .os-chart-dot {
198
+ fill: var(--os-chart-tone);
199
+ stroke: var(--color-background-surface);
200
+ stroke-width: 2;
201
+ }
202
+
203
+ .os-chart-crosshair {
204
+ stroke: var(--color-border-emphasized);
205
+ stroke-width: 1;
206
+ shape-rendering: crispEdges;
207
+ }
208
+
209
+ .os-chart-hit {
210
+ fill: transparent;
211
+ cursor: crosshair;
212
+ }
213
+
214
+ /* The hover readout: value first, name after, a short line keys the series. */
215
+ .os-chart-tip {
216
+ position: absolute;
217
+ z-index: 2;
218
+ display: flex;
219
+ min-width: max-content;
220
+ flex-direction: column;
221
+ gap: var(--spacing-1);
222
+ padding: var(--spacing-2) var(--spacing-3);
223
+ border: var(--border-width) solid var(--color-border);
224
+ border-radius: var(--radius-inner);
225
+ background: var(--color-background-popover);
226
+ box-shadow: var(--elevation-1);
227
+ color: var(--color-text-secondary);
228
+ font-size: var(--font-size-sm);
229
+ pointer-events: none;
230
+ transform: translate(-50%, calc(-100% - var(--spacing-2)));
231
+ }
232
+
233
+ .os-chart-frame .os-chart-tip {
234
+ transform: translateX(-50%);
235
+ }
236
+ .os-chart-frame .os-chart-tip[data-align="start"] {
237
+ transform: none;
238
+ }
239
+ .os-chart-frame .os-chart-tip[data-align="end"] {
240
+ transform: translateX(-100%);
241
+ }
242
+
243
+ .os-chart-tip-title {
244
+ color: var(--color-text-secondary);
245
+ font-weight: var(--font-weight-semibold);
246
+ }
247
+
248
+ .os-chart-tip-row {
249
+ display: inline-flex;
250
+ align-items: center;
251
+ gap: var(--spacing-1-5);
252
+ }
253
+
254
+ .os-chart-tip-row strong {
255
+ color: var(--color-text-primary);
256
+ font-weight: var(--font-weight-semibold);
257
+ font-variant-numeric: tabular-nums;
258
+ }
259
+
260
+ /* ── BarChart ─────────────────────────────────────────────────────── */
261
+
262
+ .os-bars-columns {
263
+ display: grid;
264
+ grid-auto-columns: minmax(0, 1fr);
265
+ grid-auto-flow: column;
266
+ gap: var(--spacing-0-5);
267
+ border-bottom: var(--border-width) solid var(--color-border);
268
+ }
269
+
270
+ .os-bars-column {
271
+ display: flex;
272
+ min-width: 0;
273
+ flex-direction: column;
274
+ align-items: center;
275
+ gap: var(--spacing-2);
276
+ border-radius: var(--radius-inner);
277
+ outline: none;
278
+ }
279
+
280
+ .os-bars-plot {
281
+ position: relative;
282
+ display: flex;
283
+ width: 100%;
284
+ flex: 1;
285
+ flex-direction: column;
286
+ align-items: center;
287
+ justify-content: flex-end;
288
+ gap: var(--spacing-1);
289
+ }
290
+
291
+ .os-bars-columns .os-bars-mark {
292
+ width: 100%;
293
+ max-width: var(--spacing-6);
294
+ min-height: var(--spacing-0-5);
295
+ border-radius: var(--radius-inner) var(--radius-inner) 0 0;
296
+ }
297
+
298
+ .os-bars-columns .os-bars-label {
299
+ overflow: hidden;
300
+ max-width: 100%;
301
+ padding-bottom: var(--spacing-1);
302
+ text-overflow: ellipsis;
303
+ white-space: nowrap;
304
+ transform: translateY(calc(100% + var(--spacing-1)));
305
+ }
306
+
307
+ .os-bars-columns {
308
+ margin-bottom: calc(var(--font-size-sm) * 1.5 + var(--spacing-2));
309
+ }
310
+
311
+ .os-bars-mark {
312
+ display: block;
313
+ background: var(--os-chart-tone);
314
+ transition:
315
+ filter var(--duration-fast) var(--ease-standard),
316
+ width var(--duration-slow) var(--ease-standard),
317
+ height var(--duration-slow) var(--ease-standard);
318
+ }
319
+
320
+ .os-bars-value {
321
+ color: var(--color-text-primary);
322
+ font-size: var(--font-size-sm);
323
+ font-weight: var(--font-weight-semibold);
324
+ font-variant-numeric: tabular-nums;
325
+ }
326
+
327
+ .os-bars-label {
328
+ color: var(--color-text-secondary);
329
+ font-size: var(--font-size-sm);
330
+ }
331
+
332
+ [data-active] > .os-bars-plot > .os-bars-mark,
333
+ [data-active] > .os-bars-track > .os-bars-mark {
334
+ filter: brightness(1.12);
335
+ }
336
+
337
+ .os-bars-column:focus-visible,
338
+ .os-bars-row:focus-visible {
339
+ outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
340
+ outline-offset: var(--spacing-0-5);
341
+ }
342
+
343
+ .os-bars-rows {
344
+ display: grid;
345
+ grid-template-columns: minmax(0, max-content) minmax(0, 1fr) auto;
346
+ gap: var(--spacing-2) var(--spacing-3);
347
+ align-items: center;
348
+ }
349
+
350
+ .os-bars-row {
351
+ display: contents;
352
+ }
353
+
354
+ .os-bars-rows .os-bars-label {
355
+ overflow: hidden;
356
+ max-width: 12rem;
357
+ text-overflow: ellipsis;
358
+ white-space: nowrap;
359
+ }
360
+
361
+ .os-bars-track {
362
+ position: relative;
363
+ display: block;
364
+ height: var(--spacing-3);
365
+ }
366
+
367
+ .os-bars-rows .os-bars-mark {
368
+ height: 100%;
369
+ min-width: var(--spacing-0-5);
370
+ border-radius: 0 var(--radius-inner) var(--radius-inner) 0;
371
+ }
372
+
373
+ .os-bars-rows .os-bars-value {
374
+ text-align: end;
375
+ }
376
+
377
+ /* ── DonutChart ───────────────────────────────────────────────────── */
378
+
379
+ .os-donut {
380
+ display: flex;
381
+ flex-wrap: wrap;
382
+ align-items: center;
383
+ gap: var(--spacing-6);
384
+ }
385
+
386
+ .os-donut-figure {
387
+ position: relative;
388
+ flex-shrink: 0;
389
+ }
390
+
391
+ .os-donut-figure svg {
392
+ display: block;
393
+ }
394
+
395
+ .os-donut-track {
396
+ fill: none;
397
+ stroke: var(--color-background-muted);
398
+ }
399
+
400
+ .os-donut-slice {
401
+ fill: var(--os-chart-tone);
402
+ transition: opacity var(--duration-fast) var(--ease-standard);
403
+ }
404
+
405
+ .os-donut-slice[data-dim] {
406
+ opacity: 0.35;
407
+ }
408
+
409
+ .os-donut-center {
410
+ position: absolute;
411
+ inset: 0;
412
+ display: flex;
413
+ flex-direction: column;
414
+ align-items: center;
415
+ justify-content: center;
416
+ padding: var(--spacing-8);
417
+ color: var(--color-text-secondary);
418
+ font-size: var(--font-size-sm);
419
+ text-align: center;
420
+ pointer-events: none;
421
+ }
422
+
423
+ .os-donut-center strong {
424
+ color: var(--color-text-primary);
425
+ font-size: var(--font-size-2xl);
426
+ font-weight: var(--font-weight-semibold);
427
+ line-height: 1.2;
428
+ }
429
+
430
+ .os-donut-legend {
431
+ display: grid;
432
+ min-width: 0;
433
+ max-width: 24rem;
434
+ flex: 1;
435
+ grid-template-columns: auto minmax(0, 1fr) auto auto;
436
+ gap: var(--spacing-1) var(--spacing-3);
437
+ align-items: center;
438
+ margin: 0;
439
+ padding: 0;
440
+ list-style: none;
441
+ font-size: var(--font-size-sm);
442
+ }
443
+
444
+ .os-donut-legend li {
445
+ display: contents;
446
+ color: var(--color-text-secondary);
447
+ }
448
+
449
+ .os-donut-legend li > * {
450
+ padding-block: var(--spacing-1);
451
+ }
452
+
453
+ .os-donut-legend li[data-active] > .os-donut-name {
454
+ color: var(--color-text-primary);
455
+ }
456
+
457
+ .os-donut-legend li:focus-visible > .os-donut-name {
458
+ outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
459
+ }
460
+
461
+ .os-donut-legend .os-chart-key {
462
+ padding: 0;
463
+ }
464
+
465
+ .os-donut-name {
466
+ overflow: hidden;
467
+ text-overflow: ellipsis;
468
+ white-space: nowrap;
469
+ }
470
+
471
+ .os-donut-legend strong {
472
+ color: var(--color-text-primary);
473
+ font-weight: var(--font-weight-semibold);
474
+ font-variant-numeric: tabular-nums;
475
+ text-align: end;
476
+ }
477
+
478
+ .os-donut-share {
479
+ font-variant-numeric: tabular-nums;
480
+ text-align: end;
481
+ }
482
+
483
+ /* ── Sparkline ────────────────────────────────────────────────────── */
484
+
485
+ .os-sparkline {
486
+ width: 100%;
487
+ min-width: 0;
488
+ }
489
+
490
+ .os-sparkline svg {
491
+ display: block;
492
+ overflow: visible;
493
+ }
494
+
495
+ /* ── FunnelChart ──────────────────────────────────────────────────── */
496
+
497
+ .os-funnel {
498
+ display: grid;
499
+ grid-template-columns: minmax(0, max-content) minmax(0, 1fr) auto;
500
+ gap: var(--spacing-3) var(--spacing-4);
501
+ align-items: center;
502
+ margin: 0;
503
+ padding: 0;
504
+ list-style: none;
505
+ }
506
+
507
+ .os-funnel-stage {
508
+ display: contents;
509
+ }
510
+
511
+ .os-funnel-head {
512
+ display: flex;
513
+ min-width: 0;
514
+ flex-direction: column;
515
+ }
516
+
517
+ .os-funnel-name {
518
+ color: var(--color-text-primary);
519
+ font-size: var(--font-size-base);
520
+ font-weight: var(--font-weight-semibold);
521
+ }
522
+
523
+ .os-funnel-hint {
524
+ overflow: hidden;
525
+ max-width: 14rem;
526
+ color: var(--color-text-secondary);
527
+ font-size: var(--font-size-sm);
528
+ text-overflow: ellipsis;
529
+ white-space: nowrap;
530
+ }
531
+
532
+ .os-funnel-track {
533
+ display: block;
534
+ height: var(--spacing-6);
535
+ border-radius: var(--radius-inner);
536
+ background: var(--color-background-muted);
537
+ }
538
+
539
+ .os-funnel-mark {
540
+ display: block;
541
+ height: 100%;
542
+ min-width: var(--spacing-0-5);
543
+ border-radius: var(--radius-inner);
544
+ background: var(--os-chart-tone);
545
+ transition:
546
+ filter var(--duration-fast) var(--ease-standard),
547
+ width var(--duration-slow) var(--ease-standard);
548
+ }
549
+
550
+ .os-funnel-stage[data-active] .os-funnel-mark {
551
+ filter: brightness(1.12);
552
+ }
553
+
554
+ .os-funnel-figures {
555
+ display: inline-flex;
556
+ align-items: baseline;
557
+ justify-content: flex-end;
558
+ gap: var(--spacing-2);
559
+ font-variant-numeric: tabular-nums;
560
+ }
561
+
562
+ .os-funnel-figures strong {
563
+ min-width: var(--spacing-8);
564
+ color: var(--color-text-primary);
565
+ font-size: var(--font-size-lg);
566
+ font-weight: var(--font-weight-semibold);
567
+ text-align: end;
568
+ }
569
+
570
+ .os-funnel-rate {
571
+ min-width: var(--spacing-10);
572
+ color: var(--color-text-secondary);
573
+ font-size: var(--font-size-sm);
574
+ text-align: end;
575
+ }
576
+
577
+ /* ── HeatmapCalendar ──────────────────────────────────────────────── */
578
+
579
+ .os-heatmap {
580
+ display: flex;
581
+ min-width: 0;
582
+ flex-direction: column;
583
+ gap: var(--spacing-3);
584
+ }
585
+
586
+ .os-heatmap-grid {
587
+ display: grid;
588
+ grid-template-columns: auto repeat(var(--os-heat-weeks), minmax(0, var(--spacing-5)));
589
+ justify-content: start;
590
+ gap: var(--spacing-0-5);
591
+ align-items: center;
592
+ }
593
+
594
+ .os-heatmap-month,
595
+ .os-heatmap-weekday,
596
+ .os-heatmap-scale {
597
+ color: var(--color-text-secondary);
598
+ font-size: var(--font-size-xs);
599
+ white-space: nowrap;
600
+ }
601
+
602
+ .os-heatmap-month {
603
+ overflow: visible;
604
+ width: 0;
605
+ }
606
+
607
+ .os-heatmap-weekday {
608
+ padding-inline-end: var(--spacing-2);
609
+ }
610
+
611
+ .os-heatmap-cell {
612
+ position: relative;
613
+ display: block;
614
+ aspect-ratio: 1;
615
+ min-width: var(--spacing-2);
616
+ border-radius: var(--radius-inner);
617
+ background: var(--color-background-muted);
618
+ outline: none;
619
+ }
620
+
621
+ .os-heatmap-cell[data-empty] {
622
+ background: transparent;
623
+ }
624
+ .os-heatmap-cell[data-level="1"] {
625
+ background: var(--color-data-blue-1);
626
+ }
627
+ .os-heatmap-cell[data-level="2"] {
628
+ background: var(--color-data-blue-2);
629
+ }
630
+ .os-heatmap-cell[data-level="3"] {
631
+ background: var(--color-data-blue-3);
632
+ }
633
+ .os-heatmap-cell[data-level="4"] {
634
+ background: var(--color-data-blue-4);
635
+ }
636
+
637
+ .os-heatmap-grid .os-heatmap-cell:hover,
638
+ .os-heatmap-grid .os-heatmap-cell:focus-visible {
639
+ box-shadow: 0 0 0 var(--spacing-0-5) var(--color-border-emphasized);
640
+ }
641
+
642
+ .os-heatmap-scale {
643
+ display: flex;
644
+ align-items: center;
645
+ justify-content: flex-end;
646
+ gap: var(--spacing-1);
647
+ }
648
+
649
+ .os-heatmap-scale .os-heatmap-cell {
650
+ width: var(--spacing-3);
651
+ }
652
+
653
+ @media (prefers-reduced-motion: reduce) {
654
+ .os-bars-mark,
655
+ .os-funnel-mark,
656
+ .os-donut-slice {
657
+ transition: none;
658
+ }
659
+ }