@egose/shadcn-theme-ng 0.0.28 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +130 -13
  2. package/accordion/README.md +376 -34
  3. package/accordion/fesm2022/accordion.mjs +27 -39
  4. package/alert/README.md +343 -34
  5. package/alert/fesm2022/alert.mjs +47 -47
  6. package/alert-dialog/README.md +471 -5
  7. package/alert-dialog/fesm2022/alert-dialog.mjs +47 -47
  8. package/aspect-ratio/README.md +272 -5
  9. package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
  10. package/autocomplete/README.md +473 -34
  11. package/autocomplete/fesm2022/autocomplete.mjs +53 -71
  12. package/avatar/README.md +357 -5
  13. package/avatar/fesm2022/avatar.mjs +32 -32
  14. package/badge/README.md +289 -34
  15. package/badge/fesm2022/badge.mjs +57 -57
  16. package/basic-alert/README.md +324 -34
  17. package/basic-alert/fesm2022/basic-alert.mjs +6 -18
  18. package/breadcrumb/README.md +406 -5
  19. package/breadcrumb/fesm2022/breadcrumb.mjs +33 -39
  20. package/button/README.md +453 -34
  21. package/button/fesm2022/button.mjs +147 -219
  22. package/button/types/button.d.ts +7 -10
  23. package/button-group/README.md +318 -5
  24. package/button-group/fesm2022/button-group.mjs +20 -20
  25. package/calendar/README.md +328 -34
  26. package/calendar/fesm2022/calendar.mjs +29 -743
  27. package/card/README.md +331 -5
  28. package/card/fesm2022/card.mjs +33 -33
  29. package/carousel/README.md +333 -5
  30. package/carousel/fesm2022/carousel.mjs +39 -78
  31. package/checkbox/README.md +291 -34
  32. package/checkbox/fesm2022/checkbox.mjs +20 -58
  33. package/checkbox/types/checkbox.d.ts +5 -4
  34. package/collapsible/README.md +332 -5
  35. package/collapsible/fesm2022/collapsible.mjs +15 -15
  36. package/combobox/README.md +507 -5
  37. package/combobox/fesm2022/combobox.mjs +91 -224
  38. package/command/README.md +435 -5
  39. package/command/fesm2022/command.mjs +49 -109
  40. package/confirmation-dialog/README.md +272 -34
  41. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +15 -40
  42. package/confirmation-dialog/types/confirmation-dialog.d.ts +8 -4
  43. package/context-menu/README.md +366 -5
  44. package/context-menu/fesm2022/context-menu.mjs +9 -9
  45. package/date-picker/README.md +436 -34
  46. package/date-picker/fesm2022/date-picker.mjs +64 -267
  47. package/date-picker/types/date-picker.d.ts +7 -3
  48. package/dialog/README.md +419 -34
  49. package/dialog/fesm2022/dialog.mjs +45 -71
  50. package/drawer/README.md +395 -5
  51. package/drawer/fesm2022/drawer.mjs +44 -54
  52. package/dropdown-menu/README.md +417 -5
  53. package/dropdown-menu/fesm2022/dropdown-menu.mjs +82 -70
  54. package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
  55. package/empty/README.md +329 -5
  56. package/empty/fesm2022/empty.mjs +30 -30
  57. package/field/README.md +385 -5
  58. package/field/fesm2022/field.mjs +56 -72
  59. package/form-checkbox/README.md +283 -34
  60. package/form-checkbox/fesm2022/form-checkbox.mjs +25 -85
  61. package/form-checkbox/types/form-checkbox.d.ts +7 -1
  62. package/form-date-picker/README.md +293 -34
  63. package/form-date-picker/fesm2022/form-date-picker.mjs +31 -84
  64. package/form-date-picker/types/form-date-picker.d.ts +7 -1
  65. package/form-field/README.md +327 -34
  66. package/form-field/fesm2022/form-field.mjs +33 -19
  67. package/form-field/types/form-field.d.ts +28 -20
  68. package/form-field-simple/README.md +311 -34
  69. package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
  70. package/form-searchable-multiselect/README.md +332 -34
  71. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +31 -91
  72. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +7 -1
  73. package/form-select/README.md +321 -34
  74. package/form-select/fesm2022/form-select.mjs +32 -149
  75. package/form-select/types/form-select.d.ts +7 -1
  76. package/form-text-input/README.md +342 -34
  77. package/form-text-input/fesm2022/form-text-input.mjs +35 -149
  78. package/form-text-input/types/form-text-input.d.ts +9 -12
  79. package/form-textarea/README.md +318 -34
  80. package/form-textarea/fesm2022/form-textarea.mjs +34 -109
  81. package/form-textarea/types/form-textarea.d.ts +8 -1
  82. package/hover-card/README.md +256 -5
  83. package/hover-card/fesm2022/hover-card.mjs +19 -19
  84. package/icon/README.md +210 -34
  85. package/icon/fesm2022/icon.mjs +8 -8
  86. package/input/README.md +240 -34
  87. package/input/fesm2022/input.mjs +17 -12
  88. package/input/types/input.d.ts +2 -1
  89. package/input-group/README.md +335 -5
  90. package/input-group/fesm2022/input-group.mjs +34 -34
  91. package/input-otp/README.md +375 -5
  92. package/input-otp/fesm2022/input-otp.mjs +26 -26
  93. package/item/README.md +385 -5
  94. package/item/fesm2022/item.mjs +53 -53
  95. package/kbd/README.md +291 -5
  96. package/kbd/fesm2022/kbd.mjs +12 -12
  97. package/label/README.md +243 -34
  98. package/label/fesm2022/label.mjs +10 -10
  99. package/label/types/label.d.ts +1 -1
  100. package/layout-simple/README.md +174 -44
  101. package/layout-simple/fesm2022/layout-simple.mjs +508 -603
  102. package/layout-simple/types/layout-simple.d.ts +179 -128
  103. package/menu/README.md +418 -0
  104. package/menu/fesm2022/menu.mjs +455 -0
  105. package/menu/package.json +24 -0
  106. package/menu/types/menu.d.ts +137 -0
  107. package/menubar/README.md +343 -5
  108. package/menubar/fesm2022/menubar.mjs +13 -13
  109. package/native-select/README.md +323 -5
  110. package/native-select/fesm2022/native-select.mjs +19 -19
  111. package/navigation-menu/README.md +369 -5
  112. package/navigation-menu/fesm2022/navigation-menu.mjs +35 -47
  113. package/package.json +183 -154
  114. package/pagination/README.md +388 -5
  115. package/pagination/fesm2022/pagination.mjs +45 -331
  116. package/popover/README.md +302 -34
  117. package/popover/fesm2022/popover.mjs +30 -30
  118. package/progress/README.md +311 -5
  119. package/progress/fesm2022/progress.mjs +13 -13
  120. package/radio-group/README.md +335 -34
  121. package/radio-group/fesm2022/radio-group.mjs +26 -19
  122. package/radio-group/types/radio-group.d.ts +1 -1
  123. package/resizable/README.md +269 -5
  124. package/resizable/fesm2022/resizable.mjs +18 -26
  125. package/scroll-area/README.md +233 -5
  126. package/scroll-area/fesm2022/scroll-area.mjs +9 -9
  127. package/searchable-multiselect/README.md +294 -34
  128. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +28 -117
  129. package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
  130. package/select/README.md +408 -34
  131. package/select/fesm2022/select.mjs +71 -111
  132. package/select/types/select.d.ts +3 -1
  133. package/separator/README.md +193 -34
  134. package/separator/fesm2022/separator.mjs +9 -9
  135. package/separator/types/separator.d.ts +1 -1
  136. package/sheet/README.md +282 -34
  137. package/sheet/fesm2022/sheet.mjs +41 -53
  138. package/sidebar/README.md +457 -5
  139. package/sidebar/fesm2022/sidebar.mjs +125 -227
  140. package/skeleton/README.md +217 -5
  141. package/skeleton/fesm2022/skeleton.mjs +9 -9
  142. package/slider/README.md +273 -5
  143. package/slider/fesm2022/slider.mjs +10 -80
  144. package/sonner/README.md +317 -34
  145. package/sonner/fesm2022/sonner.mjs +13 -13
  146. package/spinner/README.md +255 -34
  147. package/spinner/fesm2022/spinner.mjs +11 -11
  148. package/switch/README.md +281 -34
  149. package/switch/fesm2022/switch.mjs +13 -15
  150. package/table/README.md +423 -5
  151. package/table/fesm2022/table.mjs +41 -41
  152. package/tabs/README.md +382 -34
  153. package/tabs/fesm2022/tabs.mjs +35 -111
  154. package/textarea/README.md +282 -5
  155. package/textarea/fesm2022/textarea.mjs +9 -9
  156. package/toggle/README.md +270 -5
  157. package/toggle/fesm2022/toggle.mjs +13 -13
  158. package/toggle-group/README.md +340 -5
  159. package/toggle-group/fesm2022/toggle-group.mjs +13 -13
  160. package/toggle-group/types/toggle-group.d.ts +13 -7
  161. package/tooltip/README.md +240 -34
  162. package/tooltip/fesm2022/tooltip.mjs +14 -14
  163. package/typography/README.md +271 -5
  164. package/typography/fesm2022/typography.mjs +53 -53
  165. package/typography/types/typography.d.ts +19 -19
  166. package/utils/README.md +274 -34
  167. package/utils/fesm2022/utils.mjs +68 -44
  168. package/accordion/fesm2022/accordion.mjs.map +0 -1
  169. package/alert/fesm2022/alert.mjs.map +0 -1
  170. package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
  171. package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
  172. package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
  173. package/avatar/fesm2022/avatar.mjs.map +0 -1
  174. package/badge/fesm2022/badge.mjs.map +0 -1
  175. package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
  176. package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
  177. package/button/fesm2022/button.mjs.map +0 -1
  178. package/button-group/fesm2022/button-group.mjs.map +0 -1
  179. package/calendar/fesm2022/calendar.mjs.map +0 -1
  180. package/card/fesm2022/card.mjs.map +0 -1
  181. package/carousel/fesm2022/carousel.mjs.map +0 -1
  182. package/checkbox/fesm2022/checkbox.mjs.map +0 -1
  183. package/collapsible/fesm2022/collapsible.mjs.map +0 -1
  184. package/combobox/fesm2022/combobox.mjs.map +0 -1
  185. package/command/fesm2022/command.mjs.map +0 -1
  186. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
  187. package/context-menu/fesm2022/context-menu.mjs.map +0 -1
  188. package/date-picker/fesm2022/date-picker.mjs.map +0 -1
  189. package/dialog/fesm2022/dialog.mjs.map +0 -1
  190. package/drawer/fesm2022/drawer.mjs.map +0 -1
  191. package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
  192. package/empty/fesm2022/empty.mjs.map +0 -1
  193. package/field/fesm2022/field.mjs.map +0 -1
  194. package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
  195. package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
  196. package/form-field/fesm2022/form-field.mjs.map +0 -1
  197. package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
  198. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
  199. package/form-select/fesm2022/form-select.mjs.map +0 -1
  200. package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
  201. package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
  202. package/hover-card/fesm2022/hover-card.mjs.map +0 -1
  203. package/icon/fesm2022/icon.mjs.map +0 -1
  204. package/input/fesm2022/input.mjs.map +0 -1
  205. package/input-group/fesm2022/input-group.mjs.map +0 -1
  206. package/input-otp/fesm2022/input-otp.mjs.map +0 -1
  207. package/item/fesm2022/item.mjs.map +0 -1
  208. package/kbd/fesm2022/kbd.mjs.map +0 -1
  209. package/label/fesm2022/label.mjs.map +0 -1
  210. package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
  211. package/menubar/fesm2022/menubar.mjs.map +0 -1
  212. package/native-select/fesm2022/native-select.mjs.map +0 -1
  213. package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
  214. package/pagination/fesm2022/pagination.mjs.map +0 -1
  215. package/popover/fesm2022/popover.mjs.map +0 -1
  216. package/progress/fesm2022/progress.mjs.map +0 -1
  217. package/radio-group/fesm2022/radio-group.mjs.map +0 -1
  218. package/resizable/fesm2022/resizable.mjs.map +0 -1
  219. package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
  220. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
  221. package/select/fesm2022/select.mjs.map +0 -1
  222. package/separator/fesm2022/separator.mjs.map +0 -1
  223. package/sheet/fesm2022/sheet.mjs.map +0 -1
  224. package/sidebar/fesm2022/sidebar.mjs.map +0 -1
  225. package/skeleton/fesm2022/skeleton.mjs.map +0 -1
  226. package/slider/fesm2022/slider.mjs.map +0 -1
  227. package/sonner/fesm2022/sonner.mjs.map +0 -1
  228. package/spinner/fesm2022/spinner.mjs.map +0 -1
  229. package/switch/fesm2022/switch.mjs.map +0 -1
  230. package/table/fesm2022/table.mjs.map +0 -1
  231. package/tabs/fesm2022/tabs.mjs.map +0 -1
  232. package/textarea/fesm2022/textarea.mjs.map +0 -1
  233. package/toggle/fesm2022/toggle.mjs.map +0 -1
  234. package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
  235. package/tooltip/fesm2022/tooltip.mjs.map +0 -1
  236. package/typography/fesm2022/typography.mjs.map +0 -1
  237. package/utils/fesm2022/utils.mjs.map +0 -1
@@ -1,64 +1,223 @@
1
- # Separator
1
+ # Separator (`@egose/shadcn-theme-ng/separator`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.0.
3
+ A shadcn/ui-style **Separator** — a thin horizontal or vertical divider line between content. This is the Angular equivalent of shadcn/ui `Separator`.
4
4
 
5
- ## Code scaffolding
5
+ It is a thin directive wrapper over `BrnSeparator` from **spartan-ng/brain** (which supplies the `separator` role semantics, orientation handling, and the `decorative` flag). Styling is a 1px `bg-border` line that stretches horizontally or vertically based on `data-[orientation]`-style state attributes.
6
6
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
7
+ > **Ships as:** `@egose/shadcn-theme-ng/separator` and `@egose/shadcn-theme-ng-tw/separator` (the `tw:`-prefixed Tailwind variant — same API, class strings prefixed with `tw:`).
8
+ > See the [package README](../../README.md) for installation, peer dependencies, and Tailwind setup. Do not publish this project directory independently.
9
+
10
+ ## Installation
8
11
 
9
12
  ```bash
10
- ng generate component component-name
13
+ # Plain Tailwind (no prefix)
14
+ npm install @egose/shadcn-theme-ng
15
+
16
+ # Or the tw:-prefixed variant
17
+ npm install @egose/shadcn-theme-ng-tw
11
18
  ```
12
19
 
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
20
+ ```ts
21
+ import { HlmSeparatorImports } from '@egose/shadcn-theme-ng/separator';
22
+ // tw variant:
23
+ // import { HlmSeparatorImports } from '@egose/shadcn-theme-ng-tw/separator';
24
+ ```
14
25
 
15
- ```bash
16
- ng generate --help
26
+ Peer dependencies (see [package README](../../README.md) for versions): `@angular/core`, `@angular/common`.
27
+
28
+ ## Imports
29
+
30
+ Real exported symbols (from `src/public-api.ts` plus `lib/hlm-separator.ts`):
31
+
32
+ | Symbol | Kind | Description |
33
+ | --------------------- | -------------- | --------------------------------------------------------------------------- |
34
+ | `HlmSeparator` | Directive | The divider; selector `[hlmSeparator],hlm-separator` |
35
+ | `hlmSeparatorClass` | `const string` | The raw class string the directive applies — reuse it for custom separators |
36
+ | `HlmSeparatorImports` | `const` array | `[HlmSeparator]` standalone imports |
37
+ | `HlmSeparatorModule` | `NgModule` | NgModule wrapper re-exporting `HlmSeparator` |
38
+
39
+ Standalone usage:
40
+
41
+ ```ts
42
+ import { Component } from '@angular/core';
43
+ import { HlmSeparatorImports } from '@egose/shadcn-theme-ng/separator';
44
+
45
+ @Component({
46
+ selector: 'app-demo',
47
+ standalone: true,
48
+ imports: [HlmSeparatorImports],
49
+ template: `
50
+ <p>Above</p>
51
+ <hlm-separator />
52
+ <p>Below</p>
53
+ `,
54
+ })
55
+ export class DemoComponent {}
17
56
  ```
18
57
 
19
- ## Building
58
+ NgModule usage:
20
59
 
21
- To build the library, run:
60
+ ```ts
61
+ import { NgModule } from '@angular/core';
62
+ import { HlmSeparatorModule } from '@egose/shadcn-theme-ng/separator';
22
63
 
23
- ```bash
24
- ng build separator
64
+ @NgModule({ imports: [HlmSeparatorModule] })
65
+ export class DemoModule {}
25
66
  ```
26
67
 
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
68
+ ## Anatomy / Structure
28
69
 
29
- ### Publishing the Library
70
+ ```html
71
+ <div>
72
+ <h4>Account</h4>
73
+ <p class="tw:text-muted-foreground tw:text-sm">Manage your settings.</p>
74
+ </div>
30
75
 
31
- Once the project is built, you can publish your library by following these steps:
76
+ <hlm-separator class="tw:my-4" />
32
77
 
33
- 1. Navigate to the `dist` directory:
78
+ <div>
79
+ <h4>Notifications</h4>
80
+ </div>
81
+ ```
34
82
 
35
- ```bash
36
- cd dist/separator
37
- ```
83
+ Real selectors:
38
84
 
39
- 2. Run the `npm publish` command to publish your library to the npm registry:
40
- ```bash
41
- npm publish
42
- ```
85
+ | Selector | Class | Notes |
86
+ | ------------------------------ | -------------- | -------------------------------------------------------------------- |
87
+ | `[hlmSeparator],hlm-separator` | `HlmSeparator` | `data-slot="separator"`; inline-flex 1px line, horizontal by default |
43
88
 
44
- ## Running unit tests
89
+ ## API reference
45
90
 
46
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
91
+ ### HlmSeparator (directive)
47
92
 
48
- ```bash
49
- ng test
93
+ Thin wrapper — no own inputs. Forwarded `BrnSeparator` bindings:
94
+
95
+ | Binding | Kind | Description |
96
+ | ------------- | ----- | ---------------------------------------------------------------------------------------- |
97
+ | `orientation` | input | `'horizontal' \| 'vertical'` — line direction (default horizontal) |
98
+ | `decorative` | input | When true, the separator is presentational (`aria-hidden`) instead of `role="separator"` |
99
+
100
+ The applied classes: `inline-flex shrink-0 bg-border`, full-width 1px height when horizontal, full-stretch 1px width when vertical. Add spacing (e.g. `tw:my-4` / `tw:mx-2`) via the `class` attribute — the directive has no `class` input of its own, it merges host classes.
101
+
102
+ ## Examples
103
+
104
+ ### 1. Basic horizontal divider
105
+
106
+ ```ts
107
+ import { Component } from '@angular/core';
108
+ import { HlmSeparatorImports } from '@egose/shadcn-theme-ng/separator';
109
+
110
+ @Component({
111
+ selector: 'app-basic-separator',
112
+ standalone: true,
113
+ imports: [HlmSeparatorImports],
114
+ template: `
115
+ <div class="tw:space-y-1">
116
+ <h4 class="tw:font-medium">shadcn-theme</h4>
117
+ <p class="tw:text-muted-foreground tw:text-sm">An Angular shadcn/ui port.</p>
118
+ </div>
119
+ <hlm-separator class="tw:my-4" />
120
+ <div class="tw:flex tw:h-5 tw:items-center tw:gap-4 tw:text-sm">
121
+ <span>Docs</span>
122
+ <hlm-separator orientation="vertical" />
123
+ <span>API</span>
124
+ </div>
125
+ `,
126
+ })
127
+ export class BasicSeparatorComponent {}
50
128
  ```
51
129
 
52
- ## Running end-to-end tests
130
+ ### 2. Attribute form on a plain div
53
131
 
54
- For end-to-end (e2e) testing, run:
132
+ ```html
133
+ <section>
134
+ <h2>Profile</h2>
135
+ <div hlmSeparator class="tw:my-4"></div>
136
+ <h2>Security</h2>
137
+ </section>
138
+ ```
55
139
 
56
- ```bash
57
- ng e2e
140
+ ### 3. Vertical separator in a toolbar / breadcrumb row
141
+
142
+ ```ts
143
+ import { Component } from '@angular/core';
144
+ import { HlmSeparatorImports } from '@egose/shadcn-theme-ng/separator';
145
+
146
+ @Component({
147
+ selector: 'app-toolbar-separator',
148
+ standalone: true,
149
+ imports: [HlmSeparatorImports],
150
+ template: `
151
+ <div class="tw:flex tw:h-8 tw:items-center tw:gap-2 tw:rounded-md tw:border tw:px-2">
152
+ <button type="button">Bold</button>
153
+ <hlm-separator orientation="vertical" class="tw:h-4" />
154
+ <button type="button">Italic</button>
155
+ <hlm-separator orientation="vertical" class="tw:h-4" />
156
+ <button type="button">Underline</button>
157
+ </div>
158
+ `,
159
+ })
160
+ export class ToolbarSeparatorComponent {}
161
+ ```
162
+
163
+ Constrain the height (`tw:h-4`) so the vertical line doesn't stretch the whole toolbar.
164
+
165
+ ### 4. Decorative vs semantic
166
+
167
+ ```html
168
+ <!-- Purely visual: hidden from assistive tech -->
169
+ <hlm-separator decorative class="tw:my-6" />
170
+
171
+ <!-- Meaningful section break: exposed as role="separator" -->
172
+ <hlm-separator orientation="horizontal" class="tw:my-6" />
58
173
  ```
59
174
 
60
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
175
+ ### 5. Sidebar / menu dividers
176
+
177
+ ```html
178
+ <nav class="tw:flex tw:flex-col tw:gap-1">
179
+ <a href="/dashboard">Dashboard</a>
180
+ <a href="/settings">Settings</a>
181
+ <hlm-separator class="tw:my-2" />
182
+ <a href="/logout">Log out</a>
183
+ </nav>
184
+ ```
185
+
186
+ (For the app-sidebar layout, `hlm-sidebar-separator` from the `sidebar` subpath already wraps this directive with sidebar tokens — prefer it there.)
187
+
188
+ ### 6. Reusing `hlmSeparatorClass` in a custom component
189
+
190
+ ```ts
191
+ import { Component } from '@angular/core';
192
+ import { hlmSeparatorClass } from '@egose/shadcn-theme-ng/separator';
193
+ import { hlm } from '@egose/shadcn-theme-ng/utils';
194
+
195
+ @Component({
196
+ selector: 'app-fancy-divider',
197
+ standalone: true,
198
+ template: `<div role="separator" [class]="dividerClass">✦</div>`,
199
+ })
200
+ export class FancyDividerComponent {
201
+ protected readonly dividerClass = hlm(
202
+ hlmSeparatorClass,
203
+ 'tw:my-6 tw:items-center tw:justify-center tw:gap-2 tw:bg-transparent',
204
+ );
205
+ }
206
+ ```
207
+
208
+ ## Accessibility notes
209
+
210
+ - By default the separator exposes `role="separator"` with the correct orientation — use it for real section breaks.
211
+ - Pass `decorative` when the line is purely visual (repeated card dividers, toolbar ticks) so screen readers skip it.
212
+ - Never put content _inside_ the separator and never make it focusable — it is a boundary, not a control.
213
+
214
+ ## Theming / CSS variables
215
+
216
+ One token: `bg-border` for the line color (follows light/dark theme automatically). Thickness/spacing come from utilities you add via `class`.
61
217
 
62
- ## Additional Resources
218
+ ## Related subpaths
63
219
 
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.
220
+ - `@egose/shadcn-theme-ng/sidebar` — `hlm-sidebar-separator` (sidebar-token variant of this divider)
221
+ - `@egose/shadcn-theme-ng/select` — `hlm-select-separator` (dropdown-section divider)
222
+ - `@egose/shadcn-theme-ng/card` — sectioned containers where separators commonly appear
223
+ - `@egose/shadcn-theme-ng/breadcrumb` — inline navigation that often uses vertical separators
@@ -4,15 +4,15 @@ import * as i1 from '@spartan-ng/brain/separator';
4
4
  import { BrnSeparator } from '@spartan-ng/brain/separator';
5
5
  import { classes } from '@egose/shadcn-theme-ng/utils';
6
6
 
7
- const hlmSeparatorClass = 'inline-flex shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch';
7
+ const hlmSeparatorClass = "inline-flex shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch";
8
8
  class HlmSeparator {
9
9
  constructor() {
10
10
  classes(() => hlmSeparatorClass);
11
11
  }
12
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: HlmSeparator, isStandalone: true, selector: "[hlmSeparator],hlm-separator", host: { attributes: { "data-slot": "separator" } }, hostDirectives: [{ directive: i1.BrnSeparator, inputs: ["orientation", "orientation", "decorative", "decorative"] }], ngImport: i0 });
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSeparator, deps: [], target: i0.ɵɵFactoryTarget.Directive });
13
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.3", type: HlmSeparator, isStandalone: true, selector: "[hlmSeparator],hlm-separator", host: { attributes: { "data-slot": "separator" } }, hostDirectives: [{ directive: i1.BrnSeparator, inputs: ["orientation", "orientation", "decorative", "decorative"] }], ngImport: i0 });
14
14
  }
15
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSeparator, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSeparator, decorators: [{
16
16
  type: Directive,
17
17
  args: [{
18
18
  selector: '[hlmSeparator],hlm-separator',
@@ -28,11 +28,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
28
28
  */
29
29
  const HlmSeparatorImports = [HlmSeparator];
30
30
  class HlmSeparatorModule {
31
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSeparatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
32
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: HlmSeparatorModule, imports: [HlmSeparator], exports: [HlmSeparator] });
33
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSeparatorModule });
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSeparatorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
32
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmSeparatorModule, imports: [HlmSeparator], exports: [HlmSeparator] });
33
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSeparatorModule });
34
34
  }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: HlmSeparatorModule, decorators: [{
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSeparatorModule, decorators: [{
36
36
  type: NgModule,
37
37
  args: [{
38
38
  imports: [...HlmSeparatorImports],
@@ -45,4 +45,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
45
45
  */
46
46
 
47
47
  export { HlmSeparator, HlmSeparatorImports, HlmSeparatorModule, hlmSeparatorClass };
48
- //# sourceMappingURL=separator.mjs.map
48
+
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import * as i1 from '@spartan-ng/brain/separator';
3
3
 
4
- declare const hlmSeparatorClass = "inline-flex shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch";
4
+ declare const hlmSeparatorClass = "tw:inline-flex tw:shrink-0 tw:bg-border tw:data-horizontal:h-px tw:data-horizontal:w-full tw:data-vertical:w-px tw:data-vertical:self-stretch";
5
5
  declare class HlmSeparator {
6
6
  constructor();
7
7
  static ɵfac: i0.ɵɵFactoryDeclaration<HlmSeparator, never>;
package/sheet/README.md CHANGED
@@ -1,64 +1,312 @@
1
- # Sheet
1
+ # Sheet (`@egose/shadcn-theme-ng/sheet`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.0.
3
+ A shadcn/ui-style **Sheet** — a slide-over panel (dialog) anchored to any screen edge. This is the Angular equivalent of shadcn/ui `Sheet` (`SheetTrigger`, `SheetContent`, `SheetHeader`, `SheetFooter`, `SheetTitle`, `SheetDescription`, `SheetClose`).
4
4
 
5
- ## Code scaffolding
5
+ The overlay/focus-trap/dialog mechanics come from **spartan-ng/brain** (`BrnSheet`, `BrnSheetOverlay`, `BrnSheetClose`, `BrnSheetTitle`, `BrnSheetDescription`, `BrnDialog`). This package adds the shadcn shell: `HlmSheet` root (extends `BrnSheet`, renders the overlay + content outlet), `HlmSheetContent` with `side` variants (top/bottom/left/right, default right) plus a built-in close button, header/footer/title/description layout pieces, and overlay/close styling directives.
6
6
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
7
+ > **Ships as:** `@egose/shadcn-theme-ng/sheet` and `@egose/shadcn-theme-ng-tw/sheet` (the `tw:`-prefixed Tailwind variant — same API, class strings prefixed with `tw:`).
8
+ > See the [package README](../../README.md) for installation, peer dependencies, and Tailwind setup. Do not publish this project directory independently.
9
+
10
+ ## Installation
8
11
 
9
12
  ```bash
10
- ng generate component component-name
13
+ # Plain Tailwind (no prefix)
14
+ npm install @egose/shadcn-theme-ng
15
+
16
+ # Or the tw:-prefixed variant
17
+ npm install @egose/shadcn-theme-ng-tw
11
18
  ```
12
19
 
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
20
+ ```ts
21
+ import { HlmSheetImports } from '@egose/shadcn-theme-ng/sheet';
22
+ // tw variant:
23
+ // import { HlmSheetImports } from '@egose/shadcn-theme-ng-tw/sheet';
24
+ ```
14
25
 
15
- ```bash
16
- ng generate --help
26
+ Peer dependencies (see [package README](../../README.md) for versions): `@angular/core`, `@angular/common`. Icons use `@ng-icons/lucide` (`lucideX` for the built-in close button), installed transitively.
27
+
28
+ ## Imports
29
+
30
+ Real exported symbols (from `src/public-api.ts`):
31
+
32
+ | Symbol | Kind | Selector |
33
+ | --------------------- | ------------------------------ | ------------------------------------------------------------------------------ |
34
+ | `HlmSheet` | Component (extends `BrnSheet`) | `hlm-sheet` (`exportAs: 'hlmSheet'`) |
35
+ | `HlmSheetContent` | Component | `hlm-sheet-content` |
36
+ | `HlmSheetHeader` | Component | `hlm-sheet-header` |
37
+ | `HlmSheetFooter` | Component | `hlm-sheet-footer` |
38
+ | `HlmSheetTitle` | Directive | `[hlmSheetTitle]` |
39
+ | `HlmSheetDescription` | Directive | `[hlmSheetDescription]` |
40
+ | `HlmSheetOverlay` | Directive | `[hlmSheetOverlay],brn-sheet-overlay[hlm]` |
41
+ | `HlmSheetClose` | Directive | `[hlmSheetClose],[brnSheetClose][hlm]` |
42
+ | `sheetVariants` | `cva` | Side-variant class builder (`top \| bottom \| left \| right`, default `right`) |
43
+ | `HlmSheetImports` | `const` array | All components/directives above, for standalone `imports` |
44
+ | `HlmSheetModule` | `NgModule` | NgModule wrapper re-exporting all of the above |
45
+
46
+ Standalone usage:
47
+
48
+ ```ts
49
+ import { Component } from '@angular/core';
50
+ import { HlmSheetImports } from '@egose/shadcn-theme-ng/sheet';
51
+
52
+ @Component({
53
+ selector: 'app-demo',
54
+ standalone: true,
55
+ imports: [HlmSheetImports],
56
+ template: `...`,
57
+ })
58
+ export class DemoComponent {}
17
59
  ```
18
60
 
19
- ## Building
61
+ NgModule usage:
20
62
 
21
- To build the library, run:
63
+ ```ts
64
+ import { NgModule } from '@angular/core';
65
+ import { HlmSheetModule } from '@egose/shadcn-theme-ng/sheet';
22
66
 
23
- ```bash
24
- ng build sheet
67
+ @NgModule({ imports: [HlmSheetModule] })
68
+ export class DemoModule {}
25
69
  ```
26
70
 
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
71
+ ## Anatomy / Structure
28
72
 
29
- ### Publishing the Library
73
+ The `HlmSheet` root renders `<brn-sheet-overlay hlm />` plus your projected content. `HlmSheetContent` must be projected with the brain structural directive `*brnSheetContent` so it opens/closes with dialog state; the trigger uses `*brnSheetTrigger`:
30
74
 
31
- Once the project is built, you can publish your library by following these steps:
75
+ ```html
76
+ <hlm-sheet>
77
+ <button hlmButton *brnSheetTrigger>Edit profile</button>
32
78
 
33
- 1. Navigate to the `dist` directory:
79
+ <hlm-sheet-content *brnSheetContent="let ctx">
80
+ <hlm-sheet-header>
81
+ <h2 hlmSheetTitle>Edit profile</h2>
82
+ <p hlmSheetDescription>Update your details. Click save when done.</p>
83
+ </hlm-sheet-header>
34
84
 
35
- ```bash
36
- cd dist/sheet
37
- ```
85
+ <div class="tw:px-4">...form fields...</div>
38
86
 
39
- 2. Run the `npm publish` command to publish your library to the npm registry:
40
- ```bash
41
- npm publish
42
- ```
87
+ <hlm-sheet-footer>
88
+ <button hlmButton brnSheetClose hlmSheetClose>Save</button>
89
+ <button hlmButton variant="outline" brnSheetClose hlmSheetClose>Cancel</button>
90
+ </hlm-sheet-footer>
91
+ </hlm-sheet-content>
92
+ </hlm-sheet>
93
+ ```
43
94
 
44
- ## Running unit tests
95
+ Real selectors:
45
96
 
46
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
97
+ | Selector | Class | Notes |
98
+ | ------------------------------------------ | --------------------- | -------------------------------------------------------------------------------------------- |
99
+ | `hlm-sheet` | `HlmSheet` | Root; template = overlay + `<ng-content />`; provides itself as `BrnDialog`/`BrnSheet` |
100
+ | `hlm-sheet-content` | `HlmSheetContent` | Sliding panel; auto close (X) button; `data-state` reflects open/closed |
101
+ | `hlm-sheet-header` | `HlmSheetHeader` | Column layout, padded |
102
+ | `hlm-sheet-footer` | `HlmSheetFooter` | Bottom-pinned column (`mt-auto`), padded |
103
+ | `[hlmSheetTitle]` | `HlmSheetTitle` | Semibold title; forwards `BrnSheetTitle` (accessible dialog name) |
104
+ | `[hlmSheetDescription]` | `HlmSheetDescription` | Muted small description; forwards `BrnSheetDescription` |
105
+ | `[hlmSheetOverlay],brn-sheet-overlay[hlm]` | `HlmSheetOverlay` | Dimmed backdrop with fade animations |
106
+ | `[hlmSheetClose],[brnSheetClose][hlm]` | `HlmSheetClose` | Close-button styling (absolute top-right); apply on an element that also has `brnSheetClose` |
47
107
 
48
- ```bash
49
- ng test
108
+ ## API reference
109
+
110
+ ### HlmSheet (component)
111
+
112
+ Extends `BrnSheet`, so every `BrnSheet`/`BrnDialog` input/output (e.g. `state`, `stateChanged`, `side` where supported) is available on the host. Own template: `<brn-sheet-overlay hlm />` + content outlet. `exportAs: 'hlmSheet'` for `#sheet="hlmSheet"` references.
113
+
114
+ ### HlmSheetContent (component)
115
+
116
+ | Input | Type | Default | Description |
117
+ | --------------------- | ------------ | ------- | --------------------------------------------------------------------- |
118
+ | `class` (`userClass`) | `ClassValue` | `''` | Extra classes appended to the `sheetVariants({ side })` panel classes |
119
+
120
+ The `side` comes from the exposed-side provider of the enclosing brain sheet context (`injectExposedSideProvider`); the open state comes from `injectExposesStateProvider` and is mirrored to `data-state`. Side classes via the exported `sheetVariants` cva:
121
+
122
+ | `side` | Placement |
123
+ | ----------------- | ------------------------------------------------------------------ |
124
+ | `right` (default) | Right edge, full height, `w-3/4 sm:max-w-sm`, slides in from right |
125
+ | `left` | Left edge, mirrored |
126
+ | `top` | Top edge, full width, auto height, bottom border |
127
+ | `bottom` | Bottom edge, full width, auto height, top border |
128
+
129
+ The built-in close button (`<button brnSheetClose hlm>` with `lucideX` icon + sr-only "Close") is always rendered — add `class="...hidden"` overrides or your own close controls as needed; you cannot remove it via input.
130
+
131
+ ### HlmSheetHeader / HlmSheetFooter / HlmSheetTitle / HlmSheetDescription
132
+
133
+ Layout-only (header: `flex flex-col gap-1.5 p-4`; footer: `mt-auto flex flex-col gap-2 p-4`) plus a `class` (`userClass`) input each. Title forwards `BrnSheetTitle`, description forwards `BrnSheetDescription` — always include a title so the dialog has an accessible name.
134
+
135
+ ### HlmSheetOverlay / HlmSheetClose (directives)
136
+
137
+ Styling-only, each with a `class` (`userClass`) input. `HlmSheetOverlay` pushes its computed class into a custom-class-settable host when present (brain overlay interop). `HlmSheetClose` positions the button absolutely top-right with the subtle-opacity hover treatment — it must sit on an element that also closes the sheet (`brnSheetClose`).
138
+
139
+ ## Examples
140
+
141
+ ### 1. Basic right-side sheet
142
+
143
+ ```ts
144
+ import { Component } from '@angular/core';
145
+ import { BrnSheetImports } from '@spartan-ng/brain/sheet';
146
+ import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
147
+ import { HlmSheetImports } from '@egose/shadcn-theme-ng/sheet';
148
+
149
+ @Component({
150
+ selector: 'app-basic-sheet',
151
+ standalone: true,
152
+ imports: [BrnSheetImports, HlmButtonImports, HlmSheetImports],
153
+ template: `
154
+ <hlm-sheet>
155
+ <button hlmButton variant="outline" *brnSheetTrigger>Open sheet</button>
156
+
157
+ <hlm-sheet-content *brnSheetContent="let ctx">
158
+ <hlm-sheet-header>
159
+ <h2 hlmSheetTitle>Notifications</h2>
160
+ <p hlmSheetDescription>You have 3 unread messages.</p>
161
+ </hlm-sheet-header>
162
+ <div class="tw:px-4 tw:text-sm">Sheet body…</div>
163
+ <hlm-sheet-footer>
164
+ <button hlmButton brnSheetClose hlmSheetClose>Done</button>
165
+ </hlm-sheet-footer>
166
+ </hlm-sheet-content>
167
+ </hlm-sheet>
168
+ `,
169
+ })
170
+ export class BasicSheetComponent {}
50
171
  ```
51
172
 
52
- ## Running end-to-end tests
173
+ (`*brnSheetTrigger` / `*brnSheetContent` come from `BrnSheetImports` — import that alongside `HlmSheetImports`.)
53
174
 
54
- For end-to-end (e2e) testing, run:
175
+ ### 2. All four sides
55
176
 
56
- ```bash
57
- ng e2e
177
+ ```html
178
+ <hlm-sheet [side]="'left'">
179
+ <button hlmButton *brnSheetTrigger>Left nav</button>
180
+ <hlm-sheet-content *brnSheetContent="let ctx">
181
+ <hlm-sheet-header>
182
+ <h2 hlmSheetTitle>Menu</h2>
183
+ </hlm-sheet-header>
184
+ </hlm-sheet-content>
185
+ </hlm-sheet>
186
+
187
+ <!-- side="top" | side="bottom" work the same; omit for the default right -->
58
188
  ```
59
189
 
60
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
190
+ `side` is read by `HlmSheetContent` through the exposed-side provider, and `sheetVariants({ side })` drives the slide animation direction.
191
+
192
+ ### 3. Form sheet with footer actions
193
+
194
+ ```ts
195
+ import { Component } from '@angular/core';
196
+ import { FormsModule } from '@angular/forms';
197
+ import { BrnSheetImports } from '@spartan-ng/brain/sheet';
198
+ import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
199
+ import { HlmInputImports } from '@egose/shadcn-theme-ng/input';
200
+ import { HlmLabelImports } from '@egose/shadcn-theme-ng/label';
201
+ import { HlmSheetImports } from '@egose/shadcn-theme-ng/sheet';
202
+
203
+ @Component({
204
+ selector: 'app-form-sheet',
205
+ standalone: true,
206
+ imports: [BrnSheetImports, FormsModule, HlmButtonImports, HlmInputImports, HlmLabelImports, HlmSheetImports],
207
+ template: `
208
+ <hlm-sheet>
209
+ <button hlmButton *brnSheetTrigger>Edit profile</button>
210
+ <hlm-sheet-content *brnSheetContent="let ctx">
211
+ <hlm-sheet-header>
212
+ <h2 hlmSheetTitle>Edit profile</h2>
213
+ <p hlmSheetDescription>Changes save when you click Save.</p>
214
+ </hlm-sheet-header>
215
+
216
+ <div class="tw:grid tw:gap-4 tw:px-4">
217
+ <div class="tw:grid tw:gap-2">
218
+ <label hlmLabel for="sheet-name">Name</label>
219
+ <input hlmInput id="sheet-name" [(ngModel)]="name" name="name" />
220
+ </div>
221
+ </div>
222
+
223
+ <hlm-sheet-footer>
224
+ <button hlmButton (click)="save(ctx)">Save</button>
225
+ <button hlmButton variant="outline" brnSheetClose hlmSheetClose>Cancel</button>
226
+ </hlm-sheet-footer>
227
+ </hlm-sheet-content>
228
+ </hlm-sheet>
229
+ `,
230
+ })
231
+ export class FormSheetComponent {
232
+ name = 'Ada';
233
+
234
+ save(ctx: { close: () => void }): void {
235
+ console.log('saving', this.name);
236
+ ctx.close();
237
+ }
238
+ }
239
+ ```
240
+
241
+ ### 4. Programmatic open/close via exportAs
242
+
243
+ ```html
244
+ <hlm-sheet #sheet="hlmSheet" [state]="state">
245
+ <hlm-sheet-content *brnSheetContent="let ctx">
246
+ <hlm-sheet-header>
247
+ <h2 hlmSheetTitle>Controlled</h2>
248
+ <p hlmSheetDescription>Opened from code.</p>
249
+ </hlm-sheet-header>
250
+ <hlm-sheet-footer>
251
+ <button hlmButton (click)="state = 'closed'">Close from code</button>
252
+ </hlm-sheet-footer>
253
+ </hlm-sheet-content>
254
+ </hlm-sheet>
255
+
256
+ <button hlmButton (click)="state = 'open'">Open from code</button>
257
+ ```
258
+
259
+ ### 5. Custom close affordances with `hlmSheetClose`
260
+
261
+ ```html
262
+ <hlm-sheet-content *brnSheetContent="let ctx">
263
+ <hlm-sheet-header>
264
+ <h2 hlmSheetTitle>Confirm delete</h2>
265
+ <p hlmSheetDescription>This action cannot be undone.</p>
266
+ </hlm-sheet-header>
267
+
268
+ <hlm-sheet-footer>
269
+ <button hlmButton variant="destructive" brnSheetClose hlmSheetClose>Delete</button>
270
+ <button hlmButton variant="ghost" brnSheetClose hlmSheetClose>Keep it</button>
271
+ </hlm-sheet-footer>
272
+ </hlm-sheet-content>
273
+ ```
274
+
275
+ `brnSheetClose` does the closing; `hlmSheetClose` only styles. You can also put `hlmSheetClose` on any absolutely-positioned custom close button.
276
+
277
+ ### 6. Wide / custom-sized content with `sheetVariants`
278
+
279
+ ```ts
280
+ import { Component } from '@angular/core';
281
+ import { sheetVariants } from '@egose/shadcn-theme-ng/sheet';
282
+
283
+ @Component({ selector: 'app-wide-sheet', template: '' })
284
+ export class WideSheetComponent {
285
+ // Reuse the exact variant builder for a custom panel:
286
+ protected readonly panelClass = sheetVariants({ side: 'right' });
287
+ }
288
+ ```
289
+
290
+ ```html
291
+ <hlm-sheet-content *brnSheetContent="let ctx" class="tw:sm:max-w-lg"> ... </hlm-sheet-content>
292
+ ```
293
+
294
+ `userClass` merges after the variant classes, so `tw:sm:max-w-lg` widens the default `sm:max-w-sm` panel.
295
+
296
+ ## Accessibility notes
297
+
298
+ - Always include `hlmSheetTitle` — it forwards `BrnSheetTitle` and gives the dialog its accessible name. Add `hlmSheetDescription` for context.
299
+ - Focus is trapped inside the open sheet and returned to the trigger on close (brain dialog behavior); keep the trigger in the DOM and don't unmount the sheet while open.
300
+ - The overlay click + `Escape` dismiss via brain defaults; destructive flows should still require an explicit footer confirmation, not overlay dismissal alone.
301
+ - The built-in X button has an sr-only "Close" label — if you hide it, provide another labelled close control.
302
+
303
+ ## Theming / CSS variables
304
+
305
+ Class-driven (`bg-background` panel, `bg-black/50` overlay, border tokens). Animate via the `data-[state=open|closed]` attributes if you customize transitions. Dark mode follows the theme tokens.
61
306
 
62
- ## Additional Resources
307
+ ## Related subpaths
63
308
 
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.
309
+ - `@egose/shadcn-theme-ng/dialog` — centered modal counterpart
310
+ - `@egose/shadcn-theme-ng/drawer` — bottom-anchored mobile-style panel counterpart
311
+ - `@egose/shadcn-theme-ng/sidebar` — persistent app navigation (uses `hlm-sheet` internally on mobile)
312
+ - `@egose/shadcn-theme-ng/button` — triggers and footer actions