@dxos/ui-theme 0.8.4-main.d05673bc65 → 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 (143) hide show
  1. package/dist/lib/browser/index.mjs +391 -459
  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 -459
  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} +112 -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} +112 -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 +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 -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 +49 -284
  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 +12 -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 +13 -2
  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 -29
  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 +16 -11
  91. package/src/css/theme/spacing.css +36 -19
  92. package/src/css/utilities.css +114 -3
  93. package/src/fragments/AUDIT.md +57 -0
  94. package/src/fragments/density.ts +8 -5
  95. package/src/fragments/index.ts +1 -5
  96. package/src/fragments/text.ts +1 -6
  97. package/src/index.ts +1 -1
  98. package/src/{theme.css → main.css} +9 -6
  99. package/src/plugins/ThemePlugin.ts +12 -24
  100. package/src/plugins/main.css +45 -0
  101. package/src/theme/components/avatar.ts +3 -4
  102. package/src/theme/components/button.ts +1 -1
  103. package/src/theme/components/card.ts +19 -11
  104. package/src/theme/components/dialog.ts +4 -3
  105. package/src/theme/components/focus.ts +33 -0
  106. package/src/theme/components/icon-button.ts +6 -5
  107. package/src/theme/components/icon.ts +13 -4
  108. package/src/theme/components/index.ts +1 -0
  109. package/src/theme/components/input.ts +15 -30
  110. package/src/theme/components/link.ts +1 -2
  111. package/src/theme/components/list.ts +4 -4
  112. package/src/theme/components/menu.ts +4 -4
  113. package/src/theme/components/message.ts +2 -3
  114. package/src/theme/components/popover.ts +4 -5
  115. package/src/theme/components/scroll-area.ts +58 -46
  116. package/src/theme/components/select.ts +1 -2
  117. package/src/theme/components/status.ts +5 -5
  118. package/src/theme/components/toast.ts +2 -3
  119. package/src/theme/components/toolbar.ts +1 -7
  120. package/src/theme/components/tooltip.ts +1 -2
  121. package/src/theme/components/treegrid.ts +1 -1
  122. package/src/theme/index.ts +1 -0
  123. package/src/theme/primitives/column.ts +49 -8
  124. package/src/theme/primitives/panel.ts +18 -25
  125. package/src/theme/theme.ts +2 -0
  126. package/src/typings.d.ts +3 -0
  127. package/src/util/index.ts +3 -0
  128. package/src/util/mx.ts +112 -7
  129. package/src/util/size.ts +103 -0
  130. package/dist/plugin/node-cjs/theme.css.map +0 -7
  131. package/dist/plugin/node-esm/theme.css.map +0 -7
  132. package/dist/types/src/fragments/elevation.d.ts.map +0 -1
  133. package/dist/types/src/fragments/focus.d.ts +0 -4
  134. package/dist/types/src/fragments/focus.d.ts.map +0 -1
  135. package/dist/types/src/fragments/size.d.ts +0 -7
  136. package/dist/types/src/fragments/size.d.ts.map +0 -1
  137. package/dist/types/src/fragments/valence.d.ts +0 -4
  138. package/dist/types/src/fragments/valence.d.ts.map +0 -1
  139. package/src/fragments/focus.ts +0 -11
  140. package/src/fragments/size.ts +0 -117
  141. /package/dist/types/src/{fragments → util}/elevation.d.ts +0 -0
  142. /package/src/{fragments → util}/elevation.ts +0 -0
  143. /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,334 +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 sizeWidthMap = /* @__PURE__ */ new Map([
324
- [
325
- 0,
326
- "w-0"
327
- ],
328
- [
329
- "px",
330
- "w-px"
331
- ],
332
- [
333
- 0.5,
334
- "w-0.5"
335
- ],
336
- [
337
- 1,
338
- "w-1"
339
- ],
340
- [
341
- 1.5,
342
- "w-1.5"
343
- ],
344
- [
345
- 2,
346
- "w-2"
347
- ],
348
- [
349
- 2.5,
350
- "w-2.5"
351
- ],
352
- [
353
- 3,
354
- "w-3"
355
- ],
356
- [
357
- 3.5,
358
- "w-3.5"
359
- ],
360
- [
361
- 4,
362
- "w-4"
363
- ],
364
- [
365
- 5,
366
- "w-5"
367
- ],
368
- [
369
- 6,
370
- "w-6"
371
- ],
372
- [
373
- 7,
374
- "w-7"
375
- ],
376
- [
377
- 8,
378
- "w-8"
379
- ],
380
- [
381
- 9,
382
- "w-9"
383
- ],
384
- [
385
- 10,
386
- "w-10"
387
- ],
388
- [
389
- 11,
390
- "w-11"
391
- ],
392
- [
393
- 12,
394
- "w-12"
395
- ],
396
- [
397
- 14,
398
- "w-14"
399
- ],
400
- [
401
- 16,
402
- "w-16"
403
- ],
404
- [
405
- 20,
406
- "w-20"
407
- ],
408
- [
409
- 24,
410
- "w-24"
411
- ],
412
- [
413
- 28,
414
- "w-28"
415
- ],
416
- [
417
- 32,
418
- "w-32"
419
- ],
420
- [
421
- 36,
422
- "w-36"
423
- ],
424
- [
425
- 40,
426
- "w-40"
427
- ],
428
- [
429
- 44,
430
- "w-44"
431
- ],
432
- [
433
- 48,
434
- "w-48"
435
- ],
436
- [
437
- 52,
438
- "w-52"
439
- ],
440
- [
441
- 56,
442
- "w-56"
443
- ],
444
- [
445
- 60,
446
- "w-60"
447
- ],
448
- [
449
- 64,
450
- "w-64"
451
- ],
452
- [
453
- 72,
454
- "w-72"
455
- ],
456
- [
457
- 80,
458
- "w-80"
459
- ],
460
- [
461
- 96,
462
- "w-96"
463
- ]
464
- ]);
465
- var sizeHeightMap = /* @__PURE__ */ new Map([
466
- [
467
- 0,
468
- "h-0"
469
- ],
470
- [
471
- "px",
472
- "h-px"
473
- ],
474
- [
475
- 0.5,
476
- "h-0.5"
477
- ],
478
- [
479
- 1,
480
- "h-1"
481
- ],
482
- [
483
- 1.5,
484
- "h-1.5"
485
- ],
486
- [
487
- 2,
488
- "h-2"
489
- ],
490
- [
491
- 2.5,
492
- "h-2.5"
493
- ],
494
- [
495
- 3,
496
- "h-3"
497
- ],
498
- [
499
- 3.5,
500
- "h-3.5"
501
- ],
502
- [
503
- 4,
504
- "h-4"
505
- ],
506
- [
507
- 5,
508
- "h-5"
509
- ],
510
- [
511
- 6,
512
- "h-6"
513
- ],
514
- [
515
- 7,
516
- "h-7"
517
- ],
518
- [
519
- 8,
520
- "h-8"
521
- ],
522
- [
523
- 9,
524
- "h-9"
525
- ],
526
- [
527
- 10,
528
- "h-10"
529
- ],
530
- [
531
- 11,
532
- "h-11"
533
- ],
534
- [
535
- 12,
536
- "h-12"
537
- ],
538
- [
539
- 14,
540
- "h-14"
541
- ],
542
- [
543
- 16,
544
- "h-16"
545
- ],
546
- [
547
- 20,
548
- "h-20"
549
- ],
550
- [
551
- 24,
552
- "h-24"
553
- ],
554
- [
555
- 28,
556
- "h-28"
557
- ],
558
- [
559
- 32,
560
- "h-32"
561
- ],
562
- [
563
- 36,
564
- "h-36"
565
- ],
566
- [
567
- 40,
568
- "h-40"
569
- ],
570
- [
571
- 44,
572
- "h-44"
573
- ],
574
- [
575
- 48,
576
- "h-48"
577
- ],
578
- [
579
- 52,
580
- "h-52"
581
- ],
582
- [
583
- 56,
584
- "h-56"
585
- ],
586
- [
587
- 60,
588
- "h-60"
589
- ],
590
- [
591
- 64,
592
- "h-64"
593
- ],
594
- [
595
- 72,
596
- "h-72"
597
- ],
598
- [
599
- 80,
600
- "h-80"
601
- ],
602
- [
603
- 96,
604
- "h-96"
605
- ]
606
- ]);
607
- var sizes = new Set(sizeWidthMap.keys());
608
- var getSizeHeight = sizeHeightMap.get.bind(sizeHeightMap);
609
- var getSizeWidth = sizeWidthMap.get.bind(sizeWidthMap);
610
- var getSize = (size) => mx(getSizeHeight(size), getSizeWidth(size));
611
- var computeSize = (value, defaultSize) => {
612
- if (sizes.has(value)) {
368
+ // src/util/size.ts
369
+ var sizeMap = {
370
+ 0: {
371
+ w: "w-0",
372
+ h: "h-0"
373
+ },
374
+ px: {
375
+ w: "w-px",
376
+ h: "h-px"
377
+ },
378
+ 0.5: {
379
+ w: "w-0.5",
380
+ h: "h-0.5"
381
+ },
382
+ 1: {
383
+ w: "w-1",
384
+ h: "h-1"
385
+ },
386
+ 1.5: {
387
+ w: "w-1.5",
388
+ h: "h-1.5"
389
+ },
390
+ 2: {
391
+ w: "w-2",
392
+ h: "h-2"
393
+ },
394
+ 2.5: {
395
+ w: "w-2.5",
396
+ h: "h-2.5"
397
+ },
398
+ 3: {
399
+ w: "w-3",
400
+ h: "h-3"
401
+ },
402
+ 3.5: {
403
+ w: "w-3.5",
404
+ h: "h-3.5"
405
+ },
406
+ 4: {
407
+ w: "w-4",
408
+ h: "h-4"
409
+ },
410
+ 5: {
411
+ w: "w-5",
412
+ h: "h-5"
413
+ },
414
+ 6: {
415
+ w: "w-6",
416
+ h: "h-6"
417
+ },
418
+ 7: {
419
+ w: "w-7",
420
+ h: "h-7"
421
+ },
422
+ 8: {
423
+ w: "w-8",
424
+ h: "h-8"
425
+ },
426
+ 9: {
427
+ w: "w-9",
428
+ h: "h-9"
429
+ },
430
+ 10: {
431
+ w: "w-10",
432
+ h: "h-10"
433
+ },
434
+ 11: {
435
+ w: "w-11",
436
+ h: "h-11"
437
+ },
438
+ 12: {
439
+ w: "w-12",
440
+ h: "h-12"
441
+ },
442
+ 14: {
443
+ w: "w-14",
444
+ h: "h-14"
445
+ },
446
+ 16: {
447
+ w: "w-16",
448
+ h: "h-16"
449
+ },
450
+ 20: {
451
+ w: "w-20",
452
+ h: "h-20"
453
+ },
454
+ 24: {
455
+ w: "w-24",
456
+ h: "h-24"
457
+ },
458
+ 28: {
459
+ w: "w-28",
460
+ h: "h-28"
461
+ },
462
+ 32: {
463
+ w: "w-32",
464
+ h: "h-32"
465
+ },
466
+ 36: {
467
+ w: "w-36",
468
+ h: "h-36"
469
+ },
470
+ 40: {
471
+ w: "w-40",
472
+ h: "h-40"
473
+ },
474
+ 44: {
475
+ w: "w-44",
476
+ h: "h-44"
477
+ },
478
+ 48: {
479
+ w: "w-48",
480
+ h: "h-48"
481
+ },
482
+ 52: {
483
+ w: "w-52",
484
+ h: "h-52"
485
+ },
486
+ 56: {
487
+ w: "w-56",
488
+ h: "h-56"
489
+ },
490
+ 60: {
491
+ w: "w-60",
492
+ h: "h-60"
493
+ },
494
+ 64: {
495
+ w: "w-64",
496
+ h: "h-64"
497
+ },
498
+ 72: {
499
+ w: "w-72",
500
+ h: "h-72"
501
+ },
502
+ 80: {
503
+ w: "w-80",
504
+ h: "h-80"
505
+ },
506
+ 96: {
507
+ w: "w-96",
508
+ h: "h-96"
509
+ }
510
+ };
511
+ var SIZE_VALUES = Object.keys(sizeMap).map((key) => key === "px" ? "px" : Number(key));
512
+ var getHeight = (size) => sizeMap[size]?.h;
513
+ var getWidth = (size) => sizeMap[size]?.w;
514
+ var getSize = (size) => mx(getHeight(size), getWidth(size));
515
+ var sizeValue = (size) => size === "px" ? 1 : size;
516
+ var sizeToRem = (size) => size === "px" ? "1px" : `${size * 0.25}rem`;
517
+ var iconSize = (size) => ({
518
+ "--icon-size": size ? sizeToRem(size) : "initial"
519
+ });
520
+ var snapSize = (value, defaultSize) => {
521
+ if (SIZE_VALUES.includes(value)) {
613
522
  return value;
614
523
  } else if (value <= 0) {
615
524
  return 0;
616
- } else if (value === 1) {
525
+ } else if (value < 0.5) {
617
526
  return "px";
618
527
  } else {
619
528
  const wholeSeries = Math.floor(value);
620
529
  const halfSeries = Math.floor(value * 2) / 2;
621
530
  const doubleSeries = Math.floor(value / 2) * 2;
622
531
  const quadrupleSeries = Math.floor(value / 4) * 4;
623
- if (sizes.has(halfSeries)) {
532
+ if (SIZE_VALUES.includes(halfSeries)) {
624
533
  return halfSeries;
625
- } else if (sizes.has(wholeSeries)) {
534
+ } else if (SIZE_VALUES.includes(wholeSeries)) {
626
535
  return wholeSeries;
627
- } else if (sizes.has(doubleSeries)) {
536
+ } else if (SIZE_VALUES.includes(doubleSeries)) {
628
537
  return doubleSeries;
629
- } else if (sizes.has(quadrupleSeries)) {
538
+ } else if (SIZE_VALUES.includes(quadrupleSeries)) {
630
539
  return quadrupleSeries;
631
540
  } else {
632
541
  return defaultSize;
633
542
  }
634
543
  }
635
544
  };
636
- var sizeValue = (size) => size === "px" ? 1 : size;
637
-
638
- // src/fragments/text.ts
639
- var textBlockWidth = "w-full max-w-text-content mx-auto";
640
- var descriptionTextPrimary = "text-sm font-normal text-base-surface-text";
641
- var descriptionMessage = "text-description border border-dashed border-separator rounded-sm p-4";
642
545
 
643
- // src/fragments/valence.ts
546
+ // src/util/valence.ts
644
547
  var textValence = (valence) => {
645
548
  switch (valence) {
646
549
  case "success":
@@ -672,12 +575,12 @@ var messageValence = (valence) => {
672
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);
673
576
  var avatarLabel = ({ srOnly }, ...etc) => mx(srOnly && "sr-only", ...etc);
674
577
  var avatarDescription = ({ srOnly }, ...etc) => mx("text-description", srOnly && "sr-only", ...etc);
675
- 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);
676
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);
677
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);
678
581
  var avatarFallbackText = (_props, ...etc) => mx("fill-white", ...etc);
679
582
  var avatarGroup = (_props, ...etc) => mx("inline-flex items-center", ...etc);
680
- 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);
681
584
  var avatarGroupDescription = ({ srOnly }, ...etc) => mx(srOnly ? "sr-only" : "text-description", ...etc);
682
585
  var avatarTheme = {
683
586
  root: avatarRoot,
@@ -707,12 +610,12 @@ var breadcrumbTheme = {
707
610
  };
708
611
 
709
612
  // src/theme/components/card.ts
710
- 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);
711
- var cardToolbar = ({ coarse }, ...etc) => mx("dx-card__toolbar dx-density-fine bg-transparent col-span-3 !grid grid-cols-subgrid [contain:none]", coarse && "grid-cols-[var(--dx-l0-avatar-size)_minmax(0,1fr)_var(--dx-rail-item)]", ...etc);
613
+ var cardRoot = ({ border, fullWidth }, ...etc) => mx("dx-card dx-card-min-width 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);
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);
712
615
  var cardTitle = (_props, ...etc) => mx("dx-card__title grow truncate", ...etc);
713
- 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);
714
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);
715
- 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);
716
619
  var cardTextSpan = ({ variant = "default", truncate }, ...etc) => mx(variant === "description" && "text-sm text-description line-clamp-3", truncate && "truncate", ...etc);
717
620
  var cardPoster = (_props, ...etc) => mx("dx-card__poster col-span-3 max-h-[200px]", ...etc);
718
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);
@@ -720,12 +623,14 @@ var cardAction = (_props, ...etc) => mx("dx-card__acztion col-span-3 !grid grid-
720
623
  var cardActionLabel = (_props, ...etc) => mx("dx-card__action-label min-w-0 flex-1 truncate", ...etc);
721
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);
722
625
  var cardLinkLabel = (_props, ...etc) => mx("dx-card__link-label min-w-0 flex-1 truncate", ...etc);
723
- var cardIconBlock = (_props, ...etc) => mx("dx-card__icon-block grid h-[var(--dx-rail-item)] w-[var(--dx-rail-item)] place-items-center", ...etc);
626
+ var 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);
724
628
  var cardTheme = {
725
629
  root: cardRoot,
726
630
  toolbar: cardToolbar,
727
631
  title: cardTitle,
728
632
  content: cardContent,
633
+ row: cardRow,
729
634
  heading: cardHeading,
730
635
  text: cardText,
731
636
  "text-span": cardTextSpan,
@@ -744,7 +649,7 @@ var staticDefaultButtonColors = "bg-input-surface text-input-surface-text";
744
649
  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");
745
650
  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");
746
651
  var buttonRoot = (_props, ...etc) => {
747
- return mx("dx-button dx-focus-ring group max-w-full [&_span]:truncate", ...etc);
652
+ return mx("dx-button dx-focus-ring group [&_span]:truncate", ...etc);
748
653
  };
749
654
  var buttonGroup = (_props, ...etc) => {
750
655
  return mx("inline-flex rounded-xs [&>:first-child]:rounded-w-sm [&>:last-child]:rounded-ie-sm [&>button]:relative", ...etc);
@@ -754,8 +659,37 @@ var buttonTheme = {
754
659
  group: buttonGroup
755
660
  };
756
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
+
757
691
  // src/theme/components/dialog.ts
758
- var sizeMap = {
692
+ var sizeMap2 = {
759
693
  sm: "md:max-w-[24rem]",
760
694
  md: "md:max-w-[32rem]!",
761
695
  lg: "md:max-w-[40rem]!",
@@ -763,11 +697,11 @@ var sizeMap = {
763
697
  };
764
698
  var dialogOverlay = (_props, ...etc) => mx("dx-dialog__overlay", ...etc);
765
699
  var dialogContent = ({ inOverlayLayout, size = "md" }, ...etc) => {
766
- 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);
767
701
  };
768
- var dialogHeader = (_props, ...etc) => mx("dx-dialog__header flex pb-4 items-center justify-between", ...etc);
769
- var dialogBody = (_props, ...etc) => mx("dx-dialog__body flex flex-col h-full py-2 gap-2", ...etc);
770
- 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);
771
705
  var dialogTitle = ({ srOnly }, ...etc) => mx("dx-dialog__title", srOnly && "sr-only", ...etc);
772
706
  var dialogDescription = ({ srOnly }, ...etc) => mx("dx-dialog__description", "text-description", srOnly && "sr-only", ...etc);
773
707
  var dialogTheme = {
@@ -780,15 +714,24 @@ var dialogTheme = {
780
714
  description: dialogDescription
781
715
  };
782
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
+
783
724
  // src/theme/components/icon.ts
784
- var iconRoot = ({ size }, etc) => mx("shrink-0 h-[1em] w-[1em] text-[var(--icons-color,currentColor)]", size && getSize(size), 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
+ };
785
728
  var iconTheme = {
786
729
  root: iconRoot
787
730
  };
788
731
 
789
732
  // src/theme/components/icon-button.ts
790
- var iconButtonRoot = ({ iconOnly }, ...etc) => {
791
- 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);
792
735
  };
793
736
  var iconButtonTheme = {
794
737
  root: iconButtonRoot
@@ -813,44 +756,41 @@ var inputValence = (valence) => {
813
756
  }
814
757
  };
815
758
  var sharedSubduedInputStyles = (props) => [
816
- "py-0 w-full bg-transparent text-current placeholder-placeholder",
817
759
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
818
- props.density === "fine" ? fineBlockSize : coarseBlockSize,
819
- subduedFocus,
760
+ "py-0 w-full bg-transparent text-current placeholder-placeholder",
761
+ "dx-focus-subdued",
762
+ densityDimensions(props.density),
820
763
  props.disabled && staticDisabled
821
764
  ];
822
765
  var sharedDefaultInputStyles = (props) => [
823
- "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
824
766
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
767
+ "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
825
768
  textInputSurfaceFocus,
826
- props.density === "fine" ? fineDimensions : coarseDimensions,
769
+ densityDimensions(props.density),
827
770
  props.disabled ? staticDisabled : textInputSurfaceHover
828
771
  ];
829
772
  var sharedStaticInputStyles = (props) => [
830
- "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
831
773
  '[[data-drag-autoscroll="active"]_&]:pointer-events-none',
774
+ "py-0 w-full text-base-surface-text rounded-xs placeholder-placeholder",
832
775
  textInputSurfaceFocus,
833
776
  textInputSurfaceHover,
834
777
  props.focused && "bg-attention-surface",
835
778
  inputValence(props.validationValence),
836
779
  props.disabled && staticDisabled,
837
- props.focused && staticFocusRing
780
+ props.focused && "dx-focus-static"
838
781
  ];
839
- 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);
840
- var inputTextArea = (props, ...etc) => inputInput(props, ...[
841
- "-mb-1.5",
842
- ...etc
843
- ]);
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);
844
784
  var inputCheckbox = ({ size = 5 }, ...etc) => mx("dx-checkbox dx-focus-ring", getSize(size), ...etc);
845
- 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);
846
786
  var inputSwitch = ({ size = 5, disabled }, ...etc) => mx(
847
- getSizeHeight(size),
848
- getSizeWidth(computeSize(sizeValue(size) * 1.75, 9)),
787
+ getHeight(size),
788
+ getWidth(snapSize(sizeValue(size) * 1.75, 9)),
849
789
  booleanInputSurface,
850
790
  !disabled && booleanInputSurfaceHover,
851
791
  // TODO(burdon): Added m-1 margin to make 40px width to align with 40px icon button.
852
792
  "cursor-pointer shrink-0 rounded-full px-1 mx-1 relative",
853
- focusRing,
793
+ "dx-focus-ring",
854
794
  ...etc
855
795
  );
856
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);
@@ -876,7 +816,7 @@ var inputTheme = {
876
816
  };
877
817
 
878
818
  // src/theme/components/link.ts
879
- 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);
880
820
  var linkTheme = {
881
821
  root: linkRoot
882
822
  };
@@ -885,9 +825,9 @@ var linkTheme = {
885
825
  var listRoot = (_, ...etc) => mx(...etc);
886
826
  var listItem = ({ collapsible }, ...etc) => mx(!collapsible && "flex", ...etc);
887
827
  var listItemEndcap = ({ density }, ...etc) => mx(density === "fine" ? getSize(8) : getSize(10), "shrink-0 flex items-center justify-center", ...etc);
888
- 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);
889
829
  var listItemDragHandleIcon = (_props, ...etc) => mx(getSize(5), "mt-2.5", ...etc);
890
- 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);
891
831
  var listItemOpenTriggerIcon = (_props, ...etc) => {
892
832
  return mx(getSize(5), ...etc);
893
833
  };
@@ -926,7 +866,7 @@ var menuContent = ({ elevation }, ...etc) => mx("dx-modal-surface w-48 rounded-s
926
866
  elevation: "positioned"
927
867
  }), ...etc);
928
868
  var menuViewport = (_props, ...etc) => mx("rounded-sm p-1 max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto", ...etc);
929
- 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);
930
870
  var menuSeparator = (_props, ...etc) => mx("my-1 mx-2 h-px bg-separator", ...etc);
931
871
  var menuGroupLabel = (_props, ...etc) => mx("text-description", "select-none px-2 py-2", ...etc);
932
872
  var menuArrow = (_props, ...etc) => mx("fill-separator", ...etc);
@@ -947,7 +887,7 @@ var messageHeader = (_, etc) => {
947
887
  return mx("col-span-2 grid grid-cols-subgrid items-center", etc);
948
888
  };
949
889
  var messageTitle = (_, etc) => {
950
- return mx("col-start-2 text-lg gap-trim-sm [&>svg]:inline-block", etc);
890
+ return mx("col-start-2 gap-trim-sm [&>svg]:inline-block", etc);
951
891
  };
952
892
  var messageIcon = (_, etc) => {
953
893
  return mx("col-start-1", etc);
@@ -969,15 +909,8 @@ var popoverContent = ({ elevation }, ...etc) => mx("dx-modal-surface border bord
969
909
  }), surfaceZIndex({
970
910
  elevation,
971
911
  level: "menu"
972
- }), focusRing, ...etc);
973
- var popoverViewport = ({ constrainBlock, constrainInline }, ...etc) => mx(
974
- "flex flex-col min-h-0 min-w-popover-min-width",
975
- (constrainBlock || constrainInline) && "overflow-hidden",
976
- // Ensures it respects available height from Radix (or 100dvh).
977
- constrainBlock && "max-h-[min(var(--radix-popover-content-available-height),calc(100dvh-var(--spacing-screen-border)*2))]",
978
- constrainInline && "max-w-(--radix-popover-content-available-width)",
979
- ...etc
980
- );
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);
981
914
  var popoverArrow = (_props, ...etc) => mx("fill-separator", ...etc);
982
915
  var popoverTheme = {
983
916
  content: popoverContent,
@@ -986,40 +919,66 @@ var popoverTheme = {
986
919
  };
987
920
 
988
921
  // src/theme/components/scroll-area.ts
989
- var scrollAreaRoot = ({ orientation, margin, thin }, ...etc) => mx(
990
- "overflow-hidden",
991
- orientation === "vertical" && "group/scroll-v dx-container",
992
- orientation === "horizontal" && "group/scroll-h dx-container",
993
- orientation === "all" && "group/scroll-all dx-container",
994
- // TODO(burdon): Audit composition.
995
- // Apply col-span-full only when inside a Column.Root grid (detected via dx-column marker).
996
- "[.dx-column_&]:col-span-full",
997
- // NOTE: Uses --gutter CSS variable
998
- // If contained within Column.Root grid, the gutter is set by that component.
999
- margin && [
1000
- orientation === "vertical" && (thin ? "pl-[var(--gutter,4px)] pr-[calc(var(--gutter,4px)-4px)]" : "pl-[var(--gutter,8px)] pr-[calc(var(--gutter,8px)-8px)]"),
1001
- orientation === "horizontal" && (thin ? "py-[var(--gutter,4px)]" : "py-[var(--gutter,8px)]"),
1002
- orientation === "all" && (thin ? "pl-[var(--gutter,4px)] py-[var(--gutter,8px)]" : "pl-[var(--gutter,8px)] py-[var(--gutter,8px)]")
1003
- ],
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",
1004
940
  ...etc
1005
941
  );
1006
- 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 ? [
1007
- orientation === "vertical" && "group-hover/scroll-v:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1008
- orientation === "horizontal" && "group-hover/scroll-h:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1009
- orientation === "all" && "group-hover/scroll-all:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
1010
- ] : [
1011
- orientation === "vertical" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1012
- orientation === "horizontal" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb",
1013
- orientation === "all" && "[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb"
1014
- ], padding && [
1015
- orientation === "vertical" && "px-[4px]",
1016
- orientation === "horizontal" && "pb-[4px]",
1017
- orientation === "all" && "pl-[4px] pb-[4px]"
1018
- ], snap && [
1019
- orientation === "vertical" && "snap-y snap-mandatory",
1020
- orientation === "horizontal" && "snap-x snap-mandatory",
1021
- orientation === "all" && "snap-both snap-mandatory"
1022
- ], ...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
+ };
1023
982
  var scrollAreaTheme = {
1024
983
  root: scrollAreaRoot,
1025
984
  viewport: scrollAreaViewport
@@ -1071,8 +1030,8 @@ var skeletonTheme = {
1071
1030
  };
1072
1031
 
1073
1032
  // src/theme/components/status.ts
1074
- 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);
1075
- 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);
1076
1035
  var statusTheme = {
1077
1036
  root: statusRoot,
1078
1037
  bar: statusBar
@@ -1093,7 +1052,7 @@ var toastViewport = (_props, ...etc) => mx(
1093
1052
  );
1094
1053
  var toastRoot = (_props, ...etc) => mx("dx-modal-surface rounded-md flex p-2 gap-2", surfaceShadow({
1095
1054
  elevation: "toast"
1096
- }), "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);
1097
1056
  var toastBody = (_props, ...etc) => mx("grow flex flex-col gap-1 justify-center pl-2", ...etc);
1098
1057
  var toastActions = (_props, ...etc) => mx("shrink-0 flex flex-col gap-1 justify-center", ...etc);
1099
1058
  var toastTitle = ({ srOnly }, ...etc) => mx("shrink-0 font-medium", srOnly && "sr-only", ...etc);
@@ -1112,18 +1071,11 @@ var toolbarLayout = "w-full shrink-0 flex flex-nowrap p-1 gap-1 items-center ove
1112
1071
  var toolbarRoot = ({ density, disabled, layoutManaged }, ...etc) => {
1113
1072
  return mx("bg-toolbar-surface dx-toolbar", density === "coarse" && "h-(--dx-rail-size) px-3!", disabled && "*:opacity-20", !layoutManaged && toolbarLayout, ...etc);
1114
1073
  };
1115
- var toolbarInner = ({ layoutManaged }, ...etc) => {
1116
- return mx(!layoutManaged && [
1117
- "flex gap-1",
1118
- textBlockWidth
1119
- ], ...etc);
1120
- };
1121
1074
  var toolbarText = (_, ...etc) => {
1122
- return mx("grow truncate items-center", textBlockWidth, ...etc);
1075
+ return mx("px-2 grow truncate items-center", ...etc);
1123
1076
  };
1124
1077
  var toolbarTheme = {
1125
1078
  root: toolbarRoot,
1126
- inner: toolbarInner,
1127
1079
  text: toolbarText
1128
1080
  };
1129
1081
 
@@ -1176,7 +1128,7 @@ var levelStyles = /* @__PURE__ */ new Map([
1176
1128
  ]
1177
1129
  ]);
1178
1130
  var treegridRoot = (_, ...etc) => mx("grid", ...etc);
1179
- 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);
1180
1132
  var treegridCell = ({ indent }, ...etc) => mx(indent && "indent", ...etc);
1181
1133
  var treegridTheme = {
1182
1134
  root: treegridRoot,
@@ -1184,44 +1136,22 @@ var treegridTheme = {
1184
1136
  cell: treegridCell
1185
1137
  };
1186
1138
 
1187
- // src/theme/theme.ts
1188
- import { getDeep } from "@dxos/util";
1189
-
1190
- // src/theme/primitives/column.ts
1191
- var columnRoot = (_, ...etc) => mx("dx-column w-full min-w-0 grid", ...etc);
1192
- var columnRow = (_, ...etc) => mx("col-span-3 grid grid-cols-subgrid", ...etc);
1193
- var columnSegment = (_, ...etc) => mx("col-start-2 col-span-1 min-w-0", ...etc);
1194
- var columnTheme = {
1195
- root: columnRoot,
1196
- row: columnRow,
1197
- segment: columnSegment
1198
- };
1199
-
1200
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
+ };
1201
1145
  var panelRoot = (_, ...etc) => mx(
1202
1146
  // prettier-ignore
1203
- "h-full w-full grid grid-cols-[100%] overflow-hidden",
1147
+ "dx-container grid grid-cols-[100%] overflow-hidden",
1204
1148
  // Add uncategorized children to content slot.
1205
1149
  "[&>*:not([data-slot])]:[grid-area:content]",
1206
1150
  ...etc
1207
1151
  );
1208
- var panelToolbar = (_, ...etc) => mx(
1209
- // prettier-ignore
1210
- "[grid-area:toolbar]",
1211
- "border-b border-subdued-separator relative",
1212
- "[.dx-main-mobile-layout_&]:px-3",
1213
- ...etc
1214
- );
1215
- var panelContent = (_, ...etc) => mx(
1216
- // prettier-ignore
1217
- "[grid-area:content] overflow-hidden min-h-0",
1218
- ...etc
1219
- );
1220
- var panelStatusbar = (_, ...etc) => mx(
1221
- // prettier-ignore
1222
- "[grid-area:statusbar]",
1223
- ...etc
1224
- );
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);
1225
1155
  var panelTheme = {
1226
1156
  root: panelRoot,
1227
1157
  toolbar: panelToolbar,
@@ -1230,6 +1160,7 @@ var panelTheme = {
1230
1160
  };
1231
1161
 
1232
1162
  // src/theme/theme.ts
1163
+ import { getDeep } from "@dxos/util";
1233
1164
  var defaultTheme = {
1234
1165
  themeName: () => "default",
1235
1166
  //
@@ -1245,6 +1176,7 @@ var defaultTheme = {
1245
1176
  button: buttonTheme,
1246
1177
  card: cardTheme,
1247
1178
  dialog: dialogTheme,
1179
+ focus: focusTheme,
1248
1180
  icon: iconTheme,
1249
1181
  iconButton: iconButtonTheme,
1250
1182
  input: inputTheme,
@@ -1300,17 +1232,16 @@ export {
1300
1232
  cardMinBlockSize,
1301
1233
  cardMinInlineSize,
1302
1234
  cardTheme,
1303
- coarseBlockSize,
1304
- coarseDimensions,
1235
+ columnTheme,
1236
+ composable,
1305
1237
  composableProps,
1306
- computeSize,
1307
1238
  dataDisabled,
1308
1239
  defaultButtonColors,
1309
1240
  defaultTheme,
1310
1241
  defaultTx,
1311
1242
  densityBlockSize,
1243
+ densityDimensions,
1312
1244
  descriptionMessage,
1313
- descriptionTextPrimary,
1314
1245
  dialogActionBar,
1315
1246
  dialogBody,
1316
1247
  dialogContent,
@@ -1319,15 +1250,13 @@ export {
1319
1250
  dialogOverlay,
1320
1251
  dialogTheme,
1321
1252
  dialogTitle,
1322
- fineBlockSize,
1323
- fineDimensions,
1324
- focusRing,
1253
+ focusTheme,
1325
1254
  getHashHue,
1326
1255
  getHashStyles,
1256
+ getHeight,
1327
1257
  getSize,
1328
- getSizeHeight,
1329
- getSizeWidth,
1330
1258
  getStyles,
1259
+ getWidth,
1331
1260
  ghostButtonColors,
1332
1261
  ghostFocusWithin,
1333
1262
  ghostHover,
@@ -1342,6 +1271,7 @@ export {
1342
1271
  iconButtonRoot,
1343
1272
  iconButtonTheme,
1344
1273
  iconRoot,
1274
+ iconSize,
1345
1275
  iconTheme,
1346
1276
  inputTextLabel,
1347
1277
  inputTheme,
@@ -1379,6 +1309,7 @@ export {
1379
1309
  mx,
1380
1310
  osTranslations,
1381
1311
  palette,
1312
+ panelTheme,
1382
1313
  popoverArrow,
1383
1314
  popoverContent,
1384
1315
  popoverTheme,
@@ -1388,6 +1319,7 @@ export {
1388
1319
  scrollAreaRoot,
1389
1320
  scrollAreaTheme,
1390
1321
  scrollAreaViewport,
1322
+ scrollbar,
1391
1323
  selectArrow,
1392
1324
  selectContent,
1393
1325
  selectItem,
@@ -1398,23 +1330,23 @@ export {
1398
1330
  selectViewport,
1399
1331
  separatorRoot,
1400
1332
  separatorTheme,
1333
+ sizeToRem,
1401
1334
  sizeValue,
1402
1335
  skeletonRoot,
1403
1336
  skeletonTheme,
1337
+ slottable,
1338
+ snapSize,
1404
1339
  splitterTheme,
1405
1340
  staticDefaultButtonColors,
1406
1341
  staticDisabled,
1407
- staticFocusRing,
1408
1342
  statusBar,
1409
1343
  statusRoot,
1410
1344
  statusTheme,
1411
- subduedFocus,
1412
1345
  subtleHover,
1413
1346
  surfaceShadow,
1414
1347
  surfaceZIndex,
1415
1348
  tagRoot,
1416
1349
  tagTheme,
1417
- textBlockWidth,
1418
1350
  textValence,
1419
1351
  toastActions,
1420
1352
  toastBody,
@@ -1423,7 +1355,6 @@ export {
1423
1355
  toastTheme,
1424
1356
  toastTitle,
1425
1357
  toastViewport,
1426
- toolbarInner,
1427
1358
  toolbarLayout,
1428
1359
  toolbarRoot,
1429
1360
  toolbarText,
@@ -1435,6 +1366,7 @@ export {
1435
1366
  treegridCell,
1436
1367
  treegridRoot,
1437
1368
  treegridRow,
1438
- treegridTheme
1369
+ treegridTheme,
1370
+ withColumn
1439
1371
  };
1440
1372
  //# sourceMappingURL=index.mjs.map