@egose/shadcn-theme-ng-tw 0.0.28 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +376 -34
  3. package/accordion/fesm2022/accordion.mjs +20 -20
  4. package/alert/README.md +343 -34
  5. package/alert/fesm2022/alert.mjs +18 -18
  6. package/alert-dialog/README.md +471 -5
  7. package/alert-dialog/fesm2022/alert-dialog.mjs +48 -48
  8. package/alert-dialog/types/alert-dialog.d.ts +1 -1
  9. package/aspect-ratio/README.md +272 -5
  10. package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
  11. package/autocomplete/README.md +473 -34
  12. package/autocomplete/fesm2022/autocomplete.mjs +54 -54
  13. package/autocomplete/types/autocomplete.d.ts +1 -1
  14. package/avatar/README.md +357 -5
  15. package/avatar/fesm2022/avatar.mjs +32 -32
  16. package/badge/README.md +289 -34
  17. package/badge/fesm2022/badge.mjs +4 -4
  18. package/basic-alert/README.md +324 -34
  19. package/basic-alert/fesm2022/basic-alert.mjs +4 -4
  20. package/basic-alert/types/basic-alert.d.ts +1 -1
  21. package/breadcrumb/README.md +406 -5
  22. package/breadcrumb/fesm2022/breadcrumb.mjs +34 -34
  23. package/button/README.md +453 -34
  24. package/button/fesm2022/button.mjs +96 -118
  25. package/button/types/button.d.ts +7 -10
  26. package/button-group/README.md +318 -5
  27. package/button-group/fesm2022/button-group.mjs +20 -20
  28. package/calendar/README.md +328 -34
  29. package/calendar/fesm2022/calendar.mjs +154 -154
  30. package/card/README.md +331 -5
  31. package/card/fesm2022/card.mjs +33 -33
  32. package/carousel/README.md +333 -5
  33. package/carousel/fesm2022/carousel.mjs +47 -44
  34. package/carousel/types/carousel.d.ts +1 -1
  35. package/checkbox/README.md +291 -34
  36. package/checkbox/fesm2022/checkbox.mjs +22 -20
  37. package/checkbox/types/checkbox.d.ts +5 -4
  38. package/collapsible/README.md +332 -5
  39. package/collapsible/fesm2022/collapsible.mjs +15 -15
  40. package/combobox/README.md +507 -5
  41. package/combobox/fesm2022/combobox.mjs +95 -92
  42. package/combobox/types/combobox.d.ts +1 -1
  43. package/command/README.md +435 -5
  44. package/command/fesm2022/command.mjs +56 -56
  45. package/confirmation-dialog/README.md +272 -34
  46. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +13 -12
  47. package/confirmation-dialog/types/confirmation-dialog.d.ts +9 -5
  48. package/context-menu/README.md +366 -5
  49. package/context-menu/fesm2022/context-menu.mjs +9 -9
  50. package/date-picker/README.md +436 -34
  51. package/date-picker/fesm2022/date-picker.mjs +79 -68
  52. package/date-picker/types/date-picker.d.ts +8 -4
  53. package/dialog/README.md +419 -34
  54. package/dialog/fesm2022/dialog.mjs +48 -48
  55. package/drawer/README.md +395 -5
  56. package/drawer/fesm2022/drawer.mjs +45 -45
  57. package/dropdown-menu/README.md +417 -5
  58. package/dropdown-menu/fesm2022/dropdown-menu.mjs +85 -73
  59. package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
  60. package/empty/README.md +329 -5
  61. package/empty/fesm2022/empty.mjs +31 -31
  62. package/field/README.md +385 -5
  63. package/field/fesm2022/field.mjs +59 -59
  64. package/field/types/field.d.ts +1 -1
  65. package/form-checkbox/README.md +283 -34
  66. package/form-checkbox/fesm2022/form-checkbox.mjs +37 -19
  67. package/form-checkbox/types/form-checkbox.d.ts +7 -1
  68. package/form-date-picker/README.md +293 -34
  69. package/form-date-picker/fesm2022/form-date-picker.mjs +59 -24
  70. package/form-date-picker/types/form-date-picker.d.ts +7 -1
  71. package/form-field/README.md +327 -34
  72. package/form-field/fesm2022/form-field.mjs +30 -16
  73. package/form-field/types/form-field.d.ts +28 -20
  74. package/form-field-simple/README.md +311 -34
  75. package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
  76. package/form-searchable-multiselect/README.md +332 -34
  77. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +41 -21
  78. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +8 -2
  79. package/form-select/README.md +321 -34
  80. package/form-select/fesm2022/form-select.mjs +62 -29
  81. package/form-select/types/form-select.d.ts +7 -1
  82. package/form-text-input/README.md +342 -34
  83. package/form-text-input/fesm2022/form-text-input.mjs +43 -55
  84. package/form-text-input/types/form-text-input.d.ts +9 -12
  85. package/form-textarea/README.md +318 -34
  86. package/form-textarea/fesm2022/form-textarea.mjs +42 -23
  87. package/form-textarea/types/form-textarea.d.ts +8 -1
  88. package/hover-card/README.md +256 -5
  89. package/hover-card/fesm2022/hover-card.mjs +19 -19
  90. package/icon/README.md +210 -34
  91. package/icon/fesm2022/icon.mjs +8 -8
  92. package/input/README.md +240 -34
  93. package/input/fesm2022/input.mjs +17 -12
  94. package/input/types/input.d.ts +2 -1
  95. package/input-group/README.md +335 -5
  96. package/input-group/fesm2022/input-group.mjs +37 -37
  97. package/input-group/types/input-group.d.ts +3 -3
  98. package/input-otp/README.md +375 -5
  99. package/input-otp/fesm2022/input-otp.mjs +27 -27
  100. package/item/README.md +385 -5
  101. package/item/fesm2022/item.mjs +54 -54
  102. package/kbd/README.md +291 -5
  103. package/kbd/fesm2022/kbd.mjs +13 -13
  104. package/label/README.md +243 -34
  105. package/label/fesm2022/label.mjs +9 -9
  106. package/label/types/label.d.ts +1 -1
  107. package/layout-simple/README.md +174 -44
  108. package/layout-simple/fesm2022/layout-simple.mjs +917 -398
  109. package/layout-simple/types/layout-simple.d.ts +180 -129
  110. package/menu/README.md +418 -0
  111. package/menu/fesm2022/menu.mjs +461 -0
  112. package/menu/package.json +24 -0
  113. package/menu/types/menu.d.ts +137 -0
  114. package/menubar/README.md +343 -5
  115. package/menubar/fesm2022/menubar.mjs +13 -13
  116. package/native-select/README.md +323 -5
  117. package/native-select/fesm2022/native-select.mjs +19 -19
  118. package/navigation-menu/README.md +369 -5
  119. package/navigation-menu/fesm2022/navigation-menu.mjs +37 -37
  120. package/package.json +183 -154
  121. package/pagination/README.md +388 -5
  122. package/pagination/fesm2022/pagination.mjs +63 -63
  123. package/popover/README.md +302 -34
  124. package/popover/fesm2022/popover.mjs +30 -30
  125. package/progress/README.md +311 -5
  126. package/progress/fesm2022/progress.mjs +13 -13
  127. package/radio-group/README.md +335 -34
  128. package/radio-group/fesm2022/radio-group.mjs +26 -19
  129. package/resizable/README.md +269 -5
  130. package/resizable/fesm2022/resizable.mjs +19 -19
  131. package/scroll-area/README.md +233 -5
  132. package/scroll-area/fesm2022/scroll-area.mjs +9 -9
  133. package/searchable-multiselect/README.md +294 -34
  134. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +63 -16
  135. package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
  136. package/select/README.md +408 -34
  137. package/select/fesm2022/select.mjs +80 -72
  138. package/select/types/select.d.ts +3 -1
  139. package/separator/README.md +193 -34
  140. package/separator/fesm2022/separator.mjs +9 -9
  141. package/separator/types/separator.d.ts +1 -1
  142. package/sheet/README.md +282 -34
  143. package/sheet/fesm2022/sheet.mjs +30 -30
  144. package/sidebar/README.md +457 -5
  145. package/sidebar/fesm2022/sidebar.mjs +136 -134
  146. package/sidebar/types/sidebar.d.ts +3 -3
  147. package/skeleton/README.md +217 -5
  148. package/skeleton/fesm2022/skeleton.mjs +9 -9
  149. package/slider/README.md +273 -5
  150. package/slider/fesm2022/slider.mjs +29 -25
  151. package/sonner/README.md +317 -34
  152. package/sonner/fesm2022/sonner.mjs +9 -9
  153. package/spinner/README.md +255 -34
  154. package/spinner/fesm2022/spinner.mjs +8 -8
  155. package/switch/README.md +281 -34
  156. package/switch/fesm2022/switch.mjs +12 -14
  157. package/table/README.md +423 -5
  158. package/table/fesm2022/table.mjs +41 -41
  159. package/tabs/README.md +382 -34
  160. package/tabs/fesm2022/tabs.mjs +48 -38
  161. package/textarea/README.md +282 -5
  162. package/textarea/fesm2022/textarea.mjs +9 -9
  163. package/toggle/README.md +270 -5
  164. package/toggle/fesm2022/toggle.mjs +14 -14
  165. package/toggle-group/README.md +340 -5
  166. package/toggle-group/fesm2022/toggle-group.mjs +13 -13
  167. package/toggle-group/types/toggle-group.d.ts +13 -7
  168. package/tooltip/README.md +240 -34
  169. package/tooltip/fesm2022/tooltip.mjs +14 -14
  170. package/typography/README.md +271 -5
  171. package/typography/fesm2022/typography.mjs +53 -53
  172. package/typography/types/typography.d.ts +12 -12
  173. package/utils/README.md +274 -34
  174. package/utils/fesm2022/utils.mjs +68 -44
  175. package/accordion/fesm2022/accordion.mjs.map +0 -1
  176. package/alert/fesm2022/alert.mjs.map +0 -1
  177. package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
  178. package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
  179. package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
  180. package/avatar/fesm2022/avatar.mjs.map +0 -1
  181. package/badge/fesm2022/badge.mjs.map +0 -1
  182. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  183. package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
  184. package/button/fesm2022/button.mjs.map +0 -1
  185. package/button-group/fesm2022/button-group.mjs.map +0 -1
  186. package/calendar/fesm2022/calendar.mjs.map +0 -1
  187. package/card/fesm2022/card.mjs.map +0 -1
  188. package/carousel/fesm2022/carousel.mjs.map +0 -1
  189. package/checkbox/fesm2022/checkbox.mjs.map +0 -1
  190. package/collapsible/fesm2022/collapsible.mjs.map +0 -1
  191. package/combobox/fesm2022/combobox.mjs.map +0 -1
  192. package/command/fesm2022/command.mjs.map +0 -1
  193. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
  194. package/context-menu/fesm2022/context-menu.mjs.map +0 -1
  195. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  196. package/dialog/fesm2022/dialog.mjs.map +0 -1
  197. package/drawer/fesm2022/drawer.mjs.map +0 -1
  198. package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
  199. package/empty/fesm2022/empty.mjs.map +0 -1
  200. package/field/fesm2022/field.mjs.map +0 -1
  201. package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
  202. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  203. package/form-field/fesm2022/form-field.mjs.map +0 -1
  204. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  205. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
  206. package/form-select/fesm2022/form-select.mjs.map +0 -1
  207. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  208. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  209. package/hover-card/fesm2022/hover-card.mjs.map +0 -1
  210. package/icon/fesm2022/icon.mjs.map +0 -1
  211. package/input/fesm2022/input.mjs.map +0 -1
  212. package/input-group/fesm2022/input-group.mjs.map +0 -1
  213. package/input-otp/fesm2022/input-otp.mjs.map +0 -1
  214. package/item/fesm2022/item.mjs.map +0 -1
  215. package/kbd/fesm2022/kbd.mjs.map +0 -1
  216. package/label/fesm2022/label.mjs.map +0 -1
  217. package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
  218. package/menubar/fesm2022/menubar.mjs.map +0 -1
  219. package/native-select/fesm2022/native-select.mjs.map +0 -1
  220. package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
  221. package/pagination/fesm2022/pagination.mjs.map +0 -1
  222. package/popover/fesm2022/popover.mjs.map +0 -1
  223. package/progress/fesm2022/progress.mjs.map +0 -1
  224. package/radio-group/fesm2022/radio-group.mjs.map +0 -1
  225. package/resizable/fesm2022/resizable.mjs.map +0 -1
  226. package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
  227. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
  228. package/select/fesm2022/select.mjs.map +0 -1
  229. package/separator/fesm2022/separator.mjs.map +0 -1
  230. package/sheet/fesm2022/sheet.mjs.map +0 -1
  231. package/sidebar/fesm2022/sidebar.mjs.map +0 -1
  232. package/skeleton/fesm2022/skeleton.mjs.map +0 -1
  233. package/slider/fesm2022/slider.mjs.map +0 -1
  234. package/sonner/fesm2022/sonner.mjs.map +0 -1
  235. package/spinner/fesm2022/spinner.mjs.map +0 -1
  236. package/switch/fesm2022/switch.mjs.map +0 -1
  237. package/table/fesm2022/table.mjs.map +0 -1
  238. package/tabs/fesm2022/tabs.mjs.map +0 -1
  239. package/textarea/fesm2022/textarea.mjs.map +0 -1
  240. package/toggle/fesm2022/toggle.mjs.map +0 -1
  241. package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
  242. package/tooltip/fesm2022/tooltip.mjs.map +0 -1
  243. package/typography/fesm2022/typography.mjs.map +0 -1
  244. package/utils/fesm2022/utils.mjs.map +0 -1
package/dialog/README.md CHANGED
@@ -1,64 +1,449 @@
1
- # Dialog
1
+ # Dialog (`@egose/shadcn-theme-ng/dialog`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.0.
3
+ A modal dialog in the shadcn/ui Dialog style: an overlay + centered content panel with title, description, header/footer layout slots, and declarative or programmatic opening. Equivalent to shadcn/ui `Dialog`.
4
4
 
5
- ## Code scaffolding
5
+ The Angular implementation is a thin styling layer over the headless
6
+ [`BrnDialog*` primitives from `@spartan-ng/brain/dialog`](https://www.spartan-ng.com/):
7
+ `HlmDialog` extends `BrnDialog`, trigger/close/title/description/overlay directives compose their
8
+ `Brn*` counterparts via `hostDirectives`, and `HlmDialogService` wraps `BrnDialogService` with
9
+ shadcn overlay classes. Styling is applied with `hlm()` / `classes()` from
10
+ `@egose/shadcn-theme-ng/utils`.
6
11
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
12
+ > **Ships as:** `@egose/shadcn-theme-ng/dialog` and `@egose/shadcn-theme-ng-tw/dialog`
13
+ > (the `tw:`-prefixed Tailwind variant). Both expose the identical TypeScript surface; only the
14
+ > emitted Tailwind class strings differ. See the [package README](../../README.md) for install
15
+ > steps, peer dependencies, and Tailwind setup. Do not publish this project directory independently.
16
+
17
+ ## Installation
8
18
 
9
19
  ```bash
10
- ng generate component component-name
20
+ # Plain Tailwind (no prefix)
21
+ npm install @egose/shadcn-theme-ng
22
+
23
+ # tw:-prefixed Tailwind variant
24
+ npm install @egose/shadcn-theme-ng-tw
11
25
  ```
12
26
 
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
27
+ Peer dependencies (Angular, `@spartan-ng/brain`, `@ng-icons/*`, `rxjs`, …) are documented in the
28
+ [package README](../../README.md#peer-dependencies). This subpath additionally relies at runtime on
29
+ `@egose/shadcn-theme-ng/button` (close button), `@egose/shadcn-theme-ng/utils`, and
30
+ `@ng-icons/lucide` (`lucideX`).
14
31
 
15
- ```bash
16
- ng generate --help
32
+ ## Imports
33
+
34
+ All symbols are exported from the subpath root (`projects/dialog/src/public-api.ts`):
35
+
36
+ ```ts
37
+ import {
38
+ HlmDialog,
39
+ HlmDialogContent,
40
+ HlmDialogTrigger,
41
+ HlmDialogClose,
42
+ HlmDialogOverlay,
43
+ HlmDialogPortal,
44
+ HlmDialogTitle,
45
+ HlmDialogDescription,
46
+ HlmDialogHeader,
47
+ HlmDialogFooter,
48
+ HlmDialogService,
49
+ HlmDialogImports,
50
+ HlmDialogModule,
51
+ hlmDialogOverlayClass,
52
+ } from '@egose/shadcn-theme-ng/dialog';
53
+ // tw variant: replace with '@egose/shadcn-theme-ng-tw/dialog'
17
54
  ```
18
55
 
19
- ## Building
56
+ Standalone component — spread the `*Imports` array:
20
57
 
21
- To build the library, run:
58
+ ```ts
59
+ import { Component } from '@angular/core';
60
+ import { HlmDialogImports } from '@egose/shadcn-theme-ng/dialog';
22
61
 
23
- ```bash
24
- ng build dialog
62
+ @Component({
63
+ selector: 'app-demo',
64
+ standalone: true,
65
+ imports: [...HlmDialogImports],
66
+ template: `...`,
67
+ })
68
+ export class DemoComponent {}
25
69
  ```
26
70
 
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
71
+ NgModule-based consumer — import the module:
28
72
 
29
- ### Publishing the Library
73
+ ```ts
74
+ import { NgModule } from '@angular/core';
75
+ import { HlmDialogModule } from '@egose/shadcn-theme-ng/dialog';
30
76
 
31
- Once the project is built, you can publish your library by following these steps:
77
+ @NgModule({ imports: [HlmDialogModule] })
78
+ export class DemoModule {}
79
+ ```
32
80
 
33
- 1. Navigate to the `dist` directory:
81
+ `HlmDialogService` is `providedIn: 'root'` — just inject it, no module setup needed.
34
82
 
35
- ```bash
36
- cd dist/dialog
37
- ```
83
+ ## Anatomy / Structure
38
84
 
39
- 2. Run the `npm publish` command to publish your library to the npm registry:
40
- ```bash
41
- npm publish
42
- ```
85
+ ```html
86
+ <hlm-dialog>
87
+ <button hlmBtn hlmDialogTrigger>Edit profile</button>
43
88
 
44
- ## Running unit tests
89
+ <hlm-dialog-content>
90
+ <div hlmDialogHeader>
91
+ <h2 hlmDialogTitle>Edit profile</h2>
92
+ <p hlmDialogDescription>Make changes here. Click save when done.</p>
93
+ </div>
45
94
 
46
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
95
+ <p>Dialog body…</p>
47
96
 
48
- ```bash
49
- ng test
97
+ <div hlmDialogFooter>
98
+ <button hlmBtn variant="outline" hlmDialogClose>Cancel</button>
99
+ <button hlmBtn type="submit">Save</button>
100
+ </div>
101
+ </hlm-dialog-content>
102
+ </hlm-dialog>
50
103
  ```
51
104
 
52
- ## Running end-to-end tests
105
+ Real selectors (from source):
53
106
 
54
- For end-to-end (e2e) testing, run:
107
+ | Class | Selector(s) | Kind |
108
+ | ---------------------- | ------------------------------------------------------- | ------------------------------- |
109
+ | `HlmDialog` | `hlm-dialog` | Component (extends `BrnDialog`) |
110
+ | `HlmDialogContent` | `hlm-dialog-content` | Component |
111
+ | `HlmDialogTrigger` | `button[hlmDialogTrigger], button[hlmDialogTriggerFor]` | Directive (thin wrapper) |
112
+ | `HlmDialogClose` | `button[hlmDialogClose]` | Directive (thin wrapper) |
113
+ | `HlmDialogOverlay` | `[hlmDialogOverlay], hlm-dialog-overlay` | Directive |
114
+ | `HlmDialogPortal` | `[hlmDialogPortal]` | Directive |
115
+ | `HlmDialogTitle` | `[hlmDialogTitle]` | Directive |
116
+ | `HlmDialogDescription` | `[hlmDialogDescription]` | Directive |
117
+ | `HlmDialogHeader` | `[hlmDialogHeader], hlm-dialog-header` | Directive |
118
+ | `HlmDialogFooter` | `[hlmDialogFooter], hlm-dialog-footer` | Directive |
55
119
 
56
- ```bash
57
- ng e2e
120
+ ## API reference
121
+
122
+ ### `HlmDialog` — `hlm-dialog`
123
+
124
+ Root dialog state host. Extends `BrnDialog` (inherits its open/close state, ids, and context). Renders `<hlm-dialog-overlay />` plus projected content. `exportAs: 'hlmDialog'`.
125
+
126
+ No new inputs/outputs — configure via `BrnDialog` API and `provideBrnDialogDefaultOptions`.
127
+
128
+ ### `HlmDialogContent` — `hlm-dialog-content`
129
+
130
+ The centered panel. Renders either a dynamically-opened component (`HlmDialogService`) or projected content, plus an optional built-in close button.
131
+
132
+ | Input | Type | Default | Description |
133
+ | ----------------- | --------- | ------------------------------------ | ------------------------------------------------ |
134
+ | `showCloseButton` | `boolean` | context `$showCloseButton` ?? `true` | Show the top-right ghost `lucideX` close button. |
135
+
136
+ | Member | Description |
137
+ | ----------- | ------------------------------------------------------------------------------------ |
138
+ | `state` | `computed` — current dialog state (`'open' \| 'closed'`, from `BrnDialogRef`). |
139
+ | `component` | Dynamically rendered component when opened via `HlmDialogService`, else `undefined`. |
140
+
141
+ Host sets `data-slot="dialog-content"` and `data-state`.
142
+
143
+ ### `HlmDialogTrigger` — `button[hlmDialogTrigger], button[hlmDialogTriggerFor]`
144
+
145
+ Thin directive wrapper. Forwards via `hostDirectives`: `id`, `brnDialogTriggerFor: hlmDialogTriggerFor`, `type` to `BrnDialogTrigger`. Use `hlmDialogTriggerFor` to target an explicit dialog template/context.
146
+
147
+ ### `HlmDialogClose` — `button[hlmDialogClose]`
148
+
149
+ Thin directive wrapper around `BrnDialogClose`. Place on any `<button>` inside the dialog to close it.
150
+
151
+ ### `HlmDialogOverlay` — `[hlmDialogOverlay], hlm-dialog-overlay`
152
+
153
+ Overlay backdrop. Wraps `BrnDialogOverlay`; merges `class` via `hlm()`.
154
+
155
+ | Input | Type | Default | Description |
156
+ | ------- | ------------ | ------- | -------------------------------------------------- |
157
+ | `class` | `ClassValue` | `''` | Extra classes merged over `hlmDialogOverlayClass`. |
158
+
159
+ Exported const `hlmDialogOverlayClass` holds the base overlay classes (also reused by `HlmDialogService` for programmatic dialogs).
160
+
161
+ ### `HlmDialogPortal` — `[hlmDialogPortal]`
162
+
163
+ Thin wrapper forwarding `context` and `class` inputs to `BrnDialogContent` for portal-based content.
164
+
165
+ ### `HlmDialogTitle` — `[hlmDialogTitle]`
166
+
167
+ Title text. Wraps `BrnDialogTitle` (accessible labelling) + shadcn typography. No inputs.
168
+
169
+ ### `HlmDialogDescription` — `[hlmDialogDescription]`
170
+
171
+ Description text. Wraps `BrnDialogDescription` (accessible description) + muted styling. No inputs.
172
+
173
+ ### `HlmDialogHeader` / `HlmDialogFooter`
174
+
175
+ Pure layout directives, no inputs. Header: vertical stack; footer: reversed column on mobile, right-aligned row on `sm+`.
176
+
177
+ ### `HlmDialogService`
178
+
179
+ ```ts
180
+ export type HlmDialogOptions<DialogContext = unknown> = BrnDialogOptions & {
181
+ contentClass?: string;
182
+ showCloseButton?: boolean;
183
+ context?: DialogContext;
184
+ };
185
+
186
+ open<TResult = unknown, TContext = unknown>(
187
+ component: ComponentType<unknown> | TemplateRef<unknown>,
188
+ options?: Partial<HlmDialogOptions<TContext>>,
189
+ ): BrnDialogRef<TResult>
190
+ ```
191
+
192
+ Merges `backdropClass` with `hlmDialogOverlayClass`, forwards `contentClass` as `$dynamicComponentClass` and `showCloseButton` / custom `context` into `HlmDialogContent`, then delegates to `BrnDialogService.open`.
193
+
194
+ ## Examples
195
+
196
+ ### 1. Basic declarative dialog
197
+
198
+ ```ts
199
+ import { Component } from '@angular/core';
200
+ import { HlmDialogImports } from '@egose/shadcn-theme-ng/dialog';
201
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
202
+
203
+ @Component({
204
+ selector: 'app-basic-dialog',
205
+ standalone: true,
206
+ imports: [...HlmDialogImports, HlmButton],
207
+ template: `
208
+ <hlm-dialog>
209
+ <button hlmBtn variant="outline" hlmDialogTrigger>Open dialog</button>
210
+ <hlm-dialog-content>
211
+ <div hlmDialogHeader>
212
+ <h2 hlmDialogTitle>Are you sure?</h2>
213
+ <p hlmDialogDescription>This action cannot be undone.</p>
214
+ </div>
215
+ <div hlmDialogFooter>
216
+ <button hlmBtn variant="outline" hlmDialogClose>Cancel</button>
217
+ <button hlmBtn (click)="confirm()">Continue</button>
218
+ </div>
219
+ </hlm-dialog-content>
220
+ </hlm-dialog>
221
+ `,
222
+ })
223
+ export class BasicDialogComponent {
224
+ confirm() {
225
+ console.log('confirmed');
226
+ }
227
+ }
228
+ ```
229
+
230
+ ### 2. Form dialog with header/footer layout
231
+
232
+ ```ts
233
+ import { Component, inject } from '@angular/core';
234
+ import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';
235
+ import { HlmDialogImports } from '@egose/shadcn-theme-ng/dialog';
236
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
237
+ import { HlmLabel } from '@egose/shadcn-theme-ng/label';
238
+ import { HlmInput } from '@egose/shadcn-theme-ng/input';
239
+
240
+ @Component({
241
+ selector: 'app-form-dialog',
242
+ standalone: true,
243
+ imports: [ReactiveFormsModule, HlmLabel, HlmInput, HlmButton, ...HlmDialogImports],
244
+ template: `
245
+ <hlm-dialog>
246
+ <button hlmBtn hlmDialogTrigger>Edit profile</button>
247
+ <hlm-dialog-content>
248
+ <div hlmDialogHeader>
249
+ <h2 hlmDialogTitle>Edit profile</h2>
250
+ <p hlmDialogDescription>Make changes to your profile here.</p>
251
+ </div>
252
+ <form [formGroup]="form" class="tw:grid tw:gap-4">
253
+ <label hlmLabel for="name">Name</label>
254
+ <input hlmInput id="name" formControlName="name" />
255
+ </form>
256
+ <div hlmDialogFooter>
257
+ <button hlmBtn variant="outline" hlmDialogClose>Cancel</button>
258
+ <button hlmBtn hlmDialogClose [disabled]="form.invalid" (click)="save()">Save</button>
259
+ </div>
260
+ </hlm-dialog-content>
261
+ </hlm-dialog>
262
+ `,
263
+ })
264
+ export class FormDialogComponent {
265
+ private readonly fb = inject(FormBuilder);
266
+ readonly form = this.fb.group({ name: ['', Validators.required] });
267
+ save() {
268
+ console.log(this.form.value);
269
+ }
270
+ }
271
+ ```
272
+
273
+ ### 3. Programmatic dialog via `HlmDialogService`
274
+
275
+ ```ts
276
+ import { Component, inject } from '@angular/core';
277
+ import { HlmDialogService } from '@egose/shadcn-theme-ng/dialog';
278
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
279
+ import { ConfirmDialogComponent } from './confirm-dialog.component';
280
+
281
+ @Component({
282
+ selector: 'app-service-dialog',
283
+ standalone: true,
284
+ imports: [HlmButton],
285
+ template: `<button hlmBtn variant="destructive" (click)="open()">Delete item</button>`,
286
+ })
287
+ export class ServiceDialogComponent {
288
+ private readonly dialogs = inject(HlmDialogService);
289
+
290
+ open() {
291
+ const ref = this.dialogs.open(ConfirmDialogComponent, {
292
+ contentClass: 'tw:max-w-sm',
293
+ showCloseButton: true,
294
+ context: { itemName: 'Report.pdf' },
295
+ });
296
+ ref.closed$.subscribe((result) => console.log('dialog closed with', result));
297
+ }
298
+ }
299
+ ```
300
+
301
+ ```ts
302
+ // confirm-dialog.component.ts — rendered inside hlm-dialog-content
303
+ import { Component, inject } from '@angular/core';
304
+ import { BrnDialogRef, injectBrnDialogContext } from '@spartan-ng/brain/dialog';
305
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
306
+ import { HlmDialogClose } from '@egose/shadcn-theme-ng/dialog';
307
+
308
+ @Component({
309
+ selector: 'app-confirm-dialog',
310
+ standalone: true,
311
+ imports: [HlmButton, HlmDialogClose],
312
+ template: `
313
+ <h2 class="tw:font-medium">Delete {{ ctx?.itemName }}?</h2>
314
+ <p class="tw:text-muted-foreground tw:text-sm">This cannot be undone.</p>
315
+ <div class="tw:flex tw:justify-end tw:gap-2">
316
+ <button hlmBtn variant="outline" hlmDialogClose>Cancel</button>
317
+ <button hlmBtn variant="destructive" (click)="confirm()">Delete</button>
318
+ </div>
319
+ `,
320
+ })
321
+ export class ConfirmDialogComponent {
322
+ private readonly ref = inject(BrnDialogRef);
323
+ readonly ctx = injectBrnDialogContext<{ itemName?: string }>().itemName
324
+ ? injectBrnDialogContext<{ itemName?: string }>()
325
+ : null;
326
+ confirm() {
327
+ this.ref.close('confirmed');
328
+ }
329
+ }
58
330
  ```
59
331
 
60
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
332
+ ### 4. Template-driven programmatic dialog
333
+
334
+ ```ts
335
+ import { Component, inject, TemplateRef, viewChild } from '@angular/core';
336
+ import { HlmDialogService } from '@egose/shadcn-theme-ng/dialog';
337
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
338
+
339
+ @Component({
340
+ selector: 'app-template-dialog',
341
+ standalone: true,
342
+ imports: [HlmButton],
343
+ template: `
344
+ <button hlmBtn variant="outline" (click)="open()">Show details</button>
345
+ <ng-template #details>
346
+ <h2 class="tw:font-medium">Order #1234</h2>
347
+ <p class="tw:text-muted-foreground tw:text-sm">Ships tomorrow.</p>
348
+ </ng-template>
349
+ `,
350
+ })
351
+ export class TemplateDialogComponent {
352
+ private readonly dialogs = inject(HlmDialogService);
353
+ readonly tpl = viewChild.required('details', { read: TemplateRef });
354
+ open() {
355
+ this.dialogs.open(this.tpl(), { showCloseButton: false });
356
+ }
357
+ }
358
+ ```
359
+
360
+ ### 5. No close button + custom overlay styling
361
+
362
+ ```ts
363
+ import { Component } from '@angular/core';
364
+ import { HlmDialogImports } from '@egose/shadcn-theme-ng/dialog';
365
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
366
+
367
+ @Component({
368
+ selector: 'app-custom-dialog',
369
+ standalone: true,
370
+ imports: [...HlmDialogImports, HlmButton],
371
+ template: `
372
+ <hlm-dialog>
373
+ <button hlmBtn hlmDialogTrigger>Onboarding</button>
374
+ <hlm-dialog-content [showCloseButton]="false" class="tw:max-w-lg">
375
+ <div hlmDialogHeader>
376
+ <h2 hlmDialogTitle>Welcome!</h2>
377
+ <p hlmDialogDescription>You must accept to continue.</p>
378
+ </div>
379
+ <div hlmDialogFooter>
380
+ <button hlmBtn hlmDialogClose>Accept</button>
381
+ </div>
382
+ </hlm-dialog-content>
383
+ </hlm-dialog>
384
+ `,
385
+ })
386
+ export class CustomDialogComponent {}
387
+ ```
388
+
389
+ ### 6. Async delete with loading state
390
+
391
+ ```ts
392
+ import { Component, inject, signal } from '@angular/core';
393
+ import { HlmDialogImports, HlmDialogService } from '@egose/shadcn-theme-ng/dialog';
394
+ import { HlmButton } from '@egose/shadcn-theme-ng/button';
395
+ import { HlmSpinner } from '@egose/shadcn-theme-ng/spinner';
396
+
397
+ @Component({
398
+ selector: 'app-async-dialog',
399
+ standalone: true,
400
+ imports: [...HlmDialogImports, HlmButton, HlmSpinner],
401
+ template: `
402
+ <hlm-dialog>
403
+ <button hlmBtn variant="destructive" hlmDialogTrigger>Delete project</button>
404
+ <hlm-dialog-content>
405
+ <div hlmDialogHeader>
406
+ <h2 hlmDialogTitle>Delete project?</h2>
407
+ <p hlmDialogDescription>Type DELETE is not needed — just confirm.</p>
408
+ </div>
409
+ <div hlmDialogFooter>
410
+ <button hlmBtn variant="outline" hlmDialogClose [disabled]="busy()">Cancel</button>
411
+ <button hlmBtn variant="destructive" [disabled]="busy()" (click)="remove()">
412
+ @if (busy()) {
413
+ <hlm-spinner class="tw:size-4" />
414
+ }
415
+ Delete
416
+ </button>
417
+ </div>
418
+ </hlm-dialog-content>
419
+ </hlm-dialog>
420
+ `,
421
+ })
422
+ export class AsyncDialogComponent {
423
+ readonly busy = signal(false);
424
+ async remove() {
425
+ this.busy.set(true);
426
+ await new Promise((r) => setTimeout(r, 1000));
427
+ this.busy.set(false);
428
+ console.log('deleted');
429
+ }
430
+ }
431
+ ```
432
+
433
+ ## Accessibility notes
434
+
435
+ - `hlmDialogTitle` maps to `BrnDialogTitle` and `hlmDialogDescription` to `BrnDialogDescription`, wiring `aria-labelledby` / `aria-describedby` on the dialog — always include both.
436
+ - Focus is trapped inside the open dialog and restored to the trigger on close (brain behavior); escape closes by default.
437
+ - The built-in close button includes a visually-hidden `"close"` label plus the `lucideX` icon; keep `showCloseButton` unless you provide an equivalent labelled close control.
438
+ - The overlay is a separate `BrnDialogOverlay` element; screen-reader users hear the dialog role and label, not the backdrop.
439
+
440
+ ## Theming / CSS variables
441
+
442
+ No component-specific CSS variables. The panel, overlay (`hlmDialogOverlayClass`), and `data-state` animations derive from global shadcn tokens (`--popover`, `--muted`, `--ring`, …). Extend via the `class` input on `hlm-dialog-content` / overlay or `contentClass` in `HlmDialogService.open`.
61
443
 
62
- ## Additional Resources
444
+ ## Related subpaths
63
445
 
64
- For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
446
+ - `@egose/shadcn-theme-ng/alert-dialog` — blocking confirmation variant with explicit action/cancel slots.
447
+ - `@egose/shadcn-theme-ng/sheet` — side-anchored dialog alternative.
448
+ - `@egose/shadcn-theme-ng/drawer` — bottom/side swipeable panel built on the same brain dialog core.
449
+ - `@egose/shadcn-theme-ng/button` — `hlmBtn` triggers and footer actions.