@rcarls/rc-menu 0.2.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.
package/dist/demo.js DELETED
@@ -1,40 +0,0 @@
1
- const THEMES = ['', 'light', 'dark', 'solarized-light', 'solarized-dark'];
2
- const LABELS = ['Auto', 'Light', 'Dark', 'Solarized ☀', 'Solarized ☾'];
3
-
4
- const stored = localStorage.getItem('rc-demo-theme') ?? '';
5
- applyTheme(stored);
6
-
7
- function applyTheme(theme) {
8
- if (theme) {
9
- document.documentElement.dataset.theme = theme;
10
- } else {
11
- delete document.documentElement.dataset.theme;
12
- }
13
- }
14
-
15
- function currentIndex() {
16
- const current = document.documentElement.dataset.theme ?? '';
17
- const idx = THEMES.indexOf(current);
18
- return idx === -1 ? 0 : idx;
19
- }
20
-
21
- function updateButtons() {
22
- const label = LABELS[currentIndex()];
23
- document.querySelectorAll('.theme-picker').forEach((btn) => {
24
- btn.textContent = label;
25
- });
26
- }
27
-
28
- window.cycleTheme = function () {
29
- const next = THEMES[(currentIndex() + 1) % THEMES.length];
30
- applyTheme(next);
31
- localStorage.setItem('rc-demo-theme', next);
32
- updateButtons();
33
- };
34
-
35
- document.addEventListener('DOMContentLoaded', () => {
36
- updateButtons();
37
- document.querySelectorAll('.theme-picker').forEach((btn) => {
38
- btn.addEventListener('click', window.cycleTheme);
39
- });
40
- });
@@ -1,187 +0,0 @@
1
- import { css as m, LitElement as u, html as v } from "lit";
2
- import { property as h, query as p } from "lit/decorators.js";
3
- import { RovingTabIndexMixin as b, isFocusable as l, keyNavigation as f } from "@rcarls/rc-common";
4
- const g = m`
5
- :host {
6
- display: block;
7
- }
8
-
9
- #root {
10
- display: flex;
11
- flex-direction: column;
12
- min-width: var(--rc-menu-min-width, 10em);
13
- padding-block: var(--rc-menu-padding-block, var(--rc-control-padding-block, 0.25em));
14
- background: var(--rc-menu-background, var(--rc-surface, Canvas));
15
- border: var(--rc-menu-border, var(--rc-border, 1px solid ButtonBorder));
16
- border-radius: var(--rc-menu-radius, var(--rc-control-radius, 0));
17
- box-shadow: var(--rc-menu-shadow, var(--rc-shadow, 0 2px 8px color-mix(in srgb, CanvasText 15%, transparent)));
18
- color: var(--rc-menu-color, var(--rc-field-text, CanvasText));
19
- font-family: var(--rc-font-family, inherit);
20
- font-size: var(--rc-font-size, inherit);
21
- line-height: var(--rc-line-height, normal);
22
- overflow: hidden;
23
-
24
- /* Focus styling for keyboard navigation */
25
- &[data-interaction-mode='keyboard']:focus-within {
26
- outline: var(--rc-focus-ring, auto);
27
- outline-offset: var(--rc-focus-ring-offset, 0);
28
- }
29
- }
30
-
31
- #slot-wrap {
32
- display: contents;
33
- }
34
-
35
- ::slotted(button),
36
- ::slotted([role='menuitem']),
37
- ::slotted([role='menuitemradio']),
38
- ::slotted([role='menuitemcheckbox']) {
39
- display: flex;
40
- align-items: center;
41
- gap: var(--rc-menu-item-gap, var(--rc-item-gap, 0.5em));
42
- width: 100%;
43
- text-align: start;
44
- padding: var(--rc-menu-item-padding-block, var(--rc-item-padding-block, 0.3em))
45
- var(--rc-menu-item-padding-inline, var(--rc-item-padding-inline, 0.75em));
46
- }
47
-
48
- ::slotted(svg),
49
- ::slotted(img) {
50
- flex: 0 0 auto;
51
- inline-size: var(--rc-menu-icon-size, 1.2em);
52
- block-size: var(--rc-menu-icon-size, 1.2em);
53
- max-inline-size: var(--rc-menu-icon-size, 1.2em);
54
- max-block-size: var(--rc-menu-icon-size, 1.2em);
55
- }
56
-
57
- ::slotted(button:disabled),
58
- ::slotted([aria-disabled='true']) {
59
- color: var(--rc-menu-disabled-color, var(--rc-text-disabled, GrayText));
60
- opacity: var(--rc-menu-disabled-opacity, var(--rc-disabled-opacity, 0.55));
61
- cursor: default;
62
- }
63
-
64
- /* Groups stack their children vertically and stretch them to full width. */
65
- ::slotted([role='group']) {
66
- display: flex;
67
- flex-direction: column;
68
- align-items: stretch;
69
- }
70
-
71
- ::slotted([role='separator']),
72
- ::slotted(hr) {
73
- border: none;
74
- border-block-start: var(--rc-menu-separator-border, var(--rc-border, 1px solid ButtonBorder));
75
- margin-block: var(--rc-menu-separator-margin-block, var(--rc-control-gap, 0.25em));
76
- }
77
- `;
78
- var x = Object.defineProperty, d = (n, e, t, o) => {
79
- for (var r = void 0, i = n.length - 1, c; i >= 0; i--)
80
- (c = n[i]) && (r = c(e, t, r) || r);
81
- return r && x(e, t, r), r;
82
- };
83
- const k = ["menuitem", "menuitemcheckbox", "menuitemradio"], s = class s extends b(u) {
84
- constructor() {
85
- super(...arguments), this.label = "";
86
- }
87
- /**
88
- * Collects navigable menu items from the slot, supporting `role="group"`
89
- * containers and skipping `role="separator"` elements.
90
- *
91
- * Direct focusable children are included as-is. Elements with
92
- * `role="group"` are traversed one level deep so their focusable children
93
- * participate in arrow-key navigation. Separators and non-focusable
94
- * container elements are excluded.
95
- */
96
- _collectItems(e) {
97
- const t = [];
98
- for (const o of e.assignedElements()) {
99
- const r = o.getAttribute("role");
100
- if (r !== "separator") {
101
- if (r === "group") {
102
- for (const i of o.children)
103
- l(i) && t.push(i);
104
- continue;
105
- }
106
- l(o) && t.push(o);
107
- }
108
- }
109
- return t;
110
- }
111
- _initItems() {
112
- super._initItems(), this.items.forEach((e) => {
113
- const t = e.getAttribute("role");
114
- (!t || !k.includes(t)) && e.setAttribute("role", "menuitem");
115
- });
116
- }
117
- _onNavigate(e) {
118
- switch (e) {
119
- case "next":
120
- this.focusItem(this.nextItem);
121
- break;
122
- case "prev":
123
- this.focusItem(this.previousItem);
124
- break;
125
- case "start":
126
- this.focusItem(this.firstItem);
127
- break;
128
- case "end":
129
- this.focusItem(this.lastItem);
130
- break;
131
- case "activate":
132
- this._lastFocused && (this._lastFocused.click(), this.dispatchEvent(
133
- new CustomEvent("rc-menu-activate", {
134
- bubbles: !0,
135
- composed: !0,
136
- detail: {
137
- item: this._lastFocused,
138
- value: this._lastFocused.dataset.value ?? this._lastFocused.getAttribute("value") ?? "",
139
- text: this._lastFocused.textContent?.trim() ?? ""
140
- }
141
- })
142
- ));
143
- break;
144
- case "escape":
145
- this.dispatchEvent(
146
- new CustomEvent("rc-menu-close", {
147
- bubbles: !0,
148
- composed: !0,
149
- detail: { reason: "escape" }
150
- })
151
- );
152
- break;
153
- }
154
- }
155
- render() {
156
- return v`
157
- <div
158
- id="root"
159
- part="root"
160
- ${f(this._onNavigate, {
161
- handleEscape: !0,
162
- handleActivate: !0
163
- })}
164
- data-interaction-mode="keyboard"
165
- role="menu"
166
- aria-label=${this.label}
167
- tabindex="-1"
168
- >
169
- <div id="slot-wrap" @focusin=${this._handleItemFocus}>
170
- <slot id="items" @slotchange=${this._onSlotChange}></slot>
171
- </div>
172
- </div>
173
- `;
174
- }
175
- };
176
- s.styles = [g];
177
- let a = s;
178
- d([
179
- h({ type: String })
180
- ], a.prototype, "label");
181
- d([
182
- p("#root", !0)
183
- ], a.prototype, "_$root");
184
- export {
185
- a as R
186
- };
187
- //# sourceMappingURL=rc-menu-Bd1Ytmx9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rc-menu-Bd1Ytmx9.js","sources":["../src/rc-menu.styles.ts","../src/rc-menu.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const menuStyles = css`\n :host {\n display: block;\n }\n\n #root {\n display: flex;\n flex-direction: column;\n min-width: var(--rc-menu-min-width, 10em);\n padding-block: var(--rc-menu-padding-block, var(--rc-control-padding-block, 0.25em));\n background: var(--rc-menu-background, var(--rc-surface, Canvas));\n border: var(--rc-menu-border, var(--rc-border, 1px solid ButtonBorder));\n border-radius: var(--rc-menu-radius, var(--rc-control-radius, 0));\n box-shadow: var(--rc-menu-shadow, var(--rc-shadow, 0 2px 8px color-mix(in srgb, CanvasText 15%, transparent)));\n color: var(--rc-menu-color, var(--rc-field-text, CanvasText));\n font-family: var(--rc-font-family, inherit);\n font-size: var(--rc-font-size, inherit);\n line-height: var(--rc-line-height, normal);\n overflow: hidden;\n\n /* Focus styling for keyboard navigation */\n &[data-interaction-mode='keyboard']:focus-within {\n outline: var(--rc-focus-ring, auto);\n outline-offset: var(--rc-focus-ring-offset, 0);\n }\n }\n\n #slot-wrap {\n display: contents;\n }\n\n ::slotted(button),\n ::slotted([role='menuitem']),\n ::slotted([role='menuitemradio']),\n ::slotted([role='menuitemcheckbox']) {\n display: flex;\n align-items: center;\n gap: var(--rc-menu-item-gap, var(--rc-item-gap, 0.5em));\n width: 100%;\n text-align: start;\n padding: var(--rc-menu-item-padding-block, var(--rc-item-padding-block, 0.3em))\n var(--rc-menu-item-padding-inline, var(--rc-item-padding-inline, 0.75em));\n }\n\n ::slotted(svg),\n ::slotted(img) {\n flex: 0 0 auto;\n inline-size: var(--rc-menu-icon-size, 1.2em);\n block-size: var(--rc-menu-icon-size, 1.2em);\n max-inline-size: var(--rc-menu-icon-size, 1.2em);\n max-block-size: var(--rc-menu-icon-size, 1.2em);\n }\n\n ::slotted(button:disabled),\n ::slotted([aria-disabled='true']) {\n color: var(--rc-menu-disabled-color, var(--rc-text-disabled, GrayText));\n opacity: var(--rc-menu-disabled-opacity, var(--rc-disabled-opacity, 0.55));\n cursor: default;\n }\n\n /* Groups stack their children vertically and stretch them to full width. */\n ::slotted([role='group']) {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n }\n\n ::slotted([role='separator']),\n ::slotted(hr) {\n border: none;\n border-block-start: var(--rc-menu-separator-border, var(--rc-border, 1px solid ButtonBorder));\n margin-block: var(--rc-menu-separator-margin-block, var(--rc-control-gap, 0.25em));\n }\n`;\n\nexport default menuStyles;\n","import { LitElement, html } from 'lit';\nimport { property, query } from 'lit/decorators.js';\n\nimport {\n isFocusable,\n keyNavigation,\n type FocusableElement,\n type KeyboardNavigationAction,\n RovingTabIndexMixin,\n} from '@rcarls/rc-common';\n\nimport menuStyles from './rc-menu.styles';\n\nexport interface RCMenuActivateEvent {\n item: HTMLElement;\n value: string;\n text: string;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rc-menu': RCMenu;\n }\n}\n\n/** WAI-ARIA roles that are valid direct children of `role=\"menu\"`. */\nconst MENU_ITEM_ROLES = ['menuitem', 'menuitemcheckbox', 'menuitemradio'] as const;\n\n/**\n * A menu component, as defined in WAI-ARIA\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/menu/\n * @slot Takes any number of child elements to display in the menu. Only focusable elements are navigable.\n * @fires rc-menu-activate - Fired when a menu item is activated via Enter or Space\n * @fires rc-menu-close - Fired when Escape is pressed\n * @cssprop [--rc-menu-min-width=10em] - Minimum width of the menu panel\n * @cssprop [--rc-menu-padding-block=0.25em] - Block (top/bottom) padding inside the panel\n * @cssprop [--rc-menu-background=Canvas] - Background color; falls back through --rc-surface\n * @cssprop [--rc-menu-border=1px solid ButtonBorder] - Border; falls back through --rc-border\n * @cssprop [--rc-menu-radius=var(--rc-control-radius)] - Menu panel border radius\n * @cssprop [--rc-menu-shadow=0 2px 8px color-mix(in srgb, CanvasText 15%, transparent)] - Box shadow; falls back through --rc-shadow\n * @cssprop [--rc-menu-item-padding-block=var(--rc-item-padding-block)] - Menu item block-axis padding\n * @cssprop [--rc-menu-item-padding-inline=var(--rc-item-padding-inline)] - Menu item inline-axis padding\n * @cssprop [--rc-menu-item-gap=var(--rc-item-gap)] - Gap between icon and text content in flex menu items\n * @cssprop [--rc-menu-icon-size=1.2em] - Size clamp for direct slotted icon media\n * @cssprop [--rc-menu-disabled-color=GrayText] - Disabled menu item text color\n * @cssprop [--rc-menu-disabled-opacity=var(--rc-disabled-opacity)] - Disabled menu item opacity\n * @cssprop [--rc-menu-separator-border=var(--rc-border)] - Separator border\n * @cssprop [--rc-menu-separator-margin-block=var(--rc-control-gap)] - Separator block-axis margin\n * @csspart root - The root container element\n */\nexport class RCMenu extends RovingTabIndexMixin(LitElement) {\n static styles = [menuStyles];\n\n /** Accessible label for this menu. */\n @property({ type: String })\n label = '';\n\n @query('#root', true)\n protected _$root!: HTMLDivElement;\n\n /**\n * Collects navigable menu items from the slot, supporting `role=\"group\"`\n * containers and skipping `role=\"separator\"` elements.\n *\n * Direct focusable children are included as-is. Elements with\n * `role=\"group\"` are traversed one level deep so their focusable children\n * participate in arrow-key navigation. Separators and non-focusable\n * container elements are excluded.\n */\n protected override _collectItems(slot: HTMLSlotElement): FocusableElement[] {\n const items: FocusableElement[] = [];\n\n for (const el of slot.assignedElements()) {\n const role = el.getAttribute('role');\n\n if (role === 'separator') continue;\n\n if (role === 'group') {\n for (const child of el.children) {\n if (isFocusable(child)) items.push(child as FocusableElement);\n }\n continue;\n }\n\n if (isFocusable(el)) items.push(el as FocusableElement);\n }\n\n return items;\n }\n\n protected override _initItems() {\n super._initItems(); // sets tabindex 0/−1\n\n this.items.forEach((el) => {\n const existingRole = el.getAttribute('role');\n\n // Preserve explicit WAI-ARIA menu item roles set by the consumer.\n // Only assign the menuitem default when no valid role is present.\n if (!existingRole || !MENU_ITEM_ROLES.includes(existingRole as typeof MENU_ITEM_ROLES[number])) {\n el.setAttribute('role', 'menuitem');\n }\n });\n }\n\n protected _onNavigate(action: KeyboardNavigationAction) {\n switch (action) {\n case 'next':\n this.focusItem(this.nextItem);\n break;\n case 'prev':\n this.focusItem(this.previousItem);\n break;\n case 'start':\n this.focusItem(this.firstItem);\n break;\n case 'end':\n this.focusItem(this.lastItem);\n break;\n case 'activate':\n if (this._lastFocused) {\n this._lastFocused.click();\n this.dispatchEvent(\n new CustomEvent<RCMenuActivateEvent>('rc-menu-activate', {\n bubbles: true,\n composed: true,\n detail: {\n item: this._lastFocused,\n value: this._lastFocused.dataset.value ?? this._lastFocused.getAttribute('value') ?? '',\n text: this._lastFocused.textContent?.trim() ?? '',\n },\n }),\n );\n }\n break;\n case 'escape':\n this.dispatchEvent(\n new CustomEvent('rc-menu-close', {\n bubbles: true,\n composed: true,\n detail: { reason: 'escape' },\n }),\n );\n break;\n }\n }\n\n protected render() {\n return html`\n <div\n id=\"root\"\n part=\"root\"\n ${keyNavigation(this._onNavigate, {\n handleEscape: true,\n handleActivate: true,\n })}\n data-interaction-mode=\"keyboard\"\n role=\"menu\"\n aria-label=${this.label}\n tabindex=\"-1\"\n >\n <div id=\"slot-wrap\" @focusin=${this._handleItemFocus}>\n <slot id=\"items\" @slotchange=${this._onSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport default RCMenu;\n"],"names":["menuStyles","css","MENU_ITEM_ROLES","_RCMenu","RovingTabIndexMixin","LitElement","slot","items","el","role","child","isFocusable","existingRole","action","html","keyNavigation","RCMenu","__decorateClass","property","query"],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- import { LitElement } from 'lit';
2
- import { FocusableElement, KeyboardNavigationAction } from '@rcarls/rc-common';
3
- export interface RCMenuActivateEvent {
4
- item: HTMLElement;
5
- value: string;
6
- text: string;
7
- }
8
- declare global {
9
- interface HTMLElementTagNameMap {
10
- 'rc-menu': RCMenu;
11
- }
12
- }
13
- declare const RCMenu_base: typeof LitElement & (new (...args: any[]) => import('@rcarls/rc-common').RovingTabIndexMixinBase);
14
- /**
15
- * A menu component, as defined in WAI-ARIA
16
- *
17
- * @see https://www.w3.org/WAI/ARIA/apg/patterns/menu/
18
- * @slot Takes any number of child elements to display in the menu. Only focusable elements are navigable.
19
- * @fires rc-menu-activate - Fired when a menu item is activated via Enter or Space
20
- * @fires rc-menu-close - Fired when Escape is pressed
21
- * @cssprop [--rc-menu-min-width=10em] - Minimum width of the menu panel
22
- * @cssprop [--rc-menu-padding-block=0.25em] - Block (top/bottom) padding inside the panel
23
- * @cssprop [--rc-menu-background=Canvas] - Background color; falls back through --rc-surface
24
- * @cssprop [--rc-menu-border=1px solid ButtonBorder] - Border; falls back through --rc-border
25
- * @cssprop [--rc-menu-radius=var(--rc-control-radius)] - Menu panel border radius
26
- * @cssprop [--rc-menu-shadow=0 2px 8px color-mix(in srgb, CanvasText 15%, transparent)] - Box shadow; falls back through --rc-shadow
27
- * @cssprop [--rc-menu-item-padding-block=var(--rc-item-padding-block)] - Menu item block-axis padding
28
- * @cssprop [--rc-menu-item-padding-inline=var(--rc-item-padding-inline)] - Menu item inline-axis padding
29
- * @cssprop [--rc-menu-item-gap=var(--rc-item-gap)] - Gap between icon and text content in flex menu items
30
- * @cssprop [--rc-menu-icon-size=1.2em] - Size clamp for direct slotted icon media
31
- * @cssprop [--rc-menu-disabled-color=GrayText] - Disabled menu item text color
32
- * @cssprop [--rc-menu-disabled-opacity=var(--rc-disabled-opacity)] - Disabled menu item opacity
33
- * @cssprop [--rc-menu-separator-border=var(--rc-border)] - Separator border
34
- * @cssprop [--rc-menu-separator-margin-block=var(--rc-control-gap)] - Separator block-axis margin
35
- * @csspart root - The root container element
36
- */
37
- export declare class RCMenu extends RCMenu_base {
38
- static styles: import('lit').CSSResult[];
39
- /** Accessible label for this menu. */
40
- label: string;
41
- protected _$root: HTMLDivElement;
42
- /**
43
- * Collects navigable menu items from the slot, supporting `role="group"`
44
- * containers and skipping `role="separator"` elements.
45
- *
46
- * Direct focusable children are included as-is. Elements with
47
- * `role="group"` are traversed one level deep so their focusable children
48
- * participate in arrow-key navigation. Separators and non-focusable
49
- * container elements are excluded.
50
- */
51
- protected _collectItems(slot: HTMLSlotElement): FocusableElement[];
52
- protected _initItems(): void;
53
- protected _onNavigate(action: KeyboardNavigationAction): void;
54
- protected render(): import('lit').TemplateResult<1>;
55
- }
56
- export default RCMenu;