@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
package/toggle/README.md CHANGED
@@ -1,11 +1,276 @@
1
- # Toggle
1
+ # Toggle (`@egose/shadcn-theme-ng/toggle`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli).
3
+ A two-state press button, equivalent to [shadcn/ui Toggle](https://ui.shadcn.com/docs/components/toggle). This subpath ships a single thin styling directive, `HlmToggle` (`button[hlmToggle]`), over spartan-ng's `BrnToggle` primitive, with `variant` (`default`/`outline`) and `size` (`default`/`sm`/`lg`) inputs powered by `toggleVariants` (cva). Use it for standalone on/off buttons (bold, italic, mute); use `toggle-group` for sets of related toggles.
4
4
 
5
- ## Building
5
+ > **Ships as:** `@egose/shadcn-theme-ng/toggle` and `@egose/shadcn-theme-ng-tw/toggle` (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
- To build the library, run:
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- ng build toggle
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
+ `@spartan-ng/brain` and `class-variance-authority` arrive transitively. See the [package README](../../README.md) for the full peer-dependency table.
18
+
19
+ ## Imports
20
+
21
+ All public symbols are re-exported from `projects/toggle/src/public-api.ts`:
22
+
23
+ ```ts
24
+ import { HlmToggle, HlmToggleImports, HlmToggleModule, toggleVariants } from '@egose/shadcn-theme-ng/toggle';
25
+ import type { ToggleVariants } from '@egose/shadcn-theme-ng/toggle';
26
+ // tw variant: swap to '@egose/shadcn-theme-ng-tw/toggle'
27
+ ```
28
+
29
+ Standalone-component usage (preferred):
30
+
31
+ ```ts
32
+ import { Component } from '@angular/core';
33
+ import { HlmToggleImports } from '@egose/shadcn-theme-ng/toggle';
34
+
35
+ @Component({
36
+ selector: 'app-demo',
37
+ standalone: true,
38
+ imports: [...HlmToggleImports],
39
+ template: `<button hlmToggle aria-label="Bold">B</button>`,
40
+ })
41
+ export class DemoComponent {}
42
+ ```
43
+
44
+ NgModule usage:
45
+
46
+ ```ts
47
+ import { NgModule } from '@angular/core';
48
+ import { HlmToggleModule } from '@egose/shadcn-theme-ng/toggle';
49
+
50
+ @NgModule({ imports: [HlmToggleModule] })
51
+ export class FeatureModule {}
52
+ ```
53
+
54
+ | Symbol | Kind | Description |
55
+ | ------------------ | ------------- | ------------------------------------------------------------------------------ |
56
+ | `HlmToggle` | Directive | `button[hlmToggle]` — styled toggle button over `BrnToggle`. |
57
+ | `toggleVariants` | cva fn | `toggleVariants({ variant, size })` — class generator, reused by toggle-group. |
58
+ | `ToggleVariants` | Type | `VariantProps<typeof toggleVariants>` — `variant`/`size` value types. |
59
+ | `HlmToggleImports` | `const` array | `[HlmToggle]` — spread into `imports: [...]`. |
60
+ | `HlmToggleModule` | NgModule | Imports + re-exports `HlmToggle`. |
61
+
62
+ ## Anatomy / Structure
63
+
64
+ ```html
65
+ <!-- basic (pressed when aria-pressed="true" / state on) -->
66
+ <button hlmToggle aria-label="Toggle bold">B</button>
67
+
68
+ <!-- variants + sizes -->
69
+ <button hlmToggle variant="outline" size="sm">Toggle</button>
70
+ <button hlmToggle variant="default" size="lg" aria-label="Toggle italic">I</button>
71
+
72
+ <!-- controlled pressed state -->
73
+ <button hlmToggle [(state)]="bold" aria-label="Bold">B</button>
74
+
75
+ <!-- disabled -->
76
+ <button hlmToggle disabled aria-label="Unavailable">X</button>
77
+ ```
78
+
79
+ > Only use on `<button>` elements — the selector is `button[hlmToggle]`.
80
+
81
+ ## API reference
82
+
83
+ ### `HlmToggle` — selector `button[hlmToggle]` (directive, hosts `BrnToggle`)
84
+
85
+ Own styling inputs:
86
+
87
+ | Input | Type | Default | Description |
88
+ | --------- | ------------------------------------------------------ | ----------- | --------------------------------------------------------------------- |
89
+ | `variant` | `ToggleVariants['variant']` (`'default' \| 'outline'`) | `'default'` | `default`: transparent; `outline`: bordered + shadow. |
90
+ | `size` | `ToggleVariants['size']` (`'default' \| 'sm' \| 'lg'`) | `'default'` | `default`: `h-9 min-w-9`; `sm`: `h-8 min-w-8`; `lg`: `h-10 min-w-10`. |
91
+
92
+ Forwarded to `BrnToggle` via `hostDirectives`:
93
+
94
+ | Input / Output | Direction | Description |
95
+ | -------------- | ----------------------- | -------------------------------------------------------------- |
96
+ | `id` | input | Element id. |
97
+ | `value` | input | Toggle value (used in groups / forms). |
98
+ | `disabled` | input | Disabled state. |
99
+ | `state` | input (two-way capable) | Pressed state (`'on' \| 'off'` per Brn). Supports `[(state)]`. |
100
+ | `aria-label` | input | Accessible name — **required** for icon-only toggles. |
101
+ | `type` | input | Button `type` (`button` default). |
102
+ | `stateChange` | output | Emits when the pressed state changes. |
103
+
104
+ Host: `data-slot="toggle"`. Active styling keys off `aria-pressed`/`data-[state]` (`aria-pressed:bg-muted`). User `class` is preserved and merged via `classes()`.
105
+
106
+ ## Examples
107
+
108
+ ### 1. Basic icon toggles (editor toolbar)
109
+
110
+ ```ts
111
+ // demo-basic.component.ts
112
+ import { Component } from '@angular/core';
113
+ import { HlmToggleImports } from '@egose/shadcn-theme-ng/toggle';
114
+ import { NgIcon, provideIcons } from '@ng-icons/core';
115
+ import { lucideBold, lucideItalic, lucideUnderline } from '@ng-icons/lucide';
116
+
117
+ @Component({
118
+ selector: 'demo-basic',
119
+ standalone: true,
120
+ imports: [...HlmToggleImports, NgIcon],
121
+ providers: [provideIcons({ lucideBold, lucideItalic, lucideUnderline })],
122
+ template: `
123
+ <div class="flex gap-1">
124
+ <button hlmToggle aria-label="Toggle bold"><ng-icon name="lucideBold" /></button>
125
+ <button hlmToggle aria-label="Toggle italic"><ng-icon name="lucideItalic" /></button>
126
+ <button hlmToggle aria-label="Toggle underline"><ng-icon name="lucideUnderline" /></button>
127
+ </div>
128
+ `,
129
+ })
130
+ export class DemoBasic {}
11
131
  ```
132
+
133
+ ### 2. All variants and sizes
134
+
135
+ ```ts
136
+ // demo-variants.component.ts
137
+ import { Component } from '@angular/core';
138
+ import { HlmToggleImports } from '@egose/shadcn-theme-ng/toggle';
139
+
140
+ @Component({
141
+ selector: 'demo-variants',
142
+ standalone: true,
143
+ imports: [...HlmToggleImports],
144
+ template: `
145
+ <div class="flex flex-wrap items-center gap-2">
146
+ <button hlmToggle variant="default" size="sm">Small</button>
147
+ <button hlmToggle variant="default" size="default">Default</button>
148
+ <button hlmToggle variant="default" size="lg">Large</button>
149
+ <button hlmToggle variant="outline" size="sm">Small outline</button>
150
+ <button hlmToggle variant="outline" size="default">Outline</button>
151
+ <button hlmToggle variant="outline" size="lg">Large outline</button>
152
+ </div>
153
+ `,
154
+ })
155
+ export class DemoVariants {}
156
+ ```
157
+
158
+ ### 3. Controlled state with signals
159
+
160
+ ```ts
161
+ // demo-controlled.component.ts
162
+ import { Component, signal } from '@angular/core';
163
+ import { HlmToggleImports } from '@egose/shadcn-theme-ng/toggle';
164
+
165
+ @Component({
166
+ selector: 'demo-controlled',
167
+ standalone: true,
168
+ imports: [...HlmToggleImports],
169
+ template: `
170
+ <button hlmToggle variant="outline" [(state)]="muted" aria-label="Toggle mute">
171
+ {{ muted() === 'on' ? 'Muted' : 'Unmuted' }}
172
+ </button>
173
+ <p class="text-sm text-muted-foreground">State: {{ muted() }}</p>
174
+ `,
175
+ })
176
+ export class DemoControlled {
177
+ readonly muted = signal<'on' | 'off'>('off');
178
+ }
179
+ ```
180
+
181
+ React to changes imperatively with `(stateChange)`:
182
+
183
+ ```html
184
+ <button hlmToggle (stateChange)="onToggle($event)" aria-label="Toggle preview">Preview</button>
185
+ ```
186
+
187
+ ```ts
188
+ onToggle(state: unknown) {
189
+ console.log('toggle state:', state);
190
+ }
191
+ ```
192
+
193
+ ### 4. Disabled state
194
+
195
+ ```ts
196
+ // demo-disabled.component.ts
197
+ import { Component } from '@angular/core';
198
+ import { HlmToggleImports } from '@egose/shadcn-theme-ng/toggle';
199
+
200
+ @Component({
201
+ selector: 'demo-disabled',
202
+ standalone: true,
203
+ imports: [...HlmToggleImports],
204
+ template: `
205
+ <div class="flex gap-2">
206
+ <button hlmToggle disabled aria-label="Unavailable feature">Off</button>
207
+ <button hlmToggle variant="outline" disabled aria-label="Unavailable outline">Off</button>
208
+ </div>
209
+ `,
210
+ })
211
+ export class DemoDisabled {}
212
+ ```
213
+
214
+ ### 5. Text toggle + composition with tooltip
215
+
216
+ ```ts
217
+ // demo-composed.component.ts
218
+ import { Component } from '@angular/core';
219
+ import { HlmToggleImports } from '@egose/shadcn-theme-ng/toggle';
220
+ import { HlmTooltipImports } from '@egose/shadcn-theme-ng/tooltip';
221
+
222
+ @Component({
223
+ selector: 'demo-composed',
224
+ standalone: true,
225
+ imports: [...HlmToggleImports, ...HlmTooltipImports],
226
+ template: `
227
+ <button hlmToggle variant="outline" aria-label="Toggle sidebar" [hlmTooltip]="'Toggle sidebar'">☰</button>
228
+ `,
229
+ })
230
+ export class DemoComposed {}
231
+ ```
232
+
233
+ > `hlmTooltip` attaches to the same `<button>` — see `@egose/shadcn-theme-ng/tooltip` for delay/position options.
234
+
235
+ ### 6. Advanced: reusing `toggleVariants` for custom components
236
+
237
+ ```ts
238
+ // custom-toggle.component.ts
239
+ import { Component, input } from '@angular/core';
240
+ import { hlm } from '@egose/shadcn-theme-ng/utils';
241
+ import { toggleVariants, type ToggleVariants } from '@egose/shadcn-theme-ng/toggle';
242
+
243
+ @Component({
244
+ selector: 'custom-toggle',
245
+ standalone: true,
246
+ template: `<button [class]="classes()" [attr.aria-pressed]="pressed()"><ng-content /></button>`,
247
+ })
248
+ export class CustomToggle {
249
+ readonly variant = input<ToggleVariants['variant']>('default');
250
+ readonly size = input<ToggleVariants['size']>('default');
251
+ readonly pressed = input(false);
252
+
253
+ protected classes() {
254
+ return hlm(toggleVariants({ variant: this.variant(), size: this.size() }), 'my-extra-class');
255
+ }
256
+ }
257
+ ```
258
+
259
+ ## Accessibility notes
260
+
261
+ - Icon-only toggles **must** have `aria-label` (e.g. `aria-label="Toggle bold"`); text toggles get their name from content.
262
+ - The pressed state is exposed via `aria-pressed` by the Brn primitive — do not manage `aria-pressed` yourself when using `[(state)]`.
263
+ - Keep toggles keyboard-focusable (native `<button>` behavior); the focus ring (`focus-visible:ring-[3px]`) is built in.
264
+ - Use a toggle for an immediate on/off effect in place; use a switch for settings rows and a checkbox for form-submission choices.
265
+ - Disabled toggles render `pointer-events-none` + `opacity-50`; explain unavailability in nearby text when needed.
266
+
267
+ ## Theming / CSS variables
268
+
269
+ `toggleVariants` keys off theme tokens (`hover:bg-muted`, `aria-pressed:bg-muted`, `border-input`, `ring-ring/50`, invalid-state `ring-destructive`). Follows your shadcn theme automatically; append overrides via `class` (merged through `classes()`).
270
+
271
+ ## Related subpaths
272
+
273
+ - `@egose/shadcn-theme-ng/toggle-group` — sets of related toggles (alignment, formatting groups); reuses `toggleVariants`.
274
+ - `@egose/shadcn-theme-ng/switch` — on/off settings switch.
275
+ - `@egose/shadcn-theme-ng/tooltip` — label affordance for icon-only toggles.
276
+ - `@egose/shadcn-theme-ng/button` — action buttons (vs. pressed-state toggles).
@@ -8,13 +8,13 @@ import { cva } from 'class-variance-authority';
8
8
  const toggleVariants = cva("hover:text-foreground aria-pressed:bg-muted focus-visible:border-ring focus-visible:ring-ring/50 data-[matches-spartan-invalid=true]:ring-destructive/20 dark:data-[matches-spartan-invalid=true]:ring-destructive/40 data-[matches-spartan-invalid=true]:border-destructive dark:data-[matches-spartan-invalid=true]:border-destructive/50 gap-1 rounded-md text-sm font-medium transition-[color,box-shadow] [&_ng-icon:not([class*='text-'])]:text-[length:--spacing(4)] group/toggle hover:bg-muted inline-flex items-center justify-center whitespace-nowrap outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0", {
9
9
  variants: {
10
10
  variant: {
11
- default: 'bg-transparent',
12
- outline: 'border-input hover:bg-muted border bg-transparent shadow-xs',
11
+ default: "bg-transparent",
12
+ outline: "border-input hover:bg-muted border bg-transparent shadow-xs",
13
13
  },
14
14
  size: {
15
- default: 'h-9 min-w-9 px-2.5',
16
- sm: 'h-8 min-w-8 px-2.5',
17
- lg: 'h-10 min-w-10 px-2.5',
15
+ default: "h-9 min-w-9 px-2.5",
16
+ sm: "h-8 min-w-8 px-2.5",
17
+ lg: "h-10 min-w-10 px-2.5",
18
18
  },
19
19
  },
20
20
  defaultVariants: {
@@ -33,10 +33,10 @@ class HlmToggle {
33
33
  size: this.size(),
34
34
  }));
35
35
  }
36
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmToggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
37
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: HlmToggle, isStandalone: true, selector: "button[hlmToggle]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "toggle" } }, hostDirectives: [{ directive: i1.BrnToggle, inputs: ["id", "id", "value", "value", "disabled", "disabled", "state", "state", "aria-label", "aria-label", "type", "type"], outputs: ["stateChange", "stateChange"] }], ngImport: i0 });
36
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToggle, deps: [], target: i0.ɵɵFactoryTarget.Directive });
37
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmToggle, isStandalone: true, selector: "button[hlmToggle]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "toggle" } }, hostDirectives: [{ directive: i1.BrnToggle, inputs: ["id", "id", "value", "value", "disabled", "disabled", "state", "state", "aria-label", "aria-label", "type", "type"], outputs: ["stateChange", "stateChange"] }], ngImport: i0 });
38
38
  }
39
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmToggle, decorators: [{
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToggle, decorators: [{
40
40
  type: Directive,
41
41
  args: [{
42
42
  selector: 'button[hlmToggle]',
@@ -58,11 +58,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
58
58
  */
59
59
  const HlmToggleImports = [HlmToggle];
60
60
  class HlmToggleModule {
61
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmToggleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
62
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmToggleModule, imports: [HlmToggle], exports: [HlmToggle] });
63
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmToggleModule });
61
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToggleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
62
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmToggleModule, imports: [HlmToggle], exports: [HlmToggle] });
63
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToggleModule });
64
64
  }
65
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmToggleModule, decorators: [{
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmToggleModule, decorators: [{
66
66
  type: NgModule,
67
67
  args: [{
68
68
  imports: [...HlmToggleImports],
@@ -75,4 +75,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
75
75
  */
76
76
 
77
77
  export { HlmToggle, HlmToggleImports, HlmToggleModule, toggleVariants };
78
- //# sourceMappingURL=toggle.mjs.map
78
+