@dxos/ui-theme 0.8.4-main.c85a9c8dae → 0.8.4-main.e250131250

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