@egose/shadcn-theme-ng 0.1.0 → 0.3.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 (162) hide show
  1. package/README.md +2 -2
  2. package/accordion/README.md +405 -2
  3. package/alert/README.md +372 -2
  4. package/alert-dialog/README.md +471 -5
  5. package/aspect-ratio/README.md +272 -5
  6. package/autocomplete/README.md +502 -2
  7. package/autocomplete/fesm2022/autocomplete.mjs +1 -1
  8. package/avatar/README.md +357 -5
  9. package/badge/README.md +318 -2
  10. package/basic-alert/README.md +353 -2
  11. package/breadcrumb/README.md +406 -5
  12. package/button/README.md +482 -2
  13. package/button/fesm2022/button.mjs +85 -107
  14. package/button/types/button.d.ts +5 -8
  15. package/button-group/README.md +318 -5
  16. package/calendar/README.md +357 -2
  17. package/card/README.md +331 -5
  18. package/carousel/README.md +333 -5
  19. package/carousel/fesm2022/carousel.mjs +4 -1
  20. package/checkbox/README.md +320 -2
  21. package/checkbox/fesm2022/checkbox.mjs +6 -7
  22. package/checkbox/types/checkbox.d.ts +1 -1
  23. package/collapsible/README.md +332 -5
  24. package/combobox/README.md +507 -5
  25. package/combobox/fesm2022/combobox.mjs +5 -2
  26. package/command/README.md +435 -5
  27. package/confirmation-dialog/README.md +301 -2
  28. package/context-menu/README.md +366 -5
  29. package/date-picker/README.md +469 -2
  30. package/date-picker/fesm2022/date-picker.mjs +150 -32
  31. package/date-picker/types/date-picker.d.ts +102 -9
  32. package/dialog/README.md +448 -2
  33. package/drawer/README.md +395 -5
  34. package/dropdown-menu/README.md +417 -5
  35. package/empty/README.md +329 -5
  36. package/field/README.md +385 -5
  37. package/form-autocomplete/README.md +177 -0
  38. package/form-autocomplete/fesm2022/form-autocomplete.mjs +125 -0
  39. package/form-autocomplete/package.json +24 -0
  40. package/form-autocomplete/types/form-autocomplete.d.ts +61 -0
  41. package/form-checkbox/README.md +322 -2
  42. package/form-checkbox/fesm2022/form-checkbox.mjs +22 -9
  43. package/form-checkbox/types/form-checkbox.d.ts +23 -4
  44. package/form-combobox/README.md +202 -0
  45. package/form-combobox/fesm2022/form-combobox.mjs +147 -0
  46. package/form-combobox/package.json +24 -0
  47. package/form-combobox/types/form-combobox.d.ts +73 -0
  48. package/form-date-picker/README.md +348 -2
  49. package/form-date-picker/fesm2022/form-date-picker.mjs +38 -12
  50. package/form-date-picker/types/form-date-picker.d.ts +17 -1
  51. package/form-date-picker-multi/README.md +191 -0
  52. package/form-date-picker-multi/fesm2022/form-date-picker-multi.mjs +129 -0
  53. package/form-date-picker-multi/package.json +24 -0
  54. package/form-date-picker-multi/types/form-date-picker-multi.d.ts +58 -0
  55. package/form-date-range-picker/README.md +253 -0
  56. package/form-date-range-picker/fesm2022/form-date-range-picker.mjs +130 -0
  57. package/form-date-range-picker/package.json +24 -0
  58. package/form-date-range-picker/types/form-date-range-picker.d.ts +55 -0
  59. package/form-field/README.md +356 -2
  60. package/form-field-simple/README.md +340 -2
  61. package/form-input-otp/README.md +194 -0
  62. package/form-input-otp/fesm2022/form-input-otp.mjs +106 -0
  63. package/form-input-otp/package.json +24 -0
  64. package/form-input-otp/types/form-input-otp.d.ts +58 -0
  65. package/form-month-year-picker/README.md +188 -0
  66. package/form-month-year-picker/fesm2022/form-month-year-picker.mjs +125 -0
  67. package/form-month-year-picker/package.json +24 -0
  68. package/form-month-year-picker/types/form-month-year-picker.d.ts +53 -0
  69. package/form-native-select/README.md +205 -0
  70. package/form-native-select/fesm2022/form-native-select.mjs +103 -0
  71. package/form-native-select/package.json +24 -0
  72. package/form-native-select/types/form-native-select.d.ts +57 -0
  73. package/form-phone-input/README.md +188 -0
  74. package/form-phone-input/fesm2022/form-phone-input.mjs +113 -0
  75. package/form-phone-input/package.json +24 -0
  76. package/form-phone-input/types/form-phone-input.d.ts +58 -0
  77. package/form-radio-group/README.md +198 -0
  78. package/form-radio-group/fesm2022/form-radio-group.mjs +111 -0
  79. package/form-radio-group/package.json +24 -0
  80. package/form-radio-group/types/form-radio-group.d.ts +63 -0
  81. package/form-searchable-multiselect/README.md +371 -2
  82. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +19 -10
  83. package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +18 -1
  84. package/form-select/README.md +360 -2
  85. package/form-select/fesm2022/form-select.mjs +20 -11
  86. package/form-select/types/form-select.d.ts +18 -1
  87. package/form-slider/README.md +182 -0
  88. package/form-slider/fesm2022/form-slider.mjs +106 -0
  89. package/form-slider/package.json +24 -0
  90. package/form-slider/types/form-slider.d.ts +60 -0
  91. package/form-switch/README.md +173 -0
  92. package/form-switch/fesm2022/form-switch.mjs +100 -0
  93. package/form-switch/package.json +24 -0
  94. package/form-switch/types/form-switch.d.ts +50 -0
  95. package/form-text-input/README.md +381 -2
  96. package/form-text-input/fesm2022/form-text-input.mjs +19 -10
  97. package/form-text-input/types/form-text-input.d.ts +18 -1
  98. package/form-textarea/README.md +357 -2
  99. package/form-textarea/fesm2022/form-textarea.mjs +19 -10
  100. package/form-textarea/types/form-textarea.d.ts +18 -1
  101. package/form-toggle/README.md +186 -0
  102. package/form-toggle/fesm2022/form-toggle.mjs +159 -0
  103. package/form-toggle/package.json +24 -0
  104. package/form-toggle/types/form-toggle.d.ts +82 -0
  105. package/form-toggle-group/README.md +176 -0
  106. package/form-toggle-group/fesm2022/form-toggle-group.mjs +116 -0
  107. package/form-toggle-group/package.json +24 -0
  108. package/form-toggle-group/types/form-toggle-group.d.ts +65 -0
  109. package/hover-card/README.md +256 -5
  110. package/icon/README.md +239 -2
  111. package/input/README.md +269 -2
  112. package/input-group/README.md +335 -5
  113. package/input-group/fesm2022/input-group.mjs +22 -12
  114. package/input-group/types/input-group.d.ts +4 -1
  115. package/input-otp/README.md +375 -5
  116. package/item/README.md +385 -5
  117. package/item/fesm2022/item.mjs +3 -3
  118. package/kbd/README.md +291 -5
  119. package/label/README.md +272 -2
  120. package/layout-simple/README.md +193 -2
  121. package/layout-simple/fesm2022/layout-simple.mjs +472 -236
  122. package/layout-simple/types/layout-simple.d.ts +174 -137
  123. package/menu/README.md +417 -2
  124. package/menubar/README.md +343 -5
  125. package/native-select/README.md +323 -5
  126. package/native-select/fesm2022/native-select.mjs +18 -6
  127. package/native-select/types/native-select.d.ts +7 -2
  128. package/navigation-menu/README.md +369 -5
  129. package/package.json +57 -1
  130. package/pagination/README.md +388 -5
  131. package/phone-input/README.md +114 -0
  132. package/phone-input/fesm2022/phone-input.mjs +191 -0
  133. package/phone-input/package.json +24 -0
  134. package/phone-input/types/phone-input.d.ts +67 -0
  135. package/popover/README.md +331 -2
  136. package/progress/README.md +311 -5
  137. package/radio-group/README.md +364 -2
  138. package/radio-group/fesm2022/radio-group.mjs +5 -1
  139. package/resizable/README.md +269 -5
  140. package/scroll-area/README.md +233 -5
  141. package/searchable-multiselect/README.md +323 -2
  142. package/select/README.md +437 -2
  143. package/separator/README.md +222 -2
  144. package/sheet/README.md +311 -2
  145. package/sidebar/README.md +457 -5
  146. package/skeleton/README.md +217 -5
  147. package/slider/README.md +273 -5
  148. package/slider/fesm2022/slider.mjs +3 -3
  149. package/sonner/README.md +346 -2
  150. package/spinner/README.md +284 -2
  151. package/switch/README.md +310 -2
  152. package/switch/fesm2022/switch.mjs +7 -5
  153. package/switch/types/switch.d.ts +2 -1
  154. package/table/README.md +423 -5
  155. package/tabs/README.md +411 -2
  156. package/tabs/fesm2022/tabs.mjs +2 -2
  157. package/textarea/README.md +282 -5
  158. package/toggle/README.md +270 -5
  159. package/toggle-group/README.md +340 -5
  160. package/tooltip/README.md +269 -2
  161. package/typography/README.md +271 -5
  162. package/utils/README.md +303 -2
package/menubar/README.md CHANGED
@@ -1,11 +1,349 @@
1
- # Menubar
1
+ # Menubar (`@egose/shadcn-theme-ng/menubar`)
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli).
3
+ Desktop app-style menu bar (shadcn/ui `menubar` equivalent): a horizontal `hlm-menubar` strip whose `hlmMenubarTrigger` buttons each open a floating menu (in practice, an `hlm-menu` / `hlm-dropdown-menu` surface). The bar and trigger are thin shadcn wrappers around Angular CDK `CdkMenuBar` / `CdkMenuItem` + `CdkMenuTrigger`, with spartan-ng menu-position helpers (`align`/`side`, global config token) for popup placement.
4
4
 
5
- ## Building
5
+ Ships as `@egose/shadcn-theme-ng/menubar` and `@egose/shadcn-theme-ng-tw/menubar` (tw: variant). See the [package README](../../README.md) for installation, peer dependencies, Tailwind setup, and testing. Do not publish this project directory independently.
6
6
 
7
- To build the library, run:
7
+ ## Installation
8
8
 
9
9
  ```bash
10
- ng build menubar
10
+ # Plain Tailwind (no prefix):
11
+ npm install @egose/shadcn-theme-ng
12
+
13
+ # Or the tw:-prefixed variant:
14
+ npm install @egose/shadcn-theme-ng-tw
15
+ ```
16
+
17
+ Peer dependencies are inherited from the package root (see [package README](../../README.md)). This subpath itself declares `@angular/common`, `@angular/core`, `@spartan-ng/brain` as peers plus a `tslib` runtime dependency; at runtime it also uses `@angular/cdk/menu` and `@spartan-ng/brain/core` position helpers, and you will typically pair it with `@egose/shadcn-theme-ng/menu` or `.../dropdown-menu` for the popup surfaces. No extra install step is needed beyond the package install above.
18
+
19
+ ## Imports
20
+
21
+ Real exported symbols (from `src/public-api.ts`):
22
+
23
+ ```ts
24
+ import {
25
+ HlmMenubar, // directive: [hlmMenubar],hlm-menubar
26
+ HlmMenubarTrigger, // directive: button[hlmMenubarTrigger]
27
+ HlmMenubarConfig, // interface { align, side }
28
+ provideHlmMenubarConfig, // (config: Partial<HlmMenubarConfig>) => ValueProvider
29
+ injectHlmMenubarConfig, // () => HlmMenubarConfig
30
+ HlmMenubarImports, // readonly [HlmMenubar, HlmMenubarTrigger]
31
+ HlmMenubarModule, // NgModule wrapping HlmMenubarImports
32
+ } from '@egose/shadcn-theme-ng/menubar';
33
+ ```
34
+
35
+ Standalone usage:
36
+
37
+ ```ts
38
+ import { Component } from '@angular/core';
39
+ import { HlmMenubarImports } from '@egose/shadcn-theme-ng/menubar';
40
+ import { HlmMenuImports } from '@egose/shadcn-theme-ng/menu';
41
+
42
+ @Component({
43
+ selector: 'app-demo',
44
+ standalone: true,
45
+ imports: [...HlmMenubarImports, ...HlmMenuImports],
46
+ template: `
47
+ <hlm-menubar>
48
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="fileMenu">File</button>
49
+ </hlm-menubar>
50
+ <ng-template #fileMenu>
51
+ <hlm-menu><button hlmMenuItem>New</button></hlm-menu>
52
+ </ng-template>
53
+ `,
54
+ })
55
+ export class DemoComponent {}
56
+ ```
57
+
58
+ NgModule usage:
59
+
60
+ ```ts
61
+ import { NgModule } from '@angular/core';
62
+ import { HlmMenubarModule } from '@egose/shadcn-theme-ng/menubar';
63
+
64
+ @NgModule({ imports: [HlmMenubarModule] })
65
+ export class DemoModule {}
66
+ ```
67
+
68
+ For the `tw:` build, swap the specifier to `@egose/shadcn-theme-ng-tw/menubar`. Symbol names are identical.
69
+
70
+ ## Anatomy / Structure
71
+
72
+ ```html
73
+ <hlm-menubar>
74
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="fileTpl">File</button>
75
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="editTpl" [hlmMenubarTriggerData]="{ user: me }">Edit</button>
76
+ <button hlmMenubarTrigger [disabled]="locked()">View</button>
77
+ </hlm-menubar>
78
+
79
+ <ng-template #fileTpl>
80
+ <hlm-menu variant="menubar">
81
+ <button hlmMenuItem>New file</button>
82
+ <hlm-menu-separator />
83
+ <button hlmMenuItem variant="destructive">Delete</button>
84
+ </hlm-menu>
85
+ </ng-template>
86
+ ```
87
+
88
+ | Class | Selector | Host requirements | Role |
89
+ | ------------------- | --------------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------- |
90
+ | `HlmMenubar` | `[hlmMenubar],hlm-menubar` | any element or the `hlm-menubar` element | Bar container (`CdkMenuBar` host directive, `data-slot="menubar"`) |
91
+ | `HlmMenubarTrigger` | `button[hlmMenubarTrigger]` | `<button>` only | Menu button (`CdkMenuItem` + `CdkMenuTrigger` host directives, `data-slot="menubar-trigger"`) |
92
+
93
+ The trigger wires two CDK inputs under shadcn aliases: `hlmMenubarTrigger` → `cdkMenuTriggerFor` (the template), `hlmMenubarTriggerData` → `cdkMenuTriggerData` (context passed to the template). It also re-emits `cdkMenuOpened`/`cdkMenuClosed` as `hlmDropdownMenuOpened`/`hlmDropdownMenuClosed` (names inherited from the dropdown-menu lineage — bind those names, not the `cdk*` ones).
94
+
95
+ ## API reference
96
+
97
+ ### `HlmMenubar` (`[hlmMenubar],hlm-menubar`)
98
+
99
+ No inputs/outputs/methods. Host directives: `CdkMenuBar`. Styling: `bg-background h-9 gap-1 rounded-md border p-1 shadow-xs flex items-center`.
100
+
101
+ ### `HlmMenubarTrigger` (`button[hlmMenubarTrigger]`)
102
+
103
+ | Member | Kind | Type / Default | Notes |
104
+ | ----------------------- | ------------------ | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
105
+ | `disabled` | input | `boolean`, `false` (boolean coercion) | Forwarded to `CdkMenuItem` (`cdkMenuItemDisabled`); also sets host `[disabled]` and `data-disabled` |
106
+ | `align` | input | `MenuAlign`, default from `HlmMenubarConfig` (`'start'`) | Menu alignment; drives `menuPosition` via `createMenuPosition(align, side)` |
107
+ | `side` | input | `MenuSide`, default from config (`'bottom'`) | Menu side; drives `menuPosition` |
108
+ | `hlmMenubarTrigger` | input (CDK alias) | `Menu` template ref | `cdkMenuTriggerFor`: the popup template |
109
+ | `hlmMenubarTriggerData` | input (CDK alias) | `unknown` | `cdkMenuTriggerData`: context for the popup template |
110
+ | `hlmDropdownMenuOpened` | output (CDK alias) | `void` | Re-emits `cdkMenuOpened` |
111
+ | `hlmDropdownMenuClosed` | output (CDK alias) | `void` | Re-emits `cdkMenuClosed` |
112
+
113
+ The constructor sets the CDK `transformOriginSelector` to `'[data-slot="dropdown-menu"]'` and syncs `menuPosition` in an `effect`.
114
+
115
+ ### `HlmMenubarConfig` + providers
116
+
117
+ | Symbol | Shape | Notes |
118
+ | --------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------- |
119
+ | `HlmMenubarConfig` | `{ align: MenuAlign; side: MenuSide }` | Defaults `{ align: 'start', side: 'bottom' }` |
120
+ | `provideHlmMenubarConfig(config)` | `(Partial<HlmMenubarConfig>) => ValueProvider` | Provide at component/root to change defaults for all triggers in scope |
121
+ | `injectHlmMenubarConfig()` | `() => HlmMenubarConfig` | Reads the token, falls back to defaults |
122
+
123
+ ## Examples
124
+
125
+ ### 1. Basic File/Edit bar
126
+
127
+ ```ts
128
+ import { Component } from '@angular/core';
129
+ import { CdkMenuModule } from '@angular/cdk/menu';
130
+ import { HlmMenubarImports } from '@egose/shadcn-theme-ng/menubar';
131
+ import { HlmMenuImports } from '@egose/shadcn-theme-ng/menu';
132
+
133
+ @Component({
134
+ selector: 'app-menubar-basic',
135
+ standalone: true,
136
+ imports: [CdkMenuModule, ...HlmMenubarImports, ...HlmMenuImports],
137
+ template: `
138
+ <hlm-menubar>
139
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="fileTpl">File</button>
140
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="editTpl">Edit</button>
141
+ </hlm-menubar>
142
+
143
+ <ng-template #fileTpl>
144
+ <hlm-menu variant="menubar">
145
+ <button hlmMenuItem (cdkMenuItemTriggered)="onNew()">New file</button>
146
+ <button hlmMenuItem>Open…</button>
147
+ <hlm-menu-separator />
148
+ <button hlmMenuItem variant="destructive">Delete</button>
149
+ </hlm-menu>
150
+ </ng-template>
151
+
152
+ <ng-template #editTpl>
153
+ <hlm-menu variant="menubar">
154
+ <button hlmMenuItem>Undo</button>
155
+ <button hlmMenuItem>Redo</button>
156
+ </hlm-menu>
157
+ </ng-template>
158
+ `,
159
+ })
160
+ export class MenubarBasicComponent {
161
+ onNew(): void {
162
+ console.log('new file');
163
+ }
164
+ }
165
+ ```
166
+
167
+ ```html
168
+ <hlm-menubar>
169
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="fileTpl">File</button>
170
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="editTpl">Edit</button>
171
+ </hlm-menubar>
172
+ ```
173
+
174
+ ### 2. Disabled trigger + open/close events
175
+
176
+ ```ts
177
+ import { Component, signal } from '@angular/core';
178
+ import { HlmMenubarImports } from '@egose/shadcn-theme-ng/menubar';
179
+ import { HlmMenuImports } from '@egose/shadcn-theme-ng/menu';
180
+
181
+ @Component({
182
+ selector: 'app-menubar-events',
183
+ standalone: true,
184
+ imports: [...HlmMenubarImports, ...HlmMenuImports],
185
+ template: `
186
+ <hlm-menubar>
187
+ <button
188
+ hlmMenubarTrigger
189
+ [hlmMenubarTrigger]="viewTpl"
190
+ [disabled]="locked()"
191
+ (hlmDropdownMenuOpened)="onOpen()"
192
+ (hlmDropdownMenuClosed)="onClose()"
193
+ >
194
+ View
195
+ </button>
196
+ </hlm-menubar>
197
+
198
+ <ng-template #viewTpl>
199
+ <hlm-menu variant="menubar">
200
+ <button hlmMenuItemCheckbox [cdkMenuItemChecked]="true">
201
+ <hlm-menu-item-check />
202
+ Show sidebar
203
+ </button>
204
+ </hlm-menu>
205
+ </ng-template>
206
+
207
+ <p class="tw:text-sm tw:text-muted-foreground">Menu is {{ open() ? 'open' : 'closed' }}.</p>
208
+ `,
209
+ })
210
+ export class MenubarEventsComponent {
211
+ readonly locked = signal(false);
212
+ readonly open = signal(false);
213
+
214
+ onOpen(): void {
215
+ this.open.set(true);
216
+ }
217
+ onClose(): void {
218
+ this.open.set(false);
219
+ }
220
+ }
11
221
  ```
222
+
223
+ ### 3. Placement: align/side per trigger
224
+
225
+ ```ts
226
+ import { Component } from '@angular/core';
227
+ import { HlmMenubarImports } from '@egose/shadcn-theme-ng/menubar';
228
+ import { HlmMenuImports } from '@egose/shadcn-theme-ng/menu';
229
+
230
+ @Component({
231
+ selector: 'app-menubar-placement',
232
+ standalone: true,
233
+ imports: [...HlmMenubarImports, ...HlmMenuImports],
234
+ template: `
235
+ <hlm-menubar>
236
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="aTpl" align="start" side="bottom">Start/Bottom</button>
237
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="bTpl" align="end" side="bottom">End/Bottom</button>
238
+ </hlm-menubar>
239
+
240
+ <ng-template #aTpl>
241
+ <hlm-menu variant="menubar"><button hlmMenuItem>Item A</button></hlm-menu>
242
+ </ng-template>
243
+ <ng-template #bTpl>
244
+ <hlm-menu variant="menubar"><button hlmMenuItem>Item B</button></hlm-menu>
245
+ </ng-template>
246
+ `,
247
+ })
248
+ export class MenubarPlacementComponent {}
249
+ ```
250
+
251
+ ### 4. Global defaults via `provideHlmMenubarConfig`
252
+
253
+ ```ts
254
+ import { Component } from '@angular/core';
255
+ import { HlmMenubarImports, provideHlmMenubarConfig } from '@egose/shadcn-theme-ng/menubar';
256
+ import { HlmMenuImports } from '@egose/shadcn-theme-ng/menu';
257
+
258
+ @Component({
259
+ selector: 'app-menubar-config',
260
+ standalone: true,
261
+ imports: [...HlmMenubarImports, ...HlmMenuImports],
262
+ providers: [provideHlmMenubarConfig({ align: 'end', side: 'bottom' })],
263
+ template: `
264
+ <hlm-menubar>
265
+ <!-- inherits align=end from the provider; side can still be overridden per trigger -->
266
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="tpl">File</button>
267
+ </hlm-menubar>
268
+ <ng-template #tpl>
269
+ <hlm-menu variant="menubar"><button hlmMenuItem>New</button></hlm-menu>
270
+ </ng-template>
271
+ `,
272
+ })
273
+ export class MenubarConfigComponent {}
274
+ ```
275
+
276
+ ### 5. Passing data into the menu template
277
+
278
+ ```ts
279
+ import { Component, signal } from '@angular/core';
280
+ import { HlmMenubarImports } from '@egose/shadcn-theme-ng/menubar';
281
+ import { HlmMenuImports } from '@egose/shadcn-theme-ng/menu';
282
+
283
+ @Component({
284
+ selector: 'app-menubar-data',
285
+ standalone: true,
286
+ imports: [...HlmMenubarImports, ...HlmMenuImports],
287
+ template: `
288
+ <hlm-menubar>
289
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="shareTpl" [hlmMenubarTriggerData]="{ file: file() }">Share</button>
290
+ </hlm-menubar>
291
+
292
+ <ng-template #shareTpl let-file="file">
293
+ <hlm-menu variant="menubar">
294
+ <hlm-menu-label>Share “{{ file }}”</hlm-menu-label>
295
+ <button hlmMenuItem>Email link</button>
296
+ <button hlmMenuItem>Copy link</button>
297
+ </hlm-menu>
298
+ </ng-template>
299
+ `,
300
+ })
301
+ export class MenubarDataComponent {
302
+ readonly file = signal('proposal.docx');
303
+ }
304
+ ```
305
+
306
+ ### 6. NgModule consumer + attribute selector form
307
+
308
+ ```ts
309
+ import { NgModule, Component } from '@angular/core';
310
+ import { HlmMenubarModule } from '@egose/shadcn-theme-ng/menubar';
311
+ import { HlmMenuModule } from '@egose/shadcn-theme-ng/menu';
312
+
313
+ @Component({
314
+ selector: 'app-menubar-legacy',
315
+ template: `
316
+ <div hlmMenubar>
317
+ <button hlmMenubarTrigger [hlmMenubarTrigger]="tpl">File</button>
318
+ </div>
319
+ <ng-template #tpl>
320
+ <hlm-menu variant="menubar"><button hlmMenuItem>New</button></hlm-menu>
321
+ </ng-template>
322
+ `,
323
+ })
324
+ export class MenubarLegacyComponent {}
325
+
326
+ @NgModule({
327
+ declarations: [MenubarLegacyComponent],
328
+ imports: [HlmMenubarModule, HlmMenuModule],
329
+ exports: [MenubarLegacyComponent],
330
+ })
331
+ export class MenubarLegacyModule {}
332
+ ```
333
+
334
+ ## Accessibility notes
335
+
336
+ - `CdkMenuBar` provides the menubar role, roving tabindex across triggers, arrow-key movement, and `aria-expanded` on open triggers — keep triggers as real `<button>` elements inside the bar so the pattern holds.
337
+ - The trigger selector requires `<button>`; do not attach `hlmMenubarTrigger` to `<a>`/`<div>`.
338
+ - Disabled triggers expose `disabled` + `data-disabled` and are skipped by keyboard navigation.
339
+ - Popup content (`hlm-menu`) carries menu semantics; label open/close state changes if you add extra status text (see example 2) with `aria-live` where appropriate.
340
+
341
+ ## Theming / CSS variables
342
+
343
+ No theming inputs. The bar uses `bg-background border shadow-xs`; triggers use `hover:bg-muted aria-expanded:bg-muted data-disabled:opacity-50`. Override placement globally with `provideHlmMenubarConfig`, per-trigger with `align`/`side`.
344
+
345
+ ## Related subpaths
346
+
347
+ - `@egose/shadcn-theme-ng/menu` (`HlmMenu`, `HlmMenuItem`, …) — popup surfaces and rows for menubar templates.
348
+ - `@egose/shadcn-theme-ng/dropdown-menu` — alternative trigger/menu pair when you need a single button menu instead of a bar.
349
+ - `@egose/shadcn-theme-ng/navigation-menu` — site-navigation pattern (links + content panels) vs the menubar's action-menu pattern.