@btst/stack 1.1.0 → 1.1.2

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 (297) hide show
  1. package/README.md +12 -12
  2. package/dist/api/index.cjs +2 -0
  3. package/dist/api/index.d.cts +1 -0
  4. package/dist/api/index.d.mts +1 -0
  5. package/dist/api/index.d.ts +1 -0
  6. package/dist/api/index.mjs +1 -0
  7. package/dist/client/components/index.cjs +2 -2
  8. package/dist/client/components/index.mjs +2 -2
  9. package/dist/client/index.cjs +4 -2
  10. package/dist/client/index.d.cts +24 -1
  11. package/dist/client/index.d.mts +24 -1
  12. package/dist/client/index.d.ts +24 -1
  13. package/dist/client/index.mjs +3 -2
  14. package/dist/context/index.cjs +1 -1
  15. package/dist/context/index.mjs +1 -1
  16. package/dist/index.cjs +2 -0
  17. package/dist/index.d.cts +1 -0
  18. package/dist/index.d.mts +1 -0
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.mjs +1 -0
  21. package/dist/node_modules/.pnpm/@floating-ui_core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.cjs +825 -0
  22. package/dist/node_modules/.pnpm/@floating-ui_core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs +814 -0
  23. package/dist/node_modules/.pnpm/@floating-ui_dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.cjs +763 -0
  24. package/dist/node_modules/.pnpm/@floating-ui_dom@1.7.4/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs +751 -0
  25. package/dist/node_modules/.pnpm/@floating-ui_react-dom@2.1.6_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.cjs +375 -0
  26. package/dist/node_modules/.pnpm/@floating-ui_react-dom@2.1.6_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs +350 -0
  27. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.cjs +160 -0
  28. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.cjs +182 -0
  29. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs +161 -0
  30. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs +137 -0
  31. package/dist/node_modules/.pnpm/@radix-ui_number@1.1.1/node_modules/@radix-ui/number/dist/index.cjs +8 -0
  32. package/dist/node_modules/.pnpm/@radix-ui_number@1.1.1/node_modules/@radix-ui/number/dist/index.mjs +6 -0
  33. package/dist/node_modules/.pnpm/@radix-ui_primitive@1.1.3/node_modules/@radix-ui/primitive/dist/index.cjs +13 -0
  34. package/dist/node_modules/.pnpm/@radix-ui_primitive@1.1.3/node_modules/@radix-ui/primitive/dist/index.mjs +11 -0
  35. package/dist/node_modules/.pnpm/@radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@1_9e04309f365863673e44407648bb0cb6/node_modules/@radix-ui/react-arrow/dist/index.cjs +42 -0
  36. package/dist/node_modules/.pnpm/@radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@1_9e04309f365863673e44407648bb0cb6/node_modules/@radix-ui/react-arrow/dist/index.mjs +25 -0
  37. package/dist/node_modules/.pnpm/@radix-ui_react-collection@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_re_6d7c277722b3619c9ee7e64e9a822c45/node_modules/@radix-ui/react-collection/dist/index.cjs +77 -0
  38. package/dist/node_modules/.pnpm/@radix-ui_react-collection@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_re_6d7c277722b3619c9ee7e64e9a822c45/node_modules/@radix-ui/react-collection/dist/index.mjs +71 -0
  39. package/dist/node_modules/.pnpm/@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +56 -0
  40. package/dist/node_modules/.pnpm/@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-compose-refs/dist/index.mjs +39 -0
  41. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.cjs +79 -0
  42. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs +63 -0
  43. package/dist/node_modules/.pnpm/@radix-ui_react-direction@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-direction/dist/index.cjs +27 -0
  44. package/dist/node_modules/.pnpm/@radix-ui_react-direction@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-direction/dist/index.mjs +11 -0
  45. package/dist/node_modules/.pnpm/@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.2_@types_react@19.2.2__@_ca5522e5d45d4722cb9eb5ce53defa61/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +229 -0
  46. package/dist/node_modules/.pnpm/@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.2_@types_react@19.2.2__@_ca5522e5d45d4722cb9eb5ce53defa61/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs +212 -0
  47. package/dist/node_modules/.pnpm/@radix-ui_react-focus-guards@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-focus-guards/dist/index.cjs +46 -0
  48. package/dist/node_modules/.pnpm/@radix-ui_react-focus-guards@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-focus-guards/dist/index.mjs +30 -0
  49. package/dist/node_modules/.pnpm/@radix-ui_react-focus-scope@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_r_93de389b3f622f9f764acc8e59ec80c0/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +224 -0
  50. package/dist/node_modules/.pnpm/@radix-ui_react-focus-scope@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_r_93de389b3f622f9f764acc8e59ec80c0/node_modules/@radix-ui/react-focus-scope/dist/index.mjs +208 -0
  51. package/dist/node_modules/.pnpm/@radix-ui_react-id@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-id/dist/index.cjs +31 -0
  52. package/dist/node_modules/.pnpm/@radix-ui_react-id@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-id/dist/index.mjs +15 -0
  53. package/dist/node_modules/.pnpm/@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_d6285b8269ea5d6b59b300f5be279a0c/node_modules/@radix-ui/react-popper/dist/index.cjs +308 -0
  54. package/dist/node_modules/.pnpm/@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_d6285b8269ea5d6b59b300f5be279a0c/node_modules/@radix-ui/react-popper/dist/index.mjs +284 -0
  55. package/dist/node_modules/.pnpm/@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_478b3d5dd4afab1a3dcce7ed1748cb95/node_modules/@radix-ui/react-portal/dist/index.cjs +37 -0
  56. package/dist/node_modules/.pnpm/@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_478b3d5dd4afab1a3dcce7ed1748cb95/node_modules/@radix-ui/react-portal/dist/index.mjs +18 -0
  57. package/dist/node_modules/.pnpm/@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.2_@types_react@19.2.2__@types_rea_bdc15f10281778271ffcbe8dd3cd491e/node_modules/@radix-ui/react-primitive/dist/index.cjs +61 -0
  58. package/dist/node_modules/.pnpm/@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.2_@types_react@19.2.2__@types_rea_bdc15f10281778271ffcbe8dd3cd491e/node_modules/@radix-ui/react-primitive/dist/index.mjs +43 -0
  59. package/dist/node_modules/.pnpm/@radix-ui_react-select@2.2.6_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_802c3d414c85063bee785fcc98a39c07/node_modules/@radix-ui/react-select/dist/index.cjs +1198 -0
  60. package/dist/node_modules/.pnpm/@radix-ui_react-select@2.2.6_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_802c3d414c85063bee785fcc98a39c07/node_modules/@radix-ui/react-select/dist/index.mjs +1154 -0
  61. package/dist/node_modules/.pnpm/@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +28 -0
  62. package/dist/node_modules/.pnpm/@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs +12 -0
  63. package/dist/node_modules/.pnpm/@radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs +86 -0
  64. package/dist/node_modules/.pnpm/@radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs +70 -0
  65. package/dist/node_modules/.pnpm/@radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-escape-keydown/dist/index.cjs +34 -0
  66. package/dist/node_modules/.pnpm/@radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs +18 -0
  67. package/dist/node_modules/.pnpm/@radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs +23 -0
  68. package/dist/node_modules/.pnpm/@radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs +7 -0
  69. package/dist/node_modules/.pnpm/@radix-ui_react-use-previous@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-previous/dist/index.cjs +31 -0
  70. package/dist/node_modules/.pnpm/@radix-ui_react-use-previous@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-previous/dist/index.mjs +15 -0
  71. package/dist/node_modules/.pnpm/@radix-ui_react-use-size@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-size/dist/index.cjs +56 -0
  72. package/dist/node_modules/.pnpm/@radix-ui_react-use-size@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-size/dist/index.mjs +40 -0
  73. package/dist/node_modules/.pnpm/@radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.2_@types_react@19.2.2__@typ_a84e98a44624c31e835a98d4b8b0c30d/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs +51 -0
  74. package/dist/node_modules/.pnpm/@radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.2_@types_react@19.2.2__@typ_a84e98a44624c31e835a98d4b8b0c30d/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs +34 -0
  75. package/dist/node_modules/.pnpm/aria-hidden@1.2.6/node_modules/aria-hidden/dist/es2015/index.cjs +139 -0
  76. package/dist/node_modules/.pnpm/aria-hidden@1.2.6/node_modules/aria-hidden/dist/es2015/index.mjs +137 -0
  77. package/dist/node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.0/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.cjs +39 -0
  78. package/dist/node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.0/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.mjs +37 -0
  79. package/dist/node_modules/.pnpm/embla-carousel-reactive-utils@8.6.0_embla-carousel@8.6.0/node_modules/embla-carousel-reactive-utils/esm/embla-carousel-reactive-utils.esm.cjs +43 -0
  80. package/dist/node_modules/.pnpm/embla-carousel-reactive-utils@8.6.0_embla-carousel@8.6.0/node_modules/embla-carousel-reactive-utils/esm/embla-carousel-reactive-utils.esm.mjs +38 -0
  81. package/dist/node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/embla-carousel.esm.cjs +1671 -0
  82. package/dist/node_modules/.pnpm/embla-carousel@8.6.0/node_modules/embla-carousel/esm/embla-carousel.esm.mjs +1669 -0
  83. package/dist/node_modules/.pnpm/get-nonce@1.0.1/node_modules/get-nonce/dist/es2015/index.cjs +10 -0
  84. package/dist/node_modules/.pnpm/get-nonce@1.0.1/node_modules/get-nonce/dist/es2015/index.mjs +8 -0
  85. package/dist/node_modules/.pnpm/react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll-bar/dist/es2015/component.cjs +74 -0
  86. package/dist/node_modules/.pnpm/react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll-bar/dist/es2015/component.mjs +56 -0
  87. package/dist/node_modules/.pnpm/react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll-bar/dist/es2015/constants.cjs +15 -0
  88. package/dist/node_modules/.pnpm/react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll-bar/dist/es2015/constants.mjs +10 -0
  89. package/dist/node_modules/.pnpm/react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll-bar/dist/es2015/utils.cjs +34 -0
  90. package/dist/node_modules/.pnpm/react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll-bar/dist/es2015/utils.mjs +31 -0
  91. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/Combination.cjs +25 -0
  92. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/Combination.mjs +9 -0
  93. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs +178 -0
  94. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/SideEffect.mjs +160 -0
  95. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/UI.cjs +54 -0
  96. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/UI.mjs +38 -0
  97. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.cjs +23 -0
  98. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.mjs +21 -0
  99. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/handleScroll.cjs +113 -0
  100. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/handleScroll.mjs +110 -0
  101. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/medium.cjs +7 -0
  102. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/medium.mjs +5 -0
  103. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/sidecar.cjs +9 -0
  104. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/sidecar.mjs +7 -0
  105. package/dist/node_modules/.pnpm/react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0/node_modules/react-style-singleton/dist/es2015/component.cjs +21 -0
  106. package/dist/node_modules/.pnpm/react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0/node_modules/react-style-singleton/dist/es2015/component.mjs +19 -0
  107. package/dist/node_modules/.pnpm/react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0/node_modules/react-style-singleton/dist/es2015/hook.cjs +41 -0
  108. package/dist/node_modules/.pnpm/react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0/node_modules/react-style-singleton/dist/es2015/hook.mjs +25 -0
  109. package/dist/node_modules/.pnpm/react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0/node_modules/react-style-singleton/dist/es2015/singleton.cjs +53 -0
  110. package/dist/node_modules/.pnpm/react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0/node_modules/react-style-singleton/dist/es2015/singleton.mjs +51 -0
  111. package/dist/node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.cjs +59 -0
  112. package/dist/node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs +56 -0
  113. package/dist/node_modules/.pnpm/use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0/node_modules/use-callback-ref/dist/es2015/assignRef.cjs +26 -0
  114. package/dist/node_modules/.pnpm/use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0/node_modules/use-callback-ref/dist/es2015/assignRef.mjs +24 -0
  115. package/dist/node_modules/.pnpm/use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0/node_modules/use-callback-ref/dist/es2015/useMergeRef.cjs +64 -0
  116. package/dist/node_modules/.pnpm/use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0/node_modules/use-callback-ref/dist/es2015/useMergeRef.mjs +48 -0
  117. package/dist/node_modules/.pnpm/use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0/node_modules/use-callback-ref/dist/es2015/useRef.cjs +44 -0
  118. package/dist/node_modules/.pnpm/use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0/node_modules/use-callback-ref/dist/es2015/useRef.mjs +42 -0
  119. package/dist/node_modules/.pnpm/use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/use-sidecar/dist/es2015/exports.cjs +37 -0
  120. package/dist/node_modules/.pnpm/use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/use-sidecar/dist/es2015/exports.mjs +21 -0
  121. package/dist/node_modules/.pnpm/use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/use-sidecar/dist/es2015/medium.cjs +79 -0
  122. package/dist/node_modules/.pnpm/use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/use-sidecar/dist/es2015/medium.mjs +77 -0
  123. package/dist/packages/better-stack/src/client/path-utils.cjs +15 -0
  124. package/dist/packages/better-stack/src/client/path-utils.mjs +13 -0
  125. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/image-field.cjs +3 -3
  126. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/image-field.mjs +3 -3
  127. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/post-forms.cjs +5 -5
  128. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/post-forms.mjs +5 -5
  129. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/tags-multiselect.cjs +2 -6
  130. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/tags-multiselect.mjs +1 -1
  131. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/form-page-skeleton.cjs +1 -1
  132. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/form-page-skeleton.mjs +1 -1
  133. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/list-page-skeleton.cjs +1 -1
  134. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/list-page-skeleton.mjs +1 -1
  135. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/page-header-skeleton.cjs +1 -1
  136. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/page-header-skeleton.mjs +1 -1
  137. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/post-card-skeleton.cjs +2 -2
  138. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/post-card-skeleton.mjs +2 -2
  139. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/post-page-skeleton.cjs +1 -1
  140. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/post-page-skeleton.mjs +1 -1
  141. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/post-page.internal.cjs +1 -1
  142. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/post-page.internal.mjs +1 -1
  143. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/better-blog-attribution.cjs +4 -4
  144. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/better-blog-attribution.mjs +4 -4
  145. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/empty-list.cjs +1 -1
  146. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/empty-list.mjs +1 -1
  147. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/on-this-page.cjs +1 -1
  148. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/on-this-page.mjs +1 -1
  149. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/post-card.cjs +2 -2
  150. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/post-card.mjs +2 -2
  151. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/post-navigation.cjs +1 -1
  152. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/post-navigation.mjs +1 -1
  153. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/posts-list.cjs +1 -1
  154. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/posts-list.mjs +1 -1
  155. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/recent-posts-carousel.cjs +1 -1
  156. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/recent-posts-carousel.mjs +1 -1
  157. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/search-modal.cjs +1 -1
  158. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/search-modal.mjs +1 -1
  159. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/tags-list.cjs +1 -1
  160. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/tags-list.mjs +1 -1
  161. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/hooks/blog-hooks.cjs +1 -1
  162. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/hooks/blog-hooks.mjs +1 -1
  163. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/plugin.cjs +1 -1
  164. package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/plugin.mjs +1 -1
  165. package/dist/packages/ui/src/components/badge.cjs +42 -0
  166. package/dist/packages/ui/src/components/badge.mjs +39 -0
  167. package/dist/packages/ui/src/components/button.cjs +54 -0
  168. package/dist/packages/ui/src/components/button.mjs +51 -0
  169. package/dist/packages/ui/src/components/card.cjs +67 -0
  170. package/dist/packages/ui/src/components/card.mjs +61 -0
  171. package/dist/packages/ui/src/components/carousel.cjs +215 -0
  172. package/dist/packages/ui/src/components/carousel.mjs +195 -0
  173. package/dist/packages/ui/src/components/command.cjs +142 -0
  174. package/dist/packages/ui/src/components/command.mjs +134 -0
  175. package/dist/packages/ui/src/components/dialog.cjs +127 -0
  176. package/dist/packages/ui/src/components/dialog.mjs +105 -0
  177. package/dist/packages/ui/src/components/empty.cjs +76 -0
  178. package/dist/packages/ui/src/components/empty.mjs +71 -0
  179. package/dist/packages/ui/src/components/form.cjs +133 -0
  180. package/dist/packages/ui/src/components/form.mjs +110 -0
  181. package/dist/packages/ui/src/components/input.cjs +23 -0
  182. package/dist/packages/ui/src/components/input.mjs +21 -0
  183. package/dist/packages/ui/src/components/label.cjs +39 -0
  184. package/dist/packages/ui/src/components/label.mjs +23 -0
  185. package/dist/packages/ui/src/components/multi-select.cjs +555 -0
  186. package/dist/packages/ui/src/components/multi-select.mjs +540 -0
  187. package/dist/packages/ui/src/components/select.cjs +140 -0
  188. package/dist/packages/ui/src/components/select.mjs +132 -0
  189. package/dist/packages/ui/src/components/skeleton.cjs +17 -0
  190. package/dist/packages/ui/src/components/skeleton.mjs +15 -0
  191. package/dist/packages/ui/src/components/switch.cjs +48 -0
  192. package/dist/packages/ui/src/components/switch.mjs +32 -0
  193. package/dist/packages/ui/src/components/textarea.cjs +20 -0
  194. package/dist/packages/ui/src/components/textarea.mjs +18 -0
  195. package/dist/packages/ui/src/hooks/use-debounce.cjs +18 -0
  196. package/dist/packages/ui/src/hooks/use-debounce.mjs +16 -0
  197. package/dist/packages/ui/src/lib/utils.cjs +10 -0
  198. package/dist/packages/ui/src/lib/utils.mjs +8 -0
  199. package/dist/plugins/api/index.cjs +0 -2
  200. package/dist/plugins/api/index.d.cts +0 -1
  201. package/dist/plugins/api/index.d.mts +0 -1
  202. package/dist/plugins/api/index.d.ts +0 -1
  203. package/dist/plugins/api/index.mjs +0 -1
  204. package/dist/plugins/blog/api/index.cjs +1 -1
  205. package/dist/plugins/blog/api/index.mjs +1 -1
  206. package/dist/plugins/blog/client/components/index.cjs +4 -4
  207. package/dist/plugins/blog/client/components/index.mjs +4 -4
  208. package/dist/plugins/blog/client/hooks/index.cjs +1 -1
  209. package/dist/plugins/blog/client/hooks/index.mjs +1 -1
  210. package/dist/plugins/blog/client/index.cjs +1 -1
  211. package/dist/plugins/blog/client/index.mjs +1 -1
  212. package/dist/plugins/client/index.cjs +1 -1
  213. package/dist/plugins/client/index.mjs +1 -1
  214. package/package.json +5 -5
  215. package/src/api/index.ts +2 -0
  216. package/src/client/index.ts +2 -0
  217. package/src/client/path-utils.ts +38 -0
  218. package/src/plugins/api/index.ts +0 -1
  219. package/src/plugins/blog/client/components/shared/better-blog-attribution.tsx +4 -4
  220. /package/dist/{client → packages/better-stack/src/client}/components/compose.cjs +0 -0
  221. /package/dist/{client → packages/better-stack/src/client}/components/compose.mjs +0 -0
  222. /package/dist/{client → packages/better-stack/src/client}/components/error-boundary.cjs +0 -0
  223. /package/dist/{client → packages/better-stack/src/client}/components/error-boundary.mjs +0 -0
  224. /package/dist/{client → packages/better-stack/src/client}/meta-utils.cjs +0 -0
  225. /package/dist/{client → packages/better-stack/src/client}/meta-utils.mjs +0 -0
  226. /package/dist/{client → packages/better-stack/src/client}/sitemap-utils.cjs +0 -0
  227. /package/dist/{client → packages/better-stack/src/client}/sitemap-utils.mjs +0 -0
  228. /package/dist/{context → packages/better-stack/src/context}/provider.cjs +0 -0
  229. /package/dist/{context → packages/better-stack/src/context}/provider.mjs +0 -0
  230. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/api/plugin.cjs +0 -0
  231. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/api/plugin.mjs +0 -0
  232. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/markdown-editor.cjs +0 -0
  233. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/forms/markdown-editor.mjs +0 -0
  234. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/index.cjs +0 -0
  235. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/loading/index.mjs +0 -0
  236. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/404-page.cjs +0 -0
  237. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/404-page.mjs +0 -0
  238. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/edit-post-page.cjs +0 -0
  239. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/edit-post-page.internal.cjs +0 -0
  240. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/edit-post-page.internal.mjs +0 -0
  241. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/edit-post-page.mjs +0 -0
  242. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/home-page.cjs +0 -0
  243. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/home-page.internal.cjs +0 -0
  244. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/home-page.internal.mjs +0 -0
  245. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/home-page.mjs +0 -0
  246. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/new-post-page.cjs +0 -0
  247. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/new-post-page.internal.cjs +0 -0
  248. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/new-post-page.internal.mjs +0 -0
  249. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/new-post-page.mjs +0 -0
  250. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/post-page.cjs +0 -0
  251. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/post-page.mjs +0 -0
  252. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/tag-page.cjs +0 -0
  253. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/tag-page.internal.cjs +0 -0
  254. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/tag-page.internal.mjs +0 -0
  255. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/pages/tag-page.mjs +0 -0
  256. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/default-error.cjs +0 -0
  257. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/default-error.mjs +0 -0
  258. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/defaults.cjs +0 -0
  259. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/defaults.mjs +0 -0
  260. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/error-placeholder.cjs +0 -0
  261. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/error-placeholder.mjs +0 -0
  262. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/highlight-text.cjs +0 -0
  263. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/highlight-text.mjs +0 -0
  264. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/markdown-content.cjs +0 -0
  265. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/markdown-content.mjs +0 -0
  266. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/page-header.cjs +0 -0
  267. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/page-header.mjs +0 -0
  268. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/page-layout.cjs +0 -0
  269. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/page-layout.mjs +0 -0
  270. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/page-wrapper.cjs +0 -0
  271. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/page-wrapper.mjs +0 -0
  272. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/search-input.cjs +0 -0
  273. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/search-input.mjs +0 -0
  274. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/use-route-lifecycle.cjs +0 -0
  275. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/components/shared/use-route-lifecycle.mjs +0 -0
  276. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/hooks/use-debounce.cjs +0 -0
  277. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/hooks/use-debounce.mjs +0 -0
  278. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-card.cjs +0 -0
  279. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-card.mjs +0 -0
  280. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-common.cjs +0 -0
  281. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-common.mjs +0 -0
  282. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-forms.cjs +0 -0
  283. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-forms.mjs +0 -0
  284. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-list.cjs +0 -0
  285. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-list.mjs +0 -0
  286. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-post.cjs +0 -0
  287. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/blog-post.mjs +0 -0
  288. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/index.cjs +0 -0
  289. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/client/localization/index.mjs +0 -0
  290. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/db.cjs +0 -0
  291. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/db.mjs +0 -0
  292. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/schemas.cjs +0 -0
  293. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/schemas.mjs +0 -0
  294. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/utils.cjs +0 -0
  295. /package/dist/{plugins → packages/better-stack/src/plugins}/blog/utils.mjs +0 -0
  296. /package/dist/{plugins → packages/better-stack/src/plugins}/utils.cjs +0 -0
  297. /package/dist/{plugins → packages/better-stack/src/plugins}/utils.mjs +0 -0
@@ -0,0 +1,1154 @@
1
+ "use client";
2
+ import * as React from 'react';
3
+ import * as ReactDOM from 'react-dom';
4
+ import { clamp } from '../../../../../@radix-ui_number@1.1.1/node_modules/@radix-ui/number/dist/index.mjs';
5
+ import { composeEventHandlers } from '../../../../../@radix-ui_primitive@1.1.3/node_modules/@radix-ui/primitive/dist/index.mjs';
6
+ import { createCollection } from '../../../../../@radix-ui_react-collection@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_re_6d7c277722b3619c9ee7e64e9a822c45/node_modules/@radix-ui/react-collection/dist/index.mjs';
7
+ import { useComposedRefs } from '../../../../../@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-compose-refs/dist/index.mjs';
8
+ import { createContextScope } from '../../../../../@radix-ui_react-context@1.1.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs';
9
+ import { useDirection } from '../../../../../@radix-ui_react-direction@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-direction/dist/index.mjs';
10
+ import { DismissableLayer } from '../../../../../@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.2_@types_react@19.2.2__@_ca5522e5d45d4722cb9eb5ce53defa61/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs';
11
+ import { useFocusGuards } from '../../../../../@radix-ui_react-focus-guards@1.1.3_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-focus-guards/dist/index.mjs';
12
+ import { FocusScope } from '../../../../../@radix-ui_react-focus-scope@1.1.7_@types_react-dom@19.2.2_@types_react@19.2.2__@types_r_93de389b3f622f9f764acc8e59ec80c0/node_modules/@radix-ui/react-focus-scope/dist/index.mjs';
13
+ import { useId } from '../../../../../@radix-ui_react-id@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-id/dist/index.mjs';
14
+ import { createPopperScope, Root as Root2$1, Anchor, Content, Arrow } from '../../../../../@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_d6285b8269ea5d6b59b300f5be279a0c/node_modules/@radix-ui/react-popper/dist/index.mjs';
15
+ import { Portal as Portal$1 } from '../../../../../@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.2_@types_react@19.2.2__@types_react@_478b3d5dd4afab1a3dcce7ed1748cb95/node_modules/@radix-ui/react-portal/dist/index.mjs';
16
+ import { Primitive } from '../../../../../@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.2_@types_react@19.2.2__@types_rea_bdc15f10281778271ffcbe8dd3cd491e/node_modules/@radix-ui/react-primitive/dist/index.mjs';
17
+ import { createSlot } from '@radix-ui/react-slot';
18
+ import { useCallbackRef } from '../../../../../@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs';
19
+ import { useControllableState } from '../../../../../@radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs';
20
+ import { useLayoutEffect as useLayoutEffect2 } from '../../../../../@radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs';
21
+ import { usePrevious } from '../../../../../@radix-ui_react-use-previous@1.1.1_@types_react@19.2.2_react@19.2.0/node_modules/@radix-ui/react-use-previous/dist/index.mjs';
22
+ import { VISUALLY_HIDDEN_STYLES } from '../../../../../@radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.2_@types_react@19.2.2__@typ_a84e98a44624c31e835a98d4b8b0c30d/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs';
23
+ import { hideOthers } from '../../../../../aria-hidden@1.2.6/node_modules/aria-hidden/dist/es2015/index.mjs';
24
+ import ReactRemoveScroll from '../../../../../react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/Combination.mjs';
25
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
26
+
27
+ var OPEN_KEYS = [" ", "Enter", "ArrowUp", "ArrowDown"];
28
+ var SELECTION_KEYS = [" ", "Enter"];
29
+ var SELECT_NAME = "Select";
30
+ var [Collection, useCollection, createCollectionScope] = createCollection(SELECT_NAME);
31
+ var [createSelectContext] = createContextScope(SELECT_NAME, [
32
+ createCollectionScope,
33
+ createPopperScope
34
+ ]);
35
+ var usePopperScope = createPopperScope();
36
+ var [SelectProvider, useSelectContext] = createSelectContext(SELECT_NAME);
37
+ var [SelectNativeOptionsProvider, useSelectNativeOptionsContext] = createSelectContext(SELECT_NAME);
38
+ var Select = (props) => {
39
+ const {
40
+ __scopeSelect,
41
+ children,
42
+ open: openProp,
43
+ defaultOpen,
44
+ onOpenChange,
45
+ value: valueProp,
46
+ defaultValue,
47
+ onValueChange,
48
+ dir,
49
+ name,
50
+ autoComplete,
51
+ disabled,
52
+ required,
53
+ form
54
+ } = props;
55
+ const popperScope = usePopperScope(__scopeSelect);
56
+ const [trigger, setTrigger] = React.useState(null);
57
+ const [valueNode, setValueNode] = React.useState(null);
58
+ const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);
59
+ const direction = useDirection(dir);
60
+ const [open, setOpen] = useControllableState({
61
+ prop: openProp,
62
+ defaultProp: defaultOpen ?? false,
63
+ onChange: onOpenChange,
64
+ caller: SELECT_NAME
65
+ });
66
+ const [value, setValue] = useControllableState({
67
+ prop: valueProp,
68
+ defaultProp: defaultValue,
69
+ onChange: onValueChange,
70
+ caller: SELECT_NAME
71
+ });
72
+ const triggerPointerDownPosRef = React.useRef(null);
73
+ const isFormControl = trigger ? form || !!trigger.closest("form") : true;
74
+ const [nativeOptionsSet, setNativeOptionsSet] = React.useState(/* @__PURE__ */ new Set());
75
+ const nativeSelectKey = Array.from(nativeOptionsSet).map((option) => option.props.value).join(";");
76
+ return /* @__PURE__ */ jsx(Root2$1, { ...popperScope, children: /* @__PURE__ */ jsxs(
77
+ SelectProvider,
78
+ {
79
+ required,
80
+ scope: __scopeSelect,
81
+ trigger,
82
+ onTriggerChange: setTrigger,
83
+ valueNode,
84
+ onValueNodeChange: setValueNode,
85
+ valueNodeHasChildren,
86
+ onValueNodeHasChildrenChange: setValueNodeHasChildren,
87
+ contentId: useId(),
88
+ value,
89
+ onValueChange: setValue,
90
+ open,
91
+ onOpenChange: setOpen,
92
+ dir: direction,
93
+ triggerPointerDownPosRef,
94
+ disabled,
95
+ children: [
96
+ /* @__PURE__ */ jsx(Collection.Provider, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(
97
+ SelectNativeOptionsProvider,
98
+ {
99
+ scope: props.__scopeSelect,
100
+ onNativeOptionAdd: React.useCallback((option) => {
101
+ setNativeOptionsSet((prev) => new Set(prev).add(option));
102
+ }, []),
103
+ onNativeOptionRemove: React.useCallback((option) => {
104
+ setNativeOptionsSet((prev) => {
105
+ const optionsSet = new Set(prev);
106
+ optionsSet.delete(option);
107
+ return optionsSet;
108
+ });
109
+ }, []),
110
+ children
111
+ }
112
+ ) }),
113
+ isFormControl ? /* @__PURE__ */ jsxs(
114
+ SelectBubbleInput,
115
+ {
116
+ "aria-hidden": true,
117
+ required,
118
+ tabIndex: -1,
119
+ name,
120
+ autoComplete,
121
+ value,
122
+ onChange: (event) => setValue(event.target.value),
123
+ disabled,
124
+ form,
125
+ children: [
126
+ value === void 0 ? /* @__PURE__ */ jsx("option", { value: "" }) : null,
127
+ Array.from(nativeOptionsSet)
128
+ ]
129
+ },
130
+ nativeSelectKey
131
+ ) : null
132
+ ]
133
+ }
134
+ ) });
135
+ };
136
+ Select.displayName = SELECT_NAME;
137
+ var TRIGGER_NAME = "SelectTrigger";
138
+ var SelectTrigger = React.forwardRef(
139
+ (props, forwardedRef) => {
140
+ const { __scopeSelect, disabled = false, ...triggerProps } = props;
141
+ const popperScope = usePopperScope(__scopeSelect);
142
+ const context = useSelectContext(TRIGGER_NAME, __scopeSelect);
143
+ const isDisabled = context.disabled || disabled;
144
+ const composedRefs = useComposedRefs(forwardedRef, context.onTriggerChange);
145
+ const getItems = useCollection(__scopeSelect);
146
+ const pointerTypeRef = React.useRef("touch");
147
+ const [searchRef, handleTypeaheadSearch, resetTypeahead] = useTypeaheadSearch((search) => {
148
+ const enabledItems = getItems().filter((item) => !item.disabled);
149
+ const currentItem = enabledItems.find((item) => item.value === context.value);
150
+ const nextItem = findNextItem(enabledItems, search, currentItem);
151
+ if (nextItem !== void 0) {
152
+ context.onValueChange(nextItem.value);
153
+ }
154
+ });
155
+ const handleOpen = (pointerEvent) => {
156
+ if (!isDisabled) {
157
+ context.onOpenChange(true);
158
+ resetTypeahead();
159
+ }
160
+ if (pointerEvent) {
161
+ context.triggerPointerDownPosRef.current = {
162
+ x: Math.round(pointerEvent.pageX),
163
+ y: Math.round(pointerEvent.pageY)
164
+ };
165
+ }
166
+ };
167
+ return /* @__PURE__ */ jsx(Anchor, { asChild: true, ...popperScope, children: /* @__PURE__ */ jsx(
168
+ Primitive.button,
169
+ {
170
+ type: "button",
171
+ role: "combobox",
172
+ "aria-controls": context.contentId,
173
+ "aria-expanded": context.open,
174
+ "aria-required": context.required,
175
+ "aria-autocomplete": "none",
176
+ dir: context.dir,
177
+ "data-state": context.open ? "open" : "closed",
178
+ disabled: isDisabled,
179
+ "data-disabled": isDisabled ? "" : void 0,
180
+ "data-placeholder": shouldShowPlaceholder(context.value) ? "" : void 0,
181
+ ...triggerProps,
182
+ ref: composedRefs,
183
+ onClick: composeEventHandlers(triggerProps.onClick, (event) => {
184
+ event.currentTarget.focus();
185
+ if (pointerTypeRef.current !== "mouse") {
186
+ handleOpen(event);
187
+ }
188
+ }),
189
+ onPointerDown: composeEventHandlers(triggerProps.onPointerDown, (event) => {
190
+ pointerTypeRef.current = event.pointerType;
191
+ const target = event.target;
192
+ if (target.hasPointerCapture(event.pointerId)) {
193
+ target.releasePointerCapture(event.pointerId);
194
+ }
195
+ if (event.button === 0 && event.ctrlKey === false && event.pointerType === "mouse") {
196
+ handleOpen(event);
197
+ event.preventDefault();
198
+ }
199
+ }),
200
+ onKeyDown: composeEventHandlers(triggerProps.onKeyDown, (event) => {
201
+ const isTypingAhead = searchRef.current !== "";
202
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
203
+ if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
204
+ if (isTypingAhead && event.key === " ") return;
205
+ if (OPEN_KEYS.includes(event.key)) {
206
+ handleOpen();
207
+ event.preventDefault();
208
+ }
209
+ })
210
+ }
211
+ ) });
212
+ }
213
+ );
214
+ SelectTrigger.displayName = TRIGGER_NAME;
215
+ var VALUE_NAME = "SelectValue";
216
+ var SelectValue = React.forwardRef(
217
+ (props, forwardedRef) => {
218
+ const { __scopeSelect, className, style, children, placeholder = "", ...valueProps } = props;
219
+ const context = useSelectContext(VALUE_NAME, __scopeSelect);
220
+ const { onValueNodeHasChildrenChange } = context;
221
+ const hasChildren = children !== void 0;
222
+ const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);
223
+ useLayoutEffect2(() => {
224
+ onValueNodeHasChildrenChange(hasChildren);
225
+ }, [onValueNodeHasChildrenChange, hasChildren]);
226
+ return /* @__PURE__ */ jsx(
227
+ Primitive.span,
228
+ {
229
+ ...valueProps,
230
+ ref: composedRefs,
231
+ style: { pointerEvents: "none" },
232
+ children: shouldShowPlaceholder(context.value) ? /* @__PURE__ */ jsx(Fragment, { children: placeholder }) : children
233
+ }
234
+ );
235
+ }
236
+ );
237
+ SelectValue.displayName = VALUE_NAME;
238
+ var ICON_NAME = "SelectIcon";
239
+ var SelectIcon = React.forwardRef(
240
+ (props, forwardedRef) => {
241
+ const { __scopeSelect, children, ...iconProps } = props;
242
+ return /* @__PURE__ */ jsx(Primitive.span, { "aria-hidden": true, ...iconProps, ref: forwardedRef, children: children || "\u25BC" });
243
+ }
244
+ );
245
+ SelectIcon.displayName = ICON_NAME;
246
+ var PORTAL_NAME = "SelectPortal";
247
+ var SelectPortal = (props) => {
248
+ return /* @__PURE__ */ jsx(Portal$1, { asChild: true, ...props });
249
+ };
250
+ SelectPortal.displayName = PORTAL_NAME;
251
+ var CONTENT_NAME = "SelectContent";
252
+ var SelectContent = React.forwardRef(
253
+ (props, forwardedRef) => {
254
+ const context = useSelectContext(CONTENT_NAME, props.__scopeSelect);
255
+ const [fragment, setFragment] = React.useState();
256
+ useLayoutEffect2(() => {
257
+ setFragment(new DocumentFragment());
258
+ }, []);
259
+ if (!context.open) {
260
+ const frag = fragment;
261
+ return frag ? ReactDOM.createPortal(
262
+ /* @__PURE__ */ jsx(SelectContentProvider, { scope: props.__scopeSelect, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeSelect, children: /* @__PURE__ */ jsx("div", { children: props.children }) }) }),
263
+ frag
264
+ ) : null;
265
+ }
266
+ return /* @__PURE__ */ jsx(SelectContentImpl, { ...props, ref: forwardedRef });
267
+ }
268
+ );
269
+ SelectContent.displayName = CONTENT_NAME;
270
+ var CONTENT_MARGIN = 10;
271
+ var [SelectContentProvider, useSelectContentContext] = createSelectContext(CONTENT_NAME);
272
+ var CONTENT_IMPL_NAME = "SelectContentImpl";
273
+ var Slot = createSlot("SelectContent.RemoveScroll");
274
+ var SelectContentImpl = React.forwardRef(
275
+ (props, forwardedRef) => {
276
+ const {
277
+ __scopeSelect,
278
+ position = "item-aligned",
279
+ onCloseAutoFocus,
280
+ onEscapeKeyDown,
281
+ onPointerDownOutside,
282
+ //
283
+ // PopperContent props
284
+ side,
285
+ sideOffset,
286
+ align,
287
+ alignOffset,
288
+ arrowPadding,
289
+ collisionBoundary,
290
+ collisionPadding,
291
+ sticky,
292
+ hideWhenDetached,
293
+ avoidCollisions,
294
+ //
295
+ ...contentProps
296
+ } = props;
297
+ const context = useSelectContext(CONTENT_NAME, __scopeSelect);
298
+ const [content, setContent] = React.useState(null);
299
+ const [viewport, setViewport] = React.useState(null);
300
+ const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));
301
+ const [selectedItem, setSelectedItem] = React.useState(null);
302
+ const [selectedItemText, setSelectedItemText] = React.useState(
303
+ null
304
+ );
305
+ const getItems = useCollection(__scopeSelect);
306
+ const [isPositioned, setIsPositioned] = React.useState(false);
307
+ const firstValidItemFoundRef = React.useRef(false);
308
+ React.useEffect(() => {
309
+ if (content) return hideOthers(content);
310
+ }, [content]);
311
+ useFocusGuards();
312
+ const focusFirst = React.useCallback(
313
+ (candidates) => {
314
+ const [firstItem, ...restItems] = getItems().map((item) => item.ref.current);
315
+ const [lastItem] = restItems.slice(-1);
316
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
317
+ for (const candidate of candidates) {
318
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
319
+ candidate?.scrollIntoView({ block: "nearest" });
320
+ if (candidate === firstItem && viewport) viewport.scrollTop = 0;
321
+ if (candidate === lastItem && viewport) viewport.scrollTop = viewport.scrollHeight;
322
+ candidate?.focus();
323
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
324
+ }
325
+ },
326
+ [getItems, viewport]
327
+ );
328
+ const focusSelectedItem = React.useCallback(
329
+ () => focusFirst([selectedItem, content]),
330
+ [focusFirst, selectedItem, content]
331
+ );
332
+ React.useEffect(() => {
333
+ if (isPositioned) {
334
+ focusSelectedItem();
335
+ }
336
+ }, [isPositioned, focusSelectedItem]);
337
+ const { onOpenChange, triggerPointerDownPosRef } = context;
338
+ React.useEffect(() => {
339
+ if (content) {
340
+ let pointerMoveDelta = { x: 0, y: 0 };
341
+ const handlePointerMove = (event) => {
342
+ pointerMoveDelta = {
343
+ x: Math.abs(Math.round(event.pageX) - (triggerPointerDownPosRef.current?.x ?? 0)),
344
+ y: Math.abs(Math.round(event.pageY) - (triggerPointerDownPosRef.current?.y ?? 0))
345
+ };
346
+ };
347
+ const handlePointerUp = (event) => {
348
+ if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {
349
+ event.preventDefault();
350
+ } else {
351
+ if (!content.contains(event.target)) {
352
+ onOpenChange(false);
353
+ }
354
+ }
355
+ document.removeEventListener("pointermove", handlePointerMove);
356
+ triggerPointerDownPosRef.current = null;
357
+ };
358
+ if (triggerPointerDownPosRef.current !== null) {
359
+ document.addEventListener("pointermove", handlePointerMove);
360
+ document.addEventListener("pointerup", handlePointerUp, { capture: true, once: true });
361
+ }
362
+ return () => {
363
+ document.removeEventListener("pointermove", handlePointerMove);
364
+ document.removeEventListener("pointerup", handlePointerUp, { capture: true });
365
+ };
366
+ }
367
+ }, [content, onOpenChange, triggerPointerDownPosRef]);
368
+ React.useEffect(() => {
369
+ const close = () => onOpenChange(false);
370
+ window.addEventListener("blur", close);
371
+ window.addEventListener("resize", close);
372
+ return () => {
373
+ window.removeEventListener("blur", close);
374
+ window.removeEventListener("resize", close);
375
+ };
376
+ }, [onOpenChange]);
377
+ const [searchRef, handleTypeaheadSearch] = useTypeaheadSearch((search) => {
378
+ const enabledItems = getItems().filter((item) => !item.disabled);
379
+ const currentItem = enabledItems.find((item) => item.ref.current === document.activeElement);
380
+ const nextItem = findNextItem(enabledItems, search, currentItem);
381
+ if (nextItem) {
382
+ setTimeout(() => nextItem.ref.current.focus());
383
+ }
384
+ });
385
+ const itemRefCallback = React.useCallback(
386
+ (node, value, disabled) => {
387
+ const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
388
+ const isSelectedItem = context.value !== void 0 && context.value === value;
389
+ if (isSelectedItem || isFirstValidItem) {
390
+ setSelectedItem(node);
391
+ if (isFirstValidItem) firstValidItemFoundRef.current = true;
392
+ }
393
+ },
394
+ [context.value]
395
+ );
396
+ const handleItemLeave = React.useCallback(() => content?.focus(), [content]);
397
+ const itemTextRefCallback = React.useCallback(
398
+ (node, value, disabled) => {
399
+ const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;
400
+ const isSelectedItem = context.value !== void 0 && context.value === value;
401
+ if (isSelectedItem || isFirstValidItem) {
402
+ setSelectedItemText(node);
403
+ }
404
+ },
405
+ [context.value]
406
+ );
407
+ const SelectPosition = position === "popper" ? SelectPopperPosition : SelectItemAlignedPosition;
408
+ const popperContentProps = SelectPosition === SelectPopperPosition ? {
409
+ side,
410
+ sideOffset,
411
+ align,
412
+ alignOffset,
413
+ arrowPadding,
414
+ collisionBoundary,
415
+ collisionPadding,
416
+ sticky,
417
+ hideWhenDetached,
418
+ avoidCollisions
419
+ } : {};
420
+ return /* @__PURE__ */ jsx(
421
+ SelectContentProvider,
422
+ {
423
+ scope: __scopeSelect,
424
+ content,
425
+ viewport,
426
+ onViewportChange: setViewport,
427
+ itemRefCallback,
428
+ selectedItem,
429
+ onItemLeave: handleItemLeave,
430
+ itemTextRefCallback,
431
+ focusSelectedItem,
432
+ selectedItemText,
433
+ position,
434
+ isPositioned,
435
+ searchRef,
436
+ children: /* @__PURE__ */ jsx(ReactRemoveScroll, { as: Slot, allowPinchZoom: true, children: /* @__PURE__ */ jsx(
437
+ FocusScope,
438
+ {
439
+ asChild: true,
440
+ trapped: context.open,
441
+ onMountAutoFocus: (event) => {
442
+ event.preventDefault();
443
+ },
444
+ onUnmountAutoFocus: composeEventHandlers(onCloseAutoFocus, (event) => {
445
+ context.trigger?.focus({ preventScroll: true });
446
+ event.preventDefault();
447
+ }),
448
+ children: /* @__PURE__ */ jsx(
449
+ DismissableLayer,
450
+ {
451
+ asChild: true,
452
+ disableOutsidePointerEvents: true,
453
+ onEscapeKeyDown,
454
+ onPointerDownOutside,
455
+ onFocusOutside: (event) => event.preventDefault(),
456
+ onDismiss: () => context.onOpenChange(false),
457
+ children: /* @__PURE__ */ jsx(
458
+ SelectPosition,
459
+ {
460
+ role: "listbox",
461
+ id: context.contentId,
462
+ "data-state": context.open ? "open" : "closed",
463
+ dir: context.dir,
464
+ onContextMenu: (event) => event.preventDefault(),
465
+ ...contentProps,
466
+ ...popperContentProps,
467
+ onPlaced: () => setIsPositioned(true),
468
+ ref: composedRefs,
469
+ style: {
470
+ // flex layout so we can place the scroll buttons properly
471
+ display: "flex",
472
+ flexDirection: "column",
473
+ // reset the outline by default as the content MAY get focused
474
+ outline: "none",
475
+ ...contentProps.style
476
+ },
477
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
478
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
479
+ if (event.key === "Tab") event.preventDefault();
480
+ if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);
481
+ if (["ArrowUp", "ArrowDown", "Home", "End"].includes(event.key)) {
482
+ const items = getItems().filter((item) => !item.disabled);
483
+ let candidateNodes = items.map((item) => item.ref.current);
484
+ if (["ArrowUp", "End"].includes(event.key)) {
485
+ candidateNodes = candidateNodes.slice().reverse();
486
+ }
487
+ if (["ArrowUp", "ArrowDown"].includes(event.key)) {
488
+ const currentElement = event.target;
489
+ const currentIndex = candidateNodes.indexOf(currentElement);
490
+ candidateNodes = candidateNodes.slice(currentIndex + 1);
491
+ }
492
+ setTimeout(() => focusFirst(candidateNodes));
493
+ event.preventDefault();
494
+ }
495
+ })
496
+ }
497
+ )
498
+ }
499
+ )
500
+ }
501
+ ) })
502
+ }
503
+ );
504
+ }
505
+ );
506
+ SelectContentImpl.displayName = CONTENT_IMPL_NAME;
507
+ var ITEM_ALIGNED_POSITION_NAME = "SelectItemAlignedPosition";
508
+ var SelectItemAlignedPosition = React.forwardRef((props, forwardedRef) => {
509
+ const { __scopeSelect, onPlaced, ...popperProps } = props;
510
+ const context = useSelectContext(CONTENT_NAME, __scopeSelect);
511
+ const contentContext = useSelectContentContext(CONTENT_NAME, __scopeSelect);
512
+ const [contentWrapper, setContentWrapper] = React.useState(null);
513
+ const [content, setContent] = React.useState(null);
514
+ const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));
515
+ const getItems = useCollection(__scopeSelect);
516
+ const shouldExpandOnScrollRef = React.useRef(false);
517
+ const shouldRepositionRef = React.useRef(true);
518
+ const { viewport, selectedItem, selectedItemText, focusSelectedItem } = contentContext;
519
+ const position = React.useCallback(() => {
520
+ if (context.trigger && context.valueNode && contentWrapper && content && viewport && selectedItem && selectedItemText) {
521
+ const triggerRect = context.trigger.getBoundingClientRect();
522
+ const contentRect = content.getBoundingClientRect();
523
+ const valueNodeRect = context.valueNode.getBoundingClientRect();
524
+ const itemTextRect = selectedItemText.getBoundingClientRect();
525
+ if (context.dir !== "rtl") {
526
+ const itemTextOffset = itemTextRect.left - contentRect.left;
527
+ const left = valueNodeRect.left - itemTextOffset;
528
+ const leftDelta = triggerRect.left - left;
529
+ const minContentWidth = triggerRect.width + leftDelta;
530
+ const contentWidth = Math.max(minContentWidth, contentRect.width);
531
+ const rightEdge = window.innerWidth - CONTENT_MARGIN;
532
+ const clampedLeft = clamp(left, [
533
+ CONTENT_MARGIN,
534
+ // Prevents the content from going off the starting edge of the
535
+ // viewport. It may still go off the ending edge, but this can be
536
+ // controlled by the user since they may want to manage overflow in a
537
+ // specific way.
538
+ // https://github.com/radix-ui/primitives/issues/2049
539
+ Math.max(CONTENT_MARGIN, rightEdge - contentWidth)
540
+ ]);
541
+ contentWrapper.style.minWidth = minContentWidth + "px";
542
+ contentWrapper.style.left = clampedLeft + "px";
543
+ } else {
544
+ const itemTextOffset = contentRect.right - itemTextRect.right;
545
+ const right = window.innerWidth - valueNodeRect.right - itemTextOffset;
546
+ const rightDelta = window.innerWidth - triggerRect.right - right;
547
+ const minContentWidth = triggerRect.width + rightDelta;
548
+ const contentWidth = Math.max(minContentWidth, contentRect.width);
549
+ const leftEdge = window.innerWidth - CONTENT_MARGIN;
550
+ const clampedRight = clamp(right, [
551
+ CONTENT_MARGIN,
552
+ Math.max(CONTENT_MARGIN, leftEdge - contentWidth)
553
+ ]);
554
+ contentWrapper.style.minWidth = minContentWidth + "px";
555
+ contentWrapper.style.right = clampedRight + "px";
556
+ }
557
+ const items = getItems();
558
+ const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;
559
+ const itemsHeight = viewport.scrollHeight;
560
+ const contentStyles = window.getComputedStyle(content);
561
+ const contentBorderTopWidth = parseInt(contentStyles.borderTopWidth, 10);
562
+ const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);
563
+ const contentBorderBottomWidth = parseInt(contentStyles.borderBottomWidth, 10);
564
+ const contentPaddingBottom = parseInt(contentStyles.paddingBottom, 10);
565
+ const fullContentHeight = contentBorderTopWidth + contentPaddingTop + itemsHeight + contentPaddingBottom + contentBorderBottomWidth;
566
+ const minContentHeight = Math.min(selectedItem.offsetHeight * 5, fullContentHeight);
567
+ const viewportStyles = window.getComputedStyle(viewport);
568
+ const viewportPaddingTop = parseInt(viewportStyles.paddingTop, 10);
569
+ const viewportPaddingBottom = parseInt(viewportStyles.paddingBottom, 10);
570
+ const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - CONTENT_MARGIN;
571
+ const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;
572
+ const selectedItemHalfHeight = selectedItem.offsetHeight / 2;
573
+ const itemOffsetMiddle = selectedItem.offsetTop + selectedItemHalfHeight;
574
+ const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;
575
+ const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;
576
+ const willAlignWithoutTopOverflow = contentTopToItemMiddle <= topEdgeToTriggerMiddle;
577
+ if (willAlignWithoutTopOverflow) {
578
+ const isLastItem = items.length > 0 && selectedItem === items[items.length - 1].ref.current;
579
+ contentWrapper.style.bottom = "0px";
580
+ const viewportOffsetBottom = content.clientHeight - viewport.offsetTop - viewport.offsetHeight;
581
+ const clampedTriggerMiddleToBottomEdge = Math.max(
582
+ triggerMiddleToBottomEdge,
583
+ selectedItemHalfHeight + // viewport might have padding bottom, include it to avoid a scrollable viewport
584
+ (isLastItem ? viewportPaddingBottom : 0) + viewportOffsetBottom + contentBorderBottomWidth
585
+ );
586
+ const height = contentTopToItemMiddle + clampedTriggerMiddleToBottomEdge;
587
+ contentWrapper.style.height = height + "px";
588
+ } else {
589
+ const isFirstItem = items.length > 0 && selectedItem === items[0].ref.current;
590
+ contentWrapper.style.top = "0px";
591
+ const clampedTopEdgeToTriggerMiddle = Math.max(
592
+ topEdgeToTriggerMiddle,
593
+ contentBorderTopWidth + viewport.offsetTop + // viewport might have padding top, include it to avoid a scrollable viewport
594
+ (isFirstItem ? viewportPaddingTop : 0) + selectedItemHalfHeight
595
+ );
596
+ const height = clampedTopEdgeToTriggerMiddle + itemMiddleToContentBottom;
597
+ contentWrapper.style.height = height + "px";
598
+ viewport.scrollTop = contentTopToItemMiddle - topEdgeToTriggerMiddle + viewport.offsetTop;
599
+ }
600
+ contentWrapper.style.margin = `${CONTENT_MARGIN}px 0`;
601
+ contentWrapper.style.minHeight = minContentHeight + "px";
602
+ contentWrapper.style.maxHeight = availableHeight + "px";
603
+ onPlaced?.();
604
+ requestAnimationFrame(() => shouldExpandOnScrollRef.current = true);
605
+ }
606
+ }, [
607
+ getItems,
608
+ context.trigger,
609
+ context.valueNode,
610
+ contentWrapper,
611
+ content,
612
+ viewport,
613
+ selectedItem,
614
+ selectedItemText,
615
+ context.dir,
616
+ onPlaced
617
+ ]);
618
+ useLayoutEffect2(() => position(), [position]);
619
+ const [contentZIndex, setContentZIndex] = React.useState();
620
+ useLayoutEffect2(() => {
621
+ if (content) setContentZIndex(window.getComputedStyle(content).zIndex);
622
+ }, [content]);
623
+ const handleScrollButtonChange = React.useCallback(
624
+ (node) => {
625
+ if (node && shouldRepositionRef.current === true) {
626
+ position();
627
+ focusSelectedItem?.();
628
+ shouldRepositionRef.current = false;
629
+ }
630
+ },
631
+ [position, focusSelectedItem]
632
+ );
633
+ return /* @__PURE__ */ jsx(
634
+ SelectViewportProvider,
635
+ {
636
+ scope: __scopeSelect,
637
+ contentWrapper,
638
+ shouldExpandOnScrollRef,
639
+ onScrollButtonChange: handleScrollButtonChange,
640
+ children: /* @__PURE__ */ jsx(
641
+ "div",
642
+ {
643
+ ref: setContentWrapper,
644
+ style: {
645
+ display: "flex",
646
+ flexDirection: "column",
647
+ position: "fixed",
648
+ zIndex: contentZIndex
649
+ },
650
+ children: /* @__PURE__ */ jsx(
651
+ Primitive.div,
652
+ {
653
+ ...popperProps,
654
+ ref: composedRefs,
655
+ style: {
656
+ // When we get the height of the content, it includes borders. If we were to set
657
+ // the height without having `boxSizing: 'border-box'` it would be too big.
658
+ boxSizing: "border-box",
659
+ // We need to ensure the content doesn't get taller than the wrapper
660
+ maxHeight: "100%",
661
+ ...popperProps.style
662
+ }
663
+ }
664
+ )
665
+ }
666
+ )
667
+ }
668
+ );
669
+ });
670
+ SelectItemAlignedPosition.displayName = ITEM_ALIGNED_POSITION_NAME;
671
+ var POPPER_POSITION_NAME = "SelectPopperPosition";
672
+ var SelectPopperPosition = React.forwardRef((props, forwardedRef) => {
673
+ const {
674
+ __scopeSelect,
675
+ align = "start",
676
+ collisionPadding = CONTENT_MARGIN,
677
+ ...popperProps
678
+ } = props;
679
+ const popperScope = usePopperScope(__scopeSelect);
680
+ return /* @__PURE__ */ jsx(
681
+ Content,
682
+ {
683
+ ...popperScope,
684
+ ...popperProps,
685
+ ref: forwardedRef,
686
+ align,
687
+ collisionPadding,
688
+ style: {
689
+ // Ensure border-box for floating-ui calculations
690
+ boxSizing: "border-box",
691
+ ...popperProps.style,
692
+ // re-namespace exposed content custom properties
693
+ ...{
694
+ "--radix-select-content-transform-origin": "var(--radix-popper-transform-origin)",
695
+ "--radix-select-content-available-width": "var(--radix-popper-available-width)",
696
+ "--radix-select-content-available-height": "var(--radix-popper-available-height)",
697
+ "--radix-select-trigger-width": "var(--radix-popper-anchor-width)",
698
+ "--radix-select-trigger-height": "var(--radix-popper-anchor-height)"
699
+ }
700
+ }
701
+ }
702
+ );
703
+ });
704
+ SelectPopperPosition.displayName = POPPER_POSITION_NAME;
705
+ var [SelectViewportProvider, useSelectViewportContext] = createSelectContext(CONTENT_NAME, {});
706
+ var VIEWPORT_NAME = "SelectViewport";
707
+ var SelectViewport = React.forwardRef(
708
+ (props, forwardedRef) => {
709
+ const { __scopeSelect, nonce, ...viewportProps } = props;
710
+ const contentContext = useSelectContentContext(VIEWPORT_NAME, __scopeSelect);
711
+ const viewportContext = useSelectViewportContext(VIEWPORT_NAME, __scopeSelect);
712
+ const composedRefs = useComposedRefs(forwardedRef, contentContext.onViewportChange);
713
+ const prevScrollTopRef = React.useRef(0);
714
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
715
+ /* @__PURE__ */ jsx(
716
+ "style",
717
+ {
718
+ dangerouslySetInnerHTML: {
719
+ __html: `[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`
720
+ },
721
+ nonce
722
+ }
723
+ ),
724
+ /* @__PURE__ */ jsx(Collection.Slot, { scope: __scopeSelect, children: /* @__PURE__ */ jsx(
725
+ Primitive.div,
726
+ {
727
+ "data-radix-select-viewport": "",
728
+ role: "presentation",
729
+ ...viewportProps,
730
+ ref: composedRefs,
731
+ style: {
732
+ // we use position: 'relative' here on the `viewport` so that when we call
733
+ // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport
734
+ // (independent of the scrollUpButton).
735
+ position: "relative",
736
+ flex: 1,
737
+ // Viewport should only be scrollable in the vertical direction.
738
+ // This won't work in vertical writing modes, so we'll need to
739
+ // revisit this if/when that is supported
740
+ // https://developer.chrome.com/blog/vertical-form-controls
741
+ overflow: "hidden auto",
742
+ ...viewportProps.style
743
+ },
744
+ onScroll: composeEventHandlers(viewportProps.onScroll, (event) => {
745
+ const viewport = event.currentTarget;
746
+ const { contentWrapper, shouldExpandOnScrollRef } = viewportContext;
747
+ if (shouldExpandOnScrollRef?.current && contentWrapper) {
748
+ const scrolledBy = Math.abs(prevScrollTopRef.current - viewport.scrollTop);
749
+ if (scrolledBy > 0) {
750
+ const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;
751
+ const cssMinHeight = parseFloat(contentWrapper.style.minHeight);
752
+ const cssHeight = parseFloat(contentWrapper.style.height);
753
+ const prevHeight = Math.max(cssMinHeight, cssHeight);
754
+ if (prevHeight < availableHeight) {
755
+ const nextHeight = prevHeight + scrolledBy;
756
+ const clampedNextHeight = Math.min(availableHeight, nextHeight);
757
+ const heightDiff = nextHeight - clampedNextHeight;
758
+ contentWrapper.style.height = clampedNextHeight + "px";
759
+ if (contentWrapper.style.bottom === "0px") {
760
+ viewport.scrollTop = heightDiff > 0 ? heightDiff : 0;
761
+ contentWrapper.style.justifyContent = "flex-end";
762
+ }
763
+ }
764
+ }
765
+ }
766
+ prevScrollTopRef.current = viewport.scrollTop;
767
+ })
768
+ }
769
+ ) })
770
+ ] });
771
+ }
772
+ );
773
+ SelectViewport.displayName = VIEWPORT_NAME;
774
+ var GROUP_NAME = "SelectGroup";
775
+ var [SelectGroupContextProvider, useSelectGroupContext] = createSelectContext(GROUP_NAME);
776
+ var SelectGroup = React.forwardRef(
777
+ (props, forwardedRef) => {
778
+ const { __scopeSelect, ...groupProps } = props;
779
+ const groupId = useId();
780
+ return /* @__PURE__ */ jsx(SelectGroupContextProvider, { scope: __scopeSelect, id: groupId, children: /* @__PURE__ */ jsx(Primitive.div, { role: "group", "aria-labelledby": groupId, ...groupProps, ref: forwardedRef }) });
781
+ }
782
+ );
783
+ SelectGroup.displayName = GROUP_NAME;
784
+ var LABEL_NAME = "SelectLabel";
785
+ var SelectLabel = React.forwardRef(
786
+ (props, forwardedRef) => {
787
+ const { __scopeSelect, ...labelProps } = props;
788
+ const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);
789
+ return /* @__PURE__ */ jsx(Primitive.div, { id: groupContext.id, ...labelProps, ref: forwardedRef });
790
+ }
791
+ );
792
+ SelectLabel.displayName = LABEL_NAME;
793
+ var ITEM_NAME = "SelectItem";
794
+ var [SelectItemContextProvider, useSelectItemContext] = createSelectContext(ITEM_NAME);
795
+ var SelectItem = React.forwardRef(
796
+ (props, forwardedRef) => {
797
+ const {
798
+ __scopeSelect,
799
+ value,
800
+ disabled = false,
801
+ textValue: textValueProp,
802
+ ...itemProps
803
+ } = props;
804
+ const context = useSelectContext(ITEM_NAME, __scopeSelect);
805
+ const contentContext = useSelectContentContext(ITEM_NAME, __scopeSelect);
806
+ const isSelected = context.value === value;
807
+ const [textValue, setTextValue] = React.useState(textValueProp ?? "");
808
+ const [isFocused, setIsFocused] = React.useState(false);
809
+ const composedRefs = useComposedRefs(
810
+ forwardedRef,
811
+ (node) => contentContext.itemRefCallback?.(node, value, disabled)
812
+ );
813
+ const textId = useId();
814
+ const pointerTypeRef = React.useRef("touch");
815
+ const handleSelect = () => {
816
+ if (!disabled) {
817
+ context.onValueChange(value);
818
+ context.onOpenChange(false);
819
+ }
820
+ };
821
+ if (value === "") {
822
+ throw new Error(
823
+ "A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder."
824
+ );
825
+ }
826
+ return /* @__PURE__ */ jsx(
827
+ SelectItemContextProvider,
828
+ {
829
+ scope: __scopeSelect,
830
+ value,
831
+ disabled,
832
+ textId,
833
+ isSelected,
834
+ onItemTextChange: React.useCallback((node) => {
835
+ setTextValue((prevTextValue) => prevTextValue || (node?.textContent ?? "").trim());
836
+ }, []),
837
+ children: /* @__PURE__ */ jsx(
838
+ Collection.ItemSlot,
839
+ {
840
+ scope: __scopeSelect,
841
+ value,
842
+ disabled,
843
+ textValue,
844
+ children: /* @__PURE__ */ jsx(
845
+ Primitive.div,
846
+ {
847
+ role: "option",
848
+ "aria-labelledby": textId,
849
+ "data-highlighted": isFocused ? "" : void 0,
850
+ "aria-selected": isSelected && isFocused,
851
+ "data-state": isSelected ? "checked" : "unchecked",
852
+ "aria-disabled": disabled || void 0,
853
+ "data-disabled": disabled ? "" : void 0,
854
+ tabIndex: disabled ? void 0 : -1,
855
+ ...itemProps,
856
+ ref: composedRefs,
857
+ onFocus: composeEventHandlers(itemProps.onFocus, () => setIsFocused(true)),
858
+ onBlur: composeEventHandlers(itemProps.onBlur, () => setIsFocused(false)),
859
+ onClick: composeEventHandlers(itemProps.onClick, () => {
860
+ if (pointerTypeRef.current !== "mouse") handleSelect();
861
+ }),
862
+ onPointerUp: composeEventHandlers(itemProps.onPointerUp, () => {
863
+ if (pointerTypeRef.current === "mouse") handleSelect();
864
+ }),
865
+ onPointerDown: composeEventHandlers(itemProps.onPointerDown, (event) => {
866
+ pointerTypeRef.current = event.pointerType;
867
+ }),
868
+ onPointerMove: composeEventHandlers(itemProps.onPointerMove, (event) => {
869
+ pointerTypeRef.current = event.pointerType;
870
+ if (disabled) {
871
+ contentContext.onItemLeave?.();
872
+ } else if (pointerTypeRef.current === "mouse") {
873
+ event.currentTarget.focus({ preventScroll: true });
874
+ }
875
+ }),
876
+ onPointerLeave: composeEventHandlers(itemProps.onPointerLeave, (event) => {
877
+ if (event.currentTarget === document.activeElement) {
878
+ contentContext.onItemLeave?.();
879
+ }
880
+ }),
881
+ onKeyDown: composeEventHandlers(itemProps.onKeyDown, (event) => {
882
+ const isTypingAhead = contentContext.searchRef?.current !== "";
883
+ if (isTypingAhead && event.key === " ") return;
884
+ if (SELECTION_KEYS.includes(event.key)) handleSelect();
885
+ if (event.key === " ") event.preventDefault();
886
+ })
887
+ }
888
+ )
889
+ }
890
+ )
891
+ }
892
+ );
893
+ }
894
+ );
895
+ SelectItem.displayName = ITEM_NAME;
896
+ var ITEM_TEXT_NAME = "SelectItemText";
897
+ var SelectItemText = React.forwardRef(
898
+ (props, forwardedRef) => {
899
+ const { __scopeSelect, className, style, ...itemTextProps } = props;
900
+ const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);
901
+ const contentContext = useSelectContentContext(ITEM_TEXT_NAME, __scopeSelect);
902
+ const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);
903
+ const nativeOptionsContext = useSelectNativeOptionsContext(ITEM_TEXT_NAME, __scopeSelect);
904
+ const [itemTextNode, setItemTextNode] = React.useState(null);
905
+ const composedRefs = useComposedRefs(
906
+ forwardedRef,
907
+ (node) => setItemTextNode(node),
908
+ itemContext.onItemTextChange,
909
+ (node) => contentContext.itemTextRefCallback?.(node, itemContext.value, itemContext.disabled)
910
+ );
911
+ const textContent = itemTextNode?.textContent;
912
+ const nativeOption = React.useMemo(
913
+ () => /* @__PURE__ */ jsx("option", { value: itemContext.value, disabled: itemContext.disabled, children: textContent }, itemContext.value),
914
+ [itemContext.disabled, itemContext.value, textContent]
915
+ );
916
+ const { onNativeOptionAdd, onNativeOptionRemove } = nativeOptionsContext;
917
+ useLayoutEffect2(() => {
918
+ onNativeOptionAdd(nativeOption);
919
+ return () => onNativeOptionRemove(nativeOption);
920
+ }, [onNativeOptionAdd, onNativeOptionRemove, nativeOption]);
921
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
922
+ /* @__PURE__ */ jsx(Primitive.span, { id: itemContext.textId, ...itemTextProps, ref: composedRefs }),
923
+ itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren ? ReactDOM.createPortal(itemTextProps.children, context.valueNode) : null
924
+ ] });
925
+ }
926
+ );
927
+ SelectItemText.displayName = ITEM_TEXT_NAME;
928
+ var ITEM_INDICATOR_NAME = "SelectItemIndicator";
929
+ var SelectItemIndicator = React.forwardRef(
930
+ (props, forwardedRef) => {
931
+ const { __scopeSelect, ...itemIndicatorProps } = props;
932
+ const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect);
933
+ return itemContext.isSelected ? /* @__PURE__ */ jsx(Primitive.span, { "aria-hidden": true, ...itemIndicatorProps, ref: forwardedRef }) : null;
934
+ }
935
+ );
936
+ SelectItemIndicator.displayName = ITEM_INDICATOR_NAME;
937
+ var SCROLL_UP_BUTTON_NAME = "SelectScrollUpButton";
938
+ var SelectScrollUpButton = React.forwardRef((props, forwardedRef) => {
939
+ const contentContext = useSelectContentContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
940
+ const viewportContext = useSelectViewportContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);
941
+ const [canScrollUp, setCanScrollUp] = React.useState(false);
942
+ const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
943
+ useLayoutEffect2(() => {
944
+ if (contentContext.viewport && contentContext.isPositioned) {
945
+ let handleScroll2 = function() {
946
+ const canScrollUp2 = viewport.scrollTop > 0;
947
+ setCanScrollUp(canScrollUp2);
948
+ };
949
+ const viewport = contentContext.viewport;
950
+ handleScroll2();
951
+ viewport.addEventListener("scroll", handleScroll2);
952
+ return () => viewport.removeEventListener("scroll", handleScroll2);
953
+ }
954
+ }, [contentContext.viewport, contentContext.isPositioned]);
955
+ return canScrollUp ? /* @__PURE__ */ jsx(
956
+ SelectScrollButtonImpl,
957
+ {
958
+ ...props,
959
+ ref: composedRefs,
960
+ onAutoScroll: () => {
961
+ const { viewport, selectedItem } = contentContext;
962
+ if (viewport && selectedItem) {
963
+ viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;
964
+ }
965
+ }
966
+ }
967
+ ) : null;
968
+ });
969
+ SelectScrollUpButton.displayName = SCROLL_UP_BUTTON_NAME;
970
+ var SCROLL_DOWN_BUTTON_NAME = "SelectScrollDownButton";
971
+ var SelectScrollDownButton = React.forwardRef((props, forwardedRef) => {
972
+ const contentContext = useSelectContentContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
973
+ const viewportContext = useSelectViewportContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);
974
+ const [canScrollDown, setCanScrollDown] = React.useState(false);
975
+ const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);
976
+ useLayoutEffect2(() => {
977
+ if (contentContext.viewport && contentContext.isPositioned) {
978
+ let handleScroll2 = function() {
979
+ const maxScroll = viewport.scrollHeight - viewport.clientHeight;
980
+ const canScrollDown2 = Math.ceil(viewport.scrollTop) < maxScroll;
981
+ setCanScrollDown(canScrollDown2);
982
+ };
983
+ const viewport = contentContext.viewport;
984
+ handleScroll2();
985
+ viewport.addEventListener("scroll", handleScroll2);
986
+ return () => viewport.removeEventListener("scroll", handleScroll2);
987
+ }
988
+ }, [contentContext.viewport, contentContext.isPositioned]);
989
+ return canScrollDown ? /* @__PURE__ */ jsx(
990
+ SelectScrollButtonImpl,
991
+ {
992
+ ...props,
993
+ ref: composedRefs,
994
+ onAutoScroll: () => {
995
+ const { viewport, selectedItem } = contentContext;
996
+ if (viewport && selectedItem) {
997
+ viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;
998
+ }
999
+ }
1000
+ }
1001
+ ) : null;
1002
+ });
1003
+ SelectScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;
1004
+ var SelectScrollButtonImpl = React.forwardRef((props, forwardedRef) => {
1005
+ const { __scopeSelect, onAutoScroll, ...scrollIndicatorProps } = props;
1006
+ const contentContext = useSelectContentContext("SelectScrollButton", __scopeSelect);
1007
+ const autoScrollTimerRef = React.useRef(null);
1008
+ const getItems = useCollection(__scopeSelect);
1009
+ const clearAutoScrollTimer = React.useCallback(() => {
1010
+ if (autoScrollTimerRef.current !== null) {
1011
+ window.clearInterval(autoScrollTimerRef.current);
1012
+ autoScrollTimerRef.current = null;
1013
+ }
1014
+ }, []);
1015
+ React.useEffect(() => {
1016
+ return () => clearAutoScrollTimer();
1017
+ }, [clearAutoScrollTimer]);
1018
+ useLayoutEffect2(() => {
1019
+ const activeItem = getItems().find((item) => item.ref.current === document.activeElement);
1020
+ activeItem?.ref.current?.scrollIntoView({ block: "nearest" });
1021
+ }, [getItems]);
1022
+ return /* @__PURE__ */ jsx(
1023
+ Primitive.div,
1024
+ {
1025
+ "aria-hidden": true,
1026
+ ...scrollIndicatorProps,
1027
+ ref: forwardedRef,
1028
+ style: { flexShrink: 0, ...scrollIndicatorProps.style },
1029
+ onPointerDown: composeEventHandlers(scrollIndicatorProps.onPointerDown, () => {
1030
+ if (autoScrollTimerRef.current === null) {
1031
+ autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
1032
+ }
1033
+ }),
1034
+ onPointerMove: composeEventHandlers(scrollIndicatorProps.onPointerMove, () => {
1035
+ contentContext.onItemLeave?.();
1036
+ if (autoScrollTimerRef.current === null) {
1037
+ autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);
1038
+ }
1039
+ }),
1040
+ onPointerLeave: composeEventHandlers(scrollIndicatorProps.onPointerLeave, () => {
1041
+ clearAutoScrollTimer();
1042
+ })
1043
+ }
1044
+ );
1045
+ });
1046
+ var SEPARATOR_NAME = "SelectSeparator";
1047
+ var SelectSeparator = React.forwardRef(
1048
+ (props, forwardedRef) => {
1049
+ const { __scopeSelect, ...separatorProps } = props;
1050
+ return /* @__PURE__ */ jsx(Primitive.div, { "aria-hidden": true, ...separatorProps, ref: forwardedRef });
1051
+ }
1052
+ );
1053
+ SelectSeparator.displayName = SEPARATOR_NAME;
1054
+ var ARROW_NAME = "SelectArrow";
1055
+ var SelectArrow = React.forwardRef(
1056
+ (props, forwardedRef) => {
1057
+ const { __scopeSelect, ...arrowProps } = props;
1058
+ const popperScope = usePopperScope(__scopeSelect);
1059
+ const context = useSelectContext(ARROW_NAME, __scopeSelect);
1060
+ const contentContext = useSelectContentContext(ARROW_NAME, __scopeSelect);
1061
+ return context.open && contentContext.position === "popper" ? /* @__PURE__ */ jsx(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef }) : null;
1062
+ }
1063
+ );
1064
+ SelectArrow.displayName = ARROW_NAME;
1065
+ var BUBBLE_INPUT_NAME = "SelectBubbleInput";
1066
+ var SelectBubbleInput = React.forwardRef(
1067
+ ({ __scopeSelect, value, ...props }, forwardedRef) => {
1068
+ const ref = React.useRef(null);
1069
+ const composedRefs = useComposedRefs(forwardedRef, ref);
1070
+ const prevValue = usePrevious(value);
1071
+ React.useEffect(() => {
1072
+ const select = ref.current;
1073
+ if (!select) return;
1074
+ const selectProto = window.HTMLSelectElement.prototype;
1075
+ const descriptor = Object.getOwnPropertyDescriptor(
1076
+ selectProto,
1077
+ "value"
1078
+ );
1079
+ const setValue = descriptor.set;
1080
+ if (prevValue !== value && setValue) {
1081
+ const event = new Event("change", { bubbles: true });
1082
+ setValue.call(select, value);
1083
+ select.dispatchEvent(event);
1084
+ }
1085
+ }, [prevValue, value]);
1086
+ return /* @__PURE__ */ jsx(
1087
+ Primitive.select,
1088
+ {
1089
+ ...props,
1090
+ style: { ...VISUALLY_HIDDEN_STYLES, ...props.style },
1091
+ ref: composedRefs,
1092
+ defaultValue: value
1093
+ }
1094
+ );
1095
+ }
1096
+ );
1097
+ SelectBubbleInput.displayName = BUBBLE_INPUT_NAME;
1098
+ function shouldShowPlaceholder(value) {
1099
+ return value === "" || value === void 0;
1100
+ }
1101
+ function useTypeaheadSearch(onSearchChange) {
1102
+ const handleSearchChange = useCallbackRef(onSearchChange);
1103
+ const searchRef = React.useRef("");
1104
+ const timerRef = React.useRef(0);
1105
+ const handleTypeaheadSearch = React.useCallback(
1106
+ (key) => {
1107
+ const search = searchRef.current + key;
1108
+ handleSearchChange(search);
1109
+ (function updateSearch(value) {
1110
+ searchRef.current = value;
1111
+ window.clearTimeout(timerRef.current);
1112
+ if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
1113
+ })(search);
1114
+ },
1115
+ [handleSearchChange]
1116
+ );
1117
+ const resetTypeahead = React.useCallback(() => {
1118
+ searchRef.current = "";
1119
+ window.clearTimeout(timerRef.current);
1120
+ }, []);
1121
+ React.useEffect(() => {
1122
+ return () => window.clearTimeout(timerRef.current);
1123
+ }, []);
1124
+ return [searchRef, handleTypeaheadSearch, resetTypeahead];
1125
+ }
1126
+ function findNextItem(items, search, currentItem) {
1127
+ const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
1128
+ const normalizedSearch = isRepeated ? search[0] : search;
1129
+ const currentItemIndex = currentItem ? items.indexOf(currentItem) : -1;
1130
+ let wrappedItems = wrapArray(items, Math.max(currentItemIndex, 0));
1131
+ const excludeCurrentItem = normalizedSearch.length === 1;
1132
+ if (excludeCurrentItem) wrappedItems = wrappedItems.filter((v) => v !== currentItem);
1133
+ const nextItem = wrappedItems.find(
1134
+ (item) => item.textValue.toLowerCase().startsWith(normalizedSearch.toLowerCase())
1135
+ );
1136
+ return nextItem !== currentItem ? nextItem : void 0;
1137
+ }
1138
+ function wrapArray(array, startIndex) {
1139
+ return array.map((_, index) => array[(startIndex + index) % array.length]);
1140
+ }
1141
+ var Root2 = Select;
1142
+ var Trigger = SelectTrigger;
1143
+ var Value = SelectValue;
1144
+ var Icon = SelectIcon;
1145
+ var Portal = SelectPortal;
1146
+ var Content2 = SelectContent;
1147
+ var Viewport = SelectViewport;
1148
+ var Item = SelectItem;
1149
+ var ItemText = SelectItemText;
1150
+ var ItemIndicator = SelectItemIndicator;
1151
+ var ScrollUpButton = SelectScrollUpButton;
1152
+ var ScrollDownButton = SelectScrollDownButton;
1153
+
1154
+ export { Content2 as Content, Icon, Item, ItemIndicator, ItemText, Portal, Root2 as Root, ScrollDownButton, ScrollUpButton, Select, SelectArrow, SelectContent, SelectGroup, SelectIcon, SelectItem, SelectItemIndicator, SelectItemText, SelectLabel, SelectPortal, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SelectViewport, Trigger, Value, Viewport };