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