@adea-ai/ui 0.61.0 → 0.61.1

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 (248) hide show
  1. package/dist/r/accordion.json +3 -1
  2. package/dist/r/account-menu.json +2 -1
  3. package/dist/r/alert-dialog.json +3 -1
  4. package/dist/r/alert.json +3 -1
  5. package/dist/r/app-shell.json +3 -1
  6. package/dist/r/aspect-ratio.json +3 -1
  7. package/dist/r/avatar.json +3 -1
  8. package/dist/r/badge.json +3 -1
  9. package/dist/r/board.json +3 -1
  10. package/dist/r/breadcrumb.json +3 -1
  11. package/dist/r/button-group.json +2 -1
  12. package/dist/r/button.json +3 -1
  13. package/dist/r/calendar.json +2 -1
  14. package/dist/r/card.json +3 -1
  15. package/dist/r/carousel.json +2 -1
  16. package/dist/r/chart.json +3 -1
  17. package/dist/r/checkbox.json +3 -1
  18. package/dist/r/code-block.json +2 -1
  19. package/dist/r/collapsible.json +3 -1
  20. package/dist/r/combobox.json +3 -1
  21. package/dist/r/command.json +3 -1
  22. package/dist/r/context-menu.json +3 -1
  23. package/dist/r/conversation.json +2 -1
  24. package/dist/r/detail-panel.json +2 -1
  25. package/dist/r/dialog.json +3 -1
  26. package/dist/r/diff-block.json +3 -1
  27. package/dist/r/drawer.json +3 -1
  28. package/dist/r/dropdown-menu.json +3 -1
  29. package/dist/r/empty.json +3 -1
  30. package/dist/r/entity-icon.json +3 -1
  31. package/dist/r/field.json +3 -1
  32. package/dist/r/hover-card.json +3 -1
  33. package/dist/r/input-group.json +3 -1
  34. package/dist/r/input-otp.json +3 -1
  35. package/dist/r/input.json +3 -1
  36. package/dist/r/item.json +3 -1
  37. package/dist/r/kbd.json +3 -1
  38. package/dist/r/label.json +3 -1
  39. package/dist/r/lib.json +50 -0
  40. package/dist/r/list-row.json +3 -1
  41. package/dist/r/menubar.json +3 -1
  42. package/dist/r/modal-dialog.json +2 -1
  43. package/dist/r/motion.json +22 -0
  44. package/dist/r/navigation-menu.json +3 -1
  45. package/dist/r/page.json +3 -1
  46. package/dist/r/pagination.json +3 -1
  47. package/dist/r/panel.json +3 -1
  48. package/dist/r/popover.json +3 -1
  49. package/dist/r/progress.json +3 -1
  50. package/dist/r/radio-group.json +3 -1
  51. package/dist/r/registry.json +320 -73
  52. package/dist/r/resizable.json +3 -1
  53. package/dist/r/scroll-area.json +3 -1
  54. package/dist/r/select.json +3 -1
  55. package/dist/r/separator.json +3 -1
  56. package/dist/r/settings.json +3 -1
  57. package/dist/r/sheet.json +2 -1
  58. package/dist/r/side-rail.json +3 -1
  59. package/dist/r/sidebar-nav.json +3 -1
  60. package/dist/r/skeleton.json +3 -1
  61. package/dist/r/slider.json +3 -1
  62. package/dist/r/spinner.json +3 -1
  63. package/dist/r/src/components/composites/account-menu/account-menu.tsx +150 -0
  64. package/dist/r/src/components/composites/account-menu/index.ts +1 -0
  65. package/dist/r/src/components/composites/list-row/index.ts +1 -0
  66. package/dist/r/src/components/composites/list-row/list-row.tsx +116 -0
  67. package/dist/r/src/components/composites/settings/index.ts +1 -0
  68. package/dist/r/src/components/composites/settings/settings.tsx +142 -0
  69. package/dist/r/src/components/composites/stat/index.ts +9 -0
  70. package/dist/r/src/components/composites/stat/stat.tsx +155 -0
  71. package/dist/r/src/components/composites/update-dialog/index.ts +7 -0
  72. package/dist/r/src/components/composites/update-dialog/update-dialog.tsx +529 -0
  73. package/dist/r/src/components/composites/workspace-mark/index.ts +1 -0
  74. package/dist/r/src/components/composites/workspace-mark/workspace-mark.tsx +72 -0
  75. package/dist/r/src/components/conversation/conversation-avatar.tsx +60 -0
  76. package/dist/r/src/components/conversation/conversation-surface.tsx +107 -0
  77. package/dist/r/src/components/conversation/index.ts +25 -0
  78. package/dist/r/src/components/conversation/message-composer.tsx +239 -0
  79. package/dist/r/src/components/conversation/message-row.tsx +387 -0
  80. package/dist/r/src/components/conversation/thread-panel.tsx +141 -0
  81. package/dist/r/src/components/layout/app-shell/app-shell.tsx +92 -0
  82. package/dist/r/src/components/layout/app-shell/index.ts +1 -0
  83. package/dist/r/src/components/layout/page/index.ts +9 -0
  84. package/dist/r/src/components/layout/page/page.tsx +122 -0
  85. package/dist/r/src/components/layout/panel/index.ts +12 -0
  86. package/dist/r/src/components/layout/panel/panel.tsx +166 -0
  87. package/dist/r/src/components/layout/side-rail/index.ts +12 -0
  88. package/dist/r/src/components/layout/side-rail/side-rail-context.ts +42 -0
  89. package/dist/r/src/components/layout/side-rail/side-rail.tsx +405 -0
  90. package/dist/r/src/components/layout/sidebar-nav/index.ts +14 -0
  91. package/dist/r/src/components/layout/sidebar-nav/sidebar-nav.tsx +244 -0
  92. package/dist/r/src/components/layout/status-bar/index.ts +1 -0
  93. package/dist/r/src/components/layout/status-bar/status-bar.tsx +73 -0
  94. package/dist/r/src/components/layout/top-bar/index.ts +10 -0
  95. package/dist/r/src/components/layout/top-bar/top-bar.tsx +166 -0
  96. package/dist/r/src/components/motion/index.ts +2 -0
  97. package/dist/r/src/components/motion/presence.tsx +32 -0
  98. package/dist/r/src/components/theme/appearance-panel.tsx +179 -0
  99. package/dist/r/src/components/theme/index.ts +22 -0
  100. package/dist/r/src/components/theme/theme-picker.tsx +174 -0
  101. package/dist/r/src/components/theme/theme-provider.tsx +309 -0
  102. package/dist/r/src/components/theme/theme-toggle.tsx +64 -0
  103. package/dist/r/src/components/ui/accordion/accordion.tsx +66 -0
  104. package/dist/r/src/components/ui/accordion/index.ts +1 -0
  105. package/dist/r/src/components/ui/alert/alert.tsx +95 -0
  106. package/dist/r/src/components/ui/alert/index.ts +1 -0
  107. package/dist/r/src/components/ui/alert-dialog/alert-dialog.tsx +176 -0
  108. package/dist/r/src/components/ui/alert-dialog/index.ts +13 -0
  109. package/dist/r/src/components/ui/aspect-ratio/aspect-ratio.tsx +38 -0
  110. package/dist/r/src/components/ui/aspect-ratio/index.ts +1 -0
  111. package/dist/r/src/components/ui/avatar/avatar.tsx +114 -0
  112. package/dist/r/src/components/ui/avatar/index.ts +9 -0
  113. package/dist/r/src/components/ui/badge/badge.tsx +59 -0
  114. package/dist/r/src/components/ui/badge/index.ts +1 -0
  115. package/dist/r/src/components/ui/board/board.tsx +254 -0
  116. package/dist/r/src/components/ui/board/index.ts +10 -0
  117. package/dist/r/src/components/ui/breadcrumb/breadcrumb.tsx +117 -0
  118. package/dist/r/src/components/ui/breadcrumb/index.ts +9 -0
  119. package/dist/r/src/components/ui/button/button.tsx +89 -0
  120. package/dist/r/src/components/ui/button/index.ts +1 -0
  121. package/dist/r/src/components/ui/button-group/button-group.tsx +92 -0
  122. package/dist/r/src/components/ui/button-group/index.ts +6 -0
  123. package/dist/r/src/components/ui/calendar/calendar.tsx +277 -0
  124. package/dist/r/src/components/ui/calendar/index.ts +1 -0
  125. package/dist/r/src/components/ui/card/card.tsx +82 -0
  126. package/dist/r/src/components/ui/card/index.ts +10 -0
  127. package/dist/r/src/components/ui/carousel/carousel.tsx +209 -0
  128. package/dist/r/src/components/ui/carousel/index.ts +1 -0
  129. package/dist/r/src/components/ui/chart/chart.tsx +413 -0
  130. package/dist/r/src/components/ui/chart/index.ts +17 -0
  131. package/dist/r/src/components/ui/checkbox/checkbox.tsx +99 -0
  132. package/dist/r/src/components/ui/checkbox/index.ts +1 -0
  133. package/dist/r/src/components/ui/code-block/code-block.tsx +238 -0
  134. package/dist/r/src/components/ui/code-block/index.ts +1 -0
  135. package/dist/r/src/components/ui/collapsible/collapsible.tsx +54 -0
  136. package/dist/r/src/components/ui/collapsible/index.ts +1 -0
  137. package/dist/r/src/components/ui/combobox/combobox.tsx +142 -0
  138. package/dist/r/src/components/ui/combobox/index.ts +10 -0
  139. package/dist/r/src/components/ui/command/command.tsx +214 -0
  140. package/dist/r/src/components/ui/command/index.ts +12 -0
  141. package/dist/r/src/components/ui/context-menu/context-menu.tsx +163 -0
  142. package/dist/r/src/components/ui/context-menu/index.ts +15 -0
  143. package/dist/r/src/components/ui/detail-panel/detail-panel.tsx +161 -0
  144. package/dist/r/src/components/ui/detail-panel/index.ts +9 -0
  145. package/dist/r/src/components/ui/dialog/dialog.tsx +138 -0
  146. package/dist/r/src/components/ui/dialog/index.ts +14 -0
  147. package/dist/r/src/components/ui/diff-block/diff-block.tsx +286 -0
  148. package/dist/r/src/components/ui/diff-block/index.ts +11 -0
  149. package/dist/r/src/components/ui/drawer/drawer.tsx +144 -0
  150. package/dist/r/src/components/ui/drawer/index.ts +13 -0
  151. package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +203 -0
  152. package/dist/r/src/components/ui/dropdown-menu/index.ts +18 -0
  153. package/dist/r/src/components/ui/empty/empty.tsx +104 -0
  154. package/dist/r/src/components/ui/empty/index.ts +10 -0
  155. package/dist/r/src/components/ui/entity-icon/entity-icon.tsx +154 -0
  156. package/dist/r/src/components/ui/entity-icon/index.ts +1 -0
  157. package/dist/r/src/components/ui/field/field.tsx +131 -0
  158. package/dist/r/src/components/ui/field/index.ts +11 -0
  159. package/dist/r/src/components/ui/hover-card/hover-card.tsx +48 -0
  160. package/dist/r/src/components/ui/hover-card/index.ts +1 -0
  161. package/dist/r/src/components/ui/input/index.ts +1 -0
  162. package/dist/r/src/components/ui/input/input.tsx +41 -0
  163. package/dist/r/src/components/ui/input-group/index.ts +8 -0
  164. package/dist/r/src/components/ui/input-group/input-group.tsx +111 -0
  165. package/dist/r/src/components/ui/input-otp/index.ts +1 -0
  166. package/dist/r/src/components/ui/input-otp/input-otp.tsx +108 -0
  167. package/dist/r/src/components/ui/item/index.ts +10 -0
  168. package/dist/r/src/components/ui/item/item.tsx +146 -0
  169. package/dist/r/src/components/ui/kbd/index.ts +1 -0
  170. package/dist/r/src/components/ui/kbd/kbd.tsx +42 -0
  171. package/dist/r/src/components/ui/label/index.ts +1 -0
  172. package/dist/r/src/components/ui/label/label.tsx +36 -0
  173. package/dist/r/src/components/ui/menubar/index.ts +16 -0
  174. package/dist/r/src/components/ui/menubar/menubar.tsx +190 -0
  175. package/dist/r/src/components/ui/modal-dialog/index.ts +1 -0
  176. package/dist/r/src/components/ui/modal-dialog/modal-dialog.tsx +95 -0
  177. package/dist/r/src/components/ui/navigation-menu/index.ts +13 -0
  178. package/dist/r/src/components/ui/navigation-menu/navigation-menu.tsx +229 -0
  179. package/dist/r/src/components/ui/pagination/index.ts +8 -0
  180. package/dist/r/src/components/ui/pagination/pagination.tsx +144 -0
  181. package/dist/r/src/components/ui/popover/index.ts +10 -0
  182. package/dist/r/src/components/ui/popover/popover.tsx +81 -0
  183. package/dist/r/src/components/ui/progress/index.ts +1 -0
  184. package/dist/r/src/components/ui/progress/progress.tsx +67 -0
  185. package/dist/r/src/components/ui/radio-group/index.ts +1 -0
  186. package/dist/r/src/components/ui/radio-group/radio-group.tsx +78 -0
  187. package/dist/r/src/components/ui/resizable/index.ts +6 -0
  188. package/dist/r/src/components/ui/resizable/resizable.tsx +74 -0
  189. package/dist/r/src/components/ui/scroll-area/index.ts +1 -0
  190. package/dist/r/src/components/ui/scroll-area/scroll-area.tsx +66 -0
  191. package/dist/r/src/components/ui/select/index.ts +11 -0
  192. package/dist/r/src/components/ui/select/select.tsx +188 -0
  193. package/dist/r/src/components/ui/separator/index.ts +1 -0
  194. package/dist/r/src/components/ui/separator/separator.tsx +40 -0
  195. package/dist/r/src/components/ui/sheet/index.ts +13 -0
  196. package/dist/r/src/components/ui/sheet/sheet.tsx +132 -0
  197. package/dist/r/src/components/ui/skeleton/index.ts +1 -0
  198. package/dist/r/src/components/ui/skeleton/skeleton.tsx +28 -0
  199. package/dist/r/src/components/ui/slider/index.ts +1 -0
  200. package/dist/r/src/components/ui/slider/slider.tsx +81 -0
  201. package/dist/r/src/components/ui/spinner/index.ts +1 -0
  202. package/dist/r/src/components/ui/spinner/spinner.tsx +58 -0
  203. package/dist/r/src/components/ui/status-chip/index.ts +8 -0
  204. package/dist/r/src/components/ui/status-chip/status-chip.tsx +142 -0
  205. package/dist/r/src/components/ui/switch/index.ts +1 -0
  206. package/dist/r/src/components/ui/switch/switch.tsx +100 -0
  207. package/dist/r/src/components/ui/table/index.ts +11 -0
  208. package/dist/r/src/components/ui/table/table.tsx +125 -0
  209. package/dist/r/src/components/ui/tabs/index.ts +8 -0
  210. package/dist/r/src/components/ui/tabs/tabs.tsx +77 -0
  211. package/dist/r/src/components/ui/textarea/index.ts +1 -0
  212. package/dist/r/src/components/ui/textarea/textarea.tsx +36 -0
  213. package/dist/r/src/components/ui/toast/index.ts +1 -0
  214. package/dist/r/src/components/ui/toast/toast.tsx +220 -0
  215. package/dist/r/src/components/ui/toggle/index.ts +1 -0
  216. package/dist/r/src/components/ui/toggle/toggle.tsx +60 -0
  217. package/dist/r/src/components/ui/toggle-group/index.ts +6 -0
  218. package/dist/r/src/components/ui/toggle-group/toggle-group.tsx +66 -0
  219. package/dist/r/src/components/ui/tooltip/index.ts +9 -0
  220. package/dist/r/src/components/ui/tooltip/tooltip.tsx +102 -0
  221. package/dist/r/src/lib/keyed-rows.ts +68 -0
  222. package/dist/r/src/lib/overlay.ts +70 -0
  223. package/dist/r/src/lib/themes.ts +490 -0
  224. package/dist/r/src/lib/tokens.ts +688 -0
  225. package/dist/r/src/lib/utils.ts +76 -0
  226. package/dist/r/src/lib/variants.ts +62 -0
  227. package/dist/r/src/lib/version-notes.ts +65 -0
  228. package/dist/r/src/styles/base.css +644 -0
  229. package/dist/r/src/styles/fonts.css +26 -0
  230. package/dist/r/src/styles/globals.css +18 -0
  231. package/dist/r/src/styles/theme.css +864 -0
  232. package/dist/r/stat.json +3 -1
  233. package/dist/r/status-bar.json +3 -1
  234. package/dist/r/status-chip.json +2 -1
  235. package/dist/r/switch.json +3 -1
  236. package/dist/r/table.json +3 -1
  237. package/dist/r/tabs.json +3 -1
  238. package/dist/r/textarea.json +3 -1
  239. package/dist/r/theming.json +42 -0
  240. package/dist/r/toast.json +3 -1
  241. package/dist/r/toggle-group.json +2 -1
  242. package/dist/r/toggle.json +3 -1
  243. package/dist/r/tooltip.json +3 -1
  244. package/dist/r/top-bar.json +3 -1
  245. package/dist/r/update-dialog.json +2 -1
  246. package/dist/r/workspace-mark.json +2 -1
  247. package/package.json +1 -1
  248. package/registry.json +320 -73
@@ -0,0 +1,644 @@
1
+ /* ============================================================================
2
+ * Adea base layer
3
+ * ============================================================================
4
+ *
5
+ * Framework-neutral CSS that the components depend on but that carries no
6
+ * token values (those live in `theme.css`):
7
+ *
8
+ * - the component-state variants Kobalte and corvu emit data attributes for
9
+ * - keyframes and entrance animations
10
+ * - the named utilities the design system exposes to consumers
11
+ * - the base layer: focus ring, scrollbars, selection, reduced-motion
12
+ *
13
+ * Everything here ships as CSS. Nothing in this file may be duplicated in a
14
+ * component's class list.
15
+ * ========================================================================== */
16
+
17
+ @import 'tw-animate-css';
18
+
19
+ /* --- State variants ------------------------------------------------------
20
+ * Kobalte and corvu communicate state through data attributes. Spelling the
21
+ * mapping once here means a component writes `data-open:opacity-100` and gets
22
+ * the right behaviour from either library.
23
+ * ------------------------------------------------------------------------ */
24
+ @custom-variant data-open {
25
+ &:where([data-state='open']),
26
+ &:where([data-open]:not([data-open='false'])) {
27
+ @slot;
28
+ }
29
+ }
30
+
31
+ @custom-variant data-closed {
32
+ &:where([data-state='closed']),
33
+ &:where([data-closed]:not([data-closed='false'])) {
34
+ @slot;
35
+ }
36
+ }
37
+
38
+ /* Kobalte marks every expanded disclosure and every open overlay with
39
+ `data-expanded`; the `data-state` spelling is kept too so a component
40
+ written against either protocol behaves the same. */
41
+ @custom-variant data-expanded {
42
+ &:where([data-state='expanded']),
43
+ &:where([data-expanded]:not([data-expanded='false'])) {
44
+ @slot;
45
+ }
46
+ }
47
+
48
+ @custom-variant data-checked {
49
+ &:where([data-state='checked']),
50
+ &:where([data-checked]:not([data-checked='false'])) {
51
+ @slot;
52
+ }
53
+ }
54
+
55
+ @custom-variant data-unchecked {
56
+ &:where([data-state='unchecked']),
57
+ &:where([data-unchecked]:not([data-unchecked='false'])) {
58
+ @slot;
59
+ }
60
+ }
61
+
62
+ @custom-variant data-selected {
63
+ &:where([data-selected='true']) {
64
+ @slot;
65
+ }
66
+ }
67
+
68
+ @custom-variant data-disabled {
69
+ &:where([data-disabled='true']),
70
+ &:where([data-disabled]:not([data-disabled='false'])) {
71
+ @slot;
72
+ }
73
+ }
74
+
75
+ @custom-variant data-highlighted {
76
+ &:where([data-highlighted]) {
77
+ @slot;
78
+ }
79
+ }
80
+
81
+ @custom-variant data-invalid {
82
+ &:where([data-invalid='true']),
83
+ &:where([data-invalid]:not([data-invalid='false'])) {
84
+ @slot;
85
+ }
86
+ }
87
+
88
+ @custom-variant data-active {
89
+ &:where([data-state='active']),
90
+ &:where([data-active]:not([data-active='false'])) {
91
+ @slot;
92
+ }
93
+ }
94
+
95
+ @custom-variant data-horizontal {
96
+ &:where([data-orientation='horizontal']) {
97
+ @slot;
98
+ }
99
+ }
100
+
101
+ @custom-variant data-vertical {
102
+ &:where([data-orientation='vertical']) {
103
+ @slot;
104
+ }
105
+ }
106
+
107
+ /* --- Keyframes -----------------------------------------------------------
108
+ * Entrances only. Exits reuse the same geometry inverted through
109
+ * `tw-animate-css`, and state changes use a transition rather than a keyframe
110
+ * so they stay interruptible.
111
+ * ------------------------------------------------------------------------ */
112
+ @theme inline {
113
+ @keyframes ds-rise {
114
+ from {
115
+ opacity: 0;
116
+ transform: translateY(8px);
117
+ }
118
+ to {
119
+ opacity: 1;
120
+ transform: translateY(0);
121
+ }
122
+ }
123
+
124
+ @keyframes ds-scale-in {
125
+ from {
126
+ opacity: 0;
127
+ transform: scale(0.96);
128
+ }
129
+ to {
130
+ opacity: 1;
131
+ transform: scale(1);
132
+ }
133
+ }
134
+
135
+ @keyframes ds-shimmer {
136
+ from {
137
+ background-position: 100% 0;
138
+ }
139
+ to {
140
+ background-position: 0 0;
141
+ }
142
+ }
143
+
144
+ @keyframes ds-indeterminate {
145
+ from {
146
+ transform: translateX(-100%);
147
+ }
148
+ to {
149
+ transform: translateX(400%);
150
+ }
151
+ }
152
+
153
+ @keyframes ds-caret {
154
+ 0%,
155
+ 100% {
156
+ opacity: 1;
157
+ }
158
+ 50% {
159
+ opacity: 0;
160
+ }
161
+ }
162
+ }
163
+
164
+ /* --- Named utilities ----------------------------------------------------- */
165
+
166
+ /**
167
+ * Visible to a screen reader, invisible on screen.
168
+ *
169
+ * This is the single most important utility in the system and it must be
170
+ * available in every build, which is why it lives here rather than in the
171
+ * optional stylesheet. `display: none` would remove the content from the
172
+ * accessibility tree as well; this clips it to a pixel instead, so the text is
173
+ * still announced, still translatable, and still reachable by find-in-page.
174
+ */
175
+ @utility visually-hidden {
176
+ position: absolute;
177
+ width: 1px;
178
+ height: 1px;
179
+ padding: 0;
180
+ margin: -1px;
181
+ overflow: hidden;
182
+ clip-path: inset(50%);
183
+ white-space: nowrap;
184
+ border-width: 0;
185
+ }
186
+
187
+ /**
188
+ * Reverses `visually-hidden` at a breakpoint, for a label that is only visible
189
+ * when there is room for it. Written as a companion because the two rules have
190
+ * to travel together to stay correct.
191
+ */
192
+ @utility visually-hidden-until-* {
193
+ @media (width >= --value(--breakpoint-*)) {
194
+ position: static;
195
+ width: auto;
196
+ height: auto;
197
+ padding: 0;
198
+ margin: 0;
199
+ overflow: visible;
200
+ clip-path: none;
201
+ white-space: normal;
202
+ }
203
+ }
204
+
205
+ @utility no-scrollbar {
206
+ -ms-overflow-style: none;
207
+ scrollbar-width: none;
208
+
209
+ &::-webkit-scrollbar {
210
+ display: none;
211
+ }
212
+ }
213
+
214
+ /**
215
+ * The drag region of a frameless desktop window.
216
+ *
217
+ * Both macOS and Windows need draggable chrome and both need the controls
218
+ * inside it to opt back out — otherwise a button in the title bar drags the
219
+ * window instead of pressing. Keeping the pair together keeps the opt-out next
220
+ * to the opt-in instead of in a platform switch.
221
+ */
222
+ @utility window-drag {
223
+ -webkit-app-region: drag;
224
+ app-region: drag;
225
+ }
226
+
227
+ @utility window-no-drag {
228
+ -webkit-app-region: no-drag;
229
+ app-region: no-drag;
230
+ }
231
+
232
+ /**
233
+ * Inset the shell clear of the native window controls: the macOS traffic-light
234
+ * cluster (84px) and the Windows caption overlay (142px).
235
+ *
236
+ * Applied to the top bar's inline padding so its content box is what remains,
237
+ * which is why the search field stays optically centred in the space the user
238
+ * can actually see rather than in the window.
239
+ */
240
+ @utility window-inset-macos {
241
+ padding-inline-start: 84px;
242
+ }
243
+
244
+ @utility window-inset-windows {
245
+ padding-inline-end: 142px;
246
+ }
247
+
248
+ /**
249
+ * iOS/macOS display-cutout and home-indicator insets, resolved once.
250
+ *
251
+ * `--safe-top` is deliberately 0 outside a standalone display: with browser
252
+ * chrome on screen the user agent's own bar already clears the status bar, so a
253
+ * non-zero `env()` there paints a dead band above the header.
254
+ */
255
+ @utility p-safe {
256
+ padding-top: var(--safe-top, env(safe-area-inset-top, 0px));
257
+ padding-right: env(safe-area-inset-right, 0px);
258
+ padding-bottom: env(safe-area-inset-bottom, 0px);
259
+ padding-left: env(safe-area-inset-left, 0px);
260
+ }
261
+
262
+ @utility pb-safe {
263
+ padding-bottom: env(safe-area-inset-bottom, 0px);
264
+ }
265
+
266
+ /**
267
+ * Truncate to one line inside a flex child.
268
+ *
269
+ * Tailwind's `truncate` is the same declaration; this exists as a named
270
+ * intent so a reviewer can see that `min-width: 0` — the part that is easy to
271
+ * forget and that makes the ellipsis actually appear inside a flex row — was
272
+ * deliberate rather than incidental.
273
+ */
274
+ @utility text-truncate {
275
+ overflow: hidden;
276
+ text-overflow: ellipsis;
277
+ white-space: nowrap;
278
+ min-width: 0;
279
+ }
280
+
281
+ /**
282
+ * A fade at the top and bottom edge of a scroll box, so a long list reads as
283
+ * continuing rather than ending at the fold.
284
+ */
285
+ @utility scroll-shadow-y {
286
+ -webkit-mask-image: linear-gradient(
287
+ to bottom,
288
+ transparent 0,
289
+ #000 2rem,
290
+ #000 calc(100% - 2rem),
291
+ transparent 100%
292
+ );
293
+ mask-image: linear-gradient(
294
+ to bottom,
295
+ transparent 0,
296
+ #000 2rem,
297
+ #000 calc(100% - 2rem),
298
+ transparent 100%
299
+ );
300
+ }
301
+
302
+ /**
303
+ * A hairline rule that survives a fractional device pixel ratio. Used for the
304
+ * rail and panel divides, where a blurry seam is the first thing the eye finds.
305
+ */
306
+ @utility hairline-x {
307
+ background-image: linear-gradient(to right, var(--border), var(--border));
308
+ background-size: 1px 100%;
309
+ background-repeat: no-repeat;
310
+ background-position: right center;
311
+ }
312
+
313
+ @utility hairline-y {
314
+ background-image: linear-gradient(to bottom, var(--border), var(--border));
315
+ background-size: 100% 1px;
316
+ background-repeat: no-repeat;
317
+ background-position: center bottom;
318
+ }
319
+
320
+ @utility animate-rise {
321
+ animation: ds-rise var(--duration-slow) var(--ease-out) backwards;
322
+ }
323
+
324
+ @utility animate-scale-in {
325
+ animation: ds-scale-in var(--duration-normal) var(--ease-out) backwards;
326
+ }
327
+
328
+ @utility animate-indeterminate {
329
+ animation: ds-indeterminate 1.4s ease-in-out infinite;
330
+ }
331
+
332
+ @utility animate-caret {
333
+ animation: ds-caret 1.1s step-end infinite;
334
+ }
335
+
336
+ /* A skeleton shimmer that pauses for reduced motion — see the media query at
337
+ the foot of this file. */
338
+ @utility animate-shimmer {
339
+ background-image: linear-gradient(
340
+ 90deg,
341
+ transparent 0%,
342
+ color-mix(in oklch, var(--foreground) 8%, transparent) 50%,
343
+ transparent 100%
344
+ );
345
+ background-size: 200% 100%;
346
+ background-repeat: no-repeat;
347
+ animation: ds-shimmer 1.6s ease-in-out infinite;
348
+ }
349
+
350
+ /**
351
+ * A streaming caret: the block that trails the last character of a turn that is
352
+ * still arriving. It is a caret rather than a spinner because the text is already
353
+ * readable and growing — the reader wants to know *where* the stream is, not that
354
+ * something is happening somewhere.
355
+ *
356
+ * `inline-block` with a `1ch` width so it sits in the text flow, and the blink is
357
+ * a step rather than a fade so it reads as a terminal cursor. It is removed under
358
+ * `prefers-reduced-motion` — the accessibility block below zeroes the duration,
359
+ * which would leave a static block; the component hides it there instead.
360
+ */
361
+ @utility streaming-caret {
362
+ display: inline-block;
363
+ width: 0.5ch;
364
+ height: 1em;
365
+ margin-left: 0.1em;
366
+ translate: 0 0.1em;
367
+ background: var(--foreground);
368
+ animation: ds-caret 1s steps(2, start) infinite;
369
+
370
+ @media (prefers-reduced-motion: reduce) {
371
+ display: none;
372
+ }
373
+ }
374
+
375
+ @keyframes ds-caret {
376
+ 0%,
377
+ 50% {
378
+ opacity: 1;
379
+ }
380
+ 50.01%,
381
+ 100% {
382
+ opacity: 0;
383
+ }
384
+ }
385
+
386
+ /* The glass treatment used by the top bar, the rail, and floating overlays.
387
+ `--glass-*` are private: a consumer chooses *whether* to be glassy through
388
+ the component prop, not by reaching for these. */
389
+ @utility glass-panel {
390
+ background: color-mix(in oklch, var(--chrome) calc(var(--chrome-alpha) * 100%), transparent);
391
+ backdrop-filter: blur(18px) saturate(1.6);
392
+ -webkit-backdrop-filter: blur(18px) saturate(1.6);
393
+ box-shadow: inset 0 1px 0 oklch(1 0 0 / 0.08);
394
+ }
395
+
396
+ @utility glass-surface {
397
+ background: color-mix(in oklch, var(--card) 72%, transparent);
398
+ backdrop-filter: blur(12px) saturate(1.4);
399
+ -webkit-backdrop-filter: blur(12px) saturate(1.4);
400
+ }
401
+
402
+ /* The focus ring. Applied by components that cannot use the global outline
403
+ because they need the ring to follow their own radius. */
404
+ @utility focus-ring {
405
+ transition:
406
+ border-color var(--duration-normal) var(--ease-out),
407
+ box-shadow var(--duration-normal) var(--ease-out);
408
+
409
+ &:focus-visible {
410
+ outline: none;
411
+ border-color: var(--ring);
412
+ box-shadow: 0 0 0 3px var(--primary-subtle);
413
+ }
414
+ }
415
+
416
+ /* --- Scrollbars ----------------------------------------------------------
417
+ * Themed, thin, and out of the way. A default scrollbar is the single most
418
+ * obvious "this is a web page" tell in a desktop application: on macOS it is
419
+ * an overlay that vanishes, but on Windows and Linux it is a 15px chrome bar
420
+ * with the platform's own palette, which no theme can reach.
421
+ *
422
+ * The thumb is `--muted` at rest and `--foreground` on hover, so it is visible
423
+ * against every surface without a per-theme value, and it never competes with
424
+ * content for attention.
425
+ * ------------------------------------------------------------------------ */
426
+ ::-webkit-scrollbar {
427
+ width: 10px;
428
+ height: 10px;
429
+ }
430
+
431
+ ::-webkit-scrollbar-track {
432
+ background: transparent;
433
+ }
434
+
435
+ ::-webkit-scrollbar-thumb {
436
+ border: 3px solid transparent;
437
+ border-radius: 9999px;
438
+ background: var(--muted);
439
+ background-clip: content-box;
440
+ }
441
+
442
+ ::-webkit-scrollbar-thumb:hover {
443
+ background: var(--muted-foreground);
444
+ background-clip: content-box;
445
+ }
446
+
447
+ ::-webkit-scrollbar-corner {
448
+ background: transparent;
449
+ }
450
+
451
+ /* Firefox, which has no ::-webkit-scrollbar. */
452
+ @supports (scrollbar-width: thin) {
453
+ * {
454
+ scrollbar-width: thin;
455
+ scrollbar-color: var(--muted) transparent;
456
+ }
457
+ }
458
+
459
+ /**
460
+ * An auto-hiding scrollbar, for a horizontal scroller inside a bordered
461
+ * surface — a code block, a diff, a wide table. The bar appears on hover and
462
+ * while the region has focus, so the surface reads as continuous code at rest
463
+ * and the affordance is there the moment a reader needs it.
464
+ */
465
+ @utility scroll-fade {
466
+ &::-webkit-scrollbar {
467
+ height: 6px;
468
+ width: 6px;
469
+ }
470
+
471
+ &::-webkit-scrollbar-thumb {
472
+ border: 0;
473
+ border-radius: 9999px;
474
+ background: transparent;
475
+ transition: background var(--duration-normal) var(--ease-out);
476
+ }
477
+
478
+ &:hover::-webkit-scrollbar-thumb,
479
+ &:focus-within::-webkit-scrollbar-thumb {
480
+ background: var(--muted-foreground);
481
+ }
482
+
483
+ @supports (scrollbar-width: thin) {
484
+ scrollbar-width: thin;
485
+ scrollbar-color: transparent transparent;
486
+
487
+ &:hover,
488
+ &:focus-within {
489
+ scrollbar-color: var(--muted-foreground) transparent;
490
+ }
491
+ }
492
+ }
493
+
494
+ /* --- Base layer ---------------------------------------------------------- */
495
+ @layer base {
496
+ *,
497
+ *::before,
498
+ *::after {
499
+ border-color: var(--border);
500
+ }
501
+
502
+ * {
503
+ /* A ring is drawn outside the box so it can never shift layout. */
504
+ outline-color: var(--ring);
505
+ outline-offset: 2px;
506
+ }
507
+
508
+ html {
509
+ /* From Chromium 140 the viewport propagates overscroll-behavior from the
510
+ ROOT element, so a `body` declaration is ignored and the macOS
511
+ rubber-band bounce returns inside a desktop webview. */
512
+ overscroll-behavior-y: none;
513
+ -webkit-font-smoothing: antialiased;
514
+ -moz-osx-font-smoothing: grayscale;
515
+ /* The interface default: 14px/1.55, matching the `text-sm` rung. */
516
+ font-family: var(--font-sans);
517
+ font-size: var(--text-sm);
518
+ line-height: var(--text-sm--line-height);
519
+ font-synthesis-weight: none;
520
+ text-rendering: optimizeLegibility;
521
+ }
522
+
523
+ body {
524
+ margin: 0;
525
+ background: var(--background);
526
+ color: var(--foreground);
527
+ transition:
528
+ background-color var(--duration-normal) var(--ease-out),
529
+ color var(--duration-normal) var(--ease-out);
530
+ }
531
+
532
+ /* Keyboard focus only. `:focus-visible` rather than `:focus` so a pointer
533
+ click never paints a ring. */
534
+ :focus-visible {
535
+ outline: 2px solid var(--ring);
536
+ outline-offset: 2px;
537
+ }
538
+
539
+ ::selection {
540
+ background: var(--primary-subtle);
541
+ color: var(--foreground);
542
+ }
543
+
544
+ /* Product expectation: every enabled control shows the pointer cursor
545
+ regardless of Tailwind preflight. */
546
+ button:not(:disabled),
547
+ [role='button']:not([aria-disabled='true']),
548
+ [role='tab']:not([aria-disabled='true']),
549
+ [role='menuitem']:not([aria-disabled='true']),
550
+ [role='option']:not([aria-disabled='true']) {
551
+ cursor: pointer;
552
+ }
553
+
554
+ button,
555
+ input,
556
+ select,
557
+ textarea {
558
+ font: inherit;
559
+ letter-spacing: inherit;
560
+ }
561
+
562
+ /* Scrollbars. The thumb is `--muted-foreground`, the lightest rung that
563
+ clears the WCAG 1.4.11 3:1 non-text floor against every surface a scroll
564
+ box sits on; it darkens to `--foreground` on hover so the affordance
565
+ reads as live. */
566
+ ::-webkit-scrollbar {
567
+ width: 10px;
568
+ height: 10px;
569
+ }
570
+
571
+ ::-webkit-scrollbar-track {
572
+ background: transparent;
573
+ }
574
+
575
+ ::-webkit-scrollbar-thumb {
576
+ background: color-mix(in oklch, var(--muted-foreground) 45%, transparent);
577
+ border: 3px solid transparent;
578
+ border-radius: 9999px;
579
+ background-clip: content-box;
580
+ }
581
+
582
+ ::-webkit-scrollbar-thumb:hover {
583
+ background: color-mix(in oklch, var(--muted-foreground) 75%, transparent);
584
+ background-clip: content-box;
585
+ }
586
+
587
+ ::-webkit-scrollbar-corner {
588
+ background: transparent;
589
+ }
590
+
591
+ code,
592
+ kbd,
593
+ pre,
594
+ samp {
595
+ font-family: var(--font-mono);
596
+ font-feature-settings: 'liga' 0;
597
+ }
598
+ }
599
+
600
+ /* --- Accessibility overrides ---------------------------------------------
601
+ * Kept last so they win the cascade against the rules above.
602
+ * ------------------------------------------------------------------------ */
603
+ @media (prefers-reduced-motion: reduce) {
604
+ *,
605
+ *::before,
606
+ *::after {
607
+ animation-duration: 0.01ms !important;
608
+ animation-iteration-count: 1 !important;
609
+ animation-delay: 0s !important;
610
+ transition-duration: 0.01ms !important;
611
+ scroll-behavior: auto !important;
612
+ }
613
+ }
614
+
615
+ @media (prefers-reduced-transparency: reduce) {
616
+ .glass-panel,
617
+ .glass-surface {
618
+ backdrop-filter: none !important;
619
+ -webkit-backdrop-filter: none !important;
620
+ background: var(--background) !important;
621
+ }
622
+ }
623
+
624
+ @media (prefers-contrast: more) {
625
+ :root {
626
+ --border: var(--foreground);
627
+ }
628
+
629
+ .glass-panel,
630
+ .glass-surface {
631
+ background: var(--background) !important;
632
+ border: 1px solid var(--foreground) !important;
633
+ }
634
+ }
635
+
636
+ /* An engine without backdrop-filter would render the glass tint alone, which
637
+ is 3-8% alpha — effectively a transparent panel. Fall back to a solid
638
+ surface instead, keeping borders and shadows so panels stay delimited. */
639
+ @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
640
+ .glass-panel,
641
+ .glass-surface {
642
+ background: var(--background) !important;
643
+ }
644
+ }
@@ -0,0 +1,26 @@
1
+ /* The design system's typefaces, self-hosted.
2
+ *
3
+ * Four families, all variable, all resolved from `node_modules` at build time —
4
+ * a desktop app must not fetch a font at runtime, or the first paint after a cold
5
+ * start shows a fallback face and then reflows.
6
+ *
7
+ * Space Grotesk the interface default, and the face the visual language was
8
+ * drawn against
9
+ * JetBrains Mono code, terminals, ids, paths
10
+ * Geist an alternative interface face; cortana already ships it
11
+ * Geist Mono its monospace counterpart
12
+ *
13
+ * The family is a *selection*, not a constant: `theme.css` exposes a `data-font`
14
+ * axis, so a user can pick a face the way they pick an accent, and the system
15
+ * default (`system`) is always available for someone who wants their OS's own.
16
+ *
17
+ * Consumers import this after the theme:
18
+ *
19
+ * @import '@adea-ai/ui/globals.css';
20
+ * @import '@adea-ai/ui/fonts.css';
21
+ */
22
+
23
+ @import '@fontsource-variable/space-grotesk';
24
+ @import '@fontsource-variable/jetbrains-mono';
25
+ @import '@fontsource-variable/geist';
26
+ @import '@fontsource-variable/geist-mono';
@@ -0,0 +1,18 @@
1
+ /* The Adea design system's prebuilt stylesheet.
2
+ *
3
+ * Import this one file to get Tailwind, the base layer, every token, and the
4
+ * named utilities the components use. It is the entry the shadcn CLI and
5
+ * @shadcn/lint discover, so it must stay the file that imports Tailwind.
6
+ *
7
+ * @import '@adea-ai/ui/globals.css';
8
+ * @import '@adea-ai/ui/fonts.css'; <- optional, self-hosted typefaces
9
+ *
10
+ * A consumer that already imports Tailwind itself should import `theme.css`
11
+ * and `base.css` directly instead, and must not import this file.
12
+ *
13
+ * Tokens live in `theme.css` only. This file must never duplicate them.
14
+ */
15
+
16
+ @import 'tailwindcss';
17
+ @import './base.css';
18
+ @import './theme.css';