@dxos/ui-theme 0.8.4-staging.ac66bdf99f → 0.9.0

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 (169) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/index.mjs +89 -867
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/node-esm/index.mjs +89 -867
  7. package/dist/lib/node-esm/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/meta.json +1 -1
  9. package/dist/plugin/node-cjs/main.css +252 -119
  10. package/dist/plugin/node-cjs/main.css.map +3 -3
  11. package/dist/plugin/node-cjs/meta.json +1 -1
  12. package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs +82 -10
  13. package/dist/plugin/node-cjs/plugins/ThemePlugin.cjs.map +3 -3
  14. package/dist/plugin/node-esm/main.css +252 -119
  15. package/dist/plugin/node-esm/main.css.map +3 -3
  16. package/dist/plugin/node-esm/meta.json +1 -1
  17. package/dist/plugin/node-esm/plugins/ThemePlugin.mjs +84 -12
  18. package/dist/plugin/node-esm/plugins/ThemePlugin.mjs.map +3 -3
  19. package/dist/types/src/Theme.stories.d.ts.map +1 -1
  20. package/dist/types/src/defs.d.ts +1 -1
  21. package/dist/types/src/defs.d.ts.map +1 -1
  22. package/dist/types/src/fragments/density.d.ts +2 -2
  23. package/dist/types/src/fragments/density.d.ts.map +1 -1
  24. package/dist/types/src/fragments/hover.d.ts +0 -1
  25. package/dist/types/src/fragments/hover.d.ts.map +1 -1
  26. package/dist/types/src/index.d.ts +0 -1
  27. package/dist/types/src/index.d.ts.map +1 -1
  28. package/dist/types/src/plugins/ThemePlugin.d.ts +3 -2
  29. package/dist/types/src/plugins/ThemePlugin.d.ts.map +1 -1
  30. package/dist/types/src/util/hash-styles.d.ts +12 -2
  31. package/dist/types/src/util/hash-styles.d.ts.map +1 -1
  32. package/dist/types/src/util/mx.d.ts +0 -36
  33. package/dist/types/src/util/mx.d.ts.map +1 -1
  34. package/dist/types/src/util/size.d.ts.map +1 -1
  35. package/dist/types/src/util/valence.d.ts +8 -2
  36. package/dist/types/src/util/valence.d.ts.map +1 -1
  37. package/dist/types/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +14 -21
  39. package/src/Theme.stories.tsx +94 -27
  40. package/src/css/DESIGN_SYSTEM.md +187 -0
  41. package/src/css/base/base.css +2 -2
  42. package/src/css/components/button.css +63 -13
  43. package/src/css/components/card.css +14 -0
  44. package/src/css/components/checkbox.css +3 -3
  45. package/src/css/components/focus.css +12 -12
  46. package/src/css/components/link.css +4 -1
  47. package/src/css/components/panel.css +45 -45
  48. package/src/css/components/state.css +99 -0
  49. package/src/css/components/state.md +101 -0
  50. package/src/css/components/surface.css +33 -11
  51. package/src/css/components/tag.css +25 -24
  52. package/src/css/integrations/codemirror.css +4 -3
  53. package/src/css/integrations/tldraw.css +1 -1
  54. package/src/css/layout/main.css +6 -0
  55. package/src/css/layout/size.css +16 -3
  56. package/src/css/theme/animation.css +31 -0
  57. package/src/css/theme/palette.css +34 -0
  58. package/src/css/theme/semantic.css +101 -60
  59. package/src/css/theme/spacing.css +29 -12
  60. package/src/css/theme/styles.css +172 -119
  61. package/src/css/utilities.css +42 -0
  62. package/src/defs.ts +3 -1
  63. package/src/fragments/AUDIT.md +0 -2
  64. package/src/fragments/density.ts +34 -7
  65. package/src/fragments/hover.ts +0 -2
  66. package/src/index.ts +1 -1
  67. package/src/main.css +68 -9
  68. package/src/plugins/ThemePlugin.ts +102 -14
  69. package/src/plugins/main.css +10 -7
  70. package/src/util/hash-styles.ts +54 -42
  71. package/src/util/mx.ts +1 -126
  72. package/src/util/valence.ts +15 -5
  73. package/dist/types/src/theme/components/avatar.d.ts +0 -21
  74. package/dist/types/src/theme/components/avatar.d.ts.map +0 -1
  75. package/dist/types/src/theme/components/breadcrumb.d.ts +0 -9
  76. package/dist/types/src/theme/components/breadcrumb.d.ts.map +0 -1
  77. package/dist/types/src/theme/components/button.d.ts +0 -15
  78. package/dist/types/src/theme/components/button.d.ts.map +0 -1
  79. package/dist/types/src/theme/components/card.d.ts +0 -12
  80. package/dist/types/src/theme/components/card.d.ts.map +0 -1
  81. package/dist/types/src/theme/components/dialog.d.ts +0 -17
  82. package/dist/types/src/theme/components/dialog.d.ts.map +0 -1
  83. package/dist/types/src/theme/components/focus.d.ts +0 -6
  84. package/dist/types/src/theme/components/focus.d.ts.map +0 -1
  85. package/dist/types/src/theme/components/icon-button.d.ts +0 -8
  86. package/dist/types/src/theme/components/icon-button.d.ts.map +0 -1
  87. package/dist/types/src/theme/components/icon.d.ts +0 -10
  88. package/dist/types/src/theme/components/icon.d.ts.map +0 -1
  89. package/dist/types/src/theme/components/index.d.ts +0 -27
  90. package/dist/types/src/theme/components/index.d.ts.map +0 -1
  91. package/dist/types/src/theme/components/input.d.ts +0 -115
  92. package/dist/types/src/theme/components/input.d.ts.map +0 -1
  93. package/dist/types/src/theme/components/link.d.ts +0 -7
  94. package/dist/types/src/theme/components/link.d.ts.map +0 -1
  95. package/dist/types/src/theme/components/list.d.ts +0 -14
  96. package/dist/types/src/theme/components/list.d.ts.map +0 -1
  97. package/dist/types/src/theme/components/main.d.ts +0 -28
  98. package/dist/types/src/theme/components/main.d.ts.map +0 -1
  99. package/dist/types/src/theme/components/menu.d.ts +0 -13
  100. package/dist/types/src/theme/components/menu.d.ts.map +0 -1
  101. package/dist/types/src/theme/components/message.d.ts +0 -12
  102. package/dist/types/src/theme/components/message.d.ts.map +0 -1
  103. package/dist/types/src/theme/components/popover.d.ts +0 -11
  104. package/dist/types/src/theme/components/popover.d.ts.map +0 -1
  105. package/dist/types/src/theme/components/scroll-area.d.ts +0 -32
  106. package/dist/types/src/theme/components/scroll-area.d.ts.map +0 -1
  107. package/dist/types/src/theme/components/select.d.ts +0 -13
  108. package/dist/types/src/theme/components/select.d.ts.map +0 -1
  109. package/dist/types/src/theme/components/separator.d.ts +0 -8
  110. package/dist/types/src/theme/components/separator.d.ts.map +0 -1
  111. package/dist/types/src/theme/components/skeleton.d.ts +0 -7
  112. package/dist/types/src/theme/components/skeleton.d.ts.map +0 -1
  113. package/dist/types/src/theme/components/splitter.d.ts +0 -4
  114. package/dist/types/src/theme/components/splitter.d.ts.map +0 -1
  115. package/dist/types/src/theme/components/status.d.ts +0 -9
  116. package/dist/types/src/theme/components/status.d.ts.map +0 -1
  117. package/dist/types/src/theme/components/tag.d.ts +0 -7
  118. package/dist/types/src/theme/components/tag.d.ts.map +0 -1
  119. package/dist/types/src/theme/components/toast.d.ts +0 -12
  120. package/dist/types/src/theme/components/toast.d.ts.map +0 -1
  121. package/dist/types/src/theme/components/toolbar.d.ts +0 -11
  122. package/dist/types/src/theme/components/toolbar.d.ts.map +0 -1
  123. package/dist/types/src/theme/components/tooltip.d.ts +0 -8
  124. package/dist/types/src/theme/components/tooltip.d.ts.map +0 -1
  125. package/dist/types/src/theme/components/treegrid.d.ts +0 -10
  126. package/dist/types/src/theme/components/treegrid.d.ts.map +0 -1
  127. package/dist/types/src/theme/index.d.ts +0 -4
  128. package/dist/types/src/theme/index.d.ts.map +0 -1
  129. package/dist/types/src/theme/primitives/column.d.ts +0 -29
  130. package/dist/types/src/theme/primitives/column.d.ts.map +0 -1
  131. package/dist/types/src/theme/primitives/index.d.ts +0 -3
  132. package/dist/types/src/theme/primitives/index.d.ts.map +0 -1
  133. package/dist/types/src/theme/primitives/panel.d.ts +0 -13
  134. package/dist/types/src/theme/primitives/panel.d.ts.map +0 -1
  135. package/dist/types/src/theme/theme.d.ts +0 -5
  136. package/dist/types/src/theme/theme.d.ts.map +0 -1
  137. package/src/css/components/selected.css +0 -30
  138. package/src/theme/components/avatar.ts +0 -95
  139. package/src/theme/components/breadcrumb.ts +0 -29
  140. package/src/theme/components/button.ts +0 -48
  141. package/src/theme/components/card.ts +0 -102
  142. package/src/theme/components/dialog.ts +0 -61
  143. package/src/theme/components/focus.ts +0 -33
  144. package/src/theme/components/icon-button.ts +0 -18
  145. package/src/theme/components/icon.ts +0 -28
  146. package/src/theme/components/index.ts +0 -30
  147. package/src/theme/components/input.ts +0 -171
  148. package/src/theme/components/link.ts +0 -25
  149. package/src/theme/components/list.ts +0 -46
  150. package/src/theme/components/main.ts +0 -34
  151. package/src/theme/components/menu.ts +0 -50
  152. package/src/theme/components/message.ts +0 -40
  153. package/src/theme/components/popover.ts +0 -41
  154. package/src/theme/components/scroll-area.ts +0 -115
  155. package/src/theme/components/select.ts +0 -52
  156. package/src/theme/components/separator.ts +0 -24
  157. package/src/theme/components/skeleton.ts +0 -23
  158. package/src/theme/components/splitter.ts +0 -20
  159. package/src/theme/components/status.ts +0 -32
  160. package/src/theme/components/tag.ts +0 -23
  161. package/src/theme/components/toast.ts +0 -53
  162. package/src/theme/components/toolbar.ts +0 -35
  163. package/src/theme/components/tooltip.ts +0 -27
  164. package/src/theme/components/treegrid.ts +0 -37
  165. package/src/theme/index.ts +0 -7
  166. package/src/theme/primitives/column.ts +0 -71
  167. package/src/theme/primitives/index.ts +0 -6
  168. package/src/theme/primitives/panel.ts +0 -43
  169. package/src/theme/theme.ts +0 -87
@@ -1,145 +1,198 @@
1
1
  /**
2
- * Color styles
2
+ * Color styles.
3
+ *
4
+ * Roles:
5
+ * -bg background fill (e.g., button)
6
+ * -bg-hover hover background fill
7
+ * -fg foreground for text on surface
8
+ * -surface background for surface
9
+ * -text text on base surface
10
+ * -border border for surface
11
+ *
12
+ * Hue/role tokens: each hue exposes bg / bg-hover / surface / fg / text / border.
13
+ * `fg` is the on-color for a colored bg/surface; `text` is the hue as standalone
14
+ * colored text on the neutral background. Semantic names (primary, error, …) alias a source hue.
15
+ *
16
+ * These tokens are literal custom properties on disk (not expanded at PostCSS time) because
17
+ * several pipelines read the theme without our Vite plugin chain — notably Tailwind's
18
+ * `@reference "…/main.css"` loader used by the lit-* packages, and tailwindcss's design-system
19
+ * loader used in tests. Edit them here directly.
3
20
  */
4
21
 
5
22
  @theme {
6
23
  /*
7
- * Semantic
24
+ * Semantic — each name aliases a source hue.
8
25
  */
9
26
 
10
- --color-info-fill: var(--color-cyan-fill);
27
+ --color-primary-bg: var(--color-blue-bg);
28
+ --color-primary-bg-hover: var(--color-blue-bg-hover);
29
+ --color-primary-fg: var(--color-blue-fg);
30
+ --color-primary-surface: var(--color-blue-surface);
31
+ --color-primary-text: var(--color-blue-text);
32
+ --color-primary-border: var(--color-blue-border);
33
+
34
+ --color-secondary-bg: var(--color-green-bg);
35
+ --color-secondary-bg-hover: var(--color-green-bg-hover);
36
+ --color-secondary-fg: var(--color-green-fg);
37
+ --color-secondary-surface: var(--color-green-surface);
38
+ --color-secondary-text: var(--color-green-text);
39
+ --color-secondary-border: var(--color-green-border);
40
+
41
+ --color-info-bg: var(--color-cyan-bg);
42
+ --color-info-bg-hover: var(--color-cyan-bg-hover);
43
+ --color-info-fg: var(--color-cyan-fg);
11
44
  --color-info-surface: var(--color-cyan-surface);
12
- --color-info-surface-text: var(--color-cyan-surface-text);
13
45
  --color-info-text: var(--color-cyan-text);
14
46
  --color-info-border: var(--color-cyan-border);
15
47
 
16
- --color-success-fill: var(--color-emerald-fill);
48
+ --color-success-bg: var(--color-emerald-bg);
49
+ --color-success-bg-hover: var(--color-emerald-bg-hover);
50
+ --color-success-fg: var(--color-emerald-fg);
17
51
  --color-success-surface: var(--color-emerald-surface);
18
- --color-success-surface-text: var(--color-emerald-surface-text);
19
52
  --color-success-text: var(--color-emerald-text);
20
53
  --color-success-border: var(--color-emerald-border);
21
54
 
22
- --color-warning-fill: var(--color-amber-fill);
55
+ --color-warning-bg: var(--color-amber-bg);
56
+ --color-warning-bg-hover: var(--color-amber-bg-hover);
57
+ --color-warning-fg: var(--color-amber-fg);
23
58
  --color-warning-surface: var(--color-amber-surface);
24
- --color-warning-surface-text: var(--color-amber-surface-text);
25
59
  --color-warning-text: var(--color-amber-text);
26
60
  --color-warning-border: var(--color-amber-border);
27
61
 
28
- --color-error-fill: var(--color-rose-fill);
62
+ --color-error-bg: var(--color-rose-bg);
63
+ --color-error-bg-hover: var(--color-rose-bg-hover);
64
+ --color-error-fg: var(--color-rose-fg);
29
65
  --color-error-surface: var(--color-rose-surface);
30
- --color-error-surface-text: var(--color-rose-surface-text);
31
66
  --color-error-text: var(--color-rose-text);
32
67
  --color-error-border: var(--color-rose-border);
33
68
 
34
- /**
35
- * Hue
69
+ /*
70
+ * Hue.
36
71
  */
37
72
 
38
- --color-neutral-fill: light-dark(var(--color-neutral-300), var(--color-neutral-700));
39
- --color-neutral-surface: light-dark(var(--color-neutral-200), var(--color-neutral-800));
40
- --color-neutral-surface-text: light-dark(var(--color-neutral-800), var(--color-neutral-200));
41
- --color-neutral-text: light-dark(var(--color-neutral-700), var(--color-neutral-300));
42
- --color-neutral-border: light-dark(var(--color-neutral-400), var(--color-neutral-600));
43
-
44
- --color-red-fill: light-dark(var(--color-red-300), var(--color-red-700));
45
- --color-red-surface: light-dark(var(--color-red-200), var(--color-red-800));
46
- --color-red-surface-text: light-dark(var(--color-red-800), var(--color-red-200));
47
- --color-red-text: light-dark(var(--color-red-700), var(--color-red-300));
48
- --color-red-border: light-dark(var(--color-red-400), var(--color-red-600));
49
-
50
- --color-orange-fill: light-dark(var(--color-orange-300), var(--color-orange-700));
51
- --color-orange-surface: light-dark(var(--color-orange-200), var(--color-orange-800));
52
- --color-orange-surface-text: light-dark(var(--color-orange-800), var(--color-orange-200));
53
- --color-orange-text: light-dark(var(--color-orange-700), var(--color-orange-300));
54
- --color-orange-border: light-dark(var(--color-orange-400), var(--color-orange-600));
55
-
56
- --color-amber-fill: light-dark(var(--color-amber-300), var(--color-amber-700));
57
- --color-amber-surface: light-dark(var(--color-amber-200), var(--color-amber-800));
58
- --color-amber-surface-text: light-dark(var(--color-amber-800), var(--color-amber-200));
59
- --color-amber-text: light-dark(var(--color-amber-700), var(--color-amber-300));
60
- --color-amber-border: light-dark(var(--color-amber-400), var(--color-amber-600));
61
-
62
- --color-yellow-fill: light-dark(var(--color-yellow-300), var(--color-yellow-700));
63
- --color-yellow-surface: light-dark(var(--color-yellow-200), var(--color-yellow-800));
64
- --color-yellow-surface-text: light-dark(var(--color-yellow-800), var(--color-yellow-200));
65
- --color-yellow-text: light-dark(var(--color-yellow-700), var(--color-yellow-300));
66
- --color-yellow-border: light-dark(var(--color-yellow-400), var(--color-yellow-600));
67
-
68
- --color-lime-fill: light-dark(var(--color-lime-300), var(--color-lime-700));
69
- --color-lime-surface: light-dark(var(--color-lime-200), var(--color-lime-800));
70
- --color-lime-surface-text: light-dark(var(--color-lime-800), var(--color-lime-200));
71
- --color-lime-text: light-dark(var(--color-lime-700), var(--color-lime-300));
72
- --color-lime-border: light-dark(var(--color-lime-400), var(--color-lime-600));
73
-
74
- --color-green-fill: light-dark(var(--color-green-300), var(--color-green-700));
75
- --color-green-surface: light-dark(var(--color-green-200), var(--color-green-800));
76
- --color-green-surface-text: light-dark(var(--color-green-800), var(--color-green-200));
77
- --color-green-text: light-dark(var(--color-green-700), var(--color-green-300));
78
- --color-green-border: light-dark(var(--color-green-400), var(--color-green-600));
79
-
80
- --color-emerald-fill: light-dark(var(--color-emerald-300), var(--color-emerald-700));
81
- --color-emerald-surface: light-dark(var(--color-emerald-200), var(--color-emerald-800));
82
- --color-emerald-surface-text: light-dark(var(--color-emerald-800), var(--color-emerald-200));
83
- --color-emerald-text: light-dark(var(--color-emerald-700), var(--color-emerald-300));
84
- --color-emerald-border: light-dark(var(--color-emerald-400), var(--color-emerald-600));
85
-
86
- --color-teal-fill: light-dark(var(--color-teal-300), var(--color-teal-700));
87
- --color-teal-surface: light-dark(var(--color-teal-200), var(--color-teal-800));
88
- --color-teal-surface-text: light-dark(var(--color-teal-800), var(--color-teal-200));
89
- --color-teal-text: light-dark(var(--color-teal-700), var(--color-teal-300));
90
- --color-teal-border: light-dark(var(--color-teal-400), var(--color-teal-600));
91
-
92
- --color-cyan-fill: light-dark(var(--color-cyan-300), var(--color-cyan-700));
93
- --color-cyan-surface: light-dark(var(--color-cyan-200), var(--color-cyan-800));
94
- --color-cyan-surface-text: light-dark(var(--color-cyan-800), var(--color-cyan-200));
95
- --color-cyan-text: light-dark(var(--color-cyan-700), var(--color-cyan-300));
96
- --color-cyan-border: light-dark(var(--color-cyan-400), var(--color-cyan-600));
97
-
98
- --color-sky-fill: light-dark(var(--color-sky-300), var(--color-sky-700));
99
- --color-sky-surface: light-dark(var(--color-sky-200), var(--color-sky-800));
100
- --color-sky-surface-text: light-dark(var(--color-sky-800), var(--color-sky-200));
101
- --color-sky-text: light-dark(var(--color-sky-700), var(--color-sky-300));
102
- --color-sky-border: light-dark(var(--color-sky-400), var(--color-sky-600));
103
-
104
- --color-blue-fill: light-dark(var(--color-blue-300), var(--color-blue-700));
105
- --color-blue-surface: light-dark(var(--color-blue-200), var(--color-blue-800));
106
- --color-blue-surface-text: light-dark(var(--color-blue-800), var(--color-blue-200));
107
- --color-blue-text: light-dark(var(--color-blue-700), var(--color-blue-300));
108
- --color-blue-border: light-dark(var(--color-blue-400), var(--color-blue-600));
109
-
110
- --color-indigo-fill: light-dark(var(--color-indigo-300), var(--color-indigo-700));
111
- --color-indigo-surface: light-dark(var(--color-indigo-200), var(--color-indigo-800));
112
- --color-indigo-surface-text: light-dark(var(--color-indigo-800), var(--color-indigo-200));
113
- --color-indigo-text: light-dark(var(--color-indigo-700), var(--color-indigo-300));
114
- --color-indigo-border: light-dark(var(--color-indigo-400), var(--color-indigo-600));
115
-
116
- --color-violet-fill: light-dark(var(--color-violet-300), var(--color-violet-700));
117
- --color-violet-surface: light-dark(var(--color-violet-200), var(--color-violet-800));
118
- --color-violet-surface-text: light-dark(var(--color-violet-800), var(--color-violet-200));
119
- --color-violet-text: light-dark(var(--color-violet-700), var(--color-violet-300));
120
- --color-violet-border: light-dark(var(--color-violet-400), var(--color-violet-600));
121
-
122
- --color-purple-fill: light-dark(var(--color-purple-300), var(--color-purple-700));
123
- --color-purple-surface: light-dark(var(--color-purple-200), var(--color-purple-800));
124
- --color-purple-surface-text: light-dark(var(--color-purple-800), var(--color-purple-200));
125
- --color-purple-text: light-dark(var(--color-purple-700), var(--color-purple-300));
126
- --color-purple-border: light-dark(var(--color-purple-400), var(--color-purple-600));
127
-
128
- --color-fuchsia-fill: light-dark(var(--color-fuchsia-300), var(--color-fuchsia-700));
129
- --color-fuchsia-surface: light-dark(var(--color-fuchsia-200), var(--color-fuchsia-800));
130
- --color-fuchsia-surface-text: light-dark(var(--color-fuchsia-800), var(--color-fuchsia-200));
131
- --color-fuchsia-text: light-dark(var(--color-fuchsia-700), var(--color-fuchsia-300));
132
- --color-fuchsia-border: light-dark(var(--color-fuchsia-400), var(--color-fuchsia-600));
133
-
134
- --color-pink-fill: light-dark(var(--color-pink-300), var(--color-pink-700));
135
- --color-pink-surface: light-dark(var(--color-pink-200), var(--color-pink-800));
136
- --color-pink-surface-text: light-dark(var(--color-pink-800), var(--color-pink-200));
137
- --color-pink-text: light-dark(var(--color-pink-700), var(--color-pink-300));
138
- --color-pink-border: light-dark(var(--color-pink-400), var(--color-pink-600));
139
-
140
- --color-rose-fill: light-dark(var(--color-rose-300), var(--color-rose-700));
141
- --color-rose-surface: light-dark(var(--color-rose-200), var(--color-rose-800));
142
- --color-rose-surface-text: light-dark(var(--color-rose-800), var(--color-rose-200));
143
- --color-rose-text: light-dark(var(--color-rose-700), var(--color-rose-300));
144
- --color-rose-border: light-dark(var(--color-rose-400), var(--color-rose-600));
73
+ --color-neutral-bg: var(--color-neutral-600);
74
+ --color-neutral-bg-hover: var(--color-neutral-700);
75
+ --color-neutral-fg: var(--color-neutral-900);
76
+ --color-neutral-surface: var(--color-neutral-400);
77
+ --color-neutral-text: light-dark(var(--color-neutral-800), var(--color-neutral-500));
78
+ --color-neutral-border: var(--color-neutral-600);
79
+
80
+ --color-red-bg: var(--color-red-600);
81
+ --color-red-bg-hover: var(--color-red-700);
82
+ --color-red-fg: var(--color-red-900);
83
+ --color-red-surface: var(--color-red-400);
84
+ --color-red-text: light-dark(var(--color-red-800), var(--color-red-500));
85
+ --color-red-border: var(--color-red-600);
86
+
87
+ --color-orange-bg: var(--color-orange-600);
88
+ --color-orange-bg-hover: var(--color-orange-700);
89
+ --color-orange-fg: var(--color-orange-900);
90
+ --color-orange-surface: var(--color-orange-400);
91
+ --color-orange-text: light-dark(var(--color-orange-800), var(--color-orange-500));
92
+ --color-orange-border: var(--color-orange-600);
93
+
94
+ --color-amber-bg: var(--color-amber-600);
95
+ --color-amber-bg-hover: var(--color-amber-700);
96
+ --color-amber-fg: var(--color-amber-900);
97
+ --color-amber-surface: var(--color-amber-400);
98
+ --color-amber-text: light-dark(var(--color-amber-800), var(--color-amber-500));
99
+ --color-amber-border: var(--color-amber-600);
100
+
101
+ --color-yellow-bg: var(--color-yellow-600);
102
+ --color-yellow-bg-hover: var(--color-yellow-700);
103
+ --color-yellow-fg: var(--color-yellow-900);
104
+ --color-yellow-surface: var(--color-yellow-400);
105
+ --color-yellow-text: light-dark(var(--color-yellow-800), var(--color-yellow-500));
106
+ --color-yellow-border: var(--color-yellow-600);
107
+
108
+ --color-lime-bg: var(--color-lime-600);
109
+ --color-lime-bg-hover: var(--color-lime-700);
110
+ --color-lime-fg: var(--color-lime-900);
111
+ --color-lime-surface: var(--color-lime-400);
112
+ --color-lime-text: light-dark(var(--color-lime-800), var(--color-lime-500));
113
+ --color-lime-border: var(--color-lime-600);
114
+
115
+ --color-green-bg: var(--color-green-600);
116
+ --color-green-bg-hover: var(--color-green-700);
117
+ --color-green-fg: var(--color-green-900);
118
+ --color-green-surface: var(--color-green-400);
119
+ --color-green-text: light-dark(var(--color-green-800), var(--color-green-500));
120
+ --color-green-border: var(--color-green-600);
121
+
122
+ --color-emerald-bg: var(--color-emerald-600);
123
+ --color-emerald-bg-hover: var(--color-emerald-700);
124
+ --color-emerald-fg: var(--color-emerald-900);
125
+ --color-emerald-surface: var(--color-emerald-400);
126
+ --color-emerald-text: light-dark(var(--color-emerald-800), var(--color-emerald-500));
127
+ --color-emerald-border: var(--color-emerald-600);
128
+
129
+ --color-teal-bg: var(--color-teal-600);
130
+ --color-teal-bg-hover: var(--color-teal-700);
131
+ --color-teal-fg: var(--color-teal-900);
132
+ --color-teal-surface: var(--color-teal-400);
133
+ --color-teal-text: light-dark(var(--color-teal-800), var(--color-teal-500));
134
+ --color-teal-border: var(--color-teal-600);
135
+
136
+ --color-cyan-bg: var(--color-cyan-600);
137
+ --color-cyan-bg-hover: var(--color-cyan-700);
138
+ --color-cyan-fg: var(--color-cyan-900);
139
+ --color-cyan-surface: var(--color-cyan-400);
140
+ --color-cyan-text: light-dark(var(--color-cyan-800), var(--color-cyan-500));
141
+ --color-cyan-border: var(--color-cyan-600);
142
+
143
+ --color-sky-bg: var(--color-sky-600);
144
+ --color-sky-bg-hover: var(--color-sky-700);
145
+ --color-sky-fg: var(--color-sky-900);
146
+ --color-sky-surface: var(--color-sky-400);
147
+ --color-sky-text: light-dark(var(--color-sky-800), var(--color-sky-500));
148
+ --color-sky-border: var(--color-sky-600);
149
+
150
+ --color-blue-bg: var(--color-blue-600);
151
+ --color-blue-bg-hover: var(--color-blue-700);
152
+ --color-blue-fg: var(--color-blue-900);
153
+ --color-blue-surface: var(--color-blue-400);
154
+ --color-blue-text: light-dark(var(--color-blue-800), var(--color-blue-500));
155
+ --color-blue-border: var(--color-blue-600);
156
+
157
+ --color-indigo-bg: var(--color-indigo-600);
158
+ --color-indigo-bg-hover: var(--color-indigo-700);
159
+ --color-indigo-fg: var(--color-indigo-900);
160
+ --color-indigo-surface: var(--color-indigo-400);
161
+ --color-indigo-text: light-dark(var(--color-indigo-800), var(--color-indigo-500));
162
+ --color-indigo-border: var(--color-indigo-600);
163
+
164
+ --color-violet-bg: var(--color-violet-600);
165
+ --color-violet-bg-hover: var(--color-violet-700);
166
+ --color-violet-fg: var(--color-violet-900);
167
+ --color-violet-surface: var(--color-violet-400);
168
+ --color-violet-text: light-dark(var(--color-violet-800), var(--color-violet-500));
169
+ --color-violet-border: var(--color-violet-600);
170
+
171
+ --color-purple-bg: var(--color-purple-600);
172
+ --color-purple-bg-hover: var(--color-purple-700);
173
+ --color-purple-fg: var(--color-purple-900);
174
+ --color-purple-surface: var(--color-purple-400);
175
+ --color-purple-text: light-dark(var(--color-purple-800), var(--color-purple-500));
176
+ --color-purple-border: var(--color-purple-600);
177
+
178
+ --color-fuchsia-bg: var(--color-fuchsia-600);
179
+ --color-fuchsia-bg-hover: var(--color-fuchsia-700);
180
+ --color-fuchsia-fg: var(--color-fuchsia-900);
181
+ --color-fuchsia-surface: var(--color-fuchsia-400);
182
+ --color-fuchsia-text: light-dark(var(--color-fuchsia-800), var(--color-fuchsia-500));
183
+ --color-fuchsia-border: var(--color-fuchsia-600);
184
+
185
+ --color-pink-bg: var(--color-pink-600);
186
+ --color-pink-bg-hover: var(--color-pink-700);
187
+ --color-pink-fg: var(--color-pink-900);
188
+ --color-pink-surface: var(--color-pink-400);
189
+ --color-pink-text: light-dark(var(--color-pink-800), var(--color-pink-500));
190
+ --color-pink-border: var(--color-pink-600);
191
+
192
+ --color-rose-bg: var(--color-rose-600);
193
+ --color-rose-bg-hover: var(--color-rose-700);
194
+ --color-rose-fg: var(--color-rose-900);
195
+ --color-rose-surface: var(--color-rose-400);
196
+ --color-rose-text: light-dark(var(--color-rose-800), var(--color-rose-500));
197
+ --color-rose-border: var(--color-rose-600);
145
198
  }
@@ -74,3 +74,45 @@
74
74
  @apply relative after:content-[""] after:absolute after:inset-0 after:rounded-[inherit]
75
75
  after:pointer-events-none after:ring after:ring-inset after:ring-transparent;
76
76
  }
77
+
78
+ /**
79
+ * Shimmer text — animates opacity left → right across the contained text.
80
+ * See @keyframes shimmer-text in theme/animation.css for the keyframe definition.
81
+ * Geometry: mask-size 200% 100% with mask-repeat: repeat-x means each tile is
82
+ * 2× the element width; the keyframe slides mask-position-x by 200% (one full
83
+ * tile period), giving a seamless loop. The 5-stop gradient (0.4 → 1.0 → 0.4)
84
+ * produces a single bright pulse per cycle that traverses left → right during
85
+ * the first half, with a brief calm interval during the second half.
86
+ */
87
+ @utility shimmer-text {
88
+ mask-image: linear-gradient(
89
+ 90deg,
90
+ rgba(0, 0, 0, 0.4) 0%,
91
+ rgba(0, 0, 0, 0.4) 30%,
92
+ rgba(0, 0, 0, 1) 50%,
93
+ rgba(0, 0, 0, 0.4) 70%,
94
+ rgba(0, 0, 0, 0.4) 100%
95
+ );
96
+ -webkit-mask-image: linear-gradient(
97
+ 90deg,
98
+ rgba(0, 0, 0, 0.4) 0%,
99
+ rgba(0, 0, 0, 0.4) 30%,
100
+ rgba(0, 0, 0, 1) 50%,
101
+ rgba(0, 0, 0, 0.4) 70%,
102
+ rgba(0, 0, 0, 0.4) 100%
103
+ );
104
+ mask-size: 200% 100%;
105
+ -webkit-mask-size: 200% 100%;
106
+ mask-repeat: repeat-x;
107
+ -webkit-mask-repeat: repeat-x;
108
+ animation: shimmer-text 2s linear infinite;
109
+ }
110
+
111
+ @media (prefers-reduced-motion: reduce) {
112
+ .shimmer-text {
113
+ animation: none;
114
+ mask-image: none;
115
+ -webkit-mask-image: none;
116
+ opacity: 0.6;
117
+ }
118
+ }
package/src/defs.ts CHANGED
@@ -34,7 +34,9 @@ export const hues: ChromaticPalette[] = [
34
34
 
35
35
  export const hueShades = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;
36
36
 
37
- export const roles = ['fill', 'surface', 'surface-text', 'text', 'border'] as const;
37
+ // NOTE: These are the JS-side style-API role keys (see ColorStyles in util/hash-styles.ts), kept
38
+ // distinct from the renamed CSS custom-property suffixes (`-bg`/`-fg`).
39
+ export const roles = ['fill', 'surface', 'foreground', 'text', 'border'] as const;
38
40
 
39
41
  /**
40
42
  * Card size constants (Tailwind spacing units).
@@ -16,7 +16,6 @@ External packages importing fragment definitions from `ui-theme/src/fragments`.
16
16
  | `focus.ts` | `focusRing` | 2 | 5 |
17
17
  | `focus.ts` | `subduedFocus` | - | 2 |
18
18
  | `focus.ts` | `staticFocusRing` | - | 1 |
19
- | `hover.ts` | `subtleHover` | 4 | - |
20
19
  | `hover.ts` | `ghostHover` | 8 | 2 |
21
20
  | `hover.ts` | `ghostFocusWithin` | 1 | - |
22
21
  | `hover.ts` | `hoverableControls` | 9 | - |
@@ -53,5 +52,4 @@ External packages importing fragment definitions from `ui-theme/src/fragments`.
53
52
 
54
53
  **Completely unused:** 7 fragments
55
54
 
56
- - `subtleHover` from `hover.ts`
57
55
  - `hoverableOpenControlItem`, `groupHoverControlItemWithTransition` from `hover.ts` (only 2-3 uses)
@@ -4,13 +4,40 @@
4
4
 
5
5
  import { type Density } from '@dxos/ui-types';
6
6
 
7
- const fineBlockSize = 'min-h-[2.5rem] pointer-fine:min-h-[2rem]';
8
- const coarseBlockSize = 'min-h-[2.5rem]';
7
+ const lgBlockSize = 'min-h-[2.5rem]';
8
+ const mdBlockSize = 'min-h-[2.5rem] pointer-fine:min-h-[2rem]';
9
+ const smBlockSize = 'min-h-[1.75rem]';
10
+ const xsBlockSize = 'min-h-[1.5rem]';
9
11
 
10
- const fineDimensions = `${fineBlockSize} px-2`;
11
- const coarseDimensions = `${coarseBlockSize} px-3`;
12
+ const lgDimensions = `${lgBlockSize} px-3`;
13
+ const mdDimensions = `${mdBlockSize} px-2`;
14
+ const smDimensions = `${smBlockSize} px-1.5`;
15
+ const xsDimensions = `${xsBlockSize} px-1`;
12
16
 
13
- export const densityDimensions = (density: Density = 'fine') =>
14
- density === 'fine' ? fineDimensions : coarseDimensions;
17
+ export const densityDimensions = (density: Density = 'md') => {
18
+ switch (density) {
19
+ case 'lg':
20
+ return lgDimensions;
21
+ case 'sm':
22
+ return smDimensions;
23
+ case 'xs':
24
+ return xsDimensions;
25
+ case 'md':
26
+ default:
27
+ return mdDimensions;
28
+ }
29
+ };
15
30
 
16
- export const densityBlockSize = (density: Density = 'fine') => (density === 'fine' ? fineBlockSize : coarseBlockSize);
31
+ export const densityBlockSize = (density: Density = 'md') => {
32
+ switch (density) {
33
+ case 'lg':
34
+ return lgBlockSize;
35
+ case 'sm':
36
+ return smBlockSize;
37
+ case 'xs':
38
+ return xsBlockSize;
39
+ case 'md':
40
+ default:
41
+ return mdBlockSize;
42
+ }
43
+ };
@@ -2,8 +2,6 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- export const subtleHover = 'hover:bg-hover-overlay';
6
-
7
5
  export const ghostHover = 'hover:bg-hover-surface';
8
6
  export const ghostFocusWithin = 'focus-within:bg-hover-surface';
9
7
 
package/src/index.ts CHANGED
@@ -4,5 +4,5 @@
4
4
 
5
5
  export * from './defs';
6
6
  export * from './fragments';
7
- export * from './theme';
7
+
8
8
  export * from './util';
package/src/main.css CHANGED
@@ -11,7 +11,17 @@
11
11
  */
12
12
  @layer properties, theme, dx-tokens, user-tokens, base, tw-base, dx-base, components, tw-components, dx-components, utilities;
13
13
 
14
- @import 'tailwindcss';
14
+ /**
15
+ * `source(none)` disables Tailwind 4's automatic content discovery (which
16
+ * scans the project root, including `publicDir`). With auto-detection on,
17
+ * every write to `public/icons.svg` from `vite-plugin-icons` triggers a
18
+ * Tailwind CSS regeneration, which invalidates `main.css` through its
19
+ * import graph and produces a 3–5-ping HMR storm per icon-sprite write
20
+ * during cold-start (icons land in tight bursts as plugin chunks stream
21
+ * in). Explicit `@source` directives below replace the auto-scan with a
22
+ * stable, source-only set.
23
+ */
24
+ @import 'tailwindcss' source(none);
15
25
 
16
26
  /* @theme extensions */
17
27
  @import './css/theme/animation.css';
@@ -28,6 +38,7 @@
28
38
 
29
39
  /* @layer dx-components (components) */
30
40
  @import './css/components/button.css';
41
+ @import './css/components/card.css';
31
42
  @import './css/components/checkbox.css';
32
43
  @import './css/components/dialog.css';
33
44
  @import './css/components/focus.css';
@@ -35,7 +46,7 @@
35
46
  @import './css/components/panel.css';
36
47
  @import './css/components/link.css';
37
48
  @import './css/components/scrollbar.css';
38
- @import './css/components/selected.css';
49
+ @import './css/components/state.css';
39
50
  @import './css/components/surface.css';
40
51
  @import './css/components/tag.css';
41
52
  @import './css/components/text.css';
@@ -54,15 +65,63 @@
54
65
  @import './css/integrations/tldraw.css';
55
66
 
56
67
  /**
57
- * Force-emit CSS variables for the full color palette for all:
68
+ * With `source(none)` on the Tailwind import above, these are the *only*
69
+ * paths Tailwind scans for utility classes. Cover every workspace source
70
+ * directory so lazy-loaded plugin / UI / SDK chunks don't surface new
71
+ * utilities mid-session, and root-level HTML entrypoints (index.html,
72
+ * internal.html, …) are visible too.
73
+ *
74
+ * Paths are relative to this file (`packages/ui/ui-theme/src/main.css`):
75
+ * ../../../ → `packages/`
76
+ * ../../../../tools/ → `tools/`
77
+ *
78
+ * Tailwind ignores `node_modules` and common build/output dirs by default,
79
+ * so a broad workspace glob is safe *for scanning*.
80
+ *
81
+ * NOTE: Tailwind's scanner respects `.gitignore` (so `dist/` is never
82
+ * scanned), but it hands Vite a coarse `dir-dependency` glob and Vite
83
+ * re-expands that itself, ignoring only `node_modules`. That re-expansion
84
+ * sweeps `dist/**` `.d.ts` files into the watch set and causes a `main.css`
85
+ * HMR storm on every package rebuild. Build outputs are excluded from the
86
+ * dev watcher in `plugins/ThemePlugin.ts` (`server.watch.ignored`) rather
87
+ * than here, because `@source not` does NOT propagate to the glob Vite
88
+ * re-expands.
89
+ */
90
+ @source '../../../**/*.{ts,tsx,html}';
91
+ @source '../../../../tools/**/*.{ts,tsx,html}';
92
+
93
+ /**
94
+ * Exclude generated/static data files that have no Tailwind classes but are
95
+ * large enough to dominate scan time. The oxide scanner tokenizes every byte;
96
+ * a single 5MB geo-data file can pin Vite at 100% CPU for tens of seconds on
97
+ * a cold start.
98
+ */
99
+ @source not '../../../ui/react-ui-geo/data/**';
100
+ @source not '../../../ui/solid-ui-geo/data/**';
101
+ @source not '../../../apps/composer-app/src/plugins/welcome/components/Welcome/hero-image.ts';
102
+
103
+ /**
104
+ * Force-emit CSS variables for the full color palette for all:
58
105
  * --color-{hue}-{shade}
59
106
  * --color-{hue}-{style}
60
107
  */
61
- @source inline("bg-{neutral,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,100,200,300,400,500,600,700,800,900,950}");
62
- @source inline("bg-{neutral,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{fill,surface,surface-text,text,border}");
63
- @source inline("border-{neutral,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-border");
64
- @source inline("bg-{info,success,warning,error}-{fill,surface,surface-text,text,border}");
65
- @source inline("border-{info,success,warning,error}-border");
108
+ @source inline('bg-{neutral,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{50,100,200,300,400,500,600,700,800,900,950}');
109
+ @source inline('bg-{neutral,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-{bg,bg-hover,fg,surface,text,border}');
110
+ @source inline('bg-{primary,secondary}-{50,100,200,300,400,500,600,700,800,900,950}');
111
+ @source inline('border-{neutral,red,orange,amber,yellow,lime,green,emerald,teal,cyan,sky,blue,indigo,violet,purple,fuchsia,pink,rose}-border');
112
+ @source inline('bg-{info,success,warning,error}-{bg,surface,fg,text,border}');
113
+ @source inline('border-{info,success,warning,error}-border');
114
+
115
+ /**
116
+ * Force-emit tokens consumed by web components / .pcss files outside the
117
+ * Tailwind source-scan graph (e.g. lit-grid's dx-grid.pcss uses var(--color-grid-line)).
118
+ */
119
+ @source inline('bg-grid-{surface,fg,line,highlight,comment,comment-active,selection-surface,selection-fg}');
120
+ /*
121
+ * Sidebar surfaces alias each other (e.g. header-surface -> l0-surface); force-emit so the vars
122
+ * exist in apps that use the alias but not the underlying utility (e.g. devtools).
123
+ */
124
+ @source inline('bg-{l0,r0,l1,r1}-surface');
66
125
 
67
126
  /**
68
127
  * Plugins must come after all imports.
@@ -84,4 +143,4 @@
84
143
  /** Supports mouse/trackpad (Web) */
85
144
  @custom-variant hover-hover (@media (hover: hover));
86
145
  /** Active navigation */
87
- @custom-variant is-current (&[aria-current]:not([aria-current="false"]));
146
+ @custom-variant is-current (&[aria-current]:not([aria-current='false']));