@kushagradhawan/kookie-ui 0.1.71 → 0.1.73

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 (118) hide show
  1. package/README.md +4 -0
  2. package/components.css +69 -382
  3. package/dist/cjs/components/_internal/base-button.d.ts.map +1 -1
  4. package/dist/cjs/components/_internal/base-button.js +1 -1
  5. package/dist/cjs/components/_internal/base-button.js.map +3 -3
  6. package/dist/cjs/components/_internal/shell-bottom.d.ts.map +1 -1
  7. package/dist/cjs/components/_internal/shell-bottom.js +1 -1
  8. package/dist/cjs/components/_internal/shell-bottom.js.map +3 -3
  9. package/dist/cjs/components/_internal/shell-inspector.d.ts.map +1 -1
  10. package/dist/cjs/components/_internal/shell-inspector.js +1 -1
  11. package/dist/cjs/components/_internal/shell-inspector.js.map +3 -3
  12. package/dist/cjs/components/_internal/shell-sidebar.d.ts.map +1 -1
  13. package/dist/cjs/components/_internal/shell-sidebar.js +1 -1
  14. package/dist/cjs/components/_internal/shell-sidebar.js.map +3 -3
  15. package/dist/cjs/components/button.d.ts.map +1 -1
  16. package/dist/cjs/components/button.js +1 -1
  17. package/dist/cjs/components/button.js.map +3 -3
  18. package/dist/cjs/components/chatbar.d.ts.map +1 -1
  19. package/dist/cjs/components/chatbar.js.map +2 -2
  20. package/dist/cjs/components/icon-button.d.ts.map +1 -1
  21. package/dist/cjs/components/icon-button.js +2 -2
  22. package/dist/cjs/components/icon-button.js.map +3 -3
  23. package/dist/cjs/components/shell.d.ts.map +1 -1
  24. package/dist/cjs/components/shell.js +1 -1
  25. package/dist/cjs/components/shell.js.map +3 -3
  26. package/dist/cjs/components/toggle-button.d.ts.map +1 -1
  27. package/dist/cjs/components/toggle-button.js +1 -1
  28. package/dist/cjs/components/toggle-button.js.map +3 -3
  29. package/dist/cjs/components/toggle-icon-button.d.ts.map +1 -1
  30. package/dist/cjs/components/toggle-icon-button.js +1 -1
  31. package/dist/cjs/components/toggle-icon-button.js.map +3 -3
  32. package/dist/cjs/hooks/index.d.ts +2 -0
  33. package/dist/cjs/hooks/index.d.ts.map +1 -1
  34. package/dist/cjs/hooks/index.js +1 -1
  35. package/dist/cjs/hooks/index.js.map +3 -3
  36. package/dist/cjs/hooks/use-live-announcer.d.ts.map +1 -1
  37. package/dist/cjs/hooks/use-live-announcer.js +2 -2
  38. package/dist/cjs/hooks/use-live-announcer.js.map +3 -3
  39. package/dist/cjs/hooks/use-toggle-state.d.ts +37 -0
  40. package/dist/cjs/hooks/use-toggle-state.d.ts.map +1 -0
  41. package/dist/cjs/hooks/use-toggle-state.js +2 -0
  42. package/dist/cjs/hooks/use-toggle-state.js.map +7 -0
  43. package/dist/cjs/hooks/use-tooltip-wrapper.d.ts +29 -0
  44. package/dist/cjs/hooks/use-tooltip-wrapper.d.ts.map +1 -0
  45. package/dist/cjs/hooks/use-tooltip-wrapper.js +2 -0
  46. package/dist/cjs/hooks/use-tooltip-wrapper.js.map +7 -0
  47. package/dist/esm/components/_internal/base-button.d.ts.map +1 -1
  48. package/dist/esm/components/_internal/base-button.js +1 -1
  49. package/dist/esm/components/_internal/base-button.js.map +3 -3
  50. package/dist/esm/components/_internal/shell-bottom.d.ts.map +1 -1
  51. package/dist/esm/components/_internal/shell-bottom.js +1 -1
  52. package/dist/esm/components/_internal/shell-bottom.js.map +3 -3
  53. package/dist/esm/components/_internal/shell-inspector.d.ts.map +1 -1
  54. package/dist/esm/components/_internal/shell-inspector.js +1 -1
  55. package/dist/esm/components/_internal/shell-inspector.js.map +3 -3
  56. package/dist/esm/components/_internal/shell-sidebar.d.ts.map +1 -1
  57. package/dist/esm/components/_internal/shell-sidebar.js +1 -1
  58. package/dist/esm/components/_internal/shell-sidebar.js.map +3 -3
  59. package/dist/esm/components/button.d.ts.map +1 -1
  60. package/dist/esm/components/button.js +1 -1
  61. package/dist/esm/components/button.js.map +3 -3
  62. package/dist/esm/components/chatbar.d.ts.map +1 -1
  63. package/dist/esm/components/chatbar.js.map +2 -2
  64. package/dist/esm/components/icon-button.d.ts.map +1 -1
  65. package/dist/esm/components/icon-button.js +2 -2
  66. package/dist/esm/components/icon-button.js.map +3 -3
  67. package/dist/esm/components/shell.d.ts.map +1 -1
  68. package/dist/esm/components/shell.js +1 -1
  69. package/dist/esm/components/shell.js.map +3 -3
  70. package/dist/esm/components/toggle-button.d.ts.map +1 -1
  71. package/dist/esm/components/toggle-button.js +1 -1
  72. package/dist/esm/components/toggle-button.js.map +3 -3
  73. package/dist/esm/components/toggle-icon-button.d.ts.map +1 -1
  74. package/dist/esm/components/toggle-icon-button.js +1 -1
  75. package/dist/esm/components/toggle-icon-button.js.map +3 -3
  76. package/dist/esm/hooks/index.d.ts +2 -0
  77. package/dist/esm/hooks/index.d.ts.map +1 -1
  78. package/dist/esm/hooks/index.js +1 -1
  79. package/dist/esm/hooks/index.js.map +3 -3
  80. package/dist/esm/hooks/use-live-announcer.d.ts.map +1 -1
  81. package/dist/esm/hooks/use-live-announcer.js +2 -2
  82. package/dist/esm/hooks/use-live-announcer.js.map +3 -3
  83. package/dist/esm/hooks/use-toggle-state.d.ts +37 -0
  84. package/dist/esm/hooks/use-toggle-state.d.ts.map +1 -0
  85. package/dist/esm/hooks/use-toggle-state.js +2 -0
  86. package/dist/esm/hooks/use-toggle-state.js.map +7 -0
  87. package/dist/esm/hooks/use-tooltip-wrapper.d.ts +29 -0
  88. package/dist/esm/hooks/use-tooltip-wrapper.d.ts.map +1 -0
  89. package/dist/esm/hooks/use-tooltip-wrapper.js +2 -0
  90. package/dist/esm/hooks/use-tooltip-wrapper.js.map +7 -0
  91. package/package.json +4 -4
  92. package/schemas/base-button.json +1 -1
  93. package/schemas/button.json +1 -1
  94. package/schemas/icon-button.json +1 -1
  95. package/schemas/index.json +6 -6
  96. package/schemas/toggle-button.json +1 -1
  97. package/schemas/toggle-icon-button.json +1 -1
  98. package/src/components/_internal/base-button.css +136 -614
  99. package/src/components/_internal/base-button.tsx +15 -13
  100. package/src/components/_internal/shell-bottom.tsx +31 -5
  101. package/src/components/_internal/shell-inspector.tsx +31 -5
  102. package/src/components/_internal/shell-sidebar.tsx +34 -6
  103. package/src/components/button.tsx +13 -42
  104. package/src/components/chatbar.tsx +1 -13
  105. package/src/components/icon-button.tsx +20 -44
  106. package/src/components/image.css +10 -8
  107. package/src/components/shell.css +10 -11
  108. package/src/components/shell.tsx +59 -11
  109. package/src/components/toggle-button.tsx +30 -59
  110. package/src/components/toggle-icon-button.tsx +29 -51
  111. package/src/hooks/index.ts +2 -0
  112. package/src/hooks/use-live-announcer.ts +34 -7
  113. package/src/hooks/use-toggle-state.ts +72 -0
  114. package/src/hooks/use-tooltip-wrapper.ts +28 -0
  115. package/src/styles/tokens/color.css +11 -1
  116. package/styles.css +76 -383
  117. package/tokens/base.css +7 -1
  118. package/tokens.css +7 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/index.ts"],
4
- "sourcesContent": ["export { useLiveAnnouncer } from './use-live-announcer.js';\nexport { useBodyPointerEventsCleanup } from './use-body-pointer-events-cleanup.js';\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wHAAAE,EAAAF,GAAA,IAAAG,EAAiC,mCACjCC,EAA4C",
6
- "names": ["hooks_exports", "__export", "__toCommonJS", "import_use_live_announcer", "import_use_body_pointer_events_cleanup"]
4
+ "sourcesContent": ["export { useLiveAnnouncer } from './use-live-announcer.js';\nexport { useBodyPointerEventsCleanup } from './use-body-pointer-events-cleanup.js';\nexport { useTooltipWrapper } from './use-tooltip-wrapper.js';\nexport { useToggleState } from './use-toggle-state.js';\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sMAAAE,EAAAF,GAAA,IAAAG,EAAiC,mCACjCC,EAA4C,gDAC5CC,EAAkC,oCAClCC,EAA+B",
6
+ "names": ["hooks_exports", "__export", "__toCommonJS", "import_use_live_announcer", "import_use_body_pointer_events_cleanup", "import_use_tooltip_wrapper", "import_use_toggle_state"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use-live-announcer.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-live-announcer.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,gBAAgB,cA+Be,MAAM,UAcpD"}
1
+ {"version":3,"file":"use-live-announcer.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-live-announcer.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,wBAAgB,gBAAgB,cA+Ce,MAAM,UAmBpD"}
@@ -1,4 +1,4 @@
1
- "use strict";var a=Object.create;var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var p=(t,e)=>{for(var n in e)o(t,n,{get:e[n],enumerable:!0})},c=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of s(e))!m.call(t,i)&&i!==n&&o(t,i,{get:()=>e[i],enumerable:!(r=l(e,i))||r.enumerable});return t};var v=(t,e,n)=>(n=t!=null?a(d(t)):{},c(e||!t||!t.__esModule?o(n,"default",{value:t,enumerable:!0}):n,t)),f=t=>c(o({},"__esModule",{value:!0}),t);var x={};p(x,{useLiveAnnouncer:()=>h});module.exports=f(x);var u=v(require("react"));function h(){return u.useEffect(()=>{let e=document.getElementById("rt-live-announcer");return e||(e=document.createElement("div"),e.id="rt-live-announcer",e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),e.style.cssText=`
1
+ "use strict";var a=Object.create;var r=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var f=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var p=(e,n)=>{for(var t in n)r(e,t,{get:n[t],enumerable:!0})},l=(e,n,t,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of s(n))!m.call(e,o)&&o!==t&&r(e,o,{get:()=>n[o],enumerable:!(i=d(n,o))||i.enumerable});return e};var v=(e,n,t)=>(t=e!=null?a(f(e)):{},l(n||!e||!e.__esModule?r(t,"default",{value:e,enumerable:!0}):t,e)),g=e=>l(r({},"__esModule",{value:!0}),e);var x={};p(x,{useLiveAnnouncer:()=>R});module.exports=g(x);var u=v(require("react"));let c=0;function R(){const e=u.useRef(void 0);return u.useEffect(()=>{let t=document.getElementById("rt-live-announcer");return t||(t=document.createElement("div"),t.id="rt-live-announcer",t.setAttribute("aria-live","polite"),t.setAttribute("aria-atomic","true"),t.style.cssText=`
2
2
  position: absolute;
3
3
  left: -10000px;
4
4
  width: 1px;
@@ -6,5 +6,5 @@
6
6
  overflow: hidden;
7
7
  clip: rect(0, 0, 0, 0);
8
8
  white-space: nowrap;
9
- `,document.body.appendChild(e)),()=>{e&&!e.hasChildNodes()&&e.remove()}},[]),u.useCallback(e=>{const n=document.getElementById("rt-live-announcer");n&&(n.textContent="",setTimeout(()=>{n.textContent=e},100))},[])}
9
+ `,document.body.appendChild(t)),c++,()=>{if(c--,e.current&&clearTimeout(e.current),c===0){const i=document.getElementById("rt-live-announcer");i&&i.remove()}}},[]),u.useCallback(t=>{const i=document.getElementById("rt-live-announcer");i&&(e.current&&clearTimeout(e.current),i.textContent="",e.current=setTimeout(()=>{i.textContent=t},100))},[])}
10
10
  //# sourceMappingURL=use-live-announcer.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/hooks/use-live-announcer.ts"],
4
- "sourcesContent": ["import * as React from 'react';\n\n/**\n * Hook for making live announcements to screen readers\n * Creates a hidden aria-live region for announcing dynamic content changes\n */\nexport function useLiveAnnouncer() {\n\n // Create aria-live region if it doesn't exist\n React.useEffect(() => {\n let liveRegion = document.getElementById('rt-live-announcer');\n \n if (!liveRegion) {\n liveRegion = document.createElement('div');\n liveRegion.id = 'rt-live-announcer';\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.style.cssText = `\n position: absolute;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n `;\n document.body.appendChild(liveRegion);\n }\n\n return () => {\n // Clean up on unmount if no other components are using it\n if (liveRegion && !liveRegion.hasChildNodes()) {\n liveRegion.remove();\n }\n };\n }, []);\n\n const announce = React.useCallback((message: string) => {\n const liveRegion = document.getElementById('rt-live-announcer');\n if (liveRegion) {\n // Clear previous announcements\n liveRegion.textContent = '';\n \n // Add new announcement with a small delay to ensure it's announced\n setTimeout(() => {\n liveRegion.textContent = message;\n }, 100);\n }\n }, []);\n\n return announce;\n} "],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBAMhB,SAASF,GAAmB,CAGjC,OAAAE,EAAM,UAAU,IAAM,CACpB,IAAIC,EAAa,SAAS,eAAe,mBAAmB,EAE5D,OAAKA,IACHA,EAAa,SAAS,cAAc,KAAK,EACzCA,EAAW,GAAK,oBAChBA,EAAW,aAAa,YAAa,QAAQ,EAC7CA,EAAW,aAAa,cAAe,MAAM,EAC7CA,EAAW,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAS3B,SAAS,KAAK,YAAYA,CAAU,GAG/B,IAAM,CAEPA,GAAc,CAACA,EAAW,cAAc,GAC1CA,EAAW,OAAO,CAEtB,CACF,EAAG,CAAC,CAAC,EAEYD,EAAM,YAAaE,GAAoB,CACtD,MAAMD,EAAa,SAAS,eAAe,mBAAmB,EAC1DA,IAEFA,EAAW,YAAc,GAGzB,WAAW,IAAM,CACfA,EAAW,YAAcC,CAC3B,EAAG,GAAG,EAEV,EAAG,CAAC,CAAC,CAGP",
6
- "names": ["use_live_announcer_exports", "__export", "useLiveAnnouncer", "__toCommonJS", "React", "liveRegion", "message"]
4
+ "sourcesContent": ["import * as React from 'react';\n\n/**\n * Reference counter to track how many components are using the live region.\n * Only remove the live region when no components are using it.\n */\nlet liveRegionRefCount = 0;\n\n/**\n * Hook for making live announcements to screen readers\n * Creates a hidden aria-live region for announcing dynamic content changes\n */\nexport function useLiveAnnouncer() {\n // Track the timeout so we can clean it up on unmount\n const timeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n // Create aria-live region if it doesn't exist\n React.useEffect(() => {\n let liveRegion = document.getElementById('rt-live-announcer');\n\n if (!liveRegion) {\n liveRegion = document.createElement('div');\n liveRegion.id = 'rt-live-announcer';\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.style.cssText = `\n position: absolute;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n `;\n document.body.appendChild(liveRegion);\n }\n\n // Increment ref count when component mounts\n liveRegionRefCount++;\n\n return () => {\n // Decrement ref count when component unmounts\n liveRegionRefCount--;\n\n // Clean up timeout on unmount\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Only remove the live region if no components are using it\n if (liveRegionRefCount === 0) {\n const region = document.getElementById('rt-live-announcer');\n if (region) {\n region.remove();\n }\n }\n };\n }, []);\n\n const announce = React.useCallback((message: string) => {\n const liveRegion = document.getElementById('rt-live-announcer');\n if (liveRegion) {\n // Clear any pending timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Clear previous announcements\n liveRegion.textContent = '';\n\n // Add new announcement with a small delay to ensure it's announced\n timeoutRef.current = setTimeout(() => {\n liveRegion.textContent = message;\n }, 100);\n }\n }, []);\n\n return announce;\n}\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBAMvB,IAAIC,EAAqB,EAMlB,SAASH,GAAmB,CAEjC,MAAMI,EAAaF,EAAM,OAAkD,MAAS,EAGpF,OAAAA,EAAM,UAAU,IAAM,CACpB,IAAIG,EAAa,SAAS,eAAe,mBAAmB,EAE5D,OAAKA,IACHA,EAAa,SAAS,cAAc,KAAK,EACzCA,EAAW,GAAK,oBAChBA,EAAW,aAAa,YAAa,QAAQ,EAC7CA,EAAW,aAAa,cAAe,MAAM,EAC7CA,EAAW,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAS3B,SAAS,KAAK,YAAYA,CAAU,GAItCF,IAEO,IAAM,CAUX,GARAA,IAGIC,EAAW,SACb,aAAaA,EAAW,OAAO,EAI7BD,IAAuB,EAAG,CAC5B,MAAMG,EAAS,SAAS,eAAe,mBAAmB,EACtDA,GACFA,EAAO,OAAO,CAElB,CACF,CACF,EAAG,CAAC,CAAC,EAEYJ,EAAM,YAAaK,GAAoB,CACtD,MAAMF,EAAa,SAAS,eAAe,mBAAmB,EAC1DA,IAEED,EAAW,SACb,aAAaA,EAAW,OAAO,EAIjCC,EAAW,YAAc,GAGzBD,EAAW,QAAU,WAAW,IAAM,CACpCC,EAAW,YAAcE,CAC3B,EAAG,GAAG,EAEV,EAAG,CAAC,CAAC,CAGP",
6
+ "names": ["use_live_announcer_exports", "__export", "useLiveAnnouncer", "__toCommonJS", "React", "liveRegionRefCount", "timeoutRef", "liveRegion", "region", "message"]
7
7
  }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Options for the useToggleState hook
3
+ */
4
+ interface UseToggleStateOptions {
5
+ /** Controlled pressed state */
6
+ pressed?: boolean;
7
+ /** Callback when pressed state changes */
8
+ onPressedChange?: (pressed: boolean) => void;
9
+ /** Function to get the accessible name for announcements */
10
+ getAccessibleName: () => string;
11
+ /** Component name for warning messages */
12
+ componentName: string;
13
+ }
14
+ /**
15
+ * Hook for shared toggle button state management.
16
+ * Provides accessibility announcements and controlled/uncontrolled warnings.
17
+ *
18
+ * @param options - Configuration options for the toggle state
19
+ * @returns Object containing the handlePressedChange callback
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * const getAccessibleName = React.useCallback(() => 'Toggle button', []);
24
+ *
25
+ * const { handlePressedChange } = useToggleState({
26
+ * pressed,
27
+ * onPressedChange,
28
+ * getAccessibleName,
29
+ * componentName: 'ToggleButton',
30
+ * });
31
+ * ```
32
+ */
33
+ export declare function useToggleState({ pressed, onPressedChange, getAccessibleName, componentName }: UseToggleStateOptions): {
34
+ handlePressedChange: (newPressed: boolean) => void;
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=use-toggle-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-toggle-state.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-toggle-state.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,UAAU,qBAAqB;IAC7B,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0CAA0C;IAC1C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,4DAA4D;IAC5D,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,qBAAqB;sCAWnG,OAAO;EAwBvB"}
@@ -0,0 +1,2 @@
1
+ "use strict";var p=Object.create;var r=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty;var b=(e,n)=>{for(var o in n)r(e,o,{get:n[o],enumerable:!0})},u=(e,n,o,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of g(n))!m.call(e,s)&&s!==o&&r(e,s,{get:()=>n[s],enumerable:!(t=f(n,s))||t.enumerable});return e};var v=(e,n,o)=>(o=e!=null?p(h(e)):{},u(n||!e||!e.__esModule?r(o,"default",{value:e,enumerable:!0}):o,e)),w=e=>u(r({},"__esModule",{value:!0}),e);var R={};b(R,{useToggleState:()=>N});module.exports=w(R);var a=v(require("react")),i=require("./use-live-announcer.js");function N({pressed:e,onPressedChange:n,getAccessibleName:o,componentName:t}){const s=(0,i.useLiveAnnouncer)(),C=a.useRef(!1),l=a.useCallback(d=>{const c=o();s(`${c} ${d?"pressed":"unpressed"}`),n?.(d)},[s,n,o]);return a.useEffect(()=>{},[e,n,t]),{handlePressedChange:l}}
2
+ //# sourceMappingURL=use-toggle-state.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/use-toggle-state.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\nimport { useLiveAnnouncer } from './use-live-announcer.js';\n\n/**\n * Options for the useToggleState hook\n */\ninterface UseToggleStateOptions {\n /** Controlled pressed state */\n pressed?: boolean;\n /** Callback when pressed state changes */\n onPressedChange?: (pressed: boolean) => void;\n /** Function to get the accessible name for announcements */\n getAccessibleName: () => string;\n /** Component name for warning messages */\n componentName: string;\n}\n\n/**\n * Hook for shared toggle button state management.\n * Provides accessibility announcements and controlled/uncontrolled warnings.\n *\n * @param options - Configuration options for the toggle state\n * @returns Object containing the handlePressedChange callback\n *\n * @example\n * ```tsx\n * const getAccessibleName = React.useCallback(() => 'Toggle button', []);\n *\n * const { handlePressedChange } = useToggleState({\n * pressed,\n * onPressedChange,\n * getAccessibleName,\n * componentName: 'ToggleButton',\n * });\n * ```\n */\nexport function useToggleState({ pressed, onPressedChange, getAccessibleName, componentName }: UseToggleStateOptions) {\n const announce = useLiveAnnouncer();\n\n // Track if we've already warned about controlled without handler\n const warnedRef = React.useRef(false);\n\n /**\n * Memoized handler for state changes with accessibility announcements.\n * Announces the new state immediately for screen readers.\n */\n const handlePressedChange = React.useCallback(\n (newPressed: boolean) => {\n const accessibleName = getAccessibleName();\n // Announce the state change for screen readers\n announce(`${accessibleName} ${newPressed ? 'pressed' : 'unpressed'}`);\n // Call the user's change handler\n onPressedChange?.(newPressed);\n },\n [announce, onPressedChange, getAccessibleName],\n );\n\n // Development-only warning for controlled/uncontrolled pattern\n // Only warns once to avoid console spam\n React.useEffect(() => {\n if (process.env.NODE_ENV === 'development' && pressed !== undefined && onPressedChange === undefined && !warnedRef.current) {\n warnedRef.current = true;\n console.warn(\n `${componentName}: You provided a \\`pressed\\` prop without an \\`onPressedChange\\` handler. ` +\n 'This will result in a read-only toggle button. If you want the button to be interactive, ' +\n 'you should provide an `onPressedChange` handler.',\n );\n }\n }, [pressed, onPressedChange, componentName]);\n\n return { handlePressedChange };\n}\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBACvBC,EAAiC,mCAmC1B,SAASH,EAAe,CAAE,QAAAI,EAAS,gBAAAC,EAAiB,kBAAAC,EAAmB,cAAAC,CAAc,EAA0B,CACpH,MAAMC,KAAW,oBAAiB,EAG5BC,EAAYP,EAAM,OAAO,EAAK,EAM9BQ,EAAsBR,EAAM,YAC/BS,GAAwB,CACvB,MAAMC,EAAiBN,EAAkB,EAEzCE,EAAS,GAAGI,CAAc,IAAID,EAAa,UAAY,WAAW,EAAE,EAEpEN,IAAkBM,CAAU,CAC9B,EACA,CAACH,EAAUH,EAAiBC,CAAiB,CAC/C,EAIA,OAAAJ,EAAM,UAAU,IAAM,CAStB,EAAG,CAACE,EAASC,EAAiBE,CAAa,CAAC,EAErC,CAAE,oBAAAG,CAAoB,CAC/B",
6
+ "names": ["use_toggle_state_exports", "__export", "useToggleState", "__toCommonJS", "React", "import_use_live_announcer", "pressed", "onPressedChange", "getAccessibleName", "componentName", "announce", "warnedRef", "handlePressedChange", "newPressed", "accessibleName"]
7
+ }
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Hook for managing tooltip accessibility props and conditional rendering.
4
+ * Encapsulates tooltip ID generation and aria-describedby binding.
5
+ *
6
+ * @param tooltip - The tooltip content (if any)
7
+ * @returns Object containing tooltipId, hasTooltip flag, and accessibility props
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * const { tooltipId, hasTooltip, accessibilityProps } = useTooltipWrapper(tooltip);
12
+ *
13
+ * const button = <button {...accessibilityProps}>Click me</button>;
14
+ *
15
+ * if (!hasTooltip) return button;
16
+ *
17
+ * return <Tooltip id={tooltipId} content={tooltip}>{button}</Tooltip>;
18
+ * ```
19
+ */
20
+ export declare function useTooltipWrapper(tooltip: React.ReactNode): {
21
+ tooltipId: string;
22
+ hasTooltip: boolean;
23
+ accessibilityProps: {
24
+ 'aria-describedby': string;
25
+ } | {
26
+ 'aria-describedby'?: undefined;
27
+ };
28
+ };
29
+ //# sourceMappingURL=use-tooltip-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-tooltip-wrapper.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-tooltip-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS;;;;;;;;EAOzD"}
@@ -0,0 +1,2 @@
1
+ "use strict";var p=Object.create;var c=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var b=(o,e)=>{for(var t in e)c(o,t,{get:e[t],enumerable:!0})},i=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of d(e))!u.call(o,s)&&s!==t&&c(o,s,{get:()=>e[s],enumerable:!(a=n(e,s))||a.enumerable});return o};var m=(o,e,t)=>(t=o!=null?p(l(o)):{},i(e||!o||!o.__esModule?c(t,"default",{value:o,enumerable:!0}):t,o)),R=o=>i(c({},"__esModule",{value:!0}),o);var y={};b(y,{useTooltipWrapper:()=>f});module.exports=R(y);var r=m(require("react"));function f(o){const e=r.useId(),t=!!o,a=r.useMemo(()=>t?{"aria-describedby":e}:{},[t,e]);return{tooltipId:e,hasTooltip:t,accessibilityProps:a}}
2
+ //# sourceMappingURL=use-tooltip-wrapper.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/use-tooltip-wrapper.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\n\n/**\n * Hook for managing tooltip accessibility props and conditional rendering.\n * Encapsulates tooltip ID generation and aria-describedby binding.\n *\n * @param tooltip - The tooltip content (if any)\n * @returns Object containing tooltipId, hasTooltip flag, and accessibility props\n *\n * @example\n * ```tsx\n * const { tooltipId, hasTooltip, accessibilityProps } = useTooltipWrapper(tooltip);\n *\n * const button = <button {...accessibilityProps}>Click me</button>;\n *\n * if (!hasTooltip) return button;\n *\n * return <Tooltip id={tooltipId} content={tooltip}>{button}</Tooltip>;\n * ```\n */\nexport function useTooltipWrapper(tooltip: React.ReactNode) {\n const tooltipId = React.useId();\n const hasTooltip = Boolean(tooltip);\n\n const accessibilityProps = React.useMemo(() => (hasTooltip ? { 'aria-describedby': tooltipId } : {}), [hasTooltip, tooltipId]);\n\n return { tooltipId, hasTooltip, accessibilityProps };\n}\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAuB,oBAoBhB,SAASF,EAAkBG,EAA0B,CAC1D,MAAMC,EAAYF,EAAM,MAAM,EACxBG,EAAa,EAAQF,EAErBG,EAAqBJ,EAAM,QAAQ,IAAOG,EAAa,CAAE,mBAAoBD,CAAU,EAAI,CAAC,EAAI,CAACC,EAAYD,CAAS,CAAC,EAE7H,MAAO,CAAE,UAAAA,EAAW,WAAAC,EAAY,mBAAAC,CAAmB,CACrD",
6
+ "names": ["use_tooltip_wrapper_exports", "__export", "useTooltipWrapper", "__toCommonJS", "React", "tooltip", "tooltipId", "hasTooltip", "accessibilityProps"]
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"base-button.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/base-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;GAIG;AACH,KAAK,0BAA0B,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,IAAI;IACxE,0DAA0D;IAC1D,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,GAAG,kBAAkB,GACpB,WAAW,GACX,qBAAqB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,kBAAkB,GAAG,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;AAE/F;;GAEG;AACH,UAAU,eAAgB,SAAQ,0BAA0B;CAAG;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,QAAA,MAAM,UAAU,2FA4Kd,CAAC;AAGH,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"base-button.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/base-button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,KAAK,kBAAkB,GAAG,eAAe,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAErE;;;;GAIG;AACH,KAAK,0BAA0B,CAAC,CAAC,SAAS,KAAK,CAAC,WAAW,GAAG,QAAQ,IAAI;IACxE,0DAA0D;IAC1D,EAAE,CAAC,EAAE,CAAC,CAAC;CACR,GAAG,kBAAkB,GACpB,WAAW,GACX,qBAAqB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,kBAAkB,GAAG,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC;AAE/F;;GAEG;AACH,UAAU,eAAgB,SAAQ,0BAA0B;CAAG;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,QAAA,MAAM,UAAU,2FA8Kd,CAAC;AAGH,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -1,2 +1,2 @@
1
- import*as t from"react";import N from"classnames";import{Slot as j}from"radix-ui";import{baseButtonPropDefs as f}from"./base-button.props.js";import{Flex as I}from"../flex.js";import{Spinner as O}from"../spinner.js";import{VisuallyHidden as V}from"../visually-hidden.js";import{extractProps as F}from"../../helpers/extract-props.js";import{mapResponsiveProp as H,mapButtonSizeToSpinnerSize as W}from"../../helpers/map-prop-values.js";import{marginPropDefs as G}from"../../props/margin.props.js";const y=t.forwardRef((n,a)=>{const{size:b=f.size.default}=n,{className:B,children:o,asChild:i,as:s,color:P,radius:g,material:h,panelBackground:T,flush:v,disabled:p=n.loading,...d}=F(n,f,G);t.useEffect(()=>{n.panelBackground!==void 0&&console.warn("Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.")},[n.panelBackground]);const r=h??T,c=t.useRef(null);t.useEffect(()=>{const e=c.current;if(!e)return;if(r==="translucent"){e.style.setProperty("will-change","backdrop-filter");const D=()=>{const S=getComputedStyle(e).getPropertyValue("--duration-2")||"75ms",z=parseInt(S)||75;setTimeout(()=>{e&&r!=="translucent"&&e.style.setProperty("will-change","auto")},z)},m=new MutationObserver(D);return m.observe(e,{attributes:!0,attributeFilter:["data-material"]}),()=>{m.disconnect(),e.style.setProperty("will-change","auto")}}else e.style.setProperty("will-change","auto")},[r]);const w=i?j.Root:s||"button",C=i||!s||["button","input","textarea","select"].includes(s),x=!i&&(!s||s==="button"),E="type"in d,M=t.useId(),l=n.loading?`${M}-loading`:void 0,u=t.useMemo(()=>typeof o=="string"?o:t.isValidElement(o)&&typeof o.props?.children=="string"?o.props.children:"button",[o]),k=t.useMemo(()=>n.loading?{"aria-busy":!0,"aria-disabled":!0,"aria-describedby":l,"aria-label":`${u} (loading)`}:{},[n.loading,l,u]);return t.createElement(w,{"data-disabled":p||void 0,"data-accent-color":P,"data-radius":g,"data-material":r,"data-panel-background":r,"data-flush":v?"true":void 0,...d,...k,ref:e=>{typeof a=="function"?a(e):a&&(a.current=e),c.current=e},className:N("rt-reset","rt-BaseButton",B),...C&&{disabled:p},...x&&!E?{type:"button"}:{}},n.loading?t.createElement(t.Fragment,null,t.createElement("span",{style:{display:"contents",visibility:"hidden"},"aria-hidden":!0},o),t.createElement(V,null,t.createElement("span",{id:l},u," is loading, please wait..."),o),t.createElement(I,{asChild:!0,align:"center",justify:"center",position:"absolute",inset:"0"},t.createElement("span",null,t.createElement(O,{size:H(b,W),"aria-hidden":"true"})))):o)});y.displayName="BaseButton";export{y as BaseButton};
1
+ import*as e from"react";import j from"classnames";import{Slot as O}from"radix-ui";import{baseButtonPropDefs as b}from"./base-button.props.js";import{Flex as V}from"../flex.js";import{Spinner as F}from"../spinner.js";import{VisuallyHidden as H}from"../visually-hidden.js";import{extractProps as R}from"../../helpers/extract-props.js";import{mapResponsiveProp as W,mapButtonSizeToSpinnerSize as G}from"../../helpers/map-prop-values.js";import{marginPropDefs as $}from"../../props/margin.props.js";const B=e.forwardRef((n,a)=>{const{size:P=b.size.default}=n,{className:g,children:o,asChild:i,as:s,color:h,radius:T,material:v,panelBackground:w,flush:C,disabled:d=n.loading,...c}=R(n,b,$);e.useEffect(()=>{n.panelBackground!==void 0&&console.warn("Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.")},[n.panelBackground]);const r=v??w,m=e.useRef(null),f=e.useRef(r);f.current=r,e.useEffect(()=>{const t=m.current;if(!t)return;if(r==="translucent"){t.style.setProperty("will-change","backdrop-filter");let p;const z=()=>{const I=getComputedStyle(t).getPropertyValue("--duration-2")||"75ms",N=parseInt(I)||75;p=setTimeout(()=>{t&&f.current!=="translucent"&&t.style.setProperty("will-change","auto")},N)},y=new MutationObserver(z);return y.observe(t,{attributes:!0,attributeFilter:["data-material"]}),()=>{p&&clearTimeout(p),y.disconnect(),t.style.setProperty("will-change","auto")}}else t.style.setProperty("will-change","auto")},[r]);const x=i?O.Root:s||"button",E=i||!s||["button","input","textarea","select"].includes(s),M=!i&&(!s||s==="button"),k="type"in c,D=e.useId(),u=n.loading?`${D}-loading`:void 0,l=e.useMemo(()=>typeof o=="string"?o:e.isValidElement(o)&&typeof o.props?.children=="string"?o.props.children:"button",[o]),S=e.useMemo(()=>n.loading?{"aria-busy":!0,"aria-disabled":!0,"aria-describedby":u,"aria-label":`${l} (loading)`}:{},[n.loading,u,l]);return e.createElement(x,{"data-disabled":d||void 0,"data-accent-color":h,"data-radius":T,"data-material":r,"data-panel-background":r,"data-flush":C?"true":void 0,...c,...S,ref:t=>{typeof a=="function"?a(t):a&&(a.current=t),m.current=t},className:j("rt-reset","rt-BaseButton",g),...E&&{disabled:d},...M&&!k?{type:"button"}:{}},n.loading?e.createElement(e.Fragment,null,e.createElement("span",{style:{display:"contents",visibility:"hidden"},"aria-hidden":!0},o),e.createElement(H,null,e.createElement("span",{id:u},l," is loading, please wait..."),o),e.createElement(V,{asChild:!0,align:"center",justify:"center",position:"absolute",inset:"0"},e.createElement("span",null,e.createElement(F,{size:W(P,G),"aria-hidden":"true"})))):o)});B.displayName="BaseButton";export{B as BaseButton};
2
2
  //# sourceMappingURL=base-button.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/_internal/base-button.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from 'radix-ui';\n\nimport { baseButtonPropDefs } from './base-button.props.js';\nimport { Flex } from '../flex.js';\nimport { Spinner } from '../spinner.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { extractProps } from '../../helpers/extract-props.js';\nimport { mapResponsiveProp, mapButtonSizeToSpinnerSize } from '../../helpers/map-prop-values.js';\nimport { marginPropDefs } from '../../props/margin.props.js';\n\nimport type { MarginProps } from '../../props/margin.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../../props/prop-def.js';\n\ntype BaseButtonElement = React.ElementRef<'button'>;\ntype BaseButtonOwnProps = GetPropDefTypes<typeof baseButtonPropDefs>;\n\n/**\n * Polymorphic BaseButton props that support rendering as different HTML elements\n * Uses the proper ComponentPropsWithout pattern for type safety\n * @template C - The element type to render as (defaults to 'button')\n */\ntype PolymorphicBaseButtonProps<C extends React.ElementType = 'button'> = {\n /** Element type to render as (e.g., 'a', 'span', etc.) */\n as?: C;\n} & BaseButtonOwnProps &\n MarginProps &\n ComponentPropsWithout<C, RemovedProps | keyof BaseButtonOwnProps | keyof MarginProps | 'as'>;\n\n/**\n * BaseButton props interface that combines all available props\n */\ninterface BaseButtonProps extends PolymorphicBaseButtonProps {}\n\n/**\n * BaseButton component that provides the core button functionality\n *\n * This is the foundational button component that handles all the complex logic\n * including loading states, accessibility, performance optimizations, and\n * polymorphic rendering. It's used by Button, IconButton, and other button\n * variants to ensure consistent behavior across the design system.\n *\n * Key features:\n * - Loading state with spinner and accessibility announcements\n * - Performance optimizations for backdrop-filter effects\n * - Comprehensive accessibility support\n * - Polymorphic rendering support\n * - Material/panel background handling\n *\n * @example\n * ```tsx\n * // Basic usage\n * <BaseButton>Click me</BaseButton>\n *\n * // With loading state\n * <BaseButton loading>Processing...</BaseButton>\n *\n * // Polymorphic rendering\n * <BaseButton as=\"a\" href=\"/link\">Link Button</BaseButton>\n * ```\n */\nconst BaseButton = React.forwardRef<BaseButtonElement, BaseButtonProps>((props, forwardedRef) => {\n const { size = baseButtonPropDefs.size.default } = props;\n\n // Extract button-specific props from the combined props object\n const {\n className,\n children,\n asChild,\n as,\n color,\n radius,\n material,\n panelBackground,\n flush,\n disabled = props.loading, // Loading state automatically disables the button\n ...baseButtonProps\n } = extractProps(props, baseButtonPropDefs, marginPropDefs);\n\n // Show deprecation warning for panelBackground when used\n // This helps developers migrate to the new material prop\n React.useEffect(() => {\n if (props.panelBackground !== undefined) {\n console.warn(\n 'Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.',\n );\n }\n }, [props.panelBackground]);\n\n // Material takes precedence over panelBackground for backward compatibility\n const effectiveMaterial = material ?? panelBackground;\n\n // Will-change cleanup for backdrop-filter performance optimization\n // This prevents layout thrashing when using translucent materials\n const buttonRef = React.useRef<HTMLElement>(null);\n\n React.useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n\n const hasTranslucentMaterial = effectiveMaterial === 'translucent';\n\n if (hasTranslucentMaterial) {\n // Add will-change when material is translucent to optimize rendering\n button.style.setProperty('will-change', 'backdrop-filter');\n\n // Clean up will-change after transition completes to prevent memory leaks\n const cleanup = () => {\n const transitionDuration =\n getComputedStyle(button).getPropertyValue('--duration-2') || '75ms';\n const duration = parseInt(transitionDuration) || 75;\n\n setTimeout(() => {\n if (button && effectiveMaterial !== 'translucent') {\n button.style.setProperty('will-change', 'auto');\n }\n }, duration);\n };\n\n // Listen for material changes to clean up will-change property\n const observer = new MutationObserver(cleanup);\n observer.observe(button, { attributes: true, attributeFilter: ['data-material'] });\n\n return () => {\n observer.disconnect();\n button.style.setProperty('will-change', 'auto');\n };\n } else {\n // Remove will-change when material is not translucent\n button.style.setProperty('will-change', 'auto');\n }\n }, [effectiveMaterial]);\n\n // asChild takes precedence over as prop for Radix Slot integration\n const Comp = asChild ? Slot.Root : as || 'button';\n\n // Only pass disabled for elements that support it\n // This prevents invalid HTML attributes on unsupported elements\n const shouldPassDisabled =\n asChild || !as || ['button', 'input', 'textarea', 'select'].includes(as);\n\n // Determine if we are rendering a real <button> element so we can set a safe\n // default type. Native <button> defaults to type=\"submit\" which can cause\n // accidental form submissions. We default to type=\"button\" unless the user\n // explicitly provided a type or we're using asChild (unknown underlying node).\n const isNativeButtonElement = !asChild && (!as || as === 'button');\n const hasExplicitTypeAttribute = 'type' in (baseButtonProps as Record<string, unknown>);\n\n // Generate unique ID for loading announcements\n const loadingId = React.useId();\n const describedById = props.loading ? `${loadingId}-loading` : undefined;\n\n // Extract button text for accessibility announcements\n const buttonText = React.useMemo(() => {\n if (typeof children === 'string') return children;\n if (React.isValidElement(children) && typeof (children.props as any)?.children === 'string') {\n return (children.props as any).children;\n }\n return 'button';\n }, [children]);\n\n // Enhanced accessibility props for loading state\n // These ensure screen readers announce the loading state properly\n const accessibilityProps = React.useMemo(() => {\n if (props.loading) {\n return {\n 'aria-busy': true,\n 'aria-disabled': true,\n 'aria-describedby': describedById,\n 'aria-label': `${buttonText} (loading)`,\n };\n }\n return {};\n }, [props.loading, describedById, buttonText]);\n\n return (\n <Comp\n // The `data-disabled` attribute enables correct styles when doing `<Button asChild disabled>`\n data-disabled={disabled || undefined}\n data-accent-color={color}\n data-radius={radius}\n data-material={effectiveMaterial}\n data-panel-background={effectiveMaterial}\n data-flush={flush ? 'true' : undefined}\n {...baseButtonProps}\n {...accessibilityProps}\n ref={(node) => {\n // Handle both forwarded ref and internal ref for performance optimization\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n buttonRef.current = node;\n }}\n className={classNames('rt-reset', 'rt-BaseButton', className)}\n {...(shouldPassDisabled && { disabled })}\n {...(isNativeButtonElement && !hasExplicitTypeAttribute ? { type: 'button' } : {})}\n >\n {props.loading ? (\n <>\n {/**\n * We need a wrapper to set `visibility: hidden` to hide the button content whilst we show the `Spinner`.\n * The button is a flex container with a `gap`, so we use `display: contents` to ensure the correct flex layout.\n *\n * However, `display: contents` removes the content from the accessibility tree in some browsers,\n * so we force remove it with `aria-hidden` and re-add it in the tree with `VisuallyHidden`\n */}\n <span style={{ display: 'contents', visibility: 'hidden' }} aria-hidden>\n {children}\n </span>\n\n {/* Enhanced accessibility for loading state */}\n <VisuallyHidden>\n <span id={describedById}>{buttonText} is loading, please wait...</span>\n {children}\n </VisuallyHidden>\n\n {/* Centered spinner overlay during loading state */}\n <Flex asChild align=\"center\" justify=\"center\" position=\"absolute\" inset=\"0\">\n <span>\n <Spinner\n size={mapResponsiveProp(size, mapButtonSizeToSpinnerSize)}\n aria-hidden=\"true\"\n />\n </span>\n </Flex>\n </>\n ) : (\n children\n )}\n </Comp>\n );\n});\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\nexport type { BaseButtonProps };\n"],
5
- "mappings": "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",
6
- "names": ["React", "classNames", "Slot", "baseButtonPropDefs", "Flex", "Spinner", "VisuallyHidden", "extractProps", "mapResponsiveProp", "mapButtonSizeToSpinnerSize", "marginPropDefs", "BaseButton", "props", "forwardedRef", "size", "className", "children", "asChild", "as", "color", "radius", "material", "panelBackground", "flush", "disabled", "baseButtonProps", "effectiveMaterial", "buttonRef", "button", "cleanup", "transitionDuration", "duration", "observer", "Comp", "shouldPassDisabled", "isNativeButtonElement", "hasExplicitTypeAttribute", "loadingId", "describedById", "buttonText", "accessibilityProps", "node"]
4
+ "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport { Slot } from 'radix-ui';\n\nimport { baseButtonPropDefs } from './base-button.props.js';\nimport { Flex } from '../flex.js';\nimport { Spinner } from '../spinner.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { extractProps } from '../../helpers/extract-props.js';\nimport { mapResponsiveProp, mapButtonSizeToSpinnerSize } from '../../helpers/map-prop-values.js';\nimport { marginPropDefs } from '../../props/margin.props.js';\n\nimport type { MarginProps } from '../../props/margin.props.js';\nimport type { ComponentPropsWithout, RemovedProps } from '../../helpers/component-props.js';\nimport type { GetPropDefTypes } from '../../props/prop-def.js';\n\ntype BaseButtonElement = React.ElementRef<'button'>;\ntype BaseButtonOwnProps = GetPropDefTypes<typeof baseButtonPropDefs>;\n\n/**\n * Polymorphic BaseButton props that support rendering as different HTML elements\n * Uses the proper ComponentPropsWithout pattern for type safety\n * @template C - The element type to render as (defaults to 'button')\n */\ntype PolymorphicBaseButtonProps<C extends React.ElementType = 'button'> = {\n /** Element type to render as (e.g., 'a', 'span', etc.) */\n as?: C;\n} & BaseButtonOwnProps &\n MarginProps &\n ComponentPropsWithout<C, RemovedProps | keyof BaseButtonOwnProps | keyof MarginProps | 'as'>;\n\n/**\n * BaseButton props interface that combines all available props\n */\ninterface BaseButtonProps extends PolymorphicBaseButtonProps {}\n\n/**\n * BaseButton component that provides the core button functionality\n *\n * This is the foundational button component that handles all the complex logic\n * including loading states, accessibility, performance optimizations, and\n * polymorphic rendering. It's used by Button, IconButton, and other button\n * variants to ensure consistent behavior across the design system.\n *\n * Key features:\n * - Loading state with spinner and accessibility announcements\n * - Performance optimizations for backdrop-filter effects\n * - Comprehensive accessibility support\n * - Polymorphic rendering support\n * - Material/panel background handling\n *\n * @example\n * ```tsx\n * // Basic usage\n * <BaseButton>Click me</BaseButton>\n *\n * // With loading state\n * <BaseButton loading>Processing...</BaseButton>\n *\n * // Polymorphic rendering\n * <BaseButton as=\"a\" href=\"/link\">Link Button</BaseButton>\n * ```\n */\nconst BaseButton = React.forwardRef<BaseButtonElement, BaseButtonProps>((props, forwardedRef) => {\n const { size = baseButtonPropDefs.size.default } = props;\n\n // Extract button-specific props from the combined props object\n const {\n className,\n children,\n asChild,\n as,\n color,\n radius,\n material,\n panelBackground,\n flush,\n disabled = props.loading, // Loading state automatically disables the button\n ...baseButtonProps\n } = extractProps(props, baseButtonPropDefs, marginPropDefs);\n\n // Show deprecation warning for panelBackground when used\n // This helps developers migrate to the new material prop\n React.useEffect(() => {\n if (props.panelBackground !== undefined) {\n console.warn('Warning: The `panelBackground` prop is deprecated and will be removed in a future version. Use `material` prop instead.');\n }\n }, [props.panelBackground]);\n\n // Material takes precedence over panelBackground for backward compatibility\n const effectiveMaterial = material ?? panelBackground;\n\n // Will-change cleanup for backdrop-filter performance optimization\n // This prevents layout thrashing when using translucent materials\n const buttonRef = React.useRef<HTMLElement>(null);\n\n // Use a ref to track current material value to avoid stale closures in setTimeout\n const materialRef = React.useRef(effectiveMaterial);\n materialRef.current = effectiveMaterial;\n\n React.useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n\n const hasTranslucentMaterial = effectiveMaterial === 'translucent';\n\n if (hasTranslucentMaterial) {\n // Add will-change when material is translucent to optimize rendering\n button.style.setProperty('will-change', 'backdrop-filter');\n\n // Track timeout for cleanup\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Clean up will-change after transition completes to prevent memory leaks\n const cleanup = () => {\n const transitionDuration = getComputedStyle(button).getPropertyValue('--duration-2') || '75ms';\n const duration = parseInt(transitionDuration) || 75;\n\n timeoutId = setTimeout(() => {\n // Use ref to get current value, not stale closure value\n if (button && materialRef.current !== 'translucent') {\n button.style.setProperty('will-change', 'auto');\n }\n }, duration);\n };\n\n // Listen for material changes to clean up will-change property\n const observer = new MutationObserver(cleanup);\n observer.observe(button, { attributes: true, attributeFilter: ['data-material'] });\n\n return () => {\n if (timeoutId) clearTimeout(timeoutId);\n observer.disconnect();\n button.style.setProperty('will-change', 'auto');\n };\n } else {\n // Remove will-change when material is not translucent\n button.style.setProperty('will-change', 'auto');\n }\n }, [effectiveMaterial]);\n\n // asChild takes precedence over as prop for Radix Slot integration\n const Comp = asChild ? Slot.Root : as || 'button';\n\n // Only pass disabled for elements that support it\n // This prevents invalid HTML attributes on unsupported elements\n const shouldPassDisabled = asChild || !as || ['button', 'input', 'textarea', 'select'].includes(as);\n\n // Determine if we are rendering a real <button> element so we can set a safe\n // default type. Native <button> defaults to type=\"submit\" which can cause\n // accidental form submissions. We default to type=\"button\" unless the user\n // explicitly provided a type or we're using asChild (unknown underlying node).\n const isNativeButtonElement = !asChild && (!as || as === 'button');\n const hasExplicitTypeAttribute = 'type' in (baseButtonProps as Record<string, unknown>);\n\n // Generate unique ID for loading announcements\n const loadingId = React.useId();\n const describedById = props.loading ? `${loadingId}-loading` : undefined;\n\n // Extract button text for accessibility announcements\n const buttonText = React.useMemo(() => {\n if (typeof children === 'string') return children;\n if (React.isValidElement(children) && typeof (children.props as any)?.children === 'string') {\n return (children.props as any).children;\n }\n return 'button';\n }, [children]);\n\n // Enhanced accessibility props for loading state\n // These ensure screen readers announce the loading state properly\n const accessibilityProps = React.useMemo(() => {\n if (props.loading) {\n return {\n 'aria-busy': true,\n 'aria-disabled': true,\n 'aria-describedby': describedById,\n 'aria-label': `${buttonText} (loading)`,\n };\n }\n return {};\n }, [props.loading, describedById, buttonText]);\n\n return (\n <Comp\n // The `data-disabled` attribute enables correct styles when doing `<Button asChild disabled>`\n data-disabled={disabled || undefined}\n data-accent-color={color}\n data-radius={radius}\n data-material={effectiveMaterial}\n data-panel-background={effectiveMaterial}\n data-flush={flush ? 'true' : undefined}\n {...baseButtonProps}\n {...accessibilityProps}\n ref={(node) => {\n // Handle both forwarded ref and internal ref for performance optimization\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n forwardedRef.current = node;\n }\n buttonRef.current = node;\n }}\n className={classNames('rt-reset', 'rt-BaseButton', className)}\n {...(shouldPassDisabled && { disabled })}\n {...(isNativeButtonElement && !hasExplicitTypeAttribute ? { type: 'button' } : {})}\n >\n {props.loading ? (\n <>\n {/**\n * We need a wrapper to set `visibility: hidden` to hide the button content whilst we show the `Spinner`.\n * The button is a flex container with a `gap`, so we use `display: contents` to ensure the correct flex layout.\n *\n * However, `display: contents` removes the content from the accessibility tree in some browsers,\n * so we force remove it with `aria-hidden` and re-add it in the tree with `VisuallyHidden`\n */}\n <span style={{ display: 'contents', visibility: 'hidden' }} aria-hidden>\n {children}\n </span>\n\n {/* Enhanced accessibility for loading state */}\n <VisuallyHidden>\n <span id={describedById}>{buttonText} is loading, please wait...</span>\n {children}\n </VisuallyHidden>\n\n {/* Centered spinner overlay during loading state */}\n <Flex asChild align=\"center\" justify=\"center\" position=\"absolute\" inset=\"0\">\n <span>\n <Spinner size={mapResponsiveProp(size, mapButtonSizeToSpinnerSize)} aria-hidden=\"true\" />\n </span>\n </Flex>\n </>\n ) : (\n children\n )}\n </Comp>\n );\n});\nBaseButton.displayName = 'BaseButton';\n\nexport { BaseButton };\nexport type { BaseButtonProps };\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "classNames", "Slot", "baseButtonPropDefs", "Flex", "Spinner", "VisuallyHidden", "extractProps", "mapResponsiveProp", "mapButtonSizeToSpinnerSize", "marginPropDefs", "BaseButton", "props", "forwardedRef", "size", "className", "children", "asChild", "as", "color", "radius", "material", "panelBackground", "flush", "disabled", "baseButtonProps", "effectiveMaterial", "buttonRef", "materialRef", "button", "timeoutId", "cleanup", "transitionDuration", "duration", "observer", "Comp", "shouldPassDisabled", "isNativeButtonElement", "hasExplicitTypeAttribute", "loadingId", "describedById", "buttonText", "accessibilityProps", "node"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shell-bottom.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/shell-bottom.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAyD,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1H,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AACzE,KAAK,qBAAqB,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAC/K,KAAK,uBAAuB,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAC3I,KAAK,yBAAyB,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAChF,KAAK,2BAA2B,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACnF,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AACzE,KAAK,iBAAiB,GAAG,aAAa,GACpC,CAAC,qBAAqB,GAAG,uBAAuB,CAAC,GACjD,CAAC,yBAAyB,GAAG,2BAA2B,CAAC,GAAG;IAC1D,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAClE,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEJ,KAAK,eAAe,GAAG,KAAK,CAAC,yBAAyB,CAAC,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,OAAO,YAAY,CAAA;CAAE,CAAC;AAgBlJ,eAAO,MAAM,MAAM,EA8Tb,eAAe,CAAC"}
1
+ {"version":3,"file":"shell-bottom.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/shell-bottom.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,YAAY,EAAc,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAyD,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1H,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AACzE,KAAK,qBAAqB,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAC/K,KAAK,uBAAuB,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAC3I,KAAK,yBAAyB,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAChF,KAAK,2BAA2B,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACnF,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AACzE,KAAK,iBAAiB,GAAG,aAAa,GACpC,CAAC,qBAAqB,GAAG,uBAAuB,CAAC,GACjD,CAAC,yBAAyB,GAAG,2BAA2B,CAAC,GAAG;IAC1D,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAClE,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEJ,KAAK,eAAe,GAAG,KAAK,CAAC,yBAAyB,CAAC,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,OAAO,YAAY,CAAA;CAAE,CAAC;AAgBlJ,eAAO,MAAM,MAAM,EAwVb,eAAe,CAAC"}
@@ -1,2 +1,2 @@
1
- import*as t from"react";import de from"classnames";import*as N from"../sheet.js";import{VisuallyHidden as pe}from"../visually-hidden.js";import{useShell as ue}from"../shell.context.js";import{useResponsivePresentation as me,useResponsiveInitialState as ce}from"../shell.hooks.js";import{PaneResizeContext as fe}from"./shell-resize.js";import{BottomHandle as O,PaneHandle as be}from"./shell-handles.js";import"../shell.types.js";import{extractPaneDomProps as he,mapResponsiveBooleanToPaneMode as j}from"./shell-prop-helpers.js";const ye=["className","children","defaultOpen","open","onOpenChange","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],W=t.forwardRef((w,u)=>{const{className:q,presentation:K="fixed",defaultOpen:c,open:s,onOpenChange:m,expandedSize:z=200,minSize:l=100,maxSize:d=400,resizable:P=!1,collapsible:Y=!0,onExpand:T,onCollapse:k,onResize:S,onResizeStart:G,onResizeEnd:J,snapPoints:Q,snapTolerance:X,collapseThreshold:Z,paneId:B,persistence:M,children:ee,style:te,size:D,defaultSize:H,onSizeChange:V,sizeUpdate:F,sizeUpdateMs:U=50}=w,oe=he(w,ye),r=ue(),g=me(K),f=g==="overlay",ne=g==="stacked",a=t.useRef(null),re=t.useCallback(e=>{a.current=e,typeof u=="function"?u(e):u&&(u.current=e)},[u]),I=t.Children.toArray(ee),_=I.filter(e=>t.isValidElement(e)&&e.type===O),$=I.filter(e=>!(t.isValidElement(e)&&e.type===O)),ie=t.useMemo(()=>j(s),[s]),se=t.useMemo(()=>j(c),[c]),ae=typeof s=="object"&&s!==null;ce({controlledValue:ie,defaultValue:se,currentValue:r.bottomMode,setValue:r.setBottomMode,breakpointReady:r.currentBreakpointReady,controlledIsResponsive:ae,onResponsiveChange:e=>m?.(e==="expanded",{reason:"responsive"}),onInit:e=>{typeof s>"u"&&m?.(e==="expanded",{reason:"init"})}});const b=t.useMemo(()=>{const e=V,n=F,i=U??50;if(!e)return()=>{};if(n==="debounce"){let o=null;return(p,E)=>{o&&clearTimeout(o),o=setTimeout(()=>{e(p,E)},i)}}if(n==="throttle"){let o=0;return(p,E)=>{const A=Date.now();A-o>=i&&(o=A,e(p,E))}}return(o,p)=>e(o,p)},[V,F,U]),h=t.useRef(null);t.useEffect(()=>{const e=typeof s<"u";if(h.current===null){h.current=e;return}h.current!==e&&(console.warn("Shell.Bottom: Switching between controlled and uncontrolled `open` is not supported."),h.current=e)},[s]);const L=t.useRef(!1),x=t.useRef(null);t.useEffect(()=>{!L.current&&typeof s>"u"&&c&&r.bottomMode==="expanded"&&(m?.(!0,{reason:"init"}),L.current=!0),typeof s>"u"&&(x.current!==null&&x.current!==r.bottomMode&&m?.(r.bottomMode==="expanded",{reason:"toggle"}),x.current=r.bottomMode)},[r.bottomMode,s,c,m]),t.useEffect(()=>{r.bottomMode==="expanded"?T?.():k?.()},[r.bottomMode,T,k]);const C=r.bottomMode==="expanded",y=t.useMemo(()=>{if(!B||M)return M;const e=`kookie-ui:shell:bottom:${B}`;return{load:()=>{if(!(typeof window>"u"))try{const i=window.localStorage.getItem(e);return i?Number(i):void 0}catch{return}},save:i=>{if(!(typeof window>"u"))try{window.localStorage.setItem(e,String(i))}catch{}}}},[B,M]);t.useEffect(()=>{let e=!0;if(!P||!y?.load||f)return;const n=y.load(),i=o=>{!e||typeof o!="number"||!a.current||(a.current.style.setProperty("--bottom-size",`${o}px`),S?.(o))};return n instanceof Promise?n.then(i).catch(o=>{}):i(n),()=>{e=!1}},[P,y,S,f]);const le=P&&!f&&C?t.createElement(fe.Provider,{value:{containerRef:a,cssVarName:"--bottom-size",minSize:l,maxSize:d,defaultSize:z,orientation:"horizontal",edge:"start",computeNext:(e,n,i)=>{const o=e-n;return i-o},onResize:S,onResizeStart:G,onResizeEnd:e=>{J?.(e),b(e,{reason:"resize"}),y?.save?.(e)},target:"bottom",collapsible:Y,snapPoints:Q,snapTolerance:X??8,collapseThreshold:Z,requestCollapse:()=>r.setBottomMode("collapsed"),requestToggle:()=>r.togglePane("bottom")}},_.length>0?_.map((e,n)=>t.cloneElement(e,{key:e.key??n})):t.createElement(be,null)):null,R=t.useCallback(e=>{if(e==null)return;if(typeof e=="number"&&Number.isFinite(e))return e;const n=String(e).trim();if(!n)return;if(n.endsWith("px"))return Number.parseFloat(n);if(n.endsWith("rem")){const o=Number.parseFloat(getComputedStyle(document.documentElement).fontSize||"16")||16;return Number.parseFloat(n)*o}if(n.endsWith("%")){const o=Number.parseFloat(n),p=document.documentElement.clientHeight||window.innerHeight||0;return o/100*p}const i=Number.parseFloat(n);return Number.isFinite(i)?i:void 0},[]);t.useEffect(()=>{if(a.current&&typeof D>"u"&&typeof H<"u"){const e=R(H);if(typeof e=="number"&&Number.isFinite(e)){const o=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof l=="number"?l:void 0)??e,e));a.current.style.setProperty("--bottom-size",`${o}px`),b(o,{reason:"init"})}}},[]);const v=D;if(t.useEffect(()=>{if(!a.current||typeof v>"u")return;const e=R(v);if(typeof e=="number"&&Number.isFinite(e)){const o=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof l=="number"?l:void 0)??e,e));a.current.style.setProperty("--bottom-size",`${o}px`),b(o,{reason:"controlled"})}},[v,l,d,R,b]),f){const e=r.bottomMode==="expanded";return t.createElement(N.Root,{open:e,onOpenChange:n=>r.setBottomMode(n?"expanded":"collapsed")},t.createElement(N.Content,{side:"bottom",style:{padding:0},height:{initial:`${z}px`}},t.createElement(pe,null,t.createElement(N.Title,null,"Bottom panel")),$))}return t.createElement("div",{...oe,ref:re,className:de("rt-ShellBottom",q),"data-mode":r.bottomMode,"data-peek":r.peekTarget==="bottom"||void 0,"data-presentation":r.currentBreakpointReady?g:void 0,"data-open":r.currentBreakpointReady&&ne&&C||void 0,style:{...te,"--bottom-size":`${z}px`,"--bottom-min-size":`${l}px`,"--bottom-max-size":`${d}px`}},t.createElement("div",{className:"rt-ShellBottomContent","data-visible":C||void 0},$),le)});W.displayName="Shell.Bottom",W.Handle=O;export{W as Bottom};
1
+ import*as t from"react";import pe from"classnames";import*as O from"../sheet.js";import{VisuallyHidden as me}from"../visually-hidden.js";import{useShell as ce}from"../shell.context.js";import{useResponsivePresentation as fe,useResponsiveInitialState as be}from"../shell.hooks.js";import{PaneResizeContext as ye}from"./shell-resize.js";import{BottomHandle as w,PaneHandle as he}from"./shell-handles.js";import"../shell.types.js";import{extractPaneDomProps as ze,mapResponsiveBooleanToPaneMode as q}from"./shell-prop-helpers.js";const Pe=["className","children","defaultOpen","open","onOpenChange","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],K=t.forwardRef((k,p)=>{const{className:Y,presentation:G="fixed",defaultOpen:c,open:s,onOpenChange:m,expandedSize:P=200,minSize:l=100,maxSize:d=400,resizable:B=!1,collapsible:J=!0,onExpand:T,onCollapse:D,onResize:S,onResizeStart:Q,onResizeEnd:X,snapPoints:Z,snapTolerance:ee,collapseThreshold:te,paneId:M,persistence:g,children:oe,style:ne,size:H,defaultSize:V,onSizeChange:F,sizeUpdate:U,sizeUpdateMs:I=50}=k,re=ze(k,Pe),r=ce(),x=fe(G),f=x==="overlay",ie=x==="stacked",a=t.useRef(null),se=t.useCallback(e=>{a.current=e,typeof p=="function"?p(e):p&&(p.current=e)},[p]),_=t.Children.toArray(oe),$=_.filter(e=>t.isValidElement(e)&&e.type===w),L=_.filter(e=>!(t.isValidElement(e)&&e.type===w)),ae=t.useMemo(()=>q(s),[s]),le=t.useMemo(()=>q(c),[c]),de=typeof s=="object"&&s!==null;be({controlledValue:ae,defaultValue:le,currentValue:r.bottomMode,setValue:r.setBottomMode,breakpointReady:r.currentBreakpointReady,controlledIsResponsive:de,onResponsiveChange:e=>m?.(e==="expanded",{reason:"responsive"}),onInit:e=>{typeof s>"u"&&m?.(e==="expanded",{reason:"init"})}});const b=t.useMemo(()=>{const e=F,o=U,i=I??50;if(!e)return()=>{};if(o==="debounce"){let n=null;return(u,N)=>{n&&clearTimeout(n),n=setTimeout(()=>{e(u,N)},i)}}if(o==="throttle"){let n=0;return(u,N)=>{const W=Date.now();W-n>=i&&(n=W,e(u,N))}}return(n,u)=>e(n,u)},[F,U,I]),y=t.useRef(null);t.useEffect(()=>{const e=typeof s<"u";if(y.current===null){y.current=e;return}y.current!==e&&(console.warn("Shell.Bottom: Switching between controlled and uncontrolled `open` is not supported."),y.current=e)},[s]);const A=t.useRef(!1),C=t.useRef(null);t.useEffect(()=>{!A.current&&typeof s>"u"&&c&&r.bottomMode==="expanded"&&(m?.(!0,{reason:"init"}),A.current=!0),typeof s>"u"&&(C.current!==null&&C.current!==r.bottomMode&&m?.(r.bottomMode==="expanded",{reason:"toggle"}),C.current=r.bottomMode)},[r.bottomMode,s,c,m]);const h=t.useRef(null),j=t.useRef(!1);t.useEffect(()=>{const e=r.bottomMode;if(!r.currentBreakpointReady){h.current=e;return}if(!j.current){j.current=!0,h.current=e;return}const o=h.current;o!==null&&o!==e&&(e==="expanded"?T?.():e==="collapsed"&&D?.(),h.current=e)},[r.bottomMode,r.currentBreakpointReady,T,D]);const R=r.bottomMode==="expanded",z=t.useMemo(()=>{if(!M||g)return g;const e=`kookie-ui:shell:bottom:${M}`;return{load:()=>{if(!(typeof window>"u"))try{const i=window.localStorage.getItem(e);return i?Number(i):void 0}catch{return}},save:i=>{if(!(typeof window>"u"))try{window.localStorage.setItem(e,String(i))}catch{}}}},[M,g]);t.useEffect(()=>{let e=!0;if(!B||!z?.load||f)return;const o=z.load(),i=n=>{!e||typeof n!="number"||!a.current||(a.current.style.setProperty("--bottom-size",`${n}px`),S?.(n))};return o instanceof Promise?o.then(i).catch(n=>{}):i(o),()=>{e=!1}},[B,z,S,f]);const ue=B&&!f&&R?t.createElement(ye.Provider,{value:{containerRef:a,cssVarName:"--bottom-size",minSize:l,maxSize:d,defaultSize:P,orientation:"horizontal",edge:"start",computeNext:(e,o,i)=>{const n=e-o;return i-n},onResize:S,onResizeStart:Q,onResizeEnd:e=>{X?.(e),b(e,{reason:"resize"}),z?.save?.(e)},target:"bottom",collapsible:J,snapPoints:Z,snapTolerance:ee??8,collapseThreshold:te,requestCollapse:()=>r.setBottomMode("collapsed"),requestToggle:()=>r.togglePane("bottom")}},$.length>0?$.map((e,o)=>t.cloneElement(e,{key:e.key??o})):t.createElement(he,null)):null,v=t.useCallback(e=>{if(e==null)return;if(typeof e=="number"&&Number.isFinite(e))return e;const o=String(e).trim();if(!o)return;if(o.endsWith("px"))return Number.parseFloat(o);if(o.endsWith("rem")){const n=Number.parseFloat(getComputedStyle(document.documentElement).fontSize||"16")||16;return Number.parseFloat(o)*n}if(o.endsWith("%")){const n=Number.parseFloat(o),u=document.documentElement.clientHeight||window.innerHeight||0;return n/100*u}const i=Number.parseFloat(o);return Number.isFinite(i)?i:void 0},[]);t.useEffect(()=>{if(a.current&&typeof H>"u"&&typeof V<"u"){const e=v(V);if(typeof e=="number"&&Number.isFinite(e)){const n=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof l=="number"?l:void 0)??e,e));a.current.style.setProperty("--bottom-size",`${n}px`),b(n,{reason:"init"})}}},[]);const E=H;if(t.useEffect(()=>{if(!a.current||typeof E>"u")return;const e=v(E);if(typeof e=="number"&&Number.isFinite(e)){const n=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof l=="number"?l:void 0)??e,e));a.current.style.setProperty("--bottom-size",`${n}px`),b(n,{reason:"controlled"})}},[E,l,d,v,b]),f){const e=r.bottomMode==="expanded";return t.createElement(O.Root,{open:e,onOpenChange:o=>r.setBottomMode(o?"expanded":"collapsed")},t.createElement(O.Content,{side:"bottom",style:{padding:0},height:{initial:`${P}px`}},t.createElement(me,null,t.createElement(O.Title,null,"Bottom panel")),L))}return t.createElement("div",{...re,ref:se,className:pe("rt-ShellBottom",Y),"data-mode":r.bottomMode,"data-peek":r.peekTarget==="bottom"||void 0,"data-presentation":r.currentBreakpointReady?x:void 0,"data-open":r.currentBreakpointReady&&ie&&R||void 0,style:{...ne,"--bottom-size":`${P}px`,"--bottom-min-size":`${l}px`,"--bottom-max-size":`${d}px`}},t.createElement("div",{className:"rt-ShellBottomContent","data-visible":R||void 0},L),ue)});K.displayName="Shell.Bottom",K.Handle=w;export{K as Bottom};
2
2
  //# sourceMappingURL=shell-bottom.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/_internal/shell-bottom.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useShell } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { BottomHandle, PaneHandle } from './shell-handles.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, PaneBaseProps } from '../shell.types.js';\nimport { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';\n\ntype BottomOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype BottomControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; defaultOpen?: never };\ntype BottomUncontrolledProps = { defaultOpen?: boolean; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; open?: never };\ntype BottomSizeControlledProps = { size: number | string; defaultSize?: never };\ntype BottomSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\ntype BottomSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype BottomPublicProps = PaneBaseProps &\n (BottomControlledProps | BottomUncontrolledProps) &\n (BottomSizeControlledProps | BottomSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: BottomSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n };\n\ntype BottomComponent = React.ForwardRefExoticComponent<BottomPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof BottomHandle };\n\nconst BOTTOM_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof BottomPublicProps)[];\n\nexport const Bottom = React.forwardRef<HTMLDivElement, BottomPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = 'fixed',\n defaultOpen,\n open,\n onOpenChange,\n expandedSize = 200,\n minSize = 100,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const bottomDomProps = extractPaneDomProps(initialProps, BOTTOM_DOM_PROP_KEYS);\n const shell = useShell();\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === BottomHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === BottomHandle));\n\n // Throttled/debounced emitter for onSizeChange\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: shell.bottomMode,\n setValue: shell.setBottomMode,\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChange?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof open === 'undefined') {\n onOpenChange?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: BottomSizeChangeMeta) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n let t: any = null;\n return (s: number, meta: BottomSizeChangeMeta) => {\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n cb(s, meta);\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: BottomSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: BottomSizeChangeMeta) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Bottom: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n const initNotifiedRef = React.useRef(false);\n const lastBottomModeRef = React.useRef<PaneMode | null>(null);\n React.useEffect(() => {\n if (!initNotifiedRef.current && typeof open === 'undefined' && defaultOpen && shell.bottomMode === 'expanded') {\n onOpenChange?.(true, { reason: 'init' });\n initNotifiedRef.current = true;\n }\n if (typeof open === 'undefined') {\n if (lastBottomModeRef.current !== null && lastBottomModeRef.current !== shell.bottomMode) {\n onOpenChange?.(shell.bottomMode === 'expanded', { reason: 'toggle' });\n }\n lastBottomModeRef.current = shell.bottomMode;\n }\n }, [shell.bottomMode, open, defaultOpen, onOpenChange]);\n\n React.useEffect(() => {\n if (shell.bottomMode === 'expanded') {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n }, [shell.bottomMode, onExpand, onCollapse]);\n\n const isExpanded = shell.bottomMode === 'expanded';\n\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:bottom:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!resizable || !persistenceAdapter?.load || isOverlay) return undefined;\n const loaded = persistenceAdapter.load();\n const applyLoaded = (value?: number) => {\n if (!mounted || typeof value !== 'number' || !localRef.current) return;\n localRef.current.style.setProperty('--bottom-size', `${value}px`);\n onResize?.(value);\n };\n if (loaded instanceof Promise) {\n loaded.then(applyLoaded).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n });\n } else {\n applyLoaded(loaded);\n }\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--bottom-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'horizontal',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const delta = client - startClient;\n return startSize - delta;\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'bottom',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setBottomMode('collapsed'),\n requestToggle: () => shell.togglePane('bottom'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Strip control/size props from DOM spread (moved above overlay return to keep hook order consistent)\n // Normalize CSS lengths to px (moved above overlay return to keep hook order consistent)\n const normalizeToPx = React.useCallback((value: number | string | undefined): number | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n const str = String(value).trim();\n if (!str) return undefined;\n if (str.endsWith('px')) return Number.parseFloat(str);\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base = document.documentElement.clientHeight || window.innerHeight || 0;\n return (pct / 100) * base;\n }\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n }, []);\n\n // Apply defaultSize on mount when uncontrolled (moved above overlay return)\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync (moved above overlay return)\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = shell.bottomMode === 'expanded';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setBottomMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content side=\"bottom\" style={{ padding: 0 }} height={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Bottom panel</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...bottomDomProps}\n ref={setRef}\n className={classNames('rt-ShellBottom', className)}\n data-mode={shell.bottomMode}\n data-peek={shell.peekTarget === 'bottom' || undefined}\n data-presentation={shell.currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(shell.currentBreakpointReady && isStacked && isExpanded) || undefined}\n style={{\n ...style,\n ['--bottom-size' as any]: `${expandedSize}px`,\n ['--bottom-min-size' as any]: `${minSize}px`,\n ['--bottom-max-size' as any]: `${maxSize}px`,\n }}\n >\n <div className=\"rt-ShellBottomContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as BottomComponent;\nBottom.displayName = 'Shell.Bottom';\nBottom.Handle = BottomHandle;\n"],
5
- "mappings": "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",
6
- "names": ["React", "classNames", "Sheet", "VisuallyHidden", "useShell", "useResponsivePresentation", "useResponsiveInitialState", "PaneResizeContext", "BottomHandle", "PaneHandle", "extractPaneDomProps", "mapResponsiveBooleanToPaneMode", "BOTTOM_DOM_PROP_KEYS", "Bottom", "initialProps", "ref", "className", "presentation", "defaultOpen", "open", "onOpenChange", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "bottomDomProps", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "contentChildren", "normalizedControlledOpen", "normalizedDefaultOpen", "openIsResponsive", "next", "initial", "emitSizeChange", "cb", "strategy", "ms", "t", "s", "meta", "last", "now", "wasControlledRef", "isControlled", "initNotifiedRef", "lastBottomModeRef", "isExpanded", "persistenceAdapter", "key", "v", "mounted", "loaded", "applyLoaded", "value", "err", "handleEl", "client", "startClient", "startSize", "delta", "i", "normalizeToPx", "str", "rem", "pct", "base", "n", "px", "clamped", "controlledSize", "o"]
4
+ "sourcesContent": ["import * as React from 'react';\nimport classNames from 'classnames';\nimport * as Sheet from '../sheet.js';\nimport { VisuallyHidden } from '../visually-hidden.js';\nimport { useShell } from '../shell.context.js';\nimport { useResponsivePresentation, useResponsiveInitialState } from '../shell.hooks.js';\nimport { PaneResizeContext } from './shell-resize.js';\nimport { BottomHandle, PaneHandle } from './shell-handles.js';\nimport { _BREAKPOINTS } from '../shell.types.js';\nimport type { Breakpoint, PaneMode, PaneSizePersistence, ResponsivePresentation, PaneBaseProps } from '../shell.types.js';\nimport { extractPaneDomProps, mapResponsiveBooleanToPaneMode } from './shell-prop-helpers.js';\n\ntype BottomOpenChangeMeta = { reason: 'init' | 'toggle' | 'responsive' };\ntype BottomControlledProps = { open: boolean | Partial<Record<Breakpoint, boolean>>; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; defaultOpen?: never };\ntype BottomUncontrolledProps = { defaultOpen?: boolean; onOpenChange?: (open: boolean, meta: BottomOpenChangeMeta) => void; open?: never };\ntype BottomSizeControlledProps = { size: number | string; defaultSize?: never };\ntype BottomSizeUncontrolledProps = { defaultSize?: number | string; size?: never };\ntype BottomSizeChangeMeta = { reason: 'init' | 'resize' | 'controlled' };\ntype BottomPublicProps = PaneBaseProps &\n (BottomControlledProps | BottomUncontrolledProps) &\n (BottomSizeControlledProps | BottomSizeUncontrolledProps) & {\n onSizeChange?: (size: number, meta: BottomSizeChangeMeta) => void;\n sizeUpdate?: 'throttle' | 'debounce';\n sizeUpdateMs?: number;\n };\n\ntype BottomComponent = React.ForwardRefExoticComponent<BottomPublicProps & React.RefAttributes<HTMLDivElement>> & { Handle: typeof BottomHandle };\n\nconst BOTTOM_DOM_PROP_KEYS = [\n 'className',\n 'children',\n 'defaultOpen',\n 'open',\n 'onOpenChange',\n 'size',\n 'defaultSize',\n 'onSizeChange',\n 'sizeUpdate',\n 'sizeUpdateMs',\n 'style',\n] as const satisfies readonly (keyof BottomPublicProps)[];\n\nexport const Bottom = React.forwardRef<HTMLDivElement, BottomPublicProps>((initialProps, ref) => {\n const {\n className,\n presentation = 'fixed',\n defaultOpen,\n open,\n onOpenChange,\n expandedSize = 200,\n minSize = 100,\n maxSize = 400,\n resizable = false,\n collapsible = true,\n onExpand,\n onCollapse,\n onResize,\n onResizeStart,\n onResizeEnd,\n snapPoints,\n snapTolerance,\n collapseThreshold,\n paneId,\n persistence,\n children,\n style,\n size,\n defaultSize,\n onSizeChange,\n sizeUpdate,\n sizeUpdateMs = 50,\n } = initialProps;\n const bottomDomProps = extractPaneDomProps(initialProps, BOTTOM_DOM_PROP_KEYS);\n const shell = useShell();\n const resolvedPresentation = useResponsivePresentation(presentation);\n const isOverlay = resolvedPresentation === 'overlay';\n const isStacked = resolvedPresentation === 'stacked';\n const localRef = React.useRef<HTMLDivElement | null>(null);\n const setRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n const childArray = React.Children.toArray(children) as React.ReactElement[];\n const handleChildren = childArray.filter((el: React.ReactElement) => React.isValidElement(el) && el.type === BottomHandle);\n const contentChildren = childArray.filter((el: React.ReactElement) => !(React.isValidElement(el) && el.type === BottomHandle));\n\n // Throttled/debounced emitter for onSizeChange\n const normalizedControlledOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(open), [open]);\n const normalizedDefaultOpen = React.useMemo(() => mapResponsiveBooleanToPaneMode(defaultOpen), [defaultOpen]);\n const openIsResponsive = typeof open === 'object' && open !== null;\n useResponsiveInitialState<PaneMode>({\n controlledValue: normalizedControlledOpen,\n defaultValue: normalizedDefaultOpen,\n currentValue: shell.bottomMode,\n setValue: shell.setBottomMode,\n breakpointReady: shell.currentBreakpointReady,\n controlledIsResponsive: openIsResponsive,\n onResponsiveChange: (next) => onOpenChange?.(next === 'expanded', { reason: 'responsive' }),\n onInit: (initial) => {\n if (typeof open === 'undefined') {\n onOpenChange?.(initial === 'expanded', { reason: 'init' });\n }\n },\n });\n\n const emitSizeChange = React.useMemo(() => {\n const cb = onSizeChange as undefined | ((s: number, meta: BottomSizeChangeMeta) => void);\n const strategy = sizeUpdate as undefined | 'throttle' | 'debounce';\n const ms = sizeUpdateMs ?? 50;\n if (!cb) return () => {};\n if (strategy === 'debounce') {\n let t: any = null;\n return (s: number, meta: BottomSizeChangeMeta) => {\n if (t) clearTimeout(t);\n t = setTimeout(() => {\n cb(s, meta);\n }, ms);\n };\n }\n if (strategy === 'throttle') {\n let last = 0;\n return (s: number, meta: BottomSizeChangeMeta) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n cb(s, meta);\n }\n };\n }\n return (s: number, meta: BottomSizeChangeMeta) => cb(s, meta);\n }, [onSizeChange, sizeUpdate, sizeUpdateMs]);\n\n // Dev guards\n const wasControlledRef = React.useRef<boolean | null>(null);\n if (process.env.NODE_ENV !== 'production') {\n if (typeof open !== 'undefined' && typeof defaultOpen !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `open` and `defaultOpen`. Choose one.');\n }\n if (typeof size !== 'undefined' && typeof defaultSize !== 'undefined') {\n console.error('Shell.Bottom: Do not pass both `size` and `defaultSize`. Choose one.');\n }\n }\n\n React.useEffect(() => {\n const isControlled = typeof open !== 'undefined';\n if (wasControlledRef.current === null) {\n wasControlledRef.current = isControlled;\n return;\n }\n if (wasControlledRef.current !== isControlled) {\n console.warn('Shell.Bottom: Switching between controlled and uncontrolled `open` is not supported.');\n wasControlledRef.current = isControlled;\n }\n }, [open]);\n\n const initNotifiedRef = React.useRef(false);\n const lastBottomModeRef = React.useRef<PaneMode | null>(null);\n React.useEffect(() => {\n if (!initNotifiedRef.current && typeof open === 'undefined' && defaultOpen && shell.bottomMode === 'expanded') {\n onOpenChange?.(true, { reason: 'init' });\n initNotifiedRef.current = true;\n }\n if (typeof open === 'undefined') {\n if (lastBottomModeRef.current !== null && lastBottomModeRef.current !== shell.bottomMode) {\n onOpenChange?.(shell.bottomMode === 'expanded', { reason: 'toggle' });\n }\n lastBottomModeRef.current = shell.bottomMode;\n }\n }, [shell.bottomMode, open, defaultOpen, onOpenChange]);\n\n // Track previous mode to only fire callbacks on actual user-initiated state transitions.\n // We wait for breakpointReady to ensure the initial state sync from useResponsiveInitialState\n // is complete before enabling callbacks. This avoids spurious callbacks during initialization.\n const prevBottomModeRef = React.useRef<PaneMode | null>(null);\n const hasInitializedRef = React.useRef(false);\n React.useEffect(() => {\n const currentMode = shell.bottomMode;\n\n // Wait for breakpoint to be ready before enabling callbacks\n if (!shell.currentBreakpointReady) {\n prevBottomModeRef.current = currentMode;\n return;\n }\n\n // Skip the first run after breakpoint is ready - this captures the post-sync state\n if (!hasInitializedRef.current) {\n hasInitializedRef.current = true;\n prevBottomModeRef.current = currentMode;\n return;\n }\n\n const prevMode = prevBottomModeRef.current;\n\n // Only fire on actual state transitions\n if (prevMode !== null && prevMode !== currentMode) {\n if (currentMode === 'expanded') {\n onExpand?.();\n } else if (currentMode === 'collapsed') {\n onCollapse?.();\n }\n prevBottomModeRef.current = currentMode;\n }\n }, [shell.bottomMode, shell.currentBreakpointReady, onExpand, onCollapse]);\n\n const isExpanded = shell.bottomMode === 'expanded';\n\n const persistenceAdapter = React.useMemo(() => {\n if (!paneId || persistence) return persistence;\n const key = `kookie-ui:shell:bottom:${paneId}`;\n const adapter: PaneSizePersistence = {\n load: () => {\n if (typeof window === 'undefined') return undefined;\n try {\n const v = window.localStorage.getItem(key);\n return v ? Number(v) : undefined;\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n return undefined;\n }\n },\n save: (size: number) => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(key, String(size));\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to save persisted size', err);\n }\n }\n },\n };\n return adapter;\n }, [paneId, persistence]);\n\n React.useEffect(() => {\n let mounted = true;\n if (!resizable || !persistenceAdapter?.load || isOverlay) return undefined;\n const loaded = persistenceAdapter.load();\n const applyLoaded = (value?: number) => {\n if (!mounted || typeof value !== 'number' || !localRef.current) return;\n localRef.current.style.setProperty('--bottom-size', `${value}px`);\n onResize?.(value);\n };\n if (loaded instanceof Promise) {\n loaded.then(applyLoaded).catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Shell.Bottom: failed to load persisted size', err);\n }\n });\n } else {\n applyLoaded(loaded);\n }\n return () => {\n mounted = false;\n };\n }, [resizable, persistenceAdapter, onResize, isOverlay]);\n\n const handleEl =\n resizable && !isOverlay && isExpanded ? (\n <PaneResizeContext.Provider\n value={{\n containerRef: localRef,\n cssVarName: '--bottom-size',\n minSize,\n maxSize,\n defaultSize: expandedSize,\n orientation: 'horizontal',\n edge: 'start',\n computeNext: (client, startClient, startSize) => {\n const delta = client - startClient;\n return startSize - delta;\n },\n onResize,\n onResizeStart,\n onResizeEnd: (size) => {\n onResizeEnd?.(size);\n emitSizeChange(size, { reason: 'resize' });\n persistenceAdapter?.save?.(size);\n },\n target: 'bottom',\n collapsible,\n snapPoints,\n snapTolerance: snapTolerance ?? 8,\n collapseThreshold,\n requestCollapse: () => shell.setBottomMode('collapsed'),\n requestToggle: () => shell.togglePane('bottom'),\n }}\n >\n {handleChildren.length > 0 ? handleChildren.map((el, i) => React.cloneElement(el, { key: el.key ?? i })) : <PaneHandle />}\n </PaneResizeContext.Provider>\n ) : null;\n\n // Strip control/size props from DOM spread (moved above overlay return to keep hook order consistent)\n // Normalize CSS lengths to px (moved above overlay return to keep hook order consistent)\n const normalizeToPx = React.useCallback((value: number | string | undefined): number | undefined => {\n if (value == null) return undefined;\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n const str = String(value).trim();\n if (!str) return undefined;\n if (str.endsWith('px')) return Number.parseFloat(str);\n if (str.endsWith('rem')) {\n const rem = Number.parseFloat(getComputedStyle(document.documentElement).fontSize || '16') || 16;\n return Number.parseFloat(str) * rem;\n }\n if (str.endsWith('%')) {\n const pct = Number.parseFloat(str);\n const base = document.documentElement.clientHeight || window.innerHeight || 0;\n return (pct / 100) * base;\n }\n const n = Number.parseFloat(str);\n return Number.isFinite(n) ? n : undefined;\n }, []);\n\n // Apply defaultSize on mount when uncontrolled (moved above overlay return)\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof size === 'undefined' && typeof defaultSize !== 'undefined') {\n const px = normalizeToPx(defaultSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'init' });\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled size sync (moved above overlay return)\n const controlledSize = size;\n React.useEffect(() => {\n if (!localRef.current) return;\n if (typeof controlledSize === 'undefined') return;\n const px = normalizeToPx(controlledSize);\n if (typeof px === 'number' && Number.isFinite(px)) {\n const minPx = typeof minSize === 'number' ? minSize : undefined;\n const maxPx = typeof maxSize === 'number' ? maxSize : undefined;\n const clamped = Math.min(maxPx ?? px, Math.max(minPx ?? px, px));\n localRef.current.style.setProperty('--bottom-size', `${clamped}px`);\n emitSizeChange(clamped, { reason: 'controlled' });\n }\n }, [controlledSize, minSize, maxSize, normalizeToPx, emitSizeChange]);\n\n if (isOverlay) {\n const open = shell.bottomMode === 'expanded';\n return (\n <Sheet.Root open={open} onOpenChange={(o) => shell.setBottomMode(o ? 'expanded' : 'collapsed')}>\n <Sheet.Content side=\"bottom\" style={{ padding: 0 }} height={{ initial: `${expandedSize}px` }}>\n <VisuallyHidden>\n <Sheet.Title>Bottom panel</Sheet.Title>\n </VisuallyHidden>\n {contentChildren}\n </Sheet.Content>\n </Sheet.Root>\n );\n }\n\n return (\n <div\n {...bottomDomProps}\n ref={setRef}\n className={classNames('rt-ShellBottom', className)}\n data-mode={shell.bottomMode}\n data-peek={shell.peekTarget === 'bottom' || undefined}\n data-presentation={shell.currentBreakpointReady ? resolvedPresentation : undefined}\n data-open={(shell.currentBreakpointReady && isStacked && isExpanded) || undefined}\n style={{\n ...style,\n ['--bottom-size' as any]: `${expandedSize}px`,\n ['--bottom-min-size' as any]: `${minSize}px`,\n ['--bottom-max-size' as any]: `${maxSize}px`,\n }}\n >\n <div className=\"rt-ShellBottomContent\" data-visible={isExpanded || undefined}>\n {contentChildren}\n </div>\n {handleEl}\n </div>\n );\n}) as BottomComponent;\nBottom.displayName = 'Shell.Bottom';\nBottom.Handle = BottomHandle;\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "classNames", "Sheet", "VisuallyHidden", "useShell", "useResponsivePresentation", "useResponsiveInitialState", "PaneResizeContext", "BottomHandle", "PaneHandle", "extractPaneDomProps", "mapResponsiveBooleanToPaneMode", "BOTTOM_DOM_PROP_KEYS", "Bottom", "initialProps", "ref", "className", "presentation", "defaultOpen", "open", "onOpenChange", "expandedSize", "minSize", "maxSize", "resizable", "collapsible", "onExpand", "onCollapse", "onResize", "onResizeStart", "onResizeEnd", "snapPoints", "snapTolerance", "collapseThreshold", "paneId", "persistence", "children", "style", "size", "defaultSize", "onSizeChange", "sizeUpdate", "sizeUpdateMs", "bottomDomProps", "shell", "resolvedPresentation", "isOverlay", "isStacked", "localRef", "setRef", "node", "childArray", "handleChildren", "el", "contentChildren", "normalizedControlledOpen", "normalizedDefaultOpen", "openIsResponsive", "next", "initial", "emitSizeChange", "cb", "strategy", "ms", "t", "s", "meta", "last", "now", "wasControlledRef", "isControlled", "initNotifiedRef", "lastBottomModeRef", "prevBottomModeRef", "hasInitializedRef", "currentMode", "prevMode", "isExpanded", "persistenceAdapter", "key", "v", "mounted", "loaded", "applyLoaded", "value", "err", "handleEl", "client", "startClient", "startSize", "delta", "i", "normalizeToPx", "str", "rem", "pct", "base", "n", "px", "clamped", "controlledSize"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shell-inspector.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/shell-inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,eAAe,EAAc,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAyD,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1H,KAAK,uBAAuB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AAC5E,KAAK,wBAAwB,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACrL,KAAK,0BAA0B,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACxL,KAAK,uBAAuB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AAC5E,KAAK,4BAA4B,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACnF,KAAK,8BAA8B,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACtF,KAAK,oBAAoB,GAAG,aAAa,GACvC,CAAC,wBAAwB,GAAG,0BAA0B,CAAC,GACvD,CAAC,4BAA4B,GAAG,8BAA8B,CAAC,GAAG;IAChE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACrE,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEJ,KAAK,kBAAkB,GAAG,KAAK,CAAC,yBAAyB,CAAC,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,OAAO,eAAe,CAAA;CAAE,CAAC;AAgB3J,eAAO,MAAM,SAAS,EAgUhB,kBAAkB,CAAC"}
1
+ {"version":3,"file":"shell-inspector.d.ts","sourceRoot":"","sources":["../../../../src/components/_internal/shell-inspector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,eAAe,EAAc,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAyD,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG1H,KAAK,uBAAuB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AAC5E,KAAK,wBAAwB,GAAG;IAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACrL,KAAK,0BAA0B,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACxL,KAAK,uBAAuB,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAAA;CAAE,CAAC;AAC5E,KAAK,4BAA4B,GAAG;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACnF,KAAK,8BAA8B,GAAG;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AACtF,KAAK,oBAAoB,GAAG,aAAa,GACvC,CAAC,wBAAwB,GAAG,0BAA0B,CAAC,GACvD,CAAC,4BAA4B,GAAG,8BAA8B,CAAC,GAAG;IAChE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACrE,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEJ,KAAK,kBAAkB,GAAG,KAAK,CAAC,yBAAyB,CAAC,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG;IAAE,MAAM,EAAE,OAAO,eAAe,CAAA;CAAE,CAAC;AAgB3J,eAAO,MAAM,SAAS,EA0VhB,kBAAkB,CAAC"}
@@ -1,2 +1,2 @@
1
- import*as n from"react";import pe from"classnames";import*as N from"../sheet.js";import{VisuallyHidden as de}from"../visually-hidden.js";import{useShell as ce}from"../shell.context.js";import{useResponsivePresentation as ue,useResponsiveInitialState as fe}from"../shell.hooks.js";import{PaneResizeContext as me}from"./shell-resize.js";import{InspectorHandle as O,PaneHandle as ye}from"./shell-handles.js";import"../shell.types.js";import{extractPaneDomProps as he,mapResponsiveBooleanToPaneMode as W}from"./shell-prop-helpers.js";const Pe=["className","children","defaultOpen","open","onOpenChange","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],j=n.forwardRef((w,c)=>{const{className:q,presentation:K={initial:"overlay",lg:"fixed"},defaultOpen:f,open:i,onOpenChange:u,expandedSize:b=320,minSize:p=200,maxSize:d=500,resizable:z=!1,collapsible:Y=!0,onExpand:k,onCollapse:T,onResize:S,onResizeStart:G,onResizeEnd:J,snapPoints:Q,snapTolerance:X,collapseThreshold:Z,paneId:I,persistence:M,children:ee,style:ne,onSizeChange:D,sizeUpdate:V,sizeUpdateMs:H=50,size:B,defaultSize:F}=w,te=he(w,Pe),r=ce(),g=ue(K),m=g==="overlay",oe=g==="stacked",l=n.useRef(null),re=n.useCallback(e=>{l.current=e,typeof c=="function"?c(e):c&&(c.current=e)},[c]),U=n.Children.toArray(ee),_=U.filter(e=>n.isValidElement(e)&&e.type===O),$=U.filter(e=>!(n.isValidElement(e)&&e.type===O)),se=n.useMemo(()=>W(i),[i]),ie=n.useMemo(()=>W(f),[f]),ae=typeof i=="object"&&i!==null;fe({controlledValue:se,defaultValue:ie,currentValue:r.inspectorMode,setValue:r.setInspectorMode,breakpointReady:r.currentBreakpointReady,controlledIsResponsive:ae,onResponsiveChange:e=>u?.(e==="expanded",{reason:"responsive"}),onInit:e=>{typeof i>"u"&&u?.(e==="expanded",{reason:"init"})}});const y=n.useMemo(()=>{const e=D,o=V,s=H??50;if(!e)return()=>{};if(o==="debounce"){let t=null;return(a,E)=>{t&&clearTimeout(t),t=setTimeout(()=>{e(a,E)},s)}}if(o==="throttle"){let t=0;return(a,E)=>{const A=Date.now();A-t>=s&&(t=A,e(a,E))}}return(t,a)=>e(t,a)},[D,V,H]),h=n.useRef(null);n.useEffect(()=>{const e=typeof i<"u";if(h.current===null){h.current=e;return}h.current!==e&&(console.warn("Shell.Inspector: Switching between controlled and uncontrolled `open` is not supported."),h.current=e)},[i]);const L=n.useRef(!1),x=n.useRef(null);n.useEffect(()=>{!L.current&&typeof i>"u"&&f&&r.inspectorMode==="expanded"&&(u?.(!0,{reason:"init"}),L.current=!0),typeof i>"u"&&(x.current!==null&&x.current!==r.inspectorMode&&u?.(r.inspectorMode==="expanded",{reason:"toggle"}),x.current=r.inspectorMode)},[r.inspectorMode,i,f,u]),n.useEffect(()=>{r.inspectorMode==="expanded"?k?.():T?.()},[r.inspectorMode,k,T]);const C=r.inspectorMode==="expanded",P=n.useMemo(()=>{if(!I||M)return M;const e=`kookie-ui:shell:inspector:${I}`;return{load:()=>{if(!(typeof window>"u"))try{const s=window.localStorage.getItem(e);return s?Number(s):void 0}catch{return}},save:s=>{if(!(typeof window>"u"))try{window.localStorage.setItem(e,String(s))}catch{}}}},[I,M]);n.useEffect(()=>{let e=!0;if(!z||!P?.load||m)return;const o=P.load(),s=t=>{!e||typeof t!="number"||!l.current||(l.current.style.setProperty("--inspector-size",`${t}px`),S?.(t))};return o instanceof Promise?o.then(s).catch(t=>{}):s(o),()=>{e=!1}},[z,P,S,m]);const le=z&&!m&&C?n.createElement(me.Provider,{value:{containerRef:l,cssVarName:"--inspector-size",minSize:p,maxSize:d,defaultSize:b,orientation:"vertical",edge:"start",computeNext:(e,o,s)=>{const t=getComputedStyle(l.current).direction==="rtl",a=e-o;return s+(t?a:-a)},onResize:S,onResizeStart:G,onResizeEnd:e=>{J?.(e),y(e,{reason:"resize"}),P?.save?.(e)},target:"inspector",collapsible:Y,snapPoints:Q,snapTolerance:X??8,collapseThreshold:Z,requestCollapse:()=>r.setInspectorMode("collapsed"),requestToggle:()=>r.togglePane("inspector")}},_.length>0?_.map((e,o)=>n.cloneElement(e,{key:e.key??o})):n.createElement(ye,null)):null,R=n.useCallback(e=>{if(e==null)return;if(typeof e=="number"&&Number.isFinite(e))return e;const o=String(e).trim();if(!o)return;if(o.endsWith("px"))return Number.parseFloat(o);if(o.endsWith("rem")){const t=Number.parseFloat(getComputedStyle(document.documentElement).fontSize||"16")||16;return Number.parseFloat(o)*t}if(o.endsWith("%")){const t=Number.parseFloat(o),a=document.documentElement.clientWidth||window.innerWidth||0;return t/100*a}const s=Number.parseFloat(o);return Number.isFinite(s)?s:void 0},[]);n.useEffect(()=>{if(l.current&&typeof B>"u"&&typeof F<"u"){const e=R(F);if(typeof e=="number"&&Number.isFinite(e)){const t=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof p=="number"?p:void 0)??e,e));l.current.style.setProperty("--inspector-size",`${t}px`),y(t,{reason:"init"})}}},[]);const v=B;if(n.useEffect(()=>{if(!l.current||typeof v>"u")return;const e=R(v);if(typeof e=="number"&&Number.isFinite(e)){const t=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof p=="number"?p:void 0)??e,e));l.current.style.setProperty("--inspector-size",`${t}px`),y(t,{reason:"controlled"})}},[v,p,d,R,y]),m){const e=r.inspectorMode==="expanded";return n.createElement(N.Root,{open:e,onOpenChange:o=>r.setInspectorMode(o?"expanded":"collapsed")},n.createElement(N.Content,{side:"end",style:{padding:0},width:{initial:`${b}px`}},n.createElement(de,null,n.createElement(N.Title,null,"Inspector")),$))}return n.createElement("div",{...te,ref:re,className:pe("rt-ShellInspector",q),"data-mode":r.inspectorMode,"data-peek":r.peekTarget==="inspector"||void 0,"data-presentation":r.currentBreakpointReady?g:void 0,"data-open":r.currentBreakpointReady&&oe&&C||void 0,style:{...ne,"--inspector-size":`${b}px`,"--inspector-min-size":`${p}px`,"--inspector-max-size":`${d}px`}},n.createElement("div",{className:"rt-ShellInspectorContent","data-visible":C||void 0},$),le)});j.displayName="Shell.Inspector",j.Handle=O;export{j as Inspector};
1
+ import*as n from"react";import ce from"classnames";import*as O from"../sheet.js";import{VisuallyHidden as ue}from"../visually-hidden.js";import{useShell as fe}from"../shell.context.js";import{useResponsivePresentation as me,useResponsiveInitialState as ye}from"../shell.hooks.js";import{PaneResizeContext as he}from"./shell-resize.js";import{InspectorHandle as w,PaneHandle as Pe}from"./shell-handles.js";import"../shell.types.js";import{extractPaneDomProps as be,mapResponsiveBooleanToPaneMode as q}from"./shell-prop-helpers.js";const ze=["className","children","defaultOpen","open","onOpenChange","size","defaultSize","onSizeChange","sizeUpdate","sizeUpdateMs","style"],K=n.forwardRef((k,c)=>{const{className:Y,presentation:G={initial:"overlay",lg:"fixed"},defaultOpen:f,open:i,onOpenChange:u,expandedSize:z=320,minSize:p=200,maxSize:d=500,resizable:S=!1,collapsible:J=!0,onExpand:T,onCollapse:D,onResize:I,onResizeStart:Q,onResizeEnd:X,snapPoints:Z,snapTolerance:ee,collapseThreshold:ne,paneId:M,persistence:R,children:te,style:oe,onSizeChange:V,sizeUpdate:B,sizeUpdateMs:H=50,size:F,defaultSize:U}=k,re=be(k,ze),r=fe(),g=me(G),m=g==="overlay",se=g==="stacked",l=n.useRef(null),ie=n.useCallback(e=>{l.current=e,typeof c=="function"?c(e):c&&(c.current=e)},[c]),_=n.Children.toArray(te),$=_.filter(e=>n.isValidElement(e)&&e.type===w),L=_.filter(e=>!(n.isValidElement(e)&&e.type===w)),ae=n.useMemo(()=>q(i),[i]),le=n.useMemo(()=>q(f),[f]),pe=typeof i=="object"&&i!==null;ye({controlledValue:ae,defaultValue:le,currentValue:r.inspectorMode,setValue:r.setInspectorMode,breakpointReady:r.currentBreakpointReady,controlledIsResponsive:pe,onResponsiveChange:e=>u?.(e==="expanded",{reason:"responsive"}),onInit:e=>{typeof i>"u"&&u?.(e==="expanded",{reason:"init"})}});const y=n.useMemo(()=>{const e=V,t=B,s=H??50;if(!e)return()=>{};if(t==="debounce"){let o=null;return(a,N)=>{o&&clearTimeout(o),o=setTimeout(()=>{e(a,N)},s)}}if(t==="throttle"){let o=0;return(a,N)=>{const j=Date.now();j-o>=s&&(o=j,e(a,N))}}return(o,a)=>e(o,a)},[V,B,H]),h=n.useRef(null);n.useEffect(()=>{const e=typeof i<"u";if(h.current===null){h.current=e;return}h.current!==e&&(console.warn("Shell.Inspector: Switching between controlled and uncontrolled `open` is not supported."),h.current=e)},[i]);const A=n.useRef(!1),x=n.useRef(null);n.useEffect(()=>{!A.current&&typeof i>"u"&&f&&r.inspectorMode==="expanded"&&(u?.(!0,{reason:"init"}),A.current=!0),typeof i>"u"&&(x.current!==null&&x.current!==r.inspectorMode&&u?.(r.inspectorMode==="expanded",{reason:"toggle"}),x.current=r.inspectorMode)},[r.inspectorMode,i,f,u]);const P=n.useRef(null),W=n.useRef(!1);n.useEffect(()=>{const e=r.inspectorMode;if(!r.currentBreakpointReady){P.current=e;return}if(!W.current){W.current=!0,P.current=e;return}const t=P.current;t!==null&&t!==e&&(e==="expanded"?T?.():e==="collapsed"&&D?.(),P.current=e)},[r.inspectorMode,r.currentBreakpointReady,T,D]);const C=r.inspectorMode==="expanded",b=n.useMemo(()=>{if(!M||R)return R;const e=`kookie-ui:shell:inspector:${M}`;return{load:()=>{if(!(typeof window>"u"))try{const s=window.localStorage.getItem(e);return s?Number(s):void 0}catch{return}},save:s=>{if(!(typeof window>"u"))try{window.localStorage.setItem(e,String(s))}catch{}}}},[M,R]);n.useEffect(()=>{let e=!0;if(!S||!b?.load||m)return;const t=b.load(),s=o=>{!e||typeof o!="number"||!l.current||(l.current.style.setProperty("--inspector-size",`${o}px`),I?.(o))};return t instanceof Promise?t.then(s).catch(o=>{}):s(t),()=>{e=!1}},[S,b,I,m]);const de=S&&!m&&C?n.createElement(he.Provider,{value:{containerRef:l,cssVarName:"--inspector-size",minSize:p,maxSize:d,defaultSize:z,orientation:"vertical",edge:"start",computeNext:(e,t,s)=>{const o=getComputedStyle(l.current).direction==="rtl",a=e-t;return s+(o?a:-a)},onResize:I,onResizeStart:Q,onResizeEnd:e=>{X?.(e),y(e,{reason:"resize"}),b?.save?.(e)},target:"inspector",collapsible:J,snapPoints:Z,snapTolerance:ee??8,collapseThreshold:ne,requestCollapse:()=>r.setInspectorMode("collapsed"),requestToggle:()=>r.togglePane("inspector")}},$.length>0?$.map((e,t)=>n.cloneElement(e,{key:e.key??t})):n.createElement(Pe,null)):null,v=n.useCallback(e=>{if(e==null)return;if(typeof e=="number"&&Number.isFinite(e))return e;const t=String(e).trim();if(!t)return;if(t.endsWith("px"))return Number.parseFloat(t);if(t.endsWith("rem")){const o=Number.parseFloat(getComputedStyle(document.documentElement).fontSize||"16")||16;return Number.parseFloat(t)*o}if(t.endsWith("%")){const o=Number.parseFloat(t),a=document.documentElement.clientWidth||window.innerWidth||0;return o/100*a}const s=Number.parseFloat(t);return Number.isFinite(s)?s:void 0},[]);n.useEffect(()=>{if(l.current&&typeof F>"u"&&typeof U<"u"){const e=v(U);if(typeof e=="number"&&Number.isFinite(e)){const o=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof p=="number"?p:void 0)??e,e));l.current.style.setProperty("--inspector-size",`${o}px`),y(o,{reason:"init"})}}},[]);const E=F;if(n.useEffect(()=>{if(!l.current||typeof E>"u")return;const e=v(E);if(typeof e=="number"&&Number.isFinite(e)){const o=Math.min((typeof d=="number"?d:void 0)??e,Math.max((typeof p=="number"?p:void 0)??e,e));l.current.style.setProperty("--inspector-size",`${o}px`),y(o,{reason:"controlled"})}},[E,p,d,v,y]),m){const e=r.inspectorMode==="expanded";return n.createElement(O.Root,{open:e,onOpenChange:t=>r.setInspectorMode(t?"expanded":"collapsed")},n.createElement(O.Content,{side:"end",style:{padding:0},width:{initial:`${z}px`}},n.createElement(ue,null,n.createElement(O.Title,null,"Inspector")),L))}return n.createElement("div",{...re,ref:ie,className:ce("rt-ShellInspector",Y),"data-mode":r.inspectorMode,"data-peek":r.peekTarget==="inspector"||void 0,"data-presentation":r.currentBreakpointReady?g:void 0,"data-open":r.currentBreakpointReady&&se&&C||void 0,style:{...oe,"--inspector-size":`${z}px`,"--inspector-min-size":`${p}px`,"--inspector-max-size":`${d}px`}},n.createElement("div",{className:"rt-ShellInspectorContent","data-visible":C||void 0},L),de)});K.displayName="Shell.Inspector",K.Handle=w;export{K as Inspector};
2
2
  //# sourceMappingURL=shell-inspector.js.map