@dxos/ui-theme 0.8.4-main.c351d160a8 → 0.8.4-main.cb12b3f963

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 (139) hide show
  1. package/dist/lib/browser/index.mjs +391 -454
  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 +391 -454
  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} +108 -50
  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} +108 -50
  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 +1 -1
  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 -4
  23. package/dist/types/src/fragments/index.d.ts.map +1 -1
  24. package/dist/types/src/fragments/text.d.ts +0 -1
  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 +1 -0
  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.map +1 -1
  39. package/dist/types/src/theme/components/index.d.ts +1 -0
  40. package/dist/types/src/theme/components/index.d.ts.map +1 -1
  41. package/dist/types/src/theme/components/input.d.ts +8 -8
  42. package/dist/types/src/theme/components/input.d.ts.map +1 -1
  43. package/dist/types/src/theme/components/link.d.ts.map +1 -1
  44. package/dist/types/src/theme/components/list.d.ts.map +1 -1
  45. package/dist/types/src/theme/components/main.d.ts.map +1 -1
  46. package/dist/types/src/theme/components/message.d.ts.map +1 -1
  47. package/dist/types/src/theme/components/popover.d.ts.map +1 -1
  48. package/dist/types/src/theme/components/scroll-area.d.ts +12 -2
  49. package/dist/types/src/theme/components/scroll-area.d.ts.map +1 -1
  50. package/dist/types/src/theme/components/select.d.ts.map +1 -1
  51. package/dist/types/src/theme/components/status.d.ts +1 -1
  52. package/dist/types/src/theme/components/status.d.ts.map +1 -1
  53. package/dist/types/src/theme/components/toast.d.ts.map +1 -1
  54. package/dist/types/src/theme/components/tooltip.d.ts.map +1 -1
  55. package/dist/types/src/theme/components/treegrid.d.ts.map +1 -1
  56. package/dist/types/src/theme/index.d.ts +1 -0
  57. package/dist/types/src/theme/index.d.ts.map +1 -1
  58. package/dist/types/src/theme/primitives/column.d.ts +25 -3
  59. package/dist/types/src/theme/primitives/column.d.ts.map +1 -1
  60. package/dist/types/src/theme/primitives/panel.d.ts +9 -5
  61. package/dist/types/src/theme/primitives/panel.d.ts.map +1 -1
  62. package/dist/types/src/theme/theme.d.ts.map +1 -1
  63. package/dist/types/src/util/elevation.d.ts.map +1 -0
  64. package/dist/types/src/util/hash-styles.d.ts.map +1 -1
  65. package/dist/types/src/util/index.d.ts +3 -0
  66. package/dist/types/src/util/index.d.ts.map +1 -1
  67. package/dist/types/src/util/mx.d.ts +49 -284
  68. package/dist/types/src/util/mx.d.ts.map +1 -1
  69. package/dist/types/src/util/size.d.ts +27 -0
  70. package/dist/types/src/util/size.d.ts.map +1 -0
  71. package/dist/types/src/util/valence.d.ts +4 -0
  72. package/dist/types/src/util/valence.d.ts.map +1 -0
  73. package/dist/types/tsconfig.tsbuildinfo +1 -1
  74. package/package.json +12 -16
  75. package/src/css/components/button.css +2 -1
  76. package/src/css/components/{focus-ring.css → focus.css} +15 -1
  77. package/src/css/components/icon.css +9 -0
  78. package/src/css/components/panel.css +22 -22
  79. package/src/css/components/selected.css +16 -4
  80. package/src/css/components/selected.md +101 -0
  81. package/src/css/components/tag.css +3 -1
  82. package/src/css/integrations/codemirror.css +5 -3
  83. package/src/css/integrations/tldraw.css +1 -0
  84. package/src/css/layout/main.css +0 -7
  85. package/src/css/layout/size.css +16 -26
  86. package/src/css/theme/animation.css +31 -0
  87. package/src/css/theme/palette.css +6 -0
  88. package/src/css/theme/semantic.css +14 -9
  89. package/src/css/theme/spacing.css +30 -16
  90. package/src/css/utilities.css +114 -3
  91. package/src/fragments/AUDIT.md +57 -0
  92. package/src/fragments/density.ts +8 -5
  93. package/src/fragments/index.ts +1 -5
  94. package/src/fragments/text.ts +1 -1
  95. package/src/index.ts +1 -1
  96. package/src/{theme.css → main.css} +45 -8
  97. package/src/plugins/ThemePlugin.ts +12 -24
  98. package/src/plugins/main.css +45 -0
  99. package/src/theme/components/avatar.ts +3 -4
  100. package/src/theme/components/card.ts +15 -6
  101. package/src/theme/components/dialog.ts +4 -3
  102. package/src/theme/components/focus.ts +33 -0
  103. package/src/theme/components/icon-button.ts +6 -5
  104. package/src/theme/components/icon.ts +7 -5
  105. package/src/theme/components/index.ts +1 -0
  106. package/src/theme/components/input.ts +15 -30
  107. package/src/theme/components/link.ts +1 -2
  108. package/src/theme/components/list.ts +4 -4
  109. package/src/theme/components/menu.ts +4 -4
  110. package/src/theme/components/message.ts +6 -7
  111. package/src/theme/components/popover.ts +4 -5
  112. package/src/theme/components/scroll-area.ts +58 -46
  113. package/src/theme/components/select.ts +1 -2
  114. package/src/theme/components/status.ts +5 -5
  115. package/src/theme/components/toast.ts +2 -3
  116. package/src/theme/components/tooltip.ts +1 -2
  117. package/src/theme/components/treegrid.ts +1 -1
  118. package/src/theme/index.ts +1 -0
  119. package/src/theme/primitives/column.ts +49 -8
  120. package/src/theme/primitives/panel.ts +18 -25
  121. package/src/theme/theme.ts +2 -0
  122. package/src/typings.d.ts +3 -0
  123. package/src/util/index.ts +3 -0
  124. package/src/util/mx.ts +112 -7
  125. package/src/util/size.ts +103 -0
  126. package/dist/plugin/node-cjs/theme.css.map +0 -7
  127. package/dist/plugin/node-esm/theme.css.map +0 -7
  128. package/dist/types/src/fragments/elevation.d.ts.map +0 -1
  129. package/dist/types/src/fragments/focus.d.ts +0 -4
  130. package/dist/types/src/fragments/focus.d.ts.map +0 -1
  131. package/dist/types/src/fragments/size.d.ts +0 -9
  132. package/dist/types/src/fragments/size.d.ts.map +0 -1
  133. package/dist/types/src/fragments/valence.d.ts +0 -4
  134. package/dist/types/src/fragments/valence.d.ts.map +0 -1
  135. package/src/fragments/focus.ts +0 -11
  136. package/src/fragments/size.ts +0 -123
  137. /package/dist/types/src/{fragments → util}/elevation.d.ts +0 -0
  138. /package/src/{fragments → util}/elevation.ts +0 -0
  139. /package/src/{fragments → util}/valence.ts +0 -0
@@ -46,17 +46,32 @@ var cardMinBlockSize = 18;
46
46
  var cardMaxBlockSize = 30;
47
47
 
48
48
  // src/fragments/density.ts
49
- var coarseBlockSize = "min-h-[2.5rem]";
50
- var coarseDimensions = `${coarseBlockSize} px-3`;
51
49
  var fineBlockSize = "min-h-[2.5rem] pointer-fine:min-h-[2rem]";
50
+ var coarseBlockSize = "min-h-[2.5rem]";
52
51
  var fineDimensions = `${fineBlockSize} px-2`;
53
- var densityBlockSize = (density = "coarse") => density === "fine" ? fineBlockSize : coarseBlockSize;
52
+ var coarseDimensions = `${coarseBlockSize} px-3`;
53
+ var densityDimensions = (density = "fine") => density === "fine" ? fineDimensions : coarseDimensions;
54
+ var densityBlockSize = (density = "fine") => density === "fine" ? fineBlockSize : coarseBlockSize;
54
55
 
55
56
  // src/fragments/disabled.ts
56
57
  var staticDisabled = "opacity-40 cursor-not-allowed shadow-none";
57
58
  var dataDisabled = "data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed";
58
59
 
59
- // src/fragments/elevation.ts
60
+ // src/fragments/hover.ts
61
+ var subtleHover = "hover:bg-hover-overlay";
62
+ var ghostHover = "hover:bg-hover-surface";
63
+ var ghostFocusWithin = "focus-within:bg-hover-surface";
64
+ var hoverableControls = "[--controls-opacity:1] hover-hover:[--controls-opacity:0] hover-hover:hover:[--controls-opacity:1]";
65
+ var groupHoverControlItemWithTransition = "transition-opacity duration-200 opacity-0 group-hover:opacity-100";
66
+ var hoverableFocusedKeyboardControls = "focus-visible:[--controls-opacity:1]";
67
+ var hoverableFocusedWithinControls = "focus-within:[--controls-opacity:1]";
68
+ var hoverableOpenControlItem = "hover-hover:aria-[expanded=true]:[--controls-opacity:1]";
69
+ var hoverableControlItem = "opacity-(--controls-opacity)";
70
+
71
+ // src/fragments/text.ts
72
+ var descriptionMessage = "text-description border border-dashed border-separator rounded-sm p-4";
73
+
74
+ // src/util/elevation.ts
60
75
  var surfaceShadow = ({ elevation }) => [
61
76
  elevation === "positioned" ? "shadow-sm" : elevation === "dialog" || elevation === "toast" ? "shadow-md" : "shadow-none"
62
77
  ];
@@ -89,22 +104,6 @@ var surfaceZIndex = ({ level, elevation }) => {
89
104
  }
90
105
  };
91
106
 
92
- // src/fragments/focus.ts
93
- var focusRing = "dx-focus-ring";
94
- var subduedFocus = "focus:outline-hidden focus-visible:outline-hidden focus:ring-0 ring-0 focus:border-0 border-0";
95
- var staticFocusRing = "ring-2 ring-offset-0 ring-primary-350 ring-offset-white dark:ring-primary-450 dark:ring-offset-black";
96
-
97
- // src/fragments/hover.ts
98
- var subtleHover = "hover:bg-hover-overlay";
99
- var ghostHover = "hover:bg-hover-surface";
100
- var ghostFocusWithin = "focus-within:bg-hover-surface";
101
- var hoverableControls = "[--controls-opacity:1] hover-hover:[--controls-opacity:0] hover-hover:hover:[--controls-opacity:1]";
102
- var groupHoverControlItemWithTransition = "transition-opacity duration-200 opacity-0 group-hover:opacity-100";
103
- var hoverableFocusedKeyboardControls = "focus-visible:[--controls-opacity:1]";
104
- var hoverableFocusedWithinControls = "focus-within:[--controls-opacity:1]";
105
- var hoverableOpenControlItem = "hover-hover:aria-[expanded=true]:[--controls-opacity:1]";
106
- var hoverableControlItem = "opacity-(--controls-opacity)";
107
-
108
107
  // src/util/hash-styles.ts
109
108
  var neutral = {
110
109
  hue: "neutral",
@@ -268,7 +267,10 @@ var getHashHue = (id) => {
268
267
  var getHash = (id) => id.split("").reduce((acc, char) => acc + char.charCodeAt(0), 0);
269
268
 
270
269
  // src/util/mx.ts
270
+ import { Children, createElement, forwardRef, isValidElement } from "react";
271
271
  import { extendTailwindMerge, validators } from "tailwind-merge";
272
+ import { log } from "@dxos/log";
273
+ var __dxlog_file = "/__w/dxos/dxos/packages/ui/ui-theme/src/util/mx.ts";
272
274
  var mx = extendTailwindMerge({
273
275
  extend: {
274
276
  classGroups: {
@@ -313,336 +315,235 @@ var mx = extendTailwindMerge({
313
315
  }
314
316
  }
315
317
  });
316
- var composableProps = ({ className, classNames, ...props }, { className: defaultClassNames, ...defaults } = {}) => ({
318
+ var composableProps = ({ className, classNames, role, style, ...props }, { classNames: defaultClassNames, ...defaults } = {}) => ({
319
+ // Default props.
317
320
  ...defaults,
321
+ // Spread supplied props.
318
322
  ...props,
323
+ // Prefer explicit role, then defaults role, then 'none'.
324
+ role: role ?? defaults.role ?? "none",
325
+ // Merge styles.
326
+ style: {
327
+ ...defaults.style,
328
+ ...style
329
+ },
330
+ // Compose classnames.
319
331
  className: mx(defaultClassNames, className, classNames)
320
332
  });
333
+ var COMPOSABLE = /* @__PURE__ */ Symbol.for("dxos.composable");
334
+ function slottable(render) {
335
+ const wrapped = (props, forwardedRef) => {
336
+ let warn = false;
337
+ if (props.asChild) {
338
+ try {
339
+ const child = Children.only(props.children);
340
+ if (isValidElement(child) && typeof child.type !== "string" && !child.type[COMPOSABLE]) {
341
+ warn = true;
342
+ log.warn("slot child is not composable; create it with composable() or slottable()", {
343
+ child: child.type.displayName ?? child.type.name
344
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 100, S: this });
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
+ }
321
367
 
322
- // src/fragments/size.ts
323
- var largeIconSize = {
324
- "--icon-size": "1.25rem"
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
+ }
325
510
  };
326
- var sizeWidthMap = /* @__PURE__ */ new Map([
327
- [
328
- 0,
329
- "w-0"
330
- ],
331
- [
332
- "px",
333
- "w-px"
334
- ],
335
- [
336
- 0.5,
337
- "w-0.5"
338
- ],
339
- [
340
- 1,
341
- "w-1"
342
- ],
343
- [
344
- 1.5,
345
- "w-1.5"
346
- ],
347
- [
348
- 2,
349
- "w-2"
350
- ],
351
- [
352
- 2.5,
353
- "w-2.5"
354
- ],
355
- [
356
- 3,
357
- "w-3"
358
- ],
359
- [
360
- 3.5,
361
- "w-3.5"
362
- ],
363
- [
364
- 4,
365
- "w-4"
366
- ],
367
- [
368
- 5,
369
- "w-5"
370
- ],
371
- [
372
- 6,
373
- "w-6"
374
- ],
375
- [
376
- 7,
377
- "w-7"
378
- ],
379
- [
380
- 8,
381
- "w-8"
382
- ],
383
- [
384
- 9,
385
- "w-9"
386
- ],
387
- [
388
- 10,
389
- "w-10"
390
- ],
391
- [
392
- 11,
393
- "w-11"
394
- ],
395
- [
396
- 12,
397
- "w-12"
398
- ],
399
- [
400
- 14,
401
- "w-14"
402
- ],
403
- [
404
- 16,
405
- "w-16"
406
- ],
407
- [
408
- 20,
409
- "w-20"
410
- ],
411
- [
412
- 24,
413
- "w-24"
414
- ],
415
- [
416
- 28,
417
- "w-28"
418
- ],
419
- [
420
- 32,
421
- "w-32"
422
- ],
423
- [
424
- 36,
425
- "w-36"
426
- ],
427
- [
428
- 40,
429
- "w-40"
430
- ],
431
- [
432
- 44,
433
- "w-44"
434
- ],
435
- [
436
- 48,
437
- "w-48"
438
- ],
439
- [
440
- 52,
441
- "w-52"
442
- ],
443
- [
444
- 56,
445
- "w-56"
446
- ],
447
- [
448
- 60,
449
- "w-60"
450
- ],
451
- [
452
- 64,
453
- "w-64"
454
- ],
455
- [
456
- 72,
457
- "w-72"
458
- ],
459
- [
460
- 80,
461
- "w-80"
462
- ],
463
- [
464
- 96,
465
- "w-96"
466
- ]
467
- ]);
468
- var sizeHeightMap = /* @__PURE__ */ new Map([
469
- [
470
- 0,
471
- "h-0"
472
- ],
473
- [
474
- "px",
475
- "h-px"
476
- ],
477
- [
478
- 0.5,
479
- "h-0.5"
480
- ],
481
- [
482
- 1,
483
- "h-1"
484
- ],
485
- [
486
- 1.5,
487
- "h-1.5"
488
- ],
489
- [
490
- 2,
491
- "h-2"
492
- ],
493
- [
494
- 2.5,
495
- "h-2.5"
496
- ],
497
- [
498
- 3,
499
- "h-3"
500
- ],
501
- [
502
- 3.5,
503
- "h-3.5"
504
- ],
505
- [
506
- 4,
507
- "h-4"
508
- ],
509
- [
510
- 5,
511
- "h-5"
512
- ],
513
- [
514
- 6,
515
- "h-6"
516
- ],
517
- [
518
- 7,
519
- "h-7"
520
- ],
521
- [
522
- 8,
523
- "h-8"
524
- ],
525
- [
526
- 9,
527
- "h-9"
528
- ],
529
- [
530
- 10,
531
- "h-10"
532
- ],
533
- [
534
- 11,
535
- "h-11"
536
- ],
537
- [
538
- 12,
539
- "h-12"
540
- ],
541
- [
542
- 14,
543
- "h-14"
544
- ],
545
- [
546
- 16,
547
- "h-16"
548
- ],
549
- [
550
- 20,
551
- "h-20"
552
- ],
553
- [
554
- 24,
555
- "h-24"
556
- ],
557
- [
558
- 28,
559
- "h-28"
560
- ],
561
- [
562
- 32,
563
- "h-32"
564
- ],
565
- [
566
- 36,
567
- "h-36"
568
- ],
569
- [
570
- 40,
571
- "h-40"
572
- ],
573
- [
574
- 44,
575
- "h-44"
576
- ],
577
- [
578
- 48,
579
- "h-48"
580
- ],
581
- [
582
- 52,
583
- "h-52"
584
- ],
585
- [
586
- 56,
587
- "h-56"
588
- ],
589
- [
590
- 60,
591
- "h-60"
592
- ],
593
- [
594
- 64,
595
- "h-64"
596
- ],
597
- [
598
- 72,
599
- "h-72"
600
- ],
601
- [
602
- 80,
603
- "h-80"
604
- ],
605
- [
606
- 96,
607
- "h-96"
608
- ]
609
- ]);
610
- var sizes = new Set(sizeWidthMap.keys());
611
- var getSizeHeight = sizeHeightMap.get.bind(sizeHeightMap);
612
- var getSizeWidth = sizeWidthMap.get.bind(sizeWidthMap);
613
- var getSize = (size) => mx(getSizeHeight(size), getSizeWidth(size));
614
- var computeSize = (value, defaultSize) => {
615
- if (sizes.has(value)) {
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)) {
616
522
  return value;
617
523
  } else if (value <= 0) {
618
524
  return 0;
619
- } else if (value === 1) {
525
+ } else if (value < 0.5) {
620
526
  return "px";
621
527
  } else {
622
528
  const wholeSeries = Math.floor(value);
623
529
  const halfSeries = Math.floor(value * 2) / 2;
624
530
  const doubleSeries = Math.floor(value / 2) * 2;
625
531
  const quadrupleSeries = Math.floor(value / 4) * 4;
626
- if (sizes.has(halfSeries)) {
532
+ if (SIZE_VALUES.includes(halfSeries)) {
627
533
  return halfSeries;
628
- } else if (sizes.has(wholeSeries)) {
534
+ } else if (SIZE_VALUES.includes(wholeSeries)) {
629
535
  return wholeSeries;
630
- } else if (sizes.has(doubleSeries)) {
536
+ } else if (SIZE_VALUES.includes(doubleSeries)) {
631
537
  return doubleSeries;
632
- } else if (sizes.has(quadrupleSeries)) {
538
+ } else if (SIZE_VALUES.includes(quadrupleSeries)) {
633
539
  return quadrupleSeries;
634
540
  } else {
635
541
  return defaultSize;
636
542
  }
637
543
  }
638
544
  };
639
- var sizeValue = (size) => size === "px" ? 1 : size;
640
545
 
641
- // src/fragments/text.ts
642
- var descriptionTextPrimary = "text-sm font-normal text-base-surface-text";
643
- var descriptionMessage = "text-description border border-dashed border-separator rounded-sm p-4";
644
-
645
- // src/fragments/valence.ts
546
+ // src/util/valence.ts
646
547
  var textValence = (valence) => {
647
548
  switch (valence) {
648
549
  case "success":
@@ -674,12 +575,12 @@ var messageValence = (valence) => {
674
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);
675
576
  var avatarLabel = ({ srOnly }, ...etc) => mx(srOnly && "sr-only", ...etc);
676
577
  var avatarDescription = ({ srOnly }, ...etc) => mx("text-description", srOnly && "sr-only", ...etc);
677
- 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);
678
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);
679
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);
680
581
  var avatarFallbackText = (_props, ...etc) => mx("fill-white", ...etc);
681
582
  var avatarGroup = (_props, ...etc) => mx("inline-flex items-center", ...etc);
682
- 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);
683
584
  var avatarGroupDescription = ({ srOnly }, ...etc) => mx(srOnly ? "sr-only" : "text-description", ...etc);
684
585
  var avatarTheme = {
685
586
  root: avatarRoot,
@@ -709,12 +610,12 @@ var breadcrumbTheme = {
709
610
  };
710
611
 
711
612
  // src/theme/components/card.ts
712
- 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);
613
+ 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);
713
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);
714
615
  var cardTitle = (_props, ...etc) => mx("dx-card__title grow truncate", ...etc);
715
- var cardContent = (_props, ...etc) => mx("dx-card__content contents [&>:last-child]:pb-1", ...etc);
616
+ var cardContent = (_props, ...etc) => mx("dx-card__content contents pb-1 last:pb-0", ...etc);
716
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);
717
- var cardText = ({ variant = "default", truncate: _truncate }, ...etc) => mx("dx-card__text flex overflow-hidden", variant === "default" && "py-1", variant === "description" && "py-1.5", ...etc);
618
+ 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);
718
619
  var cardTextSpan = ({ variant = "default", truncate }, ...etc) => mx(variant === "description" && "text-sm text-description line-clamp-3", truncate && "truncate", ...etc);
719
620
  var cardPoster = (_props, ...etc) => mx("dx-card__poster col-span-3 max-h-[200px]", ...etc);
720
621
  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);
@@ -722,12 +623,14 @@ var cardAction = (_props, ...etc) => mx("dx-card__acztion col-span-3 !grid grid-
722
623
  var cardActionLabel = (_props, ...etc) => mx("dx-card__action-label min-w-0 flex-1 truncate", ...etc);
723
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);
724
625
  var cardLinkLabel = (_props, ...etc) => mx("dx-card__link-label min-w-0 flex-1 truncate", ...etc);
725
- var cardIconBlock = (_props, ...etc) => mx("dx-card__icon-block grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center [&>*]:p-1", ...etc);
626
+ var cardRow = (_, ...etc) => mx("dx-card__row col-span-3 grid grid-cols-subgrid", ...etc);
627
+ var cardIconBlock = ({ padding }, ...etc) => mx("dx-card__icon-block grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center", padding && "[&>*]:p-1", ...etc);
726
628
  var cardTheme = {
727
629
  root: cardRoot,
728
630
  toolbar: cardToolbar,
729
631
  title: cardTitle,
730
632
  content: cardContent,
633
+ row: cardRow,
731
634
  heading: cardHeading,
732
635
  text: cardText,
733
636
  "text-span": cardTextSpan,
@@ -756,8 +659,37 @@ var buttonTheme = {
756
659
  group: buttonGroup
757
660
  };
758
661
 
662
+ // src/theme/primitives/column.ts
663
+ var withColumn = {
664
+ /** Centers element in the Column grid via --dx-col. No-op outside Column or inside ScrollArea. */
665
+ center: () => "[grid-column:var(--dx-col,auto)]",
666
+ /** Propagates the Column grid to children via subgrid. No-op outside Column.
667
+ * Direct children default to center column unless they are a dx-container (ScrollArea). */
668
+ 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)]",
669
+ /** Resets --dx-col after consuming --gutter. Applied by ScrollArea.Viewport. */
670
+ consumed: () => "[--dx-col:auto]"
671
+ };
672
+ var columnRoot = (_, ...etc) => {
673
+ return mx("dx-column-root grid", ...etc);
674
+ };
675
+ var columnRow = (_, ...etc) => {
676
+ return mx("col-span-3 grid grid-cols-subgrid", ...etc);
677
+ };
678
+ var columnBleed = (_, ...etc) => {
679
+ return mx("col-span-full grid grid-cols-subgrid min-h-0", ...etc);
680
+ };
681
+ var columnCenter = (_, ...etc) => {
682
+ return mx(withColumn.center(), "min-h-0", ...etc);
683
+ };
684
+ var columnTheme = {
685
+ root: columnRoot,
686
+ row: columnRow,
687
+ bleed: columnBleed,
688
+ center: columnCenter
689
+ };
690
+
759
691
  // src/theme/components/dialog.ts
760
- var sizeMap = {
692
+ var sizeMap2 = {
761
693
  sm: "md:max-w-[24rem]",
762
694
  md: "md:max-w-[32rem]!",
763
695
  lg: "md:max-w-[40rem]!",
@@ -765,11 +697,11 @@ var sizeMap = {
765
697
  };
766
698
  var dialogOverlay = (_props, ...etc) => mx("dx-dialog__overlay", ...etc);
767
699
  var dialogContent = ({ inOverlayLayout, size = "md" }, ...etc) => {
768
- 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);
700
+ 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);
769
701
  };
770
- var dialogHeader = (_props, ...etc) => mx("dx-dialog__header flex pb-4 items-center justify-between", ...etc);
771
- var dialogBody = (_props, ...etc) => mx("dx-dialog__body flex flex-col h-full py-2 gap-2", ...etc);
772
- var dialogActionBar = (_props, ...etc) => mx("dx-dialog__actionbar flex items-center pt-4 gap-2 dx-density-coarse", ...etc);
702
+ var dialogHeader = (_props, ...etc) => mx("dx-dialog__header flex pb-4 items-center justify-between", withColumn.center(), ...etc);
703
+ var dialogBody = (_props, ...etc) => mx("dx-dialog__body dx-expander", withColumn.propagate(), ...etc);
704
+ var dialogActionBar = (_props, ...etc) => mx("dx-dialog__actionbar flex items-center pt-4 gap-2 dx-density-coarse", withColumn.center(), ...etc);
773
705
  var dialogTitle = ({ srOnly }, ...etc) => mx("dx-dialog__title", srOnly && "sr-only", ...etc);
774
706
  var dialogDescription = ({ srOnly }, ...etc) => mx("dx-dialog__description", "text-description", srOnly && "sr-only", ...etc);
775
707
  var dialogTheme = {
@@ -782,15 +714,24 @@ var dialogTheme = {
782
714
  description: dialogDescription
783
715
  };
784
716
 
717
+ // src/theme/components/focus.ts
718
+ 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);
719
+ var focusTheme = {
720
+ group: focusRing,
721
+ item: focusRing
722
+ };
723
+
785
724
  // src/theme/components/icon.ts
786
- var iconRoot = ({ size }, etc) => mx("shrink-0 text-[var(--icons-color,currentColor)]", size ? getSize(size) : "[width:var(--icon-size,1em)] [height:var(--icon-size,1em)]", etc);
725
+ var iconRoot = ({ size }, etc) => {
726
+ 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);
727
+ };
787
728
  var iconTheme = {
788
729
  root: iconRoot
789
730
  };
790
731
 
791
732
  // src/theme/components/icon-button.ts
792
- var iconButtonRoot = ({ iconOnly }, ...etc) => {
793
- return mx("gap-2", iconOnly && "p-icon-button-padding min-h-0", ...etc);
733
+ var iconButtonRoot = ({ iconOnly, square }, ...etc) => {
734
+ return mx("px-1.5", !iconOnly && "gap-2", square && "aspect-square", ...etc);
794
735
  };
795
736
  var iconButtonTheme = {
796
737
  root: iconButtonRoot
@@ -815,44 +756,41 @@ var inputValence = (valence) => {
815
756
  }
816
757
  };
817
758
  var sharedSubduedInputStyles = (props) => [
818
- "py-0 w-full bg-transparent text-current placeholder-placeholder",
819
759
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
820
- props.density === "fine" ? fineBlockSize : coarseBlockSize,
821
- subduedFocus,
760
+ "py-0 w-full bg-transparent text-current placeholder-placeholder",
761
+ "dx-focus-subdued",
762
+ densityDimensions(props.density),
822
763
  props.disabled && staticDisabled
823
764
  ];
824
765
  var sharedDefaultInputStyles = (props) => [
825
- "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
826
766
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
767
+ "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
827
768
  textInputSurfaceFocus,
828
- props.density === "fine" ? fineDimensions : coarseDimensions,
769
+ densityDimensions(props.density),
829
770
  props.disabled ? staticDisabled : textInputSurfaceHover
830
771
  ];
831
772
  var sharedStaticInputStyles = (props) => [
832
- "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
833
773
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
774
+ "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
834
775
  textInputSurfaceFocus,
835
776
  textInputSurfaceHover,
836
777
  props.focused && "bg-attention-surface",
837
778
  inputValence(props.validationValence),
838
779
  props.disabled && staticDisabled,
839
- props.focused && staticFocusRing
780
+ props.focused && "dx-focus-static"
840
781
  ];
841
- 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);
842
- var inputTextArea = (props, ...etc) => inputInput(props, ...[
843
- "-mb-1.5",
844
- ...etc
845
- ]);
782
+ 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);
783
+ var inputTextArea = (props, ...etc) => inputInput(props, ...etc);
846
784
  var inputCheckbox = ({ size = 5 }, ...etc) => mx("dx-checkbox dx-focus-ring", getSize(size), ...etc);
847
- var inputCheckboxIndicator = ({ size = 5, checked }, ...etc) => mx(getSize(computeSize(sizeValue(size) * 0.65, 4)), !checked && "invisible", ...etc);
785
+ var inputCheckboxIndicator = ({ size = 5, checked }, ...etc) => mx(getSize(snapSize(sizeValue(size) * 0.65, 4)), !checked && "invisible", ...etc);
848
786
  var inputSwitch = ({ size = 5, disabled }, ...etc) => mx(
849
- getSizeHeight(size),
850
- getSizeWidth(computeSize(sizeValue(size) * 1.75, 9)),
787
+ getHeight(size),
788
+ getWidth(snapSize(sizeValue(size) * 1.75, 9)),
851
789
  booleanInputSurface,
852
790
  !disabled && booleanInputSurfaceHover,
853
791
  // TODO(burdon): Added m-1 margin to make 40px width to align with 40px icon button.
854
792
  "cursor-pointer shrink-0 rounded-full px-1 mx-1 relative",
855
- focusRing,
793
+ "dx-focus-ring",
856
794
  ...etc
857
795
  );
858
796
  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);
@@ -878,7 +816,7 @@ var inputTheme = {
878
816
  };
879
817
 
880
818
  // src/theme/components/link.ts
881
- 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);
819
+ 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);
882
820
  var linkTheme = {
883
821
  root: linkRoot
884
822
  };
@@ -887,9 +825,9 @@ var linkTheme = {
887
825
  var listRoot = (_, ...etc) => mx(...etc);
888
826
  var listItem = ({ collapsible }, ...etc) => mx(!collapsible && "flex", ...etc);
889
827
  var listItemEndcap = ({ density }, ...etc) => mx(density === "fine" ? getSize(8) : getSize(10), "shrink-0 flex items-center justify-center", ...etc);
890
- var listItemHeading = ({ density }, ...etc) => mx(densityBlockSize(density), "flex items-center", ...etc);
828
+ var listItemHeading = ({ density }, ...etc) => mx(densityBlockSize(density), "flex items-center overflow-hidden [&>span]:truncate", ...etc);
891
829
  var listItemDragHandleIcon = (_props, ...etc) => mx(getSize(5), "mt-2.5", ...etc);
892
- var listItemOpenTrigger = ({ density }, ...etc) => mx("w-5 rounded-sm flex justify-center items-center", densityBlockSize(density), ghostHover, focusRing, ...etc);
830
+ var listItemOpenTrigger = ({ density }, ...etc) => mx("w-5 rounded-sm flex justify-center items-center", densityBlockSize(density), ghostHover, "dx-focus-ring", ...etc);
893
831
  var listItemOpenTriggerIcon = (_props, ...etc) => {
894
832
  return mx(getSize(5), ...etc);
895
833
  };
@@ -928,7 +866,7 @@ var menuContent = ({ elevation }, ...etc) => mx("dx-modal-surface w-48 rounded-s
928
866
  elevation: "positioned"
929
867
  }), ...etc);
930
868
  var menuViewport = (_props, ...etc) => mx("rounded-sm p-1 max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto", ...etc);
931
- 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);
869
+ 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);
932
870
  var menuSeparator = (_props, ...etc) => mx("my-1 mx-2 h-px bg-separator", ...etc);
933
871
  var menuGroupLabel = (_props, ...etc) => mx("text-description", "select-none px-2 py-2", ...etc);
934
872
  var menuArrow = (_props, ...etc) => mx("fill-separator", ...etc);
@@ -943,19 +881,19 @@ var menuTheme = {
943
881
 
944
882
  // src/theme/components/message.ts
945
883
  var messageRoot = ({ valence }, etc) => {
946
- return mx("grid grid-cols-[min-content_1fr] gap-x-2 p-trim-sm rounded-sm", messageValence(valence), etc);
884
+ return mx("grid grid-cols-[2rem_1fr_2rem] p-1 rounded-sm", messageValence(valence), etc);
947
885
  };
948
886
  var messageHeader = (_, etc) => {
949
- return mx("col-span-2 grid grid-cols-subgrid items-center", etc);
887
+ return mx("col-span-full grid grid-cols-subgrid items-center", etc);
950
888
  };
951
889
  var messageTitle = (_, etc) => {
952
- return mx("col-start-2 text-lg gap-trim-sm [&>svg]:inline-block", etc);
890
+ return mx("col-start-2 truncate", etc);
953
891
  };
954
892
  var messageIcon = (_, etc) => {
955
- return mx("col-start-1", etc);
893
+ return mx("col-start-1 grid place-items-center", etc);
956
894
  };
957
895
  var messageContent = (_, etc) => {
958
- return mx("grid grid-cols-subgrid col-start-2 first:font-medium", etc);
896
+ return mx("col-start-2 grid grid-cols-subgrid first:font-medium", etc);
959
897
  };
960
898
  var messageTheme = {
961
899
  root: messageRoot,
@@ -971,15 +909,8 @@ var popoverContent = ({ elevation }, ...etc) => mx("dx-modal-surface border bord
971
909
  }), surfaceZIndex({
972
910
  elevation,
973
911
  level: "menu"
974
- }), focusRing, ...etc);
975
- var popoverViewport = ({ constrainBlock, constrainInline }, ...etc) => mx(
976
- "flex flex-col min-h-0 min-w-popover-min-width",
977
- (constrainBlock || constrainInline) && "overflow-hidden",
978
- // Ensures it respects available height from Radix (or 100dvh).
979
- constrainBlock && "max-h-[min(var(--radix-popover-content-available-height),calc(100dvh-var(--spacing-screen-border)*2))]",
980
- constrainInline && "max-w-(--radix-popover-content-available-width)",
981
- ...etc
982
- );
912
+ }), "dx-focus-ring", ...etc);
913
+ 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);
983
914
  var popoverArrow = (_props, ...etc) => mx("fill-separator", ...etc);
984
915
  var popoverTheme = {
985
916
  content: popoverContent,
@@ -988,40 +919,66 @@ var popoverTheme = {
988
919
  };
989
920
 
990
921
  // src/theme/components/scroll-area.ts
991
- var scrollAreaRoot = ({ orientation, margin, thin }, ...etc) => mx(
992
- "overflow-hidden",
993
- orientation === "vertical" && "group/scroll-v dx-container",
994
- orientation === "horizontal" && "group/scroll-h dx-container",
995
- orientation === "all" && "group/scroll-all dx-container",
996
- // TODO(burdon): Audit composition.
997
- // Apply col-span-full only when inside a Column.Root grid (detected via dx-column marker).
998
- "[.dx-column_&]:col-span-full",
999
- // NOTE: Uses --gutter CSS variable
1000
- // If contained within Column.Root grid, the gutter is set by that component.
1001
- margin && [
1002
- orientation === "vertical" && (thin ? "pl-[var(--gutter,4px)] pr-[calc(var(--gutter,4px)-4px)]" : "pl-[var(--gutter,8px)] pr-[calc(var(--gutter,8px)-8px)]"),
1003
- orientation === "horizontal" && (thin ? "py-[var(--gutter,4px)]" : "py-[var(--gutter,8px)]"),
1004
- orientation === "all" && (thin ? "pl-[var(--gutter,4px)] py-[var(--gutter,8px)]" : "pl-[var(--gutter,8px)] py-[var(--gutter,8px)]")
1005
- ],
922
+ var scrollbar = {
923
+ thin: {
924
+ size: 4,
925
+ padding: 4
926
+ },
927
+ coarse: {
928
+ size: 8,
929
+ padding: 8
930
+ }
931
+ };
932
+ var scrollAreaRoot = ({ orientation }, ...etc) => mx(
933
+ // Expand
934
+ "dx-container",
935
+ orientation === "vertical" && "group/scroll-v flex flex-col",
936
+ orientation === "horizontal" && "group/scroll-h flex",
937
+ orientation === "all" && "group/scroll-all",
938
+ // Apply col-span-full only when inside a Column.Root grid (detected via dx-column-root marker).
939
+ "[.dx-column-root_&]:col-span-full",
1006
940
  ...etc
1007
941
  );
1008
- 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 ? [
1009
- orientation === "vertical" && "group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1010
- orientation === "horizontal" && "group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1011
- orientation === "all" && "group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
1012
- ] : [
1013
- orientation === "vertical" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1014
- orientation === "horizontal" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1015
- orientation === "all" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
1016
- ], padding && [
1017
- orientation === "vertical" && "px-[4px]",
1018
- orientation === "horizontal" && "pb-[4px]",
1019
- orientation === "all" && "pl-[4px] pb-[4px]"
1020
- ], snap && [
1021
- orientation === "vertical" && "snap-y snap-mandatory",
1022
- orientation === "horizontal" && "snap-x snap-mandatory",
1023
- orientation === "all" && "snap-both snap-mandatory"
1024
- ], ...etc);
942
+ var scrollAreaViewport = ({ orientation, centered, padding, snap, autoHide }, ...etc) => {
943
+ return mx(
944
+ "flex-1 min-h-0 w-full",
945
+ // Reset --dx-col so nested components don't try to grid-position themselves.
946
+ // ScrollArea has already consumed --gutter for padding.
947
+ withColumn.consumed(),
948
+ orientation === "vertical" && "overflow-y-scroll",
949
+ orientation === "horizontal" && "flex overflow-x-scroll overscroll-x-contain",
950
+ orientation === "all" && "overflow-scroll",
951
+ "[&::-webkit-scrollbar-corner]:bg-transparent",
952
+ "[&::-webkit-scrollbar-track]:bg-transparent",
953
+ "[&::-webkit-scrollbar-thumb]:rounded-none",
954
+ "[&::-webkit-scrollbar]:w-[var(--scroll-width)] [&::-webkit-scrollbar]:h-[var(--scroll-width)]",
955
+ // If contained within Column.Root grid the gutter is set by that component (--gutter CSS variable).
956
+ // If centered, left padding compensates for scrollbar width so content is visually centered.
957
+ (orientation === "vertical" || orientation === "all") && (padding ? [
958
+ centered ? "pl-[var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))]" : "pl-[var(--gutter,0)]",
959
+ "pr-[calc(var(--gutter,calc(var(--scroll-width)+var(--scroll-padding)))-var(--scroll-width))]"
960
+ ] : centered && "pl-[var(--scroll-width)]"),
961
+ (orientation === "horizontal" || orientation === "all") && (padding ? [
962
+ centered && "pt-[calc(var(--scroll-width)+var(--scroll-padding))]",
963
+ "pb-[var(--scroll-padding)]"
964
+ ] : centered && "pt-[var(--scroll-width)]"),
965
+ snap && [
966
+ orientation === "vertical" && "snap-y snap-mandatory",
967
+ orientation === "horizontal" && "snap-x snap-mandatory",
968
+ orientation === "all" && "snap-both snap-mandatory"
969
+ ],
970
+ autoHide ? [
971
+ orientation === "vertical" && "group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
972
+ orientation === "horizontal" && "group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
973
+ orientation === "all" && "group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
974
+ ] : [
975
+ orientation === "vertical" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
976
+ orientation === "horizontal" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
977
+ orientation === "all" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
978
+ ],
979
+ ...etc
980
+ );
981
+ };
1025
982
  var scrollAreaTheme = {
1026
983
  root: scrollAreaRoot,
1027
984
  viewport: scrollAreaViewport
@@ -1073,8 +1030,8 @@ var skeletonTheme = {
1073
1030
  };
1074
1031
 
1075
1032
  // src/theme/components/status.ts
1076
- 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);
1077
- 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);
1033
+ 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);
1034
+ 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);
1078
1035
  var statusTheme = {
1079
1036
  root: statusRoot,
1080
1037
  bar: statusBar
@@ -1095,7 +1052,7 @@ var toastViewport = (_props, ...etc) => mx(
1095
1052
  );
1096
1053
  var toastRoot = (_props, ...etc) => mx("dx-modal-surface rounded-md flex p-2 gap-2", surfaceShadow({
1097
1054
  elevation: "toast"
1098
- }), "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);
1055
+ }), "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);
1099
1056
  var toastBody = (_props, ...etc) => mx("grow flex flex-col gap-1 justify-center pl-2", ...etc);
1100
1057
  var toastActions = (_props, ...etc) => mx("shrink-0 flex flex-col gap-1 justify-center", ...etc);
1101
1058
  var toastTitle = ({ srOnly }, ...etc) => mx("shrink-0 font-medium", srOnly && "sr-only", ...etc);
@@ -1171,7 +1128,7 @@ var levelStyles = /* @__PURE__ */ new Map([
1171
1128
  ]
1172
1129
  ]);
1173
1130
  var treegridRoot = (_, ...etc) => mx("grid", ...etc);
1174
- var treegridRow = ({ level = 1 }, ...etc) => mx("contents", levelStyles.get(Math.min(Math.max(Math.round(level), 1), 8)), ...etc);
1131
+ var treegridRow = ({ level = 1 }, ...etc) => mx(levelStyles.get(Math.min(Math.max(Math.round(level), 1), 8)), ...etc);
1175
1132
  var treegridCell = ({ indent }, ...etc) => mx(indent && "indent", ...etc);
1176
1133
  var treegridTheme = {
1177
1134
  root: treegridRoot,
@@ -1179,45 +1136,22 @@ var treegridTheme = {
1179
1136
  cell: treegridCell
1180
1137
  };
1181
1138
 
1182
- // src/theme/theme.ts
1183
- import { getDeep } from "@dxos/util";
1184
-
1185
- // src/theme/primitives/column.ts
1186
- var columnRoot = (_, ...etc) => mx("dx-column w-full min-w-0 grid", ...etc);
1187
- var columnRow = (_, ...etc) => mx("col-span-3 grid grid-cols-subgrid", ...etc);
1188
- var columnSegment = (_, ...etc) => mx("col-start-2 col-span-1 min-w-0", ...etc);
1189
- var columnTheme = {
1190
- root: columnRoot,
1191
- row: columnRow,
1192
- segment: columnSegment
1193
- };
1194
-
1195
1139
  // src/theme/primitives/panel.ts
1140
+ var sizes = {
1141
+ lg: "h-(--dx-topbar-size)",
1142
+ md: "h-(--dx-toolbar-size)",
1143
+ sm: "h-(--dx-statusbar-size)"
1144
+ };
1196
1145
  var panelRoot = (_, ...etc) => mx(
1197
1146
  // prettier-ignore
1198
- "h-full w-full grid grid-cols-[100%] overflow-hidden",
1147
+ "dx-container grid grid-cols-[100%] overflow-hidden",
1199
1148
  // Add uncategorized children to content slot.
1200
1149
  "[&>*:not([data-slot])]:[grid-area:content]",
1201
1150
  ...etc
1202
1151
  );
1203
- var panelToolbar = (_, ...etc) => mx(
1204
- // prettier-ignore
1205
- "[grid-area:toolbar]",
1206
- "h-(--dx-toolbar-size)",
1207
- "[.dx-main-mobile-layout_&]:px-3",
1208
- ...etc
1209
- );
1210
- var panelContent = (_, ...etc) => mx(
1211
- // prettier-ignore
1212
- "[grid-area:content] overflow-hidden min-h-0",
1213
- ...etc
1214
- );
1215
- var panelStatusbar = (_, ...etc) => mx(
1216
- // prettier-ignore
1217
- "[grid-area:statusbar]",
1218
- "h-(--dx-statusbar-size)",
1219
- ...etc
1220
- );
1152
+ var panelToolbar = ({ size = "md" }, ...etc) => mx("[grid-area:toolbar]", "shrink-0", sizes[size], ...etc);
1153
+ var panelContent = (_, ...etc) => mx("[grid-area:content] min-h-0", ...etc);
1154
+ var panelStatusbar = ({ size = "md" }, ...etc) => mx("[grid-area:statusbar]", "shrink-0", sizes[size], ...etc);
1221
1155
  var panelTheme = {
1222
1156
  root: panelRoot,
1223
1157
  toolbar: panelToolbar,
@@ -1226,6 +1160,7 @@ var panelTheme = {
1226
1160
  };
1227
1161
 
1228
1162
  // src/theme/theme.ts
1163
+ import { getDeep } from "@dxos/util";
1229
1164
  var defaultTheme = {
1230
1165
  themeName: () => "default",
1231
1166
  //
@@ -1241,6 +1176,7 @@ var defaultTheme = {
1241
1176
  button: buttonTheme,
1242
1177
  card: cardTheme,
1243
1178
  dialog: dialogTheme,
1179
+ focus: focusTheme,
1244
1180
  icon: iconTheme,
1245
1181
  iconButton: iconButtonTheme,
1246
1182
  input: inputTheme,
@@ -1296,17 +1232,16 @@ export {
1296
1232
  cardMinBlockSize,
1297
1233
  cardMinInlineSize,
1298
1234
  cardTheme,
1299
- coarseBlockSize,
1300
- coarseDimensions,
1235
+ columnTheme,
1236
+ composable,
1301
1237
  composableProps,
1302
- computeSize,
1303
1238
  dataDisabled,
1304
1239
  defaultButtonColors,
1305
1240
  defaultTheme,
1306
1241
  defaultTx,
1307
1242
  densityBlockSize,
1243
+ densityDimensions,
1308
1244
  descriptionMessage,
1309
- descriptionTextPrimary,
1310
1245
  dialogActionBar,
1311
1246
  dialogBody,
1312
1247
  dialogContent,
@@ -1315,15 +1250,13 @@ export {
1315
1250
  dialogOverlay,
1316
1251
  dialogTheme,
1317
1252
  dialogTitle,
1318
- fineBlockSize,
1319
- fineDimensions,
1320
- focusRing,
1253
+ focusTheme,
1321
1254
  getHashHue,
1322
1255
  getHashStyles,
1256
+ getHeight,
1323
1257
  getSize,
1324
- getSizeHeight,
1325
- getSizeWidth,
1326
1258
  getStyles,
1259
+ getWidth,
1327
1260
  ghostButtonColors,
1328
1261
  ghostFocusWithin,
1329
1262
  ghostHover,
@@ -1338,10 +1271,10 @@ export {
1338
1271
  iconButtonRoot,
1339
1272
  iconButtonTheme,
1340
1273
  iconRoot,
1274
+ iconSize,
1341
1275
  iconTheme,
1342
1276
  inputTextLabel,
1343
1277
  inputTheme,
1344
- largeIconSize,
1345
1278
  linkRoot,
1346
1279
  linkTheme,
1347
1280
  listItem,
@@ -1376,6 +1309,7 @@ export {
1376
1309
  mx,
1377
1310
  osTranslations,
1378
1311
  palette,
1312
+ panelTheme,
1379
1313
  popoverArrow,
1380
1314
  popoverContent,
1381
1315
  popoverTheme,
@@ -1385,6 +1319,7 @@ export {
1385
1319
  scrollAreaRoot,
1386
1320
  scrollAreaTheme,
1387
1321
  scrollAreaViewport,
1322
+ scrollbar,
1388
1323
  selectArrow,
1389
1324
  selectContent,
1390
1325
  selectItem,
@@ -1395,17 +1330,18 @@ export {
1395
1330
  selectViewport,
1396
1331
  separatorRoot,
1397
1332
  separatorTheme,
1333
+ sizeToRem,
1398
1334
  sizeValue,
1399
1335
  skeletonRoot,
1400
1336
  skeletonTheme,
1337
+ slottable,
1338
+ snapSize,
1401
1339
  splitterTheme,
1402
1340
  staticDefaultButtonColors,
1403
1341
  staticDisabled,
1404
- staticFocusRing,
1405
1342
  statusBar,
1406
1343
  statusRoot,
1407
1344
  statusTheme,
1408
- subduedFocus,
1409
1345
  subtleHover,
1410
1346
  surfaceShadow,
1411
1347
  surfaceZIndex,
@@ -1430,6 +1366,7 @@ export {
1430
1366
  treegridCell,
1431
1367
  treegridRoot,
1432
1368
  treegridRow,
1433
- treegridTheme
1369
+ treegridTheme,
1370
+ withColumn
1434
1371
  };
1435
1372
  //# sourceMappingURL=index.mjs.map