@bug-on/m3-expressive 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +110 -0
  3. package/dist/assets/fonts/GoogleSansFlex-VariableFont.woff2 +0 -0
  4. package/dist/assets/fonts/MaterialSymbolsOutlined-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  5. package/dist/assets/fonts/MaterialSymbolsRounded-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  6. package/dist/assets/fonts/MaterialSymbolsSharp-VariableFont_FILL,GRAD,opsz,wght.ttf +0 -0
  7. package/dist/assets/loading-indicator.svg +19 -0
  8. package/dist/assets/material-symbols-cdn.css +65 -0
  9. package/dist/assets/material-symbols-self-hosted.css +94 -0
  10. package/dist/buttons.d.mts +180 -0
  11. package/dist/buttons.d.ts +180 -0
  12. package/dist/buttons.js +4282 -0
  13. package/dist/buttons.js.map +1 -0
  14. package/dist/buttons.mjs +4227 -0
  15. package/dist/buttons.mjs.map +1 -0
  16. package/dist/core.d.mts +422 -0
  17. package/dist/core.d.ts +422 -0
  18. package/dist/core.js +2581 -0
  19. package/dist/core.js.map +1 -0
  20. package/dist/core.mjs +2547 -0
  21. package/dist/core.mjs.map +1 -0
  22. package/dist/feedback.d.mts +600 -0
  23. package/dist/feedback.d.ts +600 -0
  24. package/dist/feedback.js +2357 -0
  25. package/dist/feedback.js.map +1 -0
  26. package/dist/feedback.mjs +2321 -0
  27. package/dist/feedback.mjs.map +1 -0
  28. package/dist/forms.d.mts +40 -0
  29. package/dist/forms.d.ts +40 -0
  30. package/dist/forms.js +4263 -0
  31. package/dist/forms.js.map +1 -0
  32. package/dist/forms.mjs +4228 -0
  33. package/dist/forms.mjs.map +1 -0
  34. package/dist/icon-button-D-gs0gfj.d.mts +136 -0
  35. package/dist/icon-button-D-gs0gfj.d.ts +136 -0
  36. package/dist/index.css +309 -0
  37. package/dist/index.css.d.ts +2 -0
  38. package/dist/index.d.mts +24 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.js +23972 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/index.mjs +23668 -0
  43. package/dist/index.mjs.map +1 -0
  44. package/dist/layout.d.mts +610 -0
  45. package/dist/layout.d.ts +610 -0
  46. package/dist/layout.js +5091 -0
  47. package/dist/layout.js.map +1 -0
  48. package/dist/layout.mjs +5042 -0
  49. package/dist/layout.mjs.map +1 -0
  50. package/dist/material-symbols-cdn.css +65 -0
  51. package/dist/material-symbols-cdn.css.d.ts +2 -0
  52. package/dist/material-symbols-self-hosted.css +94 -0
  53. package/dist/material-symbols-self-hosted.css.d.ts +2 -0
  54. package/dist/md3-DFhj-NZj.d.mts +17 -0
  55. package/dist/md3-DFhj-NZj.d.ts +17 -0
  56. package/dist/navigation.d.mts +2766 -0
  57. package/dist/navigation.d.ts +2766 -0
  58. package/dist/navigation.js +6684 -0
  59. package/dist/navigation.js.map +1 -0
  60. package/dist/navigation.mjs +6573 -0
  61. package/dist/navigation.mjs.map +1 -0
  62. package/dist/overlays.d.mts +161 -0
  63. package/dist/overlays.d.ts +161 -0
  64. package/dist/overlays.js +3298 -0
  65. package/dist/overlays.js.map +1 -0
  66. package/dist/overlays.mjs +3244 -0
  67. package/dist/overlays.mjs.map +1 -0
  68. package/dist/pickers.d.mts +1074 -0
  69. package/dist/pickers.d.ts +1074 -0
  70. package/dist/pickers.js +4240 -0
  71. package/dist/pickers.js.map +1 -0
  72. package/dist/pickers.mjs +4200 -0
  73. package/dist/pickers.mjs.map +1 -0
  74. package/dist/plugin.d.mts +1 -0
  75. package/dist/plugin.d.ts +1 -0
  76. package/dist/plugin.js +13 -0
  77. package/dist/plugin.js.map +1 -0
  78. package/dist/plugin.mjs +3 -0
  79. package/dist/plugin.mjs.map +1 -0
  80. package/dist/scroll-area-CVS6HyLl.d.mts +33 -0
  81. package/dist/scroll-area-CVS6HyLl.d.ts +33 -0
  82. package/dist/shapes.d.mts +1119 -0
  83. package/dist/shapes.d.ts +1119 -0
  84. package/dist/shapes.js +2941 -0
  85. package/dist/shapes.js.map +1 -0
  86. package/dist/shapes.mjs +2889 -0
  87. package/dist/shapes.mjs.map +1 -0
  88. package/dist/side-sheet-modal-BY6VCC8p.d.mts +553 -0
  89. package/dist/side-sheet-modal-CglP6KYA.d.ts +553 -0
  90. package/dist/split-button-trailing-uncheckable-C5CLCIKP.d.ts +731 -0
  91. package/dist/split-button-trailing-uncheckable-MXj_kyNt.d.mts +731 -0
  92. package/dist/text-field-eAIpz9z1.d.mts +1038 -0
  93. package/dist/text-field-eAIpz9z1.d.ts +1038 -0
  94. package/dist/typography-339RV6v7.d.mts +486 -0
  95. package/dist/typography-339RV6v7.d.ts +486 -0
  96. package/dist/typography.css +22 -0
  97. package/dist/typography.css.d.ts +2 -0
  98. package/package.json +207 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/ui/loading-indicator.tsx","../src/ui/progress-indicator/utils.ts","../src/ui/progress-indicator/circular.tsx","../src/ui/progress-indicator/hooks.ts","../src/ui/progress-indicator/linear-flat.tsx","../src/ui/progress-indicator/linear-wavy.tsx","../src/ui/progress-indicator/linear.tsx","../src/ui/progress-indicator/index.tsx","../src/ui/ripple.tsx","../src/ui/shared/motion-tokens.ts","../src/ui/shared/constants.ts","../src/ui/shared/touch-target.tsx","../src/ui/buttons/button/button-tokens.ts","../src/ui/buttons/button/button.tsx","../src/ui/icon.tsx","../src/ui/buttons/button-group/button-group-tokens.ts","../src/ui/buttons/button-group/button-group-defaults.ts","../src/ui/buttons/button-group/button-group.tsx","../src/ui/buttons/fabs/extended-fab/extended-fab.tsx","../src/ui/buttons/fabs/fab/fab.tsx","../src/ui/buttons/fabs/fab-menu/fab-menu.tsx","../src/ui/buttons/icon-button/icon-button.tsx","../src/ui/buttons/split-button/split-button-context.ts","../src/ui/buttons/split-button/split-button.tsx","../src/ui/shared/state-layer.tsx","../src/ui/buttons/split-button/split-button-tokens.ts","../src/ui/buttons/split-button/split-button-variants.ts","../src/ui/buttons/split-button/split-button-leading.tsx","../src/ui/buttons/split-button/split-button-trailing.tsx","../src/ui/buttons/split-button/split-button-trailing-uncheckable.tsx"],"names":["React","IndeterminateSvg","DeterminateSvg","React2","jsx","jsxs","React3","React4","FlatLinearTrack","Fragment","m","React5","WavyLinearTrack","React6","LazyMotion","domMax","React7","React8","RippleItem","animate","React9","_a","_b","useMotionValue","AnimatePresence","React10","cornerRadius","AnimatedCheckLabel","AnimatedNavbarLabel","React12","SIZE_ICON","MORPH_RADIUS","COLOR_CLASSES","React13","React14","useReducedMotion","SIZE_STYLES","React15","React16","React17","React18","React19","React20","React21"],"mappings":"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","file":"buttons.mjs","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Loading Indicator\n//\n// Spec references:\n// • Loading Indicator Overview (190326 PDF)\n// • Loading Indicator Specs (190326 PDF)\n// • Loading Indicator Accessibility (190326 PDF)\n// • LoadingIndicator.kt (Android reference)\n//\n// Two operational modes:\n// 1. Indeterminate — no `progress` prop → 7-shape morph + SMIL rotation loop\n// 2. Determinate — `progress` (0-1) → Circle→SoftBurst morph + counterclockwise rotation\n//\n// Responsive sizing: strictly [24dp, 240dp]. Container/indicator ratio is preserved.\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Indeterminate: Shape & Rotation Keyframe Data (from official MD3 SVG) ──\nconst SHAPE_KEY_TIMES =\n\t\"0; 0.14; 0.14; 0.29; 0.29; 0.43; 0.43; 0.57; 0.57; 0.71; 0.71; 0.86; 0.86; 1\";\n\nconst SHAPE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\n\n// 7 MD3 morphing shapes, each repeated twice for a smooth hold-and-morph\nconst SHAPE_VALUES = [\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\",\n\t\"M20.3 8.6 21.1 8 22 7.6 23 7.3 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.2 15.5 37.6 16.5 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8 17.6 9.8 18.6 9.6 19.5 9.2Z\",\n\t\"M18.6 9.6 19.5 9.2 20.3 8.6 21.1 8 22 7.6 23 7.3 24 7.2 25 7.3 25.9 7.5 26.8 8 27.6 8.6 28.4 9.1 29.3 9.6 30.3 9.8 31.3 9.9 32.3 10 33.3 10.2 34.2 10.6 35 11.2 35.7 11.9 36.3 12.7 36.7 13.6 36.9 14.6 37.2 15.5 37.6 16.4 38.2 17.3 38.9 18 39.6 18.7 40.2 19.5 40.6 20.4 40.9 21.3 41 22.3 40.9 23.3 40.6 24.3 40.2 25.2 39.8 26.1 39.5 27 39.4 28 39.5 29 39.6 30 39.5 31 39.3 32 38.9 32.9 38.3 33.7 37.6 34.4 36.8 35 35.9 35.4 35 35.8 34.1 36.3 33.4 37 32.9 37.9 32.3 38.7 31.6 39.4 30.8 40 29.9 40.4 28.9 40.7 27.9 40.8 27 40.7 26 40.4 25 40.1 24 40 23 40.1 22.1 40.4 21.1 40.7 20.1 40.8 19.1 40.7 18.2 40.5 17.3 40 16.4 39.5 15.7 38.8 15.2 37.9 14.6 37.1 13.9 36.4 13.1 35.8 12.2 35.4 11.3 35 10.5 34.4 9.7 33.8 9.1 32.9 8.7 32 8.5 31.1 8.4 30.1 8.5 29.1 8.6 28.1 8.5 27.1 8.3 26.1 7.8 25.2 7.4 24.3 7.1 23.4 7 22.4 7.1 21.4 7.3 20.4 7.8 19.5 8.3 18.7 9.1 18 9.8 17.3 10.4 16.5 10.8 15.6 11 14.6 11.3 13.7 11.7 12.8 12.2 11.9 12.9 11.2 13.8 10.7 14.7 10.2 15.6 10 16.6 9.9 17.6 9.8Z\",\n\t\"M18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.2 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 33.7 13.1 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.5 30.5 39.5 30 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7.1 21.7 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8 15.4 12.3 16.2 11.7 17 11.1 17.8 10.5Z\",\n\t\"M15.4 12.3 16.2 11.7 17 11.1 17.8 10.5 18.6 9.9 19.5 9.4 20.3 8.8 21.1 8.3 22 7.8 23 7.6 23.9 7.5 24.9 7.6 25.9 7.8 26.8 8.2 27.6 8.7 28.5 9.3 29.3 9.9 30.1 10.5 30.9 11 31.7 11.6 32.5 12.2 33.3 12.8 34.1 13.3 34.9 13.9 35.7 14.5 36.6 15 37.4 15.6 38.2 16.2 39 16.8 39.7 17.5 40.2 18.3 40.7 19.2 40.9 20.1 41 21.1 40.9 22.1 40.7 23.1 40.3 24 40 24.9 39.7 25.9 39.4 26.8 39 27.8 38.7 28.7 38.4 29.6 38.1 30.6 37.8 31.5 37.5 32.5 37.2 33.4 36.9 34.4 36.6 35.3 36.2 36.2 35.7 37.1 35 37.8 34.3 38.4 33.4 38.9 32.5 39.3 31.5 39.4 30.5 39.5 29.5 39.5 28.5 39.5 27.5 39.5 26.5 39.5 25.5 39.4 24.5 39.4 23.6 39.4 22.6 39.4 21.6 39.5 20.6 39.5 19.6 39.5 18.6 39.5 17.6 39.5 16.6 39.5 15.6 39.3 14.7 39 13.8 38.5 13.1 37.9 12.4 37.2 11.9 36.3 11.5 35.4 11.2 34.5 10.9 33.5 10.6 32.6 10.3 31.6 10 30.7 9.7 29.7 9.3 28.8 9 27.9 8.7 26.9 8.4 26 8 25 7.7 24.1 7.4 23.2 7.1 22.2 7 21.2 7.1 20.2 7.3 19.3 7.7 18.4 8.3 17.5 8.9 16.8 9.7 16.2 10.5 15.6 11.4 15.1 12.2 14.5 13 14 13.8 13.4 14.6 12.8Z\",\n\t\"M17 12.8 17.7 12.1 18.5 11.5 19.3 10.9 20.1 10.5 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 25 9 26 9 27 9 27.6 9.1 28 9.1 28.9 9.3 29.9 9.6 30.9 9.9 31.8 10.3 32.6 10.8 33.5 11.3 34.3 11.9 34.6 12.2 35 12.6 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.6 18.5 38.6 18.7 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.3 38.2 26.4 37.8 27.3 37.4 28.2 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.8 32.5 33.5 32.8 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.2 37.3 27.9 37.5 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 22.5 39 21.5 39 20.5 38.9 20.4 38.9 19.5 38.8 18.6 38.6 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.4 35.8 13.3 35.8 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.6 30 9.4 29.3 9.3 29 9.1 28 9 27 9 26 9 25 9.2 24 9.4 23 9.6 22.1 9.8 21.7 10 21.1 10.4 20.2 10.9 19.4 11.4 18.5 12.1 17.8 12.7 17 13.4 16.3 14.2 15.6 14.2 15.5 14.9 14.9 15.6 14.2 16.3 13.5Z\",\n\t\"M33.5 11.3 34.3 11.9 35 12.6 35.3 12.8 35.7 13.3 36.4 14.1 36.9 14.9 37.4 15.8 37.9 16.6 38.3 17.6 38.3 17.7 38.6 18.5 38.8 19.5 38.9 20.5 39 21.5 39 22.5 38.9 23.5 38.9 23.5 38.7 24.5 38.5 25.4 38.2 26.4 37.8 27.3 37.4 28.2 36.9 28.9 36.8 29.1 36.2 29.9 35.6 30.6 34.9 31.3 34.2 32 33.5 32.8 33.1 33.2 32.8 33.5 32.1 34.2 31.4 34.9 30.7 35.6 29.9 36.2 29.1 36.8 28.7 37 28.2 37.3 27.4 37.8 26.4 38.2 25.5 38.5 24.5 38.7 23.5 38.9 23.3 38.9 22.5 39 21.5 39 20.5 38.9 19.5 38.8 18.6 38.6 17.6 38.3 17.6 38.3 16.7 37.9 15.8 37.5 14.9 37 14.1 36.4 13.3 35.8 12.7 35.2 12.6 35.1 12 34.3 11.3 33.5 10.8 32.7 10.3 31.8 9.9 30.9 9.7 30.3 9.6 29.9 9.3 29 9.1 28 9 27 9 26 9 25 9.1 24.5 9.2 24 9.4 23 9.6 22.1 10 21.1 10.4 20.2 10.9 19.4 11.1 19.1 11.5 18.5 12.1 17.7 12.7 17 13.5 16.3 14.2 15.6 14.9 14.9 14.9 14.8 15.6 14.2 16.3 13.5 17 12.8 17.7 12.1 18.5 11.5 19.3 11 19.3 10.9 20.2 10.4 21.1 10 22 9.7 23 9.4 24 9.2 24.7 9.1 25 9 26 9 27 9 28 9.1 28.9 9.3 29.9 9.6 30.4 9.7 30.9 9.9 31.8 10.3 32.6 10.8Z\",\n\t\"M33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.8 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.6 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7 27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1Z\",\n\t\"M27.7 9.4 28.5 10 29.3 10.6 30.2 10.9 31.2 11 32.2 11.1 33.2 11.1 34.2 11.2 35.1 11.4 36 11.9 36.6 12.7 36.8 13.7 36.9 14.7 36.9 15.7 37 16.7 37.1 17.7 37.3 18.6 37.9 19.4 38.5 20.2 39.2 20.9 39.8 21.7 40.5 22.4 40.9 23.3 41 24.3 40.7 25.2 40.1 26 39.4 26.8 38.8 27.5 38.1 28.3 37.5 29.1 37.1 30 37 31 37 31.9 36.9 32.9 36.8 33.9 36.7 34.9 36.2 35.8 35.5 36.4 34.5 36.8 33.6 36.9 32.6 36.9 31.6 37 30.6 37.1 29.6 37.2 28.8 37.7 28 38.4 27.3 39 26.5 39.7 25.8 40.3 24.9 40.8 23.9 41 23 40.8 22.1 40.2 21.4 39.6 20.6 38.9 19.9 38.3 19.1 37.6 18.3 37.2 17.3 37 16.3 37 15.3 36.9 14.3 36.8 13.3 36.7 12.4 36.4 11.7 35.7 11.3 34.8 11.2 33.8 11.1 32.8 11 31.8 11 30.8 10.9 29.9 10.4 29 9.8 28.2 9.1 27.5 8.5 26.7 7.8 26 7.3 25.1 7 24.2 7.1 23.2 7.6 22.3 8.2 21.6 8.9 20.8 9.5 20.1 10.2 19.3 10.7 18.5 10.9 17.5 11 16.5 11.1 15.6 11.1 14.6 11.2 13.6 11.5 12.6 12.1 11.9 13 11.4 13.9 11.2 14.9 11.1 15.9 11 16.9 11 17.9 10.9 18.8 10.6 19.6 10 20.4 9.3 21.1 8.6 21.9 8 22.6 7.4 23.6 7 24.6 7.1 25.5 7.5 26.2 8.1 27 8.7Z\",\n\t\"M27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 34.8 11.3 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.9 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.4 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35 36 35.7 35.3 36.4 34.4 37 34.1 37.2 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.6 10 30.1 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10 16.6 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 20.9 11 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11Z\",\n\t\"M36 35.7 35.3 36.4 34.4 37 33.6 37.4 32.6 37.8 31.6 37.9 30.6 38 29.7 37.9 28.7 37.7 27.8 37.3 26.8 36.9 25.9 36.6 24.9 36.4 23.9 36.4 22.9 36.4 22 36.6 21 37 20.1 37.4 19.2 37.7 18.2 37.9 17.2 38 16.2 37.9 15.3 37.7 14.3 37.4 13.4 36.9 12.6 36.3 11.9 35.6 11.3 34.9 10.8 34 10.4 33.1 10.1 32.1 10 31.1 10 30.2 10.2 29.2 10.5 28.2 10.9 27.3 11.2 26.4 11.5 25.4 11.6 24.4 11.6 23.4 11.5 22.5 11.2 21.5 10.8 20.6 10.4 19.7 10.2 18.7 10 17.7 10 16.7 10.2 15.7 10.4 14.8 10.8 13.9 11.4 13 12 12.3 12.7 11.6 13.6 11 14.4 10.6 15.4 10.2 16.4 10.1 17.4 10 18.3 10.1 19.3 10.3 20.2 10.7 21.2 11.1 22.1 11.4 23.1 11.6 24.1 11.6 25.1 11.6 26 11.4 27 11 27.9 10.6 28.8 10.3 29.8 10.1 30.8 10 31.8 10.1 32.7 10.3 33.7 10.6 34.6 11.1 35.4 11.7 36.1 12.4 36.7 13.1 37.2 14 37.6 14.9 37.9 15.9 38 16.9 38 17.8 37.8 18.8 37.5 19.8 37.1 20.7 36.8 21.6 36.5 22.6 36.4 23.6 36.4 24.6 36.5 25.5 36.8 26.5 37.2 27.4 37.6 28.3 37.8 29.3 38 30.3 38 31.3 37.8 32.3 37.6 33.2 37.2 34.1 36.6 35Z\",\n\t\"M32.1 32.1 31.4 32.8 30.7 33.5 29.9 34.1 29.1 34.7 28.3 35.3 27.6 35.8 27.5 35.8 26.6 36.4 25.8 36.8 24.9 37.3 24 37.7 23.1 38 22.1 38.3 21.2 38.6 20.2 38.8 19.2 38.9 18.2 39 17.2 39 16.6 38.9 16.3 38.9 15.3 38.7 14.3 38.4 13.4 38 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10 34.6 9.6 33.7 9.3 32.7 9.1 31.7 9.1 31.4 9 30.8 9 29.8 9.1 28.8 9.2 27.8 9.4 26.8 9.7 25.9 10 24.9 10.3 24 10.7 23.1 11.2 22.2 11.6 21.4 12.2 20.5 12.2 20.4 12.7 19.7 13.3 18.9 13.9 18.1 14.5 17.3 15.2 16.6 15.9 15.9 16.6 15.2 17.3 14.5 18.1 13.9 18.9 13.3 19.7 12.7 20.4 12.2 20.5 12.2 21.4 11.6 22.2 11.2 23.1 10.7 24 10.3 24.9 10 25.9 9.7 26.8 9.4 27.8 9.2 28.8 9.1 29.8 9 30.8 9 31.4 9.1 31.7 9.1 32.7 9.3 33.7 9.6 34.6 10 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 38 13.4 38.4 14.3 38.7 15.3 38.9 16.3 38.9 16.6 39 17.2 39 18.2 38.9 19.2 38.8 20.2 38.6 21.2 38.3 22.1 38 23.1 37.7 24 37.3 24.9 36.8 25.8 36.4 26.6 35.8 27.5 35.8 27.6 35.3 28.3 34.7 29.1 34.1 29.9 33.5 30.7 32.8 31.4Z\",\n\t\"M24.3 10.2 24.9 10 25.9 9.7 26.8 9.4 27.1 9.4 27.8 9.2 28.8 9.1 29.8 9 29.9 9 30.8 9 31.7 9.1 32.7 9.3 32.8 9.3 33.7 9.6 34.6 10 35.5 10.5 35.5 10.5 36.3 11.1 36.9 11.7 37.5 12.5 37.5 12.5 38 13.4 38.4 14.3 38.7 15.2 38.7 15.3 38.9 16.3 39 17.2 39 18.1 39 18.2 38.9 19.2 38.8 20.2 38.6 20.9 38.6 21.2 38.3 22.1 38 23.1 37.8 23.7 37.7 24 37.3 24.9 36.8 25.8 36.5 26.4 36.4 26.6 35.8 27.5 35.3 28.3 35 28.8 34.7 29.1 34.1 29.9 33.5 30.7 33.1 31.1 32.8 31.4 32.1 32.1 31.4 32.8 31.1 33.1 30.7 33.5 29.9 34.1 29.1 34.7 28.8 35 28.3 35.3 27.5 35.8 26.6 36.4 26.4 36.5 25.8 36.8 24.9 37.3 24 37.7 23.7 37.8 23.1 38 22.1 38.3 21.2 38.6 20.9 38.6 20.2 38.8 19.2 38.9 18.2 39 18.1 39 17.2 39 16.3 38.9 15.3 38.7 15.2 38.7 14.3 38.4 13.4 38 12.5 37.5 12.5 37.5 11.7 36.9 11.1 36.3 10.5 35.5 10.5 35.5 10 34.6 9.6 33.7 9.3 32.8 9.3 32.7 9.1 31.7 9 30.8 9 29.9 9 29.8 9.1 28.8 9.2 27.8 9.4 27.1 9.4 26.8 9.7 25.9 10 24.9 10.2 24.3 10.3 24 10.7 23.1 11.2 22.2 11.5 21.6 11.6 21.4 12.2 20.5 12.7 19.7 13 19.2 13.3 18.9 13.9 18.1 14.5 17.3 14.9 16.9 15.2 16.6 15.9 15.9 16.6 15.2 16.9 14.9 17.3 14.5 18.1 13.9 18.9 13.3 19.2 13 19.7 12.7 20.5 12.2 21.4 11.6 21.6 11.5 22.2 11.2 23.1 10.7 24 10.3Z\",\n\t\"M22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.3 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.4 38.9 26.2 39.6 27 40.2 27.7 40.5 28.6 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.8 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.6 9.1 21.8 8.4 21 7.8 20.3 7.5 19.4 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.2 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1 20.9 10.4 21.4 9.5 21.9 8.7Z\",\n].join(\";\");\n\nconst ROTATE_KEY_TIMES = \"0; 0.14; 0.29; 0.43; 0.57; 0.71; 0.86; 1\";\nconst ROTATE_KEY_SPLINES = [\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n\t\"0.5 0.2 0 0.8\",\n].join(\"; \");\nconst ROTATE_VALUES =\n\t\"0 24 24; 154 24 24; 309 24 24; 463 24 24; 617 24 24; 771 24 24; 926 24 24; 1080 24 24\";\n\n// ─── Determinate: Circle → SoftBurst path data (viewBox 4 4 40 40, cx=24, cy=24) ─\n// Circle: perfect circle, r≈17 → matches the contained indicator's visual weight\nconst DETERMINATE_CIRCLE =\n\t\"M24 7 C34.49 7 41 13.51 41 24 C41 34.49 34.49 41 24 41 C13.51 41 7 34.49 7 24 C7 13.51 13.51 7 24 7 Z\";\n\n// SoftBurst: shape 1 from the indeterminate sequence (same visual as the spec)\nconst DETERMINATE_SOFT_BURST =\n\t\"M20.9 10.4 21.4 9.5 21.9 8.7 22.5 7.8 23.2 7.2 24.2 7 25.1 7.4 25.7 8.1 26.2 9 26.8 9.8 27.3 10.6 28.1 11.2 29 11.3 30 11 30.9 10.6 31.8 10.3 32.8 9.9 33.7 10 34.5 10.6 34.9 11.5 34.8 12.5 34.8 13.5 34.7 14.5 34.7 15.5 35.2 16.3 36 16.8 37 17.1 37.9 17.3 38.9 17.5 39.8 17.9 40.4 18.7 40.5 19.7 40 20.5 39.4 21.3 38.7 22 38.1 22.8 37.6 23.7 37.7 24.6 38.3 25.5 38.9 26.2 39.6 27 40.2 27.7 40.5 28.7 40.3 29.6 39.5 30.3 38.6 30.6 37.6 30.8 36.7 31 35.7 31.3 35 31.9 34.6 32.8 34.7 33.8 34.8 34.8 34.9 35.8 34.8 36.8 34.3 37.6 33.4 38.1 32.4 38 31.5 37.6 30.6 37.2 29.7 36.9 28.7 36.6 27.8 36.9 27.1 37.6 26.6 38.5 26.1 39.3 25.5 40.2 24.8 40.8 23.8 41 22.9 40.6 22.3 39.9 21.8 39 21.2 38.2 20.7 37.4 19.9 36.8 19 36.7 18 37 17.1 37.4 16.2 37.7 15.2 38.1 14.3 38 13.5 37.4 13.1 36.5 13.2 35.5 13.2 34.5 13.3 33.5 13.3 32.5 12.8 31.7 12 31.2 11 31 10.1 30.7 9.1 30.5 8.2 30.1 7.6 29.3 7.5 28.3 8 27.5 8.7 26.7 9.3 26 9.9 25.2 10.4 24.3 10.3 23.4 9.7 22.5 9.1 21.8 8.4 21 7.8 20.3 7.5 19.3 7.7 18.4 8.5 17.7 9.4 17.4 10.4 17.2 11.3 17 12.3 16.7 13 16.1 13.4 15.2 13.3 14.2 13.2 13.2 13.1 12.2 13.2 11.2 13.7 10.4 14.6 9.9 15.6 10 16.5 10.4 17.4 10.8 18.3 11.1 19.3 11.4 20.2 11.1Z\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface LoadingIndicatorProps\n\textends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n\t/**\n\t * Visual style variant.\n\t * - `uncontained` (default): bare indicator, no container background\n\t * - `contained`: indicator inside a circular container\n\t * (MD3 spec: 38dp container / 24dp active indicator)\n\t */\n\tvariant?: \"uncontained\" | \"contained\";\n\n\t/**\n\t * Indicator size in dp (pixels). Clamped to the MD3 spec range [24dp, 240dp].\n\t * Defaults to 48dp.\n\t *\n\t * Size guidelines:\n\t * - Small displays: 24–48dp\n\t * - Medium displays: 48–80dp\n\t * - Large/XL displays (desktop): up to 240dp\n\t *\n\t * @default 48\n\t */\n\tsize?: number;\n\n\t/**\n\t * Determinate progress value between 0 and 1.\n\t * - **Omit** (default) for indeterminate mode: continuous morphing loop.\n\t * - **Provide** for determinate mode: Circle→SoftBurst morph + counterclockwise rotation.\n\t *\n\t * @example `progress={0.7}` shows 70% progress\n\t */\n\tprogress?: number;\n\n\t/**\n\t * Active indicator color override. Falls back to MD3 system color tokens.\n\t * Supports any valid CSS color value or CSS variable.\n\t * @example \"#ff5722\" | \"var(--brand-color)\"\n\t */\n\tcolor?: string;\n\n\t/**\n\t * Required accessible label describing what is loading.\n\t * @example \"Loading news article\"\n\t */\n\t\"aria-label\": string;\n}\n\n// ─── Indeterminate SVG (pure SMIL, zero JS overhead) ─────────────────────────\nconst IndeterminateSvg = React.memo(function IndeterminateSvg({\n\tsize,\n}: {\n\tsize: number;\n}) {\n\t// Trì hoãn chèn <animate> 1 frame bằng RequestAnimationFrame\n\t// giúp bypass hoàn toàn lỗi Chromium đóng băng SMIL khi parent container đang thực hiện CSS transform/animation.\n\tconst [ready, setReady] = React.useState(false);\n\tReact.useEffect(() => {\n\t\tconst raf = requestAnimationFrame(() => setReady(true));\n\t\treturn () => cancelAnimationFrame(raf);\n\t}, []);\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t>\n\t\t\t<path d={SHAPE_VALUES.split(\";\")[0]}>\n\t\t\t\t{ready && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<animate\n\t\t\t\t\t\t\tattributeName=\"d\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={SHAPE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={SHAPE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={SHAPE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<animateTransform\n\t\t\t\t\t\t\tattributeName=\"transform\"\n\t\t\t\t\t\t\tattributeType=\"XML\"\n\t\t\t\t\t\t\ttype=\"rotate\"\n\t\t\t\t\t\t\tdur=\"5s\"\n\t\t\t\t\t\t\trepeatCount=\"indefinite\"\n\t\t\t\t\t\t\tcalcMode=\"spline\"\n\t\t\t\t\t\t\tkeySplines={ROTATE_KEY_SPLINES}\n\t\t\t\t\t\t\tkeyTimes={ROTATE_KEY_TIMES}\n\t\t\t\t\t\t\tvalues={ROTATE_VALUES}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</path>\n\t\t</svg>\n\t);\n});\n\n// ─── Determinate SVG (React-controlled morph + counterclockwise rotation) ────\n// Uses CSS transition for smooth d attribute changes where supported (Chromium),\n// with a style-based transform fallback for rotation.\nconst DeterminateSvg = React.memo(function DeterminateSvg({\n\tsize,\n\tprogress,\n}: {\n\tsize: number;\n\tprogress: number;\n}) {\n\t// Clamp and interpolate progress between 0 (circle) and 1 (soft burst)\n\tconst p = Math.min(1, Math.max(0, progress));\n\n\t// Counterclockwise rotation: 0° at 0% → -180° at 100% (per Android spec)\n\tconst rotation = -180 * p;\n\n\t// The path morphs from circle (p=0) to soft-burst (p=1).\n\t// We use a SMIL animate with begin=\"indefinite\" that we snap to progress.\n\t// For maximum compatibility, render the correct endpoint shape based on progress,\n\t// relying on the CSS `d` property transition for smooth animation.\n\tconst pathD = p < 0.5 ? DETERMINATE_CIRCLE : DETERMINATE_SOFT_BURST;\n\n\treturn (\n\t\t<svg\n\t\t\tviewBox=\"4 4 40 40\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\tfocusable=\"false\"\n\t\t\tstyle={{\n\t\t\t\ttransform: `rotate(${rotation}deg)`,\n\t\t\t\ttransition: \"transform 0.3s ease\",\n\t\t\t}}\n\t\t>\n\t\t\t<path d={pathD} style={{ transition: \"d 0.3s ease\" }} />\n\t\t</svg>\n\t);\n});\n\n// ─── Main Component ───────────────────────────────────────────────────────────\nexport const LoadingIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tLoadingIndicatorProps\n>(\n\t(\n\t\t{\n\t\t\tvariant = \"uncontained\",\n\t\t\tsize = 48,\n\t\t\tprogress,\n\t\t\tcolor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isContained = variant === \"contained\";\n\t\tconst isDeterminate = progress !== undefined;\n\n\t\t// MD3 spec: strict size range [24dp, 240dp]\n\t\tconst clampedSize = Math.min(240, Math.max(24, size));\n\n\t\t// Proportional scaling based on the default 48dp spec size\n\t\tconst scaleFactor = clampedSize / 48;\n\n\t\t// MD3 spec: contained → 38dp container, 24dp active indicator\n\t\t// Ratio: 38/24 = 1.583 — preserved at all sizes\n\t\tconst containerSize = isContained ? 38 * scaleFactor : undefined;\n\t\tconst indicatorSize = isContained ? 24 * scaleFactor : clampedSize;\n\n\t\t// MD3 color tokens (with per-variant defaults)\n\t\tconst activeColor = isContained\n\t\t\t? (color ?? \"var(--md-sys-color-indicator-contained-active)\")\n\t\t\t: (color ?? \"var(--md-sys-color-indicator-active)\");\n\n\t\t// aria-valuenow is only set in determinate mode (per ARIA spec)\n\t\tconst ariaNow = isDeterminate\n\t\t\t? Math.round(Math.min(1, Math.max(0, progress)) * 100)\n\t\t\t: undefined;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\taria-valuenow={ariaNow}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: clampedSize,\n\t\t\t\t\theight: clampedSize,\n\t\t\t\t\tcolor: activeColor,\n\t\t\t\t\t...style,\n\t\t\t\t}}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{isContained ? (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center justify-center rounded-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: containerSize,\n\t\t\t\t\t\t\theight: containerSize,\n\t\t\t\t\t\t\tbackgroundColor:\n\t\t\t\t\t\t\t\t\"var(--md-sys-color-indicator-contained-container)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t) : isDeterminate ? (\n\t\t\t\t\t<DeterminateSvg size={indicatorSize} progress={progress} />\n\t\t\t\t) : (\n\t\t\t\t\t<IndeterminateSvg size={indicatorSize} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n","export function easeInOutCubic(x: number): number {\n\treturn x < 0.5 ? 4 * x * x * x : 1 - (-2 * x + 2) ** 3 / 2;\n}\n\nexport function generateWavyCircularPath(\n\tcenter: number,\n\tradius: number,\n\tamplitude: number,\n\twavelength: number,\n): string {\n\tconst circumference = 2 * Math.PI * radius;\n\tconst numWaves = Math.max(\n\t\t3,\n\t\tMath.round(circumference / Math.max(1, wavelength)),\n\t);\n\tconst steps = numWaves * 4;\n\tconst dt = (2 * Math.PI) / steps;\n\n\tconst rAt = (t: number) => radius + amplitude * Math.sin(numWaves * t);\n\tconst drAt = (t: number) => amplitude * numWaves * Math.cos(numWaves * t);\n\tconst xAt = (t: number) => center + rAt(t) * Math.cos(t);\n\tconst yAt = (t: number) => center + rAt(t) * Math.sin(t);\n\tconst dxAt = (t: number) => drAt(t) * Math.cos(t) - rAt(t) * Math.sin(t);\n\tconst dyAt = (t: number) => drAt(t) * Math.sin(t) + rAt(t) * Math.cos(t);\n\n\tlet d = \"\";\n\tconst tStart = 0;\n\n\tfor (let i = 0; i < steps; i++) {\n\t\tconst t0 = tStart + i * dt;\n\t\tconst t1 = tStart + (i + 1) * dt;\n\n\t\tconst scale = dt / 3;\n\t\tconst cp1x = xAt(t0) + scale * dxAt(t0);\n\t\tconst cp1y = yAt(t0) + scale * dyAt(t0);\n\t\tconst cp2x = xAt(t1) - scale * dxAt(t1);\n\t\tconst cp2y = yAt(t1) - scale * dyAt(t1);\n\n\t\tif (i === 0) d += `M ${xAt(t0).toFixed(2)} ${yAt(t0).toFixed(2)}`;\n\t\td += ` C ${cp1x.toFixed(2)} ${cp1y.toFixed(2)}, ${cp2x.toFixed(2)} ${cp2y.toFixed(2)}, ${xAt(t1).toFixed(2)} ${yAt(t1).toFixed(2)}`;\n\t}\n\td += \" Z\";\n\treturn d;\n}\n\nexport function getSinePath(\n\tstartX: number,\n\tendX: number,\n\tphase: number,\n\twl: number,\n\tamp: number,\n) {\n\tif (startX >= endX) return \"\";\n\tlet d = \"\";\n\tconst step = amp === 0 ? Math.max(10, endX - startX) : 1;\n\n\tconst yStart = Math.sin(((startX + phase) / wl) * 2 * Math.PI) * amp;\n\td += `M ${startX.toFixed(2)} ${yStart.toFixed(2)}`;\n\n\tlet nextX = Math.ceil(startX / step) * step;\n\tif (nextX === startX) nextX += step;\n\n\twhile (nextX < endX) {\n\t\tconst y = Math.sin(((nextX + phase) / wl) * 2 * Math.PI) * amp;\n\t\td += ` L ${nextX.toFixed(2)} ${y.toFixed(2)}`;\n\t\tnextX += step;\n\t}\n\n\tconst yEnd = Math.sin(((endX + phase) / wl) * 2 * Math.PI) * amp;\n\td += ` L ${endX.toFixed(2)} ${yEnd.toFixed(2)}`;\n\n\treturn d;\n}\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { CircularProgressProps } from \"./types\";\nimport { generateWavyCircularPath } from \"./utils\";\n\nexport const CircularProgress = React.forwardRef<\n\tHTMLDivElement,\n\tCircularProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tsize = 48,\n\t\t\ttrackHeight = 4,\n\t\t\tshape = \"flat\",\n\t\t\tamplitude,\n\t\t\twavelength,\n\t\t\tgapSize = 4,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst radius = (size - trackHeight) / 2;\n\t\tconst center = size / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\tconst isWavy = shape === \"wavy\";\n\n\t\tconst BASELINE_SIZE = 48;\n\t\tconst scaleFactor = size / BASELINE_SIZE;\n\t\tconst effectiveAmplitude = React.useMemo(\n\t\t\t() => amplitude ?? 1.6 * scaleFactor,\n\t\t\t[amplitude, scaleFactor],\n\t\t);\n\t\tconst effectiveWavelength = React.useMemo(\n\t\t\t() => wavelength ?? 15 * scaleFactor,\n\t\t\t[wavelength, scaleFactor],\n\t\t);\n\n\t\tconst wavyActivePath = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisWavy\n\t\t\t\t\t? generateWavyCircularPath(\n\t\t\t\t\t\t\tcenter,\n\t\t\t\t\t\t\tradius,\n\t\t\t\t\t\t\teffectiveAmplitude,\n\t\t\t\t\t\t\teffectiveWavelength,\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t[isWavy, center, radius, effectiveAmplitude, effectiveWavelength],\n\t\t);\n\n\t\tconst circumference = React.useMemo(() => 2 * Math.PI * radius, [radius]);\n\t\tconst gapForTrack = React.useMemo(\n\t\t\t() => (gapSize + trackHeight) / circumference,\n\t\t\t[gapSize, trackHeight, circumference],\n\t\t);\n\t\tconst activeAngularFraction = isDeterminate ? clampedValue / 100 : 0;\n\n\t\tconst trackOffset = isDeterminate ? activeAngularFraction + gapForTrack : 0;\n\t\tconst trackLength = isDeterminate\n\t\t\t? Math.max(0.001, 1 - activeAngularFraction - 2 * gapForTrack)\n\t\t\t: 1;\n\n\t\tconst ActiveCircleElem = m.circle;\n\t\tconst ActivePathElem = m.path;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"progressbar\"\n\t\t\t\taria-label={ariaLabel}\n\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\taria-valuemin={0}\n\t\t\t\taria-valuemax={100}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative inline-flex items-center justify-center shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<svg\n\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\theight={size}\n\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tstyle={{ transform: \"rotate(-90deg)\", overflow: \"visible\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isDeterminate ? (\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tinitial={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\tanimate={{ pathLength: trackLength, pathOffset: trackOffset }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\n\t\t\t\t\t\t{isDeterminate &&\n\t\t\t\t\t\t\t(isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tinitial={{ pathLength: 0 }}\n\t\t\t\t\t\t\t\t\tanimate={{ pathLength: clampedValue / 100 }}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 0.4,\n\t\t\t\t\t\t\t\t\t\tease: [0.2, 0, 0, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t{!isDeterminate && (\n\t\t\t\t\t\t<m.svg\n\t\t\t\t\t\t\twidth={size}\n\t\t\t\t\t\t\theight={size}\n\t\t\t\t\t\t\tviewBox={`0 0 ${size} ${size}`}\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\t\t\tinset: 0,\n\t\t\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\t\t\trotate: \"-90deg\",\n\t\t\t\t\t\t\t\ttransformOrigin: \"center\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tanimate={{ rotate: [\"-90deg\", \"270deg\"] }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\trotate: {\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: \"linear\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<m.circle\n\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke={bgTrackColor}\n\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\tpathLength: [\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.75 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t\tMath.max(0.001, 1 - 0.1 - 2 * gapForTrack),\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\trotate: [\n\t\t\t\t\t\t\t\t\t\t`${(0.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.0 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t\t`${(1.1 + gapForTrack) * 360}deg`,\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t\t\t<ActivePathElem\n\t\t\t\t\t\t\t\t\td={wavyActivePath ?? \"\"}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ActiveCircleElem\n\t\t\t\t\t\t\t\t\tcx={center}\n\t\t\t\t\t\t\t\t\tcy={center}\n\t\t\t\t\t\t\t\t\tr={radius}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstyle={{ originX: \"50%\", originY: \"50%\" }}\n\t\t\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\t\t\tpathLength: [0.1, 0.75, 0.1],\n\t\t\t\t\t\t\t\t\t\trotate: [\"0deg\", \"90deg\", \"360deg\"],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\t\t\t\tease: [0.4, 0, 0.2, 1],\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</m.svg>\n\t\t\t\t\t)}\n\t\t\t\t</LazyMotion>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCircularProgress.displayName = \"CircularProgress\";\n","import * as React from \"react\";\n\nexport function useContainerWidth() {\n\tconst [width, setWidth] = React.useState(0);\n\tconst observerRef = React.useRef<ResizeObserver | null>(null);\n\n\tconst ref = React.useCallback((node: HTMLDivElement | null) => {\n\t\tif (observerRef.current) {\n\t\t\tobserverRef.current.disconnect();\n\t\t\tobserverRef.current = null;\n\t\t}\n\n\t\tif (node) {\n\t\t\tconst obs = new ResizeObserver((entries) => {\n\t\t\t\tconst contentRect = entries[0].contentRect;\n\t\t\t\tsetWidth(contentRect.width);\n\t\t\t});\n\t\t\tobs.observe(node);\n\t\t\tobserverRef.current = obs;\n\t\t}\n\t}, []);\n\n\t// Cleanup on unmount\n\tReact.useEffect(() => {\n\t\treturn () => {\n\t\t\tif (observerRef.current) {\n\t\t\t\tobserverRef.current.disconnect();\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn [ref, width] as const;\n}\n\nexport function useMergedRef<T>(\n\t...refs: (React.Ref<T> | undefined | null)[]\n): React.RefCallback<T> {\n\treturn React.useCallback(\n\t\t(node: T | null) => {\n\t\t\tfor (const ref of refs) {\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref && typeof ref === \"object\") {\n\t\t\t\t\t(ref as React.MutableRefObject<T | null>).current = node;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[refs],\n\t);\n}\n","import { m } from \"motion/react\";\nimport * as React from \"react\";\n\nexport const FlatLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\tcrawlerSpeed: number;\n}>(function FlatLinearTrack({\n\ttrackHeight,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\tcrawlerSpeed,\n}) {\n\tconst isDeterminate = value !== undefined;\n\tconst radius = trackHeight / 2;\n\tconst minActiveWidth = trackHeight;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: trackHeight, borderRadius: radius }}\n\t\t>\n\t\t\t{isDeterminate ? (\n\t\t\t\t<>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: trackColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\twidth: \"100%\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, 0%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t[isRtl ? \"right\" : \"left\"]:\n\t\t\t\t\t\t\t\t`calc(max(${minActiveWidth}px, ${value}%) + ${gapSize}px)`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: activeColor,\n\t\t\t\t\t\t\tborderRadius: radius,\n\t\t\t\t\t\t\tminWidth: minActiveWidth,\n\t\t\t\t\t\t\t...(isRtl ? { right: 0 } : { left: 0 }),\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tinitial={{ width: `${minActiveWidth}px` }}\n\t\t\t\t\t\tanimate={{ width: `${value}%` }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, ease: [0.2, 0, 0, 1] }}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute inset-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: trackColor, borderRadius: radius }}\n\t\t\t\t\t/>\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tclassName=\"absolute inset-y-0\"\n\t\t\t\t\t\tstyle={{ backgroundColor: activeColor, borderRadius: radius }}\n\t\t\t\t\t\tinitial={{ left: \"-40%\", width: \"40%\" }}\n\t\t\t\t\t\tanimate={{ left: [\"-40%\", \"100%\"], width: [\"40%\", \"20%\", \"40%\"] }}\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tduration: 2 / Math.max(0.1, crawlerSpeed),\n\t\t\t\t\t\t\trepeat: Number.POSITIVE_INFINITY,\n\t\t\t\t\t\t\tease: \"easeInOut\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { animate, useAnimationFrame, useMotionValue } from \"motion/react\";\nimport * as React from \"react\";\nimport { useContainerWidth } from \"./hooks\";\nimport { easeInOutCubic, getSinePath } from \"./utils\";\n\nexport const WavyLinearTrack = React.memo<{\n\ttrackHeight: number;\n\tsvgHeight: number;\n\tamplitude: number;\n\twavelength: number;\n\tindeterminateWavelength: number;\n\tactiveColor: string;\n\ttrackColor: string;\n\tvalue?: number;\n\tisRtl: boolean;\n\tgapSize: number;\n\twaveSpeed: number;\n\tcrawlerSpeed: number;\n\tdeterminateAnimation: \"md3\" | \"continuous\";\n\tindeterminateAnimation: \"md3\" | \"continuous\";\n\ttrackShape: \"flat\" | \"wavy\";\n}>(function WavyLinearTrack({\n\ttrackHeight,\n\tsvgHeight,\n\tamplitude,\n\twavelength,\n\tindeterminateWavelength,\n\tactiveColor,\n\ttrackColor,\n\tvalue,\n\tisRtl,\n\tgapSize,\n\twaveSpeed,\n\tcrawlerSpeed,\n\tdeterminateAnimation,\n\tindeterminateAnimation,\n\ttrackShape,\n}) {\n\tconst isDeterminate = typeof value === \"number\";\n\tconst clampedValue = isDeterminate ? Math.max(0, Math.min(100, value)) : 100;\n\tconst titleId = React.useId();\n\n\tconst [containerRef, width] = useContainerWidth();\n\n\tconst activePathRef = React.useRef<SVGPathElement>(null);\n\tconst trackPathRef = React.useRef<SVGPathElement>(null);\n\n\tconst amplitudeMV = useMotionValue(amplitude);\n\tconst fractionMV = useMotionValue(isDeterminate ? clampedValue / 100 : 1);\n\n\tReact.useEffect(() => {\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = clampedValue / 100;\n\n\t\t\t// Xử lý Flattening Logic dựa trên prop determinateAnimation\n\t\t\tlet targetAmp = amplitude;\n\t\t\tif (determinateAnimation === \"md3\") {\n\t\t\t\ttargetAmp = fraction <= 0.1 || fraction >= 0.95 ? 0 : amplitude;\n\t\t\t}\n\n\t\t\tanimate(amplitudeMV, targetAmp, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tbounce: 0,\n\t\t\t\tduration: 0.5,\n\t\t\t});\n\t\t\tanimate(fractionMV, fraction, { duration: 0.4, ease: [0.2, 0, 0, 1] });\n\t\t}\n\t}, [\n\t\tclampedValue,\n\t\tisDeterminate,\n\t\tamplitude,\n\t\tamplitudeMV,\n\t\tfractionMV,\n\t\tdeterminateAnimation,\n\t]);\n\n\tconst activeWavelength = Math.max(\n\t\t1,\n\t\tisDeterminate ? wavelength : indeterminateWavelength,\n\t);\n\tconst trackAmp = trackShape === \"wavy\" ? amplitude : 0;\n\n\tuseAnimationFrame((time) => {\n\t\tif (width === 0) return;\n\n\t\tconst currentAmp = amplitudeMV.get();\n\t\tconst phase = (time / 1000) * waveSpeed * activeWavelength;\n\t\tconst capWidth = trackHeight / 2;\n\n\t\tlet activePathD = \"\";\n\t\tlet trackD = \"\";\n\t\tconst totalGap = gapSize + trackHeight;\n\n\t\t// 1. CHẾ ĐỘ CÓ XÁC ĐỊNH (DETERMINATE)\n\t\tif (isDeterminate) {\n\t\t\tconst fraction = fractionMV.get();\n\t\t\tconst barHead = fraction * width;\n\n\t\t\tconst adjHead = Math.max(capWidth, Math.min(width - capWidth, barHead));\n\t\t\tconst adjTail = capWidth;\n\n\t\t\tif (fraction > 0 && adjHead - adjTail > 0.1) {\n\t\t\t\tactivePathD = getSinePath(\n\t\t\t\t\tadjTail,\n\t\t\t\t\tadjHead,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\tcurrentAmp,\n\t\t\t\t);\n\t\t\t} else if (fraction === 0) {\n\t\t\t\tactivePathD = `M ${capWidth} 0 L ${capWidth + 0.01} 0`;\n\t\t\t}\n\n\t\t\tconst trackStart = adjHead + totalGap;\n\t\t\tif (trackStart < width - capWidth) {\n\t\t\t\ttrackD = getSinePath(\n\t\t\t\t\ttrackStart,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\t// 2. CHẾ ĐỘ KHÔNG XÁC ĐỊNH (INDETERMINATE)\n\t\telse {\n\t\t\tconst safeCrawlerSpeed = Math.max(0.1, crawlerSpeed);\n\t\t\tconst activeLines: { tail: number; head: number }[] = [];\n\n\t\t\tif (indeterminateAnimation === \"continuous\") {\n\t\t\t\tconst cycle = 2000 / safeCrawlerSpeed;\n\t\t\t\tconst fraction = (time % cycle) / cycle;\n\t\t\t\tactiveLines.push({\n\t\t\t\t\ttail: easeInOutCubic(Math.max(0, fraction * 1.5 - 0.5)),\n\t\t\t\t\thead: easeInOutCubic(Math.min(1, fraction * 1.5)),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst cycle = 1750 / safeCrawlerSpeed;\n\t\t\t\tconst t = (time % cycle) * safeCrawlerSpeed;\n\n\t\t\t\tconst l1H = easeInOutCubic(Math.max(0, Math.min(1, t / 1000)));\n\t\t\t\tconst l1T = easeInOutCubic(Math.max(0, Math.min(1, (t - 250) / 1000)));\n\t\t\t\tconst l2H = easeInOutCubic(Math.max(0, Math.min(1, (t - 650) / 850)));\n\t\t\t\tconst l2T = easeInOutCubic(Math.max(0, Math.min(1, (t - 900) / 850)));\n\n\t\t\t\tactiveLines.push({ tail: l1T, head: l1H });\n\t\t\t\tactiveLines.push({ tail: l2T, head: l2H });\n\t\t\t}\n\n\t\t\tconst segments = activeLines\n\t\t\t\t.map((line) => {\n\t\t\t\t\tconst barTail = line.tail * width;\n\t\t\t\t\tconst barHead = line.head * width;\n\t\t\t\t\tconst adjTail = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barTail),\n\t\t\t\t\t);\n\t\t\t\t\tconst adjHead = Math.max(\n\t\t\t\t\t\tcapWidth,\n\t\t\t\t\t\tMath.min(width - capWidth, barHead),\n\t\t\t\t\t);\n\t\t\t\t\treturn { adjTail, adjHead };\n\t\t\t\t})\n\t\t\t\t.filter((seg) => seg.adjHead - seg.adjTail > 0.1);\n\n\t\t\tactivePathD = segments\n\t\t\t\t.map((seg) =>\n\t\t\t\t\tgetSinePath(\n\t\t\t\t\t\tseg.adjTail,\n\t\t\t\t\t\tseg.adjHead,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tactiveWavelength,\n\t\t\t\t\t\tcurrentAmp,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.join(\" \");\n\n\t\t\tlet currentTrackX = capWidth;\n\t\t\tfor (const seg of segments) {\n\t\t\t\tconst trackEnd = seg.adjTail - totalGap;\n\t\t\t\tif (trackEnd > currentTrackX) {\n\t\t\t\t\ttrackD += `${getSinePath(currentTrackX, trackEnd, phase, activeWavelength, trackAmp)} `;\n\t\t\t\t}\n\t\t\t\tcurrentTrackX = Math.max(currentTrackX, seg.adjHead + totalGap);\n\t\t\t}\n\t\t\tif (currentTrackX < width - capWidth) {\n\t\t\t\ttrackD += getSinePath(\n\t\t\t\t\tcurrentTrackX,\n\t\t\t\t\twidth - capWidth,\n\t\t\t\t\tphase,\n\t\t\t\t\tactiveWavelength,\n\t\t\t\t\ttrackAmp,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (activePathRef.current)\n\t\t\tactivePathRef.current.setAttribute(\"d\", activePathD);\n\t\tif (trackPathRef.current)\n\t\t\ttrackPathRef.current.setAttribute(\"d\", trackD.trim());\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName=\"relative w-full overflow-hidden\"\n\t\t\tstyle={{ height: svgHeight }}\n\t\t>\n\t\t\t{width > 0 && (\n\t\t\t\t<svg\n\t\t\t\t\tclassName=\"absolute inset-0 w-full h-full\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\toverflow: \"visible\",\n\t\t\t\t\t\ttransform: isRtl ? \"scaleX(-1)\" : undefined,\n\t\t\t\t\t}}\n\t\t\t\t\taria-labelledby={titleId}\n\t\t\t\t>\n\t\t\t\t\t<title id={titleId}>\n\t\t\t\t\t\t{isDeterminate\n\t\t\t\t\t\t\t? `Progress: ${clampedValue}%`\n\t\t\t\t\t\t\t: \"Indeterminate loading progress\"}\n\t\t\t\t\t</title>\n\t\t\t\t\t<g transform={`translate(0, ${svgHeight / 2})`}>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={trackPathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={trackColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tref={activePathRef}\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke={activeColor}\n\t\t\t\t\t\t\tstrokeWidth={trackHeight}\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n","import { domMax, LazyMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { useMergedRef } from \"./hooks\";\nimport { FlatLinearTrack } from \"./linear-flat\";\nimport { WavyLinearTrack } from \"./linear-wavy\";\nimport type { LinearProgressProps } from \"./types\";\n\nexport const LinearProgress = React.forwardRef<\n\tHTMLDivElement,\n\tLinearProgressProps\n>(\n\t(\n\t\t{\n\t\t\tvalue,\n\t\t\tshape = \"flat\",\n\t\t\ttrackShape,\n\t\t\ttrackHeight = 4,\n\t\t\tamplitude,\n\t\t\twavelength = 40,\n\t\t\tindeterminateWavelength = 20,\n\t\t\twaveSpeed = 1,\n\t\t\tcrawlerSpeed = 1,\n\t\t\tdeterminateAnimation = \"md3\",\n\t\t\tindeterminateAnimation = \"continuous\",\n\t\t\tgapSize = 4,\n\t\t\tshowStopIndicator = \"auto\",\n\t\t\tcolor,\n\t\t\ttrackColor,\n\t\t\tclassName,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isDeterminate = value !== undefined;\n\t\tconst clampedValue = isDeterminate ? Math.min(100, Math.max(0, value)) : 0;\n\n\t\tconst containerRef = React.useRef<HTMLDivElement>(null);\n\t\tconst mergedRef = useMergedRef(ref, containerRef);\n\t\tconst [isRtl, setIsRtl] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (containerRef.current) {\n\t\t\t\tconst dir = getComputedStyle(containerRef.current).direction;\n\t\t\t\tsetIsRtl(dir === \"rtl\");\n\t\t\t}\n\t\t}, []);\n\n\t\tconst isWavy = shape === \"wavy\";\n\t\tconst resolvedTrackShape = trackShape ?? shape;\n\n\t\tconst effectiveAmplitude = React.useMemo(() => amplitude ?? 3, [amplitude]);\n\t\tconst svgHeight = React.useMemo(\n\t\t\t() => (isWavy ? trackHeight + effectiveAmplitude * 2 : trackHeight),\n\t\t\t[isWavy, trackHeight, effectiveAmplitude],\n\t\t);\n\n\t\tconst shouldShowStop = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisDeterminate &&\n\t\t\t\tresolvedTrackShape === \"flat\" &&\n\t\t\t\t(showStopIndicator === true ||\n\t\t\t\t\t(showStopIndicator === \"auto\" && isDeterminate)),\n\t\t\t[isDeterminate, resolvedTrackShape, showStopIndicator],\n\t\t);\n\n\t\tconst stopSize = React.useMemo(\n\t\t\t() => Math.max(2, trackHeight > 4 ? 4 : trackHeight / 2),\n\t\t\t[trackHeight],\n\t\t);\n\n\t\tconst stopOffset = (trackHeight - stopSize) / 2;\n\n\t\tconst activeColor = color || \"var(--md-sys-color-indicator-active)\";\n\t\tconst bgTrackColor = trackColor || \"var(--md-sys-color-indicator-track)\";\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<div\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\trole=\"progressbar\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-valuenow={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\taria-valuemin={0}\n\t\t\t\t\taria-valuemax={100}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex w-full flex-col justify-center\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ height: svgHeight }}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{isWavy ? (\n\t\t\t\t\t\t<WavyLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tsvgHeight={svgHeight}\n\t\t\t\t\t\t\tamplitude={effectiveAmplitude}\n\t\t\t\t\t\t\twavelength={wavelength}\n\t\t\t\t\t\t\tindeterminateWavelength={indeterminateWavelength}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\twaveSpeed={waveSpeed}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t\tdeterminateAnimation={determinateAnimation}\n\t\t\t\t\t\t\tindeterminateAnimation={indeterminateAnimation}\n\t\t\t\t\t\t\ttrackShape={resolvedTrackShape}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FlatLinearTrack\n\t\t\t\t\t\t\ttrackHeight={trackHeight}\n\t\t\t\t\t\t\tactiveColor={activeColor}\n\t\t\t\t\t\t\ttrackColor={bgTrackColor}\n\t\t\t\t\t\t\tvalue={isDeterminate ? clampedValue : undefined}\n\t\t\t\t\t\t\tisRtl={isRtl}\n\t\t\t\t\t\t\tgapSize={gapSize}\n\t\t\t\t\t\t\tcrawlerSpeed={crawlerSpeed}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowStop && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\tclassName=\"absolute rounded-full\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\twidth: stopSize,\n\t\t\t\t\t\t\t\theight: stopSize,\n\t\t\t\t\t\t\t\tbackgroundColor: \"var(--md-sys-color-indicator-stop)\",\n\t\t\t\t\t\t\t\ttop: svgHeight / 2 - stopSize / 2,\n\t\t\t\t\t\t\t\t...(isRtl ? { left: stopOffset } : { right: stopOffset }),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nLinearProgress.displayName = \"LinearProgress\";\n","import * as React from \"react\";\nimport { CircularProgress } from \"./circular\";\nimport { LinearProgress } from \"./linear\";\nimport type { ProgressIndicatorProps } from \"./types\";\n\n/**\n * Thanh tiến trình (Progress Indicator) theo nguyên tắc Material Design 3 Expressive.\n * Hỗ trợ linh hoạt 2 loại hình hiển thị: Linear (Đường thẳng) và Circular (Hình tròn),\n * cùng với thiết kế Wavy (Lượn sóng) động rất mềm mại.\n *\n * @example\n * ```tsx\n * // Determinate Flat Linear\n * <ProgressIndicator variant=\"linear\" value={60} aria-label=\"Loading profile...\" />\n *\n * // Indeterminate Wavy Linear\n * <ProgressIndicator variant=\"linear\" shape=\"wavy\" aria-label=\"Connecting to server...\" />\n *\n * // Determinate Flat Circular\n * <ProgressIndicator variant=\"circular\" value={45} size={48} aria-label=\"Syncing...\" />\n * ```\n */\nexport const ProgressIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tProgressIndicatorProps\n>((props, ref) => {\n\tif (props.variant === \"circular\") {\n\t\treturn <CircularProgress ref={ref} {...props} />;\n\t}\n\treturn <LinearProgress ref={ref} {...props} />;\n});\n\nProgressIndicator.displayName = \"ProgressIndicator\";\n\nexport type {\n\tCircularProgressProps,\n\tLinearProgressProps,\n\tProgressIndicatorProps,\n} from \"./types\";\n","import { AnimatePresence, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Expressive Ripple\n//\n// - Origin: pointer-down coordinates (x, y) relative to container\n// - Shape: perfectly round circle, expands from origin to diagonally fill btn\n// - Color: currentColor at 12% opacity (matches MD3 state layer spec)\n// - A11y: disabled when `prefers-reduced-motion` is active (configurable)\n// - Clipping: caller wraps in overflow-hidden; border-radius handled on parent\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Represents a single ripple wave instance with position and size metadata.\n *\n * @example\n * ```tsx\n * const ripple: RippleOrigin = { id: Date.now(), x: 50, y: 30, size: 200 };\n * ```\n */\nexport interface RippleOrigin {\n\t/** Unique identifier used as React key and for removal. */\n\tid: number;\n\t/** X coordinate of the pointer event relative to the container's left edge (px). */\n\tx: number;\n\t/** Y coordinate of the pointer event relative to the container's top edge (px). */\n\ty: number;\n\t/**\n\t * Diameter of the ripple circle (px).\n\t * Typically `Math.hypot(width, height) * 2` to ensure it fills the container.\n\t */\n\tsize: number;\n}\n\n/** @internal Props for a single animated ripple element. */\ninterface RippleItemProps {\n\tripple: RippleOrigin;\n\tonDone: (id: number) => void;\n}\n\n/** @internal Memoized single ripple wave — minimises re-renders. */\nconst RippleItem = React.memo(function RippleItem({\n\tripple,\n\tonDone,\n}: RippleItemProps) {\n\treturn (\n\t\t<m.span\n\t\t\tkey={ripple.id}\n\t\t\taria-hidden=\"true\"\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tleft: ripple.x - ripple.size / 2,\n\t\t\t\ttop: ripple.y - ripple.size / 2,\n\t\t\t\twidth: ripple.size,\n\t\t\t\theight: ripple.size,\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\tbackgroundColor: \"currentColor\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t}}\n\t\t\tinitial={{ scale: 0, opacity: 0.12 }}\n\t\t\tanimate={{ scale: 1, opacity: 0 }}\n\t\t\texit={{ opacity: 0 }}\n\t\t\ttransition={{\n\t\t\t\tscale: { duration: 0.5, ease: [0.2, 0, 0, 1] },\n\t\t\t\topacity: { duration: 0.4, ease: \"easeOut\", delay: 0.1 },\n\t\t\t}}\n\t\t\tonAnimationComplete={() => onDone(ripple.id)}\n\t\t/>\n\t);\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Ripple Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the `Ripple` presentation component.\n */\nexport interface RippleProps {\n\t/** Active ripple instances to render. Managed by the parent via `useRipple`. */\n\tripples: RippleOrigin[];\n\t/** Called when a ripple's exit animation completes — remove it from state. */\n\tonRippleDone: (id: number) => void;\n\t/**\n\t * Completely disables the ripple effect.\n\t * Use this when the parent element is disabled or interaction is not desired.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * When `true`, the ripple respects the user's OS-level\n\t * `prefers-reduced-motion` accessibility setting and renders nothing if active.\n\t *\n\t * Set to `false` to always show ripples regardless of system preference.\n\t * @default true\n\t */\n\trespectSystemMotion?: boolean;\n}\n\n/**\n * MD3 Expressive Ripple — animated touch-feedback wave layer.\n *\n * Renders absolutely-positioned ripple circles inside an `overflow-hidden`\n * container. Must be placed as a direct child of the interactive element.\n *\n * @remarks\n * - The parent element **must** have `overflow: hidden` and `position: relative`\n * (or equivalent) for clipping to work correctly.\n * - Set `disabled` to `true` on parent's disabled state to avoid stale ripples.\n * - The ripple color is `currentColor` at 12% opacity — matching MD3 state layer spec.\n *\n * @example\n * ```tsx\n * const { ripples, onPointerDown, removeRipple } = useRippleState();\n *\n * <button onPointerDown={onPointerDown} className=\"relative overflow-hidden\">\n * <Ripple ripples={ripples} onRippleDone={removeRipple} />\n * Click me\n * </button>\n * ```\n *\n * @see {@link useRippleState} for the state management hook\n * @see https://m3.material.io/foundations/interaction/states/overview\n */\nexport function Ripple({\n\tripples,\n\tonRippleDone,\n\tdisabled = false,\n\trespectSystemMotion = true,\n}: RippleProps) {\n\tconst prefersReduced = useReducedMotion();\n\n\t// Disabled prop: explicitly turned off by consumer\n\tif (disabled) return null;\n\n\t// Respect system prefers-reduced-motion when opted-in\n\tif (respectSystemMotion && prefersReduced) return null;\n\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{ripples.map((r) => (\n\t\t\t\t<RippleItem key={r.id} ripple={r} onDone={onRippleDone} />\n\t\t\t))}\n\t\t</AnimatePresence>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useRippleState Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Options for configuring `useRippleState` behaviour.\n */\nexport interface UseRippleStateOptions {\n\t/**\n\t * When `true`, the ripple is suppressed — `onPointerDown` becomes a no-op.\n\t * Use this to sync the ripple with the parent element's `disabled` state.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n}\n\n/**\n * `useRippleState` — state manager for MD3 Expressive ripple waves.\n *\n * Tracks active ripple instances and provides pointer event handlers.\n * Pair with the `<Ripple>` component for rendering.\n *\n * @remarks\n * This hook only manages ripple *state* (coordinates, size, lifecycle).\n * The actual animation is handled by `<Ripple>` via Framer Motion.\n * Respecting `prefers-reduced-motion` is handled by `<Ripple>` itself.\n *\n * @param options - Configuration options. See {@link UseRippleStateOptions}.\n * @returns `{ ripples, onPointerDown, removeRipple }` — bind to the interactive element.\n *\n * @example\n * ```tsx\n * function MyButton({ disabled, children }) {\n * const { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n *\n * return (\n * <button\n * disabled={disabled}\n * onPointerDown={onPointerDown}\n * className=\"relative overflow-hidden\"\n * >\n * <Ripple ripples={ripples} onRippleDone={removeRipple} disabled={disabled} />\n * {children}\n * </button>\n * );\n * }\n * ```\n *\n * @see {@link Ripple} for the rendering component\n */\nexport function useRippleState(options: UseRippleStateOptions = {}) {\n\tconst { disabled = false } = options;\n\tconst [ripples, setRipples] = React.useState<RippleOrigin[]>([]);\n\n\tconst onPointerDown = React.useCallback(\n\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\t\tconst x = e.clientX - rect.left;\n\t\t\tconst y = e.clientY - rect.top;\n\t\t\tconst rippleSize = Math.hypot(rect.width, rect.height) * 2;\n\t\t\tsetRipples((prev) => [\n\t\t\t\t...prev,\n\t\t\t\t{ id: Date.now(), x, y, size: rippleSize },\n\t\t\t]);\n\t\t},\n\t\t[disabled],\n\t);\n\n\tconst removeRipple = React.useCallback((id: number) => {\n\t\tsetRipples((prev) => prev.filter((r) => r.id !== id));\n\t}, []);\n\n\treturn { ripples, onPointerDown, removeRipple };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legacy alias — preserved for backward-compatibility\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `useRippleState` instead. This alias will be removed in a future version.\n * @see {@link useRippleState}\n */\nexport const useRipple = useRippleState;\n","/**\n * @file ui/shared/motion-tokens.ts\n *\n * Framer Motion spring presets derived from the official MD3 Expressive\n * motion physics system (May 2025).\n *\n * Usage hierarchy:\n * 1. Import a named preset (e.g. `FAST_SPATIAL_SPRING`) for convenience.\n * 2. Call `getMotionSpring(speed, type)` when you need to pick dynamically.\n * 3. Call `getMotionTransitionCSS(speed, type, scheme?)` for pure-CSS contexts.\n *\n * @see https://m3.material.io/styles/motion/overview/how-it-works\n * @see https://m3.material.io/styles/motion/overview/specs\n */\n\nimport type { Transition } from \"motion/react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 Spring Token Structure\n//\n// MD3 defines springs as dampingRatio (0–1) + stiffness.\n// Framer Motion uses absolute `damping` coefficient.\n//\n// Conversion (with Framer's default mass = 1):\n// damping = 2 × dampingRatio × √stiffness\n//\n// Computed values (rounded to 2 decimal places):\n//\n// fast spatial: 2 × 0.6 × √800 = 2 × 0.6 × 28.28 ≈ 33.94\n// fast effects: 2 × 1.0 × √3800 = 2 × 61.64 ≈ 123.29\n// default spatial: 2 × 0.8 × √380 = 2 × 0.8 × 19.49 ≈ 31.19\n// default effects: 2 × 1.0 × √1600 = 2 × 40 = 80\n// slow spatial: 2 × 0.8 × √200 = 2 × 0.8 × 14.14 ≈ 22.63\n// slow effects: 2 × 1.0 × √800 = 2 × 28.28 ≈ 56.57\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ── Spatial springs — use for position, size, border-radius, rotation, scale ─\n\n/**\n * MD3 Expressive — Fast Spatial Spring\n * `md.sys.motion.spring.fast.spatial` (dampingRatio: 0.6, stiffness: 800)\n *\n * Use for: small components (buttons, switches, chips).\n * Has notable bounce/overshoot — feels snappy and expressive.\n */\nexport const FAST_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 33.94,\n} as const;\n\n/**\n * MD3 Expressive — Default Spatial Spring\n * `md.sys.motion.spring.default.spatial` (dampingRatio: 0.8, stiffness: 380)\n *\n * Use for: medium elements (bottom sheets, menus, navigation rail).\n * Gentle overshoot — the go-to spring for most UI animations.\n */\nexport const DEFAULT_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 380,\n\tdamping: 31.19,\n} as const;\n\n/**\n * MD3 Expressive — Slow Spatial Spring\n * `md.sys.motion.spring.slow.spatial` (dampingRatio: 0.8, stiffness: 200)\n *\n * Use for: full-screen transitions and large layout shifts.\n * Subtle, slow overshoot.\n */\nexport const SLOW_SPATIAL_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 200,\n\tdamping: 22.63,\n} as const;\n\n// ── Effects springs — use for color, opacity (critically damped, no bounce) ──\n\n/**\n * MD3 Expressive — Fast Effects Spring\n * `md.sys.motion.spring.fast.effects` (dampingRatio: 1.0, stiffness: 3800)\n *\n * Use for: color changes on switches, icon swaps, badge counts.\n * Critically damped — very fast, no overshoot.\n */\nexport const FAST_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 3800,\n\tdamping: 123.29,\n} as const;\n\n/**\n * MD3 Expressive — Default Effects Spring\n * `md.sys.motion.spring.default.effects` (dampingRatio: 1.0, stiffness: 1600)\n *\n * Use for: opacity fades, color transitions for medium-sized elements.\n * Critically damped — smooth with no overshoot.\n */\nexport const DEFAULT_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 1600,\n\tdamping: 80,\n} as const;\n\n/**\n * MD3 Expressive — Slow Effects Spring\n * `md.sys.motion.spring.slow.effects` (dampingRatio: 1.0, stiffness: 800)\n *\n * Use for: full-screen opacity/color transitions.\n * Critically damped — slow and smooth.\n */\nexport const SLOW_EFFECTS_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 800,\n\tdamping: 56.57,\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dynamic helper\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type SpringSpeed = \"fast\" | \"default\" | \"slow\";\nexport type SpringAnimationType = \"spatial\" | \"effects\";\n\nconst springMap = {\n\tfast: { spatial: FAST_SPATIAL_SPRING, effects: FAST_EFFECTS_SPRING },\n\tdefault: { spatial: DEFAULT_SPATIAL_SPRING, effects: DEFAULT_EFFECTS_SPRING },\n\tslow: { spatial: SLOW_SPATIAL_SPRING, effects: SLOW_EFFECTS_SPRING },\n} as const;\n\n/**\n * Pick a Framer Motion spring by speed and type.\n *\n * @example\n * ```tsx\n * transition={getMotionSpring(\"fast\", \"spatial\")}\n * ```\n */\nexport function getMotionSpring(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n): Transition {\n\treturn springMap[speed][type];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS transition strings\n// For contexts where Framer Motion is not used (plain CSS / Tailwind).\n// Uses official Web spring → CSS cubic-bezier conversion table.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst CSS_CURVES = {\n\texpressive: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.42, 1.67, 0.21, 0.90)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.38, 1.21, 0.22, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.39, 1.29, 0.35, 0.98)\",\n\t\t\t\tdurationMs: 650,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n\tstandard: {\n\t\tfast: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 350,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.31, 0.94, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 150,\n\t\t\t},\n\t\t},\n\t\tdefault: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 500,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.80, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 200,\n\t\t\t},\n\t\t},\n\t\tslow: {\n\t\t\tspatial: {\n\t\t\t\tcurve: \"cubic-bezier(0.27, 1.06, 0.18, 1.00)\",\n\t\t\t\tdurationMs: 750,\n\t\t\t},\n\t\t\teffects: {\n\t\t\t\tcurve: \"cubic-bezier(0.34, 0.88, 0.34, 1.00)\",\n\t\t\t\tdurationMs: 300,\n\t\t\t},\n\t\t},\n\t},\n} as const;\n\nexport type MotionScheme = \"expressive\" | \"standard\";\n\n/**\n * Returns a CSS `transition` value string using the official MD3 web curve\n * conversion, e.g. `\"500ms cubic-bezier(0.38, 1.21, 0.22, 1.00)\"`.\n *\n * @example\n * ```ts\n * element.style.transition = `border-radius ${getMotionTransitionCSS(\"default\", \"spatial\")}`;\n * ```\n */\nexport function getMotionTransitionCSS(\n\tspeed: SpringSpeed,\n\ttype: SpringAnimationType,\n\tscheme: MotionScheme = \"expressive\",\n): string {\n\tconst { curve, durationMs } = CSS_CURVES[scheme][speed][type];\n\treturn `${durationMs}ms ${curve}`;\n}\n","/**\n * @file shared/constants.ts\n *\n * Shared animation constants for MD3 Expressive UI components.\n * Centralises spring transition configs and motion variant objects to avoid\n * duplication across button, icon-button, FAB, and other interactive components.\n *\n * @see https://m3.material.io/foundations/animation/overview\n */\n\nimport type { Target, TargetAndTransition, Transition } from \"motion/react\";\nimport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n} from \"./motion-tokens\";\n\nexport {\n\tDEFAULT_EFFECTS_SPRING,\n\tDEFAULT_SPATIAL_SPRING,\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n\tgetMotionSpring,\n\tgetMotionTransitionCSS,\n\tSLOW_EFFECTS_SPRING,\n\tSLOW_SPATIAL_SPRING,\n} from \"./motion-tokens\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Spring Transitions\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Fast spring — used for border-radius morphing, icon swaps.\n * Maps to MD3 `fast.effects` (critically damped, stiffness 3800).\n *\n * @example\n * ```tsx\n * <m.button transition={{ borderRadius: SPRING_TRANSITION_FAST }}>...</m.button>\n * ```\n */\nexport const SPRING_TRANSITION_FAST: Transition = FAST_EFFECTS_SPRING;\n\n/**\n * Standard spring — used for icon/content scale animations.\n * Maps to MD3 `default.effects` (critically damped, stiffness 1600).\n *\n * @example\n * ```tsx\n * <m.span transition={SPRING_TRANSITION}>...</m.span>\n * ```\n */\nexport const SPRING_TRANSITION: Transition = DEFAULT_EFFECTS_SPRING;\n\n/**\n * MD3 Expressive spring — active indicator expand/collapse.\n * Maps to MD3 `default.spatial` (dampingRatio: 0.8, stiffness: 380).\n * Gentle bounce for the \"pop\" effect per MD3 Expressive spec.\n */\nexport const SPRING_TRANSITION_EXPRESSIVE: Transition = DEFAULT_SPATIAL_SPRING;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Icon Span Motion Variants\n// Used for icon/loading indicator swap animation inside FAB and IconButton.\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Framer Motion variants for animating icon spans in/out.\n *\n * Scale from near-zero → 1 on enter; back to near-zero on exit.\n * The near-zero value (0.01) avoids the SMIL freeze bug on Chromium\n * that occurs when an element starts at exactly `scale(0)`.\n *\n * @example\n * ```tsx\n * <AnimatePresence mode=\"wait\">\n * {loading ? (\n * <m.span key=\"loading\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * <LoadingIndicator />\n * </m.span>\n * ) : (\n * <m.span key=\"icon\" {...ICON_SPAN_VARIANTS} transition={SPRING_TRANSITION}>\n * {icon}\n * </m.span>\n * )}\n * </AnimatePresence>\n * ```\n */\nexport const ICON_SPAN_VARIANTS: {\n\tinitial: Target;\n\tanimate: TargetAndTransition;\n\texit: TargetAndTransition;\n} = {\n\tinitial: { scale: 0.01 },\n\tanimate: { scale: 1 },\n\texit: { scale: 0.01 },\n} as const;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// MD3 TextField Animation Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Standard easing curve — used for label float, active indicator expand.\n * cubic-bezier(0.2, 0, 0, 1)\n *\n * @see https://m3.material.io/foundations/animation/easing-and-duration\n */\nexport const MD3_STANDARD_EASING: [number, number, number, number] = [\n\t0.2, 0, 0, 1,\n];\n\n/**\n * Duration for floating label transition: 150ms.\n * Used when label moves between inline position ↔ floated position.\n */\nexport const MD3_LABEL_FLOAT_DURATION = 0.15;\n\n/**\n * Duration for active indicator expand/collapse: 200ms.\n * Used for the bottom border (filled) and outline (outlined) on focus.\n */\nexport const MD3_INDICATOR_DURATION = 0.2;\n\n/**\n * Duration for supporting text / error text appear/disappear: 120ms.\n */\nexport const MD3_SUPPORTING_DURATION = 0.12;\n\n/**\n * Duration for trailing icon appear/disappear (clear button, password toggle): 100ms.\n */\nexport const MD3_ICON_SWAP_DURATION = 0.1;\n","/**\n * @file shared/touch-target.tsx\n *\n * Invisible 48×48dp touch-target expander for small interactive elements.\n *\n * WCAG 2.5.5 (Level AA) requires interactive targets to be at least 44×44 CSS pixels.\n * MD3 specifies a minimum 48dp touch target for all interactive components.\n * For button sizes XS (32dp) and SM (40dp) that are smaller than this minimum,\n * an invisible absolutely-positioned `<span>` is overlaid to extend the\n * effective tap area without affecting visual layout.\n *\n * @see https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html\n * @see https://m3.material.io/foundations/accessible-design/accessibility-basics\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TouchTarget Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Invisible 48×48dp touch area expander — satisfies WCAG 2.5.5 + MD3 spec.\n *\n * Place as a direct child of any interactive element whose visual size is\n * smaller than 48dp (e.g. `xs`/`sm` buttons and icon buttons).\n * The parent element **must** have `position: relative`.\n *\n * @remarks\n * - Hidden from assistive technologies via `aria-hidden=\"true\"`.\n * - `pointer-events: none` ensures it does not intercept click events.\n * - Centred with `left: 50% / top: 50%` + negative translate for symmetry.\n *\n * @example\n * ```tsx\n * // Used inside a 32dp XS button:\n * <button className=\"relative h-8 w-auto ...\">\n * <TouchTarget />\n * Label\n * </button>\n * ```\n *\n * @see https://m3.material.io/components/buttons/specs (Touch target section)\n */\nexport function TouchTarget() {\n\treturn (\n\t\t<span\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 min-w-12 min-h-12 cursor-pointer pointer-events-none\"\n\t\t/>\n\t);\n}\n","import { cornerRadius } from \"@bug-on/m3-tokens\";\nimport type { Transition } from \"motion\";\nimport {\n\tFAST_EFFECTS_SPRING,\n\tFAST_SPATIAL_SPRING,\n} from \"../../shared/motion-tokens\";\n\n/**\n * Shape morphing spring animation for layout/width morphing.\n * MD3: `fast.spatial` — stiffness 800, dampingRatio 0.6 (has bounce).\n */\nexport const BUTTON_SHAPE_MORPH_SPRING: Transition = FAST_SPATIAL_SPRING;\n\n/**\n * Spring for border-radius changes on press/release and shape toggle.\n * MD3: `fast.effects` — stiffness 3800, critically damped (dampingRatio 1.0).\n * No overshoot; border-radius never goes negative.\n */\nexport const BUTTON_RADIUS_SPRING: Transition = FAST_EFFECTS_SPRING;\n\nexport const ROUND_SHAPE_RADIUS = 9999;\n\nexport const BUTTON_SIZE_TOKENS = {\n\txs: {\n\t\theight: \"2rem\", // 32dp\n\t\tleadingSpace: \"1rem\", // 16dp\n\t\ttrailingSpace: \"1rem\", // 16dp\n\t\ticonSize: \"1.25rem\", // 20dp\n\t\ticonLabelSpace: \"0.5rem\", // 8dp\n\t\toutlineWidth: 1, // 1dp\n\t\tsquareShapeRadius: cornerRadius.medium, // 12dp\n\t\tpressedShapeRadius: cornerRadius.small, // 8dp\n\t\troundShapeRadius: 16,\n\t},\n\tsm: {\n\t\theight: \"2.5rem\", // 40dp\n\t\tleadingSpace: \"1rem\", // 16dp\n\t\ttrailingSpace: \"1rem\", // 16dp\n\t\ticonSize: \"1.25rem\", // 20dp\n\t\ticonLabelSpace: \"0.5rem\", // 8dp\n\t\toutlineWidth: 1, // 1dp\n\t\tsquareShapeRadius: cornerRadius.medium, // 12dp\n\t\tpressedShapeRadius: cornerRadius.small, // 8dp\n\t\troundShapeRadius: 20,\n\t},\n\tmd: {\n\t\theight: \"3.5rem\", // 56dp\n\t\tleadingSpace: \"1.5rem\", // 24dp\n\t\ttrailingSpace: \"1.5rem\", // 24dp\n\t\ticonSize: \"1.5rem\", // 24dp\n\t\ticonLabelSpace: \"0.5rem\", // 8dp\n\t\toutlineWidth: 1, // 1dp\n\t\tsquareShapeRadius: cornerRadius.large, // 16dp\n\t\tpressedShapeRadius: cornerRadius.medium, // 12dp\n\t\troundShapeRadius: 28,\n\t},\n\tlg: {\n\t\theight: \"6rem\", // 96dp\n\t\tleadingSpace: \"3rem\", // 48dp\n\t\ttrailingSpace: \"3rem\", // 48dp\n\t\ticonSize: \"2rem\", // 32dp\n\t\ticonLabelSpace: \"0.75rem\", // 12dp\n\t\toutlineWidth: 2, // 2dp\n\t\tsquareShapeRadius: cornerRadius.extraLarge, // 28dp\n\t\tpressedShapeRadius: cornerRadius.large, // 16dp\n\t\troundShapeRadius: 48,\n\t},\n\txl: {\n\t\theight: \"8.5rem\", // 136dp\n\t\tleadingSpace: \"4rem\", // 64dp\n\t\ttrailingSpace: \"4rem\", // 64dp\n\t\ticonSize: \"2.5rem\", // 40dp\n\t\ticonLabelSpace: \"1rem\", // 16dp\n\t\toutlineWidth: 3, // 3dp\n\t\tsquareShapeRadius: cornerRadius.extraLarge, // 28dp\n\t\tpressedShapeRadius: cornerRadius.large, // 16dp\n\t\troundShapeRadius: 68,\n\t},\n} as const;\n\nexport const BUTTON_TYPOGRAPHY_TOKENS = {\n\txs: \"text-sm font-medium tracking-wide\", // labelLarge\n\tsm: \"text-sm font-medium tracking-wide\", // labelLarge\n\tmd: \"text-base font-medium\", // titleMedium\n\tlg: \"text-xl font-normal\", // headlineSmall\n\txl: \"text-[2rem] font-normal leading-none\", // headlineLarge\n} as const;\n\nexport const BUTTON_COLOR_TOKENS = {\n\televated: {\n\t\tdefault: \"bg-m3-surface-container-low text-m3-primary shadow-md\",\n\t\tselected: \"bg-m3-primary text-m3-on-primary shadow-md\",\n\t\tunselected: \"bg-m3-surface-container-low text-m3-primary shadow-md\",\n\t},\n\tfilled: {\n\t\tdefault: \"bg-m3-primary text-m3-on-primary\",\n\t\tselected: \"bg-m3-primary text-m3-on-primary\",\n\t\tunselected: \"bg-m3-surface-container text-m3-on-surface-variant\",\n\t},\n\ttonal: {\n\t\tdefault: \"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\tselected: \"bg-m3-secondary text-m3-on-secondary\",\n\t\tunselected: \"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"bg-transparent text-m3-on-surface-variant border-m3-outline-variant\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent\",\n\t\tunselected:\n\t\t\t\"bg-transparent text-m3-on-surface-variant border-m3-outline-variant\",\n\t},\n\ttext: {\n\t\tdefault: \"bg-transparent text-m3-primary\",\n\t\tselected: \"bg-transparent text-m3-primary\",\n\t\tunselected: \"bg-transparent text-m3-primary\",\n\t},\n} as const;\n","/**\n * @file button.tsx\n *\n * MD3 Expressive Button component.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { Transition } from \"motion/react\";\nimport {\n\tAnimatePresence,\n\tanimate,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseMotionValue,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport { SPRING_TRANSITION } from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\nimport {\n\tBUTTON_COLOR_TOKENS,\n\tBUTTON_RADIUS_SPRING,\n\tBUTTON_SHAPE_MORPH_SPRING,\n\tBUTTON_SIZE_TOKENS,\n\tBUTTON_TYPOGRAPHY_TOKENS,\n} from \"./button-tokens\";\nimport type { ButtonProps } from \"./types\";\n\nconst MOTION_PROP_KEYS = [\n\t\"animate\",\n\t\"exit\",\n\t\"initial\",\n\t\"transition\",\n\t\"variants\",\n\t\"whileHover\",\n\t\"whileTap\",\n\t\"whileFocus\",\n\t\"whileDrag\",\n\t\"whileInView\",\n\t\"onAnimationStart\",\n\t\"onAnimationComplete\",\n\t\"onUpdate\",\n\t\"onDragStart\",\n\t\"onDragEnd\",\n\t\"onDrag\",\n\t\"onDirectionLock\",\n\t\"onDragTransitionEnd\",\n\t\"layout\",\n\t\"layoutId\",\n\t\"onLayoutAnimationComplete\",\n] as const;\n\nfunction springAnimate(\n\tvalue: ReturnType<typeof useMotionValue<number>>,\n\tto: number,\n) {\n\treturn animate(value, to, { ...BUTTON_RADIUS_SPRING, type: \"spring\" });\n}\n\ninterface AnimatedIconSlotProps {\n\ticonSize: string;\n\tchildren: React.ReactNode;\n\tariaHidden?: boolean;\n\ttransition?: Transition;\n}\n\nfunction AnimatedIconSlot({\n\ticonSize,\n\tchildren,\n\tariaHidden,\n\ttransition,\n}: AnimatedIconSlotProps) {\n\treturn (\n\t\t<m.span\n\t\t\tlayout=\"position\"\n\t\t\tinitial={{ width: 0, opacity: 0, scale: 0.5 }}\n\t\t\tanimate={{ width: iconSize, opacity: 1, scale: 1 }}\n\t\t\texit={{ width: 0, opacity: 0, scale: 0.5 }}\n\t\t\ttransition={transition}\n\t\t\taria-hidden={ariaHidden ? \"true\" : undefined}\n\t\t\tstyle={{ height: iconSize }}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center shrink-0 [&>svg]:w-full [&>svg]:h-full overflow-hidden\",\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</m.span>\n\t);\n}\n\nconst ButtonComponent = React.forwardRef<HTMLButtonElement, ButtonProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"filled\",\n\t\t\tselectedColorStyle: _selectedColorStyle, // Deprecated — destructured to strip from restProps\n\t\t\tsize = \"sm\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\ticon,\n\t\t\ticonPosition = \"leading\",\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\tasChild = false,\n\t\t\toutlineWidth,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabelProp,\n\t\t\ttransition: customTransition,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle ? !!selected : false;\n\n\t\tconst effectiveShape = isSelected\n\t\t\t? shape === \"round\"\n\t\t\t\t? \"square\"\n\t\t\t\t: \"round\"\n\t\t\t: shape;\n\n\t\tconst sizeTokens = BUTTON_SIZE_TOKENS[size] ?? BUTTON_SIZE_TOKENS.sm;\n\t\tconst animateRadius =\n\t\t\teffectiveShape === \"round\"\n\t\t\t\t? sizeTokens.roundShapeRadius\n\t\t\t\t: sizeTokens.squareShapeRadius;\n\t\tconst pressedRadius = sizeTokens.pressedShapeRadius;\n\n\t\tconst colorState = isToggle\n\t\t\t? isSelected\n\t\t\t\t? \"selected\"\n\t\t\t\t: \"unselected\"\n\t\t\t: \"default\";\n\t\tconst colorClass = BUTTON_COLOR_TOKENS[colorStyle][colorState];\n\t\tconst typographyClass =\n\t\t\tBUTTON_TYPOGRAPHY_TOKENS[size] ?? BUTTON_TYPOGRAPHY_TOKENS.sm;\n\n\t\tconst mergedStyle = {\n\t\t\theight: sizeTokens.height,\n\t\t\tpaddingInlineStart: sizeTokens.leadingSpace,\n\t\t\tpaddingInlineEnd: sizeTokens.trailingSpace,\n\t\t\tgap: sizeTokens.iconLabelSpace,\n\t\t\tborderWidth:\n\t\t\t\toutlineWidth ??\n\t\t\t\t(colorStyle === \"outlined\" ? sizeTokens.outlineWidth : 0),\n\t\t\tborderStyle: colorStyle === \"outlined\" ? \"solid\" : undefined,\n\t\t\t...style,\n\t\t};\n\n\t\tconst labelText = React.useMemo(() => {\n\t\t\tif (asChild) {\n\t\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\t\tchildren?: React.ReactNode;\n\t\t\t\t}>;\n\t\t\t\treturn child.props.children;\n\t\t\t}\n\t\t\treturn children;\n\t\t}, [children, asChild]);\n\t\tconst computedAriaLabel =\n\t\t\tariaLabelProp || (typeof children === \"string\" ? children : undefined);\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\tconst motionRadius = useMotionValue<number>(animateRadius);\n\t\tconst asChildRef = React.useRef<HTMLElement | null>(null);\n\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLElement | null) => {\n\t\t\t\tasChildRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") ref(node as HTMLButtonElement);\n\t\t\t\telse if (ref)\n\t\t\t\t\t(ref as React.MutableRefObject<HTMLButtonElement | null>).current =\n\t\t\t\t\t\tnode as HTMLButtonElement;\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (!asChild) return;\n\t\t\treturn motionRadius.on(\"change\", (v) => {\n\t\t\t\tif (asChildRef.current)\n\t\t\t\t\tasChildRef.current.style.borderRadius = `${v}px`;\n\t\t\t});\n\t\t}, [motionRadius, asChild]);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (!asChild) return;\n\t\t\tconst controls = springAnimate(motionRadius, animateRadius);\n\t\t\treturn () => controls.stop();\n\t\t}, [animateRadius, motionRadius, asChild]);\n\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return e.preventDefault();\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\tif (onClick && (e.key === \"Enter\" || e.key === \" \")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\tconst buttonClassName = cn(\n\t\t\t\"relative w-fit shrink-0 inline-flex flex-row items-center justify-center\",\n\t\t\t\"whitespace-nowrap select-none cursor-pointer\",\n\t\t\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\t\"disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none\",\n\t\t\tcolorClass,\n\t\t\t\"overflow-hidden\",\n\t\t\ttypographyClass,\n\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\tclassName,\n\t\t);\n\n\t\tconst sharedTransition = customTransition ?? {\n\t\t\tborderRadius: BUTTON_RADIUS_SPRING,\n\t\t\tlayout: BUTTON_SHAPE_MORPH_SPRING,\n\t\t\tdefault: SPRING_TRANSITION,\n\t\t};\n\n\t\tconst innerContent = (\n\t\t\t<>\n\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t<AnimatePresence initial={false} mode=\"popLayout\">\n\t\t\t\t\t{(loading || (icon && iconPosition === \"leading\")) && (\n\t\t\t\t\t\t<AnimatedIconSlot\n\t\t\t\t\t\t\ticonSize={sizeTokens.iconSize}\n\t\t\t\t\t\t\tariaHidden={!loading}\n\t\t\t\t\t\t\ttransition={sharedTransition}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\tloadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\tsize={parseFloat(sizeTokens.iconSize) * 16}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\tsize={parseFloat(sizeTokens.iconSize) * 16}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\ticon\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</AnimatedIconSlot>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t{labelText && (\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tlayout=\"position\"\n\t\t\t\t\t\tclassName=\"inline-flex items-center h-full gap-[inherit]\"\n\t\t\t\t\t\ttransition={sharedTransition}\n\t\t\t\t\t>\n\t\t\t\t\t\t{labelText}\n\t\t\t\t\t</m.span>\n\t\t\t\t)}\n\n\t\t\t\t<AnimatePresence initial={false} mode=\"popLayout\">\n\t\t\t\t\t{icon && iconPosition === \"trailing\" && (\n\t\t\t\t\t\t<AnimatedIconSlot\n\t\t\t\t\t\t\ticonSize={sizeTokens.iconSize}\n\t\t\t\t\t\t\tariaHidden\n\t\t\t\t\t\t\ttransition={sharedTransition}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t</AnimatedIconSlot>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</>\n\t\t);\n\n\t\tconst handleAsChildPointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLElement>) => {\n\t\t\t\tspringAnimate(motionRadius, pressedRadius);\n\t\t\t\t(onPointerDown as React.PointerEventHandler<HTMLElement>)?.(e);\n\t\t\t},\n\t\t\t[motionRadius, pressedRadius, onPointerDown],\n\t\t);\n\n\t\tconst handleAsChildPointerUp = React.useCallback(() => {\n\t\t\tspringAnimate(motionRadius, animateRadius);\n\t\t}, [motionRadius, animateRadius]);\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tonPointerDown(e);\n\t\t\t},\n\t\t\t[onPointerDown],\n\t\t);\n\n\t\tif (asChild) {\n\t\t\tconst strippedProps = { ...restProps } as Record<string, unknown>;\n\t\t\tfor (const key of MOTION_PROP_KEYS) delete strippedProps[key];\n\t\t\tconst htmlProps =\n\t\t\t\tstrippedProps as React.ButtonHTMLAttributes<HTMLButtonElement>;\n\t\t\tconst child = React.Children.only(children) as React.ReactElement<{\n\t\t\t\tchildren?: React.ReactNode;\n\t\t\t}>;\n\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<Slot\n\t\t\t\t\t\tref={mergedRef as React.Ref<HTMLButtonElement>}\n\t\t\t\t\t\taria-label={computedAriaLabel}\n\t\t\t\t\t\tonClick={handleClick as React.MouseEventHandler<HTMLElement>}\n\t\t\t\t\t\tonPointerDown={handleAsChildPointerDown}\n\t\t\t\t\t\tonPointerUp={handleAsChildPointerUp}\n\t\t\t\t\t\tonPointerLeave={handleAsChildPointerUp}\n\t\t\t\t\t\tonPointerCancel={handleAsChildPointerUp}\n\t\t\t\t\t\tonKeyDown={handleKeyDown as React.KeyboardEventHandler<HTMLElement>}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...(mergedStyle as React.CSSProperties),\n\t\t\t\t\t\t\tborderRadius: `${animateRadius}px`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={buttonClassName}\n\t\t\t\t\t\t{...htmlProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t{React.cloneElement(child, { children: innerContent })}\n\t\t\t\t\t</Slot>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\tlayout\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={computedAriaLabel}\n\t\t\t\t\taria-busy={loading ? true : undefined}\n\t\t\t\t\taria-disabled={loading ? true : restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={mergedStyle}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={sharedTransition}\n\t\t\t\t\tclassName={buttonClassName}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{innerContent}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nButtonComponent.displayName = \"Button\";\n\nexport const Button = React.memo(ButtonComponent);\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { SPRING_TRANSITION_FAST } from \"./shared/constants\";\n\n// @internal — font must be loaded via '@bug-on/m3-expressive/material-symbols.css'\nconst VARIANT_FONT: Record<NonNullable<IconProps[\"variant\"]>, string> = {\n\toutlined: \"'Material Symbols Outlined'\",\n\trounded: \"'Material Symbols Rounded'\",\n\tsharp: \"'Material Symbols Sharp'\",\n};\n\n/**\n * Props cho component {@link Icon}.\n *\n * Tất cả các trục biến thiên (variable font axes) được map trực tiếp sang `font-variation-settings`.\n */\nexport interface IconProps extends React.HTMLAttributes<HTMLSpanElement> {\n\t/**\n\t * Tên của Material Symbol theo định dạng snake_case.\n\t * @example \"home\", \"arrow_forward\", \"settings\"\n\t * @see https://fonts.google.com/icons\n\t */\n\tname: string;\n\n\t/**\n\t * Kiểu hình học (Geometric style variant) — tương ứng với font family được tải.\n\t * @default \"outlined\"\n\t */\n\tvariant?: \"outlined\" | \"rounded\" | \"sharp\";\n\n\t/**\n\t * Trục FILL. `0` = outlined (viền), `1` = filled (tràn màu).\n\t * Có hiệu ứng spring khi `animateFill` là true.\n\t * @default 0\n\t */\n\tfill?: 0 | 1;\n\n\t/**\n\t * Trục wght — độ dày của nét (stroke weight). Nên khớp với độ dày text xung quanh.\n\t * @default 400\n\t */\n\tweight?: 100 | 200 | 300 | 400 | 500 | 600 | 700;\n\n\t/**\n\t * Trục GRAD — tinh chỉnh độ dày thị giác mà không ảnh hưởng tới layout.\n\t * Dùng mức `-25` trên nền tối để bù trừ hiệu ứng phát sáng (halation).\n\t * @default 0\n\t */\n\tgrade?: -50 | -25 | 0 | 100 | 200;\n\n\t/**\n\t * Trục opsz — kích thước quang học (optical size) tính bằng dp. Dùng để thiết lập `font-size` nếu không truyền `size`.\n\t * Hãy để giá trị khớp với pixel sẽ render ra để thấy chất lượng tốt nhất.\n\t * @default 24\n\t */\n\topticalSize?: 20 | 24 | 40 | 48;\n\n\t/**\n\t * Ghi đè trực tiếp `font-size` bằng px. Trục `opsz` vẫn sẽ tuân theo thuộc tính `opticalSize`.\n\t * @example size={18} opticalSize={20}\n\t */\n\tsize?: number | \"inherit\";\n\n\t/**\n\t * 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`).\n\t * Yêu cầu dependency `motion/react`.\n\t * @default false\n\t * @example <Icon name=\"favorite\" fill={isLiked ? 1 : 0} animateFill />\n\t */\n\tanimateFill?: boolean;\n}\n\nconst IconComponent = React.forwardRef<HTMLSpanElement, IconProps>(\n\t(\n\t\t{\n\t\t\tname,\n\t\t\tvariant = \"outlined\",\n\t\t\tfill = 0,\n\t\t\tweight = 400,\n\t\t\tgrade = 0,\n\t\t\topticalSize = 24,\n\t\t\tsize,\n\t\t\tanimateFill = false,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst fontVariationSettings = `'FILL' ${fill}, 'wght' ${weight}, 'GRAD' ${grade}, 'opsz' ${opticalSize}`;\n\n\t\tconst computedStyle: React.CSSProperties = {\n\t\t\tfontFamily: VARIANT_FONT[variant],\n\t\t\tfontSize:\n\t\t\t\tsize === \"inherit\"\n\t\t\t\t\t? \"inherit\"\n\t\t\t\t\t: size != null\n\t\t\t\t\t\t? `${size}px`\n\t\t\t\t\t\t: `${opticalSize}px`,\n\t\t\tfontVariationSettings,\n\t\t\t...style,\n\t\t};\n\n\t\tif (animateFill) {\n\t\t\treturn (\n\t\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tanimate={{ fontVariationSettings }}\n\t\t\t\t\t\ttransition={SPRING_TRANSITION_FAST}\n\t\t\t\t\t\tstyle={computedStyle}\n\t\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: motion v12 HTMLMotionProps conflicts with React's event types\n\t\t\t\t\t\t{...(restProps as any)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{name}\n\t\t\t\t\t</m.span>\n\t\t\t\t</LazyMotion>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"md-icon inline-flex items-center justify-center shrink-0 select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tstyle={computedStyle}\n\t\t\t\t{...restProps}\n\t\t\t>\n\t\t\t\t{name}\n\t\t\t</span>\n\t\t);\n\t},\n);\n\nIconComponent.displayName = \"Icon\";\n\n/**\n * Component hiển thị Icon bằng Material Symbols (variable font).\n *\n * Hãy đảm bảo đã import CSS chứa font trước khi dùng:\n * ```ts\n * import '@bug-on/m3-expressive/material-symbols.css';\n * ```\n *\n * @remarks\n * - Đặt tên icon dùng snake_case: `\"arrow_forward\"`, KHÔNG PHẢI `\"ArrowForward\"`.\n * - 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.\n *\n * @example\n * ```tsx\n * // Icon cơ bản\n * <Icon name=\"home\" />\n *\n * // Tùy chỉnh trực quan (filled, nét dày)\n * <Icon name=\"favorite\" variant=\"rounded\" fill={1} weight={300} />\n *\n * // Animate khi trạng thái thay đổi\n * <Icon name=\"bookmark\" fill={saved ? 1 : 0} animateFill />\n *\n * // Đổi kích thước icon cụ thể\n * <Icon name=\"close\" size={18} opticalSize={20} />\n *\n * // Kết hợp với các component khác\n * <Button icon={<Icon name=\"add\" />}>Thêm vào giỏ</Button>\n * ```\n *\n * @see https://fonts.google.com/icons\n * @see https://m3.material.io/styles/icons/overview\n */\nexport const Icon = React.memo(IconComponent);\n","import { cornerRadius } from \"@bug-on/m3-tokens\";\n\n/**\n * MD3 Expressive Button Group Tokens\n * Ported from ButtonGroupSmallTokens.kt and ConnectedButtonGroupSmallTokens.kt\n */\nexport const BUTTON_GROUP_TOKENS = {\n\tstandard: {\n\t\tbetweenSpace: 12, // 12dp / 0.75rem / gap-3\n\t\tcontainerHeight: 40, // 40dp / 2.5rem\n\t},\n\tconnected: {\n\t\tbetweenSpace: 2, // 2dp / 0.125rem / gap-0.5\n\t\tcontainerHeight: 40, // 40dp / 2.5rem\n\t\tcontainerShape: cornerRadius.full, // 9999px\n\t\tinnerCorner: cornerRadius.small, // 8dp\n\t\tpressedInnerCorner: cornerRadius.extraSmall, // 4dp\n\t\tselectedCornerPercent: 50, // 50% -> full pill\n\t},\n} as const;\n","import type { MD3Size } from \"../../../types/md3\";\nimport { BUTTON_GROUP_TOKENS } from \"./button-group-tokens\";\n\n/** Pill radius (height / 2) per size. */\nexport const PILL_RADIUS_MAP: Record<MD3Size, number> = {\n\txs: 16,\n\tsm: 20,\n\tmd: 28,\n\tlg: 48,\n\txl: 68,\n};\n\n/** Morphing target radius when a standard button is pressed. */\nexport const PRESSED_RADIUS_MAP: Record<MD3Size, number> = {\n\txs: 8,\n\tsm: 10,\n\tmd: 16,\n\tlg: 28,\n\txl: 40,\n};\n\nexport interface Corners {\n\ttl: number;\n\ttr: number;\n\tbr: number;\n\tbl: number;\n}\n\nexport interface ShapeSet {\n\tdefault: Corners;\n\tpressed: Corners;\n\tchecked: Corners;\n}\n\nconst PILL_CORNERS = {\n\ttl: 9999,\n\ttr: 9999,\n\tbr: 9999,\n\tbl: 9999,\n} as const satisfies Corners;\n\nfunction buildConnectedShapes(\n\tsize: MD3Size,\n\tdefaultCorners: (outer: number, inner: number) => Corners,\n\tpressedCorners: (outer: number, pressedInner: number) => Corners,\n): ShapeSet {\n\tconst outer = PILL_RADIUS_MAP[size];\n\tconst inner = BUTTON_GROUP_TOKENS.connected.innerCorner;\n\tconst pressedInner = BUTTON_GROUP_TOKENS.connected.pressedInnerCorner;\n\treturn {\n\t\tdefault: defaultCorners(outer, inner),\n\t\tpressed: pressedCorners(outer, pressedInner),\n\t\tchecked: { ...PILL_CORNERS },\n\t};\n}\n\nexport const ButtonGroupDefaults = {\n\texpandedRatio: 0.15,\n\n\tconnectedLeadingButtonShapes: (size: MD3Size): ShapeSet =>\n\t\tbuildConnectedShapes(\n\t\t\tsize,\n\t\t\t(o, i) => ({ tl: o, tr: i, br: i, bl: o }),\n\t\t\t(o, pi) => ({ tl: o, tr: pi, br: pi, bl: o }),\n\t\t),\n\n\tconnectedMiddleButtonShapes: (size: MD3Size): ShapeSet =>\n\t\tbuildConnectedShapes(\n\t\t\tsize,\n\t\t\t(_o, i) => ({ tl: i, tr: i, br: i, bl: i }),\n\t\t\t(_o, pi) => ({ tl: pi, tr: pi, br: pi, bl: pi }),\n\t\t),\n\n\tconnectedTrailingButtonShapes: (size: MD3Size): ShapeSet =>\n\t\tbuildConnectedShapes(\n\t\t\tsize,\n\t\t\t(o, i) => ({ tl: i, tr: o, br: o, bl: i }),\n\t\t\t(o, pi) => ({ tl: pi, tr: o, br: o, bl: pi }),\n\t\t),\n\n\t/** For orientation=\"vertical\". */\n\tconnectedTopButtonShapes: (size: MD3Size): ShapeSet =>\n\t\tbuildConnectedShapes(\n\t\t\tsize,\n\t\t\t(o, i) => ({ tl: o, tr: o, br: i, bl: i }),\n\t\t\t(o, pi) => ({ tl: o, tr: o, br: pi, bl: pi }),\n\t\t),\n\n\tconnectedBottomButtonShapes: (size: MD3Size): ShapeSet =>\n\t\tbuildConnectedShapes(\n\t\t\tsize,\n\t\t\t(o, i) => ({ tl: i, tr: i, br: o, bl: o }),\n\t\t\t(o, pi) => ({ tl: pi, tr: pi, br: o, bl: o }),\n\t\t),\n};\n","import {\n\tAnimatePresence,\n\tm,\n\ttype TargetAndTransition,\n\ttype Transition,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { MD3Size } from \"../../../types/md3\";\nimport { Icon } from \"../../icon\";\nimport type { ButtonProps } from \"../button\";\nimport {\n\tBUTTON_RADIUS_SPRING,\n\tBUTTON_SHAPE_MORPH_SPRING,\n\tBUTTON_SIZE_TOKENS,\n} from \"../button/button-tokens\";\nimport {\n\tButtonGroupDefaults,\n\tPRESSED_RADIUS_MAP,\n\ttype ShapeSet,\n} from \"./button-group-defaults\";\nimport type { ButtonGroupProps } from \"./types\";\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst PILL_BORDER_RADIUS = 9999;\nconst MIN_FLEX_GROW = 0.01;\nconst PADDING_EXPAND_MULTIPLIER = 4;\n\nconst CHECK_ICON_SIZE = 24;\nconst CHECK_ICON = <Icon name=\"check\" size={CHECK_ICON_SIZE} weight={700} />;\n\nconst CHECK_ICON_GAP_MAP: Record<string, number> = {\n\txs: 6,\n\tsm: 8,\n\tmd: 8,\n\tlg: 12,\n\txl: 12,\n};\n\nconst CHECK_ICON_MOTION: Transition = {\n\ttype: \"spring\",\n\tstiffness: 420,\n\tdamping: 34,\n\tmass: 0.75,\n};\n\nconst WIDTH_MORPH_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 360,\n\tdamping: 38,\n\tmass: 0.85,\n};\n\nconst NAVBAR_EXPRESSIVE_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 430,\n\tdamping: 38,\n\tmass: 0.8,\n};\n\n// ─── Sub-components ──────────────────────────────────────────────────────────\n\nconst AnimatedCheckLabel = React.memo(function AnimatedCheckLabel({\n\tselected,\n\tsize,\n\tchildren,\n}: {\n\tselected: boolean;\n\tsize: string;\n\tchildren: React.ReactNode;\n}) {\n\tconst gap = CHECK_ICON_GAP_MAP[size] ?? CHECK_ICON_GAP_MAP.sm;\n\n\treturn (\n\t\t<m.span\n\t\t\tlayout\n\t\t\tclassName=\"inline-flex min-w-0 items-center justify-center whitespace-nowrap align-middle\"\n\t\t>\n\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t{selected && (\n\t\t\t\t\t<m.span\n\t\t\t\t\t\tkey=\"selected-check\"\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tinitial={{ width: 0, opacity: 0, marginRight: 0, x: -4 }}\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\twidth: CHECK_ICON_SIZE,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\tmarginRight: gap,\n\t\t\t\t\t\t\tx: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\texit={{ width: 0, opacity: 0, marginRight: 0, x: -4 }}\n\t\t\t\t\t\ttransition={CHECK_ICON_MOTION}\n\t\t\t\t\t\tclassName=\"inline-flex shrink-0 items-center justify-center overflow-hidden\"\n\t\t\t\t\t\tstyle={{ willChange: \"width, opacity, transform, margin-right\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"inline-flex h-6 w-6 items-center justify-center\">\n\t\t\t\t\t\t\t{CHECK_ICON}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</m.span>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t\t<m.span layout=\"position\" className=\"min-w-0 truncate\">\n\t\t\t\t{children}\n\t\t\t</m.span>\n\t\t</m.span>\n\t);\n});\n\nconst AnimatedNavbarLabel = React.memo(function AnimatedNavbarLabel({\n\tshow,\n\tchildren,\n}: {\n\tshow: boolean;\n\tchildren: React.ReactNode;\n}) {\n\treturn (\n\t\t<AnimatePresence initial={false} mode=\"popLayout\">\n\t\t\t{show && (\n\t\t\t\t<m.span\n\t\t\t\t\tkey=\"navbar-label\"\n\t\t\t\t\tinitial={{ width: 0, opacity: 0, scale: 0.8 }}\n\t\t\t\t\tanimate={{ width: \"auto\", opacity: 1, scale: 1 }}\n\t\t\t\t\texit={{ width: 0, opacity: 0, scale: 0.8 }}\n\t\t\t\t\ttransition={NAVBAR_EXPRESSIVE_SPRING}\n\t\t\t\t\tclassName=\"overflow-hidden whitespace-nowrap text-sm font-semibold tracking-[0.01em] ml-1.5\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</m.span>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n});\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveConnectedShapes(\n\tvariant: string,\n\torientation: string,\n\tisFirst: boolean,\n\tisLast: boolean,\n\titemSize: MD3Size,\n): ShapeSet {\n\tconst defaults = ButtonGroupDefaults.connectedLeadingButtonShapes(itemSize);\n\tif (variant !== \"connected\") return defaults;\n\n\tif (orientation === \"horizontal\") {\n\t\tif (isFirst && !isLast)\n\t\t\treturn ButtonGroupDefaults.connectedLeadingButtonShapes(itemSize);\n\t\tif (!isFirst && isLast)\n\t\t\treturn ButtonGroupDefaults.connectedTrailingButtonShapes(itemSize);\n\t\tif (!isFirst && !isLast)\n\t\t\treturn ButtonGroupDefaults.connectedMiddleButtonShapes(itemSize);\n\t} else {\n\t\tif (isFirst && !isLast)\n\t\t\treturn ButtonGroupDefaults.connectedTopButtonShapes(itemSize);\n\t\tif (!isFirst && isLast)\n\t\t\treturn ButtonGroupDefaults.connectedBottomButtonShapes(itemSize);\n\t\tif (!isFirst && !isLast)\n\t\t\treturn ButtonGroupDefaults.connectedMiddleButtonShapes(itemSize);\n\t}\n\n\treturn defaults;\n}\n\ninterface ResolvedIcon {\n\ticon: React.ReactNode;\n\tlabel: React.ReactNode;\n}\n\nfunction resolveIconAndLabel(\n\telement: React.ReactElement<ButtonProps>,\n\tisSelected: boolean,\n\titemSize: string,\n\tvariant: string,\n\tshowCheck: boolean,\n\ticonBehavior: ButtonGroupProps[\"iconBehavior\"],\n\tlabelBehavior: ButtonGroupProps[\"labelBehavior\"],\n): ResolvedIcon {\n\tlet icon: React.ReactNode = element.props.icon;\n\tlet label: React.ReactNode = element.props.children;\n\n\tconst animateCheckInLabel =\n\t\tshowCheck &&\n\t\ticonBehavior !== \"none\" &&\n\t\ticonBehavior !== \"selected\" &&\n\t\tlabel !== undefined;\n\n\tif (iconBehavior === \"none\" || animateCheckInLabel) {\n\t\ticon = undefined;\n\t} else if (iconBehavior === \"selected\") {\n\t\ticon = isSelected ? element.props.icon : undefined;\n\t}\n\n\tif (labelBehavior === \"none\") {\n\t\tlabel = undefined;\n\t} else if (labelBehavior === \"selected\") {\n\t\tlabel = isSelected ? element.props.children : undefined;\n\t}\n\n\tif (animateCheckInLabel && label !== undefined) {\n\t\tlabel = (\n\t\t\t<AnimatedCheckLabel selected={isSelected} size={itemSize}>\n\t\t\t\t{label}\n\t\t\t</AnimatedCheckLabel>\n\t\t);\n\t} else if (variant === \"navbar\" && label !== undefined) {\n\t\tconst showLabel =\n\t\t\t!labelBehavior ||\n\t\t\tlabelBehavior === \"all\" ||\n\t\t\t(labelBehavior === \"selected\" && isSelected);\n\t\tlabel = <AnimatedNavbarLabel show={showLabel}>{label}</AnimatedNavbarLabel>;\n\t}\n\n\treturn { icon, label };\n}\n\ninterface FlexTargets {\n\tflexGrow?: number;\n\tpaddingInline?: string;\n}\n\nfunction resolveFlexTargets(\n\tvariant: string,\n\torientation: string,\n\tisSelected: boolean,\n\tisPressed: boolean,\n\thasSelected: boolean,\n\tcount: number,\n\tfullWidth: boolean,\n\tactiveMorphing: boolean,\n\tmorphingWidth: boolean,\n\texpandedRatio: number,\n\tbasePx: string,\n): FlexTargets {\n\tconst increment = expandedRatio * PADDING_EXPAND_MULTIPLIER;\n\n\tif (activeMorphing) {\n\t\tconst isFlexLayout =\n\t\t\tfullWidth || (variant === \"connected\" && orientation === \"horizontal\");\n\n\t\tif (isFlexLayout) {\n\t\t\tif (isSelected) return { flexGrow: 1 + expandedRatio };\n\t\t\tif (hasSelected && count > 1)\n\t\t\t\treturn {\n\t\t\t\t\tflexGrow: Math.max(MIN_FLEX_GROW, 1 - expandedRatio / (count - 1)),\n\t\t\t\t};\n\t\t\treturn { flexGrow: 1 };\n\t\t}\n\n\t\tif (isSelected)\n\t\t\treturn { paddingInline: `calc(${basePx} + ${increment}rem)` };\n\t\tif (hasSelected && count > 1) {\n\t\t\tconst decrement = increment / (count - 1);\n\t\t\treturn { paddingInline: `calc(${basePx} - ${decrement}rem)` };\n\t\t}\n\t\treturn { paddingInline: basePx };\n\t}\n\n\tif (morphingWidth && variant === \"standard\") {\n\t\tif (fullWidth) return { flexGrow: isPressed ? 1 + expandedRatio : 1 };\n\t\treturn {\n\t\t\tpaddingInline: isPressed ? `calc(${basePx} + ${increment}rem)` : basePx,\n\t\t};\n\t}\n\n\treturn {};\n}\n\ntype MotionOverrides = {\n\tanimate: TargetAndTransition;\n\twhileTap?: TargetAndTransition;\n\ttransition?: Transition;\n\tlayout?: boolean | \"position\" | \"size\" | \"preserve-aspect\";\n};\n\nfunction buildMotionProps(\n\tvariant: string,\n\tisSelected: boolean,\n\tisPressed: boolean,\n\titemSize: MD3Size,\n\tshapes: ShapeSet,\n\tflex: FlexTargets,\n\texistingAnimate: TargetAndTransition,\n\texistingWhileTap: TargetAndTransition,\n): MotionOverrides {\n\tconst props: MotionOverrides = { animate: { ...existingAnimate } };\n\n\tif (variant !== \"navbar\") {\n\t\tif (flex.flexGrow !== undefined) {\n\t\t\tprops.animate.flexGrow = flex.flexGrow;\n\t\t}\n\t\tif (flex.paddingInline !== undefined) {\n\t\t\tprops.animate.paddingInline = flex.paddingInline;\n\t\t}\n\t}\n\n\tif (variant === \"standard\") {\n\t\tconst pressedRadius = PRESSED_RADIUS_MAP[itemSize] ?? PRESSED_RADIUS_MAP.sm;\n\t\tconst itemSizeTokens =\n\t\t\tBUTTON_SIZE_TOKENS[itemSize] ?? BUTTON_SIZE_TOKENS.sm;\n\t\tconst isSquish = isSelected || isPressed;\n\n\t\tprops.animate.borderRadius = isSquish\n\t\t\t? pressedRadius\n\t\t\t: itemSizeTokens.roundShapeRadius;\n\t\tprops.whileTap = {\n\t\t\tscale: 0.98,\n\t\t\t...existingWhileTap,\n\t\t};\n\t\tprops.transition = {\n\t\t\tborderRadius: BUTTON_RADIUS_SPRING,\n\t\t\tflexGrow: WIDTH_MORPH_SPRING,\n\t\t\tpaddingInline: WIDTH_MORPH_SPRING,\n\t\t\tlayout: WIDTH_MORPH_SPRING,\n\t\t\tdefault: BUTTON_SHAPE_MORPH_SPRING,\n\t\t};\n\t\tprops.layout = true;\n\t}\n\n\tif (variant === \"connected\") {\n\t\tconst { tl, tr, br, bl } = isSelected\n\t\t\t? {\n\t\t\t\t\ttl: PILL_BORDER_RADIUS,\n\t\t\t\t\ttr: PILL_BORDER_RADIUS,\n\t\t\t\t\tbr: PILL_BORDER_RADIUS,\n\t\t\t\t\tbl: PILL_BORDER_RADIUS,\n\t\t\t\t}\n\t\t\t: shapes.default;\n\n\t\tprops.animate = {\n\t\t\t...props.animate,\n\t\t\tborderRadius: undefined,\n\t\t\tborderTopLeftRadius: tl,\n\t\t\tborderTopRightRadius: tr,\n\t\t\tborderBottomRightRadius: br,\n\t\t\tborderBottomLeftRadius: bl,\n\t\t};\n\t\tprops.whileTap = {\n\t\t\tborderRadius: undefined,\n\t\t\tborderTopLeftRadius: shapes.pressed.tl,\n\t\t\tborderTopRightRadius: shapes.pressed.tr,\n\t\t\tborderBottomRightRadius: shapes.pressed.br,\n\t\t\tborderBottomLeftRadius: shapes.pressed.bl,\n\t\t\t...existingWhileTap,\n\t\t};\n\t\tprops.transition = {\n\t\t\t...BUTTON_SHAPE_MORPH_SPRING,\n\t\t\tflexGrow: WIDTH_MORPH_SPRING,\n\t\t\tpaddingInline: WIDTH_MORPH_SPRING,\n\t\t\tborderTopLeftRadius: BUTTON_RADIUS_SPRING,\n\t\t\tborderTopRightRadius: BUTTON_RADIUS_SPRING,\n\t\t\tborderBottomRightRadius: BUTTON_RADIUS_SPRING,\n\t\t\tborderBottomLeftRadius: BUTTON_RADIUS_SPRING,\n\t\t\tlayout: WIDTH_MORPH_SPRING,\n\t\t};\n\t\tprops.layout = true;\n\t}\n\n\tif (variant === \"navbar\") {\n\t\tprops.layout = true;\n\t\tprops.transition = {\n\t\t\tlayout: WIDTH_MORPH_SPRING,\n\t\t\tdefault: BUTTON_SHAPE_MORPH_SPRING,\n\t\t};\n\t}\n\n\treturn props;\n}\n\n// ─── Main Component ───────────────────────────────────────────────────────────\n\nconst ButtonGroupComponent = React.forwardRef<\n\tHTMLFieldSetElement,\n\tButtonGroupProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tvariant = \"standard\",\n\t\t\torientation = \"horizontal\",\n\t\t\tfullWidth = false,\n\t\t\tsize,\n\t\t\tmorphingWidth = true,\n\t\t\tactiveMorphing = false,\n\t\t\titemClassName,\n\t\t\texpandedRatio = ButtonGroupDefaults.expandedRatio,\n\t\t\tshowCheck = false,\n\t\t\tchildren,\n\t\t\ticonBehavior,\n\t\t\tlabelBehavior,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [pressedIndex, setPressedIndex] = React.useState<number | null>(null);\n\t\tconst [lockedGroupSize, setLockedGroupSize] = React.useState<number | null>(\n\t\t\tnull,\n\t\t);\n\t\tconst layoutIdGroup = React.useId();\n\t\tconst rootRef = React.useRef<HTMLFieldSetElement | null>(null);\n\n\t\tconst setRootRef = React.useCallback(\n\t\t\t(node: HTMLFieldSetElement | null) => {\n\t\t\t\trootRef.current = node;\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref) {\n\t\t\t\t\t(ref as React.MutableRefObject<HTMLFieldSetElement | null>).current =\n\t\t\t\t\t\tnode;\n\t\t\t\t}\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\tconst childrenArray = React.useMemo(\n\t\t\t() => React.Children.toArray(children).filter(React.isValidElement),\n\t\t\t[children],\n\t\t);\n\t\tconst count = childrenArray.length;\n\n\t\tconst groupSizeSignature = React.useMemo(\n\t\t\t() =>\n\t\t\t\t`${childrenArray\n\t\t\t\t\t.map((child, index) => {\n\t\t\t\t\t\tconst element = child as React.ReactElement<ButtonProps>;\n\t\t\t\t\t\tconst label =\n\t\t\t\t\t\t\ttypeof element.props.children === \"string\" ||\n\t\t\t\t\t\t\ttypeof element.props.children === \"number\"\n\t\t\t\t\t\t\t\t? element.props.children\n\t\t\t\t\t\t\t\t: (element.key ?? index);\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\telement.key ?? index,\n\t\t\t\t\t\t\telement.props.size ?? size ?? \"\",\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tBoolean(element.props.icon),\n\t\t\t\t\t\t\telement.props.className ?? \"\",\n\t\t\t\t\t\t].join(\":\");\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"|\")}|${variant}|${orientation}|${showCheck}`,\n\t\t\t[childrenArray, orientation, showCheck, size, variant],\n\t\t);\n\n\t\tconst groupSizeSignatureRef = React.useRef(groupSizeSignature);\n\t\tReact.useLayoutEffect(() => {\n\t\t\tif (groupSizeSignatureRef.current !== groupSizeSignature) {\n\t\t\t\tgroupSizeSignatureRef.current = groupSizeSignature;\n\t\t\t\tsetLockedGroupSize(null);\n\t\t\t}\n\t\t}, [groupSizeSignature]);\n\n\t\tconst hasExplicitGroupSize =\n\t\t\torientation === \"horizontal\"\n\t\t\t\t? style?.width !== undefined || style?.inlineSize !== undefined\n\t\t\t\t: style?.height !== undefined || style?.blockSize !== undefined;\n\t\tconst shouldLockGroupSize =\n\t\t\tactiveMorphing && !fullWidth && !hasExplicitGroupSize && count > 1;\n\n\t\tReact.useLayoutEffect(() => {\n\t\t\tif (!shouldLockGroupSize) {\n\t\t\t\tif (lockedGroupSize !== null) setLockedGroupSize(null);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (lockedGroupSize !== null) return;\n\n\t\t\tconst node = rootRef.current;\n\t\t\tif (!node) return;\n\n\t\t\tconst rect = node.getBoundingClientRect();\n\t\t\tconst nextSize = orientation === \"horizontal\" ? rect.width : rect.height;\n\t\t\tif (nextSize > 0) {\n\t\t\t\tsetLockedGroupSize(Math.ceil(nextSize * 100) / 100);\n\t\t\t}\n\t\t}, [lockedGroupSize, orientation, shouldLockGroupSize]);\n\n\t\tconst groupStyle = React.useMemo<React.CSSProperties>(() => {\n\t\t\tconst nextStyle: React.CSSProperties = { ...style };\n\t\t\tif (shouldLockGroupSize && lockedGroupSize !== null) {\n\t\t\t\tif (orientation === \"horizontal\") {\n\t\t\t\t\tnextStyle.inlineSize = `${lockedGroupSize}px`;\n\t\t\t\t} else {\n\t\t\t\t\tnextStyle.blockSize = `${lockedGroupSize}px`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nextStyle;\n\t\t}, [lockedGroupSize, orientation, shouldLockGroupSize, style]);\n\n\t\tconst hasSelected = React.useMemo(\n\t\t\t() =>\n\t\t\t\tchildrenArray.some(\n\t\t\t\t\t(child) => (child as React.ReactElement<ButtonProps>).props.selected,\n\t\t\t\t),\n\t\t\t[childrenArray],\n\t\t);\n\n\t\tconst handlePointerLeaveAndUp = React.useCallback(() => {\n\t\t\tsetPressedIndex(null);\n\t\t}, []);\n\n\t\treturn (\n\t\t\t<fieldset\n\t\t\t\tref={setRootRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex p-0 m-0 border-none max-w-full [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\torientation === \"vertical\"\n\t\t\t\t\t\t? \"flex-col items-stretch overflow-y-auto overflow-x-hidden\"\n\t\t\t\t\t\t: \"flex-row overflow-x-auto overflow-y-hidden\",\n\t\t\t\t\tvariant === \"standard\"\n\t\t\t\t\t\t? \"gap-3\"\n\t\t\t\t\t\t: variant === \"navbar\"\n\t\t\t\t\t\t\t? \"gap-1.5 h-full\"\n\t\t\t\t\t\t\t: \"gap-0.5\",\n\t\t\t\t\tfullWidth && \"w-full\",\n\t\t\t\t\tfullWidth && orientation === \"vertical\" && \"h-full\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={groupStyle}\n\t\t\t\tonPointerLeave={handlePointerLeaveAndUp}\n\t\t\t\tonPointerUp={handlePointerLeaveAndUp}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{childrenArray.map((child, index) => {\n\t\t\t\t\tconst element = child as React.ReactElement<ButtonProps>;\n\t\t\t\t\tconst isSelected = element.props.selected === true;\n\t\t\t\t\tconst isFirst = index === 0;\n\t\t\t\t\tconst isLast = index === count - 1;\n\t\t\t\t\tconst itemSize = (size || element.props.size || \"sm\") as MD3Size;\n\t\t\t\t\tconst basePx = BUTTON_SIZE_TOKENS[itemSize]?.leadingSpace || \"1rem\";\n\t\t\t\t\tconst isPressed = pressedIndex === index;\n\n\t\t\t\t\tconst { icon: explicitIcon, label: explicitLabel } =\n\t\t\t\t\t\tresolveIconAndLabel(\n\t\t\t\t\t\t\telement,\n\t\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\t\titemSize,\n\t\t\t\t\t\t\tvariant,\n\t\t\t\t\t\t\tshowCheck,\n\t\t\t\t\t\t\ticonBehavior,\n\t\t\t\t\t\t\tlabelBehavior,\n\t\t\t\t\t\t);\n\n\t\t\t\t\tconst shapes = resolveConnectedShapes(\n\t\t\t\t\t\tvariant,\n\t\t\t\t\t\torientation,\n\t\t\t\t\t\tisFirst,\n\t\t\t\t\t\tisLast,\n\t\t\t\t\t\titemSize,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst flex = resolveFlexTargets(\n\t\t\t\t\t\tvariant,\n\t\t\t\t\t\torientation,\n\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\tisPressed,\n\t\t\t\t\t\thasSelected,\n\t\t\t\t\t\tcount,\n\t\t\t\t\t\tfullWidth,\n\t\t\t\t\t\tactiveMorphing,\n\t\t\t\t\t\tmorphingWidth,\n\t\t\t\t\t\texpandedRatio,\n\t\t\t\t\t\tbasePx,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst dynamicStyle: React.CSSProperties = {\n\t\t\t\t\t\t...element.props.style,\n\t\t\t\t\t} as React.CSSProperties;\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tvariant !== \"navbar\" &&\n\t\t\t\t\t\tflex.flexGrow !== undefined &&\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t) {\n\t\t\t\t\t\tdynamicStyle.flexBasis = 0;\n\t\t\t\t\t\tdynamicStyle.flexShrink = 1;\n\t\t\t\t\t\tdynamicStyle.minWidth = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst existingAnimate =\n\t\t\t\t\t\ttypeof element.props.animate === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(element.props.animate)\n\t\t\t\t\t\t\t? element.props.animate\n\t\t\t\t\t\t\t: {};\n\t\t\t\t\tconst existingWhileTap =\n\t\t\t\t\t\ttypeof element.props.whileTap === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(element.props.whileTap)\n\t\t\t\t\t\t\t? element.props.whileTap\n\t\t\t\t\t\t\t: {};\n\n\t\t\t\t\tconst motionProps = buildMotionProps(\n\t\t\t\t\t\tvariant,\n\t\t\t\t\t\tisSelected,\n\t\t\t\t\t\tisPressed,\n\t\t\t\t\t\titemSize,\n\t\t\t\t\t\tshapes,\n\t\t\t\t\t\tflex,\n\t\t\t\t\t\texistingAnimate as TargetAndTransition,\n\t\t\t\t\t\texistingWhileTap as TargetAndTransition,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst connectedClasses =\n\t\t\t\t\t\tvariant === \"connected\" && isSelected ? \"z-20\" : \"\";\n\n\t\t\t\t\tconst navbarFlexStyle: React.CSSProperties =\n\t\t\t\t\t\tflex.flexGrow !== undefined\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tflexBasis:\n\t\t\t\t\t\t\t\t\t\tfullWidth && labelBehavior !== \"selected\" ? 0 : \"auto\",\n\t\t\t\t\t\t\t\t\tflexShrink: fullWidth ? 1 : 0,\n\t\t\t\t\t\t\t\t\tflexGrow: flex.flexGrow,\n\t\t\t\t\t\t\t\t\tminWidth: labelBehavior !== \"selected\" ? 0 : \"fit-content\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {};\n\n\t\t\t\t\tconst clonedElement = React.cloneElement(element, {\n\t\t\t\t\t\tkey: element.key ?? index,\n\t\t\t\t\t\ttabIndex: isFirst ? 0 : -1,\n\t\t\t\t\t\tsize: size || element.props.size,\n\t\t\t\t\t\ticon: explicitIcon,\n\t\t\t\t\t\tchildren: explicitLabel,\n\t\t\t\t\t\t...(variant === \"connected\" && {\n\t\t\t\t\t\t\tcolorStyle: element.props.colorStyle || \"tonal\",\n\t\t\t\t\t\t\tselectedColorStyle: element.props.selectedColorStyle || \"filled\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t...(variant === \"navbar\" && {\n\t\t\t\t\t\t\tcolorStyle: \"text\",\n\t\t\t\t\t\t\tselectedColorStyle: \"text\",\n\t\t\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t\t\telement.props.className,\n\t\t\t\t\t\t\t\t\"w-full! h-full! px-3! min-w-0! relative z-20 flex items-center justify-center\",\n\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t? \"text-m3-on-secondary-container! hover:bg-transparent! active:bg-transparent!\"\n\t\t\t\t\t\t\t\t\t: \"text-m3-on-surface-variant! hover:bg-transparent! active:bg-transparent!\",\n\t\t\t\t\t\t\t\titemClassName,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t...(variant !== \"navbar\" && {\n\t\t\t\t\t\t\tclassName: cn(\n\t\t\t\t\t\t\t\telement.props.className,\n\t\t\t\t\t\t\t\tconnectedClasses,\n\t\t\t\t\t\t\t\t\"focus-visible:z-10 hover:z-10 relative min-w-0\",\n\t\t\t\t\t\t\t\torientation === \"vertical\" && \"w-full\",\n\t\t\t\t\t\t\t\titemClassName,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tstyle:\n\t\t\t\t\t\t\tvariant === \"navbar\"\n\t\t\t\t\t\t\t\t? { ...dynamicStyle, minWidth: 0 }\n\t\t\t\t\t\t\t\t: dynamicStyle,\n\t\t\t\t\t\tonPointerDown: (e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\t\t\t\tsetPressedIndex(index);\n\t\t\t\t\t\t\tif (element.props.onPointerDown) element.props.onPointerDown(e);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...motionProps,\n\t\t\t\t\t} as Partial<ButtonProps>);\n\n\t\t\t\t\tif (variant === \"navbar\") {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\tlayout\n\t\t\t\t\t\t\t\twhileTap={{ scale: 0.96 }}\n\t\t\t\t\t\t\t\ttransition={NAVBAR_EXPRESSIVE_SPRING}\n\t\t\t\t\t\t\t\tkey={element.key ?? index}\n\t\t\t\t\t\t\t\tclassName=\"group relative h-full flex items-center justify-center min-w-0\"\n\t\t\t\t\t\t\t\tstyle={navbarFlexStyle}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-x-1 inset-y-0 m-auto flex items-center justify-center pointer-events-none\"\n\t\t\t\t\t\t\t\t\tstyle={{ zIndex: 1 }}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full h-[40px] bg-m3-on-surface-variant/8 opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ borderRadius: PILL_BORDER_RADIUS }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t\t\t\t\t{isSelected && (\n\t\t\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\t\t\tlayoutId={`navbar-active-indicator-${layoutIdGroup}`}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-0 m-auto w-full h-[40px] bg-m3-secondary-container\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ borderRadius: PILL_BORDER_RADIUS }}\n\t\t\t\t\t\t\t\t\t\t\t\ttransition={NAVBAR_EXPRESSIVE_SPRING}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{clonedElement}\n\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn clonedElement;\n\t\t\t\t})}\n\t\t\t</fieldset>\n\t\t);\n\t},\n);\n\nButtonGroupComponent.displayName = \"ButtonGroup\";\n\nexport const ButtonGroup = React.memo(ButtonGroupComponent);\n","/**\n * @file extended-fab.tsx\n * MD3 Expressive Extended Floating Action Button.\n * @see https://m3.material.io/components/extended-fab/specs\n */\n\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { LoadingIndicator } from \"../../../loading-indicator\";\nimport { ProgressIndicator } from \"../../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n} from \"../../../shared/constants\";\n\nconst SIZE_HEIGHT: Record<string, string> = {\n\tsm: \"h-14\",\n\tmd: \"h-20\",\n\tlg: \"h-24\",\n};\n\nconst SIZE_WIDTH_COLLAPSED: Record<string, string> = {\n\tsm: \"w-14\",\n\tmd: \"w-20\",\n\tlg: \"w-24\",\n};\n\nconst SIZE_PADDING: Record<string, string> = {\n\tsm: \"px-4\",\n\tmd: \"px-[26px]\",\n\tlg: \"px-7\",\n};\n\nconst SIZE_GAP: Record<string, string> = {\n\tsm: \"gap-2\",\n\tmd: \"gap-3\",\n\tlg: \"gap-4\",\n};\n\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-7\", px: 28 },\n\tlg: { cls: \"size-9\", px: 36 },\n};\n\nconst SIZE_TEXT: Record<string, string> = {\n\tsm: \"text-base font-medium\",\n\tmd: \"text-lg font-medium\",\n\tlg: \"text-xl font-normal\",\n};\n\nconst MORPH_RADIUS: Record<string, { default: number; pressed: number }> = {\n\tsm: { default: 16, pressed: 10 },\n\tmd: { default: 20, pressed: 14 },\n\tlg: { default: 28, pressed: 18 },\n};\n\nconst COLOR_CLASSES: Record<string, { bg: string; text: string }> = {\n\tprimary: {\n\t\tbg: \"bg-m3-primary-container\",\n\t\ttext: \"text-m3-on-primary-container\",\n\t},\n\tsecondary: {\n\t\tbg: \"bg-m3-secondary-container\",\n\t\ttext: \"text-m3-on-secondary-container\",\n\t},\n\ttertiary: {\n\t\tbg: \"bg-m3-tertiary-container\",\n\t\ttext: \"text-m3-on-tertiary-container\",\n\t},\n\tsurface: {\n\t\tbg: \"bg-m3-surface-container-high\",\n\t\ttext: \"text-m3-on-surface\",\n\t},\n};\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/** Props for the `ExtendedFAB` component. */\nexport interface ExtendedFABProps extends MotionButtonProps {\n\t/** Required text label. Keep it short (1-2 words); it does not wrap. */\n\tlabel: string;\n\t/** Icon to render. Automatically replaced by a spinner when `loading={true}`. */\n\ticon?: React.ReactNode;\n\t/** Button size per MD3 Expressive spec. @default \"sm\" */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\t/** MD3 color role for the container surface. @default \"primary\" */\n\tcolorStyle?: \"primary\" | \"secondary\" | \"tertiary\" | \"surface\";\n\t/** Reduces shadow to the lower elevation variant. @default false */\n\tlowered?: boolean;\n\t/** Replaces the icon with a spinner and blocks interaction. @default false */\n\tloading?: boolean;\n\t/** Spinner style shown while loading. @default \"loading-indicator\" */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Mounts/unmounts with an entrance/exit animation. @default true */\n\tvisible?: boolean;\n\t/** Collapses to icon-only when the user scrolls down. @default false */\n\tcollapseOnScroll?: boolean;\n\t/** Minimum scroll delta (px) required to trigger collapse/expand. @default 50 */\n\tscrollThreshold?: number;\n\t/** Controlled collapsed state. Overrides internal scroll-driven state when provided. */\n\tcollapsed?: boolean;\n\t/** Callback fired when the internal collapsed state changes. */\n\tonCollapsedChange?: (collapsed: boolean) => void;\n\t/** Layout ID for Framer Motion Container Transform transitions. */\n\tlayoutId?: string;\n}\n\n/**\n * Internal hook that listens to scroll events and manages the collapsed state.\n * @internal\n */\nfunction useScrollCollapse(\n\tenabled: boolean,\n\tscrollThreshold: number,\n\tonCollapsedChange?: (collapsed: boolean) => void,\n) {\n\tconst [collapsed, setCollapsed] = React.useState(false);\n\tconst lastScrollY = React.useRef(0);\n\n\tReact.useEffect(() => {\n\t\tif (!enabled || typeof window === \"undefined\") return;\n\n\t\tlastScrollY.current = window.scrollY;\n\n\t\tconst handleScroll = () => {\n\t\t\tconst currentScrollY = window.scrollY;\n\t\t\tconst diff = currentScrollY - lastScrollY.current;\n\n\t\t\tif (Math.abs(diff) < scrollThreshold) return;\n\n\t\t\tif (diff > 0 && !collapsed) {\n\t\t\t\tsetCollapsed(true);\n\t\t\t\tonCollapsedChange?.(true);\n\t\t\t} else if (diff < 0 && collapsed) {\n\t\t\t\tsetCollapsed(false);\n\t\t\t\tonCollapsedChange?.(false);\n\t\t\t}\n\n\t\t\tlastScrollY.current = currentScrollY;\n\t\t};\n\n\t\twindow.addEventListener(\"scroll\", handleScroll, { passive: true });\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"scroll\", handleScroll);\n\t\t};\n\t}, [enabled, scrollThreshold, collapsed, onCollapsedChange]);\n\n\treturn collapsed;\n}\n\nconst ExtendedFABComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tExtendedFABProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tlabel,\n\t\t\ticon,\n\t\t\tsize = \"sm\",\n\t\t\tcolorStyle = \"primary\",\n\t\t\tlowered = false,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\tvisible = true,\n\t\t\tcollapseOnScroll = false,\n\t\t\tscrollThreshold = 50,\n\t\t\tcollapsed,\n\t\t\tonCollapsedChange,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\tlayoutId,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst localRef = React.useRef<HTMLButtonElement>(null);\n\t\tReact.useImperativeHandle(ref, () => localRef.current as HTMLButtonElement);\n\n\t\tconst [dir, setDir] = React.useState<\"ltr\" | \"rtl\">(\"ltr\");\n\n\t\tReact.useEffect(() => {\n\t\t\tif (!localRef.current) return;\n\t\t\tconst closestDir = localRef.current.closest(\"[dir]\")?.getAttribute(\"dir\");\n\t\t\tif (closestDir === \"rtl\" || closestDir === \"ltr\") {\n\t\t\t\tsetDir(closestDir);\n\t\t\t}\n\t\t}, []);\n\n\t\tconst internalCollapsed = useScrollCollapse(\n\t\t\tcollapseOnScroll,\n\t\t\tscrollThreshold,\n\t\t\tonCollapsedChange,\n\t\t);\n\n\t\tconst isCollapsed = collapsed !== undefined ? collapsed : internalCollapsed;\n\t\tconst hasIcon = !!icon || loading;\n\n\t\tconst colors = COLOR_CLASSES[colorStyle] ?? COLOR_CLASSES.primary;\n\t\tconst radiusConfig = MORPH_RADIUS[size] ?? MORPH_RADIUS.sm;\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{visible && !(isCollapsed && !hasIcon) && (\n\t\t\t\t\t\t<m.button\n\t\t\t\t\t\t\tref={localRef}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tlayout\n\t\t\t\t\t\t\tlayoutId={layoutId}\n\t\t\t\t\t\t\taria-label={ariaLabel || label}\n\t\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t\t\tinitial={{\n\t\t\t\t\t\t\t\tscale: 0.6,\n\t\t\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\t\t\tborderRadius: radiusConfig.default,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\t\tscale: 1,\n\t\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t\t\tborderRadius: radiusConfig.default,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\texit={{ scale: 0.6, opacity: 0 }}\n\t\t\t\t\t\t\twhileTap={{ borderRadius: radiusConfig.pressed }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tborderRadius: { type: \"spring\", stiffness: 500, damping: 30 },\n\t\t\t\t\t\t\t\tscale: SPRING_TRANSITION,\n\t\t\t\t\t\t\t\topacity: { duration: 0.2, ease: \"linear\" },\n\t\t\t\t\t\t\t\tlayout: SPRING_TRANSITION,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative shrink-0 inline-flex items-center select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\t\t\t\t\"transition-[box-shadow,filter] duration-200\",\n\t\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\t\t\t\t\t\t\"disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none\",\n\t\t\t\t\t\t\t\tcolors.bg,\n\t\t\t\t\t\t\t\tcolors.text,\n\t\t\t\t\t\t\t\tlowered ? \"shadow-sm\" : \"shadow-md\",\n\t\t\t\t\t\t\t\tSIZE_HEIGHT[size] ?? \"h-14\",\n\t\t\t\t\t\t\t\tSIZE_TEXT[size],\n\t\t\t\t\t\t\t\tisCollapsed\n\t\t\t\t\t\t\t\t\t? cn(\"px-0 justify-center\", SIZE_WIDTH_COLLAPSED[size])\n\t\t\t\t\t\t\t\t\t: cn(\n\t\t\t\t\t\t\t\t\t\t\thasIcon ? \"justify-start\" : \"justify-center\",\n\t\t\t\t\t\t\t\t\t\t\tSIZE_PADDING[size],\n\t\t\t\t\t\t\t\t\t\t\thasIcon && SIZE_GAP[size],\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tdir === \"rtl\" || restProps.dir === \"rtl\"\n\t\t\t\t\t\t\t\t\t? \"flex-row-reverse\"\n\t\t\t\t\t\t\t\t\t: \"flex-row\",\n\t\t\t\t\t\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{...restProps}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t\t\t{hasIcon && (\n\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\tlayout=\"position\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\t\t\tsizeIcon.cls,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0 w-full h-full\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={sizeIcon.px}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={sizeIcon.px}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\ticon && (\n\t\t\t\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey=\"icon\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0 w-full h-full [&>svg]:w-full [&>svg]:h-full\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{!isCollapsed && (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"label\"\n\t\t\t\t\t\t\t\t\t\tlayout=\"position\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, width: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, width: \"auto\" }}\n\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, width: 0 }}\n\t\t\t\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\t\t\t\topacity: { duration: 0.15, ease: \"linear\" },\n\t\t\t\t\t\t\t\t\t\t\twidth: SPRING_TRANSITION,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tclassName=\"overflow-hidden whitespace-nowrap\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{label}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t</m.button>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nExtendedFABComponent.displayName = \"ExtendedFAB\";\n\nexport const ExtendedFAB = React.memo(ExtendedFABComponent);\n","/**\n * @file fab.tsx\n *\n * MD3 Expressive Floating Action Button (FAB).\n *\n * Supports four sizes, an extended variant with animated label reveal,\n * shape morphing, a `lowered` elevation variant, and an optional\n * `FABPosition` container for absolute positioning within a layout.\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\n\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { LoadingIndicator } from \"../../../loading-indicator\";\nimport { ProgressIndicator } from \"../../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../../shared/constants\";\nimport { TouchTarget } from \"../../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size layout classes for the FAB container.\n * MD3 sizes: SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n * Extended FABs use `w-full` + `px-*` via the caller.\n * @internal\n */\nconst SIZE_STYLES: Record<string, string> = {\n\tsm: \"h-10 w-10\",\n\tmd: \"h-14 w-14\",\n\tlg: \"h-24 w-24\",\n\txl: \"h-[8.5rem] w-[8.5rem]\",\n};\n\n/**\n * Per-size icon dimensions (Tailwind class + pixel value).\n * MD3 icon sizes: SM=24dp, MD=24dp, LG=32dp, XL=40dp.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n/**\n * Per-size label typography classes used in the extended variant.\n * @internal\n */\nconst SIZE_TEXT_CLASS: Record<string, string> = {\n\tsm: \"text-sm font-medium\",\n\tmd: \"text-base font-medium\",\n\tlg: \"text-xl font-semibold\",\n\txl: \"text-2xl font-semibold\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n//\n// IMPORTANT: Use exact height/2 values for \"round\" radii to avoid the dead-zone\n// artefact: CSS clips any radius > height/2 identically, so animating from\n// 9999 → small value produces a jump/snap at the threshold.\n// Heights: SM=40dp, MD=56dp, LG=96dp, XL=136dp\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size border-radius tokens for all interaction / selection states.\n *\n * - `default`: idle pill radius (height / 2).\n * - `pressed`: compressed on `whileTap`.\n * - `extended`: radius for the extended (label-visible) state.\n * - `extended_pressed`: compressed extended state on `whileTap`.\n *\n * @internal\n */\nconst MORPH_RADIUS: Record<\n\tstring,\n\t{\n\t\tdefault: number;\n\t\tpressed: number;\n\t\textended: number;\n\t\textended_pressed: number;\n\t}\n> = {\n\tsm: { default: 12, pressed: 8, extended: 12, extended_pressed: 8 },\n\tmd: { default: 16, pressed: 10, extended: 16, extended_pressed: 10 },\n\tlg: { default: 28, pressed: 20, extended: 28, extended_pressed: 20 },\n\txl: { default: 40, pressed: 28, extended: 40, extended_pressed: 28 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Roles\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role Tailwind class map for each FAB color variant.\n * @internal\n */\nconst COLOR_CLASSES: Record<\n\tstring,\n\t{ bg: string; text: string; shadow: string }\n> = {\n\tprimary: {\n\t\tbg: \"bg-m3-primary-container\",\n\t\ttext: \"text-m3-on-primary-container\",\n\t\tshadow: \"shadow-md\",\n\t},\n\tsecondary: {\n\t\tbg: \"bg-m3-secondary-container\",\n\t\ttext: \"text-m3-on-secondary-container\",\n\t\tshadow: \"shadow-md\",\n\t},\n\ttertiary: {\n\t\tbg: \"bg-m3-tertiary-container\",\n\t\ttext: \"text-m3-on-tertiary-container\",\n\t\tshadow: \"shadow-md\",\n\t},\n\tsurface: {\n\t\tbg: \"bg-m3-surface-container-high\",\n\t\ttext: \"text-m3-primary\",\n\t\tshadow: \"shadow-md\",\n\t},\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Tham số Props dùng cho component thao tác nổi `FAB`.\n *\n * @remarks\n * - Đả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).\n * - Ở 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`.\n * - 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;\n * 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à.\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\nexport interface FABProps extends MotionButtonProps {\n\t/**\n\t * Icon đại diện render — thông thường là truyền thẻ component Icon.\n\t * Sẽ được tráo đổi thành Spinner tự động quay khi giá trị `loading={true}`.\n\t */\n\ticon: React.ReactNode;\n\t/**\n\t * Kích thước hiển thị FAB. Tuân chuẩn.\n\t * - `sm`: Small (40dp) — Được khuyên dùng cho các không gian kín/trong lòng Content.\n\t * - `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).\n\t * - `lg`: Large (96dp) — Trọng tâm thao tác quan trọng lớn nhát.\n\t * - `xl`: Extra-large (136dp) — Gây tiếng vang, dạng Spotlight cực bùng nổ của app.\n\t * @default \"md\"\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container vai trò hệ thống tông màu MD3 dùng phết nền.\n\t * @default \"primary\"\n\t */\n\tcolorStyle?: \"primary\" | \"secondary\" | \"tertiary\" | \"surface\";\n\t/**\n\t * 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.\n\t * Chiều rộng tự cơi nới để thích ứng chuỗi `children`.\n\t * @default false\n\t */\n\textended?: boolean;\n\t/**\n\t * Nơi đón lấy chữ được render cùng khi `extended={true}` bật lên.\n\t * Khuyến nghị là Text string thuần.\n\t */\n\tchildren?: React.ReactNode;\n\t/**\n\t * Nhấn `true`, thì rút lại shadow đi một cấp xuống độ nổi nông cạn.\n\t * Mảng bám ở Bottom bar hay Top bar Surface để ránh rườm rà.\n\t * @default false\n\t */\n\tlowered?: boolean;\n\t/**\n\t * 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.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Có 2 chuẩn hình của Loading chờ.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/**\n\t * Hiện thẻ FAB lên layout không (Kiểm soát bằng motion scale Entrance/Exit).\n\t * @default true\n\t */\n\tvisible?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FABPosition — Layout Wrapper\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 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.\n *\n * @see {@link FABPosition}\n */\nexport interface FABPositionProps {\n\t/**\n\t * Góc để niêm chặt nút FAB.\n\t * @default \"bottom-right\"\n\t */\n\tposition?: \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\";\n\t/** Kẹp một nùi element. Mong chờ thả Node `<FAB>` vào đây.*/\n\tchildren: React.ReactNode;\n\t/** CSS Class hỗ trợ chỉnh override */\n\tclassName?: string;\n}\n\nconst POSITION_CLASS: Record<string, string> = {\n\t\"bottom-right\": \"bottom-4 right-4 sm:bottom-6 sm:right-6\",\n\t\"bottom-left\": \"bottom-4 left-4 sm:bottom-6 sm:left-6\",\n\t\"top-right\": \"top-4 right-4 sm:top-6 sm:right-6\",\n\t\"top-left\": \"top-4 left-4 sm:top-6 sm:left-6\",\n};\n\n/**\n * Element bao bọc thẻ định vị Absolute cho component `<FAB>`.\n *\n * 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.\n * 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).\n *\n * @example\n * ```tsx\n * <div className=\"relative min-h-screen\">\n * // Cái nút sẽ xà xuống dưới cùng bên lề Trái\n * <FABPosition position=\"bottom-left\">\n * <FAB icon={<Icon name=\"edit\" />} aria-label=\"Compose New Mail\" />\n * </FABPosition>\n * </div>\n * ```\n *\n * @see {@link FAB}\n * @see https://m3.material.io/components/floating-action-button/guidelines\n */\nexport function FABPosition({\n\tposition = \"bottom-right\",\n\tchildren,\n\tclassName,\n}: FABPositionProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"absolute z-10\",\n\t\t\t\tPOSITION_CLASS[position] ?? POSITION_CLASS[\"bottom-right\"],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FAB Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst FABComponent = React.forwardRef<HTMLButtonElement, FABProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\ticon,\n\t\t\tsize = \"md\",\n\t\t\tcolorStyle = \"primary\",\n\t\t\textended = false,\n\t\t\tchildren,\n\t\t\tlowered = false,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\tvisible = true,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst colors = COLOR_CLASSES[colorStyle] ?? COLOR_CLASSES.primary;\n\t\tconst radiusConfig = MORPH_RADIUS[size] ?? MORPH_RADIUS.md;\n\n\t\tconst animateRadius = extended\n\t\t\t? radiusConfig.extended\n\t\t\t: radiusConfig.default;\n\t\tconst pressedRadius = extended\n\t\t\t? radiusConfig.extended_pressed\n\t\t\t: radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.md;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst iconPx = sizeIcon.px;\n\n\t\t// xs/sm share the SM token; only MD FAB (40dp) needs the touch target\n\t\tconst needsTouchTarget = size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{visible && (\n\t\t\t\t\t\t<m.button\n\t\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\tariaLabel ||\n\t\t\t\t\t\t\t\t(typeof children === \"string\" ? children : undefined)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\tstyle={style}\n\t\t\t\t\t\t\t// ── Entrance / Exit (FAB visibility) ────────────────\n\t\t\t\t\t\t\tinitial={{ scale: 0.5, opacity: 0, borderRadius: animateRadius }}\n\t\t\t\t\t\t\tanimate={{ scale: 1, opacity: 1, borderRadius: animateRadius }}\n\t\t\t\t\t\t\texit={{ scale: 0.5, opacity: 0 }}\n\t\t\t\t\t\t\t// ── Shape Morphing (extended toggle) ────────────────\n\t\t\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tborderRadius: SPRING_TRANSITION_FAST,\n\t\t\t\t\t\t\t\tscale: SPRING_TRANSITION,\n\t\t\t\t\t\t\t\topacity: { duration: 0.25, ease: \"easeOut\" },\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\t\t\t\t\t\t\t\"select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\t\t\t\t\"transition-[box-shadow,opacity,filter] duration-200\",\n\t\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\t\t\t\t\t\t\"disabled:pointer-events-none disabled:opacity-[0.38] disabled:shadow-none\",\n\t\t\t\t\t\t\t\tcolors.bg,\n\t\t\t\t\t\t\t\tcolors.text,\n\t\t\t\t\t\t\t\tlowered ? \"shadow-sm\" : colors.shadow,\n\t\t\t\t\t\t\t\tSIZE_STYLES[size] ?? \"h-14 w-14\",\n\t\t\t\t\t\t\t\textended && \"w-auto px-6\",\n\t\t\t\t\t\t\t\tSIZE_TEXT_CLASS[size],\n\t\t\t\t\t\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{...restProps}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t\t\t{/* Icon / Loading swap */}\n\t\t\t\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\t\t\t\ticonClass,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\t\t\tsize={iconPx}\n\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize={iconPx}\n\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"icon\"\n\t\t\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&>svg]:w-full [&>svg]:h-full\",\n\t\t\t\t\t\t\t\t\t\t\ticonClass,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\n\t\t\t\t\t\t\t{/* Extended label — animates in/out with the `extended` prop */}\n\t\t\t\t\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t\t\t\t\t{extended && children && (\n\t\t\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\t\t\tkey=\"label\"\n\t\t\t\t\t\t\t\t\t\tinitial={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ width: \"auto\", opacity: 1 }}\n\t\t\t\t\t\t\t\t\t\texit={{ width: 0, opacity: 0 }}\n\t\t\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\t\t\tclassName=\"overflow-hidden whitespace-nowrap ml-3\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t</m.button>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nFABComponent.displayName = \"FAB\";\n\n/**\n * Action nổi chính theo phong cách MD3 Expressive Floating Action Button (FAB).\n *\n * 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),\n * 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,\n * 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.\n *\n * @remarks\n * - Chỉ định bắt buộc `aria-label` cho những mẫu icon bị đơn côi trơ trọi (icon-only FABs).\n * - 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.\n * Khi ấy bạn tha hồ cắt bỏ thuộc tính `aria-label` ra.\n * - 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.\n * - 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ị.\n *\n * @example\n * ```tsx\n * // FAB cơ bản, nhỏ xinh, chỉ hiện icon.\n * <FAB icon={<Icon name=\"search\" />} aria-label=\"Nhấn tìm kiếm\" size=\"sm\" />\n *\n * // Dịch sang dòng Extended có dòng caption chữ dài thòn\n * const [isOpen, setOpen] = React.useState(false);\n * <FAB\n * icon={<Icon name=\"edit\" />}\n * extended={isOpen}\n * onClick={() => setOpen(!isOpen)}\n * >\n * Viết tâm thư\n * </FAB>\n *\n * // FAB to lớn nhất dùng trạng thái chờ load Submit lên Server\n * <FAB\n * icon={<Icon name=\"upload\" />}\n * size=\"lg\"\n * loading={isUploading}\n * colorStyle=\"secondary\"\n * aria-label=\"Upload Files lên mây xanh\"\n * />\n *\n * // Cố định dưới chân tay phải\n * <FABPosition position=\"bottom-right\">\n * <FAB icon={<Icon name=\"add\" />} aria-label=\"Dấu Cộng sinh nảy\" />\n * </FABPosition>\n * ```\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\nexport const FAB = React.memo(FABComponent);\n","/**\n * @file fab-menu.tsx\n *\n * Component FAB Menu theo phong cách MD3 Expressive.\n *\n * Cung cấp một Floating Action Button (FAB) dạng toggle để mở một danh sách các hành động có hiệu ứng stagger (xếp tầng).\n * Tuân thủ mô hình FloatingActionButtonMenu của MD3 với sự hỗ trợ tiếp cận (accessibility) đầy đủ\n * (điều hướng bàn phím, quản lý focus, các vai trò ARIA).\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\n\nimport {\n\tAnimatePresence,\n\tdomMax,\n\tLazyMotion,\n\tm,\n\tuseReducedMotion,\n\tuseSpring,\n\tuseTransform,\n} from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../../lib/utils\";\nimport { Ripple, useRippleState } from \"../../../ripple\";\nimport {\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../../shared/constants\";\nimport { TouchTarget } from \"../../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens — MD3 FAB Menu Spec\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SPRING_NORMAL = { stiffness: 700, damping: 40 } as const;\nconst SPRING_REDUCED = { stiffness: 10000, damping: 100 } as const;\nconst FOCUS_DELAY_MS = 50;\n\nconst TOGGLE_FAB_COLORS: Record<\n\tstring,\n\t{\n\t\tcontainerBg: string;\n\t\tcontainerText: string;\n\t\tcheckedBg: string;\n\t\tcheckedText: string;\n\t}\n> = {\n\tprimary: {\n\t\tcontainerBg: \"bg-m3-primary-container\",\n\t\tcontainerText: \"text-m3-on-primary-container\",\n\t\tcheckedBg: \"bg-m3-primary\",\n\t\tcheckedText: \"text-m3-on-primary\",\n\t},\n\tsecondary: {\n\t\tcontainerBg: \"bg-m3-secondary-container\",\n\t\tcontainerText: \"text-m3-on-secondary-container\",\n\t\tcheckedBg: \"bg-m3-secondary\",\n\t\tcheckedText: \"text-m3-on-secondary\",\n\t},\n\ttertiary: {\n\t\tcontainerBg: \"bg-m3-tertiary-container\",\n\t\tcontainerText: \"text-m3-on-tertiary-container\",\n\t\tcheckedBg: \"bg-m3-tertiary\",\n\t\tcheckedText: \"text-m3-on-tertiary\",\n\t},\n};\n\n/**\n * Size tokens for ToggleFAB.\n *\n * MD3 Kotlin reference:\n * - Baseline: 56dp, cornerRadius 16dp → 28dp (fully round)\n * - Medium: ~80dp (FabMediumTokens.ContainerHeight), cornerRadius 20dp → 40dp\n * - Large: 96dp, cornerRadius 28dp → 48dp\n * @internal\n */\nconst TOGGLE_FAB_SIZES: Record<\n\tstring,\n\t{\n\t\tsizeClass: string;\n\t\tinitialRadius: number;\n\t\tfinalRadius: number;\n\t}\n> = {\n\tbaseline: { sizeClass: \"h-14 w-14\", initialRadius: 16, finalRadius: 28 },\n\tmedium: { sizeClass: \"h-20 w-20\", initialRadius: 20, finalRadius: 40 },\n\tlarge: { sizeClass: \"h-24 w-24\", initialRadius: 28, finalRadius: 48 },\n};\n\nconst MENU_ITEM_STYLES = {\n\tpadding: \"ps-4 pe-6\",\n\tgap: \"gap-3\",\n\tsize: \"h-14 min-w-14\",\n\tcornerRadius: 999,\n} as const;\n\nconst MENU_ITEM_COLORS: Record<string, { bg: string; text: string }> = {\n\tprimary: {\n\t\tbg: \"bg-m3-primary-container\",\n\t\ttext: \"text-m3-on-primary-container\",\n\t},\n\tsecondary: {\n\t\tbg: \"bg-m3-secondary-container\",\n\t\ttext: \"text-m3-on-secondary-container\",\n\t},\n\ttertiary: {\n\t\tbg: \"bg-m3-tertiary-container\",\n\t\ttext: \"text-m3-on-tertiary-container\",\n\t},\n};\n\nconst ALIGNMENT_CONTAINER_CLASSES: Record<string, string> = {\n\tend: \"items-end bottom-4 right-4 sm:bottom-6 sm:right-6\",\n\tstart: \"items-start bottom-4 left-4 sm:bottom-6 sm:left-6\",\n\tcenter: \"items-center bottom-4 left-1/2 -translate-x-1/2 sm:bottom-6\",\n};\n\nconst ALIGNMENT_ITEMS_CLASSES: Record<string, string> = {\n\tend: \"items-end\",\n\tstart: \"items-start\",\n\tcenter: \"items-center\",\n};\n\nconst ALIGNMENT_TRANSFORM_ORIGIN: Record<string, string> = {\n\tend: \"right\",\n\tstart: \"left\",\n\tcenter: \"bottom\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Định dạng dữ liệu cho từng hành động (item) trong biểu mẫu menu của FAB.\n *\n * Nếu bỏ qua thuộc tính `label`, item sẽ render dạng ô vuông chỉ có icon.\n */\nexport interface FABMenuItemData {\n\t/** Một ID duy nhất để dùng cho key react và quản lý focus. */\n\tid: string;\n\t/** 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). */\n\tlabel?: string;\n\t/** Node của Icon — thường là một component SVG Icon duy nhất. */\n\ticon: React.ReactNode;\n\t/** 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). */\n\tonClick: () => void;\n\t/**\n\t * Khi `true`, vô hiệu hoá item về mặt hình thức lẫn tương tác rẽ nhánh.\n\t * Vẫn dùng `aria-disabled` thay vì HTML `disabled` nhằm giữ nó lấy được focus phục vụ cho accessibility.\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\t/** Thêm CSS classes bổ sung dùng cho wrapper chính của item. */\n\tclassName?: string;\n}\n\n/**\n * Các props điều khiển Component chính `FABMenu`.\n *\n * @remarks\n * 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,\n * và điều hướng hiệu ứng chuyển động. Trạng thái `expanded` được truyền từ ngoài (controlled state),\n * do đó bạn có thể quản lý qua react state, hoặc dùng router hay business logic khác.\n */\nexport interface FABMenuProps {\n\t/** FAB Menu có đang mở (mở rộng)/hiển thị hay không. */\n\texpanded: boolean;\n\t/** Hàm handler kích hoạt khi Toggle FAB được người dùng tương tác, hoặc khi dismiss backdrop. */\n\tonToggle: (expanded: boolean) => void;\n\t/** Danh sách các action items (Spec MD3 đề nghị 2-6 item là hoàn hảo). */\n\titems: FABMenuItemData[];\n\t/**\n\t * Vai trò màu (color role container) MD3 cho cái nút FAB lẫn các menu items.\n\t * @default \"primary\"\n\t */\n\tcolorVariant?: \"primary\" | \"secondary\" | \"tertiary\";\n\t/**\n\t * 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).\n\t * @default \"baseline\"\n\t */\n\tfabSize?: \"baseline\" | \"medium\" | \"large\";\n\t/**\n\t * Căn lề của danh sách menu items tương quan với cái Toggle FAB.\n\t * - `\"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).\n\t * - `\"start\"`: Các items dồn hết dọc theo lề trái.\n\t * - `\"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.\n\t * @default \"end\"\n\t */\n\talignment?: \"start\" | \"end\" | \"center\";\n\t/** Thuộc tính cho CSS component root để đè. */\n\tclassName?: string;\n\t/**\n\t * Nếu `true`, khi menu đang hiện ra, click chuột ra phía sau (màn xám mờ backdrop) để đóng menu.\n\t * @default true\n\t */\n\tcloseOnBackdropClick?: boolean;\n\t/**\n\t * 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.\n\t * 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).\n\t * @default true\n\t */\n\tfocusLast?: boolean;\n\t/** Bắt buộc truyền `aria-label` cho ToggleFAB để đáp ứng Accessibility. */\n\t\"aria-label\"?: string;\n}\n\n/**\n * Props thuộc component `ToggleFAB` đứng độc lập.\n */\nexport interface ToggleFABProps {\n\t/** Nút có đang trong trạng thái được kích hoạt check (expanded). */\n\texpanded: boolean;\n\t/** Gọi khi xảy ra sự kiện Toggle nút. */\n\tonToggle: (expanded: boolean) => void;\n\t/**\n\t * Function sinh Icon - nhận về tiến độ `progress` trong khoảng `0` -> `1` (Từ Chưa Expanded -> Đã Expanded)\n\t * Dùng cho các hiệu ứng morphing Icon khi animtion render (VD: Từ Cộng thành Đóng).\n\t *\n\t * @example\n\t * ```tsx\n\t * icon={(progress) => progress > 0.5 ? <Icon name=\"close\" /> : <Icon name=\"add\" />}\n\t * ```\n\t */\n\ticon: (progress: number) => React.ReactNode;\n\t/** Vai trò màu container chuẩn MD3. @default \"primary\" */\n\tcolorVariant?: \"primary\" | \"secondary\" | \"tertiary\";\n\t/** Kích thước của cục FAB ban đầu (Sau khi nhấn sẽ thu tròn). @default \"baseline\" */\n\tfabSize?: \"baseline\" | \"medium\" | \"large\";\n\t/** CSS Class linh tinh bổ sung thêm. */\n\tclassName?: string;\n\t/** Thuộc tính đọc thẻ accessibility. Bắt buộc có. */\n\t\"aria-label\"?: string;\n\t/** Kiểm soát giá trị của ID để link với menu qua aria-controls. */\n\t\"aria-controls\"?: string;\n\t/** Trỏ id component. */\n\tid?: string;\n}\n\n/**\n * Props thuộc component một món item đơn lẻ `FABMenuItem`.\n */\nexport interface FABMenuItemProps {\n\t/** Node của icon hiện. */\n\ticon: React.ReactNode;\n\t/** 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. */\n\tlabel?: string;\n\t/** Hàm bắn ra khi item được kích. */\n\tonClick: () => void;\n\t/** 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 */\n\tdisabled?: boolean;\n\t/** Container tông màu. @default \"primary\" */\n\tcolorVariant?: \"primary\" | \"secondary\" | \"tertiary\";\n\t/** Custom CSS className. */\n\tclassName?: string;\n\t/** Số index liệt kê trong mảng dùng tính render delay (Dành cho animation cấu trúc `custom`). */\n\tindex?: number;\n\t/** Tổng danh sách items có mảng. */\n\ttotalItems?: number;\n\t/** Giá trị logic `tabIndex` dùng điều khiển thao tác phím Tab thủ công. */\n\ttabIndex?: number;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Animation Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ITEM_SPRING = { type: \"spring\" as const, stiffness: 700, damping: 25 };\n\nconst MENU_CONTAINER_VARIANTS = {\n\topen: { transition: { staggerChildren: 0.033, staggerDirection: 1 } },\n\tclosed: { transition: { staggerChildren: 0.02, staggerDirection: -1 } },\n} as const;\n\nconst MENU_ITEM_VARIANTS = {\n\topen: { scaleX: 1, opacity: 1, transition: ITEM_SPRING },\n\tclosed: { scaleX: 0, opacity: 0, transition: ITEM_SPRING },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Icon Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction AddIcon() {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t>\n\t\t\t<title>Add</title>\n\t\t\t<path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n\t\t</svg>\n\t);\n}\n\nfunction CloseIcon() {\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\twidth=\"24\"\n\t\t\theight=\"24\"\n\t\t>\n\t\t\t<title>Close</title>\n\t\t\t<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n\t\t</svg>\n\t);\n}\n\nfunction defaultFabIcon(progress: number) {\n\treturn progress > 0.5 ? <CloseIcon /> : <AddIcon />;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ToggleFAB Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst ToggleFABComponent = React.forwardRef<HTMLButtonElement, ToggleFABProps>(\n\t(\n\t\t{\n\t\t\texpanded,\n\t\t\tonToggle,\n\t\t\ticon,\n\t\t\tcolorVariant = \"primary\",\n\t\t\tfabSize = \"baseline\",\n\t\t\tclassName,\n\t\t\tid,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t\"aria-controls\": ariaControls,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst prefersReduced = useReducedMotion();\n\t\tconst colors = TOGGLE_FAB_COLORS[colorVariant] ?? TOGGLE_FAB_COLORS.primary;\n\t\tconst sizeTokens = TOGGLE_FAB_SIZES[fabSize] ?? TOGGLE_FAB_SIZES.baseline;\n\n\t\tconst springConfig = prefersReduced ? SPRING_REDUCED : SPRING_NORMAL;\n\t\tconst checkedProgress = useSpring(expanded ? 1 : 0, springConfig);\n\n\t\tReact.useEffect(() => {\n\t\t\tcheckedProgress.set(expanded ? 1 : 0);\n\t\t}, [expanded, checkedProgress]);\n\n\t\tconst borderRadius = useTransform(\n\t\t\tcheckedProgress,\n\t\t\t[0, 1],\n\t\t\t[`${sizeTokens.initialRadius}px`, `${sizeTokens.finalRadius}px`],\n\t\t);\n\n\t\tconst [iconProgress, setIconProgress] = React.useState(expanded ? 1 : 0);\n\n\t\tReact.useEffect(() => {\n\t\t\treturn checkedProgress.on(\"change\", setIconProgress);\n\t\t}, [checkedProgress]);\n\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState();\n\n\t\tconst handleClick = React.useCallback(() => {\n\t\t\tonToggle(!expanded);\n\t\t}, [expanded, onToggle]);\n\n\t\treturn (\n\t\t\t<m.button\n\t\t\t\tref={ref}\n\t\t\t\tid={id}\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-expanded={expanded}\n\t\t\t\taria-haspopup=\"menu\"\n\t\t\t\taria-label={ariaLabel ?? (expanded ? \"Close menu\" : \"Open menu\")}\n\t\t\t\taria-controls={ariaControls}\n\t\t\t\tdata-expanded={expanded ? \"true\" : \"false\"}\n\t\t\t\tonClick={handleClick}\n\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\tstyle={{ borderRadius }}\n\t\t\t\tanimate={{\n\t\t\t\t\tboxShadow: expanded\n\t\t\t\t\t\t? \"0 4px 8px 3px rgba(0,0,0,0.15), 0 1px 3px rgba(0,0,0,0.3)\"\n\t\t\t\t\t\t: \"0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24)\",\n\t\t\t\t}}\n\t\t\t\twhileTap={{ scale: 0.95, transition: SPRING_TRANSITION_FAST }}\n\t\t\t\ttransition={{ boxShadow: SPRING_TRANSITION }}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\t\t\t\t\"select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\t\"transition-colors duration-200\",\n\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\t\t\t\tsizeTokens.sizeClass,\n\t\t\t\t\texpanded ? colors.checkedBg : colors.containerBg,\n\t\t\t\t\texpanded ? colors.checkedText : colors.containerText,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<TouchTarget />\n\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t\t<span\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"relative z-10 flex items-center justify-center size-6 pointer-events-none\"\n\t\t\t\t>\n\t\t\t\t\t{icon(iconProgress)}\n\t\t\t\t</span>\n\t\t\t</m.button>\n\t\t);\n\t},\n);\n\nToggleFABComponent.displayName = \"ToggleFAB\";\n\n/**\n * 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`.\n *\n * 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\n * khi mà cờ `expanded` chuyển tiếp từ false sang → true.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n * <ToggleFAB\n * expanded={open}\n * onToggle={setOpen}\n * colorVariant=\"primary\"\n * aria-label=\"Toggle actions\"\n * icon={(progress) => progress > 0.5 ? <Icon name=\"close\" /> : <Icon name=\"add\" />}\n * />\n * ```\n */\nexport const ToggleFAB = React.memo(ToggleFABComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FABMenuItem Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Một item thực hiện một loại hành động duy nhất trong `FABMenu`.\n *\n * Render hình dạng viên thuốc bao quanh icon cùng với label diễn giải.\n * 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.\n * 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.\n *\n * @remarks\n * 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\n * 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\n * (quy chuẩn chặt chẽ của Material Design 3).\n */\nexport function FABMenuItem({\n\ticon,\n\tlabel,\n\tonClick,\n\tdisabled = false,\n\tcolorVariant = \"primary\",\n\tclassName,\n\ttabIndex = 0,\n}: FABMenuItemProps) {\n\tconst colors = MENU_ITEM_COLORS[colorVariant] ?? MENU_ITEM_COLORS.primary;\n\n\tconst { ripples, onPointerDown, removeRipple } = useRippleState({ disabled });\n\n\tconst handleClick = React.useCallback(\n\t\t(e: React.MouseEvent<HTMLDivElement>) => {\n\t\t\tif (disabled) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tonClick();\n\t\t},\n\t\t[disabled, onClick],\n\t);\n\n\tconst handleKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (disabled) return;\n\t\t\tif (e.key === \"Enter\" || e.key === \" \") {\n\t\t\t\te.preventDefault();\n\t\t\t\tonClick();\n\t\t\t}\n\t\t},\n\t\t[disabled, onClick],\n\t);\n\n\treturn (\n\t\t<m.div\n\t\t\trole=\"menuitem\"\n\t\t\ttabIndex={tabIndex}\n\t\t\taria-disabled={disabled ? \"true\" : undefined}\n\t\t\tdata-disabled={disabled ? \"true\" : undefined}\n\t\t\tonClick={handleClick}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonKeyDown={handleKeyDown}\n\t\t\tvariants={MENU_ITEM_VARIANTS}\n\t\t\tstyle={{\n\t\t\t\ttransformOrigin: \"right\",\n\t\t\t\tborderRadius: `${MENU_ITEM_STYLES.cornerRadius}px`,\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative inline-flex flex-row items-center\",\n\t\t\t\t\"select-none cursor-pointer overflow-hidden\",\n\t\t\t\t\"whitespace-nowrap\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-1\",\n\t\t\t\tMENU_ITEM_STYLES.size,\n\t\t\t\tMENU_ITEM_STYLES.gap,\n\t\t\t\tlabel ? MENU_ITEM_STYLES.padding : \"px-4\",\n\t\t\t\t!label && \"justify-center\",\n\t\t\t\tcolors.bg,\n\t\t\t\tcolors.text,\n\t\t\t\tdisabled && \"opacity-[0.38] pointer-events-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<TouchTarget />\n\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\t\t\t<span\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tclassName=\"relative z-10 flex items-center justify-center size-6 shrink-0 [&>svg]:w-full [&>svg]:h-full pointer-events-none\"\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t</span>\n\t\t\t{label && (\n\t\t\t\t<span className=\"relative z-10 text-base font-medium leading-none pointer-events-none\">\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</m.div>\n\t);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FABMenu Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * MD3 Expressive FAB Menu.\n *\n * 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ó.\n *\n * Accessibility thực thi chuẩn MD3 toàn phần:\n * - thẻ `role=\"menu\"` trang bị cho thẻ hộp div làm luống container\n * - trang bị thẻ `role=\"menuitem\"` trên mảng items thành phần con\n * - 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\n * - 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.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n *\n * const items = [\n * { id: 'share', icon: <Icon name=\"share\" />, label: 'Chia sẻ', onClick: () => console.log('Share') },\n * { id: 'edit', icon: <Icon name=\"edit\" />, label: 'Chỉnh sửa', onClick: () => console.log('Edit') },\n * { id: 'delete', icon: <Icon name=\"delete\" />, label: 'Xóa bớt', disabled: true, onClick: () => {} }\n * ];\n *\n * <FABMenu\n * expanded={open}\n * onToggle={setOpen}\n * aria-label=\"Các công cụ thao tác nhanh\"\n * alignment=\"center\"\n * colorVariant=\"tertiary\"\n * items={items}\n * />\n * ```\n *\n * @see https://m3.material.io/components/floating-action-button/overview\n */\nexport function FABMenu({\n\texpanded,\n\tonToggle,\n\titems,\n\tcolorVariant = \"primary\",\n\tfabSize = \"baseline\",\n\talignment = \"end\",\n\tclassName,\n\tcloseOnBackdropClick = true,\n\tfocusLast = true,\n\t\"aria-label\": ariaLabel,\n}: FABMenuProps) {\n\tconst fabId = React.useId();\n\tconst menuId = React.useId();\n\tconst toggleRef = React.useRef<HTMLButtonElement>(null);\n\tconst itemRefs = React.useRef<(HTMLDivElement | null)[]>([]);\n\tconst [focusedIndex, setFocusedIndex] = React.useState<number>(-1);\n\n\tconst reversedItems = React.useMemo(() => [...items].reverse(), [items]);\n\n\tconst focusItem = React.useCallback((index: number) => {\n\t\tconst clampedIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(index, itemRefs.current.length - 1),\n\t\t);\n\t\tsetFocusedIndex(clampedIndex);\n\t\titemRefs.current[clampedIndex]?.focus();\n\t}, []);\n\n\t// Track whether menu was previously open so we only return focus\n\t// to the toggle button after a user-initiated close, not on initial mount.\n\tconst wasExpandedRef = React.useRef(false);\n\n\tReact.useEffect(() => {\n\t\tif (expanded) {\n\t\t\twasExpandedRef.current = true;\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tfocusItem(focusLast ? items.length - 1 : 0);\n\t\t\t}, FOCUS_DELAY_MS);\n\t\t\treturn () => clearTimeout(timer);\n\t\t}\n\n\t\tif (wasExpandedRef.current) {\n\t\t\ttoggleRef.current?.focus();\n\t\t}\n\t\twasExpandedRef.current = false;\n\t\tsetFocusedIndex(-1);\n\t}, [expanded, focusLast, items.length, focusItem]);\n\n\tconst handleMenuKeyDown = React.useCallback(\n\t\t(e: React.KeyboardEvent<HTMLDivElement>) => {\n\t\t\tif (!expanded) return;\n\n\t\t\tconst lastIndex = items.length - 1;\n\n\t\t\tswitch (e.key) {\n\t\t\t\tcase \"Escape\":\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonToggle(false);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ArrowUp\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfocusItem(focusedIndex <= 0 ? lastIndex : focusedIndex - 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"ArrowDown\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfocusItem(focusedIndex >= lastIndex ? 0 : focusedIndex + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"Tab\": {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tfocusItem(focusedIndex <= 0 ? lastIndex : focusedIndex - 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfocusItem(focusedIndex >= lastIndex ? 0 : focusedIndex + 1);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[expanded, focusedIndex, items.length, focusItem, onToggle],\n\t);\n\n\treturn (\n\t\t<LazyMotion features={domMax} strict>\n\t\t\t{expanded && closeOnBackdropClick && (\n\t\t\t\t<div\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tclassName=\"fixed inset-0 z-40\"\n\t\t\t\t\tonClick={() => onToggle(false)}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{/* biome-ignore lint/a11y/useSemanticElements: FAB menu container needs div, not fieldset — this is not a form group */}\n\t\t\t<div\n\t\t\t\trole=\"group\"\n\t\t\t\taria-label={ariaLabel ?? \"Actions menu\"}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed z-50 flex flex-col gap-2\",\n\t\t\t\t\tALIGNMENT_CONTAINER_CLASSES[alignment],\n\t\t\t\t\t\"*:shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonKeyDown={handleMenuKeyDown}\n\t\t\t>\n\t\t\t\t<AnimatePresence>\n\t\t\t\t\t{expanded && (\n\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\tid={menuId}\n\t\t\t\t\t\t\trole=\"menu\"\n\t\t\t\t\t\t\taria-labelledby={fabId}\n\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\tvariants={MENU_CONTAINER_VARIANTS}\n\t\t\t\t\t\t\tinitial=\"closed\"\n\t\t\t\t\t\t\tanimate=\"open\"\n\t\t\t\t\t\t\texit=\"closed\"\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex flex-col-reverse gap-2\",\n\t\t\t\t\t\t\t\tALIGNMENT_ITEMS_CLASSES[alignment],\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{reversedItems.map((item, reversedIndex) => {\n\t\t\t\t\t\t\t\tconst originalIndex = items.length - 1 - reversedIndex;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\t\t\tvariants={MENU_ITEM_VARIANTS}\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\ttransformOrigin:\n\t\t\t\t\t\t\t\t\t\t\t\tALIGNMENT_TRANSFORM_ORIGIN[alignment] ?? \"right\",\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\titemRefs.current[originalIndex] = el;\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<FABMenuItem\n\t\t\t\t\t\t\t\t\t\t\ticon={item.icon}\n\t\t\t\t\t\t\t\t\t\t\tlabel={item.label}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!item.disabled) {\n\t\t\t\t\t\t\t\t\t\t\t\t\titem.onClick();\n\t\t\t\t\t\t\t\t\t\t\t\t\tonToggle(false);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\t\t\t\t\t\t\tcolorVariant={colorVariant}\n\t\t\t\t\t\t\t\t\t\t\tclassName={item.className}\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={expanded ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</m.div>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\n\t\t\t\t<ToggleFAB\n\t\t\t\t\tref={toggleRef}\n\t\t\t\t\tid={fabId}\n\t\t\t\t\texpanded={expanded}\n\t\t\t\t\tonToggle={onToggle}\n\t\t\t\t\tcolorVariant={colorVariant}\n\t\t\t\t\tfabSize={fabSize}\n\t\t\t\t\taria-label={\n\t\t\t\t\t\tariaLabel ?? (expanded ? \"Close actions menu\" : \"Open actions menu\")\n\t\t\t\t\t}\n\t\t\t\t\taria-controls={menuId}\n\t\t\t\t\ticon={defaultFabIcon}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</LazyMotion>\n\t);\n}\n","/**\n * @file icon-button.tsx\n *\n * MD3 Expressive Icon Button component.\n *\n * An icon-only button with shape morphing, ripple effect, loading state,\n * and toggle variant. Requires `aria-label` for accessibility since there\n * is no visible text label.\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\n\nimport type { HTMLMotionProps } from \"motion/react\";\nimport { AnimatePresence, domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { LoadingIndicator } from \"../../loading-indicator\";\nimport { ProgressIndicator } from \"../../progress-indicator\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport {\n\tICON_SPAN_VARIANTS,\n\tSPRING_TRANSITION,\n\tSPRING_TRANSITION_FAST,\n} from \"../../shared/constants\";\nimport { TouchTarget } from \"../../shared/touch-target\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Design Tokens\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size container dimensions (Tailwind utility classes).\n * MD3 Expressive sizing tokens (v14.1.0): XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n * @internal\n */\nconst SIZE_STYLES: Record<string, string> = {\n\txs: \"h-8 w-8\",\n\tsm: \"h-10 w-10\",\n\tmd: \"h-14 w-14\",\n\tlg: \"h-24 w-24\",\n\txl: \"h-[8.5rem] w-[8.5rem]\",\n};\n\n/**\n * Per-size icon dimensions — Tailwind class + pixel value.\n * Single source of truth to keep icon class and LoadingIndicator size in sync.\n * @internal\n */\nconst SIZE_ICON: Record<string, { cls: string; px: number }> = {\n\txs: { cls: \"size-5\", px: 20 },\n\tsm: { cls: \"size-6\", px: 24 },\n\tmd: { cls: \"size-6\", px: 24 },\n\tlg: { cls: \"size-8\", px: 32 },\n\txl: { cls: \"size-10\", px: 40 },\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Shape Morphing — Border Radius Map\n// Keys: round=CornerFull, square=CornerMedium–XL, pressed, selectedRound, selectedSquare\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Per-size shape morphing radius configuration for all interaction states.\n *\n * - `round` / `square`: idle border-radius per shape variant.\n * - `pressed`: compressed radius on whileTap.\n * - `selectedRound` / `selectedSquare`: radius when toggle is selected\n * (shape flips — round selected → selectedRound which is squarer).\n *\n * @internal\n */\nconst RADIUS_MAP: Record<\n\tstring,\n\t{\n\t\tround: number;\n\t\tsquare: number;\n\t\tpressed: number;\n\t\tselectedRound: number;\n\t\tselectedSquare: number;\n\t}\n> = {\n\txs: {\n\t\tround: 16,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 16,\n\t},\n\tsm: {\n\t\tround: 20,\n\t\tsquare: 12,\n\t\tpressed: 8,\n\t\tselectedRound: 12,\n\t\tselectedSquare: 20,\n\t},\n\tmd: {\n\t\tround: 28,\n\t\tsquare: 16,\n\t\tpressed: 12,\n\t\tselectedRound: 16,\n\t\tselectedSquare: 28,\n\t},\n\tlg: {\n\t\tround: 48,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 48,\n\t},\n\txl: {\n\t\tround: 68,\n\t\tsquare: 28,\n\t\tpressed: 16,\n\t\tselectedRound: 28,\n\t\tselectedSquare: 68,\n\t},\n};\n\n/**\n * Outline border width per size for the `outlined` color style.\n * XS/SM/MD = 1dp, LG = 2dp, XL = 3dp.\n * @internal\n */\nconst SIZE_OUTLINE_WIDTH: Record<string, string> = {\n\txs: \"border\",\n\tsm: \"border\",\n\tmd: \"border\",\n\tlg: \"border-2\",\n\txl: \"border-[3px]\",\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Color Variants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Color-role class pairs for each `colorStyle` × selection state combination.\n * @internal\n */\nconst colorStyles = {\n\tstandard: {\n\t\tdefault:\n\t\t\t\"text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected: \"text-m3-primary hover:bg-m3-primary/8 active:bg-m3-primary/12\",\n\t},\n\tfilled: {\n\t\tdefault:\n\t\t\t\"bg-m3-surface-container text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-primary text-m3-on-primary hover:brightness-95 active:brightness-90\",\n\t},\n\ttonal: {\n\t\tdefault:\n\t\t\t\"bg-m3-secondary-container text-m3-on-secondary-container hover:bg-m3-on-secondary-container/8 active:bg-m3-on-secondary-container/12\",\n\t\tselected:\n\t\t\t\"bg-m3-secondary text-m3-on-secondary hover:brightness-95 active:brightness-90\",\n\t},\n\toutlined: {\n\t\tdefault:\n\t\t\t\"border-m3-outline-variant text-m3-on-surface-variant hover:bg-m3-on-surface-variant/8 active:bg-m3-on-surface-variant/12\",\n\t\tselected:\n\t\t\t\"bg-m3-inverse-surface text-m3-inverse-on-surface border-transparent hover:brightness-95 active:brightness-90\",\n\t},\n};\n\n/**\n * Base Tailwind classes shared by all icon button variants.\n * Separated from CVA to keep bundle output lean (no runtime variant lookups needed here).\n * @internal\n */\nconst baseIconButtonClasses = [\n\t\"relative shrink-0 inline-flex items-center justify-center\",\n\t\"select-none cursor-pointer\",\n\t\"transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200\",\n\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-2\",\n\t\"disabled:pointer-events-none disabled:opacity-[0.38]\",\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype MotionButtonProps = Omit<HTMLMotionProps<\"button\">, \"children\" | \"color\">;\n\n/**\n * Base props for the Icon Button component.\n *\n * @see {@link IconButtonProps} for the full discriminated union.\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport interface BaseIconButtonProps extends MotionButtonProps {\n\t/**\n\t * Visual color style following MD3 color roles.\n\t * @default \"standard\"\n\t */\n\tcolorStyle?: \"standard\" | \"filled\" | \"tonal\" | \"outlined\";\n\t/**\n\t * Button container size.\n\t * Sizes: XS=32dp, SM=40dp, MD=56dp, LG=96dp, XL=136dp.\n\t * @default \"sm\"\n\t */\n\tsize?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\t/**\n\t * Container shape controlling border-radius morphing.\n\t * - `round`: fully circular (CornerFull).\n\t * - `square`: rounded square (CornerMedium–CornerExtraLarge per size).\n\t * @default \"round\"\n\t */\n\tshape?: \"round\" | \"square\";\n\t/**\n\t * When `true`, replaces the icon with an animated loading indicator.\n\t * Interaction is blocked and `aria-busy` is set.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Spinner style shown while `loading={true}`.\n\t * @default \"loading-indicator\"\n\t */\n\tloadingVariant?: \"loading-indicator\" | \"circular\";\n\t/** Explicit icon size override in px */\n\ticonSize?: number | \"inherit\";\n\t/** Icon content — typically a single SVG icon component. */\n\tchildren: React.ReactNode;\n\t/**\n\t * Accessible label — **REQUIRED** because icon buttons have no visible text.\n\t *\n\t * @example \"Close\", \"Add to favourites\", \"Toggle dark mode\"\n\t * @see https://m3.material.io/components/icon-buttons/accessibility\n\t */\n\t\"aria-label\": string;\n}\n\n/**\n * Complete `IconButton` props — discriminated union that enforces\n * `selected` is only valid with `variant=\"toggle\"`.\n *\n * @example\n * ```tsx\n * // Standard\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * // Toggle\n * <IconButton\n * variant=\"toggle\"\n * selected={isLiked}\n * aria-label={isLiked ? \"Unlike\" : \"Like\"}\n * colorStyle=\"filled\"\n * onClick={() => setIsLiked(!isLiked)}\n * >\n * <HeartIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport type IconButtonProps = BaseIconButtonProps &\n\t(\n\t\t| { variant?: \"default\"; selected?: never }\n\t\t| { variant: \"toggle\"; selected: boolean }\n\t);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolves the animated border-radius based on shape and toggle state.\n *\n * @param radiusConfig - The radius map entry for the current size.\n * @param shape - Current shape variant.\n * @param isToggle - Whether the button is a toggle variant.\n * @param isSelected - Current toggle selection state.\n * @returns Border radius in px.\n * @internal\n */\nfunction resolveAnimateRadius(\n\tradiusConfig: (typeof RADIUS_MAP)[string],\n\tshape: \"round\" | \"square\",\n\tisToggle: boolean,\n\tisSelected: boolean,\n): number {\n\tif (isToggle && isSelected) {\n\t\treturn shape === \"round\"\n\t\t\t? radiusConfig.selectedRound\n\t\t\t: radiusConfig.selectedSquare;\n\t}\n\treturn shape === \"round\" ? radiusConfig.round : radiusConfig.square;\n}\n\n/**\n * Returns extra disabled-state classes specific to background-bearing color styles.\n *\n * `filled` and `tonal` need a dimmed background; `outlined` needs a dimmed border.\n * `standard` only dims the icon colour (handled by global `disabled:opacity-[0.38]`).\n *\n * @param colorStyle - Current color style.\n * @returns Tailwind disabled-state override classes.\n * @internal\n */\nfunction resolveDisabledBgClass(colorStyle: string): string {\n\tif (colorStyle === \"filled\" || colorStyle === \"tonal\") {\n\t\treturn \"disabled:bg-m3-on-surface/12 disabled:text-m3-on-surface/[0.38]\";\n\t}\n\tif (colorStyle === \"outlined\") {\n\t\treturn \"disabled:text-m3-on-surface/[0.38] disabled:border-m3-on-surface/[0.12]\";\n\t}\n\treturn \"disabled:text-m3-on-surface/[0.38]\";\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst IconButtonComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tIconButtonProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"default\",\n\t\t\tcolorStyle = \"standard\",\n\t\t\tsize = \"sm\",\n\t\t\tshape = \"round\",\n\t\t\tselected,\n\t\t\tloading = false,\n\t\t\tloadingVariant = \"loading-indicator\",\n\t\t\ticonSize,\n\t\t\tchildren,\n\t\t\tonClick,\n\t\t\tonKeyDown,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isToggle = variant === \"toggle\";\n\t\tconst isSelected = isToggle && !!selected;\n\n\t\t// Derived display values — memoized to avoid recalculation on every render\n\t\tconst resolvedColorClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tisSelected\n\t\t\t\t\t? colorStyles[colorStyle].selected\n\t\t\t\t\t: colorStyles[colorStyle].default,\n\t\t\t[isSelected, colorStyle],\n\t\t);\n\n\t\tconst outlineWidthClass = React.useMemo(\n\t\t\t() =>\n\t\t\t\tcolorStyle === \"outlined\" && !isSelected\n\t\t\t\t\t? (SIZE_OUTLINE_WIDTH[size] ?? \"border\")\n\t\t\t\t\t: \"\",\n\t\t\t[colorStyle, isSelected, size],\n\t\t);\n\n\t\tconst disabledBgClass = React.useMemo(\n\t\t\t() => resolveDisabledBgClass(colorStyle),\n\t\t\t[colorStyle],\n\t\t);\n\n\t\tconst radiusConfig = RADIUS_MAP[size] ?? RADIUS_MAP.sm;\n\t\tconst animateRadius = resolveAnimateRadius(\n\t\t\tradiusConfig,\n\t\t\tshape,\n\t\t\tisToggle,\n\t\t\tisSelected,\n\t\t);\n\t\tconst pressedRadius = radiusConfig.pressed;\n\n\t\tconst sizeIcon = SIZE_ICON[size] ?? SIZE_ICON.sm;\n\t\tconst iconClass = sizeIcon.cls;\n\t\tconst defaultIconPx = sizeIcon.px;\n\t\tconst iconPx = iconSize ?? defaultIconPx;\n\t\tconst isCustomSize = iconSize != null && iconSize !== \"inherit\";\n\n\t\t// xs/sm need 48dp touch target (WCAG 2.5.5 + MD3 a11y)\n\t\tconst needsTouchTarget = size === \"xs\" || size === \"sm\";\n\n\t\t// ── Ripple ───────────────────────────────────────────────────────\n\t\tconst { ripples, onPointerDown, removeRipple } = useRippleState({\n\t\t\tdisabled: loading,\n\t\t});\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[loading, onClick],\n\t\t);\n\n\t\tconst handleKeyDown = React.useCallback(\n\t\t\t(e: React.KeyboardEvent<HTMLButtonElement>) => {\n\t\t\t\tif (loading) return;\n\t\t\t\t// Manually trigger click for Enter/Space — needed because JSDOM does not\n\t\t\t\t// fire native click events from keyboard, and some custom scroll containers\n\t\t\t\t// suppress the default browser behaviour.\n\t\t\t\tif ((e.key === \"Enter\" || e.key === \" \") && onClick) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t(e.currentTarget as HTMLButtonElement).click();\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(e);\n\t\t\t},\n\t\t\t[loading, onClick, onKeyDown],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={isToggle ? isSelected : undefined}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t\taria-disabled={loading || restProps.disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={onPointerDown}\n\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\tstyle={style}\n\t\t\t\t\tanimate={{ borderRadius: animateRadius }}\n\t\t\t\t\twhileTap={{ borderRadius: pressedRadius }}\n\t\t\t\t\ttransition={{ borderRadius: SPRING_TRANSITION_FAST }}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tbaseIconButtonClasses,\n\t\t\t\t\t\tresolvedColorClass,\n\t\t\t\t\t\toutlineWidthClass,\n\t\t\t\t\t\tdisabledBgClass,\n\t\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\tSIZE_STYLES[size],\n\t\t\t\t\t\tloading && \"pointer-events-none opacity-75 cursor-not-allowed\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{/* Extended 48dp touch target for xs/sm (WCAG 2.5.5) */}\n\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t<AnimatePresence mode=\"wait\" initial={false}>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"loading\"\n\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0\",\n\t\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={\n\t\t\t\t\t\t\t\t\tisCustomSize\n\t\t\t\t\t\t\t\t\t\t? { width: `${iconSize}px`, height: `${iconSize}px` }\n\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{loadingVariant === \"loading-indicator\" ? (\n\t\t\t\t\t\t\t\t\t<LoadingIndicator\n\t\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<ProgressIndicator\n\t\t\t\t\t\t\t\t\t\tvariant=\"circular\"\n\t\t\t\t\t\t\t\t\t\tsize={typeof iconPx === \"number\" ? iconPx : defaultIconPx}\n\t\t\t\t\t\t\t\t\t\tcolor=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\ttrackColor=\"transparent\"\n\t\t\t\t\t\t\t\t\t\taria-label=\"Loading\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<m.span\n\t\t\t\t\t\t\t\tkey=\"content\"\n\t\t\t\t\t\t\t\t{...ICON_SPAN_VARIANTS}\n\t\t\t\t\t\t\t\ttransition={SPRING_TRANSITION}\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex items-center justify-center shrink-0 [&_svg]:w-full [&_svg]:h-full [&_.md-icon]:text-[length:inherit]!\",\n\t\t\t\t\t\t\t\t\ticonSize != null ? undefined : iconClass,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontSize: typeof iconPx === \"number\" ? `${iconPx}px` : iconPx,\n\t\t\t\t\t\t\t\t\twidth: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\t\theight: isCustomSize ? `${iconSize}px` : undefined,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t</m.span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nIconButtonComponent.displayName = \"IconButton\";\n\n/**\n * MD3 Expressive Icon Button.\n *\n * An icon-only button with spring shape morphing, ripple effect, loading state support,\n * and an optional toggle variant. Compliant with MD3 Expressive sizing and WCAG 2.5.5\n * (touch target minimum for XS and SM sizes).\n *\n * @remarks\n * - `aria-label` is **required** — icon buttons have no visible text label.\n * - `variant=\"toggle\"` requires `selected: boolean`.\n * - Touch target is automatically extended to 48dp for `xs` and `sm` sizes.\n *\n * @example\n * ```tsx\n * <IconButton aria-label=\"Close\" onClick={handleClose}>\n * <XIcon />\n * </IconButton>\n *\n * <IconButton\n * variant=\"toggle\"\n * selected={isBookmarked}\n * aria-label={isBookmarked ? \"Remove bookmark\" : \"Bookmark\"}\n * colorStyle=\"filled\"\n * onClick={toggleBookmark}\n * >\n * <BookmarkIcon />\n * </IconButton>\n * ```\n *\n * @see https://m3.material.io/components/icon-buttons/overview\n */\nexport const IconButton = React.memo(IconButtonComponent);\n","import * as React from \"react\";\nimport type { SplitButtonSize, SplitButtonVariant } from \"./split-button-types\";\n\nexport interface SplitButtonContextValue {\n\tsize?: SplitButtonSize;\n\tvariant?: SplitButtonVariant;\n}\n\nexport const SplitButtonContext =\n\tReact.createContext<SplitButtonContextValue | null>(null);\n\nexport function useSplitButtonContext() {\n\treturn React.useContext(SplitButtonContext);\n}\n","import * as React from \"react\";\n\nimport { cn } from \"../../../lib/utils\";\nimport { SplitButtonContext } from \"./split-button-context\";\nimport type {\n\tSplitButtonLayoutProps,\n\tSplitButtonSize,\n\tSplitButtonVariant,\n} from \"./split-button-types\";\n\n/**\n * SplitButtonLayout renders a split button group consisting of a leading\n * action button and a trailing menu toggle button.\n *\n * @example\n * <SplitButtonLayout\n * leadingButton={<SplitButtonLeading onClick={handleSave}>Save</SplitButtonLeading>}\n * trailingButton={\n * <SplitButtonTrailing\n * checked={open}\n * onCheckedChange={setOpen}\n * aria-label=\"More save options\"\n * />\n * }\n * />\n */\nconst SplitButtonLayoutComponent = React.forwardRef<\n\tHTMLDivElement,\n\tSplitButtonLayoutProps\n>(\n\t(\n\t\t{\n\t\t\tleadingButton,\n\t\t\ttrailingButton,\n\t\t\tclassName,\n\t\t\tspacing = 2,\n\t\t\tvariant: layoutVariant,\n\t\t\tsize: layoutSize,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\t// Extract size and variant from the leading button props\n\t\tconst leadingProps = React.isValidElement<{\n\t\t\tsize?: SplitButtonSize;\n\t\t\tvariant?: SplitButtonVariant;\n\t\t}>(leadingButton)\n\t\t\t? leadingButton.props\n\t\t\t: {};\n\n\t\tconst size = layoutSize || leadingProps.size;\n\t\tconst variant = layoutVariant || leadingProps.variant;\n\n\t\tconst contextValue = React.useMemo(\n\t\t\t() => ({\n\t\t\t\tsize,\n\t\t\t\tvariant,\n\t\t\t}),\n\t\t\t[size, variant],\n\t\t);\n\n\t\treturn (\n\t\t\t<SplitButtonContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"inline-flex flex-row items-stretch justify-center w-fit shrink-0 relative\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{ gap: `${spacing}px` }}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{leadingButton}\n\t\t\t\t\t{trailingButton}\n\t\t\t\t</div>\n\t\t\t</SplitButtonContext.Provider>\n\t\t);\n\t},\n);\n\nSplitButtonLayoutComponent.displayName = \"SplitButtonLayout\";\n\nexport const SplitButtonLayout = React.memo(SplitButtonLayoutComponent);\n","import { domMax, type HTMLMotionProps, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface StateLayerProps extends HTMLMotionProps<\"div\"> {\n\thovered?: boolean;\n\tfocused?: boolean;\n\tpressed?: boolean;\n}\n\n/**\n * StateLayer provides a standardized visual overlay for interactive states (hover, focus, pressed)\n * following MD3 specifications.\n */\nexport const StateLayer = React.forwardRef<HTMLDivElement, StateLayerProps>(\n\t({ className, hovered, focused, pressed, ...props }, ref) => {\n\t\t// Determine opacity based on MD3 specs\n\t\tlet opacity = 0;\n\t\tif (pressed) {\n\t\t\topacity = 0.12;\n\t\t} else if (focused) {\n\t\t\topacity = 0.1;\n\t\t} else if (hovered) {\n\t\t\topacity = 0.08;\n\t\t}\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.div\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-0 bg-current pointer-events-none rounded-[inherit]\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tinitial={false}\n\t\t\t\t\tanimate={{ opacity }}\n\t\t\t\t\ttransition={{ duration: 0.2 }}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nStateLayer.displayName = \"StateLayer\";\n","import { cornerRadius } from \"@bug-on/m3-tokens\";\nimport type { Transition } from \"motion/react\";\nimport { FAST_EFFECTS_SPRING } from \"../../shared/constants\";\nimport type {\n\tSplitButtonSize,\n\tSplitButtonSizeTokens,\n} from \"./split-button-types\";\n\n// Standard (non-expressive) spring for chevron rotation per M3 spec\nexport const SPLIT_BUTTON_CHEVRON_SPRING: Transition = {\n\ttype: \"spring\",\n\tstiffness: 200,\n\tdamping: 20,\n\tmass: 1,\n};\n\n// Use fast effects spring (critically damped, no bounce) for border radius morphing\nexport const SPLIT_BUTTON_RADIUS_SPRING: Transition = FAST_EFFECTS_SPRING;\n\n/**\n * Split Button Tokens (Expressive)\n * Source: SplitButtonXSmallTokens.kt, SplitButtonSmallTokens.kt,\n * SplitButtonMediumTokens.kt, SplitButtonLargeTokens.kt,\n * SplitButtonXLargeTokens.kt (Android/Compose reference)\n */\nexport const SPLIT_BUTTON_TOKENS = {\n\txs: {\n\t\tcontainerHeight: 32, // XSmallTokens: ContainerHeight = 32.0.dp\n\t\tbetweenSpace: 2, // XSmallTokens: BetweenSpace = 2.0.dp\n\t\tinnerCorner: {\n\t\t\tdefault: cornerRadius.extraSmall, // 4dp\n\t\t\thovered: cornerRadius.small, // 8dp\n\t\t\tpressed: cornerRadius.small, // 8dp\n\t\t},\n\t\touterCornerPercent: 50, // XSmallTokens: OuterCornerCornerSizePercent = 50.0f → full pill\n\t\tleadingPadding: {\n\t\t\tstart: 12, // XSmallTokens: LeadingButtonLeadingSpace = 12.0.dp\n\t\t\tend: 10, // XSmallTokens: LeadingButtonTrailingSpace = 10.0.dp\n\t\t},\n\t\ttrailingPadding: {\n\t\t\tstart: 13, // XSmallTokens: TrailingButtonLeadingSpace = 13.0.dp\n\t\t\tend: 13, // XSmallTokens: TrailingButtonTrailingSpace = 13.0.dp\n\t\t},\n\t\ttrailingIconSize: 22, // XSmallTokens: TrailingIconSize = 22.0.dp\n\t\topticalCenterOffset: -1, // Spec: XS = -1dp from center\n\t},\n\tsm: {\n\t\tcontainerHeight: 40, // SmallTokens: ContainerHeight = 40.0.dp\n\t\tbetweenSpace: 2, // SmallTokens: BetweenSpace = 2.0.dp\n\t\tinnerCorner: {\n\t\t\tdefault: cornerRadius.extraSmall, // 4dp\n\t\t\thovered: cornerRadius.medium, // 12dp\n\t\t\tpressed: cornerRadius.medium, // 12dp\n\t\t},\n\t\touterCornerPercent: 50,\n\t\tleadingPadding: {\n\t\t\tstart: 16, // SmallTokens: LeadingButtonLeadingSpace = 16.0.dp\n\t\t\tend: 12, // SmallTokens: LeadingButtonTrailingSpace = 12.0.dp\n\t\t},\n\t\ttrailingPadding: {\n\t\t\tstart: 13, // SmallTokens: TrailingButtonLeadingSpace = 13.0.dp\n\t\t\tend: 13, // SmallTokens: TrailingButtonTrailingSpace = 13.0.dp\n\t\t},\n\t\ttrailingIconSize: 22, // SmallTokens: TrailingIconSize = 22.0.dp\n\t\topticalCenterOffset: -1, // Spec: S = -1dp from center\n\t},\n\tmd: {\n\t\tcontainerHeight: 56, // MediumTokens: ContainerHeight = 56.0.dp\n\t\tbetweenSpace: 2, // MediumTokens: BetweenSpace = 2.0.dp\n\t\tinnerCorner: {\n\t\t\tdefault: cornerRadius.extraSmall, // 4dp\n\t\t\thovered: cornerRadius.medium, // 12dp\n\t\t\tpressed: cornerRadius.medium, // 12dp\n\t\t},\n\t\touterCornerPercent: 50,\n\t\tleadingPadding: {\n\t\t\tstart: 24, // MediumTokens: LeadingButtonLeadingSpace = 24.0.dp\n\t\t\tend: 24, // MediumTokens: LeadingButtonTrailingSpace = 24.0.dp\n\t\t},\n\t\ttrailingPadding: {\n\t\t\tstart: 15, // MediumTokens: TrailingButtonLeadingSpace = 15.0.dp\n\t\t\tend: 15, // MediumTokens: TrailingButtonTrailingSpace = 15.0.dp\n\t\t},\n\t\ttrailingIconSize: 26, // MediumTokens: TrailingIconSize = 26.0.dp\n\t\topticalCenterOffset: -2, // Spec: M = -2dp from center\n\t},\n\tlg: {\n\t\tcontainerHeight: 96, // LargeTokens: ContainerHeight = 96.0.dp\n\t\tbetweenSpace: 2, // LargeTokens: BetweenSpace = 2.0.dp\n\t\tinnerCorner: {\n\t\t\tdefault: cornerRadius.small, // 8dp\n\t\t\thovered: 28, // LargeTokens: InnerHoveredCornerCornerSize = CornerValueLargeIncreased (28dp)\n\t\t\tpressed: 28, // LargeTokens: InnerPressedCornerCornerSize = CornerValueLargeIncreased (28dp)\n\t\t},\n\t\touterCornerPercent: 50,\n\t\tleadingPadding: {\n\t\t\tstart: 48, // LargeTokens: LeadingButtonLeadingSpace = 48.0.dp\n\t\t\tend: 48, // LargeTokens: LeadingButtonTrailingSpace = 48.0.dp\n\t\t},\n\t\ttrailingPadding: {\n\t\t\tstart: 29, // LargeTokens: TrailingButtonLeadingSpace = 29.0.dp\n\t\t\tend: 29, // LargeTokens: TrailingButtonTrailingSpace = 29.0.dp\n\t\t},\n\t\ttrailingIconSize: 38, // LargeTokens: TrailingIconSize = 38.0.dp\n\t\topticalCenterOffset: -3, // Spec: L = -3dp from center\n\t},\n\txl: {\n\t\tcontainerHeight: 136, // XLargeTokens: ContainerHeight = 136.0.dp\n\t\tbetweenSpace: 2, // XLargeTokens: BetweenSpace = 2.0.dp\n\t\tinnerCorner: {\n\t\t\tdefault: cornerRadius.medium, // 12dp\n\t\t\thovered: 28, // XLargeTokens: InnerHoveredCornerCornerSize = CornerValueLargeIncreased (28dp)\n\t\t\tpressed: 28, // XLargeTokens: InnerPressedCornerCornerSize = CornerValueLargeIncreased (28dp)\n\t\t},\n\t\touterCornerPercent: 50,\n\t\tleadingPadding: {\n\t\t\tstart: 64, // XLargeTokens: LeadingButtonLeadingSpace = 64.0.dp\n\t\t\tend: 64, // XLargeTokens: LeadingButtonTrailingSpace = 64.0.dp\n\t\t},\n\t\ttrailingPadding: {\n\t\t\tstart: 43, // XLargeTokens: TrailingButtonLeadingSpace = 43.0.dp\n\t\t\tend: 43, // XLargeTokens: TrailingButtonTrailingSpace = 43.0.dp\n\t\t},\n\t\ttrailingIconSize: 50, // XLargeTokens: TrailingIconSize = 50.0.dp\n\t\topticalCenterOffset: -6, // Spec: XL = -6dp from center\n\t},\n} as const satisfies Record<SplitButtonSize, SplitButtonSizeTokens>;\n\n/**\n * Leading icon size per size variant.\n * From Compose ButtonDefaults.iconSizeFor logic.\n */\nexport const LEADING_ICON_SIZE_FOR_SIZE = {\n\txs: 18,\n\tsm: 20,\n\tmd: 24,\n\tlg: 32,\n\txl: 40,\n} as const;\n","import { cva } from \"class-variance-authority\";\n\n/**\n * Size variants for the Split Button components.\n * These map to the MD3 Expressive container heights.\n */\nconst splitButtonSizeVariants = {\n\txs: \"min-h-[32px]\",\n\tsm: \"min-h-[40px]\",\n\tmd: \"min-h-[56px]\",\n\tlg: \"min-h-[96px]\",\n\txl: \"min-h-[136px]\",\n};\n\n/**\n * Color variants for the Split Button components using CVA.\n */\nexport const splitButtonVariants = cva(\n\t\"group relative w-fit shrink-0 inline-flex flex-row items-center justify-center whitespace-nowrap select-none cursor-pointer transition-[background-color,color,border-color,box-shadow,opacity,filter] duration-200 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-m3-primary z-10 overflow-hidden\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tfilled: \"bg-m3-primary text-m3-on-primary\",\n\t\t\t\ttonal: \"bg-m3-secondary-container text-m3-on-secondary-container\",\n\t\t\t\televated:\n\t\t\t\t\t\"bg-m3-surface-container-low text-m3-primary shadow-md hover:shadow-lg\",\n\t\t\t\toutlined: \"bg-transparent text-m3-primary border border-m3-outline\",\n\t\t\t},\n\t\t\tsize: splitButtonSizeVariants,\n\t\t\tdisabled: {\n\t\t\t\ttrue: \"pointer-events-none\",\n\t\t\t\tfalse: \"\",\n\t\t\t},\n\t\t},\n\t\tcompoundVariants: [\n\t\t\t{\n\t\t\t\tvariant: \"filled\",\n\t\t\t\tdisabled: true,\n\t\t\t\tclassName: \"bg-m3-on-surface/10 text-m3-on-surface/[0.38]\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: \"tonal\",\n\t\t\t\tdisabled: true,\n\t\t\t\tclassName: \"bg-m3-on-surface/10 text-m3-on-surface/[0.38]\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: \"elevated\",\n\t\t\t\tdisabled: true,\n\t\t\t\tclassName: \"bg-m3-on-surface/10 text-m3-on-surface/[0.38] shadow-none\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tvariant: \"outlined\",\n\t\t\t\tdisabled: true,\n\t\t\t\tclassName: \"text-m3-on-surface/[0.38] border-m3-on-surface/[0.12]\",\n\t\t\t},\n\t\t],\n\t\tdefaultVariants: {\n\t\t\tvariant: \"filled\",\n\t\t\tsize: \"sm\",\n\t\t\tdisabled: false,\n\t\t},\n\t},\n);\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport { StateLayer } from \"../../shared/state-layer\";\nimport { TouchTarget } from \"../../shared/touch-target\";\nimport { BUTTON_TYPOGRAPHY_TOKENS } from \"../button/button-tokens\";\nimport { useSplitButtonContext } from \"./split-button-context\";\nimport {\n\tLEADING_ICON_SIZE_FOR_SIZE,\n\tSPLIT_BUTTON_RADIUS_SPRING,\n\tSPLIT_BUTTON_TOKENS,\n} from \"./split-button-tokens\";\nimport type { SplitButtonLeadingProps } from \"./split-button-types\";\nimport { splitButtonVariants } from \"./split-button-variants\";\n\nconst SplitButtonLeadingComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tSplitButtonLeadingProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"filled\",\n\t\t\tsize = \"sm\",\n\t\t\ticon,\n\t\t\tchildren,\n\t\t\tdisabled,\n\t\t\tonClick,\n\t\t\tonPointerDown,\n\t\t\tonPointerUp,\n\t\t\tonPointerLeave,\n\t\t\tonPointerCancel,\n\t\t\tonFocus,\n\t\t\tonBlur,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useSplitButtonContext();\n\t\tconst actualSize = context?.size ?? size;\n\t\tconst actualVariant = context?.variant ?? variant;\n\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst [isFocused, setIsFocused] = React.useState(false);\n\t\tconst [isPressed, setIsPressed] = React.useState(false);\n\n\t\tconst tokens = SPLIT_BUTTON_TOKENS[actualSize];\n\t\tconst typographyClass =\n\t\t\tBUTTON_TYPOGRAPHY_TOKENS[actualSize] ?? BUTTON_TYPOGRAPHY_TOKENS.sm;\n\n\t\tconst needsTouchTarget = actualSize === \"xs\" || actualSize === \"sm\";\n\n\t\tconst {\n\t\t\tripples,\n\t\t\tonPointerDown: onRipplePointerDown,\n\t\t\tremoveRipple,\n\t\t} = useRippleState({ disabled });\n\n\t\tconst innerCornerRadius =\n\t\t\tisPressed || isFocused\n\t\t\t\t? tokens.innerCorner.pressed\n\t\t\t\t: isHovered\n\t\t\t\t\t? tokens.innerCorner.hovered\n\t\t\t\t\t: tokens.innerCorner.default;\n\n\t\t// Outer corner is always a full pill (50% of height)\n\t\tconst outerRadius =\n\t\t\t(tokens.containerHeight * tokens.outerCornerPercent) / 100;\n\n\t\t// Format: TL TR BR BL\n\t\t// Left outer corners are fully rounded, right inner corners animate\n\t\tconst borderRadius = `${outerRadius}px ${innerCornerRadius}px ${innerCornerRadius}px ${outerRadius}px`;\n\n\t\tconst handleClick = React.useCallback(\n\t\t\t(e: React.MouseEvent<HTMLButtonElement>) => {\n\t\t\t\tif (disabled) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(e);\n\t\t\t},\n\t\t\t[disabled, onClick],\n\t\t);\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tonRipplePointerDown(e);\n\t\t\t\tsetIsPressed(true);\n\t\t\t\tonPointerDown?.(e);\n\t\t\t},\n\t\t\t[onRipplePointerDown, onPointerDown],\n\t\t);\n\n\t\tconst handlePointerUp = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerUp?.(e);\n\t\t\t},\n\t\t\t[onPointerUp],\n\t\t);\n\n\t\tconst handlePointerEnter = React.useCallback(() => {\n\t\t\tif (!disabled) {\n\t\t\t\tsetIsHovered(true);\n\t\t\t}\n\t\t}, [disabled]);\n\n\t\tconst handlePointerLeave = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsHovered(false);\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerLeave?.(e);\n\t\t\t},\n\t\t\t[onPointerLeave],\n\t\t);\n\n\t\tconst handlePointerCancel = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerCancel?.(e);\n\t\t\t},\n\t\t\t[onPointerCancel],\n\t\t);\n\n\t\tconst handleFocus = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLButtonElement>) => {\n\t\t\t\tif (!disabled) setIsFocused(true);\n\t\t\t\tonFocus?.(e);\n\t\t\t},\n\t\t\t[disabled, onFocus],\n\t\t);\n\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsFocused(false);\n\t\t\t\tonBlur?.(e);\n\t\t\t},\n\t\t\t[onBlur],\n\t\t);\n\n\t\tconst leadingIconSize = LEADING_ICON_SIZE_FOR_SIZE[actualSize];\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-disabled={disabled}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\t\tonPointerCancel={handlePointerCancel}\n\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tanimate={{ borderRadius }}\n\t\t\t\t\ttransition={SPLIT_BUTTON_RADIUS_SPRING}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpaddingInlineStart: tokens.leadingPadding.start,\n\t\t\t\t\t\tpaddingInlineEnd: tokens.leadingPadding.end,\n\t\t\t\t\t\tgap: \"8px\",\n\t\t\t\t\t\t...style,\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tsplitButtonVariants({\n\t\t\t\t\t\t\tvariant: actualVariant,\n\t\t\t\t\t\t\tsize: actualSize,\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttypographyClass,\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\t\t\t\t\t<StateLayer\n\t\t\t\t\t\thovered={isHovered}\n\t\t\t\t\t\tfocused={isFocused}\n\t\t\t\t\t\tpressed={isPressed}\n\t\t\t\t\t/>\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t{icon && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0 [&>svg]:w-full [&>svg]:h-full overflow-hidden [&_.md-icon]:text-[length:inherit]!\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontSize: leadingIconSize,\n\t\t\t\t\t\t\t\twidth: leadingIconSize,\n\t\t\t\t\t\t\t\theight: leadingIconSize,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{children && (\n\t\t\t\t\t\t<span className=\"inline-flex items-center h-full gap-[inherit]\">\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nSplitButtonLeadingComponent.displayName = \"SplitButtonLeading\";\n\nexport const SplitButtonLeading = React.memo(SplitButtonLeadingComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Preset Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const FilledSplitButtonLeading = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonLeadingProps, \"variant\">\n>((props, ref) => <SplitButtonLeading ref={ref} variant=\"filled\" {...props} />);\nFilledSplitButtonLeading.displayName = \"FilledSplitButtonLeading\";\n\nexport const TonalSplitButtonLeading = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonLeadingProps, \"variant\">\n>((props, ref) => <SplitButtonLeading ref={ref} variant=\"tonal\" {...props} />);\nTonalSplitButtonLeading.displayName = \"TonalSplitButtonLeading\";\n\nexport const ElevatedSplitButtonLeading = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonLeadingProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonLeading ref={ref} variant=\"elevated\" {...props} />\n));\nElevatedSplitButtonLeading.displayName = \"ElevatedSplitButtonLeading\";\n\nexport const OutlinedSplitButtonLeading = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonLeadingProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonLeading ref={ref} variant=\"outlined\" {...props} />\n));\nOutlinedSplitButtonLeading.displayName = \"OutlinedSplitButtonLeading\";\n","import { domMax, LazyMotion, m, useReducedMotion } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Icon } from \"../../icon\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport { StateLayer } from \"../../shared/state-layer\";\nimport { TouchTarget } from \"../../shared/touch-target\";\nimport { useSplitButtonContext } from \"./split-button-context\";\nimport {\n\tSPLIT_BUTTON_CHEVRON_SPRING,\n\tSPLIT_BUTTON_RADIUS_SPRING,\n\tSPLIT_BUTTON_TOKENS,\n} from \"./split-button-tokens\";\nimport type { SplitButtonTrailingProps } from \"./split-button-types\";\nimport { splitButtonVariants } from \"./split-button-variants\";\n\nconst SplitButtonTrailingComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tSplitButtonTrailingProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"filled\",\n\t\t\tsize = \"sm\",\n\t\t\tchecked,\n\t\t\tonCheckedChange,\n\t\t\ticon,\n\t\t\tdisabled,\n\t\t\tonPointerDown,\n\t\t\tonPointerUp,\n\t\t\tonPointerLeave,\n\t\t\tonPointerCancel,\n\t\t\tonFocus,\n\t\t\tonBlur,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useSplitButtonContext();\n\t\tconst actualSize = context?.size ?? size;\n\t\tconst actualVariant = context?.variant ?? variant;\n\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst [isFocused, setIsFocused] = React.useState(false);\n\t\tconst [isPressed, setIsPressed] = React.useState(false);\n\n\t\tconst tokens = SPLIT_BUTTON_TOKENS[actualSize];\n\t\tconst prefersReducedMotion = useReducedMotion();\n\t\tconst needsTouchTarget = actualSize === \"xs\" || actualSize === \"sm\";\n\n\t\tconst {\n\t\t\tripples,\n\t\t\tonPointerDown: onRipplePointerDown,\n\t\t\tremoveRipple,\n\t\t} = useRippleState({ disabled });\n\n\t\tconst innerCornerRadius =\n\t\t\tisPressed || isFocused\n\t\t\t\t? tokens.innerCorner.pressed\n\t\t\t\t: isHovered\n\t\t\t\t\t? tokens.innerCorner.hovered\n\t\t\t\t\t: tokens.innerCorner.default;\n\n\t\tconst outerRadius =\n\t\t\t(tokens.containerHeight * tokens.outerCornerPercent) / 100;\n\n\t\t// Format: TL TR BR BL\n\t\t// If checked (menu open), it morphs into a full circle (pill)\n\t\t// If unchecked, the left inner corners are animated, right outer are pill\n\t\tconst borderRadius = checked\n\t\t\t? `${outerRadius}px ${outerRadius}px ${outerRadius}px ${outerRadius}px`\n\t\t\t: `${innerCornerRadius}px ${outerRadius}px ${outerRadius}px ${innerCornerRadius}px`;\n\n\t\tconst handleToggle = React.useCallback(() => {\n\t\t\tif (!disabled) {\n\t\t\t\tonCheckedChange(!checked);\n\t\t\t}\n\t\t}, [disabled, checked, onCheckedChange]);\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tonRipplePointerDown(e);\n\t\t\t\tsetIsPressed(true);\n\t\t\t\tonPointerDown?.(e);\n\t\t\t},\n\t\t\t[onRipplePointerDown, onPointerDown],\n\t\t);\n\n\t\tconst handlePointerUp = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerUp?.(e);\n\t\t\t},\n\t\t\t[onPointerUp],\n\t\t);\n\n\t\tconst handlePointerEnter = React.useCallback(() => {\n\t\t\tif (!disabled) {\n\t\t\t\tsetIsHovered(true);\n\t\t\t}\n\t\t}, [disabled]);\n\n\t\tconst handlePointerLeave = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsHovered(false);\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerLeave?.(e);\n\t\t\t},\n\t\t\t[onPointerLeave],\n\t\t);\n\n\t\tconst handlePointerCancel = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerCancel?.(e);\n\t\t\t},\n\t\t\t[onPointerCancel],\n\t\t);\n\n\t\tconst handleFocus = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLButtonElement>) => {\n\t\t\t\tif (!disabled) setIsFocused(true);\n\t\t\t\tonFocus?.(e);\n\t\t\t},\n\t\t\t[disabled, onFocus],\n\t\t);\n\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsFocused(false);\n\t\t\t\tonBlur?.(e);\n\t\t\t},\n\t\t\t[onBlur],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-pressed={checked}\n\t\t\t\t\taria-expanded={checked}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={handleToggle}\n\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\t\tonPointerCancel={handlePointerCancel}\n\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tanimate={{ borderRadius }}\n\t\t\t\t\ttransition={SPLIT_BUTTON_RADIUS_SPRING}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpaddingInlineStart: tokens.trailingPadding.start,\n\t\t\t\t\t\tpaddingInlineEnd: tokens.trailingPadding.end,\n\t\t\t\t\t\t...style,\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tsplitButtonVariants({\n\t\t\t\t\t\t\tvariant: actualVariant,\n\t\t\t\t\t\t\tsize: actualSize,\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\t\t\t\t\t<StateLayer\n\t\t\t\t\t\thovered={isHovered}\n\t\t\t\t\t\tfocused={isFocused}\n\t\t\t\t\t\tpressed={isPressed}\n\t\t\t\t\t/>\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tanimate={{\n\t\t\t\t\t\t\trotate: checked ? 180 : 0,\n\t\t\t\t\t\t\tx: checked ? 0 : tokens.opticalCenterOffset,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ttransition={\n\t\t\t\t\t\t\tprefersReducedMotion\n\t\t\t\t\t\t\t\t? { duration: 0 }\n\t\t\t\t\t\t\t\t: SPLIT_BUTTON_CHEVRON_SPRING\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon ?? (\n\t\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\t\tname=\"arrow_drop_down\"\n\t\t\t\t\t\t\t\tsize={tokens.trailingIconSize}\n\t\t\t\t\t\t\t\topticalSize={24}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</m.div>\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nSplitButtonTrailingComponent.displayName = \"SplitButtonTrailing\";\n\nexport const SplitButtonTrailing = React.memo(SplitButtonTrailingComponent);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Preset Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const FilledSplitButtonTrailing = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailing ref={ref} variant=\"filled\" {...props} />\n));\nFilledSplitButtonTrailing.displayName = \"FilledSplitButtonTrailing\";\n\nexport const TonalSplitButtonTrailing = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingProps, \"variant\">\n>((props, ref) => <SplitButtonTrailing ref={ref} variant=\"tonal\" {...props} />);\nTonalSplitButtonTrailing.displayName = \"TonalSplitButtonTrailing\";\n\nexport const ElevatedSplitButtonTrailing = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailing ref={ref} variant=\"elevated\" {...props} />\n));\nElevatedSplitButtonTrailing.displayName = \"ElevatedSplitButtonTrailing\";\n\nexport const OutlinedSplitButtonTrailing = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailing ref={ref} variant=\"outlined\" {...props} />\n));\nOutlinedSplitButtonTrailing.displayName = \"OutlinedSplitButtonTrailing\";\n","import { domMax, LazyMotion, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { Ripple, useRippleState } from \"../../ripple\";\nimport { StateLayer } from \"../../shared/state-layer\";\nimport { TouchTarget } from \"../../shared/touch-target\";\nimport { useSplitButtonContext } from \"./split-button-context\";\nimport {\n\tSPLIT_BUTTON_RADIUS_SPRING,\n\tSPLIT_BUTTON_TOKENS,\n} from \"./split-button-tokens\";\nimport type { SplitButtonTrailingUncheckableProps } from \"./split-button-types\";\nimport { splitButtonVariants } from \"./split-button-variants\";\n\nconst SplitButtonTrailingUncheckableComponent = React.forwardRef<\n\tHTMLButtonElement,\n\tSplitButtonTrailingUncheckableProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\tvariant = \"filled\",\n\t\t\tsize = \"sm\",\n\t\t\ticon,\n\t\t\tdisabled,\n\t\t\tonClick,\n\t\t\tonPointerDown,\n\t\t\tonPointerUp,\n\t\t\tonPointerLeave,\n\t\t\tonPointerCancel,\n\t\t\tonFocus,\n\t\t\tonBlur,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...restProps\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst context = useSplitButtonContext();\n\t\tconst actualSize = context?.size ?? size;\n\t\tconst actualVariant = context?.variant ?? variant;\n\n\t\tconst [isHovered, setIsHovered] = React.useState(false);\n\t\tconst [isFocused, setIsFocused] = React.useState(false);\n\t\tconst [isPressed, setIsPressed] = React.useState(false);\n\n\t\tconst tokens = SPLIT_BUTTON_TOKENS[actualSize];\n\t\tconst needsTouchTarget = actualSize === \"xs\" || actualSize === \"sm\";\n\n\t\tconst {\n\t\t\tripples,\n\t\t\tonPointerDown: onRipplePointerDown,\n\t\t\tremoveRipple,\n\t\t} = useRippleState({ disabled });\n\n\t\tconst innerCornerRadius =\n\t\t\tisPressed || isFocused\n\t\t\t\t? tokens.innerCorner.pressed\n\t\t\t\t: isHovered\n\t\t\t\t\t? tokens.innerCorner.hovered\n\t\t\t\t\t: tokens.innerCorner.default;\n\n\t\tconst outerRadius =\n\t\t\t(tokens.containerHeight * tokens.outerCornerPercent) / 100;\n\n\t\t// Uncheckable variant always has the asymmetric shape\n\t\tconst borderRadius = `${innerCornerRadius}px ${outerRadius}px ${outerRadius}px ${innerCornerRadius}px`;\n\n\t\tconst handlePointerDown = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tonRipplePointerDown(e);\n\t\t\t\tsetIsPressed(true);\n\t\t\t\tonPointerDown?.(e);\n\t\t\t},\n\t\t\t[onRipplePointerDown, onPointerDown],\n\t\t);\n\n\t\tconst handlePointerUp = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerUp?.(e);\n\t\t\t},\n\t\t\t[onPointerUp],\n\t\t);\n\n\t\tconst handlePointerEnter = React.useCallback(() => {\n\t\t\tif (!disabled) {\n\t\t\t\tsetIsHovered(true);\n\t\t\t}\n\t\t}, [disabled]);\n\n\t\tconst handlePointerLeave = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsHovered(false);\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerLeave?.(e);\n\t\t\t},\n\t\t\t[onPointerLeave],\n\t\t);\n\n\t\tconst handlePointerCancel = React.useCallback(\n\t\t\t(e: React.PointerEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsPressed(false);\n\t\t\t\tonPointerCancel?.(e);\n\t\t\t},\n\t\t\t[onPointerCancel],\n\t\t);\n\n\t\tconst handleFocus = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLButtonElement>) => {\n\t\t\t\tif (!disabled) setIsFocused(true);\n\t\t\t\tonFocus?.(e);\n\t\t\t},\n\t\t\t[disabled, onFocus],\n\t\t);\n\n\t\tconst handleBlur = React.useCallback(\n\t\t\t(e: React.FocusEvent<HTMLButtonElement>) => {\n\t\t\t\tsetIsFocused(false);\n\t\t\t\tonBlur?.(e);\n\t\t\t},\n\t\t\t[onBlur],\n\t\t);\n\n\t\treturn (\n\t\t\t<LazyMotion features={domMax} strict>\n\t\t\t\t<m.button\n\t\t\t\t\tref={ref}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={onClick}\n\t\t\t\t\tonPointerDown={handlePointerDown}\n\t\t\t\t\tonPointerUp={handlePointerUp}\n\t\t\t\t\tonPointerEnter={handlePointerEnter}\n\t\t\t\t\tonPointerLeave={handlePointerLeave}\n\t\t\t\t\tonPointerCancel={handlePointerCancel}\n\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\tonBlur={handleBlur}\n\t\t\t\t\tanimate={{ borderRadius }}\n\t\t\t\t\ttransition={SPLIT_BUTTON_RADIUS_SPRING}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tpaddingInlineStart: tokens.trailingPadding.start,\n\t\t\t\t\t\tpaddingInlineEnd: tokens.trailingPadding.end,\n\t\t\t\t\t\t...style,\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tsplitButtonVariants({\n\t\t\t\t\t\t\tvariant: actualVariant,\n\t\t\t\t\t\t\tsize: actualSize,\n\t\t\t\t\t\t\tdisabled,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...restProps}\n\t\t\t\t>\n\t\t\t\t\t{needsTouchTarget && <TouchTarget />}\n\t\t\t\t\t<StateLayer\n\t\t\t\t\t\thovered={isHovered}\n\t\t\t\t\t\tfocused={isFocused}\n\t\t\t\t\t\tpressed={isPressed}\n\t\t\t\t\t/>\n\t\t\t\t\t<Ripple ripples={ripples} onRippleDone={removeRipple} />\n\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tanimate={{ x: tokens.opticalCenterOffset }}\n\t\t\t\t\t\ttransition={SPLIT_BUTTON_RADIUS_SPRING}\n\t\t\t\t\t\tclassName=\"flex items-center justify-center shrink-0 [&>svg]:w-full [&>svg]:h-full\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: tokens.trailingIconSize,\n\t\t\t\t\t\t\theight: tokens.trailingIconSize,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</m.div>\n\t\t\t\t</m.button>\n\t\t\t</LazyMotion>\n\t\t);\n\t},\n);\n\nSplitButtonTrailingUncheckableComponent.displayName =\n\t\"SplitButtonTrailingUncheckable\";\n\nexport const SplitButtonTrailingUncheckable = React.memo(\n\tSplitButtonTrailingUncheckableComponent,\n);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Preset Components\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const FilledSplitButtonTrailingUncheckable = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingUncheckableProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailingUncheckable ref={ref} variant=\"filled\" {...props} />\n));\nFilledSplitButtonTrailingUncheckable.displayName =\n\t\"FilledSplitButtonTrailingUncheckable\";\n\nexport const TonalSplitButtonTrailingUncheckable = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingUncheckableProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailingUncheckable ref={ref} variant=\"tonal\" {...props} />\n));\nTonalSplitButtonTrailingUncheckable.displayName =\n\t\"TonalSplitButtonTrailingUncheckable\";\n\nexport const ElevatedSplitButtonTrailingUncheckable = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingUncheckableProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailingUncheckable ref={ref} variant=\"elevated\" {...props} />\n));\nElevatedSplitButtonTrailingUncheckable.displayName =\n\t\"ElevatedSplitButtonTrailingUncheckable\";\n\nexport const OutlinedSplitButtonTrailingUncheckable = React.forwardRef<\n\tHTMLButtonElement,\n\tOmit<SplitButtonTrailingUncheckableProps, \"variant\">\n>((props, ref) => (\n\t<SplitButtonTrailingUncheckable ref={ref} variant=\"outlined\" {...props} />\n));\nOutlinedSplitButtonTrailingUncheckable.displayName =\n\t\"OutlinedSplitButtonTrailingUncheckable\";\n"]}