@reliability-design/web 1.4.5 → 1.4.7
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/CHANGELOG.md +211 -49
- package/dist/components/rel-accordion/README.md +132 -132
- package/dist/components/rel-alert/README.md +145 -141
- package/dist/components/rel-autocomplete/README.md +156 -61
- package/dist/components/rel-avatar/README.md +116 -130
- package/dist/components/rel-badge/README.md +98 -93
- package/dist/components/rel-breadcrumb/README.md +96 -102
- package/dist/components/rel-button/README.md +160 -130
- package/dist/components/rel-calendar/README.md +109 -109
- package/dist/components/rel-card/README.md +75 -94
- package/dist/components/rel-cardmedia/README.md +100 -127
- package/dist/components/rel-carousel/README.md +184 -166
- package/dist/components/rel-checkbox/README.md +93 -75
- package/dist/components/rel-chip/README.md +132 -121
- package/dist/components/rel-container/README.md +107 -99
- package/dist/components/rel-date-picker/README.md +200 -289
- package/dist/components/rel-divider/README.md +78 -100
- package/dist/components/rel-drawer/README.md +187 -200
- package/dist/components/rel-kbd/README.md +141 -151
- package/dist/components/rel-menu/README.md +178 -151
- package/dist/components/rel-menubar/README.md +218 -329
- package/dist/components/rel-otp/README.md +170 -440
- package/dist/components/rel-pagination/README.md +100 -424
- package/dist/components/rel-popover/README.md +203 -568
- package/dist/components/rel-progress/README.md +88 -110
- package/dist/components/rel-radio/README.md +131 -135
- package/dist/components/rel-range-picker/README.md +162 -0
- package/dist/components/rel-resizable/README.md +199 -140
- package/dist/components/rel-segmented-button/README.md +155 -141
- package/dist/components/rel-select/README.md +154 -93
- package/dist/components/rel-sheet/README.md +168 -224
- package/dist/components/rel-skeleton/README.md +103 -0
- package/dist/components/rel-slider/README.md +130 -135
- package/dist/components/rel-snackbar/README.md +162 -134
- package/dist/components/rel-stepper/README.md +158 -160
- package/dist/components/rel-switch/README.md +108 -102
- package/dist/components/rel-tab/README.md +171 -163
- package/dist/components/rel-textfield/README.md +159 -69
- package/dist/components/rel-time-picker/README.md +122 -157
- package/dist/components/rel-toast/README.md +157 -148
- package/dist/components/rel-tooltip/README.md +108 -103
- package/dist/components/rel-upload/README.md +220 -0
- package/dist/index.d.mts +1387 -350
- package/dist/index.d.ts +1387 -350
- package/dist/index.js +5863 -3600
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5864 -3592
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +877 -866
- package/dist/{vars-XNMTSRVN.css → vars-JHTUGNRG.css} +877 -866
- package/package.json +4 -3
- package/dist/components/rel-accordion/rel-accordion.ts +0 -336
- package/dist/components/rel-alert/rel-alert.ts +0 -305
- package/dist/components/rel-autocomplete/rel-autocomplete.ts +0 -689
- package/dist/components/rel-avatar/rel-avatar.ts +0 -142
- package/dist/components/rel-badge/rel-badge.ts +0 -170
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +0 -106
- package/dist/components/rel-button/rel-button.ts +0 -560
- package/dist/components/rel-calendar/index.ts +0 -1
- package/dist/components/rel-calendar/rel-calendar.ts +0 -519
- package/dist/components/rel-card/rel-card.ts +0 -88
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +0 -88
- package/dist/components/rel-carousel/index.ts +0 -1
- package/dist/components/rel-carousel/rel-carousel.ts +0 -700
- package/dist/components/rel-chart/README.md +0 -286
- package/dist/components/rel-chart/index.ts +0 -1
- package/dist/components/rel-chart/rel-chart.ts +0 -754
- package/dist/components/rel-checkbox/rel-checkbox.ts +0 -382
- package/dist/components/rel-chip/rel-chip.ts +0 -472
- package/dist/components/rel-container/rel-container.ts +0 -95
- package/dist/components/rel-date-picker/date-format.test.ts +0 -43
- package/dist/components/rel-date-picker/date-format.ts +0 -47
- package/dist/components/rel-date-picker/index.ts +0 -1
- package/dist/components/rel-date-picker/rel-date-picker.ts +0 -1237
- package/dist/components/rel-divider/rel-divider.ts +0 -54
- package/dist/components/rel-drawer/index.ts +0 -1
- package/dist/components/rel-drawer/rel-drawer-footer.ts +0 -27
- package/dist/components/rel-drawer/rel-drawer.ts +0 -604
- package/dist/components/rel-kbd/rel-kbd.ts +0 -188
- package/dist/components/rel-layout/rel-layout.ts +0 -49
- package/dist/components/rel-menu/rel-menu.ts +0 -535
- package/dist/components/rel-menubar/index.ts +0 -2
- package/dist/components/rel-menubar/rel-menubar-menu.css +0 -3
- package/dist/components/rel-menubar/rel-menubar-menu.ts +0 -17
- package/dist/components/rel-menubar/rel-menubar.ts +0 -777
- package/dist/components/rel-nav-menu/README.md +0 -289
- package/dist/components/rel-nav-menu/index.ts +0 -3
- package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +0 -243
- package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +0 -72
- package/dist/components/rel-nav-menu/rel-nav-menu.ts +0 -270
- package/dist/components/rel-navbar/README.md +0 -126
- package/dist/components/rel-navbar/rel-navbar.ts +0 -105
- package/dist/components/rel-otp/index.ts +0 -1
- package/dist/components/rel-otp/rel-otp.ts +0 -517
- package/dist/components/rel-pagination/index.ts +0 -1
- package/dist/components/rel-pagination/rel-pagination.ts +0 -509
- package/dist/components/rel-popover/index.ts +0 -2
- package/dist/components/rel-popover/rel-popover-content.ts +0 -81
- package/dist/components/rel-popover/rel-popover.ts +0 -444
- package/dist/components/rel-progress/rel-progress.ts +0 -225
- package/dist/components/rel-radio/rel-radio.ts +0 -305
- package/dist/components/rel-range-picker/rel-range-picker.ts +0 -1331
- package/dist/components/rel-resizable/index.ts +0 -3
- package/dist/components/rel-resizable/rel-resizable-group.ts +0 -405
- package/dist/components/rel-resizable/rel-resizable-handle.ts +0 -150
- package/dist/components/rel-resizable/rel-resizable-panel.ts +0 -58
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +0 -213
- package/dist/components/rel-select/rel-select.ts +0 -1385
- package/dist/components/rel-sheet/rel-sheet.ts +0 -465
- package/dist/components/rel-sidebar/README.md +0 -209
- package/dist/components/rel-sidebar/rel-sidebar.ts +0 -1185
- package/dist/components/rel-skeleton/rel-skeleton.ts +0 -134
- package/dist/components/rel-slider/rel-slider.ts +0 -670
- package/dist/components/rel-snackbar/rel-snackbar.ts +0 -325
- package/dist/components/rel-stepper/rel-stepper.ts +0 -565
- package/dist/components/rel-switch/rel-switch.ts +0 -197
- package/dist/components/rel-tab/rel-tab.ts +0 -264
- package/dist/components/rel-table/README.md +0 -178
- package/dist/components/rel-table/rel-table-body.ts +0 -22
- package/dist/components/rel-table/rel-table-caption.ts +0 -30
- package/dist/components/rel-table/rel-table-cell.ts +0 -43
- package/dist/components/rel-table/rel-table-footer.ts +0 -24
- package/dist/components/rel-table/rel-table-head.ts +0 -47
- package/dist/components/rel-table/rel-table-header.ts +0 -22
- package/dist/components/rel-table/rel-table-row.ts +0 -37
- package/dist/components/rel-table/rel-table.ts +0 -62
- package/dist/components/rel-textfield/rel-textfield.ts +0 -866
- package/dist/components/rel-time-picker/rel-time-picker.ts +0 -1126
- package/dist/components/rel-toast/rel-toast.ts +0 -204
- package/dist/components/rel-tooltip/rel-tooltip.ts +0 -190
- package/dist/components/rel-topbar/rel-topbar-actions.ts +0 -27
- package/dist/components/rel-topbar/rel-topbar-brand.ts +0 -54
- package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +0 -69
- package/dist/components/rel-topbar/rel-topbar-dropdown.ts +0 -31
- package/dist/components/rel-topbar/rel-topbar-item.ts +0 -324
- package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -27
- package/dist/components/rel-topbar/rel-topbar-profile.ts +0 -243
- package/dist/components/rel-topbar/rel-topbar-utilities.ts +0 -27
- package/dist/components/rel-topbar/rel-topbar.ts +0 -446
- package/dist/components/rel-upload/UPLOAD-DESIGN-CHANGES.md +0 -134
- package/dist/components/rel-upload/rel-upload-actions.ts +0 -163
- package/dist/components/rel-upload/rel-upload.ts +0 -943
|
@@ -1,151 +1,178 @@
|
|
|
1
|
-
# rel-menu
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
```html
|
|
8
|
-
<!--
|
|
9
|
-
<rel-menu id="
|
|
10
|
-
<
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
<rel-menu
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
##
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
-
|
|
147
|
-
- Disabled
|
|
148
|
-
- In arrow
|
|
149
|
-
- The
|
|
150
|
-
-
|
|
151
|
-
|
|
1
|
+
# rel-menu
|
|
2
|
+
|
|
3
|
+
`<rel-menu>` is the vertical action menu of the Reliability Design System (Figma "Menu", 6326:2931). It renders the rows you pass in `items` as a `role="menu"` list with hover, pressed, active, disabled and virtual-focus states, in one of six `type` modes: single-select rows (`default`, plus the `fixed` / `fit` width variants), checkbox rows, radio-style `select-option` rows, or `arrow` rows that open a submenu flyout. It renders into the light DOM (no shadow root). `<rel-menu-item>` is registered alongside it as a declarative placeholder. Use `<rel-menu>` inside a `<rel-popover>` or dropdown for context and overflow actions; for a horizontal application menu bar use `<rel-menubar>`, and for a form field that picks a value use `<rel-select>`.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!-- Single-select rows (default) at the three row heights: 48 / 40 / 32 px -->
|
|
9
|
+
<rel-menu id="actions" size="large"></rel-menu>
|
|
10
|
+
<rel-menu size="medium"></rel-menu>
|
|
11
|
+
<rel-menu size="small"></rel-menu>
|
|
12
|
+
|
|
13
|
+
<!-- Multi-select rows with a checkbox control -->
|
|
14
|
+
<rel-menu id="view" type="checkbox"></rel-menu>
|
|
15
|
+
|
|
16
|
+
<!-- Single-select rows with a radio control -->
|
|
17
|
+
<rel-menu id="sort" type="select-option"></rel-menu>
|
|
18
|
+
|
|
19
|
+
<!-- Rows with submenu flyouts -->
|
|
20
|
+
<rel-menu id="file" type="arrow"></rel-menu>
|
|
21
|
+
|
|
22
|
+
<!-- Width modes: fixed 300px (override with --rel-menu-width) or shrink to content -->
|
|
23
|
+
<rel-menu type="fixed" style="--rel-menu-width: 240px"></rel-menu>
|
|
24
|
+
<rel-menu type="fit"></rel-menu>
|
|
25
|
+
|
|
26
|
+
<!-- rel-menu-item is a registered placeholder: it renders nothing and rel-menu does not read it yet -->
|
|
27
|
+
<rel-menu-item label="Rename" value="rename" icon="settings"></rel-menu-item>
|
|
28
|
+
<rel-menu-item label="Delete" value="delete" disabled></rel-menu-item>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```js
|
|
32
|
+
const actions = document.getElementById("actions");
|
|
33
|
+
actions.items = [
|
|
34
|
+
{ label: "Edit" },
|
|
35
|
+
{ label: "Copy", active: true },
|
|
36
|
+
{ label: "Paste" },
|
|
37
|
+
{ label: "Delete", disabled: true },
|
|
38
|
+
];
|
|
39
|
+
actions.addEventListener("rel-select", (e) => {
|
|
40
|
+
e.detail.item.label; // the row that was activated (its copy has active: true)
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const view = document.getElementById("view");
|
|
44
|
+
view.items = [
|
|
45
|
+
{ label: "Show grid", checked: true },
|
|
46
|
+
{ label: "Show rulers" },
|
|
47
|
+
];
|
|
48
|
+
view.addEventListener("rel-check", (e) => {
|
|
49
|
+
e.detail.item.label;
|
|
50
|
+
e.detail.checked; // new state of that row
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const file = document.getElementById("file");
|
|
54
|
+
file.items = [
|
|
55
|
+
{ label: "New", submenu: [{ label: "File" }, { label: "Folder" }] },
|
|
56
|
+
{ label: "Open", submenu: [{ label: "Recent…" }, { label: "Browse…" }] },
|
|
57
|
+
{ label: "Quit" }, // no submenu → fires rel-select
|
|
58
|
+
];
|
|
59
|
+
file.addEventListener("rel-submenu-select", (e) => {
|
|
60
|
+
e.detail.parent.label; // "New"
|
|
61
|
+
e.detail.sub.label; // "Folder"
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// The array is copied on assignment — reassign to update
|
|
65
|
+
actions.items = [...actions.items, { label: "Duplicate" }];
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
<!-- readme-gen:start -->
|
|
69
|
+
|
|
70
|
+
<!-- Generated from rel-menu.ts — do not edit; run readme-generate.mjs -->
|
|
71
|
+
|
|
72
|
+
## Elements
|
|
73
|
+
|
|
74
|
+
| Element | Class | Source |
|
|
75
|
+
| --- | --- | --- |
|
|
76
|
+
| `<rel-menu>` | `RelMenu` | `rel-menu.ts` |
|
|
77
|
+
| `<rel-menu-item>` | `RelMenuItem` | `rel-menu.ts` |
|
|
78
|
+
|
|
79
|
+
## API
|
|
80
|
+
|
|
81
|
+
### `<rel-menu>`
|
|
82
|
+
|
|
83
|
+
#### Attributes / Properties
|
|
84
|
+
|
|
85
|
+
| Property | Attribute | Type | Default | Description |
|
|
86
|
+
| --- | --- | --- | --- | --- |
|
|
87
|
+
| `type` | `type` | `"default" \| "checkbox" \| "arrow" \| "select-option" \| "fixed" \| "fit"` | `"default"` | Menu behaviour / width mode (Figma Type). `default` = single-select rows (`rel-select`); `checkbox` = toggling rows with a checkbox (`rel-check`); `select-option` = single-select rows with a radio control; `arrow` = rows whose `submenu` opens a flyout (`rel-submenu-select`); `fixed` / `fit` behave like `default` but size the menu to `--rel-menu-width` (300px) or to its content. |
|
|
88
|
+
| `size` | `size` | `"large" \| "medium" \| "small"` | `"large"` | Row size (Figma ".Menu Item" Size, 6326:616): large = 48px rows with body-lg labels (Figma default), medium = 40px / body-md, small = 32px / body-sm. Added in 1.4.7; before that rows were a fixed 36px. Reflected. |
|
|
89
|
+
| `items` | `items` | `MenuItem[]` | `[]` | The rows to render, in order. Each entry is a `MenuItem` (`label`, optional `active`, `checked`, `disabled`, `submenu`, `open`). The array is copied on assignment, so mutate and reassign it to update the menu. |
|
|
90
|
+
|
|
91
|
+
### Events
|
|
92
|
+
|
|
93
|
+
| Event | Detail | Bubbles / composed | Description |
|
|
94
|
+
| --- | --- | --- | --- |
|
|
95
|
+
| `rel-check` | `{ item: updated, checked: updated.checked }` | bubbles / composed | Fired when a `type="checkbox"` row is toggled. Detail: `{ item: MenuItem, checked: boolean }` — `item` is the updated row. |
|
|
96
|
+
| `rel-select` | `{ item: updated }` | bubbles / composed | Fired when a row is activated in `default`, `select-option`, `fixed` or `fit` mode (and for submenu-less rows in `arrow` mode). Detail: `{ item: MenuItem }` — the row, now `active`. |
|
|
97
|
+
| `rel-submenu-select` | `{ parent: this._items[parentIndex], sub: this._items[parentIndex]?.submenu?.[subIndex], }` | bubbles / composed | Fired when an entry inside a `type="arrow"` submenu is activated (the submenu closes). Detail: `{ parent: MenuItem, sub: MenuItem }`. |
|
|
98
|
+
|
|
99
|
+
### Slots
|
|
100
|
+
|
|
101
|
+
| Slot | Description |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| — | This element has no slots. |
|
|
104
|
+
|
|
105
|
+
### CSS Parts
|
|
106
|
+
|
|
107
|
+
| Part | Description |
|
|
108
|
+
| --- | --- |
|
|
109
|
+
| `panel` | A submenu flyout (`type="arrow"` only; light-DOM `[part="panel"]` attribute) |
|
|
110
|
+
| `list` | The `role="menu"` root list (a light-DOM `[part="list"]` attribute) |
|
|
111
|
+
|
|
112
|
+
### `<rel-menu-item>`
|
|
113
|
+
|
|
114
|
+
#### Attributes / Properties
|
|
115
|
+
|
|
116
|
+
| Property | Attribute | Type | Default | Description |
|
|
117
|
+
| --- | --- | --- | --- | --- |
|
|
118
|
+
| `label` | `label` | `string` | `""` | Display text of the item. |
|
|
119
|
+
| `value` | `value` | `string` | `""` | Value that identifies the item (not used by `rel-menu` today). |
|
|
120
|
+
| `disabled` | `disabled` | `boolean` | `false` | Marks the item as non-interactive. |
|
|
121
|
+
| `icon` | `icon` | `string` | `""` | `rel-icon` name to render before the label (not used by `rel-menu` today). |
|
|
122
|
+
|
|
123
|
+
### Events
|
|
124
|
+
|
|
125
|
+
| Event | Detail | Bubbles / composed | Description |
|
|
126
|
+
| --- | --- | --- | --- |
|
|
127
|
+
| — | — | — | This element emits no custom events. |
|
|
128
|
+
|
|
129
|
+
### Slots
|
|
130
|
+
|
|
131
|
+
| Slot | Description |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| — | This element has no slots. |
|
|
134
|
+
|
|
135
|
+
### CSS Parts
|
|
136
|
+
|
|
137
|
+
| Part | Description |
|
|
138
|
+
| --- | --- |
|
|
139
|
+
| — | None exposed. |
|
|
140
|
+
|
|
141
|
+
<!-- readme-gen:end -->
|
|
142
|
+
|
|
143
|
+
## Accessibility
|
|
144
|
+
|
|
145
|
+
- The list (part `list`) is a `role="menu"` named "Menu" with `tabindex="0"`. DOM focus stays on this container; the row that has virtual focus is exposed through `aria-activedescendant` (every row has a stable id) and highlighted with a 2px `--rel-border-focus` outline inset 2px.
|
|
146
|
+
- Row roles follow `type`: `menuitem` for `default` / `arrow` / `fixed` / `fit`, `menuitemcheckbox` with `aria-checked` for `checkbox`, `menuitemradio` with `aria-checked` for `select-option`. Checkbox and select-option rows carry `aria-label` = the row label because their inner `<rel-checkbox>` / `<rel-radio>` control is rendered `inert` and `aria-hidden` (the row itself is the single click target).
|
|
147
|
+
- Disabled rows have `aria-disabled="true"`, render at 40% opacity with a `not-allowed` cursor and ignore clicks and Enter / Space.
|
|
148
|
+
- In `type="arrow"`, a row with a `submenu` has `aria-haspopup="menu"` and `aria-expanded`; the flyout (part `panel`) is a nested `role="menu"` of `menuitem` rows.
|
|
149
|
+
- The container shows a 2px `--rel-border-focus` outline (2px offset) on `:focus-visible`.
|
|
150
|
+
- No live-region announcements are made.
|
|
151
|
+
|
|
152
|
+
| Key (virtual focus in the main list) | Action |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| ArrowDown / ArrowUp | Move virtual focus to the next / previous row (stops at the ends, no wrap) |
|
|
155
|
+
| Home / End | First / last row |
|
|
156
|
+
| Enter / Space | Activate the row: fires `rel-select` or `rel-check`; on an `arrow` row with a submenu, opens (locks) that submenu and moves virtual focus to its first entry |
|
|
157
|
+
| ArrowRight | `arrow` type: open the focused row's submenu and focus its first entry |
|
|
158
|
+
| ArrowLeft / Escape | Close any open submenu (Escape's propagation is stopped only when a submenu was open, so an enclosing popover does not close in the same keystroke) |
|
|
159
|
+
|
|
160
|
+
| Key (virtual focus inside an open submenu) | Action |
|
|
161
|
+
| --- | --- |
|
|
162
|
+
| ArrowDown / ArrowUp | Next / previous submenu entry |
|
|
163
|
+
| Home / End | First / last submenu entry |
|
|
164
|
+
| Enter / Space | Activate the entry (fires `rel-submenu-select`, closes the submenu) |
|
|
165
|
+
| ArrowLeft / Escape | Close the submenu and return virtual focus to its parent row |
|
|
166
|
+
|
|
167
|
+
## Notes / Edge Cases
|
|
168
|
+
|
|
169
|
+
- `MenuItem` shape: `{ label: string; active?: boolean; checked?: boolean; disabled?: boolean; submenu?: MenuItem[]; open?: boolean }`. `active` marks the selected row (`default`, `fixed`, `fit`, `select-option`, submenu entries), `checked` the checkbox state, `submenu` / `open` the flyout rows and their initial visibility (`arrow` only).
|
|
170
|
+
- The menu keeps an internal copy of `items`; user interaction updates that copy, never your array. Read the current state from the event detail (`item`, `checked`, `parent` / `sub`) — the objects in `e.detail` are the updated copies. Reassign `items` to change the rows.
|
|
171
|
+
- Light DOM: `createRenderRoot()` returns the element, so the menu's CSS is injected as a `<style>` block and page styles can reach it. The parts are plain `part` attributes — target them with `rel-menu [part="list"]` / `rel-menu [part="panel"]`, not `::part()`.
|
|
172
|
+
- `size` is reflected as an attribute and the row rules key off `rel-menu[size="…"]`; submenu rows follow the same size.
|
|
173
|
+
- `type="arrow"`: hovering a row opens its submenu and leaving closes it, unless the row was clicked — a click locks the submenu open (click again to unlock). Keyboard opening also locks. A click outside the menu (detected through `composedPath`, so it works inside shadow roots) closes every submenu. Only one submenu is open at a time. Rows without a `submenu` in this mode behave like `default` rows and fire `rel-select`.
|
|
174
|
+
- `rel-select` in `select-option` mode sets `active` on the chosen row and clears it on the others; the radio control mirrors that state. `rel-check` toggles independently per row.
|
|
175
|
+
- The flyout is positioned `left: 100%` of its row with `z-index: 20` and stays inside the menu's box, so a menu placed at the right edge of a clipping container will have its flyout cut off; the menu itself deliberately does not use `overflow: hidden`.
|
|
176
|
+
- `--rel-menu-width` (default 300px) is read only when `type="fixed"`; other types have `min-width: 220px` (`fit` drops it and uses `max-content`). Submenus have `min-width: 200px`.
|
|
177
|
+
- `<rel-menu-item>` renders nothing and is not read by `<rel-menu>` today; it exists so markup can carry item metadata for future declarative support. Build menus from the `items` property.
|
|
178
|
+
- This module imports `rel-checkbox`, `rel-radio` and `rel-icon`, so those elements are registered whenever `rel-menu` is loaded.
|