@bug-on/m3-expressive 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +29 -2
  2. package/README.md +20 -18
  3. package/dist/assets/material-symbols-self-hosted.css +27 -26
  4. package/dist/buttons.d.mts +1 -1
  5. package/dist/buttons.d.ts +1 -1
  6. package/dist/buttons.js.map +1 -1
  7. package/dist/buttons.mjs.map +1 -1
  8. package/dist/core.d.mts +44 -44
  9. package/dist/core.d.ts +44 -44
  10. package/dist/core.js.map +1 -1
  11. package/dist/core.mjs.map +1 -1
  12. package/dist/feedback.d.mts +54 -54
  13. package/dist/feedback.d.ts +54 -54
  14. package/dist/feedback.js.map +1 -1
  15. package/dist/feedback.mjs.map +1 -1
  16. package/dist/index.css +3 -0
  17. package/dist/index.d.mts +2 -2
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.js +8 -8
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +8 -8
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/layout.d.mts +40 -40
  24. package/dist/layout.d.ts +40 -40
  25. package/dist/layout.js +5 -5
  26. package/dist/layout.js.map +1 -1
  27. package/dist/layout.mjs +5 -5
  28. package/dist/layout.mjs.map +1 -1
  29. package/dist/material-symbols-self-hosted.css +27 -26
  30. package/dist/navigation.js.map +1 -1
  31. package/dist/navigation.mjs.map +1 -1
  32. package/dist/overlays.d.mts +2 -2
  33. package/dist/overlays.d.ts +2 -2
  34. package/dist/overlays.js +2 -2
  35. package/dist/overlays.js.map +1 -1
  36. package/dist/overlays.mjs +2 -2
  37. package/dist/overlays.mjs.map +1 -1
  38. package/dist/pickers.d.mts +241 -243
  39. package/dist/pickers.d.ts +241 -243
  40. package/dist/pickers.js +1 -1
  41. package/dist/pickers.js.map +1 -1
  42. package/dist/pickers.mjs +1 -1
  43. package/dist/pickers.mjs.map +1 -1
  44. package/dist/{side-sheet-modal-BY6VCC8p.d.mts → side-sheet-modal-64FGhDxL.d.mts} +20 -21
  45. package/dist/{side-sheet-modal-CglP6KYA.d.ts → side-sheet-modal-Bd5Qqvp9.d.ts} +20 -21
  46. package/dist/{split-button-trailing-uncheckable-MXj_kyNt.d.mts → split-button-trailing-uncheckable-BRPuTqi1.d.mts} +140 -151
  47. package/dist/{split-button-trailing-uncheckable-C5CLCIKP.d.ts → split-button-trailing-uncheckable-CjOFCoyW.d.ts} +140 -151
  48. package/dist/typography.css +5 -0
  49. package/package.json +4 -4
package/dist/layout.d.mts CHANGED
@@ -13,21 +13,21 @@ declare const cardVariants: (props?: ({
13
13
  } & class_variance_authority_types.ClassProp) | undefined) => string;
14
14
  type MotionDivProps = Omit<HTMLMotionProps<"button">, "children" | "color">;
15
15
  interface CardProps extends MotionDivProps, VariantProps<typeof cardVariants> {
16
- /** hiệu hóa tương tác và giảm opacity (MD3 disabled state). */
16
+ /** Disables interaction and reduces opacity (MD3 disabled state). */
17
17
  disabled?: boolean;
18
18
  /**
19
- * Buộc card trở thành interactive không `onClick`.
20
- * Hữu ích khi card chứa các element con là interactive.
19
+ * Forces card to be interactive even without `onClick`.
20
+ * Useful when card contains child interactive elements.
21
21
  */
22
22
  interactive?: boolean;
23
23
  /**
24
- * Nếu có, card render thành thẻ `<a>`. Tự động kích hoạt interactive mode.
25
- * Ưu tiên dùng `href` thay `onClick` khi điều hướng trang.
24
+ * If provided, renders card as `<a>` element. Automatically enables interactive mode.
25
+ * Prefer `href` over `onClick` for page navigation.
26
26
  */
27
27
  href?: string;
28
- /** Target cho thẻ `<a>` (chỉ hiệu lực khi `href` được cung cấp). */
28
+ /** Target for `<a>` element (effective only when `href` is provided). */
29
29
  target?: React.AnchorHTMLAttributes<HTMLAnchorElement>["target"];
30
- /** rel cho thẻ `<a>` (tự động thêm `noreferrer` khi `target="_blank"`). */
30
+ /** rel for `<a>` element (automatically adds `noreferrer` when `target="_blank"`). */
31
31
  rel?: string;
32
32
  children?: React.ReactNode;
33
33
  }
@@ -219,77 +219,77 @@ type ListItemPosition = "solo" | "leading" | "middle" | "trailing";
219
219
  type ListItemLeadingType = "none" | "icon" | "avatar" | "image" | "video" | "checkbox" | "radio" | "custom";
220
220
  type ListItemTrailingType = "none" | "icon" | "icon-button" | "text" | "checkbox" | "radio" | "switch" | "custom";
221
221
  interface ListProps extends Omit<React.HTMLAttributes<HTMLUListElement>, "onChange"> {
222
- /** Variant của danh sách, hỗ trợ 'baseline' 'expressive'. Default: 'baseline' */
222
+ /** List variant, supports 'baseline' and 'expressive'. Default: 'baseline' */
223
223
  variant?: ListVariant;
224
- /** Kiểu hiển thị, hỗ trợ 'standard' (không khoảng cách) 'segmented' ( gap 2px). Default: 'standard' */
224
+ /** Display style, supports 'standard' (no gap) and 'segmented' (2px gap). Default: 'standard' */
225
225
  listStyle?: ListStyle;
226
- /** Chế độ chọn/tương tác của danh sách. Default: 'none' */
226
+ /** Selection/interaction mode of the list. Default: 'none' */
227
227
  selectionMode?: ListSelectionMode;
228
- /** Giá trị đang được chọn (dành cho controlled). String cho single, string[] cho multi */
228
+ /** Currently selected value (for controlled mode). String for single, string[] for multi */
229
229
  value?: string | string[];
230
- /** Giá trị được chọn mặc định ban đầu (dành cho uncontrolled) */
230
+ /** Default initial selected value (for uncontrolled mode) */
231
231
  defaultValue?: string | string[];
232
- /** Callback khi giá trị thay đổi */
232
+ /** Callback fired when selection changes */
233
233
  onChange?: (value: string | string[]) => void;
234
- /** Bật chế độ kéo thả sắp xếp danh sách */
234
+ /** Enable drag-and-drop reordering */
235
235
  reorderable?: boolean;
236
- /** Mảng chứa dữ liệu các item khi sử dụng reorderable */
236
+ /** Data items array used with reorderable mode */
237
237
  items?: unknown[];
238
- /** Callback trả về danh sách sau khi đã được sắp xếp lại */
238
+ /** Callback returning reordered items */
239
239
  onReorder?: (newItems: unknown[]) => void;
240
- /** Custom radius góc ngoài (cho leading/trailing list items). Default từ spec MD3 Expressive 16px */
240
+ /** Custom outer corner radius (for leading/trailing list items). Default per MD3 Expressive spec is 16px */
241
241
  outerRadius?: number;
242
- /** Custom radius góc trong (cho các list items kề nhau). Default từ spec MD3 Expressive 4px */
242
+ /** Custom inner corner radius (for adjacent list items). Default per MD3 Expressive spec is 4px */
243
243
  innerRadius?: number;
244
244
  children?: React.ReactNode;
245
245
  }
246
246
  type SafeHTMLLIAttrs = Omit<React.HTMLAttributes<HTMLLIElement>, "onClick" | "color" | "onDrag" | "onDragStart" | "onDragEnd" | "onDragEnter" | "onDragLeave" | "onDragOver" | "onDrop" | "onAnimationStart" | "onAnimationEnd" | "onAnimationIteration" | "onTransitionEnd">;
247
247
  interface ListItemProps extends SafeHTMLLIAttrs {
248
- /** Giá trị định danh duy nhất cho ListItem */
248
+ /** Unique identifier value for the ListItem */
249
249
  value: string;
250
- /** Tiêu đề chính của item */
250
+ /** Main headline title of the item */
251
251
  headline: React.ReactNode;
252
- /** Văn bản hỗ trợ bên dưới tiêu đề */
252
+ /** Supporting text displayed below the headline */
253
253
  supportingText?: React.ReactNode;
254
- /** Số dòng hiển thị tối đa của supportingText (1 hoặc 2) để tính chiều cao tương ứng. Default: 1 */
254
+ /** Max lines for supporting text (1 or 2) to calculate height. Default: 1 */
255
255
  supportingTextLines?: 1 | 2;
256
- /** Văn bản nhỏ hiển thị phía trên tiêu đề chính */
256
+ /** Small overline text displayed above the main headline */
257
257
  overline?: React.ReactNode;
258
- /** Loại thành phần hiển thị phần đầu dòng */
258
+ /** Type of element rendered at the start of the list item */
259
259
  leadingType?: ListItemLeadingType;
260
- /** Đường dẫn hình ảnh/video nếu leadingType 'image' hoặc 'video' */
260
+ /** Source URL for image or video when leadingType is 'image' or 'video' */
261
261
  leadingSrc?: string;
262
- /** Alt text cho hình ảnh */
262
+ /** Alt text for image */
263
263
  leadingAlt?: string;
264
- /** Custom content cho phần leading (sử dụng khi leadingType = 'custom') */
264
+ /** Custom leading content (used when leadingType = 'custom') */
265
265
  leadingContent?: React.ReactNode;
266
- /** Loại thành phần hiển thị phần cuối dòng */
266
+ /** Type of element rendered at the end of the list item */
267
267
  trailingType?: ListItemTrailingType;
268
- /** Văn bản hiển thị phần cuối dòng */
268
+ /** Text displayed at the end of the list item */
269
269
  trailingText?: string;
270
- /** Custom content hoặc callback cho trailing element */
270
+ /** Custom content or callback for trailing element */
271
271
  trailingContent?: React.ReactNode;
272
- /** hiệu hóa tương tác */
272
+ /** Disable interaction */
273
273
  disabled?: boolean;
274
- /** Trạng thái được chọn (áp dụng cho single-select / multi-select) */
274
+ /** Selected state (for single-select / multi-select) */
275
275
  selected?: boolean;
276
- /** Địa chỉ liên kết nếu render ListItem dưới dạng thẻ Anchor <a> */
276
+ /** Target URL if rendering ListItem as an anchor <a> tag */
277
277
  href?: string;
278
- /** Callback khi click vào ListItem */
278
+ /** Callback when clicking on ListItem */
279
279
  onClick?: (event: React.MouseEvent<HTMLElement>) => void;
280
- /** Buộc item chế độ interactive (hover/focus overlay, ripple) kể cả khi không truyền onClick/href */
280
+ /** Force interactive mode (hover/focus overlay, ripple) even without onClick/href */
281
281
  interactive?: boolean;
282
- /** Bật chế độ chỉ kéo qua handle icon thay kéo toàn bộ item */
282
+ /** Enable drag handle icon drag restriction */
283
283
  dragHandle?: boolean;
284
- /** Override vị trí của item trong danh sách (solo, leading, middle, trailing) */
284
+ /** Override position of item in list (solo, leading, middle, trailing) */
285
285
  position?: ListItemPosition;
286
- /** Index nội bộ của item, được tự động truyền bởi List component */
286
+ /** Internal item index passed automatically by parent List */
287
287
  _listIndex?: number;
288
288
  }
289
289
  interface ListDividerProps extends React.HTMLAttributes<HTMLLIElement> {
290
- /** Thụt lề đầu dòng của divider */
290
+ /** Indent start of divider */
291
291
  inset?: boolean;
292
- /** Kiểu thụt lề: 'icon' (thụt lề 56px), 'avatar' (thụt lề 72px) hoặc 'custom' */
292
+ /** Indent style: 'icon' (56px indent), 'avatar' (72px indent), or 'custom' */
293
293
  insetType?: "icon" | "avatar" | "custom";
294
294
  }
295
295
 
package/dist/layout.d.ts CHANGED
@@ -13,21 +13,21 @@ declare const cardVariants: (props?: ({
13
13
  } & class_variance_authority_types.ClassProp) | undefined) => string;
14
14
  type MotionDivProps = Omit<HTMLMotionProps<"button">, "children" | "color">;
15
15
  interface CardProps extends MotionDivProps, VariantProps<typeof cardVariants> {
16
- /** hiệu hóa tương tác và giảm opacity (MD3 disabled state). */
16
+ /** Disables interaction and reduces opacity (MD3 disabled state). */
17
17
  disabled?: boolean;
18
18
  /**
19
- * Buộc card trở thành interactive không `onClick`.
20
- * Hữu ích khi card chứa các element con là interactive.
19
+ * Forces card to be interactive even without `onClick`.
20
+ * Useful when card contains child interactive elements.
21
21
  */
22
22
  interactive?: boolean;
23
23
  /**
24
- * Nếu có, card render thành thẻ `<a>`. Tự động kích hoạt interactive mode.
25
- * Ưu tiên dùng `href` thay `onClick` khi điều hướng trang.
24
+ * If provided, renders card as `<a>` element. Automatically enables interactive mode.
25
+ * Prefer `href` over `onClick` for page navigation.
26
26
  */
27
27
  href?: string;
28
- /** Target cho thẻ `<a>` (chỉ hiệu lực khi `href` được cung cấp). */
28
+ /** Target for `<a>` element (effective only when `href` is provided). */
29
29
  target?: React.AnchorHTMLAttributes<HTMLAnchorElement>["target"];
30
- /** rel cho thẻ `<a>` (tự động thêm `noreferrer` khi `target="_blank"`). */
30
+ /** rel for `<a>` element (automatically adds `noreferrer` when `target="_blank"`). */
31
31
  rel?: string;
32
32
  children?: React.ReactNode;
33
33
  }
@@ -219,77 +219,77 @@ type ListItemPosition = "solo" | "leading" | "middle" | "trailing";
219
219
  type ListItemLeadingType = "none" | "icon" | "avatar" | "image" | "video" | "checkbox" | "radio" | "custom";
220
220
  type ListItemTrailingType = "none" | "icon" | "icon-button" | "text" | "checkbox" | "radio" | "switch" | "custom";
221
221
  interface ListProps extends Omit<React.HTMLAttributes<HTMLUListElement>, "onChange"> {
222
- /** Variant của danh sách, hỗ trợ 'baseline' 'expressive'. Default: 'baseline' */
222
+ /** List variant, supports 'baseline' and 'expressive'. Default: 'baseline' */
223
223
  variant?: ListVariant;
224
- /** Kiểu hiển thị, hỗ trợ 'standard' (không khoảng cách) 'segmented' ( gap 2px). Default: 'standard' */
224
+ /** Display style, supports 'standard' (no gap) and 'segmented' (2px gap). Default: 'standard' */
225
225
  listStyle?: ListStyle;
226
- /** Chế độ chọn/tương tác của danh sách. Default: 'none' */
226
+ /** Selection/interaction mode of the list. Default: 'none' */
227
227
  selectionMode?: ListSelectionMode;
228
- /** Giá trị đang được chọn (dành cho controlled). String cho single, string[] cho multi */
228
+ /** Currently selected value (for controlled mode). String for single, string[] for multi */
229
229
  value?: string | string[];
230
- /** Giá trị được chọn mặc định ban đầu (dành cho uncontrolled) */
230
+ /** Default initial selected value (for uncontrolled mode) */
231
231
  defaultValue?: string | string[];
232
- /** Callback khi giá trị thay đổi */
232
+ /** Callback fired when selection changes */
233
233
  onChange?: (value: string | string[]) => void;
234
- /** Bật chế độ kéo thả sắp xếp danh sách */
234
+ /** Enable drag-and-drop reordering */
235
235
  reorderable?: boolean;
236
- /** Mảng chứa dữ liệu các item khi sử dụng reorderable */
236
+ /** Data items array used with reorderable mode */
237
237
  items?: unknown[];
238
- /** Callback trả về danh sách sau khi đã được sắp xếp lại */
238
+ /** Callback returning reordered items */
239
239
  onReorder?: (newItems: unknown[]) => void;
240
- /** Custom radius góc ngoài (cho leading/trailing list items). Default từ spec MD3 Expressive 16px */
240
+ /** Custom outer corner radius (for leading/trailing list items). Default per MD3 Expressive spec is 16px */
241
241
  outerRadius?: number;
242
- /** Custom radius góc trong (cho các list items kề nhau). Default từ spec MD3 Expressive 4px */
242
+ /** Custom inner corner radius (for adjacent list items). Default per MD3 Expressive spec is 4px */
243
243
  innerRadius?: number;
244
244
  children?: React.ReactNode;
245
245
  }
246
246
  type SafeHTMLLIAttrs = Omit<React.HTMLAttributes<HTMLLIElement>, "onClick" | "color" | "onDrag" | "onDragStart" | "onDragEnd" | "onDragEnter" | "onDragLeave" | "onDragOver" | "onDrop" | "onAnimationStart" | "onAnimationEnd" | "onAnimationIteration" | "onTransitionEnd">;
247
247
  interface ListItemProps extends SafeHTMLLIAttrs {
248
- /** Giá trị định danh duy nhất cho ListItem */
248
+ /** Unique identifier value for the ListItem */
249
249
  value: string;
250
- /** Tiêu đề chính của item */
250
+ /** Main headline title of the item */
251
251
  headline: React.ReactNode;
252
- /** Văn bản hỗ trợ bên dưới tiêu đề */
252
+ /** Supporting text displayed below the headline */
253
253
  supportingText?: React.ReactNode;
254
- /** Số dòng hiển thị tối đa của supportingText (1 hoặc 2) để tính chiều cao tương ứng. Default: 1 */
254
+ /** Max lines for supporting text (1 or 2) to calculate height. Default: 1 */
255
255
  supportingTextLines?: 1 | 2;
256
- /** Văn bản nhỏ hiển thị phía trên tiêu đề chính */
256
+ /** Small overline text displayed above the main headline */
257
257
  overline?: React.ReactNode;
258
- /** Loại thành phần hiển thị phần đầu dòng */
258
+ /** Type of element rendered at the start of the list item */
259
259
  leadingType?: ListItemLeadingType;
260
- /** Đường dẫn hình ảnh/video nếu leadingType 'image' hoặc 'video' */
260
+ /** Source URL for image or video when leadingType is 'image' or 'video' */
261
261
  leadingSrc?: string;
262
- /** Alt text cho hình ảnh */
262
+ /** Alt text for image */
263
263
  leadingAlt?: string;
264
- /** Custom content cho phần leading (sử dụng khi leadingType = 'custom') */
264
+ /** Custom leading content (used when leadingType = 'custom') */
265
265
  leadingContent?: React.ReactNode;
266
- /** Loại thành phần hiển thị phần cuối dòng */
266
+ /** Type of element rendered at the end of the list item */
267
267
  trailingType?: ListItemTrailingType;
268
- /** Văn bản hiển thị phần cuối dòng */
268
+ /** Text displayed at the end of the list item */
269
269
  trailingText?: string;
270
- /** Custom content hoặc callback cho trailing element */
270
+ /** Custom content or callback for trailing element */
271
271
  trailingContent?: React.ReactNode;
272
- /** hiệu hóa tương tác */
272
+ /** Disable interaction */
273
273
  disabled?: boolean;
274
- /** Trạng thái được chọn (áp dụng cho single-select / multi-select) */
274
+ /** Selected state (for single-select / multi-select) */
275
275
  selected?: boolean;
276
- /** Địa chỉ liên kết nếu render ListItem dưới dạng thẻ Anchor <a> */
276
+ /** Target URL if rendering ListItem as an anchor <a> tag */
277
277
  href?: string;
278
- /** Callback khi click vào ListItem */
278
+ /** Callback when clicking on ListItem */
279
279
  onClick?: (event: React.MouseEvent<HTMLElement>) => void;
280
- /** Buộc item chế độ interactive (hover/focus overlay, ripple) kể cả khi không truyền onClick/href */
280
+ /** Force interactive mode (hover/focus overlay, ripple) even without onClick/href */
281
281
  interactive?: boolean;
282
- /** Bật chế độ chỉ kéo qua handle icon thay kéo toàn bộ item */
282
+ /** Enable drag handle icon drag restriction */
283
283
  dragHandle?: boolean;
284
- /** Override vị trí của item trong danh sách (solo, leading, middle, trailing) */
284
+ /** Override position of item in list (solo, leading, middle, trailing) */
285
285
  position?: ListItemPosition;
286
- /** Index nội bộ của item, được tự động truyền bởi List component */
286
+ /** Internal item index passed automatically by parent List */
287
287
  _listIndex?: number;
288
288
  }
289
289
  interface ListDividerProps extends React.HTMLAttributes<HTMLLIElement> {
290
- /** Thụt lề đầu dòng của divider */
290
+ /** Indent start of divider */
291
291
  inset?: boolean;
292
- /** Kiểu thụt lề: 'icon' (thụt lề 56px), 'avatar' (thụt lề 72px) hoặc 'custom' */
292
+ /** Indent style: 'icon' (56px indent), 'avatar' (72px indent), or 'custom' */
293
293
  insetType?: "icon" | "avatar" | "custom";
294
294
  }
295
295
 
package/dist/layout.js CHANGED
@@ -229,19 +229,19 @@ var CardImpl = React18__namespace.forwardRef(
229
229
  const baseClass = cn(
230
230
  cardVariants({ variant }),
231
231
  // Disabled state:
232
- // - pointer-events-none → hiệu hóa tương tác hoàn toàn
232
+ // - pointer-events-none → disable interactions completely
233
233
  // - opacity-[0.38] → MD3 DisabledContainerOpacity
234
234
  disabled && "pointer-events-none opacity-[0.38]",
235
235
  className
236
236
  );
237
237
  const interactiveClass = cn(
238
- // Xóa outline default, dùng state overlay & elevation của MD3 để biểu hiện focus
238
+ // Remove default outline, use MD3 state overlay & elevation for focus
239
239
  "focus-visible:outline-none focus:outline-none group",
240
- // Layer overlay base pseudo-element
240
+ // Base pseudo-element overlay layer
241
241
  "before:absolute before:inset-0 before:pointer-events-none before:bg-m3-on-surface before:opacity-0 before:transition-opacity before:duration-200",
242
- // Interactive states opacities
242
+ // Interactive state opacities
243
243
  "hover:before:opacity-[0.08] focus-visible:before:opacity-[0.10] active:before:opacity-[0.10]",
244
- // Outlined interactive card: đổi màu border sang m3-outline khi focus/press/hover
244
+ // Outlined interactive card: change border color to m3-outline on focus/press/hover
245
245
  variant === "outlined" && "hover:border-m3-outline focus-visible:border-m3-outline active:border-m3-outline"
246
246
  );
247
247
  if (!isInteractive) {