@dxos/ui-theme 0.8.4-main.6fa680abb7 → 0.8.4-main.7996785055

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 (125) hide show
  1. package/dist/lib/browser/index.mjs +350 -439
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +350 -439
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/plugin/node-cjs/{theme.css → main.css} +63 -30
  8. package/dist/plugin/node-cjs/main.css.map +7 -0
  9. package/dist/plugin/node-cjs/meta.json +1 -1
  10. package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs +6 -13
  11. package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs.map +3 -3
  12. package/dist/plugin/node-esm/{theme.css → main.css} +63 -30
  13. package/dist/plugin/node-esm/main.css.map +7 -0
  14. package/dist/plugin/node-esm/meta.json +1 -1
  15. package/dist/plugin/node-esm/plugins/ThemePlugin.mjs +6 -13
  16. package/dist/plugin/node-esm/plugins/ThemePlugin.mjs.map +3 -3
  17. package/dist/types/src/fragments/index.d.ts +0 -5
  18. package/dist/types/src/fragments/index.d.ts.map +1 -1
  19. package/dist/types/src/fragments/text.d.ts +0 -4
  20. package/dist/types/src/fragments/text.d.ts.map +1 -1
  21. package/dist/types/src/index.d.ts +1 -1
  22. package/dist/types/src/index.d.ts.map +1 -1
  23. package/dist/types/src/plugins/ThemePlugin.d.ts.map +1 -1
  24. package/dist/types/src/theme/components/avatar.d.ts.map +1 -1
  25. package/dist/types/src/theme/components/card.d.ts +3 -2
  26. package/dist/types/src/theme/components/card.d.ts.map +1 -1
  27. package/dist/types/src/theme/components/dialog.d.ts.map +1 -1
  28. package/dist/types/src/theme/components/focus.d.ts +6 -0
  29. package/dist/types/src/theme/components/focus.d.ts.map +1 -0
  30. package/dist/types/src/theme/components/icon.d.ts +3 -0
  31. package/dist/types/src/theme/components/icon.d.ts.map +1 -1
  32. package/dist/types/src/theme/components/index.d.ts +1 -0
  33. package/dist/types/src/theme/components/index.d.ts.map +1 -1
  34. package/dist/types/src/theme/components/input.d.ts.map +1 -1
  35. package/dist/types/src/theme/components/link.d.ts.map +1 -1
  36. package/dist/types/src/theme/components/list.d.ts.map +1 -1
  37. package/dist/types/src/theme/components/message.d.ts.map +1 -1
  38. package/dist/types/src/theme/components/popover.d.ts.map +1 -1
  39. package/dist/types/src/theme/components/scroll-area.d.ts +12 -2
  40. package/dist/types/src/theme/components/scroll-area.d.ts.map +1 -1
  41. package/dist/types/src/theme/components/select.d.ts.map +1 -1
  42. package/dist/types/src/theme/components/status.d.ts +1 -1
  43. package/dist/types/src/theme/components/status.d.ts.map +1 -1
  44. package/dist/types/src/theme/components/toast.d.ts.map +1 -1
  45. package/dist/types/src/theme/components/toolbar.d.ts +0 -1
  46. package/dist/types/src/theme/components/toolbar.d.ts.map +1 -1
  47. package/dist/types/src/theme/components/tooltip.d.ts.map +1 -1
  48. package/dist/types/src/theme/index.d.ts +1 -0
  49. package/dist/types/src/theme/index.d.ts.map +1 -1
  50. package/dist/types/src/theme/primitives/column.d.ts +8 -3
  51. package/dist/types/src/theme/primitives/column.d.ts.map +1 -1
  52. package/dist/types/src/theme/primitives/panel.d.ts +9 -5
  53. package/dist/types/src/theme/primitives/panel.d.ts.map +1 -1
  54. package/dist/types/src/theme/theme.d.ts.map +1 -1
  55. package/dist/types/src/util/elevation.d.ts.map +1 -0
  56. package/dist/types/src/util/index.d.ts +3 -0
  57. package/dist/types/src/util/index.d.ts.map +1 -1
  58. package/dist/types/src/util/mx.d.ts +28 -284
  59. package/dist/types/src/util/mx.d.ts.map +1 -1
  60. package/dist/types/src/util/size.d.ts +27 -0
  61. package/dist/types/src/util/size.d.ts.map +1 -0
  62. package/dist/types/src/util/valence.d.ts.map +1 -0
  63. package/dist/types/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +8 -4
  65. package/src/css/components/{focus-ring.css → focus.css} +15 -1
  66. package/src/css/components/icon.css +9 -0
  67. package/src/css/components/selected.css +29 -0
  68. package/src/css/integrations/codemirror.css +3 -2
  69. package/src/css/integrations/tldraw.css +1 -0
  70. package/src/css/layout/main.css +0 -7
  71. package/src/css/layout/size.css +8 -31
  72. package/src/css/theme/palette.css +8 -0
  73. package/src/css/theme/semantic.css +24 -9
  74. package/src/css/theme/spacing.css +35 -18
  75. package/src/css/utilities.css +65 -3
  76. package/src/fragments/AUDIT.md +58 -0
  77. package/src/fragments/index.ts +1 -6
  78. package/src/fragments/text.ts +0 -5
  79. package/src/index.ts +1 -1
  80. package/src/{theme.css → main.css} +10 -6
  81. package/src/plugins/ThemePlugin.ts +10 -21
  82. package/src/plugins/main.css +45 -0
  83. package/src/theme/components/avatar.ts +3 -4
  84. package/src/theme/components/button.ts +1 -1
  85. package/src/theme/components/card.ts +12 -8
  86. package/src/theme/components/dialog.ts +1 -2
  87. package/src/theme/components/focus.ts +33 -0
  88. package/src/theme/components/icon.ts +13 -4
  89. package/src/theme/components/index.ts +1 -0
  90. package/src/theme/components/input.ts +10 -25
  91. package/src/theme/components/link.ts +1 -2
  92. package/src/theme/components/list.ts +3 -3
  93. package/src/theme/components/menu.ts +3 -3
  94. package/src/theme/components/message.ts +2 -3
  95. package/src/theme/components/popover.ts +3 -4
  96. package/src/theme/components/scroll-area.ts +47 -39
  97. package/src/theme/components/select.ts +2 -3
  98. package/src/theme/components/status.ts +5 -5
  99. package/src/theme/components/toast.ts +2 -3
  100. package/src/theme/components/toolbar.ts +1 -7
  101. package/src/theme/components/tooltip.ts +1 -2
  102. package/src/theme/index.ts +1 -0
  103. package/src/theme/primitives/column.ts +27 -10
  104. package/src/theme/primitives/panel.ts +19 -25
  105. package/src/theme/theme.ts +2 -0
  106. package/src/util/index.ts +3 -0
  107. package/src/util/mx.ts +104 -6
  108. package/src/util/size.ts +103 -0
  109. package/dist/plugin/node-cjs/theme.css.map +0 -7
  110. package/dist/plugin/node-esm/theme.css.map +0 -7
  111. package/dist/types/src/fragments/elevation.d.ts.map +0 -1
  112. package/dist/types/src/fragments/focus.d.ts +0 -4
  113. package/dist/types/src/fragments/focus.d.ts.map +0 -1
  114. package/dist/types/src/fragments/selected.d.ts +0 -4
  115. package/dist/types/src/fragments/selected.d.ts.map +0 -1
  116. package/dist/types/src/fragments/size.d.ts +0 -7
  117. package/dist/types/src/fragments/size.d.ts.map +0 -1
  118. package/dist/types/src/fragments/valence.d.ts.map +0 -1
  119. package/src/fragments/focus.ts +0 -11
  120. package/src/fragments/selected.ts +0 -12
  121. package/src/fragments/size.ts +0 -117
  122. /package/dist/types/src/{fragments → util}/elevation.d.ts +0 -0
  123. /package/dist/types/src/{fragments → util}/valence.d.ts +0 -0
  124. /package/src/{fragments → util}/elevation.ts +0 -0
  125. /package/src/{fragments → util}/valence.ts +0 -0
@@ -56,7 +56,22 @@ var densityBlockSize = (density = "coarse") => density === "fine" ? fineBlockSiz
56
56
  var staticDisabled = "opacity-40 cursor-not-allowed shadow-none";
57
57
  var dataDisabled = "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed";
58
58
 
59
- // src/fragments/elevation.ts
59
+ // src/fragments/hover.ts
60
+ var subtleHover = "hover:bg-hover-overlay";
61
+ var ghostHover = "hover:bg-hover-surface";
62
+ var ghostFocusWithin = "focus-within:bg-hover-surface";
63
+ var hoverableControls = "[--controls-opacity:1] hover-hover:[--controls-opacity:0] hover-hover:hover:[--controls-opacity:1]";
64
+ var groupHoverControlItemWithTransition = "transition-opacity duration-200 opacity-0 group-hover:opacity-100";
65
+ var hoverableFocusedKeyboardControls = "focus-visible:[--controls-opacity:1]";
66
+ var hoverableFocusedWithinControls = "focus-within:[--controls-opacity:1]";
67
+ var hoverableOpenControlItem = "hover-hover:aria-[expanded=true]:[--controls-opacity:1]";
68
+ var hoverableControlItem = "opacity-(--controls-opacity)";
69
+
70
+ // src/fragments/text.ts
71
+ var descriptionTextPrimary = "text-sm font-normal text-base-surface-text";
72
+ var descriptionMessage = "text-description border border-dashed border-separator rounded-sm p-4";
73
+
74
+ // src/util/elevation.ts
60
75
  var surfaceShadow = ({ elevation }) => [
61
76
  elevation === "positioned" ? "shadow-sm" : elevation === "dialog" || elevation === "toast" ? "shadow-md" : "shadow-none"
62
77
  ];
@@ -89,27 +104,6 @@ var surfaceZIndex = ({ level, elevation }) => {
89
104
  }
90
105
  };
91
106
 
92
- // src/fragments/focus.ts
93
- var focusRing = "dx-focus-ring";
94
- var subduedFocus = "focus:outline-hidden focus-visible:outline-hidden focus:ring-0 ring-0 focus:border-0 border-0";
95
- var staticFocusRing = "ring-2 ring-offset-0 ring-primary-350 ring-offset-white dark:ring-primary-450 dark:ring-offset-black";
96
-
97
- // src/fragments/hover.ts
98
- var subtleHover = "hover:bg-hover-overlay";
99
- var ghostHover = "hover:bg-hover-surface";
100
- var ghostFocusWithin = "focus-within:bg-hover-surface";
101
- var hoverableControls = "[--controls-opacity:1] hover-hover:[--controls-opacity:0] hover-hover:hover:[--controls-opacity:1]";
102
- var groupHoverControlItemWithTransition = "transition-opacity duration-200 opacity-0 group-hover:opacity-100";
103
- var hoverableFocusedKeyboardControls = "focus-visible:[--controls-opacity:1]";
104
- var hoverableFocusedWithinControls = "focus-within:[--controls-opacity:1]";
105
- var hoverableOpenControlItem = "hover-hover:aria-[expanded=true]:[--controls-opacity:1]";
106
- var hoverableControlItem = "opacity-(--controls-opacity)";
107
-
108
- // src/fragments/selected.ts
109
- var ghostHighlighted = "data-[highlighted]:bg-primary-100 dark:data-[highlighted]:bg-primary-600 hover:data-[highlighted]:bg-primary-150 hover:dark:data-[highlighted]:bg-primary-500";
110
- var ghostSelected = "aria-selected:bg-base-surface aria-selected:text-accent-text hover:aria-selected:text-accent-text-hover aria-selected:font-semibold aria-selected:tracking-normal transition-[color,font-variation-settings,letter-spacing]";
111
- var ghostSelectedContainerMd = "@md:aria-selected:bg-base-surface @md:aria-selected:text-accent-text @md:hover:aria-selected:text-accent-text-hover @md:aria-selected:font-semibold @md:aria-selected:tracking-normal @md:transition-[color,font-variation-settings,letter-spacing]";
112
-
113
107
  // src/util/hash-styles.ts
114
108
  var neutral = {
115
109
  hue: "neutral",
@@ -273,7 +267,10 @@ var getHashHue = (id) => {
273
267
  var getHash = (id) => id.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0);
274
268
 
275
269
  // src/util/mx.ts
270
+ import { Children, createElement, forwardRef, isValidElement } from "react";
276
271
  import { extendTailwindMerge, validators } from "tailwind-merge";
272
+ import { log } from "@dxos/log";
273
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/ui-theme/src/util/mx.ts";
277
274
  var mx = extendTailwindMerge({
278
275
  extend: {
279
276
  classGroups: {
@@ -318,334 +315,233 @@ var mx = extendTailwindMerge({
318
315
  }
319
316
  }
320
317
  });
321
- var composableProps = ({ className, classNames, ...props }, { className: defaultClassNames, ...defaults } = {}) => ({
318
+ var composableProps = ({ className, classNames, ...props }, { classNames: defaultClassNames, ...defaults } = {}) => ({
319
+ // Default props.
322
320
  ...defaults,
321
+ // Spread supplied props.
323
322
  ...props,
323
+ // Compose classnames.
324
324
  className: mx(defaultClassNames, className, classNames)
325
325
  });
326
+ var COMPOSABLE = /* @__PURE__ */ Symbol.for("dxos.composable");
327
+ function slottable(render) {
328
+ const wrapped = (props, forwardedRef) => {
329
+ let warn = false;
330
+ if (props.asChild) {
331
+ try {
332
+ const child = Children.only(props.children);
333
+ if (isValidElement(child) && typeof child.type !== "string" && !child.type[COMPOSABLE]) {
334
+ warn = true;
335
+ log.warn("slot child is not composable; create it with composable() or slottable()", {
336
+ child: child.type.displayName ?? child.type.name
337
+ }, {
338
+ F: __dxlog_file,
339
+ L: 118,
340
+ S: this,
341
+ C: (f, a) => f(...a)
342
+ });
343
+ }
344
+ } catch {
345
+ }
346
+ }
347
+ const result = render(props, forwardedRef);
348
+ if (warn) {
349
+ return createElement("div", {
350
+ role: "none",
351
+ className: "dx-slot-warning"
352
+ }, result);
353
+ }
354
+ return result;
355
+ };
356
+ const component = forwardRef(wrapped);
357
+ component[COMPOSABLE] = true;
358
+ return component;
359
+ }
360
+ function composable(render) {
361
+ const component = forwardRef(render);
362
+ component[COMPOSABLE] = true;
363
+ return component;
364
+ }
326
365
 
327
- // src/fragments/size.ts
328
- var sizeWidthMap = /* @__PURE__ */ new Map([
329
- [
330
- 0,
331
- "w-0"
332
- ],
333
- [
334
- "px",
335
- "w-px"
336
- ],
337
- [
338
- 0.5,
339
- "w-0.5"
340
- ],
341
- [
342
- 1,
343
- "w-1"
344
- ],
345
- [
346
- 1.5,
347
- "w-1.5"
348
- ],
349
- [
350
- 2,
351
- "w-2"
352
- ],
353
- [
354
- 2.5,
355
- "w-2.5"
356
- ],
357
- [
358
- 3,
359
- "w-3"
360
- ],
361
- [
362
- 3.5,
363
- "w-3.5"
364
- ],
365
- [
366
- 4,
367
- "w-4"
368
- ],
369
- [
370
- 5,
371
- "w-5"
372
- ],
373
- [
374
- 6,
375
- "w-6"
376
- ],
377
- [
378
- 7,
379
- "w-7"
380
- ],
381
- [
382
- 8,
383
- "w-8"
384
- ],
385
- [
386
- 9,
387
- "w-9"
388
- ],
389
- [
390
- 10,
391
- "w-10"
392
- ],
393
- [
394
- 11,
395
- "w-11"
396
- ],
397
- [
398
- 12,
399
- "w-12"
400
- ],
401
- [
402
- 14,
403
- "w-14"
404
- ],
405
- [
406
- 16,
407
- "w-16"
408
- ],
409
- [
410
- 20,
411
- "w-20"
412
- ],
413
- [
414
- 24,
415
- "w-24"
416
- ],
417
- [
418
- 28,
419
- "w-28"
420
- ],
421
- [
422
- 32,
423
- "w-32"
424
- ],
425
- [
426
- 36,
427
- "w-36"
428
- ],
429
- [
430
- 40,
431
- "w-40"
432
- ],
433
- [
434
- 44,
435
- "w-44"
436
- ],
437
- [
438
- 48,
439
- "w-48"
440
- ],
441
- [
442
- 52,
443
- "w-52"
444
- ],
445
- [
446
- 56,
447
- "w-56"
448
- ],
449
- [
450
- 60,
451
- "w-60"
452
- ],
453
- [
454
- 64,
455
- "w-64"
456
- ],
457
- [
458
- 72,
459
- "w-72"
460
- ],
461
- [
462
- 80,
463
- "w-80"
464
- ],
465
- [
466
- 96,
467
- "w-96"
468
- ]
469
- ]);
470
- var sizeHeightMap = /* @__PURE__ */ new Map([
471
- [
472
- 0,
473
- "h-0"
474
- ],
475
- [
476
- "px",
477
- "h-px"
478
- ],
479
- [
480
- 0.5,
481
- "h-0.5"
482
- ],
483
- [
484
- 1,
485
- "h-1"
486
- ],
487
- [
488
- 1.5,
489
- "h-1.5"
490
- ],
491
- [
492
- 2,
493
- "h-2"
494
- ],
495
- [
496
- 2.5,
497
- "h-2.5"
498
- ],
499
- [
500
- 3,
501
- "h-3"
502
- ],
503
- [
504
- 3.5,
505
- "h-3.5"
506
- ],
507
- [
508
- 4,
509
- "h-4"
510
- ],
511
- [
512
- 5,
513
- "h-5"
514
- ],
515
- [
516
- 6,
517
- "h-6"
518
- ],
519
- [
520
- 7,
521
- "h-7"
522
- ],
523
- [
524
- 8,
525
- "h-8"
526
- ],
527
- [
528
- 9,
529
- "h-9"
530
- ],
531
- [
532
- 10,
533
- "h-10"
534
- ],
535
- [
536
- 11,
537
- "h-11"
538
- ],
539
- [
540
- 12,
541
- "h-12"
542
- ],
543
- [
544
- 14,
545
- "h-14"
546
- ],
547
- [
548
- 16,
549
- "h-16"
550
- ],
551
- [
552
- 20,
553
- "h-20"
554
- ],
555
- [
556
- 24,
557
- "h-24"
558
- ],
559
- [
560
- 28,
561
- "h-28"
562
- ],
563
- [
564
- 32,
565
- "h-32"
566
- ],
567
- [
568
- 36,
569
- "h-36"
570
- ],
571
- [
572
- 40,
573
- "h-40"
574
- ],
575
- [
576
- 44,
577
- "h-44"
578
- ],
579
- [
580
- 48,
581
- "h-48"
582
- ],
583
- [
584
- 52,
585
- "h-52"
586
- ],
587
- [
588
- 56,
589
- "h-56"
590
- ],
591
- [
592
- 60,
593
- "h-60"
594
- ],
595
- [
596
- 64,
597
- "h-64"
598
- ],
599
- [
600
- 72,
601
- "h-72"
602
- ],
603
- [
604
- 80,
605
- "h-80"
606
- ],
607
- [
608
- 96,
609
- "h-96"
610
- ]
611
- ]);
612
- var sizes = new Set(sizeWidthMap.keys());
613
- var getSizeHeight = sizeHeightMap.get.bind(sizeHeightMap);
614
- var getSizeWidth = sizeWidthMap.get.bind(sizeWidthMap);
615
- var getSize = (size) => mx(getSizeHeight(size), getSizeWidth(size));
616
- var computeSize = (value, defaultSize) => {
617
- if (sizes.has(value)) {
366
+ // src/util/size.ts
367
+ var sizeMap = {
368
+ 0: {
369
+ w: "w-0",
370
+ h: "h-0"
371
+ },
372
+ px: {
373
+ w: "w-px",
374
+ h: "h-px"
375
+ },
376
+ 0.5: {
377
+ w: "w-0.5",
378
+ h: "h-0.5"
379
+ },
380
+ 1: {
381
+ w: "w-1",
382
+ h: "h-1"
383
+ },
384
+ 1.5: {
385
+ w: "w-1.5",
386
+ h: "h-1.5"
387
+ },
388
+ 2: {
389
+ w: "w-2",
390
+ h: "h-2"
391
+ },
392
+ 2.5: {
393
+ w: "w-2.5",
394
+ h: "h-2.5"
395
+ },
396
+ 3: {
397
+ w: "w-3",
398
+ h: "h-3"
399
+ },
400
+ 3.5: {
401
+ w: "w-3.5",
402
+ h: "h-3.5"
403
+ },
404
+ 4: {
405
+ w: "w-4",
406
+ h: "h-4"
407
+ },
408
+ 5: {
409
+ w: "w-5",
410
+ h: "h-5"
411
+ },
412
+ 6: {
413
+ w: "w-6",
414
+ h: "h-6"
415
+ },
416
+ 7: {
417
+ w: "w-7",
418
+ h: "h-7"
419
+ },
420
+ 8: {
421
+ w: "w-8",
422
+ h: "h-8"
423
+ },
424
+ 9: {
425
+ w: "w-9",
426
+ h: "h-9"
427
+ },
428
+ 10: {
429
+ w: "w-10",
430
+ h: "h-10"
431
+ },
432
+ 11: {
433
+ w: "w-11",
434
+ h: "h-11"
435
+ },
436
+ 12: {
437
+ w: "w-12",
438
+ h: "h-12"
439
+ },
440
+ 14: {
441
+ w: "w-14",
442
+ h: "h-14"
443
+ },
444
+ 16: {
445
+ w: "w-16",
446
+ h: "h-16"
447
+ },
448
+ 20: {
449
+ w: "w-20",
450
+ h: "h-20"
451
+ },
452
+ 24: {
453
+ w: "w-24",
454
+ h: "h-24"
455
+ },
456
+ 28: {
457
+ w: "w-28",
458
+ h: "h-28"
459
+ },
460
+ 32: {
461
+ w: "w-32",
462
+ h: "h-32"
463
+ },
464
+ 36: {
465
+ w: "w-36",
466
+ h: "h-36"
467
+ },
468
+ 40: {
469
+ w: "w-40",
470
+ h: "h-40"
471
+ },
472
+ 44: {
473
+ w: "w-44",
474
+ h: "h-44"
475
+ },
476
+ 48: {
477
+ w: "w-48",
478
+ h: "h-48"
479
+ },
480
+ 52: {
481
+ w: "w-52",
482
+ h: "h-52"
483
+ },
484
+ 56: {
485
+ w: "w-56",
486
+ h: "h-56"
487
+ },
488
+ 60: {
489
+ w: "w-60",
490
+ h: "h-60"
491
+ },
492
+ 64: {
493
+ w: "w-64",
494
+ h: "h-64"
495
+ },
496
+ 72: {
497
+ w: "w-72",
498
+ h: "h-72"
499
+ },
500
+ 80: {
501
+ w: "w-80",
502
+ h: "h-80"
503
+ },
504
+ 96: {
505
+ w: "w-96",
506
+ h: "h-96"
507
+ }
508
+ };
509
+ var SIZE_VALUES = Object.keys(sizeMap).map((key) => key === "px" ? "px" : Number(key));
510
+ var getHeight = (size) => sizeMap[size]?.h;
511
+ var getWidth = (size) => sizeMap[size]?.w;
512
+ var getSize = (size) => mx(getHeight(size), getWidth(size));
513
+ var sizeValue = (size) => size === "px" ? 1 : size;
514
+ var sizeToRem = (size) => size === "px" ? "1px" : `${size * 0.25}rem`;
515
+ var iconSize = (size) => ({
516
+ "--icon-size": size ? sizeToRem(size) : "initial"
517
+ });
518
+ var snapSize = (value, defaultSize) => {
519
+ if (SIZE_VALUES.includes(value)) {
618
520
  return value;
619
521
  } else if (value <= 0) {
620
522
  return 0;
621
- } else if (value === 1) {
523
+ } else if (value < 0.5) {
622
524
  return "px";
623
525
  } else {
624
526
  const wholeSeries = Math.floor(value);
625
527
  const halfSeries = Math.floor(value * 2) / 2;
626
528
  const doubleSeries = Math.floor(value / 2) * 2;
627
529
  const quadrupleSeries = Math.floor(value / 4) * 4;
628
- if (sizes.has(halfSeries)) {
530
+ if (SIZE_VALUES.includes(halfSeries)) {
629
531
  return halfSeries;
630
- } else if (sizes.has(wholeSeries)) {
532
+ } else if (SIZE_VALUES.includes(wholeSeries)) {
631
533
  return wholeSeries;
632
- } else if (sizes.has(doubleSeries)) {
534
+ } else if (SIZE_VALUES.includes(doubleSeries)) {
633
535
  return doubleSeries;
634
- } else if (sizes.has(quadrupleSeries)) {
536
+ } else if (SIZE_VALUES.includes(quadrupleSeries)) {
635
537
  return quadrupleSeries;
636
538
  } else {
637
539
  return defaultSize;
638
540
  }
639
541
  }
640
542
  };
641
- var sizeValue = (size) => size === "px" ? 1 : size;
642
-
643
- // src/fragments/text.ts
644
- var textBlockWidth = "w-full max-w-text-content mx-auto";
645
- var descriptionTextPrimary = "text-sm font-normal text-base-surface-text";
646
- var descriptionMessage = "text-description border border-dashed border-separator rounded-sm p-4";
647
543
 
648
- // src/fragments/valence.ts
544
+ // src/util/valence.ts
649
545
  var textValence = (valence) => {
650
546
  switch (valence) {
651
547
  case "success":
@@ -677,12 +573,12 @@ var messageValence = (valence) => {
677
573
  var avatarRoot = ({ size = 10, inGroup }, ...etc) => mx("relative inline-flex shrink-0", getSize(size), inGroup && (size === "px" || size <= 3 ? "-mr-1" : "-mr-2"), ...etc);
678
574
  var avatarLabel = ({ srOnly }, ...etc) => mx(srOnly && "sr-only", ...etc);
679
575
  var avatarDescription = ({ srOnly }, ...etc) => mx("text-description", srOnly && "sr-only", ...etc);
680
- var avatarFrame = ({ variant }, ...etc) => mx("w-full h-full bg-(--surface-bg)", variant === "circle" ? "rounded-full" : "rounded-sm", ...etc);
576
+ var avatarFrame = ({ variant }, ...etc) => mx("h-full w-full bg-(--surface-bg)", variant === "circle" ? "rounded-full" : "rounded-sm", ...etc);
681
577
  var avatarStatusIcon = ({ status, size = 3 }, ...etc) => mx("absolute bottom-0 end-0", getSize(size), status === "inactive" ? "text-amber-400 dark:text-amber-300" : status === "active" ? "text-emerald-400 dark:text-emerald-300" : "text-neutral-400 dark:text-neutral-300", ...etc);
682
578
  var avatarRing = ({ status, variant, animation }, ...etc) => mx("absolute inset-0 border-2", variant === "circle" ? "rounded-full" : "rounded-sm", status === "current" ? "border-primary-400 dark:border-primary-500" : status === "active" ? "border-emerald-400 dark:border-emerald-400" : status === "error" ? "border-rose-400 dark:border-rose-500" : status === "warning" ? "border-amber-400 dark:border-amber-500" : status === "inactive" ? "border-separator" : status === "internal" ? "border-fuchsia-600" : "border-[color:var(--surface-bg)]", animation === "pulse" ? "animate-halo-pulse" : "", ...etc);
683
579
  var avatarFallbackText = (_props, ...etc) => mx("fill-white", ...etc);
684
580
  var avatarGroup = (_props, ...etc) => mx("inline-flex items-center", ...etc);
685
- var avatarGroupLabel = ({ size, srOnly }, ...etc) => mx(srOnly ? "sr-only" : "rounded-full truncate text-sm leading-none py-1 px-2 relative z-[1] flex items-center justify-center", size && getSizeHeight(size), ...etc);
581
+ var avatarGroupLabel = ({ size, srOnly }, ...etc) => mx(srOnly ? "sr-only" : "rounded-full truncate text-sm leading-none py-1 px-2 relative z-[1] flex items-center justify-center", size && getHeight(size), ...etc);
686
582
  var avatarGroupDescription = ({ srOnly }, ...etc) => mx(srOnly ? "sr-only" : "text-description", ...etc);
687
583
  var avatarTheme = {
688
584
  root: avatarRoot,
@@ -712,8 +608,8 @@ var breadcrumbTheme = {
712
608
  };
713
609
 
714
610
  // src/theme/components/card.ts
715
- var cardRoot = ({ border, fullWidth }, ...etc) => mx("dx-card group/card relative flex flex-col w-full min-h-(--dx-rail-item) dx-card-min-width overflow-hidden", border && "bg-card-surface border border-separator dark:border-subdued-separator rounded-xs dx-focus-ring-group-y-indicator", fullWidth && "max-w-none!", ...etc);
716
- var cardToolbar = ({ coarse }, ...etc) => mx("dx-card__toolbar dx-density-fine bg-transparent col-span-3 !grid grid-cols-subgrid [contain:none]", coarse && "grid-cols-[var(--dx-l0-avatar-size)_minmax(0,1fr)_var(--dx-rail-item)]", ...etc);
611
+ var cardRoot = ({ border, fullWidth }, ...etc) => mx("dx-card dx-card-min-width min-h-(--dx-rail-item) group/card relative overflow-hidden", border && "bg-card-surface border border-separator dark:border-subdued-separator rounded-xs dx-focus-ring-group-y-indicator", fullWidth && "max-w-none!", ...etc);
612
+ var cardToolbar = (_, ...etc) => mx("dx-card__toolbar dx-density-fine bg-transparent p-0! gap-0! col-span-3 grid! grid-cols-subgrid! [contain:none]", ...etc);
717
613
  var cardTitle = (_props, ...etc) => mx("dx-card__title grow truncate", ...etc);
718
614
  var cardContent = (_props, ...etc) => mx("dx-card__content contents [&>:last-child]:pb-1", ...etc);
719
615
  var cardHeading = ({ variant = "default" }, ...etc) => mx("dx-card__heading", variant === "default" && "py-1", variant === "subtitle" && "py-2 text-xs text-description font-medium uppercase", ...etc);
@@ -725,7 +621,7 @@ var cardAction = (_props, ...etc) => mx("dx-card__acztion col-span-3 !grid grid-
725
621
  var cardActionLabel = (_props, ...etc) => mx("dx-card__action-label min-w-0 flex-1 truncate", ...etc);
726
622
  var cardLink = (_props, ...etc) => mx("dx-card__link col-span-3 !grid grid-cols-subgrid group p-0! dx-button dx-focus-ring min-h-1!", ...etc);
727
623
  var cardLinkLabel = (_props, ...etc) => mx("dx-card__link-label min-w-0 flex-1 truncate", ...etc);
728
- var cardIconBlock = (_props, ...etc) => mx("dx-card__icon-block grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center", ...etc);
624
+ var cardIconBlock = ({ padding }, ...etc) => mx("dx-card__icon-block grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center", padding && "[&>*]:p-1", ...etc);
729
625
  var cardTheme = {
730
626
  root: cardRoot,
731
627
  toolbar: cardToolbar,
@@ -749,7 +645,7 @@ var staticDefaultButtonColors = "bg-input-surface text-input-surface-text";
749
645
  var defaultButtonColors = mx(staticDefaultButtonColors, "data-[state=open]:bg-input-surface aria-pressed:text-accent-text aria-pressed:bg-base-surface aria-checked:text-accent-text aria-checked:bg-base-surface");
750
646
  var ghostButtonColors = mx(ghostHover, "hover:text-inherit data-[state=open]:bg-input-surface aria-pressed:text-accent-text aria-pressed:bg-base-surface aria-checked:text-accent-text aria-checked:bg-base-surface");
751
647
  var buttonRoot = (_props, ...etc) => {
752
- return mx("dx-button dx-focus-ring group max-w-full [&_span]:truncate", ...etc);
648
+ return mx("dx-button dx-focus-ring group [&_span]:truncate", ...etc);
753
649
  };
754
650
  var buttonGroup = (_props, ...etc) => {
755
651
  return mx("inline-flex rounded-xs [&>:first-child]:rounded-w-sm [&>:last-child]:rounded-ie-sm [&>button]:relative", ...etc);
@@ -760,7 +656,7 @@ var buttonTheme = {
760
656
  };
761
657
 
762
658
  // src/theme/components/dialog.ts
763
- var sizeMap = {
659
+ var sizeMap2 = {
764
660
  sm: "md:max-w-[24rem]",
765
661
  md: "md:max-w-[32rem]!",
766
662
  lg: "md:max-w-[40rem]!",
@@ -768,10 +664,10 @@ var sizeMap = {
768
664
  };
769
665
  var dialogOverlay = (_props, ...etc) => mx("dx-dialog__overlay", ...etc);
770
666
  var dialogContent = ({ inOverlayLayout, size = "md" }, ...etc) => {
771
- return mx("@container", "dx-dialog__content dx-focus-ring dx-modal-surface dx-density-coarse py-4", !inOverlayLayout && "fixed z-50 top-[50%] left-[50%] -translate-x-[50%] -translate-y-[50%]", sizeMap[size], ...etc);
667
+ return mx("@container", "dx-dialog__content dx-focus-ring dx-modal-surface dx-density-coarse py-4", !inOverlayLayout && "fixed z-50 top-[50%] left-[50%] -translate-x-[50%] -translate-y-[50%]", sizeMap2[size], ...etc);
772
668
  };
773
669
  var dialogHeader = (_props, ...etc) => mx("dx-dialog__header flex pb-4 items-center justify-between", ...etc);
774
- var dialogBody = (_props, ...etc) => mx("dx-dialog__body flex flex-col h-full py-2 gap-2", ...etc);
670
+ var dialogBody = (_props, ...etc) => mx("dx-dialog__body", ...etc);
775
671
  var dialogActionBar = (_props, ...etc) => mx("dx-dialog__actionbar flex items-center pt-4 gap-2 dx-density-coarse", ...etc);
776
672
  var dialogTitle = ({ srOnly }, ...etc) => mx("dx-dialog__title", srOnly && "sr-only", ...etc);
777
673
  var dialogDescription = ({ srOnly }, ...etc) => mx("dx-dialog__description", "text-description", srOnly && "sr-only", ...etc);
@@ -785,8 +681,17 @@ var dialogTheme = {
785
681
  description: dialogDescription
786
682
  };
787
683
 
684
+ // src/theme/components/focus.ts
685
+ var focusRing = ({ border }, ...etc) => mx("dx-ring-pseudo outline-hidden", "focus:after:ring-neutral-focus-indicator", "data-[focus-state=active]:after:ring-neutral-focus-indicator", "data-[focus-state=error]:after:ring-rose-500", border && "border border-separator", ...etc);
686
+ var focusTheme = {
687
+ group: focusRing,
688
+ item: focusRing
689
+ };
690
+
788
691
  // src/theme/components/icon.ts
789
- var iconRoot = ({ size }, etc) => mx("shrink-0 h-[1em] w-[1em] text-[var(--icons-color,currentColor)]", size && getSize(size), etc);
692
+ var iconRoot = ({ size }, etc) => {
693
+ return mx("shrink-0 text-[var(--icons-color,currentColor)]", size ? getSize(size) : "[width:var(--icon-size,var(--dx-default-icons-size))] [height:var(--icon-size,var(--dx-default-icons-size))]", etc);
694
+ };
790
695
  var iconTheme = {
791
696
  root: iconRoot
792
697
  };
@@ -821,7 +726,7 @@ var sharedSubduedInputStyles = (props) => [
821
726
  "py-0 w-full bg-transparent text-current placeholder-placeholder",
822
727
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
823
728
  props.density === "fine" ? fineBlockSize : coarseBlockSize,
824
- subduedFocus,
729
+ "dx-focus-subdued",
825
730
  props.disabled && staticDisabled
826
731
  ];
827
732
  var sharedDefaultInputStyles = (props) => [
@@ -839,23 +744,20 @@ var sharedStaticInputStyles = (props) => [
839
744
  props.focused && "bg-attention-surface",
840
745
  inputValence(props.validationValence),
841
746
  props.disabled && staticDisabled,
842
- props.focused && staticFocusRing
747
+ props.focused && "dx-focus-static"
843
748
  ];
844
- var inputInput = (props, ...etc) => props.variant === "subdued" ? mx(...sharedSubduedInputStyles(props), ...etc) : props.variant === "static" ? mx(...sharedStaticInputStyles(props), ...etc) : mx(...sharedDefaultInputStyles(props), !props.disabled && focusRing, inputValence(props.validationValence), ...etc);
845
- var inputTextArea = (props, ...etc) => inputInput(props, ...[
846
- "-mb-1.5",
847
- ...etc
848
- ]);
749
+ var inputInput = (props, ...etc) => props.variant === "subdued" ? mx(...sharedSubduedInputStyles(props), ...etc) : props.variant === "static" ? mx(...sharedStaticInputStyles(props), ...etc) : mx(...sharedDefaultInputStyles(props), !props.disabled && "dx-focus-ring", inputValence(props.validationValence), ...etc);
750
+ var inputTextArea = (props, ...etc) => inputInput(props, ...etc);
849
751
  var inputCheckbox = ({ size = 5 }, ...etc) => mx("dx-checkbox dx-focus-ring", getSize(size), ...etc);
850
- var inputCheckboxIndicator = ({ size = 5, checked }, ...etc) => mx(getSize(computeSize(sizeValue(size) * 0.65, 4)), !checked && "invisible", ...etc);
752
+ var inputCheckboxIndicator = ({ size = 5, checked }, ...etc) => mx(getSize(snapSize(sizeValue(size) * 0.65, 4)), !checked && "invisible", ...etc);
851
753
  var inputSwitch = ({ size = 5, disabled }, ...etc) => mx(
852
- getSizeHeight(size),
853
- getSizeWidth(computeSize(sizeValue(size) * 1.75, 9)),
754
+ getHeight(size),
755
+ getWidth(snapSize(sizeValue(size) * 1.75, 9)),
854
756
  booleanInputSurface,
855
757
  !disabled && booleanInputSurfaceHover,
856
758
  // TODO(burdon): Added m-1 margin to make 40px width to align with 40px icon button.
857
759
  "cursor-pointer shrink-0 rounded-full px-1 mx-1 relative",
858
- focusRing,
760
+ "dx-focus-ring",
859
761
  ...etc
860
762
  );
861
763
  var inputSwitchThumb = ({ size = 5 }, ...etc) => mx(getSize(size === "px" ? "px" : size - 2), "block bg-white rounded-full transition-transform duration-100 will-change-transform data-[state=checked]:translate-x-[100%]", ...etc);
@@ -881,7 +783,7 @@ var inputTheme = {
881
783
  };
882
784
 
883
785
  // src/theme/components/link.ts
884
- var linkRoot = ({ variant }, ...etc) => mx("underline decoration-1 underline-offset-2 transition-color rounded-xs", variant === "neutral" ? "text-inherit hover:opacity-90 visited:text-inherit visited:hover:opacity-90" : "text-accent-text hover:text-accent-text-hover visited:text-accent-text visited:hover:text-accent-text-hover", focusRing, ...etc);
786
+ var linkRoot = ({ variant }, ...etc) => mx("underline decoration-1 underline-offset-2 transition-color rounded-xs", variant === "neutral" ? "text-inherit hover:opacity-90 visited:text-inherit visited:hover:opacity-90" : "text-accent-text hover:text-accent-text-hover visited:text-accent-text visited:hover:text-accent-text-hover", "dx-focus-ring", ...etc);
885
787
  var linkTheme = {
886
788
  root: linkRoot
887
789
  };
@@ -892,7 +794,7 @@ var listItem = ({ collapsible }, ...etc) => mx(!collapsible && "flex", ...etc);
892
794
  var listItemEndcap = ({ density }, ...etc) => mx(density === "fine" ? getSize(8) : getSize(10), "shrink-0 flex items-center justify-center", ...etc);
893
795
  var listItemHeading = ({ density }, ...etc) => mx(densityBlockSize(density), "flex items-center", ...etc);
894
796
  var listItemDragHandleIcon = (_props, ...etc) => mx(getSize(5), "mt-2.5", ...etc);
895
- var listItemOpenTrigger = ({ density }, ...etc) => mx("w-5 rounded-sm flex justify-center items-center", densityBlockSize(density), ghostHover, focusRing, ...etc);
797
+ var listItemOpenTrigger = ({ density }, ...etc) => mx("w-5 rounded-sm flex justify-center items-center", densityBlockSize(density), ghostHover, "dx-focus-ring", ...etc);
896
798
  var listItemOpenTriggerIcon = (_props, ...etc) => {
897
799
  return mx(getSize(5), ...etc);
898
800
  };
@@ -931,7 +833,7 @@ var menuContent = ({ elevation }, ...etc) => mx("dx-modal-surface w-48 rounded-s
931
833
  elevation: "positioned"
932
834
  }), ...etc);
933
835
  var menuViewport = (_props, ...etc) => mx("rounded-sm p-1 max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto", ...etc);
934
- var menuItem = (_props, ...etc) => mx("flex cursor-pointer select-none items-center gap-2 rounded-xs px-2 py-2 text-sm", "data-[highlighted]:bg-hover-surface", subduedFocus, dataDisabled, ...etc);
836
+ var menuItem = (_props, ...etc) => mx("flex cursor-pointer select-none items-center gap-2 rounded-xs px-2 py-2 text-sm", "data-[highlighted]:bg-hover-surface", "dx-focus-subdued", dataDisabled, ...etc);
935
837
  var menuSeparator = (_props, ...etc) => mx("my-1 mx-2 h-px bg-separator", ...etc);
936
838
  var menuGroupLabel = (_props, ...etc) => mx("text-description", "select-none px-2 py-2", ...etc);
937
839
  var menuArrow = (_props, ...etc) => mx("fill-separator", ...etc);
@@ -952,7 +854,7 @@ var messageHeader = (_, etc) => {
952
854
  return mx("col-span-2 grid grid-cols-subgrid items-center", etc);
953
855
  };
954
856
  var messageTitle = (_, etc) => {
955
- return mx("col-start-2 text-lg gap-trim-sm [&>svg]:inline-block", etc);
857
+ return mx("col-start-2 gap-trim-sm [&>svg]:inline-block", etc);
956
858
  };
957
859
  var messageIcon = (_, etc) => {
958
860
  return mx("col-start-1", etc);
@@ -974,15 +876,8 @@ var popoverContent = ({ elevation }, ...etc) => mx("dx-modal-surface border bord
974
876
  }), surfaceZIndex({
975
877
  elevation,
976
878
  level: "menu"
977
- }), focusRing, ...etc);
978
- var popoverViewport = ({ constrainBlock, constrainInline }, ...etc) => mx(
979
- "flex flex-col min-h-0 min-w-popover-min-width",
980
- (constrainBlock || constrainInline) && "overflow-hidden",
981
- // Ensures it respects available height from Radix (or 100dvh).
982
- constrainBlock && "max-h-[min(var(--radix-popover-content-available-height),calc(100dvh-var(--spacing-screen-border)*2))]",
983
- constrainInline && "max-w-(--radix-popover-content-available-width)",
984
- ...etc
985
- );
879
+ }), "dx-focus-ring", ...etc);
880
+ var popoverViewport = ({ constrainBlock, constrainInline }, ...etc) => mx("flex flex-col min-h-0 min-w-popover-min-width", (constrainBlock || constrainInline) && "overflow-hidden", constrainBlock && "max-h-(--radix-popover-content-available-height)", constrainBlock && "max-h-[min(var(--radix-popover-content-available-height),calc(100dvh-var(--spacing-screen-border)*2))]", constrainInline && "max-w-(--radix-popover-content-available-width)", ...etc);
986
881
  var popoverArrow = (_props, ...etc) => mx("fill-separator", ...etc);
987
882
  var popoverTheme = {
988
883
  content: popoverContent,
@@ -991,40 +886,63 @@ var popoverTheme = {
991
886
  };
992
887
 
993
888
  // src/theme/components/scroll-area.ts
994
- var scrollAreaRoot = ({ orientation, margin, thin }, ...etc) => mx(
995
- "overflow-hidden",
996
- orientation === "vertical" && "group/scroll-v dx-container",
997
- orientation === "horizontal" && "group/scroll-h dx-container",
998
- orientation === "all" && "group/scroll-all dx-container",
999
- // TODO(burdon): Audit composition.
889
+ var scrollbar = {
890
+ thin: {
891
+ size: 4,
892
+ padding: 4
893
+ },
894
+ coarse: {
895
+ size: 8,
896
+ padding: 8
897
+ }
898
+ };
899
+ var scrollAreaRoot = ({ orientation }, ...etc) => mx(
900
+ // Expand
901
+ "dx-container",
902
+ orientation === "vertical" && "group/scroll-v flex flex-col",
903
+ orientation === "horizontal" && "group/scroll-h flex",
904
+ orientation === "all" && "group/scroll-all",
1000
905
  // Apply col-span-full only when inside a Column.Root grid (detected via dx-column marker).
1001
906
  "[.dx-column_&]:col-span-full",
1002
- // NOTE: Uses --gutter CSS variable
1003
- // If contained within Column.Root grid, the gutter is set by that component.
1004
- margin && [
1005
- orientation === "vertical" && (thin ? "pl-[var(--gutter,4px)] pr-[calc(var(--gutter,4px)-4px)]" : "pl-[var(--gutter,8px)] pr-[calc(var(--gutter,8px)-8px)]"),
1006
- orientation === "horizontal" && (thin ? "py-[var(--gutter,4px)]" : "py-[var(--gutter,8px)]"),
1007
- orientation === "all" && (thin ? "pl-[var(--gutter,4px)] py-[var(--gutter,8px)]" : "pl-[var(--gutter,8px)] py-[var(--gutter,8px)]")
1008
- ],
1009
907
  ...etc
1010
908
  );
1011
- var scrollAreaViewport = ({ orientation, autoHide, padding, snap, thin }, ...etc) => mx("h-full w-full", orientation === "vertical" && "flex flex-col overflow-y-scroll", orientation === "horizontal" && "flex overflow-x-scroll", orientation === "all" && "overflow-scroll", thin ? "[&::-webkit-scrollbar]:w-[4px] [&::-webkit-scrollbar]:h-[4px]" : "[&::-webkit-scrollbar]:w-[8px] [&::-webkit-scrollbar]:h-[8px]", "[&::-webkit-scrollbar-corner]:bg-transparent", "[&::-webkit-scrollbar-track]:bg-transparent", "[&::-webkit-scrollbar-thumb]:rounded-none", autoHide ? [
1012
- orientation === "vertical" && "group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1013
- orientation === "horizontal" && "group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1014
- orientation === "all" && "group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
1015
- ] : [
1016
- orientation === "vertical" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1017
- orientation === "horizontal" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1018
- orientation === "all" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
1019
- ], padding && [
1020
- orientation === "vertical" && "px-[4px]",
1021
- orientation === "horizontal" && "pb-[4px]",
1022
- orientation === "all" && "pl-[4px] pb-[4px]"
1023
- ], snap && [
1024
- orientation === "vertical" && "snap-y snap-mandatory",
1025
- orientation === "horizontal" && "snap-x snap-mandatory",
1026
- orientation === "all" && "snap-both snap-mandatory"
1027
- ], ...etc);
909
+ var scrollAreaViewport = ({ orientation, centered, padding, snap, thin, autoHide }, ...etc) => {
910
+ return mx(
911
+ "h-full w-full",
912
+ orientation === "vertical" && "flex flex-col overflow-y-scroll",
913
+ orientation === "horizontal" && "flex overflow-x-scroll",
914
+ orientation === "all" && "overflow-scroll",
915
+ "[&::-webkit-scrollbar-corner]:bg-transparent",
916
+ "[&::-webkit-scrollbar-track]:bg-transparent",
917
+ "[&::-webkit-scrollbar-thumb]:rounded-none",
918
+ "[&::-webkit-scrollbar]:w-[var(--scroll-width)] [&::-webkit-scrollbar]:h-[var(--scroll-width)]",
919
+ // If contained within Column.Root grid the gutter is set by that component (--gutter CSS variable).
920
+ // If centered, left padding compensates for scrollbar width so content is visually centered.
921
+ (orientation === "vertical" || orientation === "all") && (padding ? [
922
+ centered ? "pl-[var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))]" : "pl-[var(--gutter,0)]",
923
+ "pr-[calc(var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))-var(--scroll-width))]"
924
+ ] : centered && "pl-[var(--scroll-width)]"),
925
+ (orientation === "horizontal" || orientation === "all") && (padding ? [
926
+ centered && "pt-[calc(var(--scroll-width)+var(--scroll-padding))]",
927
+ "pb-[var(--scroll-padding)]"
928
+ ] : centered && "pt-[var(--scroll-width)]"),
929
+ snap && [
930
+ orientation === "vertical" && "snap-y snap-mandatory",
931
+ orientation === "horizontal" && "snap-x snap-mandatory",
932
+ orientation === "all" && "snap-both snap-mandatory"
933
+ ],
934
+ autoHide ? [
935
+ orientation === "vertical" && "group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
936
+ orientation === "horizontal" && "group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
937
+ orientation === "all" && "group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
938
+ ] : [
939
+ orientation === "vertical" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
940
+ orientation === "horizontal" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
941
+ orientation === "all" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
942
+ ],
943
+ ...etc
944
+ );
945
+ };
1028
946
  var scrollAreaTheme = {
1029
947
  root: scrollAreaRoot,
1030
948
  viewport: scrollAreaViewport
@@ -1040,7 +958,7 @@ var selectContent = ({ elevation }, ...etc) => {
1040
958
  }), ...etc);
1041
959
  };
1042
960
  var selectViewport = (_props, ...etc) => mx(...etc);
1043
- var selectItem = (_props, ...etc) => mx("flex items-center min-h-[2rem] px-3 py-1 gap-2", "text-base-surface-text leading-none select-none outline-hidden", "[&>svg]:invisible [&[data-state=checked]>svg]:visible", ghostHighlighted, ...etc);
961
+ var selectItem = (_props, ...etc) => mx("flex items-center min-h-[2rem] px-3 py-1 gap-2", "text-base-surface-text leading-none select-none outline-hidden", "[&>svg]:invisible [&[data-state=checked]>svg]:visible", "dx-highlighted", ...etc);
1044
962
  var selectItemIndicator = (_props, ...etc) => mx("items-center", ...etc);
1045
963
  var selectArrow = (_props, ...etc) => mx("fill-separator", ...etc);
1046
964
  var selectSeparator = (_props, ...etc) => mx("self-stretch border-b my-1 border-separator", ...etc);
@@ -1076,8 +994,8 @@ var skeletonTheme = {
1076
994
  };
1077
995
 
1078
996
  // src/theme/components/status.ts
1079
- var statusRoot = ({ variant = "default" }, ...etc) => mx("h-1 relative bg-hover-overlay rounded-full overflow-hidden", variant === "main-bottom" ? "w-full block" : "inline-20 inline-block", ...etc);
1080
- var statusBar = ({ indeterminate, variant = "default" }, ...etc) => mx("absolute inset-y-0 block rounded-full", variant === "main-bottom" ? "bg-accent-surface" : "bg-un-accent", indeterminate ? "animate-progress-indeterminate" : "start-0", ...etc);
997
+ var statusRoot = ({ variant = "default" }, ...etc) => mx("h-1 relative rounded-full overflow-hidden", variant === "main-bottom" ? "w-full block" : "inline-20 inline-block bg-base-surface", ...etc);
998
+ var statusBar = ({ variant = "default", indeterminate }, ...etc) => mx("absolute inset-y-0 block rounded-full", variant === "main-bottom" ? "bg-composer-300" : "bg-un-accent", indeterminate ? "animate-progress-indeterminate" : "start-0", ...etc);
1081
999
  var statusTheme = {
1082
1000
  root: statusRoot,
1083
1001
  bar: statusBar
@@ -1098,7 +1016,7 @@ var toastViewport = (_props, ...etc) => mx(
1098
1016
  );
1099
1017
  var toastRoot = (_props, ...etc) => mx("dx-modal-surface rounded-md flex p-2 gap-2", surfaceShadow({
1100
1018
  elevation: "toast"
1101
- }), "radix-state-open:animate-toast-slide-in-bottom md:radix-state-open:animate-toast-slide-in-right", "radix-state-closed:animate-toast-hide", "radix-swipe-end:animate-toast-swipe-out", "translate-x-radix-toast-swipe-move-x", "radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]", focusRing, ...etc);
1019
+ }), "radix-state-open:animate-toast-slide-in-bottom md:radix-state-open:animate-toast-slide-in-right", "radix-state-closed:animate-toast-hide", "radix-swipe-end:animate-toast-swipe-out", "translate-x-radix-toast-swipe-move-x", "radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]", "dx-focus-ring", ...etc);
1102
1020
  var toastBody = (_props, ...etc) => mx("grow flex flex-col gap-1 justify-center pl-2", ...etc);
1103
1021
  var toastActions = (_props, ...etc) => mx("shrink-0 flex flex-col gap-1 justify-center", ...etc);
1104
1022
  var toastTitle = ({ srOnly }, ...etc) => mx("shrink-0 font-medium", srOnly && "sr-only", ...etc);
@@ -1117,18 +1035,11 @@ var toolbarLayout = "w-full shrink-0 flex flex-nowrap p-1 gap-1 items-center ove
1117
1035
  var toolbarRoot = ({ density, disabled, layoutManaged }, ...etc) => {
1118
1036
  return mx("bg-toolbar-surface dx-toolbar", density === "coarse" && "h-(--dx-rail-size) px-3!", disabled && "*:opacity-20", !layoutManaged && toolbarLayout, ...etc);
1119
1037
  };
1120
- var toolbarInner = ({ layoutManaged }, ...etc) => {
1121
- return mx(!layoutManaged && [
1122
- "flex gap-1",
1123
- textBlockWidth
1124
- ], ...etc);
1125
- };
1126
1038
  var toolbarText = (_, ...etc) => {
1127
- return mx("grow truncate items-center", textBlockWidth, ...etc);
1039
+ return mx("px-2 grow truncate items-center", ...etc);
1128
1040
  };
1129
1041
  var toolbarTheme = {
1130
1042
  root: toolbarRoot,
1131
- inner: toolbarInner,
1132
1043
  text: toolbarText
1133
1044
  };
1134
1045
 
@@ -1189,44 +1100,42 @@ var treegridTheme = {
1189
1100
  cell: treegridCell
1190
1101
  };
1191
1102
 
1192
- // src/theme/theme.ts
1193
- import { getDeep } from "@dxos/util";
1194
-
1195
1103
  // src/theme/primitives/column.ts
1196
- var columnRoot = (_, ...etc) => mx("dx-column w-full min-w-0 grid", ...etc);
1197
- var columnRow = (_, ...etc) => mx("col-span-3 grid grid-cols-subgrid", ...etc);
1198
- var columnSegment = (_, ...etc) => mx("col-start-2 col-span-1 min-w-0", ...etc);
1104
+ var columnRoot = (_, ...etc) => {
1105
+ return mx("dx-column w-full min-w-0 grid", ...etc);
1106
+ };
1107
+ var columnContent = (_, ...etc) => {
1108
+ return mx("col-span-full grid grid-cols-subgrid min-h-0 [&>:not(.dx-container)]:col-start-2", ...etc);
1109
+ };
1110
+ var columnViewport = (_, ...etc) => {
1111
+ return mx(...etc);
1112
+ };
1113
+ var columnRow = ({ fullWidth, center }, ...etc) => {
1114
+ return mx("col-span-3 grid grid-cols-subgrid", fullWidth ? "col-span-3" : center && "col-start-2 col-span-1", ...etc);
1115
+ };
1199
1116
  var columnTheme = {
1200
1117
  root: columnRoot,
1201
- row: columnRow,
1202
- segment: columnSegment
1118
+ content: columnContent,
1119
+ viewport: columnViewport,
1120
+ row: columnRow
1203
1121
  };
1204
1122
 
1205
1123
  // src/theme/primitives/panel.ts
1124
+ var sizes = {
1125
+ lg: "h-(--dx-topbar-size)",
1126
+ md: "h-(--dx-toolbar-size)",
1127
+ sm: "h-(--dx-statusbar-size)"
1128
+ };
1206
1129
  var panelRoot = (_, ...etc) => mx(
1207
1130
  // prettier-ignore
1208
- "h-full w-full grid grid-cols-[100%] overflow-hidden",
1131
+ "dx-container grid grid-cols-[100%] overflow-hidden",
1209
1132
  // Add uncategorized children to content slot.
1210
1133
  "[&>*:not([data-slot])]:[grid-area:content]",
1211
1134
  ...etc
1212
1135
  );
1213
- var panelToolbar = (_, ...etc) => mx(
1214
- // prettier-ignore
1215
- "[grid-area:toolbar]",
1216
- "border-b border-subdued-separator relative",
1217
- "[.dx-main-mobile-layout_&]:px-3",
1218
- ...etc
1219
- );
1220
- var panelContent = (_, ...etc) => mx(
1221
- // prettier-ignore
1222
- "[grid-area:content] overflow-hidden min-h-0",
1223
- ...etc
1224
- );
1225
- var panelStatusbar = (_, ...etc) => mx(
1226
- // prettier-ignore
1227
- "[grid-area:statusbar]",
1228
- ...etc
1229
- );
1136
+ var panelToolbar = ({ size = "md" }, ...etc) => mx("[grid-area:toolbar]", "flex shrink-0", sizes[size], ...etc);
1137
+ var panelContent = (_, ...etc) => mx("[grid-area:content] overflow-hidden min-h-0", ...etc);
1138
+ var panelStatusbar = ({ size = "md" }, ...etc) => mx("[grid-area:statusbar]", "flex shrink-0", sizes[size], ...etc);
1230
1139
  var panelTheme = {
1231
1140
  root: panelRoot,
1232
1141
  toolbar: panelToolbar,
@@ -1235,6 +1144,7 @@ var panelTheme = {
1235
1144
  };
1236
1145
 
1237
1146
  // src/theme/theme.ts
1147
+ import { getDeep } from "@dxos/util";
1238
1148
  var defaultTheme = {
1239
1149
  themeName: () => "default",
1240
1150
  //
@@ -1250,6 +1160,7 @@ var defaultTheme = {
1250
1160
  button: buttonTheme,
1251
1161
  card: cardTheme,
1252
1162
  dialog: dialogTheme,
1163
+ focus: focusTheme,
1253
1164
  icon: iconTheme,
1254
1165
  iconButton: iconButtonTheme,
1255
1166
  input: inputTheme,
@@ -1307,8 +1218,9 @@ export {
1307
1218
  cardTheme,
1308
1219
  coarseBlockSize,
1309
1220
  coarseDimensions,
1221
+ columnTheme,
1222
+ composable,
1310
1223
  composableProps,
1311
- computeSize,
1312
1224
  dataDisabled,
1313
1225
  defaultButtonColors,
1314
1226
  defaultTheme,
@@ -1326,19 +1238,16 @@ export {
1326
1238
  dialogTitle,
1327
1239
  fineBlockSize,
1328
1240
  fineDimensions,
1329
- focusRing,
1241
+ focusTheme,
1330
1242
  getHashHue,
1331
1243
  getHashStyles,
1244
+ getHeight,
1332
1245
  getSize,
1333
- getSizeHeight,
1334
- getSizeWidth,
1335
1246
  getStyles,
1247
+ getWidth,
1336
1248
  ghostButtonColors,
1337
1249
  ghostFocusWithin,
1338
- ghostHighlighted,
1339
1250
  ghostHover,
1340
- ghostSelected,
1341
- ghostSelectedContainerMd,
1342
1251
  groupHoverControlItemWithTransition,
1343
1252
  hoverableControlItem,
1344
1253
  hoverableControls,
@@ -1350,6 +1259,7 @@ export {
1350
1259
  iconButtonRoot,
1351
1260
  iconButtonTheme,
1352
1261
  iconRoot,
1262
+ iconSize,
1353
1263
  iconTheme,
1354
1264
  inputTextLabel,
1355
1265
  inputTheme,
@@ -1387,6 +1297,7 @@ export {
1387
1297
  mx,
1388
1298
  osTranslations,
1389
1299
  palette,
1300
+ panelTheme,
1390
1301
  popoverArrow,
1391
1302
  popoverContent,
1392
1303
  popoverTheme,
@@ -1396,6 +1307,7 @@ export {
1396
1307
  scrollAreaRoot,
1397
1308
  scrollAreaTheme,
1398
1309
  scrollAreaViewport,
1310
+ scrollbar,
1399
1311
  selectArrow,
1400
1312
  selectContent,
1401
1313
  selectItem,
@@ -1406,23 +1318,23 @@ export {
1406
1318
  selectViewport,
1407
1319
  separatorRoot,
1408
1320
  separatorTheme,
1321
+ sizeToRem,
1409
1322
  sizeValue,
1410
1323
  skeletonRoot,
1411
1324
  skeletonTheme,
1325
+ slottable,
1326
+ snapSize,
1412
1327
  splitterTheme,
1413
1328
  staticDefaultButtonColors,
1414
1329
  staticDisabled,
1415
- staticFocusRing,
1416
1330
  statusBar,
1417
1331
  statusRoot,
1418
1332
  statusTheme,
1419
- subduedFocus,
1420
1333
  subtleHover,
1421
1334
  surfaceShadow,
1422
1335
  surfaceZIndex,
1423
1336
  tagRoot,
1424
1337
  tagTheme,
1425
- textBlockWidth,
1426
1338
  textValence,
1427
1339
  toastActions,
1428
1340
  toastBody,
@@ -1431,7 +1343,6 @@ export {
1431
1343
  toastTheme,
1432
1344
  toastTitle,
1433
1345
  toastViewport,
1434
- toolbarInner,
1435
1346
  toolbarLayout,
1436
1347
  toolbarRoot,
1437
1348
  toolbarText,