@loomui-ng/ui 0.0.0-stage → 0.1.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 (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +46 -2
  3. package/accordion/README.md +38 -0
  4. package/alert/README.md +32 -0
  5. package/alert-dialog/README.md +37 -0
  6. package/aspect-ratio/README.md +24 -0
  7. package/attachment/README.md +40 -0
  8. package/avatar/README.md +34 -0
  9. package/badge/README.md +29 -0
  10. package/breadcrumb/README.md +33 -0
  11. package/bubble/README.md +32 -0
  12. package/button/README.md +31 -0
  13. package/button-group/README.md +30 -0
  14. package/calendar/README.md +35 -0
  15. package/card/README.md +41 -0
  16. package/carousel/README.md +41 -0
  17. package/chart/README.md +25 -0
  18. package/checkbox/README.md +31 -0
  19. package/collapsible/README.md +31 -0
  20. package/combobox/README.md +47 -0
  21. package/command/README.md +44 -0
  22. package/context-menu/README.md +36 -0
  23. package/data-table/README.md +39 -0
  24. package/date-picker/README.md +23 -0
  25. package/dialog/README.md +52 -0
  26. package/direction/README.md +19 -0
  27. package/drawer/README.md +37 -0
  28. package/dropdown-menu/README.md +46 -0
  29. package/empty/README.md +38 -0
  30. package/fesm2022/loomui-ng-ui-accordion.mjs +555 -0
  31. package/fesm2022/loomui-ng-ui-accordion.mjs.map +1 -0
  32. package/fesm2022/loomui-ng-ui-alert-dialog.mjs +652 -0
  33. package/fesm2022/loomui-ng-ui-alert-dialog.mjs.map +1 -0
  34. package/fesm2022/loomui-ng-ui-alert.mjs +286 -0
  35. package/fesm2022/loomui-ng-ui-alert.mjs.map +1 -0
  36. package/fesm2022/loomui-ng-ui-aspect-ratio.mjs +97 -0
  37. package/fesm2022/loomui-ng-ui-aspect-ratio.mjs.map +1 -0
  38. package/fesm2022/loomui-ng-ui-attachment.mjs +713 -0
  39. package/fesm2022/loomui-ng-ui-attachment.mjs.map +1 -0
  40. package/fesm2022/loomui-ng-ui-avatar.mjs +561 -0
  41. package/fesm2022/loomui-ng-ui-avatar.mjs.map +1 -0
  42. package/fesm2022/loomui-ng-ui-badge.mjs +102 -0
  43. package/fesm2022/loomui-ng-ui-badge.mjs.map +1 -0
  44. package/fesm2022/loomui-ng-ui-breadcrumb.mjs +520 -0
  45. package/fesm2022/loomui-ng-ui-breadcrumb.mjs.map +1 -0
  46. package/fesm2022/loomui-ng-ui-bubble.mjs +386 -0
  47. package/fesm2022/loomui-ng-ui-bubble.mjs.map +1 -0
  48. package/fesm2022/loomui-ng-ui-button-group.mjs +193 -0
  49. package/fesm2022/loomui-ng-ui-button-group.mjs.map +1 -0
  50. package/fesm2022/loomui-ng-ui-button.mjs +162 -0
  51. package/fesm2022/loomui-ng-ui-button.mjs.map +1 -0
  52. package/fesm2022/loomui-ng-ui-calendar.mjs +681 -0
  53. package/fesm2022/loomui-ng-ui-calendar.mjs.map +1 -0
  54. package/fesm2022/loomui-ng-ui-card.mjs +461 -0
  55. package/fesm2022/loomui-ng-ui-card.mjs.map +1 -0
  56. package/fesm2022/loomui-ng-ui-carousel.mjs +532 -0
  57. package/fesm2022/loomui-ng-ui-carousel.mjs.map +1 -0
  58. package/fesm2022/loomui-ng-ui-chart.mjs +373 -0
  59. package/fesm2022/loomui-ng-ui-chart.mjs.map +1 -0
  60. package/fesm2022/loomui-ng-ui-checkbox.mjs +265 -0
  61. package/fesm2022/loomui-ng-ui-checkbox.mjs.map +1 -0
  62. package/fesm2022/loomui-ng-ui-collapsible.mjs +274 -0
  63. package/fesm2022/loomui-ng-ui-collapsible.mjs.map +1 -0
  64. package/fesm2022/loomui-ng-ui-combobox.mjs +971 -0
  65. package/fesm2022/loomui-ng-ui-combobox.mjs.map +1 -0
  66. package/fesm2022/loomui-ng-ui-command.mjs +982 -0
  67. package/fesm2022/loomui-ng-ui-command.mjs.map +1 -0
  68. package/fesm2022/loomui-ng-ui-context-menu.mjs +1359 -0
  69. package/fesm2022/loomui-ng-ui-context-menu.mjs.map +1 -0
  70. package/fesm2022/loomui-ng-ui-data-table.mjs +535 -0
  71. package/fesm2022/loomui-ng-ui-data-table.mjs.map +1 -0
  72. package/fesm2022/loomui-ng-ui-date-picker.mjs +312 -0
  73. package/fesm2022/loomui-ng-ui-date-picker.mjs.map +1 -0
  74. package/fesm2022/loomui-ng-ui-dialog.mjs +508 -0
  75. package/fesm2022/loomui-ng-ui-dialog.mjs.map +1 -0
  76. package/fesm2022/loomui-ng-ui-direction.mjs +112 -0
  77. package/fesm2022/loomui-ng-ui-direction.mjs.map +1 -0
  78. package/fesm2022/loomui-ng-ui-drawer.mjs +590 -0
  79. package/fesm2022/loomui-ng-ui-drawer.mjs.map +1 -0
  80. package/fesm2022/loomui-ng-ui-dropdown-menu.mjs +1322 -0
  81. package/fesm2022/loomui-ng-ui-dropdown-menu.mjs.map +1 -0
  82. package/fesm2022/loomui-ng-ui-empty.mjs +408 -0
  83. package/fesm2022/loomui-ng-ui-empty.mjs.map +1 -0
  84. package/fesm2022/loomui-ng-ui-field.mjs +630 -0
  85. package/fesm2022/loomui-ng-ui-field.mjs.map +1 -0
  86. package/fesm2022/loomui-ng-ui-hover-card.mjs +230 -0
  87. package/fesm2022/loomui-ng-ui-hover-card.mjs.map +1 -0
  88. package/fesm2022/loomui-ng-ui-icon.mjs +498 -0
  89. package/fesm2022/loomui-ng-ui-icon.mjs.map +1 -0
  90. package/fesm2022/loomui-ng-ui-input-group.mjs +463 -0
  91. package/fesm2022/loomui-ng-ui-input-group.mjs.map +1 -0
  92. package/fesm2022/loomui-ng-ui-input-otp.mjs +586 -0
  93. package/fesm2022/loomui-ng-ui-input-otp.mjs.map +1 -0
  94. package/fesm2022/loomui-ng-ui-input.mjs +289 -0
  95. package/fesm2022/loomui-ng-ui-input.mjs.map +1 -0
  96. package/fesm2022/loomui-ng-ui-item.mjs +598 -0
  97. package/fesm2022/loomui-ng-ui-item.mjs.map +1 -0
  98. package/fesm2022/loomui-ng-ui-kbd.mjs +129 -0
  99. package/fesm2022/loomui-ng-ui-kbd.mjs.map +1 -0
  100. package/fesm2022/loomui-ng-ui-label.mjs +68 -0
  101. package/fesm2022/loomui-ng-ui-label.mjs.map +1 -0
  102. package/fesm2022/loomui-ng-ui-marker.mjs +234 -0
  103. package/fesm2022/loomui-ng-ui-marker.mjs.map +1 -0
  104. package/fesm2022/loomui-ng-ui-menubar.mjs +1523 -0
  105. package/fesm2022/loomui-ng-ui-menubar.mjs.map +1 -0
  106. package/fesm2022/loomui-ng-ui-message-scroller.mjs +519 -0
  107. package/fesm2022/loomui-ng-ui-message-scroller.mjs.map +1 -0
  108. package/fesm2022/loomui-ng-ui-message.mjs +408 -0
  109. package/fesm2022/loomui-ng-ui-message.mjs.map +1 -0
  110. package/fesm2022/loomui-ng-ui-native-select.mjs +389 -0
  111. package/fesm2022/loomui-ng-ui-native-select.mjs.map +1 -0
  112. package/fesm2022/loomui-ng-ui-navigation-menu.mjs +609 -0
  113. package/fesm2022/loomui-ng-ui-navigation-menu.mjs.map +1 -0
  114. package/fesm2022/loomui-ng-ui-pagination.mjs +611 -0
  115. package/fesm2022/loomui-ng-ui-pagination.mjs.map +1 -0
  116. package/fesm2022/loomui-ng-ui-popover.mjs +358 -0
  117. package/fesm2022/loomui-ng-ui-popover.mjs.map +1 -0
  118. package/fesm2022/loomui-ng-ui-progress.mjs +159 -0
  119. package/fesm2022/loomui-ng-ui-progress.mjs.map +1 -0
  120. package/fesm2022/loomui-ng-ui-questionnaire.mjs +1012 -0
  121. package/fesm2022/loomui-ng-ui-questionnaire.mjs.map +1 -0
  122. package/fesm2022/loomui-ng-ui-radio-group.mjs +399 -0
  123. package/fesm2022/loomui-ng-ui-radio-group.mjs.map +1 -0
  124. package/fesm2022/loomui-ng-ui-resizable.mjs +518 -0
  125. package/fesm2022/loomui-ng-ui-resizable.mjs.map +1 -0
  126. package/fesm2022/loomui-ng-ui-scroll-area.mjs +135 -0
  127. package/fesm2022/loomui-ng-ui-scroll-area.mjs.map +1 -0
  128. package/fesm2022/loomui-ng-ui-select.mjs +863 -0
  129. package/fesm2022/loomui-ng-ui-select.mjs.map +1 -0
  130. package/fesm2022/loomui-ng-ui-separator.mjs +114 -0
  131. package/fesm2022/loomui-ng-ui-separator.mjs.map +1 -0
  132. package/fesm2022/loomui-ng-ui-sheet.mjs +530 -0
  133. package/fesm2022/loomui-ng-ui-sheet.mjs.map +1 -0
  134. package/fesm2022/loomui-ng-ui-sidebar.mjs +1918 -0
  135. package/fesm2022/loomui-ng-ui-sidebar.mjs.map +1 -0
  136. package/fesm2022/loomui-ng-ui-skeleton.mjs +69 -0
  137. package/fesm2022/loomui-ng-ui-skeleton.mjs.map +1 -0
  138. package/fesm2022/loomui-ng-ui-slider.mjs +390 -0
  139. package/fesm2022/loomui-ng-ui-slider.mjs.map +1 -0
  140. package/fesm2022/loomui-ng-ui-spinner.mjs +85 -0
  141. package/fesm2022/loomui-ng-ui-spinner.mjs.map +1 -0
  142. package/fesm2022/loomui-ng-ui-switch.mjs +212 -0
  143. package/fesm2022/loomui-ng-ui-switch.mjs.map +1 -0
  144. package/fesm2022/loomui-ng-ui-table.mjs +559 -0
  145. package/fesm2022/loomui-ng-ui-table.mjs.map +1 -0
  146. package/fesm2022/loomui-ng-ui-tabs.mjs +544 -0
  147. package/fesm2022/loomui-ng-ui-tabs.mjs.map +1 -0
  148. package/fesm2022/loomui-ng-ui-textarea.mjs +206 -0
  149. package/fesm2022/loomui-ng-ui-textarea.mjs.map +1 -0
  150. package/fesm2022/loomui-ng-ui-toast.mjs +432 -0
  151. package/fesm2022/loomui-ng-ui-toast.mjs.map +1 -0
  152. package/fesm2022/loomui-ng-ui-toggle-group.mjs +477 -0
  153. package/fesm2022/loomui-ng-ui-toggle-group.mjs.map +1 -0
  154. package/fesm2022/loomui-ng-ui-toggle.mjs +219 -0
  155. package/fesm2022/loomui-ng-ui-toggle.mjs.map +1 -0
  156. package/fesm2022/loomui-ng-ui-tooltip.mjs +240 -0
  157. package/fesm2022/loomui-ng-ui-tooltip.mjs.map +1 -0
  158. package/fesm2022/loomui-ng-ui-typography.mjs +129 -0
  159. package/fesm2022/loomui-ng-ui-typography.mjs.map +1 -0
  160. package/fesm2022/loomui-ng-ui-utils.mjs +1533 -0
  161. package/fesm2022/loomui-ng-ui-utils.mjs.map +1 -0
  162. package/fesm2022/loomui-ng-ui.mjs +4 -0
  163. package/fesm2022/loomui-ng-ui.mjs.map +1 -0
  164. package/field/README.md +43 -0
  165. package/hover-card/README.md +31 -0
  166. package/icon/README.md +42 -0
  167. package/input/README.md +26 -0
  168. package/input-group/README.md +40 -0
  169. package/input-otp/README.md +35 -0
  170. package/item/README.md +33 -0
  171. package/kbd/README.md +21 -0
  172. package/label/README.md +24 -0
  173. package/marker/README.md +24 -0
  174. package/menubar/README.md +40 -0
  175. package/message/README.md +32 -0
  176. package/message-scroller/README.md +40 -0
  177. package/native-select/README.md +26 -0
  178. package/navigation-menu/README.md +39 -0
  179. package/package.json +325 -3
  180. package/pagination/README.md +37 -0
  181. package/popover/README.md +37 -0
  182. package/progress/README.md +25 -0
  183. package/questionnaire/README.md +52 -0
  184. package/radio-group/README.md +33 -0
  185. package/resizable/README.md +37 -0
  186. package/scroll-area/README.md +25 -0
  187. package/select/README.md +45 -0
  188. package/separator/README.md +28 -0
  189. package/sheet/README.md +38 -0
  190. package/sidebar/README.md +60 -0
  191. package/skeleton/README.md +21 -0
  192. package/slider/README.md +29 -0
  193. package/spinner/README.md +15 -0
  194. package/styles/loomui.css +330 -0
  195. package/switch/README.md +29 -0
  196. package/table/README.md +31 -0
  197. package/tabs/README.md +42 -0
  198. package/textarea/README.md +28 -0
  199. package/toast/README.md +27 -0
  200. package/toggle/README.md +27 -0
  201. package/toggle-group/README.md +37 -0
  202. package/tooltip/README.md +31 -0
  203. package/types/loomui-ng-ui-accordion.d.ts +141 -0
  204. package/types/loomui-ng-ui-alert-dialog.d.ts +175 -0
  205. package/types/loomui-ng-ui-alert.d.ts +77 -0
  206. package/types/loomui-ng-ui-aspect-ratio.d.ts +31 -0
  207. package/types/loomui-ng-ui-attachment.d.ts +192 -0
  208. package/types/loomui-ng-ui-avatar.d.ts +147 -0
  209. package/types/loomui-ng-ui-badge.d.ts +32 -0
  210. package/types/loomui-ng-ui-breadcrumb.d.ts +118 -0
  211. package/types/loomui-ng-ui-bubble.d.ts +100 -0
  212. package/types/loomui-ng-ui-button-group.d.ts +51 -0
  213. package/types/loomui-ng-ui-button.d.ts +57 -0
  214. package/types/loomui-ng-ui-calendar.d.ts +171 -0
  215. package/types/loomui-ng-ui-card.d.ts +123 -0
  216. package/types/loomui-ng-ui-carousel.d.ts +140 -0
  217. package/types/loomui-ng-ui-chart.d.ts +95 -0
  218. package/types/loomui-ng-ui-checkbox.d.ts +62 -0
  219. package/types/loomui-ng-ui-collapsible.d.ts +74 -0
  220. package/types/loomui-ng-ui-combobox.d.ts +229 -0
  221. package/types/loomui-ng-ui-command.d.ts +231 -0
  222. package/types/loomui-ng-ui-context-menu.d.ts +288 -0
  223. package/types/loomui-ng-ui-data-table.d.ts +111 -0
  224. package/types/loomui-ng-ui-date-picker.d.ts +63 -0
  225. package/types/loomui-ng-ui-dialog.d.ts +127 -0
  226. package/types/loomui-ng-ui-direction.d.ts +42 -0
  227. package/types/loomui-ng-ui-drawer.d.ts +149 -0
  228. package/types/loomui-ng-ui-dropdown-menu.d.ts +258 -0
  229. package/types/loomui-ng-ui-empty.d.ts +109 -0
  230. package/types/loomui-ng-ui-field.d.ts +169 -0
  231. package/types/loomui-ng-ui-hover-card.d.ts +62 -0
  232. package/types/loomui-ng-ui-icon.d.ts +156 -0
  233. package/types/loomui-ng-ui-input-group.d.ts +130 -0
  234. package/types/loomui-ng-ui-input-otp.d.ts +149 -0
  235. package/types/loomui-ng-ui-input.d.ts +89 -0
  236. package/types/loomui-ng-ui-item.d.ts +157 -0
  237. package/types/loomui-ng-ui-kbd.d.ts +36 -0
  238. package/types/loomui-ng-ui-label.d.ts +19 -0
  239. package/types/loomui-ng-ui-marker.d.ts +61 -0
  240. package/types/loomui-ng-ui-menubar.d.ts +321 -0
  241. package/types/loomui-ng-ui-message-scroller.d.ts +138 -0
  242. package/types/loomui-ng-ui-message.d.ts +109 -0
  243. package/types/loomui-ng-ui-native-select.d.ts +84 -0
  244. package/types/loomui-ng-ui-navigation-menu.d.ts +160 -0
  245. package/types/loomui-ng-ui-pagination.d.ts +130 -0
  246. package/types/loomui-ng-ui-popover.d.ts +90 -0
  247. package/types/loomui-ng-ui-progress.d.ts +39 -0
  248. package/types/loomui-ng-ui-questionnaire.d.ts +274 -0
  249. package/types/loomui-ng-ui-radio-group.d.ts +109 -0
  250. package/types/loomui-ng-ui-resizable.d.ts +121 -0
  251. package/types/loomui-ng-ui-scroll-area.d.ts +44 -0
  252. package/types/loomui-ng-ui-select.d.ts +204 -0
  253. package/types/loomui-ng-ui-separator.d.ts +35 -0
  254. package/types/loomui-ng-ui-sheet.d.ts +124 -0
  255. package/types/loomui-ng-ui-sidebar.d.ts +485 -0
  256. package/types/loomui-ng-ui-skeleton.d.ts +20 -0
  257. package/types/loomui-ng-ui-slider.d.ts +103 -0
  258. package/types/loomui-ng-ui-spinner.d.ts +19 -0
  259. package/types/loomui-ng-ui-switch.d.ts +56 -0
  260. package/types/loomui-ng-ui-table.d.ts +148 -0
  261. package/types/loomui-ng-ui-tabs.d.ts +148 -0
  262. package/types/loomui-ng-ui-textarea.d.ts +52 -0
  263. package/types/loomui-ng-ui-toast.d.ts +97 -0
  264. package/types/loomui-ng-ui-toggle-group.d.ts +138 -0
  265. package/types/loomui-ng-ui-toggle.d.ts +63 -0
  266. package/types/loomui-ng-ui-tooltip.d.ts +63 -0
  267. package/types/loomui-ng-ui-typography.d.ts +42 -0
  268. package/types/loomui-ng-ui-utils.d.ts +392 -0
  269. package/types/loomui-ng-ui.d.ts +5 -0
  270. package/typography/README.md +29 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loomui-ng-ui-utils.mjs","names":[],"sources":["../../../libs/ui/utils/cn.ts","../../../libs/ui/utils/overlay-helpers.ts","../../../libs/ui/utils/layer.ts","../../../libs/ui/utils/popper.ts","../../../libs/ui/utils/modal.ts","../../../libs/ui/utils/menu.ts","../../../libs/ui/utils/elements.ts","../../../libs/ui/utils/element-host.ts","../../../libs/ui/utils/native-control.ts"],"sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","let uidCounter = 0;\n/** Unique, stable-per-session id like `ui-dialog-3`. */\nexport const nextId = (prefix: string): string => `${prefix}-${uidCounter++}`;\n\n/**\n * Radix (via `aria-hidden`) hides everything outside a modal layer from assistive tech.\n * Marks every <body> child except the CDK overlay container with aria-hidden + data-aria-hidden,\n * and returns a function that restores the previous state.\n */\nexport function hideOthers(keep: Element): () => void {\n const changed: { el: Element; prev: string | null }[] = [];\n for (const el of Array.from(document.body.children)) {\n if (el === keep || el.contains(keep) || el.tagName === 'SCRIPT') continue;\n changed.push({ el, prev: el.getAttribute('aria-hidden') });\n el.setAttribute('aria-hidden', 'true');\n el.setAttribute('data-aria-hidden', 'true');\n }\n return () => {\n for (const { el, prev } of changed) {\n el.removeAttribute('data-aria-hidden');\n if (prev === null) el.removeAttribute('aria-hidden');\n else el.setAttribute('aria-hidden', prev);\n }\n };\n}\n\n/**\n * Resolves when the element's CSS animations (tw-animate-css `animate-out`) have finished, or after a\n * fallback timeout so we never keep an overlay mounted forever (reduced motion, no animation, hidden tab).\n */\nexport function whenAnimationDone(el: HTMLElement | null, fallbackMs = 250): Promise<void> {\n return new Promise((resolve) => {\n if (!el) return resolve();\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n el.removeEventListener('animationend', onEnd);\n el.removeEventListener('animationcancel', onEnd);\n clearTimeout(timer);\n resolve();\n };\n const onEnd = (e: Event) => {\n if (e.target === el) finish();\n };\n el.addEventListener('animationend', onEnd);\n el.addEventListener('animationcancel', onEnd);\n const timer = setTimeout(finish, fallbackMs);\n const running = typeof el.getAnimations === 'function' ? el.getAnimations().length : 0;\n if (!running) finish();\n });\n}\n","import { Directive, effect, model, signal, untracked } from '@angular/core';\nimport { nextId, whenAnimationDone } from './overlay-helpers';\n\n/**\n * State holder shared by every overlay root (Dialog, Sheet, Popover, DropdownMenu, Select, Tooltip).\n * `open` is the source of truth; `mounted` stays true until the exit animation finishes so the content can\n * play tw-animate-css `animate-out` with data-state=\"closed\" (observed on the live site).\n */\n@Directive()\nexport abstract class UiLayerRoot {\n readonly open = model(false);\n readonly id = nextId('ui-layer');\n readonly mounted = signal(false);\n readonly state = signal<'open' | 'closed'>('closed');\n readonly trigger = signal<HTMLElement | null>(null);\n readonly contentEl = signal<HTMLElement | null>(null);\n /** Virtual anchor (context menus open at the pointer instead of a trigger element). */\n readonly anchorPoint = signal<{ x: number; y: number } | null>(null);\n /** Panes of nested layers (sub-menus): clicks inside them are not \"outside\" for this layer. */\n readonly childPanes = new Set<HTMLElement>();\n\n constructor() {\n effect(() => {\n const open = this.open();\n untracked(() => {\n if (open) {\n this.mounted.set(true);\n this.state.set('open');\n } else if (this.mounted()) {\n this.state.set('closed');\n void whenAnimationDone(this.contentEl()).then(() => {\n if (!this.open()) this.mounted.set(false);\n });\n }\n });\n });\n }\n\n toggle(): void {\n this.open.update((v) => !v);\n }\n close(): void {\n this.open.set(false);\n }\n}\n","import { Directionality } from '@angular/cdk/bidi';\nimport {\n ConnectedPosition,\n ConnectedOverlayPositionChange,\n Overlay,\n OverlayRef,\n} from '@angular/cdk/overlay';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { DestroyRef, Directive, effect, ElementRef, inject, Injector, input, untracked } from '@angular/core';\nimport { UiLayerRoot } from './layer';\n\nexport type Side = 'top' | 'right' | 'bottom' | 'left';\nexport type Align = 'start' | 'center' | 'end';\n\ninterface Meta {\n side: Side;\n align: Align;\n}\n\nconst OPPOSITE: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\n/** Preferred placement first, then the opposite side as a flip fallback (what Radix/floating-ui do). */\nexport function buildPositions(\n side: Side,\n align: Align,\n sideOffset: number,\n rtl: boolean,\n): { positions: ConnectedPosition[]; meta: WeakMap<ConnectedPosition, Meta> } {\n const meta = new WeakMap<ConnectedPosition, Meta>();\n const make = (s: Side): ConnectedPosition => {\n let p: ConnectedPosition;\n const xAlign = align === 'center' ? 'center' : align; // logical start/end (flips with dir like floating-ui)\n if (s === 'bottom' || s === 'top') {\n p = {\n originX: xAlign,\n originY: s === 'bottom' ? 'bottom' : 'top',\n overlayX: xAlign,\n overlayY: s === 'bottom' ? 'top' : 'bottom',\n offsetY: s === 'bottom' ? sideOffset : -sideOffset,\n };\n } else {\n const yAlign = align === 'start' ? 'top' : align === 'end' ? 'bottom' : 'center';\n // physical left/right regardless of direction\n const outerX = (s === 'right') !== rtl ? 'end' : 'start';\n const innerX = outerX === 'end' ? 'start' : 'end';\n p = {\n originX: outerX,\n originY: yAlign,\n overlayX: innerX,\n overlayY: yAlign,\n offsetX: s === 'right' ? sideOffset : -sideOffset,\n };\n }\n meta.set(p, { side: s, align });\n return p;\n };\n return { positions: [make(side), make(OPPOSITE[side])], meta };\n}\n\nfunction transformOrigin(side: Side, align: Align): string {\n const x = align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n const y = align === 'start' ? 'top' : align === 'end' ? 'bottom' : 'center';\n if (side === 'bottom') return `${x} top`;\n if (side === 'top') return `${x} bottom`;\n if (side === 'right') return `left ${y}`;\n return `right ${y}`;\n}\n\n/**\n * Base for popper-based content (Popover, DropdownMenu, Select, Tooltip). The host element is declared inline,\n * hidden, and moved into a CDK connected overlay (DomPortal) while `root.mounted()`.\n */\n@Directive()\nexport abstract class UiPopperContentBase {\n protected abstract readonly root: UiLayerRoot;\n /** CSS custom-property prefix used by shadcn classes, e.g. `--radix-popover`. */\n protected abstract readonly varPrefix: string;\n\n readonly side = input<Side>('bottom');\n readonly align = input<Align>('center');\n readonly sideOffset = input(4);\n readonly userClass = input<string>('', { alias: 'class' });\n\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n protected readonly overlay = inject(Overlay);\n protected readonly dir = inject(Directionality);\n protected readonly injector = inject(Injector);\n protected overlayRef: OverlayRef | null = null;\n private lastActive: HTMLElement | null = null;\n\n /** Hook for subclasses. Return false to skip default focus handling. */\n protected onAttached(): void {}\n protected onDetached(): void {}\n /** Whether outside pointer / Esc should close. Tooltip overrides to false. */\n protected closeOnOutside = true;\n protected restoreFocusOnClose = true;\n protected matchTriggerWidth = false;\n\n protected init(): void {\n this.el.hidden = true;\n this.root.contentEl.set(this.el);\n effect(\n () => {\n const mounted = this.root.mounted();\n untracked(() => (mounted ? this.attach() : this.detach()));\n },\n { injector: this.injector },\n );\n inject(DestroyRef).onDestroy(() => this.detach(false));\n }\n\n private attach(): void {\n const trigger = this.root.trigger();\n const point = this.root.anchorPoint();\n if (this.overlayRef || (!trigger && !point)) return;\n this.lastActive = document.activeElement as HTMLElement | null;\n const rtl = this.dir.value === 'rtl';\n const { positions, meta } = buildPositions(this.side(), this.align(), this.sideOffset(), rtl);\n const strategy = this.overlay\n .position()\n .flexibleConnectedTo(point ?? trigger!)\n .withPositions(positions)\n .withPush(false)\n .withFlexibleDimensions(false)\n .withViewportMargin(8);\n const ref = this.overlay.create({\n positionStrategy: strategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n direction: this.dir.value,\n minWidth: this.matchTriggerWidth && trigger ? trigger.getBoundingClientRect().width : undefined,\n });\n this.overlayRef = ref;\n\n strategy.positionChanges.subscribe((c: ConnectedOverlayPositionChange) => {\n const m = meta.get(c.connectionPair);\n if (!m) return;\n this.el.setAttribute('data-side', m.side);\n this.el.setAttribute('data-align', m.align);\n this.setVars(m.side, m.align, trigger);\n });\n\n ref.attach(new DomPortal(this.el));\n this.el.hidden = false;\n this.el.setAttribute('data-side', this.side());\n this.el.setAttribute('data-align', this.align());\n this.setVars(this.side(), this.align(), trigger);\n this.registerChildPane();\n\n if (this.closeOnOutside) {\n ref.keydownEvents().subscribe((e) => {\n if (e.key === 'Escape' && !e.defaultPrevented) {\n e.preventDefault();\n this.root.close();\n }\n });\n ref.outsidePointerEvents().subscribe((e) => {\n const t = e.target as Node | null;\n if (t && trigger?.contains(t)) return; // trigger click handles its own toggle\n if (t && [...this.root.childPanes].some((pane) => pane.contains(t))) return;\n this.root.close();\n });\n }\n this.onAttached();\n }\n\n private detach(restoreFocus = true): void {\n if (!this.overlayRef) return;\n this.onDetached();\n this.overlayRef.dispose();\n this.overlayRef = null;\n this.el.hidden = true;\n if (restoreFocus && this.restoreFocusOnClose) (this.root.trigger() ?? this.lastActive)?.focus();\n }\n\n /** Hook: sub-menus register their pane with the parent layer. */\n protected registerChildPane(): void {}\n\n private setVars(side: Side, align: Align, trigger: HTMLElement | null): void {\n const r = trigger?.getBoundingClientRect() ?? new DOMRect(0, 0, 0, 0);\n const s = this.el.style;\n s.setProperty(`${this.varPrefix}-content-transform-origin`, transformOrigin(side, align));\n s.setProperty(`${this.varPrefix}-trigger-width`, `${r.width}px`);\n s.setProperty(`${this.varPrefix}-trigger-height`, `${r.height}px`);\n s.setProperty(`${this.varPrefix}-content-available-height`, `${window.innerHeight - 16}px`);\n s.setProperty(`${this.varPrefix}-content-available-width`, `${window.innerWidth - 16}px`);\n }\n}\n","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { DomPortal } from '@angular/cdk/portal';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport {\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n untracked,\n} from '@angular/core';\nimport { UiLayerRoot } from './layer';\nimport { hideOthers } from './overlay-helpers';\n\n/**\n * Shared engine for Dialog and Sheet (Radix Dialog equivalent); state lives in UiLayerRoot.\n * Contract (see docs/behavior-specs/dialog.md): portal to <body>, overlay + content as siblings, focus trap,\n * first tabbable focused on open, focus restored to the trigger on close, Esc / overlay click dismiss,\n * aria-hidden on everything else, body scroll lock, content stays mounted with data-state=\"closed\"\n * until the exit animation finishes.\n */\n@Directive()\nexport abstract class UiModalRoot extends UiLayerRoot {\n readonly titleId = `${this.id}H1`;\n readonly descriptionId = `${this.id}H2`;\n}\n\nexport interface ModalContentConfig {\n slot: string;\n backdropClass: string;\n /** false for Alert Dialog: clicking the overlay does not dismiss. Default true. */\n closeOnBackdrop?: boolean;\n /** CSS selector of the element to focus on open (Alert Dialog focuses Cancel). Default: first tabbable. */\n initialFocusSelector?: string;\n}\n\n/** Base for the content directive: moves the host element into a CDK overlay while mounted. */\n@Directive()\nexport abstract class UiModalContentBase {\n protected abstract readonly root: UiModalRoot;\n protected abstract readonly config: ModalContentConfig;\n\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n private readonly overlay = inject(Overlay);\n private readonly trapFactory = inject(FocusTrapFactory);\n private readonly injector = inject(Injector);\n private overlayRef: OverlayRef | null = null;\n private trap: FocusTrap | null = null;\n private restoreAria: (() => void) | null = null;\n private lastActive: HTMLElement | null = null;\n readonly userClass = input<string>('', { alias: 'class' });\n\n protected init(): void {\n this.el.hidden = true;\n this.root.contentEl.set(this.el);\n effect(\n () => {\n const mounted = this.root.mounted();\n untracked(() => (mounted ? this.attach() : this.detach()));\n },\n { injector: this.injector },\n );\n effect(\n () => {\n const state = this.root.state();\n this.overlayRef?.backdropElement?.setAttribute('data-state', state);\n },\n { injector: this.injector },\n );\n inject(DestroyRef).onDestroy(() => this.detach(false));\n }\n\n private attach(): void {\n if (this.overlayRef) return;\n this.lastActive = document.activeElement as HTMLElement | null;\n const ref = this.overlay.create({\n hasBackdrop: true,\n backdropClass: this.config.backdropClass.split(/\\s+/).filter(Boolean),\n positionStrategy: this.overlay.position().global(),\n scrollStrategy: this.overlay.scrollStrategies.block(),\n });\n this.overlayRef = ref;\n ref.attach(new DomPortal(this.el));\n this.el.hidden = false;\n\n const backdrop = ref.backdropElement;\n backdrop?.setAttribute('data-slot', `${this.config.slot}-overlay`);\n backdrop?.setAttribute('data-state', 'open');\n backdrop?.setAttribute('aria-hidden', 'true');\n backdrop?.setAttribute('data-aria-hidden', 'true');\n\n ref.keydownEvents().subscribe((e) => {\n if (e.key === 'Escape' && !e.defaultPrevented) {\n e.preventDefault();\n this.root.close();\n }\n });\n if (this.config.closeOnBackdrop !== false) ref.backdropClick().subscribe(() => this.root.close());\n\n const container = ref.hostElement.parentElement as Element;\n this.restoreAria = hideOthers(container);\n document.body.setAttribute('data-scroll-locked', '1');\n\n this.trap = this.trapFactory.create(this.el);\n const preferred = this.config.initialFocusSelector ? this.el.querySelector<HTMLElement>(this.config.initialFocusSelector) : null;\n if (preferred) queueMicrotask(() => preferred.focus());\n else\n void this.trap.focusInitialElementWhenReady().then((ok) => {\n if (!ok) this.el.focus();\n });\n }\n\n private detach(restoreFocus = true): void {\n if (!this.overlayRef) return;\n this.trap?.destroy();\n this.trap = null;\n this.overlayRef.dispose();\n this.overlayRef = null;\n this.el.hidden = true;\n this.restoreAria?.();\n this.restoreAria = null;\n document.body.removeAttribute('data-scroll-locked');\n if (restoreFocus) (this.root.trigger() ?? this.lastActive)?.focus();\n }\n}\n","import { FocusableOption, FocusKeyManager } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n Directive,\n ElementRef,\n inject,\n InjectionToken,\n input,\n output,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { UiLayerRoot } from './layer';\nimport { UiPopperContentBase } from './popper';\n\n/**\n * Shared kit behind DropdownMenu, ContextMenu and Menubar (Radix Menu equivalent): items, sub-menus, roving focus,\n * typeahead and keyboard rules live here; the three components only add their own roots, triggers and classes.\n */\nexport class UiMenuSelectEvent {\n defaultPrevented = false;\n preventDefault(): void {\n this.defaultPrevented = true;\n }\n}\n\n/** What an item/content needs from \"its\" menu (a root menu or a sub-menu). */\nexport interface MenuCtx {\n readonly manager: WritableSignal<FocusKeyManager<UiMenuItemBase> | null>;\n readonly contentEl: WritableSignal<HTMLElement | null>;\n readonly childPanes: Set<HTMLElement>;\n readonly dirIsRtl: () => boolean;\n /** Close the whole menu tree (after selecting an item). */\n closeAll(): void;\n /** Menubar: ArrowLeft/Right inside an open menu moves to the neighbouring menu. */\n horizontal?(dir: 'prev' | 'next'): void;\n}\nexport const UI_MENU_CTX = new InjectionToken<MenuCtx>('UI_MENU_CTX');\nexport const UI_MENU_ITEM = new InjectionToken<UiMenuItemBase>('UI_MENU_ITEM');\nexport const UI_MENU_SUB = new InjectionToken<UiMenuSubBase>('UI_MENU_SUB');\n\n@Directive()\nexport abstract class UiMenuRootBase extends UiLayerRoot implements MenuCtx {\n /** Set by the trigger when opened with the keyboard so the content can focus the first/last item. */\n keyboardOpen: 'first' | 'last' | null = null;\n readonly manager = signal<FocusKeyManager<UiMenuItemBase> | null>(null);\n readonly triggerId = signal<string>('');\n private readonly directionality = inject(Directionality);\n dirIsRtl = (): boolean => this.directionality.value === 'rtl';\n closeAll(): void {\n this.close();\n }\n}\n\n@Directive()\nexport abstract class UiMenuItemBase implements FocusableOption {\n readonly ctx = inject(UI_MENU_CTX);\n protected readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n readonly disabledInput = input(false, { alias: 'disabled', transform: booleanAttribute });\n readonly select = output<UiMenuSelectEvent>();\n readonly highlighted = signal(false);\n readonly userClass = input<string>('', { alias: 'class' });\n\n get disabled(): boolean {\n return this.disabledInput();\n }\n focus(): void {\n this.el.focus();\n }\n getLabel(): string {\n return (this.el.textContent ?? '').trim();\n }\n protected onFocus(): void {\n this.highlighted.set(true);\n }\n protected onBlur(): void {\n this.highlighted.set(false);\n }\n protected onPointerMove(): void {\n if (this.disabled || this.highlighted()) return;\n const m = this.ctx.manager();\n if (m) m.setActiveItem(this as UiMenuItemBase);\n else this.focus();\n }\n protected onPointerLeave(): void {\n if (this.highlighted() && !this.keepFocusOnLeave()) this.ctx.contentEl()?.focus();\n }\n protected keepFocusOnLeave(): boolean {\n return false;\n }\n /** Run by click or Enter/Space. */\n activate(): void {\n if (this.disabled) return;\n this.beforeSelect();\n const ev = new UiMenuSelectEvent();\n this.select.emit(ev);\n if (!ev.defaultPrevented) this.ctx.closeAll();\n }\n protected beforeSelect(): void {}\n /** Sub-menu triggers override to open on ArrowRight/ArrowLeft (direction-aware). */\n openOnArrow(): boolean {\n return false;\n }\n}\n\n/** Host bindings shared by every menu item directive (spread into `host`; override `data-slot`). */\nexport const MENU_ITEM_HOST = {\n tabindex: '-1',\n '[attr.data-disabled]': 'disabled ? \"\" : null',\n '[attr.aria-disabled]': 'disabled ? \"true\" : null',\n '[attr.data-highlighted]': 'highlighted() ? \"\" : null',\n '(focus)': 'onFocus()',\n '(blur)': 'onBlur()',\n '(pointermove)': 'onPointerMove()',\n '(pointerleave)': 'onPointerLeave()',\n '(click)': 'activate()',\n};\n\n/** A sub-menu root: it is itself a menu context nested in its parent's. */\n@Directive()\nexport abstract class UiMenuSubBase extends UiMenuRootBase {\n readonly parent = inject(UI_MENU_CTX, { skipSelf: true });\n override closeAll(): void {\n this.parent.closeAll();\n }\n override dirIsRtl = (): boolean => this.parent.dirIsRtl();\n}\n\n@Directive()\nexport abstract class UiMenuSubTriggerBase extends UiMenuItemBase {\n protected readonly sub = inject(UI_MENU_SUB);\n /** The trigger is an item of the PARENT menu (the nearest UI_MENU_CTX is the sub-menu it opens). */\n override readonly ctx: MenuCtx = this.sub.parent;\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n super();\n this.sub.trigger.set(this.el);\n }\n override activate(): void {\n if (this.disabled) return;\n this.sub.keyboardOpen = 'first';\n this.sub.open.set(true);\n }\n override openOnArrow(): boolean {\n this.activate();\n return true;\n }\n protected override keepFocusOnLeave(): boolean {\n return this.sub.open();\n }\n protected override onPointerMove(): void {\n super.onPointerMove();\n if (this.disabled || this.sub.open()) return;\n clearTimeout(this.timer);\n this.timer = setTimeout(() => {\n this.sub.keyboardOpen = null;\n this.sub.open.set(true);\n }, 100);\n }\n}\n\n@Directive()\nexport abstract class UiMenuContentBase extends UiPopperContentBase {\n protected abstract readonly menu: UiMenuRootBase;\n protected abstract menuItems(): readonly UiMenuItemBase[];\n private manager: FocusKeyManager<UiMenuItemBase> | null = null;\n\n /** Content of a sub-menu closes itself on the \"back\" arrow. */\n protected isSub = false;\n\n protected override onAttached(): void {\n const items = this.menuItems().filter((i) => i.ctx === (this.menu as MenuCtx));\n this.manager = new FocusKeyManager<UiMenuItemBase>([...items])\n .withVerticalOrientation()\n .withHomeAndEnd()\n .withTypeAhead(150)\n .skipPredicate((i) => i.disabled);\n this.menu.manager.set(this.manager);\n queueMicrotask(() => {\n if (this.menu.keyboardOpen === 'first') this.manager?.setFirstItemActive();\n else if (this.menu.keyboardOpen === 'last') this.manager?.setLastItemActive();\n else this.el.focus();\n });\n }\n\n protected override onDetached(): void {\n if (this.isSub) (this.menu as unknown as { parent: MenuCtx }).parent.childPanes.delete(this.el);\n this.manager = null;\n this.menu.manager.set(null);\n this.menu.keyboardOpen = null;\n }\n\n protected onMenuKeydown(e: KeyboardEvent): void {\n if (e.key === 'Tab') return e.preventDefault(); // Radix menus keep focus inside; Tab does nothing\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.manager?.activeItem?.activate();\n return;\n }\n const rtl = this.menu.dirIsRtl();\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n if (e.key === forward) {\n const item = this.manager?.activeItem;\n if (item?.openOnArrow()) {\n e.preventDefault();\n return;\n }\n if (!this.isSub) {\n e.preventDefault();\n (this.menu as MenuCtx).horizontal?.('next');\n }\n return;\n }\n if (e.key === back) {\n e.preventDefault();\n if (this.isSub) this.menu.close();\n else (this.menu as MenuCtx).horizontal?.('prev');\n return;\n }\n this.manager?.onKeydown(e);\n }\n\n protected override registerChildPane(): void {\n if (this.isSub) {\n const parent = (this.menu as unknown as { parent: MenuCtx }).parent;\n parent.childPanes.add(this.el);\n this.menu.contentEl.set(this.el);\n }\n }\n}\n","// GENERATED by tools/add-elements.mjs — alias (custom element) → the native tag the directive was written for.\n// Used by UiElementHost to give custom elements the roles/behavior of their native counterparts.\nexport const ELEMENT_ORIGIN: Record<string, string> = {\n \"ui-accordion\": \"\",\n \"ui-accordion-content\": \"\",\n \"ui-accordion-item\": \"\",\n \"ui-accordion-trigger\": \"button\",\n \"ui-alert\": \"\",\n \"ui-alert-action\": \"\",\n \"ui-alert-description\": \"\",\n \"ui-alert-dialog\": \"\",\n \"ui-alert-dialog-action\": \"button\",\n \"ui-alert-dialog-cancel\": \"button\",\n \"ui-alert-dialog-content\": \"\",\n \"ui-alert-dialog-description\": \"\",\n \"ui-alert-dialog-footer\": \"\",\n \"ui-alert-dialog-header\": \"\",\n \"ui-alert-dialog-title\": \"\",\n \"ui-alert-dialog-trigger\": \"\",\n \"ui-alert-title\": \"\",\n \"ui-aspect-ratio\": \"\",\n \"ui-attachment\": \"\",\n \"ui-attachment-action\": \"button\",\n \"ui-attachment-actions\": \"\",\n \"ui-attachment-content\": \"\",\n \"ui-attachment-description\": \"span\",\n \"ui-attachment-group\": \"\",\n \"ui-attachment-media\": \"\",\n \"ui-attachment-title\": \"span\",\n \"ui-attachment-trigger\": \"a\",\n \"ui-avatar\": \"\",\n \"ui-avatar-badge\": \"\",\n \"ui-avatar-fallback\": \"\",\n \"ui-avatar-group\": \"\",\n \"ui-avatar-group-count\": \"\",\n \"ui-badge\": \"\",\n \"ui-breadcrumb\": \"nav\",\n \"ui-breadcrumb-ellipsis\": \"span\",\n \"ui-breadcrumb-item\": \"li\",\n \"ui-breadcrumb-link\": \"a\",\n \"ui-breadcrumb-list\": \"ol\",\n \"ui-breadcrumb-page\": \"span\",\n \"ui-breadcrumb-separator\": \"li\",\n \"ui-bubble\": \"\",\n \"ui-bubble-content\": \"\",\n \"ui-bubble-group\": \"\",\n \"ui-bubble-reactions\": \"\",\n \"ui-button\": \"button\",\n \"ui-button-group\": \"\",\n \"ui-button-group-separator\": \"\",\n \"ui-calendar\": \"div\",\n \"ui-card\": \"\",\n \"ui-card-action\": \"\",\n \"ui-card-content\": \"\",\n \"ui-card-description\": \"\",\n \"ui-card-footer\": \"\",\n \"ui-card-header\": \"\",\n \"ui-card-title\": \"\",\n \"ui-carousel\": \"div\",\n \"ui-carousel-content\": \"div\",\n \"ui-carousel-item\": \"div\",\n \"ui-carousel-next\": \"button\",\n \"ui-carousel-previous\": \"button\",\n \"ui-checkbox\": \"button\",\n \"ui-collapsible\": \"\",\n \"ui-collapsible-content\": \"\",\n \"ui-collapsible-trigger\": \"\",\n \"ui-combobox\": \"\",\n \"ui-combobox-content\": \"\",\n \"ui-combobox-empty\": \"\",\n \"ui-combobox-item\": \"\",\n \"ui-combobox-list\": \"\",\n \"ui-combobox-trigger\": \"button\",\n \"ui-combobox-value\": \"\",\n \"ui-command\": \"\",\n \"ui-command-empty\": \"\",\n \"ui-command-group\": \"\",\n \"ui-command-input-wrapper\": \"\",\n \"ui-command-item\": \"\",\n \"ui-command-list\": \"\",\n \"ui-command-separator\": \"\",\n \"ui-command-shortcut\": \"\",\n \"ui-context-menu\": \"\",\n \"ui-context-menu-checkbox-item\": \"\",\n \"ui-context-menu-content\": \"\",\n \"ui-context-menu-group\": \"\",\n \"ui-context-menu-item\": \"\",\n \"ui-context-menu-label\": \"\",\n \"ui-context-menu-radio-group\": \"\",\n \"ui-context-menu-radio-item\": \"\",\n \"ui-context-menu-separator\": \"\",\n \"ui-context-menu-shortcut\": \"\",\n \"ui-context-menu-sub\": \"\",\n \"ui-context-menu-sub-content\": \"\",\n \"ui-context-menu-sub-trigger\": \"\",\n \"ui-context-menu-trigger\": \"\",\n \"ui-dialog\": \"\",\n \"ui-dialog-close\": \"\",\n \"ui-dialog-content\": \"\",\n \"ui-dialog-description\": \"\",\n \"ui-dialog-footer\": \"\",\n \"ui-dialog-header\": \"\",\n \"ui-dialog-title\": \"\",\n \"ui-dialog-trigger\": \"\",\n \"ui-direction\": \"\",\n \"ui-drawer\": \"\",\n \"ui-drawer-close\": \"button\",\n \"ui-drawer-content\": \"\",\n \"ui-drawer-description\": \"\",\n \"ui-drawer-footer\": \"\",\n \"ui-drawer-header\": \"\",\n \"ui-drawer-title\": \"\",\n \"ui-drawer-trigger\": \"\",\n \"ui-dropdown-menu\": \"\",\n \"ui-dropdown-menu-checkbox-item\": \"\",\n \"ui-dropdown-menu-content\": \"\",\n \"ui-dropdown-menu-group\": \"\",\n \"ui-dropdown-menu-item\": \"\",\n \"ui-dropdown-menu-label\": \"\",\n \"ui-dropdown-menu-radio-group\": \"\",\n \"ui-dropdown-menu-radio-item\": \"\",\n \"ui-dropdown-menu-separator\": \"\",\n \"ui-dropdown-menu-shortcut\": \"\",\n \"ui-dropdown-menu-sub\": \"\",\n \"ui-dropdown-menu-sub-content\": \"\",\n \"ui-dropdown-menu-sub-trigger\": \"\",\n \"ui-dropdown-menu-trigger\": \"\",\n \"ui-empty\": \"\",\n \"ui-empty-content\": \"\",\n \"ui-empty-description\": \"\",\n \"ui-empty-header\": \"\",\n \"ui-empty-icon\": \"\",\n \"ui-empty-title\": \"\",\n \"ui-field\": \"\",\n \"ui-field-content\": \"\",\n \"ui-field-description\": \"\",\n \"ui-field-error\": \"\",\n \"ui-field-group\": \"\",\n \"ui-field-label\": \"label\",\n \"ui-field-legend\": \"legend\",\n \"ui-field-separator\": \"\",\n \"ui-field-set\": \"fieldset\",\n \"ui-hover-card\": \"\",\n \"ui-hover-card-content\": \"\",\n \"ui-hover-card-trigger\": \"\",\n \"ui-input-group\": \"\",\n \"ui-input-group-addon\": \"\",\n \"ui-input-otp\": \"div\",\n \"ui-input-otp-group\": \"\",\n \"ui-input-otp-separator\": \"\",\n \"ui-input-otp-slot\": \"\",\n \"ui-item\": \"\",\n \"ui-item-actions\": \"\",\n \"ui-item-content\": \"\",\n \"ui-item-description\": \"\",\n \"ui-item-group\": \"\",\n \"ui-item-header\": \"\",\n \"ui-item-media\": \"\",\n \"ui-item-title\": \"\",\n \"ui-kbd\": \"kbd\",\n \"ui-kbd-group\": \"kbd\",\n \"ui-label\": \"label\",\n \"ui-marker\": \"\",\n \"ui-marker-content\": \"span\",\n \"ui-marker-icon\": \"span\",\n \"ui-menubar\": \"\",\n \"ui-menubar-checkbox-item\": \"\",\n \"ui-menubar-content\": \"\",\n \"ui-menubar-group\": \"\",\n \"ui-menubar-item\": \"\",\n \"ui-menubar-label\": \"\",\n \"ui-menubar-menu\": \"\",\n \"ui-menubar-radio-group\": \"\",\n \"ui-menubar-radio-item\": \"\",\n \"ui-menubar-separator\": \"\",\n \"ui-menubar-shortcut\": \"\",\n \"ui-menubar-sub\": \"\",\n \"ui-menubar-sub-content\": \"\",\n \"ui-menubar-sub-trigger\": \"\",\n \"ui-menubar-trigger\": \"\",\n \"ui-message\": \"\",\n \"ui-message-avatar\": \"\",\n \"ui-message-content\": \"\",\n \"ui-message-footer\": \"\",\n \"ui-message-group\": \"\",\n \"ui-message-header\": \"\",\n \"ui-message-scroller\": \"div\",\n \"ui-message-scroller-button\": \"button\",\n \"ui-message-scroller-content\": \"\",\n \"ui-message-scroller-item\": \"\",\n \"ui-message-scroller-viewport\": \"\",\n \"ui-native-select-wrapper\": \"div\",\n \"ui-navigation-menu\": \"nav\",\n \"ui-navigation-menu-content\": \"\",\n \"ui-navigation-menu-item\": \"li\",\n \"ui-navigation-menu-link\": \"a\",\n \"ui-navigation-menu-list\": \"ul\",\n \"ui-navigation-menu-trigger\": \"button\",\n \"ui-pagination\": \"nav\",\n \"ui-pagination-content\": \"ul\",\n \"ui-pagination-ellipsis\": \"span\",\n \"ui-pagination-item\": \"li\",\n \"ui-pagination-link\": \"a\",\n \"ui-pagination-next\": \"a\",\n \"ui-pagination-previous\": \"a\",\n \"ui-popover\": \"\",\n \"ui-popover-content\": \"\",\n \"ui-popover-description\": \"\",\n \"ui-popover-header\": \"\",\n \"ui-popover-title\": \"\",\n \"ui-popover-trigger\": \"\",\n \"ui-progress\": \"div\",\n \"ui-questionnaire\": \"form\",\n \"ui-questionnaire-actions\": \"div\",\n \"ui-questionnaire-choice\": \"label\",\n \"ui-questionnaire-choices\": \"div\",\n \"ui-questionnaire-description\": \"p\",\n \"ui-questionnaire-input\": \"div\",\n \"ui-questionnaire-item\": \"fieldset\",\n \"ui-questionnaire-progress\": \"div\",\n \"ui-questionnaire-title\": \"legend\",\n \"ui-radio-group\": \"\",\n \"ui-radio-group-item\": \"button\",\n \"ui-resizable-handle\": \"\",\n \"ui-resizable-panel\": \"\",\n \"ui-resizable-panel-group\": \"\",\n \"ui-scroll-area\": \"\",\n \"ui-scroll-area-viewport\": \"\",\n \"ui-select\": \"\",\n \"ui-select-content\": \"\",\n \"ui-select-group\": \"\",\n \"ui-select-item\": \"\",\n \"ui-select-label\": \"\",\n \"ui-select-separator\": \"\",\n \"ui-select-trigger\": \"button\",\n \"ui-select-value\": \"\",\n \"ui-separator\": \"\",\n \"ui-sheet\": \"\",\n \"ui-sheet-close\": \"\",\n \"ui-sheet-content\": \"\",\n \"ui-sheet-description\": \"\",\n \"ui-sheet-footer\": \"\",\n \"ui-sheet-header\": \"\",\n \"ui-sheet-title\": \"\",\n \"ui-sheet-trigger\": \"\",\n \"ui-sidebar\": \"\",\n \"ui-sidebar-content\": \"\",\n \"ui-sidebar-footer\": \"\",\n \"ui-sidebar-group\": \"\",\n \"ui-sidebar-group-action\": \"button\",\n \"ui-sidebar-group-content\": \"\",\n \"ui-sidebar-group-label\": \"\",\n \"ui-sidebar-header\": \"\",\n \"ui-sidebar-inset\": \"\",\n \"ui-sidebar-menu\": \"ul\",\n \"ui-sidebar-menu-action\": \"button\",\n \"ui-sidebar-menu-badge\": \"\",\n \"ui-sidebar-menu-button\": \"button\",\n \"ui-sidebar-menu-item\": \"li\",\n \"ui-sidebar-menu-sub\": \"ul\",\n \"ui-sidebar-menu-sub-button\": \"a\",\n \"ui-sidebar-menu-sub-item\": \"li\",\n \"ui-sidebar-provider\": \"\",\n \"ui-sidebar-rail\": \"button\",\n \"ui-sidebar-separator\": \"\",\n \"ui-sidebar-trigger\": \"button\",\n \"ui-skeleton\": \"\",\n \"ui-slider\": \"span\",\n \"ui-switch\": \"button\",\n \"ui-table\": \"table\",\n \"ui-table-body\": \"tbody\",\n \"ui-table-caption\": \"caption\",\n \"ui-table-cell\": \"td\",\n \"ui-table-container\": \"\",\n \"ui-table-footer\": \"tfoot\",\n \"ui-table-head\": \"th\",\n \"ui-table-header\": \"thead\",\n \"ui-table-row\": \"tr\",\n \"ui-tabs\": \"\",\n \"ui-tabs-content\": \"\",\n \"ui-tabs-list\": \"\",\n \"ui-tabs-trigger\": \"button\",\n \"ui-toggle\": \"button\",\n \"ui-toggle-group\": \"\",\n \"ui-toggle-group-item\": \"button\",\n \"ui-tooltip\": \"\",\n \"ui-tooltip-content\": \"\",\n \"ui-tooltip-trigger\": \"\",\n \"ui-typography\": \"\"\n};\n","import { afterNextRender, DestroyRef, Directive, ElementRef, inject } from '@angular/core';\nimport { ELEMENT_ORIGIN } from './elements';\n\n/** ARIA role a native tag provides implicitly; custom elements need it spelled out. */\nconst ROLE: Record<string, string> = {\n button: 'button',\n a: 'link',\n ul: 'list',\n ol: 'list',\n li: 'listitem',\n nav: 'navigation',\n fieldset: 'group',\n table: 'table',\n thead: 'rowgroup',\n tbody: 'rowgroup',\n tfoot: 'rowgroup',\n tr: 'row',\n th: 'columnheader',\n td: 'cell',\n};\n\nconst DISPLAY: Record<string, string> = {\n table: 'table',\n thead: 'table-header-group',\n tbody: 'table-row-group',\n tfoot: 'table-footer-group',\n tr: 'table-row',\n th: 'table-cell',\n td: 'table-cell',\n caption: 'table-caption',\n};\n\n/** Titles that are headings in the documented markup (`<h2 uiDialogTitle>`): keep the heading role on the element. */\nconst HEADINGS = new Set(['ui-dialog-title', 'ui-sheet-title', 'ui-alert-dialog-title', 'ui-drawer-title']);\n\nconst INLINE_ORIGINS = new Set(['span', 'a', 'button', 'label', 'kbd']);\n\nlet styled = false;\n/**\n * Custom elements are `display: inline` by default. These defaults sit in `@layer base`, so Tailwind utilities (flex, grid,\n * hidden, …) always win, and `:not([hidden])` keeps the `hidden` attribute working.\n */\nfunction ensureDefaultStyles(): void {\n if (styled || typeof document === 'undefined') return;\n styled = true;\n const groups = new Map<string, string[]>();\n for (const [alias, origin] of Object.entries(ELEMENT_ORIGIN)) {\n const d = DISPLAY[origin] ?? (INLINE_ORIGINS.has(origin) ? 'inline-block' : 'block');\n (groups.get(d) ?? groups.set(d, []).get(d)!).push(alias);\n }\n const css =\n [...groups].map(([d, list]) => `:where(${list.join(',')}):not([hidden]){display:${d}}`).join('\\n') +\n '\\n:where([data-slot][disabled]:not(:is(button,input,select,textarea,fieldset,optgroup,option))){pointer-events:none;opacity:.5}';\n const style = document.createElement('style');\n style.setAttribute('data-loomui-elements', '');\n style.textContent = `@layer base{\\n${css}\\n}`;\n document.head.appendChild(style);\n}\n\nconst isDisabled = (el: HTMLElement) => el.hasAttribute('disabled') || el.getAttribute('aria-disabled') === 'true';\n\n/**\n * Applied (as a host directive) to every Loom UI directive that also has a custom-element selector, e.g. <ui-button>.\n * On native elements it does nothing. On a custom element it restores what the native tag provided for free:\n * - the implicit ARIA role and, for buttons/links, a tab stop;\n * - Enter / Space activation for button-like elements (Enter for links), skipped when the component already handled the key;\n * - `href` navigation for link-like elements, `for` association for label-like elements.\n * Directives keep full control: anything they set themselves (role, tabindex, …) is never overwritten.\n */\n@Directive()\nexport class UiElementHost {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n\n constructor() {\n const name = this.el.localName;\n const origin = ELEMENT_ORIGIN[name];\n if (origin === undefined) return; // native element or an element without a mapping\n ensureDefaultStyles();\n const destroy = inject(DestroyRef);\n\n afterNextRender(() => {\n const el = this.el;\n const role = ROLE[origin];\n if (role && !el.hasAttribute('role')) el.setAttribute('role', role);\n if ((origin === 'button' || origin === 'a') && !el.hasAttribute('tabindex')) el.setAttribute('tabindex', '0');\n if (HEADINGS.has(name) && !el.hasAttribute('role')) {\n el.setAttribute('role', 'heading');\n if (!el.hasAttribute('aria-level')) el.setAttribute('aria-level', '2');\n }\n\n const off: (() => void)[] = [];\n const on = <K extends keyof HTMLElementEventMap>(type: K, fn: (e: HTMLElementEventMap[K]) => void) => {\n el.addEventListener(type, fn);\n off.push(() => el.removeEventListener(type, fn));\n };\n\n if (origin === 'button' || origin === 'a') {\n let spaceDown = false;\n on('keydown', (e) => {\n if (e.target !== el || e.defaultPrevented || isDisabled(el)) return;\n if (e.key === 'Enter') {\n e.preventDefault();\n el.click();\n } else if (e.key === ' ' && origin === 'button') {\n e.preventDefault(); // no page scroll; activate on keyup like a native button\n spaceDown = true;\n }\n });\n on('keyup', (e) => {\n if (e.key === ' ' && spaceDown && e.target === el && !isDisabled(el)) {\n spaceDown = false;\n el.click();\n }\n });\n }\n\n if (origin === 'a') {\n on('click', (e) => {\n const href = el.getAttribute('href');\n if (e.defaultPrevented || !href || isDisabled(el)) return;\n const target = el.getAttribute('target');\n if (target === '_blank') window.open(href, '_blank', 'noopener');\n else window.location.assign(href);\n });\n }\n\n if (origin === 'label') {\n on('click', (e) => {\n const id = el.getAttribute('for');\n if (!id || e.defaultPrevented) return;\n const t = e.target as HTMLElement;\n if (t.closest('button, input, select, textarea, a, [role=checkbox], [role=switch], [role=radio]')) return;\n const control = document.getElementById(id);\n if (!control) return;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(control.tagName) && (control as HTMLInputElement).type !== 'checkbox' && (control as HTMLInputElement).type !== 'radio') control.focus();\n else control.click();\n });\n }\n\n destroy.onDestroy(() => off.forEach((f) => f()));\n });\n }\n}\n","import { booleanAttribute, computed, Directive, ElementRef, input, linkedSignal, signal, viewChild } from '@angular/core';\nimport type { ControlValueAccessor } from '@angular/forms';\n\n/**\n * Base for the custom-element wrappers around native form controls (`<ui-input>`, `<ui-textarea>`, `<ui-native-select>`, …).\n * A custom element cannot be a form control, so the wrapper renders the real control inside its template (template ref\n * `#control`) and forwards the common attributes. It implements ControlValueAccessor, so `ngModel`, reactive forms and\n * `[(value)]`-style one-way binding keep working. `aria-label` / `aria-describedby` are forwarded to the inner control.\n */\n// The id belongs on the inner control (so <label for> and aria-labelledby find it), not on the custom element.\n@Directive({ host: { '[attr.id]': 'null' } })\nexport abstract class UiNativeControl implements ControlValueAccessor {\n readonly control = viewChild.required<ElementRef<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>>('control');\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n /** Initial / one-way value. With forms, the form owns the value. */\n readonly value = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly required = input(false, { transform: booleanAttribute });\n readonly invalid = input(false, { transform: booleanAttribute });\n readonly autocomplete = input<string>('');\n readonly ariaLabel = input<string>('', { alias: 'aria-label' });\n readonly ariaDescribedby = input<string>('', { alias: 'aria-describedby' });\n readonly userClass = input<string>('', { alias: 'class' });\n\n protected readonly current = linkedSignal(() => this.value());\n private readonly cvaDisabled = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n\n private onChange: (v: string) => void = () => {};\n protected onTouched: () => void = () => {};\n\n focus(options?: FocusOptions): void {\n this.control().nativeElement.focus(options);\n }\n\n protected onInput(e: Event): void {\n const v = (e.target as HTMLInputElement).value;\n this.current.set(v);\n this.onChange(v);\n }\n\n writeValue(v: string | null): void {\n this.current.set(v ?? '');\n }\n registerOnChange(fn: (v: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(d: boolean): void {\n this.cvaDisabled.set(d);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const LOOMUI_VERSION = "0.1.0";
2
+ export { LOOMUI_VERSION };
3
+
4
+ //# sourceMappingURL=loomui-ng-ui.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loomui-ng-ui.mjs","names":[],"sources":["../../../libs/ui/index.ts"],"sourcesContent":["/**\n * Primary entry point. Components live in secondary entry points: import from '@loomui-ng/ui/button', '@loomui-ng/ui/dialog', …\n * Theme stylesheet: '@loomui-ng/ui/styles/loomui.css'.\n */\nexport const LOOMUI_VERSION = '0.1.0';\n"],"mappings":"AAIA,MAAa,iBAAiB"}
@@ -0,0 +1,43 @@
1
+ # Field
2
+
3
+ ```ts
4
+ import { UI_FIELD } from '@loomui-ng/ui/field';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <fieldset uiFieldSet>
10
+ <legend uiFieldLegend>Profile</legend>
11
+ <div uiFieldGroup>
12
+ <div uiField>
13
+ <label uiFieldLabel for="n">Name</label>
14
+ <input uiInput id="n" />
15
+ <p uiFieldDescription>Public display name.</p>
16
+ </div>
17
+ </div>
18
+ </fieldset>
19
+ ```
20
+
21
+ Same thing as custom elements (identical inputs; directives keep working):
22
+
23
+ ```html
24
+ <ui-field-set>
25
+ <ui-field-legend>Profile</ui-field-legend>
26
+ <ui-field-group>
27
+ <ui-field>
28
+ <ui-field-label for="n">Name</ui-field-label>
29
+ <ui-input id="n" />
30
+ <ui-field-description>Public display name.</ui-field-description>
31
+ </ui-field>
32
+ </ui-field-group>
33
+ </ui-field-set>
34
+ ```
35
+
36
+ | Input / output | Type / values | Default |
37
+ |---|---|---|
38
+ | `variant` | `'legend' \| 'label'` | `'legend'` |
39
+ | `orientation` | `'vertical' \| 'horizontal' \| 'responsive'` | `'vertical'` |
40
+
41
+ Parts (selectors): `[uiFieldSeparator], ui-field-separator`, `[uiFieldError], ui-field-error`, `[uiFieldGroup], ui-field-group`, `fieldset[uiFieldSet], ui-field-set`, `legend[uiFieldLegend], ui-field-legend`, `[uiFieldDescription], ui-field-description`, `[uiField], ui-field`, `label[uiFieldLabel], ui-field-label`, `[uiFieldContent], ui-field-content`.
42
+
43
+ Spec: `docs/behavior-specs/field.md` · Manual test: `docs/manual-tests/field.md`
@@ -0,0 +1,31 @@
1
+ # Hover Card
2
+
3
+ ```ts
4
+ import { UI_HOVER_CARD } from '@loomui-ng/ui/hover-card';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiHoverCard>
10
+ <a uiHoverCardTrigger href="#">&#64;nextjs</a>
11
+ <div uiHoverCardContent>…</div>
12
+ </div>
13
+ ```
14
+
15
+ Same thing as custom elements (identical inputs; directives keep working):
16
+
17
+ ```html
18
+ <ui-hover-card>
19
+ <ui-hover-card-trigger href="#">&#64;nextjs</ui-hover-card-trigger>
20
+ <ui-hover-card-content>…</ui-hover-card-content>
21
+ </ui-hover-card>
22
+ ```
23
+
24
+ | Input / output | Type / values | Default |
25
+ |---|---|---|
26
+ | `openDelay` | | `700` |
27
+ | `closeDelay` | | `300` |
28
+
29
+ Parts (selectors): `[uiHoverCard], ui-hover-card`, `[uiHoverCardTrigger], ui-hover-card-trigger`, `[uiHoverCardContent], ui-hover-card-content`.
30
+
31
+ Spec: `docs/behavior-specs/hover-card.md` · Manual test: `docs/manual-tests/hover-card.md`
package/icon/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # Icon (Lucide)
2
+
3
+ Lucide icons as an Angular component (`<ui-icon>`) and as a directive on a real `<svg>` (`<svg uiIcon>`). The `lucide` package is a peer dependency; import only the icons you use and they tree-shake.
4
+
5
+ ```ts
6
+ import { Search } from 'lucide';
7
+ import { UiIcon } from '@loomui-ng/ui/icon'; // or: npx loomui add icon
8
+ ```
9
+
10
+ ```html
11
+ <!-- by node (preferred: tree-shakeable) -->
12
+ <ui-icon [icon]="Search" /> <!-- 16px (size-4), shadcn's default -->
13
+ <ui-icon [icon]="Search" [size]="24" [strokeWidth]="1.5" />
14
+ <ui-icon [icon]="Search" class="size-6 text-primary" />
15
+
16
+ <!-- on a real <svg>: keeps parent selectors such as [&>svg]:size-4 and has-[>svg] working -->
17
+ <svg uiIcon [icon]="Search" class="size-5"></svg>
18
+
19
+ <!-- by name, after registering -->
20
+ <ui-icon name="search" />
21
+ ```
22
+
23
+ ```ts
24
+ import { Search, Moon } from 'lucide';
25
+ import { registerIcons } from '@loomui-ng/ui/icon';
26
+
27
+ registerIcons({ Search, Moon }); // PascalCase or kebab-case keys
28
+ ```
29
+
30
+ | Input | Type | Default |
31
+ |---|---|---|
32
+ | `icon` | Lucide icon node | – |
33
+ | `name` / `uiIcon` | registered icon name (kebab or Pascal) | – |
34
+ | `size` | number (px) | `16` via `size-4` |
35
+ | `strokeWidth` | number | `2` |
36
+ | `absoluteStrokeWidth` | boolean — keeps the stroke the same pixel width at any size | `false` |
37
+ | `color` | any CSS color | `currentColor` |
38
+ | `label` | accessible name; without it the icon is `aria-hidden` | – |
39
+
40
+ The icons used by the Loom UI components themselves (chevrons, check, x, …) are registered automatically (`LIB_ICONS`). Helpers: `iconToSvg(node, { size, strokeWidth, color })`, `iconChildren(node)`, `toKebab`, `toPascal`.
41
+
42
+ Browse and copy all 1,877 icons in the showcase: **/icons**. Manual checklist: `docs/manual-tests/icons.md`.
@@ -0,0 +1,26 @@
1
+ # uiInput
2
+
3
+ ```ts
4
+ import { UiInput } from '@loomui-ng/ui/input';
5
+ // add to the component imports array
6
+ ```
7
+
8
+ ```html
9
+ <input uiInput placeholder="Email" [formControl]="email" />
10
+ <input uiInput [(ngModel)]="name" aria-invalid="true" />
11
+ ```
12
+
13
+ Same thing as custom elements (identical inputs; directives keep working):
14
+
15
+ ```html
16
+ <ui-input placeholder="Email" [formControl]="email" />
17
+ <ui-input [(ngModel)]="name" aria-invalid="true" />
18
+ ```
19
+
20
+ | Input | Values | Default |
21
+ |---|---|---|
22
+ | `class` | extra classes (tailwind-merge) | - |
23
+
24
+ Native input: ngModel, reactive forms and signal forms work unchanged.
25
+
26
+ Spec: docs/behavior-specs/input.md - Manual checks: docs/manual-tests/input.md
@@ -0,0 +1,40 @@
1
+ # Input Group
2
+
3
+ ```ts
4
+ import { UI_INPUT_GROUP } from '@loomui-ng/ui/input-group';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiInputGroup>
10
+ <div uiInputGroupAddon>https://</div>
11
+ <input uiInputGroupControl placeholder="example.com" />
12
+ </div>
13
+ ```
14
+
15
+ Same thing as custom elements (identical inputs; directives keep working):
16
+
17
+ ```html
18
+ <ui-input-group>
19
+ <ui-input-group-addon>https://</ui-input-group-addon>
20
+ <ui-input-group-control placeholder="example.com" />
21
+ </ui-input-group>
22
+ ```
23
+
24
+ | Input / output | Type / values | Default |
25
+ |---|---|---|
26
+ | `type` | `string` | `'text'` |
27
+ | `min` | `string \| number \| null` | `null` |
28
+ | `max` | `string \| number \| null` | `null` |
29
+ | `step` | `string \| number \| null` | `null` |
30
+ | `pattern` | `string` | `''` |
31
+ | `maxlength` | `number \| null` | `null` |
32
+ | `minlength` | `number \| null` | `null` |
33
+ | `accept` | `string` | `''` |
34
+ | `inputmode` | `string` | `''` |
35
+ | `multiple` | | `false` |
36
+ | `align` | `'inline-start' \| 'inline-end' \| 'block-start' \| 'block-end'` | `'inline-start'` |
37
+
38
+ Parts (selectors): `ui-input-group-control`, `[uiInputGroup], ui-input-group`, `input[uiInputGroupControl]`, `[uiInputGroupAddon], ui-input-group-addon`.
39
+
40
+ Spec: `docs/behavior-specs/input-group.md` · Manual test: `docs/manual-tests/input-group.md`
@@ -0,0 +1,35 @@
1
+ # Input OTP
2
+
3
+ ```ts
4
+ import { UI_INPUT_OTP } from '@loomui-ng/ui/input-otp';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiInputOtp [maxLength]="6" [(value)]="code" (complete)="verify($event)">
10
+ <div uiInputOtpGroup><div uiInputOtpSlot [index]="0"></div>…</div>
11
+ </div>
12
+ ```
13
+
14
+ Same thing as custom elements (identical inputs; directives keep working):
15
+
16
+ ```html
17
+ <ui-input-otp [maxLength]="6" [(value)]="code" (complete)="verify($event)">
18
+ <ui-input-otp-group><ui-input-otp-slot [index]="0"></ui-input-otp-slot>…</ui-input-otp-group>
19
+ </ui-input-otp>
20
+ ```
21
+
22
+ | Input / output | Type / values | Default |
23
+ |---|---|---|
24
+ | `value` (model) | | `''` |
25
+ | `maxLength` | | `6` |
26
+ | `pattern` | `string` | `'^\\d+$'` |
27
+ | `disabled` | | `false` |
28
+ | `invalid` | | `false` |
29
+ | `required` | | `false` |
30
+ | `complete` (output) | `string` | |
31
+ | `index` | `number` | required |
32
+
33
+ Parts (selectors): `div[uiInputOtp], ui-input-otp`, `[uiInputOtpGroup], ui-input-otp-group`, `[uiInputOtpSlot], ui-input-otp-slot`, `[uiInputOtpSeparator], ui-input-otp-separator`.
34
+
35
+ Spec: `docs/behavior-specs/input-otp.md` · Manual test: `docs/manual-tests/input-otp.md`
package/item/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # Item
2
+
3
+ ```ts
4
+ import { UI_ITEM_GENERATED } from '@loomui-ng/ui/item';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiItem variant="outline">
10
+ <div uiItemMedia>…</div>
11
+ <div uiItemContent><div uiItemTitle>Title</div><p uiItemDescription>Description</p></div>
12
+ <div uiItemActions><button uiButton size="sm">Open</button></div>
13
+ </div>
14
+ ```
15
+
16
+ Same thing as custom elements (identical inputs; directives keep working):
17
+
18
+ ```html
19
+ <ui-item variant="outline">
20
+ <ui-item-media>…</ui-item-media>
21
+ <ui-item-content><ui-item-title>Title</ui-item-title><ui-item-description>Description</ui-item-description></ui-item-content>
22
+ <ui-item-actions><ui-button size="sm">Open</ui-button></ui-item-actions>
23
+ </ui-item>
24
+ ```
25
+
26
+ | Input / output | Type / values | Default |
27
+ |---|---|---|
28
+ | `variant` | `'default' \| 'outline' \| 'muted'` | `'default'` |
29
+ | `size` | `'default' \| 'sm' \| 'xs'` | `'default'` |
30
+
31
+ Parts (selectors): `[uiItem], ui-item`, `[uiItemContent], ui-item-content`, `[uiItemTitle], ui-item-title`, `[uiItemDescription], ui-item-description`, `[uiItemActions], ui-item-actions`, `[uiItemMedia], ui-item-media`, `[uiItemGroup], ui-item-group`, `[uiItemHeader], ui-item-header`.
32
+
33
+ Spec: `docs/behavior-specs/item.md` · Manual test: `docs/manual-tests/item.md`
package/kbd/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # Kbd
2
+
3
+ ```ts
4
+ import { UI_KBD_GENERATED } from '@loomui-ng/ui/kbd';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <kbd uiKbdGroup><kbd uiKbd>Ctrl</kbd><kbd uiKbd>K</kbd></kbd>
10
+ ```
11
+
12
+ Same thing as custom elements (identical inputs; directives keep working):
13
+
14
+ ```html
15
+ <ui-kbd-group><ui-kbd>Ctrl</ui-kbd><ui-kbd>K</ui-kbd></ui-kbd-group>
16
+ ```
17
+
18
+
19
+ Parts (selectors): `kbd[uiKbd], ui-kbd`, `kbd[uiKbdGroup], ui-kbd-group`.
20
+
21
+ Spec: `docs/behavior-specs/kbd.md` · Manual test: `docs/manual-tests/kbd.md`
@@ -0,0 +1,24 @@
1
+ # uiLabel
2
+
3
+ ```ts
4
+ import { UiLabel } from '@loomui-ng/ui/label';
5
+ // add to the component imports array
6
+ ```
7
+
8
+ ```html
9
+ <label uiLabel for="email">Email</label>
10
+ ```
11
+
12
+ Same thing as custom elements (identical inputs; directives keep working):
13
+
14
+ ```html
15
+ <ui-label for="email">Email</ui-label>
16
+ ```
17
+
18
+ | Input | Values | Default |
19
+ |---|---|---|
20
+ | `class` | extra classes | - |
21
+
22
+ Native label; for/id association.
23
+
24
+ Spec: docs/behavior-specs/label.md - Manual checks: docs/manual-tests/label.md
@@ -0,0 +1,24 @@
1
+ # Marker
2
+
3
+ ```ts
4
+ import { UI_MARKER_GENERATED } from '@loomui-ng/ui/marker';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiMarker variant="separator"><span uiMarkerContent>New messages</span></div>
10
+ ```
11
+
12
+ Same thing as custom elements (identical inputs; directives keep working):
13
+
14
+ ```html
15
+ <ui-marker variant="separator"><ui-marker-content>New messages</ui-marker-content></ui-marker>
16
+ ```
17
+
18
+ | Input / output | Type / values | Default |
19
+ |---|---|---|
20
+ | `variant` | `'default' \| 'separator' \| 'border'` | `'default'` |
21
+
22
+ Parts (selectors): `[uiMarker], ui-marker`, `span[uiMarkerIcon], ui-marker-icon`, `span[uiMarkerContent], ui-marker-content`.
23
+
24
+ Spec: `docs/behavior-specs/marker.md` · Manual test: `docs/manual-tests/marker.md`
@@ -0,0 +1,40 @@
1
+ # Menubar
2
+
3
+ ```ts
4
+ import { UI_MENUBAR } from '@loomui-ng/ui/menubar';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiMenubar>
10
+ <div uiMenubarMenu>
11
+ <button uiMenubarTrigger>File</button>
12
+ <div uiMenubarContent><div uiMenubarItem>New</div></div>
13
+ </div>
14
+ </div>
15
+ ```
16
+
17
+ Same thing as custom elements (identical inputs; directives keep working):
18
+
19
+ ```html
20
+ <ui-menubar>
21
+ <ui-menubar-menu>
22
+ <ui-menubar-trigger>File</ui-menubar-trigger>
23
+ <ui-menubar-content><ui-menubar-item>New</ui-menubar-item></ui-menubar-content>
24
+ </ui-menubar-menu>
25
+ </ui-menubar>
26
+ ```
27
+
28
+ | Input / output | Type / values | Default |
29
+ |---|---|---|
30
+ | `align` | `Align` | `'start'` |
31
+ | `sideOffset` | | `8` |
32
+ | `variant` | `'default' \| 'destructive'` | `'default'` |
33
+ | `inset` | | `false` |
34
+ | `checked` (model) | | `false` |
35
+ | `value` (model) | `string \| undefined` | `undefined` |
36
+ | `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'right'` |
37
+
38
+ Parts (selectors): `[uiMenubar], ui-menubar`, `[uiMenubarMenu], ui-menubar-menu`, `[uiMenubarTrigger], ui-menubar-trigger`, `[uiMenubarContent], ui-menubar-content`, `[uiMenubarItem], ui-menubar-item`, `[uiMenubarCheckboxItem], ui-menubar-checkbox-item`, `[uiMenubarRadioGroup], ui-menubar-radio-group`, `[uiMenubarRadioItem], ui-menubar-radio-item`, `[uiMenubarSub], ui-menubar-sub`, `[uiMenubarSubTrigger], ui-menubar-sub-trigger`, `[uiMenubarSubContent], ui-menubar-sub-content`, `[uiMenubarLabel], ui-menubar-label`, `[uiMenubarSeparator], ui-menubar-separator`, `[uiMenubarShortcut], ui-menubar-shortcut`, `[uiMenubarGroup], ui-menubar-group`.
39
+
40
+ Spec: `docs/behavior-specs/menubar.md` · Manual test: `docs/manual-tests/menubar.md`
@@ -0,0 +1,32 @@
1
+ # Message
2
+
3
+ ```ts
4
+ import { UI_MESSAGE_GENERATED } from '@loomui-ng/ui/message';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiMessageGroup>
10
+ <div uiMessage>
11
+ <div uiMessageContent><div uiMessageHeader>Assistant</div><div uiBubble>…</div><div uiMessageFooter>10:42</div></div>
12
+ </div>
13
+ </div>
14
+ ```
15
+
16
+ Same thing as custom elements (identical inputs; directives keep working):
17
+
18
+ ```html
19
+ <ui-message-group>
20
+ <ui-message>
21
+ <ui-message-content><ui-message-header>Assistant</ui-message-header><ui-bubble>…</ui-bubble><ui-message-footer>10:42</ui-message-footer></ui-message-content>
22
+ </ui-message>
23
+ </ui-message-group>
24
+ ```
25
+
26
+ | Input / output | Type / values | Default |
27
+ |---|---|---|
28
+ | `align` | `'end' \| 'start'` | `'start'` |
29
+
30
+ Parts (selectors): `[uiMessage], ui-message`, `[uiMessageAvatar], ui-message-avatar`, `[uiMessageContent], ui-message-content`, `[uiMessageFooter], ui-message-footer`, `[uiMessageGroup], ui-message-group`, `[uiMessageHeader], ui-message-header`.
31
+
32
+ Spec: `docs/behavior-specs/message.md` · Manual test: `docs/manual-tests/message.md`
@@ -0,0 +1,40 @@
1
+ # Message Scroller
2
+
3
+ ```ts
4
+ import { UI_MESSAGE_SCROLLER } from '@loomui-ng/ui/message-scroller';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiMessageScroller class="h-80">
10
+ <div uiMessageScrollerViewport>
11
+ <div uiMessageScrollerContent>
12
+ <div uiMessageScrollerItem messageId="m1">…</div>
13
+ </div>
14
+ </div>
15
+ <button uiMessageScrollerButton aria-label="Scroll to latest"></button>
16
+ </div>
17
+ ```
18
+
19
+ Same thing as custom elements (identical inputs; directives keep working):
20
+
21
+ ```html
22
+ <ui-message-scroller class="h-80">
23
+ <ui-message-scroller-viewport>
24
+ <ui-message-scroller-content>
25
+ <ui-message-scroller-item messageId="m1">…</ui-message-scroller-item>
26
+ </ui-message-scroller-content>
27
+ </ui-message-scroller-viewport>
28
+ <ui-message-scroller-button aria-label="Scroll to latest"></ui-message-scroller-button>
29
+ </ui-message-scroller>
30
+ ```
31
+
32
+ | Input / output | Type / values | Default |
33
+ |---|---|---|
34
+ | `busy` | | `false` |
35
+ | `messageId` | `string` | `''` |
36
+ | `scrollAnchor` | | `false` |
37
+
38
+ Parts (selectors): `div[uiMessageScroller], ui-message-scroller`, `[uiMessageScrollerViewport], ui-message-scroller-viewport`, `[uiMessageScrollerContent], ui-message-scroller-content`, `[uiMessageScrollerItem], ui-message-scroller-item`, `button[uiMessageScrollerButton], ui-message-scroller-button`.
39
+
40
+ Spec: `docs/behavior-specs/message-scroller.md` · Manual test: `docs/manual-tests/message-scroller.md`