@bug-on/md3-react 3.0.1 → 3.0.3
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 +42 -42
- package/CHANGELOG.md +10 -0
- package/dist/index.css +107 -0
- package/dist/index.d.mts +1491 -1053
- package/dist/index.d.ts +1491 -1053
- package/dist/index.js +4457 -3156
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4394 -3109
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -6
- package/scripts/copy-assets.js +113 -8
- package/src/index.ts +66 -18
- package/src/test/button.test.tsx +1 -1
- package/src/ui/app-bar/app-bar.tokens.ts +5 -24
- package/src/ui/badge.tsx +2 -1
- package/src/ui/buttons/button/button-tokens.ts +118 -0
- package/src/ui/{button.test.tsx → buttons/button/button.test.tsx} +0 -21
- package/src/ui/buttons/button/button.tsx +381 -0
- package/src/ui/buttons/button/index.ts +3 -0
- package/src/ui/buttons/button/types.ts +90 -0
- package/src/ui/buttons/button-group/button-group-defaults.ts +95 -0
- package/src/ui/buttons/button-group/button-group-tokens.ts +20 -0
- package/src/ui/{button-group.test.tsx → buttons/button-group/button-group.test.tsx} +9 -10
- package/src/ui/buttons/button-group/button-group.tsx +699 -0
- package/src/ui/buttons/button-group/index.ts +8 -0
- package/src/ui/buttons/button-group/types.ts +77 -0
- package/src/ui/{fab.tsx → buttons/fabs/fab/fab.tsx} +6 -6
- package/src/ui/buttons/fabs/fab/index.ts +1 -0
- package/src/ui/{fab-menu.tsx → buttons/fabs/fab-menu/fab-menu.tsx} +7 -4
- package/src/ui/buttons/fabs/fab-menu/index.ts +1 -0
- package/src/ui/buttons/fabs/index.ts +2 -0
- package/src/ui/{icon-button.tsx → buttons/icon-button/icon-button.tsx} +6 -6
- package/src/ui/buttons/icon-button/index.ts +1 -0
- package/src/ui/buttons/index.ts +4 -0
- package/src/ui/code-block.tsx +1 -1
- package/src/ui/dialog.tsx +4 -7
- package/src/ui/drawer.tsx +4 -7
- package/src/ui/menu/menu-animations.ts +14 -20
- package/src/ui/menu/menu-tokens.ts +7 -5
- package/src/ui/menu/menu.test.tsx +9 -4
- package/src/ui/navigation-bar.test.tsx +111 -0
- package/src/ui/navigation-bar.tsx +464 -0
- package/src/ui/navigation-rail.test.tsx +5 -4
- package/src/ui/navigation-rail.tsx +32 -23
- package/src/ui/scroll-area.tsx +4 -0
- package/src/ui/search/search-view-fullscreen.tsx +1 -1
- package/src/ui/search/search.tokens.ts +9 -43
- package/src/ui/search/trailing-action.tsx +1 -1
- package/src/ui/shared/constants.ts +25 -27
- package/src/ui/shared/motion-tokens.ts +238 -0
- package/src/ui/snackbar/snackbar.tsx +4 -6
- package/src/ui/switch/switch.tsx +12 -18
- package/src/ui/text-field/text-field.tokens.ts +12 -12
- package/src/ui/text-field/text-field.tsx +31 -19
- package/src/ui/theme-provider/index.tsx +1 -5
- package/src/ui/toc.tsx +1 -1
- package/src/ui/toolbar/__snapshots__/bottom-docked-toolbar.test.tsx.snap +51 -0
- package/src/ui/toolbar/__snapshots__/floating-toolbar-with-fab.test.tsx.snap +113 -0
- package/src/ui/toolbar/__snapshots__/floating-toolbar.test.tsx.snap +169 -0
- package/src/ui/toolbar/bottom-docked-toolbar.test.tsx +114 -0
- package/src/ui/toolbar/docked-toolbar.tsx +186 -0
- package/src/ui/toolbar/floating-toolbar-with-fab.test.tsx +139 -0
- package/src/ui/toolbar/floating-toolbar-with-fab.tsx +199 -0
- package/src/ui/toolbar/floating-toolbar.test.tsx +230 -0
- package/src/ui/toolbar/floating-toolbar.tsx +344 -0
- package/src/ui/toolbar/index.ts +35 -0
- package/src/ui/toolbar/toolbar-colors.ts +37 -0
- package/src/ui/toolbar/toolbar-context.tsx +13 -0
- package/src/ui/toolbar/toolbar-divider.test.tsx +54 -0
- package/src/ui/toolbar/toolbar-divider.tsx +73 -0
- package/src/ui/toolbar/toolbar-icon-button.test.tsx +68 -0
- package/src/ui/toolbar/toolbar-icon-button.tsx +136 -0
- package/src/ui/toolbar/toolbar-scroll-behavior.ts +140 -0
- package/src/ui/toolbar/toolbar-tokens.ts +51 -0
- package/test-clip.html +31 -0
- package/test-shadow.html +5 -1
- package/test-width.html +34 -0
- package/src/ui/button-group.tsx +0 -350
- package/src/ui/button.tsx +0 -665
- package/test-render.tsx +0 -4
- package/test_output.txt +0 -164
- package/test_output_v2.txt +0 -5
- /package/src/ui/{fab.test.tsx → buttons/fabs/fab/fab.test.tsx} +0 -0
- /package/src/ui/{fab-menu.test.tsx → buttons/fabs/fab-menu/fab-menu.test.tsx} +0 -0
- /package/src/ui/{icon-button.test.tsx → buttons/icon-button/icon-button.test.tsx} +0 -0
- /package/src/ui/{Text.tsx → text.tsx} +0 -0
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
-
import { ElementType, ComponentPropsWithoutRef, ReactNode, ComponentPropsWithRef } from 'react';
|
|
2
|
+
import { ElementType, ComponentPropsWithoutRef, ReactNode, ComponentPropsWithRef, RefObject } from 'react';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import { ClassValue } from 'clsx';
|
|
5
|
-
import
|
|
5
|
+
import * as motion from 'motion';
|
|
6
|
+
import { HTMLMotionProps, Transition, Variants } from 'motion/react';
|
|
6
7
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
7
8
|
import { VariantProps } from 'class-variance-authority';
|
|
8
9
|
import * as RadixDialog from '@radix-ui/react-dialog';
|
|
@@ -330,30 +331,9 @@ declare const APP_BAR_COLOR_TRANSITION: {
|
|
|
330
331
|
* Spring animation for enterAlways behavior (hide/show on scroll direction).
|
|
331
332
|
* Equivalent to MD3 FastSpatial motion scheme.
|
|
332
333
|
*/
|
|
333
|
-
declare const APP_BAR_ENTER_ALWAYS_SPRING:
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
readonly damping: 40;
|
|
337
|
-
readonly mass: 1;
|
|
338
|
-
};
|
|
339
|
-
/**
|
|
340
|
-
* Spring animation for Bottom App Bar hide/show.
|
|
341
|
-
* Slightly looser feel for bottom navigation.
|
|
342
|
-
*/
|
|
343
|
-
declare const APP_BAR_BOTTOM_SPRING: {
|
|
344
|
-
readonly type: "spring";
|
|
345
|
-
readonly stiffness: 300;
|
|
346
|
-
readonly damping: 30;
|
|
347
|
-
};
|
|
348
|
-
/**
|
|
349
|
-
* SearchView appearance/disappearance transition.
|
|
350
|
-
* Uses spring for natural feel of expanding overlay.
|
|
351
|
-
*/
|
|
352
|
-
declare const SEARCH_VIEW_SPRING: {
|
|
353
|
-
readonly type: "spring";
|
|
354
|
-
readonly stiffness: 400;
|
|
355
|
-
readonly damping: 35;
|
|
356
|
-
};
|
|
334
|
+
declare const APP_BAR_ENTER_ALWAYS_SPRING: motion.Transition;
|
|
335
|
+
declare const APP_BAR_BOTTOM_SPRING: motion.Transition;
|
|
336
|
+
declare const SEARCH_VIEW_SPRING: motion.Transition;
|
|
357
337
|
/**
|
|
358
338
|
* Title crossfade transition for flexible App Bars.
|
|
359
339
|
* Short duration keeps the collapse feeling snappy.
|
|
@@ -1098,109 +1078,74 @@ declare const Badge: React$1.NamedExoticComponent<BadgeProps & React$1.RefAttrib
|
|
|
1098
1078
|
*/
|
|
1099
1079
|
declare function BadgedBox({ badge, children, className, badgeSize, }: BadgedBoxProps): react_jsx_runtime.JSX.Element;
|
|
1100
1080
|
|
|
1101
|
-
/**
|
|
1102
|
-
* @file button.tsx
|
|
1103
|
-
*
|
|
1104
|
-
* MD3 Expressive Button component.
|
|
1105
|
-
*
|
|
1106
|
-
* Spec: https://m3.material.io/components/buttons/overview
|
|
1107
|
-
* Sizing (May 2025):
|
|
1108
|
-
* XS → h:32dp | px: 12dp | icon: 18dp | gap: 8dp
|
|
1109
|
-
* SM → h:40dp | px: 16dp | icon: 20dp | gap: 8dp
|
|
1110
|
-
* MD → h:56dp | px: 24dp | icon: 24dp | gap: 8dp
|
|
1111
|
-
* LG → h:96dp | px: 48dp | icon: 32dp | gap: 12dp
|
|
1112
|
-
* XL → h:136dp | px: 48dp | icon: 40dp | gap: 12dp
|
|
1113
|
-
*/
|
|
1114
|
-
|
|
1115
1081
|
type MotionButtonProps$2 = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
1116
|
-
/**
|
|
1117
|
-
* Base props shared between the standard and toggle button variants.
|
|
1118
|
-
*
|
|
1119
|
-
* @see {@link ButtonProps} for the complete discriminated union type.
|
|
1120
|
-
* @see https://m3.material.io/components/buttons/overview
|
|
1121
|
-
*/
|
|
1122
1082
|
interface BaseButtonProps extends MotionButtonProps$2 {
|
|
1123
1083
|
/**
|
|
1124
|
-
*
|
|
1084
|
+
* The visual style of the button.
|
|
1085
|
+
* Maps to MD3 emphasis levels.
|
|
1125
1086
|
* @default "filled"
|
|
1126
1087
|
*/
|
|
1127
|
-
colorStyle?:
|
|
1088
|
+
colorStyle?: MD3ColorStyle;
|
|
1128
1089
|
/**
|
|
1129
|
-
*
|
|
1130
|
-
*
|
|
1131
|
-
*
|
|
1090
|
+
* @deprecated `selectedColorStyle` is no longer used. Color styles are now automatically
|
|
1091
|
+
* resolved based on the `colorStyle` and `selected` state per MD3 specs.
|
|
1092
|
+
* If provided, it will be ignored.
|
|
1132
1093
|
*/
|
|
1133
|
-
selectedColorStyle?:
|
|
1094
|
+
selectedColorStyle?: MD3ColorStyle;
|
|
1134
1095
|
/**
|
|
1135
|
-
*
|
|
1096
|
+
* The size variant of the button.
|
|
1136
1097
|
* @default "sm"
|
|
1137
1098
|
*/
|
|
1138
|
-
size?:
|
|
1099
|
+
size?: MD3Size;
|
|
1139
1100
|
/**
|
|
1140
|
-
*
|
|
1141
|
-
*
|
|
1142
|
-
* - `square`: rounded-square, morphs to pill when toggled.
|
|
1101
|
+
* Shape of the button container.
|
|
1102
|
+
* MD3 Expressive morphs the shape slightly on press based on the chosen shape variant.
|
|
1143
1103
|
* @default "round"
|
|
1144
1104
|
*/
|
|
1145
|
-
shape?:
|
|
1105
|
+
shape?: MD3Shape;
|
|
1146
1106
|
/**
|
|
1147
|
-
*
|
|
1148
|
-
*
|
|
1107
|
+
* Override the default border width for outlined buttons.
|
|
1108
|
+
* By default, this is derived from the size token (e.g., 1dp for sm, 3dp for xl).
|
|
1149
1109
|
*/
|
|
1150
|
-
|
|
1110
|
+
outlineWidth?: number;
|
|
1111
|
+
/**
|
|
1112
|
+
* An optional icon to display alongside the label.
|
|
1113
|
+
*/
|
|
1114
|
+
icon?: React.ReactNode;
|
|
1151
1115
|
/**
|
|
1152
|
-
* Position of the icon relative to the label
|
|
1116
|
+
* Position of the icon relative to the label.
|
|
1153
1117
|
* @default "leading"
|
|
1154
1118
|
*/
|
|
1155
1119
|
iconPosition?: "leading" | "trailing";
|
|
1156
1120
|
/**
|
|
1157
|
-
*
|
|
1158
|
-
* and
|
|
1121
|
+
* The loading state of the button. Replaces the icon (or is prepended) with a spinner.
|
|
1122
|
+
* Disables the button visually and functionally.
|
|
1159
1123
|
* @default false
|
|
1160
1124
|
*/
|
|
1161
1125
|
loading?: boolean;
|
|
1162
1126
|
/**
|
|
1163
|
-
*
|
|
1164
|
-
* - `loading-indicator`: MD3 Expressive morphing shape (default).
|
|
1165
|
-
* - `circular`: Classic circular spinner.
|
|
1127
|
+
* The visual variant of the loading spinner.
|
|
1166
1128
|
* @default "loading-indicator"
|
|
1167
1129
|
*/
|
|
1168
1130
|
loadingVariant?: "loading-indicator" | "circular";
|
|
1169
1131
|
/**
|
|
1170
|
-
*
|
|
1171
|
-
*
|
|
1172
|
-
* Useful for rendering a Next.js `<Link>` with Button styles.
|
|
1173
|
-
*
|
|
1174
|
-
* @example
|
|
1175
|
-
* ```tsx
|
|
1176
|
-
* <Button asChild size="lg">
|
|
1177
|
-
* <Link href="/components">Explore Components</Link>
|
|
1178
|
-
* </Button>
|
|
1179
|
-
* ```
|
|
1132
|
+
* Replaces the wrapping `<button>` with the child element, passing all props and styles to it.
|
|
1133
|
+
* Useful for rendering as an `<a>` tag or a React Router `<Link>`.
|
|
1180
1134
|
* @default false
|
|
1181
1135
|
*/
|
|
1182
1136
|
asChild?: boolean;
|
|
1183
|
-
/**
|
|
1184
|
-
|
|
1137
|
+
/**
|
|
1138
|
+
* Explicitly sets the trailing icon layout mode.
|
|
1139
|
+
* Mostly used internally by ButtonGroup to align dropdown carets.
|
|
1140
|
+
* @internal
|
|
1141
|
+
*/
|
|
1142
|
+
hasTrailingIcon?: boolean;
|
|
1143
|
+
/**
|
|
1144
|
+
* A specific string key identifying the button in a ButtonGroup context.
|
|
1145
|
+
*/
|
|
1146
|
+
value?: string;
|
|
1147
|
+
children: React.ReactNode;
|
|
1185
1148
|
}
|
|
1186
|
-
/**
|
|
1187
|
-
* Complete `Button` props — discriminated union that enforces
|
|
1188
|
-
* `selected` is only valid for `variant="toggle"`.
|
|
1189
|
-
*
|
|
1190
|
-
* @example
|
|
1191
|
-
* ```tsx
|
|
1192
|
-
* // Standard button
|
|
1193
|
-
* <Button colorStyle="filled" size="md">Confirm</Button>
|
|
1194
|
-
*
|
|
1195
|
-
* // Toggle button (selected state required)
|
|
1196
|
-
* <Button variant="toggle" selected={isActive} onClick={toggle}>Filter</Button>
|
|
1197
|
-
*
|
|
1198
|
-
* // With leading icon and loading state
|
|
1199
|
-
* <Button icon={<CheckIcon />} loading={isSubmitting}>Save</Button>
|
|
1200
|
-
* ```
|
|
1201
|
-
*
|
|
1202
|
-
* @see https://m3.material.io/components/buttons/overview
|
|
1203
|
-
*/
|
|
1204
1149
|
type ButtonProps = BaseButtonProps & ({
|
|
1205
1150
|
variant?: "default";
|
|
1206
1151
|
selected?: never;
|
|
@@ -1208,35 +1153,7 @@ type ButtonProps = BaseButtonProps & ({
|
|
|
1208
1153
|
variant: "toggle";
|
|
1209
1154
|
selected: boolean;
|
|
1210
1155
|
});
|
|
1211
|
-
|
|
1212
|
-
* MD3 Expressive Button component.
|
|
1213
|
-
*
|
|
1214
|
-
* Supports all five MD3 color styles, five sizes, shape morphing on toggle,
|
|
1215
|
-
* leading/trailing icons, and an animated loading state.
|
|
1216
|
-
*
|
|
1217
|
-
* @remarks
|
|
1218
|
-
* - `variant="toggle"` requires `selected: boolean` — enforced by the type system.
|
|
1219
|
-
* - When `loading={true}`, the button is visually dimmed, pointer events are
|
|
1220
|
-
* blocked, and `aria-busy` is set for screen readers.
|
|
1221
|
-
* - Shape morphs smoothly between pill ↔ rounded-square when toggle state changes,
|
|
1222
|
-
* using a critically-damped spring (no overshoot artefacts).
|
|
1223
|
-
*
|
|
1224
|
-
* @example
|
|
1225
|
-
* ```tsx
|
|
1226
|
-
* // Standard filled button
|
|
1227
|
-
* <Button colorStyle="filled" size="md">Confirm</Button>
|
|
1228
|
-
*
|
|
1229
|
-
* // Button with icon
|
|
1230
|
-
* <Button icon={<CheckIcon />} loading={isSubmitting}>Save</Button>
|
|
1231
|
-
*
|
|
1232
|
-
* // Toggle button
|
|
1233
|
-
* <Button variant="toggle" selected={isActive} onClick={toggle}>
|
|
1234
|
-
* Filter
|
|
1235
|
-
* </Button>
|
|
1236
|
-
* ```
|
|
1237
|
-
*
|
|
1238
|
-
* @see https://m3.material.io/components/buttons/overview
|
|
1239
|
-
*/
|
|
1156
|
+
|
|
1240
1157
|
declare const Button: React$1.NamedExoticComponent<(Omit<BaseButtonProps & {
|
|
1241
1158
|
variant?: "default";
|
|
1242
1159
|
selected?: never;
|
|
@@ -1245,6 +1162,93 @@ declare const Button: React$1.NamedExoticComponent<(Omit<BaseButtonProps & {
|
|
|
1245
1162
|
selected: boolean;
|
|
1246
1163
|
}, "ref">) & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1247
1164
|
|
|
1165
|
+
declare const BUTTON_SIZE_TOKENS: {
|
|
1166
|
+
readonly xs: {
|
|
1167
|
+
readonly height: "2rem";
|
|
1168
|
+
readonly leadingSpace: "1rem";
|
|
1169
|
+
readonly trailingSpace: "1rem";
|
|
1170
|
+
readonly iconSize: "1.25rem";
|
|
1171
|
+
readonly iconLabelSpace: "0.5rem";
|
|
1172
|
+
readonly outlineWidth: 1;
|
|
1173
|
+
readonly squareShapeRadius: 12;
|
|
1174
|
+
readonly pressedShapeRadius: 8;
|
|
1175
|
+
readonly roundShapeRadius: 16;
|
|
1176
|
+
};
|
|
1177
|
+
readonly sm: {
|
|
1178
|
+
readonly height: "2.5rem";
|
|
1179
|
+
readonly leadingSpace: "1rem";
|
|
1180
|
+
readonly trailingSpace: "1rem";
|
|
1181
|
+
readonly iconSize: "1.25rem";
|
|
1182
|
+
readonly iconLabelSpace: "0.5rem";
|
|
1183
|
+
readonly outlineWidth: 1;
|
|
1184
|
+
readonly squareShapeRadius: 12;
|
|
1185
|
+
readonly pressedShapeRadius: 8;
|
|
1186
|
+
readonly roundShapeRadius: 20;
|
|
1187
|
+
};
|
|
1188
|
+
readonly md: {
|
|
1189
|
+
readonly height: "3.5rem";
|
|
1190
|
+
readonly leadingSpace: "1.5rem";
|
|
1191
|
+
readonly trailingSpace: "1.5rem";
|
|
1192
|
+
readonly iconSize: "1.5rem";
|
|
1193
|
+
readonly iconLabelSpace: "0.5rem";
|
|
1194
|
+
readonly outlineWidth: 1;
|
|
1195
|
+
readonly squareShapeRadius: 16;
|
|
1196
|
+
readonly pressedShapeRadius: 12;
|
|
1197
|
+
readonly roundShapeRadius: 28;
|
|
1198
|
+
};
|
|
1199
|
+
readonly lg: {
|
|
1200
|
+
readonly height: "6rem";
|
|
1201
|
+
readonly leadingSpace: "3rem";
|
|
1202
|
+
readonly trailingSpace: "3rem";
|
|
1203
|
+
readonly iconSize: "2rem";
|
|
1204
|
+
readonly iconLabelSpace: "0.75rem";
|
|
1205
|
+
readonly outlineWidth: 2;
|
|
1206
|
+
readonly squareShapeRadius: 28;
|
|
1207
|
+
readonly pressedShapeRadius: 16;
|
|
1208
|
+
readonly roundShapeRadius: 48;
|
|
1209
|
+
};
|
|
1210
|
+
readonly xl: {
|
|
1211
|
+
readonly height: "8.5rem";
|
|
1212
|
+
readonly leadingSpace: "4rem";
|
|
1213
|
+
readonly trailingSpace: "4rem";
|
|
1214
|
+
readonly iconSize: "2.5rem";
|
|
1215
|
+
readonly iconLabelSpace: "1rem";
|
|
1216
|
+
readonly outlineWidth: 3;
|
|
1217
|
+
readonly squareShapeRadius: 28;
|
|
1218
|
+
readonly pressedShapeRadius: 16;
|
|
1219
|
+
readonly roundShapeRadius: 68;
|
|
1220
|
+
};
|
|
1221
|
+
};
|
|
1222
|
+
declare const BUTTON_COLOR_TOKENS: {
|
|
1223
|
+
readonly elevated: {
|
|
1224
|
+
readonly default: "bg-m3-surface-container-low text-m3-primary shadow-md";
|
|
1225
|
+
readonly selected: "bg-m3-primary text-m3-on-primary shadow-md";
|
|
1226
|
+
readonly unselected: "bg-m3-surface-container-low text-m3-primary shadow-md";
|
|
1227
|
+
};
|
|
1228
|
+
readonly filled: {
|
|
1229
|
+
readonly default: "bg-m3-primary text-m3-on-primary";
|
|
1230
|
+
readonly selected: "bg-m3-primary text-m3-on-primary";
|
|
1231
|
+
readonly unselected: "bg-m3-surface-container text-m3-on-surface-variant";
|
|
1232
|
+
};
|
|
1233
|
+
readonly tonal: {
|
|
1234
|
+
readonly default: "bg-m3-secondary-container text-m3-on-secondary-container";
|
|
1235
|
+
readonly selected: "bg-m3-secondary text-m3-on-secondary";
|
|
1236
|
+
readonly unselected: "bg-m3-secondary-container text-m3-on-secondary-container";
|
|
1237
|
+
};
|
|
1238
|
+
readonly outlined: {
|
|
1239
|
+
readonly default: "bg-transparent text-m3-on-surface-variant border-m3-outline-variant";
|
|
1240
|
+
readonly selected: "bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent";
|
|
1241
|
+
readonly unselected: "bg-transparent text-m3-on-surface-variant border-m3-outline-variant";
|
|
1242
|
+
};
|
|
1243
|
+
readonly text: {
|
|
1244
|
+
readonly default: "bg-transparent text-m3-primary";
|
|
1245
|
+
readonly selected: "bg-transparent text-m3-primary";
|
|
1246
|
+
readonly unselected: "bg-transparent text-m3-primary";
|
|
1247
|
+
};
|
|
1248
|
+
};
|
|
1249
|
+
|
|
1250
|
+
type ButtonGroupVariant = "standard" | "connected" | "navbar";
|
|
1251
|
+
type ButtonGroupOrientation = "horizontal" | "vertical";
|
|
1248
1252
|
/**
|
|
1249
1253
|
* Thuộc tính truyền vào cho thành phần nhóm nút (Button Group).
|
|
1250
1254
|
*/
|
|
@@ -1253,14 +1257,15 @@ interface ButtonGroupProps extends React$1.FieldsetHTMLAttributes<HTMLFieldSetEl
|
|
|
1253
1257
|
* Cấu trúc hiển thị của nhóm nút:
|
|
1254
1258
|
* - `standard`: Các nút cách xa và có khoảng cách độc lập với nhau (gap).
|
|
1255
1259
|
* - `connected`: Các nút nối liền khung viền với nhau để tạo thành dạng Segmented Button.
|
|
1260
|
+
* - `navbar`: Nút hiển thị dưới dạng thanh điều hướng với active pill chuyển động (Sliding Indicator).
|
|
1256
1261
|
* @default "standard"
|
|
1257
1262
|
*/
|
|
1258
|
-
variant?:
|
|
1263
|
+
variant?: ButtonGroupVariant;
|
|
1259
1264
|
/**
|
|
1260
1265
|
* Hướng sắp xếp của các nút trong nhóm.
|
|
1261
1266
|
* @default "horizontal"
|
|
1262
1267
|
*/
|
|
1263
|
-
orientation?:
|
|
1268
|
+
orientation?: ButtonGroupOrientation;
|
|
1264
1269
|
/**
|
|
1265
1270
|
* Đặt thành `true` nếu bạn muốn nhóm hiển thị dạng `standard` giãn đều lấp đầy toàn bộ khu vực chứa (container).
|
|
1266
1271
|
* @default false
|
|
@@ -1269,890 +1274,1033 @@ interface ButtonGroupProps extends React$1.FieldsetHTMLAttributes<HTMLFieldSetEl
|
|
|
1269
1274
|
/**
|
|
1270
1275
|
* Áp dụng thống nhất chung một kích thước (`size`) cho tất cả các con trong nhóm (ghi đè kích thước lẻ từng nút).
|
|
1271
1276
|
*/
|
|
1272
|
-
size?:
|
|
1277
|
+
size?: MD3Size;
|
|
1273
1278
|
/**
|
|
1274
1279
|
* Bật/tắt hiệu ứng thu phóng độ rộng / khoảng đệm (Morphing Width) khi nhấn vào các nút (áp dụng cho nhóm `standard`).
|
|
1275
1280
|
* @default true
|
|
1276
1281
|
*/
|
|
1277
1282
|
morphingWidth?: boolean;
|
|
1283
|
+
/**
|
|
1284
|
+
* Tỷ lệ mở rộng chiều rộng của nút khi được nhấn (áp dụng cho nhóm `standard` ngang).
|
|
1285
|
+
* Theo MD3 Spec, mặc định là 0.15 (15%).
|
|
1286
|
+
* @default 0.15
|
|
1287
|
+
*/
|
|
1288
|
+
expandedRatio?: number;
|
|
1278
1289
|
/**
|
|
1279
1290
|
* Tự động hiển thị biểu tượng (icon) Check khi một nút trạng thái nằm trong nhóm được chỉ định là `selected={true}`.
|
|
1280
1291
|
* @default false
|
|
1281
1292
|
*/
|
|
1282
1293
|
showCheck?: boolean;
|
|
1283
|
-
}
|
|
1284
|
-
/**
|
|
1285
|
-
* Component Nhóm Nút (Button Group) được sử dụng để gom nhóm nhiều nút có công năng tương tự lại với nhau.
|
|
1286
|
-
* Hỗ trợ tạo các bộ nút độc lập (Standard) hoặc khối liên kết liền mạch (Connected/Segmented Buttons).
|
|
1287
|
-
* Kế thừa cơ chế chuyển động kết hợp liền mạch của MD3 Expressive.
|
|
1288
|
-
*
|
|
1289
|
-
* @example
|
|
1290
|
-
* ```tsx
|
|
1291
|
-
* // Nhóm nút tiêu chuẩn rời rạc (Standard)
|
|
1292
|
-
* <ButtonGroup variant="standard">
|
|
1293
|
-
* <Button>Lựa chọn 1</Button>
|
|
1294
|
-
* <Button>Lựa chọn 2</Button>
|
|
1295
|
-
* </ButtonGroup>
|
|
1296
|
-
*
|
|
1297
|
-
* // Nhóm nút liền khối (Connected Segmented Button)
|
|
1298
|
-
* <ButtonGroup variant="connected" showCheck fullWidth>
|
|
1299
|
-
* <Button variant="toggle" selected={view === "day"} onClick={() => setView("day")}>Ngày</Button>
|
|
1300
|
-
* <Button variant="toggle" selected={view === "week"} onClick={() => setView("week")}>Tuần</Button>
|
|
1301
|
-
* <Button variant="toggle" selected={view === "month"} onClick={() => setView("month")}>Tháng</Button>
|
|
1302
|
-
* </ButtonGroup>
|
|
1303
|
-
* ```
|
|
1304
|
-
*/
|
|
1305
|
-
declare const ButtonGroup: React$1.NamedExoticComponent<ButtonGroupProps & React$1.RefAttributes<HTMLFieldSetElement>>;
|
|
1306
|
-
|
|
1307
|
-
declare const cardVariants: (props?: ({
|
|
1308
|
-
variant?: "outlined" | "elevated" | "filled" | null | undefined;
|
|
1309
|
-
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
1310
|
-
type MotionDivProps = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
1311
|
-
interface CardProps extends MotionDivProps, VariantProps<typeof cardVariants> {
|
|
1312
|
-
/** Vô hiệu hóa tương tác và giảm opacity (MD3 disabled state). */
|
|
1313
|
-
disabled?: boolean;
|
|
1314
1294
|
/**
|
|
1315
|
-
*
|
|
1316
|
-
*
|
|
1295
|
+
* Điều khiển hành vi hiển thị Icon (áp dụng chính cho `navbar`).
|
|
1296
|
+
* - `selected`: Chỉ hiển thị icon trên mục được chọn.
|
|
1297
|
+
* - `all`: Hiển thị trên tất cả.
|
|
1298
|
+
* - `none`: Ẩn toàn bộ icon.
|
|
1317
1299
|
*/
|
|
1318
|
-
|
|
1300
|
+
iconBehavior?: "selected" | "all" | "none";
|
|
1319
1301
|
/**
|
|
1320
|
-
*
|
|
1321
|
-
*
|
|
1302
|
+
* Điều khiển hành vi hiển thị Label (áp dụng chính cho `navbar`).
|
|
1303
|
+
* - `selected`: Chỉ hiển thị label trên mục được chọn.
|
|
1304
|
+
* - `all`: Hiển thị trên tất cả.
|
|
1305
|
+
* - `none`: Ẩn toàn bộ label.
|
|
1322
1306
|
*/
|
|
1323
|
-
|
|
1324
|
-
/**
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1307
|
+
labelBehavior?: "selected" | "all" | "none";
|
|
1308
|
+
/**
|
|
1309
|
+
* Tùy chọn: Bật chế độ Active Morphing (dựa trên Selection).
|
|
1310
|
+
* Khi `true`, các nút sẽ tự động co dãn (tăng/giảm width) dựa trên việc nút nào đang được chọn,
|
|
1311
|
+
* tạo hiệu ứng thay đổi kích thước mượt mà theo trạng thái.
|
|
1312
|
+
* Khi `false` hoặc `undefined`, Group sẽ hoạt động dựa trên `isPressed` (nhấn chuột) như mặc định.
|
|
1313
|
+
*/
|
|
1314
|
+
activeMorphing?: boolean;
|
|
1315
|
+
/**
|
|
1316
|
+
* Class CSS tùy chỉnh áp dụng cho từng button con trong nhóm.
|
|
1317
|
+
* Hữu ích để thay đổi padding, min-width hoặc các thuộc tính khác một cách linh hoạt.
|
|
1318
|
+
* Đối với variant `navbar`, class này sẽ được ưu tiên hơn so với các padding mặc định.
|
|
1319
|
+
*/
|
|
1320
|
+
itemClassName?: string;
|
|
1329
1321
|
}
|
|
1330
|
-
declare const Card: React$1.NamedExoticComponent<Omit<CardProps, "ref"> & React$1.RefAttributes<HTMLElement>>;
|
|
1331
1322
|
|
|
1332
|
-
|
|
1333
|
-
* @file checkbox.tsx
|
|
1334
|
-
* MD3 Expressive Checkbox — 2-state and tri-state support.
|
|
1335
|
-
* Spec: https://m3.material.io/components/checkbox/overview
|
|
1336
|
-
*/
|
|
1323
|
+
declare const ButtonGroup: React$1.NamedExoticComponent<ButtonGroupProps & React$1.RefAttributes<HTMLFieldSetElement>>;
|
|
1337
1324
|
|
|
1325
|
+
type MotionButtonProps$1 = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
1338
1326
|
/**
|
|
1339
|
-
*
|
|
1340
|
-
*/
|
|
1341
|
-
type CheckboxState = "unchecked" | "checked" | "indeterminate";
|
|
1342
|
-
/**
|
|
1343
|
-
* Props for `Checkbox`. Supports boolean (`checked`/`onCheckedChange`)
|
|
1344
|
-
* and tri-state (`state`/`onStateChange`) modes.
|
|
1345
|
-
*/
|
|
1346
|
-
interface CheckboxProps {
|
|
1347
|
-
/** Controlled checked value (2-state mode). */
|
|
1348
|
-
checked?: boolean;
|
|
1349
|
-
/** Initial value for uncontrolled mode. @default false */
|
|
1350
|
-
defaultChecked?: boolean;
|
|
1351
|
-
/** Forces indeterminate rendering regardless of `checked`. */
|
|
1352
|
-
indeterminate?: boolean;
|
|
1353
|
-
/** Fired on checked change (simple mode). Not called when disabled. */
|
|
1354
|
-
onCheckedChange?: (checked: boolean) => void;
|
|
1355
|
-
/** Controlled tri-state value. Takes priority over `checked`/`indeterminate`. */
|
|
1356
|
-
state?: CheckboxState;
|
|
1357
|
-
/** Fired on tri-state change. Cycles: unchecked → checked → indeterminate. */
|
|
1358
|
-
onStateChange?: (state: CheckboxState) => void;
|
|
1359
|
-
/** Disables interaction and applies 0.38 opacity. */
|
|
1360
|
-
disabled?: boolean;
|
|
1361
|
-
/** Error state — changes colors to `m3-error` and sets `aria-invalid`. */
|
|
1362
|
-
error?: boolean;
|
|
1363
|
-
/** Adjacent label text. Wraps checkbox + span in `<label>`. */
|
|
1364
|
-
label?: string;
|
|
1365
|
-
"aria-label"?: string;
|
|
1366
|
-
"aria-labelledby"?: string;
|
|
1367
|
-
"aria-describedby"?: string;
|
|
1368
|
-
"aria-required"?: boolean;
|
|
1369
|
-
/** Passed to the hidden `<input>` for form submission. */
|
|
1370
|
-
name?: string;
|
|
1371
|
-
/** Passed to the hidden `<input>` for form submission. */
|
|
1372
|
-
value?: string;
|
|
1373
|
-
/** ID for the hidden `<input>`. Auto-generated when `label` is set. */
|
|
1374
|
-
id?: string;
|
|
1375
|
-
/** Extra class names on the outermost wrapper. */
|
|
1376
|
-
className?: string;
|
|
1377
|
-
/** Ref pointing to the hidden `<input type="checkbox">`. */
|
|
1378
|
-
ref?: React$1.Ref<HTMLInputElement>;
|
|
1379
|
-
}
|
|
1380
|
-
/**
|
|
1381
|
-
* `TriStateCheckbox` props — requires `state` + `onStateChange`.
|
|
1382
|
-
*/
|
|
1383
|
-
interface TriStateCheckboxProps extends Omit<CheckboxProps, "checked" | "defaultChecked" | "onCheckedChange"> {
|
|
1384
|
-
state: CheckboxState;
|
|
1385
|
-
onStateChange: (state: CheckboxState) => void;
|
|
1386
|
-
}
|
|
1387
|
-
/**
|
|
1388
|
-
* MD3 Expressive Checkbox component.
|
|
1389
|
-
*
|
|
1390
|
-
* Supports 2-state and tri-state patterns. Fully animated per MD3 spec:
|
|
1391
|
-
* checkmark draw, indeterminate dash morph, container fill, state layer, and ripple.
|
|
1392
|
-
*
|
|
1393
|
-
* @example
|
|
1394
|
-
* ```tsx
|
|
1395
|
-
* <Checkbox checked={isChecked} onCheckedChange={setIsChecked} label="Accept terms" />
|
|
1396
|
-
* <Checkbox state={parentState} onStateChange={setParentState} label="Select all" />
|
|
1397
|
-
* <Checkbox error label="Required field" aria-describedby="err-msg" />
|
|
1398
|
-
* ```
|
|
1399
|
-
* @see https://m3.material.io/components/checkbox/overview
|
|
1400
|
-
*/
|
|
1401
|
-
declare const Checkbox: React$1.NamedExoticComponent<Omit<CheckboxProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
|
|
1402
|
-
/**
|
|
1403
|
-
* MD3 Expressive Tri-State Checkbox.
|
|
1327
|
+
* Tham số Props dùng cho component thao tác nổi `FAB`.
|
|
1404
1328
|
*
|
|
1405
|
-
*
|
|
1406
|
-
*
|
|
1329
|
+
* @remarks
|
|
1330
|
+
* - Đảm bảo rằng đối với loại FAB chỉ show ra mỗi con Icon mà không có nhãn hiển thị (icon-only), bắt buộc phải có thuộc tính `aria-label` nhằm phục vụ (accessibility).
|
|
1331
|
+
* - Ở hình thể mở rộng (khi `extended={true}`), phần nội dung truyền vào `children` chính là chuỗi Text được thể hiện cùng nút, và nó sẽ khiến nút button có label mặc định nên bạn có thể chém bớt tham số `aria-label`.
|
|
1332
|
+
* - Thuộc tính cờ `lowered` (chìm) giúp giáng cấp hiệu ứng tạo bóng Shadow của thẻ, rải mảng cái shadow theo phong thái MD3 "lowered" FAB;
|
|
1333
|
+
* sử dụng khi nút FAB này vốn bị bọc bên trong bề mặt chìm đè lên component gì khác mà vốn tụi nó đã nhún ở mực sâu (Ví dụ Bottom App Bar) để thiết lập Hierarchy hài hoà.
|
|
1407
1334
|
*
|
|
1408
|
-
* @
|
|
1409
|
-
* ```tsx
|
|
1410
|
-
* <TriStateCheckbox state={parentState} onStateChange={setParentState} label="Select all" />
|
|
1411
|
-
* ```
|
|
1335
|
+
* @see https://m3.material.io/components/floating-action-button/overview
|
|
1412
1336
|
*/
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
declare const chipVariants: (props?: ({
|
|
1416
|
-
variant?: "input" | "filter" | "assist" | "suggestion" | null | undefined;
|
|
1417
|
-
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
1418
|
-
interface ChipProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, "children"> {
|
|
1337
|
+
interface FABProps extends MotionButtonProps$1 {
|
|
1419
1338
|
/**
|
|
1420
|
-
*
|
|
1421
|
-
*
|
|
1422
|
-
* - `filter` → Toggleable tag/filter. Shows animated checkmark when selected.
|
|
1423
|
-
* - `input` → Entity representation (tag, contact). Has optional avatar + remove button.
|
|
1424
|
-
* - `suggestion` → Contextual suggestions. Like assist, flat by default, can be elevated.
|
|
1425
|
-
* @default 'assist'
|
|
1339
|
+
* Icon đại diện render — thông thường là truyền thẻ component Icon.
|
|
1340
|
+
* Sẽ được tráo đổi thành Spinner tự động quay khi giá trị `loading={true}`.
|
|
1426
1341
|
*/
|
|
1427
|
-
|
|
1342
|
+
icon: React$1.ReactNode;
|
|
1428
1343
|
/**
|
|
1429
|
-
*
|
|
1430
|
-
*
|
|
1431
|
-
*
|
|
1344
|
+
* Kích thước hiển thị FAB. Tuân chuẩn.
|
|
1345
|
+
* - `sm`: Small (40dp) — Được khuyên dùng cho các không gian kín/trong lòng Content.
|
|
1346
|
+
* - `md`: Regular (56dp) — Action thứ yếu hoặc tiêu điểm màn hình. (Phần đông người dùng xài).
|
|
1347
|
+
* - `lg`: Large (96dp) — Trọng tâm thao tác quan trọng lớn nhát.
|
|
1348
|
+
* - `xl`: Extra-large (136dp) — Gây tiếng vang, dạng Spotlight cực bùng nổ của app.
|
|
1349
|
+
* @default "md"
|
|
1432
1350
|
*/
|
|
1433
|
-
|
|
1351
|
+
size?: "sm" | "md" | "lg" | "xl";
|
|
1434
1352
|
/**
|
|
1435
|
-
*
|
|
1436
|
-
*
|
|
1437
|
-
* - `input`: selected → bg `secondary-container`.
|
|
1438
|
-
* Used for `role="checkbox"` (filter) / `aria-pressed` (input).
|
|
1353
|
+
* Container vai trò hệ thống tông màu MD3 dùng phết nền.
|
|
1354
|
+
* @default "primary"
|
|
1439
1355
|
*/
|
|
1440
|
-
|
|
1356
|
+
colorStyle?: "primary" | "secondary" | "tertiary" | "surface";
|
|
1441
1357
|
/**
|
|
1442
|
-
*
|
|
1443
|
-
*
|
|
1444
|
-
*
|
|
1445
|
-
* - `aria-disabled="true"`
|
|
1446
|
-
* - `tabIndex={-1}`
|
|
1358
|
+
* Kích hoạt khi giá trị được đổi là `true`, sẽ diễn tả Animation bung chữ kèm theo độ dãn hình dài cho cái FAB.
|
|
1359
|
+
* Chiều rộng tự cơi nới để thích ứng chuỗi `children`.
|
|
1360
|
+
* @default false
|
|
1447
1361
|
*/
|
|
1448
|
-
|
|
1362
|
+
extended?: boolean;
|
|
1449
1363
|
/**
|
|
1450
|
-
*
|
|
1364
|
+
* Nơi đón lấy chữ được render cùng khi `extended={true}` bật lên.
|
|
1365
|
+
* Khuyến nghị là Text string thuần.
|
|
1451
1366
|
*/
|
|
1452
|
-
|
|
1367
|
+
children?: React$1.ReactNode;
|
|
1453
1368
|
/**
|
|
1454
|
-
*
|
|
1455
|
-
*
|
|
1456
|
-
*
|
|
1457
|
-
* For `input` (unselected): icon color → `on-surface-variant`
|
|
1369
|
+
* Nhấn `true`, thì rút lại shadow đi một cấp xuống độ nổi nông cạn.
|
|
1370
|
+
* Mảng bám ở Bottom bar hay Top bar Surface để ránh rườm rà.
|
|
1371
|
+
* @default false
|
|
1458
1372
|
*/
|
|
1459
|
-
|
|
1373
|
+
lowered?: boolean;
|
|
1460
1374
|
/**
|
|
1461
|
-
*
|
|
1462
|
-
*
|
|
1375
|
+
* Nhấp chuột sang `true`, đổi Icon thành cối xay Spinner chờ kết quả. Đồng loạt chặn click tương tác.
|
|
1376
|
+
* @default false
|
|
1463
1377
|
*/
|
|
1464
|
-
|
|
1378
|
+
loading?: boolean;
|
|
1465
1379
|
/**
|
|
1466
|
-
*
|
|
1467
|
-
*
|
|
1380
|
+
* Có 2 chuẩn hình của Loading chờ.
|
|
1381
|
+
* @default "loading-indicator"
|
|
1468
1382
|
*/
|
|
1469
|
-
|
|
1383
|
+
loadingVariant?: "loading-indicator" | "circular";
|
|
1470
1384
|
/**
|
|
1471
|
-
*
|
|
1472
|
-
*
|
|
1385
|
+
* Hiện thẻ FAB lên layout không (Kiểm soát bằng motion scale Entrance/Exit).
|
|
1386
|
+
* @default true
|
|
1473
1387
|
*/
|
|
1474
|
-
|
|
1388
|
+
visible?: boolean;
|
|
1475
1389
|
}
|
|
1476
1390
|
/**
|
|
1477
|
-
*
|
|
1391
|
+
* Interface cho component bọc thẻ `FABPosition` — Gắn lớp absolute position nhét cục FAB vào một góc cố định của góc nào đó tại trình duyệt/bề mặt render.
|
|
1478
1392
|
*
|
|
1479
|
-
* @
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1393
|
+
* @see {@link FABPosition}
|
|
1394
|
+
*/
|
|
1395
|
+
interface FABPositionProps {
|
|
1396
|
+
/**
|
|
1397
|
+
* Góc để niêm chặt nút FAB.
|
|
1398
|
+
* @default "bottom-right"
|
|
1399
|
+
*/
|
|
1400
|
+
position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
|
|
1401
|
+
/** Kẹp một nùi element. Mong chờ thả Node `<FAB>` vào đây.*/
|
|
1402
|
+
children: React$1.ReactNode;
|
|
1403
|
+
/** CSS Class hỗ trợ chỉnh override */
|
|
1404
|
+
className?: string;
|
|
1405
|
+
}
|
|
1406
|
+
/**
|
|
1407
|
+
* Element bao bọc thẻ định vị Absolute cho component `<FAB>`.
|
|
1408
|
+
*
|
|
1409
|
+
* Component dùng để cắm phao Neo cái FAB vào sát ở góc của screen kèm theo một cái offset space theo responsive an toàn mà lại trơn chu nhạy nhẽo.
|
|
1410
|
+
* Nhưng có quy tắc gốc đó là phần tử bao bọc cha mẹ của nó PHẢI có thẻ tag css `position: relative` (hoặc ở cấp tổ tiêm của trang nào đó phải đẻ gốc rễ ra posisition).
|
|
1484
1411
|
*
|
|
1485
1412
|
* @example
|
|
1486
1413
|
* ```tsx
|
|
1487
|
-
*
|
|
1488
|
-
*
|
|
1489
|
-
*
|
|
1490
|
-
*
|
|
1491
|
-
*
|
|
1492
|
-
*
|
|
1493
|
-
* // Input chip with remove
|
|
1494
|
-
* <Chip variant="input" label="React" onRemove={() => removeTag("React")} />
|
|
1414
|
+
* <div className="relative min-h-screen">
|
|
1415
|
+
* // Cái nút sẽ xà xuống dưới cùng bên lề Trái
|
|
1416
|
+
* <FABPosition position="bottom-left">
|
|
1417
|
+
* <FAB icon={<Icon name="edit" />} aria-label="Compose New Mail" />
|
|
1418
|
+
* </FABPosition>
|
|
1419
|
+
* </div>
|
|
1495
1420
|
* ```
|
|
1496
1421
|
*
|
|
1497
|
-
* @see
|
|
1422
|
+
* @see {@link FAB}
|
|
1423
|
+
* @see https://m3.material.io/components/floating-action-button/guidelines
|
|
1498
1424
|
*/
|
|
1499
|
-
declare
|
|
1500
|
-
|
|
1501
|
-
interface CodeBlockProps {
|
|
1502
|
-
/** Raw code string to display and copy. */
|
|
1503
|
-
code: string;
|
|
1504
|
-
/** Language label in the header (presentational only). @default "React" */
|
|
1505
|
-
language?: string;
|
|
1506
|
-
/** Additional CSS classes for the outer wrapper. */
|
|
1507
|
-
className?: string;
|
|
1508
|
-
/**
|
|
1509
|
-
* Pre-highlighted HTML from Shiki SSR.
|
|
1510
|
-
* Use `codeToHtml` with `themes: { light, dark }` for dual-theme support.
|
|
1511
|
-
*/
|
|
1512
|
-
html?: string;
|
|
1513
|
-
}
|
|
1514
|
-
declare function CodeBlock({ code, language, className, html, }: CodeBlockProps): react_jsx_runtime.JSX.Element;
|
|
1515
|
-
|
|
1425
|
+
declare function FABPosition({ position, children, className, }: FABPositionProps): react_jsx_runtime.JSX.Element;
|
|
1516
1426
|
/**
|
|
1517
|
-
*
|
|
1427
|
+
* Action nổi chính theo phong cách MD3 Expressive Floating Action Button (FAB).
|
|
1428
|
+
*
|
|
1429
|
+
* Phơi nhiễm các action tạo nhịp điệu kích hoạt cho người sử dụng với đủ bộ trang hoàn trọn kích thước Size (SM->XL),
|
|
1430
|
+
* mang nhiều màu sắc Color role khác biệt, cung cấp một sức nén cho Label để kéo toẹt cái ống dài ra (gọi là Dạng Mở Rộng - Extended) tạo nên hành động sinh động,
|
|
1431
|
+
* Trạng thái load/nhấp hiện xuất cùng animation thu scale thoát cảnh bắt mắt đầy nghệ thuật.
|
|
1432
|
+
*
|
|
1433
|
+
* @remarks
|
|
1434
|
+
* - Chỉ định bắt buộc `aria-label` cho những mẫu icon bị đơn côi trơ trọi (icon-only FABs).
|
|
1435
|
+
* - Trường hợp xài mode Mở Rộng qua việc truyền hàm `extended={true}`, nút FAB này tự ngộ nhận thân thế, lấy `children` dùng làm Aria label luôn hễ như `children` đó đang chứa text string.
|
|
1436
|
+
* Khi ấy bạn tha hồ cắt bỏ thuộc tính `aria-label` ra.
|
|
1437
|
+
* - Lúc cho biến mất (`visible={false}`), bộ nút tung chiêu lùi về sau làm quả rút bóng thoát Scale-out qua effect spring uyển chuyển.
|
|
1438
|
+
* - Sài kèm `FABPosition` bao đùm nó lại nếu bạn muốn xích nó cố định ngấm chân sâu góc màn hình hiển thị.
|
|
1518
1439
|
*
|
|
1519
1440
|
* @example
|
|
1520
1441
|
* ```tsx
|
|
1521
|
-
*
|
|
1442
|
+
* // FAB cơ bản, nhỏ xinh, chỉ hiện icon.
|
|
1443
|
+
* <FAB icon={<Icon name="search" />} aria-label="Nhấn tìm kiếm" size="sm" />
|
|
1522
1444
|
*
|
|
1523
|
-
*
|
|
1524
|
-
*
|
|
1525
|
-
*
|
|
1526
|
-
*
|
|
1527
|
-
*
|
|
1528
|
-
*
|
|
1529
|
-
*
|
|
1530
|
-
*
|
|
1531
|
-
*
|
|
1532
|
-
*
|
|
1533
|
-
*
|
|
1534
|
-
*
|
|
1535
|
-
*
|
|
1536
|
-
*
|
|
1445
|
+
* // Dịch sang dòng Extended có dòng caption chữ dài thòn
|
|
1446
|
+
* const [isOpen, setOpen] = React.useState(false);
|
|
1447
|
+
* <FAB
|
|
1448
|
+
* icon={<Icon name="edit" />}
|
|
1449
|
+
* extended={isOpen}
|
|
1450
|
+
* onClick={() => setOpen(!isOpen)}
|
|
1451
|
+
* >
|
|
1452
|
+
* Viết tâm thư
|
|
1453
|
+
* </FAB>
|
|
1454
|
+
*
|
|
1455
|
+
* // FAB to lớn nhất dùng trạng thái chờ load Submit lên Server
|
|
1456
|
+
* <FAB
|
|
1457
|
+
* icon={<Icon name="upload" />}
|
|
1458
|
+
* size="lg"
|
|
1459
|
+
* loading={isUploading}
|
|
1460
|
+
* colorStyle="secondary"
|
|
1461
|
+
* aria-label="Upload Files lên mây xanh"
|
|
1462
|
+
* />
|
|
1463
|
+
*
|
|
1464
|
+
* // Cố định dưới chân tay phải
|
|
1465
|
+
* <FABPosition position="bottom-right">
|
|
1466
|
+
* <FAB icon={<Icon name="add" />} aria-label="Dấu Cộng sinh nảy" />
|
|
1467
|
+
* </FABPosition>
|
|
1537
1468
|
* ```
|
|
1469
|
+
*
|
|
1470
|
+
* @see https://m3.material.io/components/floating-action-button/overview
|
|
1538
1471
|
*/
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
open?: boolean;
|
|
1542
|
-
/** Called when the open state should change. */
|
|
1543
|
-
onOpenChange?: (open: boolean) => void;
|
|
1544
|
-
/** Dialog trigger + content. */
|
|
1545
|
-
children: React$1.ReactNode;
|
|
1546
|
-
}
|
|
1472
|
+
declare const FAB: React$1.NamedExoticComponent<Omit<FABProps, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1473
|
+
|
|
1547
1474
|
/**
|
|
1548
|
-
*
|
|
1475
|
+
* Định dạng dữ liệu cho từng hành động (item) trong biểu mẫu menu của FAB.
|
|
1549
1476
|
*
|
|
1550
|
-
*
|
|
1477
|
+
* Nếu bỏ qua thuộc tính `label`, item sẽ render dạng ô vuông chỉ có icon.
|
|
1551
1478
|
*/
|
|
1552
|
-
interface
|
|
1553
|
-
/**
|
|
1554
|
-
|
|
1479
|
+
interface FABMenuItemData {
|
|
1480
|
+
/** Một ID duy nhất để dùng cho key react và quản lý focus. */
|
|
1481
|
+
id: string;
|
|
1482
|
+
/** Label hiển thị cạnh icon (tuỳ chọn). Không thêm thuộc tính này nếu muốn hiển thị chỉ có icon (icon-only). */
|
|
1483
|
+
label?: string;
|
|
1484
|
+
/** Node của Icon — thường là một component SVG Icon duy nhất. */
|
|
1485
|
+
icon: React$1.ReactNode;
|
|
1486
|
+
/** Gọi hàm ngay lập tức khi item được kích hoạt (click hoặc nhấn Enter/Phím cách). */
|
|
1487
|
+
onClick: () => void;
|
|
1488
|
+
/**
|
|
1489
|
+
* Khi `true`, vô hiệu hoá item về mặt hình thức lẫn tương tác rẽ nhánh.
|
|
1490
|
+
* Vẫn dùng `aria-disabled` thay vì HTML `disabled` nhằm giữ nó lấy được focus phục vụ cho accessibility.
|
|
1491
|
+
* @default false
|
|
1492
|
+
*/
|
|
1493
|
+
disabled?: boolean;
|
|
1494
|
+
/** Thêm CSS classes bổ sung dùng cho wrapper chính của item. */
|
|
1555
1495
|
className?: string;
|
|
1556
1496
|
}
|
|
1557
1497
|
/**
|
|
1558
|
-
*
|
|
1498
|
+
* Các props điều khiển Component chính `FABMenu`.
|
|
1559
1499
|
*
|
|
1560
1500
|
* @remarks
|
|
1561
|
-
*
|
|
1562
|
-
*
|
|
1563
|
-
*
|
|
1564
|
-
* @see {@link DialogFullScreenContent}
|
|
1565
|
-
* @see https://m3.material.io/components/dialogs/guidelines#full-screen
|
|
1501
|
+
* FABMenu quản lý vòng đời trạng thái mở/đóng menu (open/close), quản lý focus, điều khiển phím,
|
|
1502
|
+
* và điều hướng hiệu ứng chuyển động. Trạng thái `expanded` được truyền từ ngoài (controlled state),
|
|
1503
|
+
* do đó bạn có thể quản lý qua react state, hoặc dùng router hay business logic khác.
|
|
1566
1504
|
*/
|
|
1567
|
-
interface
|
|
1568
|
-
/**
|
|
1569
|
-
|
|
1570
|
-
/**
|
|
1571
|
-
|
|
1572
|
-
/**
|
|
1573
|
-
|
|
1574
|
-
/**
|
|
1575
|
-
|
|
1505
|
+
interface FABMenuProps {
|
|
1506
|
+
/** FAB Menu có đang mở (mở rộng)/hiển thị hay không. */
|
|
1507
|
+
expanded: boolean;
|
|
1508
|
+
/** Hàm handler kích hoạt khi Toggle FAB được người dùng tương tác, hoặc khi dismiss backdrop. */
|
|
1509
|
+
onToggle: (expanded: boolean) => void;
|
|
1510
|
+
/** Danh sách các action items (Spec MD3 đề nghị 2-6 item là hoàn hảo). */
|
|
1511
|
+
items: FABMenuItemData[];
|
|
1512
|
+
/**
|
|
1513
|
+
* Vai trò màu (color role container) MD3 cho cái nút FAB lẫn các menu items.
|
|
1514
|
+
* @default "primary"
|
|
1515
|
+
*/
|
|
1516
|
+
colorVariant?: "primary" | "secondary" | "tertiary";
|
|
1517
|
+
/**
|
|
1518
|
+
* Kích cỡ khởi tạo cho cái ToggleFAB (FAB biến hình thành cục đóng dấu X khi nó expanded).
|
|
1519
|
+
* @default "baseline"
|
|
1520
|
+
*/
|
|
1521
|
+
fabSize?: "baseline" | "medium" | "large";
|
|
1522
|
+
/**
|
|
1523
|
+
* Căn lề của danh sách menu items tương quan với cái Toggle FAB.
|
|
1524
|
+
* - `"end"`: Các items dồn hết theo lề phía tay phải (trailing edge, default cực hữu hiệu đối với RTL design).
|
|
1525
|
+
* - `"start"`: Các items dồn hết dọc theo lề trái.
|
|
1526
|
+
* - `"center"`: Các item sẽ được căn ra giữa chiều dọc, căn giữa tâm khối với cái FAB.
|
|
1527
|
+
* @default "end"
|
|
1528
|
+
*/
|
|
1529
|
+
alignment?: "start" | "end" | "center";
|
|
1530
|
+
/** Thuộc tính cho CSS component root để đè. */
|
|
1576
1531
|
className?: string;
|
|
1532
|
+
/**
|
|
1533
|
+
* Nếu `true`, khi menu đang hiện ra, click chuột ra phía sau (màn xám mờ backdrop) để đóng menu.
|
|
1534
|
+
* @default true
|
|
1535
|
+
*/
|
|
1536
|
+
closeOnBackdropClick?: boolean;
|
|
1537
|
+
/**
|
|
1538
|
+
* Nếu `true`, focus sẽ tự động chạy xuống item CUỐI (sát bên trên cái nút FAB) khi menu vừa loé mờ ra.
|
|
1539
|
+
* Nếu `false`, focus sẽ bay lên item ĐẦU TIÊN của danh sách (cao nhất trên màn hình).
|
|
1540
|
+
* @default true
|
|
1541
|
+
*/
|
|
1542
|
+
focusLast?: boolean;
|
|
1543
|
+
/** Bắt buộc truyền `aria-label` cho ToggleFAB để đáp ứng Accessibility. */
|
|
1544
|
+
"aria-label"?: string;
|
|
1577
1545
|
}
|
|
1578
1546
|
/**
|
|
1579
|
-
*
|
|
1580
|
-
*
|
|
1581
|
-
* @remarks Cơ năng hoạt động ở chế độ Controlled (kiểm soát vòng đời ở Client) xài mảng `open`/`onOpenChange`.
|
|
1582
|
-
* Tuy thế bạn nếu không thích thì đừng có xài truyền mấy cái Props tay đôi trên, mà bỏ xài kiểu Untracked thông qua cái cục `DialogTrigger` là đủ.
|
|
1547
|
+
* Props thuộc component `ToggleFAB` đứng độc lập.
|
|
1583
1548
|
*/
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
(
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1549
|
+
interface ToggleFABProps {
|
|
1550
|
+
/** Nút có đang trong trạng thái được kích hoạt check (expanded). */
|
|
1551
|
+
expanded: boolean;
|
|
1552
|
+
/** Gọi khi xảy ra sự kiện Toggle nút. */
|
|
1553
|
+
onToggle: (expanded: boolean) => void;
|
|
1554
|
+
/**
|
|
1555
|
+
* Function sinh Icon - nhận về tiến độ `progress` trong khoảng `0` -> `1` (Từ Chưa Expanded -> Đã Expanded)
|
|
1556
|
+
* Dùng cho các hiệu ứng morphing Icon khi animtion render (VD: Từ Cộng thành Đóng).
|
|
1557
|
+
*
|
|
1558
|
+
* @example
|
|
1559
|
+
* ```tsx
|
|
1560
|
+
* icon={(progress) => progress > 0.5 ? <Icon name="close" /> : <Icon name="add" />}
|
|
1561
|
+
* ```
|
|
1562
|
+
*/
|
|
1563
|
+
icon: (progress: number) => React$1.ReactNode;
|
|
1564
|
+
/** Vai trò màu container chuẩn MD3. @default "primary" */
|
|
1565
|
+
colorVariant?: "primary" | "secondary" | "tertiary";
|
|
1566
|
+
/** Kích thước của cục FAB ban đầu (Sau khi nhấn sẽ thu tròn). @default "baseline" */
|
|
1567
|
+
fabSize?: "baseline" | "medium" | "large";
|
|
1568
|
+
/** CSS Class linh tinh bổ sung thêm. */
|
|
1569
|
+
className?: string;
|
|
1570
|
+
/** Thuộc tính đọc thẻ accessibility. Bắt buộc có. */
|
|
1571
|
+
"aria-label"?: string;
|
|
1572
|
+
/** Kiểm soát giá trị của ID để link với menu qua aria-controls. */
|
|
1573
|
+
"aria-controls"?: string;
|
|
1574
|
+
/** Trỏ id component. */
|
|
1575
|
+
id?: string;
|
|
1576
|
+
}
|
|
1577
|
+
/**
|
|
1578
|
+
* Props thuộc component một món item đơn lẻ `FABMenuItem`.
|
|
1579
|
+
*/
|
|
1580
|
+
interface FABMenuItemProps {
|
|
1581
|
+
/** Node của icon hiện. */
|
|
1582
|
+
icon: React$1.ReactNode;
|
|
1583
|
+
/** Tên nhãn mô tả kế bên icon cho item này. Hoặc ẩn nó đi nếu không mong đợi. */
|
|
1584
|
+
label?: string;
|
|
1585
|
+
/** Hàm bắn ra khi item được kích. */
|
|
1586
|
+
onClick: () => void;
|
|
1587
|
+
/** Vô hiệu hóa hành vi tương tác item mà vẫn cho phép bàn phím tab bấm dính lấy focus. @default false */
|
|
1588
|
+
disabled?: boolean;
|
|
1589
|
+
/** Container tông màu. @default "primary" */
|
|
1590
|
+
colorVariant?: "primary" | "secondary" | "tertiary";
|
|
1591
|
+
/** Custom CSS className. */
|
|
1592
|
+
className?: string;
|
|
1593
|
+
/** Số index liệt kê trong mảng dùng tính render delay (Dành cho animation cấu trúc `custom`). */
|
|
1594
|
+
index?: number;
|
|
1595
|
+
/** Tổng danh sách items có mảng. */
|
|
1596
|
+
totalItems?: number;
|
|
1597
|
+
/** Giá trị logic `tabIndex` dùng điều khiển thao tác phím Tab thủ công. */
|
|
1598
|
+
tabIndex?: number;
|
|
1599
|
+
}
|
|
1600
|
+
/**
|
|
1601
|
+
* Nút Toggle FAB (Biến hình) có thể được dùng độc lập đứng một mình (standalone) hoặc kết nối để kích hoạt mở cả nùi Menu ở dưới con `FABMenu`.
|
|
1602
|
+
*
|
|
1603
|
+
* Sức ép hiệu ứng kích thước khung nền sẽ chuyển từ vuôn/vát cạnh sang hình tròn hẵn (square → circle), chuyển biến cả màu sắc
|
|
1604
|
+
* khi mà cờ `expanded` chuyển tiếp từ false sang → true.
|
|
1605
|
+
*
|
|
1606
|
+
* @example
|
|
1607
|
+
* ```tsx
|
|
1608
|
+
* const [open, setOpen] = React.useState(false);
|
|
1609
|
+
* <ToggleFAB
|
|
1610
|
+
* expanded={open}
|
|
1611
|
+
* onToggle={setOpen}
|
|
1612
|
+
* colorVariant="primary"
|
|
1613
|
+
* aria-label="Toggle actions"
|
|
1614
|
+
* icon={(progress) => progress > 0.5 ? <Icon name="close" /> : <Icon name="add" />}
|
|
1615
|
+
* />
|
|
1616
|
+
* ```
|
|
1617
|
+
*/
|
|
1618
|
+
declare const ToggleFAB: React$1.NamedExoticComponent<ToggleFABProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1619
|
+
/**
|
|
1620
|
+
* Một item thực hiện một loại hành động duy nhất trong `FABMenu`.
|
|
1621
|
+
*
|
|
1622
|
+
* Render hình dạng viên thuốc bao quanh icon cùng với label diễn giải.
|
|
1623
|
+
* Khi `label` bỏ trống, nó sẽ render thành một cục thẻ gạch ốp màu vuông vức chứa chữ mỗi cái icon.
|
|
1624
|
+
* Component chứa gợn sóng MD3 Ripple cùng 48dp chuẩn vùng target đụng diện chuẩn WCAG 2.5.5 cho cảm ứng.
|
|
1625
|
+
*
|
|
1621
1626
|
* @remarks
|
|
1622
|
-
*
|
|
1623
|
-
*
|
|
1624
|
-
*
|
|
1627
|
+
* Những thành phần khi bị tắt (vô hiệu tương tác) thì chỉ được dùng role `aria-disabled="true"` ở lớp div bề mặt thay vì lấy
|
|
1628
|
+
* thuộc tính gốc `disabled` của HTML. Nhờ đó, item tuy xám mờ không bấm được phím chuột vẫn sẽ có khả năng focus qua vòng đời tab phím bàn phím
|
|
1629
|
+
* (quy chuẩn chặt chẽ của Material Design 3).
|
|
1630
|
+
*/
|
|
1631
|
+
declare function FABMenuItem({ icon, label, onClick, disabled, colorVariant, className, tabIndex, }: FABMenuItemProps): react_jsx_runtime.JSX.Element;
|
|
1632
|
+
/**
|
|
1633
|
+
* MD3 Expressive FAB Menu.
|
|
1625
1634
|
*
|
|
1626
|
-
*
|
|
1627
|
-
* - "full-bleed" → spans full width, no indent
|
|
1628
|
-
* - "inset" → leading indent (16dp standard / 72dp after-icon via insetStart)
|
|
1629
|
-
* - "middle-inset" → 16dp indent both sides
|
|
1630
|
-
* - "subheader" → same as full-bleed (label provided externally)
|
|
1635
|
+
* Bộ mở rộng Floating Action Button. Khi tương tác bật vào toggle-button (FAB con lai), sẽ trút ra mớ tác vụ menu ở xếp dọc (hoặc lan ra) từ trên đè ngược xuống trên nó.
|
|
1631
1636
|
*
|
|
1632
|
-
*
|
|
1633
|
-
*
|
|
1634
|
-
*
|
|
1637
|
+
* Accessibility thực thi chuẩn MD3 toàn phần:
|
|
1638
|
+
* - thẻ `role="menu"` trang bị cho thẻ hộp div làm luống container
|
|
1639
|
+
* - trang bị thẻ `role="menuitem"` trên mảng items thành phần con
|
|
1640
|
+
* - Lifecycle Focus cho trải nghiệm hoàn mỹ: Mở phím bật -> Focus thẳng lên item cao/thấp đầu/cuối cùng menu; Đóng tắt menu -> Focus trả về ngược lại ToggleFAB
|
|
1641
|
+
* - Tính năng Bàn Phím: Lách Escape nhấn tắt nhắm, Nhấn phím hướng lên-xuống(ArrowUp/Down) để di chuyển, Móc Tab(hoặc là Shift+Tab) nhảy lăng quăng qua các item.
|
|
1635
1642
|
*
|
|
1636
|
-
*
|
|
1637
|
-
*
|
|
1638
|
-
*
|
|
1639
|
-
* - Wavy: SVG path generated by pure-JS `buildWavePath()` (cubic Bézier sine approx)
|
|
1640
|
-
* Uses ResizeObserver (via useContainerWidth) to measure container width so
|
|
1641
|
-
* the path has precise bounds and leading/trailing ends are properly rounded.
|
|
1642
|
-
* - A11y: role="separator", aria-orientation, aria-hidden when decorative
|
|
1643
|
+
* @example
|
|
1644
|
+
* ```tsx
|
|
1645
|
+
* const [open, setOpen] = React.useState(false);
|
|
1643
1646
|
*
|
|
1644
|
-
*
|
|
1647
|
+
* const items = [
|
|
1648
|
+
* { id: 'share', icon: <Icon name="share" />, label: 'Chia sẻ', onClick: () => console.log('Share') },
|
|
1649
|
+
* { id: 'edit', icon: <Icon name="edit" />, label: 'Chỉnh sửa', onClick: () => console.log('Edit') },
|
|
1650
|
+
* { id: 'delete', icon: <Icon name="delete" />, label: 'Xóa bớt', disabled: true, onClick: () => {} }
|
|
1651
|
+
* ];
|
|
1652
|
+
*
|
|
1653
|
+
* <FABMenu
|
|
1654
|
+
* expanded={open}
|
|
1655
|
+
* onToggle={setOpen}
|
|
1656
|
+
* aria-label="Các công cụ thao tác nhanh"
|
|
1657
|
+
* alignment="center"
|
|
1658
|
+
* colorVariant="tertiary"
|
|
1659
|
+
* items={items}
|
|
1660
|
+
* />
|
|
1661
|
+
* ```
|
|
1662
|
+
*
|
|
1663
|
+
* @see https://m3.material.io/components/floating-action-button/overview
|
|
1645
1664
|
*/
|
|
1665
|
+
declare function FABMenu({ expanded, onToggle, items, colorVariant, fabSize, alignment, className, closeOnBackdropClick, focusLast, "aria-label": ariaLabel, }: FABMenuProps): react_jsx_runtime.JSX.Element;
|
|
1646
1666
|
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1667
|
+
/**
|
|
1668
|
+
* @file icon-button.tsx
|
|
1669
|
+
*
|
|
1670
|
+
* MD3 Expressive Icon Button component.
|
|
1671
|
+
*
|
|
1672
|
+
* An icon-only button with shape morphing, ripple effect, loading state,
|
|
1673
|
+
* and toggle variant. Requires `aria-label` for accessibility since there
|
|
1674
|
+
* is no visible text label.
|
|
1675
|
+
*
|
|
1676
|
+
* @see https://m3.material.io/components/icon-buttons/overview
|
|
1677
|
+
*/
|
|
1678
|
+
|
|
1679
|
+
type MotionButtonProps = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
1680
|
+
/**
|
|
1681
|
+
* Base props for the Icon Button component.
|
|
1682
|
+
*
|
|
1683
|
+
* @see {@link IconButtonProps} for the full discriminated union.
|
|
1684
|
+
* @see https://m3.material.io/components/icon-buttons/overview
|
|
1685
|
+
*/
|
|
1686
|
+
interface BaseIconButtonProps extends MotionButtonProps {
|
|
1658
1687
|
/**
|
|
1659
|
-
*
|
|
1660
|
-
*
|
|
1661
|
-
* - "vertical" → renders as `w-px h-full` column
|
|
1662
|
-
* Note: `shape="wavy"` is not supported with orientation="vertical".
|
|
1663
|
-
* @default "horizontal"
|
|
1688
|
+
* Visual color style following MD3 color roles.
|
|
1689
|
+
* @default "standard"
|
|
1664
1690
|
*/
|
|
1665
|
-
|
|
1691
|
+
colorStyle?: "standard" | "filled" | "tonal" | "outlined";
|
|
1666
1692
|
/**
|
|
1667
|
-
*
|
|
1668
|
-
*
|
|
1669
|
-
*
|
|
1670
|
-
*
|
|
1671
|
-
* When `shape="wavy"` and `orientation="vertical"`, silently falls back to
|
|
1672
|
-
* `shape="flat"` and emits a `console.warn`.
|
|
1673
|
-
* @default "flat"
|
|
1693
|
+
* Button container size.
|
|
1694
|
+
* Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.
|
|
1695
|
+
* @default "sm"
|
|
1674
1696
|
*/
|
|
1675
|
-
|
|
1697
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
1676
1698
|
/**
|
|
1677
|
-
*
|
|
1678
|
-
* -
|
|
1679
|
-
* -
|
|
1680
|
-
*
|
|
1681
|
-
* @default "standard"
|
|
1699
|
+
* Container shape controlling border-radius morphing.
|
|
1700
|
+
* - `round`: fully circular (CornerFull).
|
|
1701
|
+
* - `square`: rounded square (CornerMedium–CornerExtraLarge per size).
|
|
1702
|
+
* @default "round"
|
|
1682
1703
|
*/
|
|
1683
|
-
|
|
1704
|
+
shape?: "round" | "square";
|
|
1684
1705
|
/**
|
|
1685
|
-
*
|
|
1686
|
-
*
|
|
1706
|
+
* When `true`, replaces the icon with an animated loading indicator.
|
|
1707
|
+
* Interaction is blocked and `aria-busy` is set.
|
|
1708
|
+
* @default false
|
|
1687
1709
|
*/
|
|
1688
|
-
|
|
1689
|
-
/**
|
|
1690
|
-
* Peak displacement from the center line.
|
|
1691
|
-
* @default 2
|
|
1692
|
-
*/
|
|
1693
|
-
amplitude?: number;
|
|
1694
|
-
/**
|
|
1695
|
-
* Pixels per full sine cycle.
|
|
1696
|
-
* @default 32
|
|
1697
|
-
*/
|
|
1698
|
-
wavelength?: number;
|
|
1699
|
-
/**
|
|
1700
|
-
* Thickness of the wave stroke in pixels.
|
|
1701
|
-
* @default 1
|
|
1702
|
-
*/
|
|
1703
|
-
strokeWidth?: number;
|
|
1704
|
-
};
|
|
1710
|
+
loading?: boolean;
|
|
1705
1711
|
/**
|
|
1706
|
-
*
|
|
1707
|
-
*
|
|
1708
|
-
* @default false
|
|
1712
|
+
* Spinner style shown while `loading={true}`.
|
|
1713
|
+
* @default "loading-indicator"
|
|
1709
1714
|
*/
|
|
1710
|
-
|
|
1715
|
+
loadingVariant?: "loading-indicator" | "circular";
|
|
1716
|
+
/** Icon content — typically a single SVG icon component. */
|
|
1717
|
+
children: React$1.ReactNode;
|
|
1711
1718
|
/**
|
|
1712
|
-
*
|
|
1713
|
-
*
|
|
1714
|
-
* @
|
|
1719
|
+
* Accessible label — **REQUIRED** because icon buttons have no visible text.
|
|
1720
|
+
*
|
|
1721
|
+
* @example "Close", "Add to favourites", "Toggle dark mode"
|
|
1722
|
+
* @see https://m3.material.io/components/icon-buttons/accessibility
|
|
1715
1723
|
*/
|
|
1716
|
-
|
|
1724
|
+
"aria-label": string;
|
|
1717
1725
|
}
|
|
1718
1726
|
/**
|
|
1719
|
-
*
|
|
1720
|
-
*
|
|
1721
|
-
* The error vs. a true sine is < 0.2%.
|
|
1727
|
+
* Complete `IconButton` props — discriminated union that enforces
|
|
1728
|
+
* `selected` is only valid with `variant="toggle"`.
|
|
1722
1729
|
*
|
|
1723
|
-
*
|
|
1724
|
-
*
|
|
1730
|
+
* @example
|
|
1731
|
+
* ```tsx
|
|
1732
|
+
* // Standard
|
|
1733
|
+
* <IconButton aria-label="Close" onClick={handleClose}>
|
|
1734
|
+
* <XIcon />
|
|
1735
|
+
* </IconButton>
|
|
1725
1736
|
*
|
|
1726
|
-
*
|
|
1727
|
-
*
|
|
1728
|
-
*
|
|
1729
|
-
*
|
|
1730
|
-
*
|
|
1731
|
-
*
|
|
1737
|
+
* // Toggle
|
|
1738
|
+
* <IconButton
|
|
1739
|
+
* variant="toggle"
|
|
1740
|
+
* selected={isLiked}
|
|
1741
|
+
* aria-label={isLiked ? "Unlike" : "Like"}
|
|
1742
|
+
* colorStyle="filled"
|
|
1743
|
+
* onClick={() => setIsLiked(!isLiked)}
|
|
1744
|
+
* >
|
|
1745
|
+
* <HeartIcon />
|
|
1746
|
+
* </IconButton>
|
|
1747
|
+
* ```
|
|
1732
1748
|
*
|
|
1733
|
-
* @
|
|
1734
|
-
* buildWavePath(0.5, 499.5, 2, 32, 4)
|
|
1735
|
-
* // → "M 0.5,4 C 11.17,... 500,4 ..."
|
|
1749
|
+
* @see https://m3.material.io/components/icon-buttons/overview
|
|
1736
1750
|
*/
|
|
1737
|
-
|
|
1751
|
+
type IconButtonProps = BaseIconButtonProps & ({
|
|
1752
|
+
variant?: "default";
|
|
1753
|
+
selected?: never;
|
|
1754
|
+
} | {
|
|
1755
|
+
variant: "toggle";
|
|
1756
|
+
selected: boolean;
|
|
1757
|
+
});
|
|
1738
1758
|
/**
|
|
1739
|
-
* MD3 Expressive
|
|
1759
|
+
* MD3 Expressive Icon Button.
|
|
1740
1760
|
*
|
|
1741
|
-
*
|
|
1742
|
-
*
|
|
1761
|
+
* An icon-only button with spring shape morphing, ripple effect, loading state support,
|
|
1762
|
+
* and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5
|
|
1763
|
+
* (touch target minimum for XS and SM sizes).
|
|
1743
1764
|
*
|
|
1744
|
-
*
|
|
1745
|
-
* `
|
|
1765
|
+
* @remarks
|
|
1766
|
+
* - `aria-label` is **required** — icon buttons have no visible text label.
|
|
1767
|
+
* - `variant="toggle"` requires `selected: boolean`.
|
|
1768
|
+
* - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.
|
|
1746
1769
|
*
|
|
1747
1770
|
* @example
|
|
1748
1771
|
* ```tsx
|
|
1749
|
-
*
|
|
1750
|
-
*
|
|
1751
|
-
*
|
|
1752
|
-
* // Inset after icon list items
|
|
1753
|
-
* <Divider variant="inset" insetStart="icon" />
|
|
1754
|
-
*
|
|
1755
|
-
* // Vertical separator between panes
|
|
1756
|
-
* <Divider orientation="vertical" />
|
|
1757
|
-
*
|
|
1758
|
-
* // Wavy expressive divider
|
|
1759
|
-
* <Divider shape="wavy" />
|
|
1760
|
-
*
|
|
1761
|
-
* // Wavy with custom wave config
|
|
1762
|
-
* <Divider shape="wavy" waveConfig={{ amplitude: 5, wavelength: 24 }} />
|
|
1763
|
-
*
|
|
1764
|
-
* // Decorative (no a11y semantics)
|
|
1765
|
-
* <Divider decorative />
|
|
1766
|
-
*
|
|
1767
|
-
* // No entrance animation
|
|
1768
|
-
* <Divider animate={false} />
|
|
1772
|
+
* <IconButton aria-label="Close" onClick={handleClose}>
|
|
1773
|
+
* <XIcon />
|
|
1774
|
+
* </IconButton>
|
|
1769
1775
|
*
|
|
1770
|
-
*
|
|
1771
|
-
*
|
|
1776
|
+
* <IconButton
|
|
1777
|
+
* variant="toggle"
|
|
1778
|
+
* selected={isBookmarked}
|
|
1779
|
+
* aria-label={isBookmarked ? "Remove bookmark" : "Bookmark"}
|
|
1780
|
+
* colorStyle="filled"
|
|
1781
|
+
* onClick={toggleBookmark}
|
|
1782
|
+
* >
|
|
1783
|
+
* <BookmarkIcon />
|
|
1784
|
+
* </IconButton>
|
|
1772
1785
|
* ```
|
|
1773
1786
|
*
|
|
1774
|
-
* @see https://m3.material.io/components/
|
|
1787
|
+
* @see https://m3.material.io/components/icon-buttons/overview
|
|
1775
1788
|
*/
|
|
1776
|
-
declare const
|
|
1789
|
+
declare const IconButton: React$1.NamedExoticComponent<(Omit<BaseIconButtonProps & {
|
|
1790
|
+
variant?: "default";
|
|
1791
|
+
selected?: never;
|
|
1792
|
+
}, "ref"> | Omit<BaseIconButtonProps & {
|
|
1793
|
+
variant: "toggle";
|
|
1794
|
+
selected: boolean;
|
|
1795
|
+
}, "ref">) & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1777
1796
|
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1797
|
+
declare const cardVariants: (props?: ({
|
|
1798
|
+
variant?: "outlined" | "elevated" | "filled" | null | undefined;
|
|
1799
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
1800
|
+
type MotionDivProps = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
1801
|
+
interface CardProps extends MotionDivProps, VariantProps<typeof cardVariants> {
|
|
1802
|
+
/** Vô hiệu hóa tương tác và giảm opacity (MD3 disabled state). */
|
|
1803
|
+
disabled?: boolean;
|
|
1804
|
+
/**
|
|
1805
|
+
* Buộc card trở thành interactive dù không có `onClick`.
|
|
1806
|
+
* Hữu ích khi card chứa các element con là interactive.
|
|
1807
|
+
*/
|
|
1808
|
+
interactive?: boolean;
|
|
1809
|
+
/**
|
|
1810
|
+
* Nếu có, card render thành thẻ `<a>`. Tự động kích hoạt interactive mode.
|
|
1811
|
+
* Ưu tiên dùng `href` thay vì `onClick` khi điều hướng trang.
|
|
1812
|
+
*/
|
|
1813
|
+
href?: string;
|
|
1814
|
+
/** Target cho thẻ `<a>` (chỉ có hiệu lực khi `href` được cung cấp). */
|
|
1815
|
+
target?: React$1.AnchorHTMLAttributes<HTMLAnchorElement>["target"];
|
|
1816
|
+
/** rel cho thẻ `<a>` (tự động thêm `noreferrer` khi `target="_blank"`). */
|
|
1817
|
+
rel?: string;
|
|
1818
|
+
children?: React$1.ReactNode;
|
|
1791
1819
|
}
|
|
1792
|
-
declare const
|
|
1793
|
-
({ open, onOpenChange, children }: DrawerProps): react_jsx_runtime.JSX.Element;
|
|
1794
|
-
displayName: string;
|
|
1795
|
-
};
|
|
1796
|
-
declare const DrawerTrigger: React$1.ForwardRefExoticComponent<RadixDialog.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1797
|
-
declare const DrawerClose: React$1.ForwardRefExoticComponent<RadixDialog.DialogCloseProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1798
|
-
declare const DrawerPortal: ({ open, children, }: {
|
|
1799
|
-
open?: boolean;
|
|
1800
|
-
children: React$1.ReactNode;
|
|
1801
|
-
}) => react_jsx_runtime.JSX.Element;
|
|
1802
|
-
declare const DrawerOverlay: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogOverlayProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
1803
|
-
declare const DrawerContent: React$1.ForwardRefExoticComponent<DrawerContentProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
1804
|
-
declare const DrawerHeader: {
|
|
1805
|
-
({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
1806
|
-
displayName: string;
|
|
1807
|
-
};
|
|
1808
|
-
declare const DrawerFooter: {
|
|
1809
|
-
({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
1810
|
-
displayName: string;
|
|
1811
|
-
};
|
|
1812
|
-
declare const DrawerTitle: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
|
|
1813
|
-
declare const DrawerDescription: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
|
|
1820
|
+
declare const Card: React$1.NamedExoticComponent<Omit<CardProps, "ref"> & React$1.RefAttributes<HTMLElement>>;
|
|
1814
1821
|
|
|
1815
|
-
type MotionButtonProps$1 = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
1816
1822
|
/**
|
|
1817
|
-
*
|
|
1823
|
+
* @file checkbox.tsx
|
|
1824
|
+
* MD3 Expressive Checkbox — 2-state and tri-state support.
|
|
1825
|
+
* Spec: https://m3.material.io/components/checkbox/overview
|
|
1826
|
+
*/
|
|
1827
|
+
|
|
1828
|
+
/**
|
|
1829
|
+
* Tri-state value: `"unchecked"` | `"checked"` | `"indeterminate"`.
|
|
1830
|
+
*/
|
|
1831
|
+
type CheckboxState = "unchecked" | "checked" | "indeterminate";
|
|
1832
|
+
/**
|
|
1833
|
+
* Props for `Checkbox`. Supports boolean (`checked`/`onCheckedChange`)
|
|
1834
|
+
* and tri-state (`state`/`onStateChange`) modes.
|
|
1835
|
+
*/
|
|
1836
|
+
interface CheckboxProps {
|
|
1837
|
+
/** Controlled checked value (2-state mode). */
|
|
1838
|
+
checked?: boolean;
|
|
1839
|
+
/** Initial value for uncontrolled mode. @default false */
|
|
1840
|
+
defaultChecked?: boolean;
|
|
1841
|
+
/** Forces indeterminate rendering regardless of `checked`. */
|
|
1842
|
+
indeterminate?: boolean;
|
|
1843
|
+
/** Fired on checked change (simple mode). Not called when disabled. */
|
|
1844
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
1845
|
+
/** Controlled tri-state value. Takes priority over `checked`/`indeterminate`. */
|
|
1846
|
+
state?: CheckboxState;
|
|
1847
|
+
/** Fired on tri-state change. Cycles: unchecked → checked → indeterminate. */
|
|
1848
|
+
onStateChange?: (state: CheckboxState) => void;
|
|
1849
|
+
/** Disables interaction and applies 0.38 opacity. */
|
|
1850
|
+
disabled?: boolean;
|
|
1851
|
+
/** Error state — changes colors to `m3-error` and sets `aria-invalid`. */
|
|
1852
|
+
error?: boolean;
|
|
1853
|
+
/** Adjacent label text. Wraps checkbox + span in `<label>`. */
|
|
1854
|
+
label?: string;
|
|
1855
|
+
"aria-label"?: string;
|
|
1856
|
+
"aria-labelledby"?: string;
|
|
1857
|
+
"aria-describedby"?: string;
|
|
1858
|
+
"aria-required"?: boolean;
|
|
1859
|
+
/** Passed to the hidden `<input>` for form submission. */
|
|
1860
|
+
name?: string;
|
|
1861
|
+
/** Passed to the hidden `<input>` for form submission. */
|
|
1862
|
+
value?: string;
|
|
1863
|
+
/** ID for the hidden `<input>`. Auto-generated when `label` is set. */
|
|
1864
|
+
id?: string;
|
|
1865
|
+
/** Extra class names on the outermost wrapper. */
|
|
1866
|
+
className?: string;
|
|
1867
|
+
/** Ref pointing to the hidden `<input type="checkbox">`. */
|
|
1868
|
+
ref?: React$1.Ref<HTMLInputElement>;
|
|
1869
|
+
}
|
|
1870
|
+
/**
|
|
1871
|
+
* `TriStateCheckbox` props — requires `state` + `onStateChange`.
|
|
1872
|
+
*/
|
|
1873
|
+
interface TriStateCheckboxProps extends Omit<CheckboxProps, "checked" | "defaultChecked" | "onCheckedChange"> {
|
|
1874
|
+
state: CheckboxState;
|
|
1875
|
+
onStateChange: (state: CheckboxState) => void;
|
|
1876
|
+
}
|
|
1877
|
+
/**
|
|
1878
|
+
* MD3 Expressive Checkbox component.
|
|
1818
1879
|
*
|
|
1819
|
-
*
|
|
1820
|
-
*
|
|
1821
|
-
* - Ở hình thể mở rộng (khi `extended={true}`), phần nội dung truyền vào `children` chính là chuỗi Text được thể hiện cùng nút, và nó sẽ khiến nút button có label mặc định nên bạn có thể chém bớt tham số `aria-label`.
|
|
1822
|
-
* - Thuộc tính cờ `lowered` (chìm) giúp giáng cấp hiệu ứng tạo bóng Shadow của thẻ, rải mảng cái shadow theo phong thái MD3 "lowered" FAB;
|
|
1823
|
-
* sử dụng khi nút FAB này vốn bị bọc bên trong bề mặt chìm đè lên component gì khác mà vốn tụi nó đã nhún ở mực sâu (Ví dụ Bottom App Bar) để thiết lập Hierarchy hài hoà.
|
|
1880
|
+
* Supports 2-state and tri-state patterns. Fully animated per MD3 spec:
|
|
1881
|
+
* checkmark draw, indeterminate dash morph, container fill, state layer, and ripple.
|
|
1824
1882
|
*
|
|
1825
|
-
* @
|
|
1883
|
+
* @example
|
|
1884
|
+
* ```tsx
|
|
1885
|
+
* <Checkbox checked={isChecked} onCheckedChange={setIsChecked} label="Accept terms" />
|
|
1886
|
+
* <Checkbox state={parentState} onStateChange={setParentState} label="Select all" />
|
|
1887
|
+
* <Checkbox error label="Required field" aria-describedby="err-msg" />
|
|
1888
|
+
* ```
|
|
1889
|
+
* @see https://m3.material.io/components/checkbox/overview
|
|
1826
1890
|
*/
|
|
1827
|
-
|
|
1891
|
+
declare const Checkbox: React$1.NamedExoticComponent<Omit<CheckboxProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
|
|
1892
|
+
/**
|
|
1893
|
+
* MD3 Expressive Tri-State Checkbox.
|
|
1894
|
+
*
|
|
1895
|
+
* Convenience wrapper around `Checkbox` that enforces `state` + `onStateChange`.
|
|
1896
|
+
* Ideal for parent-child selection patterns.
|
|
1897
|
+
*
|
|
1898
|
+
* @example
|
|
1899
|
+
* ```tsx
|
|
1900
|
+
* <TriStateCheckbox state={parentState} onStateChange={setParentState} label="Select all" />
|
|
1901
|
+
* ```
|
|
1902
|
+
*/
|
|
1903
|
+
declare const TriStateCheckbox: React$1.NamedExoticComponent<Omit<TriStateCheckboxProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
|
|
1904
|
+
|
|
1905
|
+
declare const chipVariants: (props?: ({
|
|
1906
|
+
variant?: "input" | "filter" | "assist" | "suggestion" | null | undefined;
|
|
1907
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
1908
|
+
interface ChipProps extends Omit<React$1.ButtonHTMLAttributes<HTMLButtonElement>, "children"> {
|
|
1828
1909
|
/**
|
|
1829
|
-
*
|
|
1830
|
-
*
|
|
1910
|
+
* Chip variant.
|
|
1911
|
+
* - `assist` → Smart/automated actions. Flat by default, can be elevated.
|
|
1912
|
+
* - `filter` → Toggleable tag/filter. Shows animated checkmark when selected.
|
|
1913
|
+
* - `input` → Entity representation (tag, contact). Has optional avatar + remove button.
|
|
1914
|
+
* - `suggestion` → Contextual suggestions. Like assist, flat by default, can be elevated.
|
|
1915
|
+
* @default 'assist'
|
|
1831
1916
|
*/
|
|
1832
|
-
|
|
1917
|
+
variant?: VariantProps<typeof chipVariants>["variant"];
|
|
1833
1918
|
/**
|
|
1834
|
-
*
|
|
1835
|
-
*
|
|
1836
|
-
*
|
|
1837
|
-
* - `lg`: Large (96dp) — Trọng tâm thao tác quan trọng lớn nhát.
|
|
1838
|
-
* - `xl`: Extra-large (136dp) — Gây tiếng vang, dạng Spotlight cực bùng nổ của app.
|
|
1839
|
-
* @default "md"
|
|
1919
|
+
* Renders with elevation shadow (Level 1) and fills background with `surface-container-low`.
|
|
1920
|
+
* Applicable to `assist`, `filter` (unselected), and `suggestion` variants.
|
|
1921
|
+
* Source: AssistChipTokens.ElevatedContainerColor / SuggestionChipTokens.ElevatedContainerColor
|
|
1840
1922
|
*/
|
|
1841
|
-
|
|
1923
|
+
elevated?: boolean;
|
|
1842
1924
|
/**
|
|
1843
|
-
*
|
|
1844
|
-
*
|
|
1925
|
+
* Toggle/selection state.
|
|
1926
|
+
* - `filter`: selected → bg `secondary-container`, animated checkmark appears.
|
|
1927
|
+
* - `input`: selected → bg `secondary-container`.
|
|
1928
|
+
* Used for `role="checkbox"` (filter) / `aria-pressed` (input).
|
|
1845
1929
|
*/
|
|
1846
|
-
|
|
1930
|
+
selected?: boolean;
|
|
1847
1931
|
/**
|
|
1848
|
-
*
|
|
1849
|
-
*
|
|
1850
|
-
*
|
|
1932
|
+
* Disables the chip. Applies:
|
|
1933
|
+
* - `pointer-events-none` – no mouse/touch interaction
|
|
1934
|
+
* - `opacity-[0.38]` – DisabledLabelTextOpacity (0.38) per MD3 tokens
|
|
1935
|
+
* - `aria-disabled="true"`
|
|
1936
|
+
* - `tabIndex={-1}`
|
|
1851
1937
|
*/
|
|
1852
|
-
|
|
1938
|
+
disabled?: boolean;
|
|
1853
1939
|
/**
|
|
1854
|
-
*
|
|
1855
|
-
* Khuyến nghị là Text string thuần.
|
|
1940
|
+
* Visible label. Required. Can be a string or ReactNode.
|
|
1856
1941
|
*/
|
|
1857
|
-
|
|
1942
|
+
label: React$1.ReactNode;
|
|
1858
1943
|
/**
|
|
1859
|
-
*
|
|
1860
|
-
*
|
|
1861
|
-
*
|
|
1944
|
+
* Optional leading icon element (18×18px recommended).
|
|
1945
|
+
* For `filter` chips with `selected=true`, this is replaced by an animated checkmark.
|
|
1946
|
+
* For `assist`/`suggestion`: icon color → `primary`
|
|
1947
|
+
* For `input` (unselected): icon color → `on-surface-variant`
|
|
1862
1948
|
*/
|
|
1863
|
-
|
|
1949
|
+
leadingIcon?: React$1.ReactNode;
|
|
1864
1950
|
/**
|
|
1865
|
-
*
|
|
1866
|
-
*
|
|
1951
|
+
* Optional trailing icon element (18×18px recommended).
|
|
1952
|
+
* Color: `on-surface-variant` (unselected) / `on-secondary-container` (selected).
|
|
1867
1953
|
*/
|
|
1868
|
-
|
|
1954
|
+
trailingIcon?: React$1.ReactNode;
|
|
1869
1955
|
/**
|
|
1870
|
-
*
|
|
1871
|
-
*
|
|
1956
|
+
* Avatar element for `input` chips. Takes priority over `leadingIcon`.
|
|
1957
|
+
* Rendered as a 24×24px circle (InputChipTokens: AvatarSize = 24.dp, AvatarShape = CornerFull).
|
|
1872
1958
|
*/
|
|
1873
|
-
|
|
1959
|
+
avatar?: React$1.ReactNode;
|
|
1874
1960
|
/**
|
|
1875
|
-
*
|
|
1876
|
-
*
|
|
1961
|
+
* Callback when the trailing remove (×) button is activated on `input` chips.
|
|
1962
|
+
* When provided, a dedicated tabbable close button with `aria-label="Remove {label}"` is rendered.
|
|
1877
1963
|
*/
|
|
1878
|
-
|
|
1964
|
+
onRemove?: (e: React$1.MouseEvent<HTMLButtonElement>) => void;
|
|
1879
1965
|
}
|
|
1880
1966
|
/**
|
|
1881
|
-
*
|
|
1967
|
+
* MD3 Expressive Chip — 4-variant interactive tag component.
|
|
1882
1968
|
*
|
|
1883
|
-
* @
|
|
1969
|
+
* @remarks
|
|
1970
|
+
* - `filter` chips accept `selected` and render an animated checkmark.
|
|
1971
|
+
* - `input` chips accept `onRemove` to render a compound close button.
|
|
1972
|
+
* - `elevated` is supported on `assist`, `filter` (unselected), and `suggestion`.
|
|
1973
|
+
* - Fully accessible: `role="checkbox"` for filter, `role="group"` for compound chips.
|
|
1974
|
+
*
|
|
1975
|
+
* @example
|
|
1976
|
+
* ```tsx
|
|
1977
|
+
* // Assist chip
|
|
1978
|
+
* <Chip variant="assist" label="Share" onClick={share} />
|
|
1979
|
+
*
|
|
1980
|
+
* // Filter chip
|
|
1981
|
+
* <Chip variant="filter" label="Unread" selected={showUnread} onClick={toggle} />
|
|
1982
|
+
*
|
|
1983
|
+
* // Input chip with remove
|
|
1984
|
+
* <Chip variant="input" label="React" onRemove={() => removeTag("React")} />
|
|
1985
|
+
* ```
|
|
1986
|
+
*
|
|
1987
|
+
* @see https://m3.material.io/components/chips/overview
|
|
1884
1988
|
*/
|
|
1885
|
-
|
|
1989
|
+
declare const Chip: React$1.NamedExoticComponent<ChipProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1990
|
+
|
|
1991
|
+
interface CodeBlockProps {
|
|
1992
|
+
/** Raw code string to display and copy. */
|
|
1993
|
+
code: string;
|
|
1994
|
+
/** Language label in the header (presentational only). @default "React" */
|
|
1995
|
+
language?: string;
|
|
1996
|
+
/** Additional CSS classes for the outer wrapper. */
|
|
1997
|
+
className?: string;
|
|
1886
1998
|
/**
|
|
1887
|
-
*
|
|
1888
|
-
*
|
|
1999
|
+
* Pre-highlighted HTML from Shiki SSR.
|
|
2000
|
+
* Use `codeToHtml` with `themes: { light, dark }` for dual-theme support.
|
|
1889
2001
|
*/
|
|
1890
|
-
|
|
1891
|
-
/** Kẹp một nùi element. Mong chờ thả Node `<FAB>` vào đây.*/
|
|
1892
|
-
children: React$1.ReactNode;
|
|
1893
|
-
/** CSS Class hỗ trợ chỉnh override */
|
|
1894
|
-
className?: string;
|
|
2002
|
+
html?: string;
|
|
1895
2003
|
}
|
|
2004
|
+
declare function CodeBlock({ code, language, className, html, }: CodeBlockProps): react_jsx_runtime.JSX.Element;
|
|
2005
|
+
|
|
1896
2006
|
/**
|
|
1897
|
-
*
|
|
1898
|
-
*
|
|
1899
|
-
* Component dùng để cắm phao Neo cái FAB vào sát ở góc của screen kèm theo một cái offset space theo responsive an toàn mà lại trơn chu nhạy nhẽo.
|
|
1900
|
-
* Nhưng có quy tắc gốc đó là phần tử bao bọc cha mẹ của nó PHẢI có thẻ tag css `position: relative` (hoặc ở cấp tổ tiêm của trang nào đó phải đẻ gốc rễ ra posisition).
|
|
2007
|
+
* Thuộc tính của cội gốc Root `Dialog`. Chức năng làm gương phản hồi của Radix `Dialog.Root` qua dạng controlled state đóng hay mở.
|
|
1901
2008
|
*
|
|
1902
2009
|
* @example
|
|
1903
2010
|
* ```tsx
|
|
1904
|
-
*
|
|
1905
|
-
*
|
|
1906
|
-
*
|
|
1907
|
-
*
|
|
1908
|
-
*
|
|
1909
|
-
*
|
|
2011
|
+
* const [open, setOpen] = React.useState(false);
|
|
2012
|
+
*
|
|
2013
|
+
* <Dialog open={open} onOpenChange={setOpen}>
|
|
2014
|
+
* <DialogTrigger asChild>
|
|
2015
|
+
* <Button>Bấm Mở Dialog</Button>
|
|
2016
|
+
* </DialogTrigger>
|
|
2017
|
+
* <DialogContent>
|
|
2018
|
+
* <DialogHeader>
|
|
2019
|
+
* <DialogTitle>Bạn có muốn phiêu lưu không?</DialogTitle>
|
|
2020
|
+
* </DialogHeader>
|
|
2021
|
+
* <DialogBody>Chuẩn bị lên đồ rời khỏi hang nào.</DialogBody>
|
|
2022
|
+
* <DialogFooter>
|
|
2023
|
+
* <Button onClick={() => setOpen(false)} variant="text">Đóng</Button>
|
|
2024
|
+
* </DialogFooter>
|
|
2025
|
+
* </DialogContent>
|
|
2026
|
+
* </Dialog>
|
|
1910
2027
|
* ```
|
|
2028
|
+
*/
|
|
2029
|
+
interface DialogProps {
|
|
2030
|
+
/** Whether the dialog is open (controlled). Omit for uncontrolled. */
|
|
2031
|
+
open?: boolean;
|
|
2032
|
+
/** Called when the open state should change. */
|
|
2033
|
+
onOpenChange?: (open: boolean) => void;
|
|
2034
|
+
/** Dialog trigger + content. */
|
|
2035
|
+
children: React$1.ReactNode;
|
|
2036
|
+
}
|
|
2037
|
+
/**
|
|
2038
|
+
* Các props được tiêm vào component bao ngoài Container `DialogContent` thuộc dạng Normal Standard.
|
|
1911
2039
|
*
|
|
1912
|
-
* @see {@link
|
|
1913
|
-
* @see https://m3.material.io/components/floating-action-button/guidelines
|
|
2040
|
+
* @see {@link DialogContent}
|
|
1914
2041
|
*/
|
|
1915
|
-
|
|
2042
|
+
interface DialogContentProps extends React$1.ComponentPropsWithoutRef<typeof RadixDialog.Content> {
|
|
2043
|
+
/** Vô hình đi đi nút Close dấu (X) góc phải trên. @default false */
|
|
2044
|
+
hideCloseButton?: boolean;
|
|
2045
|
+
className?: string;
|
|
2046
|
+
}
|
|
2047
|
+
/**
|
|
2048
|
+
* Thuộc tính Props của biến thể `DialogFullScreenContent` chuyên dụng dành riêng cho Mode Full-Screen tràn màn hình.
|
|
2049
|
+
*
|
|
2050
|
+
* @remarks
|
|
2051
|
+
* Những hộp thoại Full-screen có biệt tài tự nới rộng và xâm chiếm cả bề ngang dọc nguyên thiết bị. Nó còn thiết lập một đường Top App bar (thanh ngang đỉnh)
|
|
2052
|
+
* kẹp chung cả 1 nhãn title mô tả đỉnh, một nút icon X dẹp ở rìa, thêm luôn hẳn cái nút Confirm cực xịn xò.
|
|
2053
|
+
*
|
|
2054
|
+
* @see {@link DialogFullScreenContent}
|
|
2055
|
+
* @see https://m3.material.io/components/dialogs/guidelines#full-screen
|
|
2056
|
+
*/
|
|
2057
|
+
interface DialogFullScreenContentProps extends React$1.ComponentPropsWithoutRef<typeof RadixDialog.Content> {
|
|
2058
|
+
/** Nhãn Title nằm vùng khu vực thanh ngang Top Bar. */
|
|
2059
|
+
title?: string;
|
|
2060
|
+
/** Chữ viết đính kèm bên trong cục Nút nhấn thao tác ngay trên góc Top App bar đó (VD: "Lưu lại", "Save"). */
|
|
2061
|
+
actionLabel?: string;
|
|
2062
|
+
/** Hàm handler phát động cờ để kích chạy tính năng lưu, xác nhận kia. */
|
|
2063
|
+
onAction?: () => void;
|
|
2064
|
+
/** Rạch một làn kẻ chia cách thân body nội dung cuộn bên dưới và dòng App bar cố thủ bên trên. @default false */
|
|
2065
|
+
showDivider?: boolean;
|
|
2066
|
+
className?: string;
|
|
2067
|
+
}
|
|
2068
|
+
/**
|
|
2069
|
+
* Gốc rễ Root của Component Dialog — trạc lấp lên cái module `Dialog.Root` của nhà Radix.
|
|
2070
|
+
*
|
|
2071
|
+
* @remarks Cơ năng hoạt động ở chế độ Controlled (kiểm soát vòng đời ở Client) xài mảng `open`/`onOpenChange`.
|
|
2072
|
+
* Tuy thế bạn nếu không thích thì đừng có xài truyền mấy cái Props tay đôi trên, mà bỏ xài kiểu Untracked thông qua cái cục `DialogTrigger` là đủ.
|
|
2073
|
+
*/
|
|
2074
|
+
declare const Dialog: {
|
|
2075
|
+
({ open, onOpenChange, children }: DialogProps): react_jsx_runtime.JSX.Element;
|
|
2076
|
+
displayName: string;
|
|
2077
|
+
};
|
|
2078
|
+
/** Bộ Trigger gieo phát đà giúp tắt bật cờ State đóng mở của Dialog con, dùng kèm kĩ năng nhét thông qua cái cầu `asChild`. */
|
|
2079
|
+
declare const DialogTrigger: React$1.ForwardRefExoticComponent<RadixDialog.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2080
|
+
declare const DialogPortal: {
|
|
2081
|
+
({ open, children, }: {
|
|
2082
|
+
open?: boolean;
|
|
2083
|
+
children: React$1.ReactNode;
|
|
2084
|
+
}): react_jsx_runtime.JSX.Element;
|
|
2085
|
+
displayName: string;
|
|
2086
|
+
};
|
|
2087
|
+
declare const DialogOverlay: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogOverlayProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
2088
|
+
declare const DialogContent: React$1.ForwardRefExoticComponent<DialogContentProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
2089
|
+
declare const DialogIcon: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
|
|
2090
|
+
declare const DialogHeader: {
|
|
2091
|
+
({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
2092
|
+
displayName: string;
|
|
2093
|
+
};
|
|
2094
|
+
declare const DialogTitle: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
|
|
2095
|
+
declare const DialogDescription: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
|
|
2096
|
+
declare const DialogBody: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
|
|
2097
|
+
declare const DialogFooter: {
|
|
2098
|
+
({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
2099
|
+
displayName: string;
|
|
2100
|
+
};
|
|
2101
|
+
declare const DialogClose: React$1.ForwardRefExoticComponent<RadixDialog.DialogCloseProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2102
|
+
declare const DialogFullScreenContent: React$1.ForwardRefExoticComponent<DialogFullScreenContentProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
2103
|
+
|
|
1916
2104
|
/**
|
|
1917
|
-
*
|
|
2105
|
+
* @file divider.tsx
|
|
1918
2106
|
*
|
|
1919
|
-
*
|
|
1920
|
-
* mang nhiều màu sắc Color role khác biệt, cung cấp một sức nén cho Label để kéo toẹt cái ống dài ra (gọi là Dạng Mở Rộng - Extended) tạo nên hành động sinh động,
|
|
1921
|
-
* Trạng thái load/nhấp hiện xuất cùng animation thu scale thoát cảnh bắt mắt đầy nghệ thuật.
|
|
2107
|
+
* MD3 Expressive Divider component.
|
|
1922
2108
|
*
|
|
1923
|
-
*
|
|
1924
|
-
* - Chỉ định bắt buộc `aria-label` cho những mẫu icon bị đơn côi trơ trọi (icon-only FABs).
|
|
1925
|
-
* - Trường hợp xài mode Mở Rộng qua việc truyền hàm `extended={true}`, nút FAB này tự ngộ nhận thân thế, lấy `children` dùng làm Aria label luôn hễ như `children` đó đang chứa text string.
|
|
1926
|
-
* Khi ấy bạn tha hồ cắt bỏ thuộc tính `aria-label` ra.
|
|
1927
|
-
* - Lúc cho biến mất (`visible={false}`), bộ nút tung chiêu lùi về sau làm quả rút bóng thoát Scale-out qua effect spring uyển chuyển.
|
|
1928
|
-
* - Sài kèm `FABPosition` bao đùm nó lại nếu bạn muốn xích nó cố định ngấm chân sâu góc màn hình hiển thị.
|
|
2109
|
+
* - `Divider` → A thin line that groups content in lists and layouts.
|
|
1929
2110
|
*
|
|
1930
|
-
* @
|
|
1931
|
-
*
|
|
1932
|
-
*
|
|
1933
|
-
*
|
|
2111
|
+
* @remarks
|
|
2112
|
+
* Token references (Kotlin source — DividerTokens.kt v0_117):
|
|
2113
|
+
* Color = ColorSchemeKeyTokens.OutlineVariant → bg-m3-outline-variant / text-m3-outline-variant
|
|
2114
|
+
* Thickness = 1.0.dp → h-px (flat horizontal) | w-px (flat vertical) | strokeWidth={1} (wavy SVG)
|
|
1934
2115
|
*
|
|
1935
|
-
*
|
|
1936
|
-
*
|
|
1937
|
-
*
|
|
1938
|
-
*
|
|
1939
|
-
*
|
|
1940
|
-
* onClick={() => setOpen(!isOpen)}
|
|
1941
|
-
* >
|
|
1942
|
-
* Viết tâm thư
|
|
1943
|
-
* </FAB>
|
|
2116
|
+
* Variants:
|
|
2117
|
+
* - "full-bleed" → spans full width, no indent
|
|
2118
|
+
* - "inset" → leading indent (16dp standard / 72dp after-icon via insetStart)
|
|
2119
|
+
* - "middle-inset" → 16dp indent both sides
|
|
2120
|
+
* - "subheader" → same as full-bleed (label provided externally)
|
|
1944
2121
|
*
|
|
1945
|
-
*
|
|
1946
|
-
* <
|
|
1947
|
-
*
|
|
1948
|
-
* size="lg"
|
|
1949
|
-
* loading={isUploading}
|
|
1950
|
-
* colorStyle="secondary"
|
|
1951
|
-
* aria-label="Upload Files lên mây xanh"
|
|
1952
|
-
* />
|
|
2122
|
+
* Shapes:
|
|
2123
|
+
* - "flat" → straight 1px line rendered as <m.div> (default)
|
|
2124
|
+
* - "wavy" → sinusoidal SVG wave via <m.svg> + buildWavePath helper (horizontal only)
|
|
1953
2125
|
*
|
|
1954
|
-
*
|
|
1955
|
-
*
|
|
1956
|
-
*
|
|
1957
|
-
*
|
|
1958
|
-
*
|
|
2126
|
+
* Architecture:
|
|
2127
|
+
* - Styling: `cn` (clsx/tailwind-merge) + static Tailwind classes only
|
|
2128
|
+
* - Animation: Framer Motion LazyMotion/domMax, scaleX/scaleY spring entrance
|
|
2129
|
+
* - Wavy: SVG path generated by pure-JS `buildWavePath()` (cubic Bézier sine approx)
|
|
2130
|
+
* Uses ResizeObserver (via useContainerWidth) to measure container width so
|
|
2131
|
+
* the path has precise bounds and leading/trailing ends are properly rounded.
|
|
2132
|
+
* - A11y: role="separator", aria-orientation, aria-hidden when decorative
|
|
1959
2133
|
*
|
|
1960
|
-
* @see https://m3.material.io/components/
|
|
2134
|
+
* @see https://m3.material.io/components/divider/overview
|
|
1961
2135
|
*/
|
|
1962
|
-
declare const FAB: React$1.NamedExoticComponent<Omit<FABProps, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
|
|
1963
2136
|
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
*
|
|
1967
|
-
* Nếu bỏ qua thuộc tính `label`, item sẽ render dạng ô vuông chỉ có icon.
|
|
1968
|
-
*/
|
|
1969
|
-
interface FABMenuItemData {
|
|
1970
|
-
/** Một ID duy nhất để dùng cho key react và quản lý focus. */
|
|
1971
|
-
id: string;
|
|
1972
|
-
/** Label hiển thị cạnh icon (tuỳ chọn). Không thêm thuộc tính này nếu muốn hiển thị chỉ có icon (icon-only). */
|
|
1973
|
-
label?: string;
|
|
1974
|
-
/** Node của Icon — thường là một component SVG Icon duy nhất. */
|
|
1975
|
-
icon: React$1.ReactNode;
|
|
1976
|
-
/** Gọi hàm ngay lập tức khi item được kích hoạt (click hoặc nhấn Enter/Phím cách). */
|
|
1977
|
-
onClick: () => void;
|
|
2137
|
+
type SafeHTMLDivAttrs = Omit<React$1.HTMLAttributes<HTMLDivElement>, "onDrag" | "onDragStart" | "onDragEnd" | "onDragEnter" | "onDragLeave" | "onDragOver" | "onDrop">;
|
|
2138
|
+
interface DividerProps extends SafeHTMLDivAttrs {
|
|
1978
2139
|
/**
|
|
1979
|
-
*
|
|
1980
|
-
*
|
|
1981
|
-
*
|
|
2140
|
+
* Visual variant controlling indentation.
|
|
2141
|
+
* - "full-bleed" → no indent, spans full container width/height (default)
|
|
2142
|
+
* - "inset" → leading indent only (use `insetStart` to control amount)
|
|
2143
|
+
* - "middle-inset" → 16px indent on both sides
|
|
2144
|
+
* - "subheader" → alias for full-bleed, used before section labels
|
|
2145
|
+
* @default "full-bleed"
|
|
1982
2146
|
*/
|
|
1983
|
-
|
|
1984
|
-
/** Thêm CSS classes bổ sung dùng cho wrapper chính của item. */
|
|
1985
|
-
className?: string;
|
|
1986
|
-
}
|
|
1987
|
-
/**
|
|
1988
|
-
* Các props điều khiển Component chính `FABMenu`.
|
|
1989
|
-
*
|
|
1990
|
-
* @remarks
|
|
1991
|
-
* FABMenu quản lý vòng đời trạng thái mở/đóng menu (open/close), quản lý focus, điều khiển phím,
|
|
1992
|
-
* và điều hướng hiệu ứng chuyển động. Trạng thái `expanded` được truyền từ ngoài (controlled state),
|
|
1993
|
-
* do đó bạn có thể quản lý qua react state, hoặc dùng router hay business logic khác.
|
|
1994
|
-
*/
|
|
1995
|
-
interface FABMenuProps {
|
|
1996
|
-
/** FAB Menu có đang mở (mở rộng)/hiển thị hay không. */
|
|
1997
|
-
expanded: boolean;
|
|
1998
|
-
/** Hàm handler kích hoạt khi Toggle FAB được người dùng tương tác, hoặc khi dismiss backdrop. */
|
|
1999
|
-
onToggle: (expanded: boolean) => void;
|
|
2000
|
-
/** Danh sách các action items (Spec MD3 đề nghị 2-6 item là hoàn hảo). */
|
|
2001
|
-
items: FABMenuItemData[];
|
|
2147
|
+
variant?: "full-bleed" | "inset" | "middle-inset" | "subheader";
|
|
2002
2148
|
/**
|
|
2003
|
-
*
|
|
2004
|
-
*
|
|
2149
|
+
* Orientation of the divider line.
|
|
2150
|
+
* - "horizontal" → renders as `h-px w-full` bar (default)
|
|
2151
|
+
* - "vertical" → renders as `w-px h-full` column
|
|
2152
|
+
* Note: `shape="wavy"` is not supported with orientation="vertical".
|
|
2153
|
+
* @default "horizontal"
|
|
2005
2154
|
*/
|
|
2006
|
-
|
|
2155
|
+
orientation?: "horizontal" | "vertical";
|
|
2007
2156
|
/**
|
|
2008
|
-
*
|
|
2009
|
-
*
|
|
2157
|
+
* Shape of the divider line.
|
|
2158
|
+
* - "flat" → straight 1px line rendered as `<div>` (default)
|
|
2159
|
+
* - "wavy" → sinusoidal SVG wave (horizontal orientation only)
|
|
2160
|
+
*
|
|
2161
|
+
* When `shape="wavy"` and `orientation="vertical"`, silently falls back to
|
|
2162
|
+
* `shape="flat"` and emits a `console.warn`.
|
|
2163
|
+
* @default "flat"
|
|
2010
2164
|
*/
|
|
2011
|
-
|
|
2165
|
+
shape?: "flat" | "wavy";
|
|
2012
2166
|
/**
|
|
2013
|
-
*
|
|
2014
|
-
* -
|
|
2015
|
-
* -
|
|
2016
|
-
*
|
|
2017
|
-
* @default "
|
|
2167
|
+
* Leading inset size for the "inset" variant.
|
|
2168
|
+
* - "standard" → 16px (`ml-4`)
|
|
2169
|
+
* - "icon" → 72px (`ml-[72px]`) — use when list items have leading icons/avatars
|
|
2170
|
+
* Only applies when `variant="inset"`.
|
|
2171
|
+
* @default "standard"
|
|
2018
2172
|
*/
|
|
2019
|
-
|
|
2020
|
-
/** Thuộc tính cho CSS component root để đè. */
|
|
2021
|
-
className?: string;
|
|
2173
|
+
insetStart?: "standard" | "icon";
|
|
2022
2174
|
/**
|
|
2023
|
-
*
|
|
2024
|
-
*
|
|
2175
|
+
* Wavy shape visual parameters. Only applies when `shape="wavy"`.
|
|
2176
|
+
* All values are in pixels.
|
|
2025
2177
|
*/
|
|
2026
|
-
|
|
2178
|
+
waveConfig?: {
|
|
2179
|
+
/**
|
|
2180
|
+
* Peak displacement from the center line.
|
|
2181
|
+
* @default 2
|
|
2182
|
+
*/
|
|
2183
|
+
amplitude?: number;
|
|
2184
|
+
/**
|
|
2185
|
+
* Pixels per full sine cycle.
|
|
2186
|
+
* @default 32
|
|
2187
|
+
*/
|
|
2188
|
+
wavelength?: number;
|
|
2189
|
+
/**
|
|
2190
|
+
* Thickness of the wave stroke in pixels.
|
|
2191
|
+
* @default 1
|
|
2192
|
+
*/
|
|
2193
|
+
strokeWidth?: number;
|
|
2194
|
+
};
|
|
2027
2195
|
/**
|
|
2028
|
-
*
|
|
2029
|
-
*
|
|
2030
|
-
* @default
|
|
2196
|
+
* When true, marks the divider as decorative (`aria-hidden="true"`).
|
|
2197
|
+
* Use when the divider is purely visual with no semantic meaning.
|
|
2198
|
+
* @default false
|
|
2031
2199
|
*/
|
|
2032
|
-
|
|
2033
|
-
/** Bắt buộc truyền `aria-label` cho ToggleFAB để đáp ứng Accessibility. */
|
|
2034
|
-
"aria-label"?: string;
|
|
2035
|
-
}
|
|
2036
|
-
/**
|
|
2037
|
-
* Props thuộc component `ToggleFAB` đứng độc lập.
|
|
2038
|
-
*/
|
|
2039
|
-
interface ToggleFABProps {
|
|
2040
|
-
/** Nút có đang trong trạng thái được kích hoạt check (expanded). */
|
|
2041
|
-
expanded: boolean;
|
|
2042
|
-
/** Gọi khi xảy ra sự kiện Toggle nút. */
|
|
2043
|
-
onToggle: (expanded: boolean) => void;
|
|
2200
|
+
decorative?: boolean;
|
|
2044
2201
|
/**
|
|
2045
|
-
*
|
|
2046
|
-
*
|
|
2047
|
-
*
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
* ```
|
|
2052
|
-
*/
|
|
2053
|
-
icon: (progress: number) => React$1.ReactNode;
|
|
2054
|
-
/** Vai trò màu container chuẩn MD3. @default "primary" */
|
|
2055
|
-
colorVariant?: "primary" | "secondary" | "tertiary";
|
|
2056
|
-
/** Kích thước của cục FAB ban đầu (Sau khi nhấn sẽ thu tròn). @default "baseline" */
|
|
2057
|
-
fabSize?: "baseline" | "medium" | "large";
|
|
2058
|
-
/** CSS Class linh tinh bổ sung thêm. */
|
|
2059
|
-
className?: string;
|
|
2060
|
-
/** Thuộc tính đọc thẻ accessibility. Bắt buộc có. */
|
|
2061
|
-
"aria-label"?: string;
|
|
2062
|
-
/** Kiểm soát giá trị của ID để link với menu qua aria-controls. */
|
|
2063
|
-
"aria-controls"?: string;
|
|
2064
|
-
/** Trỏ id component. */
|
|
2065
|
-
id?: string;
|
|
2066
|
-
}
|
|
2067
|
-
/**
|
|
2068
|
-
* Props thuộc component một món item đơn lẻ `FABMenuItem`.
|
|
2069
|
-
*/
|
|
2070
|
-
interface FABMenuItemProps {
|
|
2071
|
-
/** Node của icon hiện. */
|
|
2072
|
-
icon: React$1.ReactNode;
|
|
2073
|
-
/** Tên nhãn mô tả kế bên icon cho item này. Hoặc ẩn nó đi nếu không mong đợi. */
|
|
2074
|
-
label?: string;
|
|
2075
|
-
/** Hàm bắn ra khi item được kích. */
|
|
2076
|
-
onClick: () => void;
|
|
2077
|
-
/** Vô hiệu hóa hành vi tương tác item mà vẫn cho phép bàn phím tab bấm dính lấy focus. @default false */
|
|
2078
|
-
disabled?: boolean;
|
|
2079
|
-
/** Container tông màu. @default "primary" */
|
|
2080
|
-
colorVariant?: "primary" | "secondary" | "tertiary";
|
|
2081
|
-
/** Custom CSS className. */
|
|
2082
|
-
className?: string;
|
|
2083
|
-
/** Số index liệt kê trong mảng dùng tính render delay (Dành cho animation cấu trúc `custom`). */
|
|
2084
|
-
index?: number;
|
|
2085
|
-
/** Tổng danh sách items có mảng. */
|
|
2086
|
-
totalItems?: number;
|
|
2087
|
-
/** Giá trị logic `tabIndex` dùng điều khiển thao tác phím Tab thủ công. */
|
|
2088
|
-
tabIndex?: number;
|
|
2089
|
-
}
|
|
2090
|
-
/**
|
|
2091
|
-
* Nút Toggle FAB (Biến hình) có thể được dùng độc lập đứng một mình (standalone) hoặc kết nối để kích hoạt mở cả nùi Menu ở dưới con `FABMenu`.
|
|
2092
|
-
*
|
|
2093
|
-
* Sức ép hiệu ứng kích thước khung nền sẽ chuyển từ vuôn/vát cạnh sang hình tròn hẵn (square → circle), chuyển biến cả màu sắc
|
|
2094
|
-
* khi mà cờ `expanded` chuyển tiếp từ false sang → true.
|
|
2095
|
-
*
|
|
2096
|
-
* @example
|
|
2097
|
-
* ```tsx
|
|
2098
|
-
* const [open, setOpen] = React.useState(false);
|
|
2099
|
-
* <ToggleFAB
|
|
2100
|
-
* expanded={open}
|
|
2101
|
-
* onToggle={setOpen}
|
|
2102
|
-
* colorVariant="primary"
|
|
2103
|
-
* aria-label="Toggle actions"
|
|
2104
|
-
* icon={(progress) => progress > 0.5 ? <Icon name="close" /> : <Icon name="add" />}
|
|
2105
|
-
* />
|
|
2106
|
-
* ```
|
|
2107
|
-
*/
|
|
2108
|
-
declare const ToggleFAB: React$1.NamedExoticComponent<ToggleFABProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2202
|
+
* When true, plays an entrance animation (scaleX/scaleY from 0→1).
|
|
2203
|
+
* Automatically disabled when user prefers reduced motion.
|
|
2204
|
+
* @default true
|
|
2205
|
+
*/
|
|
2206
|
+
animate?: boolean;
|
|
2207
|
+
}
|
|
2109
2208
|
/**
|
|
2110
|
-
*
|
|
2209
|
+
* Generates an SVG path `d` string for a sinusoidal wave between two X bounds.
|
|
2210
|
+
* Uses cubic Bézier approximation of a sine curve for smooth rendering.
|
|
2211
|
+
* The error vs. a true sine is < 0.2%.
|
|
2111
2212
|
*
|
|
2112
|
-
*
|
|
2113
|
-
*
|
|
2114
|
-
* Component chứa gợn sóng MD3 Ripple cùng 48dp chuẩn vùng target đụng diện chuẩn WCAG 2.5.5 cho cảm ứng.
|
|
2213
|
+
* Each half-cycle alternates between crest (+amplitude) and trough (-amplitude).
|
|
2214
|
+
* Control points are placed at 1/3 and 2/3 of each half-cycle for accuracy.
|
|
2115
2215
|
*
|
|
2116
|
-
* @
|
|
2117
|
-
*
|
|
2118
|
-
*
|
|
2119
|
-
*
|
|
2216
|
+
* @param startX - X coordinate where the path begins (e.g. capWidth = strokeWidth/2)
|
|
2217
|
+
* @param endX - X coordinate where the path ends (e.g. containerWidth - capWidth)
|
|
2218
|
+
* @param amplitude - Peak displacement from center line (px). Default: 2
|
|
2219
|
+
* @param wavelength - Pixels per full sine cycle. Default: 32
|
|
2220
|
+
* @param yCenter - Y coordinate of the wave center line. Default: 4
|
|
2221
|
+
* @returns SVG path `d` attribute string, or "" when startX >= endX
|
|
2222
|
+
*
|
|
2223
|
+
* @example
|
|
2224
|
+
* buildWavePath(0.5, 499.5, 2, 32, 4)
|
|
2225
|
+
* // → "M 0.5,4 C 11.17,... 500,4 ..."
|
|
2120
2226
|
*/
|
|
2121
|
-
declare function
|
|
2227
|
+
declare function buildWavePath(startX: number, endX: number, amplitude?: number, wavelength?: number, yCenter?: number): string;
|
|
2122
2228
|
/**
|
|
2123
|
-
* MD3 Expressive
|
|
2229
|
+
* MD3 Expressive Divider — a thin line that groups content in lists and layouts.
|
|
2124
2230
|
*
|
|
2125
|
-
*
|
|
2231
|
+
* Supports four layout variants (full-bleed, inset, middle-inset, subheader),
|
|
2232
|
+
* two orientations (horizontal, vertical), and two shape modes (flat, wavy).
|
|
2126
2233
|
*
|
|
2127
|
-
*
|
|
2128
|
-
*
|
|
2129
|
-
* - trang bị thẻ `role="menuitem"` trên mảng items thành phần con
|
|
2130
|
-
* - Lifecycle Focus cho trải nghiệm hoàn mỹ: Mở phím bật -> Focus thẳng lên item cao/thấp đầu/cuối cùng menu; Đóng tắt menu -> Focus trả về ngược lại ToggleFAB
|
|
2131
|
-
* - Tính năng Bàn Phím: Lách Escape nhấn tắt nhắm, Nhấn phím hướng lên-xuống(ArrowUp/Down) để di chuyển, Móc Tab(hoặc là Shift+Tab) nhảy lăng quăng qua các item.
|
|
2234
|
+
* The wavy shape renders a sinusoidal SVG wave and is only supported with
|
|
2235
|
+
* `orientation="horizontal"`.
|
|
2132
2236
|
*
|
|
2133
2237
|
* @example
|
|
2134
2238
|
* ```tsx
|
|
2135
|
-
*
|
|
2239
|
+
* // Default flat full-bleed horizontal divider
|
|
2240
|
+
* <Divider />
|
|
2136
2241
|
*
|
|
2137
|
-
*
|
|
2138
|
-
*
|
|
2139
|
-
* { id: 'edit', icon: <Icon name="edit" />, label: 'Chỉnh sửa', onClick: () => console.log('Edit') },
|
|
2140
|
-
* { id: 'delete', icon: <Icon name="delete" />, label: 'Xóa bớt', disabled: true, onClick: () => {} }
|
|
2141
|
-
* ];
|
|
2242
|
+
* // Inset after icon list items
|
|
2243
|
+
* <Divider variant="inset" insetStart="icon" />
|
|
2142
2244
|
*
|
|
2143
|
-
*
|
|
2144
|
-
*
|
|
2145
|
-
*
|
|
2146
|
-
*
|
|
2147
|
-
*
|
|
2148
|
-
*
|
|
2149
|
-
*
|
|
2150
|
-
* />
|
|
2245
|
+
* // Vertical separator between panes
|
|
2246
|
+
* <Divider orientation="vertical" />
|
|
2247
|
+
*
|
|
2248
|
+
* // Wavy expressive divider
|
|
2249
|
+
* <Divider shape="wavy" />
|
|
2250
|
+
*
|
|
2251
|
+
* // Wavy with custom wave config
|
|
2252
|
+
* <Divider shape="wavy" waveConfig={{ amplitude: 5, wavelength: 24 }} />
|
|
2253
|
+
*
|
|
2254
|
+
* // Decorative (no a11y semantics)
|
|
2255
|
+
* <Divider decorative />
|
|
2256
|
+
*
|
|
2257
|
+
* // No entrance animation
|
|
2258
|
+
* <Divider animate={false} />
|
|
2259
|
+
*
|
|
2260
|
+
* // Middle-inset wavy divider
|
|
2261
|
+
* <Divider variant="middle-inset" shape="wavy" />
|
|
2151
2262
|
* ```
|
|
2152
2263
|
*
|
|
2153
|
-
* @see https://m3.material.io/components/
|
|
2264
|
+
* @see https://m3.material.io/components/divider/overview
|
|
2154
2265
|
*/
|
|
2155
|
-
declare
|
|
2266
|
+
declare const Divider: React$1.NamedExoticComponent<DividerProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
2267
|
+
|
|
2268
|
+
interface DrawerProps {
|
|
2269
|
+
open?: boolean;
|
|
2270
|
+
onOpenChange?: (open: boolean) => void;
|
|
2271
|
+
children: React$1.ReactNode;
|
|
2272
|
+
}
|
|
2273
|
+
interface DrawerContentProps extends Omit<React$1.ComponentPropsWithoutRef<typeof RadixDialog.Content>, "asChild"> {
|
|
2274
|
+
/** Chiều cao tối đa (vh). Mặc định 90vh */
|
|
2275
|
+
maxHeight?: string;
|
|
2276
|
+
/** Ẩn drag handle */
|
|
2277
|
+
hideHandle?: boolean;
|
|
2278
|
+
/** Ẩn nút đóng */
|
|
2279
|
+
hideCloseButton?: boolean;
|
|
2280
|
+
className?: string;
|
|
2281
|
+
}
|
|
2282
|
+
declare const Drawer: {
|
|
2283
|
+
({ open, onOpenChange, children }: DrawerProps): react_jsx_runtime.JSX.Element;
|
|
2284
|
+
displayName: string;
|
|
2285
|
+
};
|
|
2286
|
+
declare const DrawerTrigger: React$1.ForwardRefExoticComponent<RadixDialog.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2287
|
+
declare const DrawerClose: React$1.ForwardRefExoticComponent<RadixDialog.DialogCloseProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2288
|
+
declare const DrawerPortal: ({ open, children, }: {
|
|
2289
|
+
open?: boolean;
|
|
2290
|
+
children: React$1.ReactNode;
|
|
2291
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
2292
|
+
declare const DrawerOverlay: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogOverlayProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
2293
|
+
declare const DrawerContent: React$1.ForwardRefExoticComponent<DrawerContentProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
2294
|
+
declare const DrawerHeader: {
|
|
2295
|
+
({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
2296
|
+
displayName: string;
|
|
2297
|
+
};
|
|
2298
|
+
declare const DrawerFooter: {
|
|
2299
|
+
({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
|
|
2300
|
+
displayName: string;
|
|
2301
|
+
};
|
|
2302
|
+
declare const DrawerTitle: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
|
|
2303
|
+
declare const DrawerDescription: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
|
|
2156
2304
|
|
|
2157
2305
|
/**
|
|
2158
2306
|
* Props cho component {@link Icon}.
|
|
@@ -2194,183 +2342,53 @@ interface IconProps extends React$1.HTMLAttributes<HTMLSpanElement> {
|
|
|
2194
2342
|
* @default 24
|
|
2195
2343
|
*/
|
|
2196
2344
|
opticalSize?: 20 | 24 | 40 | 48;
|
|
2197
|
-
/**
|
|
2198
|
-
* Ghi đè trực tiếp `font-size` bằng px. Trục `opsz` vẫn sẽ tuân theo thuộc tính `opticalSize`.
|
|
2199
|
-
* @example size={18} opticalSize={20}
|
|
2200
|
-
*/
|
|
2201
|
-
size?: number | "inherit";
|
|
2202
|
-
/**
|
|
2203
|
-
* Kích hoạt hiệu ứng spring mượt mà khi chuyển đổi giá trị FILL (sử dụng cấu hình `SPRING_TRANSITION_FAST`).
|
|
2204
|
-
* Yêu cầu dependency `motion/react`.
|
|
2205
|
-
* @default false
|
|
2206
|
-
* @example <Icon name="favorite" fill={isLiked ? 1 : 0} animateFill />
|
|
2207
|
-
*/
|
|
2208
|
-
animateFill?: boolean;
|
|
2209
|
-
}
|
|
2210
|
-
/**
|
|
2211
|
-
* Component hiển thị Icon bằng Material Symbols (variable font).
|
|
2212
|
-
*
|
|
2213
|
-
* Hãy đảm bảo đã import CSS chứa font trước khi dùng:
|
|
2214
|
-
* ```ts
|
|
2215
|
-
* import '@bug-on/md3-react/material-symbols.css';
|
|
2216
|
-
* ```
|
|
2217
|
-
*
|
|
2218
|
-
* @remarks
|
|
2219
|
-
* - Đặt tên icon dùng snake_case: `"arrow_forward"`, KHÔNG PHẢI `"ArrowForward"`.
|
|
2220
|
-
* - Thuộc tính `aria-hidden="true"` được tự động thêm vào — bạn cần thêm label đọc bằng giọng nói (accessible labels) ở phần tử cha.
|
|
2221
|
-
*
|
|
2222
|
-
* @example
|
|
2223
|
-
* ```tsx
|
|
2224
|
-
* // Icon cơ bản
|
|
2225
|
-
* <Icon name="home" />
|
|
2226
|
-
*
|
|
2227
|
-
* // Tùy chỉnh trực quan (filled, nét dày)
|
|
2228
|
-
* <Icon name="favorite" variant="rounded" fill={1} weight={300} />
|
|
2229
|
-
*
|
|
2230
|
-
* // Animate khi trạng thái thay đổi
|
|
2231
|
-
* <Icon name="bookmark" fill={saved ? 1 : 0} animateFill />
|
|
2232
|
-
*
|
|
2233
|
-
* // Đổi kích thước icon cụ thể
|
|
2234
|
-
* <Icon name="close" size={18} opticalSize={20} />
|
|
2235
|
-
*
|
|
2236
|
-
* // Kết hợp với các component khác
|
|
2237
|
-
* <Button icon={<Icon name="add" />}>Thêm vào giỏ</Button>
|
|
2238
|
-
* ```
|
|
2239
|
-
*
|
|
2240
|
-
* @see https://fonts.google.com/icons
|
|
2241
|
-
* @see https://m3.material.io/styles/icons/overview
|
|
2242
|
-
*/
|
|
2243
|
-
declare const Icon: React$1.NamedExoticComponent<IconProps & React$1.RefAttributes<HTMLSpanElement>>;
|
|
2244
|
-
|
|
2245
|
-
/**
|
|
2246
|
-
* @file icon-button.tsx
|
|
2247
|
-
*
|
|
2248
|
-
* MD3 Expressive Icon Button component.
|
|
2249
|
-
*
|
|
2250
|
-
* An icon-only button with shape morphing, ripple effect, loading state,
|
|
2251
|
-
* and toggle variant. Requires `aria-label` for accessibility since there
|
|
2252
|
-
* is no visible text label.
|
|
2253
|
-
*
|
|
2254
|
-
* @see https://m3.material.io/components/icon-buttons/overview
|
|
2255
|
-
*/
|
|
2256
|
-
|
|
2257
|
-
type MotionButtonProps = Omit<HTMLMotionProps<"button">, "children" | "color">;
|
|
2258
|
-
/**
|
|
2259
|
-
* Base props for the Icon Button component.
|
|
2260
|
-
*
|
|
2261
|
-
* @see {@link IconButtonProps} for the full discriminated union.
|
|
2262
|
-
* @see https://m3.material.io/components/icon-buttons/overview
|
|
2263
|
-
*/
|
|
2264
|
-
interface BaseIconButtonProps extends MotionButtonProps {
|
|
2265
|
-
/**
|
|
2266
|
-
* Visual color style following MD3 color roles.
|
|
2267
|
-
* @default "standard"
|
|
2268
|
-
*/
|
|
2269
|
-
colorStyle?: "standard" | "filled" | "tonal" | "outlined";
|
|
2270
|
-
/**
|
|
2271
|
-
* Button container size.
|
|
2272
|
-
* Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.
|
|
2273
|
-
* @default "sm"
|
|
2274
|
-
*/
|
|
2275
|
-
size?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
2276
|
-
/**
|
|
2277
|
-
* Container shape controlling border-radius morphing.
|
|
2278
|
-
* - `round`: fully circular (CornerFull).
|
|
2279
|
-
* - `square`: rounded square (CornerMedium–CornerExtraLarge per size).
|
|
2280
|
-
* @default "round"
|
|
2281
|
-
*/
|
|
2282
|
-
shape?: "round" | "square";
|
|
2283
|
-
/**
|
|
2284
|
-
* When `true`, replaces the icon with an animated loading indicator.
|
|
2285
|
-
* Interaction is blocked and `aria-busy` is set.
|
|
2286
|
-
* @default false
|
|
2287
|
-
*/
|
|
2288
|
-
loading?: boolean;
|
|
2289
|
-
/**
|
|
2290
|
-
* Spinner style shown while `loading={true}`.
|
|
2291
|
-
* @default "loading-indicator"
|
|
2292
|
-
*/
|
|
2293
|
-
loadingVariant?: "loading-indicator" | "circular";
|
|
2294
|
-
/** Icon content — typically a single SVG icon component. */
|
|
2295
|
-
children: React$1.ReactNode;
|
|
2296
|
-
/**
|
|
2297
|
-
* Accessible label — **REQUIRED** because icon buttons have no visible text.
|
|
2298
|
-
*
|
|
2299
|
-
* @example "Close", "Add to favourites", "Toggle dark mode"
|
|
2300
|
-
* @see https://m3.material.io/components/icon-buttons/accessibility
|
|
2301
|
-
*/
|
|
2302
|
-
"aria-label": string;
|
|
2303
|
-
}
|
|
2304
|
-
/**
|
|
2305
|
-
* Complete `IconButton` props — discriminated union that enforces
|
|
2306
|
-
* `selected` is only valid with `variant="toggle"`.
|
|
2307
|
-
*
|
|
2308
|
-
* @example
|
|
2309
|
-
* ```tsx
|
|
2310
|
-
* // Standard
|
|
2311
|
-
* <IconButton aria-label="Close" onClick={handleClose}>
|
|
2312
|
-
* <XIcon />
|
|
2313
|
-
* </IconButton>
|
|
2314
|
-
*
|
|
2315
|
-
* // Toggle
|
|
2316
|
-
* <IconButton
|
|
2317
|
-
* variant="toggle"
|
|
2318
|
-
* selected={isLiked}
|
|
2319
|
-
* aria-label={isLiked ? "Unlike" : "Like"}
|
|
2320
|
-
* colorStyle="filled"
|
|
2321
|
-
* onClick={() => setIsLiked(!isLiked)}
|
|
2322
|
-
* >
|
|
2323
|
-
* <HeartIcon />
|
|
2324
|
-
* </IconButton>
|
|
2325
|
-
* ```
|
|
2326
|
-
*
|
|
2327
|
-
* @see https://m3.material.io/components/icon-buttons/overview
|
|
2328
|
-
*/
|
|
2329
|
-
type IconButtonProps = BaseIconButtonProps & ({
|
|
2330
|
-
variant?: "default";
|
|
2331
|
-
selected?: never;
|
|
2332
|
-
} | {
|
|
2333
|
-
variant: "toggle";
|
|
2334
|
-
selected: boolean;
|
|
2335
|
-
});
|
|
2345
|
+
/**
|
|
2346
|
+
* Ghi đè trực tiếp `font-size` bằng px. Trục `opsz` vẫn sẽ tuân theo thuộc tính `opticalSize`.
|
|
2347
|
+
* @example size={18} opticalSize={20}
|
|
2348
|
+
*/
|
|
2349
|
+
size?: number | "inherit";
|
|
2350
|
+
/**
|
|
2351
|
+
* Kích hoạt hiệu ứng spring mượt mà khi chuyển đổi giá trị FILL (sử dụng cấu hình `SPRING_TRANSITION_FAST`).
|
|
2352
|
+
* Yêu cầu dependency `motion/react`.
|
|
2353
|
+
* @default false
|
|
2354
|
+
* @example <Icon name="favorite" fill={isLiked ? 1 : 0} animateFill />
|
|
2355
|
+
*/
|
|
2356
|
+
animateFill?: boolean;
|
|
2357
|
+
}
|
|
2336
2358
|
/**
|
|
2337
|
-
*
|
|
2359
|
+
* Component hiển thị Icon bằng Material Symbols (variable font).
|
|
2338
2360
|
*
|
|
2339
|
-
*
|
|
2340
|
-
*
|
|
2341
|
-
*
|
|
2361
|
+
* Hãy đảm bảo đã import CSS chứa font trước khi dùng:
|
|
2362
|
+
* ```ts
|
|
2363
|
+
* import '@bug-on/md3-react/material-symbols.css';
|
|
2364
|
+
* ```
|
|
2342
2365
|
*
|
|
2343
2366
|
* @remarks
|
|
2344
|
-
* -
|
|
2345
|
-
* - `
|
|
2346
|
-
* - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.
|
|
2367
|
+
* - Đặt tên icon dùng snake_case: `"arrow_forward"`, KHÔNG PHẢI `"ArrowForward"`.
|
|
2368
|
+
* - Thuộc tính `aria-hidden="true"` được tự động thêm vào — bạn cần thêm label đọc bằng giọng nói (accessible labels) ở phần tử cha.
|
|
2347
2369
|
*
|
|
2348
2370
|
* @example
|
|
2349
2371
|
* ```tsx
|
|
2350
|
-
*
|
|
2351
|
-
*
|
|
2352
|
-
* </IconButton>
|
|
2372
|
+
* // Icon cơ bản
|
|
2373
|
+
* <Icon name="home" />
|
|
2353
2374
|
*
|
|
2354
|
-
*
|
|
2355
|
-
*
|
|
2356
|
-
*
|
|
2357
|
-
*
|
|
2358
|
-
*
|
|
2359
|
-
*
|
|
2360
|
-
*
|
|
2361
|
-
*
|
|
2362
|
-
*
|
|
2375
|
+
* // Tùy chỉnh trực quan (filled, nét dày)
|
|
2376
|
+
* <Icon name="favorite" variant="rounded" fill={1} weight={300} />
|
|
2377
|
+
*
|
|
2378
|
+
* // Animate khi trạng thái thay đổi
|
|
2379
|
+
* <Icon name="bookmark" fill={saved ? 1 : 0} animateFill />
|
|
2380
|
+
*
|
|
2381
|
+
* // Đổi kích thước icon cụ thể
|
|
2382
|
+
* <Icon name="close" size={18} opticalSize={20} />
|
|
2383
|
+
*
|
|
2384
|
+
* // Kết hợp với các component khác
|
|
2385
|
+
* <Button icon={<Icon name="add" />}>Thêm vào giỏ</Button>
|
|
2363
2386
|
* ```
|
|
2364
2387
|
*
|
|
2365
|
-
* @see https://
|
|
2388
|
+
* @see https://fonts.google.com/icons
|
|
2389
|
+
* @see https://m3.material.io/styles/icons/overview
|
|
2366
2390
|
*/
|
|
2367
|
-
declare const
|
|
2368
|
-
variant?: "default";
|
|
2369
|
-
selected?: never;
|
|
2370
|
-
}, "ref"> | Omit<BaseIconButtonProps & {
|
|
2371
|
-
variant: "toggle";
|
|
2372
|
-
selected: boolean;
|
|
2373
|
-
}, "ref">) & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2391
|
+
declare const Icon: React$1.NamedExoticComponent<IconProps & React$1.RefAttributes<HTMLSpanElement>>;
|
|
2374
2392
|
|
|
2375
2393
|
interface LoadingIndicatorProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
2376
2394
|
/**
|
|
@@ -2790,10 +2808,35 @@ declare const MenuTrigger: React$1.ForwardRefExoticComponent<MenuTriggerProps &
|
|
|
2790
2808
|
*/
|
|
2791
2809
|
declare const MenuContent: React$1.ForwardRefExoticComponent<MenuContentProps & Omit<Omit<DropdownMenu.DropdownMenuContentProps & React$1.RefAttributes<HTMLDivElement>, "ref">, "asChild"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
2792
2810
|
|
|
2793
|
-
/**
|
|
2811
|
+
/**
|
|
2812
|
+
* @file ui/shared/motion-tokens.ts
|
|
2813
|
+
*
|
|
2814
|
+
* Framer Motion spring presets derived from the official MD3 Expressive
|
|
2815
|
+
* motion physics system (May 2025).
|
|
2816
|
+
*
|
|
2817
|
+
* Usage hierarchy:
|
|
2818
|
+
* 1. Import a named preset (e.g. `FAST_SPATIAL_SPRING`) for convenience.
|
|
2819
|
+
* 2. Call `getMotionSpring(speed, type)` when you need to pick dynamically.
|
|
2820
|
+
* 3. Call `getMotionTransitionCSS(speed, type, scheme?)` for pure-CSS contexts.
|
|
2821
|
+
*
|
|
2822
|
+
* @see https://m3.material.io/styles/motion/overview/how-it-works
|
|
2823
|
+
* @see https://m3.material.io/styles/motion/overview/specs
|
|
2824
|
+
*/
|
|
2825
|
+
|
|
2826
|
+
/**
|
|
2827
|
+
* MD3 Expressive — Fast Spatial Spring
|
|
2828
|
+
* `md.sys.motion.spring.fast.spatial` (dampingRatio: 0.6, stiffness: 800)
|
|
2829
|
+
*
|
|
2830
|
+
* Use for: small components (buttons, switches, chips).
|
|
2831
|
+
* Has notable bounce/overshoot — feels snappy and expressive.
|
|
2832
|
+
*/
|
|
2794
2833
|
declare const FAST_SPATIAL_SPRING: Transition;
|
|
2795
|
-
|
|
2796
|
-
|
|
2834
|
+
|
|
2835
|
+
/** FastEffects CSS-fallback transition — used for opacity/exit animations */
|
|
2836
|
+
declare const FAST_EFFECTS_TRANSITION: {
|
|
2837
|
+
readonly duration: 0.15;
|
|
2838
|
+
readonly ease: [number, number, number, number];
|
|
2839
|
+
};
|
|
2797
2840
|
/**
|
|
2798
2841
|
* Enter/exit animation for the menu popup container.
|
|
2799
2842
|
* Scale from 0.8→1.0 with FastSpatial spring.
|
|
@@ -3192,7 +3235,55 @@ declare const VerticalMenuContent: React$1.ForwardRefExoticComponent<VerticalMen
|
|
|
3192
3235
|
*/
|
|
3193
3236
|
declare const VerticalMenu: React$1.ForwardRefExoticComponent<VerticalMenuProps & React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
|
|
3194
3237
|
|
|
3195
|
-
|
|
3238
|
+
/**
|
|
3239
|
+
* Layout styling for navigation bar items.
|
|
3240
|
+
* - vertical: Icon above label (default for mobile)
|
|
3241
|
+
* - horizontal: Icon beside label (forced)
|
|
3242
|
+
*/
|
|
3243
|
+
type NavigationBarItemLayout = "vertical" | "horizontal";
|
|
3244
|
+
/**
|
|
3245
|
+
* Visual variant of the Navigation Bar.
|
|
3246
|
+
* - flexible: Default MD3 behavior (h-16), becomes horizontal on desktop.
|
|
3247
|
+
* - baseline: Taller MD3 behavior (h-20), always vertical.
|
|
3248
|
+
* - xr: Floating orbiter variant for spatial interfaces (detached from bottom).
|
|
3249
|
+
*/
|
|
3250
|
+
type NavigationBarVariant = "flexible" | "baseline" | "xr";
|
|
3251
|
+
interface NavigationBarItemProps {
|
|
3252
|
+
selected: boolean;
|
|
3253
|
+
icon: React$1.ReactNode;
|
|
3254
|
+
label: React$1.ReactNode;
|
|
3255
|
+
onClick?: () => void;
|
|
3256
|
+
disabled?: boolean;
|
|
3257
|
+
badge?: React$1.ReactNode;
|
|
3258
|
+
"aria-label"?: string;
|
|
3259
|
+
className?: string;
|
|
3260
|
+
}
|
|
3261
|
+
interface NavigationBarProps {
|
|
3262
|
+
/** Visual variant of the Navigation Bar */
|
|
3263
|
+
variant?: NavigationBarVariant;
|
|
3264
|
+
/** Forces a specific item layout (horizontal/vertical) */
|
|
3265
|
+
itemLayout?: NavigationBarItemLayout;
|
|
3266
|
+
/** Whether the bar should hide when scrolling down */
|
|
3267
|
+
hideOnScroll?: boolean;
|
|
3268
|
+
/** Whether the bar should have an elevation shadow */
|
|
3269
|
+
elevated?: boolean;
|
|
3270
|
+
/** Whether the bar is fixed to the viewport (default) or absolute */
|
|
3271
|
+
fixed?: boolean;
|
|
3272
|
+
/** Container ref to track scrolling for hideOnScroll */
|
|
3273
|
+
scrollContainerRef?: React$1.RefObject<HTMLElement | null>;
|
|
3274
|
+
/** Transition for the active indicator pill */
|
|
3275
|
+
activeIndicatorTransition?: Transition;
|
|
3276
|
+
/** Navigation items */
|
|
3277
|
+
children: React$1.ReactNode;
|
|
3278
|
+
/** Optional additional classes */
|
|
3279
|
+
className?: string;
|
|
3280
|
+
/** Optional inline styles */
|
|
3281
|
+
style?: React$1.CSSProperties;
|
|
3282
|
+
}
|
|
3283
|
+
declare const NavigationBarItem: React$1.NamedExoticComponent<NavigationBarItemProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
3284
|
+
declare const NavigationBar: React$1.NamedExoticComponent<NavigationBarProps & React$1.RefAttributes<HTMLElement>>;
|
|
3285
|
+
|
|
3286
|
+
type NavigationRailVariant = "collapsed" | "expanded" | "modal" | "xr";
|
|
3196
3287
|
type NavigationRailLabelVisibility = "labeled" | "auto" | "unlabeled";
|
|
3197
3288
|
interface NavigationRailItemProps {
|
|
3198
3289
|
selected: boolean;
|
|
@@ -3209,11 +3300,12 @@ interface NavigationRailProps {
|
|
|
3209
3300
|
labelVisibility?: NavigationRailLabelVisibility;
|
|
3210
3301
|
header?: React$1.ReactNode;
|
|
3211
3302
|
fab?: React$1.ReactNode;
|
|
3303
|
+
fabPlacement?: "contained" | "spatialized";
|
|
3212
3304
|
footer?: React$1.ReactNode;
|
|
3213
3305
|
narrow?: boolean;
|
|
3214
3306
|
open?: boolean;
|
|
3215
|
-
xr?: boolean | "contained" | "spatialized";
|
|
3216
3307
|
onClose?: () => void;
|
|
3308
|
+
activeIndicatorTransition?: Transition;
|
|
3217
3309
|
children: React$1.ReactNode;
|
|
3218
3310
|
className?: string;
|
|
3219
3311
|
style?: React$1.CSSProperties;
|
|
@@ -3645,6 +3737,8 @@ interface ScrollAreaProps extends Omit<React$1.ComponentPropsWithoutRef<typeof R
|
|
|
3645
3737
|
scrollHideDelay?: number;
|
|
3646
3738
|
/** Extra classes applied to the inner viewport element. */
|
|
3647
3739
|
viewportClassName?: string;
|
|
3740
|
+
/** Ref to the scrolling viewport element. */
|
|
3741
|
+
viewportRef?: React$1.Ref<HTMLDivElement>;
|
|
3648
3742
|
}
|
|
3649
3743
|
declare const ScrollArea: React$1.ForwardRefExoticComponent<ScrollAreaProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
3650
3744
|
declare const ScrollAreaScrollbar: React$1.ForwardRefExoticComponent<Omit<RadixScrollArea.ScrollAreaScrollbarProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
@@ -3847,17 +3941,6 @@ declare const Search: typeof SearchComponent & {
|
|
|
3847
3941
|
useSearch: typeof useSearch;
|
|
3848
3942
|
};
|
|
3849
3943
|
|
|
3850
|
-
/**
|
|
3851
|
-
* @file search.tokens.ts
|
|
3852
|
-
* MD3 Expressive Search — Design tokens ported from:
|
|
3853
|
-
* - SearchBarTokens.kt (v0_210)
|
|
3854
|
-
* - SearchViewTokens.kt (v0_210)
|
|
3855
|
-
*
|
|
3856
|
-
* All dimensional values are in px (1dp = 1px on web).
|
|
3857
|
-
* Colors reference CSS custom properties — do NOT hardcode hex.
|
|
3858
|
-
* @see docs/m3/search/SearchBarTokens.kt
|
|
3859
|
-
* @see docs/m3/search/SearchViewTokens.kt
|
|
3860
|
-
*/
|
|
3861
3944
|
/**
|
|
3862
3945
|
* Height and shape tokens for Search variants.
|
|
3863
3946
|
* Maps directly from MD3 Kotlin token files.
|
|
@@ -3919,36 +4002,9 @@ declare const SEARCH_TYPOGRAPHY: {
|
|
|
3919
4002
|
/** BodyLarge — used for input text and placeholder. */
|
|
3920
4003
|
readonly bodyLarge: "text-[16px] leading-6 font-normal tracking-[0.5px]";
|
|
3921
4004
|
};
|
|
3922
|
-
|
|
3923
|
-
|
|
3924
|
-
|
|
3925
|
-
*/
|
|
3926
|
-
declare const SEARCH_BAR_EXPAND_SPRING: {
|
|
3927
|
-
type: "spring";
|
|
3928
|
-
stiffness: number;
|
|
3929
|
-
damping: number;
|
|
3930
|
-
mass: number;
|
|
3931
|
-
};
|
|
3932
|
-
/**
|
|
3933
|
-
* Spring animation for Docked SearchView dropdown reveal (slide + fade).
|
|
3934
|
-
* Offset Y: -8px on enter, opacity 0→1.
|
|
3935
|
-
*/
|
|
3936
|
-
declare const SEARCH_DOCKED_REVEAL_SPRING: {
|
|
3937
|
-
type: "spring";
|
|
3938
|
-
stiffness: number;
|
|
3939
|
-
damping: number;
|
|
3940
|
-
mass: number;
|
|
3941
|
-
};
|
|
3942
|
-
/**
|
|
3943
|
-
* Spring animation for FullScreen SearchView shape morphing.
|
|
3944
|
-
* Lower stiffness + mass gives a smoother pill→fullscreen morph.
|
|
3945
|
-
*/
|
|
3946
|
-
declare const SEARCH_FULLSCREEN_SPRING: {
|
|
3947
|
-
type: "spring";
|
|
3948
|
-
stiffness: number;
|
|
3949
|
-
damping: number;
|
|
3950
|
-
mass: number;
|
|
3951
|
-
};
|
|
4005
|
+
declare const SEARCH_BAR_EXPAND_SPRING: motion.Transition;
|
|
4006
|
+
declare const SEARCH_DOCKED_REVEAL_SPRING: motion.Transition;
|
|
4007
|
+
declare const SEARCH_FULLSCREEN_SPRING: motion.Transition;
|
|
3952
4008
|
|
|
3953
4009
|
type SearchBarProps = Pick<SearchProps, "query" | "onQueryChange" | "onSearch" | "active" | "onActiveChange" | "leadingIcon" | "trailingIcon" | "placeholder" | "textAlign" | "className" | "aria-label"> & SearchInternalProps & {
|
|
3954
4010
|
/** KeyDown handler from useSearchKeyboard. */
|
|
@@ -4730,14 +4786,6 @@ declare const SwitchColors: {
|
|
|
4730
4786
|
readonly focusIndicator: "var(--md-sys-color-secondary)";
|
|
4731
4787
|
};
|
|
4732
4788
|
|
|
4733
|
-
declare const typographyVariants: (props?: ({
|
|
4734
|
-
variant?: "display-lg" | "display-md" | "display-sm" | "headline-lg" | "headline-md" | "headline-sm" | "title-lg" | "title-md" | "title-sm" | "label-lg" | "label-md" | "label-sm" | "body-lg" | "body-md" | "body-sm" | null | undefined;
|
|
4735
|
-
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
4736
|
-
interface TextProps extends React$1.HTMLAttributes<HTMLElement>, VariantProps<typeof typographyVariants> {
|
|
4737
|
-
as?: React$1.ElementType;
|
|
4738
|
-
}
|
|
4739
|
-
declare const Text: React$1.ForwardRefExoticComponent<TextProps & React$1.RefAttributes<HTMLElement>>;
|
|
4740
|
-
|
|
4741
4789
|
/**
|
|
4742
4790
|
* @file tabs.types.ts
|
|
4743
4791
|
* MD3 Expressive Tabs — TypeScript prop definitions.
|
|
@@ -5109,6 +5157,14 @@ declare const TabsContent: React$1.NamedExoticComponent<TabsContentProps & React
|
|
|
5109
5157
|
*/
|
|
5110
5158
|
declare const TabsList: React$1.NamedExoticComponent<TabsListProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
5111
5159
|
|
|
5160
|
+
declare const typographyVariants: (props?: ({
|
|
5161
|
+
variant?: "display-lg" | "display-md" | "display-sm" | "headline-lg" | "headline-md" | "headline-sm" | "title-lg" | "title-md" | "title-sm" | "label-lg" | "label-md" | "label-sm" | "body-lg" | "body-md" | "body-sm" | null | undefined;
|
|
5162
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
5163
|
+
interface TextProps extends React$1.HTMLAttributes<HTMLElement>, VariantProps<typeof typographyVariants> {
|
|
5164
|
+
as?: React$1.ElementType;
|
|
5165
|
+
}
|
|
5166
|
+
declare const Text: React$1.ForwardRefExoticComponent<TextProps & React$1.RefAttributes<HTMLElement>>;
|
|
5167
|
+
|
|
5112
5168
|
/**
|
|
5113
5169
|
* @file text-field.types.ts
|
|
5114
5170
|
* TypeScript interfaces and types for TextField MD3 Expressive component.
|
|
@@ -5861,6 +5917,388 @@ interface TableOfContentsProps {
|
|
|
5861
5917
|
*/
|
|
5862
5918
|
declare function TableOfContents({ items, className, scrollAreaProps, }: TableOfContentsProps): react_jsx_runtime.JSX.Element;
|
|
5863
5919
|
|
|
5920
|
+
/**
|
|
5921
|
+
* Color configuration types and standard values for the FloatingToolbar component.
|
|
5922
|
+
* Maps MD3 design tokens to CSS custom properties used in Tailwind CSS.
|
|
5923
|
+
*/
|
|
5924
|
+
interface FloatingToolbarColors {
|
|
5925
|
+
/** The background color of the toolbar container */
|
|
5926
|
+
toolbarContainerColor?: string;
|
|
5927
|
+
/** The color of the content (icons, text) inside the toolbar */
|
|
5928
|
+
toolbarContentColor?: string;
|
|
5929
|
+
/** The background color of the FAB container */
|
|
5930
|
+
fabContainerColor?: string;
|
|
5931
|
+
/** The color of the content inside the FAB */
|
|
5932
|
+
fabContentColor?: string;
|
|
5933
|
+
}
|
|
5934
|
+
/**
|
|
5935
|
+
* Standard color configuration for the floating toolbar.
|
|
5936
|
+
* Uses surface container for the toolbar and secondary container for the FAB.
|
|
5937
|
+
*/
|
|
5938
|
+
declare const standardFloatingToolbarColors: FloatingToolbarColors;
|
|
5939
|
+
/**
|
|
5940
|
+
* Vibrant color configuration for the floating toolbar.
|
|
5941
|
+
* Uses primary container for the toolbar and tertiary container for the FAB.
|
|
5942
|
+
*/
|
|
5943
|
+
declare const vibrantFloatingToolbarColors: FloatingToolbarColors;
|
|
5944
|
+
|
|
5945
|
+
interface BottomDockedToolbarProps {
|
|
5946
|
+
/** Color variant: standard or vibrant */
|
|
5947
|
+
variant?: "standard" | "vibrant";
|
|
5948
|
+
/** Custom colors override */
|
|
5949
|
+
colors?: FloatingToolbarColors;
|
|
5950
|
+
/** Whether to hide on scroll */
|
|
5951
|
+
hideOnScroll?: boolean;
|
|
5952
|
+
/** Scroll container ref for scroll behavior (if empty, uses window scroll) */
|
|
5953
|
+
scrollContainerRef?: React$1.RefObject<HTMLElement | null>;
|
|
5954
|
+
/** Start content (left-aligned) */
|
|
5955
|
+
startContent?: React$1.ReactNode;
|
|
5956
|
+
/** End content (right-aligned) */
|
|
5957
|
+
endContent?: React$1.ReactNode;
|
|
5958
|
+
/** Center content */
|
|
5959
|
+
children?: React$1.ReactNode;
|
|
5960
|
+
/**
|
|
5961
|
+
* Horizontal padding (px) applied to the toolbar container.
|
|
5962
|
+
* MD3 spec requires a minimum of 16dp on leading and trailing edges.
|
|
5963
|
+
* @default 16
|
|
5964
|
+
*/
|
|
5965
|
+
paddingX?: number;
|
|
5966
|
+
/**
|
|
5967
|
+
* Layout distribution of toolbar content.
|
|
5968
|
+
* - `"between"` – leading/center/trailing spread across full width (default, compact screens).
|
|
5969
|
+
* - `"center"` – all content centered; ideal for medium+ screen widths.
|
|
5970
|
+
* - `"end-weighted"` – key action is centered while others are pushed to the edges.
|
|
5971
|
+
* @default "between"
|
|
5972
|
+
*/
|
|
5973
|
+
justify?: "between" | "center" | "end-weighted";
|
|
5974
|
+
/**
|
|
5975
|
+
* Container shape.
|
|
5976
|
+
* - `"none"` – straight corners (MD3 default for mobile docked toolbars).
|
|
5977
|
+
* - `"large"` – large rounded corners (recommended for web / large screens).
|
|
5978
|
+
* - `"full"` – fully pill-shaped.
|
|
5979
|
+
*
|
|
5980
|
+
* MD3 guideline: *"On web and large screens, the docked toolbar can be rounded."*
|
|
5981
|
+
* @default "none"
|
|
5982
|
+
*/
|
|
5983
|
+
shape?: "none" | "large" | "full";
|
|
5984
|
+
className?: string;
|
|
5985
|
+
"aria-label"?: string;
|
|
5986
|
+
}
|
|
5987
|
+
/**
|
|
5988
|
+
* A full-width docked toolbar typically fixed at the bottom of the screen.
|
|
5989
|
+
* Replaces the deprecated Bottom App Bar in MD3 Expressive.
|
|
5990
|
+
*
|
|
5991
|
+
* @example
|
|
5992
|
+
* ```tsx
|
|
5993
|
+
* <BottomDockedToolbar hideOnScroll startContent={<IconButton aria-label="Menu"><Icon name="menu" /></IconButton>}>
|
|
5994
|
+
* <div className="flex gap-2">
|
|
5995
|
+
* <IconButton aria-label="Search"><Icon name="search" /></IconButton>
|
|
5996
|
+
* <IconButton aria-label="Edit"><Icon name="edit" /></IconButton>
|
|
5997
|
+
* </div>
|
|
5998
|
+
* </BottomDockedToolbar>
|
|
5999
|
+
* ```
|
|
6000
|
+
*/
|
|
6001
|
+
declare const BottomDockedToolbar: React$1.ForwardRefExoticComponent<BottomDockedToolbarProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
6002
|
+
|
|
6003
|
+
/**
|
|
6004
|
+
* Configuration options for the `useFloatingToolbarScrollBehavior` hook.
|
|
6005
|
+
*/
|
|
6006
|
+
interface UseFloatingToolbarScrollBehaviorOptions {
|
|
6007
|
+
/** Direction toolbar exits: 'top' | 'bottom' | 'start' | 'end'. Defaults to 'bottom'. */
|
|
6008
|
+
exitDirection?: "top" | "bottom" | "start" | "end";
|
|
6009
|
+
/** Scroll distance threshold to trigger collapse (in px). Defaults to 10. */
|
|
6010
|
+
collapseThreshold?: number;
|
|
6011
|
+
/** Scroll distance threshold to trigger expand (in px). Defaults to 10. */
|
|
6012
|
+
expandThreshold?: number;
|
|
6013
|
+
/** Optional ref to a scrollable container. If not provided, it listens to window scroll. */
|
|
6014
|
+
scrollContainerRef?: RefObject<HTMLElement | null>;
|
|
6015
|
+
}
|
|
6016
|
+
/**
|
|
6017
|
+
* The resulting behavior object returned by `useFloatingToolbarScrollBehavior`.
|
|
6018
|
+
*/
|
|
6019
|
+
interface FloatingToolbarScrollBehavior {
|
|
6020
|
+
/** Current offset. 0 is fully visible, -1 is fully hidden. */
|
|
6021
|
+
offset: number;
|
|
6022
|
+
/** Whether the toolbar is currently expanded. */
|
|
6023
|
+
isExpanded: boolean;
|
|
6024
|
+
/** Optional scroll handler to bind to a React scrollable container (legacy fallback). */
|
|
6025
|
+
onScroll?: (event: React.UIEvent<HTMLElement>) => void;
|
|
6026
|
+
/** Manually update the expanded state of the toolbar. */
|
|
6027
|
+
setExpanded: (expanded: boolean) => void;
|
|
6028
|
+
/** The configured exit direction. */
|
|
6029
|
+
exitDirection: "top" | "bottom" | "start" | "end";
|
|
6030
|
+
}
|
|
6031
|
+
/**
|
|
6032
|
+
* A hook that provides scroll behavior for floating toolbars, allowing them to
|
|
6033
|
+
* collapse (exit) when scrolling down and expand (enter) when scrolling up.
|
|
6034
|
+
* Leverages Framer Motion's useScroll internally for optimized performance.
|
|
6035
|
+
*
|
|
6036
|
+
* @param options Configuration options for scroll behavior.
|
|
6037
|
+
* @returns An object containing the current scroll state and handlers.
|
|
6038
|
+
*
|
|
6039
|
+
* @example
|
|
6040
|
+
* ```tsx
|
|
6041
|
+
* const scrollBehavior = useFloatingToolbarScrollBehavior({
|
|
6042
|
+
* exitDirection: 'bottom',
|
|
6043
|
+
* collapseThreshold: 20
|
|
6044
|
+
* });
|
|
6045
|
+
*
|
|
6046
|
+
* <HorizontalFloatingToolbar scrollBehavior={scrollBehavior}>
|
|
6047
|
+
* <IconButton icon="bold" />
|
|
6048
|
+
* </HorizontalFloatingToolbar>
|
|
6049
|
+
* ```
|
|
6050
|
+
*/
|
|
6051
|
+
declare function useFloatingToolbarScrollBehavior(options?: UseFloatingToolbarScrollBehaviorOptions): FloatingToolbarScrollBehavior;
|
|
6052
|
+
|
|
6053
|
+
interface FloatingToolbarProps {
|
|
6054
|
+
/** Whether the toolbar is expanded, showing startContent and endContent */
|
|
6055
|
+
expanded: boolean;
|
|
6056
|
+
/** Orientation of the toolbar */
|
|
6057
|
+
orientation?: "horizontal" | "vertical";
|
|
6058
|
+
/** Color configuration */
|
|
6059
|
+
colors?: FloatingToolbarColors;
|
|
6060
|
+
/** Shape variant: full = pill shape (default), large = large rounded */
|
|
6061
|
+
shape?: "full" | "large";
|
|
6062
|
+
/** Padding inside toolbar container */
|
|
6063
|
+
contentPadding?: React$1.CSSProperties | string;
|
|
6064
|
+
/** Scroll behavior hook result */
|
|
6065
|
+
scrollBehavior?: FloatingToolbarScrollBehavior;
|
|
6066
|
+
/** Start content (shown when expanded, usually on the left/top) */
|
|
6067
|
+
startContent?: React$1.ReactNode;
|
|
6068
|
+
/** End content (shown when expanded, usually on the right/bottom) */
|
|
6069
|
+
endContent?: React$1.ReactNode;
|
|
6070
|
+
/** Main toolbar content (always visible) */
|
|
6071
|
+
children: React$1.ReactNode;
|
|
6072
|
+
/** Whether to disable the internal scroll translation (useful when parent handles it) */
|
|
6073
|
+
disableScrollTranslation?: boolean;
|
|
6074
|
+
/** Whether to disable layout animation (useful when nested inside FloatingToolbarWithFab) */
|
|
6075
|
+
disableLayoutAnimation?: boolean;
|
|
6076
|
+
/**
|
|
6077
|
+
* Gap (px) between items in the center children slot.
|
|
6078
|
+
* Corresponds to MD3 `ContainerBetweenSpace` token (4dp default).
|
|
6079
|
+
* @default 4
|
|
6080
|
+
*/
|
|
6081
|
+
itemGap?: number;
|
|
6082
|
+
/** Alignment (justify-content) of the center children slot */
|
|
6083
|
+
childrenAlignment?: "start" | "center" | "end";
|
|
6084
|
+
/** Custom CSS class applied to each child item in the toolbar slots */
|
|
6085
|
+
itemClassName?: string;
|
|
6086
|
+
className?: string;
|
|
6087
|
+
style?: React$1.CSSProperties;
|
|
6088
|
+
"aria-label"?: string;
|
|
6089
|
+
}
|
|
6090
|
+
/**
|
|
6091
|
+
* A horizontal floating toolbar that displays navigation and key actions.
|
|
6092
|
+
* It can be positioned anywhere on the screen and floats over the rest of the content.
|
|
6093
|
+
*
|
|
6094
|
+
* @example
|
|
6095
|
+
* ```tsx
|
|
6096
|
+
* const [expanded, setExpanded] = useState(true);
|
|
6097
|
+
* const scrollBehavior = useFloatingToolbarScrollBehavior({ exitDirection: 'bottom' });
|
|
6098
|
+
*
|
|
6099
|
+
* <HorizontalFloatingToolbar
|
|
6100
|
+
* expanded={expanded}
|
|
6101
|
+
* scrollBehavior={scrollBehavior}
|
|
6102
|
+
* startContent={<IconButton icon="undo" />}
|
|
6103
|
+
* endContent={<IconButton icon="redo" />}
|
|
6104
|
+
* >
|
|
6105
|
+
* <IconButton icon="bold" />
|
|
6106
|
+
* <IconButton icon="italic" />
|
|
6107
|
+
* </HorizontalFloatingToolbar>
|
|
6108
|
+
* ```
|
|
6109
|
+
*
|
|
6110
|
+
* @see https://m3.material.io/components/toolbars/guidelines
|
|
6111
|
+
*/
|
|
6112
|
+
declare const HorizontalFloatingToolbar: React$1.ForwardRefExoticComponent<Omit<FloatingToolbarProps, "orientation"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
6113
|
+
/**
|
|
6114
|
+
* A vertical floating toolbar that displays navigation and key actions.
|
|
6115
|
+
* It floats over the rest of the content.
|
|
6116
|
+
*
|
|
6117
|
+
* @example
|
|
6118
|
+
* ```tsx
|
|
6119
|
+
* <VerticalFloatingToolbar expanded={true}>
|
|
6120
|
+
* <IconButton icon="bold" />
|
|
6121
|
+
* </VerticalFloatingToolbar>
|
|
6122
|
+
* ```
|
|
6123
|
+
*/
|
|
6124
|
+
declare const VerticalFloatingToolbar: React$1.ForwardRefExoticComponent<Omit<FloatingToolbarProps, "orientation"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
6125
|
+
|
|
6126
|
+
interface FloatingToolbarWithFabProps extends FloatingToolbarProps {
|
|
6127
|
+
/** FAB element (use FAB component or custom node) */
|
|
6128
|
+
floatingActionButton: React$1.ReactNode;
|
|
6129
|
+
/** FAB position for horizontal: 'start' | 'end'. For vertical: 'top' | 'bottom' */
|
|
6130
|
+
fabPosition?: "start" | "end" | "top" | "bottom";
|
|
6131
|
+
/** Animation duration override */
|
|
6132
|
+
animationDuration?: number;
|
|
6133
|
+
/** Start content (explicitly declared to resolve type issues) */
|
|
6134
|
+
startContent?: React$1.ReactNode;
|
|
6135
|
+
/** End content (explicitly declared to resolve type issues) */
|
|
6136
|
+
endContent?: React$1.ReactNode;
|
|
6137
|
+
/**
|
|
6138
|
+
* Size of the FAB container.
|
|
6139
|
+
* - `"default"` → 56×56px (`FabBaselineTokens.ContainerHeight`)
|
|
6140
|
+
* - `"medium"` → 80×80px (`FabBaselineTokens.MediumContainerHeight`)
|
|
6141
|
+
*
|
|
6142
|
+
* MD3: pair a medium FAB with the toolbar to give it greater visual prominence.
|
|
6143
|
+
* @default "default"
|
|
6144
|
+
*/
|
|
6145
|
+
fabSize?: "default" | "medium";
|
|
6146
|
+
}
|
|
6147
|
+
/**
|
|
6148
|
+
* A horizontal floating toolbar paired with a FAB.
|
|
6149
|
+
*/
|
|
6150
|
+
declare const HorizontalFloatingToolbarWithFab: React$1.ForwardRefExoticComponent<FloatingToolbarWithFabProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
6151
|
+
/**
|
|
6152
|
+
* A vertical floating toolbar paired with a FAB.
|
|
6153
|
+
*/
|
|
6154
|
+
declare const VerticalFloatingToolbarWithFab: React$1.ForwardRefExoticComponent<FloatingToolbarWithFabProps & React$1.RefAttributes<HTMLDivElement>>;
|
|
6155
|
+
|
|
6156
|
+
/**
|
|
6157
|
+
* @file toolbar-divider.tsx
|
|
6158
|
+
*
|
|
6159
|
+
* A decorative divider for use inside MD3 Toolbar components.
|
|
6160
|
+
* Renders as a thin line that visually separates groups of toolbar actions.
|
|
6161
|
+
*
|
|
6162
|
+
* @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)
|
|
6163
|
+
*/
|
|
6164
|
+
|
|
6165
|
+
interface ToolbarDividerProps {
|
|
6166
|
+
/**
|
|
6167
|
+
* The toolbar's orientation context.
|
|
6168
|
+
* - `"horizontal"` toolbar → renders a **vertical** divider line.
|
|
6169
|
+
* - `"vertical"` toolbar → renders a **horizontal** divider line.
|
|
6170
|
+
* @default "horizontal"
|
|
6171
|
+
*/
|
|
6172
|
+
orientation?: "horizontal" | "vertical";
|
|
6173
|
+
className?: string;
|
|
6174
|
+
}
|
|
6175
|
+
/**
|
|
6176
|
+
* A thin decorative separator for grouping actions inside a Toolbar.
|
|
6177
|
+
*
|
|
6178
|
+
* Inherits its color from the toolbar's `--toolbar-color` CSS variable via
|
|
6179
|
+
* `currentColor`, so it automatically adapts to both standard and vibrant
|
|
6180
|
+
* color configurations.
|
|
6181
|
+
*
|
|
6182
|
+
* @example
|
|
6183
|
+
* ```tsx
|
|
6184
|
+
* <HorizontalFloatingToolbar expanded={true}>
|
|
6185
|
+
* <IconButton aria-label="Bold"><BoldIcon /></IconButton>
|
|
6186
|
+
* <IconButton aria-label="Italic"><ItalicIcon /></IconButton>
|
|
6187
|
+
* <ToolbarDivider />
|
|
6188
|
+
* <IconButton aria-label="Align left"><AlignLeftIcon /></IconButton>
|
|
6189
|
+
* </HorizontalFloatingToolbar>
|
|
6190
|
+
* ```
|
|
6191
|
+
*/
|
|
6192
|
+
declare const ToolbarDivider: React$1.FC<ToolbarDividerProps>;
|
|
6193
|
+
|
|
6194
|
+
/**
|
|
6195
|
+
* @file toolbar-icon-button.tsx
|
|
6196
|
+
*
|
|
6197
|
+
* A thin wrapper around the MD3 `IconButton` component, pre-configured
|
|
6198
|
+
* for use inside Toolbar slots.
|
|
6199
|
+
*
|
|
6200
|
+
* Supports the three emphasis variants described in the MD3 Flexibility & slots
|
|
6201
|
+
* spec, plus narrow/wide sizing for asymmetric visual hierarchy.
|
|
6202
|
+
*
|
|
6203
|
+
* @see https://m3.material.io/components/toolbars/guidelines (Anatomy → Flexibility & slots)
|
|
6204
|
+
* @see https://m3.material.io/components/icon-buttons/overview
|
|
6205
|
+
*/
|
|
6206
|
+
|
|
6207
|
+
interface ToolbarIconButtonProps extends Omit<BaseIconButtonProps, "colorStyle" | "size" | "shape"> {
|
|
6208
|
+
/**
|
|
6209
|
+
* Visual emphasis variant.
|
|
6210
|
+
*
|
|
6211
|
+
* ⚠️ Avoid emphasising more than one action at a time.
|
|
6212
|
+
* @default "standard"
|
|
6213
|
+
*/
|
|
6214
|
+
emphasis?: ToolbarIconButtonVariant;
|
|
6215
|
+
/**
|
|
6216
|
+
* Button width sizing.
|
|
6217
|
+
*
|
|
6218
|
+
* Height is always `48px` to meet MD3 touch-target requirements.
|
|
6219
|
+
* @default "default"
|
|
6220
|
+
*/
|
|
6221
|
+
toolbarSize?: ToolbarIconButtonSize;
|
|
6222
|
+
/** Icon content — typically a single SVG icon component. */
|
|
6223
|
+
children: React$1.ReactNode;
|
|
6224
|
+
/**
|
|
6225
|
+
* Accessible label — **REQUIRED** because icon buttons have no visible text.
|
|
6226
|
+
*/
|
|
6227
|
+
"aria-label": string;
|
|
6228
|
+
}
|
|
6229
|
+
/**
|
|
6230
|
+
* Width sizing for a toolbar icon button.
|
|
6231
|
+
*
|
|
6232
|
+
* MD3 guideline: *"Use wide and narrow icon buttons"* to create visual hierarchy.
|
|
6233
|
+
* Touch-target height is always 48dp regardless of width.
|
|
6234
|
+
*
|
|
6235
|
+
* - `narrow` → 40px wide (secondary, de-emphasised)
|
|
6236
|
+
* - `default` → 48px wide (standard square touch target)
|
|
6237
|
+
* - `wide` → 64px wide (primary emphasis, draws eye)
|
|
6238
|
+
*/
|
|
6239
|
+
type ToolbarIconButtonSize = "narrow" | "default" | "wide";
|
|
6240
|
+
/**
|
|
6241
|
+
* Visual emphasis variant for a toolbar icon button.
|
|
6242
|
+
*
|
|
6243
|
+
* MD3 guideline: *"Use different icon button color styles, such as filled,
|
|
6244
|
+
* tonal, and standard."*
|
|
6245
|
+
*
|
|
6246
|
+
* ⚠️ **Avoid emphasising more than one action at a time.**
|
|
6247
|
+
* Use `"filled"` or `"tonal"` for the single highest-priority action and
|
|
6248
|
+
* keep all other buttons as `"standard"`.
|
|
6249
|
+
*/
|
|
6250
|
+
type ToolbarIconButtonVariant = "standard" | "tonal" | "filled";
|
|
6251
|
+
/**
|
|
6252
|
+
* An MD3 icon button optimised for use inside Toolbar slots.
|
|
6253
|
+
*
|
|
6254
|
+
* Wraps the project's `IconButton` and adds:
|
|
6255
|
+
* - Three emphasis styles (`standard`, `tonal`, `filled`) via `emphasis` prop.
|
|
6256
|
+
* - Three width sizes (`narrow`, `default`, `wide`) for visual hierarchy.
|
|
6257
|
+
* - Always `rounded-full` shape (required for floating toolbars per MD3 spec).
|
|
6258
|
+
* - Always 48dp height to meet MD3 accessibility touch-target requirements.
|
|
6259
|
+
*
|
|
6260
|
+
* @example
|
|
6261
|
+
* ```tsx
|
|
6262
|
+
* // Standard (default) — use for most actions
|
|
6263
|
+
* <ToolbarIconButton aria-label="Share">
|
|
6264
|
+
* <ShareIcon />
|
|
6265
|
+
* </ToolbarIconButton>
|
|
6266
|
+
*
|
|
6267
|
+
* // Filled + wide — use for the single highest-priority action
|
|
6268
|
+
* <ToolbarIconButton emphasis="filled" toolbarSize="wide" aria-label="Add">
|
|
6269
|
+
* <PlusIcon />
|
|
6270
|
+
* </ToolbarIconButton>
|
|
6271
|
+
* ```
|
|
6272
|
+
*
|
|
6273
|
+
* @see https://m3.material.io/components/toolbars/guidelines
|
|
6274
|
+
*/
|
|
6275
|
+
declare const ToolbarIconButton: React$1.ForwardRefExoticComponent<Omit<ToolbarIconButtonProps, "ref"> & React$1.RefAttributes<HTMLButtonElement>>;
|
|
6276
|
+
|
|
6277
|
+
/**
|
|
6278
|
+
* Design tokens for the ToolbarDivider component.
|
|
6279
|
+
* The divider is a decorative separator used to group toolbar actions.
|
|
6280
|
+
*/
|
|
6281
|
+
declare const ToolbarDividerTokens: {
|
|
6282
|
+
/** Divider line thickness in px */
|
|
6283
|
+
readonly Thickness: 1;
|
|
6284
|
+
/** Divider size as a fraction of the toolbar container dimension */
|
|
6285
|
+
readonly HeightRatio: 0.5;
|
|
6286
|
+
};
|
|
6287
|
+
/**
|
|
6288
|
+
* Design tokens for the ToolbarIconButton component.
|
|
6289
|
+
* Sizes follow MD3 Expressive touch-target minimums (48dp height always).
|
|
6290
|
+
* - narrow: de-emphasised secondary actions
|
|
6291
|
+
* - default: standard icon button
|
|
6292
|
+
* - wide: primary action emphasis inside the toolbar
|
|
6293
|
+
*/
|
|
6294
|
+
declare const ToolbarIconButtonTokens: {
|
|
6295
|
+
readonly NarrowWidth: 40;
|
|
6296
|
+
readonly DefaultWidth: 48;
|
|
6297
|
+
readonly WideWidth: 64;
|
|
6298
|
+
/** Minimum touch-target height per MD3 accessibility guidelines */
|
|
6299
|
+
readonly Height: 48;
|
|
6300
|
+
};
|
|
6301
|
+
|
|
5864
6302
|
type TooltipPlacement = "top" | "bottom" | "left" | "right" | "auto";
|
|
5865
6303
|
type TooltipTrigger = "hover" | "focus" | "click" | "long-press" | "manual";
|
|
5866
6304
|
interface TooltipStateConfig {
|
|
@@ -6132,4 +6570,4 @@ declare const TypeScaleTokens: {
|
|
|
6132
6570
|
};
|
|
6133
6571
|
type TypeScaleTokensType = typeof TypeScaleTokens;
|
|
6134
6572
|
|
|
6135
|
-
export { APP_BAR_BOTTOM_SPRING, APP_BAR_COLORS, APP_BAR_COLOR_TRANSITION, APP_BAR_ENTER_ALWAYS_SPRING, APP_BAR_TITLE_FADE, type AppBarColors, AppBarColumn, type AppBarColumnProps, type AppBarItem, type AppBarItemType, type AppBarMenuState, AppBarOverflowIndicator, type AppBarOverflowIndicatorProps, AppBarRow, type AppBarRowProps, type AppBarScrollBehavior, AppBarTokens, Badge, type BadgeProps, BadgedBox, type BadgedBoxProps, type BaseAppBarProps, type BaseButtonProps, type BaseIconButtonProps, BottomAppBar, type BottomAppBarProps, Button, ButtonGroup, type ButtonGroupProps, type ButtonProps, CHECK_ICON_VARIANTS, Card, type CardProps, type CaretConfig, Checkbox, type CheckboxProps, type CheckboxState, Chip, type ChipProps, type CircularProgressProps, CodeBlock, type CodeBlockProps, ContextMenu, ContextMenuContent, type ContextMenuContentProps, type ContextMenuProps, ContextMenuTrigger, type ContextMenuTriggerProps, DIVIDER_COLOR, DIVIDER_PADDING, Dialog, DialogBody, DialogClose, DialogContent, type DialogContentProps, DialogDescription, DialogFooter, DialogFullScreenContent, type DialogFullScreenContentProps, DialogHeader, DialogIcon, DialogOverlay, DialogPortal, type DialogProps, DialogTitle, DialogTrigger, Divider, type DividerProps, DockedToolbar, type DockedToolbarProps, Drawer, DrawerClose, DrawerContent, type DrawerContentProps, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, type DrawerProps, DrawerTitle, DrawerTrigger, FAB, FABMenu, FABMenuItem, type FABMenuItemData, type FABMenuItemProps, type FABMenuProps, FABPosition, type FABPositionProps, type FABProps, FAST_EFFECTS_TRANSITION, FAST_SPATIAL_SPRING, type FlexibleAppBarProps, GROUP_SHAPES, ITEM_SHAPE_CLASSES, Icon, IconButton, type IconButtonProps, type IconProps, LargeFlexibleAppBar, type LinearProgressProps, LoadingIndicator, type LoadingIndicatorProps, type MD3ColorScheme, type MD3ColorStyle, type MD3Shape, type MD3Size, MD3ThemeProvider, type MD3ThemeProviderProps, MD3_EXPRESSIVE_FONT_VARIATION, MENU_CHECK_ICON_SIZE, MENU_CONTAINER_VARIANTS, MENU_GROUP_GAP, MENU_ICON_SIZE, MENU_ITEM_MIN_HEIGHT, MENU_MAX_WIDTH, MENU_MIN_WIDTH, MaterialSymbolsPreconnect, MediumFlexibleAppBar, Menu, type MenuColorVariant, MenuContent, type MenuContentProps, MenuDivider, type MenuDividerProps, MenuGroup, type MenuGroupPosition, type MenuGroupProps, MenuItem, type MenuItemPosition, type MenuItemProps, type MenuPrimitive, type MenuProps, MenuProvider, MenuTrigger, type MenuTriggerProps, type MenuVariant, NavigationRail, NavigationRailItem, type NavigationRailItemProps, type NavigationRailLabelVisibility, type NavigationRailProps, type NavigationRailVariant, PlainTooltip, type PlainTooltipProps, type PolymorphicProps, type PolymorphicRef, ProgressIndicator, type ProgressIndicatorProps, RadioButton, type RadioButtonColors, type RadioButtonProps, RadioGroup, type RadioGroupProps, RangeSlider, type RangeSliderProps, RichTooltip, type RichTooltipProps, Ripple, type RippleOrigin, type RippleProps, SEARCH_BAR_EXPAND_SPRING, SEARCH_COLORS, SEARCH_DOCKED_REVEAL_SPRING, SEARCH_FULLSCREEN_SPRING, SEARCH_TYPOGRAPHY, SEARCH_VIEW_SPRING, STANDARD_COLORS, SUBMENU_CONTAINER_VARIANTS, ScrollArea, type ScrollAreaOrientation, type ScrollAreaProps, ScrollAreaScrollbar, type ScrollAreaType, Search, SearchAppBar, type SearchAppBarProps, SearchBar, type SearchBarVariant, type SearchProps, type SearchStyleType, SearchTokens, type SearchVariant, SearchView, SearchViewContainer, SearchViewDocked, SearchViewFullScreen, type SearchViewProps, Slider, SliderColors, type SliderOrientation, type SliderProps, SliderTokens, type SliderTrackSize, type SliderVariant, SmallAppBar, type SmallAppBarProps, Snackbar, type SnackbarData, type SnackbarDuration, SnackbarHost, type SnackbarHostProps, type SnackbarProps, SnackbarProvider, type SnackbarResult, type SnackbarVisuals, SubMenu, type SubMenuProps, Switch, SwitchColors, type SwitchProps, SwitchTokens, Tab, type TabProps, TableOfContents, type TableOfContentsProps, Tabs, TabsColors, TabsContent, type TabsContentProps, TabsList, type TabsListProps, type TabsProps, TabsTokens, type TabsVariant, Text, TextField, type TextFieldHandle, type TextFieldInputType, type TextFieldProps, type TextFieldTrailingIconMode, type TextFieldVariant, type TextProps, type TextStyle, type ThemeMode, type TitleAlignment, type ToCItem, ToggleFAB, type ToggleFABProps, TooltipBox, type TooltipBoxProps, TooltipCaretShape, type TooltipPlacement, type TooltipState, type TooltipStateConfig, TooltipTokens, type TooltipTrigger, TriStateCheckbox, type TriStateCheckboxProps, TypeScaleTokens, type TypeScaleTokensType, Typography, TypographyContext, TypographyKeyTokens, TypographyProvider, type TypographyProviderProps, TypographyTokens, type UseAppBarScrollReturn, type UseRippleStateOptions, type UseSnackbarStateReturn, VIBRANT_COLORS, VerticalMenu, VerticalMenuContent, type VerticalMenuContentProps, VerticalMenuDivider, type VerticalMenuDividerProps, VerticalMenuGroup, type VerticalMenuGroupProps, type VerticalMenuProps, type VerticalMenuSeparatorStyle, appBarTypography, applyTheme, buildWavePath, cn, generateM3Theme, resolveMode, useAppBarScroll, useRipple$1 as useDOMRipple, useMediaQuery, useMenuContext, useRipple, useRippleState, useSearchKeyboard, useSnackbar, useSnackbarState, useTheme, useThemeMode, useTooltipPosition, useTooltipState, useTypography };
|
|
6573
|
+
export { APP_BAR_BOTTOM_SPRING, APP_BAR_COLORS, APP_BAR_COLOR_TRANSITION, APP_BAR_ENTER_ALWAYS_SPRING, APP_BAR_TITLE_FADE, type AppBarColors, AppBarColumn, type AppBarColumnProps, type AppBarItem, type AppBarItemType, type AppBarMenuState, AppBarOverflowIndicator, type AppBarOverflowIndicatorProps, AppBarRow, type AppBarRowProps, type AppBarScrollBehavior, AppBarTokens, BUTTON_COLOR_TOKENS, BUTTON_SIZE_TOKENS, Badge, type BadgeProps, BadgedBox, type BadgedBoxProps, type BaseAppBarProps, type BaseButtonProps, type BaseIconButtonProps, BottomAppBar, type BottomAppBarProps, BottomDockedToolbar, type BottomDockedToolbarProps, Button, ButtonGroup, type ButtonGroupOrientation, type ButtonGroupProps, type ButtonGroupVariant, type ButtonProps, CHECK_ICON_VARIANTS, Card, type CardProps, type CaretConfig, Checkbox, type CheckboxProps, type CheckboxState, Chip, type ChipProps, type CircularProgressProps, CodeBlock, type CodeBlockProps, ContextMenu, ContextMenuContent, type ContextMenuContentProps, type ContextMenuProps, ContextMenuTrigger, type ContextMenuTriggerProps, DIVIDER_COLOR, DIVIDER_PADDING, Dialog, DialogBody, DialogClose, DialogContent, type DialogContentProps, DialogDescription, DialogFooter, DialogFullScreenContent, type DialogFullScreenContentProps, DialogHeader, DialogIcon, DialogOverlay, DialogPortal, type DialogProps, DialogTitle, DialogTrigger, Divider, type DividerProps, DockedToolbar, type DockedToolbarProps, Drawer, DrawerClose, DrawerContent, type DrawerContentProps, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, type DrawerProps, DrawerTitle, DrawerTrigger, FAB, FABMenu, FABMenuItem, type FABMenuItemData, type FABMenuItemProps, type FABMenuProps, FABPosition, type FABPositionProps, type FABProps, FAST_EFFECTS_TRANSITION, FAST_SPATIAL_SPRING, type FlexibleAppBarProps, type FloatingToolbarColors, type FloatingToolbarProps, type FloatingToolbarScrollBehavior, type FloatingToolbarWithFabProps, GROUP_SHAPES, HorizontalFloatingToolbar, HorizontalFloatingToolbarWithFab, ITEM_SHAPE_CLASSES, Icon, IconButton, type IconButtonProps, type IconProps, LargeFlexibleAppBar, type LinearProgressProps, LoadingIndicator, type LoadingIndicatorProps, type MD3ColorScheme, type MD3ColorStyle, type MD3Shape, type MD3Size, MD3ThemeProvider, type MD3ThemeProviderProps, MD3_EXPRESSIVE_FONT_VARIATION, MENU_CHECK_ICON_SIZE, MENU_CONTAINER_VARIANTS, MENU_GROUP_GAP, MENU_ICON_SIZE, MENU_ITEM_MIN_HEIGHT, MENU_MAX_WIDTH, MENU_MIN_WIDTH, MaterialSymbolsPreconnect, MediumFlexibleAppBar, Menu, type MenuColorVariant, MenuContent, type MenuContentProps, MenuDivider, type MenuDividerProps, MenuGroup, type MenuGroupPosition, type MenuGroupProps, MenuItem, type MenuItemPosition, type MenuItemProps, type MenuPrimitive, type MenuProps, MenuProvider, MenuTrigger, type MenuTriggerProps, type MenuVariant, NavigationBar, NavigationBarItem, type NavigationBarItemLayout, type NavigationBarItemProps, type NavigationBarProps, type NavigationBarVariant, NavigationRail, NavigationRailItem, type NavigationRailItemProps, type NavigationRailLabelVisibility, type NavigationRailProps, type NavigationRailVariant, PlainTooltip, type PlainTooltipProps, type PolymorphicProps, type PolymorphicRef, ProgressIndicator, type ProgressIndicatorProps, RadioButton, type RadioButtonColors, type RadioButtonProps, RadioGroup, type RadioGroupProps, RangeSlider, type RangeSliderProps, RichTooltip, type RichTooltipProps, Ripple, type RippleOrigin, type RippleProps, SEARCH_BAR_EXPAND_SPRING, SEARCH_COLORS, SEARCH_DOCKED_REVEAL_SPRING, SEARCH_FULLSCREEN_SPRING, SEARCH_TYPOGRAPHY, SEARCH_VIEW_SPRING, STANDARD_COLORS, SUBMENU_CONTAINER_VARIANTS, ScrollArea, type ScrollAreaOrientation, type ScrollAreaProps, ScrollAreaScrollbar, type ScrollAreaType, Search, SearchAppBar, type SearchAppBarProps, SearchBar, type SearchBarVariant, type SearchProps, type SearchStyleType, SearchTokens, type SearchVariant, SearchView, SearchViewContainer, SearchViewDocked, SearchViewFullScreen, type SearchViewProps, Slider, SliderColors, type SliderOrientation, type SliderProps, SliderTokens, type SliderTrackSize, type SliderVariant, SmallAppBar, type SmallAppBarProps, Snackbar, type SnackbarData, type SnackbarDuration, SnackbarHost, type SnackbarHostProps, type SnackbarProps, SnackbarProvider, type SnackbarResult, type SnackbarVisuals, SubMenu, type SubMenuProps, Switch, SwitchColors, type SwitchProps, SwitchTokens, Tab, type TabProps, TableOfContents, type TableOfContentsProps, Tabs, TabsColors, TabsContent, type TabsContentProps, TabsList, type TabsListProps, type TabsProps, TabsTokens, type TabsVariant, Text, TextField, type TextFieldHandle, type TextFieldInputType, type TextFieldProps, type TextFieldTrailingIconMode, type TextFieldVariant, type TextProps, type TextStyle, type ThemeMode, type TitleAlignment, type ToCItem, ToggleFAB, type ToggleFABProps, ToolbarDivider, type ToolbarDividerProps, ToolbarDividerTokens, ToolbarIconButton, type ToolbarIconButtonProps, type ToolbarIconButtonSize, ToolbarIconButtonTokens, type ToolbarIconButtonVariant, TooltipBox, type TooltipBoxProps, TooltipCaretShape, type TooltipPlacement, type TooltipState, type TooltipStateConfig, TooltipTokens, type TooltipTrigger, TriStateCheckbox, type TriStateCheckboxProps, TypeScaleTokens, type TypeScaleTokensType, Typography, TypographyContext, TypographyKeyTokens, TypographyProvider, type TypographyProviderProps, TypographyTokens, type UseAppBarScrollReturn, type UseFloatingToolbarScrollBehaviorOptions, type UseRippleStateOptions, type UseSnackbarStateReturn, VIBRANT_COLORS, VerticalFloatingToolbar, VerticalFloatingToolbarWithFab, VerticalMenu, VerticalMenuContent, type VerticalMenuContentProps, VerticalMenuDivider, type VerticalMenuDividerProps, VerticalMenuGroup, type VerticalMenuGroupProps, type VerticalMenuProps, type VerticalMenuSeparatorStyle, appBarTypography, applyTheme, buildWavePath, cn, generateM3Theme, resolveMode, standardFloatingToolbarColors, useAppBarScroll, useRipple$1 as useDOMRipple, useFloatingToolbarScrollBehavior, useMediaQuery, useMenuContext, useRipple, useRippleState, useSearchKeyboard, useSnackbar, useSnackbarState, useTheme, useThemeMode, useTooltipPosition, useTooltipState, useTypography, vibrantFloatingToolbarColors };
|