@rcarls/rc-fab-menu 0.4.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 ADDED
@@ -0,0 +1,71 @@
1
+ # `@rcarls/rc-fab-menu`
2
+
3
+ Floating action button menu wrapper for an `rc-menu` action surface.
4
+
5
+ Docs: [https://richardcarls.github.io/rc-webcomponents/components/rc-fab-menu](https://richardcarls.github.io/rc-webcomponents/components/rc-fab-menu).
6
+
7
+ Use this when a primary floating action needs a short menu of related commands. The component
8
+ specializes `rc-menu-button`, so it keeps the same menu keyboard behavior, light dismiss, focus
9
+ return, and anchor positioning while adding floating action button placement and reveal styling.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ npm install @rcarls/rc-fab-menu
15
+ ```
16
+
17
+ ## Import
18
+
19
+ ```js
20
+ import '@rcarls/rc-fab-menu/define';
21
+ ```
22
+
23
+ ## Basic usage
24
+
25
+ ```html
26
+ <rc-fab-menu>
27
+ <button slot="trigger" type="button" aria-label="Create">
28
+ <span aria-hidden="true">+</span>
29
+ </button>
30
+
31
+ <rc-menu label="Create">
32
+ <button data-value="recipe">Recipe</button>
33
+ <button data-value="collection">Collection</button>
34
+ </rc-menu>
35
+ </rc-fab-menu>
36
+ ```
37
+
38
+ The trigger is a consumer-authored native button. The menu is a normal `rc-menu`, so command
39
+ activation comes from `rc-menu-activate` and menu rows keep the same APG menu semantics as the
40
+ standalone menu package.
41
+
42
+ ## API
43
+
44
+ `rc-fab-menu` inherits `open`, `defaultOpen`, `openMenu()`, `closeMenu()`, and `toggleMenu()`
45
+ from `rc-menu-button` unchanged. It also overrides `placement`'s default (see below).
46
+
47
+ | Property | Attribute | Type | Default | Description |
48
+ | ----------- | ----------- | ------------------------------------------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------ |
49
+ | `position` | `position` | `'bottom-end' \| 'bottom-start' \| 'top-end' \| 'top-start'` | `'bottom-end'` | Viewport corner where the trigger is anchored. |
50
+ | `placement` | `placement` | `AnchorPlacement` | `'top-end'` | Preferred popup placement. Overrides `rc-menu-button`'s `'bottom-start'` default so the action menu opens above the trigger. |
51
+
52
+ | Event | Detail | Description |
53
+ | -------------------- | ------------------- | ------------------------------------------------------------ |
54
+ | `rc-fab-menu-toggle` | `{ open: boolean }` | Fired when user interaction opens or closes the action menu. |
55
+
56
+ ## Theming
57
+
58
+ The default styling is design-system neutral and follows the `rc-fab` token names where possible.
59
+
60
+ | CSS custom property | Default | Description |
61
+ | ------------------------------ | -------- | ------------------------------------------------------------------------------- |
62
+ | `--rc-fab-menu-position-css` | `fixed` | CSS position value for the floating wrapper. |
63
+ | `--rc-fab-menu-inset-block` | `1.5rem` | Distance from the block-axis edge; falls back through `--rc-fab-inset-block`. |
64
+ | `--rc-fab-menu-inset-inline` | `1.5rem` | Distance from the inline-axis edge; falls back through `--rc-fab-inset-inline`. |
65
+ | `--rc-fab-menu-size` | (none) | Trigger minimum inline and block size. Set explicitly or apply a theme. |
66
+ | `--rc-fab-menu-radius` | (none) | Trigger border radius, deferring to native button radius when unset. |
67
+ | `--rc-fab-menu-bg` | (none) | Trigger background, deferring to native button background when unset. |
68
+ | `--rc-fab-menu-color` | (none) | Trigger foreground, deferring to native button color when unset. |
69
+ | `--rc-fab-menu-popup-duration` | `0ms` | Popup reveal transition duration. |
70
+
71
+ Use `::part(popup)` for popup container refinements and theme `rc-menu` for action rows.
@@ -0,0 +1,312 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/define.ts",
8
+ "declarations": [],
9
+ "exports": [
10
+ {
11
+ "kind": "custom-element-definition",
12
+ "name": "rc-fab-menu",
13
+ "declaration": {
14
+ "name": "RCFabMenu",
15
+ "module": "/src/index.js"
16
+ }
17
+ },
18
+ {
19
+ "kind": "js",
20
+ "name": "*",
21
+ "declaration": {
22
+ "name": "*",
23
+ "module": "src/index.js"
24
+ }
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "kind": "javascript-module",
30
+ "path": "src/index.ts",
31
+ "declarations": [],
32
+ "exports": [
33
+ {
34
+ "kind": "js",
35
+ "name": "*",
36
+ "declaration": {
37
+ "name": "*",
38
+ "module": "src/rc-fab-menu"
39
+ }
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ "kind": "javascript-module",
45
+ "path": "src/rc-fab-menu.ts",
46
+ "declarations": [
47
+ {
48
+ "kind": "class",
49
+ "description": "Floating action button menu wrapper for an `rc-menu` action surface.\n\n`rc-fab-menu` specializes `rc-menu-button` for floating action menus. It\npreserves the menu-button keyboard, focus return, light-dismiss, and popup\npositioning behavior while applying FAB placement and reveal styling.",
50
+ "name": "RCFabMenu",
51
+ "cssProperties": [
52
+ {
53
+ "description": "CSS position value for the floating wrapper.",
54
+ "name": "--rc-fab-menu-position-css",
55
+ "default": "fixed"
56
+ },
57
+ {
58
+ "description": "Distance from the block-axis edge; falls back through --rc-fab-inset-block.",
59
+ "name": "--rc-fab-menu-inset-block",
60
+ "default": "1.5rem"
61
+ },
62
+ {
63
+ "description": "Distance from the inline-axis edge; falls back through --rc-fab-inset-inline.",
64
+ "name": "--rc-fab-menu-inset-inline",
65
+ "default": "1.5rem"
66
+ },
67
+ {
68
+ "description": "Stacking order for the floating wrapper; falls back through --rc-fab-z-index.",
69
+ "name": "--rc-fab-menu-z-index",
70
+ "default": "10"
71
+ },
72
+ {
73
+ "description": "Gap between trigger icon and label content. No default.",
74
+ "name": "--rc-fab-menu-trigger-gap"
75
+ },
76
+ {
77
+ "description": "Trigger minimum inline and block size. No default; set explicitly or apply a theme.",
78
+ "name": "--rc-fab-menu-size"
79
+ },
80
+ {
81
+ "description": "Trigger block-axis padding (defers to native button padding when unset).",
82
+ "name": "--rc-fab-menu-padding-block"
83
+ },
84
+ {
85
+ "description": "Trigger inline-axis padding (defers to native button padding when unset).",
86
+ "name": "--rc-fab-menu-padding-inline"
87
+ },
88
+ {
89
+ "description": "Trigger appearance (defers to native button appearance when unset).",
90
+ "name": "--rc-fab-menu-appearance"
91
+ },
92
+ {
93
+ "description": "Trigger border (defers to native button border when unset).",
94
+ "name": "--rc-fab-menu-border"
95
+ },
96
+ {
97
+ "description": "Trigger border radius (defers to native button radius when unset).",
98
+ "name": "--rc-fab-menu-radius"
99
+ },
100
+ {
101
+ "description": "Trigger background (defers to native button background when unset).",
102
+ "name": "--rc-fab-menu-bg"
103
+ },
104
+ {
105
+ "description": "Trigger foreground color (defers to native button color when unset).",
106
+ "name": "--rc-fab-menu-color"
107
+ },
108
+ {
109
+ "description": "Trigger elevation shadow (defers to native button shadow when unset).",
110
+ "name": "--rc-fab-menu-shadow"
111
+ },
112
+ {
113
+ "description": "Trigger font shorthand (defers to native button font when unset).",
114
+ "name": "--rc-fab-menu-font"
115
+ },
116
+ {
117
+ "description": "Trigger font family (defers to native button font-family when unset).",
118
+ "name": "--rc-fab-menu-font-family"
119
+ },
120
+ {
121
+ "description": "Trigger font size (defers to native button font-size when unset).",
122
+ "name": "--rc-fab-menu-font-size"
123
+ },
124
+ {
125
+ "description": "Trigger font weight (defers to native button font-weight when unset).",
126
+ "name": "--rc-fab-menu-font-weight"
127
+ },
128
+ {
129
+ "description": "Trigger letter spacing (defers to native button letter-spacing when unset).",
130
+ "name": "--rc-fab-menu-letter-spacing"
131
+ },
132
+ {
133
+ "description": "Trigger text decoration (defers to native button text-decoration when unset).",
134
+ "name": "--rc-fab-menu-text-decoration"
135
+ },
136
+ {
137
+ "description": "Trigger user-select (defers to native button user-select when unset).",
138
+ "name": "--rc-fab-menu-user-select"
139
+ },
140
+ {
141
+ "description": "Trigger transition shorthand (defers to native button transition when unset).",
142
+ "name": "--rc-fab-menu-transition"
143
+ },
144
+ {
145
+ "description": "Trigger hover background (defers to native button hover styling when unset).",
146
+ "name": "--rc-fab-menu-bg-hover"
147
+ },
148
+ {
149
+ "description": "Trigger hover elevation shadow (defers to native button hover styling when unset).",
150
+ "name": "--rc-fab-menu-shadow-hover"
151
+ },
152
+ {
153
+ "description": "Trigger background while the menu is open (defers to native button styling when unset).",
154
+ "name": "--rc-fab-menu-bg-open"
155
+ },
156
+ {
157
+ "description": "Trigger elevation shadow while the menu is open (defers to native button styling when unset).",
158
+ "name": "--rc-fab-menu-shadow-open"
159
+ },
160
+ {
161
+ "description": "Trigger pressed elevation shadow (defers to native button styling when unset).",
162
+ "name": "--rc-fab-menu-shadow-active"
163
+ },
164
+ {
165
+ "description": "Trigger transform while pressed (defers to native button styling when unset).",
166
+ "name": "--rc-fab-menu-active-transform"
167
+ },
168
+ {
169
+ "description": "Trigger focus ring (defers to native button focus styling when unset).",
170
+ "name": "--rc-fab-menu-focus-ring"
171
+ },
172
+ {
173
+ "description": "Trigger focus ring offset (defers to native button focus styling when unset).",
174
+ "name": "--rc-fab-menu-focus-ring-offset"
175
+ },
176
+ {
177
+ "description": "Trigger opacity while disabled (defers to native disabled styling when unset).",
178
+ "name": "--rc-fab-menu-disabled-opacity"
179
+ },
180
+ {
181
+ "description": "Trigger elevation shadow while disabled (defers to native disabled styling when unset).",
182
+ "name": "--rc-fab-menu-disabled-shadow"
183
+ },
184
+ {
185
+ "description": "Stacking order of the popup container; falls back through --rc-menu-button-popup-z-index.",
186
+ "name": "--rc-fab-menu-popup-z-index",
187
+ "default": "1000"
188
+ },
189
+ {
190
+ "description": "Popup reveal transition duration.",
191
+ "name": "--rc-fab-menu-popup-duration",
192
+ "default": "0ms"
193
+ },
194
+ {
195
+ "description": "Popup reveal transform origin.",
196
+ "name": "--rc-fab-menu-popup-transform-origin",
197
+ "default": "bottom right"
198
+ }
199
+ ],
200
+ "cssParts": [
201
+ {
202
+ "description": "The root popup anchor inherited from `rc-menu-button`.",
203
+ "name": "root"
204
+ },
205
+ {
206
+ "description": "The popup container inherited from `rc-menu-button`.",
207
+ "name": "popup"
208
+ }
209
+ ],
210
+ "slots": [
211
+ {
212
+ "description": "Native button or button-like element that opens the action menu.",
213
+ "name": "trigger"
214
+ },
215
+ {
216
+ "description": "`rc-menu` element containing floating action commands.",
217
+ "name": "default"
218
+ }
219
+ ],
220
+ "members": [
221
+ {
222
+ "kind": "field",
223
+ "name": "position",
224
+ "type": {
225
+ "text": "RCFabMenuPosition"
226
+ },
227
+ "default": "'bottom-end'",
228
+ "description": "Viewport corner where the floating action menu trigger is anchored.",
229
+ "attribute": "position",
230
+ "reflects": true
231
+ },
232
+ {
233
+ "kind": "field",
234
+ "name": "placement",
235
+ "type": {
236
+ "text": "AnchorPlacement"
237
+ },
238
+ "default": "'top-end'",
239
+ "description": "Preferred placement of the action menu relative to the trigger button.",
240
+ "attribute": "placement",
241
+ "reflects": true
242
+ },
243
+ {
244
+ "kind": "method",
245
+ "name": "_dispatchToggle",
246
+ "privacy": "protected",
247
+ "return": {
248
+ "type": {
249
+ "text": "void"
250
+ }
251
+ },
252
+ "description": "Dispatches the `rc-fab-menu-toggle` bubbling composed event with the current open state."
253
+ }
254
+ ],
255
+ "events": [
256
+ {
257
+ "name": "rc-fab-menu-toggle",
258
+ "type": {
259
+ "text": "CustomEvent"
260
+ },
261
+ "description": "Fired when user interaction opens or closes the action menu."
262
+ }
263
+ ],
264
+ "attributes": [
265
+ {
266
+ "description": "Viewport corner where the floating action menu trigger is anchored.",
267
+ "name": "position",
268
+ "type": {
269
+ "text": "RCFabMenuPosition"
270
+ },
271
+ "default": "'bottom-end'",
272
+ "fieldName": "position"
273
+ },
274
+ {
275
+ "description": "Preferred placement of the action menu relative to the trigger button.",
276
+ "name": "placement",
277
+ "type": {
278
+ "text": "AnchorPlacement"
279
+ },
280
+ "default": "'top-end'",
281
+ "fieldName": "placement"
282
+ }
283
+ ],
284
+ "superclass": {
285
+ "name": "RCMenuButton",
286
+ "package": "@rcarls/rc-menu-button"
287
+ },
288
+ "tagName": "rc-fab-menu",
289
+ "customElement": true
290
+ }
291
+ ],
292
+ "exports": [
293
+ {
294
+ "kind": "js",
295
+ "name": "RCFabMenu",
296
+ "declaration": {
297
+ "name": "RCFabMenu",
298
+ "module": "src/rc-fab-menu.ts"
299
+ }
300
+ },
301
+ {
302
+ "kind": "js",
303
+ "name": "default",
304
+ "declaration": {
305
+ "name": "RCFabMenu",
306
+ "module": "src/rc-fab-menu.ts"
307
+ }
308
+ }
309
+ ]
310
+ }
311
+ ]
312
+ }
@@ -0,0 +1,166 @@
1
+ import { property as c } from "lit/decorators.js";
2
+ import { RCMenuButton as b } from "@rcarls/rc-menu-button";
3
+ import { css as u } from "lit";
4
+ const d = u`
5
+ :host {
6
+ position: var(--rc-fab-menu-position-css, fixed);
7
+ inset-block-end: var(--rc-fab-menu-inset-block, var(--rc-fab-inset-block, 1.5rem));
8
+ inset-inline-end: var(--rc-fab-menu-inset-inline, var(--rc-fab-inset-inline, 1.5rem));
9
+ z-index: var(--rc-fab-menu-z-index, var(--rc-fab-z-index, 10));
10
+ display: inline-block;
11
+ }
12
+
13
+ :host([hidden]) {
14
+ display: none;
15
+ }
16
+
17
+ :host([position='bottom-start']) {
18
+ inset-inline-end: unset;
19
+ inset-inline-start: var(--rc-fab-menu-inset-inline, var(--rc-fab-inset-inline, 1.5rem));
20
+ }
21
+
22
+ :host([position='top-end']) {
23
+ inset-block-end: unset;
24
+ inset-block-start: var(--rc-fab-menu-inset-block, var(--rc-fab-inset-block, 1.5rem));
25
+ }
26
+
27
+ :host([position='top-start']) {
28
+ inset-block-end: unset;
29
+ inset-block-start: var(--rc-fab-menu-inset-block, var(--rc-fab-inset-block, 1.5rem));
30
+ inset-inline-end: unset;
31
+ inset-inline-start: var(--rc-fab-menu-inset-inline, var(--rc-fab-inset-inline, 1.5rem));
32
+ }
33
+
34
+ #root {
35
+ display: inline-block;
36
+ }
37
+
38
+ #trigger-wrap {
39
+ display: contents;
40
+ }
41
+
42
+ slot[name='trigger']::slotted(button),
43
+ slot[name='trigger']::slotted([role='button']) {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ gap: var(--rc-fab-menu-trigger-gap);
48
+ min-inline-size: var(--rc-fab-menu-size);
49
+ min-block-size: var(--rc-fab-menu-size);
50
+ padding-block: var(--rc-fab-menu-padding-block, revert);
51
+ padding-inline: var(--rc-fab-menu-padding-inline, revert);
52
+ appearance: var(--rc-fab-menu-appearance, revert);
53
+ box-sizing: border-box;
54
+ border: var(--rc-fab-menu-border, revert);
55
+ border-radius: var(--rc-fab-menu-radius, revert);
56
+ background: var(--rc-fab-menu-bg, revert);
57
+ color: var(--rc-fab-menu-color, revert);
58
+ box-shadow: var(--rc-fab-menu-shadow, revert);
59
+ font: var(--rc-fab-menu-font, revert);
60
+ font-family: var(--rc-fab-menu-font-family, revert);
61
+ font-size: var(--rc-fab-menu-font-size, revert);
62
+ font-weight: var(--rc-fab-menu-font-weight, revert);
63
+ letter-spacing: var(--rc-fab-menu-letter-spacing, revert);
64
+ white-space: nowrap;
65
+ text-decoration: var(--rc-fab-menu-text-decoration, revert);
66
+ user-select: var(--rc-fab-menu-user-select, revert);
67
+ transition: var(--rc-fab-menu-transition, revert);
68
+ }
69
+
70
+ slot[name='trigger']::slotted(button:hover),
71
+ slot[name='trigger']::slotted([role='button']:hover) {
72
+ background: var(--rc-fab-menu-bg-hover, revert);
73
+ box-shadow: var(--rc-fab-menu-shadow-hover, revert);
74
+ }
75
+
76
+ slot[name='trigger']::slotted(button[aria-expanded='true']),
77
+ slot[name='trigger']::slotted([role='button'][aria-expanded='true']) {
78
+ background: var(--rc-fab-menu-bg-open, revert);
79
+ box-shadow: var(--rc-fab-menu-shadow-open, revert);
80
+ }
81
+
82
+ slot[name='trigger']::slotted(button:active),
83
+ slot[name='trigger']::slotted([role='button']:active) {
84
+ box-shadow: var(--rc-fab-menu-shadow-active, revert);
85
+ transform: var(--rc-fab-menu-active-transform, revert);
86
+ }
87
+
88
+ slot[name='trigger']::slotted(button:focus-visible),
89
+ slot[name='trigger']::slotted([role='button']:focus-visible) {
90
+ outline: var(--rc-fab-menu-focus-ring, revert);
91
+ outline-offset: var(--rc-fab-menu-focus-ring-offset, revert);
92
+ }
93
+
94
+ slot[name='trigger']::slotted(button:disabled),
95
+ slot[name='trigger']::slotted([role='button'][aria-disabled='true']) {
96
+ opacity: var(--rc-fab-menu-disabled-opacity, revert);
97
+ pointer-events: none;
98
+ box-shadow: var(--rc-fab-menu-disabled-shadow, revert);
99
+ }
100
+
101
+ #popup {
102
+ z-index: var(--rc-fab-menu-popup-z-index, var(--rc-menu-button-popup-z-index, 1000));
103
+ opacity: 1;
104
+ scale: 1;
105
+ transform-origin: var(--rc-fab-menu-popup-transform-origin, bottom right);
106
+ transition:
107
+ opacity var(--rc-fab-menu-popup-duration, 0ms) ease,
108
+ scale var(--rc-fab-menu-popup-duration, 0ms) ease;
109
+ }
110
+
111
+ #popup[hidden] {
112
+ display: none;
113
+ }
114
+
115
+ @starting-style {
116
+ :host([open]) #popup {
117
+ opacity: 0;
118
+ scale: 0.92;
119
+ }
120
+ }
121
+
122
+ @media (prefers-reduced-motion: reduce) {
123
+ slot[name='trigger']::slotted(button),
124
+ slot[name='trigger']::slotted([role='button']),
125
+ #popup {
126
+ transition-duration: 0s;
127
+ }
128
+
129
+ slot[name='trigger']::slotted(button:active),
130
+ slot[name='trigger']::slotted([role='button']:active) {
131
+ transform: none;
132
+ }
133
+ }
134
+ `;
135
+ var v = Object.defineProperty, l = (o, a, i, m) => {
136
+ for (var e = void 0, r = o.length - 1, s; r >= 0; r--)
137
+ (s = o[r]) && (e = s(a, i, e) || e);
138
+ return e && v(a, i, e), e;
139
+ };
140
+ const n = class n extends b {
141
+ constructor() {
142
+ super(...arguments), this.position = "bottom-end", this.placement = "top-end";
143
+ }
144
+ /** Dispatches the `rc-fab-menu-toggle` bubbling composed event with the current open state. */
145
+ _dispatchToggle() {
146
+ this.dispatchEvent(
147
+ new CustomEvent("rc-fab-menu-toggle", {
148
+ bubbles: !0,
149
+ composed: !0,
150
+ detail: { open: this.open }
151
+ })
152
+ );
153
+ }
154
+ };
155
+ n.styles = [d];
156
+ let t = n;
157
+ l([
158
+ c({ type: String, reflect: !0 })
159
+ ], t.prototype, "position");
160
+ l([
161
+ c({ reflect: !0 })
162
+ ], t.prototype, "placement");
163
+ export {
164
+ t as R
165
+ };
166
+ //# sourceMappingURL=rc-fab-menu-BhXCZQuw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-fab-menu-BhXCZQuw.js","sources":["../src/rc-fab-menu.styles.ts","../src/rc-fab-menu.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const fabMenuStyles = css`\n :host {\n position: var(--rc-fab-menu-position-css, fixed);\n inset-block-end: var(--rc-fab-menu-inset-block, var(--rc-fab-inset-block, 1.5rem));\n inset-inline-end: var(--rc-fab-menu-inset-inline, var(--rc-fab-inset-inline, 1.5rem));\n z-index: var(--rc-fab-menu-z-index, var(--rc-fab-z-index, 10));\n display: inline-block;\n }\n\n :host([hidden]) {\n display: none;\n }\n\n :host([position='bottom-start']) {\n inset-inline-end: unset;\n inset-inline-start: var(--rc-fab-menu-inset-inline, var(--rc-fab-inset-inline, 1.5rem));\n }\n\n :host([position='top-end']) {\n inset-block-end: unset;\n inset-block-start: var(--rc-fab-menu-inset-block, var(--rc-fab-inset-block, 1.5rem));\n }\n\n :host([position='top-start']) {\n inset-block-end: unset;\n inset-block-start: var(--rc-fab-menu-inset-block, var(--rc-fab-inset-block, 1.5rem));\n inset-inline-end: unset;\n inset-inline-start: var(--rc-fab-menu-inset-inline, var(--rc-fab-inset-inline, 1.5rem));\n }\n\n #root {\n display: inline-block;\n }\n\n #trigger-wrap {\n display: contents;\n }\n\n slot[name='trigger']::slotted(button),\n slot[name='trigger']::slotted([role='button']) {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--rc-fab-menu-trigger-gap);\n min-inline-size: var(--rc-fab-menu-size);\n min-block-size: var(--rc-fab-menu-size);\n padding-block: var(--rc-fab-menu-padding-block, revert);\n padding-inline: var(--rc-fab-menu-padding-inline, revert);\n appearance: var(--rc-fab-menu-appearance, revert);\n box-sizing: border-box;\n border: var(--rc-fab-menu-border, revert);\n border-radius: var(--rc-fab-menu-radius, revert);\n background: var(--rc-fab-menu-bg, revert);\n color: var(--rc-fab-menu-color, revert);\n box-shadow: var(--rc-fab-menu-shadow, revert);\n font: var(--rc-fab-menu-font, revert);\n font-family: var(--rc-fab-menu-font-family, revert);\n font-size: var(--rc-fab-menu-font-size, revert);\n font-weight: var(--rc-fab-menu-font-weight, revert);\n letter-spacing: var(--rc-fab-menu-letter-spacing, revert);\n white-space: nowrap;\n text-decoration: var(--rc-fab-menu-text-decoration, revert);\n user-select: var(--rc-fab-menu-user-select, revert);\n transition: var(--rc-fab-menu-transition, revert);\n }\n\n slot[name='trigger']::slotted(button:hover),\n slot[name='trigger']::slotted([role='button']:hover) {\n background: var(--rc-fab-menu-bg-hover, revert);\n box-shadow: var(--rc-fab-menu-shadow-hover, revert);\n }\n\n slot[name='trigger']::slotted(button[aria-expanded='true']),\n slot[name='trigger']::slotted([role='button'][aria-expanded='true']) {\n background: var(--rc-fab-menu-bg-open, revert);\n box-shadow: var(--rc-fab-menu-shadow-open, revert);\n }\n\n slot[name='trigger']::slotted(button:active),\n slot[name='trigger']::slotted([role='button']:active) {\n box-shadow: var(--rc-fab-menu-shadow-active, revert);\n transform: var(--rc-fab-menu-active-transform, revert);\n }\n\n slot[name='trigger']::slotted(button:focus-visible),\n slot[name='trigger']::slotted([role='button']:focus-visible) {\n outline: var(--rc-fab-menu-focus-ring, revert);\n outline-offset: var(--rc-fab-menu-focus-ring-offset, revert);\n }\n\n slot[name='trigger']::slotted(button:disabled),\n slot[name='trigger']::slotted([role='button'][aria-disabled='true']) {\n opacity: var(--rc-fab-menu-disabled-opacity, revert);\n pointer-events: none;\n box-shadow: var(--rc-fab-menu-disabled-shadow, revert);\n }\n\n #popup {\n z-index: var(--rc-fab-menu-popup-z-index, var(--rc-menu-button-popup-z-index, 1000));\n opacity: 1;\n scale: 1;\n transform-origin: var(--rc-fab-menu-popup-transform-origin, bottom right);\n transition:\n opacity var(--rc-fab-menu-popup-duration, 0ms) ease,\n scale var(--rc-fab-menu-popup-duration, 0ms) ease;\n }\n\n #popup[hidden] {\n display: none;\n }\n\n @starting-style {\n :host([open]) #popup {\n opacity: 0;\n scale: 0.92;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n slot[name='trigger']::slotted(button),\n slot[name='trigger']::slotted([role='button']),\n #popup {\n transition-duration: 0s;\n }\n\n slot[name='trigger']::slotted(button:active),\n slot[name='trigger']::slotted([role='button']:active) {\n transform: none;\n }\n }\n`;\n\nexport default fabMenuStyles;\n","import { property } from 'lit/decorators.js';\n\nimport type { AnchorPlacement } from '@rcarls/rc-common';\nimport { RCMenuButton, type RCMenuButtonToggleEvent } from '@rcarls/rc-menu-button';\n\nimport fabMenuStyles from './rc-fab-menu.styles.js';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rc-fab-menu': RCFabMenu;\n }\n\n interface HTMLElementEventMap {\n 'rc-fab-menu-toggle': CustomEvent<RCFabMenuToggleEvent>;\n }\n}\n\n/** Detail payload for the `rc-fab-menu-toggle` event. */\nexport type RCFabMenuToggleEvent = RCMenuButtonToggleEvent;\n\nexport type RCFabMenuPosition = 'bottom-end' | 'bottom-start' | 'top-end' | 'top-start';\n\n/**\n * Floating action button menu wrapper for an `rc-menu` action surface.\n *\n * `rc-fab-menu` specializes `rc-menu-button` for floating action menus. It\n * preserves the menu-button keyboard, focus return, light-dismiss, and popup\n * positioning behavior while applying FAB placement and reveal styling.\n *\n * @see {@link https://richardcarls.github.io/rc-webcomponents/components/rc-fab-menu rc-fab-menu docs}\n * @see {@link https://m3.material.io/components/floating-action-button/overview Material 3 floating action button}\n * @see {@link https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/ WAI-ARIA Menu Button pattern}\n *\n * @example\n * ```html\n * <rc-fab-menu>\n * <button slot=\"trigger\" type=\"button\" aria-label=\"Create\">\n * <span aria-hidden=\"true\">+</span>\n * </button>\n * <rc-menu label=\"Create\">\n * <button>Recipe</button>\n * <button>Collection</button>\n * </rc-menu>\n * </rc-fab-menu>\n * ```\n *\n * @slot trigger - Native button or button-like element that opens the action menu.\n * @slot default - `rc-menu` element containing floating action commands.\n *\n * @fires rc-fab-menu-toggle - Fired when user interaction opens or closes the action menu.\n *\n * @attr position - Viewport corner where the floating action menu trigger is anchored.\n * @attr placement - Preferred placement of the action menu relative to the trigger button.\n *\n * @cssprop [--rc-fab-menu-position-css=fixed] - CSS position value for the floating wrapper.\n * @cssprop [--rc-fab-menu-inset-block=1.5rem] - Distance from the block-axis edge; falls back\n * through --rc-fab-inset-block.\n * @cssprop [--rc-fab-menu-inset-inline=1.5rem] - Distance from the inline-axis edge; falls back\n * through --rc-fab-inset-inline.\n * @cssprop [--rc-fab-menu-z-index=10] - Stacking order for the floating wrapper; falls back\n * through --rc-fab-z-index.\n * @cssprop [--rc-fab-menu-trigger-gap] - Gap between trigger icon and label content. No default.\n * @cssprop [--rc-fab-menu-size] - Trigger minimum inline and block size. No default; set\n * explicitly or apply a theme.\n * @cssprop [--rc-fab-menu-padding-block] - Trigger block-axis padding (defers to native button\n * padding when unset).\n * @cssprop [--rc-fab-menu-padding-inline] - Trigger inline-axis padding (defers to native button\n * padding when unset).\n * @cssprop [--rc-fab-menu-appearance] - Trigger appearance (defers to native button appearance\n * when unset).\n * @cssprop [--rc-fab-menu-border] - Trigger border (defers to native button border when unset).\n * @cssprop [--rc-fab-menu-radius] - Trigger border radius (defers to native button radius when\n * unset).\n * @cssprop [--rc-fab-menu-bg] - Trigger background (defers to native button background when\n * unset).\n * @cssprop [--rc-fab-menu-color] - Trigger foreground color (defers to native button color when\n * unset).\n * @cssprop [--rc-fab-menu-shadow] - Trigger elevation shadow (defers to native button shadow\n * when unset).\n * @cssprop [--rc-fab-menu-font] - Trigger font shorthand (defers to native button font when\n * unset).\n * @cssprop [--rc-fab-menu-font-family] - Trigger font family (defers to native button font-family\n * when unset).\n * @cssprop [--rc-fab-menu-font-size] - Trigger font size (defers to native button font-size when\n * unset).\n * @cssprop [--rc-fab-menu-font-weight] - Trigger font weight (defers to native button font-weight\n * when unset).\n * @cssprop [--rc-fab-menu-letter-spacing] - Trigger letter spacing (defers to native button\n * letter-spacing when unset).\n * @cssprop [--rc-fab-menu-text-decoration] - Trigger text decoration (defers to native button\n * text-decoration when unset).\n * @cssprop [--rc-fab-menu-user-select] - Trigger user-select (defers to native button user-select\n * when unset).\n * @cssprop [--rc-fab-menu-transition] - Trigger transition shorthand (defers to native button\n * transition when unset).\n * @cssprop [--rc-fab-menu-bg-hover] - Trigger hover background (defers to native button hover\n * styling when unset).\n * @cssprop [--rc-fab-menu-shadow-hover] - Trigger hover elevation shadow (defers to native button\n * hover styling when unset).\n * @cssprop [--rc-fab-menu-bg-open] - Trigger background while the menu is open (defers to native\n * button styling when unset).\n * @cssprop [--rc-fab-menu-shadow-open] - Trigger elevation shadow while the menu is open (defers\n * to native button styling when unset).\n * @cssprop [--rc-fab-menu-shadow-active] - Trigger pressed elevation shadow (defers to native\n * button styling when unset).\n * @cssprop [--rc-fab-menu-active-transform] - Trigger transform while pressed (defers to native\n * button styling when unset).\n * @cssprop [--rc-fab-menu-focus-ring] - Trigger focus ring (defers to native button focus styling\n * when unset).\n * @cssprop [--rc-fab-menu-focus-ring-offset] - Trigger focus ring offset (defers to native button\n * focus styling when unset).\n * @cssprop [--rc-fab-menu-disabled-opacity] - Trigger opacity while disabled (defers to native\n * disabled styling when unset).\n * @cssprop [--rc-fab-menu-disabled-shadow] - Trigger elevation shadow while disabled (defers to\n * native disabled styling when unset).\n * @cssprop [--rc-fab-menu-popup-z-index=1000] - Stacking order of the popup container; falls back\n * through --rc-menu-button-popup-z-index.\n * @cssprop [--rc-fab-menu-popup-duration=0ms] - Popup reveal transition duration.\n * @cssprop [--rc-fab-menu-popup-transform-origin=bottom right] - Popup reveal transform origin.\n *\n * @csspart root - The root popup anchor inherited from `rc-menu-button`.\n * @csspart popup - The popup container inherited from `rc-menu-button`.\n */\nexport class RCFabMenu extends RCMenuButton {\n static override styles = [fabMenuStyles];\n\n /** Viewport corner where the floating action menu trigger is anchored. */\n @property({ type: String, reflect: true })\n position: RCFabMenuPosition = 'bottom-end';\n\n /** Preferred placement of the action menu relative to the trigger button. */\n @property({ reflect: true })\n override placement: AnchorPlacement = 'top-end';\n\n /** Dispatches the `rc-fab-menu-toggle` bubbling composed event with the current open state. */\n protected override _dispatchToggle(): void {\n this.dispatchEvent(\n new CustomEvent<RCFabMenuToggleEvent>('rc-fab-menu-toggle', {\n bubbles: true,\n composed: true,\n detail: { open: this.open },\n }),\n );\n }\n}\n\nexport default RCFabMenu;\n"],"names":["fabMenuStyles","css","_RCFabMenu","RCMenuButton","RCFabMenu","__decorateClass","property"],"mappings":";;;AAEO,MAAMA,IAAgBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;ACyHtB,MAAMC,IAAN,MAAMA,UAAkBC,EAAa;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA,GAKL,KAAA,WAA8B,cAI9B,KAAS,YAA6B;AAAA,EAAA;AAAA;AAAA,EAGnB,kBAAwB;AACzC,SAAK;AAAA,MACH,IAAI,YAAkC,sBAAsB;AAAA,QAC1D,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,EAAE,MAAM,KAAK,KAAA;AAAA,MAAK,CAC3B;AAAA,IAAA;AAAA,EAEL;AACF;AApBED,EAAgB,SAAS,CAACF,CAAa;AADlC,IAAMI,IAANF;AAKLG,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAJ9BF,EAKX,WAAA,UAAA;AAISC,EAAA;AAAA,EADRC,EAAS,EAAE,SAAS,GAAA,CAAM;AAAA,GARhBF,EASF,WAAA,WAAA;"}
@@ -0,0 +1,7 @@
1
+ import "@rcarls/rc-menu/define";
2
+ import { R as e } from "./rc-fab-menu-BhXCZQuw.js";
3
+ customElements.get("rc-fab-menu") || customElements.define("rc-fab-menu", e);
4
+ export {
5
+ e as RCFabMenu
6
+ };
7
+ //# sourceMappingURL=rc-fab-menu-define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-fab-menu-define.js","sources":["../src/define.ts"],"sourcesContent":["import '@rcarls/rc-menu/define';\nimport { RCFabMenu } from './index.js';\n\ncustomElements.get('rc-fab-menu') || customElements.define('rc-fab-menu', RCFabMenu);\n\nexport * from './index.js';\n"],"names":["RCFabMenu"],"mappings":";;AAGA,eAAe,IAAI,aAAa,KAAK,eAAe,OAAO,eAAeA,CAAS;"}
@@ -0,0 +1,5 @@
1
+ import { R as o } from "./rc-fab-menu-BhXCZQuw.js";
2
+ export {
3
+ o as RCFabMenu
4
+ };
5
+ //# sourceMappingURL=rc-fab-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-fab-menu.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1 @@
1
+ export * from './index.js';
@@ -0,0 +1 @@
1
+ export * from './rc-fab-menu';
@@ -0,0 +1,124 @@
1
+ import { AnchorPlacement } from '@rcarls/rc-common';
2
+ import { RCMenuButton, RCMenuButtonToggleEvent } from '@rcarls/rc-menu-button';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'rc-fab-menu': RCFabMenu;
6
+ }
7
+ interface HTMLElementEventMap {
8
+ 'rc-fab-menu-toggle': CustomEvent<RCFabMenuToggleEvent>;
9
+ }
10
+ }
11
+ /** Detail payload for the `rc-fab-menu-toggle` event. */
12
+ export type RCFabMenuToggleEvent = RCMenuButtonToggleEvent;
13
+ export type RCFabMenuPosition = 'bottom-end' | 'bottom-start' | 'top-end' | 'top-start';
14
+ /**
15
+ * Floating action button menu wrapper for an `rc-menu` action surface.
16
+ *
17
+ * `rc-fab-menu` specializes `rc-menu-button` for floating action menus. It
18
+ * preserves the menu-button keyboard, focus return, light-dismiss, and popup
19
+ * positioning behavior while applying FAB placement and reveal styling.
20
+ *
21
+ * @see {@link https://richardcarls.github.io/rc-webcomponents/components/rc-fab-menu rc-fab-menu docs}
22
+ * @see {@link https://m3.material.io/components/floating-action-button/overview Material 3 floating action button}
23
+ * @see {@link https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/ WAI-ARIA Menu Button pattern}
24
+ *
25
+ * @example
26
+ * ```html
27
+ * <rc-fab-menu>
28
+ * <button slot="trigger" type="button" aria-label="Create">
29
+ * <span aria-hidden="true">+</span>
30
+ * </button>
31
+ * <rc-menu label="Create">
32
+ * <button>Recipe</button>
33
+ * <button>Collection</button>
34
+ * </rc-menu>
35
+ * </rc-fab-menu>
36
+ * ```
37
+ *
38
+ * @slot trigger - Native button or button-like element that opens the action menu.
39
+ * @slot default - `rc-menu` element containing floating action commands.
40
+ *
41
+ * @fires rc-fab-menu-toggle - Fired when user interaction opens or closes the action menu.
42
+ *
43
+ * @attr position - Viewport corner where the floating action menu trigger is anchored.
44
+ * @attr placement - Preferred placement of the action menu relative to the trigger button.
45
+ *
46
+ * @cssprop [--rc-fab-menu-position-css=fixed] - CSS position value for the floating wrapper.
47
+ * @cssprop [--rc-fab-menu-inset-block=1.5rem] - Distance from the block-axis edge; falls back
48
+ * through --rc-fab-inset-block.
49
+ * @cssprop [--rc-fab-menu-inset-inline=1.5rem] - Distance from the inline-axis edge; falls back
50
+ * through --rc-fab-inset-inline.
51
+ * @cssprop [--rc-fab-menu-z-index=10] - Stacking order for the floating wrapper; falls back
52
+ * through --rc-fab-z-index.
53
+ * @cssprop [--rc-fab-menu-trigger-gap] - Gap between trigger icon and label content. No default.
54
+ * @cssprop [--rc-fab-menu-size] - Trigger minimum inline and block size. No default; set
55
+ * explicitly or apply a theme.
56
+ * @cssprop [--rc-fab-menu-padding-block] - Trigger block-axis padding (defers to native button
57
+ * padding when unset).
58
+ * @cssprop [--rc-fab-menu-padding-inline] - Trigger inline-axis padding (defers to native button
59
+ * padding when unset).
60
+ * @cssprop [--rc-fab-menu-appearance] - Trigger appearance (defers to native button appearance
61
+ * when unset).
62
+ * @cssprop [--rc-fab-menu-border] - Trigger border (defers to native button border when unset).
63
+ * @cssprop [--rc-fab-menu-radius] - Trigger border radius (defers to native button radius when
64
+ * unset).
65
+ * @cssprop [--rc-fab-menu-bg] - Trigger background (defers to native button background when
66
+ * unset).
67
+ * @cssprop [--rc-fab-menu-color] - Trigger foreground color (defers to native button color when
68
+ * unset).
69
+ * @cssprop [--rc-fab-menu-shadow] - Trigger elevation shadow (defers to native button shadow
70
+ * when unset).
71
+ * @cssprop [--rc-fab-menu-font] - Trigger font shorthand (defers to native button font when
72
+ * unset).
73
+ * @cssprop [--rc-fab-menu-font-family] - Trigger font family (defers to native button font-family
74
+ * when unset).
75
+ * @cssprop [--rc-fab-menu-font-size] - Trigger font size (defers to native button font-size when
76
+ * unset).
77
+ * @cssprop [--rc-fab-menu-font-weight] - Trigger font weight (defers to native button font-weight
78
+ * when unset).
79
+ * @cssprop [--rc-fab-menu-letter-spacing] - Trigger letter spacing (defers to native button
80
+ * letter-spacing when unset).
81
+ * @cssprop [--rc-fab-menu-text-decoration] - Trigger text decoration (defers to native button
82
+ * text-decoration when unset).
83
+ * @cssprop [--rc-fab-menu-user-select] - Trigger user-select (defers to native button user-select
84
+ * when unset).
85
+ * @cssprop [--rc-fab-menu-transition] - Trigger transition shorthand (defers to native button
86
+ * transition when unset).
87
+ * @cssprop [--rc-fab-menu-bg-hover] - Trigger hover background (defers to native button hover
88
+ * styling when unset).
89
+ * @cssprop [--rc-fab-menu-shadow-hover] - Trigger hover elevation shadow (defers to native button
90
+ * hover styling when unset).
91
+ * @cssprop [--rc-fab-menu-bg-open] - Trigger background while the menu is open (defers to native
92
+ * button styling when unset).
93
+ * @cssprop [--rc-fab-menu-shadow-open] - Trigger elevation shadow while the menu is open (defers
94
+ * to native button styling when unset).
95
+ * @cssprop [--rc-fab-menu-shadow-active] - Trigger pressed elevation shadow (defers to native
96
+ * button styling when unset).
97
+ * @cssprop [--rc-fab-menu-active-transform] - Trigger transform while pressed (defers to native
98
+ * button styling when unset).
99
+ * @cssprop [--rc-fab-menu-focus-ring] - Trigger focus ring (defers to native button focus styling
100
+ * when unset).
101
+ * @cssprop [--rc-fab-menu-focus-ring-offset] - Trigger focus ring offset (defers to native button
102
+ * focus styling when unset).
103
+ * @cssprop [--rc-fab-menu-disabled-opacity] - Trigger opacity while disabled (defers to native
104
+ * disabled styling when unset).
105
+ * @cssprop [--rc-fab-menu-disabled-shadow] - Trigger elevation shadow while disabled (defers to
106
+ * native disabled styling when unset).
107
+ * @cssprop [--rc-fab-menu-popup-z-index=1000] - Stacking order of the popup container; falls back
108
+ * through --rc-menu-button-popup-z-index.
109
+ * @cssprop [--rc-fab-menu-popup-duration=0ms] - Popup reveal transition duration.
110
+ * @cssprop [--rc-fab-menu-popup-transform-origin=bottom right] - Popup reveal transform origin.
111
+ *
112
+ * @csspart root - The root popup anchor inherited from `rc-menu-button`.
113
+ * @csspart popup - The popup container inherited from `rc-menu-button`.
114
+ */
115
+ export declare class RCFabMenu extends RCMenuButton {
116
+ static styles: import('lit').CSSResult[];
117
+ /** Viewport corner where the floating action menu trigger is anchored. */
118
+ position: RCFabMenuPosition;
119
+ /** Preferred placement of the action menu relative to the trigger button. */
120
+ placement: AnchorPlacement;
121
+ /** Dispatches the `rc-fab-menu-toggle` bubbling composed event with the current open state. */
122
+ protected _dispatchToggle(): void;
123
+ }
124
+ export default RCFabMenu;
@@ -0,0 +1,2 @@
1
+ export declare const fabMenuStyles: import('lit').CSSResult;
2
+ export default fabMenuStyles;
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@rcarls/rc-fab-menu",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "0.4.0",
7
+ "description": "Floating action button menu wrapper for an rc-menu action surface.",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/richardcarls/rc-webcomponents.git",
11
+ "directory": "packages/rc-fab-menu"
12
+ },
13
+ "homepage": "https://richardcarls.github.io/rc-webcomponents/components/rc-fab-menu",
14
+ "license": "MIT",
15
+ "type": "module",
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "module": "./dist/rc-fab-menu.js",
20
+ "exports": {
21
+ ".": {
22
+ "import": {
23
+ "types": "./dist/types/packages/rc-fab-menu/src/index.d.ts",
24
+ "default": "./dist/rc-fab-menu.js"
25
+ }
26
+ },
27
+ "./define": {
28
+ "import": {
29
+ "types": "./dist/types/packages/rc-fab-menu/src/define.d.ts",
30
+ "default": "./dist/rc-fab-menu-define.js"
31
+ }
32
+ }
33
+ },
34
+ "types": "./dist/types/packages/rc-fab-menu/src/index.d.ts",
35
+ "sideEffects": [
36
+ "./dist/rc-fab-menu-define.js"
37
+ ],
38
+ "customElements": "dist/custom-elements.json",
39
+ "scripts": {
40
+ "build": "tsc && vite build && cem analyze",
41
+ "cem:analyze": "cem analyze",
42
+ "preview": "vite preview",
43
+ "test:browser": "vitest --run",
44
+ "test:browser:chrome": "vitest --run --project=chromium",
45
+ "test:browser:firefox": "vitest --run --project=firefox"
46
+ },
47
+ "dependencies": {
48
+ "@rcarls/rc-common": "workspace:*",
49
+ "@rcarls/rc-menu": "workspace:*",
50
+ "@rcarls/rc-menu-button": "workspace:*"
51
+ },
52
+ "devDependencies": {
53
+ "@custom-elements-manifest/analyzer": "0.11.0",
54
+ "@vitest/browser-playwright": "4.1.5",
55
+ "lit": "^3.0.0",
56
+ "playwright": "^1.56.0",
57
+ "rollup": "^4.60.2",
58
+ "typescript": "~5.9.3",
59
+ "vite": "^7.1.7",
60
+ "vite-plugin-dts": "^4.5.4",
61
+ "vitest": "^4.0.6",
62
+ "vitest-browser-lit": "^1.0.1"
63
+ },
64
+ "peerDependencies": {
65
+ "lit": "^3.0.0"
66
+ }
67
+ }