@btst/stack 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/README.md +85 -37
  2. package/dist/node_modules/.pnpm/{@radix-ui_react-alert-dialog@1.1.15_@types_react-dom@19.2.2_@types_react@19.2.2__@types_ec789942cd38340bd7362c09e7d34384 → @radix-ui_react-alert-dialog@1.1.15_@types_react-dom@19.2.3_@types_react@19.2.6__@types_4f58c757aa677e233cf96d60fda2f1da}/node_modules/@radix-ui/react-alert-dialog/dist/index.cjs +2 -2
  3. package/dist/node_modules/.pnpm/{@radix-ui_react-alert-dialog@1.1.15_@types_react-dom@19.2.2_@types_react@19.2.2__@types_ec789942cd38340bd7362c09e7d34384 → @radix-ui_react-alert-dialog@1.1.15_@types_react-dom@19.2.3_@types_react@19.2.6__@types_4f58c757aa677e233cf96d60fda2f1da}/node_modules/@radix-ui/react-alert-dialog/dist/index.mjs +2 -2
  4. 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 → @radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@1_35df44f6d87656c1401686c91d770dbb}/node_modules/@radix-ui/react-arrow/dist/index.cjs +1 -1
  5. 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 → @radix-ui_react-arrow@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@1_35df44f6d87656c1401686c91d770dbb}/node_modules/@radix-ui/react-arrow/dist/index.mjs +1 -1
  6. 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 → @radix-ui_react-collection@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_re_59aa5e150e70a3e7bfb1567148b021b5}/node_modules/@radix-ui/react-collection/dist/index.cjs +2 -2
  7. 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 → @radix-ui_react-collection@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_re_59aa5e150e70a3e7bfb1567148b021b5}/node_modules/@radix-ui/react-collection/dist/index.mjs +2 -2
  8. 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 → @radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@_9ee1db7daf927866cf505b31d40047ad}/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +4 -4
  9. 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 → @radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@_9ee1db7daf927866cf505b31d40047ad}/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs +4 -4
  10. package/dist/node_modules/.pnpm/@radix-ui_react-dropdown-menu@2.1.16_@types_react-dom@19.2.3_@types_react@19.2.6__@type_a50051c7210b6fbd5be09388bda08578/node_modules/@radix-ui/react-dropdown-menu/dist/index.cjs +282 -0
  11. package/dist/node_modules/.pnpm/@radix-ui_react-dropdown-menu@2.1.16_@types_react-dom@19.2.3_@types_react@19.2.6__@type_a50051c7210b6fbd5be09388bda08578/node_modules/@radix-ui/react-dropdown-menu/dist/index.mjs +247 -0
  12. 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 → @radix-ui_react-focus-scope@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_r_0a31b7f987af9482d13505312e1a1be9}/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +3 -3
  13. 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 → @radix-ui_react-focus-scope@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_r_0a31b7f987af9482d13505312e1a1be9}/node_modules/@radix-ui/react-focus-scope/dist/index.mjs +3 -3
  14. package/dist/node_modules/.pnpm/{@radix-ui_react-id@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-id@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-id/dist/index.cjs +1 -1
  15. package/dist/node_modules/.pnpm/{@radix-ui_react-id@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-id@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-id/dist/index.mjs +1 -1
  16. package/dist/node_modules/.pnpm/@radix-ui_react-menu@2.1.16_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@1_82ed1fcd848b6984d9291a784d477cf4/node_modules/@radix-ui/react-menu/dist/index.cjs +845 -0
  17. package/dist/node_modules/.pnpm/@radix-ui_react-menu@2.1.16_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@1_82ed1fcd848b6984d9291a784d477cf4/node_modules/@radix-ui/react-menu/dist/index.mjs +799 -0
  18. 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 → @radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_7ac2caae1e39f9ba93d5015614525161}/node_modules/@radix-ui/react-popper/dist/index.cjs +7 -7
  19. 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 → @radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_7ac2caae1e39f9ba93d5015614525161}/node_modules/@radix-ui/react-popper/dist/index.mjs +7 -7
  20. 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 → @radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_1bb4e0f97f86496802d28a2e74e2a8b9}/node_modules/@radix-ui/react-portal/dist/index.cjs +2 -2
  21. 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 → @radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_1bb4e0f97f86496802d28a2e74e2a8b9}/node_modules/@radix-ui/react-portal/dist/index.mjs +2 -2
  22. package/dist/node_modules/.pnpm/@radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.6__@types_reac_90f8e5c12233caef3399d5fd66452a13/node_modules/@radix-ui/react-presence/dist/index.cjs +147 -0
  23. package/dist/node_modules/.pnpm/@radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.6__@types_reac_90f8e5c12233caef3399d5fd66452a13/node_modules/@radix-ui/react-presence/dist/index.mjs +131 -0
  24. package/dist/node_modules/.pnpm/@radix-ui_react-roving-focus@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_fe1151d1f393bbc1072b24a86dff3a23/node_modules/@radix-ui/react-roving-focus/dist/index.cjs +244 -0
  25. package/dist/node_modules/.pnpm/@radix-ui_react-roving-focus@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_fe1151d1f393bbc1072b24a86dff3a23/node_modules/@radix-ui/react-roving-focus/dist/index.mjs +224 -0
  26. package/dist/node_modules/.pnpm/@radix-ui_react-scroll-area@1.2.10_@types_react-dom@19.2.3_@types_react@19.2.6__@types__e3f7735e9b444a10b3bbfd9fe97d44d0/node_modules/@radix-ui/react-scroll-area/dist/index.cjs +742 -0
  27. package/dist/node_modules/.pnpm/@radix-ui_react-scroll-area@1.2.10_@types_react-dom@19.2.3_@types_react@19.2.6__@types__e3f7735e9b444a10b3bbfd9fe97d44d0/node_modules/@radix-ui/react-scroll-area/dist/index.mjs +719 -0
  28. 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 → @radix-ui_react-select@2.2.6_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_38dc681bb1f2bcfeb5249d8ca2bc01f5}/node_modules/@radix-ui/react-select/dist/index.cjs +17 -17
  29. 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 → @radix-ui_react-select@2.2.6_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_38dc681bb1f2bcfeb5249d8ca2bc01f5}/node_modules/@radix-ui/react-select/dist/index.mjs +17 -17
  30. package/dist/node_modules/.pnpm/{@radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs +1 -1
  31. package/dist/node_modules/.pnpm/{@radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-controllable-state@1.2.2_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs +1 -1
  32. package/dist/node_modules/.pnpm/{@radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-escape-keydown/dist/index.cjs +1 -1
  33. package/dist/node_modules/.pnpm/{@radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-escape-keydown@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs +1 -1
  34. package/dist/node_modules/.pnpm/{@radix-ui_react-use-size@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-size@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-size/dist/index.cjs +1 -1
  35. package/dist/node_modules/.pnpm/{@radix-ui_react-use-size@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-size@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-size/dist/index.mjs +1 -1
  36. 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 → @radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.3_@types_react@19.2.6__@typ_f453379bbd5a4932ec515167f81be42a}/node_modules/@radix-ui/react-visually-hidden/dist/index.cjs +1 -1
  37. 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 → @radix-ui_react-visually-hidden@1.2.3_@types_react-dom@19.2.3_@types_react@19.2.6__@typ_f453379bbd5a4932ec515167f81be42a}/node_modules/@radix-ui/react-visually-hidden/dist/index.mjs +1 -1
  38. package/dist/node_modules/.pnpm/{react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0 → react-remove-scroll-bar@2.3.8_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll-bar/dist/es2015/component.cjs +1 -1
  39. package/dist/node_modules/.pnpm/{react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0 → react-remove-scroll-bar@2.3.8_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll-bar/dist/es2015/component.mjs +1 -1
  40. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs +2 -2
  41. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/SideEffect.mjs +2 -2
  42. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/UI.cjs +2 -2
  43. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/UI.mjs +2 -2
  44. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/medium.cjs +1 -1
  45. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/medium.mjs +1 -1
  46. package/dist/node_modules/.pnpm/react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/sidecar.cjs +9 -0
  47. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/sidecar.mjs +1 -1
  48. package/dist/packages/better-stack/src/plugins/ai-chat/api/plugin.cjs +610 -0
  49. package/dist/packages/better-stack/src/plugins/ai-chat/api/plugin.mjs +608 -0
  50. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-input.cjs +221 -0
  51. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-input.mjs +219 -0
  52. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-interface.cjs +315 -0
  53. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-interface.mjs +313 -0
  54. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-layout.cjs +122 -0
  55. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-layout.mjs +120 -0
  56. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-message.cjs +397 -0
  57. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-message.mjs +391 -0
  58. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-sidebar.cjs +227 -0
  59. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/chat-sidebar.mjs +225 -0
  60. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/loading/chat-page-skeleton.cjs +31 -0
  61. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/loading/chat-page-skeleton.mjs +29 -0
  62. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/loading/index.cjs +11 -0
  63. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/loading/index.mjs +8 -0
  64. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/pages/404-page.cjs +18 -0
  65. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/pages/404-page.mjs +16 -0
  66. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/pages/chat-page.cjs +39 -0
  67. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/pages/chat-page.internal.cjs +22 -0
  68. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/pages/chat-page.internal.mjs +20 -0
  69. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/pages/chat-page.mjs +37 -0
  70. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/shared/default-error.cjs +18 -0
  71. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/shared/default-error.mjs +16 -0
  72. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/shared/error-placeholder.cjs +26 -0
  73. package/dist/packages/better-stack/src/plugins/ai-chat/client/components/shared/error-placeholder.mjs +24 -0
  74. package/dist/packages/better-stack/src/plugins/ai-chat/client/hooks/chat-hooks.cjs +199 -0
  75. package/dist/packages/better-stack/src/plugins/ai-chat/client/hooks/chat-hooks.mjs +191 -0
  76. package/dist/packages/better-stack/src/plugins/ai-chat/client/localization/index.cjs +63 -0
  77. package/dist/packages/better-stack/src/plugins/ai-chat/client/localization/index.mjs +61 -0
  78. package/dist/packages/better-stack/src/plugins/ai-chat/client/overrides.cjs +14 -0
  79. package/dist/packages/better-stack/src/plugins/ai-chat/client/overrides.mjs +11 -0
  80. package/dist/packages/better-stack/src/plugins/ai-chat/client/plugin.cjs +241 -0
  81. package/dist/packages/better-stack/src/plugins/ai-chat/client/plugin.mjs +239 -0
  82. package/dist/packages/better-stack/src/plugins/ai-chat/db.cjs +65 -0
  83. package/dist/packages/better-stack/src/plugins/ai-chat/db.mjs +63 -0
  84. package/dist/packages/better-stack/src/plugins/ai-chat/schemas.cjs +42 -0
  85. package/dist/packages/better-stack/src/plugins/ai-chat/schemas.mjs +38 -0
  86. package/dist/packages/better-stack/src/plugins/blog/client/components/shared/markdown-content.cjs +12 -309
  87. package/dist/packages/better-stack/src/plugins/blog/client/components/shared/markdown-content.mjs +13 -303
  88. package/dist/packages/better-stack/src/plugins/blog/client/components/shared/page-wrapper.cjs +2 -2
  89. package/dist/packages/better-stack/src/plugins/blog/client/components/shared/page-wrapper.mjs +2 -2
  90. package/dist/packages/ui/src/components/alert-dialog.cjs +1 -1
  91. package/dist/packages/ui/src/components/alert-dialog.mjs +1 -1
  92. package/dist/packages/{better-stack/src/plugins/blog/client/components/shared/better-blog-attribution.cjs → ui/src/components/better-stack-attribution.cjs} +3 -3
  93. package/dist/packages/{better-stack/src/plugins/blog/client/components/shared/better-blog-attribution.mjs → ui/src/components/better-stack-attribution.mjs} +3 -3
  94. package/dist/packages/ui/src/components/dialog.cjs +14 -0
  95. package/dist/packages/ui/src/components/dialog.mjs +14 -1
  96. package/dist/packages/ui/src/components/dropdown-menu.cjs +67 -0
  97. package/dist/packages/ui/src/components/dropdown-menu.mjs +62 -0
  98. package/dist/packages/ui/src/components/markdown-content.cjs +306 -0
  99. package/dist/packages/ui/src/components/markdown-content.mjs +297 -0
  100. package/dist/packages/ui/src/components/scroll-area.cjs +63 -0
  101. package/dist/packages/ui/src/components/scroll-area.mjs +60 -0
  102. package/dist/packages/ui/src/components/select.cjs +1 -1
  103. package/dist/packages/ui/src/components/select.mjs +1 -1
  104. package/dist/packages/ui/src/components/sheet.cjs +87 -0
  105. package/dist/packages/ui/src/components/sheet.mjs +69 -0
  106. package/dist/plugins/ai-chat/api/index.cjs +9 -0
  107. package/dist/plugins/ai-chat/api/index.d.cts +9 -0
  108. package/dist/plugins/ai-chat/api/index.d.mts +9 -0
  109. package/dist/plugins/ai-chat/api/index.d.ts +9 -0
  110. package/dist/plugins/ai-chat/api/index.mjs +2 -0
  111. package/dist/plugins/ai-chat/client/components/index.cjs +27 -0
  112. package/dist/plugins/ai-chat/client/components/index.d.cts +30 -0
  113. package/dist/plugins/ai-chat/client/components/index.d.mts +30 -0
  114. package/dist/plugins/ai-chat/client/components/index.d.ts +30 -0
  115. package/dist/plugins/ai-chat/client/components/index.mjs +11 -0
  116. package/dist/plugins/ai-chat/client/hooks/index.cjs +13 -0
  117. package/dist/plugins/ai-chat/client/hooks/index.d.cts +98 -0
  118. package/dist/plugins/ai-chat/client/hooks/index.d.mts +98 -0
  119. package/dist/plugins/ai-chat/client/hooks/index.d.ts +98 -0
  120. package/dist/plugins/ai-chat/client/hooks/index.mjs +1 -0
  121. package/dist/plugins/ai-chat/client/index.cjs +19 -0
  122. package/dist/plugins/ai-chat/client/index.d.cts +327 -0
  123. package/dist/plugins/ai-chat/client/index.d.mts +327 -0
  124. package/dist/plugins/ai-chat/client/index.d.ts +327 -0
  125. package/dist/plugins/ai-chat/client/index.mjs +7 -0
  126. package/dist/plugins/ai-chat/client.css +6 -0
  127. package/dist/plugins/ai-chat/query-keys.cjs +60 -0
  128. package/dist/plugins/ai-chat/query-keys.d.cts +478 -0
  129. package/dist/plugins/ai-chat/query-keys.d.mts +478 -0
  130. package/dist/plugins/ai-chat/query-keys.d.ts +478 -0
  131. package/dist/plugins/ai-chat/query-keys.mjs +58 -0
  132. package/dist/plugins/ai-chat/style.css +19 -0
  133. package/dist/plugins/blog/api/index.d.cts +1 -1
  134. package/dist/plugins/blog/api/index.d.mts +1 -1
  135. package/dist/plugins/blog/api/index.d.ts +1 -1
  136. package/dist/plugins/blog/client/components/shared/markdown-content-styles.css +85 -62
  137. package/dist/plugins/blog/client/hooks/index.d.cts +4 -4
  138. package/dist/plugins/blog/client/hooks/index.d.mts +4 -4
  139. package/dist/plugins/blog/client/hooks/index.d.ts +4 -4
  140. package/dist/plugins/blog/client/index.d.cts +1 -1
  141. package/dist/plugins/blog/client/index.d.mts +1 -1
  142. package/dist/plugins/blog/client/index.d.ts +1 -1
  143. package/dist/plugins/blog/query-keys.d.cts +7 -7
  144. package/dist/plugins/blog/query-keys.d.mts +7 -7
  145. package/dist/plugins/blog/query-keys.d.ts +7 -7
  146. package/dist/shared/stack.Be1QIHEn.d.cts +23 -0
  147. package/dist/shared/stack.Be1QIHEn.d.mts +23 -0
  148. package/dist/shared/stack.Be1QIHEn.d.ts +23 -0
  149. package/dist/shared/stack.DorMi9CZ.d.cts +80 -0
  150. package/dist/shared/stack.DorMi9CZ.d.mts +80 -0
  151. package/dist/shared/stack.DorMi9CZ.d.ts +80 -0
  152. package/package.json +59 -1
  153. package/src/plugins/ai-chat/api/index.ts +2 -0
  154. package/src/plugins/ai-chat/api/plugin.ts +1083 -0
  155. package/src/plugins/ai-chat/client/components/chat-input.tsx +295 -0
  156. package/src/plugins/ai-chat/client/components/chat-interface.tsx +455 -0
  157. package/src/plugins/ai-chat/client/components/chat-layout.tsx +160 -0
  158. package/src/plugins/ai-chat/client/components/chat-message.tsx +505 -0
  159. package/src/plugins/ai-chat/client/components/chat-sidebar.tsx +296 -0
  160. package/src/plugins/ai-chat/client/components/index.ts +16 -0
  161. package/src/plugins/ai-chat/client/components/loading/chat-page-skeleton.tsx +57 -0
  162. package/src/plugins/ai-chat/client/components/loading/index.tsx +11 -0
  163. package/src/plugins/ai-chat/client/components/pages/404-page.tsx +27 -0
  164. package/src/plugins/ai-chat/client/components/pages/chat-page.internal.tsx +31 -0
  165. package/src/plugins/ai-chat/client/components/pages/chat-page.tsx +46 -0
  166. package/src/plugins/ai-chat/client/components/shared/default-error.tsx +28 -0
  167. package/src/plugins/ai-chat/client/components/shared/error-placeholder.tsx +22 -0
  168. package/src/plugins/ai-chat/client/hooks/chat-hooks.tsx +349 -0
  169. package/src/plugins/ai-chat/client/hooks/index.tsx +1 -0
  170. package/src/plugins/ai-chat/client/index.ts +14 -0
  171. package/src/plugins/ai-chat/client/localization/index.ts +156 -0
  172. package/src/plugins/ai-chat/client/overrides.ts +170 -0
  173. package/src/plugins/ai-chat/client/plugin.tsx +449 -0
  174. package/src/plugins/ai-chat/client.css +6 -0
  175. package/src/plugins/ai-chat/db.ts +65 -0
  176. package/src/plugins/ai-chat/query-keys.ts +87 -0
  177. package/src/plugins/ai-chat/schemas.ts +40 -0
  178. package/src/plugins/ai-chat/style.css +19 -0
  179. package/src/plugins/ai-chat/types.ts +29 -0
  180. package/src/plugins/blog/client/components/shared/markdown-content-styles.css +85 -62
  181. package/src/plugins/blog/client/components/shared/markdown-content.tsx +19 -427
  182. package/src/plugins/blog/client/components/shared/page-wrapper.tsx +2 -2
  183. 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 +0 -9
  184. package/src/plugins/blog/client/components/shared/better-blog-attribution.tsx +0 -19
  185. package/dist/node_modules/.pnpm/{@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-compose-refs@1.1.2_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +0 -0
  186. package/dist/node_modules/.pnpm/{@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-compose-refs@1.1.2_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-compose-refs/dist/index.mjs +0 -0
  187. package/dist/node_modules/.pnpm/{@radix-ui_react-context@1.1.2_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-context@1.1.2_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-context/dist/index.cjs +0 -0
  188. package/dist/node_modules/.pnpm/{@radix-ui_react-context@1.1.2_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-context@1.1.2_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-context/dist/index.mjs +0 -0
  189. package/dist/node_modules/.pnpm/{@radix-ui_react-direction@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-direction@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-direction/dist/index.cjs +0 -0
  190. package/dist/node_modules/.pnpm/{@radix-ui_react-direction@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-direction@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-direction/dist/index.mjs +0 -0
  191. package/dist/node_modules/.pnpm/{@radix-ui_react-focus-guards@1.1.3_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-focus-guards@1.1.3_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-focus-guards/dist/index.cjs +0 -0
  192. package/dist/node_modules/.pnpm/{@radix-ui_react-focus-guards@1.1.3_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-focus-guards@1.1.3_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-focus-guards/dist/index.mjs +0 -0
  193. 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 → @radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.6__@types_rea_a92a69cb1cb39305138539e4fa72f596}/node_modules/@radix-ui/react-primitive/dist/index.cjs +0 -0
  194. 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 → @radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.6__@types_rea_a92a69cb1cb39305138539e4fa72f596}/node_modules/@radix-ui/react-primitive/dist/index.mjs +0 -0
  195. package/dist/node_modules/.pnpm/{@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +0 -0
  196. package/dist/node_modules/.pnpm/{@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs +0 -0
  197. package/dist/node_modules/.pnpm/{@radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs +0 -0
  198. package/dist/node_modules/.pnpm/{@radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-layout-effect@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs +0 -0
  199. package/dist/node_modules/.pnpm/{@radix-ui_react-use-previous@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-previous@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-previous/dist/index.cjs +0 -0
  200. package/dist/node_modules/.pnpm/{@radix-ui_react-use-previous@1.1.1_@types_react@19.2.2_react@19.2.0 → @radix-ui_react-use-previous@1.1.1_@types_react@19.2.6_react@19.2.0}/node_modules/@radix-ui/react-use-previous/dist/index.mjs +0 -0
  201. package/dist/node_modules/.pnpm/{react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0 → react-remove-scroll-bar@2.3.8_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll-bar/dist/es2015/constants.cjs +0 -0
  202. package/dist/node_modules/.pnpm/{react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0 → react-remove-scroll-bar@2.3.8_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll-bar/dist/es2015/constants.mjs +0 -0
  203. package/dist/node_modules/.pnpm/{react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0 → react-remove-scroll-bar@2.3.8_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll-bar/dist/es2015/utils.cjs +0 -0
  204. package/dist/node_modules/.pnpm/{react-remove-scroll-bar@2.3.8_@types_react@19.2.2_react@19.2.0 → react-remove-scroll-bar@2.3.8_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll-bar/dist/es2015/utils.mjs +0 -0
  205. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/Combination.cjs +0 -0
  206. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/Combination.mjs +0 -0
  207. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.cjs +0 -0
  208. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.mjs +0 -0
  209. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/handleScroll.cjs +0 -0
  210. package/dist/node_modules/.pnpm/{react-remove-scroll@2.7.1_@types_react@19.2.2_react@19.2.0 → react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0}/node_modules/react-remove-scroll/dist/es2015/handleScroll.mjs +0 -0
  211. package/dist/node_modules/.pnpm/{react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0 → react-style-singleton@2.2.3_@types_react@19.2.6_react@19.2.0}/node_modules/react-style-singleton/dist/es2015/component.cjs +0 -0
  212. package/dist/node_modules/.pnpm/{react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0 → react-style-singleton@2.2.3_@types_react@19.2.6_react@19.2.0}/node_modules/react-style-singleton/dist/es2015/component.mjs +0 -0
  213. package/dist/node_modules/.pnpm/{react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0 → react-style-singleton@2.2.3_@types_react@19.2.6_react@19.2.0}/node_modules/react-style-singleton/dist/es2015/hook.cjs +0 -0
  214. package/dist/node_modules/.pnpm/{react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0 → react-style-singleton@2.2.3_@types_react@19.2.6_react@19.2.0}/node_modules/react-style-singleton/dist/es2015/hook.mjs +0 -0
  215. package/dist/node_modules/.pnpm/{react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0 → react-style-singleton@2.2.3_@types_react@19.2.6_react@19.2.0}/node_modules/react-style-singleton/dist/es2015/singleton.cjs +0 -0
  216. package/dist/node_modules/.pnpm/{react-style-singleton@2.2.3_@types_react@19.2.2_react@19.2.0 → react-style-singleton@2.2.3_@types_react@19.2.6_react@19.2.0}/node_modules/react-style-singleton/dist/es2015/singleton.mjs +0 -0
  217. package/dist/node_modules/.pnpm/{use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0 → use-callback-ref@1.3.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-callback-ref/dist/es2015/assignRef.cjs +0 -0
  218. package/dist/node_modules/.pnpm/{use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0 → use-callback-ref@1.3.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-callback-ref/dist/es2015/assignRef.mjs +0 -0
  219. package/dist/node_modules/.pnpm/{use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0 → use-callback-ref@1.3.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-callback-ref/dist/es2015/useMergeRef.cjs +0 -0
  220. package/dist/node_modules/.pnpm/{use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0 → use-callback-ref@1.3.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-callback-ref/dist/es2015/useMergeRef.mjs +0 -0
  221. package/dist/node_modules/.pnpm/{use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0 → use-callback-ref@1.3.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-callback-ref/dist/es2015/useRef.cjs +0 -0
  222. package/dist/node_modules/.pnpm/{use-callback-ref@1.3.3_@types_react@19.2.2_react@19.2.0 → use-callback-ref@1.3.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-callback-ref/dist/es2015/useRef.mjs +0 -0
  223. package/dist/node_modules/.pnpm/{use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0 → use-sidecar@1.1.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-sidecar/dist/es2015/exports.cjs +0 -0
  224. package/dist/node_modules/.pnpm/{use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0 → use-sidecar@1.1.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-sidecar/dist/es2015/exports.mjs +0 -0
  225. package/dist/node_modules/.pnpm/{use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0 → use-sidecar@1.1.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-sidecar/dist/es2015/medium.cjs +0 -0
  226. package/dist/node_modules/.pnpm/{use-sidecar@1.1.3_@types_react@19.2.2_react@19.2.0 → use-sidecar@1.1.3_@types_react@19.2.6_react@19.2.0}/node_modules/use-sidecar/dist/es2015/medium.mjs +0 -0
  227. package/dist/shared/{stack.CbuN2zVV.d.ts → stack.CcI4sYJP.d.cts} +3 -3
  228. package/dist/shared/{stack.CbuN2zVV.d.cts → stack.CcI4sYJP.d.mts} +3 -3
  229. package/dist/shared/{stack.CbuN2zVV.d.mts → stack.CcI4sYJP.d.ts} +3 -3
@@ -0,0 +1,799 @@
1
+ "use client";
2
+ import * as React from 'react';
3
+ import { composeEventHandlers } from '../../../../../@radix-ui_primitive@1.1.3/node_modules/@radix-ui/primitive/dist/index.mjs';
4
+ import { createCollection } from '../../../../../@radix-ui_react-collection@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_re_59aa5e150e70a3e7bfb1567148b021b5/node_modules/@radix-ui/react-collection/dist/index.mjs';
5
+ import { useComposedRefs, composeRefs } from '../../../../../@radix-ui_react-compose-refs@1.1.2_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-compose-refs/dist/index.mjs';
6
+ import { createContextScope } from '../../../../../@radix-ui_react-context@1.1.2_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs';
7
+ import { useDirection } from '../../../../../@radix-ui_react-direction@1.1.1_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-direction/dist/index.mjs';
8
+ import { DismissableLayer } from '../../../../../@radix-ui_react-dismissable-layer@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@_9ee1db7daf927866cf505b31d40047ad/node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs';
9
+ import { useFocusGuards } from '../../../../../@radix-ui_react-focus-guards@1.1.3_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-focus-guards/dist/index.mjs';
10
+ import { FocusScope } from '../../../../../@radix-ui_react-focus-scope@1.1.7_@types_react-dom@19.2.3_@types_react@19.2.6__@types_r_0a31b7f987af9482d13505312e1a1be9/node_modules/@radix-ui/react-focus-scope/dist/index.mjs';
11
+ import { createPopperScope, Root as Root2, Anchor, Content, Arrow } from '../../../../../@radix-ui_react-popper@1.2.8_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_7ac2caae1e39f9ba93d5015614525161/node_modules/@radix-ui/react-popper/dist/index.mjs';
12
+ import { Portal as Portal$1 } from '../../../../../@radix-ui_react-portal@1.1.9_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@_1bb4e0f97f86496802d28a2e74e2a8b9/node_modules/@radix-ui/react-portal/dist/index.mjs';
13
+ import { Presence } from '../../../../../@radix-ui_react-presence@1.1.5_@types_react-dom@19.2.3_@types_react@19.2.6__@types_reac_90f8e5c12233caef3399d5fd66452a13/node_modules/@radix-ui/react-presence/dist/index.mjs';
14
+ import { Primitive, dispatchDiscreteCustomEvent } from '../../../../../@radix-ui_react-primitive@2.1.3_@types_react-dom@19.2.3_@types_react@19.2.6__@types_rea_a92a69cb1cb39305138539e4fa72f596/node_modules/@radix-ui/react-primitive/dist/index.mjs';
15
+ import { createRovingFocusGroupScope, Item, Root } from '../../../../../@radix-ui_react-roving-focus@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_fe1151d1f393bbc1072b24a86dff3a23/node_modules/@radix-ui/react-roving-focus/dist/index.mjs';
16
+ import { createSlot } from '@radix-ui/react-slot';
17
+ import { useCallbackRef } from '../../../../../@radix-ui_react-use-callback-ref@1.1.1_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs';
18
+ import { hideOthers } from '../../../../../aria-hidden@1.2.6/node_modules/aria-hidden/dist/es2015/index.mjs';
19
+ import ReactRemoveScroll from '../../../../../react-remove-scroll@2.7.1_@types_react@19.2.6_react@19.2.0/node_modules/react-remove-scroll/dist/es2015/Combination.mjs';
20
+ import { jsx } from 'react/jsx-runtime';
21
+
22
+ var SELECTION_KEYS = ["Enter", " "];
23
+ var FIRST_KEYS = ["ArrowDown", "PageUp", "Home"];
24
+ var LAST_KEYS = ["ArrowUp", "PageDown", "End"];
25
+ var FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];
26
+ var SUB_OPEN_KEYS = {
27
+ ltr: [...SELECTION_KEYS, "ArrowRight"],
28
+ rtl: [...SELECTION_KEYS, "ArrowLeft"]
29
+ };
30
+ var SUB_CLOSE_KEYS = {
31
+ ltr: ["ArrowLeft"],
32
+ rtl: ["ArrowRight"]
33
+ };
34
+ var MENU_NAME = "Menu";
35
+ var [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);
36
+ var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [
37
+ createCollectionScope,
38
+ createPopperScope,
39
+ createRovingFocusGroupScope
40
+ ]);
41
+ var usePopperScope = createPopperScope();
42
+ var useRovingFocusGroupScope = createRovingFocusGroupScope();
43
+ var [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);
44
+ var [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);
45
+ var Menu = (props) => {
46
+ const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;
47
+ const popperScope = usePopperScope(__scopeMenu);
48
+ const [content, setContent] = React.useState(null);
49
+ const isUsingKeyboardRef = React.useRef(false);
50
+ const handleOpenChange = useCallbackRef(onOpenChange);
51
+ const direction = useDirection(dir);
52
+ React.useEffect(() => {
53
+ const handleKeyDown = () => {
54
+ isUsingKeyboardRef.current = true;
55
+ document.addEventListener("pointerdown", handlePointer, { capture: true, once: true });
56
+ document.addEventListener("pointermove", handlePointer, { capture: true, once: true });
57
+ };
58
+ const handlePointer = () => isUsingKeyboardRef.current = false;
59
+ document.addEventListener("keydown", handleKeyDown, { capture: true });
60
+ return () => {
61
+ document.removeEventListener("keydown", handleKeyDown, { capture: true });
62
+ document.removeEventListener("pointerdown", handlePointer, { capture: true });
63
+ document.removeEventListener("pointermove", handlePointer, { capture: true });
64
+ };
65
+ }, []);
66
+ return /* @__PURE__ */ jsx(Root2, { ...popperScope, children: /* @__PURE__ */ jsx(
67
+ MenuProvider,
68
+ {
69
+ scope: __scopeMenu,
70
+ open,
71
+ onOpenChange: handleOpenChange,
72
+ content,
73
+ onContentChange: setContent,
74
+ children: /* @__PURE__ */ jsx(
75
+ MenuRootProvider,
76
+ {
77
+ scope: __scopeMenu,
78
+ onClose: React.useCallback(() => handleOpenChange(false), [handleOpenChange]),
79
+ isUsingKeyboardRef,
80
+ dir: direction,
81
+ modal,
82
+ children
83
+ }
84
+ )
85
+ }
86
+ ) });
87
+ };
88
+ Menu.displayName = MENU_NAME;
89
+ var ANCHOR_NAME = "MenuAnchor";
90
+ var MenuAnchor = React.forwardRef(
91
+ (props, forwardedRef) => {
92
+ const { __scopeMenu, ...anchorProps } = props;
93
+ const popperScope = usePopperScope(__scopeMenu);
94
+ return /* @__PURE__ */ jsx(Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });
95
+ }
96
+ );
97
+ MenuAnchor.displayName = ANCHOR_NAME;
98
+ var PORTAL_NAME = "MenuPortal";
99
+ var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME, {
100
+ forceMount: void 0
101
+ });
102
+ var MenuPortal = (props) => {
103
+ const { __scopeMenu, forceMount, children, container } = props;
104
+ const context = useMenuContext(PORTAL_NAME, __scopeMenu);
105
+ return /* @__PURE__ */ jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Portal$1, { asChild: true, container, children }) }) });
106
+ };
107
+ MenuPortal.displayName = PORTAL_NAME;
108
+ var CONTENT_NAME = "MenuContent";
109
+ var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME);
110
+ var MenuContent = React.forwardRef(
111
+ (props, forwardedRef) => {
112
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
113
+ const { forceMount = portalContext.forceMount, ...contentProps } = props;
114
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
115
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
116
+ return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });
117
+ }
118
+ );
119
+ var MenuRootContentModal = React.forwardRef(
120
+ (props, forwardedRef) => {
121
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
122
+ const ref = React.useRef(null);
123
+ const composedRefs = useComposedRefs(forwardedRef, ref);
124
+ React.useEffect(() => {
125
+ const content = ref.current;
126
+ if (content) return hideOthers(content);
127
+ }, []);
128
+ return /* @__PURE__ */ jsx(
129
+ MenuContentImpl,
130
+ {
131
+ ...props,
132
+ ref: composedRefs,
133
+ trapFocus: context.open,
134
+ disableOutsidePointerEvents: context.open,
135
+ disableOutsideScroll: true,
136
+ onFocusOutside: composeEventHandlers(
137
+ props.onFocusOutside,
138
+ (event) => event.preventDefault(),
139
+ { checkForDefaultPrevented: false }
140
+ ),
141
+ onDismiss: () => context.onOpenChange(false)
142
+ }
143
+ );
144
+ }
145
+ );
146
+ var MenuRootContentNonModal = React.forwardRef((props, forwardedRef) => {
147
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
148
+ return /* @__PURE__ */ jsx(
149
+ MenuContentImpl,
150
+ {
151
+ ...props,
152
+ ref: forwardedRef,
153
+ trapFocus: false,
154
+ disableOutsidePointerEvents: false,
155
+ disableOutsideScroll: false,
156
+ onDismiss: () => context.onOpenChange(false)
157
+ }
158
+ );
159
+ });
160
+ var Slot = createSlot("MenuContent.ScrollLock");
161
+ var MenuContentImpl = React.forwardRef(
162
+ (props, forwardedRef) => {
163
+ const {
164
+ __scopeMenu,
165
+ loop = false,
166
+ trapFocus,
167
+ onOpenAutoFocus,
168
+ onCloseAutoFocus,
169
+ disableOutsidePointerEvents,
170
+ onEntryFocus,
171
+ onEscapeKeyDown,
172
+ onPointerDownOutside,
173
+ onFocusOutside,
174
+ onInteractOutside,
175
+ onDismiss,
176
+ disableOutsideScroll,
177
+ ...contentProps
178
+ } = props;
179
+ const context = useMenuContext(CONTENT_NAME, __scopeMenu);
180
+ const rootContext = useMenuRootContext(CONTENT_NAME, __scopeMenu);
181
+ const popperScope = usePopperScope(__scopeMenu);
182
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
183
+ const getItems = useCollection(__scopeMenu);
184
+ const [currentItemId, setCurrentItemId] = React.useState(null);
185
+ const contentRef = React.useRef(null);
186
+ const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);
187
+ const timerRef = React.useRef(0);
188
+ const searchRef = React.useRef("");
189
+ const pointerGraceTimerRef = React.useRef(0);
190
+ const pointerGraceIntentRef = React.useRef(null);
191
+ const pointerDirRef = React.useRef("right");
192
+ const lastPointerXRef = React.useRef(0);
193
+ const ScrollLockWrapper = disableOutsideScroll ? ReactRemoveScroll : React.Fragment;
194
+ const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;
195
+ const handleTypeaheadSearch = (key) => {
196
+ const search = searchRef.current + key;
197
+ const items = getItems().filter((item) => !item.disabled);
198
+ const currentItem = document.activeElement;
199
+ const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;
200
+ const values = items.map((item) => item.textValue);
201
+ const nextMatch = getNextMatch(values, search, currentMatch);
202
+ const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;
203
+ (function updateSearch(value) {
204
+ searchRef.current = value;
205
+ window.clearTimeout(timerRef.current);
206
+ if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
207
+ })(search);
208
+ if (newItem) {
209
+ setTimeout(() => newItem.focus());
210
+ }
211
+ };
212
+ React.useEffect(() => {
213
+ return () => window.clearTimeout(timerRef.current);
214
+ }, []);
215
+ useFocusGuards();
216
+ const isPointerMovingToSubmenu = React.useCallback((event) => {
217
+ const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;
218
+ return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);
219
+ }, []);
220
+ return /* @__PURE__ */ jsx(
221
+ MenuContentProvider,
222
+ {
223
+ scope: __scopeMenu,
224
+ searchRef,
225
+ onItemEnter: React.useCallback(
226
+ (event) => {
227
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
228
+ },
229
+ [isPointerMovingToSubmenu]
230
+ ),
231
+ onItemLeave: React.useCallback(
232
+ (event) => {
233
+ if (isPointerMovingToSubmenu(event)) return;
234
+ contentRef.current?.focus();
235
+ setCurrentItemId(null);
236
+ },
237
+ [isPointerMovingToSubmenu]
238
+ ),
239
+ onTriggerLeave: React.useCallback(
240
+ (event) => {
241
+ if (isPointerMovingToSubmenu(event)) event.preventDefault();
242
+ },
243
+ [isPointerMovingToSubmenu]
244
+ ),
245
+ pointerGraceTimerRef,
246
+ onPointerGraceIntentChange: React.useCallback((intent) => {
247
+ pointerGraceIntentRef.current = intent;
248
+ }, []),
249
+ children: /* @__PURE__ */ jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsx(
250
+ FocusScope,
251
+ {
252
+ asChild: true,
253
+ trapped: trapFocus,
254
+ onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {
255
+ event.preventDefault();
256
+ contentRef.current?.focus({ preventScroll: true });
257
+ }),
258
+ onUnmountAutoFocus: onCloseAutoFocus,
259
+ children: /* @__PURE__ */ jsx(
260
+ DismissableLayer,
261
+ {
262
+ asChild: true,
263
+ disableOutsidePointerEvents,
264
+ onEscapeKeyDown,
265
+ onPointerDownOutside,
266
+ onFocusOutside,
267
+ onInteractOutside,
268
+ onDismiss,
269
+ children: /* @__PURE__ */ jsx(
270
+ Root,
271
+ {
272
+ asChild: true,
273
+ ...rovingFocusGroupScope,
274
+ dir: rootContext.dir,
275
+ orientation: "vertical",
276
+ loop,
277
+ currentTabStopId: currentItemId,
278
+ onCurrentTabStopIdChange: setCurrentItemId,
279
+ onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {
280
+ if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
281
+ }),
282
+ preventScrollOnEntryFocus: true,
283
+ children: /* @__PURE__ */ jsx(
284
+ Content,
285
+ {
286
+ role: "menu",
287
+ "aria-orientation": "vertical",
288
+ "data-state": getOpenState(context.open),
289
+ "data-radix-menu-content": "",
290
+ dir: rootContext.dir,
291
+ ...popperScope,
292
+ ...contentProps,
293
+ ref: composedRefs,
294
+ style: { outline: "none", ...contentProps.style },
295
+ onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
296
+ const target = event.target;
297
+ const isKeyDownInside = target.closest("[data-radix-menu-content]") === event.currentTarget;
298
+ const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
299
+ const isCharacterKey = event.key.length === 1;
300
+ if (isKeyDownInside) {
301
+ if (event.key === "Tab") event.preventDefault();
302
+ if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
303
+ }
304
+ const content = contentRef.current;
305
+ if (event.target !== content) return;
306
+ if (!FIRST_LAST_KEYS.includes(event.key)) return;
307
+ event.preventDefault();
308
+ const items = getItems().filter((item) => !item.disabled);
309
+ const candidateNodes = items.map((item) => item.ref.current);
310
+ if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();
311
+ focusFirst(candidateNodes);
312
+ }),
313
+ onBlur: composeEventHandlers(props.onBlur, (event) => {
314
+ if (!event.currentTarget.contains(event.target)) {
315
+ window.clearTimeout(timerRef.current);
316
+ searchRef.current = "";
317
+ }
318
+ }),
319
+ onPointerMove: composeEventHandlers(
320
+ props.onPointerMove,
321
+ whenMouse((event) => {
322
+ const target = event.target;
323
+ const pointerXHasChanged = lastPointerXRef.current !== event.clientX;
324
+ if (event.currentTarget.contains(target) && pointerXHasChanged) {
325
+ const newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
326
+ pointerDirRef.current = newDir;
327
+ lastPointerXRef.current = event.clientX;
328
+ }
329
+ })
330
+ )
331
+ }
332
+ )
333
+ }
334
+ )
335
+ }
336
+ )
337
+ }
338
+ ) })
339
+ }
340
+ );
341
+ }
342
+ );
343
+ MenuContent.displayName = CONTENT_NAME;
344
+ var GROUP_NAME = "MenuGroup";
345
+ var MenuGroup = React.forwardRef(
346
+ (props, forwardedRef) => {
347
+ const { __scopeMenu, ...groupProps } = props;
348
+ return /* @__PURE__ */ jsx(Primitive.div, { role: "group", ...groupProps, ref: forwardedRef });
349
+ }
350
+ );
351
+ MenuGroup.displayName = GROUP_NAME;
352
+ var LABEL_NAME = "MenuLabel";
353
+ var MenuLabel = React.forwardRef(
354
+ (props, forwardedRef) => {
355
+ const { __scopeMenu, ...labelProps } = props;
356
+ return /* @__PURE__ */ jsx(Primitive.div, { ...labelProps, ref: forwardedRef });
357
+ }
358
+ );
359
+ MenuLabel.displayName = LABEL_NAME;
360
+ var ITEM_NAME = "MenuItem";
361
+ var ITEM_SELECT = "menu.itemSelect";
362
+ var MenuItem = React.forwardRef(
363
+ (props, forwardedRef) => {
364
+ const { disabled = false, onSelect, ...itemProps } = props;
365
+ const ref = React.useRef(null);
366
+ const rootContext = useMenuRootContext(ITEM_NAME, props.__scopeMenu);
367
+ const contentContext = useMenuContentContext(ITEM_NAME, props.__scopeMenu);
368
+ const composedRefs = useComposedRefs(forwardedRef, ref);
369
+ const isPointerDownRef = React.useRef(false);
370
+ const handleSelect = () => {
371
+ const menuItem = ref.current;
372
+ if (!disabled && menuItem) {
373
+ const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });
374
+ menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });
375
+ dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
376
+ if (itemSelectEvent.defaultPrevented) {
377
+ isPointerDownRef.current = false;
378
+ } else {
379
+ rootContext.onClose();
380
+ }
381
+ }
382
+ };
383
+ return /* @__PURE__ */ jsx(
384
+ MenuItemImpl,
385
+ {
386
+ ...itemProps,
387
+ ref: composedRefs,
388
+ disabled,
389
+ onClick: composeEventHandlers(props.onClick, handleSelect),
390
+ onPointerDown: (event) => {
391
+ props.onPointerDown?.(event);
392
+ isPointerDownRef.current = true;
393
+ },
394
+ onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {
395
+ if (!isPointerDownRef.current) event.currentTarget?.click();
396
+ }),
397
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
398
+ const isTypingAhead = contentContext.searchRef.current !== "";
399
+ if (disabled || isTypingAhead && event.key === " ") return;
400
+ if (SELECTION_KEYS.includes(event.key)) {
401
+ event.currentTarget.click();
402
+ event.preventDefault();
403
+ }
404
+ })
405
+ }
406
+ );
407
+ }
408
+ );
409
+ MenuItem.displayName = ITEM_NAME;
410
+ var MenuItemImpl = React.forwardRef(
411
+ (props, forwardedRef) => {
412
+ const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;
413
+ const contentContext = useMenuContentContext(ITEM_NAME, __scopeMenu);
414
+ const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
415
+ const ref = React.useRef(null);
416
+ const composedRefs = useComposedRefs(forwardedRef, ref);
417
+ const [isFocused, setIsFocused] = React.useState(false);
418
+ const [textContent, setTextContent] = React.useState("");
419
+ React.useEffect(() => {
420
+ const menuItem = ref.current;
421
+ if (menuItem) {
422
+ setTextContent((menuItem.textContent ?? "").trim());
423
+ }
424
+ }, [itemProps.children]);
425
+ return /* @__PURE__ */ jsx(
426
+ Collection.ItemSlot,
427
+ {
428
+ scope: __scopeMenu,
429
+ disabled,
430
+ textValue: textValue ?? textContent,
431
+ children: /* @__PURE__ */ jsx(Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsx(
432
+ Primitive.div,
433
+ {
434
+ role: "menuitem",
435
+ "data-highlighted": isFocused ? "" : void 0,
436
+ "aria-disabled": disabled || void 0,
437
+ "data-disabled": disabled ? "" : void 0,
438
+ ...itemProps,
439
+ ref: composedRefs,
440
+ onPointerMove: composeEventHandlers(
441
+ props.onPointerMove,
442
+ whenMouse((event) => {
443
+ if (disabled) {
444
+ contentContext.onItemLeave(event);
445
+ } else {
446
+ contentContext.onItemEnter(event);
447
+ if (!event.defaultPrevented) {
448
+ const item = event.currentTarget;
449
+ item.focus({ preventScroll: true });
450
+ }
451
+ }
452
+ })
453
+ ),
454
+ onPointerLeave: composeEventHandlers(
455
+ props.onPointerLeave,
456
+ whenMouse((event) => contentContext.onItemLeave(event))
457
+ ),
458
+ onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),
459
+ onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))
460
+ }
461
+ ) })
462
+ }
463
+ );
464
+ }
465
+ );
466
+ var CHECKBOX_ITEM_NAME = "MenuCheckboxItem";
467
+ var MenuCheckboxItem = React.forwardRef(
468
+ (props, forwardedRef) => {
469
+ const { checked = false, onCheckedChange, ...checkboxItemProps } = props;
470
+ return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(
471
+ MenuItem,
472
+ {
473
+ role: "menuitemcheckbox",
474
+ "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
475
+ ...checkboxItemProps,
476
+ ref: forwardedRef,
477
+ "data-state": getCheckedState(checked),
478
+ onSelect: composeEventHandlers(
479
+ checkboxItemProps.onSelect,
480
+ () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),
481
+ { checkForDefaultPrevented: false }
482
+ )
483
+ }
484
+ ) });
485
+ }
486
+ );
487
+ MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
488
+ var RADIO_GROUP_NAME = "MenuRadioGroup";
489
+ var [RadioGroupProvider, useRadioGroupContext] = createMenuContext(
490
+ RADIO_GROUP_NAME,
491
+ { value: void 0, onValueChange: () => {
492
+ } }
493
+ );
494
+ var MenuRadioGroup = React.forwardRef(
495
+ (props, forwardedRef) => {
496
+ const { value, onValueChange, ...groupProps } = props;
497
+ const handleValueChange = useCallbackRef(onValueChange);
498
+ return /* @__PURE__ */ jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });
499
+ }
500
+ );
501
+ MenuRadioGroup.displayName = RADIO_GROUP_NAME;
502
+ var RADIO_ITEM_NAME = "MenuRadioItem";
503
+ var MenuRadioItem = React.forwardRef(
504
+ (props, forwardedRef) => {
505
+ const { value, ...radioItemProps } = props;
506
+ const context = useRadioGroupContext(RADIO_ITEM_NAME, props.__scopeMenu);
507
+ const checked = value === context.value;
508
+ return /* @__PURE__ */ jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsx(
509
+ MenuItem,
510
+ {
511
+ role: "menuitemradio",
512
+ "aria-checked": checked,
513
+ ...radioItemProps,
514
+ ref: forwardedRef,
515
+ "data-state": getCheckedState(checked),
516
+ onSelect: composeEventHandlers(
517
+ radioItemProps.onSelect,
518
+ () => context.onValueChange?.(value),
519
+ { checkForDefaultPrevented: false }
520
+ )
521
+ }
522
+ ) });
523
+ }
524
+ );
525
+ MenuRadioItem.displayName = RADIO_ITEM_NAME;
526
+ var ITEM_INDICATOR_NAME = "MenuItemIndicator";
527
+ var [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(
528
+ ITEM_INDICATOR_NAME,
529
+ { checked: false }
530
+ );
531
+ var MenuItemIndicator = React.forwardRef(
532
+ (props, forwardedRef) => {
533
+ const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;
534
+ const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);
535
+ return /* @__PURE__ */ jsx(
536
+ Presence,
537
+ {
538
+ present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,
539
+ children: /* @__PURE__ */ jsx(
540
+ Primitive.span,
541
+ {
542
+ ...itemIndicatorProps,
543
+ ref: forwardedRef,
544
+ "data-state": getCheckedState(indicatorContext.checked)
545
+ }
546
+ )
547
+ }
548
+ );
549
+ }
550
+ );
551
+ MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
552
+ var SEPARATOR_NAME = "MenuSeparator";
553
+ var MenuSeparator = React.forwardRef(
554
+ (props, forwardedRef) => {
555
+ const { __scopeMenu, ...separatorProps } = props;
556
+ return /* @__PURE__ */ jsx(
557
+ Primitive.div,
558
+ {
559
+ role: "separator",
560
+ "aria-orientation": "horizontal",
561
+ ...separatorProps,
562
+ ref: forwardedRef
563
+ }
564
+ );
565
+ }
566
+ );
567
+ MenuSeparator.displayName = SEPARATOR_NAME;
568
+ var ARROW_NAME = "MenuArrow";
569
+ var MenuArrow = React.forwardRef(
570
+ (props, forwardedRef) => {
571
+ const { __scopeMenu, ...arrowProps } = props;
572
+ const popperScope = usePopperScope(__scopeMenu);
573
+ return /* @__PURE__ */ jsx(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });
574
+ }
575
+ );
576
+ MenuArrow.displayName = ARROW_NAME;
577
+ var SUB_NAME = "MenuSub";
578
+ var [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);
579
+ var SUB_TRIGGER_NAME = "MenuSubTrigger";
580
+ var MenuSubTrigger = React.forwardRef(
581
+ (props, forwardedRef) => {
582
+ const context = useMenuContext(SUB_TRIGGER_NAME, props.__scopeMenu);
583
+ const rootContext = useMenuRootContext(SUB_TRIGGER_NAME, props.__scopeMenu);
584
+ const subContext = useMenuSubContext(SUB_TRIGGER_NAME, props.__scopeMenu);
585
+ const contentContext = useMenuContentContext(SUB_TRIGGER_NAME, props.__scopeMenu);
586
+ const openTimerRef = React.useRef(null);
587
+ const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;
588
+ const scope = { __scopeMenu: props.__scopeMenu };
589
+ const clearOpenTimer = React.useCallback(() => {
590
+ if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
591
+ openTimerRef.current = null;
592
+ }, []);
593
+ React.useEffect(() => clearOpenTimer, [clearOpenTimer]);
594
+ React.useEffect(() => {
595
+ const pointerGraceTimer = pointerGraceTimerRef.current;
596
+ return () => {
597
+ window.clearTimeout(pointerGraceTimer);
598
+ onPointerGraceIntentChange(null);
599
+ };
600
+ }, [pointerGraceTimerRef, onPointerGraceIntentChange]);
601
+ return /* @__PURE__ */ jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsx(
602
+ MenuItemImpl,
603
+ {
604
+ id: subContext.triggerId,
605
+ "aria-haspopup": "menu",
606
+ "aria-expanded": context.open,
607
+ "aria-controls": subContext.contentId,
608
+ "data-state": getOpenState(context.open),
609
+ ...props,
610
+ ref: composeRefs(forwardedRef, subContext.onTriggerChange),
611
+ onClick: (event) => {
612
+ props.onClick?.(event);
613
+ if (props.disabled || event.defaultPrevented) return;
614
+ event.currentTarget.focus();
615
+ if (!context.open) context.onOpenChange(true);
616
+ },
617
+ onPointerMove: composeEventHandlers(
618
+ props.onPointerMove,
619
+ whenMouse((event) => {
620
+ contentContext.onItemEnter(event);
621
+ if (event.defaultPrevented) return;
622
+ if (!props.disabled && !context.open && !openTimerRef.current) {
623
+ contentContext.onPointerGraceIntentChange(null);
624
+ openTimerRef.current = window.setTimeout(() => {
625
+ context.onOpenChange(true);
626
+ clearOpenTimer();
627
+ }, 100);
628
+ }
629
+ })
630
+ ),
631
+ onPointerLeave: composeEventHandlers(
632
+ props.onPointerLeave,
633
+ whenMouse((event) => {
634
+ clearOpenTimer();
635
+ const contentRect = context.content?.getBoundingClientRect();
636
+ if (contentRect) {
637
+ const side = context.content?.dataset.side;
638
+ const rightSide = side === "right";
639
+ const bleed = rightSide ? -5 : 5;
640
+ const contentNearEdge = contentRect[rightSide ? "left" : "right"];
641
+ const contentFarEdge = contentRect[rightSide ? "right" : "left"];
642
+ contentContext.onPointerGraceIntentChange({
643
+ area: [
644
+ // Apply a bleed on clientX to ensure that our exit point is
645
+ // consistently within polygon bounds
646
+ { x: event.clientX + bleed, y: event.clientY },
647
+ { x: contentNearEdge, y: contentRect.top },
648
+ { x: contentFarEdge, y: contentRect.top },
649
+ { x: contentFarEdge, y: contentRect.bottom },
650
+ { x: contentNearEdge, y: contentRect.bottom }
651
+ ],
652
+ side
653
+ });
654
+ window.clearTimeout(pointerGraceTimerRef.current);
655
+ pointerGraceTimerRef.current = window.setTimeout(
656
+ () => contentContext.onPointerGraceIntentChange(null),
657
+ 300
658
+ );
659
+ } else {
660
+ contentContext.onTriggerLeave(event);
661
+ if (event.defaultPrevented) return;
662
+ contentContext.onPointerGraceIntentChange(null);
663
+ }
664
+ })
665
+ ),
666
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
667
+ const isTypingAhead = contentContext.searchRef.current !== "";
668
+ if (props.disabled || isTypingAhead && event.key === " ") return;
669
+ if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
670
+ context.onOpenChange(true);
671
+ context.content?.focus();
672
+ event.preventDefault();
673
+ }
674
+ })
675
+ }
676
+ ) });
677
+ }
678
+ );
679
+ MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
680
+ var SUB_CONTENT_NAME = "MenuSubContent";
681
+ var MenuSubContent = React.forwardRef(
682
+ (props, forwardedRef) => {
683
+ const portalContext = usePortalContext(CONTENT_NAME, props.__scopeMenu);
684
+ const { forceMount = portalContext.forceMount, ...subContentProps } = props;
685
+ const context = useMenuContext(CONTENT_NAME, props.__scopeMenu);
686
+ const rootContext = useMenuRootContext(CONTENT_NAME, props.__scopeMenu);
687
+ const subContext = useMenuSubContext(SUB_CONTENT_NAME, props.__scopeMenu);
688
+ const ref = React.useRef(null);
689
+ const composedRefs = useComposedRefs(forwardedRef, ref);
690
+ return /* @__PURE__ */ jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsx(
691
+ MenuContentImpl,
692
+ {
693
+ id: subContext.contentId,
694
+ "aria-labelledby": subContext.triggerId,
695
+ ...subContentProps,
696
+ ref: composedRefs,
697
+ align: "start",
698
+ side: rootContext.dir === "rtl" ? "left" : "right",
699
+ disableOutsidePointerEvents: false,
700
+ disableOutsideScroll: false,
701
+ trapFocus: false,
702
+ onOpenAutoFocus: (event) => {
703
+ if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();
704
+ event.preventDefault();
705
+ },
706
+ onCloseAutoFocus: (event) => event.preventDefault(),
707
+ onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {
708
+ if (event.target !== subContext.trigger) context.onOpenChange(false);
709
+ }),
710
+ onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {
711
+ rootContext.onClose();
712
+ event.preventDefault();
713
+ }),
714
+ onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
715
+ const isKeyDownInside = event.currentTarget.contains(event.target);
716
+ const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
717
+ if (isKeyDownInside && isCloseKey) {
718
+ context.onOpenChange(false);
719
+ subContext.trigger?.focus();
720
+ event.preventDefault();
721
+ }
722
+ })
723
+ }
724
+ ) }) }) });
725
+ }
726
+ );
727
+ MenuSubContent.displayName = SUB_CONTENT_NAME;
728
+ function getOpenState(open) {
729
+ return open ? "open" : "closed";
730
+ }
731
+ function isIndeterminate(checked) {
732
+ return checked === "indeterminate";
733
+ }
734
+ function getCheckedState(checked) {
735
+ return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
736
+ }
737
+ function focusFirst(candidates) {
738
+ const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
739
+ for (const candidate of candidates) {
740
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
741
+ candidate.focus();
742
+ if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
743
+ }
744
+ }
745
+ function wrapArray(array, startIndex) {
746
+ return array.map((_, index) => array[(startIndex + index) % array.length]);
747
+ }
748
+ function getNextMatch(values, search, currentMatch) {
749
+ const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
750
+ const normalizedSearch = isRepeated ? search[0] : search;
751
+ const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
752
+ let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));
753
+ const excludeCurrentMatch = normalizedSearch.length === 1;
754
+ if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);
755
+ const nextMatch = wrappedValues.find(
756
+ (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())
757
+ );
758
+ return nextMatch !== currentMatch ? nextMatch : void 0;
759
+ }
760
+ function isPointInPolygon(point, polygon) {
761
+ const { x, y } = point;
762
+ let inside = false;
763
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
764
+ const ii = polygon[i];
765
+ const jj = polygon[j];
766
+ const xi = ii.x;
767
+ const yi = ii.y;
768
+ const xj = jj.x;
769
+ const yj = jj.y;
770
+ const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
771
+ if (intersect) inside = !inside;
772
+ }
773
+ return inside;
774
+ }
775
+ function isPointerInGraceArea(event, area) {
776
+ if (!area) return false;
777
+ const cursorPos = { x: event.clientX, y: event.clientY };
778
+ return isPointInPolygon(cursorPos, area);
779
+ }
780
+ function whenMouse(handler) {
781
+ return (event) => event.pointerType === "mouse" ? handler(event) : void 0;
782
+ }
783
+ var Root3 = Menu;
784
+ var Anchor2 = MenuAnchor;
785
+ var Portal = MenuPortal;
786
+ var Content2 = MenuContent;
787
+ var Group = MenuGroup;
788
+ var Label = MenuLabel;
789
+ var Item2 = MenuItem;
790
+ var CheckboxItem = MenuCheckboxItem;
791
+ var RadioGroup = MenuRadioGroup;
792
+ var RadioItem = MenuRadioItem;
793
+ var ItemIndicator = MenuItemIndicator;
794
+ var Separator = MenuSeparator;
795
+ var Arrow2 = MenuArrow;
796
+ var SubTrigger = MenuSubTrigger;
797
+ var SubContent = MenuSubContent;
798
+
799
+ export { Anchor2 as Anchor, Arrow2 as Arrow, CheckboxItem, Content2 as Content, Group, Item2 as Item, ItemIndicator, Label, Menu, MenuAnchor, MenuArrow, MenuCheckboxItem, MenuContent, MenuGroup, MenuItem, MenuItemIndicator, MenuLabel, MenuPortal, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSubContent, MenuSubTrigger, Portal, RadioGroup, RadioItem, Root3 as Root, Separator, SubContent, SubTrigger, createMenuScope };