@adia-ai/web-components 0.0.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 (468) hide show
  1. package/README.md +195 -0
  2. package/a2ui/dockables/action.js +152 -0
  3. package/a2ui/dockables/base.js +30 -0
  4. package/a2ui/dockables/controller.js +97 -0
  5. package/a2ui/dockables/data-source.js +103 -0
  6. package/a2ui/dockables/index.js +6 -0
  7. package/a2ui/dockables/lifecycle.js +84 -0
  8. package/a2ui/dockables/provider.js +59 -0
  9. package/a2ui/index.js +19 -0
  10. package/a2ui/manifest-runtime.js +226 -0
  11. package/a2ui/registry.js +200 -0
  12. package/a2ui/renderer.js +361 -0
  13. package/a2ui/root.js +152 -0
  14. package/a2ui/stream.js +243 -0
  15. package/a2ui/surface-manifest.js +294 -0
  16. package/a2ui/surface.js +222 -0
  17. package/a2ui/wire-factory.js +134 -0
  18. package/a2ui/wiring-engine.js +209 -0
  19. package/a2ui/wiring-registry.js +342 -0
  20. package/components/accordion/accordion.a2ui.json +129 -0
  21. package/components/accordion/accordion.css +133 -0
  22. package/components/accordion/accordion.js +125 -0
  23. package/components/accordion/accordion.yaml +527 -0
  24. package/components/action-list/action-list.a2ui.json +64 -0
  25. package/components/action-list/action-list.css +115 -0
  26. package/components/action-list/action-list.js +149 -0
  27. package/components/action-list/action-list.yaml +56 -0
  28. package/components/agent-artifact/agent-artifact.a2ui.json +99 -0
  29. package/components/agent-artifact/agent-artifact.css +94 -0
  30. package/components/agent-artifact/agent-artifact.js +169 -0
  31. package/components/agent-artifact/agent-artifact.yaml +71 -0
  32. package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +91 -0
  33. package/components/agent-feedback-bar/agent-feedback-bar.css +33 -0
  34. package/components/agent-feedback-bar/agent-feedback-bar.js +152 -0
  35. package/components/agent-feedback-bar/agent-feedback-bar.yaml +65 -0
  36. package/components/agent-questions/agent-questions.a2ui.json +89 -0
  37. package/components/agent-questions/agent-questions.css +146 -0
  38. package/components/agent-questions/agent-questions.js +189 -0
  39. package/components/agent-questions/agent-questions.yaml +63 -0
  40. package/components/agent-reasoning/agent-reasoning.a2ui.json +100 -0
  41. package/components/agent-reasoning/agent-reasoning.css +273 -0
  42. package/components/agent-reasoning/agent-reasoning.js +469 -0
  43. package/components/agent-reasoning/agent-reasoning.yaml +70 -0
  44. package/components/agent-suggestions/agent-suggestions.a2ui.json +87 -0
  45. package/components/agent-suggestions/agent-suggestions.css +18 -0
  46. package/components/agent-suggestions/agent-suggestions.js +87 -0
  47. package/components/agent-suggestions/agent-suggestions.yaml +59 -0
  48. package/components/agent-trace/agent-trace.a2ui.json +78 -0
  49. package/components/agent-trace/agent-trace.css +275 -0
  50. package/components/agent-trace/agent-trace.js +216 -0
  51. package/components/agent-trace/agent-trace.yaml +53 -0
  52. package/components/alert/alert.a2ui.json +211 -0
  53. package/components/alert/alert.css +88 -0
  54. package/components/alert/alert.js +96 -0
  55. package/components/alert/alert.yaml +205 -0
  56. package/components/avatar/avatar.a2ui.json +215 -0
  57. package/components/avatar/avatar.css +159 -0
  58. package/components/avatar/avatar.js +157 -0
  59. package/components/avatar/avatar.yaml +559 -0
  60. package/components/badge/badge.a2ui.json +169 -0
  61. package/components/badge/badge.css +78 -0
  62. package/components/badge/badge.js +53 -0
  63. package/components/badge/badge.yaml +612 -0
  64. package/components/block/block.a2ui.json +135 -0
  65. package/components/block/block.css +29 -0
  66. package/components/block/block.js +23 -0
  67. package/components/block/block.yaml +115 -0
  68. package/components/breadcrumb/breadcrumb.a2ui.json +86 -0
  69. package/components/breadcrumb/breadcrumb.css +78 -0
  70. package/components/breadcrumb/breadcrumb.js +44 -0
  71. package/components/breadcrumb/breadcrumb.yaml +84 -0
  72. package/components/button/button.a2ui.json +172 -0
  73. package/components/button/button.css +168 -0
  74. package/components/button/button.js +60 -0
  75. package/components/button/button.yaml +120 -0
  76. package/components/calendar-picker/calendar-picker.a2ui.json +139 -0
  77. package/components/calendar-picker/calendar-picker.css +321 -0
  78. package/components/calendar-picker/calendar-picker.js +324 -0
  79. package/components/calendar-picker/calendar-picker.yaml +243 -0
  80. package/components/canvas/canvas.a2ui.json +75 -0
  81. package/components/canvas/canvas.css +52 -0
  82. package/components/canvas/canvas.js +179 -0
  83. package/components/canvas/canvas.yaml +62 -0
  84. package/components/card/card.a2ui.json +276 -0
  85. package/components/card/card.css +362 -0
  86. package/components/card/card.js +58 -0
  87. package/components/card/card.yaml +527 -0
  88. package/components/chart/chart.a2ui.json +298 -0
  89. package/components/chart/chart.css +512 -0
  90. package/components/chart/chart.js +1075 -0
  91. package/components/chart/chart.yaml +540 -0
  92. package/components/chat/chat-input.css +141 -0
  93. package/components/chat/chat-input.js +242 -0
  94. package/components/chat/chat.a2ui.json +181 -0
  95. package/components/chat/chat.css +193 -0
  96. package/components/chat/chat.js +155 -0
  97. package/components/chat/chat.yaml +230 -0
  98. package/components/check/check.a2ui.json +134 -0
  99. package/components/check/check.css +126 -0
  100. package/components/check/check.js +58 -0
  101. package/components/check/check.yaml +109 -0
  102. package/components/code/code.a2ui.json +153 -0
  103. package/components/code/code.css +133 -0
  104. package/components/code/code.js +114 -0
  105. package/components/code/code.yaml +163 -0
  106. package/components/col/col.a2ui.json +104 -0
  107. package/components/col/col.css +36 -0
  108. package/components/col/col.js +19 -0
  109. package/components/col/col.yaml +364 -0
  110. package/components/color-picker/color-picker.a2ui.json +100 -0
  111. package/components/color-picker/color-picker.css +182 -0
  112. package/components/color-picker/color-picker.js +537 -0
  113. package/components/color-picker/color-picker.yaml +105 -0
  114. package/components/command/command.a2ui.json +221 -0
  115. package/components/command/command.css +251 -0
  116. package/components/command/command.js +284 -0
  117. package/components/command/command.yaml +186 -0
  118. package/components/description-list/description-list.a2ui.json +89 -0
  119. package/components/description-list/description-list.css +70 -0
  120. package/components/description-list/description-list.js +75 -0
  121. package/components/description-list/description-list.yaml +59 -0
  122. package/components/divider/divider.a2ui.json +126 -0
  123. package/components/divider/divider.css +102 -0
  124. package/components/divider/divider.js +47 -0
  125. package/components/divider/divider.yaml +366 -0
  126. package/components/drawer/drawer.a2ui.json +199 -0
  127. package/components/drawer/drawer.css +342 -0
  128. package/components/drawer/drawer.js +263 -0
  129. package/components/drawer/drawer.yaml +366 -0
  130. package/components/embed/embed.a2ui.json +150 -0
  131. package/components/embed/embed.css +28 -0
  132. package/components/embed/embed.js +63 -0
  133. package/components/embed/embed.yaml +224 -0
  134. package/components/empty-state/empty-state.a2ui.json +133 -0
  135. package/components/empty-state/empty-state.css +58 -0
  136. package/components/empty-state/empty-state.js +87 -0
  137. package/components/empty-state/empty-state.yaml +314 -0
  138. package/components/footer/footer.a2ui.json +79 -0
  139. package/components/footer/footer.yaml +239 -0
  140. package/components/grid/grid.a2ui.json +171 -0
  141. package/components/grid/grid.css +37 -0
  142. package/components/grid/grid.js +21 -0
  143. package/components/grid/grid.yaml +577 -0
  144. package/components/header/header.a2ui.json +76 -0
  145. package/components/header/header.yaml +336 -0
  146. package/components/heatmap/heatmap.a2ui.json +150 -0
  147. package/components/heatmap/heatmap.css +146 -0
  148. package/components/heatmap/heatmap.js +246 -0
  149. package/components/heatmap/heatmap.yaml +131 -0
  150. package/components/icon/icon.a2ui.json +79 -0
  151. package/components/icon/icon.css +20 -0
  152. package/components/icon/icon.js +26 -0
  153. package/components/icon/icon.yaml +233 -0
  154. package/components/image/image.a2ui.json +261 -0
  155. package/components/image/image.css +76 -0
  156. package/components/image/image.js +102 -0
  157. package/components/image/image.yaml +477 -0
  158. package/components/index.js +85 -0
  159. package/components/input/input.a2ui.json +284 -0
  160. package/components/input/input.css +162 -0
  161. package/components/input/input.js +148 -0
  162. package/components/input/input.yaml +496 -0
  163. package/components/inspector/inspector.a2ui.json +67 -0
  164. package/components/inspector/inspector.css +31 -0
  165. package/components/inspector/inspector.js +133 -0
  166. package/components/inspector/inspector.yaml +58 -0
  167. package/components/kbd/kbd.a2ui.json +96 -0
  168. package/components/kbd/kbd.css +62 -0
  169. package/components/kbd/kbd.js +24 -0
  170. package/components/kbd/kbd.yaml +213 -0
  171. package/components/list/list.a2ui.json +145 -0
  172. package/components/list/list.css +103 -0
  173. package/components/list/list.js +236 -0
  174. package/components/list/list.yaml +122 -0
  175. package/components/menu/menu.a2ui.json +146 -0
  176. package/components/menu/menu.css +146 -0
  177. package/components/menu/menu.js +296 -0
  178. package/components/menu/menu.yaml +123 -0
  179. package/components/modal/modal.a2ui.json +136 -0
  180. package/components/modal/modal.css +153 -0
  181. package/components/modal/modal.js +181 -0
  182. package/components/modal/modal.yaml +114 -0
  183. package/components/noodles/noodles.a2ui.json +145 -0
  184. package/components/noodles/noodles.css +118 -0
  185. package/components/noodles/noodles.js +470 -0
  186. package/components/noodles/noodles.yaml +123 -0
  187. package/components/otp-input/otp-input.a2ui.json +104 -0
  188. package/components/otp-input/otp-input.css +78 -0
  189. package/components/otp-input/otp-input.js +170 -0
  190. package/components/otp-input/otp-input.yaml +218 -0
  191. package/components/pagination/pagination.a2ui.json +122 -0
  192. package/components/pagination/pagination.css +162 -0
  193. package/components/pagination/pagination.js +185 -0
  194. package/components/pagination/pagination.yaml +165 -0
  195. package/components/pane/pane.a2ui.json +94 -0
  196. package/components/pane/pane.css +166 -0
  197. package/components/pane/pane.js +140 -0
  198. package/components/pane/pane.yaml +197 -0
  199. package/components/pipeline-status/pipeline-status.a2ui.json +90 -0
  200. package/components/pipeline-status/pipeline-status.css +162 -0
  201. package/components/pipeline-status/pipeline-status.js +176 -0
  202. package/components/pipeline-status/pipeline-status.yaml +99 -0
  203. package/components/popover/popover.a2ui.json +181 -0
  204. package/components/popover/popover.css +57 -0
  205. package/components/popover/popover.js +170 -0
  206. package/components/popover/popover.yaml +257 -0
  207. package/components/progress/progress.a2ui.json +199 -0
  208. package/components/progress/progress.css +88 -0
  209. package/components/progress/progress.js +64 -0
  210. package/components/progress/progress.yaml +342 -0
  211. package/components/progress-row/progress-row.a2ui.json +100 -0
  212. package/components/progress-row/progress-row.css +57 -0
  213. package/components/progress-row/progress-row.js +92 -0
  214. package/components/progress-row/progress-row.yaml +87 -0
  215. package/components/radio/radio.a2ui.json +232 -0
  216. package/components/radio/radio.css +102 -0
  217. package/components/radio/radio.js +73 -0
  218. package/components/radio/radio.yaml +248 -0
  219. package/components/range/range.a2ui.json +151 -0
  220. package/components/range/range.css +148 -0
  221. package/components/range/range.js +177 -0
  222. package/components/range/range.yaml +188 -0
  223. package/components/rating/rating.a2ui.json +105 -0
  224. package/components/rating/rating.css +92 -0
  225. package/components/rating/rating.js +138 -0
  226. package/components/rating/rating.yaml +74 -0
  227. package/components/richtext/richtext.a2ui.json +82 -0
  228. package/components/richtext/richtext.css +225 -0
  229. package/components/richtext/richtext.js +74 -0
  230. package/components/richtext/richtext.yaml +89 -0
  231. package/components/row/row.a2ui.json +102 -0
  232. package/components/row/row.css +51 -0
  233. package/components/row/row.js +39 -0
  234. package/components/row/row.yaml +358 -0
  235. package/components/search/search.a2ui.json +186 -0
  236. package/components/search/search.css +28 -0
  237. package/components/search/search.js +124 -0
  238. package/components/search/search.yaml +154 -0
  239. package/components/section/section.a2ui.json +78 -0
  240. package/components/section/section.yaml +338 -0
  241. package/components/segment/segment.a2ui.json +100 -0
  242. package/components/segment/segment.css +81 -0
  243. package/components/segment/segment.js +32 -0
  244. package/components/segment/segment.yaml +216 -0
  245. package/components/segmented/segmented.a2ui.json +106 -0
  246. package/components/segmented/segmented.css +67 -0
  247. package/components/segmented/segmented.js +149 -0
  248. package/components/segmented/segmented.yaml +91 -0
  249. package/components/select/select.a2ui.json +203 -0
  250. package/components/select/select.css +277 -0
  251. package/components/select/select.js +388 -0
  252. package/components/select/select.yaml +375 -0
  253. package/components/skeleton/skeleton.a2ui.json +120 -0
  254. package/components/skeleton/skeleton.css +47 -0
  255. package/components/skeleton/skeleton.js +43 -0
  256. package/components/skeleton/skeleton.yaml +153 -0
  257. package/components/slider/slider.a2ui.json +162 -0
  258. package/components/slider/slider.css +137 -0
  259. package/components/slider/slider.js +162 -0
  260. package/components/slider/slider.yaml +299 -0
  261. package/components/stack/stack.a2ui.json +62 -0
  262. package/components/stack/stack.css +28 -0
  263. package/components/stack/stack.js +18 -0
  264. package/components/stack/stack.yaml +54 -0
  265. package/components/stat/stat.a2ui.json +246 -0
  266. package/components/stat/stat.css +101 -0
  267. package/components/stat/stat.js +91 -0
  268. package/components/stat/stat.yaml +206 -0
  269. package/components/stepper/stepper.a2ui.json +77 -0
  270. package/components/stepper/stepper.css +243 -0
  271. package/components/stepper/stepper.js +118 -0
  272. package/components/stepper/stepper.yaml +73 -0
  273. package/components/stream/stream.a2ui.json +98 -0
  274. package/components/stream/stream.css +37 -0
  275. package/components/stream/stream.js +99 -0
  276. package/components/stream/stream.yaml +87 -0
  277. package/components/swiper/swiper.a2ui.json +140 -0
  278. package/components/swiper/swiper.css +267 -0
  279. package/components/swiper/swiper.js +285 -0
  280. package/components/swiper/swiper.yaml +268 -0
  281. package/components/switch/switch.a2ui.json +134 -0
  282. package/components/switch/switch.css +104 -0
  283. package/components/switch/switch.js +53 -0
  284. package/components/switch/switch.yaml +322 -0
  285. package/components/table/cell-types.js +296 -0
  286. package/components/table/table.a2ui.json +458 -0
  287. package/components/table/table.css +531 -0
  288. package/components/table/table.js +1392 -0
  289. package/components/table/table.yaml +528 -0
  290. package/components/tabs/tab.js +34 -0
  291. package/components/tabs/tabs.a2ui.json +174 -0
  292. package/components/tabs/tabs.css +162 -0
  293. package/components/tabs/tabs.js +226 -0
  294. package/components/tabs/tabs.yaml +255 -0
  295. package/components/tag/tag.a2ui.json +148 -0
  296. package/components/tag/tag.css +118 -0
  297. package/components/tag/tag.js +88 -0
  298. package/components/tag/tag.yaml +125 -0
  299. package/components/text/text.a2ui.json +99 -0
  300. package/components/text/text.css +65 -0
  301. package/components/text/text.js +35 -0
  302. package/components/text/text.yaml +360 -0
  303. package/components/textarea/textarea.a2ui.json +91 -0
  304. package/components/textarea/textarea.css +93 -0
  305. package/components/textarea/textarea.js +114 -0
  306. package/components/textarea/textarea.yaml +79 -0
  307. package/components/timeline/timeline.a2ui.json +82 -0
  308. package/components/timeline/timeline.css +389 -0
  309. package/components/timeline/timeline.js +171 -0
  310. package/components/timeline/timeline.yaml +185 -0
  311. package/components/toast/toast.a2ui.json +199 -0
  312. package/components/toast/toast.css +211 -0
  313. package/components/toast/toast.js +146 -0
  314. package/components/toast/toast.yaml +184 -0
  315. package/components/toggle-group/toggle-group.a2ui.json +126 -0
  316. package/components/toggle-group/toggle-group.css +102 -0
  317. package/components/toggle-group/toggle-group.js +147 -0
  318. package/components/toggle-group/toggle-group.yaml +98 -0
  319. package/components/toolbar/toolbar.a2ui.json +131 -0
  320. package/components/toolbar/toolbar.css +132 -0
  321. package/components/toolbar/toolbar.js +366 -0
  322. package/components/toolbar/toolbar.yaml +238 -0
  323. package/components/tooltip/tooltip.a2ui.json +148 -0
  324. package/components/tooltip/tooltip.css +39 -0
  325. package/components/tooltip/tooltip.js +96 -0
  326. package/components/tooltip/tooltip.yaml +201 -0
  327. package/components/tree/tree.a2ui.json +119 -0
  328. package/components/tree/tree.css +133 -0
  329. package/components/tree/tree.js +253 -0
  330. package/components/tree/tree.yaml +92 -0
  331. package/components/upload/upload.a2ui.json +185 -0
  332. package/components/upload/upload.css +115 -0
  333. package/components/upload/upload.js +189 -0
  334. package/components/upload/upload.yaml +302 -0
  335. package/core/anchor.js +187 -0
  336. package/core/controller.js +182 -0
  337. package/core/element.js +257 -0
  338. package/core/form.js +217 -0
  339. package/core/icons.js +180 -0
  340. package/core/markdown.js +95 -0
  341. package/core/polyfills.js +23 -0
  342. package/core/provider.js +262 -0
  343. package/core/signals.js +113 -0
  344. package/core/template.js +226 -0
  345. package/core/transport.js +77 -0
  346. package/package.json +38 -0
  347. package/patterns/adia-chat/adia-chat.a2ui.json +149 -0
  348. package/patterns/adia-chat/adia-chat.css +10 -0
  349. package/patterns/adia-chat/adia-chat.js +297 -0
  350. package/patterns/adia-chat/adia-chat.yaml +118 -0
  351. package/patterns/adia-chat/css/adia-chat.empty.css +12 -0
  352. package/patterns/adia-chat/css/adia-chat.layout.css +60 -0
  353. package/patterns/adia-chat/css/adia-chat.markdown.css +74 -0
  354. package/patterns/adia-chat/css/adia-chat.messages.css +87 -0
  355. package/patterns/adia-chat/css/adia-chat.streaming.css +30 -0
  356. package/patterns/adia-chat/css/adia-chat.tokens.css +95 -0
  357. package/patterns/adia-chat/index.html +93 -0
  358. package/patterns/adia-editor/adia-editor.a2ui.json +58 -0
  359. package/patterns/adia-editor/adia-editor.css +6 -0
  360. package/patterns/adia-editor/adia-editor.js +56 -0
  361. package/patterns/adia-editor/adia-editor.yaml +36 -0
  362. package/patterns/adia-editor/css/adia-editor.layout.css +86 -0
  363. package/patterns/adia-editor/css/adia-editor.tokens.css +28 -0
  364. package/patterns/adia-editor/index.html +179 -0
  365. package/patterns/app-nav/app-nav.a2ui.json +89 -0
  366. package/patterns/app-nav/app-nav.css +92 -0
  367. package/patterns/app-nav/app-nav.js +99 -0
  368. package/patterns/app-nav/app-nav.yaml +54 -0
  369. package/patterns/app-nav-group/app-nav-group.a2ui.json +82 -0
  370. package/patterns/app-nav-group/app-nav-group.css +261 -0
  371. package/patterns/app-nav-group/app-nav-group.js +116 -0
  372. package/patterns/app-nav-group/app-nav-group.yaml +59 -0
  373. package/patterns/app-nav-item/app-nav-item.a2ui.json +83 -0
  374. package/patterns/app-nav-item/app-nav-item.css +156 -0
  375. package/patterns/app-nav-item/app-nav-item.js +42 -0
  376. package/patterns/app-nav-item/app-nav-item.yaml +62 -0
  377. package/patterns/app-shell/app-shell.a2ui.json +114 -0
  378. package/patterns/app-shell/app-shell.css +14 -0
  379. package/patterns/app-shell/app-shell.js +251 -0
  380. package/patterns/app-shell/app-shell.yaml +66 -0
  381. package/patterns/app-shell/css/app-shell.collapsed.css +86 -0
  382. package/patterns/app-shell/css/app-shell.helpers.css +42 -0
  383. package/patterns/app-shell/css/app-shell.main.css +58 -0
  384. package/patterns/app-shell/css/app-shell.shell.css +44 -0
  385. package/patterns/app-shell/css/app-shell.sidebar.css +116 -0
  386. package/patterns/app-shell/css/app-shell.templates.css +214 -0
  387. package/patterns/app-shell/css/app-shell.tokens.css +116 -0
  388. package/patterns/app-shell/index.html +112 -0
  389. package/patterns/gen-ui/gen-ui.a2ui.json +72 -0
  390. package/patterns/gen-ui/gen-ui.css +83 -0
  391. package/patterns/gen-ui/gen-ui.js +136 -0
  392. package/patterns/gen-ui/gen-ui.yaml +43 -0
  393. package/patterns/index.js +10 -0
  394. package/patterns/section-nav/section-nav.a2ui.json +91 -0
  395. package/patterns/section-nav/section-nav.css +59 -0
  396. package/patterns/section-nav/section-nav.js +42 -0
  397. package/patterns/section-nav/section-nav.yaml +58 -0
  398. package/patterns/section-nav-group/section-nav-group.a2ui.json +95 -0
  399. package/patterns/section-nav-group/section-nav-group.css +74 -0
  400. package/patterns/section-nav-group/section-nav-group.js +84 -0
  401. package/patterns/section-nav-group/section-nav-group.yaml +66 -0
  402. package/patterns/section-nav-item/section-nav-item.a2ui.json +97 -0
  403. package/patterns/section-nav-item/section-nav-item.css +96 -0
  404. package/patterns/section-nav-item/section-nav-item.js +66 -0
  405. package/patterns/section-nav-item/section-nav-item.yaml +70 -0
  406. package/styles/colors/index.css +6 -0
  407. package/styles/colors/parameters.css +52 -0
  408. package/styles/colors/primitives-accent.css +89 -0
  409. package/styles/colors/primitives-brand.css +89 -0
  410. package/styles/colors/primitives-danger.css +89 -0
  411. package/styles/colors/primitives-info.css +89 -0
  412. package/styles/colors/primitives-neutral.css +91 -0
  413. package/styles/colors/primitives-shared.css +57 -0
  414. package/styles/colors/primitives-success.css +89 -0
  415. package/styles/colors/primitives-warning.css +89 -0
  416. package/styles/colors/primitives.css +17 -0
  417. package/styles/colors/scrims.css +182 -0
  418. package/styles/colors/semantics.css +595 -0
  419. package/styles/colors/surfaces.css +43 -0
  420. package/styles/fonts.css +99 -0
  421. package/styles/layouts/admin.css +7 -0
  422. package/styles/prose.css +186 -0
  423. package/styles/styles.css +193 -0
  424. package/styles/themes.css +155 -0
  425. package/styles/tokens.css +304 -0
  426. package/styles/typography.css +853 -0
  427. package/traits/active-state.js +24 -0
  428. package/traits/anchor-positioning.js +66 -0
  429. package/traits/attention-pulse.js +30 -0
  430. package/traits/confetti-burst.js +65 -0
  431. package/traits/confetti.js +57 -0
  432. package/traits/count-up.js +42 -0
  433. package/traits/define.js +76 -0
  434. package/traits/dirty-state.js +38 -0
  435. package/traits/drag-ghost.js +38 -0
  436. package/traits/draggable.js +73 -0
  437. package/traits/fade-presence.js +52 -0
  438. package/traits/focus-trap.js +63 -0
  439. package/traits/focusable.js +38 -0
  440. package/traits/glow-focus.js +33 -0
  441. package/traits/gradient-shift.js +32 -0
  442. package/traits/haptic-feedback.js +28 -0
  443. package/traits/hotkey.js +62 -0
  444. package/traits/hoverable.js +26 -0
  445. package/traits/index.js +55 -0
  446. package/traits/inertia-drag.js +133 -0
  447. package/traits/intersection-observer.js +33 -0
  448. package/traits/keyboard-nav.js +36 -0
  449. package/traits/magnetic-hover.js +37 -0
  450. package/traits/noise-texture.js +30 -0
  451. package/traits/parallax.js +42 -0
  452. package/traits/portal.js +27 -0
  453. package/traits/pressable.js +75 -0
  454. package/traits/resizable.js +100 -0
  455. package/traits/resize-observer.js +31 -0
  456. package/traits/ripple.js +53 -0
  457. package/traits/roving-tabindex.js +67 -0
  458. package/traits/scale-press.js +43 -0
  459. package/traits/scroll-lock.js +27 -0
  460. package/traits/shimmer-loading.js +44 -0
  461. package/traits/snap-to-grid.js +28 -0
  462. package/traits/sound-feedback.js +30 -0
  463. package/traits/spring-animate.js +56 -0
  464. package/traits/tilt-hover.js +37 -0
  465. package/traits/tossable.js +178 -0
  466. package/traits/typeahead.js +63 -0
  467. package/traits/typewriter.js +35 -0
  468. package/traits/validation.js +118 -0
@@ -0,0 +1,42 @@
1
+ /**
2
+ * <app-nav-item-ui> — Single navigation link in app-nav-ui (optionally
3
+ * nested under app-nav-group-ui). Supports icon, label, and optional badge.
4
+ *
5
+ * Selection is managed by the parent app-nav-ui; setting `selected` is
6
+ * a side-effect of calling nav.select(item) or user click.
7
+ */
8
+
9
+ import { AdiaElement } from '@core/element.js';
10
+
11
+ class AdiaAppNavItem extends AdiaElement {
12
+ static properties = {
13
+ text: { type: String, default: '', reflect: true },
14
+ icon: { type: String, default: '', reflect: true },
15
+ value: { type: String, default: '', reflect: true },
16
+ badge: { type: String, default: '', reflect: true },
17
+ selected: { type: Boolean, default: false, reflect: true },
18
+ };
19
+
20
+ static template = () => null;
21
+
22
+ connected() {
23
+ this.setAttribute('role', 'link');
24
+ this.setAttribute('tabindex', '0');
25
+
26
+ if (!this.querySelector('[slot="text"]')) {
27
+ this.innerHTML = `
28
+ <span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
29
+ <span slot="text">${this.text}</span>
30
+ ${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
31
+ `;
32
+ }
33
+ }
34
+
35
+ render() {
36
+ const textEl = this.querySelector('[slot="text"]');
37
+ if (textEl) textEl.textContent = this.text;
38
+ }
39
+ }
40
+ customElements.define('app-nav-item-ui', AdiaAppNavItem);
41
+
42
+ export { AdiaAppNavItem };
@@ -0,0 +1,62 @@
1
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
2
+ name: AdiaAppNavItem
3
+ tag: app-nav-item-ui
4
+ component: AppNavItem
5
+ category: nav
6
+ version: 1
7
+ description: |
8
+ Single navigation link in app-nav-ui, optionally nested inside
9
+ app-nav-group-ui. Icon + label + optional badge. Selection is managed
10
+ by the parent app-nav-ui — set via clicking or nav.select(item).
11
+
12
+ props:
13
+ text:
14
+ type: string
15
+ default: ""
16
+ reflect: true
17
+ description: Item label.
18
+
19
+ icon:
20
+ type: string
21
+ default: ""
22
+ reflect: true
23
+ description: Phosphor icon name (leading).
24
+
25
+ value:
26
+ type: string
27
+ default: ""
28
+ reflect: true
29
+ description: Unique identifier for selection tracking (also the route / target id).
30
+
31
+ badge:
32
+ type: string
33
+ default: ""
34
+ reflect: true
35
+ description: Optional trailing badge text (count, "New", etc.).
36
+
37
+ selected:
38
+ type: boolean
39
+ default: false
40
+ reflect: true
41
+ description: Current selection. Managed by parent app-nav-ui — don't set multiple siblings.
42
+
43
+ events: {}
44
+
45
+ slots: {}
46
+
47
+ states:
48
+ - name: idle
49
+ description: Default.
50
+ - name: selected
51
+ attribute: selected
52
+ description: Currently selected nav destination.
53
+
54
+ traits: []
55
+
56
+ a2ui:
57
+ rules:
58
+ - Must be a descendant of app-nav-ui (direct child or via app-nav-group-ui).
59
+ - Only one sibling may have selected=true at a time; prefer calling nav.select() over setting the attribute manually.
60
+
61
+ keywords: [app-nav-item, nav, link, menu-item]
62
+ related: [AppNav, AppNavGroup]
@@ -0,0 +1,114 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://adiaui.dev/a2ui/v0_9/components/AppShell.json",
4
+ "title": "AppShell",
5
+ "description": "Behavior-only application shell. Wires sidebar toggles, resize handles,\na Cmd+K command palette, and a ResizeObserver that drives responsive\nsidebar collapse. Author supplies the DOM (aside[data-sidebar], main,\ndialog[data-command]); app-shell-ui binds the interactions.\n",
6
+ "type": "object",
7
+ "allOf": [
8
+ {
9
+ "$ref": "common_types.json#/$defs/ComponentCommon"
10
+ },
11
+ {
12
+ "$ref": "common_types.json#/$defs/CatalogComponentCommon"
13
+ }
14
+ ],
15
+ "properties": {
16
+ "component": {
17
+ "const": "AppShell"
18
+ },
19
+ "mode": {
20
+ "description": "Layout variant — default is bordered surface; rounded softens edges; borderless removes the outer chrome.",
21
+ "type": "string",
22
+ "enum": [
23
+ "",
24
+ "rounded",
25
+ "borderless"
26
+ ],
27
+ "default": ""
28
+ }
29
+ },
30
+ "required": [
31
+ "component"
32
+ ],
33
+ "unevaluatedProperties": false,
34
+ "x-adiaui": {
35
+ "anti_patterns": [],
36
+ "category": "layout",
37
+ "events": {
38
+ "command-select": {
39
+ "description": "Forwarded from the command palette when an option is chosen.",
40
+ "detail": {
41
+ "value": "string"
42
+ }
43
+ },
44
+ "sidebar-resize": {
45
+ "description": "Fired as a sidebar is dragged; debounced on the trailing edge.",
46
+ "detail": {
47
+ "sidebar": "string",
48
+ "width": "number"
49
+ }
50
+ },
51
+ "sidebar-toggle": {
52
+ "description": "Fired when a sidebar is collapsed or expanded.",
53
+ "detail": {
54
+ "expanded": "boolean",
55
+ "sidebar": "string"
56
+ }
57
+ }
58
+ },
59
+ "examples": [],
60
+ "keywords": [
61
+ "app-shell",
62
+ "shell",
63
+ "layout",
64
+ "admin",
65
+ "dashboard",
66
+ "sidebar",
67
+ "nav"
68
+ ],
69
+ "name": "AdiaAppShell",
70
+ "related": [
71
+ "AppNav",
72
+ "AppNavGroup",
73
+ "AppNavItem",
74
+ "Command"
75
+ ],
76
+ "slots": {
77
+ "default": {
78
+ "description": "Author-supplied page DOM. Expected structure — aside[data-sidebar] for navigation, main for content, optional dialog[data-command] for Cmd+K."
79
+ }
80
+ },
81
+ "states": [
82
+ {
83
+ "description": "Default, interactive shell.",
84
+ "name": "idle"
85
+ },
86
+ {
87
+ "description": "Leading sidebar is collapsed; content expands.",
88
+ "attribute": "data-sidebar-leading-collapsed",
89
+ "name": "collapsed-leading"
90
+ },
91
+ {
92
+ "description": "Trailing sidebar (inspector) is collapsed.",
93
+ "attribute": "data-sidebar-trailing-collapsed",
94
+ "name": "collapsed-trailing"
95
+ }
96
+ ],
97
+ "synonyms": {
98
+ "admin": [
99
+ "dashboard",
100
+ "shell",
101
+ "app-shell"
102
+ ],
103
+ "dashboard": [
104
+ "admin",
105
+ "shell",
106
+ "app-shell"
107
+ ]
108
+ },
109
+ "tag": "app-shell-ui",
110
+ "tokens": {},
111
+ "traits": [],
112
+ "version": 1
113
+ }
114
+ }
@@ -0,0 +1,14 @@
1
+ /* ═══════════════════════════════════════════════════════════════
2
+ App Shell — <app-shell-ui> pattern component CSS
3
+
4
+ Split into constituent parts for maintainability.
5
+ Import order matters: tokens first, then structure, then overrides.
6
+ ═══════════════════════════════════════════════════════════════ */
7
+
8
+ @import "./css/app-shell.tokens.css";
9
+ @import "./css/app-shell.shell.css";
10
+ @import "./css/app-shell.main.css";
11
+ @import "./css/app-shell.sidebar.css";
12
+ @import "./css/app-shell.collapsed.css";
13
+ @import "./css/app-shell.templates.css";
14
+ @import "./css/app-shell.helpers.css";
@@ -0,0 +1,251 @@
1
+ /**
2
+ * <app-shell-ui mode="rounded borderless">
3
+ * <aside data-sidebar="leading">...</aside>
4
+ * <main>...</main>
5
+ * <aside data-sidebar="trailing">...</aside>
6
+ * <dialog data-command>...</dialog>
7
+ * </app-shell-ui>
8
+ *
9
+ * Behavior-only app shell. Stamps no HTML — the page author writes the
10
+ * structure using semantic elements + data attributes. The component
11
+ * auto-wires four JS behaviors that CSS can't handle:
12
+ *
13
+ * 1. Sidebar resize (drag handle with snap thresholds)
14
+ * 2. Sidebar toggle (collapse/restore width)
15
+ * 3. Command palette (Cmd+K keyboard shortcut)
16
+ * 4. ResizeObserver (select placement in narrow sidebars)
17
+ *
18
+ * CSS handles everything else: layout, collapse, container queries,
19
+ * sticky headers, scroll containment, mode composition.
20
+ */
21
+
22
+ import { AdiaElement } from '@core/element.js';
23
+
24
+ const SNAP_THRESHOLD = 96;
25
+ const SNAP_MIN_USABLE = 160;
26
+
27
+ class AdiaAppShell extends AdiaElement {
28
+ static properties = {
29
+ mode: { type: String, default: '', reflect: true },
30
+ };
31
+
32
+ static template = () => null;
33
+
34
+ #sidebarWidths = new Map();
35
+ #resizeCleanups = [];
36
+ #sidebarRO = null;
37
+ #cmdKeyHandler = null;
38
+
39
+ connected() {
40
+ this.#setupToggles();
41
+ this.#setupResizeHandles();
42
+ this.#setupCommandPalette();
43
+ this.#setupResizeObserver();
44
+ }
45
+
46
+ disconnected() {
47
+ // Clean up resize handles
48
+ for (const cleanup of this.#resizeCleanups) cleanup();
49
+ this.#resizeCleanups = [];
50
+
51
+ // Clean up ResizeObserver
52
+ this.#sidebarRO?.disconnect();
53
+ this.#sidebarRO = null;
54
+
55
+ // Clean up Cmd+K
56
+ if (this.#cmdKeyHandler) {
57
+ document.removeEventListener('keydown', this.#cmdKeyHandler);
58
+ this.#cmdKeyHandler = null;
59
+ }
60
+ }
61
+
62
+ // ── Sidebar persistence ────────────────────────────────────
63
+
64
+ #persistSidebar(sidebarName, width) {
65
+ try { localStorage.setItem(`adia-sidebar-${sidebarName}`, width); } catch {}
66
+ }
67
+
68
+ #restoreSidebars() {
69
+ for (const sidebar of this.querySelectorAll('[data-sidebar]')) {
70
+ const name = sidebar.getAttribute('data-sidebar');
71
+ try {
72
+ const saved = localStorage.getItem(`adia-sidebar-${name}`);
73
+ if (saved) {
74
+ sidebar.style.width = saved;
75
+ // Only store as the "previous expanded width" if it's actually expanded.
76
+ // If collapsed, keep the default expanded width so toggle can restore it.
77
+ const w = parseFloat(saved);
78
+ if (isNaN(w) || w > SNAP_THRESHOLD) {
79
+ this.#sidebarWidths.set(name, saved);
80
+ }
81
+ }
82
+ } catch {}
83
+ }
84
+ }
85
+
86
+ // ── 1. Sidebar toggle ──────────────────────────────────────
87
+
88
+ #setupToggles() {
89
+ this.#restoreSidebars();
90
+
91
+ for (const btn of this.querySelectorAll('[data-sidebar-toggle]')) {
92
+ const sidebarName = btn.getAttribute('data-sidebar-toggle');
93
+ btn.addEventListener('click', () => {
94
+ const sidebar = this.querySelector(`[data-sidebar="${sidebarName}"]`);
95
+ if (!sidebar) return;
96
+
97
+ const isCollapsed = sidebar.getBoundingClientRect().width <= SNAP_THRESHOLD;
98
+
99
+ if (isCollapsed) {
100
+ // Expand: restore previous width
101
+ const prev = this.#sidebarWidths.get(sidebarName);
102
+ sidebar.style.width = prev || '';
103
+ this.#persistSidebar(sidebarName, prev || '');
104
+ } else {
105
+ // Collapse: save current width, set to min
106
+ this.#sidebarWidths.set(sidebarName, sidebar.style.width || getComputedStyle(sidebar).width);
107
+ const minW = getComputedStyle(sidebar).minWidth;
108
+ sidebar.style.width = minW;
109
+ this.#persistSidebar(sidebarName, minW);
110
+ }
111
+
112
+ this.dispatchEvent(new CustomEvent('sidebar-toggle', {
113
+ bubbles: true,
114
+ detail: { sidebar: sidebarName, expanded: !isCollapsed },
115
+ }));
116
+ });
117
+ }
118
+ }
119
+
120
+ // ── 2. Sidebar resize handles ──────────────────────────────
121
+
122
+ #setupResizeHandles() {
123
+ for (const handle of this.querySelectorAll('[data-sidebar] > [data-resize]')) {
124
+ const sidebar = handle.parentElement;
125
+ const sidebarName = sidebar.getAttribute('data-sidebar');
126
+ const isLeading = sidebarName === 'leading';
127
+
128
+ const onPointerDown = (e) => {
129
+ e.preventDefault();
130
+ handle.setPointerCapture(e.pointerId);
131
+ const startX = e.clientX;
132
+ const startW = sidebar.getBoundingClientRect().width;
133
+ sidebar.setAttribute('data-resizing', '');
134
+ document.documentElement.style.cursor = 'col-resize';
135
+
136
+ const onMove = (e) => {
137
+ const dx = e.clientX - startX;
138
+ const max = parseInt(getComputedStyle(sidebar).getPropertyValue('max-width')) || 480;
139
+ const w = Math.max(48, Math.min(max, startW + (isLeading ? dx : -dx)));
140
+ sidebar.style.width = `${w}px`;
141
+ };
142
+
143
+ const onUp = () => {
144
+ sidebar.removeAttribute('data-resizing');
145
+ document.documentElement.style.cursor = '';
146
+ handle.removeEventListener('pointermove', onMove);
147
+ handle.removeEventListener('pointerup', onUp);
148
+
149
+ // Snap logic
150
+ const w = sidebar.getBoundingClientRect().width;
151
+ if (w <= SNAP_THRESHOLD) {
152
+ sidebar.style.width = getComputedStyle(sidebar).minWidth;
153
+ } else if (w < SNAP_MIN_USABLE) {
154
+ sidebar.style.width = `${SNAP_MIN_USABLE}px`;
155
+ }
156
+
157
+ this.#persistSidebar(sidebarName, sidebar.style.width);
158
+ this.dispatchEvent(new CustomEvent('sidebar-resize', {
159
+ bubbles: true,
160
+ detail: { sidebar: sidebarName, width: sidebar.getBoundingClientRect().width },
161
+ }));
162
+ };
163
+
164
+ handle.addEventListener('pointermove', onMove);
165
+ handle.addEventListener('pointerup', onUp);
166
+ };
167
+
168
+ handle.addEventListener('pointerdown', onPointerDown);
169
+ this.#resizeCleanups.push(() => handle.removeEventListener('pointerdown', onPointerDown));
170
+ }
171
+ }
172
+
173
+ // ── 3. Command palette ─────────────────────────────────────
174
+
175
+ #setupCommandPalette() {
176
+ const dialog = this.querySelector('dialog[data-command]');
177
+ if (!dialog) return;
178
+
179
+ const cmdEl = dialog.querySelector('command-ui');
180
+ const nav = this.querySelector('app-nav-ui');
181
+
182
+ const openCmd = () => {
183
+ dialog.showModal();
184
+ if (cmdEl) { cmdEl.open = true; cmdEl.value = ''; cmdEl.focus(); }
185
+ };
186
+
187
+ const closeCmd = () => {
188
+ dialog.close();
189
+ if (cmdEl) cmdEl.open = false;
190
+ };
191
+
192
+ // Trigger elements
193
+ for (const trigger of this.querySelectorAll('[data-command-trigger]')) {
194
+ trigger.addEventListener('click', (e) => {
195
+ e.stopPropagation();
196
+ openCmd();
197
+ });
198
+ }
199
+
200
+ // Backdrop click closes
201
+ dialog.addEventListener('click', (e) => {
202
+ if (e.target === dialog) closeCmd();
203
+ });
204
+
205
+ // Command-n events
206
+ if (cmdEl) {
207
+ cmdEl.addEventListener('dismiss', closeCmd);
208
+ cmdEl.addEventListener('select', (e) => {
209
+ closeCmd();
210
+ if (nav) {
211
+ const item = nav.querySelector(`app-nav-item-ui[value="${e.detail.value}"]`);
212
+ if (item) nav.select(item);
213
+ }
214
+ this.dispatchEvent(new CustomEvent('command-select', {
215
+ bubbles: true,
216
+ detail: e.detail,
217
+ }));
218
+ });
219
+ }
220
+
221
+ // Cmd+K / Ctrl+K
222
+ this.#cmdKeyHandler = (e) => {
223
+ if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
224
+ e.preventDefault();
225
+ dialog.open ? closeCmd() : openCmd();
226
+ }
227
+ };
228
+ document.addEventListener('keydown', this.#cmdKeyHandler);
229
+ }
230
+
231
+ // ── 4. ResizeObserver for select placement ─────────────────
232
+
233
+ #setupResizeObserver() {
234
+ this.#sidebarRO = new ResizeObserver((entries) => {
235
+ for (const entry of entries) {
236
+ const sidebar = entry.target;
237
+ const narrow = entry.contentBoxSize[0].inlineSize <= SNAP_THRESHOLD;
238
+ for (const sel of sidebar.querySelectorAll('select-ui')) {
239
+ sel.setAttribute('placement', narrow ? 'right' : 'bottom-start');
240
+ }
241
+ }
242
+ });
243
+
244
+ for (const sb of this.querySelectorAll('[data-sidebar]')) {
245
+ this.#sidebarRO.observe(sb);
246
+ }
247
+ }
248
+ }
249
+
250
+ customElements.define('app-shell-ui', AdiaAppShell);
251
+ export { AdiaAppShell };
@@ -0,0 +1,66 @@
1
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
2
+ name: AdiaAppShell
3
+ tag: app-shell-ui
4
+ component: AppShell
5
+ category: layout
6
+ version: 1
7
+ description: |
8
+ Behavior-only application shell. Wires sidebar toggles, resize handles,
9
+ a Cmd+K command palette, and a ResizeObserver that drives responsive
10
+ sidebar collapse. Author supplies the DOM (aside[data-sidebar], main,
11
+ dialog[data-command]); app-shell-ui binds the interactions.
12
+
13
+ props:
14
+ mode:
15
+ type: string
16
+ default: ""
17
+ enum: ["", rounded, borderless]
18
+ reflect: true
19
+ description: Layout variant — default is bordered surface; rounded softens edges; borderless removes the outer chrome.
20
+
21
+ events:
22
+ sidebar-toggle:
23
+ description: Fired when a sidebar is collapsed or expanded.
24
+ detail:
25
+ sidebar: string
26
+ expanded: boolean
27
+ sidebar-resize:
28
+ description: Fired as a sidebar is dragged; debounced on the trailing edge.
29
+ detail:
30
+ sidebar: string
31
+ width: number
32
+ command-select:
33
+ description: Forwarded from the command palette when an option is chosen.
34
+ detail:
35
+ value: string
36
+
37
+ slots:
38
+ default:
39
+ description: >-
40
+ Author-supplied page DOM. Expected structure — aside[data-sidebar] for
41
+ navigation, main for content, optional dialog[data-command] for Cmd+K.
42
+
43
+ states:
44
+ - name: idle
45
+ description: Default, interactive shell.
46
+ - name: collapsed-leading
47
+ attribute: data-sidebar-leading-collapsed
48
+ description: Leading sidebar is collapsed; content expands.
49
+ - name: collapsed-trailing
50
+ attribute: data-sidebar-trailing-collapsed
51
+ description: Trailing sidebar (inspector) is collapsed.
52
+
53
+ traits: []
54
+
55
+ a2ui:
56
+ rules:
57
+ - >-
58
+ app-shell-ui is a behavior wrapper; its children are native HTML landmarks
59
+ (aside, main, header). Don't wrap them in col-ui/row-ui — app-shell.css
60
+ handles grid layout based on [data-sidebar] attributes.
61
+
62
+ keywords: [app-shell, shell, layout, admin, dashboard, sidebar, nav]
63
+ synonyms:
64
+ admin: [dashboard, shell, app-shell]
65
+ dashboard: [admin, shell, app-shell]
66
+ related: [AppNav, AppNavGroup, AppNavItem, Command]
@@ -0,0 +1,86 @@
1
+ /* ═══════════════════════════════════════════════════════════════
2
+ App Shell — Sidebar collapsed state
3
+
4
+ @container sidebar (max-width: 96px)
5
+
6
+ All collapse behavior is CSS-driven via container queries.
7
+ JS only handles:
8
+ - Resize drag with snap (≤96px → 48px, 97-159px → 160px)
9
+ - Toggle button (sets width to min/restore)
10
+ - Select placement attribute (bottom-start → right)
11
+ - Nav-group popover-vs-toggle (checks width at click time)
12
+ ═══════════════════════════════════════════════════════════════ */
13
+
14
+ @container sidebar (max-width: 96px) {
15
+ /* Center header/footer content */
16
+ header, footer {
17
+ justify-content: center;
18
+ padding: var(--page-sidebar-px);
19
+ }
20
+
21
+ /* Center section content */
22
+ section {
23
+ display: flex;
24
+ flex-direction: column;
25
+ align-items: center;
26
+ }
27
+
28
+ /* Select: hide text + caret, keep leading icon/avatar */
29
+ select-ui [slot="display"],
30
+ select-ui [slot="caret"] {
31
+ display: none;
32
+ }
33
+
34
+ select-ui [slot="trigger"] {
35
+ justify-content: center;
36
+ padding: 0;
37
+ min-height: var(--page-header-height);
38
+ }
39
+
40
+ /* Select leading: bump icon/avatar size for collapsed state */
41
+ select-ui [slot="leading"] {
42
+ --a-icon-size: var(--page-sidebar-collapsed-icon);
43
+ font-size: var(--page-sidebar-collapsed-icon);
44
+ }
45
+
46
+ select-ui img[slot="leading"] {
47
+ width: var(--page-sidebar-collapsed-avatar);
48
+ height: var(--page-sidebar-collapsed-avatar);
49
+ }
50
+
51
+ /* Nav: hide all text/meta, show only icons */
52
+ app-nav-ui [slot="text"],
53
+ app-nav-ui [slot="badge"],
54
+ app-nav-ui [slot="caret"],
55
+ app-nav-ui [slot="trailing"],
56
+ app-nav-ui [data-nav-label],
57
+ app-nav-ui [data-nav-divider] {
58
+ display: none !important;
59
+ }
60
+
61
+ /* Nav items/group headers: center icon, ensure square hit area */
62
+ app-nav-group-ui [slot="header"] {
63
+ justify-content: center;
64
+ padding: 0;
65
+ min-height: var(--nav-group-row-height);
66
+ min-width: var(--nav-group-row-height);
67
+ }
68
+
69
+ app-nav-item-ui {
70
+ justify-content: center;
71
+ padding: 0;
72
+ min-height: var(--nav-item-row-height);
73
+ min-width: var(--nav-item-row-height);
74
+ }
75
+
76
+ /* Button: icon-only mode */
77
+ button-ui {
78
+ --button-px: 0;
79
+ width: auto !important;
80
+ justify-content: center;
81
+ }
82
+
83
+ button-ui [slot="trailing"] {
84
+ display: none;
85
+ }
86
+ }
@@ -0,0 +1,42 @@
1
+ /* ═══════════════════════════════════════════════════════════════
2
+ App Shell — Layout helpers
3
+
4
+ Generic layout utilities used across admin pages.
5
+ ═══════════════════════════════════════════════════════════════ */
6
+
7
+ /* Flex spacer — pushes siblings to opposite ends */
8
+ [data-spacer] { flex: 1; }
9
+
10
+ /* Inline action group (buttons, icons) */
11
+ [data-actions] {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: var(--page-actions-gap);
15
+ }
16
+
17
+ /* ── Form layout helpers ── */
18
+
19
+ /* 2-column grid (default), 3-column with data-grid="3" */
20
+ [data-grid] {
21
+ display: grid;
22
+ grid-template-columns: 1fr 1fr;
23
+ gap: var(--page-grid-gap);
24
+ }
25
+
26
+ [data-grid="3"] {
27
+ grid-template-columns: 1fr 1fr 1fr;
28
+ }
29
+
30
+ /* Vertical stack */
31
+ [data-col] {
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: var(--page-grid-gap);
35
+ }
36
+
37
+ /* Horizontal row */
38
+ [data-row] {
39
+ display: flex;
40
+ align-items: center;
41
+ gap: var(--page-grid-gap);
42
+ }