@egose/shadcn-theme-ng-tw 0.0.28 → 0.2.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 (244) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +376 -34
  3. package/accordion/fesm2022/accordion.mjs +20 -20
  4. package/alert/README.md +343 -34
  5. package/alert/fesm2022/alert.mjs +18 -18
  6. package/alert-dialog/README.md +471 -5
  7. package/alert-dialog/fesm2022/alert-dialog.mjs +48 -48
  8. package/alert-dialog/types/alert-dialog.d.ts +1 -1
  9. package/aspect-ratio/README.md +272 -5
  10. package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
  11. package/autocomplete/README.md +473 -34
  12. package/autocomplete/fesm2022/autocomplete.mjs +54 -54
  13. package/autocomplete/types/autocomplete.d.ts +1 -1
  14. package/avatar/README.md +357 -5
  15. package/avatar/fesm2022/avatar.mjs +32 -32
  16. package/badge/README.md +289 -34
  17. package/badge/fesm2022/badge.mjs +4 -4
  18. package/basic-alert/README.md +324 -34
  19. package/basic-alert/fesm2022/basic-alert.mjs +4 -4
  20. package/basic-alert/types/basic-alert.d.ts +1 -1
  21. package/breadcrumb/README.md +406 -5
  22. package/breadcrumb/fesm2022/breadcrumb.mjs +34 -34
  23. package/button/README.md +453 -34
  24. package/button/fesm2022/button.mjs +96 -118
  25. package/button/types/button.d.ts +7 -10
  26. package/button-group/README.md +318 -5
  27. package/button-group/fesm2022/button-group.mjs +20 -20
  28. package/calendar/README.md +328 -34
  29. package/calendar/fesm2022/calendar.mjs +154 -154
  30. package/card/README.md +331 -5
  31. package/card/fesm2022/card.mjs +33 -33
  32. package/carousel/README.md +333 -5
  33. package/carousel/fesm2022/carousel.mjs +47 -44
  34. package/carousel/types/carousel.d.ts +1 -1
  35. package/checkbox/README.md +291 -34
  36. package/checkbox/fesm2022/checkbox.mjs +22 -20
  37. package/checkbox/types/checkbox.d.ts +5 -4
  38. package/collapsible/README.md +332 -5
  39. package/collapsible/fesm2022/collapsible.mjs +15 -15
  40. package/combobox/README.md +507 -5
  41. package/combobox/fesm2022/combobox.mjs +95 -92
  42. package/combobox/types/combobox.d.ts +1 -1
  43. package/command/README.md +435 -5
  44. package/command/fesm2022/command.mjs +56 -56
  45. package/confirmation-dialog/README.md +272 -34
  46. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +13 -12
  47. package/confirmation-dialog/types/confirmation-dialog.d.ts +9 -5
  48. package/context-menu/README.md +366 -5
  49. package/context-menu/fesm2022/context-menu.mjs +9 -9
  50. package/date-picker/README.md +436 -34
  51. package/date-picker/fesm2022/date-picker.mjs +79 -68
  52. package/date-picker/types/date-picker.d.ts +8 -4
  53. package/dialog/README.md +419 -34
  54. package/dialog/fesm2022/dialog.mjs +48 -48
  55. package/drawer/README.md +395 -5
  56. package/drawer/fesm2022/drawer.mjs +45 -45
  57. package/dropdown-menu/README.md +417 -5
  58. package/dropdown-menu/fesm2022/dropdown-menu.mjs +85 -73
  59. package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
  60. package/empty/README.md +329 -5
  61. package/empty/fesm2022/empty.mjs +31 -31
  62. package/field/README.md +385 -5
  63. package/field/fesm2022/field.mjs +59 -59
  64. package/field/types/field.d.ts +1 -1
  65. package/form-checkbox/README.md +283 -34
  66. package/form-checkbox/fesm2022/form-checkbox.mjs +37 -19
  67. package/form-checkbox/types/form-checkbox.d.ts +7 -1
  68. package/form-date-picker/README.md +293 -34
  69. package/form-date-picker/fesm2022/form-date-picker.mjs +59 -24
  70. package/form-date-picker/types/form-date-picker.d.ts +7 -1
  71. package/form-field/README.md +327 -34
  72. package/form-field/fesm2022/form-field.mjs +30 -16
  73. package/form-field/types/form-field.d.ts +28 -20
  74. package/form-field-simple/README.md +311 -34
  75. package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
  76. package/form-searchable-multiselect/README.md +332 -34
  77. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +41 -21
  78. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +8 -2
  79. package/form-select/README.md +321 -34
  80. package/form-select/fesm2022/form-select.mjs +62 -29
  81. package/form-select/types/form-select.d.ts +7 -1
  82. package/form-text-input/README.md +342 -34
  83. package/form-text-input/fesm2022/form-text-input.mjs +43 -55
  84. package/form-text-input/types/form-text-input.d.ts +9 -12
  85. package/form-textarea/README.md +318 -34
  86. package/form-textarea/fesm2022/form-textarea.mjs +42 -23
  87. package/form-textarea/types/form-textarea.d.ts +8 -1
  88. package/hover-card/README.md +256 -5
  89. package/hover-card/fesm2022/hover-card.mjs +19 -19
  90. package/icon/README.md +210 -34
  91. package/icon/fesm2022/icon.mjs +8 -8
  92. package/input/README.md +240 -34
  93. package/input/fesm2022/input.mjs +17 -12
  94. package/input/types/input.d.ts +2 -1
  95. package/input-group/README.md +335 -5
  96. package/input-group/fesm2022/input-group.mjs +37 -37
  97. package/input-group/types/input-group.d.ts +3 -3
  98. package/input-otp/README.md +375 -5
  99. package/input-otp/fesm2022/input-otp.mjs +27 -27
  100. package/item/README.md +385 -5
  101. package/item/fesm2022/item.mjs +54 -54
  102. package/kbd/README.md +291 -5
  103. package/kbd/fesm2022/kbd.mjs +13 -13
  104. package/label/README.md +243 -34
  105. package/label/fesm2022/label.mjs +9 -9
  106. package/label/types/label.d.ts +1 -1
  107. package/layout-simple/README.md +174 -44
  108. package/layout-simple/fesm2022/layout-simple.mjs +917 -398
  109. package/layout-simple/types/layout-simple.d.ts +180 -129
  110. package/menu/README.md +418 -0
  111. package/menu/fesm2022/menu.mjs +461 -0
  112. package/menu/package.json +24 -0
  113. package/menu/types/menu.d.ts +137 -0
  114. package/menubar/README.md +343 -5
  115. package/menubar/fesm2022/menubar.mjs +13 -13
  116. package/native-select/README.md +323 -5
  117. package/native-select/fesm2022/native-select.mjs +19 -19
  118. package/navigation-menu/README.md +369 -5
  119. package/navigation-menu/fesm2022/navigation-menu.mjs +37 -37
  120. package/package.json +183 -154
  121. package/pagination/README.md +388 -5
  122. package/pagination/fesm2022/pagination.mjs +63 -63
  123. package/popover/README.md +302 -34
  124. package/popover/fesm2022/popover.mjs +30 -30
  125. package/progress/README.md +311 -5
  126. package/progress/fesm2022/progress.mjs +13 -13
  127. package/radio-group/README.md +335 -34
  128. package/radio-group/fesm2022/radio-group.mjs +26 -19
  129. package/resizable/README.md +269 -5
  130. package/resizable/fesm2022/resizable.mjs +19 -19
  131. package/scroll-area/README.md +233 -5
  132. package/scroll-area/fesm2022/scroll-area.mjs +9 -9
  133. package/searchable-multiselect/README.md +294 -34
  134. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +63 -16
  135. package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
  136. package/select/README.md +408 -34
  137. package/select/fesm2022/select.mjs +80 -72
  138. package/select/types/select.d.ts +3 -1
  139. package/separator/README.md +193 -34
  140. package/separator/fesm2022/separator.mjs +9 -9
  141. package/separator/types/separator.d.ts +1 -1
  142. package/sheet/README.md +282 -34
  143. package/sheet/fesm2022/sheet.mjs +30 -30
  144. package/sidebar/README.md +457 -5
  145. package/sidebar/fesm2022/sidebar.mjs +136 -134
  146. package/sidebar/types/sidebar.d.ts +3 -3
  147. package/skeleton/README.md +217 -5
  148. package/skeleton/fesm2022/skeleton.mjs +9 -9
  149. package/slider/README.md +273 -5
  150. package/slider/fesm2022/slider.mjs +29 -25
  151. package/sonner/README.md +317 -34
  152. package/sonner/fesm2022/sonner.mjs +9 -9
  153. package/spinner/README.md +255 -34
  154. package/spinner/fesm2022/spinner.mjs +8 -8
  155. package/switch/README.md +281 -34
  156. package/switch/fesm2022/switch.mjs +12 -14
  157. package/table/README.md +423 -5
  158. package/table/fesm2022/table.mjs +41 -41
  159. package/tabs/README.md +382 -34
  160. package/tabs/fesm2022/tabs.mjs +48 -38
  161. package/textarea/README.md +282 -5
  162. package/textarea/fesm2022/textarea.mjs +9 -9
  163. package/toggle/README.md +270 -5
  164. package/toggle/fesm2022/toggle.mjs +14 -14
  165. package/toggle-group/README.md +340 -5
  166. package/toggle-group/fesm2022/toggle-group.mjs +13 -13
  167. package/toggle-group/types/toggle-group.d.ts +13 -7
  168. package/tooltip/README.md +240 -34
  169. package/tooltip/fesm2022/tooltip.mjs +14 -14
  170. package/typography/README.md +271 -5
  171. package/typography/fesm2022/typography.mjs +53 -53
  172. package/typography/types/typography.d.ts +12 -12
  173. package/utils/README.md +274 -34
  174. package/utils/fesm2022/utils.mjs +68 -44
  175. package/accordion/fesm2022/accordion.mjs.map +0 -1
  176. package/alert/fesm2022/alert.mjs.map +0 -1
  177. package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
  178. package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
  179. package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
  180. package/avatar/fesm2022/avatar.mjs.map +0 -1
  181. package/badge/fesm2022/badge.mjs.map +0 -1
  182. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  183. package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
  184. package/button/fesm2022/button.mjs.map +0 -1
  185. package/button-group/fesm2022/button-group.mjs.map +0 -1
  186. package/calendar/fesm2022/calendar.mjs.map +0 -1
  187. package/card/fesm2022/card.mjs.map +0 -1
  188. package/carousel/fesm2022/carousel.mjs.map +0 -1
  189. package/checkbox/fesm2022/checkbox.mjs.map +0 -1
  190. package/collapsible/fesm2022/collapsible.mjs.map +0 -1
  191. package/combobox/fesm2022/combobox.mjs.map +0 -1
  192. package/command/fesm2022/command.mjs.map +0 -1
  193. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
  194. package/context-menu/fesm2022/context-menu.mjs.map +0 -1
  195. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  196. package/dialog/fesm2022/dialog.mjs.map +0 -1
  197. package/drawer/fesm2022/drawer.mjs.map +0 -1
  198. package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
  199. package/empty/fesm2022/empty.mjs.map +0 -1
  200. package/field/fesm2022/field.mjs.map +0 -1
  201. package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
  202. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  203. package/form-field/fesm2022/form-field.mjs.map +0 -1
  204. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  205. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
  206. package/form-select/fesm2022/form-select.mjs.map +0 -1
  207. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  208. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  209. package/hover-card/fesm2022/hover-card.mjs.map +0 -1
  210. package/icon/fesm2022/icon.mjs.map +0 -1
  211. package/input/fesm2022/input.mjs.map +0 -1
  212. package/input-group/fesm2022/input-group.mjs.map +0 -1
  213. package/input-otp/fesm2022/input-otp.mjs.map +0 -1
  214. package/item/fesm2022/item.mjs.map +0 -1
  215. package/kbd/fesm2022/kbd.mjs.map +0 -1
  216. package/label/fesm2022/label.mjs.map +0 -1
  217. package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
  218. package/menubar/fesm2022/menubar.mjs.map +0 -1
  219. package/native-select/fesm2022/native-select.mjs.map +0 -1
  220. package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
  221. package/pagination/fesm2022/pagination.mjs.map +0 -1
  222. package/popover/fesm2022/popover.mjs.map +0 -1
  223. package/progress/fesm2022/progress.mjs.map +0 -1
  224. package/radio-group/fesm2022/radio-group.mjs.map +0 -1
  225. package/resizable/fesm2022/resizable.mjs.map +0 -1
  226. package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
  227. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
  228. package/select/fesm2022/select.mjs.map +0 -1
  229. package/separator/fesm2022/separator.mjs.map +0 -1
  230. package/sheet/fesm2022/sheet.mjs.map +0 -1
  231. package/sidebar/fesm2022/sidebar.mjs.map +0 -1
  232. package/skeleton/fesm2022/skeleton.mjs.map +0 -1
  233. package/slider/fesm2022/slider.mjs.map +0 -1
  234. package/sonner/fesm2022/sonner.mjs.map +0 -1
  235. package/spinner/fesm2022/spinner.mjs.map +0 -1
  236. package/switch/fesm2022/switch.mjs.map +0 -1
  237. package/table/fesm2022/table.mjs.map +0 -1
  238. package/tabs/fesm2022/tabs.mjs.map +0 -1
  239. package/textarea/fesm2022/textarea.mjs.map +0 -1
  240. package/toggle/fesm2022/toggle.mjs.map +0 -1
  241. package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
  242. package/tooltip/fesm2022/tooltip.mjs.map +0 -1
  243. package/typography/fesm2022/typography.mjs.map +0 -1
  244. package/utils/fesm2022/utils.mjs.map +0 -1
package/spinner/README.md CHANGED
@@ -1,64 +1,285 @@
1
- # Spinner
1
+ # Spinner (`@egose/shadcn-theme-ng/spinner`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.2.0.
3
+ A loading spinner, equivalent to [shadcn/ui Spinner](https://ui.shadcn.com/docs/components/spinner). This subpath ships a single standalone component, `HlmSpinner`, that renders an animated [`@ng-icons`](https://www.ng-icons.dev/) `tablerLoader2` icon (spinning via `animate-spin`) inside a flex container with `role="status"`. There is no spartan-ng primitive underneath — it is a pure styled icon wrapper with `size`/`show` inputs.
4
4
 
5
- ## Code scaffolding
5
+ > **Ships as:** `@egose/shadcn-theme-ng/spinner` and `@egose/shadcn-theme-ng-tw/spinner` (the `tw:`-prefixed Tailwind variant). See the [package README](../../README.md) for install steps, peer dependencies, Tailwind setup, and testing/release guidance. Do not publish this project directory independently.
6
6
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- ng generate component component-name
10
+ # Plain Tailwind (no prefix)
11
+ npm install @egose/shadcn-theme-ng
12
+
13
+ # Or the tw:-prefixed variant
14
+ npm install @egose/shadcn-theme-ng-tw
11
15
  ```
12
16
 
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
17
+ No extra runtime install is needed — `@ng-icons/core` / `@ng-icons/tabler-icons` and `clsx`/`tailwind-merge` (via `utils`) arrive transitively. See the [package README](../../README.md) for the full peer-dependency table.
14
18
 
15
- ```bash
16
- ng generate --help
19
+ ## Imports
20
+
21
+ All public symbols are re-exported from `projects/spinner/src/public-api.ts`:
22
+
23
+ ```ts
24
+ import { HlmSpinner, HlmSpinnerImports, HlmSpinnerModule } from '@egose/shadcn-theme-ng/spinner';
25
+ // tw variant:
26
+ // import { HlmSpinner, HlmSpinnerImports, HlmSpinnerModule } from '@egose/shadcn-theme-ng-tw/spinner';
17
27
  ```
18
28
 
19
- ## Building
29
+ Standalone-component usage (preferred):
20
30
 
21
- To build the library, run:
31
+ ```ts
32
+ import { Component } from '@angular/core';
33
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
22
34
 
23
- ```bash
24
- ng build spinner
35
+ @Component({
36
+ selector: 'app-demo',
37
+ standalone: true,
38
+ imports: [...HlmSpinnerImports],
39
+ template: `<hlm-spinner />`,
40
+ })
41
+ export class DemoComponent {}
42
+ ```
43
+
44
+ NgModule usage:
45
+
46
+ ```ts
47
+ import { NgModule } from '@angular/core';
48
+ import { HlmSpinnerModule } from '@egose/shadcn-theme-ng/spinner';
49
+
50
+ @NgModule({ imports: [HlmSpinnerModule] })
51
+ export class FeatureModule {}
25
52
  ```
26
53
 
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
54
+ | Symbol | Kind | Description |
55
+ | ------------------- | -------------------- | ---------------------------------------------- |
56
+ | `HlmSpinner` | Standalone component | The `<hlm-spinner>` loading indicator. |
57
+ | `HlmSpinnerImports` | `const` array | `[HlmSpinner]` — spread into `imports: [...]`. |
58
+ | `HlmSpinnerModule` | NgModule | Imports + re-exports `HlmSpinner`. |
28
59
 
29
- ### Publishing the Library
60
+ ## Anatomy / Structure
30
61
 
31
- Once the project is built, you can publish your library by following these steps:
62
+ ```html
63
+ <!-- host element: <hlm-spinner role="status" class="flex … | hidden"> -->
64
+ <hlm-spinner />
65
+ <hlm-spinner size="2rem" />
66
+ <hlm-spinner [show]="loading()" class="my-4" spinnerClass="text-primary" />
67
+ ```
32
68
 
33
- 1. Navigate to the `dist` directory:
69
+ The host carries `role="status"` and toggles `flex`/`hidden` from `show()`. The inner `<ng-icon>` always renders the fixed `tablerLoader2` glyph at `size()` with `animate-spin`.
34
70
 
35
- ```bash
36
- cd dist/spinner
37
- ```
71
+ ## API reference
38
72
 
39
- 2. Run the `npm publish` command to publish your library to the npm registry:
40
- ```bash
41
- npm publish
42
- ```
73
+ ### `HlmSpinner` — selector `hlm-spinner` (component)
43
74
 
44
- ## Running unit tests
75
+ | Input | Type | Default | Description |
76
+ | -------------- | ------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- |
77
+ | `size` | `string` | `'1.5rem'` | Passed as `[size]` to the inner `<ng-icon>`; any CSS length (`'1rem'`, `'24px'`, …). |
78
+ | `show` | `boolean` | `true` | Toggles the host between `flex` (visible) and `hidden`. |
79
+ | `class` | `ClassValue` (aliased input `wrapperClass`) | `''` | Extra classes merged onto the **host container** via `hlm('flex-col items-center justify-center', show ? 'flex' : 'hidden', …)`. |
80
+ | `spinnerClass` | `ClassValue` | `''` | Extra classes merged onto the **inner icon** (`animate-spin`, primary color, inherit sizing). |
45
81
 
46
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
82
+ Public field:
47
83
 
48
- ```bash
49
- ng test
84
+ | Member | Type | Description |
85
+ | ------ | --------------------- | --------------------------------------------------------------------------------------------------------- |
86
+ | `icon` | `tablerLoader2` glyph | Fixed icon data bound to the inner `<ng-icon [svg]>`. Not an input — the glyph cannot be swapped via API. |
87
+
88
+ No outputs, no methods. Host attributes: `role="status"`.
89
+
90
+ ## Examples
91
+
92
+ ### 1. Basic usage
93
+
94
+ ```ts
95
+ // demo-basic.component.ts
96
+ import { Component } from '@angular/core';
97
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
98
+
99
+ @Component({
100
+ selector: 'demo-basic',
101
+ standalone: true,
102
+ imports: [...HlmSpinnerImports],
103
+ template: `<hlm-spinner />`,
104
+ })
105
+ export class DemoBasic {}
50
106
  ```
51
107
 
52
- ## Running end-to-end tests
108
+ ```html
109
+ <hlm-spinner />
110
+ ```
53
111
 
54
- For end-to-end (e2e) testing, run:
112
+ ### 2. Sizes
55
113
 
56
- ```bash
57
- ng e2e
114
+ `size` accepts any CSS length string passed straight to `<ng-icon [size]>`.
115
+
116
+ ```ts
117
+ // demo-sizes.component.ts
118
+ import { Component } from '@angular/core';
119
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
120
+
121
+ @Component({
122
+ selector: 'demo-sizes',
123
+ standalone: true,
124
+ imports: [...HlmSpinnerImports],
125
+ template: `
126
+ <div class="flex items-end gap-6">
127
+ <hlm-spinner size="1rem" />
128
+ <hlm-spinner size="1.5rem" />
129
+ <hlm-spinner size="2.5rem" />
130
+ <hlm-spinner size="48px" />
131
+ </div>
132
+ `,
133
+ })
134
+ export class DemoSizes {}
58
135
  ```
59
136
 
60
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
137
+ ### 3. Async loading state with `show`
138
+
139
+ ```ts
140
+ // demo-async.component.ts
141
+ import { Component, inject, signal } from '@angular/core';
142
+ import { HttpClient } from '@angular/common/http';
143
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
144
+ import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
145
+
146
+ @Component({
147
+ selector: 'demo-async',
148
+ standalone: true,
149
+ imports: [...HlmSpinnerImports, ...HlmButtonImports],
150
+ template: `
151
+ <button hlmBtn (click)="reload()" [disabled]="loading()">Reload</button>
152
+ <hlm-spinner [show]="loading()" class="my-4" />
153
+ @if (!loading()) {
154
+ <p hlmP>Data: {{ data() ?? '—' }}</p>
155
+ }
156
+ `,
157
+ })
158
+ export class DemoAsync {
159
+ private readonly http = inject(HttpClient);
160
+ readonly loading = signal(false);
161
+ readonly data = signal<string | null>(null);
162
+
163
+ reload() {
164
+ this.loading.set(true);
165
+ this.http.get('/api/status', { responseType: 'text' }).subscribe({
166
+ next: (v) => {
167
+ this.data.set(v);
168
+ this.loading.set(false);
169
+ },
170
+ error: () => {
171
+ this.data.set('error');
172
+ this.loading.set(false);
173
+ },
174
+ });
175
+ }
176
+ }
177
+ ```
178
+
179
+ > `show` hides with `display: none` (`hidden`) — the icon stays in the DOM. For conditional mounting instead, use `@if (loading()) { <hlm-spinner /> }`.
180
+
181
+ ### 4. Inside a button (inline submitting state)
182
+
183
+ The spinner inherits font sizing from `spinnerClass`; pair it with a disabled button.
184
+
185
+ ```ts
186
+ // demo-button.component.ts
187
+ import { Component, signal } from '@angular/core';
188
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
189
+ import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
190
+
191
+ @Component({
192
+ selector: 'demo-button',
193
+ standalone: true,
194
+ imports: [...HlmSpinnerImports, ...HlmButtonImports],
195
+ template: `
196
+ <button hlmBtn [disabled]="saving()">
197
+ @if (saving()) {
198
+ <hlm-spinner size="1rem" spinnerClass="[&>svg]:text-primary-foreground" />
199
+ }
200
+ {{ saving() ? 'Saving…' : 'Save changes' }}
201
+ </button>
202
+ `,
203
+ })
204
+ export class DemoButton {
205
+ readonly saving = signal(false);
206
+
207
+ save() {
208
+ this.saving.set(true);
209
+ setTimeout(() => this.saving.set(false), 1500);
210
+ }
211
+ }
212
+ ```
213
+
214
+ ### 5. Custom colors and layout via `class` / `spinnerClass`
215
+
216
+ ```ts
217
+ // demo-styled.component.ts
218
+ import { Component } from '@angular/core';
219
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
220
+
221
+ @Component({
222
+ selector: 'demo-styled',
223
+ standalone: true,
224
+ imports: [...HlmSpinnerImports],
225
+ template: `
226
+ <!-- centered page loader -->
227
+ <hlm-spinner size="3rem" class="min-h-40 w-full" spinnerClass="[&>svg]:text-muted-foreground" />
228
+
229
+ <!-- destructive-tinted spinner -->
230
+ <hlm-spinner size="1.25rem" spinnerClass="[&>svg]:text-destructive" />
231
+ `,
232
+ })
233
+ export class DemoStyled {}
234
+ ```
235
+
236
+ `class` targets the outer flex container; `spinnerClass` targets the inner `<ng-icon>`/`<svg>`. Both merge through `hlm()` so Tailwind conflicts resolve.
237
+
238
+ ### 6. Overlay + empty-state composition
239
+
240
+ ```ts
241
+ // demo-overlay.component.ts
242
+ import { Component, signal } from '@angular/core';
243
+ import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
244
+ import { HlmCardImports } from '@egose/shadcn-theme-ng/card';
245
+
246
+ @Component({
247
+ selector: 'demo-overlay',
248
+ standalone: true,
249
+ imports: [...HlmSpinnerImports, ...HlmCardImports],
250
+ template: `
251
+ <section hlmCard class="relative min-h-48 p-6">
252
+ <h3 hlmH3>Dashboard</h3>
253
+ @if (loading()) {
254
+ <div class="absolute inset-0 flex items-center justify-center rounded-md bg-background/70 backdrop-blur-[1px]">
255
+ <hlm-spinner size="2rem" />
256
+ <span class="sr-only">Loading dashboard…</span>
257
+ </div>
258
+ } @else {
259
+ <p hlmP>Dashboard content goes here.</p>
260
+ }
261
+ </section>
262
+ `,
263
+ })
264
+ export class DemoOverlay {
265
+ readonly loading = signal(true);
266
+ }
267
+ ```
268
+
269
+ ## Accessibility notes
270
+
271
+ - The host has `role="status"` so assistive tech announces the loading state; add adjacent text (visible or `.sr-only`, e.g. “Loading…”) describing _what_ is loading — the icon alone conveys nothing to screen readers.
272
+ - Keep `show`-hidden spinners out of the tab order (they contain no focusable elements by default — do not add any).
273
+ - For actions that take >1s, disable the triggering control while `show` is true to prevent duplicate submissions.
274
+ - Avoid stacking multiple spinners in one view; a single `role="status"` region per async region is enough.
275
+
276
+ ## Theming / CSS variables
277
+
278
+ The icon inherits `text-primary` by default (`[&>svg]:text-primary`); override with `spinnerClass` (e.g. `spinnerClass="[&>svg]:text-muted-foreground"`). Sizing is fully controlled by `size`. No additional CSS variables.
61
279
 
62
- ## Additional Resources
280
+ ## Related subpaths
63
281
 
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.
282
+ - `@egose/shadcn-theme-ng/button` — inline submitting states.
283
+ - `@egose/shadcn-theme-ng/skeleton` — content placeholders to pair with spinners.
284
+ - `@egose/shadcn-theme-ng/sonner` — notify on async completion (`toast.promise()`).
285
+ - `@egose/shadcn-theme-ng/card` — surfaces to overlay a spinner on.
@@ -22,10 +22,10 @@ class HlmSpinner {
22
22
  _iconClass = computed(() => hlm('tw:[&>svg]:animate-spin tw:[&>svg]:text-primary tw:[&>svg]:w-[inherit]! tw:[&>svg]:h-[inherit]!', // base svg styles
23
23
  this.spinnerClass()), /* @ts-ignore */
24
24
  ...(ngDevMode ? [{ debugName: "_iconClass" }] : /* istanbul ignore next */ []));
25
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSpinner, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.7", type: HlmSpinner, isStandalone: true, selector: "hlm-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, show: { classPropertyName: "show", publicName: "show", isSignal: true, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, spinnerClass: { classPropertyName: "spinnerClass", publicName: "spinnerClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "class": "_containerClass()" } }, ngImport: i0, template: `<ng-icon [svg]="icon" [size]="size()" [class]="_iconClass()" />`, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
25
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinner, deps: [], target: i0.ɵɵFactoryTarget.Component });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.3", type: HlmSpinner, isStandalone: true, selector: "hlm-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, show: { classPropertyName: "show", publicName: "show", isSignal: true, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, spinnerClass: { classPropertyName: "spinnerClass", publicName: "spinnerClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "class": "_containerClass()" } }, ngImport: i0, template: `<ng-icon [svg]="icon" [size]="size()" [class]="_iconClass()" />`, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSpinner, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinner, decorators: [{
29
29
  type: Component,
30
30
  args: [{
31
31
  selector: 'hlm-spinner',
@@ -45,11 +45,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
45
45
  */
46
46
  const HlmSpinnerImports = [HlmSpinner];
47
47
  class HlmSpinnerModule {
48
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSpinnerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
49
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmSpinnerModule, imports: [HlmSpinner], exports: [HlmSpinner] });
50
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSpinnerModule, imports: [HlmSpinnerImports] });
48
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
49
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, imports: [HlmSpinner], exports: [HlmSpinner] });
50
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, imports: [HlmSpinnerImports] });
51
51
  }
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSpinnerModule, decorators: [{
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, decorators: [{
53
53
  type: NgModule,
54
54
  args: [{
55
55
  imports: [...HlmSpinnerImports],
@@ -62,4 +62,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
62
62
  */
63
63
 
64
64
  export { HlmSpinner, HlmSpinnerImports, HlmSpinnerModule };
65
- //# sourceMappingURL=spinner.mjs.map
65
+