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

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 (147) hide show
  1. package/dist/lib/browser/index.mjs +397 -471
  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 +397 -471
  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} +122 -55
  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} +122 -55
  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/Theme.stories.d.ts.map +1 -1
  18. package/dist/types/src/defs.d.ts +2 -2
  19. package/dist/types/src/defs.d.ts.map +1 -1
  20. package/dist/types/src/fragments/density.d.ts +1 -4
  21. package/dist/types/src/fragments/density.d.ts.map +1 -1
  22. package/dist/types/src/fragments/index.d.ts +0 -5
  23. package/dist/types/src/fragments/index.d.ts.map +1 -1
  24. package/dist/types/src/fragments/text.d.ts +0 -5
  25. package/dist/types/src/fragments/text.d.ts.map +1 -1
  26. package/dist/types/src/index.d.ts +1 -1
  27. package/dist/types/src/index.d.ts.map +1 -1
  28. package/dist/types/src/plugins/ThemePlugin.d.ts +1 -1
  29. package/dist/types/src/plugins/ThemePlugin.d.ts.map +1 -1
  30. package/dist/types/src/theme/components/avatar.d.ts.map +1 -1
  31. package/dist/types/src/theme/components/card.d.ts +3 -2
  32. package/dist/types/src/theme/components/card.d.ts.map +1 -1
  33. package/dist/types/src/theme/components/dialog.d.ts.map +1 -1
  34. package/dist/types/src/theme/components/focus.d.ts +6 -0
  35. package/dist/types/src/theme/components/focus.d.ts.map +1 -0
  36. package/dist/types/src/theme/components/icon-button.d.ts +1 -0
  37. package/dist/types/src/theme/components/icon-button.d.ts.map +1 -1
  38. package/dist/types/src/theme/components/icon.d.ts +3 -0
  39. package/dist/types/src/theme/components/icon.d.ts.map +1 -1
  40. package/dist/types/src/theme/components/index.d.ts +1 -0
  41. package/dist/types/src/theme/components/index.d.ts.map +1 -1
  42. package/dist/types/src/theme/components/input.d.ts +8 -8
  43. package/dist/types/src/theme/components/input.d.ts.map +1 -1
  44. package/dist/types/src/theme/components/link.d.ts.map +1 -1
  45. package/dist/types/src/theme/components/list.d.ts.map +1 -1
  46. package/dist/types/src/theme/components/main.d.ts.map +1 -1
  47. package/dist/types/src/theme/components/message.d.ts.map +1 -1
  48. package/dist/types/src/theme/components/popover.d.ts.map +1 -1
  49. package/dist/types/src/theme/components/scroll-area.d.ts +12 -2
  50. package/dist/types/src/theme/components/scroll-area.d.ts.map +1 -1
  51. package/dist/types/src/theme/components/select.d.ts.map +1 -1
  52. package/dist/types/src/theme/components/status.d.ts +1 -1
  53. package/dist/types/src/theme/components/status.d.ts.map +1 -1
  54. package/dist/types/src/theme/components/toast.d.ts.map +1 -1
  55. package/dist/types/src/theme/components/toolbar.d.ts +0 -1
  56. package/dist/types/src/theme/components/toolbar.d.ts.map +1 -1
  57. package/dist/types/src/theme/components/tooltip.d.ts.map +1 -1
  58. package/dist/types/src/theme/components/treegrid.d.ts.map +1 -1
  59. package/dist/types/src/theme/index.d.ts +1 -0
  60. package/dist/types/src/theme/index.d.ts.map +1 -1
  61. package/dist/types/src/theme/primitives/column.d.ts +25 -3
  62. package/dist/types/src/theme/primitives/column.d.ts.map +1 -1
  63. package/dist/types/src/theme/primitives/panel.d.ts +9 -5
  64. package/dist/types/src/theme/primitives/panel.d.ts.map +1 -1
  65. package/dist/types/src/theme/theme.d.ts.map +1 -1
  66. package/dist/types/src/util/elevation.d.ts.map +1 -0
  67. package/dist/types/src/util/hash-styles.d.ts.map +1 -1
  68. package/dist/types/src/util/index.d.ts +3 -0
  69. package/dist/types/src/util/index.d.ts.map +1 -1
  70. package/dist/types/src/util/mx.d.ts +52 -4
  71. package/dist/types/src/util/mx.d.ts.map +1 -1
  72. package/dist/types/src/util/size.d.ts +27 -0
  73. package/dist/types/src/util/size.d.ts.map +1 -0
  74. package/dist/types/src/util/valence.d.ts +4 -0
  75. package/dist/types/src/util/valence.d.ts.map +1 -0
  76. package/dist/types/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +13 -15
  78. package/src/css/components/button.css +2 -1
  79. package/src/css/components/{focus-ring.css → focus.css} +15 -1
  80. package/src/css/components/icon.css +9 -0
  81. package/src/css/components/panel.css +22 -22
  82. package/src/css/components/selected.css +30 -0
  83. package/src/css/components/tag.css +3 -1
  84. package/src/css/integrations/codemirror.css +5 -3
  85. package/src/css/integrations/tldraw.css +1 -0
  86. package/src/css/layout/main.css +0 -7
  87. package/src/css/layout/size.css +19 -27
  88. package/src/css/theme/animation.css +31 -0
  89. package/src/css/theme/palette.css +8 -0
  90. package/src/css/theme/semantic.css +25 -9
  91. package/src/css/theme/spacing.css +36 -19
  92. package/src/css/utilities.css +114 -3
  93. package/src/defs.ts +1 -1
  94. package/src/fragments/AUDIT.md +57 -0
  95. package/src/fragments/density.ts +8 -5
  96. package/src/fragments/index.ts +1 -6
  97. package/src/fragments/text.ts +1 -6
  98. package/src/index.ts +1 -1
  99. package/src/{theme.css → main.css} +10 -6
  100. package/src/plugins/ThemePlugin.ts +12 -24
  101. package/src/plugins/main.css +45 -0
  102. package/src/theme/components/avatar.ts +3 -4
  103. package/src/theme/components/button.ts +1 -1
  104. package/src/theme/components/card.ts +19 -11
  105. package/src/theme/components/dialog.ts +4 -3
  106. package/src/theme/components/focus.ts +33 -0
  107. package/src/theme/components/icon-button.ts +6 -5
  108. package/src/theme/components/icon.ts +13 -4
  109. package/src/theme/components/index.ts +1 -0
  110. package/src/theme/components/input.ts +15 -30
  111. package/src/theme/components/link.ts +1 -2
  112. package/src/theme/components/list.ts +4 -4
  113. package/src/theme/components/menu.ts +4 -4
  114. package/src/theme/components/message.ts +2 -3
  115. package/src/theme/components/popover.ts +4 -5
  116. package/src/theme/components/scroll-area.ts +58 -46
  117. package/src/theme/components/select.ts +2 -3
  118. package/src/theme/components/status.ts +5 -5
  119. package/src/theme/components/toast.ts +2 -3
  120. package/src/theme/components/toolbar.ts +1 -7
  121. package/src/theme/components/tooltip.ts +1 -2
  122. package/src/theme/components/treegrid.ts +1 -1
  123. package/src/theme/index.ts +1 -0
  124. package/src/theme/primitives/column.ts +49 -8
  125. package/src/theme/primitives/panel.ts +19 -23
  126. package/src/theme/theme.ts +2 -0
  127. package/src/typings.d.ts +3 -0
  128. package/src/util/index.ts +3 -0
  129. package/src/util/mx.ts +119 -8
  130. package/src/util/size.ts +103 -0
  131. package/dist/plugin/node-cjs/theme.css.map +0 -7
  132. package/dist/plugin/node-esm/theme.css.map +0 -7
  133. package/dist/types/src/fragments/elevation.d.ts.map +0 -1
  134. package/dist/types/src/fragments/focus.d.ts +0 -4
  135. package/dist/types/src/fragments/focus.d.ts.map +0 -1
  136. package/dist/types/src/fragments/selected.d.ts +0 -4
  137. package/dist/types/src/fragments/selected.d.ts.map +0 -1
  138. package/dist/types/src/fragments/size.d.ts +0 -7
  139. package/dist/types/src/fragments/size.d.ts.map +0 -1
  140. package/dist/types/src/fragments/valence.d.ts +0 -4
  141. package/dist/types/src/fragments/valence.d.ts.map +0 -1
  142. package/src/fragments/focus.ts +0 -11
  143. package/src/fragments/selected.ts +0 -12
  144. package/src/fragments/size.ts +0 -117
  145. /package/dist/types/src/{fragments → util}/elevation.d.ts +0 -0
  146. /package/src/{fragments → util}/elevation.ts +0 -0
  147. /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",
@@ -48,17 +48,32 @@ var cardMinBlockSize = 18;
48
48
  var cardMaxBlockSize = 30;
49
49
 
50
50
  // src/fragments/density.ts
51
- var coarseBlockSize = "min-h-[2.5rem]";
52
- var coarseDimensions = `${coarseBlockSize} px-3`;
53
51
  var fineBlockSize = "min-h-[2.5rem] pointer-fine:min-h-[2rem]";
52
+ var coarseBlockSize = "min-h-[2.5rem]";
54
53
  var fineDimensions = `${fineBlockSize} px-2`;
55
- var densityBlockSize = (density = "coarse") => density === "fine" ? fineBlockSize : coarseBlockSize;
54
+ var coarseDimensions = `${coarseBlockSize} px-3`;
55
+ var densityDimensions = (density = "fine") => density === "fine" ? fineDimensions : coarseDimensions;
56
+ var densityBlockSize = (density = "fine") => density === "fine" ? fineBlockSize : coarseBlockSize;
56
57
 
57
58
  // src/fragments/disabled.ts
58
59
  var staticDisabled = "opacity-40 cursor-not-allowed shadow-none";
59
60
  var dataDisabled = "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed";
60
61
 
61
- // src/fragments/elevation.ts
62
+ // src/fragments/hover.ts
63
+ var subtleHover = "hover:bg-hover-overlay";
64
+ var ghostHover = "hover:bg-hover-surface";
65
+ var ghostFocusWithin = "focus-within:bg-hover-surface";
66
+ var hoverableControls = "[--controls-opacity:1] hover-hover:[--controls-opacity:0] hover-hover:hover:[--controls-opacity:1]";
67
+ var groupHoverControlItemWithTransition = "transition-opacity duration-200 opacity-0 group-hover:opacity-100";
68
+ var hoverableFocusedKeyboardControls = "focus-visible:[--controls-opacity:1]";
69
+ var hoverableFocusedWithinControls = "focus-within:[--controls-opacity:1]";
70
+ var hoverableOpenControlItem = "hover-hover:aria-[expanded=true]:[--controls-opacity:1]";
71
+ var hoverableControlItem = "opacity-(--controls-opacity)";
72
+
73
+ // src/fragments/text.ts
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,235 @@ 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, role, style, ...props }, { classNames: defaultClassNames, ...defaults } = {}) => ({
321
+ // Default props.
322
+ ...defaults,
323
+ // Spread supplied props.
324
+ ...props,
325
+ // Prefer explicit role, then defaults role, then 'none'.
326
+ role: role ?? defaults.role ?? "none",
327
+ // Merge styles.
328
+ style: {
329
+ ...defaults.style,
330
+ ...style
331
+ },
332
+ // Compose classnames.
333
+ className: mx(defaultClassNames, className, classNames)
326
334
  });
335
+ var COMPOSABLE = /* @__PURE__ */ Symbol.for("dxos.composable");
336
+ function slottable(render) {
337
+ const wrapped = (props, forwardedRef) => {
338
+ let warn = false;
339
+ if (props.asChild) {
340
+ try {
341
+ const child = Children.only(props.children);
342
+ if (isValidElement(child) && typeof child.type !== "string" && !child.type[COMPOSABLE]) {
343
+ warn = true;
344
+ log.warn("slot child is not composable; create it with composable() or slottable()", {
345
+ child: child.type.displayName ?? child.type.name
346
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 100, S: this });
347
+ }
348
+ } catch {
349
+ }
350
+ }
351
+ const result = render(props, forwardedRef);
352
+ if (warn) {
353
+ return createElement("div", {
354
+ role: "none",
355
+ className: "dx-slot-warning"
356
+ }, result);
357
+ }
358
+ return result;
359
+ };
360
+ const component = forwardRef(wrapped);
361
+ component[COMPOSABLE] = true;
362
+ return component;
363
+ }
364
+ function composable(render) {
365
+ const component = forwardRef(render);
366
+ component[COMPOSABLE] = true;
367
+ return component;
368
+ }
327
369
 
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)) {
370
+ // src/util/size.ts
371
+ var sizeMap = {
372
+ 0: {
373
+ w: "w-0",
374
+ h: "h-0"
375
+ },
376
+ px: {
377
+ w: "w-px",
378
+ h: "h-px"
379
+ },
380
+ 0.5: {
381
+ w: "w-0.5",
382
+ h: "h-0.5"
383
+ },
384
+ 1: {
385
+ w: "w-1",
386
+ h: "h-1"
387
+ },
388
+ 1.5: {
389
+ w: "w-1.5",
390
+ h: "h-1.5"
391
+ },
392
+ 2: {
393
+ w: "w-2",
394
+ h: "h-2"
395
+ },
396
+ 2.5: {
397
+ w: "w-2.5",
398
+ h: "h-2.5"
399
+ },
400
+ 3: {
401
+ w: "w-3",
402
+ h: "h-3"
403
+ },
404
+ 3.5: {
405
+ w: "w-3.5",
406
+ h: "h-3.5"
407
+ },
408
+ 4: {
409
+ w: "w-4",
410
+ h: "h-4"
411
+ },
412
+ 5: {
413
+ w: "w-5",
414
+ h: "h-5"
415
+ },
416
+ 6: {
417
+ w: "w-6",
418
+ h: "h-6"
419
+ },
420
+ 7: {
421
+ w: "w-7",
422
+ h: "h-7"
423
+ },
424
+ 8: {
425
+ w: "w-8",
426
+ h: "h-8"
427
+ },
428
+ 9: {
429
+ w: "w-9",
430
+ h: "h-9"
431
+ },
432
+ 10: {
433
+ w: "w-10",
434
+ h: "h-10"
435
+ },
436
+ 11: {
437
+ w: "w-11",
438
+ h: "h-11"
439
+ },
440
+ 12: {
441
+ w: "w-12",
442
+ h: "h-12"
443
+ },
444
+ 14: {
445
+ w: "w-14",
446
+ h: "h-14"
447
+ },
448
+ 16: {
449
+ w: "w-16",
450
+ h: "h-16"
451
+ },
452
+ 20: {
453
+ w: "w-20",
454
+ h: "h-20"
455
+ },
456
+ 24: {
457
+ w: "w-24",
458
+ h: "h-24"
459
+ },
460
+ 28: {
461
+ w: "w-28",
462
+ h: "h-28"
463
+ },
464
+ 32: {
465
+ w: "w-32",
466
+ h: "h-32"
467
+ },
468
+ 36: {
469
+ w: "w-36",
470
+ h: "h-36"
471
+ },
472
+ 40: {
473
+ w: "w-40",
474
+ h: "h-40"
475
+ },
476
+ 44: {
477
+ w: "w-44",
478
+ h: "h-44"
479
+ },
480
+ 48: {
481
+ w: "w-48",
482
+ h: "h-48"
483
+ },
484
+ 52: {
485
+ w: "w-52",
486
+ h: "h-52"
487
+ },
488
+ 56: {
489
+ w: "w-56",
490
+ h: "h-56"
491
+ },
492
+ 60: {
493
+ w: "w-60",
494
+ h: "h-60"
495
+ },
496
+ 64: {
497
+ w: "w-64",
498
+ h: "h-64"
499
+ },
500
+ 72: {
501
+ w: "w-72",
502
+ h: "h-72"
503
+ },
504
+ 80: {
505
+ w: "w-80",
506
+ h: "h-80"
507
+ },
508
+ 96: {
509
+ w: "w-96",
510
+ h: "h-96"
511
+ }
512
+ };
513
+ var SIZE_VALUES = Object.keys(sizeMap).map((key) => key === "px" ? "px" : Number(key));
514
+ var getHeight = (size) => sizeMap[size]?.h;
515
+ var getWidth = (size) => sizeMap[size]?.w;
516
+ var getSize = (size) => mx(getHeight(size), getWidth(size));
517
+ var sizeValue = (size) => size === "px" ? 1 : size;
518
+ var sizeToRem = (size) => size === "px" ? "1px" : `${size * 0.25}rem`;
519
+ var iconSize = (size) => ({
520
+ "--icon-size": size ? sizeToRem(size) : "initial"
521
+ });
522
+ var snapSize = (value, defaultSize) => {
523
+ if (SIZE_VALUES.includes(value)) {
619
524
  return value;
620
525
  } else if (value <= 0) {
621
526
  return 0;
622
- } else if (value === 1) {
527
+ } else if (value < 0.5) {
623
528
  return "px";
624
529
  } else {
625
530
  const wholeSeries = Math.floor(value);
626
531
  const halfSeries = Math.floor(value * 2) / 2;
627
532
  const doubleSeries = Math.floor(value / 2) * 2;
628
533
  const quadrupleSeries = Math.floor(value / 4) * 4;
629
- if (sizes.has(halfSeries)) {
534
+ if (SIZE_VALUES.includes(halfSeries)) {
630
535
  return halfSeries;
631
- } else if (sizes.has(wholeSeries)) {
536
+ } else if (SIZE_VALUES.includes(wholeSeries)) {
632
537
  return wholeSeries;
633
- } else if (sizes.has(doubleSeries)) {
538
+ } else if (SIZE_VALUES.includes(doubleSeries)) {
634
539
  return doubleSeries;
635
- } else if (sizes.has(quadrupleSeries)) {
540
+ } else if (SIZE_VALUES.includes(quadrupleSeries)) {
636
541
  return quadrupleSeries;
637
542
  } else {
638
543
  return defaultSize;
639
544
  }
640
545
  }
641
546
  };
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
547
 
649
- // src/fragments/valence.ts
548
+ // src/util/valence.ts
650
549
  var textValence = (valence) => {
651
550
  switch (valence) {
652
551
  case "success":
@@ -678,12 +577,12 @@ var messageValence = (valence) => {
678
577
  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
578
  var avatarLabel = ({ srOnly }, ...etc) => mx(srOnly && "sr-only", ...etc);
680
579
  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);
580
+ var avatarFrame = ({ variant }, ...etc) => mx("h-full w-full bg-(--surface-bg)", variant === "circle" ? "rounded-full" : "rounded-sm", ...etc);
682
581
  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
582
  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
583
  var avatarFallbackText = (_props, ...etc) => mx("fill-white", ...etc);
685
584
  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);
585
+ 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
586
  var avatarGroupDescription = ({ srOnly }, ...etc) => mx(srOnly ? "sr-only" : "text-description", ...etc);
688
587
  var avatarTheme = {
689
588
  root: avatarRoot,
@@ -713,12 +612,12 @@ var breadcrumbTheme = {
713
612
  };
714
613
 
715
614
  // 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);
615
+ 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);
616
+ 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
617
  var cardTitle = (_props, ...etc) => mx("dx-card__title grow truncate", ...etc);
719
- var cardContent = (_props, ...etc) => mx("dx-card__content contents [&>:last-child]:pb-1", ...etc);
618
+ var cardContent = (_props, ...etc) => mx("dx-card__content contents pb-1 last:pb-0", ...etc);
720
619
  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);
721
- var cardText = ({ variant = "default", truncate: _truncate }, ...etc) => mx("dx-card__text flex overflow-hidden", variant === "default" && "py-1", variant === "description" && "py-1.5", ...etc);
620
+ 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);
722
621
  var cardTextSpan = ({ variant = "default", truncate }, ...etc) => mx(variant === "description" && "text-sm text-description line-clamp-3", truncate && "truncate", ...etc);
723
622
  var cardPoster = (_props, ...etc) => mx("dx-card__poster col-span-3 max-h-[200px]", ...etc);
724
623
  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);
@@ -726,12 +625,14 @@ var cardAction = (_props, ...etc) => mx("dx-card__acztion col-span-3 !grid grid-
726
625
  var cardActionLabel = (_props, ...etc) => mx("dx-card__action-label min-w-0 flex-1 truncate", ...etc);
727
626
  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
627
  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);
628
+ var cardRow = (_, ...etc) => mx("dx-card__row col-span-3 grid grid-cols-subgrid", ...etc);
629
+ 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
630
  var cardTheme = {
731
631
  root: cardRoot,
732
632
  toolbar: cardToolbar,
733
633
  title: cardTitle,
734
634
  content: cardContent,
635
+ row: cardRow,
735
636
  heading: cardHeading,
736
637
  text: cardText,
737
638
  "text-span": cardTextSpan,
@@ -750,7 +651,7 @@ var staticDefaultButtonColors = "bg-input-surface text-input-surface-text";
750
651
  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
652
  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
653
  var buttonRoot = (_props, ...etc) => {
753
- return mx("dx-button dx-focus-ring group max-w-full [&_span]:truncate", ...etc);
654
+ return mx("dx-button dx-focus-ring group [&_span]:truncate", ...etc);
754
655
  };
755
656
  var buttonGroup = (_props, ...etc) => {
756
657
  return mx("inline-flex rounded-xs [&>:first-child]:rounded-w-sm [&>:last-child]:rounded-ie-sm [&>button]:relative", ...etc);
@@ -760,8 +661,37 @@ var buttonTheme = {
760
661
  group: buttonGroup
761
662
  };
762
663
 
664
+ // src/theme/primitives/column.ts
665
+ var withColumn = {
666
+ /** Centers element in the Column grid via --dx-col. No-op outside Column or inside ScrollArea. */
667
+ center: () => "[grid-column:var(--dx-col,auto)]",
668
+ /** Propagates the Column grid to children via subgrid. No-op outside Column.
669
+ * Direct children default to center column unless they are a dx-container (ScrollArea). */
670
+ propagate: () => "[.dx-column-root_&]:col-span-full [.dx-column-root_&]:grid [.dx-column-root_&]:grid-cols-subgrid [.dx-column-root_&]:[&>*:not(.dx-container)]:[grid-column:var(--dx-col,auto)]",
671
+ /** Resets --dx-col after consuming --gutter. Applied by ScrollArea.Viewport. */
672
+ consumed: () => "[--dx-col:auto]"
673
+ };
674
+ var columnRoot = (_, ...etc) => {
675
+ return mx("dx-column-root grid", ...etc);
676
+ };
677
+ var columnRow = (_, ...etc) => {
678
+ return mx("col-span-3 grid grid-cols-subgrid", ...etc);
679
+ };
680
+ var columnBleed = (_, ...etc) => {
681
+ return mx("col-span-full grid grid-cols-subgrid min-h-0", ...etc);
682
+ };
683
+ var columnCenter = (_, ...etc) => {
684
+ return mx(withColumn.center(), "min-h-0", ...etc);
685
+ };
686
+ var columnTheme = {
687
+ root: columnRoot,
688
+ row: columnRow,
689
+ bleed: columnBleed,
690
+ center: columnCenter
691
+ };
692
+
763
693
  // src/theme/components/dialog.ts
764
- var sizeMap = {
694
+ var sizeMap2 = {
765
695
  sm: "md:max-w-[24rem]",
766
696
  md: "md:max-w-[32rem]!",
767
697
  lg: "md:max-w-[40rem]!",
@@ -769,11 +699,11 @@ var sizeMap = {
769
699
  };
770
700
  var dialogOverlay = (_props, ...etc) => mx("dx-dialog__overlay", ...etc);
771
701
  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);
702
+ 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
703
  };
774
- 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);
776
- var dialogActionBar = (_props, ...etc) => mx("dx-dialog__actionbar flex items-center pt-4 gap-2 dx-density-coarse", ...etc);
704
+ var dialogHeader = (_props, ...etc) => mx("dx-dialog__header flex pb-4 items-center justify-between", withColumn.center(), ...etc);
705
+ var dialogBody = (_props, ...etc) => mx("dx-dialog__body dx-expander", withColumn.propagate(), ...etc);
706
+ var dialogActionBar = (_props, ...etc) => mx("dx-dialog__actionbar flex items-center pt-4 gap-2 dx-density-coarse", withColumn.center(), ...etc);
777
707
  var dialogTitle = ({ srOnly }, ...etc) => mx("dx-dialog__title", srOnly && "sr-only", ...etc);
778
708
  var dialogDescription = ({ srOnly }, ...etc) => mx("dx-dialog__description", "text-description", srOnly && "sr-only", ...etc);
779
709
  var dialogTheme = {
@@ -786,15 +716,24 @@ var dialogTheme = {
786
716
  description: dialogDescription
787
717
  };
788
718
 
719
+ // src/theme/components/focus.ts
720
+ 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);
721
+ var focusTheme = {
722
+ group: focusRing,
723
+ item: focusRing
724
+ };
725
+
789
726
  // 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);
727
+ var iconRoot = ({ size }, etc) => {
728
+ 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);
729
+ };
791
730
  var iconTheme = {
792
731
  root: iconRoot
793
732
  };
794
733
 
795
734
  // src/theme/components/icon-button.ts
796
- var iconButtonRoot = ({ iconOnly }, ...etc) => {
797
- return mx("gap-2", iconOnly && "p-icon-button-padding min-h-0", ...etc);
735
+ var iconButtonRoot = ({ iconOnly, square }, ...etc) => {
736
+ return mx("px-1.5", !iconOnly && "gap-2", square && "aspect-square", ...etc);
798
737
  };
799
738
  var iconButtonTheme = {
800
739
  root: iconButtonRoot
@@ -819,44 +758,41 @@ var inputValence = (valence) => {
819
758
  }
820
759
  };
821
760
  var sharedSubduedInputStyles = (props) => [
822
- "py-0 w-full bg-transparent text-current placeholder-placeholder",
823
761
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
824
- props.density === "fine" ? fineBlockSize : coarseBlockSize,
825
- subduedFocus,
762
+ "py-0 w-full bg-transparent text-current placeholder-placeholder",
763
+ "dx-focus-subdued",
764
+ densityDimensions(props.density),
826
765
  props.disabled && staticDisabled
827
766
  ];
828
767
  var sharedDefaultInputStyles = (props) => [
829
- "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
830
768
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
769
+ "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
831
770
  textInputSurfaceFocus,
832
- props.density === "fine" ? fineDimensions : coarseDimensions,
771
+ densityDimensions(props.density),
833
772
  props.disabled ? staticDisabled : textInputSurfaceHover
834
773
  ];
835
774
  var sharedStaticInputStyles = (props) => [
836
- "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
837
775
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
776
+ "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
838
777
  textInputSurfaceFocus,
839
778
  textInputSurfaceHover,
840
779
  props.focused && "bg-attention-surface",
841
780
  inputValence(props.validationValence),
842
781
  props.disabled && staticDisabled,
843
- props.focused && staticFocusRing
782
+ props.focused && "dx-focus-static"
844
783
  ];
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
- ]);
784
+ 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);
785
+ var inputTextArea = (props, ...etc) => inputInput(props, ...etc);
850
786
  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);
787
+ var inputCheckboxIndicator = ({ size = 5, checked }, ...etc) => mx(getSize(snapSize(sizeValue(size) * 0.65, 4)), !checked && "invisible", ...etc);
852
788
  var inputSwitch = ({ size = 5, disabled }, ...etc) => mx(
853
- getSizeHeight(size),
854
- getSizeWidth(computeSize(sizeValue(size) * 1.75, 9)),
789
+ getHeight(size),
790
+ getWidth(snapSize(sizeValue(size) * 1.75, 9)),
855
791
  booleanInputSurface,
856
792
  !disabled && booleanInputSurfaceHover,
857
793
  // TODO(burdon): Added m-1 margin to make 40px width to align with 40px icon button.
858
794
  "cursor-pointer shrink-0 rounded-full px-1 mx-1 relative",
859
- focusRing,
795
+ "dx-focus-ring",
860
796
  ...etc
861
797
  );
862
798
  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 +818,7 @@ var inputTheme = {
882
818
  };
883
819
 
884
820
  // 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);
821
+ 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
822
  var linkTheme = {
887
823
  root: linkRoot
888
824
  };
@@ -891,9 +827,9 @@ var linkTheme = {
891
827
  var listRoot = (_, ...etc) => mx(...etc);
892
828
  var listItem = ({ collapsible }, ...etc) => mx(!collapsible && "flex", ...etc);
893
829
  var listItemEndcap = ({ density }, ...etc) => mx(density === "fine" ? getSize(8) : getSize(10), "shrink-0 flex items-center justify-center", ...etc);
894
- var listItemHeading = ({ density }, ...etc) => mx(densityBlockSize(density), "flex items-center", ...etc);
830
+ var listItemHeading = ({ density }, ...etc) => mx(densityBlockSize(density), "flex items-center overflow-hidden [&>span]:truncate", ...etc);
895
831
  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);
832
+ var listItemOpenTrigger = ({ density }, ...etc) => mx("w-5 rounded-sm flex justify-center items-center", densityBlockSize(density), ghostHover, "dx-focus-ring", ...etc);
897
833
  var listItemOpenTriggerIcon = (_props, ...etc) => {
898
834
  return mx(getSize(5), ...etc);
899
835
  };
@@ -932,7 +868,7 @@ var menuContent = ({ elevation }, ...etc) => mx("dx-modal-surface w-48 rounded-s
932
868
  elevation: "positioned"
933
869
  }), ...etc);
934
870
  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);
871
+ 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);
936
872
  var menuSeparator = (_props, ...etc) => mx("my-1 mx-2 h-px bg-separator", ...etc);
937
873
  var menuGroupLabel = (_props, ...etc) => mx("text-description", "select-none px-2 py-2", ...etc);
938
874
  var menuArrow = (_props, ...etc) => mx("fill-separator", ...etc);
@@ -953,7 +889,7 @@ var messageHeader = (_, etc) => {
953
889
  return mx("col-span-2 grid grid-cols-subgrid items-center", etc);
954
890
  };
955
891
  var messageTitle = (_, etc) => {
956
- return mx("col-start-2 text-lg gap-trim-sm [&>svg]:inline-block", etc);
892
+ return mx("col-start-2 gap-trim-sm [&>svg]:inline-block", etc);
957
893
  };
958
894
  var messageIcon = (_, etc) => {
959
895
  return mx("col-start-1", etc);
@@ -975,15 +911,8 @@ var popoverContent = ({ elevation }, ...etc) => mx("dx-modal-surface border bord
975
911
  }), surfaceZIndex({
976
912
  elevation,
977
913
  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
- );
914
+ }), "dx-focus-ring", ...etc);
915
+ var popoverViewport = ({ constrainBlock, constrainInline }, ...etc) => mx("grid grid-rows-[1fr] 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
916
  var popoverArrow = (_props, ...etc) => mx("fill-separator", ...etc);
988
917
  var popoverTheme = {
989
918
  content: popoverContent,
@@ -992,40 +921,66 @@ var popoverTheme = {
992
921
  };
993
922
 
994
923
  // 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.
1001
- // Apply col-span-full only when inside a Column.Root grid (detected via dx-column marker).
1002
- "[.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
- ],
924
+ var scrollbar = {
925
+ thin: {
926
+ size: 4,
927
+ padding: 4
928
+ },
929
+ coarse: {
930
+ size: 8,
931
+ padding: 8
932
+ }
933
+ };
934
+ var scrollAreaRoot = ({ orientation }, ...etc) => mx(
935
+ // Expand
936
+ "dx-container",
937
+ orientation === "vertical" && "group/scroll-v flex flex-col",
938
+ orientation === "horizontal" && "group/scroll-h flex",
939
+ orientation === "all" && "group/scroll-all",
940
+ // Apply col-span-full only when inside a Column.Root grid (detected via dx-column-root marker).
941
+ "[.dx-column-root_&]:col-span-full",
1010
942
  ...etc
1011
943
  );
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);
944
+ var scrollAreaViewport = ({ orientation, centered, padding, snap, autoHide }, ...etc) => {
945
+ return mx(
946
+ "flex-1 min-h-0 w-full",
947
+ // Reset --dx-col so nested components don't try to grid-position themselves.
948
+ // ScrollArea has already consumed --gutter for padding.
949
+ withColumn.consumed(),
950
+ orientation === "vertical" && "overflow-y-scroll",
951
+ orientation === "horizontal" && "flex overflow-x-scroll overscroll-x-contain",
952
+ orientation === "all" && "overflow-scroll",
953
+ "[&::-webkit-scrollbar-corner]:bg-transparent",
954
+ "[&::-webkit-scrollbar-track]:bg-transparent",
955
+ "[&::-webkit-scrollbar-thumb]:rounded-none",
956
+ "[&::-webkit-scrollbar]:w-[var(--scroll-width)] [&::-webkit-scrollbar]:h-[var(--scroll-width)]",
957
+ // If contained within Column.Root grid the gutter is set by that component (--gutter CSS variable).
958
+ // If centered, left padding compensates for scrollbar width so content is visually centered.
959
+ (orientation === "vertical" || orientation === "all") && (padding ? [
960
+ centered ? "pl-[var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))]" : "pl-[var(--gutter,0)]",
961
+ "pr-[calc(var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))-var(--scroll-width))]"
962
+ ] : centered && "pl-[var(--scroll-width)]"),
963
+ (orientation === "horizontal" || orientation === "all") && (padding ? [
964
+ centered && "pt-[calc(var(--scroll-width)+var(--scroll-padding))]",
965
+ "pb-[var(--scroll-padding)]"
966
+ ] : centered && "pt-[var(--scroll-width)]"),
967
+ snap && [
968
+ orientation === "vertical" && "snap-y snap-mandatory",
969
+ orientation === "horizontal" && "snap-x snap-mandatory",
970
+ orientation === "all" && "snap-both snap-mandatory"
971
+ ],
972
+ autoHide ? [
973
+ orientation === "vertical" && "group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
974
+ orientation === "horizontal" && "group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
975
+ orientation === "all" && "group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
976
+ ] : [
977
+ orientation === "vertical" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
978
+ orientation === "horizontal" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
979
+ orientation === "all" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
980
+ ],
981
+ ...etc
982
+ );
983
+ };
1029
984
  var scrollAreaTheme = {
1030
985
  root: scrollAreaRoot,
1031
986
  viewport: scrollAreaViewport
@@ -1041,7 +996,7 @@ var selectContent = ({ elevation }, ...etc) => {
1041
996
  }), ...etc);
1042
997
  };
1043
998
  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);
999
+ 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
1000
  var selectItemIndicator = (_props, ...etc) => mx("items-center", ...etc);
1046
1001
  var selectArrow = (_props, ...etc) => mx("fill-separator", ...etc);
1047
1002
  var selectSeparator = (_props, ...etc) => mx("self-stretch border-b my-1 border-separator", ...etc);
@@ -1077,8 +1032,8 @@ var skeletonTheme = {
1077
1032
  };
1078
1033
 
1079
1034
  // 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);
1035
+ 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);
1036
+ 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
1037
  var statusTheme = {
1083
1038
  root: statusRoot,
1084
1039
  bar: statusBar
@@ -1099,7 +1054,7 @@ var toastViewport = (_props, ...etc) => mx(
1099
1054
  );
1100
1055
  var toastRoot = (_props, ...etc) => mx("dx-modal-surface rounded-md flex p-2 gap-2", surfaceShadow({
1101
1056
  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);
1057
+ }), "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
1058
  var toastBody = (_props, ...etc) => mx("grow flex flex-col gap-1 justify-center pl-2", ...etc);
1104
1059
  var toastActions = (_props, ...etc) => mx("shrink-0 flex flex-col gap-1 justify-center", ...etc);
1105
1060
  var toastTitle = ({ srOnly }, ...etc) => mx("shrink-0 font-medium", srOnly && "sr-only", ...etc);
@@ -1118,18 +1073,11 @@ var toolbarLayout = "w-full shrink-0 flex flex-nowrap p-1 gap-1 items-center ove
1118
1073
  var toolbarRoot = ({ density, disabled, layoutManaged }, ...etc) => {
1119
1074
  return mx("bg-toolbar-surface dx-toolbar", density === "coarse" && "h-(--dx-rail-size) px-3!", disabled && "*:opacity-20", !layoutManaged && toolbarLayout, ...etc);
1120
1075
  };
1121
- var toolbarInner = ({ layoutManaged }, ...etc) => {
1122
- return mx(!layoutManaged && [
1123
- "flex gap-1",
1124
- textBlockWidth
1125
- ], ...etc);
1126
- };
1127
1076
  var toolbarText = (_, ...etc) => {
1128
- return mx("grow truncate items-center", textBlockWidth, ...etc);
1077
+ return mx("px-2 grow truncate items-center", ...etc);
1129
1078
  };
1130
1079
  var toolbarTheme = {
1131
1080
  root: toolbarRoot,
1132
- inner: toolbarInner,
1133
1081
  text: toolbarText
1134
1082
  };
1135
1083
 
@@ -1182,7 +1130,7 @@ var levelStyles = /* @__PURE__ */ new Map([
1182
1130
  ]
1183
1131
  ]);
1184
1132
  var treegridRoot = (_, ...etc) => mx("grid", ...etc);
1185
- var treegridRow = ({ level = 1 }, ...etc) => mx("contents", levelStyles.get(Math.min(Math.max(Math.round(level), 1), 8)), ...etc);
1133
+ var treegridRow = ({ level = 1 }, ...etc) => mx(levelStyles.get(Math.min(Math.max(Math.round(level), 1), 8)), ...etc);
1186
1134
  var treegridCell = ({ indent }, ...etc) => mx(indent && "indent", ...etc);
1187
1135
  var treegridTheme = {
1188
1136
  root: treegridRoot,
@@ -1190,43 +1138,22 @@ var treegridTheme = {
1190
1138
  cell: treegridCell
1191
1139
  };
1192
1140
 
1193
- // src/theme/theme.ts
1194
- import { getDeep } from "@dxos/util";
1195
-
1196
- // 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);
1200
- var columnTheme = {
1201
- root: columnRoot,
1202
- row: columnRow,
1203
- segment: columnSegment
1204
- };
1205
-
1206
1141
  // src/theme/primitives/panel.ts
1142
+ var sizes = {
1143
+ lg: "h-(--dx-topbar-size)",
1144
+ md: "h-(--dx-toolbar-size)",
1145
+ sm: "h-(--dx-statusbar-size)"
1146
+ };
1207
1147
  var panelRoot = (_, ...etc) => mx(
1208
1148
  // prettier-ignore
1209
- "h-full w-full grid grid-cols-[100%] overflow-hidden",
1149
+ "dx-container grid grid-cols-[100%] overflow-hidden",
1150
+ // Add uncategorized children to content slot.
1210
1151
  "[&>*:not([data-slot])]:[grid-area:content]",
1211
1152
  ...etc
1212
1153
  );
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
- );
1154
+ var panelToolbar = ({ size = "md" }, ...etc) => mx("[grid-area:toolbar]", "shrink-0", sizes[size], ...etc);
1155
+ var panelContent = (_, ...etc) => mx("[grid-area:content] min-h-0", ...etc);
1156
+ var panelStatusbar = ({ size = "md" }, ...etc) => mx("[grid-area:statusbar]", "shrink-0", sizes[size], ...etc);
1230
1157
  var panelTheme = {
1231
1158
  root: panelRoot,
1232
1159
  toolbar: panelToolbar,
@@ -1235,6 +1162,7 @@ var panelTheme = {
1235
1162
  };
1236
1163
 
1237
1164
  // src/theme/theme.ts
1165
+ import { getDeep } from "@dxos/util";
1238
1166
  var defaultTheme = {
1239
1167
  themeName: () => "default",
1240
1168
  //
@@ -1250,6 +1178,7 @@ var defaultTheme = {
1250
1178
  button: buttonTheme,
1251
1179
  card: cardTheme,
1252
1180
  dialog: dialogTheme,
1181
+ focus: focusTheme,
1253
1182
  icon: iconTheme,
1254
1183
  iconButton: iconButtonTheme,
1255
1184
  input: inputTheme,
@@ -1305,16 +1234,16 @@ export {
1305
1234
  cardMinBlockSize,
1306
1235
  cardMinInlineSize,
1307
1236
  cardTheme,
1308
- coarseBlockSize,
1309
- coarseDimensions,
1310
- computeSize,
1237
+ columnTheme,
1238
+ composable,
1239
+ composableProps,
1311
1240
  dataDisabled,
1312
1241
  defaultButtonColors,
1313
1242
  defaultTheme,
1314
1243
  defaultTx,
1315
1244
  densityBlockSize,
1245
+ densityDimensions,
1316
1246
  descriptionMessage,
1317
- descriptionTextPrimary,
1318
1247
  dialogActionBar,
1319
1248
  dialogBody,
1320
1249
  dialogContent,
@@ -1323,21 +1252,16 @@ export {
1323
1252
  dialogOverlay,
1324
1253
  dialogTheme,
1325
1254
  dialogTitle,
1326
- fineBlockSize,
1327
- fineDimensions,
1328
- focusRing,
1255
+ focusTheme,
1329
1256
  getHashHue,
1330
1257
  getHashStyles,
1258
+ getHeight,
1331
1259
  getSize,
1332
- getSizeHeight,
1333
- getSizeWidth,
1334
1260
  getStyles,
1261
+ getWidth,
1335
1262
  ghostButtonColors,
1336
1263
  ghostFocusWithin,
1337
- ghostHighlighted,
1338
1264
  ghostHover,
1339
- ghostSelected,
1340
- ghostSelectedContainerMd,
1341
1265
  groupHoverControlItemWithTransition,
1342
1266
  hoverableControlItem,
1343
1267
  hoverableControls,
@@ -1349,6 +1273,7 @@ export {
1349
1273
  iconButtonRoot,
1350
1274
  iconButtonTheme,
1351
1275
  iconRoot,
1276
+ iconSize,
1352
1277
  iconTheme,
1353
1278
  inputTextLabel,
1354
1279
  inputTheme,
@@ -1386,6 +1311,7 @@ export {
1386
1311
  mx,
1387
1312
  osTranslations,
1388
1313
  palette,
1314
+ panelTheme,
1389
1315
  popoverArrow,
1390
1316
  popoverContent,
1391
1317
  popoverTheme,
@@ -1395,6 +1321,7 @@ export {
1395
1321
  scrollAreaRoot,
1396
1322
  scrollAreaTheme,
1397
1323
  scrollAreaViewport,
1324
+ scrollbar,
1398
1325
  selectArrow,
1399
1326
  selectContent,
1400
1327
  selectItem,
@@ -1405,23 +1332,23 @@ export {
1405
1332
  selectViewport,
1406
1333
  separatorRoot,
1407
1334
  separatorTheme,
1335
+ sizeToRem,
1408
1336
  sizeValue,
1409
1337
  skeletonRoot,
1410
1338
  skeletonTheme,
1339
+ slottable,
1340
+ snapSize,
1411
1341
  splitterTheme,
1412
1342
  staticDefaultButtonColors,
1413
1343
  staticDisabled,
1414
- staticFocusRing,
1415
1344
  statusBar,
1416
1345
  statusRoot,
1417
1346
  statusTheme,
1418
- subduedFocus,
1419
1347
  subtleHover,
1420
1348
  surfaceShadow,
1421
1349
  surfaceZIndex,
1422
1350
  tagRoot,
1423
1351
  tagTheme,
1424
- textBlockWidth,
1425
1352
  textValence,
1426
1353
  toastActions,
1427
1354
  toastBody,
@@ -1430,7 +1357,6 @@ export {
1430
1357
  toastTheme,
1431
1358
  toastTitle,
1432
1359
  toastViewport,
1433
- toolbarInner,
1434
1360
  toolbarLayout,
1435
1361
  toolbarRoot,
1436
1362
  toolbarText,
@@ -1443,6 +1369,6 @@ export {
1443
1369
  treegridRoot,
1444
1370
  treegridRow,
1445
1371
  treegridTheme,
1446
- useComposableProps
1372
+ withColumn
1447
1373
  };
1448
1374
  //# sourceMappingURL=index.mjs.map