@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.
Files changed (86) hide show
  1. package/.turbo/turbo-build.log +42 -42
  2. package/CHANGELOG.md +10 -0
  3. package/dist/index.css +107 -0
  4. package/dist/index.d.mts +1491 -1053
  5. package/dist/index.d.ts +1491 -1053
  6. package/dist/index.js +4457 -3156
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +4394 -3109
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +11 -6
  11. package/scripts/copy-assets.js +113 -8
  12. package/src/index.ts +66 -18
  13. package/src/test/button.test.tsx +1 -1
  14. package/src/ui/app-bar/app-bar.tokens.ts +5 -24
  15. package/src/ui/badge.tsx +2 -1
  16. package/src/ui/buttons/button/button-tokens.ts +118 -0
  17. package/src/ui/{button.test.tsx → buttons/button/button.test.tsx} +0 -21
  18. package/src/ui/buttons/button/button.tsx +381 -0
  19. package/src/ui/buttons/button/index.ts +3 -0
  20. package/src/ui/buttons/button/types.ts +90 -0
  21. package/src/ui/buttons/button-group/button-group-defaults.ts +95 -0
  22. package/src/ui/buttons/button-group/button-group-tokens.ts +20 -0
  23. package/src/ui/{button-group.test.tsx → buttons/button-group/button-group.test.tsx} +9 -10
  24. package/src/ui/buttons/button-group/button-group.tsx +699 -0
  25. package/src/ui/buttons/button-group/index.ts +8 -0
  26. package/src/ui/buttons/button-group/types.ts +77 -0
  27. package/src/ui/{fab.tsx → buttons/fabs/fab/fab.tsx} +6 -6
  28. package/src/ui/buttons/fabs/fab/index.ts +1 -0
  29. package/src/ui/{fab-menu.tsx → buttons/fabs/fab-menu/fab-menu.tsx} +7 -4
  30. package/src/ui/buttons/fabs/fab-menu/index.ts +1 -0
  31. package/src/ui/buttons/fabs/index.ts +2 -0
  32. package/src/ui/{icon-button.tsx → buttons/icon-button/icon-button.tsx} +6 -6
  33. package/src/ui/buttons/icon-button/index.ts +1 -0
  34. package/src/ui/buttons/index.ts +4 -0
  35. package/src/ui/code-block.tsx +1 -1
  36. package/src/ui/dialog.tsx +4 -7
  37. package/src/ui/drawer.tsx +4 -7
  38. package/src/ui/menu/menu-animations.ts +14 -20
  39. package/src/ui/menu/menu-tokens.ts +7 -5
  40. package/src/ui/menu/menu.test.tsx +9 -4
  41. package/src/ui/navigation-bar.test.tsx +111 -0
  42. package/src/ui/navigation-bar.tsx +464 -0
  43. package/src/ui/navigation-rail.test.tsx +5 -4
  44. package/src/ui/navigation-rail.tsx +32 -23
  45. package/src/ui/scroll-area.tsx +4 -0
  46. package/src/ui/search/search-view-fullscreen.tsx +1 -1
  47. package/src/ui/search/search.tokens.ts +9 -43
  48. package/src/ui/search/trailing-action.tsx +1 -1
  49. package/src/ui/shared/constants.ts +25 -27
  50. package/src/ui/shared/motion-tokens.ts +238 -0
  51. package/src/ui/snackbar/snackbar.tsx +4 -6
  52. package/src/ui/switch/switch.tsx +12 -18
  53. package/src/ui/text-field/text-field.tokens.ts +12 -12
  54. package/src/ui/text-field/text-field.tsx +31 -19
  55. package/src/ui/theme-provider/index.tsx +1 -5
  56. package/src/ui/toc.tsx +1 -1
  57. package/src/ui/toolbar/__snapshots__/bottom-docked-toolbar.test.tsx.snap +51 -0
  58. package/src/ui/toolbar/__snapshots__/floating-toolbar-with-fab.test.tsx.snap +113 -0
  59. package/src/ui/toolbar/__snapshots__/floating-toolbar.test.tsx.snap +169 -0
  60. package/src/ui/toolbar/bottom-docked-toolbar.test.tsx +114 -0
  61. package/src/ui/toolbar/docked-toolbar.tsx +186 -0
  62. package/src/ui/toolbar/floating-toolbar-with-fab.test.tsx +139 -0
  63. package/src/ui/toolbar/floating-toolbar-with-fab.tsx +199 -0
  64. package/src/ui/toolbar/floating-toolbar.test.tsx +230 -0
  65. package/src/ui/toolbar/floating-toolbar.tsx +344 -0
  66. package/src/ui/toolbar/index.ts +35 -0
  67. package/src/ui/toolbar/toolbar-colors.ts +37 -0
  68. package/src/ui/toolbar/toolbar-context.tsx +13 -0
  69. package/src/ui/toolbar/toolbar-divider.test.tsx +54 -0
  70. package/src/ui/toolbar/toolbar-divider.tsx +73 -0
  71. package/src/ui/toolbar/toolbar-icon-button.test.tsx +68 -0
  72. package/src/ui/toolbar/toolbar-icon-button.tsx +136 -0
  73. package/src/ui/toolbar/toolbar-scroll-behavior.ts +140 -0
  74. package/src/ui/toolbar/toolbar-tokens.ts +51 -0
  75. package/test-clip.html +31 -0
  76. package/test-shadow.html +5 -1
  77. package/test-width.html +34 -0
  78. package/src/ui/button-group.tsx +0 -350
  79. package/src/ui/button.tsx +0 -665
  80. package/test-render.tsx +0 -4
  81. package/test_output.txt +0 -164
  82. package/test_output_v2.txt +0 -5
  83. /package/src/ui/{fab.test.tsx → buttons/fabs/fab/fab.test.tsx} +0 -0
  84. /package/src/ui/{fab-menu.test.tsx → buttons/fabs/fab-menu/fab-menu.test.tsx} +0 -0
  85. /package/src/ui/{icon-button.test.tsx → buttons/icon-button/icon-button.test.tsx} +0 -0
  86. /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 { HTMLMotionProps, Variants, Transition } from 'motion/react';
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
- readonly type: "spring";
335
- readonly stiffness: 380;
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
- * Visual style variant following MD3 color roles.
1084
+ * The visual style of the button.
1085
+ * Maps to MD3 emphasis levels.
1125
1086
  * @default "filled"
1126
1087
  */
1127
- colorStyle?: "elevated" | "filled" | "tonal" | "outlined" | "text";
1088
+ colorStyle?: MD3ColorStyle;
1128
1089
  /**
1129
- * Color style applied when the toggle button is in the *selected* state.
1130
- * Only meaningful when `variant="toggle"`.
1131
- * Falls back to `"filled"` when not specified.
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?: "elevated" | "filled" | "tonal" | "outlined" | "text";
1094
+ selectedColorStyle?: MD3ColorStyle;
1134
1095
  /**
1135
- * Button size following MD3 Expressive size scale.
1096
+ * The size variant of the button.
1136
1097
  * @default "sm"
1137
1098
  */
1138
- size?: "xs" | "sm" | "md" | "lg" | "xl";
1099
+ size?: MD3Size;
1139
1100
  /**
1140
- * Container shape controls border-radius morphing.
1141
- * - `round`: pill shape (CornerFull), morphs to rounded-square when toggled.
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?: "round" | "square";
1105
+ shape?: MD3Shape;
1146
1106
  /**
1147
- * Optional leading or trailing icon node.
1148
- * Size is automatically scaled to match the button's `size` prop.
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
- icon?: React$1.ReactNode;
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 text.
1116
+ * Position of the icon relative to the label.
1153
1117
  * @default "leading"
1154
1118
  */
1155
1119
  iconPosition?: "leading" | "trailing";
1156
1120
  /**
1157
- * When `true`, replaces the icon with an animated loading indicator
1158
- * and prevents interaction.
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
- * Controls which loading spinner is shown while `loading={true}`.
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
- * When `true`, the Button renders its child element directly (using Radix Slot),
1171
- * merging all button props (className, style, event handlers) onto it.
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
- /** Button label — any React content, typically a string. */
1184
- children: React$1.ReactNode;
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?: "standard" | "connected";
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?: "horizontal" | "vertical";
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?: "xs" | "sm" | "md" | "lg" | "xl";
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
- * Buộc card trở thành interactive không `onClick`.
1316
- * Hữu ích khi card chứa các element con interactive.
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
- interactive?: boolean;
1300
+ iconBehavior?: "selected" | "all" | "none";
1319
1301
  /**
1320
- * Nếu có, card render thành thẻ `<a>`. Tự động kích hoạt interactive mode.
1321
- * Ưu tiên dùng `href` thay `onClick` khi điều hướng trang.
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
- href?: string;
1324
- /** Target cho thẻ `<a>` (chỉ có hiệu lực khi `href` được cung cấp). */
1325
- target?: React$1.AnchorHTMLAttributes<HTMLAnchorElement>["target"];
1326
- /** rel cho thẻ `<a>` (tự động thêm `noreferrer` khi `target="_blank"`). */
1327
- rel?: string;
1328
- children?: React$1.ReactNode;
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
- * Tri-state value: `"unchecked"` | `"checked"` | `"indeterminate"`.
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
- * Convenience wrapper around `Checkbox` that enforces `state` + `onStateChange`.
1406
- * Ideal for parent-child selection patterns.
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
- * @example
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
- declare const TriStateCheckbox: React$1.NamedExoticComponent<Omit<TriStateCheckboxProps, "ref"> & React$1.RefAttributes<HTMLInputElement>>;
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
- * Chip variant.
1421
- * - `assist` → Smart/automated actions. Flat by default, can be elevated.
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
- variant?: VariantProps<typeof chipVariants>["variant"];
1342
+ icon: React$1.ReactNode;
1428
1343
  /**
1429
- * Renders with elevation shadow (Level 1) and fills background with `surface-container-low`.
1430
- * Applicable to `assist`, `filter` (unselected), and `suggestion` variants.
1431
- * Source: AssistChipTokens.ElevatedContainerColor / SuggestionChipTokens.ElevatedContainerColor
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
- elevated?: boolean;
1351
+ size?: "sm" | "md" | "lg" | "xl";
1434
1352
  /**
1435
- * Toggle/selection state.
1436
- * - `filter`: selected → bg `secondary-container`, animated checkmark appears.
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
- selected?: boolean;
1356
+ colorStyle?: "primary" | "secondary" | "tertiary" | "surface";
1441
1357
  /**
1442
- * Disables the chip. Applies:
1443
- * - `pointer-events-none` no mouse/touch interaction
1444
- * - `opacity-[0.38]` – DisabledLabelTextOpacity (0.38) per MD3 tokens
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
- disabled?: boolean;
1362
+ extended?: boolean;
1449
1363
  /**
1450
- * Visible label. Required. Can be a string or ReactNode.
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
- label: React$1.ReactNode;
1367
+ children?: React$1.ReactNode;
1453
1368
  /**
1454
- * Optional leading icon element (18×18px recommended).
1455
- * For `filter` chips with `selected=true`, this is replaced by an animated checkmark.
1456
- * For `assist`/`suggestion`: icon color → `primary`
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
- leadingIcon?: React$1.ReactNode;
1373
+ lowered?: boolean;
1460
1374
  /**
1461
- * Optional trailing icon element (18×18px recommended).
1462
- * Color: `on-surface-variant` (unselected) / `on-secondary-container` (selected).
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
- trailingIcon?: React$1.ReactNode;
1378
+ loading?: boolean;
1465
1379
  /**
1466
- * Avatar element for `input` chips. Takes priority over `leadingIcon`.
1467
- * Rendered as a 24×24px circle (InputChipTokens: AvatarSize = 24.dp, AvatarShape = CornerFull).
1380
+ * 2 chuẩn hình của Loading chờ.
1381
+ * @default "loading-indicator"
1468
1382
  */
1469
- avatar?: React$1.ReactNode;
1383
+ loadingVariant?: "loading-indicator" | "circular";
1470
1384
  /**
1471
- * Callback when the trailing remove (×) button is activated on `input` chips.
1472
- * When provided, a dedicated tabbable close button with `aria-label="Remove {label}"` is rendered.
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
- onRemove?: (e: React$1.MouseEvent<HTMLButtonElement>) => void;
1388
+ visible?: boolean;
1475
1389
  }
1476
1390
  /**
1477
- * MD3 Expressive Chip4-variant interactive tag component.
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
- * @remarks
1480
- * - `filter` chips accept `selected` and render an animated checkmark.
1481
- * - `input` chips accept `onRemove` to render a compound close button.
1482
- * - `elevated` is supported on `assist`, `filter` (unselected), and `suggestion`.
1483
- * - Fully accessible: `role="checkbox"` for filter, `role="group"` for compound chips.
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
- * // Assist chip
1488
- * <Chip variant="assist" label="Share" onClick={share} />
1489
- *
1490
- * // Filter chip
1491
- * <Chip variant="filter" label="Unread" selected={showUnread} onClick={toggle} />
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ẽ 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 https://m3.material.io/components/chips/overview
1422
+ * @see {@link FAB}
1423
+ * @see https://m3.material.io/components/floating-action-button/guidelines
1498
1424
  */
1499
- declare const Chip: React$1.NamedExoticComponent<ChipProps & React$1.RefAttributes<HTMLButtonElement>>;
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
- * 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ở.
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
- * const [open, setOpen] = React.useState(false);
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
- * <Dialog open={open} onOpenChange={setOpen}>
1524
- * <DialogTrigger asChild>
1525
- * <Button>Bấm Mở Dialog</Button>
1526
- * </DialogTrigger>
1527
- * <DialogContent>
1528
- * <DialogHeader>
1529
- * <DialogTitle>Bạn có muốn phiêu lưu không?</DialogTitle>
1530
- * </DialogHeader>
1531
- * <DialogBody>Chuẩn bị lên đồ rời khỏi hang nào.</DialogBody>
1532
- * <DialogFooter>
1533
- * <Button onClick={() => setOpen(false)} variant="text">Đóng</Button>
1534
- * </DialogFooter>
1535
- * </DialogContent>
1536
- * </Dialog>
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
- interface DialogProps {
1540
- /** Whether the dialog is open (controlled). Omit for uncontrolled. */
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
- * Các props được tiêm vào component bao ngoài Container `DialogContent` thuộc dạng Normal Standard.
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
- * @see {@link DialogContent}
1477
+ * Nếu bỏ qua thuộc tính `label`, item sẽ render dạng ô vuông chỉ có icon.
1551
1478
  */
1552
- interface DialogContentProps extends React$1.ComponentPropsWithoutRef<typeof RadixDialog.Content> {
1553
- /** hình đi đi nút Close dấu (X) góc phải trên. @default false */
1554
- hideCloseButton?: boolean;
1479
+ interface FABMenuItemData {
1480
+ /** Một ID duy nhất để dùng cho key react quản 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
- * 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.
1498
+ * Các props điều khiển Component chính `FABMenu`.
1559
1499
  *
1560
1500
  * @remarks
1561
- * Những hộp thoại Full-screen biệt tài tự nới rộng 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)
1562
- * kẹp chung cả 1 nhãn title 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ò.
1563
- *
1564
- * @see {@link DialogFullScreenContent}
1565
- * @see https://m3.material.io/components/dialogs/guidelines#full-screen
1501
+ * FABMenu quản vòng đời trạng thái mở/đóng menu (open/close), quản focus, điều khiển phím,
1502
+ * đ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 DialogFullScreenContentProps extends React$1.ComponentPropsWithoutRef<typeof RadixDialog.Content> {
1568
- /** Nhãn Title nằm vùng khu vực thanh ngang Top Bar. */
1569
- title?: string;
1570
- /** 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"). */
1571
- actionLabel?: string;
1572
- /** Hàm handler phát động cờ để kích chạy tính năng lưu, xác nhận kia. */
1573
- onAction?: () => void;
1574
- /** 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 */
1575
- showDivider?: boolean;
1505
+ interface FABMenuProps {
1506
+ /** FAB Menu đ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 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
- * Gốc rễ Root của Component Dialog — trạc lấp lên cái module `Dialog.Root` của nhà Radix.
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
- declare const Dialog: {
1585
- ({ open, onOpenChange, children }: DialogProps): react_jsx_runtime.JSX.Element;
1586
- displayName: string;
1587
- };
1588
- /** 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`. */
1589
- declare const DialogTrigger: React$1.ForwardRefExoticComponent<RadixDialog.DialogTriggerProps & React$1.RefAttributes<HTMLButtonElement>>;
1590
- declare const DialogPortal: {
1591
- ({ open, children, }: {
1592
- open?: boolean;
1593
- children: React$1.ReactNode;
1594
- }): react_jsx_runtime.JSX.Element;
1595
- displayName: string;
1596
- };
1597
- declare const DialogOverlay: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogOverlayProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
1598
- declare const DialogContent: React$1.ForwardRefExoticComponent<DialogContentProps & React$1.RefAttributes<HTMLDivElement>>;
1599
- declare const DialogIcon: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
1600
- declare const DialogHeader: {
1601
- ({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1602
- displayName: string;
1603
- };
1604
- declare const DialogTitle: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogTitleProps & React$1.RefAttributes<HTMLHeadingElement>, "ref"> & React$1.RefAttributes<HTMLHeadingElement>>;
1605
- declare const DialogDescription: React$1.ForwardRefExoticComponent<Omit<RadixDialog.DialogDescriptionProps & React$1.RefAttributes<HTMLParagraphElement>, "ref"> & React$1.RefAttributes<HTMLParagraphElement>>;
1606
- declare const DialogBody: React$1.ForwardRefExoticComponent<React$1.HTMLAttributes<HTMLDivElement> & React$1.RefAttributes<HTMLDivElement>>;
1607
- declare const DialogFooter: {
1608
- ({ className, ...props }: React$1.HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1609
- displayName: string;
1610
- };
1611
- declare const DialogClose: React$1.ForwardRefExoticComponent<RadixDialog.DialogCloseProps & React$1.RefAttributes<HTMLButtonElement>>;
1612
- declare const DialogFullScreenContent: React$1.ForwardRefExoticComponent<DialogFullScreenContentProps & React$1.RefAttributes<HTMLDivElement>>;
1613
-
1614
- /**
1615
- * @file divider.tsx
1616
- *
1617
- * MD3 Expressive Divider component.
1618
- *
1619
- * - `Divider` → A thin line that groups content in lists and layouts.
1620
- *
1549
+ interface ToggleFABProps {
1550
+ /** Nút đ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
- * Token references (Kotlin source DividerTokens.kt v0_117):
1623
- * Color = ColorSchemeKeyTokens.OutlineVariant bg-m3-outline-variant / text-m3-outline-variant
1624
- * Thickness = 1.0.dp → h-px (flat horizontal) | w-px (flat vertical) | strokeWidth={1} (wavy SVG)
1627
+ * Những thành phần khi bị tắt ( 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
- * Variants:
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
- * Shapes:
1633
- * - "flat" straight 1px line rendered as <m.div> (default)
1634
- * - "wavy" → sinusoidal SVG wave via <m.svg> + buildWavePath helper (horizontal only)
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
- * Architecture:
1637
- * - Styling: `cn` (clsx/tailwind-merge) + static Tailwind classes only
1638
- * - Animation: Framer Motion LazyMotion/domMax, scaleX/scaleY spring entrance
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
- * @see https://m3.material.io/components/divider/overview
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
- type SafeHTMLDivAttrs = Omit<React$1.HTMLAttributes<HTMLDivElement>, "onDrag" | "onDragStart" | "onDragEnd" | "onDragEnter" | "onDragLeave" | "onDragOver" | "onDrop">;
1648
- interface DividerProps extends SafeHTMLDivAttrs {
1649
- /**
1650
- * Visual variant controlling indentation.
1651
- * - "full-bleed" → no indent, spans full container width/height (default)
1652
- * - "inset" → leading indent only (use `insetStart` to control amount)
1653
- * - "middle-inset" 16px indent on both sides
1654
- * - "subheader" → alias for full-bleed, used before section labels
1655
- * @default "full-bleed"
1656
- */
1657
- variant?: "full-bleed" | "inset" | "middle-inset" | "subheader";
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
- * Orientation of the divider line.
1660
- * - "horizontal" → renders as `h-px w-full` bar (default)
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
- orientation?: "horizontal" | "vertical";
1691
+ colorStyle?: "standard" | "filled" | "tonal" | "outlined";
1666
1692
  /**
1667
- * Shape of the divider line.
1668
- * - "flat" → straight 1px line rendered as `<div>` (default)
1669
- * - "wavy" → sinusoidal SVG wave (horizontal orientation only)
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
- shape?: "flat" | "wavy";
1697
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
1676
1698
  /**
1677
- * Leading inset size for the "inset" variant.
1678
- * - "standard" 16px (`ml-4`)
1679
- * - "icon" → 72px (`ml-[72px]`) use when list items have leading icons/avatars
1680
- * Only applies when `variant="inset"`.
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
- insetStart?: "standard" | "icon";
1704
+ shape?: "round" | "square";
1684
1705
  /**
1685
- * Wavy shape visual parameters. Only applies when `shape="wavy"`.
1686
- * All values are in pixels.
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
- waveConfig?: {
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
- * When true, marks the divider as decorative (`aria-hidden="true"`).
1707
- * Use when the divider is purely visual with no semantic meaning.
1708
- * @default false
1712
+ * Spinner style shown while `loading={true}`.
1713
+ * @default "loading-indicator"
1709
1714
  */
1710
- decorative?: boolean;
1715
+ loadingVariant?: "loading-indicator" | "circular";
1716
+ /** Icon content — typically a single SVG icon component. */
1717
+ children: React$1.ReactNode;
1711
1718
  /**
1712
- * When true, plays an entrance animation (scaleX/scaleY from 0→1).
1713
- * Automatically disabled when user prefers reduced motion.
1714
- * @default true
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
- animate?: boolean;
1724
+ "aria-label": string;
1717
1725
  }
1718
1726
  /**
1719
- * Generates an SVG path `d` string for a sinusoidal wave between two X bounds.
1720
- * Uses cubic Bézier approximation of a sine curve for smooth rendering.
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
- * Each half-cycle alternates between crest (+amplitude) and trough (-amplitude).
1724
- * Control points are placed at 1/3 and 2/3 of each half-cycle for accuracy.
1730
+ * @example
1731
+ * ```tsx
1732
+ * // Standard
1733
+ * <IconButton aria-label="Close" onClick={handleClose}>
1734
+ * <XIcon />
1735
+ * </IconButton>
1725
1736
  *
1726
- * @param startX - X coordinate where the path begins (e.g. capWidth = strokeWidth/2)
1727
- * @param endX - X coordinate where the path ends (e.g. containerWidth - capWidth)
1728
- * @param amplitude - Peak displacement from center line (px). Default: 2
1729
- * @param wavelength - Pixels per full sine cycle. Default: 32
1730
- * @param yCenter - Y coordinate of the wave center line. Default: 4
1731
- * @returns SVG path `d` attribute string, or "" when startX >= endX
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
- * @example
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
- declare function buildWavePath(startX: number, endX: number, amplitude?: number, wavelength?: number, yCenter?: number): string;
1751
+ type IconButtonProps = BaseIconButtonProps & ({
1752
+ variant?: "default";
1753
+ selected?: never;
1754
+ } | {
1755
+ variant: "toggle";
1756
+ selected: boolean;
1757
+ });
1738
1758
  /**
1739
- * MD3 Expressive Divider — a thin line that groups content in lists and layouts.
1759
+ * MD3 Expressive Icon Button.
1740
1760
  *
1741
- * Supports four layout variants (full-bleed, inset, middle-inset, subheader),
1742
- * two orientations (horizontal, vertical), and two shape modes (flat, wavy).
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
- * The wavy shape renders a sinusoidal SVG wave and is only supported with
1745
- * `orientation="horizontal"`.
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
- * // Default flat full-bleed horizontal divider
1750
- * <Divider />
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
- * // Middle-inset wavy divider
1771
- * <Divider variant="middle-inset" shape="wavy" />
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/divider/overview
1787
+ * @see https://m3.material.io/components/icon-buttons/overview
1775
1788
  */
1776
- declare const Divider: React$1.NamedExoticComponent<DividerProps & React$1.RefAttributes<HTMLDivElement>>;
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
- interface DrawerProps {
1779
- open?: boolean;
1780
- onOpenChange?: (open: boolean) => void;
1781
- children: React$1.ReactNode;
1782
- }
1783
- interface DrawerContentProps extends Omit<React$1.ComponentPropsWithoutRef<typeof RadixDialog.Content>, "asChild"> {
1784
- /** Chiều cao tối đa (vh). Mặc định 90vh */
1785
- maxHeight?: string;
1786
- /** Ẩn drag handle */
1787
- hideHandle?: boolean;
1788
- /** Ẩn nút đóng */
1789
- hideCloseButton?: boolean;
1790
- className?: string;
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
+ /** 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 Drawer: {
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
- * Tham số Props dùng cho component thao tác nổi `FAB`.
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
- * @remarks
1820
- * - Đả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).
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
- * @see https://m3.material.io/components/floating-action-button/overview
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
- interface FABProps extends MotionButtonProps$1 {
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
- * Icon đại diện render — thông thường là truyền thẻ component Icon.
1830
- * Sẽ được tráo đổi thành Spinner tự động quay khi giá trị `loading={true}`.
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
- icon: React$1.ReactNode;
1917
+ variant?: VariantProps<typeof chipVariants>["variant"];
1833
1918
  /**
1834
- * Kích thước hiển thị FAB. Tuân chuẩn.
1835
- * - `sm`: Small (40dp) Được khuyên dùng cho các không gian kín/trong lòng Content.
1836
- * - `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).
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
- size?: "sm" | "md" | "lg" | "xl";
1923
+ elevated?: boolean;
1842
1924
  /**
1843
- * Container vai trò hệ thống tông màu MD3 dùng phết nền.
1844
- * @default "primary"
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
- colorStyle?: "primary" | "secondary" | "tertiary" | "surface";
1930
+ selected?: boolean;
1847
1931
  /**
1848
- * 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.
1849
- * Chiều rộng tự cơi nới để thích ứng chuỗi `children`.
1850
- * @default false
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
- extended?: boolean;
1938
+ disabled?: boolean;
1853
1939
  /**
1854
- * Nơi đón lấy chữ được render cùng khi `extended={true}` bật lên.
1855
- * Khuyến nghị là Text string thuần.
1940
+ * Visible label. Required. Can be a string or ReactNode.
1856
1941
  */
1857
- children?: React$1.ReactNode;
1942
+ label: React$1.ReactNode;
1858
1943
  /**
1859
- * Nhấn `true`, thì rút lại shadow đi một cấp xuống độ nổi nông cạn.
1860
- * Mảng bám Bottom bar hay Top bar Surface để ránh rườm rà.
1861
- * @default false
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
- lowered?: boolean;
1949
+ leadingIcon?: React$1.ReactNode;
1864
1950
  /**
1865
- * 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.
1866
- * @default false
1951
+ * Optional trailing icon element (18×18px recommended).
1952
+ * Color: `on-surface-variant` (unselected) / `on-secondary-container` (selected).
1867
1953
  */
1868
- loading?: boolean;
1954
+ trailingIcon?: React$1.ReactNode;
1869
1955
  /**
1870
- * 2 chuẩn hình của Loading chờ.
1871
- * @default "loading-indicator"
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
- loadingVariant?: "loading-indicator" | "circular";
1959
+ avatar?: React$1.ReactNode;
1874
1960
  /**
1875
- * Hiện thẻ FAB lên layout không (Kiểm soát bằng motion scale Entrance/Exit).
1876
- * @default true
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
- visible?: boolean;
1964
+ onRemove?: (e: React$1.MouseEvent<HTMLButtonElement>) => void;
1879
1965
  }
1880
1966
  /**
1881
- * 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.
1967
+ * MD3 Expressive Chip4-variant interactive tag component.
1882
1968
  *
1883
- * @see {@link FABPosition}
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
- interface FABPositionProps {
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
- * Góc để niêm chặt nút FAB.
1888
- * @default "bottom-right"
1999
+ * Pre-highlighted HTML from Shiki SSR.
2000
+ * Use `codeToHtml` with `themes: { light, dark }` for dual-theme support.
1889
2001
  */
1890
- position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
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
- * Element bao bọc thẻ định vị Absolute cho component `<FAB>`.
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
- * <div className="relative min-h-screen">
1905
- * // Cái nút sẽ xà xuống dưới cùng bên lề Trái
1906
- * <FABPosition position="bottom-left">
1907
- * <FAB icon={<Icon name="edit" />} aria-label="Compose New Mail" />
1908
- * </FABPosition>
1909
- * </div>
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 FAB}
1913
- * @see https://m3.material.io/components/floating-action-button/guidelines
2040
+ * @see {@link DialogContent}
1914
2041
  */
1915
- declare function FABPosition({ position, children, className, }: FABPositionProps): react_jsx_runtime.JSX.Element;
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
- * Action nổi chính theo phong cách MD3 Expressive Floating Action Button (FAB).
2105
+ * @file divider.tsx
1918
2106
  *
1919
- * 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),
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
- * @remarks
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
- * @example
1931
- * ```tsx
1932
- * // FAB bản, nhỏ xinh, chỉ hiện icon.
1933
- * <FAB icon={<Icon name="search" />} aria-label="Nhấn tìm kiếm" size="sm" />
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
- * // Dịch sang dòng Extended có dòng caption chữ dài thòn
1936
- * const [isOpen, setOpen] = React.useState(false);
1937
- * <FAB
1938
- * icon={<Icon name="edit" />}
1939
- * extended={isOpen}
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
- * // FAB to lớn nhất dùng trạng thái chờ load Submit lên Server
1946
- * <FAB
1947
- * icon={<Icon name="upload" />}
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
- * // Cố định dưới chân tay phải
1955
- * <FABPosition position="bottom-right">
1956
- * <FAB icon={<Icon name="add" />} aria-label="Dấu Cộng sinh nảy" />
1957
- * </FABPosition>
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/floating-action-button/overview
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
- * Định dạng dữ liệu cho từng hành động (item) trong biểu mẫu menu của FAB.
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
- * Khi `true`, hiệu hoá item về mặt hình thức lẫn tương tác rẽ nhánh.
1980
- * Vẫn dùng `aria-disabled` thay HTML `disabled` nhằm giữ nó lấy được focus phục vụ cho accessibility.
1981
- * @default false
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
- disabled?: boolean;
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
- * Vai trò màu (color role container) MD3 cho cái nút FAB lẫn các menu items.
2004
- * @default "primary"
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
- colorVariant?: "primary" | "secondary" | "tertiary";
2155
+ orientation?: "horizontal" | "vertical";
2007
2156
  /**
2008
- * 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).
2009
- * @default "baseline"
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
- fabSize?: "baseline" | "medium" | "large";
2165
+ shape?: "flat" | "wavy";
2012
2166
  /**
2013
- * Căn lề của danh sách menu items tương quan với cái Toggle FAB.
2014
- * - `"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).
2015
- * - `"start"`: Các items dồn hết dọc theo lề trái.
2016
- * - `"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.
2017
- * @default "end"
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
- alignment?: "start" | "end" | "center";
2020
- /** Thuộc tính cho CSS component root để đè. */
2021
- className?: string;
2173
+ insetStart?: "standard" | "icon";
2022
2174
  /**
2023
- * Nếu `true`, khi menu đang hiện ra, click chuột ra phía sau (màn xám mờ backdrop) để đóng menu.
2024
- * @default true
2175
+ * Wavy shape visual parameters. Only applies when `shape="wavy"`.
2176
+ * All values are in pixels.
2025
2177
  */
2026
- closeOnBackdropClick?: boolean;
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
- * 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.
2029
- * 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).
2030
- * @default true
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
- focusLast?: boolean;
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
- * Function sinh Icon - nhận về tiến độ `progress` trong khoảng `0` -> `1` (Từ Chưa Expanded -> Đã Expanded)
2046
- * Dùng cho các hiệu ứng morphing Icon khi animtion render (VD: Từ Cộng thành Đóng).
2047
- *
2048
- * @example
2049
- * ```tsx
2050
- * icon={(progress) => progress > 0.5 ? <Icon name="close" /> : <Icon name="add" />}
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 01).
2203
+ * Automatically disabled when user prefers reduced motion.
2204
+ * @default true
2205
+ */
2206
+ animate?: boolean;
2207
+ }
2109
2208
  /**
2110
- * Một item thực hiện một loại hành động duy nhất trong `FABMenu`.
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
- * Render hình dạng viên thuốc bao quanh icon cùng với label diễn giải.
2113
- * Khi `label` bỏ trống, 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.
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
- * @remarks
2117
- * 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
2118
- * 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
2119
- * (quy chuẩn chặt chẽ của Material Design 3).
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 FABMenuItem({ icon, label, onClick, disabled, colorVariant, className, tabIndex, }: FABMenuItemProps): react_jsx_runtime.JSX.Element;
2227
+ declare function buildWavePath(startX: number, endX: number, amplitude?: number, wavelength?: number, yCenter?: number): string;
2122
2228
  /**
2123
- * MD3 Expressive FAB Menu.
2229
+ * MD3 Expressive Divider — a thin line that groups content in lists and layouts.
2124
2230
  *
2125
- * 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ó.
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
- * Accessibility thực thi chuẩn MD3 toàn phần:
2128
- * - thẻ `role="menu"` trang bị cho thẻ hộp div làm luống container
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
- * const [open, setOpen] = React.useState(false);
2239
+ * // Default flat full-bleed horizontal divider
2240
+ * <Divider />
2136
2241
  *
2137
- * const items = [
2138
- * { id: 'share', icon: <Icon name="share" />, label: 'Chia sẻ', onClick: () => console.log('Share') },
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
- * <FABMenu
2144
- * expanded={open}
2145
- * onToggle={setOpen}
2146
- * aria-label="Các công cụ thao tác nhanh"
2147
- * alignment="center"
2148
- * colorVariant="tertiary"
2149
- * items={items}
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/floating-action-button/overview
2264
+ * @see https://m3.material.io/components/divider/overview
2154
2265
  */
2155
- declare function FABMenu({ expanded, onToggle, items, colorVariant, fabSize, alignment, className, closeOnBackdropClick, focusLast, "aria-label": ariaLabel, }: FABMenuProps): react_jsx_runtime.JSX.Element;
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
- * MD3 Expressive Icon Button.
2359
+ * Component hiển thị Icon bằng Material Symbols (variable font).
2338
2360
  *
2339
- * An icon-only button with spring shape morphing, ripple effect, loading state support,
2340
- * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5
2341
- * (touch target minimum for XS and SM sizes).
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
- * - `aria-label` is **required** — icon buttons have no visible text label.
2345
- * - `variant="toggle"` requires `selected: boolean`.
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
- * <IconButton aria-label="Close" onClick={handleClose}>
2351
- * <XIcon />
2352
- * </IconButton>
2372
+ * // Icon cơ bản
2373
+ * <Icon name="home" />
2353
2374
  *
2354
- * <IconButton
2355
- * variant="toggle"
2356
- * selected={isBookmarked}
2357
- * aria-label={isBookmarked ? "Remove bookmark" : "Bookmark"}
2358
- * colorStyle="filled"
2359
- * onClick={toggleBookmark}
2360
- * >
2361
- * <BookmarkIcon />
2362
- * </IconButton>
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://m3.material.io/components/icon-buttons/overview
2388
+ * @see https://fonts.google.com/icons
2389
+ * @see https://m3.material.io/styles/icons/overview
2366
2390
  */
2367
- declare const IconButton: React$1.NamedExoticComponent<(Omit<BaseIconButtonProps & {
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
- /** FastSpatial spring — used for shape morphing and spatial enter animations */
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
- /** FastEffects transition — used for opacity and exit animations */
2796
- declare const FAST_EFFECTS_TRANSITION: Transition;
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
- type NavigationRailVariant = "collapsed" | "expanded" | "modal";
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
- * Spring animation for SearchBar width expand (inactive → active).
3924
- * Matches MD3 FastSpatial motion scheme.
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 };