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

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