@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Loom UI contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,47 @@
1
- # Temporary Holding Version
1
+ # @loomui-ng/ui — Loom UI
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Directive-first Angular 22 components (also available as custom elements) with Radix-style behavior, built on the CDK and Tailwind v4. Inspired by shadcn/ui. Each component folder has its own README; behavior specs are in `docs/behavior-specs/`, manual checklists in `docs/manual-tests/`.
4
+
5
+ Import per component: `import { UiButton } from '@loomui-ng/ui/button'` (path alias in `tsconfig.json`; secondary entry points are prepared with an `ng-package.json` per folder, but the library has not been built/published with ng-packagr yet).
6
+
7
+ ## Install
8
+
9
+ **Option A — copy-in CLI (you own the code):**
10
+ ```bash
11
+ npx loomui init
12
+ npx loomui add button dialog data-table
13
+ ```
14
+ See `packages/loomui-cli/README.md`. All 64 components were verified to compile standalone (`ngc`, strict templates) after being copied this way.
15
+
16
+ **Option B — npm package:** `ng build ui` produces `dist/ui` (`@loomui-ng/ui`, one secondary entry point per component, partial-Ivy). In the consumer:
17
+ ```css
18
+ @import 'tailwindcss';
19
+ @import '@loomui-ng/ui/styles/loomui.css'; /* tokens, variants, toast css, accent presets, @source for the package */
20
+ ```
21
+ Optional peers: `embla-carousel` (Carousel), `chart.js` (Chart), `@tanstack/angular-table` (Data Table recipe). Not published to a registry yet.
22
+
23
+ ## Required setup (only when wiring Tailwind manually — Options A/B already include it) (see `projects/playground/src/styles.css`)
24
+ 1. Tailwind v4 (`@import 'tailwindcss'`), `tw-animate-css`, and the design tokens (`--background`, `--primary`, `--radius`, …, `.dark` class).
25
+ 2. `@source` pointing at `libs/ui` so Tailwind scans the class strings.
26
+ 3. Custom variants that map the `data-open:`/`data-checked:`-style classes onto Radix-style `data-state` attributes:
27
+ `data-open`, `data-closed`, `data-checked`, `data-unchecked`, `data-active`, `data-inactive`, `data-horizontal`, `data-vertical`.
28
+ 4. `@import '@angular/cdk/overlay-prebuilt.css'` and the backdrop override `.cdk-overlay-backdrop[data-slot]{opacity:1;transition:none}` (Dialog, Sheet, Popover, Tooltip, Dropdown Menu, Select).
29
+ 5. `libs/ui/toast/toast.css` for `<ui-toaster>`; `.no-scrollbar` utility for Command; `@keyframes caret-blink` + `--animate-caret-blink` for Input OTP.
30
+ 6. Chart/Sidebar tokens: `--chart-1..5` and `--sidebar*` (light + dark) with matching `--color-*` entries in `@theme inline`.
31
+ 7. Extra dependencies per component: `embla-carousel` (Carousel), `chart.js` (Chart), `@tanstack/angular-table` (Data Table recipe), `class-variance-authority`, `clsx`, `tailwind-merge`, `tw-animate-css`, `@angular/cdk`.
32
+
33
+ ## Custom elements
34
+ Every directive also exists as a custom element: `<button uiButton>` → `<ui-button>`, `<div uiDialogContent>` → `<ui-dialog-content>`, `<table uiTable>` → `<ui-table>` (a hyphen is required for custom elements, so it is `ui-` and not `<Button>`). Directives are unchanged and can be mixed freely. Native controls get wrapper elements (`<ui-input>`, `<ui-textarea>`, `<ui-native-select>`, …) that work with `ngModel`/reactive forms. A shared host directive restores roles, tab stops, Enter/Space activation and `disabled` on the elements. Spec: `docs/behavior-specs/custom-elements.md`. Limits: `<ui-button>` does not submit a `<form>` (use `(click)`).
35
+
36
+ ## Icons
37
+ Lucide icons: `<ui-icon [icon]="Search" />` or `<svg uiIcon [icon]="Search">` (`npx loomui add icon`, peer dependency `lucide`). See `libs/ui/icon/README.md`; browse and copy at the showcase's **/icons** page.
38
+
39
+ ## Conventions
40
+ - Every directive accepts `class`, merged with `tailwind-merge` (`cn()`); the directive owns the whole `class` attribute, so avoid `[class.x]` bindings on the same element.
41
+ - Overlay roots (`uiDialog`, `uiPopover`, …) are state holders: put `class="contents"` on them. Their content element is declared inline and moved into a CDK overlay while open (it stays in the DOM, hidden, otherwise).
42
+ - `data-slot` / `data-state` / `data-side` / `data-variant` attributes match the observed live site. When two directives share an element (e.g. `uiButton` + `uiDialogTrigger`) the Button's `data-slot="button"` wins, as on the live site.
43
+ - Form controls: Input/Label are native elements; Checkbox, Switch and Select implement `ControlValueAccessor` and expose `checked`/`value` models plus `disabled`/`invalid` inputs shaped for Angular signal forms (not yet exercised with `[field]`).
44
+
45
+ ## Status
46
+ All 64 components of the docs sidebar are implemented; see each folder's README and `docs/behavior-specs/`.
47
+ See `docs/FINAL-REPORT.md`.
@@ -0,0 +1,38 @@
1
+ # Accordion
2
+
3
+ ```ts
4
+ import { UI_ACCORDION } from '@loomui-ng/ui/accordion';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiAccordion type="single" [collapsible]="true">
10
+ <div uiAccordionItem value="a">
11
+ <button uiAccordionTrigger>Is it accessible?</button>
12
+ <div uiAccordionContent>Yes.</div>
13
+ </div>
14
+ </div>
15
+ ```
16
+
17
+ Same thing as custom elements (identical inputs; directives keep working):
18
+
19
+ ```html
20
+ <ui-accordion type="single" [collapsible]="true">
21
+ <ui-accordion-item value="a">
22
+ <ui-accordion-trigger>Is it accessible?</ui-accordion-trigger>
23
+ <ui-accordion-content>Yes.</ui-accordion-content>
24
+ </ui-accordion-item>
25
+ </ui-accordion>
26
+ ```
27
+
28
+ | Input / output | Type / values | Default |
29
+ |---|---|---|
30
+ | `type` | `'single' \| 'multiple'` | `'single'` |
31
+ | `collapsible` | | `true` |
32
+ | `orientation` | `'vertical' \| 'horizontal'` | `'vertical'` |
33
+ | `value` (model) | `string[]` | `[]` |
34
+ | `disabled` | | `false` |
35
+
36
+ Parts (selectors): `[uiAccordion], ui-accordion`, `[uiAccordionItem], ui-accordion-item`, `button[uiAccordionTrigger], ui-accordion-trigger`, `[uiAccordionContent], ui-accordion-content`.
37
+
38
+ Spec: `docs/behavior-specs/accordion.md` · Manual test: `docs/manual-tests/accordion.md`
@@ -0,0 +1,32 @@
1
+ # Alert
2
+
3
+ ```ts
4
+ import { UI_ALERT_GENERATED } from '@loomui-ng/ui/alert';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiAlert variant="destructive">
10
+ <svg …></svg>
11
+ <div uiAlertTitle>Error</div>
12
+ <div uiAlertDescription>Your session expired.</div>
13
+ </div>
14
+ ```
15
+
16
+ Same thing as custom elements (identical inputs; directives keep working):
17
+
18
+ ```html
19
+ <ui-alert variant="destructive">
20
+ <svg …></svg>
21
+ <ui-alert-title>Error</ui-alert-title>
22
+ <ui-alert-description>Your session expired.</ui-alert-description>
23
+ </ui-alert>
24
+ ```
25
+
26
+ | Input / output | Type / values | Default |
27
+ |---|---|---|
28
+ | `variant` | `'default' \| 'destructive'` | `'default'` |
29
+
30
+ Parts (selectors): `[uiAlert], ui-alert`, `[uiAlertTitle], ui-alert-title`, `[uiAlertDescription], ui-alert-description`, `[uiAlertAction], ui-alert-action`.
31
+
32
+ Spec: `docs/behavior-specs/alert.md` · Manual test: `docs/manual-tests/alert.md`
@@ -0,0 +1,37 @@
1
+ # Alert Dialog
2
+
3
+ ```ts
4
+ import { UI_ALERT_DIALOG } from '@loomui-ng/ui/alert-dialog';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiAlertDialog>
10
+ <button uiButton uiAlertDialogTrigger>Delete</button>
11
+ <div uiAlertDialogContent>
12
+ <div uiAlertDialogHeader><h2 uiAlertDialogTitle>Are you sure?</h2><p uiAlertDialogDescription>This cannot be undone.</p></div>
13
+ <div uiAlertDialogFooter><button uiAlertDialogCancel>Cancel</button><button uiAlertDialogAction>Continue</button></div>
14
+ </div>
15
+ </div>
16
+ ```
17
+
18
+ Same thing as custom elements (identical inputs; directives keep working):
19
+
20
+ ```html
21
+ <ui-alert-dialog>
22
+ <ui-button uiAlertDialogTrigger>Delete</ui-button>
23
+ <ui-alert-dialog-content>
24
+ <ui-alert-dialog-header><ui-alert-dialog-title>Are you sure?</ui-alert-dialog-title><ui-alert-dialog-description>This cannot be undone.</ui-alert-dialog-description></ui-alert-dialog-header>
25
+ <ui-alert-dialog-footer><ui-alert-dialog-cancel>Cancel</ui-alert-dialog-cancel><ui-alert-dialog-action>Continue</ui-alert-dialog-action></ui-alert-dialog-footer>
26
+ </ui-alert-dialog-content>
27
+ </ui-alert-dialog>
28
+ ```
29
+
30
+ | Input / output | Type / values | Default |
31
+ |---|---|---|
32
+ | `size` | `'default' \| 'sm'` | `'default'` |
33
+ | `disabled` | | `false` |
34
+
35
+ Parts (selectors): `[uiAlertDialog], ui-alert-dialog`, `[uiAlertDialogTrigger], ui-alert-dialog-trigger`, `[uiAlertDialogContent], ui-alert-dialog-content`, `[uiAlertDialogHeader], ui-alert-dialog-header`, `[uiAlertDialogFooter], ui-alert-dialog-footer`, `[uiAlertDialogTitle], ui-alert-dialog-title`, `[uiAlertDialogDescription], ui-alert-dialog-description`, `button[uiAlertDialogCancel], ui-alert-dialog-cancel`, `button[uiAlertDialogAction], ui-alert-dialog-action`.
36
+
37
+ Spec: `docs/behavior-specs/alert-dialog.md` · Manual test: `docs/manual-tests/alert-dialog.md`
@@ -0,0 +1,24 @@
1
+ # Aspect Ratio
2
+
3
+ ```ts
4
+ import { UI_ASPECT_RATIO } from '@loomui-ng/ui/aspect-ratio';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiAspectRatio [ratio]="16 / 9" class="rounded-lg bg-muted">…</div>
10
+ ```
11
+
12
+ Same thing as custom elements (identical inputs; directives keep working):
13
+
14
+ ```html
15
+ <ui-aspect-ratio [ratio]="16 / 9" class="rounded-lg bg-muted">…</ui-aspect-ratio>
16
+ ```
17
+
18
+ | Input / output | Type / values | Default |
19
+ |---|---|---|
20
+ | `ratio` | | `1` |
21
+
22
+ Parts (selectors): `[uiAspectRatio], ui-aspect-ratio`.
23
+
24
+ Spec: `docs/behavior-specs/aspect-ratio.md` · Manual test: `docs/manual-tests/aspect-ratio.md`
@@ -0,0 +1,40 @@
1
+ # Attachment
2
+
3
+ ```ts
4
+ import { UI_ATTACHMENT } from '@loomui-ng/ui/attachment';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiAttachmentGroup>
10
+ <div uiAttachment>
11
+ <a uiAttachmentTrigger href="/files/a.png" aria-label="Open a.png"></a>
12
+ <div uiAttachmentContent><span uiAttachmentTitle>a.png</span><span uiAttachmentDescription>24 KB</span></div>
13
+ <button uiAttachmentAction aria-label="Remove a.png">×</button>
14
+ </div>
15
+ </div>
16
+ ```
17
+
18
+ Same thing as custom elements (identical inputs; directives keep working):
19
+
20
+ ```html
21
+ <ui-attachment-group>
22
+ <ui-attachment>
23
+ <ui-attachment-trigger href="/files/a.png" aria-label="Open a.png"></ui-attachment-trigger>
24
+ <ui-attachment-content><ui-attachment-title>a.png</ui-attachment-title><ui-attachment-description>24 KB</ui-attachment-description></ui-attachment-content>
25
+ <ui-attachment-action aria-label="Remove a.png">×</ui-attachment-action>
26
+ </ui-attachment>
27
+ </ui-attachment-group>
28
+ ```
29
+
30
+ | Input / output | Type / values | Default |
31
+ |---|---|---|
32
+ | `disabled` | | `false` |
33
+ | `state` | `'idle' \| 'uploading' \| 'processing' \| 'done'` | `'done'` |
34
+ | `size` | `'default' \| 'sm' \| 'xs'` | `'default'` |
35
+ | `orientation` | `'vertical' \| 'horizontal'` | `'vertical'` |
36
+ | `variant` | `'image' \| 'icon'` | `'icon'` |
37
+
38
+ Parts (selectors): `a[uiAttachmentTrigger], button[uiAttachmentTrigger], ui-attachment-trigger`, `button[uiAttachmentAction], ui-attachment-action`, `[uiAttachmentGroup], ui-attachment-group`, `[uiAttachment], ui-attachment`, `[uiAttachmentMedia], ui-attachment-media`, `[uiAttachmentContent], ui-attachment-content`, `span[uiAttachmentTitle], ui-attachment-title`, `span[uiAttachmentDescription], ui-attachment-description`, `[uiAttachmentActions], ui-attachment-actions`.
39
+
40
+ Spec: `docs/behavior-specs/attachment.md` · Manual test: `docs/manual-tests/attachment.md`
@@ -0,0 +1,34 @@
1
+ # Avatar
2
+
3
+ ```ts
4
+ import { UI_AVATAR } from '@loomui-ng/ui/avatar';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <span uiAvatar>
10
+ <img uiAvatarImage src="/me.png" alt="Me" />
11
+ <span uiAvatarFallback>CN</span>
12
+ </span>
13
+ ```
14
+
15
+ Same thing as custom elements (identical inputs; directives keep working):
16
+
17
+ ```html
18
+ <ui-avatar>
19
+ <ui-avatar-image src="/me.png" alt="Me" />
20
+ <ui-avatar-fallback>CN</ui-avatar-fallback>
21
+ </ui-avatar>
22
+ ```
23
+
24
+ | Input / output | Type / values | Default |
25
+ |---|---|---|
26
+ | `size` | `'default' \| 'sm' \| 'lg'` | `'default'` |
27
+ | `src` | `string` | `''` |
28
+ | `alt` | `string` | `''` |
29
+ | `srcset` | `string` | `''` |
30
+ | `sizes` | `string` | `''` |
31
+
32
+ Parts (selectors): `[uiAvatar], ui-avatar`, `img[uiAvatarImage]`, `[uiAvatarFallback], ui-avatar-fallback`, `ui-avatar-image`, `[uiAvatarBadge], ui-avatar-badge`, `[uiAvatarGroup], ui-avatar-group`, `[uiAvatarGroupCount], ui-avatar-group-count`.
33
+
34
+ Spec: `docs/behavior-specs/avatar.md` · Manual test: `docs/manual-tests/avatar.md`
@@ -0,0 +1,29 @@
1
+ # uiBadge
2
+
3
+ ```ts
4
+ import { UiBadge } from '@loomui-ng/ui/badge';
5
+ // add to the component imports array
6
+ ```
7
+
8
+ ```html
9
+ <span uiBadge>New</span>
10
+ <span uiBadge variant="secondary">Beta</span>
11
+ <a uiBadge variant="outline" href="/changelog">v1.2</a>
12
+ ```
13
+
14
+ Same thing as custom elements (identical inputs; directives keep working):
15
+
16
+ ```html
17
+ <ui-badge>New</ui-badge>
18
+ <ui-badge variant="secondary">Beta</ui-badge>
19
+ <ui-badge variant="outline" href="/changelog">v1.2</ui-badge>
20
+ ```
21
+
22
+ | Input | Values | Default |
23
+ |---|---|---|
24
+ | `variant` | `default` `secondary` `destructive` `outline` `ghost` | `default` |
25
+ | `class` | extra classes (tailwind-merge) | - |
26
+
27
+ Deviation: ps-/pe- instead of pl-/pr-.
28
+
29
+ Spec: docs/behavior-specs/badge.md - Manual checks: docs/manual-tests/badge.md
@@ -0,0 +1,33 @@
1
+ # Breadcrumb
2
+
3
+ ```ts
4
+ import { UI_BREADCRUMB } from '@loomui-ng/ui/breadcrumb';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <nav uiBreadcrumb>
10
+ <ol uiBreadcrumbList>
11
+ <li uiBreadcrumbItem><a uiBreadcrumbLink href="/">Home</a></li>
12
+ <li uiBreadcrumbSeparator></li>
13
+ <li uiBreadcrumbItem><span uiBreadcrumbPage>Components</span></li>
14
+ </ol>
15
+ </nav>
16
+ ```
17
+
18
+ Same thing as custom elements (identical inputs; directives keep working):
19
+
20
+ ```html
21
+ <ui-breadcrumb>
22
+ <ui-breadcrumb-list>
23
+ <ui-breadcrumb-item><ui-breadcrumb-link href="/">Home</ui-breadcrumb-link></ui-breadcrumb-item>
24
+ <ui-breadcrumb-separator></ui-breadcrumb-separator>
25
+ <ui-breadcrumb-item><ui-breadcrumb-page>Components</ui-breadcrumb-page></ui-breadcrumb-item>
26
+ </ui-breadcrumb-list>
27
+ </ui-breadcrumb>
28
+ ```
29
+
30
+
31
+ Parts (selectors): `li[uiBreadcrumbSeparator], ui-breadcrumb-separator`, `span[uiBreadcrumbEllipsis], ui-breadcrumb-ellipsis`, `nav[uiBreadcrumb], ui-breadcrumb`, `ol[uiBreadcrumbList], ui-breadcrumb-list`, `li[uiBreadcrumbItem], ui-breadcrumb-item`, `a[uiBreadcrumbLink], ui-breadcrumb-link`, `span[uiBreadcrumbPage], ui-breadcrumb-page`.
32
+
33
+ Spec: `docs/behavior-specs/breadcrumb.md` · Manual test: `docs/manual-tests/breadcrumb.md`
@@ -0,0 +1,32 @@
1
+ # Bubble
2
+
3
+ ```ts
4
+ import { UI_BUBBLE_GENERATED } from '@loomui-ng/ui/bubble';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiBubbleGroup>
10
+ <div uiBubble variant="muted"><div uiBubbleContent>Hello!</div></div>
11
+ <div uiBubble align="end"><div uiBubbleContent>Hi.</div></div>
12
+ </div>
13
+ ```
14
+
15
+ Same thing as custom elements (identical inputs; directives keep working):
16
+
17
+ ```html
18
+ <ui-bubble-group>
19
+ <ui-bubble variant="muted"><ui-bubble-content>Hello!</ui-bubble-content></ui-bubble>
20
+ <ui-bubble align="end"><ui-bubble-content>Hi.</ui-bubble-content></ui-bubble>
21
+ </ui-bubble-group>
22
+ ```
23
+
24
+ | Input / output | Type / values | Default |
25
+ |---|---|---|
26
+ | `variant` | `'default' \| 'muted' \| 'secondary' \| 'tinted' \| 'outline' \| 'destructive' \| 'ghost'` | `'default'` |
27
+ | `align` | `'end' \| 'start'` | `'start'` |
28
+ | `side` | `'bottom' \| 'top'` | `'bottom'` |
29
+
30
+ Parts (selectors): `[uiBubble], ui-bubble`, `[uiBubbleContent], ui-bubble-content`, `[uiBubbleGroup], ui-bubble-group`, `[uiBubbleReactions], ui-bubble-reactions`.
31
+
32
+ Spec: `docs/behavior-specs/bubble.md` · Manual test: `docs/manual-tests/bubble.md`
@@ -0,0 +1,31 @@
1
+ # uiButton
2
+
3
+ Directive that turns a native `<button>` or `<a>` into a shadcn/ui Button.
4
+
5
+ ```ts
6
+ import { UiButton } from '@loomui-ng/ui/button';
7
+
8
+ @Component({
9
+ imports: [UiButton],
10
+ template: `
11
+ <button uiButton>Default</button>
12
+ <button uiButton variant="outline" size="sm">Outline</button>
13
+ <button uiButton variant="destructive" disabled>Delete</button>
14
+ <a uiButton variant="link" href="/docs">Docs</a>
15
+ `,
16
+ })
17
+ export class Demo {}
18
+ ```
19
+
20
+ | Input | Values | Default |
21
+ |---|---|---|
22
+ | `variant` | `default` `outline` `secondary` `ghost` `destructive` `link` | `default` |
23
+ | `size` | `default` `xs` `sm` `lg` `icon` `icon-xs` `icon-sm` `icon-lg` | `default` |
24
+ | `class` | extra classes, merged with `tailwind-merge` | — |
25
+
26
+ Emits `data-slot="button"`, `data-variant`, `data-size`. `buttonVariants()` is exported for styling other elements.
27
+ Icon padding hooks: put `data-icon="inline-start"` / `"inline-end"` on a child icon.
28
+
29
+ Spec: `docs/behavior-specs/button.md` · Manual checks: `docs/manual-tests/button.md`
30
+
31
+ Deviations: logical `ps-/pe-` instead of `pl-/pr-`; `sm` height `h-7` is inferred; no `asChild` (use `<a uiButton>`).
@@ -0,0 +1,30 @@
1
+ # Button Group
2
+
3
+ ```ts
4
+ import { UI_BUTTON_GROUP_GENERATED } from '@loomui-ng/ui/button-group';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiButtonGroup>
10
+ <button uiButton variant="outline">Left</button>
11
+ <button uiButton variant="outline">Right</button>
12
+ </div>
13
+ ```
14
+
15
+ Same thing as custom elements (identical inputs; directives keep working):
16
+
17
+ ```html
18
+ <ui-button-group>
19
+ <ui-button variant="outline">Left</ui-button>
20
+ <ui-button variant="outline">Right</ui-button>
21
+ </ui-button-group>
22
+ ```
23
+
24
+ | Input / output | Type / values | Default |
25
+ |---|---|---|
26
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
27
+
28
+ Parts (selectors): `[uiButtonGroup], ui-button-group`, `[uiButtonGroupSeparator], ui-button-group-separator`.
29
+
30
+ Spec: `docs/behavior-specs/button-group.md` · Manual test: `docs/manual-tests/button-group.md`
@@ -0,0 +1,35 @@
1
+ # Calendar
2
+
3
+ ```ts
4
+ import { UI_CALENDAR } from '@loomui-ng/ui/calendar';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiCalendar mode="single" [(selected)]="date" class="rounded-lg border"></div>
10
+ <div uiCalendar mode="range" [(selected)]="range" [numberOfMonths]="2"></div>
11
+ ```
12
+
13
+ Same thing as custom elements (identical inputs; directives keep working):
14
+
15
+ ```html
16
+ <ui-calendar mode="single" [(selected)]="date" class="rounded-lg border"></ui-calendar>
17
+ <ui-calendar mode="range" [(selected)]="range" [numberOfMonths]="2"></ui-calendar>
18
+ ```
19
+
20
+ | Input / output | Type / values | Default |
21
+ |---|---|---|
22
+ | `mode` | `'single' \| 'multiple' \| 'range'` | `'single'` |
23
+ | `selected` (model) | `CalendarSelection` | `undefined` |
24
+ | `month` (model) | `Date` | `startOfDay(new Date(` |
25
+ | `numberOfMonths` | | `1` |
26
+ | `showOutsideDays` | | `true` |
27
+ | `weekStartsOn` | | `0` |
28
+ | `locale` | `string` | `typeof document !== 'undefined' ? document.documentElement.lang \|\| 'en-US' : 'en-US'` |
29
+ | `minDate` | `Date \| undefined` | `undefined` |
30
+ | `maxDate` | `Date \| undefined` | `undefined` |
31
+ | `required` | | `false` |
32
+
33
+ Parts (selectors): `div[uiCalendar], ui-calendar`.
34
+
35
+ Spec: `docs/behavior-specs/calendar.md` · Manual test: `docs/manual-tests/calendar.md`
package/card/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # uiCard
2
+
3
+ ```ts
4
+ import { UI_CARD } from '@loomui-ng/ui/card';
5
+ // add to the component imports array
6
+ ```
7
+
8
+ ```html
9
+ <div uiCard size="sm">
10
+ <div uiCardHeader>
11
+ <div uiCardTitle>Title</div>
12
+ <div uiCardDescription>Description</div>
13
+ <div uiCardAction><button uiButton variant="link">Action</button></div>
14
+ </div>
15
+ <div uiCardContent>…</div>
16
+ <div uiCardFooter>…</div>
17
+ </div>
18
+ ```
19
+
20
+ Same thing as custom elements (identical inputs; directives keep working):
21
+
22
+ ```html
23
+ <ui-card size="sm">
24
+ <ui-card-header>
25
+ <ui-card-title>Title</ui-card-title>
26
+ <ui-card-description>Description</ui-card-description>
27
+ <ui-card-action><ui-button variant="link">Action</ui-button></ui-card-action>
28
+ </ui-card-header>
29
+ <ui-card-content>…</ui-card-content>
30
+ <ui-card-footer>…</ui-card-footer>
31
+ </ui-card>
32
+ ```
33
+
34
+ | Input | Values | Default |
35
+ |---|---|---|
36
+ | `size` (uiCard) | `default` `sm` | `default` |
37
+ | `class` | extra classes (all parts) | - |
38
+
39
+ Parts: uiCard, uiCardHeader, uiCardTitle, uiCardDescription, uiCardAction, uiCardContent, uiCardFooter.
40
+
41
+ Spec: docs/behavior-specs/card.md - Manual checks: docs/manual-tests/card.md
@@ -0,0 +1,41 @@
1
+ # Carousel
2
+
3
+ ```ts
4
+ import { UI_CAROUSEL } from '@loomui-ng/ui/carousel';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiCarousel class="mx-auto w-full max-w-xs">
10
+ <div uiCarouselContent>
11
+ <div uiCarouselItem>1</div>
12
+ <div uiCarouselItem>2</div>
13
+ </div>
14
+ <button uiCarouselPrevious></button>
15
+ <button uiCarouselNext></button>
16
+ </div>
17
+ ```
18
+
19
+ Same thing as custom elements (identical inputs; directives keep working):
20
+
21
+ ```html
22
+ <ui-carousel class="mx-auto w-full max-w-xs">
23
+ <ui-carousel-content>
24
+ <ui-carousel-item>1</ui-carousel-item>
25
+ <ui-carousel-item>2</ui-carousel-item>
26
+ </ui-carousel-content>
27
+ <ui-carousel-previous></ui-carousel-previous>
28
+ <ui-carousel-next></ui-carousel-next>
29
+ </ui-carousel>
30
+ ```
31
+
32
+ | Input / output | Type / values | Default |
33
+ |---|---|---|
34
+ | `opts` | `Record<string, any>` | `{}` |
35
+ | `plugins` | `any[]` | `[]` |
36
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
37
+ | `ready` (output) | `EmblaCarouselType` | |
38
+
39
+ Parts (selectors): `div[uiCarousel], ui-carousel`, `div[uiCarouselContent], ui-carousel-content`, `div[uiCarouselItem], ui-carousel-item`, `button[uiCarouselPrevious], ui-carousel-previous`, `button[uiCarouselNext], ui-carousel-next`.
40
+
41
+ Spec: `docs/behavior-specs/carousel.md` · Manual test: `docs/manual-tests/carousel.md`
@@ -0,0 +1,25 @@
1
+ # Chart
2
+
3
+ ```ts
4
+ import { UI_CHART } from '@loomui-ng/ui/chart';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <ui-chart type="bar" [data]="rows" xKey="month" [config]="config" class="h-64 w-full" label="Visitors" />
10
+ ```
11
+
12
+ | Input / output | Type / values | Default |
13
+ |---|---|---|
14
+ | `type` | `ChartType` | `'bar'` |
15
+ | `data` | `Record<string, unknown>[]` | required |
16
+ | `xKey` | `string` | required |
17
+ | `valueKey` | `string` | `''` |
18
+ | `config` | `ChartConfig` | required |
19
+ | `options` | `Record<string, any>` | `{}` |
20
+ | `showLegend` | | `true` |
21
+ | `label` | | `'Chart'` |
22
+
23
+ Parts (selectors): `ui-chart`.
24
+
25
+ Spec: `docs/behavior-specs/chart.md` · Manual test: `docs/manual-tests/chart.md`
@@ -0,0 +1,31 @@
1
+ # uiCheckbox
2
+
3
+ ```ts
4
+ import { UiCheckbox } from '@loomui-ng/ui/checkbox';
5
+ // add to the component imports array
6
+ ```
7
+
8
+ ```html
9
+ <button uiCheckbox [(checked)]="accepted"></button>
10
+ <button uiCheckbox [formControl]="ctrl"></button>
11
+ <button uiCheckbox [indeterminate]="true"></button>
12
+ ```
13
+
14
+ Same thing as custom elements (identical inputs; directives keep working):
15
+
16
+ ```html
17
+ <ui-checkbox [(checked)]="accepted"></ui-checkbox>
18
+ <ui-checkbox [formControl]="ctrl"></ui-checkbox>
19
+ <ui-checkbox [indeterminate]="true"></ui-checkbox>
20
+ ```
21
+
22
+ | Input | Values | Default |
23
+ |---|---|---|
24
+ | `checked` | model boolean | `false` |
25
+ | `indeterminate` | model boolean | `false` |
26
+ | `disabled` / `invalid` | boolean | `false` |
27
+ | `class` | extra classes | - |
28
+
29
+ Space toggles, Enter does not. ControlValueAccessor + signal-forms compatible shape. Needs the data-checked custom variants from the playground styles.css.
30
+
31
+ Spec: docs/behavior-specs/checkbox.md - Manual checks: docs/manual-tests/checkbox.md
@@ -0,0 +1,31 @@
1
+ # Collapsible
2
+
3
+ ```ts
4
+ import { UI_COLLAPSIBLE } from '@loomui-ng/ui/collapsible';
5
+ // add to the component `imports` array
6
+ ```
7
+
8
+ ```html
9
+ <div uiCollapsible [(open)]="open">
10
+ <button uiCollapsibleTrigger>Toggle</button>
11
+ <div uiCollapsibleContent>…</div>
12
+ </div>
13
+ ```
14
+
15
+ Same thing as custom elements (identical inputs; directives keep working):
16
+
17
+ ```html
18
+ <ui-collapsible [(open)]="open">
19
+ <ui-collapsible-trigger>Toggle</ui-collapsible-trigger>
20
+ <ui-collapsible-content>…</ui-collapsible-content>
21
+ </ui-collapsible>
22
+ ```
23
+
24
+ | Input / output | Type / values | Default |
25
+ |---|---|---|
26
+ | `open` (model) | | `false` |
27
+ | `disabled` | | `false` |
28
+
29
+ Parts (selectors): `[uiCollapsible], ui-collapsible`, `[uiCollapsibleTrigger], ui-collapsible-trigger`, `[uiCollapsibleContent], ui-collapsible-content`.
30
+
31
+ Spec: `docs/behavior-specs/collapsible.md` · Manual test: `docs/manual-tests/collapsible.md`