@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
@@ -7,6 +7,59 @@ import { NgTemplateOutlet } from '@angular/common';
7
7
  import { HlmSpinner } from '@egose/shadcn-theme-ng-tw/spinner';
8
8
  import { cva } from 'class-variance-authority';
9
9
 
10
+ // Keep complete utility names here so consumer Tailwind builds can discover every tone.
11
+ const toneTextClasses = {
12
+ default: 'tw:text-primary',
13
+ primary: 'tw:text-primary',
14
+ secondary: 'tw:text-secondary',
15
+ success: 'tw:text-success',
16
+ warning: 'tw:text-warning',
17
+ danger: 'tw:text-danger',
18
+ info: 'tw:text-info',
19
+ light: 'tw:text-light-foreground',
20
+ dark: 'tw:text-dark',
21
+ accent: 'tw:text-accent',
22
+ destructive: 'tw:text-destructive',
23
+ muted: 'tw:text-muted-foreground',
24
+ outline: 'tw:text-primary',
25
+ link: 'tw:text-primary',
26
+ ghost: 'tw:text-light-foreground',
27
+ };
28
+ const outlineClasses = {
29
+ default: 'tw:border-primary tw:hover:bg-primary/10',
30
+ primary: 'tw:border-primary tw:hover:bg-primary/10',
31
+ secondary: 'tw:border-secondary tw:hover:bg-secondary/10',
32
+ success: 'tw:border-success tw:hover:bg-success/10',
33
+ warning: 'tw:border-warning tw:hover:bg-warning/10',
34
+ danger: 'tw:border-danger tw:hover:bg-danger/10',
35
+ info: 'tw:border-info tw:hover:bg-info/10',
36
+ light: 'tw:border-light tw:hover:bg-light/10',
37
+ dark: 'tw:border-dark tw:hover:bg-dark/10',
38
+ accent: 'tw:border-accent tw:hover:bg-accent/10',
39
+ destructive: 'tw:border-destructive tw:hover:bg-destructive/10',
40
+ muted: 'tw:border-muted tw:hover:bg-muted/10',
41
+ outline: 'tw:border-primary tw:hover:bg-primary/10',
42
+ link: '',
43
+ ghost: '',
44
+ };
45
+ const outlineFilledClasses = {
46
+ default: 'tw:hover:bg-primary tw:hover:text-primary-foreground',
47
+ primary: 'tw:hover:bg-primary tw:hover:text-primary-foreground',
48
+ secondary: 'tw:hover:bg-secondary tw:hover:text-secondary-foreground',
49
+ success: 'tw:hover:bg-success tw:hover:text-success-foreground',
50
+ warning: 'tw:hover:bg-warning tw:hover:text-warning-foreground',
51
+ danger: 'tw:hover:bg-danger tw:hover:text-danger-foreground',
52
+ info: 'tw:hover:bg-info tw:hover:text-info-foreground',
53
+ light: 'tw:hover:bg-light tw:hover:text-light-foreground',
54
+ dark: 'tw:hover:bg-dark tw:hover:text-dark-foreground',
55
+ accent: 'tw:hover:bg-accent tw:hover:text-accent-foreground',
56
+ destructive: 'tw:hover:bg-destructive tw:hover:text-destructive-foreground',
57
+ muted: 'tw:hover:bg-muted tw:hover:text-muted-foreground',
58
+ outline: 'tw:hover:bg-primary tw:hover:text-primary-foreground',
59
+ link: 'tw:hover:underline',
60
+ ghost: 'tw:hover:bg-light',
61
+ };
62
+ /** Semantic color utilities and appearances. Merge the result with hlm() for custom hosts. */
10
63
  const buttonVariants = cva([
11
64
  'tw:cursor-pointer',
12
65
  'tw:active:translate-y-[0.5px]',
@@ -45,7 +98,7 @@ const buttonVariants = cva([
45
98
  accent: 'tw:border tw:border-accent tw:bg-accent tw:text-accent-foreground tw:shadow-sm tw:hover:bg-accent/90',
46
99
  destructive: 'tw:border tw:border-destructive tw:bg-destructive tw:text-destructive-foreground tw:shadow-sm tw:hover:bg-destructive/90',
47
100
  muted: 'tw:border tw:border-muted tw:bg-muted tw:text-muted-foreground tw:shadow-sm tw:hover:bg-muted/90',
48
- outline: 'tw:border tw:border-primary tw:bg-white tw:text-primary tw:shadow-sm tw:hover:bg-primary/10',
101
+ outline: 'tw:border tw:border-primary tw:bg-background tw:text-primary tw:shadow-sm tw:hover:bg-primary/10',
49
102
  link: 'tw:text-primary tw:underline-offset-4 tw:hover:underline',
50
103
  ghost: 'tw:hover:bg-light tw:hover:text-light-foreground',
51
104
  },
@@ -66,14 +119,33 @@ const buttonVariants = cva([
66
119
  },
67
120
  appearance: {
68
121
  solid: '',
69
- outline: 'tw:bg-white tw:border',
70
- 'outline-filled': 'tw:bg-white tw:border',
122
+ outline: 'tw:bg-background tw:border tw:shadow-sm',
123
+ 'outline-filled': 'tw:bg-background tw:border tw:shadow-sm',
124
+ ghost: 'tw:bg-transparent tw:border-0 tw:shadow-none',
125
+ link: 'tw:bg-transparent tw:border-0 tw:shadow-none tw:hover:bg-transparent tw:underline-offset-4 tw:hover:underline',
71
126
  },
72
127
  loading: {
73
128
  true: 'tw:pointer-events-none',
74
129
  false: null,
75
130
  },
76
131
  },
132
+ compoundVariants: Object.keys(toneTextClasses).flatMap((variant) => [
133
+ {
134
+ variant,
135
+ appearance: ["tw:outline", "tw:outline-filled", 'ghost', 'link'],
136
+ class: toneTextClasses[variant],
137
+ },
138
+ {
139
+ variant,
140
+ appearance: ["tw:outline", "tw:outline-filled", 'ghost'],
141
+ class: outlineClasses[variant],
142
+ },
143
+ {
144
+ variant,
145
+ appearance: "tw:outline-filled",
146
+ class: outlineFilledClasses[variant],
147
+ },
148
+ ]),
77
149
  defaultVariants: {
78
150
  variant: 'primary',
79
151
  size: 'default',
@@ -82,11 +154,12 @@ const buttonVariants = cva([
82
154
  },
83
155
  });
84
156
  class HlmButton {
85
- /** Props as signal-based inputs */
157
+ /** Semantic color token. Legacy default, outline, link, and ghost variants remain supported. */
86
158
  variant = input('primary', /* @ts-ignore */
87
159
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
88
160
  size = input('default', /* @ts-ignore */
89
161
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
162
+ /** Visual treatment independent of color: solid, outline, outline-filled, ghost, or link. */
90
163
  appearance = input('solid', /* @ts-ignore */
91
164
  ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
92
165
  loading = input(false, /* @ts-ignore */
@@ -105,116 +178,21 @@ class HlmButton {
105
178
  _additionalClasses = signal('', /* @ts-ignore */
106
179
  ...(ngDevMode ? [{ debugName: "_additionalClasses" }] : /* istanbul ignore next */ []));
107
180
  /** Computed button class merging */
108
- _computedClass = computed(() => {
109
- const outlineClasses = this.appearance() === 'outline' || this.appearance() === 'outline-filled'
110
- ? [this.getOutlineClasses(this.variant())]
111
- : [];
112
- if (this.appearance() === 'outline-filled') {
113
- outlineClasses.push(this.getOutlineFilledClasses(this.variant()));
114
- }
115
- return hlm(buttonVariants({
116
- variant: this.variant(),
117
- size: this.size(),
118
- appearance: this.appearance(),
119
- loading: this.loading(),
120
- className: this.userClass(),
121
- }), outlineClasses, this.loading() ? 'tw:pointer-events-none' : '', this._additionalClasses());
122
- }, /* @ts-ignore */
181
+ _computedClass = computed(() => hlm(buttonVariants({
182
+ variant: this.variant(),
183
+ size: this.size(),
184
+ appearance: this.appearance(),
185
+ loading: this.loading(),
186
+ }), this.userClass(), this.loading() ? 'tw:pointer-events-none' : '', this._additionalClasses()), /* @ts-ignore */
123
187
  ...(ngDevMode ? [{ debugName: "_computedClass" }] : /* istanbul ignore next */ []));
124
- /** Computed spinner classes */
125
- spinnerClass = computed(() => {
126
- const base = this.appearance() === 'outline' || this.appearance() === 'outline-filled'
127
- ? this.getOutlineSpinnerClasses(this.variant())
128
- : this.getSpinnerClasses(this.variant());
129
- return hlm(base, this.spinnerUserClass());
130
- }, /* @ts-ignore */
188
+ /** Inherit the button's resolved text color, including theme and consumer overrides. */
189
+ spinnerClass = computed(() => hlm('tw:[&>svg]:text-current', this.spinnerUserClass()), /* @ts-ignore */
131
190
  ...(ngDevMode ? [{ debugName: "spinnerClass" }] : /* istanbul ignore next */ []));
132
191
  setClass(classes) {
133
192
  this._additionalClasses.set(classes);
134
193
  }
135
- /** Helper functions */
136
- getOutlineClasses(variant) {
137
- const colors = {
138
- default: 'tw:border-primary tw:text-primary tw:shadow-sm tw:hover:bg-primary/10',
139
- primary: 'tw:border-primary tw:text-primary tw:shadow-sm tw:hover:bg-primary/10',
140
- secondary: 'tw:border-secondary tw:text-secondary tw:shadow-sm tw:hover:bg-secondary/10',
141
- success: 'tw:border-success tw:text-success tw:shadow-sm tw:hover:bg-success/10',
142
- warning: 'tw:border-warning tw:text-warning tw:shadow-sm tw:hover:bg-warning/10',
143
- danger: 'tw:border-danger tw:text-danger tw:shadow-sm tw:hover:bg-danger/10',
144
- info: 'tw:border-info tw:text-info tw:shadow-sm tw:hover:bg-info/10',
145
- light: 'tw:border-light tw:text-light-foreground tw:shadow-sm tw:hover:bg-light/10',
146
- dark: 'tw:border-dark tw:text-dark tw:shadow-sm tw:hover:bg-dark/10',
147
- accent: 'tw:border-accent tw:text-accent tw:shadow-sm tw:hover:bg-accent/10',
148
- destructive: 'tw:border-destructive tw:text-destructive tw:shadow-sm tw:hover:bg-destructive/10',
149
- muted: 'tw:border-muted tw:text-muted-foreground tw:shadow-sm tw:hover:bg-muted/10',
150
- outline: 'tw:border-primary tw:text-primary tw:shadow-sm tw:hover:bg-primary/10',
151
- link: 'tw:text-primary',
152
- ghost: 'tw:text-light-foreground',
153
- };
154
- return colors[variant];
155
- }
156
- getOutlineFilledClasses(variant) {
157
- const colors = {
158
- default: 'tw:hover:bg-primary tw:hover:text-primary-foreground',
159
- primary: 'tw:hover:bg-primary tw:hover:text-primary-foreground',
160
- secondary: 'tw:hover:bg-secondary tw:hover:text-secondary-foreground',
161
- success: 'tw:hover:bg-success tw:hover:text-success-foreground',
162
- warning: 'tw:hover:bg-warning tw:hover:text-warning-foreground',
163
- danger: 'tw:hover:bg-danger tw:hover:text-danger-foreground',
164
- info: 'tw:hover:bg-info tw:hover:text-info-foreground',
165
- light: 'tw:hover:bg-light tw:hover:text-light-foreground',
166
- dark: 'tw:hover:bg-dark tw:hover:text-dark-foreground',
167
- accent: 'tw:hover:bg-accent tw:hover:text-accent-foreground',
168
- destructive: 'tw:hover:bg-destructive tw:hover:text-destructive-foreground',
169
- muted: 'tw:hover:bg-muted tw:hover:text-muted-foreground',
170
- outline: 'tw:hover:bg-primary tw:hover:text-primary-foreground',
171
- link: 'tw:hover:underline',
172
- ghost: 'tw:hover:bg-light',
173
- };
174
- return colors[variant];
175
- }
176
- getSpinnerClasses(variant) {
177
- const colors = {
178
- default: 'tw:[&>svg]:text-primary-foreground',
179
- primary: 'tw:[&>svg]:text-primary-foreground',
180
- secondary: 'tw:[&>svg]:text-secondary-foreground',
181
- success: 'tw:[&>svg]:text-success-foreground',
182
- warning: 'tw:[&>svg]:text-warning-foreground',
183
- danger: 'tw:[&>svg]:text-danger-foreground',
184
- info: 'tw:[&>svg]:text-info-foreground',
185
- light: 'tw:[&>svg]:text-light-foreground',
186
- dark: 'tw:[&>svg]:text-dark-foreground',
187
- accent: 'tw:[&>svg]:text-accent-foreground',
188
- destructive: 'tw:[&>svg]:text-destructive-foreground',
189
- muted: 'tw:[&>svg]:text-muted-foreground',
190
- outline: 'tw:[&>svg]:text-primary',
191
- link: 'tw:[&>svg]:text-primary',
192
- ghost: 'tw:[&>svg]:text-light-foreground',
193
- };
194
- return colors[variant];
195
- }
196
- getOutlineSpinnerClasses(variant) {
197
- const colors = {
198
- default: 'tw:[&>svg]:text-primary',
199
- primary: 'tw:[&>svg]:text-primary',
200
- secondary: 'tw:[&>svg]:text-secondary',
201
- success: 'tw:[&>svg]:text-success',
202
- warning: 'tw:[&>svg]:text-warning',
203
- danger: 'tw:[&>svg]:text-danger',
204
- info: 'tw:[&>svg]:text-info',
205
- light: 'tw:[&>svg]:text-light',
206
- dark: 'tw:[&>svg]:text-dark',
207
- accent: 'tw:[&>svg]:text-accent',
208
- destructive: 'tw:[&>svg]:text-destructive',
209
- muted: 'tw:[&>svg]:text-muted-foreground',
210
- outline: 'tw:[&>svg]:text-primary',
211
- link: 'tw:[&>svg]:text-primary',
212
- ghost: 'tw:[&>svg]:text-light-foreground',
213
- };
214
- return colors[variant];
215
- }
216
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
217
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: HlmButton, isStandalone: true, selector: "button[hlmButton], a[hlmButton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconPosition: { classPropertyName: "iconPosition", publicName: "iconPosition", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, spinnerUserClass: { classPropertyName: "spinnerUserClass", publicName: "spinnerUserClass", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()", "attr.aria-busy": "loading() || null", "attr.disabled": "(loading() || disabled()) ? true : null", "attr.type": "type()" } }, hostDirectives: [{ directive: i1.BrnButton, inputs: ["disabled", "disabled"] }], ngImport: i0, template: `
194
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
195
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: HlmButton, isStandalone: true, selector: "button[hlmButton], a[hlmButton]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, iconPosition: { classPropertyName: "iconPosition", publicName: "iconPosition", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, spinnerUserClass: { classPropertyName: "spinnerUserClass", publicName: "spinnerUserClass", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()", "attr.aria-busy": "loading() || null", "attr.disabled": "(loading() || disabled()) ? true : null", "attr.type": "type()" } }, hostDirectives: [{ directive: i1.BrnButton, inputs: ["disabled", "disabled"] }], ngImport: i0, template: `
218
196
  <ng-template #projected>
219
197
  <ng-content></ng-content>
220
198
  </ng-template>
@@ -241,7 +219,7 @@ class HlmButton {
241
219
  }
242
220
  `, isInline: true, dependencies: [{ kind: "component", type: HlmSpinner, selector: "hlm-spinner", inputs: ["size", "show", "class", "spinnerClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
243
221
  }
244
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmButton, decorators: [{
222
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmButton, decorators: [{
245
223
  type: Component,
246
224
  args: [{
247
225
  selector: 'button[hlmButton], a[hlmButton]',
@@ -314,10 +292,10 @@ class HlmBtn {
314
292
  setClass(classes) {
315
293
  this._additionalClasses.set(classes);
316
294
  }
317
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmBtn, deps: [], target: i0.ɵɵFactoryTarget.Directive });
318
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: HlmBtn, isStandalone: true, selector: "button[hlmBtn], a[hlmBtn]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "button" }, properties: { "class": "_computedClass()", "attr.type": "type()" } }, exportAs: ["hlmBtn"], hostDirectives: [{ directive: i1.BrnButton, inputs: ["disabled", "disabled"] }], ngImport: i0 });
295
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmBtn, deps: [], target: i0.ɵɵFactoryTarget.Directive });
296
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.3", type: HlmBtn, isStandalone: true, selector: "button[hlmBtn], a[hlmBtn]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-slot": "button" }, properties: { "class": "_computedClass()", "attr.type": "type()" } }, exportAs: ["hlmBtn"], hostDirectives: [{ directive: i1.BrnButton, inputs: ["disabled", "disabled"] }], ngImport: i0 });
319
297
  }
320
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmBtn, decorators: [{
298
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmBtn, decorators: [{
321
299
  type: Directive,
322
300
  args: [{
323
301
  selector: 'button[hlmBtn], a[hlmBtn]',
@@ -337,11 +315,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
337
315
  */
338
316
  const HlmButtonImports = [HlmButton, HlmBtn];
339
317
  class HlmButtonModule {
340
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
341
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmButtonModule, imports: [HlmButton, HlmBtn], exports: [HlmButton, HlmBtn] });
342
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmButtonModule, imports: [HlmButton] });
318
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
319
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmButtonModule, imports: [HlmButton, HlmBtn], exports: [HlmButton, HlmBtn] });
320
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmButtonModule, imports: [HlmButton] });
343
321
  }
344
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmButtonModule, decorators: [{
322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmButtonModule, decorators: [{
345
323
  type: NgModule,
346
324
  args: [{
347
325
  imports: [...HlmButtonImports],
@@ -354,4 +332,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
354
332
  */
355
333
 
356
334
  export { HlmBtn, HlmButton, HlmButtonImports, HlmButtonModule, buttonVariants, injectBrnButtonConfig, provideBrnButtonConfig };
357
- //# sourceMappingURL=button.mjs.map
335
+
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ValueProvider } from '@angular/core';
2
+ import { TemplateRef, ValueProvider } from '@angular/core';
3
3
  import { ClassValue } from 'clsx';
4
4
  import * as i1 from '@spartan-ng/brain/button';
5
5
  import * as class_variance_authority_types from 'class-variance-authority/types';
@@ -18,10 +18,11 @@ declare class HlmBtn {
18
18
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<HlmBtn, "button[hlmBtn], a[hlmBtn]", ["hlmBtn"], { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.BrnButton; inputs: { "disabled": "disabled"; }; outputs: {}; }]>;
19
19
  }
20
20
 
21
+ /** Semantic color utilities and appearances. Merge the result with hlm() for custom hosts. */
21
22
  declare const buttonVariants: (props?: ({
22
23
  variant?: "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "info" | "light" | "dark" | "accent" | "destructive" | "muted" | "outline" | "link" | "ghost" | null | undefined;
23
24
  size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | "compact-xs" | "compact-sm" | "compact-default" | "compact-lg" | "compact-icon" | null | undefined;
24
- appearance?: "outline" | "solid" | "outline-filled" | null | undefined;
25
+ appearance?: "outline" | "link" | "ghost" | "solid" | "outline-filled" | null | undefined;
25
26
  loading?: boolean | null | undefined;
26
27
  } & class_variance_authority_types.ClassProp) | undefined) => string;
27
28
  type ButtonVariants = VariantProps<typeof buttonVariants>;
@@ -29,12 +30,13 @@ type VariantType = NonNullable<ButtonVariants['variant']>;
29
30
  type SizeType = NonNullable<ButtonVariants['size']>;
30
31
  type AppearanceType = NonNullable<ButtonVariants['appearance']>;
31
32
  declare class HlmButton {
32
- /** Props as signal-based inputs */
33
+ /** Semantic color token. Legacy default, outline, link, and ghost variants remain supported. */
33
34
  readonly variant: _angular_core.InputSignal<VariantType>;
34
35
  readonly size: _angular_core.InputSignal<SizeType>;
36
+ /** Visual treatment independent of color: solid, outline, outline-filled, ghost, or link. */
35
37
  readonly appearance: _angular_core.InputSignal<AppearanceType>;
36
38
  readonly loading: _angular_core.InputSignal<boolean>;
37
- readonly icon: _angular_core.InputSignal<any>;
39
+ readonly icon: _angular_core.InputSignal<TemplateRef<unknown> | undefined>;
38
40
  readonly iconPosition: _angular_core.InputSignal<"left" | "right">;
39
41
  readonly userClass: _angular_core.InputSignal<ClassValue>;
40
42
  readonly spinnerUserClass: _angular_core.InputSignal<ClassValue>;
@@ -43,14 +45,9 @@ declare class HlmButton {
43
45
  private readonly _additionalClasses;
44
46
  /** Computed button class merging */
45
47
  protected readonly _computedClass: _angular_core.Signal<string>;
46
- /** Computed spinner classes */
48
+ /** Inherit the button's resolved text color, including theme and consumer overrides. */
47
49
  protected readonly spinnerClass: _angular_core.Signal<string>;
48
50
  setClass(classes: string): void;
49
- /** Helper functions */
50
- private getOutlineClasses;
51
- private getOutlineFilledClasses;
52
- private getSpinnerClasses;
53
- private getOutlineSpinnerClasses;
54
51
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<HlmButton, never>;
55
52
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<HlmButton, "button[hlmButton], a[hlmButton]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconPosition": { "alias": "iconPosition"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "spinnerUserClass": { "alias": "spinnerUserClass"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof i1.BrnButton; inputs: { "disabled": "disabled"; }; outputs: {}; }]>;
56
53
  }