@bug-on/md3-react 2.0.3 → 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.d.ts +2 -0
- package/dist/index.d.mts +6127 -0
- package/dist/index.d.ts +6127 -71
- package/dist/index.js +1653 -614
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1566 -547
- 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 +22 -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/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/useClickOutside.d.ts +0 -8
- 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/search/animated-placeholder.d.ts +0 -54
- package/dist/ui/search/hooks/use-search-keyboard.d.ts +0 -32
- package/dist/ui/search/hooks/use-search-view-focus.d.ts +0 -6
- package/dist/ui/search/index.d.ts +0 -27
- package/dist/ui/search/search-bar.d.ts +0 -32
- package/dist/ui/search/search-context.d.ts +0 -24
- package/dist/ui/search/search-view-docked.d.ts +0 -25
- package/dist/ui/search/search-view-fullscreen.d.ts +0 -36
- package/dist/ui/search/search.d.ts +0 -50
- package/dist/ui/search/search.tokens.d.ts +0 -112
- package/dist/ui/search/search.types.d.ts +0 -131
- package/dist/ui/search/trailing-action.d.ts +0 -9
- 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/hooks/index.d.ts → src/hooks/index.ts} +0 -0
- /package/{dist/ui/tooltip/index.d.ts → src/ui/tooltip/index.ts} +0 -0
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file slider.tsx
|
|
3
|
-
* MD3 Expressive Slider — Main composition component.
|
|
4
|
-
*
|
|
5
|
-
* Supports:
|
|
6
|
-
* - Controlled and uncontrolled usage patterns
|
|
7
|
-
* - Horizontal and vertical orientations
|
|
8
|
-
* - Discrete mode (step snapping + tick marks)
|
|
9
|
-
* - Centered active track (isCentered)
|
|
10
|
-
* - Value indicator tooltip
|
|
11
|
-
* - Full keyboard navigation (ARIA Slider pattern)
|
|
12
|
-
* - Click-to-jump on track
|
|
13
|
-
*
|
|
14
|
-
* Architecture: Flat (no Context needed for single thumb variant).
|
|
15
|
-
* Track + Thumb are internal sub-components composed here.
|
|
16
|
-
*
|
|
17
|
-
* @see https://m3.material.io/components/sliders/overview
|
|
18
|
-
* @see docs/m3/sliders/Slider.kt
|
|
19
|
-
*/
|
|
20
|
-
import * as React from "react";
|
|
21
|
-
import type { SliderProps } from "./slider.types";
|
|
22
|
-
/**
|
|
23
|
-
* MD3 Expressive Slider component.
|
|
24
|
-
*
|
|
25
|
-
* A pill-shaped vertical handle that slides along a rounded track.
|
|
26
|
-
* Supports continuous and discrete (step) modes, horizontal/vertical
|
|
27
|
-
* orientations, and centered active track.
|
|
28
|
-
*
|
|
29
|
-
* Features:
|
|
30
|
-
* - M3 Expressive handle: 4px pill that squeezes to 2px on press
|
|
31
|
-
* - 6px transparent gap between track and thumb
|
|
32
|
-
* - Asymmetric corner radii: outer ends=9999px, inner ends=2px
|
|
33
|
-
* - Tick marks for discrete mode
|
|
34
|
-
* - Optional floating value indicator tooltip
|
|
35
|
-
* - Full keyboard navigation per WAI-ARIA Slider pattern
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```tsx
|
|
39
|
-
* // Basic controlled
|
|
40
|
-
* <Slider value={volume} onValueChange={setVolume} aria-label="Volume" />
|
|
41
|
-
*
|
|
42
|
-
* // Discrete with ticks
|
|
43
|
-
* <Slider defaultValue={0} step={10} min={0} max={100} />
|
|
44
|
-
*
|
|
45
|
-
* // Vertical orientation
|
|
46
|
-
* <div className="h-64">
|
|
47
|
-
* <Slider defaultValue={50} orientation="vertical" aria-label="Brightness" />
|
|
48
|
-
* </div>
|
|
49
|
-
*
|
|
50
|
-
* // Centered active track
|
|
51
|
-
* <Slider defaultValue={0} isCentered showValueIndicator />
|
|
52
|
-
*
|
|
53
|
-
* // Large track with value tooltip
|
|
54
|
-
* <Slider defaultValue={50} trackSize="l" showValueIndicator
|
|
55
|
-
* formatValue={(v) => `${v}%`} />
|
|
56
|
-
* ```
|
|
57
|
-
*
|
|
58
|
-
* @see https://m3.material.io/components/sliders/overview
|
|
59
|
-
*/
|
|
60
|
-
export declare const Slider: React.NamedExoticComponent<SliderProps & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file slider.tokens.ts
|
|
3
|
-
* MD3 Expressive Slider — Design tokens ported from:
|
|
4
|
-
* - SliderTokens.kt (Jetpack Compose M3 Expressive)
|
|
5
|
-
* - M3 Expressive visual spec (handle squeeze, gaps, asymmetric radii)
|
|
6
|
-
*
|
|
7
|
-
* All dimensional values are in px (dp equivalents for web).
|
|
8
|
-
* Colors reference CSS custom properties — do NOT hardcode hex.
|
|
9
|
-
* @see docs/m3/sliders/Slider.kt
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Core dimensional design tokens for the MD3 Expressive Slider.
|
|
13
|
-
* Maps directly from SliderTokens.kt to CSS/JS values.
|
|
14
|
-
*/
|
|
15
|
-
export declare const SliderTokens: {
|
|
16
|
-
readonly trackSizes: {
|
|
17
|
-
xs: number;
|
|
18
|
-
s: number;
|
|
19
|
-
m: number;
|
|
20
|
-
l: number;
|
|
21
|
-
xl: number;
|
|
22
|
-
};
|
|
23
|
-
readonly trackShapes: {
|
|
24
|
-
xs: number;
|
|
25
|
-
s: number;
|
|
26
|
-
m: number;
|
|
27
|
-
l: number;
|
|
28
|
-
xl: number;
|
|
29
|
-
};
|
|
30
|
-
/** Thumb height grows with track size */
|
|
31
|
-
readonly thumbHeights: {
|
|
32
|
-
xs: number;
|
|
33
|
-
s: number;
|
|
34
|
-
m: number;
|
|
35
|
-
l: number;
|
|
36
|
-
xl: number;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Thumb width at rest and on hover.
|
|
40
|
-
* MD3 Expressive handle pill: 4dp wide.
|
|
41
|
-
*/
|
|
42
|
-
readonly thumbWidthDefault: 4;
|
|
43
|
-
/**
|
|
44
|
-
* Thumb width while pressed/dragging.
|
|
45
|
-
* "Squeeze" animation: 4dp → 2dp (M3 Expressive behavior).
|
|
46
|
-
*/
|
|
47
|
-
readonly thumbWidthPressed: 2;
|
|
48
|
-
/**
|
|
49
|
-
* Transparent gap between the active/inactive track segments and the thumb.
|
|
50
|
-
* Maps to ActiveHandleLeadingSpace / ActiveHandleTrailingSpace = 6dp.
|
|
51
|
-
*
|
|
52
|
-
* This gap is rendered by mathematically subtracting it from the track
|
|
53
|
-
* segment width — NOT using margin/padding.
|
|
54
|
-
*/
|
|
55
|
-
readonly thumbGap: 6;
|
|
56
|
-
/**
|
|
57
|
-
* Corner radius on the INNER ends of each track segment (facing the thumb).
|
|
58
|
-
* Fixed to 2px according to MD3 Expressive Slider specs (TrackInsideCornerSize).
|
|
59
|
-
* Outer ends use `trackSize / 2` (pill cap) — computed inline per component.
|
|
60
|
-
*/
|
|
61
|
-
readonly trackInnerRadius: 2;
|
|
62
|
-
/** Tick dot size (width and height). = 4dp. */
|
|
63
|
-
readonly tickSize: 4;
|
|
64
|
-
/**
|
|
65
|
-
* Minimum touch target for the thumb wrapper.
|
|
66
|
-
* MD3 requires 48dp minimum touch target for interactive elements.
|
|
67
|
-
*/
|
|
68
|
-
readonly thumbTouchTarget: 48;
|
|
69
|
-
/** Offset above the thumb center for the value indicator tooltip. */
|
|
70
|
-
readonly valueIndicatorOffset: 52;
|
|
71
|
-
/** Standard icon size map for inset icons inside the track. */
|
|
72
|
-
readonly insetIconSizes: {
|
|
73
|
-
xs: number;
|
|
74
|
-
s: number;
|
|
75
|
-
m: number;
|
|
76
|
-
l: number;
|
|
77
|
-
xl: number;
|
|
78
|
-
};
|
|
79
|
-
/**
|
|
80
|
-
* Padding between icon and track edge (horizontal).
|
|
81
|
-
* Keeps the icon visually centered within the pill track.
|
|
82
|
-
*/
|
|
83
|
-
readonly insetIconPadding: 4;
|
|
84
|
-
};
|
|
85
|
-
/**
|
|
86
|
-
* CSS custom property references for Slider colors.
|
|
87
|
-
* Maps to --md-sys-color-* tokens in the MD3 theme system.
|
|
88
|
-
*
|
|
89
|
-
* DO NOT hardcode hex/rgba values — these references automatically
|
|
90
|
-
* adapt to light/dark theme.
|
|
91
|
-
*/
|
|
92
|
-
export declare const SliderColors: {
|
|
93
|
-
/** Active track color. Maps to ActiveTrackColor token. */
|
|
94
|
-
readonly activeTrack: "var(--md-sys-color-primary)";
|
|
95
|
-
/** Inactive track color. Maps to InactiveTrackColor token. */
|
|
96
|
-
readonly inactiveTrack: "var(--md-sys-color-secondary-container)";
|
|
97
|
-
/**
|
|
98
|
-
* Disabled track color.
|
|
99
|
-
* Uses opacity + on-surface per MD3 disabled state spec.
|
|
100
|
-
*/
|
|
101
|
-
readonly disabledActiveTrack: "var(--md-sys-color-on-surface)";
|
|
102
|
-
readonly disabledInactiveTrack: "var(--md-sys-color-on-surface)";
|
|
103
|
-
/** Thumb (handle) color. Maps to HandleColor token. */
|
|
104
|
-
readonly thumb: "var(--md-sys-color-primary)";
|
|
105
|
-
/** Disabled thumb color. */
|
|
106
|
-
readonly disabledThumb: "var(--md-sys-color-on-surface)";
|
|
107
|
-
/** Value indicator (tooltip) background. Maps to InverseSurface. */
|
|
108
|
-
readonly valueIndicatorBg: "var(--md-sys-color-inverse-surface)";
|
|
109
|
-
/** Value indicator (tooltip) text. Maps to InverseOnSurface. */
|
|
110
|
-
readonly valueIndicatorText: "var(--md-sys-color-inverse-on-surface)";
|
|
111
|
-
/**
|
|
112
|
-
* Tick on the INACTIVE portion of the track.
|
|
113
|
-
* Maps to TickMarkActiveContainerColor (in spec: primary color stands out).
|
|
114
|
-
*/
|
|
115
|
-
readonly tickOnInactive: "var(--md-sys-color-primary)";
|
|
116
|
-
/**
|
|
117
|
-
* Tick on the ACTIVE portion of the track.
|
|
118
|
-
* Maps to TickMarkInactiveContainerColor (secondary-container blends in).
|
|
119
|
-
*/
|
|
120
|
-
readonly tickOnActive: "var(--md-sys-color-secondary-container)";
|
|
121
|
-
readonly disabledTick: "var(--md-sys-color-on-surface)";
|
|
122
|
-
};
|
|
123
|
-
/**
|
|
124
|
-
* FastSpatial spring for thumb width squeeze animation.
|
|
125
|
-
* Equivalent to MotionSchemeKeyTokens.FastSpatial in Compose.
|
|
126
|
-
*/
|
|
127
|
-
export declare const SLIDER_THUMB_SPRING: {
|
|
128
|
-
readonly type: "spring";
|
|
129
|
-
readonly stiffness: 500;
|
|
130
|
-
readonly damping: 40;
|
|
131
|
-
};
|
|
132
|
-
/**
|
|
133
|
-
* DefaultSpatial spring for thumb position/track updates.
|
|
134
|
-
* Slightly looser feel for position changes.
|
|
135
|
-
*/
|
|
136
|
-
export declare const SLIDER_POSITION_SPRING: {
|
|
137
|
-
readonly type: "spring";
|
|
138
|
-
readonly stiffness: 400;
|
|
139
|
-
readonly damping: 38;
|
|
140
|
-
};
|
|
141
|
-
/** Color crossfade for active/inactive track color transitions. */
|
|
142
|
-
export declare const SLIDER_COLOR_TRANSITION: {
|
|
143
|
-
readonly duration: 0.18;
|
|
144
|
-
readonly ease: "easeInOut";
|
|
145
|
-
};
|
|
146
|
-
/** Value indicator appear/disappear animation. */
|
|
147
|
-
export declare const SLIDER_INDICATOR_TRANSITION: {
|
|
148
|
-
readonly type: "spring";
|
|
149
|
-
readonly stiffness: 450;
|
|
150
|
-
readonly damping: 32;
|
|
151
|
-
};
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file slider.types.ts
|
|
3
|
-
* MD3 Expressive Slider — TypeScript prop definitions.
|
|
4
|
-
* Spec: https://m3.material.io/components/sliders/overview
|
|
5
|
-
* Reference: docs/m3/sliders/Slider.kt
|
|
6
|
-
*/
|
|
7
|
-
import type * as React from "react";
|
|
8
|
-
/** Track size variants mapping to physical px values. */
|
|
9
|
-
export type SliderTrackSize = "xs" | "s" | "m" | "l" | "xl";
|
|
10
|
-
export type SliderVariant = "primary" | "secondary" | "tertiary" | "error";
|
|
11
|
-
export type SliderTrackShape = "md3" | "full" | number;
|
|
12
|
-
/** Slider layout direction. */
|
|
13
|
-
export type SliderOrientation = "horizontal" | "vertical";
|
|
14
|
-
/**
|
|
15
|
-
* Internal context shared between Slider sub-components.
|
|
16
|
-
* @internal
|
|
17
|
-
*/
|
|
18
|
-
export interface SliderContextValue {
|
|
19
|
-
/** Minimum allowed value. */
|
|
20
|
-
min: number;
|
|
21
|
-
/** Maximum allowed value. */
|
|
22
|
-
max: number;
|
|
23
|
-
/**
|
|
24
|
-
* Step size. When > 0, slider is discrete and snaps to multiples of step.
|
|
25
|
-
* When 0, slider is continuous.
|
|
26
|
-
*/
|
|
27
|
-
step: number;
|
|
28
|
-
/** Whether the slider is interactive. */
|
|
29
|
-
disabled: boolean;
|
|
30
|
-
/** Layout orientation. */
|
|
31
|
-
orientation: SliderOrientation;
|
|
32
|
-
/** Physical size of the track. */
|
|
33
|
-
trackSize: SliderTrackSize;
|
|
34
|
-
/** Color variant. */
|
|
35
|
-
variant: SliderVariant;
|
|
36
|
-
/**
|
|
37
|
-
* When true, active track originates from center (50%) instead of the min end.
|
|
38
|
-
* Mirrors Compose's `SliderDefaults.Track(drawCenteredTrack = true)`.
|
|
39
|
-
*/
|
|
40
|
-
isCentered: boolean;
|
|
41
|
-
/** Show the floating value tooltip on hover/drag. */
|
|
42
|
-
showValueIndicator: boolean;
|
|
43
|
-
/** Ref to the track DOM element — used for drag constraint. */
|
|
44
|
-
trackRef: React.RefObject<HTMLDivElement | null>;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Props for the `<Slider>` component.
|
|
48
|
-
*
|
|
49
|
-
* Supports both controlled (`value` + `onValueChange`) and
|
|
50
|
-
* uncontrolled (`defaultValue`) usage patterns per React standards.
|
|
51
|
-
*
|
|
52
|
-
* @example
|
|
53
|
-
* ```tsx
|
|
54
|
-
* // Controlled
|
|
55
|
-
* <Slider value={volume} onValueChange={setVolume} min={0} max={100} />
|
|
56
|
-
*
|
|
57
|
-
* // Uncontrolled
|
|
58
|
-
* <Slider defaultValue={50} />
|
|
59
|
-
*
|
|
60
|
-
* // Discrete (step snapping)
|
|
61
|
-
* <Slider defaultValue={0} step={10} />
|
|
62
|
-
*
|
|
63
|
-
* // Vertical orientation
|
|
64
|
-
* <Slider defaultValue={50} orientation="vertical" />
|
|
65
|
-
*
|
|
66
|
-
* // Centered active track
|
|
67
|
-
* <Slider defaultValue={0} isCentered />
|
|
68
|
-
* ```
|
|
69
|
-
*/
|
|
70
|
-
export interface SliderProps {
|
|
71
|
-
/** Controlled current value. Use with `onValueChange`. */
|
|
72
|
-
value?: number;
|
|
73
|
-
/** Initial value for uncontrolled usage. @default midpoint of min/max */
|
|
74
|
-
defaultValue?: number;
|
|
75
|
-
/** Called whenever the value changes during interaction. */
|
|
76
|
-
onValueChange?: (value: number) => void;
|
|
77
|
-
/** Called when the user finishes dragging / commits a keyboard change. */
|
|
78
|
-
onValueChangeEnd?: (value: number) => void;
|
|
79
|
-
/** Minimum value. @default 0 */
|
|
80
|
-
min?: number;
|
|
81
|
-
/** Maximum value. @default 100 */
|
|
82
|
-
max?: number;
|
|
83
|
-
/**
|
|
84
|
-
* Step size. When > 0, slider snaps to multiples of `step` from `min`
|
|
85
|
-
* and renders tick marks. When 0, slider is continuous.
|
|
86
|
-
* @default 0
|
|
87
|
-
*/
|
|
88
|
-
step?: number;
|
|
89
|
-
/** Layout orientation. @default "horizontal" */
|
|
90
|
-
orientation?: SliderOrientation;
|
|
91
|
-
/**
|
|
92
|
-
* Physical track size.
|
|
93
|
-
* Horizontal: height. Vertical: width.
|
|
94
|
-
* @default "m"
|
|
95
|
-
*/
|
|
96
|
-
trackSize?: SliderTrackSize;
|
|
97
|
-
/**
|
|
98
|
-
* Color variant.
|
|
99
|
-
* @default "primary"
|
|
100
|
-
*/
|
|
101
|
-
variant?: SliderVariant;
|
|
102
|
-
/**
|
|
103
|
-
* When true, the active track segment grows from the center (50%)
|
|
104
|
-
* outward toward the thumb position.
|
|
105
|
-
* @default false
|
|
106
|
-
*/
|
|
107
|
-
isCentered?: boolean;
|
|
108
|
-
/** Disables all interaction. @default false */
|
|
109
|
-
disabled?: boolean;
|
|
110
|
-
/**
|
|
111
|
-
* When true, shows a floating value indicator tooltip above the thumb.
|
|
112
|
-
* @default false
|
|
113
|
-
*/
|
|
114
|
-
showValueIndicator?: boolean;
|
|
115
|
-
/**
|
|
116
|
-
* When true, shows tick marks along the track.
|
|
117
|
-
* Only applicable if `step` > 0.
|
|
118
|
-
* @default false
|
|
119
|
-
*/
|
|
120
|
-
showTicks?: boolean;
|
|
121
|
-
/**
|
|
122
|
-
* Track shape configuration for border radius.
|
|
123
|
-
* - "md3": Default MD3 specific border radius per size
|
|
124
|
-
* - "full": Fully rounded ends (pill shape - size/2)
|
|
125
|
-
* - number: Custom border radius in px
|
|
126
|
-
* @default "md3"
|
|
127
|
-
*/
|
|
128
|
-
trackShape?: SliderTrackShape;
|
|
129
|
-
/**
|
|
130
|
-
* Icon rendered inside the track (inset icon).
|
|
131
|
-
* MD3 spec: only valid for M, L, XL track sizes.
|
|
132
|
-
* The icon moves from the active track to the inactive track
|
|
133
|
-
* when there's not enough space at low values.
|
|
134
|
-
* Do not use with `isCentered` or `RangeSlider`.
|
|
135
|
-
*/
|
|
136
|
-
insetIcon?: React.ReactNode;
|
|
137
|
-
/**
|
|
138
|
-
* Alternate icon shown when value equals `min`.
|
|
139
|
-
* Swaps with `insetIcon` at the minimum value
|
|
140
|
-
* (e.g., a mute icon replacing a volume icon when volume = 0).
|
|
141
|
-
*/
|
|
142
|
-
insetIconAtMin?: React.ReactNode;
|
|
143
|
-
/**
|
|
144
|
-
* Icon rendered inside the track at the trailing end (right side).
|
|
145
|
-
* Only valid for track sizes >= 40dp (e.g. XL).
|
|
146
|
-
*/
|
|
147
|
-
insetIconTrailing?: React.ReactNode;
|
|
148
|
-
/**
|
|
149
|
-
* Alternate icon shown when value equals `max`.
|
|
150
|
-
* Swaps with `insetIconTrailing` at the maximum value.
|
|
151
|
-
*/
|
|
152
|
-
insetIconAtMax?: React.ReactNode;
|
|
153
|
-
/** Additional CSS class applied to the outermost wrapper. */
|
|
154
|
-
className?: string;
|
|
155
|
-
/**
|
|
156
|
-
* Accessible label for the slider when no visible label exists.
|
|
157
|
-
* Required if parent does not have a visible label.
|
|
158
|
-
*/
|
|
159
|
-
"aria-label"?: string;
|
|
160
|
-
/** ID of a visible label element. Required if `aria-label` is not provided. */
|
|
161
|
-
"aria-labelledby"?: string;
|
|
162
|
-
/**
|
|
163
|
-
* Format function for the displayed value in the value indicator tooltip.
|
|
164
|
-
* Defaults to `String(value)`.
|
|
165
|
-
*/
|
|
166
|
-
formatValue?: (value: number) => string;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Props for the `<RangeSlider>` component.
|
|
170
|
-
*
|
|
171
|
-
* Extends `SliderProps` with tuple-based value API.
|
|
172
|
-
* The two thumbs cannot cross each other.
|
|
173
|
-
*
|
|
174
|
-
* @example
|
|
175
|
-
* ```tsx
|
|
176
|
-
* <RangeSlider
|
|
177
|
-
* value={[20, 80]}
|
|
178
|
-
* onValueChange={([start, end]) => setRange([start, end])}
|
|
179
|
-
* />
|
|
180
|
-
* ```
|
|
181
|
-
*/
|
|
182
|
-
export interface RangeSliderProps extends Omit<SliderProps, "value" | "defaultValue" | "onValueChange" | "onValueChangeEnd" | "isCentered"> {
|
|
183
|
-
/** Controlled [start, end] tuple. Use with `onValueChange`. */
|
|
184
|
-
value?: [number, number];
|
|
185
|
-
/** Initial [start, end] tuple for uncontrolled usage. */
|
|
186
|
-
defaultValue?: [number, number];
|
|
187
|
-
/** Called whenever [start, end] changes during interaction. */
|
|
188
|
-
onValueChange?: (value: [number, number]) => void;
|
|
189
|
-
/** Called when the user finishes dragging either thumb. */
|
|
190
|
-
onValueChangeEnd?: (value: [number, number]) => void;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Props for `<SliderTrack>`.
|
|
194
|
-
* @internal
|
|
195
|
-
*/
|
|
196
|
-
export interface SliderTrackProps {
|
|
197
|
-
/** Current thumb position as 0–1 fraction. */
|
|
198
|
-
percent: number;
|
|
199
|
-
trackSize: SliderTrackSize;
|
|
200
|
-
orientation: SliderOrientation;
|
|
201
|
-
variant: SliderVariant;
|
|
202
|
-
isCentered: boolean;
|
|
203
|
-
/** For discrete mode: step size. 0 = no ticks. */
|
|
204
|
-
step: number;
|
|
205
|
-
min: number;
|
|
206
|
-
max: number;
|
|
207
|
-
disabled: boolean;
|
|
208
|
-
trackShape?: SliderTrackShape;
|
|
209
|
-
/** Ref forwarded to the root track element for drag constraint. */
|
|
210
|
-
trackRef: React.RefObject<HTMLDivElement | null>;
|
|
211
|
-
/** onClick handler on the track for click-to-jump. */
|
|
212
|
-
onTrackPointerDown?: (e: React.PointerEvent<HTMLDivElement>) => void;
|
|
213
|
-
/**
|
|
214
|
-
* Icon rendered inside the track (inset icon).
|
|
215
|
-
* @internal — passed down from Slider after guard check.
|
|
216
|
-
*/
|
|
217
|
-
insetIcon?: React.ReactNode;
|
|
218
|
-
/** Alternate icon swapped in when value === min. @internal */
|
|
219
|
-
insetIconAtMin?: React.ReactNode;
|
|
220
|
-
/** Icon rendered at the trailing end (right side). @internal */
|
|
221
|
-
insetIconTrailing?: React.ReactNode;
|
|
222
|
-
/** Alternate icon swapped in when value === max. @internal */
|
|
223
|
-
insetIconAtMax?: React.ReactNode;
|
|
224
|
-
/** Current slider value — used for inset icon swap at min/max. @internal */
|
|
225
|
-
value?: number;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Props for `<SliderThumb>`.
|
|
229
|
-
* @internal
|
|
230
|
-
*/
|
|
231
|
-
export interface SliderThumbProps {
|
|
232
|
-
/** Current value (for ARIA). */
|
|
233
|
-
value: number;
|
|
234
|
-
/** Current 0–1 fraction (for positioning). */
|
|
235
|
-
percent: number;
|
|
236
|
-
min: number;
|
|
237
|
-
max: number;
|
|
238
|
-
step: number;
|
|
239
|
-
disabled: boolean;
|
|
240
|
-
orientation: SliderOrientation;
|
|
241
|
-
showValueIndicator: boolean;
|
|
242
|
-
/** For the drag constraint ref. */
|
|
243
|
-
trackRef: React.RefObject<HTMLDivElement | null>;
|
|
244
|
-
trackSize: SliderTrackSize;
|
|
245
|
-
variant: SliderVariant;
|
|
246
|
-
/** Called during pointer drag with new value. */
|
|
247
|
-
onValueChange: (value: number) => void;
|
|
248
|
-
/** Called on drag end / keyboard commit. */
|
|
249
|
-
onValueChangeEnd?: (value: number) => void;
|
|
250
|
-
/** Value display formatter. */
|
|
251
|
-
formatValue?: (value: number) => string;
|
|
252
|
-
/** Unique ID for ARIA. */
|
|
253
|
-
thumbId?: string;
|
|
254
|
-
/** zIndex for RangeSlider layering. */
|
|
255
|
-
zIndex?: number;
|
|
256
|
-
/** Optional accessible label for this specific thumb. */
|
|
257
|
-
"aria-label"?: string;
|
|
258
|
-
"aria-labelledby"?: string;
|
|
259
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file snackbar/index.ts
|
|
3
|
-
* Barrel re-export for the MD3 Expressive Snackbar component system.
|
|
4
|
-
*/
|
|
5
|
-
export type { SnackbarData, SnackbarDuration, SnackbarHostProps, SnackbarProps, SnackbarResult, SnackbarVisuals, UseSnackbarStateReturn, } from "./snackbar";
|
|
6
|
-
export { Snackbar, SnackbarHost, SnackbarProvider, useSnackbar, useSnackbarState, } from "./snackbar";
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file snackbar.tsx
|
|
3
|
-
*
|
|
4
|
-
* MD3 Expressive Snackbar component.
|
|
5
|
-
*
|
|
6
|
-
* Architecture:
|
|
7
|
-
* - `Snackbar` → Pure display component (motion.div, role="status", aria-live="polite")
|
|
8
|
-
* - `SnackbarHost` → AnimatePresence container + queue flush (place once in layout)
|
|
9
|
-
* - `SnackbarProvider` → Context provider that wires SnackbarHost + exposes `useSnackbar`
|
|
10
|
-
* - `useSnackbarState` → Low-level ref-based queue hook (mutex pattern)
|
|
11
|
-
* - `useSnackbar` → Consumer hook for imperative `showSnackbar(visuals)` calls
|
|
12
|
-
*
|
|
13
|
-
* Queue strategy:
|
|
14
|
-
* - One snackbar visible at a time (MD3 spec).
|
|
15
|
-
* - Subsequent `showSnackbar()` calls are enqueued, shown as soon as current one dismisses.
|
|
16
|
-
* - Cleanup: on unmount, all pending promises resolve as 'dismissed'.
|
|
17
|
-
*
|
|
18
|
-
* @see https://m3.material.io/components/snackbar/overview
|
|
19
|
-
*/
|
|
20
|
-
import * as React from "react";
|
|
21
|
-
/**
|
|
22
|
-
* Duration preset for the snackbar auto-dismiss timer.
|
|
23
|
-
* - `'short'` → 4 000 ms (default, MD3 spec)
|
|
24
|
-
* - `'long'` → 7 000 ms
|
|
25
|
-
* - `number` → custom milliseconds
|
|
26
|
-
*/
|
|
27
|
-
export type SnackbarDuration = "short" | "long" | number;
|
|
28
|
-
/**
|
|
29
|
-
* Resolution value returned by the `showSnackbar()` promise.
|
|
30
|
-
* - `'action-performed'` → user clicked the action button
|
|
31
|
-
* - `'dismissed'` → auto-dismissed or close button clicked
|
|
32
|
-
*/
|
|
33
|
-
export type SnackbarResult = "action-performed" | "dismissed";
|
|
34
|
-
/**
|
|
35
|
-
* Visual configuration for a single snackbar instance.
|
|
36
|
-
*/
|
|
37
|
-
export interface SnackbarVisuals {
|
|
38
|
-
/** Main message text. */
|
|
39
|
-
message: string;
|
|
40
|
-
/** Label for the optional action button. */
|
|
41
|
-
actionLabel?: string;
|
|
42
|
-
/** When `true`, renders a close (X) icon button. @default false */
|
|
43
|
-
withDismissAction?: boolean;
|
|
44
|
-
/**
|
|
45
|
-
* When `true`, renders the action button below the message (Column layout).
|
|
46
|
-
* Use when both message and actionLabel are long.
|
|
47
|
-
* @default false
|
|
48
|
-
*/
|
|
49
|
-
actionOnNewLine?: boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Auto-dismiss duration.
|
|
52
|
-
* @default 'short' (4 000 ms)
|
|
53
|
-
*/
|
|
54
|
-
duration?: SnackbarDuration;
|
|
55
|
-
/** Additional className applied to the snackbar container. */
|
|
56
|
-
className?: string;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Internal runtime data for a currently-displayed snackbar.
|
|
60
|
-
* Includes the resolve callback to settle the caller's promise.
|
|
61
|
-
*/
|
|
62
|
-
export interface SnackbarData {
|
|
63
|
-
/** Unique key for AnimatePresence element diffing. */
|
|
64
|
-
id: string;
|
|
65
|
-
/** Visual configuration. */
|
|
66
|
-
visuals: SnackbarVisuals;
|
|
67
|
-
/** Settles the promise returned by `showSnackbar()`. */
|
|
68
|
-
resolve: (result: SnackbarResult) => void;
|
|
69
|
-
}
|
|
70
|
-
/** Props for the pure `Snackbar` display component. */
|
|
71
|
-
export interface SnackbarProps {
|
|
72
|
-
/** Runtime data including message, actions, and resolve callback. */
|
|
73
|
-
data: SnackbarData;
|
|
74
|
-
/** Additional className merged onto the snackbar container. */
|
|
75
|
-
className?: string;
|
|
76
|
-
}
|
|
77
|
-
/** Props for the `SnackbarHost` component. */
|
|
78
|
-
export interface SnackbarHostProps {
|
|
79
|
-
/** State returned by `useSnackbarState()`. */
|
|
80
|
-
state: UseSnackbarStateReturn;
|
|
81
|
-
/** Additional className applied to the fixed host wrapper. */
|
|
82
|
-
className?: string;
|
|
83
|
-
}
|
|
84
|
-
/** Return type of `useSnackbarState`. */
|
|
85
|
-
export interface UseSnackbarStateReturn {
|
|
86
|
-
/** Currently visible snackbar data, or `null` when idle. */
|
|
87
|
-
current: SnackbarData | null;
|
|
88
|
-
/**
|
|
89
|
-
* Show a snackbar with the given visuals.
|
|
90
|
-
* Returns a promise that resolves when the snackbar is dismissed or the action is triggered.
|
|
91
|
-
*/
|
|
92
|
-
showSnackbar: (visuals: SnackbarVisuals) => Promise<SnackbarResult>;
|
|
93
|
-
/** Internal dismiss handler — called by `SnackbarHost`. */
|
|
94
|
-
_dismiss: (result: SnackbarResult) => void;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Low-level hook that manages the snackbar queue and current state.
|
|
98
|
-
*
|
|
99
|
-
* Uses a `ref`-based queue (mutex pattern) so that enqueueing never
|
|
100
|
-
* triggers a re-render storm — only the state transition does.
|
|
101
|
-
*
|
|
102
|
-
* @example
|
|
103
|
-
* ```tsx
|
|
104
|
-
* // Used internally by SnackbarProvider
|
|
105
|
-
* const state = useSnackbarState();
|
|
106
|
-
* return <SnackbarHost state={state} />;
|
|
107
|
-
* ```
|
|
108
|
-
*/
|
|
109
|
-
export declare function useSnackbarState(): UseSnackbarStateReturn;
|
|
110
|
-
/**
|
|
111
|
-
* MD3 Expressive Snackbar — pure display component.
|
|
112
|
-
*
|
|
113
|
-
* Renders a single snackbar with message, optional action button, and
|
|
114
|
-
* optional dismiss icon button. Handles its own auto-dismiss timer.
|
|
115
|
-
*
|
|
116
|
-
* @remarks
|
|
117
|
-
* - Uses `role="status"` + `aria-live="polite"` for screen reader announcements.
|
|
118
|
-
* - All entrance/exit animation is handled by the parent `SnackbarHost` via
|
|
119
|
-
* `AnimatePresence` + `SNACKBAR_ANIM`.
|
|
120
|
-
* - Do NOT render this component directly — use `SnackbarHost`.
|
|
121
|
-
*
|
|
122
|
-
* @example
|
|
123
|
-
* ```tsx
|
|
124
|
-
* // Internal usage inside SnackbarHost — not for direct use
|
|
125
|
-
* <Snackbar data={currentSnackbarData} />
|
|
126
|
-
* ```
|
|
127
|
-
*/
|
|
128
|
-
export declare const Snackbar: React.NamedExoticComponent<SnackbarProps>;
|
|
129
|
-
/**
|
|
130
|
-
* MD3 SnackbarHost — renders the AnimatePresence container for snackbar queue.
|
|
131
|
-
*
|
|
132
|
-
* Place this once in your app layout. It will show snackbars one at a time,
|
|
133
|
-
* dequeuing the next one as each dismisses.
|
|
134
|
-
*
|
|
135
|
-
* @example
|
|
136
|
-
* ```tsx
|
|
137
|
-
* // Typically used inside SnackbarProvider — not directly
|
|
138
|
-
* const state = useSnackbarState();
|
|
139
|
-
* <SnackbarHost state={state} />
|
|
140
|
-
* ```
|
|
141
|
-
*/
|
|
142
|
-
export declare function SnackbarHost({ state, className }: SnackbarHostProps): import("react/jsx-runtime").JSX.Element;
|
|
143
|
-
export declare namespace SnackbarHost {
|
|
144
|
-
var displayName: string;
|
|
145
|
-
}
|
|
146
|
-
interface SnackbarContextValue {
|
|
147
|
-
showSnackbar: (visuals: SnackbarVisuals) => Promise<SnackbarResult>;
|
|
148
|
-
}
|
|
149
|
-
export declare const SnackbarContext: React.Context<SnackbarContextValue | null>;
|
|
150
|
-
/**
|
|
151
|
-
* MD3 SnackbarProvider — context provider for imperative snackbar API.
|
|
152
|
-
*
|
|
153
|
-
* Wrap your application (or a section of it) with this provider.
|
|
154
|
-
* Then use `useSnackbar()` in any descendant to show snackbars.
|
|
155
|
-
*
|
|
156
|
-
* @example
|
|
157
|
-
* ```tsx
|
|
158
|
-
* // In your root layout:
|
|
159
|
-
* <SnackbarProvider>
|
|
160
|
-
* <App />
|
|
161
|
-
* </SnackbarProvider>
|
|
162
|
-
*
|
|
163
|
-
* // In any component:
|
|
164
|
-
* const { showSnackbar } = useSnackbar();
|
|
165
|
-
* await showSnackbar({ message: 'Saved!', actionLabel: 'Undo' });
|
|
166
|
-
* ```
|
|
167
|
-
*/
|
|
168
|
-
export declare function SnackbarProvider({ children }: {
|
|
169
|
-
children: React.ReactNode;
|
|
170
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
171
|
-
export declare namespace SnackbarProvider {
|
|
172
|
-
var displayName: string;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Hook that returns the `showSnackbar` function from the nearest `SnackbarProvider`.
|
|
176
|
-
*
|
|
177
|
-
* @throws {Error} if used outside of a `SnackbarProvider`.
|
|
178
|
-
*
|
|
179
|
-
* @example
|
|
180
|
-
* ```tsx
|
|
181
|
-
* function SaveButton() {
|
|
182
|
-
* const { showSnackbar } = useSnackbar();
|
|
183
|
-
*
|
|
184
|
-
* const handleSave = async () => {
|
|
185
|
-
* const result = await showSnackbar({
|
|
186
|
-
* message: 'Changes saved',
|
|
187
|
-
* actionLabel: 'Undo',
|
|
188
|
-
* });
|
|
189
|
-
* if (result === 'action-performed') undoSave();
|
|
190
|
-
* };
|
|
191
|
-
*
|
|
192
|
-
* return <button onClick={handleSave}>Save</button>;
|
|
193
|
-
* }
|
|
194
|
-
* ```
|
|
195
|
-
*/
|
|
196
|
-
export declare function useSnackbar(): SnackbarContextValue;
|
|
197
|
-
export {};
|