@bug-on/md3-react 2.0.2 → 3.0.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/.turbo/turbo-build.log +33 -0
- package/CHANGELOG.md +55 -0
- package/dist/index.css +23 -0
- package/dist/index.css.d.ts +2 -0
- package/dist/index.d.mts +6127 -0
- package/dist/index.d.ts +6127 -69
- package/dist/index.js +2536 -665
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2443 -603
- package/dist/index.mjs.map +1 -1
- package/dist/material-symbols-cdn.css.d.ts +2 -0
- package/dist/material-symbols-self-hosted.css.d.ts +2 -0
- package/dist/typography.css.d.ts +2 -0
- package/package.json +23 -19
- package/scripts/copy-assets.js +82 -0
- package/src/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
- package/src/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/src/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/src/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
- package/src/assets/loading-indicator.svg +19 -0
- package/src/assets/material-symbols-cdn.css +65 -0
- package/src/assets/material-symbols-self-hosted.css +90 -0
- package/src/css.d.ts +20 -0
- package/{dist/hooks/index.d.ts → src/hooks/index.ts} +1 -0
- package/src/hooks/useClickOutside.ts +37 -0
- package/src/hooks/useMediaQuery.ts +28 -0
- package/src/hooks/useRipple.ts +88 -0
- package/src/index.css +23 -0
- package/src/index.ts +349 -0
- package/src/lib/material-symbols-preconnect.tsx +82 -0
- package/src/lib/theme-utils.ts +180 -0
- package/src/lib/utils.ts +6 -0
- package/src/test/button.test.tsx +59 -0
- package/src/test/icon.test.tsx +91 -0
- package/src/test/loading-indicator.test.tsx +128 -0
- package/src/test/progress-indicator.test.tsx +306 -0
- package/src/test/setup.ts +80 -0
- package/src/test/typography.test.tsx +206 -0
- package/src/types/index.ts +7 -0
- package/src/types/md3.ts +31 -0
- package/src/ui/Text.tsx +60 -0
- package/src/ui/__snapshots__/divider.test.tsx.snap +63 -0
- package/src/ui/app-bar/app-bar-column.tsx +99 -0
- package/src/ui/app-bar/app-bar-item-button.tsx +71 -0
- package/src/ui/app-bar/app-bar-items.test.tsx +89 -0
- package/src/ui/app-bar/app-bar-overflow-indicator.tsx +108 -0
- package/src/ui/app-bar/app-bar-row.tsx +104 -0
- package/src/ui/app-bar/app-bar.test.tsx +87 -0
- package/src/ui/app-bar/app-bar.tokens.ts +223 -0
- package/src/ui/app-bar/app-bar.types.ts +441 -0
- package/src/ui/app-bar/bottom-app-bar.test.tsx +42 -0
- package/src/ui/app-bar/bottom-app-bar.tsx +84 -0
- package/src/ui/app-bar/docked-toolbar.test.tsx +34 -0
- package/src/ui/app-bar/docked-toolbar.tsx +54 -0
- package/src/ui/app-bar/flexible-app-bar.test.tsx +75 -0
- package/src/ui/app-bar/hooks/use-app-bar-scroll.ts +110 -0
- package/src/ui/app-bar/hooks/use-flexible-app-bar.ts +123 -0
- package/{dist/ui/app-bar/index.d.ts → src/ui/app-bar/index.ts} +35 -2
- package/src/ui/app-bar/large-flexible-app-bar.tsx +165 -0
- package/src/ui/app-bar/medium-flexible-app-bar.tsx +167 -0
- package/src/ui/app-bar/search-app-bar.test.tsx +49 -0
- package/src/ui/app-bar/search-app-bar.tsx +176 -0
- package/src/ui/app-bar/search-view.tsx +227 -0
- package/src/ui/app-bar/small-app-bar.test.tsx +48 -0
- package/src/ui/app-bar/small-app-bar.tsx +203 -0
- package/src/ui/badge.test.tsx +345 -0
- package/src/ui/badge.tsx +282 -0
- package/src/ui/button-group.test.tsx +71 -0
- package/src/ui/button-group.tsx +350 -0
- package/src/ui/button.test.tsx +297 -0
- package/src/ui/button.tsx +669 -0
- package/src/ui/card.test.tsx +187 -0
- package/src/ui/card.tsx +259 -0
- package/src/ui/checkbox.test.tsx +423 -0
- package/src/ui/checkbox.tsx +525 -0
- package/src/ui/chip.test.tsx +292 -0
- package/src/ui/chip.tsx +548 -0
- package/src/ui/code-block.tsx +219 -0
- package/src/ui/dialog.test.tsx +300 -0
- package/src/ui/dialog.tsx +384 -0
- package/src/ui/divider.test.tsx +314 -0
- package/src/ui/divider.tsx +412 -0
- package/src/ui/drawer.tsx +240 -0
- package/src/ui/fab-menu.test.tsx +494 -0
- package/src/ui/fab-menu.tsx +739 -0
- package/src/ui/fab.test.tsx +232 -0
- package/src/ui/fab.tsx +505 -0
- package/src/ui/icon-button.test.tsx +515 -0
- package/src/ui/icon-button.tsx +525 -0
- package/src/ui/icon.test.tsx +197 -0
- package/src/ui/icon.tsx +179 -0
- package/src/ui/loading-indicator.test.tsx +73 -0
- package/src/ui/loading-indicator.tsx +312 -0
- package/src/ui/menu/context-menu.tsx +275 -0
- package/src/ui/menu/index.ts +77 -0
- package/src/ui/menu/menu-animations.ts +102 -0
- package/src/ui/menu/menu-context.tsx +99 -0
- package/src/ui/menu/menu-divider.tsx +47 -0
- package/src/ui/menu/menu-group.tsx +200 -0
- package/src/ui/menu/menu-item.tsx +294 -0
- package/src/ui/menu/menu-tokens.ts +208 -0
- package/src/ui/menu/menu-types.ts +313 -0
- package/src/ui/menu/menu.test.tsx +624 -0
- package/src/ui/menu/menu.tsx +289 -0
- package/src/ui/menu/sub-menu.tsx +223 -0
- package/src/ui/menu/vertical-menu.tsx +382 -0
- package/src/ui/navigation-rail.test.tsx +404 -0
- package/src/ui/navigation-rail.tsx +604 -0
- package/src/ui/progress-indicator/circular.tsx +248 -0
- package/src/ui/progress-indicator/hooks.ts +51 -0
- package/{dist/ui/progress-indicator/index.d.ts → src/ui/progress-indicator/index.tsx} +20 -2
- package/src/ui/progress-indicator/linear-flat.tsx +83 -0
- package/src/ui/progress-indicator/linear-wavy.tsx +243 -0
- package/src/ui/progress-indicator/linear.tsx +143 -0
- package/src/ui/progress-indicator/types.ts +158 -0
- package/src/ui/progress-indicator/utils.ts +73 -0
- package/src/ui/radio-button.test.tsx +407 -0
- package/src/ui/radio-button.tsx +551 -0
- package/src/ui/ripple.test.tsx +72 -0
- package/src/ui/ripple.tsx +234 -0
- package/src/ui/scroll-area.test.tsx +58 -0
- package/src/ui/scroll-area.tsx +139 -0
- package/src/ui/search/animated-placeholder.tsx +145 -0
- package/src/ui/search/hooks/use-search-keyboard.test.ts +202 -0
- package/src/ui/search/hooks/use-search-keyboard.ts +104 -0
- package/src/ui/search/hooks/use-search-view-focus.test.ts +96 -0
- package/src/ui/search/hooks/use-search-view-focus.ts +24 -0
- package/src/ui/search/index.ts +44 -0
- package/src/ui/search/search-bar.tsx +220 -0
- package/src/ui/search/search-context.tsx +42 -0
- package/src/ui/search/search-view-docked.tsx +194 -0
- package/src/ui/search/search-view-fullscreen.tsx +247 -0
- package/src/ui/search/search.test.tsx +233 -0
- package/src/ui/search/search.tokens.ts +134 -0
- package/src/ui/search/search.tsx +131 -0
- package/src/ui/search/search.types.ts +154 -0
- package/src/ui/search/trailing-action.tsx +49 -0
- package/src/ui/shared/constants.ts +122 -0
- package/{dist/ui/shared/touch-target.d.ts → src/ui/shared/touch-target.tsx} +13 -1
- package/src/ui/slider/hooks/useSliderMath.ts +195 -0
- package/{dist/ui/slider/index.d.ts → src/ui/slider/index.ts} +12 -1
- package/src/ui/slider/range-slider.tsx +561 -0
- package/src/ui/slider/slider-thumb.tsx +379 -0
- package/src/ui/slider/slider-track.tsx +912 -0
- package/src/ui/slider/slider.tokens.ts +189 -0
- package/src/ui/slider/slider.tsx +259 -0
- package/src/ui/slider/slider.types.ts +288 -0
- package/src/ui/snackbar/index.ts +20 -0
- package/src/ui/snackbar/snackbar.test.tsx +338 -0
- package/src/ui/snackbar/snackbar.tsx +476 -0
- package/{dist/ui/switch/index.d.ts → src/ui/switch/index.ts} +1 -0
- package/src/ui/switch/switch.stories.tsx +309 -0
- package/src/ui/switch/switch.test.tsx +243 -0
- package/src/ui/switch/switch.tokens.ts +89 -0
- package/src/ui/switch/switch.tsx +504 -0
- package/src/ui/switch/switch.types.ts +62 -0
- package/{dist/ui/tabs/index.d.ts → src/ui/tabs/index.ts} +8 -1
- package/src/ui/tabs/tab.tsx +407 -0
- package/src/ui/tabs/tabs-content.tsx +89 -0
- package/src/ui/tabs/tabs-list.tsx +146 -0
- package/src/ui/tabs/tabs.test.tsx +290 -0
- package/src/ui/tabs/tabs.tokens.ts +121 -0
- package/src/ui/tabs/tabs.tsx +229 -0
- package/src/ui/tabs/tabs.types.ts +185 -0
- package/{dist/ui/text-field/index.d.ts → src/ui/text-field/index.ts} +8 -1
- package/src/ui/text-field/subcomponents/active-indicator.tsx +67 -0
- package/src/ui/text-field/subcomponents/floating-label.tsx +161 -0
- package/src/ui/text-field/subcomponents/leading-icon.tsx +46 -0
- package/src/ui/text-field/subcomponents/outline-container.tsx +170 -0
- package/src/ui/text-field/subcomponents/prefix-suffix.tsx +59 -0
- package/src/ui/text-field/subcomponents/supporting-text.tsx +145 -0
- package/src/ui/text-field/subcomponents/trailing-icon.tsx +199 -0
- package/src/ui/text-field/text-field.test.tsx +454 -0
- package/src/ui/text-field/text-field.tokens.ts +104 -0
- package/src/ui/text-field/text-field.tsx +548 -0
- package/src/ui/text-field/text-field.types.ts +180 -0
- package/src/ui/theme-provider/index.tsx +190 -0
- package/src/ui/toc.test.tsx +108 -0
- package/src/ui/toc.tsx +172 -0
- package/src/ui/tooltip/plain-tooltip.tsx +63 -0
- package/src/ui/tooltip/rich-tooltip.tsx +94 -0
- package/src/ui/tooltip/tooltip-box.tsx +266 -0
- package/src/ui/tooltip/tooltip-caret-shape.tsx +68 -0
- package/src/ui/tooltip/tooltip.tokens.ts +26 -0
- package/src/ui/tooltip/tooltip.types.ts +70 -0
- package/src/ui/tooltip/use-tooltip-position.ts +208 -0
- package/src/ui/tooltip/use-tooltip-state.ts +41 -0
- package/src/ui/typography/__tests__/typography.test.tsx +170 -0
- package/{dist/ui/typography/index.d.ts → src/ui/typography/index.ts} +21 -3
- package/src/ui/typography/type-scale-tokens.ts +205 -0
- package/src/ui/typography/typography-key-tokens.ts +43 -0
- package/src/ui/typography/typography-tokens.ts +360 -0
- package/src/ui/typography/typography.css +22 -0
- package/src/ui/typography/typography.tsx +559 -0
- package/test-render.tsx +4 -0
- package/test-shadow.html +26 -0
- package/test_output.txt +164 -0
- package/test_output_v2.txt +5 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +18 -0
- package/tsup.config.ts +20 -0
- package/vitest.config.ts +11 -0
- package/dist/hooks/useMediaQuery.d.ts +0 -11
- package/dist/hooks/useRipple.d.ts +0 -26
- package/dist/lib/material-symbols-preconnect.d.ts +0 -42
- package/dist/lib/theme-utils.d.ts +0 -63
- package/dist/lib/utils.d.ts +0 -2
- package/dist/types/index.d.ts +0 -1
- package/dist/types/md3.d.ts +0 -14
- package/dist/ui/app-bar/app-bar-column.d.ts +0 -28
- package/dist/ui/app-bar/app-bar-item-button.d.ts +0 -16
- package/dist/ui/app-bar/app-bar-overflow-indicator.d.ts +0 -18
- package/dist/ui/app-bar/app-bar-row.d.ts +0 -36
- package/dist/ui/app-bar/app-bar.tokens.d.ts +0 -184
- package/dist/ui/app-bar/app-bar.types.d.ts +0 -392
- package/dist/ui/app-bar/bottom-app-bar.d.ts +0 -31
- package/dist/ui/app-bar/docked-toolbar.d.ts +0 -25
- package/dist/ui/app-bar/hooks/use-app-bar-scroll.d.ts +0 -42
- package/dist/ui/app-bar/hooks/use-flexible-app-bar.d.ts +0 -37
- package/dist/ui/app-bar/large-flexible-app-bar.d.ts +0 -26
- package/dist/ui/app-bar/medium-flexible-app-bar.d.ts +0 -28
- package/dist/ui/app-bar/search-app-bar.d.ts +0 -43
- package/dist/ui/app-bar/search-view.d.ts +0 -54
- package/dist/ui/app-bar/small-app-bar.d.ts +0 -37
- package/dist/ui/badge.d.ts +0 -125
- package/dist/ui/button-group.d.ts +0 -59
- package/dist/ui/button.d.ts +0 -148
- package/dist/ui/card.d.ts +0 -62
- package/dist/ui/checkbox.d.ts +0 -82
- package/dist/ui/chip.d.ts +0 -110
- package/dist/ui/code-block.d.ts +0 -14
- package/dist/ui/dialog.d.ts +0 -111
- package/dist/ui/divider.d.ts +0 -164
- package/dist/ui/drawer.d.ts +0 -39
- package/dist/ui/dropdown.d.ts +0 -29
- package/dist/ui/fab-menu.d.ts +0 -204
- package/dist/ui/fab.d.ts +0 -162
- package/dist/ui/icon-button.d.ts +0 -131
- package/dist/ui/icon.d.ts +0 -88
- package/dist/ui/loading-indicator.d.ts +0 -42
- package/dist/ui/navigation-rail.d.ts +0 -29
- package/dist/ui/progress-indicator/circular.d.ts +0 -3
- package/dist/ui/progress-indicator/hooks.d.ts +0 -3
- package/dist/ui/progress-indicator/linear-flat.d.ts +0 -10
- package/dist/ui/progress-indicator/linear-wavy.d.ts +0 -18
- package/dist/ui/progress-indicator/linear.d.ts +0 -3
- package/dist/ui/progress-indicator/types.d.ts +0 -151
- package/dist/ui/progress-indicator/utils.d.ts +0 -3
- package/dist/ui/radio-button.d.ts +0 -106
- package/dist/ui/ripple.d.ts +0 -126
- package/dist/ui/scroll-area.d.ts +0 -27
- package/dist/ui/shared/constants.d.ts +0 -86
- package/dist/ui/slider/hooks/useSliderMath.d.ts +0 -101
- package/dist/ui/slider/range-slider.d.ts +0 -47
- package/dist/ui/slider/slider-thumb.d.ts +0 -33
- package/dist/ui/slider/slider-track.d.ts +0 -25
- package/dist/ui/slider/slider.d.ts +0 -60
- package/dist/ui/slider/slider.tokens.d.ts +0 -151
- package/dist/ui/slider/slider.types.d.ts +0 -259
- package/dist/ui/snackbar/index.d.ts +0 -6
- package/dist/ui/snackbar/snackbar.d.ts +0 -197
- package/dist/ui/switch/switch.d.ts +0 -30
- package/dist/ui/switch/switch.stories.d.ts +0 -48
- package/dist/ui/switch/switch.tokens.d.ts +0 -67
- package/dist/ui/switch/switch.types.d.ts +0 -59
- package/dist/ui/tabs/tab.d.ts +0 -43
- package/dist/ui/tabs/tabs-content.d.ts +0 -36
- package/dist/ui/tabs/tabs-list.d.ts +0 -40
- package/dist/ui/tabs/tabs.d.ts +0 -60
- package/dist/ui/tabs/tabs.tokens.d.ts +0 -94
- package/dist/ui/tabs/tabs.types.d.ts +0 -172
- package/dist/ui/text-field/subcomponents/active-indicator.d.ts +0 -24
- package/dist/ui/text-field/subcomponents/floating-label.d.ts +0 -43
- package/dist/ui/text-field/subcomponents/leading-icon.d.ts +0 -23
- package/dist/ui/text-field/subcomponents/outline-container.d.ts +0 -42
- package/dist/ui/text-field/subcomponents/prefix-suffix.d.ts +0 -24
- package/dist/ui/text-field/subcomponents/supporting-text.d.ts +0 -37
- package/dist/ui/text-field/subcomponents/trailing-icon.d.ts +0 -41
- package/dist/ui/text-field/text-field.d.ts +0 -49
- package/dist/ui/text-field/text-field.tokens.d.ts +0 -76
- package/dist/ui/text-field/text-field.types.d.ts +0 -126
- package/dist/ui/theme-provider/index.d.ts +0 -48
- package/dist/ui/toc.d.ts +0 -80
- package/dist/ui/tooltip/plain-tooltip.d.ts +0 -2
- package/dist/ui/tooltip/rich-tooltip.d.ts +0 -2
- package/dist/ui/tooltip/tooltip-box.d.ts +0 -2
- package/dist/ui/tooltip/tooltip-caret-shape.d.ts +0 -9
- package/dist/ui/tooltip/tooltip.tokens.d.ts +0 -26
- package/dist/ui/tooltip/tooltip.types.d.ts +0 -56
- package/dist/ui/tooltip/use-tooltip-position.d.ts +0 -8
- package/dist/ui/tooltip/use-tooltip-state.d.ts +0 -2
- package/dist/ui/typography/type-scale-tokens.d.ts +0 -162
- package/dist/ui/typography/typography-key-tokens.d.ts +0 -40
- package/dist/ui/typography/typography-tokens.d.ts +0 -220
- package/dist/ui/typography/typography.d.ts +0 -265
- /package/{dist/ui/tooltip/index.d.ts → src/ui/tooltip/index.ts} +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// ─── MD3 Expressive Menu — Type Definitions ───────────────────────────────────
|
|
2
|
+
// Sourced from: StandardMenuTokens.kt, VibrantMenuTokens.kt, SegmentedMenuTokens.kt, MenuDefaults.kt
|
|
3
|
+
|
|
4
|
+
import type * as React from "react";
|
|
5
|
+
|
|
6
|
+
/** Color variant of the menu — standard (surface-based) or vibrant (tertiary-based). */
|
|
7
|
+
export type MenuColorVariant = "standard" | "vibrant";
|
|
8
|
+
|
|
9
|
+
/** Visual variant of the menu. */
|
|
10
|
+
export type MenuVariant = "baseline" | "expressive";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Which Radix primitive family drives this menu:
|
|
14
|
+
* - `dropdown` → @radix-ui/react-dropdown-menu (button, text field, icon trigger)
|
|
15
|
+
* - `context` → @radix-ui/react-context-menu (right-click / long-press trigger)
|
|
16
|
+
* - `static` → plain HTML via Slot (VerticalMenu — always-visible)
|
|
17
|
+
*/
|
|
18
|
+
export type MenuPrimitive = "dropdown" | "context" | "static";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Position of a MenuItem within its group or menu.
|
|
22
|
+
* Controls the shape morphing (border-radius) applied to each item.
|
|
23
|
+
*
|
|
24
|
+
* - `leading` → first item: top corners rounded more (CornerMedium top, CornerExtraSmall bottom)
|
|
25
|
+
* - `middle` → middle items: CornerExtraSmall all corners
|
|
26
|
+
* - `trailing` → last item: bottom corners rounded more (CornerExtraSmall top, CornerMedium bottom)
|
|
27
|
+
* - `standalone` → only item in group: CornerExtraSmall (same as middle, but semantically distinct)
|
|
28
|
+
*/
|
|
29
|
+
export type MenuItemPosition = "standalone" | "leading" | "middle" | "trailing";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Position of a MenuGroup within the popup container.
|
|
33
|
+
* Controls the container's border-radius shape morphing.
|
|
34
|
+
*/
|
|
35
|
+
export type MenuGroupPosition =
|
|
36
|
+
| "standalone"
|
|
37
|
+
| "leading"
|
|
38
|
+
| "middle"
|
|
39
|
+
| "trailing";
|
|
40
|
+
|
|
41
|
+
// ─── Menu Root ────────────────────────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
export interface MenuProps {
|
|
44
|
+
/** Menu items and groups */
|
|
45
|
+
children: React.ReactNode;
|
|
46
|
+
/**
|
|
47
|
+
* Color variant of the menu.
|
|
48
|
+
* Only applies when `variant="expressive"`. Baseline menus always use baseline colors.
|
|
49
|
+
* - `standard`: surface-container-low background
|
|
50
|
+
* - `vibrant`: tertiary-container background (use sparingly, high emphasis)
|
|
51
|
+
*/
|
|
52
|
+
colorVariant?: MenuColorVariant;
|
|
53
|
+
/**
|
|
54
|
+
* Visual variant of the menu.
|
|
55
|
+
* - `baseline`: original M3 specs (4dp corners, no shape morphing)
|
|
56
|
+
* - `expressive`: M3 Expressive specs (shape morphing, rounded groups)
|
|
57
|
+
* @default "baseline"
|
|
58
|
+
*/
|
|
59
|
+
variant?: MenuVariant;
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated Use `variant` instead. Will be removed in next major version.
|
|
62
|
+
*/
|
|
63
|
+
menuVariant?: MenuVariant;
|
|
64
|
+
/**
|
|
65
|
+
* Controlled open state. When provided, the menu acts as a controlled component.
|
|
66
|
+
* Pair with `onOpenChange` to manage state externally.
|
|
67
|
+
*/
|
|
68
|
+
open?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Called when the menu's open state changes (both controlled and uncontrolled).
|
|
71
|
+
* Required when using `open` for controlled mode.
|
|
72
|
+
*/
|
|
73
|
+
onOpenChange?: (open: boolean) => void;
|
|
74
|
+
/** Additional className for the root element */
|
|
75
|
+
className?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ─── Menu Trigger ─────────────────────────────────────────────────────────────
|
|
79
|
+
|
|
80
|
+
export interface MenuTriggerProps {
|
|
81
|
+
children: React.ReactNode;
|
|
82
|
+
/** If true, merges props with the child element instead of wrapping */
|
|
83
|
+
asChild?: boolean;
|
|
84
|
+
className?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ─── Menu Content (popup panel) ───────────────────────────────────────────────
|
|
88
|
+
|
|
89
|
+
export interface MenuContentProps {
|
|
90
|
+
children: React.ReactNode;
|
|
91
|
+
/** Gap between menu and anchor in pixels. Default: 6 */
|
|
92
|
+
sideOffset?: number;
|
|
93
|
+
/** Preferred side of the anchor to render the menu. */
|
|
94
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
95
|
+
/** Preferred alignment relative to the anchor. */
|
|
96
|
+
align?: "start" | "center" | "end";
|
|
97
|
+
/**
|
|
98
|
+
* When true, disables overflow-hidden on the container so nested SubMenus
|
|
99
|
+
* can escape the bounds. Required when using SubMenu.
|
|
100
|
+
*/
|
|
101
|
+
hasOverflow?: boolean;
|
|
102
|
+
/** Override colorVariant from MenuContext (only for expressive variant) */
|
|
103
|
+
colorVariant?: MenuColorVariant;
|
|
104
|
+
/**
|
|
105
|
+
* Separation style between groups (only applies when variant="expressive").
|
|
106
|
+
* - `gap` → 2dp visual gap, transparent container
|
|
107
|
+
* - `divider` → solid container, no gap
|
|
108
|
+
* Default: "gap"
|
|
109
|
+
*/
|
|
110
|
+
separatorStyle?: VerticalMenuSeparatorStyle;
|
|
111
|
+
className?: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ─── MenuItem ─────────────────────────────────────────────────────────────────
|
|
115
|
+
|
|
116
|
+
export interface MenuItemProps {
|
|
117
|
+
/** Primary label text of the item */
|
|
118
|
+
children: React.ReactNode;
|
|
119
|
+
/** Callback when the item is clicked */
|
|
120
|
+
onClick?: React.MouseEventHandler<HTMLDivElement>;
|
|
121
|
+
/**
|
|
122
|
+
* Optional leading icon (20dp).
|
|
123
|
+
* For unselected state in selectable items; replaced by check icon when selected.
|
|
124
|
+
*/
|
|
125
|
+
leadingIcon?: React.ReactNode;
|
|
126
|
+
/** Optional trailing icon (20dp) or chevron for submenus */
|
|
127
|
+
trailingIcon?: React.ReactNode;
|
|
128
|
+
/** Supporting text below the primary label (body-medium) */
|
|
129
|
+
supportingText?: React.ReactNode;
|
|
130
|
+
/** Trailing keyboard shortcut text e.g. "Ctrl+C", "⌘C" */
|
|
131
|
+
trailingText?: string;
|
|
132
|
+
/**
|
|
133
|
+
* Whether this item is selected/checked.
|
|
134
|
+
* When true: shows check icon (leading slot) and applies selected container color.
|
|
135
|
+
* Overrides itemPosition shape with `rounded-m3-md`.
|
|
136
|
+
*/
|
|
137
|
+
selected?: boolean;
|
|
138
|
+
/** Whether this item is disabled */
|
|
139
|
+
disabled?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Controls shape morphing based on position within its group.
|
|
142
|
+
* Automatically injected by MenuGroup via React.cloneElement when grouping is used.
|
|
143
|
+
*/
|
|
144
|
+
itemPosition?: MenuItemPosition;
|
|
145
|
+
/** Override colorVariant from MenuContext */
|
|
146
|
+
colorVariant?: MenuColorVariant;
|
|
147
|
+
/** If true, keeps the menu open after clicking (e.g. for multi-select items) */
|
|
148
|
+
keepOpen?: boolean;
|
|
149
|
+
className?: string;
|
|
150
|
+
/** Optional value for radio items. Required when role='menuitemradio'. */
|
|
151
|
+
value?: string;
|
|
152
|
+
/** Internal flag used by SubMenu to render this item as a SubTrigger primitive. */
|
|
153
|
+
isSubTrigger?: boolean;
|
|
154
|
+
/** ARIA role override. Defaults to 'menuitem', 'menuitemcheckbox', or 'menuitemradio' based on selected prop. */
|
|
155
|
+
role?: string;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ─── MenuGroup ────────────────────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
export interface MenuGroupProps {
|
|
161
|
+
/** MenuItem children — itemPosition is auto-injected */
|
|
162
|
+
children: React.ReactNode;
|
|
163
|
+
/**
|
|
164
|
+
* Optional label displayed at the top of the group.
|
|
165
|
+
* Uses labelLarge typography with 12dp horizontal padding.
|
|
166
|
+
*/
|
|
167
|
+
label?: string;
|
|
168
|
+
/**
|
|
169
|
+
* Zero-based index of this group in the parent menu.
|
|
170
|
+
* Used to determine shape (leading/middle/trailing/standalone).
|
|
171
|
+
* Auto-provided when using MenuContent's grouping utilities.
|
|
172
|
+
*/
|
|
173
|
+
index?: number;
|
|
174
|
+
/**
|
|
175
|
+
* Total number of groups in the parent menu.
|
|
176
|
+
* Used together with index to determine shape.
|
|
177
|
+
*/
|
|
178
|
+
count?: number;
|
|
179
|
+
/** Override colorVariant from MenuContext */
|
|
180
|
+
colorVariant?: MenuColorVariant;
|
|
181
|
+
/** Internal flag: true if rendered inside a gap-variant vertical menu (to adjust padding) */
|
|
182
|
+
isGapVariant?: boolean;
|
|
183
|
+
/** Optionally injected when nested inside another MenuGroup */
|
|
184
|
+
itemPosition?: MenuItemPosition;
|
|
185
|
+
className?: string;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ─── MenuDivider ──────────────────────────────────────────────────────────────
|
|
189
|
+
|
|
190
|
+
export interface MenuDividerProps {
|
|
191
|
+
className?: string;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// ─── SubMenu ──────────────────────────────────────────────────────────────────
|
|
195
|
+
|
|
196
|
+
export interface SubMenuProps {
|
|
197
|
+
/** The SubMenu children (another MenuContent) */
|
|
198
|
+
children: React.ReactNode;
|
|
199
|
+
/** The trigger element (typically a MenuItem with trailing chevron) */
|
|
200
|
+
trigger: React.ReactNode;
|
|
201
|
+
/** Preferred side to open the submenu. Default: 'right' */
|
|
202
|
+
side?: "left" | "right";
|
|
203
|
+
/** Override colorVariant from MenuContext */
|
|
204
|
+
colorVariant?: MenuColorVariant;
|
|
205
|
+
/** Delay in ms before submenu opens on hover. Default: 200 */
|
|
206
|
+
hoverOpenDelay?: number;
|
|
207
|
+
/** Delay in ms before submenu closes on pointer-leave. Default: 300 */
|
|
208
|
+
hoverCloseDelay?: number;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ─── Vertical Menu ────────────────────────────────────────────────────────────
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* How groups within a VerticalMenuContent are separated.
|
|
215
|
+
* - `gap` → 2dp gap between groups (SegmentedMenuTokens.SegmentedGap)
|
|
216
|
+
* - `divider` → outline-variant horizontal rule between groups (MenuDefaults.HorizontalDividerPadding)
|
|
217
|
+
*/
|
|
218
|
+
export type VerticalMenuSeparatorStyle = "gap" | "divider";
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Root of an always-visible vertical menu (no trigger, no popup).
|
|
222
|
+
* Provides `MenuContext` with `colorVariant` to all descendants.
|
|
223
|
+
*/
|
|
224
|
+
export interface VerticalMenuProps {
|
|
225
|
+
children: React.ReactNode;
|
|
226
|
+
/**
|
|
227
|
+
* Color variant of the menu.
|
|
228
|
+
* - `standard`: surface-container-low background (default)
|
|
229
|
+
* - `vibrant`: tertiary-container background
|
|
230
|
+
*/
|
|
231
|
+
colorVariant?: MenuColorVariant;
|
|
232
|
+
className?: string;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Container that renders VerticalMenuGroup children in a vertical list.
|
|
237
|
+
* Handles separator injection (gap or divider) and auto-injects `index`/`count` into groups.
|
|
238
|
+
*/
|
|
239
|
+
export interface VerticalMenuContentProps {
|
|
240
|
+
children: React.ReactNode;
|
|
241
|
+
/**
|
|
242
|
+
* Separation style between groups.
|
|
243
|
+
* - `gap` → 2dp visual gap (default, matches MD3 Expressive spec image 1 left)
|
|
244
|
+
* - `divider` → horizontal `outline-variant` rule (matches MD3 Expressive spec image 1 right)
|
|
245
|
+
*/
|
|
246
|
+
separatorStyle?: VerticalMenuSeparatorStyle;
|
|
247
|
+
/** Override colorVariant from VerticalMenu root */
|
|
248
|
+
colorVariant?: MenuColorVariant;
|
|
249
|
+
className?: string;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** A group within a VerticalMenu. Alias of MenuGroupProps. */
|
|
253
|
+
export interface VerticalMenuGroupProps extends MenuGroupProps {}
|
|
254
|
+
|
|
255
|
+
/** A plain horizontal divider for use between groups in a VerticalMenuContent with `separatorStyle="divider"`. */
|
|
256
|
+
export interface VerticalMenuDividerProps {
|
|
257
|
+
className?: string;
|
|
258
|
+
/** Optionally injected by VerticalMenuContent */
|
|
259
|
+
index?: number;
|
|
260
|
+
/** Optionally injected by VerticalMenuContent */
|
|
261
|
+
count?: number;
|
|
262
|
+
/** Optionally injected by VerticalMenuContent */
|
|
263
|
+
isGapVariant?: boolean;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ─── ContextMenu ───────────────────────────────────────────────────────────────
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Root of a context menu (right-click / long-press triggered popup).
|
|
270
|
+
*
|
|
271
|
+
* Wraps @radix-ui/react-context-menu Root and provides MenuContext with
|
|
272
|
+
* `menuPrimitive="context"` so MenuItem automatically uses ContextMenu primitives.
|
|
273
|
+
*/
|
|
274
|
+
export interface ContextMenuProps {
|
|
275
|
+
children: React.ReactNode;
|
|
276
|
+
/**
|
|
277
|
+
* Visual variant of the context menu.
|
|
278
|
+
* - `baseline`: original M3 specs (4dp corners, no shape morphing)
|
|
279
|
+
* - `expressive`: M3 Expressive specs (shape morphing, rounded groups)
|
|
280
|
+
* @default "baseline"
|
|
281
|
+
*/
|
|
282
|
+
variant?: MenuVariant;
|
|
283
|
+
/** Color variant. Only applies when `variant="expressive"`. */
|
|
284
|
+
colorVariant?: MenuColorVariant;
|
|
285
|
+
/** Additional className */
|
|
286
|
+
className?: string;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
export interface ContextMenuTriggerProps {
|
|
290
|
+
children: React.ReactNode;
|
|
291
|
+
/** If true, merges props with the child element instead of wrapping */
|
|
292
|
+
asChild?: boolean;
|
|
293
|
+
className?: string;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
export interface ContextMenuContentProps {
|
|
297
|
+
children: React.ReactNode;
|
|
298
|
+
/** Override colorVariant from ContextMenuContext */
|
|
299
|
+
colorVariant?: MenuColorVariant;
|
|
300
|
+
/**
|
|
301
|
+
* When true, disables overflow-hidden so nested SubMenus can escape bounds.
|
|
302
|
+
* Required when using SubMenu inside ContextMenu.
|
|
303
|
+
*/
|
|
304
|
+
hasOverflow?: boolean;
|
|
305
|
+
/**
|
|
306
|
+
* Separation style between groups (only applies when variant="expressive").
|
|
307
|
+
* - `gap` → 2dp visual gap, transparent container
|
|
308
|
+
* - `divider` → solid container, no gap
|
|
309
|
+
* Default: "gap"
|
|
310
|
+
*/
|
|
311
|
+
separatorStyle?: VerticalMenuSeparatorStyle;
|
|
312
|
+
className?: string;
|
|
313
|
+
}
|