@egose/shadcn-theme-ng 0.1.0 → 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.
- package/README.md +1 -1
- package/accordion/README.md +405 -2
- package/alert/README.md +372 -2
- package/alert-dialog/README.md +471 -5
- package/aspect-ratio/README.md +272 -5
- package/autocomplete/README.md +502 -2
- package/avatar/README.md +357 -5
- package/badge/README.md +318 -2
- package/basic-alert/README.md +353 -2
- package/breadcrumb/README.md +406 -5
- package/button/README.md +482 -2
- package/button/fesm2022/button.mjs +85 -107
- package/button/types/button.d.ts +5 -8
- package/button-group/README.md +318 -5
- package/calendar/README.md +357 -2
- package/card/README.md +331 -5
- package/carousel/README.md +333 -5
- package/carousel/fesm2022/carousel.mjs +4 -1
- package/checkbox/README.md +320 -2
- package/collapsible/README.md +332 -5
- package/combobox/README.md +507 -5
- package/combobox/fesm2022/combobox.mjs +4 -1
- package/command/README.md +435 -5
- package/confirmation-dialog/README.md +301 -2
- package/context-menu/README.md +366 -5
- package/date-picker/README.md +465 -2
- package/date-picker/fesm2022/date-picker.mjs +2 -2
- package/dialog/README.md +448 -2
- package/drawer/README.md +395 -5
- package/dropdown-menu/README.md +417 -5
- package/empty/README.md +329 -5
- package/field/README.md +385 -5
- package/form-checkbox/README.md +312 -2
- package/form-date-picker/README.md +322 -2
- package/form-field/README.md +356 -2
- package/form-field-simple/README.md +340 -2
- package/form-searchable-multiselect/README.md +361 -2
- package/form-select/README.md +350 -2
- package/form-text-input/README.md +371 -2
- package/form-textarea/README.md +347 -2
- package/hover-card/README.md +256 -5
- package/icon/README.md +239 -2
- package/input/README.md +269 -2
- package/input-group/README.md +335 -5
- package/input-group/fesm2022/input-group.mjs +3 -3
- package/input-otp/README.md +375 -5
- package/item/README.md +385 -5
- package/item/fesm2022/item.mjs +3 -3
- package/kbd/README.md +291 -5
- package/label/README.md +272 -2
- package/layout-simple/README.md +193 -2
- package/layout-simple/fesm2022/layout-simple.mjs +472 -236
- package/layout-simple/types/layout-simple.d.ts +174 -137
- package/menu/README.md +417 -2
- package/menubar/README.md +343 -5
- package/native-select/README.md +323 -5
- package/navigation-menu/README.md +369 -5
- package/package.json +1 -1
- package/pagination/README.md +388 -5
- package/popover/README.md +331 -2
- package/progress/README.md +311 -5
- package/radio-group/README.md +364 -2
- package/radio-group/fesm2022/radio-group.mjs +5 -1
- package/radio-group/types/radio-group.d.ts +1 -1
- package/resizable/README.md +269 -5
- package/scroll-area/README.md +233 -5
- package/searchable-multiselect/README.md +323 -2
- package/select/README.md +437 -2
- package/separator/README.md +222 -2
- package/sheet/README.md +311 -2
- package/sidebar/README.md +457 -5
- package/skeleton/README.md +217 -5
- package/slider/README.md +273 -5
- package/slider/fesm2022/slider.mjs +3 -3
- package/sonner/README.md +346 -2
- package/spinner/README.md +284 -2
- package/switch/README.md +310 -2
- package/table/README.md +423 -5
- package/tabs/README.md +411 -2
- package/tabs/fesm2022/tabs.mjs +2 -2
- package/textarea/README.md +282 -5
- package/toggle/README.md +270 -5
- package/toggle-group/README.md +340 -5
- package/tooltip/README.md +269 -2
- package/typography/README.md +271 -5
- package/typography/types/typography.d.ts +8 -8
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7
|
+
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
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.
|