@egose/shadcn-theme-ng 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 (237) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +376 -34
  3. package/accordion/fesm2022/accordion.mjs +27 -39
  4. package/alert/README.md +343 -34
  5. package/alert/fesm2022/alert.mjs +47 -47
  6. package/alert-dialog/README.md +471 -5
  7. package/alert-dialog/fesm2022/alert-dialog.mjs +47 -47
  8. package/aspect-ratio/README.md +272 -5
  9. package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
  10. package/autocomplete/README.md +473 -34
  11. package/autocomplete/fesm2022/autocomplete.mjs +53 -71
  12. package/avatar/README.md +357 -5
  13. package/avatar/fesm2022/avatar.mjs +32 -32
  14. package/badge/README.md +289 -34
  15. package/badge/fesm2022/badge.mjs +57 -57
  16. package/basic-alert/README.md +324 -34
  17. package/basic-alert/fesm2022/basic-alert.mjs +6 -18
  18. package/breadcrumb/README.md +406 -5
  19. package/breadcrumb/fesm2022/breadcrumb.mjs +33 -39
  20. package/button/README.md +453 -34
  21. package/button/fesm2022/button.mjs +147 -219
  22. package/button/types/button.d.ts +7 -10
  23. package/button-group/README.md +318 -5
  24. package/button-group/fesm2022/button-group.mjs +20 -20
  25. package/calendar/README.md +328 -34
  26. package/calendar/fesm2022/calendar.mjs +29 -743
  27. package/card/README.md +331 -5
  28. package/card/fesm2022/card.mjs +33 -33
  29. package/carousel/README.md +333 -5
  30. package/carousel/fesm2022/carousel.mjs +39 -78
  31. package/checkbox/README.md +291 -34
  32. package/checkbox/fesm2022/checkbox.mjs +20 -58
  33. package/checkbox/types/checkbox.d.ts +5 -4
  34. package/collapsible/README.md +332 -5
  35. package/collapsible/fesm2022/collapsible.mjs +15 -15
  36. package/combobox/README.md +507 -5
  37. package/combobox/fesm2022/combobox.mjs +91 -224
  38. package/command/README.md +435 -5
  39. package/command/fesm2022/command.mjs +49 -109
  40. package/confirmation-dialog/README.md +272 -34
  41. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +15 -40
  42. package/confirmation-dialog/types/confirmation-dialog.d.ts +8 -4
  43. package/context-menu/README.md +366 -5
  44. package/context-menu/fesm2022/context-menu.mjs +9 -9
  45. package/date-picker/README.md +436 -34
  46. package/date-picker/fesm2022/date-picker.mjs +64 -267
  47. package/date-picker/types/date-picker.d.ts +7 -3
  48. package/dialog/README.md +419 -34
  49. package/dialog/fesm2022/dialog.mjs +45 -71
  50. package/drawer/README.md +395 -5
  51. package/drawer/fesm2022/drawer.mjs +44 -54
  52. package/dropdown-menu/README.md +417 -5
  53. package/dropdown-menu/fesm2022/dropdown-menu.mjs +82 -70
  54. package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
  55. package/empty/README.md +329 -5
  56. package/empty/fesm2022/empty.mjs +30 -30
  57. package/field/README.md +385 -5
  58. package/field/fesm2022/field.mjs +56 -72
  59. package/form-checkbox/README.md +283 -34
  60. package/form-checkbox/fesm2022/form-checkbox.mjs +25 -85
  61. package/form-checkbox/types/form-checkbox.d.ts +7 -1
  62. package/form-date-picker/README.md +293 -34
  63. package/form-date-picker/fesm2022/form-date-picker.mjs +31 -84
  64. package/form-date-picker/types/form-date-picker.d.ts +7 -1
  65. package/form-field/README.md +327 -34
  66. package/form-field/fesm2022/form-field.mjs +33 -19
  67. package/form-field/types/form-field.d.ts +28 -20
  68. package/form-field-simple/README.md +311 -34
  69. package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
  70. package/form-searchable-multiselect/README.md +332 -34
  71. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +31 -91
  72. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +7 -1
  73. package/form-select/README.md +321 -34
  74. package/form-select/fesm2022/form-select.mjs +32 -149
  75. package/form-select/types/form-select.d.ts +7 -1
  76. package/form-text-input/README.md +342 -34
  77. package/form-text-input/fesm2022/form-text-input.mjs +35 -149
  78. package/form-text-input/types/form-text-input.d.ts +9 -12
  79. package/form-textarea/README.md +318 -34
  80. package/form-textarea/fesm2022/form-textarea.mjs +34 -109
  81. package/form-textarea/types/form-textarea.d.ts +8 -1
  82. package/hover-card/README.md +256 -5
  83. package/hover-card/fesm2022/hover-card.mjs +19 -19
  84. package/icon/README.md +210 -34
  85. package/icon/fesm2022/icon.mjs +8 -8
  86. package/input/README.md +240 -34
  87. package/input/fesm2022/input.mjs +17 -12
  88. package/input/types/input.d.ts +2 -1
  89. package/input-group/README.md +335 -5
  90. package/input-group/fesm2022/input-group.mjs +34 -34
  91. package/input-otp/README.md +375 -5
  92. package/input-otp/fesm2022/input-otp.mjs +26 -26
  93. package/item/README.md +385 -5
  94. package/item/fesm2022/item.mjs +53 -53
  95. package/kbd/README.md +291 -5
  96. package/kbd/fesm2022/kbd.mjs +12 -12
  97. package/label/README.md +243 -34
  98. package/label/fesm2022/label.mjs +10 -10
  99. package/label/types/label.d.ts +1 -1
  100. package/layout-simple/README.md +174 -44
  101. package/layout-simple/fesm2022/layout-simple.mjs +508 -603
  102. package/layout-simple/types/layout-simple.d.ts +179 -128
  103. package/menu/README.md +418 -0
  104. package/menu/fesm2022/menu.mjs +455 -0
  105. package/menu/package.json +24 -0
  106. package/menu/types/menu.d.ts +137 -0
  107. package/menubar/README.md +343 -5
  108. package/menubar/fesm2022/menubar.mjs +13 -13
  109. package/native-select/README.md +323 -5
  110. package/native-select/fesm2022/native-select.mjs +19 -19
  111. package/navigation-menu/README.md +369 -5
  112. package/navigation-menu/fesm2022/navigation-menu.mjs +35 -47
  113. package/package.json +183 -154
  114. package/pagination/README.md +388 -5
  115. package/pagination/fesm2022/pagination.mjs +45 -331
  116. package/popover/README.md +302 -34
  117. package/popover/fesm2022/popover.mjs +30 -30
  118. package/progress/README.md +311 -5
  119. package/progress/fesm2022/progress.mjs +13 -13
  120. package/radio-group/README.md +335 -34
  121. package/radio-group/fesm2022/radio-group.mjs +26 -19
  122. package/radio-group/types/radio-group.d.ts +1 -1
  123. package/resizable/README.md +269 -5
  124. package/resizable/fesm2022/resizable.mjs +18 -26
  125. package/scroll-area/README.md +233 -5
  126. package/scroll-area/fesm2022/scroll-area.mjs +9 -9
  127. package/searchable-multiselect/README.md +294 -34
  128. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +28 -117
  129. package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
  130. package/select/README.md +408 -34
  131. package/select/fesm2022/select.mjs +71 -111
  132. package/select/types/select.d.ts +3 -1
  133. package/separator/README.md +193 -34
  134. package/separator/fesm2022/separator.mjs +9 -9
  135. package/separator/types/separator.d.ts +1 -1
  136. package/sheet/README.md +282 -34
  137. package/sheet/fesm2022/sheet.mjs +41 -53
  138. package/sidebar/README.md +457 -5
  139. package/sidebar/fesm2022/sidebar.mjs +125 -227
  140. package/skeleton/README.md +217 -5
  141. package/skeleton/fesm2022/skeleton.mjs +9 -9
  142. package/slider/README.md +273 -5
  143. package/slider/fesm2022/slider.mjs +10 -80
  144. package/sonner/README.md +317 -34
  145. package/sonner/fesm2022/sonner.mjs +13 -13
  146. package/spinner/README.md +255 -34
  147. package/spinner/fesm2022/spinner.mjs +11 -11
  148. package/switch/README.md +281 -34
  149. package/switch/fesm2022/switch.mjs +13 -15
  150. package/table/README.md +423 -5
  151. package/table/fesm2022/table.mjs +41 -41
  152. package/tabs/README.md +382 -34
  153. package/tabs/fesm2022/tabs.mjs +35 -111
  154. package/textarea/README.md +282 -5
  155. package/textarea/fesm2022/textarea.mjs +9 -9
  156. package/toggle/README.md +270 -5
  157. package/toggle/fesm2022/toggle.mjs +13 -13
  158. package/toggle-group/README.md +340 -5
  159. package/toggle-group/fesm2022/toggle-group.mjs +13 -13
  160. package/toggle-group/types/toggle-group.d.ts +13 -7
  161. package/tooltip/README.md +240 -34
  162. package/tooltip/fesm2022/tooltip.mjs +14 -14
  163. package/typography/README.md +271 -5
  164. package/typography/fesm2022/typography.mjs +53 -53
  165. package/typography/types/typography.d.ts +19 -19
  166. package/utils/README.md +274 -34
  167. package/utils/fesm2022/utils.mjs +68 -44
  168. package/accordion/fesm2022/accordion.mjs.map +0 -1
  169. package/alert/fesm2022/alert.mjs.map +0 -1
  170. package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
  171. package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
  172. package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
  173. package/avatar/fesm2022/avatar.mjs.map +0 -1
  174. package/badge/fesm2022/badge.mjs.map +0 -1
  175. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  176. package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
  177. package/button/fesm2022/button.mjs.map +0 -1
  178. package/button-group/fesm2022/button-group.mjs.map +0 -1
  179. package/calendar/fesm2022/calendar.mjs.map +0 -1
  180. package/card/fesm2022/card.mjs.map +0 -1
  181. package/carousel/fesm2022/carousel.mjs.map +0 -1
  182. package/checkbox/fesm2022/checkbox.mjs.map +0 -1
  183. package/collapsible/fesm2022/collapsible.mjs.map +0 -1
  184. package/combobox/fesm2022/combobox.mjs.map +0 -1
  185. package/command/fesm2022/command.mjs.map +0 -1
  186. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
  187. package/context-menu/fesm2022/context-menu.mjs.map +0 -1
  188. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  189. package/dialog/fesm2022/dialog.mjs.map +0 -1
  190. package/drawer/fesm2022/drawer.mjs.map +0 -1
  191. package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
  192. package/empty/fesm2022/empty.mjs.map +0 -1
  193. package/field/fesm2022/field.mjs.map +0 -1
  194. package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
  195. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  196. package/form-field/fesm2022/form-field.mjs.map +0 -1
  197. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  198. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
  199. package/form-select/fesm2022/form-select.mjs.map +0 -1
  200. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  201. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  202. package/hover-card/fesm2022/hover-card.mjs.map +0 -1
  203. package/icon/fesm2022/icon.mjs.map +0 -1
  204. package/input/fesm2022/input.mjs.map +0 -1
  205. package/input-group/fesm2022/input-group.mjs.map +0 -1
  206. package/input-otp/fesm2022/input-otp.mjs.map +0 -1
  207. package/item/fesm2022/item.mjs.map +0 -1
  208. package/kbd/fesm2022/kbd.mjs.map +0 -1
  209. package/label/fesm2022/label.mjs.map +0 -1
  210. package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
  211. package/menubar/fesm2022/menubar.mjs.map +0 -1
  212. package/native-select/fesm2022/native-select.mjs.map +0 -1
  213. package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
  214. package/pagination/fesm2022/pagination.mjs.map +0 -1
  215. package/popover/fesm2022/popover.mjs.map +0 -1
  216. package/progress/fesm2022/progress.mjs.map +0 -1
  217. package/radio-group/fesm2022/radio-group.mjs.map +0 -1
  218. package/resizable/fesm2022/resizable.mjs.map +0 -1
  219. package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
  220. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
  221. package/select/fesm2022/select.mjs.map +0 -1
  222. package/separator/fesm2022/separator.mjs.map +0 -1
  223. package/sheet/fesm2022/sheet.mjs.map +0 -1
  224. package/sidebar/fesm2022/sidebar.mjs.map +0 -1
  225. package/skeleton/fesm2022/skeleton.mjs.map +0 -1
  226. package/slider/fesm2022/slider.mjs.map +0 -1
  227. package/sonner/fesm2022/sonner.mjs.map +0 -1
  228. package/spinner/fesm2022/spinner.mjs.map +0 -1
  229. package/switch/fesm2022/switch.mjs.map +0 -1
  230. package/table/fesm2022/table.mjs.map +0 -1
  231. package/tabs/fesm2022/tabs.mjs.map +0 -1
  232. package/textarea/fesm2022/textarea.mjs.map +0 -1
  233. package/toggle/fesm2022/toggle.mjs.map +0 -1
  234. package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
  235. package/tooltip/fesm2022/tooltip.mjs.map +0 -1
  236. package/typography/fesm2022/typography.mjs.map +0 -1
  237. package/utils/fesm2022/utils.mjs.map +0 -1
@@ -1,11 +1,317 @@
1
- # Progress
1
+ # Progress (`@egose/shadcn-theme-ng/progress`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli).
3
+ Determinate/indeterminate progress bar (shadcn/ui `progress` equivalent). Thin shadcn styling directives over the spartan-ng `BrnProgress` brain family: `hlm-progress` owns the track + value semantics (`value`, `max`, `getValueLabel`), and the inner `hlmProgressIndicator` bar positions itself from the brain value with RTL awareness and an indeterminate animation state.
4
4
 
5
- ## Building
5
+ Ships as `@egose/shadcn-theme-ng/progress` and `@egose/shadcn-theme-ng-tw/progress` (tw: variant). See the [package README](../../README.md) for installation, peer dependencies, Tailwind setup, and testing. Do not publish this project directory independently.
6
6
 
7
- To build the library, run:
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- ng build progress
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
15
+ ```
16
+
17
+ Peer dependencies are inherited from the package root (see [package README](../../README.md)). This subpath itself declares `@angular/common`, `@angular/core`, `@spartan-ng/brain` as peers plus a `tslib` runtime dependency; at runtime the indicator also reads Angular CDK `Directionality` for RTL. No extra install step is needed beyond the package install above.
18
+
19
+ ## Imports
20
+
21
+ Real exported symbols (from `src/public-api.ts`):
22
+
23
+ ```ts
24
+ import {
25
+ HlmProgress, // directive: hlm-progress,[hlmProgress]
26
+ HlmProgressIndicator, // directive: [hlmProgressIndicator],hlm-progress-indicator
27
+ HlmProgressImports, // readonly [HlmProgress, HlmProgressIndicator]
28
+ HlmProgressModule, // NgModule wrapping HlmProgressImports
29
+ } from '@egose/shadcn-theme-ng/progress';
30
+ ```
31
+
32
+ Standalone usage:
33
+
34
+ ```ts
35
+ import { Component } from '@angular/core';
36
+ import { HlmProgressImports } from '@egose/shadcn-theme-ng/progress';
37
+
38
+ @Component({
39
+ selector: 'app-demo',
40
+ standalone: true,
41
+ imports: [...HlmProgressImports],
42
+ template: `
43
+ <hlm-progress [value]="40" [max]="100">
44
+ <hlm-progress-indicator hlmProgressIndicator />
45
+ </hlm-progress>
46
+ `,
47
+ })
48
+ export class DemoComponent {}
49
+ ```
50
+
51
+ NgModule usage:
52
+
53
+ ```ts
54
+ import { NgModule } from '@angular/core';
55
+ import { HlmProgressModule } from '@egose/shadcn-theme-ng/progress';
56
+
57
+ @NgModule({ imports: [HlmProgressModule] })
58
+ export class DemoModule {}
59
+ ```
60
+
61
+ For the `tw:` build, swap the specifier to `@egose/shadcn-theme-ng-tw/progress`. Symbol names are identical.
62
+
63
+ ## Anatomy / Structure
64
+
65
+ ```html
66
+ <!-- determinate -->
67
+ <hlm-progress [value]="value()" [max]="100">
68
+ <hlm-progress-indicator hlmProgressIndicator />
69
+ </hlm-progress>
70
+
71
+ <!-- attribute-selector form -->
72
+ <div hlmProgress [value]="40" [max]="100">
73
+ <div hlmProgressIndicator></div>
74
+ </div>
75
+
76
+ <!-- indeterminate (no value) -->
77
+ <hlm-progress>
78
+ <hlm-progress-indicator hlmProgressIndicator />
79
+ </hlm-progress>
80
+ ```
81
+
82
+ | Class | Selector | Role |
83
+ | ---------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------- |
84
+ | `HlmProgress` | `hlm-progress,[hlmProgress]` | Track (`BrnProgress` host: `value`, `max`, `getValueLabel`); `data-slot="progress"` |
85
+ | `HlmProgressIndicator` | `[hlmProgressIndicator],hlm-progress-indicator` | Fill bar (`BrnProgressIndicator` host); `data-slot="progress-indicator"` |
86
+
87
+ The indicator computes `translateX(-offset%)` from `100 - value` (defaulting `null`/`undefined` value to `100` for the offset math) and flips the sign in RTL via CDK `Directionality`. When the brain value is `null`/`undefined` it adds the `animate-indeterminate` class instead of a static fill.
88
+
89
+ ## API reference
90
+
91
+ ### `HlmProgress` (`hlm-progress,[hlmProgress]`)
92
+
93
+ | Member | Kind | Type | Notes |
94
+ | --------------- | ------------------------- | ----------------------------- | ------------------------------------------------------------ |
95
+ | `value` | input (via `BrnProgress`) | `number \| null \| undefined` | Current value; `null`/`undefined` → indeterminate |
96
+ | `max` | input (via `BrnProgress`) | `number` | Scale maximum (commonly `100`) |
97
+ | `getValueLabel` | input (via `BrnProgress`) | `(value, max) => string` | Accessible value-text factory (see brain docs for signature) |
98
+
99
+ No shadcn inputs of its own. Track styling: `bg-muted h-1.5 rounded-full relative inline-flex w-full overflow-hidden`.
100
+
101
+ ### `HlmProgressIndicator` (`[hlmProgressIndicator],hlm-progress-indicator`)
102
+
103
+ No public inputs/outputs/methods. Internals (protected, for understanding only): `_transform` (computed `translateX()`), `_indeterminate` (computed `value == null`). Fill styling: `bg-primary h-full w-full flex-1 transition-all`; indeterminate state toggles `animate-indeterminate`.
104
+
105
+ ## Examples
106
+
107
+ ### 1. Basic determinate bar
108
+
109
+ ```ts
110
+ import { Component, signal } from '@angular/core';
111
+ import { HlmProgressImports } from '@egose/shadcn-theme-ng/progress';
112
+
113
+ @Component({
114
+ selector: 'app-progress-basic',
115
+ standalone: true,
116
+ imports: [...HlmProgressImports],
117
+ template: `
118
+ <hlm-progress [value]="value()" [max]="100">
119
+ <hlm-progress-indicator hlmProgressIndicator />
120
+ </hlm-progress>
121
+ <p class="tw:text-sm tw:text-muted-foreground">{{ value() }}%</p>
122
+ <button type="button" (click)="value.set(Math.min(100, value() + 10))">+10</button>
123
+ `,
124
+ })
125
+ export class ProgressBasicComponent {
126
+ readonly value = signal(40);
127
+ protected readonly Math = Math;
128
+ }
129
+ ```
130
+
131
+ ### 2. Timer / simulated upload
132
+
133
+ ```ts
134
+ import { Component, signal, OnDestroy } from '@angular/core';
135
+ import { HlmProgressImports } from '@egose/shadcn-theme-ng/progress';
136
+
137
+ @Component({
138
+ selector: 'app-progress-timer',
139
+ standalone: true,
140
+ imports: [...HlmProgressImports],
141
+ template: `
142
+ <hlm-progress [value]="progress()" [max]="100">
143
+ <hlm-progress-indicator hlmProgressIndicator />
144
+ </hlm-progress>
145
+ <div class="tw:flex tw:gap-2">
146
+ <button type="button" (click)="start()">Start</button>
147
+ <button type="button" (click)="reset()">Reset</button>
148
+ </div>
149
+ `,
150
+ })
151
+ export class ProgressTimerComponent implements OnDestroy {
152
+ readonly progress = signal(0);
153
+ private timer: ReturnType<typeof setInterval> | undefined;
154
+
155
+ start(): void {
156
+ this.stop();
157
+ this.timer = setInterval(() => {
158
+ this.progress.update((v) => (v >= 100 ? 100 : v + 2));
159
+ if (this.progress() >= 100) this.stop();
160
+ }, 100);
161
+ }
162
+
163
+ reset(): void {
164
+ this.stop();
165
+ this.progress.set(0);
166
+ }
167
+
168
+ ngOnDestroy(): void {
169
+ this.stop();
170
+ }
171
+
172
+ private stop(): void {
173
+ if (this.timer) clearInterval(this.timer);
174
+ this.timer = undefined;
175
+ }
176
+ }
177
+ ```
178
+
179
+ ### 3. Indeterminate (unknown duration)
180
+
181
+ Omit `value` entirely — the indicator switches to the `animate-indeterminate` treatment.
182
+
183
+ ```ts
184
+ import { Component, signal } from '@angular/core';
185
+ import { HlmProgressImports } from '@egose/shadcn-theme-ng/progress';
186
+
187
+ @Component({
188
+ selector: 'app-progress-indeterminate',
189
+ standalone: true,
190
+ imports: [...HlmProgressImports],
191
+ template: `
192
+ <button type="button" (click)="load()">Fetch report</button>
193
+ @if (loading()) {
194
+ <hlm-progress aria-label="Loading report">
195
+ <hlm-progress-indicator hlmProgressIndicator />
196
+ </hlm-progress>
197
+ }
198
+ `,
199
+ })
200
+ export class ProgressIndeterminateComponent {
201
+ readonly loading = signal(false);
202
+
203
+ async load(): Promise<void> {
204
+ this.loading.set(true);
205
+ await new Promise((r) => setTimeout(r, 1500));
206
+ this.loading.set(false);
207
+ }
208
+ }
11
209
  ```
210
+
211
+ ### 4. Custom scale (`max !== 100`) + accessible label
212
+
213
+ ```ts
214
+ import { Component, signal } from '@angular/core';
215
+ import { HlmProgressImports } from '@egose/shadcn-theme-ng/progress';
216
+
217
+ @Component({
218
+ selector: 'app-progress-scale',
219
+ standalone: true,
220
+ imports: [...HlmProgressImports],
221
+ template: `
222
+ <hlm-progress [value]="done()" [max]="total()" [getValueLabel]="label" aria-label="Migration progress">
223
+ <hlm-progress-indicator hlmProgressIndicator />
224
+ </hlm-progress>
225
+ <p class="tw:text-sm">{{ done() }} of {{ total() }} rows migrated</p>
226
+ `,
227
+ })
228
+ export class ProgressScaleComponent {
229
+ readonly done = signal(37);
230
+ readonly total = signal(200);
231
+
232
+ readonly label = (value: number | null | undefined, max: number): string => `${value ?? 0} of ${max} rows`;
233
+ }
234
+ ```
235
+
236
+ > `getValueLabel` is the brain hook for the `aria-valuetext`; keep the visible text in sync (as above) so sighted and SR users agree.
237
+
238
+ ### 5. Multi-step wizard
239
+
240
+ ```ts
241
+ import { Component, signal, computed } from '@angular/core';
242
+ import { HlmProgressImports } from '@egose/shadcn-theme-ng/progress';
243
+
244
+ @Component({
245
+ selector: 'app-progress-steps',
246
+ standalone: true,
247
+ imports: [...HlmProgressImports],
248
+ template: `
249
+ <hlm-progress [value]="step()" [max]="steps.length">
250
+ <hlm-progress-indicator hlmProgressIndicator />
251
+ </hlm-progress>
252
+ <p class="tw:text-sm">Step {{ step() }} of {{ steps.length }}: {{ steps[step() - 1] }}</p>
253
+ <div class="tw:flex tw:gap-2">
254
+ <button type="button" (click)="prev()" [disabled]="step() <= 1">Back</button>
255
+ <button type="button" (click)="next()" [disabled]="step() >= steps.length">Next</button>
256
+ </div>
257
+ `,
258
+ })
259
+ export class ProgressStepsComponent {
260
+ readonly steps = ['Account', 'Profile', 'Confirm'];
261
+ readonly step = signal(1);
262
+
263
+ prev(): void {
264
+ this.step.update((s) => Math.max(1, s - 1));
265
+ }
266
+ next(): void {
267
+ this.step.update((s) => Math.min(this.steps.length, s + 1));
268
+ }
269
+ }
270
+ ```
271
+
272
+ ### 6. Error / complete states and NgModule form
273
+
274
+ ```ts
275
+ import { NgModule, Component, signal, computed } from '@angular/core';
276
+ import { HlmProgressImports, HlmProgressModule } from '@egose/shadcn-theme-ng/progress';
277
+
278
+ @Component({
279
+ selector: 'app-progress-states',
280
+ standalone: true,
281
+ imports: [...HlmProgressImports],
282
+ template: `
283
+ <hlm-progress [value]="value()" [max]="100" [class]="barClass()">
284
+ <hlm-progress-indicator hlmProgressIndicator />
285
+ </hlm-progress>
286
+ <p class="tw:text-sm" [class.tw:text-destructive]="failed()">
287
+ {{ failed() ? 'Upload failed — retrying…' : value() >= 100 ? 'Complete' : 'Uploading…' }}
288
+ </p>
289
+ `,
290
+ })
291
+ export class ProgressStatesComponent {
292
+ readonly value = signal(75);
293
+ readonly failed = signal(false);
294
+ readonly barClass = computed(() => (this.failed() ? 'tw:[&>[data-slot=progress-indicator]]:tw:bg-destructive' : ''));
295
+ }
296
+
297
+ @NgModule({ imports: [HlmProgressModule] })
298
+ export class ProgressLegacyModule {}
299
+ ```
300
+
301
+ > There is no `state`/`variant` input — success/error tints are done with plain `class` overrides targeting the indicator (as above), since the indicator carries `data-slot="progress-indicator"`.
302
+
303
+ ## Accessibility notes
304
+
305
+ - The brain `BrnProgress` exposes `role="progressbar"` with `aria-valuemin`/`max`/`now` (plus `aria-valuetext` via `getValueLabel`) — always provide `aria-label`/`aria-labelledby` unless surrounding text already names the bar.
306
+ - Indeterminate bars (no `value`) must still be labelled ("Loading report") so SR users know what is pending; pair with status text or an `aria-live` region for completion.
307
+ - Don't use progress as the _only_ conveyor of state — mirror percent/steps in text (examples 1/4/5).
308
+ - Color overrides (example 6) are decorative; keep the text label as the source of truth for error/complete states.
309
+
310
+ ## Theming / CSS variables
311
+
312
+ No theming inputs. Track is `bg-muted`, fill is `bg-primary`; both follow shadcn tokens automatically. Tint the fill per-instance with a `class` override on the track targeting `[data-slot=progress-indicator]`.
313
+
314
+ ## Related subpaths
315
+
316
+ - `@egose/shadcn-theme-ng/skeleton`, `@egose/shadcn-theme-ng/spinner` — alternative loading indicators (skeleton screens, spinners) vs this determinate bar.
317
+ - `@egose/shadcn-theme-ng/sonner` — toast completion notices to pair with a finished upload.
@@ -7,12 +7,12 @@ import { Directionality } from '@angular/cdk/bidi';
7
7
 
8
8
  class HlmProgress {
9
9
  constructor() {
10
- classes(() => 'bg-muted h-1.5 rounded-full relative inline-flex w-full overflow-hidden');
10
+ classes(() => "bg-muted h-1.5 rounded-full relative inline-flex w-full overflow-hidden");
11
11
  }
12
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgress, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: HlmProgress, isStandalone: true, selector: "hlm-progress,[hlmProgress]", host: { attributes: { "data-slot": "progress" } }, hostDirectives: [{ directive: i1.BrnProgress, inputs: ["value", "value", "max", "max", "getValueLabel", "getValueLabel"] }], ngImport: i0 });
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgress, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmProgress, isStandalone: true, selector: "hlm-progress,[hlmProgress]", host: { attributes: { "data-slot": "progress" } }, hostDirectives: [{ directive: i1.BrnProgress, inputs: ["value", "value", "max", "max", "getValueLabel", "getValueLabel"] }], ngImport: i0 });
14
14
  }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgress, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgress, decorators: [{
16
16
  type: Directive,
17
17
  args: [{
18
18
  selector: 'hlm-progress,[hlmProgress]',
@@ -34,12 +34,12 @@ class HlmProgressIndicator {
34
34
  _indeterminate = computed(() => this._progress.value() === null || this._progress.value() === undefined, /* @ts-ignore */
35
35
  ...(ngDevMode ? [{ debugName: "_indeterminate" }] : /* istanbul ignore next */ []));
36
36
  constructor() {
37
- classes(() => 'bg-primary h-full w-full flex-1 transition-all');
37
+ classes(() => "bg-primary h-full w-full flex-1 transition-all");
38
38
  }
39
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgressIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
40
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: HlmProgressIndicator, isStandalone: true, selector: "[hlmProgressIndicator],hlm-progress-indicator", host: { attributes: { "data-slot": "progress-indicator" }, properties: { "class.animate-indeterminate": "_indeterminate()", "style.transform": "_transform()" } }, hostDirectives: [{ directive: i1.BrnProgressIndicator }], ngImport: i0 });
39
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgressIndicator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
40
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmProgressIndicator, isStandalone: true, selector: "[hlmProgressIndicator],hlm-progress-indicator", host: { attributes: { "data-slot": "progress-indicator" }, properties: { "class.animate-indeterminate": "_indeterminate()", "style.transform": "_transform()" } }, hostDirectives: [{ directive: i1.BrnProgressIndicator }], ngImport: i0 });
41
41
  }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgressIndicator, decorators: [{
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgressIndicator, decorators: [{
43
43
  type: Directive,
44
44
  args: [{
45
45
  selector: '[hlmProgressIndicator],hlm-progress-indicator',
@@ -57,11 +57,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
57
57
  */
58
58
  const HlmProgressImports = [HlmProgress, HlmProgressIndicator];
59
59
  class HlmProgressModule {
60
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgressModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
61
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmProgressModule, imports: [HlmProgress, HlmProgressIndicator], exports: [HlmProgress, HlmProgressIndicator] });
62
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgressModule });
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgressModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
61
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmProgressModule, imports: [HlmProgress, HlmProgressIndicator], exports: [HlmProgress, HlmProgressIndicator] });
62
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgressModule });
63
63
  }
64
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmProgressModule, decorators: [{
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmProgressModule, decorators: [{
65
65
  type: NgModule,
66
66
  args: [{
67
67
  imports: [...HlmProgressImports],
@@ -74,4 +74,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
74
74
  */
75
75
 
76
76
  export { HlmProgress, HlmProgressImports, HlmProgressIndicator, HlmProgressModule };
77
- //# sourceMappingURL=progress.mjs.map
77
+