@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/icon-button/icon-button.tsx","../src/ui/icon.tsx","../src/ui/scroll-area.tsx","../src/ui/dialog.tsx","../src/ui/drawer.tsx","../src/ui/sheets/shared/drag-handle.tsx","../src/ui/sheets/shared/utils.ts","../src/ui/sheets/bottom-sheet/use-bottom-sheet.ts","../src/ui/sheets/bottom-sheet/bottom-sheet.tsx","../src/ui/sheets/shared/scrim.tsx","../src/ui/sheets/bottom-sheet/bottom-sheet-modal.tsx","../src/ui/sheets/bottom-sheet/use-bottom-sheet-scaffold.ts","../src/ui/sheets/bottom-sheet/bottom-sheet-scaffold.tsx","../src/ui/sheets/side-sheet/side-sheet.tsx","../src/ui/sheets/side-sheet/side-sheet-modal.tsx"],"names":["React","IndeterminateSvg","DeterminateSvg","React2","jsx","jsxs","React3","React4","FlatLinearTrack","Fragment","m","React5","WavyLinearTrack","LazyMotion","domMax","React7","React8","RippleItem","React9","_a","_b","AnimatePresence","React10","React11","React12","RadixDialog2","React13","React14","useEffect","useState","useRef","useCallback","useMotionValue","viewportHeight","safeAreaOffset","naturalHeight","useMemo","animate","React15","React16","SHEET_ANIM","ABSOLUTE_MAX_HEIGHT","resolveMaxHeight","React17","RadixDialog3","DISMISS_VELOCITY_THRESHOLD","BOUNDARY_DAMPENING_ZONE","React18","React19","createPortal","React20","RadixDialog4"],"mappings":"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","file":"overlays.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","/**\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 { 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","\"use client\";\n\nimport * as RadixScrollArea from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n/** Radix accepts hover/scroll/always/auto. We add 'none' as a UI-only hide. */\nexport type ScrollAreaType = \"hover\" | \"scroll\" | \"always\" | \"none\";\ntype RadixScrollAreaType = \"hover\" | \"scroll\" | \"always\" | \"auto\";\nexport type ScrollAreaOrientation = \"vertical\" | \"horizontal\" | \"both\";\n\nexport interface ScrollAreaProps\n\textends Omit<\n\t\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Root>,\n\t\t\"type\"\n\t> {\n\t/**\n\t * Controls when the scrollbars are visible.\n\t * - `hover`: Show on hover (default, recommended for desktop)\n\t * - `scroll`: Show only while scrolling (recommended for mobile)\n\t * - `always`: Always visible\n\t * - `none`: Never visible\n\t */\n\ttype?: ScrollAreaType;\n\t/**\n\t * The scrollbar orientation to render.\n\t * @default \"vertical\"\n\t */\n\torientation?: ScrollAreaOrientation;\n\t/** Delay in ms before scrollbars hide when `type` is `hover` or `scroll`. */\n\tscrollHideDelay?: number;\n\t/** Extra classes applied to the inner viewport element. */\n\tviewportClassName?: string;\n\t/** Ref to the scrolling viewport element. */\n\tviewportRef?: React.Ref<HTMLDivElement>;\n\t/** Extra props applied to the viewport element. */\n\tviewportProps?: React.ComponentPropsWithoutRef<\n\t\ttypeof RadixScrollArea.Viewport\n\t>;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\nconst ScrollArea = React.forwardRef<\n\tReact.ElementRef<typeof RadixScrollArea.Root>,\n\tScrollAreaProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tviewportClassName,\n\t\t\tchildren,\n\t\t\ttype = \"hover\",\n\t\t\torientation = \"vertical\",\n\t\t\tscrollHideDelay = 600,\n\t\t\tviewportRef,\n\t\t\tviewportProps,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [isTouchDevice, setIsTouchDevice] = React.useState(false);\n\n\t\tReact.useEffect(() => {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tsetIsTouchDevice(\n\t\t\t\t\t\"ontouchstart\" in window || navigator.maxTouchPoints > 0,\n\t\t\t\t);\n\t\t\t}\n\t\t}, []);\n\n\t\tconst resolvedType = React.useMemo(() => {\n\t\t\tif (type === \"hover\" && isTouchDevice) {\n\t\t\t\treturn \"scroll\";\n\t\t\t}\n\t\t\treturn type;\n\t\t}, [type, isTouchDevice]);\n\n\t\tconst radixType: RadixScrollAreaType =\n\t\t\tresolvedType === \"none\" ? \"always\" : resolvedType;\n\n\t\treturn (\n\t\t\t<RadixScrollArea.Root\n\t\t\t\tref={ref}\n\t\t\t\ttype={radixType}\n\t\t\t\tscrollHideDelay={scrollHideDelay}\n\t\t\t\tclassName={cn(\"relative overflow-hidden flex flex-col\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<RadixScrollArea.Viewport\n\t\t\t\t\tref={viewportRef}\n\t\t\t\t\t{...viewportProps}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"h-full w-full flex-1 min-h-0 min-w-0 rounded-[inherit]\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-offset-1\",\n\t\t\t\t\t\tviewportClassName,\n\t\t\t\t\t\tviewportProps?.className,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</RadixScrollArea.Viewport>\n\n\t\t\t\t{(orientation === \"vertical\" || orientation === \"both\") && (\n\t\t\t\t\t<ScrollAreaScrollbar\n\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\tclassName={resolvedType === \"none\" ? \"hidden\" : undefined}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{(orientation === \"horizontal\" || orientation === \"both\") && (\n\t\t\t\t\t<ScrollAreaScrollbar\n\t\t\t\t\t\torientation=\"horizontal\"\n\t\t\t\t\t\tclassName={resolvedType === \"none\" ? \"hidden\" : undefined}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<RadixScrollArea.Corner className=\"bg-m3-surface-container\" />\n\t\t\t</RadixScrollArea.Root>\n\t\t);\n\t},\n);\nScrollArea.displayName = \"ScrollArea\";\n\n// ─── Scrollbar ────────────────────────────────────────────────────────────────\nconst ScrollAreaScrollbar = React.forwardRef<\n\tReact.ElementRef<typeof RadixScrollArea.Scrollbar>,\n\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Scrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n\t<RadixScrollArea.Scrollbar\n\t\tref={ref}\n\t\torientation={orientation}\n\t\tclassName={cn(\n\t\t\t\"flex touch-none select-none transition-all duration-300 ease-in-out\",\n\t\t\t\"absolute z-50\",\n\t\t\torientation === \"vertical\" &&\n\t\t\t\t\"right-0 top-0 bottom-0 w-2.5 border-l border-l-transparent p-px\",\n\t\t\torientation === \"horizontal\" &&\n\t\t\t\t\"bottom-0 left-0 right-0 h-2.5 flex-col border-t border-t-transparent p-px\",\n\t\t\t\"data-[state=hidden]:opacity-0 data-[state=visible]:opacity-100\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t>\n\t\t<RadixScrollArea.Thumb\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex-1 rounded-full bg-m3-on-surface/25 transition-colors duration-200\",\n\t\t\t\t\"hover:bg-m3-on-surface/40 active:bg-m3-on-surface/55\",\n\t\t\t\t\"before:absolute before:left-1/2 before:top-1/2 before:min-h-11 before:min-w-11 before:-translate-x-1/2 before:-translate-y-1/2\",\n\t\t\t)}\n\t\t/>\n\t</RadixScrollArea.Scrollbar>\n));\nScrollAreaScrollbar.displayName = RadixScrollArea.Scrollbar.displayName;\n\n// ─── Corner ───────────────────────────────────────────────────────────────────\nconst ScrollAreaCorner = React.forwardRef<\n\tReact.ComponentRef<typeof RadixScrollArea.Corner>,\n\tReact.ComponentPropsWithoutRef<typeof RadixScrollArea.Corner>\n>(({ className, ...props }, ref) => (\n\t<RadixScrollArea.Corner\n\t\tref={ref}\n\t\tclassName={cn(\"bg-m3-surface-container\", className)}\n\t\t{...props}\n\t/>\n));\nScrollAreaCorner.displayName = \"ScrollAreaCorner\";\n\nexport { ScrollArea, ScrollAreaScrollbar };\n","/**\n * @file dialog.tsx\n *\n * Sub-system Component Dialog theo phong cách hiển thị MD3 Expressive.\n *\n * Được kế thừa trên nền lõi của hệ mã Radix UI Dialog primitives đi kèm gói kén Framer Motion dùng vào việc bổ sung\n * nhip điệu đẩy Spring ở hướng hiện vào (Entrance) cũng như bay lên (Exit); ăn liền với bản thiết kế specs MD3 Expressive siêu quyến rũ.\n * Phục vụ cả ở chế độ Standard (Tiêu chuẩn lọt thỏm) và phiên bản Full-Screen tràn viền toàn diện.\n *\n * @see https://m3.material.io/components/dialogs/overview\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { IconButton } from \"./buttons/icon-button\";\nimport { Icon } from \"./icon\";\nimport { ScrollArea } from \"./scroll-area\";\nimport { DEFAULT_SPATIAL_SPRING } from \"./shared/motion-tokens\";\n\n// ─── MD3 Spring Config (Expressive) ──────────────────────────────────────────\n// MD3 default.spatial: stiffness=380, dampingRatio=0.8 → Framer damping ≈ 31.19\nconst MD3_SPRING = DEFAULT_SPATIAL_SPRING;\n\nconst MD3_OVERLAY_ANIM = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: \"easeOut\" as const },\n\t},\n\texit: { opacity: 0, transition: { duration: 0.15, ease: \"easeIn\" as const } },\n};\n\nconst MD3_CONTENT_ANIM = {\n\tinitial: { opacity: 0, scale: 0.85, y: 24 },\n\tanimate: { opacity: 1, scale: 1, y: 0, transition: MD3_SPRING },\n\texit: {\n\t\topacity: 0,\n\t\tscale: 0.95,\n\t\ty: 8,\n\t\ttransition: { duration: 0.15, ease: \"easeIn\" as const },\n\t},\n};\n\nconst MD3_FULLSCREEN_ANIM = {\n\tinitial: { y: \"100%\" },\n\tanimate: { y: 0, transition: MD3_SPRING },\n\texit: { y: \"100%\", transition: { duration: 0.2, ease: \"easeIn\" as const } },\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Thuộc tính của cội gốc Root `Dialog`. Chức năng làm gương phản hồi của Radix `Dialog.Root` qua dạng controlled state đóng hay mở.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n *\n * <Dialog open={open} onOpenChange={setOpen}>\n * <DialogTrigger asChild>\n * <Button>Bấm Mở Dialog</Button>\n * </DialogTrigger>\n * <DialogContent>\n * <DialogHeader>\n * <DialogTitle>Bạn có muốn phiêu lưu không?</DialogTitle>\n * </DialogHeader>\n * <DialogBody>Chuẩn bị lên đồ rời khỏi hang nào.</DialogBody>\n * <DialogFooter>\n * <Button onClick={() => setOpen(false)} variant=\"text\">Đóng</Button>\n * </DialogFooter>\n * </DialogContent>\n * </Dialog>\n * ```\n */\nexport interface DialogProps {\n\t/** Whether the dialog is open (controlled). Omit for uncontrolled. */\n\topen?: boolean;\n\t/** Called when the open state should change. */\n\tonOpenChange?: (open: boolean) => void;\n\t/** Dialog trigger + content. */\n\tchildren: React.ReactNode;\n}\n\n/**\n * Các props được tiêm vào component bao ngoài Container `DialogContent` thuộc dạng Normal Standard.\n *\n * @see {@link DialogContent}\n */\nexport interface DialogContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Vô hình đi đi nút Close dấu (X) góc phải trên. @default false */\n\thideCloseButton?: boolean;\n\tclassName?: string;\n}\n\n/**\n * Thuộc tính Props của biến thể `DialogFullScreenContent` chuyên dụng dành riêng cho Mode Full-Screen tràn màn hình.\n *\n * @remarks\n * Những hộp thoại Full-screen có biệt tài tự nới rộng và xâm chiếm cả bề ngang dọc nguyên thiết bị. Nó còn thiết lập một đường Top App bar (thanh ngang đỉnh)\n * kẹp chung cả 1 nhãn title mô tả đỉnh, một nút icon X dẹp ở rìa, thêm luôn hẳn cái nút Confirm cực xịn xò.\n *\n * @see {@link DialogFullScreenContent}\n * @see https://m3.material.io/components/dialogs/guidelines#full-screen\n */\nexport interface DialogFullScreenContentProps\n\textends React.ComponentPropsWithoutRef<typeof RadixDialog.Content> {\n\t/** Nhãn Title nằm vùng khu vực thanh ngang Top Bar. */\n\ttitle?: string;\n\t/** Chữ viết đính kèm bên trong cục Nút nhấn thao tác ngay trên góc Top App bar đó (VD: \"Lưu lại\", \"Save\"). */\n\tactionLabel?: string;\n\t/** Hàm handler phát động cờ để kích chạy tính năng lưu, xác nhận kia. */\n\tonAction?: () => void;\n\t/** Rạch một làn kẻ chia cách thân body nội dung cuộn bên dưới và dòng App bar cố thủ bên trên. @default false */\n\tshowDivider?: boolean;\n\tclassName?: string;\n}\n\n// ─── Re-exports wrapper ───────────────────────────────────────────────────────\n\n/**\n * Gốc rễ Root của Component Dialog — trạc lấp lên cái module `Dialog.Root` của nhà Radix.\n *\n * @remarks Cơ năng hoạt động ở chế độ Controlled (kiểm soát vòng đời ở Client) xài mảng `open`/`onOpenChange`.\n * Tuy thế bạn nếu không thích thì đừng có xài truyền mấy cái Props tay đôi trên, mà bỏ xài kiểu Untracked thông qua cái cục `DialogTrigger` là đủ.\n */\nconst Dialog = ({ open, onOpenChange, children }: DialogProps) => (\n\t<RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t{children}\n\t</RadixDialog.Root>\n);\nDialog.displayName = \"Dialog\";\n\n/** Bộ Trigger gieo phát đà giúp tắt bật cờ State đóng mở của Dialog con, dùng kèm kĩ năng nhét thông qua cái cầu `asChild`. */\nconst DialogTrigger = RadixDialog.Trigger;\nDialogTrigger.displayName = \"DialogTrigger\";\n\n// ─── Portal + Overlay + Content ───────────────────────────────────────────────\nconst DialogPortal = ({\n\topen,\n\tchildren,\n}: {\n\topen?: boolean;\n\tchildren: React.ReactNode;\n}) => (\n\t<RadixDialog.Portal forceMount>\n\t\t<AnimatePresence>\n\t\t\t{open ? React.Children.toArray(children) : null}\n\t\t</AnimatePresence>\n\t</RadixDialog.Portal>\n);\nDialogPortal.displayName = \"DialogPortal\";\n\nconst DialogOverlay = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Overlay>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Overlay ref={ref} asChild {...props}>\n\t\t<m.div\n\t\t\tclassName={cn(\"fixed inset-0 z-50 bg-black/32\", className)}\n\t\t\taria-hidden=\"true\"\n\t\t\t{...MD3_OVERLAY_ANIM}\n\t\t/>\n\t</RadixDialog.Overlay>\n));\nDialogOverlay.displayName = \"DialogOverlay\";\n\nconst DialogContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDialogContentProps\n>(({ className, children, hideCloseButton = false, ...props }, ref) => (\n\t<RadixDialog.Content\n\t\tref={ref}\n\t\tasChild\n\t\taria-describedby={undefined}\n\t\t{...props}\n\t>\n\t\t<m.div\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2\",\n\t\t\t\t\"w-[calc(100%-2rem)] max-w-140\",\n\t\t\t\t\"rounded-[28px] bg-m3-surface-container-high p-6\",\n\t\t\t\t\"shadow-lg outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\trole=\"dialog\"\n\t\t\t{...MD3_CONTENT_ANIM}\n\t\t>\n\t\t\t{children}\n\t\t\t{!hideCloseButton && (\n\t\t\t\t<RadixDialog.Close asChild aria-label=\"Close dialog\">\n\t\t\t\t\t<IconButton\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tcolorStyle=\"filled\"\n\t\t\t\t\t\tclassName=\"absolute right-4 top-4\"\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close\" aria-hidden=\"true\" />\n\t\t\t\t\t</IconButton>\n\t\t\t\t</RadixDialog.Close>\n\t\t\t)}\n\t\t</m.div>\n\t</RadixDialog.Content>\n));\nDialogContent.displayName = \"DialogContent\";\n\n// ─── Header & Related ────────────────────────────────────────────────────────\nconst DialogIcon = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n\t<div\n\t\tref={ref}\n\t\tclassName={cn(\"flex justify-center mb-4 text-m3-secondary\", className)}\n\t\taria-hidden=\"true\"\n\t\t{...props}\n\t>\n\t\t{children}\n\t</div>\n));\nDialogIcon.displayName = \"DialogIcon\";\n\nconst DialogHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-2 mb-4\", className)} {...props} />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\n// RadixDialog.Title surfaces to the accessibility tree — required\nconst DialogTitle = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Title>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, asChild, ...props }, ref) => (\n\t<RadixDialog.Title\n\t\tref={ref}\n\t\tasChild={asChild}\n\t\tclassName={cn(\n\t\t\t\"text-[24px] leading-8 font-normal text-m3-on-surface tracking-[0em]\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDialogTitle.displayName = \"DialogTitle\";\n\nconst DialogDescription = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Description>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, asChild, ...props }, ref) => (\n\t<RadixDialog.Description\n\t\tref={ref}\n\t\tasChild={asChild}\n\t\tclassName={cn(\"text-sm text-m3-on-surface-variant leading-5\", className)}\n\t\t{...props}\n\t/>\n));\nDialogDescription.displayName = \"DialogDescription\";\n\n// ─── Body & Footer ───────────────────────────────────────────────────────────\nconst DialogBody = React.forwardRef<\n\tHTMLDivElement,\n\tReact.HTMLAttributes<HTMLDivElement>\n>(({ className, children, dir, ...props }, ref) => (\n\t<ScrollArea\n\t\tref={ref}\n\t\ttype=\"hover\"\n\t\tdir={dir as \"ltr\" | \"rtl\" | undefined}\n\t\tclassName={cn(\"max-h-[calc(85dvh-200px)] -mx-6\", className)}\n\t\tviewportClassName=\"px-6\"\n\t\t{...props}\n\t>\n\t\t{children}\n\t</ScrollArea>\n));\nDialogBody.displayName = \"DialogBody\";\n\nconst DialogFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div\n\t\tclassName={cn(\"flex flex-row justify-end gap-2 mt-6\", className)}\n\t\t{...props}\n\t/>\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogClose = RadixDialog.Close;\n\n// ─── Full Screen Content Variant ──────────────────────────────────────────────\nconst DialogFullScreenContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDialogFullScreenContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\ttitle,\n\t\t\tactionLabel,\n\t\t\tonAction,\n\t\t\tshowDivider,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<RadixDialog.Content\n\t\t\tref={ref}\n\t\t\tasChild\n\t\t\taria-describedby={undefined}\n\t\t\t{...props}\n\t\t>\n\t\t\t<m.div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-50 w-full h-full bg-m3-surface flex flex-col\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-m3-primary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\trole=\"dialog\"\n\t\t\t\t{...MD3_FULLSCREEN_ANIM}\n\t\t\t>\n\t\t\t\t<div className=\"flex shrink-0 items-center px-4 h-14 gap-2 bg-m3-surface\">\n\t\t\t\t\t<RadixDialog.Close asChild aria-label=\"Close dialog\">\n\t\t\t\t\t\t<IconButton size=\"sm\" colorStyle=\"filled\" aria-label=\"Close\">\n\t\t\t\t\t\t\t<Icon name=\"close\" aria-hidden=\"true\" />\n\t\t\t\t\t\t</IconButton>\n\t\t\t\t\t</RadixDialog.Close>\n\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<DialogTitle className=\"flex-1 text-[22px] leading-7 font-medium truncate pr-2\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</DialogTitle>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{actionLabel && onAction && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onAction}\n\t\t\t\t\t\t\tclassName=\"text-sm font-medium text-m3-primary px-3 py-2 rounded-full hover:bg-m3-primary/8 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary transition-colors whitespace-nowrap\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{actionLabel}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{showDivider && (\n\t\t\t\t\t<hr className=\"border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t)}\n\n\t\t\t\t<ScrollArea\n\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\tclassName=\"flex-1 w-full\"\n\t\t\t\t\tviewportClassName=\"p-6\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</ScrollArea>\n\t\t\t</m.div>\n\t\t</RadixDialog.Content>\n\t),\n);\nDialogFullScreenContent.displayName = \"DialogFullScreenContent\";\n\nexport {\n\tDialog,\n\tDialogBody,\n\tDialogClose,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogFullScreenContent,\n\tDialogHeader,\n\tDialogIcon,\n\tDialogOverlay,\n\tDialogPortal,\n\tDialogTitle,\n\tDialogTrigger,\n};\n","import * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"./icon\";\nimport { DEFAULT_SPATIAL_SPRING } from \"./shared/motion-tokens\";\n\n// ─── MD3 Expressive Drawer Animation ─────────────────────────────────────────\n// Slide from bottom, MD3 default.spatial spring\n// (stiffness=380, dampingRatio=0.8 → Framer damping ≈ 31.19)\nconst MD3_DRAWER_SPRING = DEFAULT_SPATIAL_SPRING;\n\nconst MD3_DRAWER_ANIM = {\n\tinitial: { y: \"100%\", opacity: 0.6 },\n\tanimate: {\n\t\ty: 0,\n\t\topacity: 1,\n\t\ttransition: MD3_DRAWER_SPRING,\n\t},\n\texit: {\n\t\ty: \"100%\",\n\t\topacity: 0,\n\t\ttransition: { duration: 0.22, ease: \"easeIn\" as const },\n\t},\n};\n\nconst MD3_SCRIM_ANIM = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: \"easeOut\" as const },\n\t},\n\texit: { opacity: 0, transition: { duration: 0.18, ease: \"easeIn\" as const } },\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\nexport interface DrawerProps {\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tchildren: React.ReactNode;\n}\n\nexport interface DrawerContentProps\n\textends Omit<\n\t\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Content>,\n\t\t\"asChild\"\n\t> {\n\t/** Chiều cao tối đa (vh). Mặc định 90vh */\n\tmaxHeight?: string;\n\t/** Ẩn drag handle */\n\thideHandle?: boolean;\n\t/** Ẩn nút đóng */\n\thideCloseButton?: boolean;\n\tclassName?: string;\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\nconst Drawer = ({ open, onOpenChange, children }: DrawerProps) => (\n\t<RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t{children}\n\t</RadixDialog.Root>\n);\nDrawer.displayName = \"Drawer\";\n\nconst DrawerTrigger = RadixDialog.Trigger;\nDrawerTrigger.displayName = \"DrawerTrigger\";\n\nconst DrawerClose = RadixDialog.Close;\n\n// ─── Portal wrapper với AnimatePresence ───────────────────────────────────────\nconst DrawerPortal = ({\n\topen,\n\tchildren,\n}: {\n\topen?: boolean;\n\tchildren: React.ReactNode;\n}) => (\n\t<RadixDialog.Portal forceMount>\n\t\t<AnimatePresence mode=\"wait\">{open && children}</AnimatePresence>\n\t</RadixDialog.Portal>\n);\n\n// ─── Scrim overlay ────────────────────────────────────────────────────────────\nconst DrawerOverlay = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Overlay>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Overlay>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Overlay ref={ref} asChild {...props}>\n\t\t<m.div\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\"fixed inset-0 z-50 bg-black/40\", className)}\n\t\t\t{...MD3_SCRIM_ANIM}\n\t\t/>\n\t</RadixDialog.Overlay>\n));\nDrawerOverlay.displayName = \"DrawerOverlay\";\n\n// ─── Content ─────────────────────────────────────────────────────────────────\nconst DrawerContent = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Content>,\n\tDrawerContentProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\tmaxHeight = \"90vh\",\n\t\t\thideHandle = false,\n\t\t\thideCloseButton = false,\n\t\t\tstyle,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => (\n\t\t<RadixDialog.Content ref={ref} asChild {...props}>\n\t\t\t<m.div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// MD3 Bottom Sheet shape: chỉ bo góc trên\n\t\t\t\t\t\"fixed bottom-0 left-0 right-0 z-50\",\n\t\t\t\t\t\"rounded-t-[28px] bg-m3-surface-container-low\",\n\t\t\t\t\t\"flex flex-col overflow-hidden\",\n\t\t\t\t\t\"outline-none\",\n\t\t\t\t\t// focus-visible ring — a11y\n\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-inset\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={{ maxHeight, ...style }}\n\t\t\t\t{...MD3_DRAWER_ANIM}\n\t\t\t>\n\t\t\t\t{/* Drag handle — decorative hint */}\n\t\t\t\t{!hideHandle && (\n\t\t\t\t\t<div\n\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\tclassName=\"mx-auto mt-3 h-1 w-9 rounded-full bg-m3-on-surface-variant/40 shrink-0\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{/* Close button */}\n\t\t\t\t{!hideCloseButton && (\n\t\t\t\t\t<RadixDialog.Close\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute right-4 top-3 rounded-full p-2\",\n\t\t\t\t\t\t\t\"text-m3-on-surface-variant\",\n\t\t\t\t\t\t\t\"hover:bg-m3-on-surface/8\",\n\t\t\t\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-m3-primary\",\n\t\t\t\t\t\t\t\"transition-colors duration-200\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t\taria-label=\"Đóng bảng điều khiển\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon name=\"close\" size={20} aria-hidden=\"true\" />\n\t\t\t\t\t</RadixDialog.Close>\n\t\t\t\t)}\n\n\t\t\t\t{/* Scrollable content area */}\n\t\t\t\t<div className=\"flex-1 overflow-y-auto overscroll-contain p-6\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</m.div>\n\t\t</RadixDialog.Content>\n\t),\n);\nDrawerContent.displayName = \"DrawerContent\";\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\nconst DrawerHeader = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-1 mb-4\", className)} {...props} />\n);\nDrawerHeader.displayName = \"DrawerHeader\";\n\nconst DrawerFooter = ({\n\tclassName,\n\t...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n\t<div className={cn(\"flex flex-col gap-2 mt-4\", className)} {...props} />\n);\nDrawerFooter.displayName = \"DrawerFooter\";\n\nconst DrawerTitle = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Title>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Title\n\t\tref={ref}\n\t\tclassName={cn(\n\t\t\t\"text-[22px] leading-7 font-medium text-m3-on-surface\",\n\t\t\tclassName,\n\t\t)}\n\t\t{...props}\n\t/>\n));\nDrawerTitle.displayName = \"DrawerTitle\";\n\nconst DrawerDescription = React.forwardRef<\n\tReact.ComponentRef<typeof RadixDialog.Description>,\n\tReact.ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, ...props }, ref) => (\n\t<RadixDialog.Description\n\t\tref={ref}\n\t\tclassName={cn(\"text-sm text-m3-on-surface-variant leading-5\", className)}\n\t\t{...props}\n\t/>\n));\nDrawerDescription.displayName = \"DrawerDescription\";\n\nexport {\n\tDrawer,\n\tDrawerClose,\n\tDrawerContent,\n\tDrawerDescription,\n\tDrawerFooter,\n\tDrawerHeader,\n\tDrawerOverlay,\n\tDrawerPortal,\n\tDrawerTitle,\n\tDrawerTrigger,\n};\n\n// ─── Usage:\n// <Drawer open={open} onOpenChange={setOpen}>\n// <DrawerTrigger asChild><Button>Mở Drawer</Button></DrawerTrigger>\n// <DrawerPortal open={open}>\n// <DrawerOverlay />\n// <DrawerContent maxHeight=\"80vh\">\n// <DrawerHeader>\n// <DrawerTitle>Chi tiết đơn hàng</DrawerTitle>\n// <DrawerDescription>Xem thông tin đơn hàng #1234</DrawerDescription>\n// </DrawerHeader>\n// <p>Nội dung drawer...</p>\n// <DrawerFooter>\n// <Button colorStyle=\"filled\" className=\"w-full\">Xác nhận</Button>\n// </DrawerFooter>\n// </DrawerContent>\n// </DrawerPortal>\n// </Drawer>\n","/**\n * @file sheets/shared/drag-handle.tsx\n *\n * Visual drag handle for Bottom Sheet components.\n *\n * MD3 spec:\n * - Padding top/bottom: 22dp (\"Drag handle padding top/bottom: 22dp\")\n * - Width: 32dp, Height: 4dp, corner-full radius\n * - Color: on-surface-variant @ 40% opacity\n * - Touch target: top 48dp of sheet is interactive (py-[22px])\n * - When interactive: renders as `<button>`, Tab-focusable, Space/Enter cycles snap points\n * - When decorative: purely visual, no semantics\n *\n * @see https://m3.material.io/components/sheets-bottom/guidelines#handle\n * @see https://m3.material.io/components/sheets-bottom/accessibility\n */\n\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DragHandleProps } from \"./types\";\n\nconst INDICATOR = \"h-1 w-8 rounded-full bg-m3-on-surface-variant/40\";\n\nexport const DragHandle = React.forwardRef<HTMLDivElement, DragHandleProps>(\n\t({ className, onCycle, \"aria-label\": ariaLabel }, ref) => {\n\t\tconst isInteractive = Boolean(onCycle);\n\n\t\tif (isInteractive) {\n\t\t\t/**\n\t\t\t * Interactive variant: native `<button>` wrapping the indicator bar.\n\t\t\t * Using `<button>` satisfies both `noStaticElementInteractions` and\n\t\t\t * `useAriaPropsSupportedByRole` lint rules without any overrides.\n\t\t\t */\n\t\t\treturn (\n\t\t\t\t<button\n\t\t\t\t\tref={ref as unknown as React.Ref<HTMLButtonElement>}\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={ariaLabel ?? \"Adjust sheet height\"}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center w-full pt-[30px] pb-[22px] shrink-0\",\n\t\t\t\t\t\t\"cursor-pointer bg-transparent border-0\",\n\t\t\t\t\t\t\"rounded-sm outline-none focus-visible:ring-[3px] focus-visible:ring-m3-on-surface-variant focus-visible:ring-offset-2\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tonClick={onCycle}\n\t\t\t\t\tdata-testid=\"sheet-drag-handle\"\n\t\t\t\t>\n\t\t\t\t\t<div className={INDICATOR} />\n\t\t\t\t</button>\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Decorative variant: plain `<div>`, no semantics.\n\t\t * Purely visual — does not appear in the accessibility tree.\n\t\t */\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\taria-hidden\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center justify-center w-full pt-[30px] pb-[22px] shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"sheet-drag-handle\"\n\t\t\t>\n\t\t\t\t<div className={INDICATOR} />\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nDragHandle.displayName = \"DragHandle\";\n","/**\n * @file sheets/shared/utils.ts\n *\n * Shared utility helpers for Bottom Sheet and Side Sheet components.\n */\n\nimport { DEFAULT_SPATIAL_SPRING } from \"../../shared/motion-tokens\";\nimport type { SheetEdge } from \"./types\";\n\n// ─── Divider resolution ───────────────────────────────────────────────────────\n\ntype DividerProp = boolean | { header?: boolean; footer?: boolean } | undefined;\n\n/**\n * Normalizes the `divider` prop into an explicit `{ header, footer }` object.\n */\nexport function resolveDividers(divider: DividerProp): {\n\theader: boolean;\n\tfooter: boolean;\n} {\n\tif (divider === false) return { header: false, footer: false };\n\tif (divider === undefined || divider === true) {\n\t\treturn { header: true, footer: true };\n\t}\n\treturn { header: divider.header ?? true, footer: divider.footer ?? true };\n}\n\n// ─── Sheet animation ──────────────────────────────────────────────────────────\n\n/**\n * Builds slide-in/out animation config for a Side Sheet based on its edge.\n */\nexport function buildSideSheetAnim(edge: SheetEdge) {\n\tconst exitX = edge === \"end\" ? \"100%\" : \"-100%\";\n\treturn {\n\t\tinitial: { x: exitX, opacity: 0.6 },\n\t\tanimate: { x: 0, opacity: 1, transition: DEFAULT_SPATIAL_SPRING },\n\t\texit: {\n\t\t\tx: exitX,\n\t\t\topacity: 0,\n\t\t\ttransition: { duration: 0.22, ease: \"easeIn\" as const },\n\t\t},\n\t} as const;\n}\n\n// ─── Default Sheet Styles ──────────────────────────────────────────────────────\n\n/**\n * Default background color class name for Bottom and Side Sheets.\n * Follows MD3 surfaceContainerLow token.\n */\nexport const DEFAULT_SHEET_BG = \"bg-m3-surface-container-low\";\n","/**\n * @file sheets/bottom-sheet/use-bottom-sheet.ts\n *\n * Custom hook encapsulating drag-to-dismiss and snap point gesture logic\n * for Bottom Sheet components, using manual touch/pointer events to allow\n * seamless scroll-to-drag handoffs without locking native nested scrolling.\n */\n\nimport { animate, useMotionValue, useTransform } from \"motion/react\";\nimport {\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport type { BottomSheetSnapPoint } from \"../shared/types\";\n\nconst useIsomorphicLayoutEffect =\n\ttypeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst DISMISS_THRESHOLD = 0.4;\nconst DISMISS_VELOCITY_THRESHOLD = 600;\nconst DEFAULT_SAFE_AREA_OFFSET = 56;\nconst BOUNDARY_DAMPENING_ZONE = 80;\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst parseSnapPoint = (\n\tsnap: BottomSheetSnapPoint,\n\tviewportHeight: number,\n\tnaturalHeight: number,\n\tsafeAreaOffset: number,\n\tparsedMaxHeight: number,\n\thasUserSnapPoints: boolean,\n): number => {\n\tconst absoluteMaxHeight = viewportHeight - safeAreaOffset;\n\tconst capHeight = hasUserSnapPoints\n\t\t? absoluteMaxHeight\n\t\t: Math.min(absoluteMaxHeight, parsedMaxHeight);\n\n\tif (typeof snap === \"number\") return Math.min(snap, capHeight);\n\tif (snap === \"full\") return capHeight;\n\tif (snap === \"fit\" || snap === \"max-content\")\n\t\treturn Math.min(\n\t\t\tnaturalHeight,\n\t\t\tMath.min(absoluteMaxHeight, parsedMaxHeight),\n\t\t);\n\tif (snap === \"partiallyExpanded\")\n\t\treturn Math.min(Math.floor(viewportHeight * 0.5), capHeight);\n\n\tif (typeof snap === \"string\") {\n\t\tif (snap.endsWith(\"%\")) {\n\t\t\treturn Math.min((parseFloat(snap) / 100) * viewportHeight, capHeight);\n\t\t}\n\t\tif (snap.endsWith(\"px\")) {\n\t\t\treturn Math.min(parseFloat(snap), capHeight);\n\t\t}\n\t\tif (snap.endsWith(\"dvh\") || snap.endsWith(\"vh\")) {\n\t\t\treturn Math.min((parseFloat(snap) / 100) * viewportHeight, capHeight);\n\t\t}\n\t}\n\n\treturn Math.min(naturalHeight, capHeight);\n};\n\nconst measureSafeAreaOffset = (): number => {\n\tif (typeof document === \"undefined\") return DEFAULT_SAFE_AREA_OFFSET;\n\tconst el = document.createElement(\"div\");\n\tel.style.cssText =\n\t\t\"position:absolute;top:0;height:max(56px,env(safe-area-inset-top,0px));visibility:hidden;pointer-events:none\";\n\tdocument.body.appendChild(el);\n\tconst height = el.offsetHeight;\n\tdocument.body.removeChild(el);\n\treturn height;\n};\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface UseBottomSheetOptions {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tsnapPoints?: BottomSheetSnapPoint[];\n\tdefaultSnapPoint?: BottomSheetSnapPoint;\n\tonSnapChange?: (snapPoint: BottomSheetSnapPoint) => void;\n\tgesturesEnabled?: boolean;\n\tisModal?: boolean;\n\tmaxHeight?: string;\n}\n\nexport interface UseBottomSheetReturn {\n\tscope: React.RefCallback<HTMLDivElement | null>;\n\ty: ReturnType<typeof useMotionValue<number>>;\n\tscrimOpacity: ReturnType<typeof useTransform<number, number>>;\n\tactiveSnapPoint: BottomSheetSnapPoint;\n\tisContentScrollable: boolean;\n\tsnapTo: (snapPoint: BottomSheetSnapPoint) => void;\n\tcycleSnapPoint: () => void;\n\tdragConstraints: { top: number; bottom: number };\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport function useBottomSheet({\n\tisOpen,\n\tonClose,\n\tsnapPoints,\n\tdefaultSnapPoint,\n\tonSnapChange,\n\tgesturesEnabled = true,\n\tisModal = false,\n\tmaxHeight,\n}: UseBottomSheetOptions): UseBottomSheetReturn {\n\tconst [scopeNode, setScopeNode] = useState<HTMLDivElement | null>(null);\n\tconst scopeNodeRef = useRef<HTMLDivElement | null>(null);\n\n\tconst scope = useCallback((node: HTMLDivElement | null) => {\n\t\tscopeNodeRef.current = node;\n\t\tsetScopeNode(node);\n\t}, []) as React.RefCallback<HTMLDivElement | null> & {\n\t\tcurrent: HTMLDivElement | null;\n\t};\n\n\tObject.defineProperty(scope, \"current\", {\n\t\tget: () => scopeNodeRef.current,\n\t\tset: (v) => {\n\t\t\tscopeNodeRef.current = v;\n\t\t},\n\t\tconfigurable: true,\n\t});\n\n\tconst y = useMotionValue(\n\t\ttypeof window !== \"undefined\"\n\t\t\t? window.visualViewport\n\t\t\t\t? window.visualViewport.height\n\t\t\t\t: window.innerHeight\n\t\t\t: 800,\n\t);\n\n\tconst [dimensions, setDimensions] = useState({\n\t\tviewportHeight:\n\t\t\ttypeof window !== \"undefined\"\n\t\t\t\t? window.visualViewport\n\t\t\t\t\t? window.visualViewport.height\n\t\t\t\t\t: window.innerHeight\n\t\t\t\t: 800,\n\t\tnaturalHeight: 0,\n\t\tsafeAreaOffset: DEFAULT_SAFE_AREA_OFFSET,\n\t});\n\n\tconst hasMeasuredAfterOpen = useRef(false);\n\n\tconst measureDimensions = useCallback(() => {\n\t\tconst node = scopeNodeRef.current;\n\t\tif (!node) return;\n\n\t\tconst viewportHeight = window.visualViewport\n\t\t\t? window.visualViewport.height\n\t\t\t: window.innerHeight;\n\t\tconst safeAreaOffset = measureSafeAreaOffset();\n\n\t\tconst viewport = node.querySelector(\"[data-radix-scroll-area-viewport]\");\n\t\tlet naturalHeight = node.scrollHeight;\n\n\t\tif (viewport) {\n\t\t\tlet nonScrollableHeight = 0;\n\t\t\tfor (let i = 0; i < node.children.length; i++) {\n\t\t\t\tconst child = node.children[i] as HTMLElement;\n\t\t\t\tif (!child.contains(viewport) && child !== viewport) {\n\t\t\t\t\tnonScrollableHeight += child.offsetHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t\tnaturalHeight = nonScrollableHeight + viewport.scrollHeight;\n\t\t}\n\n\t\tif (naturalHeight > 0) hasMeasuredAfterOpen.current = true;\n\n\t\tsetDimensions((prev) => {\n\t\t\tif (\n\t\t\t\tprev.viewportHeight === viewportHeight &&\n\t\t\t\tprev.naturalHeight === naturalHeight &&\n\t\t\t\tprev.safeAreaOffset === safeAreaOffset\n\t\t\t) {\n\t\t\t\treturn prev;\n\t\t\t}\n\t\t\treturn { viewportHeight, naturalHeight, safeAreaOffset };\n\t\t});\n\t}, []);\n\n\tuseIsomorphicLayoutEffect(() => {\n\t\tif (!isOpen || !scopeNode) return;\n\t\tmeasureDimensions();\n\n\t\tconst observer = new ResizeObserver(measureDimensions);\n\t\tconst viewport = scopeNode.querySelector(\n\t\t\t\"[data-radix-scroll-area-viewport]\",\n\t\t);\n\n\t\tif (viewport) {\n\t\t\tobserver.observe(viewport);\n\t\t\tif (viewport.firstElementChild)\n\t\t\t\tobserver.observe(viewport.firstElementChild);\n\t\t} else {\n\t\t\tobserver.observe(scopeNode);\n\t\t}\n\n\t\twindow.addEventListener(\"resize\", measureDimensions);\n\t\treturn () => {\n\t\t\tobserver.disconnect();\n\t\t\twindow.removeEventListener(\"resize\", measureDimensions);\n\t\t};\n\t}, [isOpen, scopeNode, measureDimensions]);\n\n\tuseIsomorphicLayoutEffect(() => {\n\t\tconst vv = window.visualViewport;\n\t\tif (!isOpen || !vv) return;\n\t\tconst handleResize = () => {\n\t\t\tdocument.documentElement.style.setProperty(\n\t\t\t\t\"--sheet-vh\",\n\t\t\t\t`${vv.height}px`,\n\t\t\t);\n\t\t\tmeasureDimensions();\n\t\t};\n\t\tvv.addEventListener(\"resize\", handleResize);\n\t\thandleResize();\n\t\treturn () => vv.removeEventListener(\"resize\", handleResize);\n\t}, [isOpen, measureDimensions]);\n\n\tconst { viewportHeight, naturalHeight, safeAreaOffset } = dimensions;\n\n\tconst parsedMaxHeight = useMemo(() => {\n\t\tif (!maxHeight) return viewportHeight - safeAreaOffset;\n\t\tif (maxHeight.endsWith(\"px\")) return parseFloat(maxHeight);\n\t\tif (maxHeight.endsWith(\"dvh\") || maxHeight.endsWith(\"vh\")) {\n\t\t\treturn (parseFloat(maxHeight) / 100) * viewportHeight;\n\t\t}\n\t\tif (maxHeight.endsWith(\"%\")) {\n\t\t\treturn (parseFloat(maxHeight) / 100) * viewportHeight;\n\t\t}\n\t\treturn parseFloat(maxHeight) || viewportHeight - safeAreaOffset;\n\t}, [maxHeight, viewportHeight, safeAreaOffset]);\n\n\tconst snaps = useMemo((): BottomSheetSnapPoint[] => {\n\t\tif (snapPoints) return snapPoints;\n\t\tif (isModal) return [\"partiallyExpanded\", \"full\"];\n\t\treturn [\"fit\"];\n\t}, [snapPoints, isModal]);\n\n\tconst allowsViewportSnapExpansion =\n\t\tsnapPoints !== undefined || snaps.length > 1;\n\n\tconst snapHeights = useMemo(\n\t\t() =>\n\t\t\tsnaps.map((snap) =>\n\t\t\t\tparseSnapPoint(\n\t\t\t\t\tsnap,\n\t\t\t\t\tviewportHeight,\n\t\t\t\t\tnaturalHeight,\n\t\t\t\t\tsafeAreaOffset,\n\t\t\t\t\tparsedMaxHeight,\n\t\t\t\t\tallowsViewportSnapExpansion,\n\t\t\t\t),\n\t\t\t),\n\t\t[\n\t\t\tsnaps,\n\t\t\tviewportHeight,\n\t\t\tnaturalHeight,\n\t\t\tsafeAreaOffset,\n\t\t\tparsedMaxHeight,\n\t\t\tallowsViewportSnapExpansion,\n\t\t],\n\t);\n\n\tconst maxSheetHeight = useMemo(\n\t\t() => viewportHeight - safeAreaOffset,\n\t\t[viewportHeight, safeAreaOffset],\n\t);\n\n\tconst snapYValues = useMemo(\n\t\t() => snapHeights.map((h) => Math.max(0, maxSheetHeight - h)),\n\t\t[snapHeights, maxSheetHeight],\n\t);\n\n\tconst sortedSnaps = useMemo(() => {\n\t\tconst combined = snaps.map((point, idx) => ({\n\t\t\tpoint,\n\t\t\theight: snapHeights[idx],\n\t\t\ty: snapYValues[idx],\n\t\t}));\n\t\treturn combined.sort((a, b) => b.y - a.y);\n\t}, [snaps, snapHeights, snapYValues]);\n\n\tconst [activeSnapIndex, setActiveSnapIndex] = useState(0);\n\n\tconst activeSnapPoint = useMemo(\n\t\t() => sortedSnaps[activeSnapIndex]?.point ?? \"fit\",\n\t\t[sortedSnaps, activeSnapIndex],\n\t);\n\n\tconst isContentScrollable = useMemo(\n\t\t() => sortedSnaps.length <= 1 || activeSnapIndex === sortedSnaps.length - 1,\n\t\t[sortedSnaps, activeSnapIndex],\n\t);\n\n\tconst lowestSnapY = useMemo(() => sortedSnaps[0]?.y ?? 300, [sortedSnaps]);\n\tconst scrimOpacity = useTransform(y, [lowestSnapY, maxSheetHeight], [1, 0]);\n\n\tconst defaultSnap = useMemo(\n\t\t() => defaultSnapPoint ?? snaps[0] ?? \"fit\",\n\t\t[defaultSnapPoint, snaps],\n\t);\n\n\tconst prevIsOpen = useRef(isOpen);\n\n\tuseIsomorphicLayoutEffect(() => {\n\t\tif (isOpen && !prevIsOpen.current) {\n\t\t\ty.set(viewportHeight);\n\t\t\thasMeasuredAfterOpen.current = false;\n\t\t\tconst defaultIdx = sortedSnaps.findIndex((s) => s.point === defaultSnap);\n\t\t\tsetActiveSnapIndex(defaultIdx !== -1 ? defaultIdx : 0);\n\t\t} else if (!isOpen && prevIsOpen.current) {\n\t\t\tsetDimensions((prev) => ({ ...prev, naturalHeight: 0 }));\n\t\t\tvoid animate(y, viewportHeight, {\n\t\t\t\ttype: \"tween\",\n\t\t\t\tduration: 0.22,\n\t\t\t\tease: \"easeIn\",\n\t\t\t});\n\t\t}\n\t\tprevIsOpen.current = isOpen;\n\t}, [isOpen, y, viewportHeight, sortedSnaps, defaultSnap]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen || sortedSnaps.length === 0 || naturalHeight === 0) return;\n\t\tif (!hasMeasuredAfterOpen.current) return;\n\n\t\tconst targetY = sortedSnaps[activeSnapIndex]?.y;\n\t\tif (targetY === undefined) return;\n\n\t\tvoid animate(y, targetY, { type: \"spring\", stiffness: 300, damping: 30 });\n\t}, [isOpen, sortedSnaps, activeSnapIndex, y, naturalHeight]);\n\n\tconst snapTo = useCallback(\n\t\t(snapPoint: BottomSheetSnapPoint) => {\n\t\t\tconst idx = sortedSnaps.findIndex((s) => s.point === snapPoint);\n\t\t\tif (idx === -1) return;\n\t\t\tsetActiveSnapIndex(idx);\n\t\t\tvoid animate(y, sortedSnaps[idx].y, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tstiffness: 300,\n\t\t\t\tdamping: 30,\n\t\t\t});\n\t\t\tonSnapChange?.(snapPoint);\n\t\t},\n\t\t[sortedSnaps, y, onSnapChange],\n\t);\n\n\tconst cycleSnapPoint = useCallback(() => {\n\t\tconst nextIdx = activeSnapIndex + 1;\n\t\tif (nextIdx >= sortedSnaps.length) {\n\t\t\tonClose();\n\t\t} else {\n\t\t\tsetActiveSnapIndex(nextIdx);\n\t\t\tvoid animate(y, sortedSnaps[nextIdx].y, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tstiffness: 300,\n\t\t\t\tdamping: 30,\n\t\t\t});\n\t\t\tonSnapChange?.(sortedSnaps[nextIdx].point);\n\t\t}\n\t}, [activeSnapIndex, sortedSnaps, y, onClose, onSnapChange]);\n\n\tconst dragConstraints = useMemo(\n\t\t() => ({\n\t\t\ttop: Math.max(0, sortedSnaps[sortedSnaps.length - 1]?.y ?? 0),\n\t\t\tbottom: viewportHeight,\n\t\t}),\n\t\t[sortedSnaps, viewportHeight],\n\t);\n\n\t// Seamless Manual Drag Gesture Handling (Touch + Mouse)\n\tuseEffect(() => {\n\t\tif (!isOpen || !gesturesEnabled || !scopeNode) return;\n\n\t\tconst node = scopeNode;\n\t\tconst viewport = node.querySelector(\n\t\t\t\"[data-radix-scroll-area-viewport]\",\n\t\t) as HTMLElement | null;\n\n\t\tlet startY = 0;\n\t\tlet initialSheetY = 0;\n\t\tlet isDragging = false;\n\t\tlet lastY = 0;\n\t\tlet lastTime = 0;\n\t\tlet velocity = 0;\n\t\tlet activeInput: \"touch\" | \"mouse\" | null = null;\n\t\tlet dragStartTarget: EventTarget | null = null;\n\t\tlet lastTouchTime = 0;\n\t\tlet preventNextClick = false;\n\n\t\tconst MOUSE_DRAG_THRESHOLD = 5;\n\n\t\tconst updateVelocity = (currentY: number) => {\n\t\t\tconst currentTime = performance.now();\n\t\t\tconst deltaTime = currentTime - lastTime;\n\t\t\tif (deltaTime > 0) {\n\t\t\t\tvelocity = ((currentY - lastY) / deltaTime) * 1000;\n\t\t\t}\n\t\t\tlastY = currentY;\n\t\t\tlastTime = currentTime;\n\t\t};\n\n\t\tconst tryStartDrag = (deltaY: number): boolean => {\n\t\t\tif (viewport?.contains(dragStartTarget as Node)) {\n\t\t\t\tconst isAtHighestSnap = activeSnapIndex === sortedSnaps.length - 1;\n\n\t\t\t\tif (!isAtHighestSnap) {\n\t\t\t\t\tisDragging = true;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst scrollTop = viewport.scrollTop;\n\t\t\t\tconst isPullingDown = deltaY > 0;\n\t\t\t\tif (!isDragging) {\n\t\t\t\t\tif (scrollTop <= 0 && isPullingDown) {\n\t\t\t\t\t\tisDragging = true;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tisDragging = true;\n\t\t\treturn true;\n\t\t};\n\n\t\tconst applyDragPosition = (deltaY: number) => {\n\t\t\tlet nextY = initialSheetY + deltaY;\n\t\t\tif (nextY < dragConstraints.top) {\n\t\t\t\tconst overdrag = dragConstraints.top - nextY;\n\t\t\t\tnextY = dragConstraints.top - overdrag * 0.15;\n\t\t\t}\n\t\t\ty.set(nextY);\n\t\t};\n\n\t\tconst finalizeDrag = () => {\n\t\t\tif (!isDragging) return;\n\t\t\tpreventNextClick = true;\n\t\t\tisDragging = false;\n\n\t\t\tconst currentY = y.get();\n\t\t\tconst lowestSnap = sortedSnaps[0];\n\t\t\tconst lowestY = lowestSnap?.y ?? viewportHeight;\n\t\t\tconst lowestHeight = lowestSnap?.height ?? 200;\n\n\t\t\tlet finalVelocity = velocity;\n\t\t\tif (finalVelocity > 0) {\n\t\t\t\tconst distanceToFloor = Math.max(0, currentY - lowestY);\n\t\t\t\tif (distanceToFloor < BOUNDARY_DAMPENING_ZONE) {\n\t\t\t\t\tconst factor = distanceToFloor / BOUNDARY_DAMPENING_ZONE;\n\t\t\t\t\tfinalVelocity *= factor * factor;\n\t\t\t\t\tif (velocity >= DISMISS_VELOCITY_THRESHOLD) {\n\t\t\t\t\t\tfinalVelocity = Math.max(\n\t\t\t\t\t\t\tfinalVelocity,\n\t\t\t\t\t\t\tDISMISS_VELOCITY_THRESHOLD * 0.1,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst dragOffset = Math.max(0, currentY - lowestY);\n\t\t\tconst shouldDismiss =\n\t\t\t\tfinalVelocity > DISMISS_VELOCITY_THRESHOLD ||\n\t\t\t\tdragOffset > lowestHeight * DISMISS_THRESHOLD;\n\n\t\t\tif (shouldDismiss) {\n\t\t\t\tonClose();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Snap to closest\n\t\t\tlet closestIdx = 0;\n\t\t\tlet minDiff = Infinity;\n\t\t\tfor (let i = 0; i < sortedSnaps.length; i++) {\n\t\t\t\tconst diff = Math.abs(sortedSnaps[i].y - currentY);\n\t\t\t\tif (diff < minDiff) {\n\t\t\t\t\tminDiff = diff;\n\t\t\t\t\tclosestIdx = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetActiveSnapIndex(closestIdx);\n\t\t\tvoid animate(y, sortedSnaps[closestIdx].y, {\n\t\t\t\ttype: \"spring\",\n\t\t\t\tstiffness: 380,\n\t\t\t\tdamping: 31.19,\n\t\t\t});\n\t\t\tonSnapChange?.(sortedSnaps[closestIdx].point);\n\t\t};\n\n\t\t// ── Touch handlers ──────────────────────────────────────────────────\n\t\tconst onTouchStart = (e: TouchEvent) => {\n\t\t\tlastTouchTime = Date.now();\n\t\t\tactiveInput = \"touch\";\n\t\t\tdragStartTarget = e.target;\n\t\t\tstartY = e.touches[0].clientY;\n\t\t\tinitialSheetY = y.get();\n\t\t\tisDragging = false;\n\t\t\tlastY = startY;\n\t\t\tlastTime = performance.now();\n\t\t\tvelocity = 0;\n\t\t};\n\n\t\tconst onTouchMove = (e: TouchEvent) => {\n\t\t\tif (!e.touches[0] || activeInput !== \"touch\") return;\n\t\t\tconst currentY = e.touches[0].clientY;\n\t\t\tconst deltaY = currentY - startY;\n\t\t\tupdateVelocity(currentY);\n\n\t\t\tif (tryStartDrag(deltaY)) {\n\t\t\t\te.preventDefault();\n\t\t\t\tapplyDragPosition(deltaY);\n\t\t\t}\n\t\t};\n\n\t\tconst onTouchEnd = () => {\n\t\t\tif (activeInput !== \"touch\") return;\n\t\t\tactiveInput = null;\n\t\t\tfinalizeDrag();\n\t\t\tdragStartTarget = null;\n\t\t};\n\n\t\t// ── Mouse handlers (desktop drag support) ───────────────────────────\n\t\tconst onMouseDown = (e: MouseEvent) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\t// Ignore synthesized mouse events after touch interaction\n\t\t\tif (Date.now() - lastTouchTime < 500) return;\n\t\t\tactiveInput = \"mouse\";\n\t\t\tdragStartTarget = e.target;\n\t\t\tstartY = e.clientY;\n\t\t\tinitialSheetY = y.get();\n\t\t\tisDragging = false;\n\t\t\tlastY = startY;\n\t\t\tlastTime = performance.now();\n\t\t\tvelocity = 0;\n\t\t};\n\n\t\tconst onMouseMove = (e: MouseEvent) => {\n\t\t\tif (activeInput !== \"mouse\") return;\n\t\t\tconst currentY = e.clientY;\n\t\t\tconst deltaY = currentY - startY;\n\n\t\t\t// Require minimum movement to distinguish click from drag\n\t\t\tif (!isDragging && Math.abs(deltaY) < MOUSE_DRAG_THRESHOLD) return;\n\n\t\t\tupdateVelocity(currentY);\n\n\t\t\tif (tryStartDrag(deltaY)) {\n\t\t\t\te.preventDefault();\n\t\t\t\tdocument.body.style.userSelect = \"none\";\n\t\t\t\tapplyDragPosition(deltaY);\n\t\t\t}\n\t\t};\n\n\t\tconst onMouseUp = () => {\n\t\t\tif (activeInput !== \"mouse\") return;\n\t\t\tactiveInput = null;\n\t\t\tdocument.body.style.userSelect = \"\";\n\t\t\tfinalizeDrag();\n\t\t\tdragStartTarget = null;\n\t\t};\n\n\t\t// ── Click prevention after drag ─────────────────────────────────────\n\t\tconst onClickCapture = (e: MouseEvent) => {\n\t\t\tif (preventNextClick) {\n\t\t\t\te.stopPropagation();\n\t\t\t\tpreventNextClick = false;\n\t\t\t}\n\t\t};\n\n\t\t// Register events\n\t\tnode.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n\t\tnode.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n\t\tnode.addEventListener(\"touchend\", onTouchEnd);\n\t\tnode.addEventListener(\"touchcancel\", onTouchEnd);\n\t\tnode.addEventListener(\"mousedown\", onMouseDown);\n\t\tdocument.addEventListener(\"mousemove\", onMouseMove);\n\t\tdocument.addEventListener(\"mouseup\", onMouseUp);\n\t\tnode.addEventListener(\"click\", onClickCapture, true);\n\n\t\treturn () => {\n\t\t\tnode.removeEventListener(\"touchstart\", onTouchStart);\n\t\t\tnode.removeEventListener(\"touchmove\", onTouchMove);\n\t\t\tnode.removeEventListener(\"touchend\", onTouchEnd);\n\t\t\tnode.removeEventListener(\"touchcancel\", onTouchEnd);\n\t\t\tnode.removeEventListener(\"mousedown\", onMouseDown);\n\t\t\tdocument.removeEventListener(\"mousemove\", onMouseMove);\n\t\t\tdocument.removeEventListener(\"mouseup\", onMouseUp);\n\t\t\tnode.removeEventListener(\"click\", onClickCapture, true);\n\t\t\tdocument.body.style.userSelect = \"\";\n\t\t};\n\t}, [\n\t\tisOpen,\n\t\tgesturesEnabled,\n\t\tsortedSnaps,\n\t\tactiveSnapIndex,\n\t\ty,\n\t\tdragConstraints.top,\n\t\tviewportHeight,\n\t\tonClose,\n\t\tonSnapChange,\n\t\tscopeNode,\n\t]);\n\n\treturn {\n\t\tscope,\n\t\ty,\n\t\tscrimOpacity,\n\t\tactiveSnapPoint,\n\t\tisContentScrollable,\n\t\tsnapTo,\n\t\tcycleSnapPoint,\n\t\tdragConstraints,\n\t};\n}\n","/**\n * @file sheets/bottom-sheet/bottom-sheet.tsx\n *\n * Standard (non-modal) Bottom Sheet following MD3 specification.\n *\n * - Slide-up animation with DEFAULT_SPATIAL_SPRING\n * - Drag-to-dismiss with seamless nested scroll handling\n * - Visual Viewport API for mobile keyboard resize\n * - WAI-ARIA: `role=\"dialog\"`, `aria-modal=\"false\"`\n * - SSR-safe portal rendering\n *\n * @see https://m3.material.io/components/sheets-bottom/overview\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../../lib/utils\";\nimport { ScrollArea } from \"../../scroll-area\";\nimport { DEFAULT_SPATIAL_SPRING } from \"../../shared/motion-tokens\";\nimport { DragHandle } from \"../shared/drag-handle\";\nimport type { BaseSheetProps, BottomSheetSnapPoint } from \"../shared/types\";\nimport { DEFAULT_SHEET_BG, resolveDividers } from \"../shared/utils\";\nimport { useBottomSheet } from \"./use-bottom-sheet\";\n\n// ─── Animation constants ───────────────────────────────────────────────────────\n\nconst SHEET_ANIM = {\n\tinitial: { opacity: 0.6 },\n\tanimate: { opacity: 1, transition: DEFAULT_SPATIAL_SPRING },\n\texit: {\n\t\topacity: 0,\n\t\ttransition: { duration: 0.22, ease: \"easeIn\" as const },\n\t},\n} as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the standard (non-modal) Bottom Sheet.\n */\nexport interface BottomSheetProps extends BaseSheetProps {\n\t/**\n\t * Maximum height of the sheet.\n\t * @default \"90dvh\"\n\t */\n\tmaxHeight?: string;\n\n\t/**\n\t * Hide the drag handle visual indicator.\n\t * @default false\n\t */\n\thideHandle?: boolean;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst ABSOLUTE_MAX_HEIGHT =\n\t\"calc(100dvh - max(56px, env(safe-area-inset-top, 0px)))\";\n\nfunction resolveMaxHeight(\n\tmaxHeight: string,\n\tsnapPoints?: BottomSheetSnapPoint[],\n): string {\n\tif (maxHeight === \"90dvh\" && snapPoints && snapPoints.length > 0)\n\t\treturn ABSOLUTE_MAX_HEIGHT;\n\treturn maxHeight;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Standard (non-modal) Bottom Sheet that slides up from the bottom edge.\n *\n * Does NOT trap focus or block background interaction. Use `BottomSheetModal`\n * for blocking behaviour.\n *\n * @example\n * ```tsx\n * <BottomSheet isOpen={isOpen} onClose={() => setIsOpen(false)}>\n * <p>Sheet content</p>\n * </BottomSheet>\n * ```\n */\nexport const BottomSheet = React.forwardRef<HTMLDivElement, BottomSheetProps>(\n\t(\n\t\t{\n\t\t\tisOpen,\n\t\t\tonClose,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tmaxHeight = \"90dvh\",\n\t\t\thideHandle = false,\n\t\t\tportal = true,\n\t\t\t\"aria-labelledby\": ariaLabelledBy,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\theader,\n\t\t\tfooter,\n\t\t\tdivider,\n\t\t\tscrollAreaProps,\n\t\t\tsnapPoints,\n\t\t\tdefaultSnapPoint,\n\t\t\tonSnapChange,\n\t\t\tgesturesEnabled = true,\n\t\t\tcontainerColor,\n\t\t\tsheetMaxWidth,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst { scope, y, isContentScrollable, snapTo, cycleSnapPoint } =\n\t\t\tuseBottomSheet({\n\t\t\t\tisOpen,\n\t\t\t\tonClose,\n\t\t\t\tsnapPoints,\n\t\t\t\tdefaultSnapPoint,\n\t\t\t\tonSnapChange,\n\t\t\t\tgesturesEnabled,\n\t\t\t\tisModal: false,\n\t\t\t\tmaxHeight: resolveMaxHeight(maxHeight, snapPoints),\n\t\t\t});\n\n\t\t// Expose snapTo on the DOM node for programmatic control\n\t\tReact.useEffect(() => {\n\t\t\tconst node = (scope as unknown as { current: HTMLDivElement | null })\n\t\t\t\t.current;\n\t\t\tif (node) {\n\t\t\t\t(\n\t\t\t\t\tnode as HTMLDivElement & {\n\t\t\t\t\t\tsnapTo: (sp: BottomSheetSnapPoint) => void;\n\t\t\t\t\t}\n\t\t\t\t).snapTo = snapTo;\n\t\t\t}\n\t\t}, [snapTo, scope]);\n\n\t\tconst [mounted, setMounted] = React.useState(false);\n\t\tReact.useEffect(() => {\n\t\t\tsetMounted(true);\n\t\t}, []);\n\n\t\tconst resolvedDividers = React.useMemo(\n\t\t\t() => resolveDividers(divider),\n\t\t\t[divider],\n\t\t);\n\t\tconst resolvedSheetMaxWidth = React.useMemo(() => {\n\t\t\tif (sheetMaxWidth === undefined)\n\t\t\t\treturn \"var(--m3-bottom-sheet-max-width, 640px)\";\n\t\t\tif (typeof sheetMaxWidth === \"number\") return `${sheetMaxWidth}px`;\n\t\t\treturn sheetMaxWidth;\n\t\t}, [sheetMaxWidth]);\n\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLDivElement | null) => {\n\t\t\t\tscope(node);\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[scope, ref],\n\t\t);\n\n\t\tconst content = (\n\t\t\t<AnimatePresence>\n\t\t\t\t{isOpen && (\n\t\t\t\t\t<m.div\n\t\t\t\t\t\tref={mergedRef}\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"false\"\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"fixed bottom-0 z-50\",\n\t\t\t\t\t\t\t\"left-0 right-0 mx-auto\",\n\t\t\t\t\t\t\t\"rounded-t-[28px]\",\n\t\t\t\t\t\t\t!containerColor && DEFAULT_SHEET_BG,\n\t\t\t\t\t\t\t\"flex flex-col overflow-hidden\",\n\t\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-inset\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackgroundColor: containerColor,\n\t\t\t\t\t\t\t// Container must span the full available viewport height so that\n\t\t\t\t\t\t\t// snap points above the default maxHeight (e.g. \"full\", \"70%\")\n\t\t\t\t\t\t\t// can reveal their content via the y (translateY) offset mechanism.\n\t\t\t\t\t\t\theight: \"var(--sheet-vh, 100dvh)\",\n\t\t\t\t\t\t\tmaxHeight: ABSOLUTE_MAX_HEIGHT,\n\t\t\t\t\t\t\tmaxWidth: resolvedSheetMaxWidth,\n\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t{...SHEET_ANIM}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!hideHandle && <DragHandle onCycle={cycleSnapPoint} />}\n\n\t\t\t\t\t\t{header && <div className=\"shrink-0 px-6 pb-4\">{header}</div>}\n\t\t\t\t\t\t{header && resolvedDividers.header && (\n\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<ScrollArea\n\t\t\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\t\t\t{...scrollAreaProps}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex-1 min-h-0 min-w-0\",\n\t\t\t\t\t\t\t\tscrollAreaProps?.className,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tviewportClassName={cn(\n\t\t\t\t\t\t\t\t\"px-6 pb-6 overscroll-contain\",\n\t\t\t\t\t\t\t\theader ? \"pt-4\" : \"\",\n\t\t\t\t\t\t\t\tscrollAreaProps?.viewportClassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tviewportProps={{\n\t\t\t\t\t\t\t\t...scrollAreaProps?.viewportProps,\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t...scrollAreaProps?.viewportProps?.style,\n\t\t\t\t\t\t\t\t\toverflowY: isContentScrollable ? \"auto\" : \"hidden\",\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{children}\n\t\t\t\t\t\t</ScrollArea>\n\n\t\t\t\t\t\t{footer && resolvedDividers.footer && (\n\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{footer && <div className=\"shrink-0 px-6 pt-4 pb-6\">{footer}</div>}\n\t\t\t\t\t</m.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\n\t\tif (portal) {\n\t\t\tif (!mounted) return null;\n\t\t\treturn createPortal(content, document.body);\n\t\t}\n\n\t\treturn content;\n\t},\n);\n\nBottomSheet.displayName = \"BottomSheet\";\n","/**\n * @file sheets/shared/scrim.tsx\n *\n * Animated backdrop overlay (Scrim) for Modal Sheet variants.\n *\n * Supports animated opacity via `style.opacity` (MotionValue) so the scrim\n * fades in real-time as the user drags the sheet toward dismiss position.\n *\n * @see https://m3.material.io/components/sheets-bottom/guidelines#b0025900-5e5b-4c4a-9a76-e0d09d63afdb\n */\n\nimport type { MotionStyle } from \"motion/react\";\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport type { ScrimProps } from \"./types\";\n\nconst SCRIM_ANIM = {\n\tinitial: { opacity: 0 },\n\tanimate: {\n\t\topacity: 1,\n\t\ttransition: { duration: 0.2, ease: \"easeOut\" as const },\n\t},\n\texit: { opacity: 0, transition: { duration: 0.18, ease: \"easeIn\" as const } },\n} as const;\n\n/**\n * Translucent backdrop rendered behind modal sheet variants.\n * Clicking the scrim triggers `onClick`.\n * Pass `style.opacity` as a MotionValue to link scrim opacity with sheet drag position.\n */\nexport const Scrim = React.forwardRef<HTMLDivElement, ScrimProps>(\n\t({ onClick, className, style }, ref) => (\n\t\t<m.div\n\t\t\tref={ref}\n\t\t\taria-hidden=\"true\"\n\t\t\tclassName={cn(\"fixed inset-0 z-40 bg-black/40\", className)}\n\t\t\tonClick={onClick}\n\t\t\tstyle={style as MotionStyle}\n\t\t\t{...SCRIM_ANIM}\n\t\t/>\n\t),\n);\n\nScrim.displayName = \"Scrim\";\n","/**\n * @file sheets/bottom-sheet/bottom-sheet-modal.tsx\n *\n * Modal Bottom Sheet — blocks background interaction.\n *\n * Android Jetpack Compose parity:\n * - Entry animation: slides up from y=100% (GAP 6 fix)\n * - PartiallyExpanded default: opens at 50% screen (GAP 1 via isModal flag)\n * - sheetMaxWidth: max-width 640px centered (GAP 2 fix)\n * - Scrim opacity linked to drag position via MotionValue (GAP 8 fix)\n * - DragHandle keyboard-accessible with cycle (GAP 3 fix)\n * - gesturesEnabled prop to disable all drag (GAP 7 fix)\n * - containerColor / contentColor props (GAP 9 fix)\n * - IME / Visual Viewport handled by hook (GAP 11 fix)\n *\n * @see https://m3.material.io/components/sheets-bottom/guidelines#modal\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { ScrollArea } from \"../../scroll-area\";\nimport { DEFAULT_SPATIAL_SPRING } from \"../../shared/motion-tokens\";\nimport { DragHandle } from \"../shared/drag-handle\";\nimport { Scrim } from \"../shared/scrim\";\nimport type { BaseSheetProps, BottomSheetSnapPoint } from \"../shared/types\";\nimport { DEFAULT_SHEET_BG, resolveDividers } from \"../shared/utils\";\nimport { useBottomSheet } from \"./use-bottom-sheet\";\n\n// ─── Animation constants ───────────────────────────────────────────────────────\n\n/**\n * Entry: slide up from bottom (y: 100% → 0) + fade.\n * Exit: slide back down (y: 0 → 100%) + fade.\n * Mirrors Android AnchoredDraggable defaultSpatialSpec motion.\n */\nconst SHEET_ANIM = {\n\tinitial: { opacity: 0.6 },\n\tanimate: { opacity: 1, transition: DEFAULT_SPATIAL_SPRING },\n\texit: {\n\t\topacity: 0,\n\t\ttransition: { duration: 0.22, ease: \"easeIn\" as const },\n\t},\n} as const;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the modal Bottom Sheet.\n */\nexport interface BottomSheetModalProps extends BaseSheetProps {\n\t/**\n\t * Maximum height of the sheet.\n\t * @default \"90dvh\"\n\t */\n\tmaxHeight?: string;\n\n\t/**\n\t * Hide the drag handle visual indicator.\n\t * @default false\n\t */\n\thideHandle?: boolean;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nconst ABSOLUTE_MAX_HEIGHT =\n\t\"calc(100dvh - max(56px, env(safe-area-inset-top, 0px)))\";\n\nfunction resolveMaxHeight(\n\tmaxHeight: string,\n\tsnapPoints?: BottomSheetSnapPoint[],\n): string {\n\tif (maxHeight === \"90dvh\" && snapPoints && snapPoints.length > 0)\n\t\treturn ABSOLUTE_MAX_HEIGHT;\n\treturn maxHeight;\n}\n\n/** Converts sheetMaxWidth to a CSS string value. */\nfunction resolveSheetMaxWidth(value?: string | number): string {\n\tif (value === undefined) return \"var(--m3-bottom-sheet-max-width, 640px)\";\n\tif (typeof value === \"number\") return `${value}px`;\n\treturn value;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Modal Bottom Sheet that slides up from the bottom edge.\n *\n * Renders into a portal, traps focus, locks body scroll, and blocks\n * background interaction with an animated Scrim.\n *\n * Dismiss by: swiping down, clicking the Scrim, or pressing Escape.\n *\n * @example\n * ```tsx\n * <BottomSheetModal isOpen={isOpen} onClose={() => setIsOpen(false)} aria-labelledby=\"sheet-title\">\n * <h2 id=\"sheet-title\">Title</h2>\n * <p>Modal sheet content</p>\n * </BottomSheetModal>\n * ```\n */\nexport const BottomSheetModal = React.forwardRef<\n\tHTMLDivElement,\n\tBottomSheetModalProps\n>(\n\t(\n\t\t{\n\t\t\tisOpen,\n\t\t\tonClose,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tmaxHeight = \"90dvh\",\n\t\t\thideHandle = false,\n\t\t\t\"aria-labelledby\": ariaLabelledBy,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\theader,\n\t\t\tfooter,\n\t\t\tdivider,\n\t\t\tscrollAreaProps,\n\t\t\tsnapPoints,\n\t\t\tdefaultSnapPoint,\n\t\t\tonSnapChange,\n\t\t\tgesturesEnabled = true,\n\t\t\tcontainerColor,\n\t\t\tsheetMaxWidth,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\tscope,\n\t\t\ty,\n\t\t\tscrimOpacity,\n\t\t\tisContentScrollable,\n\t\t\tsnapTo,\n\t\t\tcycleSnapPoint,\n\t\t} = useBottomSheet({\n\t\t\tisOpen,\n\t\t\tonClose,\n\t\t\tsnapPoints,\n\t\t\tdefaultSnapPoint,\n\t\t\tonSnapChange,\n\t\t\tgesturesEnabled,\n\t\t\tisModal: true,\n\t\t\tmaxHeight: resolveMaxHeight(maxHeight, snapPoints),\n\t\t});\n\n\t\tReact.useEffect(() => {\n\t\t\tconst node = (scope as unknown as { current: HTMLDivElement | null })\n\t\t\t\t.current;\n\t\t\tif (node) {\n\t\t\t\t(\n\t\t\t\t\tnode as HTMLDivElement & {\n\t\t\t\t\t\tsnapTo: (sp: BottomSheetSnapPoint) => void;\n\t\t\t\t\t}\n\t\t\t\t).snapTo = snapTo;\n\t\t\t}\n\t\t}, [snapTo, scope]);\n\n\t\tconst resolvedDividers = React.useMemo(\n\t\t\t() => resolveDividers(divider),\n\t\t\t[divider],\n\t\t);\n\n\t\tconst resolvedSheetMaxWidth = React.useMemo(\n\t\t\t() => resolveSheetMaxWidth(sheetMaxWidth),\n\t\t\t[sheetMaxWidth],\n\t\t);\n\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLDivElement | null) => {\n\t\t\t\tscope(node);\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[scope, ref],\n\t\t);\n\n\t\treturn (\n\t\t\t<RadixDialog.Root\n\t\t\t\topen={isOpen}\n\t\t\t\tonOpenChange={(open) => !open && onClose()}\n\t\t\t>\n\t\t\t\t<RadixDialog.Portal forceMount>\n\t\t\t\t\t<AnimatePresence>\n\t\t\t\t\t\t{isOpen && (\n\t\t\t\t\t\t\t<RadixDialog.Overlay asChild key=\"scrim\" forceMount>\n\t\t\t\t\t\t\t\t<Scrim onClick={onClose} style={{ opacity: scrimOpacity }} />\n\t\t\t\t\t\t\t</RadixDialog.Overlay>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{isOpen && (\n\t\t\t\t\t\t\t<RadixDialog.Content\n\t\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\t\tkey=\"content\"\n\t\t\t\t\t\t\t\tforceMount\n\t\t\t\t\t\t\t\taria-describedby={undefined}\n\t\t\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<m.div\n\t\t\t\t\t\t\t\t\tref={mergedRef}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// Positioning: fixed at bottom, centered with max-width\n\t\t\t\t\t\t\t\t\t\t\"fixed bottom-0 z-50\",\n\t\t\t\t\t\t\t\t\t\t\"left-0 right-0 mx-auto\",\n\t\t\t\t\t\t\t\t\t\t// Visual style\n\t\t\t\t\t\t\t\t\t\t\"rounded-t-[28px]\",\n\t\t\t\t\t\t\t\t\t\t!containerColor && DEFAULT_SHEET_BG,\n\t\t\t\t\t\t\t\t\t\t\"flex flex-col overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-inset\",\n\t\t\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tbackgroundColor: containerColor,\n\t\t\t\t\t\t\t\t\t\theight: \"var(--sheet-vh, 100dvh)\",\n\t\t\t\t\t\t\t\t\t\t// Container must span the full available viewport height so that\n\t\t\t\t\t\t\t\t\t\t// snap points above the default maxHeight (e.g. \"full\", \"70%\")\n\t\t\t\t\t\t\t\t\t\t// can reveal their content via the y (translateY) offset mechanism.\n\t\t\t\t\t\t\t\t\t\tmaxHeight: ABSOLUTE_MAX_HEIGHT,\n\t\t\t\t\t\t\t\t\t\tmaxWidth: resolvedSheetMaxWidth,\n\t\t\t\t\t\t\t\t\t\ty,\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t{...SHEET_ANIM}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<RadixDialog.Title className=\"sr-only\">\n\t\t\t\t\t\t\t\t\t\t{ariaLabel || \"Bottom Sheet\"}\n\t\t\t\t\t\t\t\t\t</RadixDialog.Title>\n\n\t\t\t\t\t\t\t\t\t{!hideHandle && <DragHandle onCycle={cycleSnapPoint} />}\n\n\t\t\t\t\t\t\t\t\t{header && <div className=\"shrink-0 px-6 pb-4\">{header}</div>}\n\t\t\t\t\t\t\t\t\t{header && resolvedDividers.header && (\n\t\t\t\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t<ScrollArea\n\t\t\t\t\t\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\t\t\t\t\t\t{...scrollAreaProps}\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-1 min-h-0 min-w-0\",\n\t\t\t\t\t\t\t\t\t\t\tscrollAreaProps?.className,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tviewportClassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"px-6 pb-6 overscroll-contain\",\n\t\t\t\t\t\t\t\t\t\t\theader ? \"pt-4\" : \"\",\n\t\t\t\t\t\t\t\t\t\t\tscrollAreaProps?.viewportClassName,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tviewportProps={{\n\t\t\t\t\t\t\t\t\t\t\t...scrollAreaProps?.viewportProps,\n\t\t\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\t\t\t...scrollAreaProps?.viewportProps?.style,\n\t\t\t\t\t\t\t\t\t\t\t\toverflowY: isContentScrollable ? \"auto\" : \"hidden\",\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>\n\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t</ScrollArea>\n\n\t\t\t\t\t\t\t\t\t{footer && resolvedDividers.footer && (\n\t\t\t\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{footer && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"shrink-0 px-6 pt-4 pb-6\">{footer}</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</m.div>\n\t\t\t\t\t\t\t</RadixDialog.Content>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</RadixDialog.Portal>\n\t\t\t</RadixDialog.Root>\n\t\t);\n\t},\n);\n\nBottomSheetModal.displayName = \"BottomSheetModal\";\n","/**\n * @file sheets/bottom-sheet/use-bottom-sheet-scaffold.ts\n *\n * Core logic for `BottomSheetScaffold` — the standard (non-modal, persistent)\n * bottom sheet layout component.\n *\n * Mirrors Android's `BottomSheetScaffoldState` / `BottomSheetState`:\n * - 2-state machine: `partiallyExpanded` ↔ `expanded` (no `hidden` state)\n * - Sheet is ALWAYS visible at minimum `peekHeight`\n * - Velocity-based fling + nearest-snap logic on drag-end\n * - BoundaryDampeningZone prevents over-flinging\n *\n * @see https://m3.material.io/components/sheets-bottom/overview#standard\n */\n\nimport type { PanInfo } from \"motion/react\";\nimport { animate, useMotionValue } from \"motion/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { SheetValue } from \"../shared/types\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface UseBottomSheetScaffoldOptions {\n\t/** Visible height when partially collapsed. Default: 56px. */\n\tpeekHeight?: number;\n\t/** Whether swipe gestures are enabled. Default: true. */\n\tswipeEnabled?: boolean;\n\t/** Called when the sheet state changes. */\n\tonStateChange?: (\n\t\tstate: Extract<SheetValue, \"partiallyExpanded\" | \"expanded\">,\n\t) => void;\n\t/** Initial state. Default: \"partiallyExpanded\". */\n\tinitialState?: Extract<SheetValue, \"partiallyExpanded\" | \"expanded\">;\n}\n\nexport interface UseBottomSheetScaffoldReturn {\n\t/** Current discrete sheet state. */\n\tsheetState: Extract<SheetValue, \"partiallyExpanded\" | \"expanded\">;\n\t/** Y MotionValue of the sheet panel (absolute from top of scaffold container). */\n\ty: ReturnType<typeof useMotionValue<number>>;\n\t/** Expand to full height. */\n\texpand: () => void;\n\t/** Collapse to peek height. */\n\tpartialExpand: () => void;\n\t/** Toggle between partiallyExpanded and expanded. */\n\ttoggle: () => void;\n\t/** Whether drag is allowed. */\n\tisDragEnabled: boolean;\n\t/** Drag constraints for m.div. */\n\tdragConstraints: { top: number; bottom: number };\n\t/** Drag-end handler — snaps to closest anchor. */\n\thandleDragEnd: (\n\t\te: MouseEvent | TouchEvent | PointerEvent,\n\t\tinfo: PanInfo,\n\t) => void;\n\t/** Scroll handler for nested content. */\n\thandleContentScroll: (e: React.UIEvent<HTMLElement>) => void;\n\t/** Height of the content area above the sheet peek. */\n\tcontentPaddingBottom: string;\n\t/** Callback ref for the scaffold's container element. */\n\tcontainerRef: React.RefCallback<HTMLDivElement | null>;\n}\n\nconst DISMISS_VELOCITY_THRESHOLD = 500;\nconst BOUNDARY_DAMPENING_ZONE = 80;\nconst SPRING = { type: \"spring\" as const, stiffness: 300, damping: 30 };\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\nexport function useBottomSheetScaffold({\n\tpeekHeight = 56,\n\tswipeEnabled = true,\n\tonStateChange,\n\tinitialState = \"partiallyExpanded\",\n}: UseBottomSheetScaffoldOptions = {}): UseBottomSheetScaffoldReturn {\n\tconst [containerHeight, setContainerHeight] = useState(\n\t\ttypeof window !== \"undefined\" ? window.innerHeight : 800,\n\t);\n\tconst containerNodeRef = useRef<HTMLDivElement | null>(null);\n\n\tconst containerRef = useCallback((node: HTMLDivElement | null) => {\n\t\tcontainerNodeRef.current = node;\n\t\tif (node) {\n\t\t\tsetContainerHeight(node.offsetHeight || window.innerHeight);\n\t\t}\n\t}, []) as React.RefCallback<HTMLDivElement | null>;\n\n\t// Measure container height on resize\n\tuseEffect(() => {\n\t\tconst node = containerNodeRef.current;\n\t\tif (!node) return;\n\t\tconst observer = new ResizeObserver(() => {\n\t\t\tsetContainerHeight(node.offsetHeight);\n\t\t});\n\t\tobserver.observe(node);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\t// Sheet Y positions (absolute from top of container)\n\tconst expandedY = 0; // Sheet top at container top\n\tconst partialY = containerHeight - peekHeight;\n\n\tconst y = useMotionValue(initialState === \"expanded\" ? expandedY : partialY);\n\n\tconst [sheetState, setSheetState] =\n\t\tuseState<Extract<SheetValue, \"partiallyExpanded\" | \"expanded\">>(\n\t\t\tinitialState,\n\t\t);\n\tconst [isScrollDisablingDrag, setIsScrollDisablingDrag] = useState(false);\n\n\tconst isDragEnabled = swipeEnabled && !isScrollDisablingDrag;\n\n\tconst dragConstraints = useMemo(\n\t\t() => ({ top: 0, bottom: partialY }),\n\t\t[partialY],\n\t);\n\n\t// Update y when container height changes (partialY already derives from containerHeight)\n\tuseEffect(() => {\n\t\tconst targetY = sheetState === \"expanded\" ? 0 : partialY;\n\t\tvoid animate(y, targetY, SPRING);\n\t}, [partialY, sheetState, y]);\n\n\tconst expand = useCallback(() => {\n\t\tsetSheetState(\"expanded\");\n\t\tvoid animate(y, 0, SPRING);\n\t\tonStateChange?.(\"expanded\");\n\t}, [y, onStateChange]);\n\n\tconst partialExpand = useCallback(() => {\n\t\tsetSheetState(\"partiallyExpanded\");\n\t\tvoid animate(y, partialY, SPRING);\n\t\tonStateChange?.(\"partiallyExpanded\");\n\t}, [y, partialY, onStateChange]);\n\n\tconst toggle = useCallback(() => {\n\t\tif (sheetState === \"expanded\") partialExpand();\n\t\telse expand();\n\t}, [sheetState, expand, partialExpand]);\n\n\tconst handleDragEnd = useCallback(\n\t\t(_event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo) => {\n\t\t\tconst rawY = y.get();\n\t\t\tlet velocity = info.velocity.y;\n\n\t\t\t// Dampening near the floor (partialY)\n\t\t\tif (velocity > 0) {\n\t\t\t\tconst distanceToFloor = Math.max(0, partialY - rawY);\n\t\t\t\tif (distanceToFloor < BOUNDARY_DAMPENING_ZONE) {\n\t\t\t\t\tconst factor = distanceToFloor / BOUNDARY_DAMPENING_ZONE;\n\t\t\t\t\tvelocity *= factor * factor;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Velocity-based fling\n\t\t\tif (velocity > DISMISS_VELOCITY_THRESHOLD) {\n\t\t\t\tpartialExpand();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (velocity < -DISMISS_VELOCITY_THRESHOLD) {\n\t\t\t\texpand();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Snap to nearest\n\t\t\tconst midpoint = partialY / 2;\n\t\t\tif (rawY < midpoint) expand();\n\t\t\telse partialExpand();\n\t\t},\n\t\t[y, partialY, expand, partialExpand],\n\t);\n\n\tconst handleContentScroll = useCallback(\n\t\t(e: React.UIEvent<HTMLElement>) => {\n\t\t\tif (sheetState !== \"expanded\") {\n\t\t\t\te.currentTarget.scrollTop = 0;\n\t\t\t\tsetIsScrollDisablingDrag(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetIsScrollDisablingDrag(e.currentTarget.scrollTop > 0);\n\t\t},\n\t\t[sheetState],\n\t);\n\n\tconst contentPaddingBottom = `${peekHeight}px`;\n\n\treturn {\n\t\tsheetState,\n\t\ty,\n\t\texpand,\n\t\tpartialExpand,\n\t\ttoggle,\n\t\tisDragEnabled,\n\t\tdragConstraints,\n\t\thandleDragEnd,\n\t\thandleContentScroll,\n\t\tcontentPaddingBottom,\n\t\tcontainerRef,\n\t};\n}\n","/**\n * @file sheets/bottom-sheet/bottom-sheet-scaffold.tsx\n *\n * Standard Bottom Sheet Scaffold — persistent sheet layout component.\n *\n * Mirrors Android Jetpack Compose `BottomSheetScaffold`:\n * - Sheet is always visible at minimum `sheetPeekHeight` (no hidden/dismiss state)\n * - Body content lives above the sheet peek via `paddingBottom`\n * - Optional `topBar` slot\n * - Drag to expand (full container height) / collapse (peek height only)\n * - No scrim (standard sheet, not modal)\n * - Drag handle keyboard accessible: click/Space/Enter toggles state\n *\n * API (Option A — matches Kotlin):\n * ```tsx\n * <BottomSheetScaffold sheetContent={<SheetBody />}>\n * {(paddingBottom) => <PageBody style={{ paddingBottom }} />}\n * </BottomSheetScaffold>\n * ```\n *\n * @see https://m3.material.io/components/sheets-bottom/overview#standard\n */\n\nimport { m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { ScrollArea } from \"../../scroll-area\";\nimport { DEFAULT_SPATIAL_SPRING } from \"../../shared/motion-tokens\";\nimport { DragHandle } from \"../shared/drag-handle\";\nimport type { SheetValue } from \"../shared/types\";\nimport { DEFAULT_SHEET_BG } from \"../shared/utils\";\nimport { useBottomSheetScaffold } from \"./use-bottom-sheet-scaffold\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface BottomSheetScaffoldProps {\n\t/**\n\t * Content rendered inside the bottom sheet panel.\n\t * Equivalent to Kotlin's `sheetContent: @Composable ColumnScope.() -> Unit`.\n\t */\n\tsheetContent: React.ReactNode;\n\n\t/**\n\t * Body content of the page. Receives `paddingBottom` string to push\n\t * content above the visible sheet peek area.\n\t *\n\t * @example\n\t * ```tsx\n\t * {(paddingBottom) => <main style={{ paddingBottom }}>{page}</main>}\n\t * ```\n\t */\n\tchildren: (paddingBottom: string) => React.ReactNode;\n\n\t/**\n\t * Visible height of the sheet when collapsed.\n\t * Default: `\"var(--m3-bottom-sheet-peek-height, 56px)\"`\n\t */\n\tsheetPeekHeight?: number;\n\n\t/**\n\t * Maximum width of the sheet.\n\t * Default: `\"var(--m3-bottom-sheet-max-width, 640px)\"`\n\t */\n\tsheetMaxWidth?: string | number;\n\n\t/**\n\t * Custom drag handle. Pass `null` to hide the handle entirely.\n\t * Default: MD3 drag handle indicator bar.\n\t */\n\tsheetDragHandle?: React.ReactNode | null;\n\n\t/**\n\t * Enable/disable swipe gestures on the sheet.\n\t * @default true\n\t */\n\tsheetSwipeEnabled?: boolean;\n\n\t/**\n\t * Optional top app bar slot rendered above the page body.\n\t */\n\ttopBar?: React.ReactNode;\n\n\t/**\n\t * Background color of the sheet panel.\n\t * Defaults to `surfaceContainerLow` token.\n\t */\n\tsheetContainerColor?: string;\n\n\t/**\n\t * Called when the sheet transitions between states.\n\t */\n\tonSheetStateChange?: (\n\t\tstate: Extract<SheetValue, \"partiallyExpanded\" | \"expanded\">,\n\t) => void;\n\n\t/** Initial state of the sheet. @default \"partiallyExpanded\" */\n\tinitialSheetState?: Extract<SheetValue, \"partiallyExpanded\" | \"expanded\">;\n\n\t/** Additional CSS class for the outer scaffold container. */\n\tclassName?: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Standard Bottom Sheet Scaffold.\n *\n * Renders a persistent bottom sheet that stays on screen (never fully hidden).\n * The body content is offset by `sheetPeekHeight` so it is never obscured.\n *\n * @example\n * ```tsx\n * <BottomSheetScaffold\n * sheetContent={<p>Player controls</p>}\n * topBar={<AppBar />}\n * >\n * {(paddingBottom) => (\n * <AlbumList style={{ paddingBottom }} />\n * )}\n * </BottomSheetScaffold>\n * ```\n */\nexport const BottomSheetScaffold = React.forwardRef<\n\tHTMLDivElement,\n\tBottomSheetScaffoldProps\n>(\n\t(\n\t\t{\n\t\t\tsheetContent,\n\t\t\tchildren,\n\t\t\tsheetPeekHeight = 56,\n\t\t\tsheetMaxWidth,\n\t\t\tsheetDragHandle,\n\t\t\tsheetSwipeEnabled = true,\n\t\t\ttopBar,\n\t\t\tsheetContainerColor,\n\t\t\tonSheetStateChange,\n\t\t\tinitialSheetState = \"partiallyExpanded\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst {\n\t\t\ty,\n\t\t\ttoggle,\n\t\t\tisDragEnabled,\n\t\t\tdragConstraints,\n\t\t\thandleDragEnd,\n\t\t\thandleContentScroll,\n\t\t\tcontentPaddingBottom,\n\t\t\tcontainerRef,\n\t\t} = useBottomSheetScaffold({\n\t\t\tpeekHeight: sheetPeekHeight,\n\t\t\tswipeEnabled: sheetSwipeEnabled,\n\t\t\tonStateChange: onSheetStateChange,\n\t\t\tinitialState: initialSheetState,\n\t\t});\n\n\t\tconst resolvedSheetMaxWidth = React.useMemo(() => {\n\t\t\tif (sheetMaxWidth === undefined)\n\t\t\t\treturn \"var(--m3-bottom-sheet-max-width, 640px)\";\n\t\t\tif (typeof sheetMaxWidth === \"number\") return `${sheetMaxWidth}px`;\n\t\t\treturn sheetMaxWidth;\n\t\t}, [sheetMaxWidth]);\n\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLDivElement | null) => {\n\t\t\t\tcontainerRef(node);\n\t\t\t\tif (typeof ref === \"function\") ref(node);\n\t\t\t\telse if (ref) ref.current = node;\n\t\t\t},\n\t\t\t[containerRef, ref],\n\t\t);\n\n\t\t// Default drag handle: MD3 indicator bar, interactive for keyboard users\n\t\tconst resolvedDragHandle = React.useMemo(() => {\n\t\t\tif (sheetDragHandle === null) return null;\n\t\t\tif (sheetDragHandle !== undefined) return sheetDragHandle;\n\t\t\treturn <DragHandle onCycle={toggle} />;\n\t\t}, [sheetDragHandle, toggle]);\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={mergedRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex flex-col h-full w-full overflow-hidden\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Top bar slot */}\n\t\t\t\t{topBar && <div className=\"shrink-0 z-10\">{topBar}</div>}\n\n\t\t\t\t{/* Body content area — receives paddingBottom to clear the peek area */}\n\t\t\t\t<div className=\"relative flex-1 min-h-0 overflow-y-auto\">\n\t\t\t\t\t{children(contentPaddingBottom)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Sheet panel — positioned absolutely at the bottom of the scaffold */}\n\t\t\t\t<m.div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute bottom-0 left-0 right-0 mx-auto\",\n\t\t\t\t\t\t\"rounded-t-[28px] flex flex-col overflow-hidden\",\n\t\t\t\t\t\t!sheetContainerColor && DEFAULT_SHEET_BG,\n\t\t\t\t\t\t// MD3 elevation-1 for standard sheet\n\t\t\t\t\t\t\"elevation-1\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackgroundColor: sheetContainerColor,\n\t\t\t\t\t\tmaxWidth: resolvedSheetMaxWidth,\n\t\t\t\t\t\ty,\n\t\t\t\t\t\t// Sheet panel is always tall enough to fill from top to bottom\n\t\t\t\t\t\theight: \"100%\",\n\t\t\t\t\t\ttransformOrigin: \"center bottom\",\n\t\t\t\t\t}}\n\t\t\t\t\tdrag={isDragEnabled ? \"y\" : false}\n\t\t\t\t\tdragConstraints={dragConstraints}\n\t\t\t\t\tdragElastic={{ top: 0.1, bottom: 0 }}\n\t\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t\t\ttransition={DEFAULT_SPATIAL_SPRING}\n\t\t\t\t>\n\t\t\t\t\t{/* Drag handle */}\n\t\t\t\t\t{resolvedDragHandle}\n\n\t\t\t\t\t{/* Sheet content in a scroll area */}\n\t\t\t\t\t<ScrollArea\n\t\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\t\tclassName=\"flex-1 min-h-0 min-w-0\"\n\t\t\t\t\t\tviewportClassName=\"px-6 pb-6\"\n\t\t\t\t\t\tviewportProps={{\n\t\t\t\t\t\t\tonScroll: handleContentScroll,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{sheetContent}\n\t\t\t\t\t</ScrollArea>\n\t\t\t\t</m.div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nBottomSheetScaffold.displayName = \"BottomSheetScaffold\";\n","/**\n * @file sheets/side-sheet/side-sheet.tsx\n *\n * Standard (non-modal) Side Sheet following MD3 specification.\n *\n * - Slides from `start` (left in LTR) or `end` (right in LTR) edge\n * - Coplanar sibling support via `coplanarSiblingRef` — animates adjacent\n * content's margin using a CSS transition\n * - Inline rendering (no portal) — does not block background interaction\n * - WAI-ARIA: `role=\"complementary\"`\n *\n * @see https://m3.material.io/components/side-sheets/overview\n */\n\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../../lib/utils\";\nimport { ScrollArea } from \"../../scroll-area\";\nimport { getMotionTransitionCSS } from \"../../shared/motion-tokens\";\nimport type { BaseSheetProps, SheetEdge } from \"../shared/types\";\nimport { buildSideSheetAnim, resolveDividers } from \"../shared/utils\";\n\nconst COPLANAR_TRANSITION = `margin ${getMotionTransitionCSS(\"default\", \"spatial\")}`;\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the standard (non-modal) Side Sheet.\n */\nexport interface SideSheetProps extends BaseSheetProps {\n\t/**\n\t * Which edge the sheet slides in from.\n\t * - `start` — left in LTR, right in RTL\n\t * - `end` — right in LTR, left in RTL\n\t * @default \"end\"\n\t */\n\tedge?: SheetEdge;\n\n\t/**\n\t * Width of the sheet.\n\t * @default \"360px\"\n\t */\n\twidth?: string;\n\n\t/**\n\t * Ref to the sibling element that should animate its margin when the\n\t * sheet opens/closes (coplanar layout).\n\t *\n\t * @example\n\t * ```tsx\n\t * const mainRef = useRef<HTMLDivElement>(null);\n\t * <main ref={mainRef}>...</main>\n\t * <SideSheet coplanarSiblingRef={mainRef} isOpen={open} onClose={handleClose}>\n\t * ...\n\t * </SideSheet>\n\t * ```\n\t */\n\tcoplanarSiblingRef?: React.RefObject<HTMLElement | null>;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Standard (non-modal) Side Sheet that slides in from a screen edge.\n *\n * Does NOT block background interaction. Pass `coplanarSiblingRef` to\n * enable automatic margin animation on an adjacent element.\n */\nexport const SideSheet = React.forwardRef<HTMLElement, SideSheetProps>(\n\t(\n\t\t{\n\t\t\tisOpen,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tedge = \"end\",\n\t\t\twidth = \"360px\",\n\t\t\tcoplanarSiblingRef,\n\t\t\tportal = true,\n\t\t\t\"aria-labelledby\": ariaLabelledBy,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\theader,\n\t\t\tfooter,\n\t\t\tdivider,\n\t\t\tscrollAreaProps,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst sheetAnim = React.useMemo(() => buildSideSheetAnim(edge), [edge]);\n\n\t\tconst [mounted, setMounted] = React.useState(false);\n\t\tReact.useEffect(() => {\n\t\t\tsetMounted(true);\n\t\t}, []);\n\n\t\tconst resolvedDividers = React.useMemo(\n\t\t\t() => resolveDividers(divider),\n\t\t\t[divider],\n\t\t);\n\n\t\t// Coplanar sibling margin animation\n\t\tReact.useEffect(() => {\n\t\t\tconst sibling = coplanarSiblingRef?.current;\n\t\t\tif (!sibling) return;\n\n\t\t\tsibling.style.transition = COPLANAR_TRANSITION;\n\t\t\tconst marginProp = edge === \"end\" ? \"marginRight\" : \"marginLeft\";\n\t\t\tsibling.style[marginProp] = isOpen ? width : \"\";\n\n\t\t\treturn () => {\n\t\t\t\tsibling.style.marginRight = \"\";\n\t\t\t\tsibling.style.marginLeft = \"\";\n\t\t\t\tsibling.style.transition = \"\";\n\t\t\t};\n\t\t}, [isOpen, edge, width, coplanarSiblingRef]);\n\n\t\tconst content = (\n\t\t\t<AnimatePresence>\n\t\t\t\t{isOpen && (\n\t\t\t\t\t<m.aside\n\t\t\t\t\t\tref={ref as React.Ref<HTMLElement>}\n\t\t\t\t\t\trole=\"complementary\"\n\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"fixed top-0 bottom-0 z-40\",\n\t\t\t\t\t\t\tedge === \"end\" ? \"right-0\" : \"left-0\",\n\t\t\t\t\t\t\t\"bg-m3-surface-container-low\",\n\t\t\t\t\t\t\t\"flex flex-col overflow-hidden\",\n\t\t\t\t\t\t\tedge === \"end\"\n\t\t\t\t\t\t\t\t? \"border-l border-m3-outline-variant\"\n\t\t\t\t\t\t\t\t: \"border-r border-m3-outline-variant\",\n\t\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-inset\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{ width }}\n\t\t\t\t\t\t{...sheetAnim}\n\t\t\t\t\t>\n\t\t\t\t\t\t{header && <div className=\"shrink-0 px-6 py-4\">{header}</div>}\n\t\t\t\t\t\t{header && resolvedDividers.header && (\n\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<ScrollArea\n\t\t\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\t\t\t{...scrollAreaProps}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex-1 min-h-0 min-w-0\",\n\t\t\t\t\t\t\t\tscrollAreaProps?.className,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tviewportClassName={cn(\n\t\t\t\t\t\t\t\t\"overscroll-contain\",\n\t\t\t\t\t\t\t\tscrollAreaProps?.viewportClassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tviewportProps={scrollAreaProps?.viewportProps}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t</ScrollArea>\n\n\t\t\t\t\t\t{footer && resolvedDividers.footer && (\n\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{footer && <div className=\"shrink-0 px-6 py-4\">{footer}</div>}\n\t\t\t\t\t</m.aside>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t);\n\n\t\tif (portal) {\n\t\t\tif (!mounted) return null;\n\t\t\treturn createPortal(content, document.body);\n\t\t}\n\n\t\treturn content;\n\t},\n);\n\nSideSheet.displayName = \"SideSheet\";\n","/**\n * @file sheets/side-sheet/side-sheet-modal.tsx\n *\n * Modal Side Sheet — blocks background interaction with a Scrim overlay.\n *\n * Differences from `SideSheet` (standard):\n * - Uses `@radix-ui/react-dialog` for focus trap & scroll lock\n * - Portal rendering outside current DOM tree\n * - Scrim blocks background; clicking it calls `onClose`\n * - Escape key calls `onClose` (Radix built-in)\n * - `aria-modal=\"true\"`\n *\n * @see https://m3.material.io/components/side-sheets/guidelines#modal\n */\n\nimport * as RadixDialog from \"@radix-ui/react-dialog\";\nimport { AnimatePresence, m } from \"motion/react\";\nimport * as React from \"react\";\nimport { cn } from \"../../../lib/utils\";\nimport { ScrollArea } from \"../../scroll-area\";\nimport { Scrim } from \"../shared/scrim\";\nimport type { BaseSheetProps, SheetEdge } from \"../shared/types\";\nimport { buildSideSheetAnim, resolveDividers } from \"../shared/utils\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Props for the modal Side Sheet.\n */\nexport interface SideSheetModalProps extends BaseSheetProps {\n\t/**\n\t * Which edge the sheet slides in from.\n\t * @default \"end\"\n\t */\n\tedge?: SheetEdge;\n\n\t/**\n\t * Width of the sheet.\n\t * @default \"360px\"\n\t */\n\twidth?: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Modal Side Sheet that slides in from a screen edge and blocks background interaction.\n *\n * Dismiss by: clicking the Scrim or pressing Escape.\n *\n * @example\n * ```tsx\n * <SideSheetModal isOpen={isOpen} onClose={() => setIsOpen(false)} edge=\"end\" aria-labelledby=\"panel-title\">\n * <h2 id=\"panel-title\">Panel</h2>\n * <p>Modal side content</p>\n * </SideSheetModal>\n * ```\n */\nexport const SideSheetModal = React.forwardRef<\n\tHTMLDivElement,\n\tSideSheetModalProps\n>(\n\t(\n\t\t{\n\t\t\tisOpen,\n\t\t\tonClose,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tedge = \"end\",\n\t\t\twidth = \"360px\",\n\t\t\t\"aria-labelledby\": ariaLabelledBy,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\theader,\n\t\t\tfooter,\n\t\t\tdivider,\n\t\t\tscrollAreaProps,\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst sheetAnim = React.useMemo(() => buildSideSheetAnim(edge), [edge]);\n\t\tconst resolvedDividers = React.useMemo(\n\t\t\t() => resolveDividers(divider),\n\t\t\t[divider],\n\t\t);\n\n\t\treturn (\n\t\t\t<RadixDialog.Root\n\t\t\t\topen={isOpen}\n\t\t\t\tonOpenChange={(open) => !open && onClose()}\n\t\t\t>\n\t\t\t\t<RadixDialog.Portal forceMount>\n\t\t\t\t\t<AnimatePresence mode=\"wait\">\n\t\t\t\t\t\t{isOpen && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<RadixDialog.Overlay asChild>\n\t\t\t\t\t\t\t\t\t<Scrim onClick={onClose} />\n\t\t\t\t\t\t\t\t</RadixDialog.Overlay>\n\n\t\t\t\t\t\t\t\t<RadixDialog.Content\n\t\t\t\t\t\t\t\t\tasChild\n\t\t\t\t\t\t\t\t\taria-describedby={undefined}\n\t\t\t\t\t\t\t\t\taria-labelledby={ariaLabelledBy}\n\t\t\t\t\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\t\t\t\t\tonEscapeKeyDown={onClose}\n\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\t\tref={ref}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"fixed top-0 bottom-0 z-50\",\n\t\t\t\t\t\t\t\t\t\t\tedge === \"end\" ? \"right-0\" : \"left-0\",\n\t\t\t\t\t\t\t\t\t\t\t\"bg-m3-surface-container-low\",\n\t\t\t\t\t\t\t\t\t\t\t\"flex flex-col overflow-hidden\",\n\t\t\t\t\t\t\t\t\t\t\tedge === \"end\"\n\t\t\t\t\t\t\t\t\t\t\t\t? \"border-l border-m3-outline-variant rounded-l-m3-xl\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"border-r border-m3-outline-variant rounded-r-m3-xl\",\n\t\t\t\t\t\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-m3-primary focus-visible:ring-inset\",\n\t\t\t\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width }}\n\t\t\t\t\t\t\t\t\t\t{...sheetAnim}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<RadixDialog.Title className=\"sr-only\">\n\t\t\t\t\t\t\t\t\t\t\t{ariaLabel || \"Side Sheet\"}\n\t\t\t\t\t\t\t\t\t\t</RadixDialog.Title>\n\n\t\t\t\t\t\t\t\t\t\t{header && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"shrink-0 px-6 py-4\">{header}</div>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{header && resolvedDividers.header && (\n\t\t\t\t\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t<ScrollArea\n\t\t\t\t\t\t\t\t\t\t\ttype=\"hover\"\n\t\t\t\t\t\t\t\t\t\t\t{...scrollAreaProps}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex-1 min-h-0 min-w-0\",\n\t\t\t\t\t\t\t\t\t\t\t\tscrollAreaProps?.className,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tviewportClassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"overscroll-contain\",\n\t\t\t\t\t\t\t\t\t\t\t\tscrollAreaProps?.viewportClassName,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\tviewportProps={scrollAreaProps?.viewportProps}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t\t</ScrollArea>\n\n\t\t\t\t\t\t\t\t\t\t{footer && resolvedDividers.footer && (\n\t\t\t\t\t\t\t\t\t\t\t<hr className=\"border-t border-m3-outline-variant w-full shrink-0 m-0\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{footer && (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"shrink-0 px-6 py-4\">{footer}</div>\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</RadixDialog.Content>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</RadixDialog.Portal>\n\t\t\t</RadixDialog.Root>\n\t\t);\n\t},\n);\n\nSideSheetModal.displayName = \"SideSheetModal\";\n"]}