@egose/shadcn-theme-ng 0.0.27 → 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 (316) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +3 -0
  3. package/accordion/fesm2022/accordion.mjs +148 -0
  4. package/accordion/package.json +25 -0
  5. package/accordion/types/accordion.d.ts +49 -0
  6. package/alert/README.md +2 -63
  7. package/alert/fesm2022/alert.mjs +58 -53
  8. package/alert/package.json +25 -0
  9. package/alert-dialog/README.md +11 -0
  10. package/alert-dialog/fesm2022/alert-dialog.mjs +287 -0
  11. package/alert-dialog/package.json +25 -0
  12. package/alert-dialog/types/alert-dialog.d.ts +90 -0
  13. package/aspect-ratio/README.md +11 -0
  14. package/aspect-ratio/fesm2022/aspect-ratio.mjs +62 -0
  15. package/aspect-ratio/package.json +25 -0
  16. package/aspect-ratio/types/aspect-ratio.d.ts +21 -0
  17. package/autocomplete/README.md +3 -0
  18. package/autocomplete/fesm2022/autocomplete.mjs +391 -0
  19. package/autocomplete/package.json +24 -0
  20. package/autocomplete/types/autocomplete.d.ts +96 -0
  21. package/avatar/README.md +11 -0
  22. package/avatar/fesm2022/avatar.mjs +178 -0
  23. package/avatar/package.json +25 -0
  24. package/avatar/types/avatar.d.ts +50 -0
  25. package/badge/README.md +2 -63
  26. package/badge/fesm2022/badge.mjs +69 -63
  27. package/badge/package.json +25 -0
  28. package/basic-alert/README.md +2 -63
  29. package/basic-alert/fesm2022/basic-alert.mjs +14 -22
  30. package/basic-alert/package.json +24 -0
  31. package/breadcrumb/README.md +11 -0
  32. package/breadcrumb/fesm2022/breadcrumb.mjs +218 -0
  33. package/breadcrumb/package.json +25 -0
  34. package/breadcrumb/types/breadcrumb.d.ts +57 -0
  35. package/button/README.md +2 -63
  36. package/button/fesm2022/button.mjs +201 -177
  37. package/button/package.json +25 -0
  38. package/button/{index.d.ts → types/button.d.ts} +31 -10
  39. package/button-group/README.md +11 -0
  40. package/button-group/fesm2022/button-group.mjs +102 -0
  41. package/button-group/package.json +25 -0
  42. package/button-group/types/button-group.d.ts +30 -0
  43. package/calendar/README.md +2 -63
  44. package/calendar/fesm2022/calendar.mjs +178 -570
  45. package/calendar/package.json +24 -0
  46. package/calendar/types/calendar.d.ts +94 -0
  47. package/card/README.md +11 -0
  48. package/card/fesm2022/card.mjs +169 -0
  49. package/card/package.json +25 -0
  50. package/card/types/card.d.ts +54 -0
  51. package/carousel/README.md +11 -0
  52. package/carousel/fesm2022/carousel.mjs +267 -0
  53. package/carousel/package.json +25 -0
  54. package/carousel/types/carousel.d.ts +84 -0
  55. package/checkbox/README.md +3 -0
  56. package/checkbox/fesm2022/checkbox.mjs +113 -0
  57. package/checkbox/package.json +24 -0
  58. package/checkbox/types/checkbox.d.ts +56 -0
  59. package/collapsible/README.md +11 -0
  60. package/collapsible/fesm2022/collapsible.mjs +77 -0
  61. package/collapsible/package.json +25 -0
  62. package/collapsible/types/collapsible.d.ts +27 -0
  63. package/combobox/README.md +11 -0
  64. package/combobox/fesm2022/combobox.mjs +547 -0
  65. package/combobox/package.json +25 -0
  66. package/combobox/types/combobox.d.ts +151 -0
  67. package/command/README.md +11 -0
  68. package/command/fesm2022/command.mjs +301 -0
  69. package/command/package.json +25 -0
  70. package/command/types/command.d.ts +89 -0
  71. package/confirmation-dialog/README.md +3 -0
  72. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +79 -0
  73. package/confirmation-dialog/package.json +24 -0
  74. package/confirmation-dialog/types/confirmation-dialog.d.ts +28 -0
  75. package/context-menu/README.md +11 -0
  76. package/context-menu/fesm2022/context-menu.mjs +89 -0
  77. package/context-menu/package.json +25 -0
  78. package/context-menu/types/context-menu.d.ts +34 -0
  79. package/date-picker/README.md +2 -63
  80. package/date-picker/fesm2022/date-picker.mjs +1104 -352
  81. package/date-picker/package.json +24 -0
  82. package/date-picker/types/date-picker.d.ts +555 -0
  83. package/dialog/README.md +3 -0
  84. package/dialog/fesm2022/dialog.mjs +281 -0
  85. package/dialog/package.json +24 -0
  86. package/dialog/types/dialog.d.ts +95 -0
  87. package/drawer/README.md +11 -0
  88. package/drawer/fesm2022/drawer.mjs +261 -0
  89. package/drawer/package.json +25 -0
  90. package/drawer/types/drawer.d.ts +76 -0
  91. package/dropdown-menu/README.md +11 -0
  92. package/dropdown-menu/fesm2022/dropdown-menu.mjs +554 -0
  93. package/dropdown-menu/package.json +25 -0
  94. package/dropdown-menu/types/dropdown-menu.d.ts +180 -0
  95. package/empty/README.md +11 -0
  96. package/empty/fesm2022/empty.mjs +151 -0
  97. package/empty/package.json +25 -0
  98. package/empty/types/empty.d.ts +54 -0
  99. package/field/README.md +11 -0
  100. package/field/fesm2022/field.mjs +351 -0
  101. package/field/package.json +25 -0
  102. package/field/types/field.d.ts +107 -0
  103. package/form-checkbox/README.md +3 -0
  104. package/form-checkbox/fesm2022/form-checkbox.mjs +94 -0
  105. package/form-checkbox/package.json +24 -0
  106. package/form-checkbox/types/form-checkbox.d.ts +33 -0
  107. package/form-date-picker/README.md +2 -63
  108. package/form-date-picker/fesm2022/form-date-picker.mjs +74 -120
  109. package/form-date-picker/package.json +24 -0
  110. package/form-date-picker/{index.d.ts → types/form-date-picker.d.ts} +7 -1
  111. package/form-field/README.md +2 -63
  112. package/form-field/fesm2022/form-field.mjs +54 -28
  113. package/form-field/package.json +25 -0
  114. package/form-field/types/form-field.d.ts +46 -0
  115. package/form-field-simple/README.md +2 -63
  116. package/form-field-simple/fesm2022/form-field-simple.mjs +15 -10
  117. package/form-field-simple/package.json +24 -0
  118. package/form-searchable-multiselect/README.md +3 -0
  119. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +98 -0
  120. package/form-searchable-multiselect/package.json +24 -0
  121. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +36 -0
  122. package/form-select/README.md +2 -63
  123. package/form-select/fesm2022/form-select.mjs +85 -141
  124. package/form-select/package.json +24 -0
  125. package/form-select/{index.d.ts → types/form-select.d.ts} +7 -1
  126. package/form-text-input/README.md +2 -63
  127. package/form-text-input/fesm2022/form-text-input.mjs +86 -171
  128. package/form-text-input/package.json +24 -0
  129. package/form-text-input/{index.d.ts → types/form-text-input.d.ts} +9 -12
  130. package/form-textarea/README.md +2 -63
  131. package/form-textarea/fesm2022/form-textarea.mjs +77 -128
  132. package/form-textarea/package.json +24 -0
  133. package/form-textarea/{index.d.ts → types/form-textarea.d.ts} +8 -1
  134. package/hover-card/README.md +11 -0
  135. package/hover-card/fesm2022/hover-card.mjs +123 -0
  136. package/hover-card/package.json +25 -0
  137. package/hover-card/types/hover-card.d.ts +36 -0
  138. package/icon/README.md +2 -63
  139. package/icon/fesm2022/icon.mjs +12 -10
  140. package/icon/package.json +25 -0
  141. package/input/README.md +2 -63
  142. package/input/fesm2022/input.mjs +25 -70
  143. package/input/package.json +25 -0
  144. package/input/types/input.d.ts +19 -0
  145. package/input-group/README.md +11 -0
  146. package/input-group/fesm2022/input-group.mjs +199 -0
  147. package/input-group/package.json +25 -0
  148. package/input-group/types/input-group.d.ts +52 -0
  149. package/input-otp/README.md +11 -0
  150. package/input-otp/fesm2022/input-otp.mjs +141 -0
  151. package/input-otp/package.json +25 -0
  152. package/input-otp/types/input-otp.d.ts +43 -0
  153. package/item/README.md +11 -0
  154. package/item/fesm2022/item.mjs +278 -0
  155. package/item/package.json +25 -0
  156. package/item/types/item.d.ts +101 -0
  157. package/kbd/README.md +11 -0
  158. package/kbd/fesm2022/kbd.mjs +61 -0
  159. package/kbd/package.json +25 -0
  160. package/kbd/types/kbd.d.ts +22 -0
  161. package/label/README.md +2 -63
  162. package/label/fesm2022/label.mjs +12 -11
  163. package/label/package.json +25 -0
  164. package/label/{index.d.ts → types/label.d.ts} +1 -1
  165. package/layout-simple/README.md +3 -0
  166. package/layout-simple/fesm2022/layout-simple.mjs +388 -0
  167. package/layout-simple/package.json +24 -0
  168. package/layout-simple/types/layout-simple.d.ts +167 -0
  169. package/menu/README.md +3 -0
  170. package/menu/fesm2022/menu.mjs +455 -0
  171. package/menu/package.json +24 -0
  172. package/menu/types/menu.d.ts +137 -0
  173. package/menubar/README.md +11 -0
  174. package/menubar/fesm2022/menubar.mjs +108 -0
  175. package/menubar/package.json +25 -0
  176. package/menubar/types/menubar.d.ts +40 -0
  177. package/native-select/README.md +11 -0
  178. package/native-select/fesm2022/native-select.mjs +207 -0
  179. package/native-select/package.json +25 -0
  180. package/native-select/types/native-select.d.ts +70 -0
  181. package/navigation-menu/README.md +11 -0
  182. package/navigation-menu/fesm2022/navigation-menu.mjs +194 -0
  183. package/navigation-menu/package.json +25 -0
  184. package/navigation-menu/types/navigation-menu.d.ts +54 -0
  185. package/package.json +284 -63
  186. package/pagination/README.md +11 -0
  187. package/pagination/fesm2022/pagination.mjs +522 -0
  188. package/pagination/package.json +25 -0
  189. package/pagination/types/pagination.d.ts +192 -0
  190. package/popover/README.md +2 -63
  191. package/popover/fesm2022/popover.mjs +124 -30
  192. package/popover/package.json +24 -0
  193. package/popover/types/popover.d.ts +54 -0
  194. package/progress/README.md +11 -0
  195. package/progress/fesm2022/progress.mjs +77 -0
  196. package/progress/package.json +25 -0
  197. package/progress/types/progress.d.ts +27 -0
  198. package/radio-group/README.md +3 -0
  199. package/radio-group/fesm2022/radio-group.mjs +207 -0
  200. package/radio-group/package.json +25 -0
  201. package/radio-group/types/radio-group.d.ts +71 -0
  202. package/resizable/README.md +11 -0
  203. package/resizable/fesm2022/resizable.mjs +103 -0
  204. package/resizable/package.json +25 -0
  205. package/resizable/types/resizable.d.ts +32 -0
  206. package/scroll-area/README.md +11 -0
  207. package/scroll-area/fesm2022/scroll-area.mjs +51 -0
  208. package/scroll-area/package.json +25 -0
  209. package/scroll-area/types/scroll-area.d.ts +16 -0
  210. package/searchable-multiselect/README.md +3 -0
  211. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +136 -0
  212. package/searchable-multiselect/package.json +24 -0
  213. package/searchable-multiselect/types/searchable-multiselect.d.ts +45 -0
  214. package/select/README.md +2 -63
  215. package/select/fesm2022/select.mjs +340 -198
  216. package/select/package.json +25 -0
  217. package/select/types/select.d.ts +121 -0
  218. package/separator/README.md +2 -63
  219. package/separator/fesm2022/separator.mjs +17 -15
  220. package/separator/package.json +24 -0
  221. package/separator/{index.d.ts → types/separator.d.ts} +4 -5
  222. package/sheet/README.md +2 -63
  223. package/sheet/fesm2022/sheet.mjs +56 -61
  224. package/sheet/package.json +24 -0
  225. package/sidebar/README.md +11 -0
  226. package/sidebar/fesm2022/sidebar.mjs +846 -0
  227. package/sidebar/package.json +25 -0
  228. package/sidebar/types/sidebar.d.ts +237 -0
  229. package/skeleton/README.md +11 -0
  230. package/skeleton/fesm2022/skeleton.mjs +44 -0
  231. package/skeleton/package.json +25 -0
  232. package/skeleton/types/skeleton.d.ts +16 -0
  233. package/slider/README.md +11 -0
  234. package/slider/fesm2022/slider.mjs +74 -0
  235. package/slider/package.json +25 -0
  236. package/slider/types/slider.d.ts +19 -0
  237. package/sonner/README.md +2 -63
  238. package/sonner/fesm2022/sonner.mjs +34 -39
  239. package/sonner/package.json +25 -0
  240. package/spinner/README.md +2 -63
  241. package/spinner/fesm2022/spinner.mjs +20 -16
  242. package/spinner/package.json +25 -0
  243. package/switch/README.md +2 -63
  244. package/switch/fesm2022/switch.mjs +28 -27
  245. package/switch/package.json +25 -0
  246. package/table/README.md +11 -0
  247. package/table/fesm2022/table.mjs +211 -0
  248. package/table/package.json +25 -0
  249. package/table/types/table.d.ts +87 -0
  250. package/tabs/README.md +3 -0
  251. package/tabs/fesm2022/tabs.mjs +210 -0
  252. package/tabs/package.json +25 -0
  253. package/tabs/types/tabs.d.ts +71 -0
  254. package/textarea/README.md +11 -0
  255. package/textarea/fesm2022/textarea.mjs +47 -0
  256. package/textarea/package.json +25 -0
  257. package/textarea/types/textarea.d.ts +18 -0
  258. package/toggle/README.md +11 -0
  259. package/toggle/fesm2022/toggle.mjs +78 -0
  260. package/toggle/package.json +25 -0
  261. package/toggle/types/toggle.d.ts +27 -0
  262. package/toggle-group/README.md +11 -0
  263. package/toggle-group/fesm2022/toggle-group.mjs +117 -0
  264. package/toggle-group/package.json +25 -0
  265. package/toggle-group/types/toggle-group.d.ts +45 -0
  266. package/tooltip/README.md +3 -0
  267. package/tooltip/fesm2022/tooltip.mjs +72 -0
  268. package/tooltip/package.json +25 -0
  269. package/tooltip/types/tooltip.d.ts +22 -0
  270. package/typography/README.md +11 -0
  271. package/typography/fesm2022/typography.mjs +242 -0
  272. package/typography/package.json +25 -0
  273. package/typography/types/typography.d.ts +94 -0
  274. package/utils/README.md +2 -63
  275. package/utils/fesm2022/utils.mjs +209 -2
  276. package/utils/package.json +25 -0
  277. package/utils/types/utils.d.ts +13 -0
  278. package/alert/fesm2022/alert.mjs.map +0 -1
  279. package/badge/fesm2022/badge.mjs.map +0 -1
  280. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  281. package/button/fesm2022/button.mjs.map +0 -1
  282. package/calendar/fesm2022/calendar.mjs.map +0 -1
  283. package/calendar/index.d.ts +0 -111
  284. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  285. package/date-picker/index.d.ts +0 -227
  286. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  287. package/form-field/fesm2022/form-field.mjs.map +0 -1
  288. package/form-field/index.d.ts +0 -37
  289. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  290. package/form-select/fesm2022/form-select.mjs.map +0 -1
  291. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  292. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  293. package/icon/fesm2022/icon.mjs.map +0 -1
  294. package/input/fesm2022/input.mjs.map +0 -1
  295. package/input/index.d.ts +0 -41
  296. package/label/fesm2022/label.mjs.map +0 -1
  297. package/popover/fesm2022/popover.mjs.map +0 -1
  298. package/popover/index.d.ts +0 -30
  299. package/select/fesm2022/select.mjs.map +0 -1
  300. package/select/index.d.ts +0 -92
  301. package/separator/fesm2022/separator.mjs.map +0 -1
  302. package/sheet/fesm2022/sheet.mjs.map +0 -1
  303. package/sonner/fesm2022/sonner.mjs.map +0 -1
  304. package/spinner/fesm2022/spinner.mjs.map +0 -1
  305. package/switch/fesm2022/switch.mjs.map +0 -1
  306. package/utils/fesm2022/utils.mjs.map +0 -1
  307. package/utils/index.d.ts +0 -5
  308. /package/alert/{index.d.ts → types/alert.d.ts} +0 -0
  309. /package/badge/{index.d.ts → types/badge.d.ts} +0 -0
  310. /package/basic-alert/{index.d.ts → types/basic-alert.d.ts} +0 -0
  311. /package/form-field-simple/{index.d.ts → types/form-field-simple.d.ts} +0 -0
  312. /package/icon/{index.d.ts → types/icon.d.ts} +0 -0
  313. /package/sheet/{index.d.ts → types/sheet.d.ts} +0 -0
  314. /package/sonner/{index.d.ts → types/sonner.d.ts} +0 -0
  315. /package/spinner/{index.d.ts → types/spinner.d.ts} +0 -0
  316. /package/switch/{index.d.ts → types/switch.d.ts} +0 -0
package/README.md CHANGED
@@ -14,17 +14,28 @@ npm install @egose/shadcn-theme-ng
14
14
  npm install @egose/shadcn-theme-ng-tw
15
15
  ```
16
16
 
17
- `pnpm` / `yarn` equivalents work too. Make sure your project's versions satisfy the peer ranges below.
17
+ `pnpm` / `yarn` equivalents work too. npm installs peer dependencies automatically when it can resolve compatible
18
+ versions; applications must keep their existing framework versions inside the supported ranges below.
18
19
 
19
20
  ### Peer dependencies
20
21
 
21
- | Package | Supported version |
22
- | ------------------- | ------------------- |
23
- | `@angular/common` | `^20.2.0` |
24
- | `@angular/core` | `^20.2.0` |
25
- | `@spartan-ng/brain` | `^0.0.1-alpha.512+` |
22
+ | Package | Supported version | Tested version |
23
+ | ------------------- | ------------------ | -------------- |
24
+ | `@angular/cdk` | `>=22.0.0 <23.0.0` | `22.1.3` |
25
+ | `@angular/common` | `>=22.0.0 <23.0.0` | `22.1.3` |
26
+ | `@angular/core` | `>=22.0.0 <23.0.0` | `22.1.3` |
27
+ | `@angular/forms` | `>=22.0.0 <23.0.0` | `22.1.3` |
28
+ | `@angular/router` | `>=22.0.0 <23.0.0` | `22.1.3` |
29
+ | `@ng-icons/core` | `>=35.0.1 <36.0.0` | `35.0.1` |
30
+ | `@spartan-ng/brain` | `>=1.3.2 <2.0.0` | `1.3.2` |
31
+ | `rxjs` | `>=7.8.0 <8.0.0` | `7.8.2` |
26
32
 
27
- `@spartan-ng/brain` is the underlying primitive library that powers most components.
33
+ Angular and CDK must use the same major version. The tested consumer contract is Angular 22, CDK 22, and Spartan 1.3.2;
34
+ the ranges above are copied from the published peer metadata and validated with strict isolated installs.
35
+
36
+ Runtime implementation dependencies such as `@ng-icons/lucide`, `@ng-icons/tabler-icons`, `class-variance-authority`,
37
+ `clsx`, `embla-carousel`, `embla-carousel-angular`, `ngx-scrollbar`, `ngx-sonner`, `tailwind-merge`, and `tslib` are
38
+ installed transitively. Do not install them directly unless your application also imports them.
28
39
 
29
40
  ### Tailwind variants
30
41
 
@@ -37,6 +48,59 @@ There are two published variants of this package. They produce identical markup
37
48
 
38
49
  If your project mixes shadcn styles with other Tailwind utilities that share class names, use the `-tw` variant to avoid collisions.
39
50
 
51
+ Class utilities are normalized to one unprefixed canonical representation during packaging. The plain artifact emits
52
+ unprefixed utilities, while the `-tw` artifact prefixes every recognized utility with `tw:`. Generated JavaScript source
53
+ maps are intentionally excluded because this post-build class and package-identity transformation invalidates ng-packagr's
54
+ maps; shipping no map is safer than shipping a map that points at different generated code.
55
+
56
+ ## Release preparation
57
+
58
+ Prepare both release candidates without publishing by supplying the intended version explicitly:
59
+
60
+ ```bash
61
+ pnpm --dir packages/angular prepare:release --version 1.2.3
62
+ ```
63
+
64
+ This runs `@repo-toolkit/publish-package` with `publish.config.mjs`: it serially
65
+ builds, validates, and packs the plain (`release/plain` → `@egose/shadcn-theme-ng`)
66
+ and `tw:` (`release/tw` → `@egose/shadcn-theme-ng-tw`) variants. The inspectable
67
+ stages and two exact `.tgz` artifacts are written under `packages/angular/release/`.
68
+ Neither package is published unless both candidates pass every step. Publishing is
69
+ intended to run from protected CI with npm trusted publishing/OIDC; `--otp` remains
70
+ available for manual publishes (passed to the toolkit publish command, never logged).
71
+
72
+ ## Source tests
73
+
74
+ Headless-test prerequisite (local and CI): the Karma suites need a
75
+ Chrome-compatible binary. The repository-supported setup downloads it into
76
+ the repo-local `.puppeteer-cache/` directory:
77
+
78
+ ```bash
79
+ pnpm --dir packages/angular install:browser
80
+ ```
81
+
82
+ Alternatively, set `CHROME_BIN` to any Chrome/Chromium binary yourself
83
+ (`test/karma.conf.js` honors a pre-set `CHROME_BIN`, then falls back to a
84
+ system Chrome).
85
+
86
+ Focused library tests are intentionally separate from staged-package and artifact validation:
87
+
88
+ ```bash
89
+ # One selected library
90
+ pnpm --dir packages/angular test:library form-text-input
91
+ pnpm --dir packages/angular test:library utils
92
+
93
+ # Source export contracts plus every selected library, serially and headlessly
94
+ pnpm --dir packages/angular test:libraries
95
+
96
+ # The example shell and router behavior
97
+ pnpm --dir packages/angular/@examples/standard test:ci
98
+ ```
99
+
100
+ The browser suites share `packages/angular/test/setup.ts`, which provides zoneless Angular setup and assertions for form
101
+ bindings and resource teardown. DOM reconciliation uses real `MutationObserver` and animation-frame scheduling; server-mode
102
+ coverage verifies those browser resources are not created. All CI commands disable watch mode so they terminate after one run.
103
+
40
104
  ## Import forms
41
105
 
42
106
  Import each component via its own npm subpath:
@@ -72,23 +136,27 @@ export class MyModule {}
72
136
 
73
137
  Import by component name. Component `NameX` is reachable at `@egose/shadcn-theme-ng/<name-x>` (kebab-case). The current surface:
74
138
 
75
- `accordion`, `alert`, `autocomplete`, `badge`, `basic-alert`, `button`, `calendar`, `checkbox`, `confirmation-dialog`, `date-picker`, `dialog`, `form-checkbox`, `form-date-picker`, `form-field`, `form-field-simple`, `form-searchable-multiselect`, `form-select`, `form-text-input`, `form-textarea`, `icon`, `input`, `label`, `layout-simple`, `menu`, `popover`, `radio-group`, `searchable-multiselect`, `select`, `separator`, `sheet`, `sonner`, `spinner`, `switch`, `tabs`, `tooltip`, `utils`.
139
+ <!-- BEGIN GENERATED SUBPATHS -->
140
+
141
+ `accordion`, `alert`, `alert-dialog`, `aspect-ratio`, `autocomplete`, `avatar`, `badge`, `basic-alert`, `breadcrumb`, `button`, `button-group`, `calendar`, `card`, `carousel`, `checkbox`, `collapsible`, `combobox`, `command`, `confirmation-dialog`, `context-menu`, `date-picker`, `dialog`, `drawer`, `dropdown-menu`, `empty`, `field`, `form-checkbox`, `form-date-picker`, `form-field`, `form-field-simple`, `form-searchable-multiselect`, `form-select`, `form-text-input`, `form-textarea`, `hover-card`, `icon`, `input`, `input-group`, `input-otp`, `item`, `kbd`, `label`, `layout-simple`, `menu`, `menubar`, `native-select`, `navigation-menu`, `pagination`, `popover`, `progress`, `radio-group`, `resizable`, `scroll-area`, `searchable-multiselect`, `select`, `separator`, `sheet`, `sidebar`, `skeleton`, `slider`, `sonner`, `spinner`, `switch`, `table`, `tabs`, `textarea`, `toggle`, `toggle-group`, `tooltip`, `typography`, `utils`.
142
+
143
+ <!-- END GENERATED SUBPATHS -->
76
144
 
77
145
  Anything not in this list is not part of the public surface. The published `exports` map in `package.json` reflects this set exactly — if a subpath is not listed, do not assume it is importable.
78
146
 
79
147
  ## Quick start (Angular standalone)
80
148
 
81
149
  ```ts
82
- import { Component } from "@angular/core";
83
- import { HlmButtonImports } from "@egose/shadcn-theme-ng/button";
84
- import { EgLayoutSimple, MenuItem } from "@egose/shadcn-theme-ng/layout-simple";
150
+ import { Component } from '@angular/core';
151
+ import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
152
+ import { EgLayoutSimple, MenuItem } from '@egose/shadcn-theme-ng/layout-simple';
85
153
 
86
154
  @Component({
87
155
  selector: "app-demo",
88
156
  standalone: true,
89
- imports: [...HlmButtonImports],
157
+ imports: [EgLayoutSimple, ...HlmButtonImports],
90
158
  template: \`
91
- <eg-layout-simple [menuItems]="items">
159
+ <eg-layout-simple [leftMenus]="items">
92
160
  <button hlmBtn variant="primary">Click</button>
93
161
  </eg-layout-simple>
94
162
  \`,
@@ -98,6 +166,55 @@ export class DemoComponent {
98
166
  }
99
167
  ```
100
168
 
169
+ ## Date picker values
170
+
171
+ `hlm-date-picker` emits a native JS `Date` (or `null` when cleared) via the `dateChange` output. Read it in the
172
+ controller with `(dateChange)`, a template ref (`picker.value()`), or a form binding (`ngModel`/`formControlName`,
173
+ the picker is a `ControlValueAccessor`):
174
+
175
+ ```html
176
+ <hlm-date-picker (dateChange)="onDate($event)">
177
+ <hlm-date-picker-input placeholder="Pick a date" />
178
+ </hlm-date-picker>
179
+ ```
180
+
181
+ ```ts
182
+ onDate(date: Date | null) {
183
+ // date is a JS Date, e.g. 2026-09-23T00:00:00 local time (or null on clear)
184
+ }
185
+ ```
186
+
187
+ Unlike the React `FormDatePicker` (which normalizes to local midnight), the Angular picker passes dates through
188
+ untouched by default: calendar clicks usually arrive at local midnight already, but dates typed into the input are
189
+ parsed with `new Date(value)`, where `"YYYY-MM-DD"` means UTC midnight — so the time portion can be non-zero. To
190
+ normalize every value reaching the controller to local midnight, provide a custom config (no library changes needed):
191
+
192
+ ```ts
193
+ import { provideHlmDatePickerConfig } from '@egose/shadcn-theme-ng/date-picker';
194
+
195
+ @Component({
196
+ // ...
197
+ providers: [
198
+ provideHlmDatePickerConfig({
199
+ // Strip the time portion, mirroring React's normalizeDate.
200
+ transformDate: (date: Date) => new Date(date.getFullYear(), date.getMonth(), date.getDate()),
201
+ // Parse typed "YYYY-MM-DD" as a local date instead of new Date(value) (UTC).
202
+ parseDate: (value: string) => {
203
+ const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
204
+ if (!match) return null;
205
+ const date = new Date(+match[1], +match[2] - 1, +match[3]);
206
+ return isNaN(date.getTime()) ? null : date;
207
+ },
208
+ }),
209
+ ],
210
+ })
211
+ export class MyComponent {}
212
+ ```
213
+
214
+ `transformDate` runs on every path into the model (calendar selection, typed input, `writeValue`), so the controller
215
+ then always sees local-midnight dates. Related: the picker stays open after selection by default; add the
216
+ `autoCloseOnSelect` attribute (or set it in the same config) to close it on select.
217
+
101
218
  ## Working example
102
219
 
103
220
  A complete Angular consumer app lives at [`@examples/standard`](https://github.com/egose/shadcn-theme/tree/main/packages/angular/@examples/standard) — see its `src/app/...` for real usage of `@egose/shadcn-theme-ng/button`, `.../layout-simple`, `.../form-text-input`, `.../autocomplete`, `.../select`, `.../form-checkbox`, `.../sheet`, etc.
@@ -0,0 +1,3 @@
1
+ # Accordion Subpath
2
+
3
+ This project ships only as `@egose/shadcn-theme-ng/accordion` or `@egose/shadcn-theme-ng-tw/accordion`. See the [package README](../../README.md) for installation, compatibility, Tailwind variant, test, and release guidance. Do not publish this project directory independently.
@@ -0,0 +1,148 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, input, computed, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import * as i1 from '@spartan-ng/brain/accordion';
4
+ import { BrnAccordion, BrnAccordionContent, BrnAccordionItem, BrnAccordionTrigger } from '@spartan-ng/brain/accordion';
5
+ import { hlm } from '@egose/shadcn-theme-ng/utils';
6
+ import { provideIcons } from '@ng-icons/core';
7
+ import { lucideChevronDown } from '@ng-icons/lucide';
8
+ import { provideHlmIconConfig } from '@egose/shadcn-theme-ng/icon';
9
+
10
+ class HlmAccordion {
11
+ _brn = inject(BrnAccordion);
12
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
13
+ _computedClass = computed(() => hlm("flex", this._brn.orientation() === 'horizontal' ? "flex-row" : "flex-col", this.userClass()), /* @ts-ignore */
14
+ ...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordion, deps: [], target: i0.ɵɵFactoryTarget.Directive });
16
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmAccordion, isStandalone: true, selector: "[hlmAccordion], hlm-accordion", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()" } }, hostDirectives: [{ directive: i1.BrnAccordion, inputs: ["type", "type", "orientation", "orientation"] }], ngImport: i0 });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordion, decorators: [{
19
+ type: Directive,
20
+ args: [{
21
+ selector: '[hlmAccordion], hlm-accordion',
22
+ host: {
23
+ '[class]': '_computedClass()',
24
+ },
25
+ hostDirectives: [{ directive: BrnAccordion, inputs: ['type', 'orientation'] }],
26
+ }]
27
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
28
+
29
+ class HlmAccordionContent extends BrnAccordionContent {
30
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
31
+ _computedClass = computed(() => {
32
+ const gridRows = this.state() === 'open' ? "grid-rows-[1fr]" : "hidden";
33
+ return hlm("grid text-sm transition-all", gridRows, this.userClass());
34
+ }, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
36
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionContent, deps: null, target: i0.ɵɵFactoryTarget.Component });
37
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.3", type: HlmAccordionContent, isStandalone: true, selector: "hlm-accordion-content", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()" } }, usesInheritance: true, ngImport: i0, template: "\n <div [attr.inert]=\"_inert()\" style=\"tw:overflow:hidden\">\n <div class=\"flex flex-col gap-4 text-balance pb-4 pt-0\">\n <ng-content />\n </div>\n </div>\n ", isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionContent, decorators: [{
40
+ type: Component,
41
+ args: [{
42
+ selector: 'hlm-accordion-content',
43
+ template: "\n <div [attr.inert]=\"_inert()\" style=\"tw:overflow:hidden\">\n <div class=\"flex flex-col gap-4 text-balance pb-4 pt-0\">\n <ng-content />\n </div>\n </div>\n ",
44
+ changeDetection: ChangeDetectionStrategy.OnPush,
45
+ encapsulation: ViewEncapsulation.None,
46
+ host: {
47
+ '[class]': '_computedClass()',
48
+ },
49
+ }]
50
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
51
+
52
+ class HlmAccordionIcon {
53
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
54
+ _computedClass = computed(() => hlm("text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200", this.userClass()), /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
56
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });
57
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmAccordionIcon, isStandalone: true, selector: "ng-icon[egAccordionIcon], ng-icon[hlmAccIcon]", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()" } }, providers: [provideIcons({ lucideChevronDown }), provideHlmIconConfig({ size: 'sm' })], ngImport: i0 });
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionIcon, decorators: [{
60
+ type: Directive,
61
+ args: [{
62
+ selector: 'ng-icon[egAccordionIcon], ng-icon[hlmAccIcon]',
63
+ providers: [provideIcons({ lucideChevronDown }), provideHlmIconConfig({ size: 'sm' })],
64
+ host: {
65
+ '[class]': '_computedClass()',
66
+ },
67
+ }]
68
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
69
+
70
+ class HlmAccordionItem {
71
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
72
+ _computedClass = computed(() => hlm("border-border flex flex-1 flex-col border-b", this.userClass()), /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
74
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
75
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmAccordionItem, isStandalone: true, selector: "[hlmAccordionItem],brn-accordion-item[hlm],hlm-accordion-item", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()" } }, hostDirectives: [{ directive: i1.BrnAccordionItem, inputs: ["isOpened", "isOpened"] }], ngImport: i0 });
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionItem, decorators: [{
78
+ type: Directive,
79
+ args: [{
80
+ selector: '[hlmAccordionItem],brn-accordion-item[hlm],hlm-accordion-item',
81
+ host: {
82
+ '[class]': '_computedClass()',
83
+ },
84
+ hostDirectives: [
85
+ {
86
+ directive: BrnAccordionItem,
87
+ inputs: ['isOpened'],
88
+ },
89
+ ],
90
+ }]
91
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
92
+
93
+ class HlmAccordionTrigger {
94
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
95
+ _computedClass = computed(() => hlm("focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium outline-none transition-all hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>[egAccIcon]]:rotate-180", this.userClass()), /* @ts-ignore */
96
+ ...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
97
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
98
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmAccordionTrigger, isStandalone: true, selector: "[hlmAccordionTrigger]", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--tw-ring-offset-shadow": "\"0 0 #000\"", "class": "_computedClass()" } }, hostDirectives: [{ directive: i1.BrnAccordionTrigger }], ngImport: i0 });
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionTrigger, decorators: [{
101
+ type: Directive,
102
+ args: [{
103
+ selector: '[hlmAccordionTrigger]',
104
+ host: {
105
+ '[style.--tw-ring-offset-shadow]': '"0 0 #000"',
106
+ '[class]': '_computedClass()',
107
+ },
108
+ hostDirectives: [BrnAccordionTrigger],
109
+ }]
110
+ }], propDecorators: { userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
111
+
112
+ /*
113
+ * Public API Surface of accordion
114
+ */
115
+ const HlmAccordionImports = [
116
+ HlmAccordion,
117
+ HlmAccordionItem,
118
+ HlmAccordionTrigger,
119
+ HlmAccordionIcon,
120
+ HlmAccordionContent,
121
+ ];
122
+ class HlmAccordionModule {
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
124
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionModule, imports: [HlmAccordion,
125
+ HlmAccordionItem,
126
+ HlmAccordionTrigger,
127
+ HlmAccordionIcon,
128
+ HlmAccordionContent], exports: [HlmAccordion,
129
+ HlmAccordionItem,
130
+ HlmAccordionTrigger,
131
+ HlmAccordionIcon,
132
+ HlmAccordionContent] });
133
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionModule });
134
+ }
135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmAccordionModule, decorators: [{
136
+ type: NgModule,
137
+ args: [{
138
+ imports: [...HlmAccordionImports],
139
+ exports: [...HlmAccordionImports],
140
+ }]
141
+ }] });
142
+
143
+ /**
144
+ * Generated bundle index. Do not edit.
145
+ */
146
+
147
+ export { HlmAccordion, HlmAccordionContent, HlmAccordionIcon, HlmAccordionImports, HlmAccordionItem, HlmAccordionModule, HlmAccordionTrigger };
148
+
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "accordion",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^20.2.0 || ^22.0.0",
6
+ "@angular/core": "^20.2.0 || ^22.0.0",
7
+ "@spartan-ng/brain": "^0.0.1-alpha.512"
8
+ },
9
+ "dependencies": {
10
+ "tslib": "^2.3.0"
11
+ },
12
+ "sideEffects": false,
13
+ "module": "fesm2022/accordion.mjs",
14
+ "typings": "types/accordion.d.ts",
15
+ "exports": {
16
+ "./package.json": {
17
+ "default": "./package.json"
18
+ },
19
+ ".": {
20
+ "types": "./types/accordion.d.ts",
21
+ "default": "./fesm2022/accordion.mjs"
22
+ }
23
+ },
24
+ "type": "module"
25
+ }
@@ -0,0 +1,49 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ClassValue } from 'clsx';
3
+ import * as i1 from '@spartan-ng/brain/accordion';
4
+ import { BrnAccordionContent } from '@spartan-ng/brain/accordion';
5
+
6
+ declare class HlmAccordion {
7
+ private readonly _brn;
8
+ readonly userClass: i0.InputSignal<ClassValue>;
9
+ protected readonly _computedClass: i0.Signal<string>;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<HlmAccordion, never>;
11
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HlmAccordion, "[hlmAccordion], hlm-accordion", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.BrnAccordion; inputs: { "type": "type"; "orientation": "orientation"; }; outputs: {}; }]>;
12
+ }
13
+
14
+ declare class HlmAccordionContent extends BrnAccordionContent {
15
+ readonly userClass: i0.InputSignal<ClassValue>;
16
+ protected readonly _computedClass: i0.Signal<string>;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<HlmAccordionContent, never>;
18
+ static ɵcmp: i0.ɵɵComponentDeclaration<HlmAccordionContent, "hlm-accordion-content", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
19
+ }
20
+
21
+ declare class HlmAccordionIcon {
22
+ readonly userClass: i0.InputSignal<ClassValue>;
23
+ protected readonly _computedClass: i0.Signal<string>;
24
+ static ɵfac: i0.ɵɵFactoryDeclaration<HlmAccordionIcon, never>;
25
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HlmAccordionIcon, "ng-icon[egAccordionIcon], ng-icon[hlmAccIcon]", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
26
+ }
27
+
28
+ declare class HlmAccordionItem {
29
+ readonly userClass: i0.InputSignal<ClassValue>;
30
+ protected readonly _computedClass: i0.Signal<string>;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<HlmAccordionItem, never>;
32
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HlmAccordionItem, "[hlmAccordionItem],brn-accordion-item[hlm],hlm-accordion-item", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.BrnAccordionItem; inputs: { "isOpened": "isOpened"; }; outputs: {}; }]>;
33
+ }
34
+
35
+ declare class HlmAccordionTrigger {
36
+ readonly userClass: i0.InputSignal<ClassValue>;
37
+ protected readonly _computedClass: i0.Signal<string>;
38
+ static ɵfac: i0.ɵɵFactoryDeclaration<HlmAccordionTrigger, never>;
39
+ static ɵdir: i0.ɵɵDirectiveDeclaration<HlmAccordionTrigger, "[hlmAccordionTrigger]", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.BrnAccordionTrigger; inputs: {}; outputs: {}; }]>;
40
+ }
41
+
42
+ declare const HlmAccordionImports: readonly [typeof HlmAccordion, typeof HlmAccordionItem, typeof HlmAccordionTrigger, typeof HlmAccordionIcon, typeof HlmAccordionContent];
43
+ declare class HlmAccordionModule {
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<HlmAccordionModule, never>;
45
+ static ɵmod: i0.ɵɵNgModuleDeclaration<HlmAccordionModule, never, [typeof HlmAccordion, typeof HlmAccordionItem, typeof HlmAccordionTrigger, typeof HlmAccordionIcon, typeof HlmAccordionContent], [typeof HlmAccordion, typeof HlmAccordionItem, typeof HlmAccordionTrigger, typeof HlmAccordionIcon, typeof HlmAccordionContent]>;
46
+ static ɵinj: i0.ɵɵInjectorDeclaration<HlmAccordionModule>;
47
+ }
48
+
49
+ export { HlmAccordion, HlmAccordionContent, HlmAccordionIcon, HlmAccordionImports, HlmAccordionItem, HlmAccordionModule, HlmAccordionTrigger };
package/alert/README.md CHANGED
@@ -1,64 +1,3 @@
1
- # Alert
1
+ # Alert Subpath
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.2.0.
4
-
5
- ## Code scaffolding
6
-
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
-
9
- ```bash
10
- ng generate component component-name
11
- ```
12
-
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
-
15
- ```bash
16
- ng generate --help
17
- ```
18
-
19
- ## Building
20
-
21
- To build the library, run:
22
-
23
- ```bash
24
- ng build alert
25
- ```
26
-
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
-
29
- ### Publishing the Library
30
-
31
- Once the project is built, you can publish your library by following these steps:
32
-
33
- 1. Navigate to the `dist` directory:
34
-
35
- ```bash
36
- cd dist/alert
37
- ```
38
-
39
- 2. Run the `npm publish` command to publish your library to the npm registry:
40
- ```bash
41
- npm publish
42
- ```
43
-
44
- ## Running unit tests
45
-
46
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
47
-
48
- ```bash
49
- ng test
50
- ```
51
-
52
- ## Running end-to-end tests
53
-
54
- For end-to-end (e2e) testing, run:
55
-
56
- ```bash
57
- ng e2e
58
- ```
59
-
60
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
61
-
62
- ## Additional Resources
63
-
64
- For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
3
+ This project ships only as `@egose/shadcn-theme-ng/alert` or `@egose/shadcn-theme-ng-tw/alert`. See the [package README](../../README.md) for installation, compatibility, Tailwind variant, test, and release guidance. Do not publish this project directory independently.