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,419 @@
1
+ /* Responsive layer — GridSystem, ResponsiveStack, Show/Hide, ResponsiveFrame.
2
+ Container tiers (px): {'sm': 480, 'md': 640, 'lg': 800, 'xl': 1024}. Viewport tiers are Astryx's: {'sm': 640, 'md': 768, 'lg': 1024, 'xl': 1280}.
3
+ Generated per tier; keep the numbers in sync with components/breakpoints.ts. */
4
+
5
+ .os-responsive-container {
6
+ container: os-responsive / inline-size;
7
+ }
8
+
9
+ /* GridSystem */
10
+ .os-gs {
11
+ min-width: 0;
12
+ }
13
+ .os-gs-grid {
14
+ display: grid;
15
+ grid-template-columns: repeat(var(--os-gs-columns), minmax(0, 1fr));
16
+ column-gap: var(--os-gs-gap);
17
+ row-gap: var(--os-gs-row-gap);
18
+ align-items: var(--os-gs-align);
19
+
20
+ /* A GridSystem nested in a GridColumn must not inherit the outer column's
21
+ per-tier spans: an inner column that sets only `md` would otherwise pick
22
+ up the outer `lg` at wide sizes. `initial` makes each var unset here, so
23
+ inner columns fall back to their own values. */
24
+ --os-gs-display: initial;
25
+ --os-gs-display-sm: initial;
26
+ --os-gs-display-md: initial;
27
+ --os-gs-display-lg: initial;
28
+ --os-gs-display-xl: initial;
29
+ --os-gs-span: initial;
30
+ --os-gs-span-sm: initial;
31
+ --os-gs-span-md: initial;
32
+ --os-gs-span-lg: initial;
33
+ --os-gs-span-xl: initial;
34
+ --os-gs-start: initial;
35
+ --os-gs-start-sm: initial;
36
+ --os-gs-start-md: initial;
37
+ --os-gs-start-lg: initial;
38
+ --os-gs-start-xl: initial;
39
+ --os-gs-order: initial;
40
+ --os-gs-order-sm: initial;
41
+ --os-gs-order-md: initial;
42
+ --os-gs-order-lg: initial;
43
+ --os-gs-order-xl: initial;
44
+ --os-gs-rows: initial;
45
+ }
46
+ .os-gs-dense {
47
+ grid-auto-flow: row dense;
48
+ }
49
+ .os-gs-col {
50
+ min-width: 0;
51
+ display: var(--os-gs-display, block);
52
+ grid-column: var(--os-gs-start, auto) / span var(--os-gs-span, var(--os-gs-columns));
53
+ grid-row: span var(--os-gs-rows, 1);
54
+ order: var(--os-gs-order, 0);
55
+ }
56
+
57
+ /* ResponsiveStack — a column until its tier, then a row */
58
+ .os-rstack-root {
59
+ min-width: 0;
60
+ }
61
+ .os-rstack {
62
+ display: flex;
63
+ flex-direction: column;
64
+ gap: var(--os-rstack-gap);
65
+ }
66
+ .os-rstack-reverse {
67
+ flex-direction: column-reverse;
68
+ }
69
+
70
+ /* Show / Hide */
71
+ .os-show {
72
+ display: contents;
73
+ }
74
+ .os-show[class*="os-show-from-"] {
75
+ display: none;
76
+ }
77
+
78
+ @container os-responsive (min-width: 480px) {
79
+ .os-responsive-container > .os-gs-grid > .os-gs-col {
80
+ display: var(--os-gs-display-sm, var(--os-gs-display, block));
81
+ grid-column: var(--os-gs-start-sm, var(--os-gs-start, auto)) / span
82
+ var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns)));
83
+ order: var(--os-gs-order-sm, var(--os-gs-order, 0));
84
+ }
85
+ .os-responsive-container > .os-rstack-from-sm,
86
+ .os-responsive-container > .os-rstack-from-sm.os-rstack-reverse {
87
+ flex-direction: row;
88
+ align-items: var(--os-rstack-align);
89
+ }
90
+ .os-responsive-container > .os-rstack-from-sm.os-rstack-equal > * {
91
+ flex: 1 1 0;
92
+ min-width: 0;
93
+ }
94
+ .os-show-container.os-show-from-sm {
95
+ display: contents;
96
+ }
97
+ .os-show-container.os-show-below-sm {
98
+ display: none;
99
+ }
100
+ }
101
+ @container os-responsive (min-width: 640px) {
102
+ .os-responsive-container > .os-gs-grid > .os-gs-col {
103
+ display: var(--os-gs-display-md, var(--os-gs-display-sm, var(--os-gs-display, block)));
104
+ grid-column: var(--os-gs-start-md, var(--os-gs-start-sm, var(--os-gs-start, auto))) / span
105
+ var(--os-gs-span-md, var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns))));
106
+ order: var(--os-gs-order-md, var(--os-gs-order-sm, var(--os-gs-order, 0)));
107
+ }
108
+ .os-responsive-container > .os-rstack-from-md,
109
+ .os-responsive-container > .os-rstack-from-md.os-rstack-reverse {
110
+ flex-direction: row;
111
+ align-items: var(--os-rstack-align);
112
+ }
113
+ .os-responsive-container > .os-rstack-from-md.os-rstack-equal > * {
114
+ flex: 1 1 0;
115
+ min-width: 0;
116
+ }
117
+ .os-show-container.os-show-from-md {
118
+ display: contents;
119
+ }
120
+ .os-show-container.os-show-below-md {
121
+ display: none;
122
+ }
123
+ }
124
+ @container os-responsive (min-width: 800px) {
125
+ .os-responsive-container > .os-gs-grid > .os-gs-col {
126
+ display: var(
127
+ --os-gs-display-lg,
128
+ var(--os-gs-display-md, var(--os-gs-display-sm, var(--os-gs-display, block)))
129
+ );
130
+ grid-column: var(
131
+ --os-gs-start-lg,
132
+ var(--os-gs-start-md, var(--os-gs-start-sm, var(--os-gs-start, auto)))
133
+ ) /
134
+ span
135
+ var(
136
+ --os-gs-span-lg,
137
+ var(--os-gs-span-md, var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns))))
138
+ );
139
+ order: var(
140
+ --os-gs-order-lg,
141
+ var(--os-gs-order-md, var(--os-gs-order-sm, var(--os-gs-order, 0)))
142
+ );
143
+ }
144
+ .os-responsive-container > .os-rstack-from-lg,
145
+ .os-responsive-container > .os-rstack-from-lg.os-rstack-reverse {
146
+ flex-direction: row;
147
+ align-items: var(--os-rstack-align);
148
+ }
149
+ .os-responsive-container > .os-rstack-from-lg.os-rstack-equal > * {
150
+ flex: 1 1 0;
151
+ min-width: 0;
152
+ }
153
+ .os-show-container.os-show-from-lg {
154
+ display: contents;
155
+ }
156
+ .os-show-container.os-show-below-lg {
157
+ display: none;
158
+ }
159
+ }
160
+ @container os-responsive (min-width: 1024px) {
161
+ .os-responsive-container > .os-gs-grid > .os-gs-col {
162
+ display: var(
163
+ --os-gs-display-xl,
164
+ var(
165
+ --os-gs-display-lg,
166
+ var(--os-gs-display-md, var(--os-gs-display-sm, var(--os-gs-display, block)))
167
+ )
168
+ );
169
+ grid-column: var(
170
+ --os-gs-start-xl,
171
+ var(
172
+ --os-gs-start-lg,
173
+ var(--os-gs-start-md, var(--os-gs-start-sm, var(--os-gs-start, auto)))
174
+ )
175
+ ) /
176
+ span
177
+ var(
178
+ --os-gs-span-xl,
179
+ var(
180
+ --os-gs-span-lg,
181
+ var(--os-gs-span-md, var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns))))
182
+ )
183
+ );
184
+ order: var(
185
+ --os-gs-order-xl,
186
+ var(--os-gs-order-lg, var(--os-gs-order-md, var(--os-gs-order-sm, var(--os-gs-order, 0))))
187
+ );
188
+ }
189
+ .os-responsive-container > .os-rstack-from-xl,
190
+ .os-responsive-container > .os-rstack-from-xl.os-rstack-reverse {
191
+ flex-direction: row;
192
+ align-items: var(--os-rstack-align);
193
+ }
194
+ .os-responsive-container > .os-rstack-from-xl.os-rstack-equal > * {
195
+ flex: 1 1 0;
196
+ min-width: 0;
197
+ }
198
+ .os-show-container.os-show-from-xl {
199
+ display: contents;
200
+ }
201
+ .os-show-container.os-show-below-xl {
202
+ display: none;
203
+ }
204
+ }
205
+
206
+ @media (min-width: 640px) {
207
+ .os-responsive-viewport > .os-gs-grid > .os-gs-col {
208
+ display: var(--os-gs-display-sm, var(--os-gs-display, block));
209
+ grid-column: var(--os-gs-start-sm, var(--os-gs-start, auto)) / span
210
+ var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns)));
211
+ order: var(--os-gs-order-sm, var(--os-gs-order, 0));
212
+ }
213
+ .os-responsive-viewport > .os-rstack-from-sm,
214
+ .os-responsive-viewport > .os-rstack-from-sm.os-rstack-reverse {
215
+ flex-direction: row;
216
+ align-items: var(--os-rstack-align);
217
+ }
218
+ .os-responsive-viewport > .os-rstack-from-sm.os-rstack-equal > * {
219
+ flex: 1 1 0;
220
+ min-width: 0;
221
+ }
222
+ .os-show-viewport.os-show-from-sm {
223
+ display: contents;
224
+ }
225
+ .os-show-viewport.os-show-below-sm {
226
+ display: none;
227
+ }
228
+ }
229
+ @media (min-width: 768px) {
230
+ .os-responsive-viewport > .os-gs-grid > .os-gs-col {
231
+ display: var(--os-gs-display-md, var(--os-gs-display-sm, var(--os-gs-display, block)));
232
+ grid-column: var(--os-gs-start-md, var(--os-gs-start-sm, var(--os-gs-start, auto))) / span
233
+ var(--os-gs-span-md, var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns))));
234
+ order: var(--os-gs-order-md, var(--os-gs-order-sm, var(--os-gs-order, 0)));
235
+ }
236
+ .os-responsive-viewport > .os-rstack-from-md,
237
+ .os-responsive-viewport > .os-rstack-from-md.os-rstack-reverse {
238
+ flex-direction: row;
239
+ align-items: var(--os-rstack-align);
240
+ }
241
+ .os-responsive-viewport > .os-rstack-from-md.os-rstack-equal > * {
242
+ flex: 1 1 0;
243
+ min-width: 0;
244
+ }
245
+ .os-show-viewport.os-show-from-md {
246
+ display: contents;
247
+ }
248
+ .os-show-viewport.os-show-below-md {
249
+ display: none;
250
+ }
251
+ }
252
+ @media (min-width: 1024px) {
253
+ .os-responsive-viewport > .os-gs-grid > .os-gs-col {
254
+ display: var(
255
+ --os-gs-display-lg,
256
+ var(--os-gs-display-md, var(--os-gs-display-sm, var(--os-gs-display, block)))
257
+ );
258
+ grid-column: var(
259
+ --os-gs-start-lg,
260
+ var(--os-gs-start-md, var(--os-gs-start-sm, var(--os-gs-start, auto)))
261
+ ) /
262
+ span
263
+ var(
264
+ --os-gs-span-lg,
265
+ var(--os-gs-span-md, var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns))))
266
+ );
267
+ order: var(
268
+ --os-gs-order-lg,
269
+ var(--os-gs-order-md, var(--os-gs-order-sm, var(--os-gs-order, 0)))
270
+ );
271
+ }
272
+ .os-responsive-viewport > .os-rstack-from-lg,
273
+ .os-responsive-viewport > .os-rstack-from-lg.os-rstack-reverse {
274
+ flex-direction: row;
275
+ align-items: var(--os-rstack-align);
276
+ }
277
+ .os-responsive-viewport > .os-rstack-from-lg.os-rstack-equal > * {
278
+ flex: 1 1 0;
279
+ min-width: 0;
280
+ }
281
+ .os-show-viewport.os-show-from-lg {
282
+ display: contents;
283
+ }
284
+ .os-show-viewport.os-show-below-lg {
285
+ display: none;
286
+ }
287
+ }
288
+ @media (min-width: 1280px) {
289
+ .os-responsive-viewport > .os-gs-grid > .os-gs-col {
290
+ display: var(
291
+ --os-gs-display-xl,
292
+ var(
293
+ --os-gs-display-lg,
294
+ var(--os-gs-display-md, var(--os-gs-display-sm, var(--os-gs-display, block)))
295
+ )
296
+ );
297
+ grid-column: var(
298
+ --os-gs-start-xl,
299
+ var(
300
+ --os-gs-start-lg,
301
+ var(--os-gs-start-md, var(--os-gs-start-sm, var(--os-gs-start, auto)))
302
+ )
303
+ ) /
304
+ span
305
+ var(
306
+ --os-gs-span-xl,
307
+ var(
308
+ --os-gs-span-lg,
309
+ var(--os-gs-span-md, var(--os-gs-span-sm, var(--os-gs-span, var(--os-gs-columns))))
310
+ )
311
+ );
312
+ order: var(
313
+ --os-gs-order-xl,
314
+ var(--os-gs-order-lg, var(--os-gs-order-md, var(--os-gs-order-sm, var(--os-gs-order, 0))))
315
+ );
316
+ }
317
+ .os-responsive-viewport > .os-rstack-from-xl,
318
+ .os-responsive-viewport > .os-rstack-from-xl.os-rstack-reverse {
319
+ flex-direction: row;
320
+ align-items: var(--os-rstack-align);
321
+ }
322
+ .os-responsive-viewport > .os-rstack-from-xl.os-rstack-equal > * {
323
+ flex: 1 1 0;
324
+ min-width: 0;
325
+ }
326
+ .os-show-viewport.os-show-from-xl {
327
+ display: contents;
328
+ }
329
+ .os-show-viewport.os-show-below-xl {
330
+ display: none;
331
+ }
332
+ }
333
+
334
+ /* ResponsiveFrame */
335
+ .os-rframe {
336
+ display: flex;
337
+ flex-direction: column;
338
+ gap: var(--spacing-3);
339
+ width: 100%;
340
+ min-width: 0;
341
+ }
342
+ .os-rframe-bar {
343
+ display: flex;
344
+ flex-wrap: wrap;
345
+ align-items: center;
346
+ justify-content: space-between;
347
+ gap: var(--spacing-2);
348
+ }
349
+ .os-rframe-stage {
350
+ display: flex;
351
+ align-items: stretch;
352
+ gap: var(--spacing-1);
353
+ min-width: 0;
354
+ }
355
+ .os-rframe-viewport {
356
+ --os-rframe-pad: var(--spacing-4);
357
+ flex: none;
358
+ box-sizing: border-box;
359
+ max-width: calc(100% - var(--spacing-4));
360
+ min-height: 120px;
361
+ padding: var(--os-rframe-pad);
362
+ overflow: hidden;
363
+ background: var(--color-background-body);
364
+ border-radius: var(--radius-container);
365
+ box-shadow: inset 0 0 0 1px var(--color-border);
366
+ }
367
+ .os-rframe-fill {
368
+ flex: 1;
369
+ min-width: 0;
370
+ }
371
+ .os-rframe-content {
372
+ min-width: 0;
373
+ }
374
+ .os-rframe-handle {
375
+ flex: none;
376
+ align-self: center;
377
+ width: 6px;
378
+ height: 48px;
379
+ border-radius: var(--radius-full);
380
+ background: var(--color-border-emphasized);
381
+ cursor: ew-resize;
382
+ touch-action: none;
383
+ transition: background-color var(--duration-fast) var(--ease-standard);
384
+ }
385
+ .os-rframe-handle:hover,
386
+ .os-rframe-handle:focus-visible {
387
+ background: var(--color-accent);
388
+ outline: none;
389
+ }
390
+
391
+ /* Demo tile — a neutral block for showing layout structure */
392
+ .os-tile {
393
+ box-sizing: border-box;
394
+ display: flex;
395
+ flex-direction: column;
396
+ justify-content: center;
397
+ gap: var(--spacing-0-5);
398
+ min-height: 56px;
399
+ height: 100%;
400
+ padding: var(--spacing-3);
401
+ border-radius: var(--radius-element);
402
+ background: var(--color-accent-muted);
403
+ color: var(--color-text-accent);
404
+ font-size: var(--font-size-sm);
405
+ font-weight: var(--font-weight-medium, 500);
406
+ font-variant-numeric: tabular-nums;
407
+ }
408
+ .os-tile-neutral {
409
+ background: var(--color-neutral);
410
+ color: var(--color-text-secondary);
411
+ }
412
+ .os-tile-strong {
413
+ background: var(--color-accent);
414
+ color: var(--color-on-accent);
415
+ }
416
+ .os-tile-meta {
417
+ font-weight: var(--font-weight-normal, 400);
418
+ opacity: 0.75;
419
+ }
@@ -0,0 +1,23 @@
1
+ /* Sticky — a panel that stays in view while its column scrolls. With fill,
2
+ it takes the visible height of its scroll container (measured in JS) minus
3
+ the offset above and below, and its content scrolls inside. */
4
+
5
+ .os-sticky {
6
+ position: sticky;
7
+ top: var(--os-sticky-offset, 0px);
8
+ align-self: flex-start;
9
+ min-width: 0;
10
+ }
11
+
12
+ /* Fill has an explicit height, so stretching only widens it: it spans its
13
+ column in a vertical stack instead of shrinking to its content. */
14
+ .os-sticky-fill {
15
+ align-self: stretch;
16
+ display: flex;
17
+ flex-direction: column;
18
+ height: calc(var(--os-sticky-scrollport, 100dvh) - 2 * var(--os-sticky-offset, 0px));
19
+ }
20
+ .os-sticky-fill > * {
21
+ flex: 1;
22
+ min-height: 0;
23
+ }
@@ -0,0 +1,267 @@
1
+ /* Table — os-dt ("data table"). Header, scroll area, footer inside one surface. */
2
+
3
+ .os-dt {
4
+ --os-dt-pad-y: 10px;
5
+ --os-dt-pad-x: var(--spacing-4);
6
+ --os-dt-bg: var(--color-background-surface);
7
+ box-sizing: border-box;
8
+ display: flex;
9
+ flex-direction: column;
10
+ width: 100%;
11
+ min-width: 0;
12
+ font-size: var(--font-size-base);
13
+ color: var(--color-text-primary);
14
+ }
15
+ .os-dt-compact {
16
+ --os-dt-pad-y: 6px;
17
+ --os-dt-pad-x: var(--spacing-3);
18
+ }
19
+ .os-dt-spacious {
20
+ --os-dt-pad-y: var(--spacing-4);
21
+ }
22
+
23
+ .os-dt-card,
24
+ .os-dt-lined {
25
+ overflow: hidden;
26
+ background: var(--os-dt-bg);
27
+ border-radius: var(--radius-container);
28
+ box-shadow:
29
+ 0 0 0 1px var(--color-border),
30
+ var(--shadow-low, var(--elevation-1));
31
+ }
32
+ .os-dt-plain {
33
+ --os-dt-bg: transparent;
34
+ }
35
+
36
+ .os-dt-header {
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: space-between;
40
+ flex-wrap: wrap;
41
+ gap: var(--spacing-3);
42
+ padding: var(--spacing-3) var(--os-dt-pad-x);
43
+ border-bottom: 1px solid var(--color-border);
44
+ }
45
+ .os-dt-scroll {
46
+ overflow: auto;
47
+ }
48
+ .os-dt-table {
49
+ width: 100%;
50
+ border-collapse: separate;
51
+ border-spacing: 0;
52
+ font-variant-numeric: tabular-nums;
53
+ }
54
+
55
+ .os-dt th {
56
+ padding: var(--spacing-2) var(--os-dt-pad-x);
57
+ background: var(--os-dt-bg);
58
+ border-bottom: 1px solid var(--color-border);
59
+ font-size: var(--font-size-sm);
60
+ font-weight: var(--font-weight-medium, 500);
61
+ line-height: 20px;
62
+ color: var(--color-text-secondary);
63
+ text-align: left;
64
+ white-space: nowrap;
65
+ }
66
+ .os-dt td {
67
+ padding: var(--os-dt-pad-y) var(--os-dt-pad-x);
68
+ border-bottom: 1px solid var(--color-border);
69
+ line-height: 20px;
70
+ vertical-align: middle;
71
+ }
72
+ .os-dt:not(.os-dt-plain) tbody tr:last-child td {
73
+ border-bottom: 0;
74
+ }
75
+ .os-dt-lined :is(th, td) + :is(th, td) {
76
+ border-left: 1px solid var(--color-border);
77
+ }
78
+ .os-dt-align-end {
79
+ text-align: right !important;
80
+ }
81
+ .os-dt-align-center {
82
+ text-align: center !important;
83
+ }
84
+
85
+ .os-dt tbody tr {
86
+ transition: background-color var(--duration-fast) var(--ease-standard);
87
+ }
88
+ .os-dt tbody tr:hover {
89
+ background: var(--color-overlay-hover);
90
+ }
91
+ .os-dt-striped tbody tr:nth-child(even) {
92
+ background: color-mix(in srgb, var(--color-background-muted) 70%, transparent);
93
+ }
94
+ .os-dt-selectable tbody tr {
95
+ cursor: pointer;
96
+ }
97
+ .os-dt tbody tr.os-dt-row-selected {
98
+ background: var(--color-accent-muted);
99
+ }
100
+ .os-dt tbody tr.os-dt-row-selected td:first-child {
101
+ box-shadow: inset 3px 0 0 var(--color-accent);
102
+ }
103
+ .os-dt tbody tr:focus-visible {
104
+ outline: 2px solid var(--color-accent);
105
+ outline-offset: -2px;
106
+ }
107
+
108
+ .os-dt-sticky thead th {
109
+ position: sticky;
110
+ top: 0;
111
+ z-index: 1;
112
+ }
113
+ .os-dt-sticky.os-dt-plain thead th {
114
+ background: var(--color-background-surface);
115
+ }
116
+
117
+ /* Sortable headers */
118
+ .os-dt-sort {
119
+ display: inline-flex;
120
+ align-items: center;
121
+ gap: var(--spacing-1);
122
+ margin: -2px -6px;
123
+ padding: 2px 6px;
124
+ border: 0;
125
+ border-radius: calc(var(--radius-inner) - 2px);
126
+ background: transparent;
127
+ color: inherit;
128
+ font: inherit;
129
+ cursor: pointer;
130
+ transition:
131
+ background-color var(--duration-fast) var(--ease-standard),
132
+ color var(--duration-fast) var(--ease-standard);
133
+ }
134
+ .os-dt-sort .os-glyph {
135
+ width: 14px;
136
+ height: 14px;
137
+ opacity: 0.4;
138
+ transition: opacity var(--duration-fast) var(--ease-standard);
139
+ }
140
+ .os-dt-sort:hover {
141
+ background: var(--color-overlay-hover);
142
+ color: var(--color-text-primary);
143
+ }
144
+ .os-dt-sort:hover .os-glyph {
145
+ opacity: 0.8;
146
+ }
147
+ .os-dt-sort-on {
148
+ color: var(--color-text-primary);
149
+ }
150
+ .os-dt-sort-on .os-glyph {
151
+ opacity: 1;
152
+ color: var(--color-accent);
153
+ }
154
+ .os-dt-sort:focus-visible {
155
+ outline: 2px solid var(--color-accent);
156
+ outline-offset: 1px;
157
+ }
158
+ th.os-dt-align-end .os-dt-sort {
159
+ flex-direction: row-reverse;
160
+ }
161
+
162
+ /* Selection column */
163
+ .os-dt .os-dt-select {
164
+ width: 16px;
165
+ padding-right: 0;
166
+ }
167
+ .os-table-check {
168
+ appearance: none;
169
+ display: grid;
170
+ place-items: center;
171
+ width: 16px;
172
+ height: 16px;
173
+ margin: 0;
174
+ border-radius: 5px;
175
+ background: var(--color-background-surface);
176
+ box-shadow: inset 0 0 0 1.5px var(--color-border-emphasized);
177
+ vertical-align: middle;
178
+ cursor: pointer;
179
+ transition:
180
+ background-color var(--duration-fast) var(--ease-standard),
181
+ box-shadow var(--duration-fast) var(--ease-standard);
182
+ }
183
+ .os-table-check:hover {
184
+ box-shadow: inset 0 0 0 1.5px var(--color-accent);
185
+ }
186
+ .os-table-check:focus-visible {
187
+ outline: 2px solid var(--color-accent);
188
+ outline-offset: 2px;
189
+ }
190
+ .os-table-check::after {
191
+ content: "";
192
+ width: 8px;
193
+ height: 4px;
194
+ border-left: 2px solid var(--color-on-accent);
195
+ border-bottom: 2px solid var(--color-on-accent);
196
+ transform: translateY(-1px) rotate(-45deg);
197
+ opacity: 0;
198
+ }
199
+ .os-table-check:checked,
200
+ .os-table-check:indeterminate {
201
+ background: var(--color-accent);
202
+ box-shadow: none;
203
+ }
204
+ .os-table-check:checked::after {
205
+ opacity: 1;
206
+ }
207
+ .os-table-check:indeterminate::after {
208
+ height: 0;
209
+ border-left: 0;
210
+ transform: none;
211
+ opacity: 1;
212
+ }
213
+
214
+ /* States */
215
+ .os-dt-empty {
216
+ padding: var(--spacing-10) var(--os-dt-pad-x) !important;
217
+ text-align: center;
218
+ color: var(--color-text-secondary);
219
+ }
220
+ .os-dt-skeleton {
221
+ display: block;
222
+ width: 70%;
223
+ height: 10px;
224
+ border-radius: var(--radius-full);
225
+ background: var(--color-skeleton);
226
+ animation: os-dt-shimmer 1.4s var(--ease-standard) infinite;
227
+ }
228
+ .os-dt-loading td:nth-child(2n) .os-dt-skeleton {
229
+ width: 40%;
230
+ }
231
+ .os-dt-loading:nth-child(2n) .os-dt-skeleton {
232
+ animation-delay: 0.15s;
233
+ }
234
+ @keyframes os-dt-shimmer {
235
+ 50% {
236
+ opacity: 0.45;
237
+ }
238
+ }
239
+
240
+ /* Footer — count and pager */
241
+ .os-dt-footer {
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: space-between;
245
+ gap: var(--spacing-3);
246
+ min-height: 44px;
247
+ padding: var(--spacing-1) var(--spacing-2) var(--spacing-1) var(--os-dt-pad-x);
248
+ border-top: 1px solid var(--color-border);
249
+ font-size: var(--font-size-sm);
250
+ color: var(--color-text-secondary);
251
+ box-sizing: border-box;
252
+ }
253
+ .os-dt-plain .os-dt-footer {
254
+ border-top: 0;
255
+ padding-left: 0;
256
+ }
257
+ .os-dt-pager {
258
+ display: flex;
259
+ align-items: center;
260
+ gap: 2px;
261
+ }
262
+
263
+ @media (prefers-reduced-motion: reduce) {
264
+ .os-dt-skeleton {
265
+ animation: none;
266
+ }
267
+ }