@rcarls/rc-menubar 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.
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,227 +0,0 @@
1
- import { css as f, LitElement as g, html as v } from "lit";
2
- import { property as d, state as m } from "lit/decorators.js";
3
- import "@rcarls/rc-common";
4
- const p = f`
5
- :host {
6
- display: inline-block;
7
- }
8
-
9
- #root {
10
- display: flex;
11
- flex-direction: row;
12
- align-items: stretch;
13
- gap: var(--rc-menubar-gap, var(--rc-control-gap, 0.25em));
14
- padding-inline: var(--rc-menubar-padding-inline, var(--rc-control-padding-inline, 0.25em));
15
- padding-block: var(--rc-menubar-padding-block, var(--rc-control-padding-block, 0.25em));
16
- border: var(--rc-menubar-border, var(--rc-border, 1px solid ButtonBorder));
17
- border-radius: var(--rc-menubar-radius, var(--rc-control-radius, 0));
18
- background: var(--rc-menubar-background, var(--rc-surface, Canvas));
19
- color: var(--rc-menubar-color, var(--rc-field-text, CanvasText));
20
- font-family: var(--rc-font-family, inherit);
21
- font-size: var(--rc-font-size, inherit);
22
- line-height: var(--rc-line-height, normal);
23
- }
24
-
25
- :host([orientation='vertical']) #root {
26
- flex-direction: column;
27
- align-items: stretch;
28
- }
29
-
30
- #slot-wrap {
31
- display: flex;
32
- flex-direction: inherit;
33
- align-items: stretch;
34
- gap: inherit;
35
- min-inline-size: 0;
36
- }
37
-
38
- ::slotted(rc-menu-button) {
39
- flex: 0 0 auto;
40
- }
41
-
42
- :host([orientation='vertical']) ::slotted(rc-menu-button) {
43
- inline-size: 100%;
44
- }
45
- `;
46
- var b = Object.defineProperty, u = (c, t, e, n) => {
47
- for (var r = void 0, i = c.length - 1, s; i >= 0; i--)
48
- (s = c[i]) && (r = s(t, e, r) || r);
49
- return r && b(t, e, r), r;
50
- };
51
- const l = class l extends g {
52
- constructor() {
53
- super(...arguments), this.label = "Menu", this.orientation = "horizontal", this._menuButtons = [], this._boundHandleKeydown = this._handleKeydown.bind(this), this._boundHandleClick = this._handleClick.bind(this);
54
- }
55
- connectedCallback() {
56
- super.connectedCallback(), this._syncHostAria(), this.addEventListener("keydown", this._boundHandleKeydown), this.addEventListener("click", this._boundHandleClick);
57
- }
58
- disconnectedCallback() {
59
- super.disconnectedCallback(), this.removeEventListener("keydown", this._boundHandleKeydown), this.removeEventListener("click", this._boundHandleClick);
60
- }
61
- updated(t) {
62
- super.updated(t), (t.has("label") || t.has("orientation")) && (this._syncHostAria(), this._syncMenuButtonOrientation());
63
- }
64
- /** Keep ARIA semantics on the custom element host for slotted children. */
65
- _syncHostAria() {
66
- this.setAttribute("role", "menubar"), this.setAttribute("aria-label", this.label), this.setAttribute("aria-orientation", this.orientation);
67
- }
68
- _syncMenuButtonOrientation() {
69
- this.menuButtons.forEach((t) => {
70
- t.orientation = this.orientation;
71
- });
72
- }
73
- /** Get the trigger element from a menu button */
74
- _getTrigger(t) {
75
- return t.querySelector('[slot="trigger"]');
76
- }
77
- /** Array of focusable trigger elements */
78
- get items() {
79
- return this._menuButtons.map((t) => t.deref()).filter((t) => t != null).map((t) => this._getTrigger(t)).filter((t) => t != null);
80
- }
81
- /** Array of menu button elements */
82
- get menuButtons() {
83
- return this._menuButtons.map((t) => t.deref()).filter((t) => t != null);
84
- }
85
- /** First trigger element */
86
- get firstItem() {
87
- return this.items.at(0);
88
- }
89
- /** Last trigger element */
90
- get lastItem() {
91
- return this.items.at(-1);
92
- }
93
- /** Next trigger element, in tab-order */
94
- get nextItem() {
95
- const t = this._lastFocused ? this.items.indexOf(this._lastFocused) : 0;
96
- return this.items.at((t + 1) % this.items.length);
97
- }
98
- /** Previous trigger element, in tab-order */
99
- get previousItem() {
100
- const t = this._lastFocused ? this.items.indexOf(this._lastFocused) : 0;
101
- return this.items.at((t - 1) % this.items.length);
102
- }
103
- /** Get the menu button that contains a trigger */
104
- _getMenuButtonForTrigger(t) {
105
- return this.menuButtons.find((e) => this._getTrigger(e) === t);
106
- }
107
- /** Set focus to a specific trigger element */
108
- focusItem(t) {
109
- t?.focus();
110
- }
111
- /** Close any open menu */
112
- closeActiveMenu() {
113
- const t = this._activeMenuButton?.deref();
114
- t && (t.closeMenu(!1), this._activeMenuButton = void 0);
115
- }
116
- _handleItemFocus(t) {
117
- const e = t.target;
118
- e.slot === "trigger" && (this._lastFocused = e, this.items.forEach((n) => n.setAttribute("tabindex", "-1")), e.setAttribute("tabindex", "0"));
119
- }
120
- _handleSlotChange(t) {
121
- const n = t.currentTarget.assignedElements(), r = this._menuButtons;
122
- this._menuButtons = n.filter((i) => i.tagName === "RC-MENU-BUTTON").map((i) => new WeakRef(i)), queueMicrotask(() => {
123
- if (!this.isConnected) return;
124
- r.forEach((s) => {
125
- const o = s.deref();
126
- if (!o) return;
127
- o.removeAttribute("role");
128
- const h = this._getTrigger(o);
129
- h?.removeAttribute("tabindex"), h?.removeAttribute("role");
130
- }), this.menuButtons.forEach((s) => {
131
- s.removeAttribute("role"), s.orientation = this.orientation, this._getTrigger(s)?.setAttribute("role", "menuitem");
132
- });
133
- const i = this.items;
134
- i.forEach((s, o) => {
135
- s.setAttribute("tabindex", o === 0 ? "0" : "-1");
136
- }), i.length > 0 && !this._lastFocused && (this._lastFocused = i[0]);
137
- });
138
- }
139
- _handleMenuButtonToggle(t) {
140
- const e = t.target;
141
- t.detail.open ? this._activeMenuButton = new WeakRef(e) : this._activeMenuButton?.deref() === e && (this._activeMenuButton = void 0);
142
- }
143
- _handleNavigate(t) {
144
- const n = this._activeMenuButton?.deref()?.open ?? !1;
145
- switch (t) {
146
- case "next": {
147
- n && this.closeActiveMenu(), this.focusItem(this.nextItem), n && this._openCurrentMenu();
148
- break;
149
- }
150
- case "prev": {
151
- n && this.closeActiveMenu(), this.focusItem(this.previousItem), n && this._openCurrentMenu();
152
- break;
153
- }
154
- case "start":
155
- n && this.closeActiveMenu(), this.focusItem(this.firstItem), n && this._openCurrentMenu();
156
- break;
157
- case "end":
158
- n && this.closeActiveMenu(), this.focusItem(this.lastItem), n && this._openCurrentMenu();
159
- break;
160
- case "escape":
161
- this.closeActiveMenu();
162
- break;
163
- }
164
- }
165
- _openCurrentMenu() {
166
- if (this._lastFocused) {
167
- const t = this._getMenuButtonForTrigger(this._lastFocused);
168
- t && t.openMenu();
169
- }
170
- }
171
- _handleKeydown(t) {
172
- const e = this._normalizeKey(t.key), n = this.orientation === "horizontal" ? "ArrowRight" : "ArrowDown", r = this.orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
173
- let i;
174
- e === n ? i = "next" : e === r ? i = "prev" : e === "Home" ? i = "start" : e === "End" ? i = "end" : e === "Escape" ? i = "escape" : e === "Tab" && this.setAttribute("data-interaction-mode", "keyboard"), i && (this._handleNavigate(i), this.setAttribute("data-interaction-mode", "keyboard"), t.stopPropagation(), t.preventDefault());
175
- }
176
- _handleClick() {
177
- this.removeAttribute("data-interaction-mode");
178
- }
179
- _normalizeKey(t) {
180
- switch (t) {
181
- case "Up":
182
- return "ArrowUp";
183
- case "Down":
184
- return "ArrowDown";
185
- case "Left":
186
- return "ArrowLeft";
187
- case "Right":
188
- return "ArrowRight";
189
- default:
190
- return t;
191
- }
192
- }
193
- render() {
194
- return v`
195
- <div
196
- id="root"
197
- part="root"
198
- >
199
- <div
200
- id="slot-wrap"
201
- @focusin=${this._handleItemFocus}
202
- @rc-menu-button-toggle=${this._handleMenuButtonToggle}
203
- >
204
- <slot @slotchange=${this._handleSlotChange}></slot>
205
- </div>
206
- </div>
207
- `;
208
- }
209
- };
210
- l.styles = [p];
211
- let a = l;
212
- u([
213
- d({ type: String })
214
- ], a.prototype, "label");
215
- u([
216
- d({ type: String, reflect: !0 })
217
- ], a.prototype, "orientation");
218
- u([
219
- m()
220
- ], a.prototype, "_activeMenuButton");
221
- u([
222
- m()
223
- ], a.prototype, "_lastFocused");
224
- export {
225
- a as R
226
- };
227
- //# sourceMappingURL=rc-menubar-BWcf6GHO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rc-menubar-BWcf6GHO.js","sources":["../src/rc-menubar.styles.ts","../src/rc-menubar.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const menubarStyles = css`\n :host {\n display: inline-block;\n }\n\n #root {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n gap: var(--rc-menubar-gap, var(--rc-control-gap, 0.25em));\n padding-inline: var(--rc-menubar-padding-inline, var(--rc-control-padding-inline, 0.25em));\n padding-block: var(--rc-menubar-padding-block, var(--rc-control-padding-block, 0.25em));\n border: var(--rc-menubar-border, var(--rc-border, 1px solid ButtonBorder));\n border-radius: var(--rc-menubar-radius, var(--rc-control-radius, 0));\n background: var(--rc-menubar-background, var(--rc-surface, Canvas));\n color: var(--rc-menubar-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 }\n\n :host([orientation='vertical']) #root {\n flex-direction: column;\n align-items: stretch;\n }\n\n #slot-wrap {\n display: flex;\n flex-direction: inherit;\n align-items: stretch;\n gap: inherit;\n min-inline-size: 0;\n }\n\n ::slotted(rc-menu-button) {\n flex: 0 0 auto;\n }\n\n :host([orientation='vertical']) ::slotted(rc-menu-button) {\n inline-size: 100%;\n }\n`;\n\nexport default menubarStyles;\n","import { LitElement, html } from 'lit';\nimport { property, state } from 'lit/decorators.js';\n\nimport { type KeyboardNavigationAction } from '@rcarls/rc-common';\n\nimport type {\n RCMenuButton,\n RCMenuButtonToggleEvent,\n} from '@rcarls/rc-menu-button';\n\nimport menubarStyles from './rc-menubar.styles';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rc-menubar': RCMenubar;\n }\n}\n\n// Roving tabindex (not aria-activedescendant): trigger buttons need real focus\n// for submenu handoff and screen reader announcements.\n\n/**\n * A menubar component containing menu buttons, as defined in WAI-ARIA\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/menubar/\n * @slot default - Takes rc-menu-button elements to display in the menubar\n * @csspart root - The root container element\n * @cssprop [--rc-menubar-gap=var(--rc-control-gap)] - Gap between menu buttons\n * @cssprop [--rc-menubar-padding-inline=var(--rc-control-padding-inline)] - Inline-axis padding\n * @cssprop [--rc-menubar-padding-block=var(--rc-control-padding-block)] - Block-axis padding\n * @cssprop [--rc-menubar-border=var(--rc-border)] - Root container border\n * @cssprop [--rc-menubar-radius=var(--rc-control-radius)] - Root container border radius\n * @cssprop [--rc-menubar-background=Canvas] - Root container background\n * @cssprop [--rc-menubar-color=CanvasText] - Root container text color\n */\nexport class RCMenubar extends LitElement {\n static styles = [menubarStyles];\n\n /** Accessible label for this menubar */\n @property({ type: String })\n label = 'Menu';\n\n /** Menubar orientation, for keyboard navigation */\n @property({ type: String, reflect: true })\n orientation: 'horizontal' | 'vertical' = 'horizontal';\n\n /** Reference to the currently open menu button */\n @state()\n private _activeMenuButton: WeakRef<RCMenuButton> | undefined;\n\n /** The last menu button trigger to have focus */\n @state()\n private _lastFocused: HTMLElement | undefined;\n\n /** Array of menu button elements */\n private _menuButtons: WeakRef<RCMenuButton>[] = [];\n\n private _boundHandleKeydown = this._handleKeydown.bind(this);\n\n private _boundHandleClick = this._handleClick.bind(this);\n\n override connectedCallback() {\n super.connectedCallback();\n\n this._syncHostAria();\n this.addEventListener('keydown', this._boundHandleKeydown);\n this.addEventListener('click', this._boundHandleClick);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n\n this.removeEventListener('keydown', this._boundHandleKeydown);\n this.removeEventListener('click', this._boundHandleClick);\n }\n\n protected override updated(changedProperties: Map<PropertyKey, unknown>) {\n super.updated(changedProperties);\n\n if (\n changedProperties.has('label') ||\n changedProperties.has('orientation')\n ) {\n this._syncHostAria();\n this._syncMenuButtonOrientation();\n }\n }\n\n /** Keep ARIA semantics on the custom element host for slotted children. */\n private _syncHostAria(): void {\n this.setAttribute('role', 'menubar');\n this.setAttribute('aria-label', this.label);\n this.setAttribute('aria-orientation', this.orientation);\n }\n\n private _syncMenuButtonOrientation(): void {\n this.menuButtons.forEach((menuButton) => {\n menuButton.orientation = this.orientation;\n });\n }\n\n /** Get the trigger element from a menu button */\n private _getTrigger(menuButton: RCMenuButton): HTMLElement | null {\n return menuButton.querySelector('[slot=\"trigger\"]');\n }\n\n /** Array of focusable trigger elements */\n get items(): HTMLElement[] {\n return this._menuButtons\n .map((ref) => ref.deref())\n .filter((el): el is RCMenuButton => el != null)\n .map((mb) => this._getTrigger(mb))\n .filter((el): el is HTMLElement => el != null);\n }\n\n /** Array of menu button elements */\n get menuButtons(): RCMenuButton[] {\n return this._menuButtons\n .map((ref) => ref.deref())\n .filter((el): el is RCMenuButton => el != null);\n }\n\n /** First trigger element */\n get firstItem(): HTMLElement | undefined {\n return this.items.at(0);\n }\n\n /** Last trigger element */\n get lastItem(): HTMLElement | undefined {\n return this.items.at(-1);\n }\n\n /** Next trigger element, in tab-order */\n get nextItem(): HTMLElement | undefined {\n const index = this._lastFocused ? this.items.indexOf(this._lastFocused) : 0;\n return this.items.at((index + 1) % this.items.length);\n }\n\n /** Previous trigger element, in tab-order */\n get previousItem(): HTMLElement | undefined {\n const index = this._lastFocused ? this.items.indexOf(this._lastFocused) : 0;\n return this.items.at((index - 1) % this.items.length);\n }\n\n /** Get the menu button that contains a trigger */\n private _getMenuButtonForTrigger(\n trigger: HTMLElement,\n ): RCMenuButton | undefined {\n return this.menuButtons.find((mb) => this._getTrigger(mb) === trigger);\n }\n\n /** Set focus to a specific trigger element */\n focusItem(item?: HTMLElement | null) {\n if (item != null) {\n item.focus();\n }\n }\n\n /** Close any open menu */\n closeActiveMenu() {\n const activeMenuButton = this._activeMenuButton?.deref();\n if (activeMenuButton) {\n activeMenuButton.closeMenu(false);\n this._activeMenuButton = undefined;\n }\n }\n\n private _handleItemFocus(e: FocusEvent) {\n const target = e.target as HTMLElement;\n\n // Check if focus is on a trigger (slot=\"trigger\")\n if (target.slot !== 'trigger') return;\n\n this._lastFocused = target;\n\n // Set roving tab index\n this.items.forEach((el) => el.setAttribute('tabindex', '-1'));\n target.setAttribute('tabindex', '0');\n }\n\n private _handleSlotChange(e: Event) {\n const slot = e.currentTarget as HTMLSlotElement;\n const elements = slot.assignedElements();\n\n const prevButtons = this._menuButtons;\n\n // Cache element references synchronously — defer all DOM mutations.\n // slotchange fires synchronously inside a framework reactive update pass\n // on second+ mount (shadow DOM already exists), so the handler must be\n // instantaneous to avoid interacting with the reactive system.\n this._menuButtons = elements\n .filter((el): el is RCMenuButton => el.tagName === 'RC-MENU-BUTTON')\n .map((el) => new WeakRef(el));\n\n queueMicrotask(() => {\n if (!this.isConnected) return;\n\n prevButtons.forEach((ref) => {\n const menuButton = ref.deref();\n if (!menuButton) return;\n\n menuButton.removeAttribute('role');\n\n const trigger = this._getTrigger(menuButton);\n trigger?.removeAttribute('tabindex');\n trigger?.removeAttribute('role');\n });\n\n this.menuButtons.forEach((menuButton) => {\n menuButton.removeAttribute('role');\n menuButton.orientation = this.orientation;\n\n const trigger = this._getTrigger(menuButton);\n trigger?.setAttribute('role', 'menuitem');\n });\n\n const items = this.items;\n\n items.forEach((trigger, index) => {\n trigger.setAttribute('tabindex', index === 0 ? '0' : '-1');\n });\n\n if (items.length > 0 && !this._lastFocused) {\n this._lastFocused = items[0];\n }\n });\n }\n\n private _handleMenuButtonToggle(e: CustomEvent<RCMenuButtonToggleEvent>) {\n const menuButton = e.target as RCMenuButton;\n\n if (e.detail.open) {\n // Track the newly opened menu\n this._activeMenuButton = new WeakRef(menuButton);\n } else {\n // Clear active menu if this was the active one\n if (this._activeMenuButton?.deref() === menuButton) {\n this._activeMenuButton = undefined;\n }\n }\n }\n\n private _handleNavigate(action: KeyboardNavigationAction) {\n const activeMenu = this._activeMenuButton?.deref();\n const wasMenuOpen = activeMenu?.open ?? false;\n\n switch (action) {\n case 'next': {\n // Close current menu and move to next\n if (wasMenuOpen) {\n this.closeActiveMenu();\n }\n this.focusItem(this.nextItem);\n // If a menu was open, open the new one\n if (wasMenuOpen) {\n this._openCurrentMenu();\n }\n break;\n }\n case 'prev': {\n // Close current menu and move to previous\n if (wasMenuOpen) {\n this.closeActiveMenu();\n }\n this.focusItem(this.previousItem);\n // If a menu was open, open the new one\n if (wasMenuOpen) {\n this._openCurrentMenu();\n }\n break;\n }\n case 'start':\n if (wasMenuOpen) {\n this.closeActiveMenu();\n }\n this.focusItem(this.firstItem);\n if (wasMenuOpen) {\n this._openCurrentMenu();\n }\n break;\n case 'end':\n if (wasMenuOpen) {\n this.closeActiveMenu();\n }\n this.focusItem(this.lastItem);\n if (wasMenuOpen) {\n this._openCurrentMenu();\n }\n break;\n case 'escape':\n this.closeActiveMenu();\n break;\n }\n }\n\n private _openCurrentMenu() {\n if (this._lastFocused) {\n const menuButton = this._getMenuButtonForTrigger(this._lastFocused);\n if (menuButton) {\n menuButton.openMenu();\n }\n }\n }\n\n private _handleKeydown(e: KeyboardEvent): void {\n const key = this._normalizeKey(e.key);\n const navNext = this.orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n const navPrev = this.orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n\n let action: KeyboardNavigationAction | undefined;\n\n if (key === navNext) {\n action = 'next';\n } else if (key === navPrev) {\n action = 'prev';\n } else if (key === 'Home') {\n action = 'start';\n } else if (key === 'End') {\n action = 'end';\n } else if (key === 'Escape') {\n action = 'escape';\n } else if (key === 'Tab') {\n this.setAttribute('data-interaction-mode', 'keyboard');\n }\n\n if (!action) return;\n\n this._handleNavigate(action);\n this.setAttribute('data-interaction-mode', 'keyboard');\n e.stopPropagation();\n e.preventDefault();\n }\n\n private _handleClick(): void {\n this.removeAttribute('data-interaction-mode');\n }\n\n private _normalizeKey(key: string): string {\n switch (key) {\n case 'Up':\n return 'ArrowUp';\n case 'Down':\n return 'ArrowDown';\n case 'Left':\n return 'ArrowLeft';\n case 'Right':\n return 'ArrowRight';\n default:\n return key;\n }\n }\n\n protected render() {\n return html`\n <div\n id=\"root\"\n part=\"root\"\n >\n <div\n id=\"slot-wrap\"\n @focusin=${this._handleItemFocus}\n @rc-menu-button-toggle=${this._handleMenuButtonToggle}\n >\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n </div>\n `;\n }\n}\n\nexport default RCMenubar;\n"],"names":["menubarStyles","css","_RCMenubar","LitElement","changedProperties","menuButton","ref","el","mb","index","trigger","item","activeMenuButton","e","target","elements","prevButtons","items","action","wasMenuOpen","key","navNext","navPrev","html","RCMenubar","__decorateClass","property","state"],"mappings":"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"}