| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 var wp; 2 (wp ||= {}).blockDirectory = (() => { 3 var __create = Object.create; 4 var __defProp = Object.defineProperty; 5 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 6 var __getOwnPropNames = Object.getOwnPropertyNames; 7 var __getProtoOf = Object.getPrototypeOf; 8 var __hasOwnProp = Object.prototype.hasOwnProperty; 9 var __commonJS = (cb, mod) => function __require() { 10 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 11 }; 12 var __export = (target, all) => { 13 for (var name in all) 14 __defProp(target, name, { get: all[name], enumerable: true }); 15 }; 16 var __copyProps = (to, from, except, desc) => { 17 if (from && typeof from === "object" || typeof from === "function") { 18 for (let key of __getOwnPropNames(from)) 19 if (!__hasOwnProp.call(to, key) && key !== except) 20 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 21 } 22 return to; 23 }; 24 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 25 // If the importer is in node compatibility mode or this is not an ESM 26 // file that has been converted to a CommonJS file using a Babel- 27 // compatible transform (i.e. "__esModule" has not been set), then set 28 // "default" to the CommonJS "module.exports" for node compatibility. 29 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 30 mod 31 )); 32 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); 33 34 // package-external:@wordpress/plugins 35 var require_plugins = __commonJS({ 36 "package-external:@wordpress/plugins"(exports, module) { 37 module.exports = window.wp.plugins; 38 } 39 }); 40 41 // package-external:@wordpress/hooks 42 var require_hooks = __commonJS({ 43 "package-external:@wordpress/hooks"(exports, module) { 44 module.exports = window.wp.hooks; 45 } 46 }); 47 48 // package-external:@wordpress/blocks 49 var require_blocks = __commonJS({ 50 "package-external:@wordpress/blocks"(exports, module) { 51 module.exports = window.wp.blocks; 52 } 53 }); 54 55 // package-external:@wordpress/data 56 var require_data = __commonJS({ 57 "package-external:@wordpress/data"(exports, module) { 58 module.exports = window.wp.data; 59 } 60 }); 61 62 // package-external:@wordpress/element 63 var require_element = __commonJS({ 64 "package-external:@wordpress/element"(exports, module) { 65 module.exports = window.wp.element; 66 } 67 }); 68 69 // package-external:@wordpress/editor 70 var require_editor = __commonJS({ 71 "package-external:@wordpress/editor"(exports, module) { 72 module.exports = window.wp.editor; 73 } 74 }); 75 76 // package-external:@wordpress/block-editor 77 var require_block_editor = __commonJS({ 78 "package-external:@wordpress/block-editor"(exports, module) { 79 module.exports = window.wp.blockEditor; 80 } 81 }); 82 83 // package-external:@wordpress/i18n 84 var require_i18n = __commonJS({ 85 "package-external:@wordpress/i18n"(exports, module) { 86 module.exports = window.wp.i18n; 87 } 88 }); 89 90 // package-external:@wordpress/api-fetch 91 var require_api_fetch = __commonJS({ 92 "package-external:@wordpress/api-fetch"(exports, module) { 93 module.exports = window.wp.apiFetch; 94 } 95 }); 96 97 // package-external:@wordpress/notices 98 var require_notices = __commonJS({ 99 "package-external:@wordpress/notices"(exports, module) { 100 module.exports = window.wp.notices; 101 } 102 }); 103 104 // package-external:@wordpress/url 105 var require_url = __commonJS({ 106 "package-external:@wordpress/url"(exports, module) { 107 module.exports = window.wp.url; 108 } 109 }); 110 111 // package-external:@wordpress/compose 112 var require_compose = __commonJS({ 113 "package-external:@wordpress/compose"(exports, module) { 114 module.exports = window.wp.compose; 115 } 116 }); 117 118 // package-external:@wordpress/components 119 var require_components = __commonJS({ 120 "package-external:@wordpress/components"(exports, module) { 121 module.exports = window.wp.components; 122 } 123 }); 124 125 // package-external:@wordpress/core-data 126 var require_core_data = __commonJS({ 127 "package-external:@wordpress/core-data"(exports, module) { 128 module.exports = window.wp.coreData; 129 } 130 }); 131 132 // package-external:@wordpress/html-entities 133 var require_html_entities = __commonJS({ 134 "package-external:@wordpress/html-entities"(exports, module) { 135 module.exports = window.wp.htmlEntities; 136 } 137 }); 138 139 // vendor-external:react 140 var require_react = __commonJS({ 141 "vendor-external:react"(exports, module) { 142 module.exports = window.React; 143 } 144 }); 145 146 // vendor-external:react/jsx-runtime 147 var require_jsx_runtime = __commonJS({ 148 "vendor-external:react/jsx-runtime"(exports, module) { 149 module.exports = window.ReactJSXRuntime; 150 } 151 }); 152 153 // vendor-external:react-dom 154 var require_react_dom = __commonJS({ 155 "vendor-external:react-dom"(exports, module) { 156 module.exports = window.ReactDOM; 157 } 158 }); 159 160 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js 161 var require_use_sync_external_store_shim_development = __commonJS({ 162 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) { 163 "use strict"; 164 (function() { 165 function is(x, y) { 166 return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; 167 } 168 function useSyncExternalStore$2(subscribe, getSnapshot) { 169 didWarnOld18Alpha || void 0 === React47.startTransition || (didWarnOld18Alpha = true, console.error( 170 "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release." 171 )); 172 var value = getSnapshot(); 173 if (!didWarnUncachedGetSnapshot) { 174 var cachedValue = getSnapshot(); 175 objectIs(value, cachedValue) || (console.error( 176 "The result of getSnapshot should be cached to avoid an infinite loop" 177 ), didWarnUncachedGetSnapshot = true); 178 } 179 cachedValue = useState13({ 180 inst: { value, getSnapshot } 181 }); 182 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1]; 183 useLayoutEffect3( 184 function() { 185 inst.value = value; 186 inst.getSnapshot = getSnapshot; 187 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 188 }, 189 [subscribe, value, getSnapshot] 190 ); 191 useEffect13( 192 function() { 193 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 194 return subscribe(function() { 195 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 196 }); 197 }, 198 [subscribe] 199 ); 200 useDebugValue2(value); 201 return value; 202 } 203 function checkIfSnapshotChanged(inst) { 204 var latestGetSnapshot = inst.getSnapshot; 205 inst = inst.value; 206 try { 207 var nextValue = latestGetSnapshot(); 208 return !objectIs(inst, nextValue); 209 } catch (error) { 210 return true; 211 } 212 } 213 function useSyncExternalStore$1(subscribe, getSnapshot) { 214 return getSnapshot(); 215 } 216 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 217 var React47 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState13 = React47.useState, useEffect13 = React47.useEffect, useLayoutEffect3 = React47.useLayoutEffect, useDebugValue2 = React47.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; 218 exports.useSyncExternalStore = void 0 !== React47.useSyncExternalStore ? React47.useSyncExternalStore : shim; 219 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 220 })(); 221 } 222 }); 223 224 // node_modules/use-sync-external-store/shim/index.js 225 var require_shim = __commonJS({ 226 "node_modules/use-sync-external-store/shim/index.js"(exports, module) { 227 "use strict"; 228 if (false) { 229 module.exports = null; 230 } else { 231 module.exports = require_use_sync_external_store_shim_development(); 232 } 233 } 234 }); 235 236 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js 237 var require_with_selector_development = __commonJS({ 238 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js"(exports) { 239 "use strict"; 240 (function() { 241 function is(x, y) { 242 return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y; 243 } 244 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 245 var React47 = require_react(), shim = require_shim(), objectIs = "function" === typeof Object.is ? Object.is : is, useSyncExternalStore2 = shim.useSyncExternalStore, useRef19 = React47.useRef, useEffect13 = React47.useEffect, useMemo15 = React47.useMemo, useDebugValue2 = React47.useDebugValue; 246 exports.useSyncExternalStoreWithSelector = function(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) { 247 var instRef = useRef19(null); 248 if (null === instRef.current) { 249 var inst = { hasValue: false, value: null }; 250 instRef.current = inst; 251 } else inst = instRef.current; 252 instRef = useMemo15( 253 function() { 254 function memoizedSelector(nextSnapshot) { 255 if (!hasMemo) { 256 hasMemo = true; 257 memoizedSnapshot = nextSnapshot; 258 nextSnapshot = selector(nextSnapshot); 259 if (void 0 !== isEqual && inst.hasValue) { 260 var currentSelection = inst.value; 261 if (isEqual(currentSelection, nextSnapshot)) 262 return memoizedSelection = currentSelection; 263 } 264 return memoizedSelection = nextSnapshot; 265 } 266 currentSelection = memoizedSelection; 267 if (objectIs(memoizedSnapshot, nextSnapshot)) 268 return currentSelection; 269 var nextSelection = selector(nextSnapshot); 270 if (void 0 !== isEqual && isEqual(currentSelection, nextSelection)) 271 return memoizedSnapshot = nextSnapshot, currentSelection; 272 memoizedSnapshot = nextSnapshot; 273 return memoizedSelection = nextSelection; 274 } 275 var hasMemo = false, memoizedSnapshot, memoizedSelection, maybeGetServerSnapshot = void 0 === getServerSnapshot ? null : getServerSnapshot; 276 return [ 277 function() { 278 return memoizedSelector(getSnapshot()); 279 }, 280 null === maybeGetServerSnapshot ? void 0 : function() { 281 return memoizedSelector(maybeGetServerSnapshot()); 282 } 283 ]; 284 }, 285 [getSnapshot, getServerSnapshot, selector, isEqual] 286 ); 287 var value = useSyncExternalStore2(subscribe, instRef[0], instRef[1]); 288 useEffect13( 289 function() { 290 inst.hasValue = true; 291 inst.value = value; 292 }, 293 [value] 294 ); 295 useDebugValue2(value); 296 return value; 297 }; 298 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 299 })(); 300 } 301 }); 302 303 // node_modules/use-sync-external-store/shim/with-selector.js 304 var require_with_selector = __commonJS({ 305 "node_modules/use-sync-external-store/shim/with-selector.js"(exports, module) { 306 "use strict"; 307 if (false) { 308 module.exports = null; 309 } else { 310 module.exports = require_with_selector_development(); 311 } 312 } 313 }); 314 315 // package-external:@wordpress/a11y 316 var require_a11y = __commonJS({ 317 "package-external:@wordpress/a11y"(exports, module) { 318 module.exports = window.wp.a11y; 319 } 320 }); 321 322 // package-external:@wordpress/primitives 323 var require_primitives = __commonJS({ 324 "package-external:@wordpress/primitives"(exports, module) { 325 module.exports = window.wp.primitives; 326 } 327 }); 328 329 // package-external:@wordpress/theme 330 var require_theme = __commonJS({ 331 "package-external:@wordpress/theme"(exports, module) { 332 module.exports = window.wp.theme; 333 } 334 }); 335 336 // package-external:@wordpress/private-apis 337 var require_private_apis = __commonJS({ 338 "package-external:@wordpress/private-apis"(exports, module) { 339 module.exports = window.wp.privateApis; 340 } 341 }); 342 343 // packages/block-directory/build-module/index.mjs 344 var index_exports = {}; 345 __export(index_exports, { 346 store: () => store 347 }); 348 349 // packages/block-directory/build-module/plugins/index.mjs 350 var import_plugins = __toESM(require_plugins(), 1); 351 var import_hooks = __toESM(require_hooks(), 1); 352 353 // packages/block-directory/build-module/components/auto-block-uninstaller/index.mjs 354 var import_blocks2 = __toESM(require_blocks(), 1); 355 var import_data4 = __toESM(require_data(), 1); 356 var import_element = __toESM(require_element(), 1); 357 var import_editor = __toESM(require_editor(), 1); 358 359 // packages/block-directory/build-module/store/index.mjs 360 var import_data3 = __toESM(require_data(), 1); 361 362 // packages/block-directory/build-module/store/reducer.mjs 363 var import_data = __toESM(require_data(), 1); 364 var downloadableBlocks = (state = {}, action) => { 365 switch (action.type) { 366 case "FETCH_DOWNLOADABLE_BLOCKS": 367 return { 368 ...state, 369 [action.filterValue]: { 370 isRequesting: true 371 } 372 }; 373 case "RECEIVE_DOWNLOADABLE_BLOCKS": 374 return { 375 ...state, 376 [action.filterValue]: { 377 results: action.downloadableBlocks, 378 isRequesting: false 379 } 380 }; 381 } 382 return state; 383 }; 384 var blockManagement = (state = { 385 installedBlockTypes: [], 386 isInstalling: {} 387 }, action) => { 388 switch (action.type) { 389 case "ADD_INSTALLED_BLOCK_TYPE": 390 return { 391 ...state, 392 installedBlockTypes: [ 393 ...state.installedBlockTypes, 394 action.item 395 ] 396 }; 397 case "REMOVE_INSTALLED_BLOCK_TYPE": 398 return { 399 ...state, 400 installedBlockTypes: state.installedBlockTypes.filter( 401 (blockType) => blockType.name !== action.item.name 402 ) 403 }; 404 case "SET_INSTALLING_BLOCK": 405 return { 406 ...state, 407 isInstalling: { 408 ...state.isInstalling, 409 [action.blockId]: action.isInstalling 410 } 411 }; 412 } 413 return state; 414 }; 415 var errorNotices = (state = {}, action) => { 416 switch (action.type) { 417 case "SET_ERROR_NOTICE": 418 return { 419 ...state, 420 [action.blockId]: { 421 message: action.message, 422 isFatal: action.isFatal 423 } 424 }; 425 case "CLEAR_ERROR_NOTICE": 426 const { [action.blockId]: blockId, ...restState } = state; 427 return restState; 428 } 429 return state; 430 }; 431 var reducer_default = (0, import_data.combineReducers)({ 432 downloadableBlocks, 433 blockManagement, 434 errorNotices 435 }); 436 437 // packages/block-directory/build-module/store/selectors.mjs 438 var selectors_exports = {}; 439 __export(selectors_exports, { 440 getDownloadableBlocks: () => getDownloadableBlocks, 441 getErrorNoticeForBlock: () => getErrorNoticeForBlock, 442 getErrorNotices: () => getErrorNotices, 443 getInstalledBlockTypes: () => getInstalledBlockTypes, 444 getNewBlockTypes: () => getNewBlockTypes, 445 getUnusedBlockTypes: () => getUnusedBlockTypes, 446 isInstalling: () => isInstalling, 447 isRequestingDownloadableBlocks: () => isRequestingDownloadableBlocks 448 }); 449 var import_data2 = __toESM(require_data(), 1); 450 var import_block_editor = __toESM(require_block_editor(), 1); 451 var EMPTY_ARRAY = []; 452 function isRequestingDownloadableBlocks(state, filterValue) { 453 return state.downloadableBlocks[filterValue]?.isRequesting ?? false; 454 } 455 function getDownloadableBlocks(state, filterValue) { 456 return state.downloadableBlocks[filterValue]?.results ?? EMPTY_ARRAY; 457 } 458 function getInstalledBlockTypes(state) { 459 return state.blockManagement.installedBlockTypes; 460 } 461 var getNewBlockTypes = (0, import_data2.createRegistrySelector)( 462 (select) => (0, import_data2.createSelector)( 463 (state) => { 464 const installedBlockTypes = getInstalledBlockTypes(state); 465 if (!installedBlockTypes.length) { 466 return EMPTY_ARRAY; 467 } 468 const { getBlockName, getClientIdsWithDescendants } = select(import_block_editor.store); 469 const installedBlockNames = installedBlockTypes.map( 470 (blockType) => blockType.name 471 ); 472 const foundBlockNames = getClientIdsWithDescendants().flatMap( 473 (clientId) => { 474 const blockName = getBlockName(clientId); 475 return installedBlockNames.includes(blockName) ? blockName : []; 476 } 477 ); 478 const newBlockTypes = installedBlockTypes.filter( 479 (blockType) => foundBlockNames.includes(blockType.name) 480 ); 481 return newBlockTypes.length > 0 ? newBlockTypes : EMPTY_ARRAY; 482 }, 483 (state) => [ 484 getInstalledBlockTypes(state), 485 select(import_block_editor.store).getClientIdsWithDescendants() 486 ] 487 ) 488 ); 489 var getUnusedBlockTypes = (0, import_data2.createRegistrySelector)( 490 (select) => (0, import_data2.createSelector)( 491 (state) => { 492 const installedBlockTypes = getInstalledBlockTypes(state); 493 if (!installedBlockTypes.length) { 494 return EMPTY_ARRAY; 495 } 496 const { getBlockName, getClientIdsWithDescendants } = select(import_block_editor.store); 497 const installedBlockNames = installedBlockTypes.map( 498 (blockType) => blockType.name 499 ); 500 const foundBlockNames = getClientIdsWithDescendants().flatMap( 501 (clientId) => { 502 const blockName = getBlockName(clientId); 503 return installedBlockNames.includes(blockName) ? blockName : []; 504 } 505 ); 506 const unusedBlockTypes = installedBlockTypes.filter( 507 (blockType) => !foundBlockNames.includes(blockType.name) 508 ); 509 return unusedBlockTypes.length > 0 ? unusedBlockTypes : EMPTY_ARRAY; 510 }, 511 (state) => [ 512 getInstalledBlockTypes(state), 513 select(import_block_editor.store).getClientIdsWithDescendants() 514 ] 515 ) 516 ); 517 function isInstalling(state, blockId) { 518 return state.blockManagement.isInstalling[blockId] || false; 519 } 520 function getErrorNotices(state) { 521 return state.errorNotices; 522 } 523 function getErrorNoticeForBlock(state, blockId) { 524 return state.errorNotices[blockId]; 525 } 526 527 // packages/block-directory/build-module/store/actions.mjs 528 var actions_exports = {}; 529 __export(actions_exports, { 530 addInstalledBlockType: () => addInstalledBlockType, 531 clearErrorNotice: () => clearErrorNotice, 532 fetchDownloadableBlocks: () => fetchDownloadableBlocks, 533 installBlockType: () => installBlockType, 534 receiveDownloadableBlocks: () => receiveDownloadableBlocks, 535 removeInstalledBlockType: () => removeInstalledBlockType, 536 setErrorNotice: () => setErrorNotice, 537 setIsInstalling: () => setIsInstalling, 538 uninstallBlockType: () => uninstallBlockType 539 }); 540 var import_blocks = __toESM(require_blocks(), 1); 541 var import_i18n = __toESM(require_i18n(), 1); 542 var import_api_fetch2 = __toESM(require_api_fetch(), 1); 543 var import_notices = __toESM(require_notices(), 1); 544 var import_url = __toESM(require_url(), 1); 545 546 // packages/block-directory/build-module/store/load-assets.mjs 547 var import_api_fetch = __toESM(require_api_fetch(), 1); 548 var loadAsset = (el) => { 549 return new Promise((resolve, reject) => { 550 const newNode = document.createElement(el.nodeName); 551 ["id", "rel", "src", "href", "type"].forEach((attr2) => { 552 if (el[attr2]) { 553 newNode[attr2] = el[attr2]; 554 } 555 }); 556 if (el.innerHTML) { 557 newNode.appendChild(document.createTextNode(el.innerHTML)); 558 } 559 newNode.onload = () => resolve(true); 560 newNode.onerror = () => reject(new Error("Error loading asset.")); 561 document.body.appendChild(newNode); 562 if ("link" === newNode.nodeName.toLowerCase() || "script" === newNode.nodeName.toLowerCase() && !newNode.src) { 563 resolve(); 564 } 565 }); 566 }; 567 async function loadAssets() { 568 const response = await (0, import_api_fetch.default)({ 569 url: document.location.href, 570 parse: false 571 }); 572 const data = await response.text(); 573 const doc = new window.DOMParser().parseFromString(data, "text/html"); 574 const newAssets = Array.from( 575 doc.querySelectorAll('link[rel="stylesheet"],script') 576 ).filter((asset) => asset.id && !document.getElementById(asset.id)); 577 for (const newAsset of newAssets) { 578 await loadAsset(newAsset); 579 } 580 } 581 582 // packages/block-directory/build-module/store/utils/get-plugin-url.mjs 583 function getPluginUrl(block) { 584 if (!block) { 585 return false; 586 } 587 const link = block.links["wp:plugin"] || block.links.self; 588 if (link && link.length) { 589 return link[0].href; 590 } 591 return false; 592 } 593 594 // packages/block-directory/build-module/store/actions.mjs 595 function fetchDownloadableBlocks(filterValue) { 596 return { type: "FETCH_DOWNLOADABLE_BLOCKS", filterValue }; 597 } 598 function receiveDownloadableBlocks(downloadableBlocks2, filterValue) { 599 return { 600 type: "RECEIVE_DOWNLOADABLE_BLOCKS", 601 downloadableBlocks: downloadableBlocks2, 602 filterValue 603 }; 604 } 605 var installBlockType = (block) => async ({ registry, dispatch }) => { 606 const { id, name } = block; 607 let success = false; 608 dispatch.clearErrorNotice(id); 609 try { 610 dispatch.setIsInstalling(id, true); 611 const url = getPluginUrl(block); 612 let links = {}; 613 if (url) { 614 await (0, import_api_fetch2.default)({ 615 method: "PUT", 616 url, 617 data: { status: "active" } 618 }); 619 } else { 620 const response = await (0, import_api_fetch2.default)({ 621 method: "POST", 622 path: "wp/v2/plugins", 623 data: { slug: id, status: "active" } 624 }); 625 links = response._links; 626 } 627 dispatch.addInstalledBlockType({ 628 ...block, 629 links: { ...block.links, ...links } 630 }); 631 const metadataFields = [ 632 "api_version", 633 "title", 634 "category", 635 "parent", 636 "ancestor", 637 "icon", 638 "description", 639 "keywords", 640 "attributes", 641 "provides_context", 642 "uses_context", 643 "selectors", 644 "supports", 645 "styles", 646 "example", 647 "variations", 648 "allowed_blocks", 649 "block_hooks" 650 ]; 651 await (0, import_api_fetch2.default)({ 652 path: (0, import_url.addQueryArgs)(`/wp/v2/block-types/$name}`, { 653 _fields: metadataFields 654 }) 655 }).catch(() => { 656 }).then((response) => { 657 if (!response) { 658 return; 659 } 660 (0, import_blocks.unstable__bootstrapServerSideBlockDefinitions)({ 661 [name]: Object.fromEntries( 662 Object.entries(response).filter( 663 ([key]) => metadataFields.includes(key) 664 ) 665 ) 666 }); 667 }); 668 await loadAssets(); 669 const registeredBlocks = registry.select(import_blocks.store).getBlockTypes(); 670 if (!registeredBlocks.some((i) => i.name === name)) { 671 throw new Error( 672 (0, import_i18n.__)("Error registering block. Try reloading the page.") 673 ); 674 } 675 registry.dispatch(import_notices.store).createInfoNotice( 676 (0, import_i18n.sprintf)( 677 // translators: %s is the block title. 678 (0, import_i18n.__)("Block %s installed and added."), 679 block.title 680 ), 681 { 682 speak: true, 683 type: "snackbar" 684 } 685 ); 686 success = true; 687 } catch (error) { 688 let message = error.message || (0, import_i18n.__)("An error occurred."); 689 let isFatal = error instanceof Error; 690 const fatalAPIErrors = { 691 folder_exists: (0, import_i18n.__)( 692 "This block is already installed. Try reloading the page." 693 ), 694 unable_to_connect_to_filesystem: (0, import_i18n.__)( 695 "Error installing block. You can reload the page and try again." 696 ) 697 }; 698 if (fatalAPIErrors[error.code]) { 699 isFatal = true; 700 message = fatalAPIErrors[error.code]; 701 } 702 dispatch.setErrorNotice(id, message, isFatal); 703 registry.dispatch(import_notices.store).createErrorNotice(message, { 704 speak: true, 705 isDismissible: true 706 }); 707 } 708 dispatch.setIsInstalling(id, false); 709 return success; 710 }; 711 var uninstallBlockType = (block) => async ({ registry, dispatch }) => { 712 try { 713 const url = getPluginUrl(block); 714 await (0, import_api_fetch2.default)({ 715 method: "PUT", 716 url, 717 data: { status: "inactive" } 718 }); 719 await (0, import_api_fetch2.default)({ 720 method: "DELETE", 721 url 722 }); 723 dispatch.removeInstalledBlockType(block); 724 } catch (error) { 725 registry.dispatch(import_notices.store).createErrorNotice( 726 error.message || (0, import_i18n.__)("An error occurred.") 727 ); 728 } 729 }; 730 function addInstalledBlockType(item) { 731 return { 732 type: "ADD_INSTALLED_BLOCK_TYPE", 733 item 734 }; 735 } 736 function removeInstalledBlockType(item) { 737 return { 738 type: "REMOVE_INSTALLED_BLOCK_TYPE", 739 item 740 }; 741 } 742 function setIsInstalling(blockId, isInstalling2) { 743 return { 744 type: "SET_INSTALLING_BLOCK", 745 blockId, 746 isInstalling: isInstalling2 747 }; 748 } 749 function setErrorNotice(blockId, message, isFatal = false) { 750 return { 751 type: "SET_ERROR_NOTICE", 752 blockId, 753 message, 754 isFatal 755 }; 756 } 757 function clearErrorNotice(blockId) { 758 return { 759 type: "CLEAR_ERROR_NOTICE", 760 blockId 761 }; 762 } 763 764 // packages/block-directory/build-module/store/resolvers.mjs 765 var resolvers_exports = {}; 766 __export(resolvers_exports, { 767 getDownloadableBlocks: () => getDownloadableBlocks2 768 }); 769 770 // node_modules/tslib/tslib.es6.mjs 771 var __assign = function() { 772 __assign = Object.assign || function __assign2(t) { 773 for (var s, i = 1, n = arguments.length; i < n; i++) { 774 s = arguments[i]; 775 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; 776 } 777 return t; 778 }; 779 return __assign.apply(this, arguments); 780 }; 781 782 // node_modules/lower-case/dist.es2015/index.js 783 function lowerCase(str) { 784 return str.toLowerCase(); 785 } 786 787 // node_modules/no-case/dist.es2015/index.js 788 var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g]; 789 var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; 790 function noCase(input, options) { 791 if (options === void 0) { 792 options = {}; 793 } 794 var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d; 795 var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0"); 796 var start = 0; 797 var end = result.length; 798 while (result.charAt(start) === "\0") 799 start++; 800 while (result.charAt(end - 1) === "\0") 801 end--; 802 return result.slice(start, end).split("\0").map(transform).join(delimiter); 803 } 804 function replace(input, re, value) { 805 if (re instanceof RegExp) 806 return input.replace(re, value); 807 return re.reduce(function(input2, re2) { 808 return input2.replace(re2, value); 809 }, input); 810 } 811 812 // node_modules/pascal-case/dist.es2015/index.js 813 function pascalCaseTransform(input, index2) { 814 var firstChar = input.charAt(0); 815 var lowerChars = input.substr(1).toLowerCase(); 816 if (index2 > 0 && firstChar >= "0" && firstChar <= "9") { 817 return "_" + firstChar + lowerChars; 818 } 819 return "" + firstChar.toUpperCase() + lowerChars; 820 } 821 function pascalCase(input, options) { 822 if (options === void 0) { 823 options = {}; 824 } 825 return noCase(input, __assign({ delimiter: "", transform: pascalCaseTransform }, options)); 826 } 827 828 // node_modules/camel-case/dist.es2015/index.js 829 function camelCaseTransform(input, index2) { 830 if (index2 === 0) 831 return input.toLowerCase(); 832 return pascalCaseTransform(input, index2); 833 } 834 function camelCase(input, options) { 835 if (options === void 0) { 836 options = {}; 837 } 838 return pascalCase(input, __assign({ transform: camelCaseTransform }, options)); 839 } 840 841 // packages/block-directory/build-module/store/resolvers.mjs 842 var import_api_fetch3 = __toESM(require_api_fetch(), 1); 843 var getDownloadableBlocks2 = (filterValue) => async ({ dispatch }) => { 844 if (!filterValue) { 845 return; 846 } 847 try { 848 dispatch(fetchDownloadableBlocks(filterValue)); 849 const results = await (0, import_api_fetch3.default)({ 850 path: `wp/v2/block-directory/search?term=$filterValue}` 851 }); 852 const blocks = results.map( 853 (result) => Object.fromEntries( 854 Object.entries(result).map(([key, value]) => [ 855 camelCase(key), 856 value 857 ]) 858 ) 859 ); 860 dispatch(receiveDownloadableBlocks(blocks, filterValue)); 861 } catch { 862 dispatch(receiveDownloadableBlocks([], filterValue)); 863 } 864 }; 865 866 // packages/block-directory/build-module/store/index.mjs 867 var STORE_NAME = "core/block-directory"; 868 var storeConfig = { 869 reducer: reducer_default, 870 selectors: selectors_exports, 871 actions: actions_exports, 872 resolvers: resolvers_exports 873 }; 874 var store = (0, import_data3.createReduxStore)(STORE_NAME, storeConfig); 875 (0, import_data3.register)(store); 876 877 // packages/block-directory/build-module/components/auto-block-uninstaller/index.mjs 878 function AutoBlockUninstaller() { 879 const { uninstallBlockType: uninstallBlockType2 } = (0, import_data4.useDispatch)(store); 880 const shouldRemoveBlockTypes = (0, import_data4.useSelect)((select) => { 881 const { isAutosavingPost, isSavingPost } = select(import_editor.store); 882 return isSavingPost() && !isAutosavingPost(); 883 }, []); 884 const unusedBlockTypes = (0, import_data4.useSelect)( 885 (select) => select(store).getUnusedBlockTypes(), 886 [] 887 ); 888 (0, import_element.useEffect)(() => { 889 if (shouldRemoveBlockTypes && unusedBlockTypes.length) { 890 unusedBlockTypes.forEach((blockType) => { 891 uninstallBlockType2(blockType); 892 (0, import_blocks2.unregisterBlockType)(blockType.name); 893 }); 894 } 895 }, [shouldRemoveBlockTypes]); 896 return null; 897 } 898 899 // packages/block-directory/build-module/plugins/inserter-menu-downloadable-blocks-panel/index.mjs 900 var import_block_editor3 = __toESM(require_block_editor(), 1); 901 var import_compose = __toESM(require_compose(), 1); 902 var import_element20 = __toESM(require_element(), 1); 903 904 // packages/block-directory/build-module/components/downloadable-blocks-panel/index.mjs 905 var import_i18n8 = __toESM(require_i18n(), 1); 906 var import_components4 = __toESM(require_components(), 1); 907 var import_core_data = __toESM(require_core_data(), 1); 908 var import_data8 = __toESM(require_data(), 1); 909 var import_blocks5 = __toESM(require_blocks(), 1); 910 911 // packages/block-directory/build-module/components/downloadable-blocks-list/index.mjs 912 var import_i18n5 = __toESM(require_i18n(), 1); 913 var import_components2 = __toESM(require_components(), 1); 914 var import_blocks4 = __toESM(require_blocks(), 1); 915 var import_data7 = __toESM(require_data(), 1); 916 917 // node_modules/clsx/dist/clsx.mjs 918 function r(e) { 919 var t, f, n = ""; 920 if ("string" == typeof e || "number" == typeof e) n += e; 921 else if ("object" == typeof e) if (Array.isArray(e)) { 922 var o = e.length; 923 for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f); 924 } else for (f in e) e[f] && (n && (n += " "), n += f); 925 return n; 926 } 927 function clsx() { 928 for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t); 929 return n; 930 } 931 var clsx_default = clsx; 932 933 // packages/block-directory/build-module/components/downloadable-block-list-item/index.mjs 934 var import_i18n4 = __toESM(require_i18n(), 1); 935 var import_components = __toESM(require_components(), 1); 936 var import_element18 = __toESM(require_element(), 1); 937 var import_html_entities = __toESM(require_html_entities(), 1); 938 var import_blocks3 = __toESM(require_blocks(), 1); 939 var import_data6 = __toESM(require_data(), 1); 940 941 // node_modules/@base-ui/utils/safeReact.mjs 942 var React = __toESM(require_react(), 1); 943 var SafeReact = { 944 ...React 945 }; 946 947 // node_modules/@base-ui/utils/useRefWithInit.mjs 948 var React2 = __toESM(require_react(), 1); 949 var UNINITIALIZED = {}; 950 function useRefWithInit(init, initArg) { 951 const ref = React2.useRef(UNINITIALIZED); 952 if (ref.current === UNINITIALIZED) { 953 ref.current = init(initArg); 954 } 955 return ref; 956 } 957 958 // node_modules/@base-ui/utils/useStableCallback.mjs 959 var useInsertionEffect = SafeReact.useInsertionEffect; 960 var useSafeInsertionEffect = ( 961 // React 17 doesn't have useInsertionEffect. 962 useInsertionEffect && // Preact replaces useInsertionEffect with useLayoutEffect and fires too late. 963 useInsertionEffect !== SafeReact.useLayoutEffect ? useInsertionEffect : (fn) => fn() 964 ); 965 function useStableCallback(callback) { 966 const stable = useRefWithInit(createStableCallback).current; 967 stable.next = callback; 968 useSafeInsertionEffect(stable.effect); 969 return stable.trampoline; 970 } 971 function createStableCallback() { 972 const stable = { 973 next: void 0, 974 callback: assertNotCalled, 975 trampoline: (...args) => stable.callback?.(...args), 976 effect: () => { 977 stable.callback = stable.next; 978 } 979 }; 980 return stable; 981 } 982 function assertNotCalled() { 983 if (true) { 984 throw ( 985 /* minify-error-disabled */ 986 new Error("Base UI: Cannot call an event handler while rendering.") 987 ); 988 } 989 } 990 991 // node_modules/@base-ui/utils/useIsoLayoutEffect.mjs 992 var React3 = __toESM(require_react(), 1); 993 var noop = () => { 994 }; 995 var useIsoLayoutEffect = typeof document !== "undefined" ? React3.useLayoutEffect : noop; 996 997 // node_modules/@base-ui/utils/warn.mjs 998 var set; 999 if (true) { 1000 set = /* @__PURE__ */ new Set(); 1001 } 1002 function warn(...messages) { 1003 if (true) { 1004 const messageKey = messages.join(" "); 1005 if (!set.has(messageKey)) { 1006 set.add(messageKey); 1007 console.warn(`Base UI: $messageKey}`); 1008 } 1009 } 1010 } 1011 1012 // node_modules/@base-ui/react/internals/direction-context/DirectionContext.mjs 1013 var React4 = __toESM(require_react(), 1); 1014 var DirectionContext = /* @__PURE__ */ React4.createContext(void 0); 1015 if (true) DirectionContext.displayName = "DirectionContext"; 1016 function useDirection() { 1017 const context = React4.useContext(DirectionContext); 1018 return context?.direction ?? "ltr"; 1019 } 1020 1021 // node_modules/@base-ui/react/internals/useRenderElement.mjs 1022 var React7 = __toESM(require_react(), 1); 1023 1024 // node_modules/@base-ui/utils/useMergedRefs.mjs 1025 function useMergedRefs(a, b, c, d) { 1026 const forkRef = useRefWithInit(createForkRef).current; 1027 if (didChange(forkRef, a, b, c, d)) { 1028 update(forkRef, [a, b, c, d]); 1029 } 1030 return forkRef.callback; 1031 } 1032 function useMergedRefsN(refs) { 1033 const forkRef = useRefWithInit(createForkRef).current; 1034 if (didChangeN(forkRef, refs)) { 1035 update(forkRef, refs); 1036 } 1037 return forkRef.callback; 1038 } 1039 function createForkRef() { 1040 return { 1041 callback: null, 1042 cleanup: null, 1043 refs: [] 1044 }; 1045 } 1046 function didChange(forkRef, a, b, c, d) { 1047 return forkRef.refs[0] !== a || forkRef.refs[1] !== b || forkRef.refs[2] !== c || forkRef.refs[3] !== d; 1048 } 1049 function didChangeN(forkRef, newRefs) { 1050 return forkRef.refs.length !== newRefs.length || forkRef.refs.some((ref, index2) => ref !== newRefs[index2]); 1051 } 1052 function update(forkRef, refs) { 1053 forkRef.refs = refs; 1054 if (refs.every((ref) => ref == null)) { 1055 forkRef.callback = null; 1056 return; 1057 } 1058 forkRef.callback = (instance) => { 1059 if (forkRef.cleanup) { 1060 forkRef.cleanup(); 1061 forkRef.cleanup = null; 1062 } 1063 if (instance != null) { 1064 const cleanupCallbacks = Array(refs.length).fill(null); 1065 for (let i = 0; i < refs.length; i += 1) { 1066 const ref = refs[i]; 1067 if (ref == null) { 1068 continue; 1069 } 1070 switch (typeof ref) { 1071 case "function": { 1072 const refCleanup = ref(instance); 1073 if (typeof refCleanup === "function") { 1074 cleanupCallbacks[i] = refCleanup; 1075 } 1076 break; 1077 } 1078 case "object": { 1079 ref.current = instance; 1080 break; 1081 } 1082 default: 1083 } 1084 } 1085 forkRef.cleanup = () => { 1086 for (let i = 0; i < refs.length; i += 1) { 1087 const ref = refs[i]; 1088 if (ref == null) { 1089 continue; 1090 } 1091 switch (typeof ref) { 1092 case "function": { 1093 const cleanupCallback = cleanupCallbacks[i]; 1094 if (typeof cleanupCallback === "function") { 1095 cleanupCallback(); 1096 } else { 1097 ref(null); 1098 } 1099 break; 1100 } 1101 case "object": { 1102 ref.current = null; 1103 break; 1104 } 1105 default: 1106 } 1107 } 1108 }; 1109 } 1110 }; 1111 } 1112 1113 // node_modules/@base-ui/utils/getReactElementRef.mjs 1114 var React6 = __toESM(require_react(), 1); 1115 1116 // node_modules/@base-ui/utils/reactVersion.mjs 1117 var React5 = __toESM(require_react(), 1); 1118 var majorVersion = parseInt(React5.version, 10); 1119 function isReactVersionAtLeast(reactVersionToCheck) { 1120 return majorVersion >= reactVersionToCheck; 1121 } 1122 1123 // node_modules/@base-ui/utils/getReactElementRef.mjs 1124 function getReactElementRef(element) { 1125 if (!/* @__PURE__ */ React6.isValidElement(element)) { 1126 return null; 1127 } 1128 const reactElement = element; 1129 const propsWithRef = reactElement.props; 1130 return (isReactVersionAtLeast(19) ? propsWithRef?.ref : reactElement.ref) ?? null; 1131 } 1132 1133 // node_modules/@base-ui/utils/mergeObjects.mjs 1134 function mergeObjects(a, b) { 1135 if (a && !b) { 1136 return a; 1137 } 1138 if (!a && b) { 1139 return b; 1140 } 1141 if (a || b) { 1142 return { 1143 ...a, 1144 ...b 1145 }; 1146 } 1147 return void 0; 1148 } 1149 1150 // node_modules/@base-ui/utils/empty.mjs 1151 function NOOP() { 1152 } 1153 var EMPTY_ARRAY2 = Object.freeze([]); 1154 var EMPTY_OBJECT = Object.freeze({}); 1155 1156 // node_modules/@base-ui/react/internals/getStateAttributesProps.mjs 1157 function getStateAttributesProps(state, customMapping) { 1158 const props = {}; 1159 for (const key in state) { 1160 const value = state[key]; 1161 if (customMapping?.hasOwnProperty(key)) { 1162 const customProps = customMapping[key](value); 1163 if (customProps != null) { 1164 Object.assign(props, customProps); 1165 } 1166 continue; 1167 } 1168 if (value === true) { 1169 props[`data-$key.toLowerCase()}`] = ""; 1170 } else if (value) { 1171 props[`data-$key.toLowerCase()}`] = value.toString(); 1172 } 1173 } 1174 return props; 1175 } 1176 1177 // node_modules/@base-ui/react/utils/resolveClassName.mjs 1178 function resolveClassName(className, state) { 1179 return typeof className === "function" ? className(state) : className; 1180 } 1181 1182 // node_modules/@base-ui/react/utils/resolveStyle.mjs 1183 function resolveStyle(style, state) { 1184 return typeof style === "function" ? style(state) : style; 1185 } 1186 1187 // node_modules/@base-ui/react/merge-props/mergeProps.mjs 1188 var EMPTY_PROPS = {}; 1189 function mergeProps(a, b, c, d, e) { 1190 if (!c && !d && !e && !a) { 1191 return createInitialMergedProps(b); 1192 } 1193 let merged = createInitialMergedProps(a); 1194 if (b) { 1195 merged = mergeInto(merged, b); 1196 } 1197 if (c) { 1198 merged = mergeInto(merged, c); 1199 } 1200 if (d) { 1201 merged = mergeInto(merged, d); 1202 } 1203 if (e) { 1204 merged = mergeInto(merged, e); 1205 } 1206 return merged; 1207 } 1208 function mergePropsN(props) { 1209 if (props.length === 0) { 1210 return EMPTY_PROPS; 1211 } 1212 if (props.length === 1) { 1213 return createInitialMergedProps(props[0]); 1214 } 1215 let merged = createInitialMergedProps(props[0]); 1216 for (let i = 1; i < props.length; i += 1) { 1217 merged = mergeInto(merged, props[i]); 1218 } 1219 return merged; 1220 } 1221 function createInitialMergedProps(inputProps) { 1222 if (isPropsGetter(inputProps)) { 1223 return { 1224 ...resolvePropsGetter(inputProps, EMPTY_PROPS) 1225 }; 1226 } 1227 return copyInitialProps(inputProps); 1228 } 1229 function mergeInto(merged, inputProps) { 1230 if (isPropsGetter(inputProps)) { 1231 return resolvePropsGetter(inputProps, merged); 1232 } 1233 return mutablyMergeInto(merged, inputProps); 1234 } 1235 function copyInitialProps(inputProps) { 1236 const copiedProps = { 1237 ...inputProps 1238 }; 1239 for (const propName in copiedProps) { 1240 const propValue = copiedProps[propName]; 1241 if (isEventHandler(propName, propValue)) { 1242 copiedProps[propName] = wrapEventHandler(propValue); 1243 } 1244 } 1245 return copiedProps; 1246 } 1247 function mutablyMergeInto(mergedProps, externalProps) { 1248 if (!externalProps) { 1249 return mergedProps; 1250 } 1251 for (const propName in externalProps) { 1252 const externalPropValue = externalProps[propName]; 1253 switch (propName) { 1254 case "style": { 1255 mergedProps[propName] = mergeObjects(mergedProps.style, externalPropValue); 1256 break; 1257 } 1258 case "className": { 1259 mergedProps[propName] = mergeClassNames(mergedProps.className, externalPropValue); 1260 break; 1261 } 1262 default: { 1263 if (isEventHandler(propName, externalPropValue)) { 1264 mergedProps[propName] = mergeEventHandlers(mergedProps[propName], externalPropValue); 1265 } else { 1266 mergedProps[propName] = externalPropValue; 1267 } 1268 } 1269 } 1270 } 1271 return mergedProps; 1272 } 1273 function isEventHandler(key, value) { 1274 const code0 = key.charCodeAt(0); 1275 const code1 = key.charCodeAt(1); 1276 const code2 = key.charCodeAt(2); 1277 return code0 === 111 && code1 === 110 && code2 >= 65 && code2 <= 90 && (typeof value === "function" || typeof value === "undefined"); 1278 } 1279 function isPropsGetter(inputProps) { 1280 return typeof inputProps === "function"; 1281 } 1282 function resolvePropsGetter(inputProps, previousProps) { 1283 if (isPropsGetter(inputProps)) { 1284 return inputProps(previousProps); 1285 } 1286 return inputProps ?? EMPTY_PROPS; 1287 } 1288 function mergeEventHandlers(ourHandler, theirHandler) { 1289 if (!theirHandler) { 1290 return ourHandler; 1291 } 1292 if (!ourHandler) { 1293 return wrapEventHandler(theirHandler); 1294 } 1295 return (...args) => { 1296 const event = args[0]; 1297 if (isSyntheticEvent(event)) { 1298 const baseUIEvent = event; 1299 makeEventPreventable(baseUIEvent); 1300 const result2 = theirHandler(...args); 1301 if (!baseUIEvent.baseUIHandlerPrevented) { 1302 ourHandler?.(...args); 1303 } 1304 return result2; 1305 } 1306 const result = theirHandler(...args); 1307 ourHandler?.(...args); 1308 return result; 1309 }; 1310 } 1311 function wrapEventHandler(handler) { 1312 if (!handler) { 1313 return handler; 1314 } 1315 return (...args) => { 1316 const event = args[0]; 1317 if (isSyntheticEvent(event)) { 1318 makeEventPreventable(event); 1319 } 1320 return handler(...args); 1321 }; 1322 } 1323 function makeEventPreventable(event) { 1324 event.preventBaseUIHandler = () => { 1325 event.baseUIHandlerPrevented = true; 1326 }; 1327 return event; 1328 } 1329 function mergeClassNames(ourClassName, theirClassName) { 1330 if (theirClassName) { 1331 if (ourClassName) { 1332 return theirClassName + " " + ourClassName; 1333 } 1334 return theirClassName; 1335 } 1336 return ourClassName; 1337 } 1338 function isSyntheticEvent(event) { 1339 return event != null && typeof event === "object" && "nativeEvent" in event; 1340 } 1341 1342 // node_modules/@base-ui/react/internals/useRenderElement.mjs 1343 var import_react = __toESM(require_react(), 1); 1344 function useRenderElement(element, componentProps, params = {}) { 1345 const renderProp = componentProps.render; 1346 const outProps = useRenderElementProps(componentProps, params); 1347 if (params.enabled === false) { 1348 return null; 1349 } 1350 const state = params.state ?? EMPTY_OBJECT; 1351 return evaluateRenderProp(element, renderProp, outProps, state); 1352 } 1353 function useRenderElementProps(componentProps, params = {}) { 1354 const { 1355 className: classNameProp, 1356 style: styleProp, 1357 render: renderProp 1358 } = componentProps; 1359 const { 1360 state = EMPTY_OBJECT, 1361 ref, 1362 props, 1363 stateAttributesMapping: stateAttributesMapping3, 1364 enabled = true 1365 } = params; 1366 const className = enabled ? resolveClassName(classNameProp, state) : void 0; 1367 const style = enabled ? resolveStyle(styleProp, state) : void 0; 1368 const stateProps = enabled ? getStateAttributesProps(state, stateAttributesMapping3) : EMPTY_OBJECT; 1369 const resolvedProps = enabled && props ? resolveRenderFunctionProps(props) : void 0; 1370 const outProps = enabled ? mergeObjects(stateProps, resolvedProps) ?? {} : EMPTY_OBJECT; 1371 if (typeof document !== "undefined") { 1372 if (!enabled) { 1373 useMergedRefs(null, null); 1374 } else if (Array.isArray(ref)) { 1375 outProps.ref = useMergedRefsN([outProps.ref, getReactElementRef(renderProp), ...ref]); 1376 } else { 1377 outProps.ref = useMergedRefs(outProps.ref, getReactElementRef(renderProp), ref); 1378 } 1379 } 1380 if (!enabled) { 1381 return EMPTY_OBJECT; 1382 } 1383 if (className !== void 0) { 1384 outProps.className = mergeClassNames(outProps.className, className); 1385 } 1386 if (style !== void 0) { 1387 outProps.style = mergeObjects(outProps.style, style); 1388 } 1389 return outProps; 1390 } 1391 function resolveRenderFunctionProps(props) { 1392 if (Array.isArray(props)) { 1393 return mergePropsN(props); 1394 } 1395 return mergeProps(void 0, props); 1396 } 1397 var REACT_LAZY_TYPE = /* @__PURE__ */ Symbol.for("react.lazy"); 1398 var COMPONENT_IDENTIFIER_PATTERN = /^[A-Z][A-Za-z0-9$]*$/; 1399 var LOWERCASE_CHARACTER_PATTERN = /[a-z]/; 1400 function evaluateRenderProp(element, render, props, state) { 1401 if (render) { 1402 if (typeof render === "function") { 1403 if (true) { 1404 warnIfRenderPropLooksLikeComponent(render); 1405 } 1406 return render(props, state); 1407 } 1408 const mergedProps = mergeProps(props, render.props); 1409 mergedProps.ref = props.ref; 1410 let newElement = render; 1411 if (newElement?.$$typeof === REACT_LAZY_TYPE) { 1412 const children = React7.Children.toArray(render); 1413 newElement = children[0]; 1414 } 1415 if (true) { 1416 if (!/* @__PURE__ */ React7.isValidElement(newElement)) { 1417 throw new Error(["Base UI: The `render` prop was provided an invalid React element as `React.isValidElement(render)` is `false`.", "A valid React element must be provided to the `render` prop because it is cloned with props to replace the default element.", "https://base-ui.com/r/invalid-render-prop"].join("\n")); 1418 } 1419 } 1420 return /* @__PURE__ */ React7.cloneElement(newElement, mergedProps); 1421 } 1422 if (element) { 1423 if (typeof element === "string") { 1424 return renderTag(element, props); 1425 } 1426 } 1427 throw new Error(true ? "Base UI: Render element or function are not defined." : formatErrorMessage_default(8)); 1428 } 1429 function warnIfRenderPropLooksLikeComponent(renderFn) { 1430 const functionName = renderFn.name; 1431 if (functionName.length === 0) { 1432 return; 1433 } 1434 if (!COMPONENT_IDENTIFIER_PATTERN.test(functionName)) { 1435 return; 1436 } 1437 if (!LOWERCASE_CHARACTER_PATTERN.test(functionName)) { 1438 return; 1439 } 1440 warn(`The \`render\` prop received a function named \`$functionName}\` that starts with an uppercase letter.`, "This usually means a React component was passed directly as `render={Component}`.", "Base UI calls `render` as a plain function, which can break the Rules of Hooks during reconciliation.", "If this is an intentional render callback, rename it to start with a lowercase letter.", "Use `render={<Component />}` or `render={(props) => <Component {...props} />}` instead.", "https://base-ui.com/r/invalid-render-prop"); 1441 } 1442 function renderTag(Tag, props) { 1443 if (Tag === "button") { 1444 return /* @__PURE__ */ (0, import_react.createElement)("button", { 1445 type: "button", 1446 ...props, 1447 key: props.key 1448 }); 1449 } 1450 if (Tag === "img") { 1451 return /* @__PURE__ */ (0, import_react.createElement)("img", { 1452 alt: "", 1453 ...props, 1454 key: props.key 1455 }); 1456 } 1457 return /* @__PURE__ */ React7.createElement(Tag, props); 1458 } 1459 1460 // node_modules/@base-ui/utils/useId.mjs 1461 var React8 = __toESM(require_react(), 1); 1462 var globalId = 0; 1463 function useGlobalId(idOverride, prefix = "mui") { 1464 const [defaultId, setDefaultId] = React8.useState(idOverride); 1465 const id = idOverride || defaultId; 1466 React8.useEffect(() => { 1467 if (defaultId == null) { 1468 globalId += 1; 1469 setDefaultId(`$prefix}-$globalId}`); 1470 } 1471 }, [defaultId, prefix]); 1472 return id; 1473 } 1474 var maybeReactUseId = SafeReact.useId; 1475 function useId(idOverride, prefix) { 1476 if (maybeReactUseId !== void 0) { 1477 const reactId = maybeReactUseId(); 1478 return idOverride ?? (prefix ? `$prefix}-$reactId}` : reactId); 1479 } 1480 return useGlobalId(idOverride, prefix); 1481 } 1482 1483 // node_modules/@base-ui/react/internals/useBaseUiId.mjs 1484 function useBaseUiId(idOverride) { 1485 return useId(idOverride, "base-ui"); 1486 } 1487 1488 // node_modules/@base-ui/react/internals/reason-parts.mjs 1489 var reason_parts_exports = {}; 1490 __export(reason_parts_exports, { 1491 cancelOpen: () => cancelOpen, 1492 chipRemovePress: () => chipRemovePress, 1493 clearPress: () => clearPress, 1494 closePress: () => closePress, 1495 closeWatcher: () => closeWatcher, 1496 decrementPress: () => decrementPress, 1497 disabled: () => disabled, 1498 drag: () => drag, 1499 escapeKey: () => escapeKey, 1500 focusOut: () => focusOut, 1501 imperativeAction: () => imperativeAction, 1502 incrementPress: () => incrementPress, 1503 initial: () => initial, 1504 inputBlur: () => inputBlur, 1505 inputChange: () => inputChange, 1506 inputClear: () => inputClear, 1507 inputPaste: () => inputPaste, 1508 inputPress: () => inputPress, 1509 itemPress: () => itemPress, 1510 keyboard: () => keyboard, 1511 linkPress: () => linkPress, 1512 listNavigation: () => listNavigation, 1513 missing: () => missing, 1514 none: () => none, 1515 outsidePress: () => outsidePress, 1516 pointer: () => pointer, 1517 scrub: () => scrub, 1518 siblingOpen: () => siblingOpen, 1519 swipe: () => swipe, 1520 trackPress: () => trackPress, 1521 triggerFocus: () => triggerFocus, 1522 triggerHover: () => triggerHover, 1523 triggerPress: () => triggerPress, 1524 wheel: () => wheel, 1525 windowResize: () => windowResize 1526 }); 1527 var none = "none"; 1528 var triggerPress = "trigger-press"; 1529 var triggerHover = "trigger-hover"; 1530 var triggerFocus = "trigger-focus"; 1531 var outsidePress = "outside-press"; 1532 var itemPress = "item-press"; 1533 var closePress = "close-press"; 1534 var linkPress = "link-press"; 1535 var clearPress = "clear-press"; 1536 var chipRemovePress = "chip-remove-press"; 1537 var trackPress = "track-press"; 1538 var incrementPress = "increment-press"; 1539 var decrementPress = "decrement-press"; 1540 var inputChange = "input-change"; 1541 var inputClear = "input-clear"; 1542 var inputBlur = "input-blur"; 1543 var inputPaste = "input-paste"; 1544 var inputPress = "input-press"; 1545 var focusOut = "focus-out"; 1546 var escapeKey = "escape-key"; 1547 var closeWatcher = "close-watcher"; 1548 var listNavigation = "list-navigation"; 1549 var keyboard = "keyboard"; 1550 var pointer = "pointer"; 1551 var drag = "drag"; 1552 var wheel = "wheel"; 1553 var scrub = "scrub"; 1554 var cancelOpen = "cancel-open"; 1555 var siblingOpen = "sibling-open"; 1556 var disabled = "disabled"; 1557 var missing = "missing"; 1558 var initial = "initial"; 1559 var imperativeAction = "imperative-action"; 1560 var swipe = "swipe"; 1561 var windowResize = "window-resize"; 1562 1563 // node_modules/@base-ui/react/internals/createBaseUIEventDetails.mjs 1564 function createChangeEventDetails(reason, event, trigger, customProperties) { 1565 let canceled = false; 1566 let allowPropagation = false; 1567 const custom = customProperties ?? EMPTY_OBJECT; 1568 const details = { 1569 reason, 1570 event: event ?? new Event("base-ui"), 1571 cancel() { 1572 canceled = true; 1573 }, 1574 allowPropagation() { 1575 allowPropagation = true; 1576 }, 1577 get isCanceled() { 1578 return canceled; 1579 }, 1580 get isPropagationAllowed() { 1581 return allowPropagation; 1582 }, 1583 trigger, 1584 ...custom 1585 }; 1586 return details; 1587 } 1588 1589 // node_modules/@base-ui/react/internals/useTransitionStatus.mjs 1590 var React10 = __toESM(require_react(), 1); 1591 1592 // node_modules/@base-ui/utils/useOnMount.mjs 1593 var React9 = __toESM(require_react(), 1); 1594 var EMPTY = []; 1595 function useOnMount(fn) { 1596 React9.useEffect(fn, EMPTY); 1597 } 1598 1599 // node_modules/@base-ui/utils/useAnimationFrame.mjs 1600 var EMPTY2 = null; 1601 var LAST_RAF = globalThis.requestAnimationFrame; 1602 var Scheduler = class { 1603 /* This implementation uses an array as a backing data-structure for frame callbacks. 1604 * It allows `O(1)` callback cancelling by inserting a `null` in the array, though it 1605 * never calls the native `cancelAnimationFrame` if there are no frames left. This can 1606 * be much more efficient if there is a call pattern that alterns as 1607 * "request-cancel-request-cancel-…". 1608 * But in the case of "request-request-…-cancel-cancel-…", it leaves the final animation 1609 * frame to run anyway. We turn that frame into a `O(1)` no-op via `callbacksCount`. */ 1610 callbacks = []; 1611 callbacksCount = 0; 1612 nextId = 1; 1613 startId = 1; 1614 isScheduled = false; 1615 tick = (timestamp) => { 1616 this.isScheduled = false; 1617 const currentCallbacks = this.callbacks; 1618 const currentCallbacksCount = this.callbacksCount; 1619 this.callbacks = []; 1620 this.callbacksCount = 0; 1621 this.startId = this.nextId; 1622 if (currentCallbacksCount > 0) { 1623 for (let i = 0; i < currentCallbacks.length; i += 1) { 1624 currentCallbacks[i]?.(timestamp); 1625 } 1626 } 1627 }; 1628 request(fn) { 1629 const id = this.nextId; 1630 this.nextId += 1; 1631 this.callbacks.push(fn); 1632 this.callbacksCount += 1; 1633 const didRAFChange = LAST_RAF !== requestAnimationFrame && (LAST_RAF = requestAnimationFrame, true); 1634 if (!this.isScheduled || didRAFChange) { 1635 requestAnimationFrame(this.tick); 1636 this.isScheduled = true; 1637 } 1638 return id; 1639 } 1640 cancel(id) { 1641 const index2 = id - this.startId; 1642 if (index2 < 0 || index2 >= this.callbacks.length) { 1643 return; 1644 } 1645 this.callbacks[index2] = null; 1646 this.callbacksCount -= 1; 1647 } 1648 }; 1649 var scheduler = new Scheduler(); 1650 var AnimationFrame = class _AnimationFrame { 1651 static create() { 1652 return new _AnimationFrame(); 1653 } 1654 static request(fn) { 1655 return scheduler.request(fn); 1656 } 1657 static cancel(id) { 1658 return scheduler.cancel(id); 1659 } 1660 currentId = EMPTY2; 1661 /** 1662 * Executes `fn` after `delay`, clearing any previously scheduled call. 1663 */ 1664 request(fn) { 1665 this.cancel(); 1666 this.currentId = scheduler.request(() => { 1667 this.currentId = EMPTY2; 1668 fn(); 1669 }); 1670 } 1671 cancel = () => { 1672 if (this.currentId !== EMPTY2) { 1673 scheduler.cancel(this.currentId); 1674 this.currentId = EMPTY2; 1675 } 1676 }; 1677 disposeEffect = () => { 1678 return this.cancel; 1679 }; 1680 }; 1681 function useAnimationFrame() { 1682 const timeout = useRefWithInit(AnimationFrame.create).current; 1683 useOnMount(timeout.disposeEffect); 1684 return timeout; 1685 } 1686 1687 // node_modules/@base-ui/react/internals/useTransitionStatus.mjs 1688 function useTransitionStatus(open, enableIdleState = false, deferEndingState = false) { 1689 const [transitionStatus, setTransitionStatus] = React10.useState(open && enableIdleState ? "idle" : void 0); 1690 const [mounted, setMounted] = React10.useState(open); 1691 if (open && !mounted) { 1692 setMounted(true); 1693 setTransitionStatus("starting"); 1694 } 1695 if (!open && mounted && transitionStatus !== "ending" && !deferEndingState) { 1696 setTransitionStatus("ending"); 1697 } 1698 if (!open && !mounted && transitionStatus === "ending") { 1699 setTransitionStatus(void 0); 1700 } 1701 useIsoLayoutEffect(() => { 1702 if (!open && mounted && transitionStatus !== "ending" && deferEndingState) { 1703 const frame = AnimationFrame.request(() => { 1704 setTransitionStatus("ending"); 1705 }); 1706 return () => { 1707 AnimationFrame.cancel(frame); 1708 }; 1709 } 1710 return void 0; 1711 }, [open, mounted, transitionStatus, deferEndingState]); 1712 useIsoLayoutEffect(() => { 1713 if (!open || enableIdleState) { 1714 return void 0; 1715 } 1716 const frame = AnimationFrame.request(() => { 1717 setTransitionStatus(void 0); 1718 }); 1719 return () => { 1720 AnimationFrame.cancel(frame); 1721 }; 1722 }, [enableIdleState, open]); 1723 useIsoLayoutEffect(() => { 1724 if (!open || !enableIdleState) { 1725 return void 0; 1726 } 1727 if (open && mounted && transitionStatus !== "idle") { 1728 setTransitionStatus("starting"); 1729 } 1730 const frame = AnimationFrame.request(() => { 1731 setTransitionStatus("idle"); 1732 }); 1733 return () => { 1734 AnimationFrame.cancel(frame); 1735 }; 1736 }, [enableIdleState, open, mounted, transitionStatus]); 1737 return { 1738 mounted, 1739 setMounted, 1740 transitionStatus 1741 }; 1742 } 1743 1744 // node_modules/@base-ui/react/internals/stateAttributesMapping.mjs 1745 var TransitionStatusDataAttributes = /* @__PURE__ */ (function(TransitionStatusDataAttributes2) { 1746 TransitionStatusDataAttributes2["startingStyle"] = "data-starting-style"; 1747 TransitionStatusDataAttributes2["endingStyle"] = "data-ending-style"; 1748 return TransitionStatusDataAttributes2; 1749 })({}); 1750 var STARTING_HOOK = { 1751 [TransitionStatusDataAttributes.startingStyle]: "" 1752 }; 1753 var ENDING_HOOK = { 1754 [TransitionStatusDataAttributes.endingStyle]: "" 1755 }; 1756 var transitionStatusMapping = { 1757 transitionStatus(value) { 1758 if (value === "starting") { 1759 return STARTING_HOOK; 1760 } 1761 if (value === "ending") { 1762 return ENDING_HOOK; 1763 } 1764 return null; 1765 } 1766 }; 1767 1768 // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs 1769 function hasWindow() { 1770 return typeof window !== "undefined"; 1771 } 1772 function getNodeName(node) { 1773 if (isNode(node)) { 1774 return (node.nodeName || "").toLowerCase(); 1775 } 1776 return "#document"; 1777 } 1778 function getWindow(node) { 1779 var _node$ownerDocument; 1780 return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; 1781 } 1782 function getDocumentElement(node) { 1783 var _ref; 1784 return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; 1785 } 1786 function isNode(value) { 1787 if (!hasWindow()) { 1788 return false; 1789 } 1790 return value instanceof Node || value instanceof getWindow(value).Node; 1791 } 1792 function isElement(value) { 1793 if (!hasWindow()) { 1794 return false; 1795 } 1796 return value instanceof Element || value instanceof getWindow(value).Element; 1797 } 1798 function isHTMLElement(value) { 1799 if (!hasWindow()) { 1800 return false; 1801 } 1802 return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; 1803 } 1804 function isShadowRoot(value) { 1805 if (!hasWindow() || typeof ShadowRoot === "undefined") { 1806 return false; 1807 } 1808 return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; 1809 } 1810 function isOverflowElement(element) { 1811 const { 1812 overflow, 1813 overflowX, 1814 overflowY, 1815 display 1816 } = getComputedStyle2(element); 1817 return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && display !== "inline" && display !== "contents"; 1818 } 1819 function isTableElement(element) { 1820 return /^(table|td|th)$/.test(getNodeName(element)); 1821 } 1822 function isTopLayer(element) { 1823 try { 1824 if (element.matches(":popover-open")) { 1825 return true; 1826 } 1827 } catch (_e) { 1828 } 1829 try { 1830 return element.matches(":modal"); 1831 } catch (_e) { 1832 return false; 1833 } 1834 } 1835 var willChangeRe = /transform|translate|scale|rotate|perspective|filter/; 1836 var containRe = /paint|layout|strict|content/; 1837 var isNotNone = (value) => !!value && value !== "none"; 1838 var isWebKitValue; 1839 function isContainingBlock(elementOrCss) { 1840 const css = isElement(elementOrCss) ? getComputedStyle2(elementOrCss) : elementOrCss; 1841 return isNotNone(css.transform) || isNotNone(css.translate) || isNotNone(css.scale) || isNotNone(css.rotate) || isNotNone(css.perspective) || !isWebKit() && (isNotNone(css.backdropFilter) || isNotNone(css.filter)) || willChangeRe.test(css.willChange || "") || containRe.test(css.contain || ""); 1842 } 1843 function getContainingBlock(element) { 1844 let currentNode = getParentNode(element); 1845 while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { 1846 if (isContainingBlock(currentNode)) { 1847 return currentNode; 1848 } else if (isTopLayer(currentNode)) { 1849 return null; 1850 } 1851 currentNode = getParentNode(currentNode); 1852 } 1853 return null; 1854 } 1855 function isWebKit() { 1856 if (isWebKitValue == null) { 1857 isWebKitValue = typeof CSS !== "undefined" && CSS.supports && CSS.supports("-webkit-backdrop-filter", "none"); 1858 } 1859 return isWebKitValue; 1860 } 1861 function isLastTraversableNode(node) { 1862 return /^(html|body|#document)$/.test(getNodeName(node)); 1863 } 1864 function getComputedStyle2(element) { 1865 return getWindow(element).getComputedStyle(element); 1866 } 1867 function getNodeScroll(element) { 1868 if (isElement(element)) { 1869 return { 1870 scrollLeft: element.scrollLeft, 1871 scrollTop: element.scrollTop 1872 }; 1873 } 1874 return { 1875 scrollLeft: element.scrollX, 1876 scrollTop: element.scrollY 1877 }; 1878 } 1879 function getParentNode(node) { 1880 if (getNodeName(node) === "html") { 1881 return node; 1882 } 1883 const result = ( 1884 // Step into the shadow DOM of the parent of a slotted node. 1885 node.assignedSlot || // DOM Element detected. 1886 node.parentNode || // ShadowRoot detected. 1887 isShadowRoot(node) && node.host || // Fallback. 1888 getDocumentElement(node) 1889 ); 1890 return isShadowRoot(result) ? result.host : result; 1891 } 1892 function getNearestOverflowAncestor(node) { 1893 const parentNode = getParentNode(node); 1894 if (isLastTraversableNode(parentNode)) { 1895 return node.ownerDocument ? node.ownerDocument.body : node.body; 1896 } 1897 if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { 1898 return parentNode; 1899 } 1900 return getNearestOverflowAncestor(parentNode); 1901 } 1902 function getOverflowAncestors(node, list, traverseIframes) { 1903 var _node$ownerDocument2; 1904 if (list === void 0) { 1905 list = []; 1906 } 1907 if (traverseIframes === void 0) { 1908 traverseIframes = true; 1909 } 1910 const scrollableAncestor = getNearestOverflowAncestor(node); 1911 const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); 1912 const win = getWindow(scrollableAncestor); 1913 if (isBody) { 1914 const frameElement = getFrameElement(win); 1915 return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); 1916 } else { 1917 return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); 1918 } 1919 } 1920 function getFrameElement(win) { 1921 return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; 1922 } 1923 1924 // node_modules/@base-ui/utils/addEventListener.mjs 1925 function addEventListener(target, type, listener, options) { 1926 target.addEventListener(type, listener, options); 1927 return () => { 1928 target.removeEventListener(type, listener, options); 1929 }; 1930 } 1931 1932 // node_modules/@base-ui/utils/useValueAsRef.mjs 1933 function useValueAsRef(value) { 1934 const latest = useRefWithInit(createLatestRef, value).current; 1935 latest.next = value; 1936 useIsoLayoutEffect(latest.effect); 1937 return latest; 1938 } 1939 function createLatestRef(value) { 1940 const latest = { 1941 current: value, 1942 next: value, 1943 effect: () => { 1944 latest.current = latest.next; 1945 } 1946 }; 1947 return latest; 1948 } 1949 1950 // node_modules/@base-ui/utils/owner.mjs 1951 function ownerDocument(node) { 1952 return node?.ownerDocument || document; 1953 } 1954 1955 // node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs 1956 var React11 = __toESM(require_react(), 1); 1957 1958 // node_modules/@base-ui/react/internals/useAnimationsFinished.mjs 1959 var ReactDOM = __toESM(require_react_dom(), 1); 1960 1961 // node_modules/@base-ui/react/utils/resolveRef.mjs 1962 function resolveRef(maybeRef) { 1963 if (maybeRef == null) { 1964 return maybeRef; 1965 } 1966 return "current" in maybeRef ? maybeRef.current : maybeRef; 1967 } 1968 1969 // node_modules/@base-ui/react/internals/useAnimationsFinished.mjs 1970 function useAnimationsFinished(elementOrRef, waitForStartingStyleRemoved = false, treatAbortedAsFinished = true) { 1971 const frame = useAnimationFrame(); 1972 return useStableCallback((fnToExecute, signal = null) => { 1973 frame.cancel(); 1974 const element = resolveRef(elementOrRef); 1975 if (element == null) { 1976 return; 1977 } 1978 const resolvedElement = element; 1979 const done = () => { 1980 ReactDOM.flushSync(fnToExecute); 1981 }; 1982 if (typeof resolvedElement.getAnimations !== "function" || globalThis.BASE_UI_ANIMATIONS_DISABLED) { 1983 fnToExecute(); 1984 return; 1985 } 1986 function exec() { 1987 Promise.all(resolvedElement.getAnimations().map((animation) => animation.finished)).then(() => { 1988 if (!signal?.aborted) { 1989 done(); 1990 } 1991 }).catch(() => { 1992 if (treatAbortedAsFinished) { 1993 if (!signal?.aborted) { 1994 done(); 1995 } 1996 return; 1997 } 1998 const currentAnimations = resolvedElement.getAnimations(); 1999 if (!signal?.aborted && currentAnimations.length > 0 && currentAnimations.some((animation) => animation.pending || animation.playState !== "finished")) { 2000 exec(); 2001 } 2002 }); 2003 } 2004 if (waitForStartingStyleRemoved) { 2005 const startingStyleAttribute = TransitionStatusDataAttributes.startingStyle; 2006 if (!resolvedElement.hasAttribute(startingStyleAttribute)) { 2007 frame.request(exec); 2008 return; 2009 } 2010 const attributeObserver = new MutationObserver(() => { 2011 if (!resolvedElement.hasAttribute(startingStyleAttribute)) { 2012 attributeObserver.disconnect(); 2013 exec(); 2014 } 2015 }); 2016 attributeObserver.observe(resolvedElement, { 2017 attributes: true, 2018 attributeFilter: [startingStyleAttribute] 2019 }); 2020 signal?.addEventListener("abort", () => attributeObserver.disconnect(), { 2021 once: true 2022 }); 2023 return; 2024 } 2025 frame.request(exec); 2026 }); 2027 } 2028 2029 // node_modules/@base-ui/react/internals/useOpenChangeComplete.mjs 2030 function useOpenChangeComplete(parameters) { 2031 const { 2032 enabled = true, 2033 open, 2034 ref, 2035 onComplete: onCompleteParam 2036 } = parameters; 2037 const onComplete = useStableCallback(onCompleteParam); 2038 const runOnceAnimationsFinish = useAnimationsFinished(ref, open, false); 2039 React11.useEffect(() => { 2040 if (!enabled) { 2041 return void 0; 2042 } 2043 const abortController = new AbortController(); 2044 runOnceAnimationsFinish(onComplete, abortController.signal); 2045 return () => { 2046 abortController.abort(); 2047 }; 2048 }, [enabled, open, onComplete, runOnceAnimationsFinish]); 2049 } 2050 2051 // node_modules/@base-ui/utils/useOnFirstRender.mjs 2052 var React12 = __toESM(require_react(), 1); 2053 function useOnFirstRender(fn) { 2054 const ref = React12.useRef(true); 2055 if (ref.current) { 2056 ref.current = false; 2057 fn(); 2058 } 2059 } 2060 2061 // node_modules/@base-ui/utils/platform/parts.mjs 2062 var parts_exports = {}; 2063 __export(parts_exports, { 2064 engine: () => engine_exports, 2065 env: () => env_exports, 2066 os: () => os_exports, 2067 screenReader: () => screen_reader_exports 2068 }); 2069 2070 // node_modules/@base-ui/utils/platform/os.mjs 2071 var os_exports = {}; 2072 __export(os_exports, { 2073 android: () => android, 2074 apple: () => apple, 2075 ios: () => ios, 2076 linux: () => linux, 2077 mac: () => mac, 2078 windows: () => windows 2079 }); 2080 2081 // node_modules/@base-ui/utils/platform/shared.mjs 2082 function readRawData() { 2083 if (typeof navigator === "undefined") { 2084 return { 2085 userAgent: "", 2086 platform: "", 2087 maxTouchPoints: 0 2088 }; 2089 } 2090 if (true) { 2091 const uaData = navigator.userAgentData; 2092 if (uaData && Array.isArray(uaData.brands)) { 2093 return { 2094 userAgent: uaData.brands.map(({ 2095 brand, 2096 version: version2 2097 }) => `$brand}/$version2}`).join(" "), 2098 platform: uaData.platform ?? navigator.platform ?? "", 2099 maxTouchPoints: navigator.maxTouchPoints ?? 0 2100 }; 2101 } 2102 } 2103 return { 2104 userAgent: navigator.userAgent, 2105 platform: navigator.platform ?? "", 2106 maxTouchPoints: navigator.maxTouchPoints ?? 0 2107 }; 2108 } 2109 var { 2110 userAgent, 2111 platform, 2112 maxTouchPoints 2113 } = readRawData(); 2114 var lowerUserAgent = userAgent.toLowerCase(); 2115 var lowerPlatform = platform.toLowerCase(); 2116 2117 // node_modules/@base-ui/utils/platform/os.mjs 2118 var ios = /^i(os$|p)/.test(lowerPlatform) || lowerPlatform === "macintel" && maxTouchPoints > 1; 2119 var ANDROID_STRING = "android"; 2120 var android = lowerPlatform === ANDROID_STRING || lowerUserAgent.includes(ANDROID_STRING); 2121 var mac = !ios && lowerPlatform.startsWith("mac"); 2122 var windows = lowerPlatform.startsWith("win"); 2123 var linux = !android && /^(linux|chrome os)/.test(lowerPlatform); 2124 var apple = mac || ios; 2125 2126 // node_modules/@base-ui/utils/platform/engine.mjs 2127 var engine_exports = {}; 2128 __export(engine_exports, { 2129 blink: () => blink, 2130 gecko: () => gecko, 2131 webkit: () => webkit 2132 }); 2133 var webkit = typeof CSS !== "undefined" && !!CSS.supports?.("-webkit-backdrop-filter:none"); 2134 var gecko = !webkit && lowerUserAgent.includes("firefox"); 2135 var blink = !webkit && lowerUserAgent.includes("chrom"); 2136 2137 // node_modules/@base-ui/utils/platform/screen-reader.mjs 2138 var screen_reader_exports = {}; 2139 __export(screen_reader_exports, { 2140 voiceOver: () => voiceOver 2141 }); 2142 var voiceOver = apple; 2143 2144 // node_modules/@base-ui/utils/platform/env.mjs 2145 var env_exports = {}; 2146 __export(env_exports, { 2147 jsdom: () => jsdom 2148 }); 2149 var jsdom = /jsdom|happydom/.test(lowerUserAgent); 2150 2151 // node_modules/@base-ui/utils/useTimeout.mjs 2152 var EMPTY3 = 0; 2153 var Timeout = class _Timeout { 2154 static create() { 2155 return new _Timeout(); 2156 } 2157 currentId = EMPTY3; 2158 /** 2159 * Executes `fn` after `delay`, clearing any previously scheduled call. 2160 */ 2161 start(delay, fn) { 2162 this.clear(); 2163 this.currentId = setTimeout(() => { 2164 this.currentId = EMPTY3; 2165 fn(); 2166 }, delay); 2167 } 2168 isStarted() { 2169 return this.currentId !== EMPTY3; 2170 } 2171 clear = () => { 2172 if (this.currentId !== EMPTY3) { 2173 clearTimeout(this.currentId); 2174 this.currentId = EMPTY3; 2175 } 2176 }; 2177 disposeEffect = () => { 2178 return this.clear; 2179 }; 2180 }; 2181 function useTimeout() { 2182 const timeout = useRefWithInit(Timeout.create).current; 2183 useOnMount(timeout.disposeEffect); 2184 return timeout; 2185 } 2186 2187 // node_modules/@base-ui/react/floating-ui-react/components/FloatingDelayGroup.mjs 2188 var React13 = __toESM(require_react(), 1); 2189 2190 // node_modules/@base-ui/react/floating-ui-react/utils/event.mjs 2191 function isReactEvent(event) { 2192 return "nativeEvent" in event; 2193 } 2194 function isMouseLikePointerType(pointerType, strict) { 2195 const values = ["mouse", "pen"]; 2196 if (!strict) { 2197 values.push("", void 0); 2198 } 2199 return values.includes(pointerType); 2200 } 2201 function isClickLikeEvent(event) { 2202 const type = event.type; 2203 return type === "click" || type === "mousedown" || type === "keydown" || type === "keyup"; 2204 } 2205 2206 // node_modules/@base-ui/react/floating-ui-react/utils/constants.mjs 2207 var FOCUSABLE_ATTRIBUTE = "data-base-ui-focusable"; 2208 var TYPEABLE_SELECTOR = "input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])"; 2209 2210 // node_modules/@base-ui/react/internals/shadowDom.mjs 2211 function activeElement(doc) { 2212 let element = doc.activeElement; 2213 while (element?.shadowRoot?.activeElement != null) { 2214 element = element.shadowRoot.activeElement; 2215 } 2216 return element; 2217 } 2218 function contains(parent, child) { 2219 if (!parent || !child) { 2220 return false; 2221 } 2222 const rootNode = child.getRootNode?.(); 2223 if (parent.contains(child)) { 2224 return true; 2225 } 2226 if (rootNode && isShadowRoot(rootNode)) { 2227 let next = child; 2228 while (next) { 2229 if (parent === next) { 2230 return true; 2231 } 2232 next = next.parentNode || next.host; 2233 } 2234 } 2235 return false; 2236 } 2237 function getTarget(event) { 2238 if ("composedPath" in event) { 2239 return event.composedPath()[0]; 2240 } 2241 return event.target; 2242 } 2243 2244 // node_modules/@base-ui/react/floating-ui-react/utils/element.mjs 2245 function isTargetInsideEnabledTrigger(target, triggerElements) { 2246 if (!isElement(target)) { 2247 return false; 2248 } 2249 const targetElement = target; 2250 if (triggerElements.hasElement(targetElement)) { 2251 return !targetElement.hasAttribute("data-trigger-disabled"); 2252 } 2253 for (const [, trigger] of triggerElements.entries()) { 2254 if (contains(trigger, targetElement)) { 2255 return !trigger.hasAttribute("data-trigger-disabled"); 2256 } 2257 } 2258 return false; 2259 } 2260 function isEventTargetWithin(event, node) { 2261 if (node == null) { 2262 return false; 2263 } 2264 if ("composedPath" in event) { 2265 return event.composedPath().includes(node); 2266 } 2267 const eventAgain = event; 2268 return eventAgain.target != null && node.contains(eventAgain.target); 2269 } 2270 function isRootElement(element) { 2271 return element.matches("html,body"); 2272 } 2273 function isTypeableElement(element) { 2274 return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR); 2275 } 2276 function isInteractiveElement(element) { 2277 return element?.closest(`button,a[href],[role="button"],select,[tabindex]:not([tabindex="-1"]),$TYPEABLE_SELECTOR}`) != null; 2278 } 2279 function matchesFocusVisible(element) { 2280 if (!element || parts_exports.env.jsdom) { 2281 return true; 2282 } 2283 try { 2284 return element.matches(":focus-visible"); 2285 } catch (_e) { 2286 return true; 2287 } 2288 } 2289 2290 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverShared.mjs 2291 function resolveValue(value, pointerType) { 2292 if (pointerType != null && !isMouseLikePointerType(pointerType)) { 2293 return 0; 2294 } 2295 if (typeof value === "function") { 2296 return value(); 2297 } 2298 return value; 2299 } 2300 function getDelay(value, prop, pointerType) { 2301 const result = resolveValue(value, pointerType); 2302 if (typeof result === "number") { 2303 return result; 2304 } 2305 return result?.[prop]; 2306 } 2307 function getRestMs(value) { 2308 if (typeof value === "function") { 2309 return value(); 2310 } 2311 return value; 2312 } 2313 function isClickLikeOpenEvent(openEventType, interactedInside) { 2314 return interactedInside || openEventType === "click" || openEventType === "mousedown"; 2315 } 2316 function isHoverOpenEvent(openEventType) { 2317 return openEventType?.includes("mouse") && openEventType !== "mousedown"; 2318 } 2319 2320 // node_modules/@base-ui/react/floating-ui-react/components/FloatingDelayGroup.mjs 2321 var import_jsx_runtime = __toESM(require_jsx_runtime(), 1); 2322 var FloatingDelayGroupContext = /* @__PURE__ */ React13.createContext({ 2323 hasProvider: false, 2324 timeoutMs: 0, 2325 delayRef: { 2326 current: 0 2327 }, 2328 initialDelayRef: { 2329 current: 0 2330 }, 2331 timeout: new Timeout(), 2332 currentIdRef: { 2333 current: null 2334 }, 2335 currentContextRef: { 2336 current: null 2337 } 2338 }); 2339 if (true) FloatingDelayGroupContext.displayName = "FloatingDelayGroupContext"; 2340 function resetDelayRef(delayRef, initialDelayRef) { 2341 delayRef.current = initialDelayRef.current; 2342 } 2343 function FloatingDelayGroup(props) { 2344 const { 2345 children, 2346 delay, 2347 timeoutMs = 0 2348 } = props; 2349 const delayRef = React13.useRef(delay); 2350 const initialDelayRef = React13.useRef(delay); 2351 const currentIdRef = React13.useRef(null); 2352 const currentContextRef = React13.useRef(null); 2353 const timeout = useTimeout(); 2354 useIsoLayoutEffect(() => { 2355 initialDelayRef.current = delay; 2356 if (!currentIdRef.current) { 2357 delayRef.current = delay; 2358 return; 2359 } 2360 delayRef.current = { 2361 open: getDelay(delayRef.current, "open"), 2362 close: getDelay(delay, "close") 2363 }; 2364 }, [delay, currentIdRef, delayRef, initialDelayRef]); 2365 return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FloatingDelayGroupContext.Provider, { 2366 value: React13.useMemo(() => ({ 2367 hasProvider: true, 2368 delayRef, 2369 initialDelayRef, 2370 currentIdRef, 2371 timeoutMs, 2372 currentContextRef, 2373 timeout 2374 }), [timeoutMs, timeout]), 2375 children 2376 }); 2377 } 2378 function useDelayGroup(context, options = { 2379 open: false 2380 }) { 2381 const { 2382 open 2383 } = options; 2384 const store2 = "rootStore" in context ? context.rootStore : context; 2385 const floatingId = store2.useState("floatingId"); 2386 const groupContext = React13.useContext(FloatingDelayGroupContext); 2387 const { 2388 currentIdRef, 2389 delayRef, 2390 timeoutMs, 2391 initialDelayRef, 2392 currentContextRef, 2393 hasProvider, 2394 timeout 2395 } = groupContext; 2396 const [isInstantPhase, setIsInstantPhase] = React13.useState(false); 2397 const openRef = React13.useRef(open); 2398 const isUnmountedRef = React13.useRef(false); 2399 useIsoLayoutEffect(() => { 2400 openRef.current = open; 2401 }, [open]); 2402 useIsoLayoutEffect(() => { 2403 return () => { 2404 isUnmountedRef.current = true; 2405 }; 2406 }, []); 2407 useIsoLayoutEffect(() => { 2408 function unset() { 2409 if (!isUnmountedRef.current) { 2410 setIsInstantPhase(false); 2411 } 2412 currentContextRef.current?.setIsInstantPhase(false); 2413 currentIdRef.current = null; 2414 currentContextRef.current = null; 2415 delayRef.current = initialDelayRef.current; 2416 timeout.clear(); 2417 } 2418 if (!currentIdRef.current) { 2419 return void 0; 2420 } 2421 if (!open && currentIdRef.current === floatingId) { 2422 setIsInstantPhase(false); 2423 if (timeoutMs) { 2424 const closingId = floatingId; 2425 timeout.start(timeoutMs, () => { 2426 if (store2.select("open") || currentIdRef.current && currentIdRef.current !== closingId) { 2427 return; 2428 } 2429 unset(); 2430 }); 2431 return () => { 2432 if (openRef.current || currentIdRef.current !== closingId) { 2433 timeout.clear(); 2434 } 2435 }; 2436 } 2437 unset(); 2438 } 2439 return void 0; 2440 }, [open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeout, store2]); 2441 useIsoLayoutEffect(() => { 2442 if (!open) { 2443 return; 2444 } 2445 const prevContext = currentContextRef.current; 2446 const prevId = currentIdRef.current; 2447 timeout.clear(); 2448 currentContextRef.current = { 2449 onOpenChange: store2.setOpen, 2450 setIsInstantPhase 2451 }; 2452 currentIdRef.current = floatingId; 2453 delayRef.current = { 2454 open: 0, 2455 close: getDelay(initialDelayRef.current, "close") 2456 }; 2457 if (prevId !== null && prevId !== floatingId) { 2458 setIsInstantPhase(true); 2459 prevContext?.setIsInstantPhase(true); 2460 prevContext?.onOpenChange(false, createChangeEventDetails(reason_parts_exports.none)); 2461 } else { 2462 setIsInstantPhase(false); 2463 prevContext?.setIsInstantPhase(false); 2464 } 2465 }, [open, floatingId, store2, currentIdRef, delayRef, initialDelayRef, currentContextRef, timeout]); 2466 useIsoLayoutEffect(() => { 2467 return () => { 2468 if (currentIdRef.current === floatingId) { 2469 currentContextRef.current = null; 2470 if (!openRef.current) { 2471 return; 2472 } 2473 currentIdRef.current = null; 2474 resetDelayRef(delayRef, initialDelayRef); 2475 timeout.clear(); 2476 } 2477 }; 2478 }, [currentContextRef, currentIdRef, delayRef, floatingId, initialDelayRef, timeout]); 2479 return React13.useMemo(() => ({ 2480 hasProvider, 2481 delayRef, 2482 isInstantPhase 2483 }), [hasProvider, delayRef, isInstantPhase]); 2484 } 2485 2486 // node_modules/@base-ui/utils/mergeCleanups.mjs 2487 function mergeCleanups(...cleanups) { 2488 return () => { 2489 for (let i = 0; i < cleanups.length; i += 1) { 2490 const cleanup = cleanups[i]; 2491 if (cleanup) { 2492 cleanup(); 2493 } 2494 } 2495 }; 2496 } 2497 2498 // node_modules/@base-ui/react/utils/FocusGuard.mjs 2499 var React14 = __toESM(require_react(), 1); 2500 2501 // node_modules/@base-ui/utils/visuallyHidden.mjs 2502 var visuallyHiddenBase = { 2503 clipPath: "inset(50%)", 2504 overflow: "hidden", 2505 whiteSpace: "nowrap", 2506 border: 0, 2507 padding: 0, 2508 width: 1, 2509 height: 1, 2510 margin: -1 2511 }; 2512 var visuallyHidden = { 2513 ...visuallyHiddenBase, 2514 position: "fixed", 2515 top: 0, 2516 left: 0 2517 }; 2518 var visuallyHiddenInput = { 2519 ...visuallyHiddenBase, 2520 position: "absolute" 2521 }; 2522 2523 // node_modules/@base-ui/react/utils/FocusGuard.mjs 2524 var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1); 2525 var FocusGuard = /* @__PURE__ */ React14.forwardRef(function FocusGuard2(props, ref) { 2526 const [role, setRole] = React14.useState(); 2527 useIsoLayoutEffect(() => { 2528 if (parts_exports.screenReader.voiceOver && parts_exports.engine.webkit) { 2529 setRole("button"); 2530 } 2531 }, []); 2532 const restProps = { 2533 tabIndex: 0, 2534 // Role is only for VoiceOver 2535 role 2536 }; 2537 return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { 2538 ...props, 2539 ref, 2540 style: visuallyHidden, 2541 "aria-hidden": role ? void 0 : true, 2542 ...restProps, 2543 "data-base-ui-focus-guard": "" 2544 }); 2545 }); 2546 if (true) FocusGuard.displayName = "FocusGuard"; 2547 2548 // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs 2549 var sides = ["top", "right", "bottom", "left"]; 2550 var min = Math.min; 2551 var max = Math.max; 2552 var round = Math.round; 2553 var floor = Math.floor; 2554 var createCoords = (v) => ({ 2555 x: v, 2556 y: v 2557 }); 2558 var oppositeSideMap = { 2559 left: "right", 2560 right: "left", 2561 bottom: "top", 2562 top: "bottom" 2563 }; 2564 function clamp(start, value, end) { 2565 return max(start, min(value, end)); 2566 } 2567 function evaluate(value, param) { 2568 return typeof value === "function" ? value(param) : value; 2569 } 2570 function getSide(placement) { 2571 return placement.split("-")[0]; 2572 } 2573 function getAlignment(placement) { 2574 return placement.split("-")[1]; 2575 } 2576 function getOppositeAxis(axis) { 2577 return axis === "x" ? "y" : "x"; 2578 } 2579 function getAxisLength(axis) { 2580 return axis === "y" ? "height" : "width"; 2581 } 2582 function getSideAxis(placement) { 2583 const firstChar = placement[0]; 2584 return firstChar === "t" || firstChar === "b" ? "y" : "x"; 2585 } 2586 function getAlignmentAxis(placement) { 2587 return getOppositeAxis(getSideAxis(placement)); 2588 } 2589 function getAlignmentSides(placement, rects, rtl) { 2590 if (rtl === void 0) { 2591 rtl = false; 2592 } 2593 const alignment = getAlignment(placement); 2594 const alignmentAxis = getAlignmentAxis(placement); 2595 const length = getAxisLength(alignmentAxis); 2596 let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; 2597 if (rects.reference[length] > rects.floating[length]) { 2598 mainAlignmentSide = getOppositePlacement(mainAlignmentSide); 2599 } 2600 return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; 2601 } 2602 function getExpandedPlacements(placement) { 2603 const oppositePlacement = getOppositePlacement(placement); 2604 return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; 2605 } 2606 function getOppositeAlignmentPlacement(placement) { 2607 return placement.includes("start") ? placement.replace("start", "end") : placement.replace("end", "start"); 2608 } 2609 var lrPlacement = ["left", "right"]; 2610 var rlPlacement = ["right", "left"]; 2611 var tbPlacement = ["top", "bottom"]; 2612 var btPlacement = ["bottom", "top"]; 2613 function getSideList(side, isStart, rtl) { 2614 switch (side) { 2615 case "top": 2616 case "bottom": 2617 if (rtl) return isStart ? rlPlacement : lrPlacement; 2618 return isStart ? lrPlacement : rlPlacement; 2619 case "left": 2620 case "right": 2621 return isStart ? tbPlacement : btPlacement; 2622 default: 2623 return []; 2624 } 2625 } 2626 function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { 2627 const alignment = getAlignment(placement); 2628 let list = getSideList(getSide(placement), direction === "start", rtl); 2629 if (alignment) { 2630 list = list.map((side) => side + "-" + alignment); 2631 if (flipAlignment) { 2632 list = list.concat(list.map(getOppositeAlignmentPlacement)); 2633 } 2634 } 2635 return list; 2636 } 2637 function getOppositePlacement(placement) { 2638 const side = getSide(placement); 2639 return oppositeSideMap[side] + placement.slice(side.length); 2640 } 2641 function expandPaddingObject(padding) { 2642 return { 2643 top: 0, 2644 right: 0, 2645 bottom: 0, 2646 left: 0, 2647 ...padding 2648 }; 2649 } 2650 function getPaddingObject(padding) { 2651 return typeof padding !== "number" ? expandPaddingObject(padding) : { 2652 top: padding, 2653 right: padding, 2654 bottom: padding, 2655 left: padding 2656 }; 2657 } 2658 function rectToClientRect(rect) { 2659 const { 2660 x, 2661 y, 2662 width, 2663 height 2664 } = rect; 2665 return { 2666 width, 2667 height, 2668 top: y, 2669 left: x, 2670 right: x + width, 2671 bottom: y + height, 2672 x, 2673 y 2674 }; 2675 } 2676 2677 // node_modules/@base-ui/react/floating-ui-react/utils/composite.mjs 2678 function isHiddenByStyles(styles) { 2679 return styles.visibility === "hidden" || styles.visibility === "collapse"; 2680 } 2681 function isElementVisible(element, styles = element ? getComputedStyle2(element) : null) { 2682 if (!element || !element.isConnected || !styles || isHiddenByStyles(styles)) { 2683 return false; 2684 } 2685 if (typeof element.checkVisibility === "function") { 2686 return element.checkVisibility(); 2687 } 2688 return styles.display !== "none" && styles.display !== "contents"; 2689 } 2690 2691 // node_modules/@base-ui/react/floating-ui-react/utils/tabbable.mjs 2692 var CANDIDATE_SELECTOR = 'a[href],button,input,select,textarea,summary,details,iframe,object,embed,[tabindex],[contenteditable]:not([contenteditable="false"]),audio[controls],video[controls]'; 2693 function getParentElement(element) { 2694 const assignedSlot = element.assignedSlot; 2695 if (assignedSlot) { 2696 return assignedSlot; 2697 } 2698 if (element.parentElement) { 2699 return element.parentElement; 2700 } 2701 const rootNode = element.getRootNode(); 2702 return isShadowRoot(rootNode) ? rootNode.host : null; 2703 } 2704 function getDetailsSummary(details) { 2705 for (const child of Array.from(details.children)) { 2706 if (getNodeName(child) === "summary") { 2707 return child; 2708 } 2709 } 2710 return null; 2711 } 2712 function isWithinOpenDetailsSummary(element, details) { 2713 const summary = getDetailsSummary(details); 2714 return !!summary && (element === summary || contains(summary, element)); 2715 } 2716 function isFocusableCandidate(element) { 2717 const nodeName = element ? getNodeName(element) : ""; 2718 return element != null && element.matches(CANDIDATE_SELECTOR) && (nodeName !== "summary" || element.parentElement != null && getNodeName(element.parentElement) === "details" && getDetailsSummary(element.parentElement) === element) && (nodeName !== "details" || getDetailsSummary(element) == null) && (nodeName !== "input" || element.type !== "hidden"); 2719 } 2720 function isFocusableElement(element) { 2721 if (!isFocusableCandidate(element) || !element.isConnected || element.matches(":disabled")) { 2722 return false; 2723 } 2724 for (let current = element; current; current = getParentElement(current)) { 2725 const isAncestor = current !== element; 2726 const isSlot = getNodeName(current) === "slot"; 2727 if (current.hasAttribute("inert")) { 2728 return false; 2729 } 2730 if (isAncestor && getNodeName(current) === "details" && !current.open && !isWithinOpenDetailsSummary(element, current) || current.hasAttribute("hidden") || !isSlot && !isVisibleInTabbableTree(current, isAncestor)) { 2731 return false; 2732 } 2733 } 2734 return true; 2735 } 2736 function isVisibleInTabbableTree(element, isAncestor) { 2737 const styles = getComputedStyle2(element); 2738 if (!isAncestor) { 2739 return isElementVisible(element, styles); 2740 } 2741 return styles.display !== "none"; 2742 } 2743 function getTabIndex(element) { 2744 const tabIndex = element.tabIndex; 2745 if (tabIndex < 0) { 2746 const nodeName = getNodeName(element); 2747 if (nodeName === "details" || nodeName === "audio" || nodeName === "video" || isHTMLElement(element) && element.isContentEditable) { 2748 return 0; 2749 } 2750 } 2751 return tabIndex; 2752 } 2753 function getNamedRadioInput(element) { 2754 if (getNodeName(element) !== "input") { 2755 return null; 2756 } 2757 const input = element; 2758 return input.type === "radio" && input.name !== "" ? input : null; 2759 } 2760 function isTabbableRadio(element, candidates) { 2761 const input = getNamedRadioInput(element); 2762 if (!input) { 2763 return true; 2764 } 2765 const checkedRadio = candidates.find((candidate) => { 2766 const radio = getNamedRadioInput(candidate); 2767 return radio?.name === input.name && radio.form === input.form && radio.checked; 2768 }); 2769 if (checkedRadio) { 2770 return checkedRadio === input; 2771 } 2772 return candidates.find((candidate) => { 2773 const radio = getNamedRadioInput(candidate); 2774 return radio?.name === input.name && radio.form === input.form; 2775 }) === input; 2776 } 2777 function getComposedChildren(container) { 2778 if (isHTMLElement(container) && getNodeName(container) === "slot") { 2779 const assignedElements = container.assignedElements({ 2780 flatten: true 2781 }); 2782 if (assignedElements.length > 0) { 2783 return assignedElements; 2784 } 2785 } 2786 if (isHTMLElement(container) && container.shadowRoot) { 2787 return Array.from(container.shadowRoot.children); 2788 } 2789 return Array.from(container.children); 2790 } 2791 function appendCandidates(container, list) { 2792 getComposedChildren(container).forEach((child) => { 2793 if (isFocusableCandidate(child)) { 2794 list.push(child); 2795 } 2796 appendCandidates(child, list); 2797 }); 2798 } 2799 function appendMatchingElements(container, selector, list) { 2800 getComposedChildren(container).forEach((child) => { 2801 if (isHTMLElement(child) && child.matches(selector)) { 2802 list.push(child); 2803 } 2804 appendMatchingElements(child, selector, list); 2805 }); 2806 } 2807 function focusable(container) { 2808 const candidates = []; 2809 appendCandidates(container, candidates); 2810 return candidates.filter(isFocusableElement); 2811 } 2812 function tabbable(container) { 2813 const candidates = focusable(container); 2814 return candidates.filter((element) => getTabIndex(element) >= 0 && isTabbableRadio(element, candidates)); 2815 } 2816 function getTabbableIn(container, dir) { 2817 const list = tabbable(container); 2818 const len = list.length; 2819 if (len === 0) { 2820 return void 0; 2821 } 2822 const active = activeElement(ownerDocument(container)); 2823 const index2 = list.indexOf(active); 2824 const nextIndex = index2 === -1 ? dir === 1 ? 0 : len - 1 : index2 + dir; 2825 return list[nextIndex]; 2826 } 2827 function getNextTabbable(referenceElement) { 2828 return getTabbableIn(ownerDocument(referenceElement).body, 1) || referenceElement; 2829 } 2830 function getPreviousTabbable(referenceElement) { 2831 return getTabbableIn(ownerDocument(referenceElement).body, -1) || referenceElement; 2832 } 2833 function isOutsideEvent(event, container) { 2834 const containerElement = container || event.currentTarget; 2835 const relatedTarget = event.relatedTarget; 2836 return !relatedTarget || !contains(containerElement, relatedTarget); 2837 } 2838 function disableFocusInside(container) { 2839 const tabbableElements = tabbable(container); 2840 tabbableElements.forEach((element) => { 2841 element.dataset.tabindex = element.getAttribute("tabindex") || ""; 2842 element.setAttribute("tabindex", "-1"); 2843 }); 2844 } 2845 function enableFocusInside(container) { 2846 const elements = []; 2847 appendMatchingElements(container, "[data-tabindex]", elements); 2848 elements.forEach((element) => { 2849 const tabindex = element.dataset.tabindex; 2850 delete element.dataset.tabindex; 2851 if (tabindex) { 2852 element.setAttribute("tabindex", tabindex); 2853 } else { 2854 element.removeAttribute("tabindex"); 2855 } 2856 }); 2857 } 2858 2859 // node_modules/@base-ui/react/floating-ui-react/utils/nodes.mjs 2860 function getNodeChildren(nodes, id, onlyOpenChildren = true) { 2861 const directChildren = nodes.filter((node) => node.parentId === id); 2862 return directChildren.flatMap((child) => [...!onlyOpenChildren || child.context?.open ? [child] : [], ...getNodeChildren(nodes, child.id, onlyOpenChildren)]); 2863 } 2864 2865 // node_modules/@base-ui/react/floating-ui-react/utils/createAttribute.mjs 2866 function createAttribute(name) { 2867 return `data-base-ui-$name}`; 2868 } 2869 2870 // node_modules/@base-ui/react/floating-ui-react/components/FloatingPortal.mjs 2871 var React15 = __toESM(require_react(), 1); 2872 var ReactDOM2 = __toESM(require_react_dom(), 1); 2873 2874 // node_modules/@base-ui/react/internals/constants.mjs 2875 var DISABLED_TRANSITIONS_STYLE = { 2876 style: { 2877 transition: "none" 2878 } 2879 }; 2880 var BASE_UI_SWIPE_IGNORE_ATTRIBUTE = "data-base-ui-swipe-ignore"; 2881 var LEGACY_SWIPE_IGNORE_ATTRIBUTE = "data-swipe-ignore"; 2882 var BASE_UI_SWIPE_IGNORE_SELECTOR = `[$BASE_UI_SWIPE_IGNORE_ATTRIBUTE}]`; 2883 var LEGACY_SWIPE_IGNORE_SELECTOR = `[$LEGACY_SWIPE_IGNORE_ATTRIBUTE}]`; 2884 var POPUP_COLLISION_AVOIDANCE = { 2885 fallbackAxisSide: "end" 2886 }; 2887 var ownerVisuallyHidden = { 2888 clipPath: "inset(50%)", 2889 position: "fixed", 2890 top: 0, 2891 left: 0 2892 }; 2893 2894 // node_modules/@base-ui/react/floating-ui-react/components/FloatingPortal.mjs 2895 var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1); 2896 var PortalContext = /* @__PURE__ */ React15.createContext(null); 2897 if (true) PortalContext.displayName = "PortalContext"; 2898 var usePortalContext = () => React15.useContext(PortalContext); 2899 var attr = createAttribute("portal"); 2900 function useFloatingPortalNode(props = {}) { 2901 const { 2902 ref, 2903 container: containerProp, 2904 componentProps = EMPTY_OBJECT, 2905 elementProps 2906 } = props; 2907 const uniqueId = useId(); 2908 const portalContext = usePortalContext(); 2909 const parentPortalNode = portalContext?.portalNode; 2910 const [containerElement, setContainerElement] = React15.useState(null); 2911 const [portalNode, setPortalNode] = React15.useState(null); 2912 const setPortalNodeRef = useStableCallback((node) => { 2913 if (node !== null) { 2914 setPortalNode(node); 2915 } 2916 }); 2917 const containerRef = React15.useRef(null); 2918 useIsoLayoutEffect(() => { 2919 if (containerProp === null) { 2920 if (containerRef.current) { 2921 containerRef.current = null; 2922 setPortalNode(null); 2923 setContainerElement(null); 2924 } 2925 return; 2926 } 2927 if (uniqueId == null) { 2928 return; 2929 } 2930 const resolvedContainer = (containerProp && (isNode(containerProp) ? containerProp : containerProp.current)) ?? parentPortalNode ?? document.body; 2931 if (resolvedContainer == null) { 2932 if (containerRef.current) { 2933 containerRef.current = null; 2934 setPortalNode(null); 2935 setContainerElement(null); 2936 } 2937 return; 2938 } 2939 if (containerRef.current !== resolvedContainer) { 2940 containerRef.current = resolvedContainer; 2941 setPortalNode(null); 2942 setContainerElement(resolvedContainer); 2943 } 2944 }, [containerProp, parentPortalNode, uniqueId]); 2945 const portalElement = useRenderElement("div", componentProps, { 2946 ref: [ref, setPortalNodeRef], 2947 props: [{ 2948 id: uniqueId, 2949 [attr]: "" 2950 }, elementProps] 2951 }); 2952 const portalSubtree = containerElement && portalElement ? /* @__PURE__ */ ReactDOM2.createPortal(portalElement, containerElement) : null; 2953 return { 2954 portalNode, 2955 portalSubtree 2956 }; 2957 } 2958 var FloatingPortal = /* @__PURE__ */ React15.forwardRef(function FloatingPortal2(componentProps, forwardedRef) { 2959 const { 2960 render, 2961 className, 2962 style, 2963 children, 2964 container, 2965 renderGuards, 2966 ...elementProps 2967 } = componentProps; 2968 const { 2969 portalNode, 2970 portalSubtree 2971 } = useFloatingPortalNode({ 2972 container, 2973 ref: forwardedRef, 2974 componentProps, 2975 elementProps 2976 }); 2977 const beforeOutsideRef = React15.useRef(null); 2978 const afterOutsideRef = React15.useRef(null); 2979 const beforeInsideRef = React15.useRef(null); 2980 const afterInsideRef = React15.useRef(null); 2981 const [focusManagerState, setFocusManagerState] = React15.useState(null); 2982 const focusInsideDisabledRef = React15.useRef(false); 2983 const modal = focusManagerState?.modal; 2984 const open = focusManagerState?.open; 2985 const shouldRenderGuards = typeof renderGuards === "boolean" ? renderGuards : !!focusManagerState && !focusManagerState.modal && focusManagerState.open && !!portalNode; 2986 React15.useEffect(() => { 2987 if (!portalNode || modal) { 2988 return void 0; 2989 } 2990 function onFocus(event) { 2991 if (portalNode && event.relatedTarget && isOutsideEvent(event)) { 2992 if (event.type === "focusin") { 2993 if (focusInsideDisabledRef.current) { 2994 enableFocusInside(portalNode); 2995 focusInsideDisabledRef.current = false; 2996 } 2997 } else { 2998 disableFocusInside(portalNode); 2999 focusInsideDisabledRef.current = true; 3000 } 3001 } 3002 } 3003 return mergeCleanups(addEventListener(portalNode, "focusin", onFocus, true), addEventListener(portalNode, "focusout", onFocus, true)); 3004 }, [portalNode, modal]); 3005 useIsoLayoutEffect(() => { 3006 if (!portalNode || open !== true || !focusInsideDisabledRef.current) { 3007 return; 3008 } 3009 enableFocusInside(portalNode); 3010 focusInsideDisabledRef.current = false; 3011 }, [open, portalNode]); 3012 const portalContextValue = React15.useMemo(() => ({ 3013 beforeOutsideRef, 3014 afterOutsideRef, 3015 beforeInsideRef, 3016 afterInsideRef, 3017 portalNode, 3018 setFocusManagerState 3019 }), [portalNode]); 3020 return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(React15.Fragment, { 3021 children: [portalSubtree, /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(PortalContext.Provider, { 3022 value: portalContextValue, 3023 children: [shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(FocusGuard, { 3024 "data-type": "outside", 3025 ref: beforeOutsideRef, 3026 onFocus: (event) => { 3027 if (isOutsideEvent(event, portalNode)) { 3028 beforeInsideRef.current?.focus(); 3029 } else { 3030 const domReference = focusManagerState ? focusManagerState.domReference : null; 3031 const prevTabbable = getPreviousTabbable(domReference); 3032 prevTabbable?.focus(); 3033 } 3034 } 3035 }), shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { 3036 "aria-owns": portalNode.id, 3037 style: ownerVisuallyHidden 3038 }), portalNode && /* @__PURE__ */ ReactDOM2.createPortal(children, portalNode), shouldRenderGuards && portalNode && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(FocusGuard, { 3039 "data-type": "outside", 3040 ref: afterOutsideRef, 3041 onFocus: (event) => { 3042 if (isOutsideEvent(event, portalNode)) { 3043 afterInsideRef.current?.focus(); 3044 } else { 3045 const domReference = focusManagerState ? focusManagerState.domReference : null; 3046 const nextTabbable = getNextTabbable(domReference); 3047 nextTabbable?.focus(); 3048 if (focusManagerState?.closeOnFocusOut) { 3049 focusManagerState?.onOpenChange(false, createChangeEventDetails(reason_parts_exports.focusOut, event.nativeEvent)); 3050 } 3051 } 3052 } 3053 })] 3054 })] 3055 }); 3056 }); 3057 if (true) FloatingPortal.displayName = "FloatingPortal"; 3058 3059 // node_modules/@base-ui/react/floating-ui-react/components/FloatingTree.mjs 3060 var React16 = __toESM(require_react(), 1); 3061 3062 // node_modules/@base-ui/react/floating-ui-react/utils/createEventEmitter.mjs 3063 function createEventEmitter() { 3064 const map = /* @__PURE__ */ new Map(); 3065 return { 3066 emit(event, data) { 3067 map.get(event)?.forEach((listener) => listener(data)); 3068 }, 3069 on(event, listener) { 3070 if (!map.has(event)) { 3071 map.set(event, /* @__PURE__ */ new Set()); 3072 } 3073 map.get(event).add(listener); 3074 }, 3075 off(event, listener) { 3076 map.get(event)?.delete(listener); 3077 } 3078 }; 3079 } 3080 3081 // node_modules/@base-ui/react/floating-ui-react/components/FloatingTree.mjs 3082 var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1); 3083 var FloatingNodeContext = /* @__PURE__ */ React16.createContext(null); 3084 if (true) FloatingNodeContext.displayName = "FloatingNodeContext"; 3085 var FloatingTreeContext = /* @__PURE__ */ React16.createContext(null); 3086 if (true) FloatingTreeContext.displayName = "FloatingTreeContext"; 3087 var useFloatingParentNodeId = () => React16.useContext(FloatingNodeContext)?.id || null; 3088 var useFloatingTree = (externalTree) => { 3089 const contextTree = React16.useContext(FloatingTreeContext); 3090 return externalTree ?? contextTree; 3091 }; 3092 3093 // node_modules/@base-ui/react/floating-ui-react/hooks/useClientPoint.mjs 3094 var React17 = __toESM(require_react(), 1); 3095 function createVirtualElement(domElement, data) { 3096 let offsetX = null; 3097 let offsetY = null; 3098 let isAutoUpdateEvent = false; 3099 return { 3100 contextElement: domElement || void 0, 3101 getBoundingClientRect() { 3102 const domRect = domElement?.getBoundingClientRect() || { 3103 width: 0, 3104 height: 0, 3105 x: 0, 3106 y: 0 3107 }; 3108 const isXAxis = data.axis === "x" || data.axis === "both"; 3109 const isYAxis = data.axis === "y" || data.axis === "both"; 3110 const canTrackCursorOnAutoUpdate = ["mouseenter", "mousemove"].includes(data.dataRef.current.openEvent?.type || "") && data.pointerType !== "touch"; 3111 let width = domRect.width; 3112 let height = domRect.height; 3113 let x = domRect.x; 3114 let y = domRect.y; 3115 if (offsetX == null && data.x && isXAxis) { 3116 offsetX = domRect.x - data.x; 3117 } 3118 if (offsetY == null && data.y && isYAxis) { 3119 offsetY = domRect.y - data.y; 3120 } 3121 x -= offsetX || 0; 3122 y -= offsetY || 0; 3123 width = 0; 3124 height = 0; 3125 if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) { 3126 width = data.axis === "y" ? domRect.width : 0; 3127 height = data.axis === "x" ? domRect.height : 0; 3128 x = isXAxis && data.x != null ? data.x : x; 3129 y = isYAxis && data.y != null ? data.y : y; 3130 } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) { 3131 height = data.axis === "x" ? domRect.height : height; 3132 width = data.axis === "y" ? domRect.width : width; 3133 } 3134 isAutoUpdateEvent = true; 3135 return { 3136 width, 3137 height, 3138 x, 3139 y, 3140 top: y, 3141 right: x + width, 3142 bottom: y + height, 3143 left: x 3144 }; 3145 } 3146 }; 3147 } 3148 function isMouseBasedEvent(event) { 3149 return event != null && event.clientX != null; 3150 } 3151 function useClientPoint(context, props = {}) { 3152 const { 3153 enabled = true, 3154 axis = "both" 3155 } = props; 3156 const store2 = "rootStore" in context ? context.rootStore : context; 3157 const open = store2.useState("open"); 3158 const floating = store2.useState("floatingElement"); 3159 const domReference = store2.useState("domReferenceElement"); 3160 const dataRef = store2.context.dataRef; 3161 const initialRef = React17.useRef(false); 3162 const cleanupListenerRef = React17.useRef(null); 3163 const [pointerType, setPointerType] = React17.useState(); 3164 const [reactive, setReactive] = React17.useState([]); 3165 const resetReference = useStableCallback((reference2) => { 3166 store2.set("positionReference", reference2); 3167 }); 3168 const setReference = useStableCallback((newX, newY, referenceElement) => { 3169 if (initialRef.current) { 3170 return; 3171 } 3172 if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) { 3173 return; 3174 } 3175 store2.set("positionReference", createVirtualElement(referenceElement ?? domReference, { 3176 x: newX, 3177 y: newY, 3178 axis, 3179 dataRef, 3180 pointerType 3181 })); 3182 }); 3183 const handleReferenceEnterOrMove = useStableCallback((event) => { 3184 if (!open) { 3185 setReference(event.clientX, event.clientY, event.currentTarget); 3186 } else if (!cleanupListenerRef.current) { 3187 setReference(event.clientX, event.clientY, event.currentTarget); 3188 setReactive([]); 3189 } 3190 }); 3191 const openCheck = isMouseLikePointerType(pointerType) ? floating : open; 3192 React17.useEffect(() => { 3193 if (!enabled) { 3194 resetReference(domReference); 3195 return void 0; 3196 } 3197 if (!openCheck) { 3198 return void 0; 3199 } 3200 function cleanupListener() { 3201 cleanupListenerRef.current?.(); 3202 cleanupListenerRef.current = null; 3203 } 3204 const win = getWindow(floating); 3205 function handleMouseMove(event) { 3206 const target = getTarget(event); 3207 if (!contains(floating, target)) { 3208 setReference(event.clientX, event.clientY); 3209 } else { 3210 cleanupListener(); 3211 } 3212 } 3213 if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) { 3214 cleanupListenerRef.current = addEventListener(win, "mousemove", handleMouseMove); 3215 } else { 3216 resetReference(domReference); 3217 } 3218 return cleanupListener; 3219 }, [openCheck, enabled, floating, dataRef, domReference, store2, setReference, resetReference, reactive]); 3220 React17.useEffect(() => () => { 3221 store2.set("positionReference", null); 3222 }, [store2]); 3223 React17.useEffect(() => { 3224 if (enabled && !floating) { 3225 initialRef.current = false; 3226 } 3227 }, [enabled, floating]); 3228 React17.useEffect(() => { 3229 if (!enabled && open) { 3230 initialRef.current = true; 3231 } 3232 }, [enabled, open]); 3233 const reference = React17.useMemo(() => { 3234 function setPointerTypeRef(event) { 3235 setPointerType(event.pointerType); 3236 } 3237 return { 3238 onPointerDown: setPointerTypeRef, 3239 onPointerEnter: setPointerTypeRef, 3240 onMouseMove: handleReferenceEnterOrMove, 3241 onMouseEnter: handleReferenceEnterOrMove 3242 }; 3243 }, [handleReferenceEnterOrMove]); 3244 return React17.useMemo(() => enabled ? { 3245 reference, 3246 trigger: reference 3247 } : {}, [enabled, reference]); 3248 } 3249 3250 // node_modules/@base-ui/react/floating-ui-react/hooks/useDismiss.mjs 3251 var React18 = __toESM(require_react(), 1); 3252 function alwaysFalse() { 3253 return false; 3254 } 3255 function normalizeProp(normalizable) { 3256 return { 3257 escapeKey: typeof normalizable === "boolean" ? normalizable : normalizable?.escapeKey ?? false, 3258 outsidePress: typeof normalizable === "boolean" ? normalizable : normalizable?.outsidePress ?? true 3259 }; 3260 } 3261 function useDismiss(context, props = {}) { 3262 const { 3263 enabled = true, 3264 escapeKey: escapeKey2 = true, 3265 outsidePress: outsidePressProp = true, 3266 outsidePressEvent = "sloppy", 3267 referencePress = alwaysFalse, 3268 bubbles, 3269 externalTree 3270 } = props; 3271 const store2 = "rootStore" in context ? context.rootStore : context; 3272 const open = store2.useState("open"); 3273 const floatingElement = store2.useState("floatingElement"); 3274 const { 3275 dataRef 3276 } = store2.context; 3277 const tree = useFloatingTree(externalTree); 3278 const outsidePressFn = useStableCallback(typeof outsidePressProp === "function" ? outsidePressProp : () => false); 3279 const outsidePress2 = typeof outsidePressProp === "function" ? outsidePressFn : outsidePressProp; 3280 const outsidePressEnabled = outsidePress2 !== false; 3281 const getOutsidePressEventProp = useStableCallback(() => outsidePressEvent); 3282 const { 3283 escapeKey: escapeKeyBubbles, 3284 outsidePress: outsidePressBubbles 3285 } = normalizeProp(bubbles); 3286 const pressStartedInsideRef = React18.useRef(false); 3287 const pressStartPreventedRef = React18.useRef(false); 3288 const suppressNextOutsideClickRef = React18.useRef(false); 3289 const isComposingRef = React18.useRef(false); 3290 const currentPointerTypeRef = React18.useRef(""); 3291 const touchStateRef = React18.useRef(null); 3292 const cancelDismissOnEndTimeout = useTimeout(); 3293 const clearInsideReactTreeTimeout = useTimeout(); 3294 const clearInsideReactTree = useStableCallback(() => { 3295 clearInsideReactTreeTimeout.clear(); 3296 dataRef.current.insideReactTree = false; 3297 }); 3298 const hasBlockingChild = useStableCallback((bubbleKey) => { 3299 const nodeId = dataRef.current.floatingContext?.nodeId; 3300 const children = tree ? getNodeChildren(tree.nodesRef.current, nodeId) : []; 3301 return children.some((child) => child.context?.open && !child.context.dataRef.current[bubbleKey]); 3302 }); 3303 const isEventWithinOwnElements = useStableCallback((event) => { 3304 return isEventTargetWithin(event, store2.select("floatingElement")) || isEventTargetWithin(event, store2.select("domReferenceElement")); 3305 }); 3306 const closeOnReferencePress = useStableCallback((event) => { 3307 if (!referencePress()) { 3308 return; 3309 } 3310 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerPress, event.nativeEvent)); 3311 }); 3312 const closeOnEscapeKeyDown = useStableCallback((event) => { 3313 if (!open || !enabled || !escapeKey2 || event.key !== "Escape") { 3314 return; 3315 } 3316 if (isComposingRef.current) { 3317 return; 3318 } 3319 if (!escapeKeyBubbles && hasBlockingChild("__escapeKeyBubbles")) { 3320 return; 3321 } 3322 const native = isReactEvent(event) ? event.nativeEvent : event; 3323 const eventDetails = createChangeEventDetails(reason_parts_exports.escapeKey, native); 3324 store2.setOpen(false, eventDetails); 3325 if (!eventDetails.isCanceled) { 3326 event.preventDefault(); 3327 } 3328 if (!escapeKeyBubbles && !eventDetails.isPropagationAllowed) { 3329 event.stopPropagation(); 3330 } 3331 }); 3332 const markInsideReactTree = useStableCallback(() => { 3333 dataRef.current.insideReactTree = true; 3334 clearInsideReactTreeTimeout.start(0, clearInsideReactTree); 3335 }); 3336 const markPressStartedInsideReactTree = useStableCallback((event) => { 3337 if (!open || !enabled || event.button !== 0) { 3338 return; 3339 } 3340 const target = getTarget(event.nativeEvent); 3341 if (!contains(store2.select("floatingElement"), target)) { 3342 return; 3343 } 3344 if (!pressStartedInsideRef.current) { 3345 pressStartedInsideRef.current = true; 3346 pressStartPreventedRef.current = false; 3347 } 3348 }); 3349 const markInsidePressStartPrevented = useStableCallback((event) => { 3350 if (!open || !enabled) { 3351 return; 3352 } 3353 if (!(event.defaultPrevented || event.nativeEvent.defaultPrevented)) { 3354 return; 3355 } 3356 if (pressStartedInsideRef.current) { 3357 pressStartPreventedRef.current = true; 3358 } 3359 }); 3360 React18.useEffect(() => { 3361 if (!open || !enabled) { 3362 return void 0; 3363 } 3364 dataRef.current.__escapeKeyBubbles = escapeKeyBubbles; 3365 dataRef.current.__outsidePressBubbles = outsidePressBubbles; 3366 const compositionTimeout = new Timeout(); 3367 const preventedPressSuppressionTimeout = new Timeout(); 3368 function handleCompositionStart() { 3369 compositionTimeout.clear(); 3370 isComposingRef.current = true; 3371 } 3372 function handleCompositionEnd() { 3373 compositionTimeout.start( 3374 // 0ms or 1ms don't work in Safari. 5ms appears to consistently work. 3375 // Only apply to WebKit for the test to remain 0ms. 3376 parts_exports.engine.webkit ? 5 : 0, 3377 () => { 3378 isComposingRef.current = false; 3379 } 3380 ); 3381 } 3382 function suppressImmediateOutsideClickAfterPreventedStart() { 3383 suppressNextOutsideClickRef.current = true; 3384 preventedPressSuppressionTimeout.start(0, () => { 3385 suppressNextOutsideClickRef.current = false; 3386 }); 3387 } 3388 function resetPressStartState() { 3389 pressStartedInsideRef.current = false; 3390 pressStartPreventedRef.current = false; 3391 } 3392 function getOutsidePressEvent() { 3393 const type = currentPointerTypeRef.current; 3394 const computedType = type === "pen" || !type ? "mouse" : type; 3395 const outsidePressEventValue = getOutsidePressEventProp(); 3396 const resolved = typeof outsidePressEventValue === "function" ? outsidePressEventValue() : outsidePressEventValue; 3397 if (typeof resolved === "string") { 3398 return resolved; 3399 } 3400 return resolved[computedType]; 3401 } 3402 function shouldIgnoreEvent(event) { 3403 const computedOutsidePressEvent = getOutsidePressEvent(); 3404 return computedOutsidePressEvent === "intentional" && event.type !== "click" || computedOutsidePressEvent === "sloppy" && event.type === "click"; 3405 } 3406 function isEventWithinFloatingTree(event) { 3407 const nodeId = dataRef.current.floatingContext?.nodeId; 3408 const targetIsInsideChildren = tree && getNodeChildren(tree.nodesRef.current, nodeId).some((node) => isEventTargetWithin(event, node.context?.elements.floating)); 3409 return isEventWithinOwnElements(event) || targetIsInsideChildren; 3410 } 3411 function closeOnPressOutside(event) { 3412 if (shouldIgnoreEvent(event)) { 3413 if (event.type !== "click" && !isEventWithinOwnElements(event)) { 3414 preventedPressSuppressionTimeout.clear(); 3415 suppressNextOutsideClickRef.current = false; 3416 } 3417 clearInsideReactTree(); 3418 return; 3419 } 3420 if (dataRef.current.insideReactTree) { 3421 clearInsideReactTree(); 3422 return; 3423 } 3424 const target = getTarget(event); 3425 const inertSelector = `[$createAttribute("inert")}]`; 3426 const targetRoot = isElement(target) ? target.getRootNode() : null; 3427 const markers = Array.from((isShadowRoot(targetRoot) ? targetRoot : ownerDocument(store2.select("floatingElement"))).querySelectorAll(inertSelector)); 3428 const triggers = store2.context.triggerElements; 3429 if (target && (triggers.hasElement(target) || triggers.hasMatchingElement((trigger) => contains(trigger, target)))) { 3430 return; 3431 } 3432 let targetRootAncestor = isElement(target) ? target : null; 3433 while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) { 3434 const nextParent = getParentNode(targetRootAncestor); 3435 if (isLastTraversableNode(nextParent) || !isElement(nextParent)) { 3436 break; 3437 } 3438 targetRootAncestor = nextParent; 3439 } 3440 if (markers.length && isElement(target) && !isRootElement(target) && // Clicked on a direct ancestor (e.g. FloatingOverlay). 3441 !contains(target, store2.select("floatingElement")) && // If the target root element contains none of the markers, then the 3442 // element was injected after the floating element rendered. 3443 markers.every((marker) => !contains(targetRootAncestor, marker))) { 3444 return; 3445 } 3446 if (isHTMLElement(target) && !("touches" in event)) { 3447 const lastTraversableNode = isLastTraversableNode(target); 3448 const style = getComputedStyle2(target); 3449 const scrollRe = /auto|scroll/; 3450 const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX); 3451 const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY); 3452 const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth; 3453 const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight; 3454 const isRTL2 = style.direction === "rtl"; 3455 const pressedVerticalScrollbar = canScrollY && (isRTL2 ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth); 3456 const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight; 3457 if (pressedVerticalScrollbar || pressedHorizontalScrollbar) { 3458 return; 3459 } 3460 } 3461 if (isEventWithinFloatingTree(event)) { 3462 return; 3463 } 3464 if (getOutsidePressEvent() === "intentional" && suppressNextOutsideClickRef.current) { 3465 preventedPressSuppressionTimeout.clear(); 3466 suppressNextOutsideClickRef.current = false; 3467 return; 3468 } 3469 if (typeof outsidePress2 === "function" && !outsidePress2(event)) { 3470 return; 3471 } 3472 if (hasBlockingChild("__outsidePressBubbles")) { 3473 return; 3474 } 3475 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.outsidePress, event)); 3476 clearInsideReactTree(); 3477 } 3478 function handlePointerDown(event) { 3479 if (getOutsidePressEvent() !== "sloppy" || event.pointerType === "touch" || !store2.select("open") || !enabled || isEventWithinOwnElements(event)) { 3480 return; 3481 } 3482 closeOnPressOutside(event); 3483 } 3484 function handleTouchStart(event) { 3485 if (getOutsidePressEvent() !== "sloppy" || !store2.select("open") || !enabled || isEventWithinOwnElements(event)) { 3486 return; 3487 } 3488 const touch = event.touches[0]; 3489 if (touch) { 3490 touchStateRef.current = { 3491 startTime: Date.now(), 3492 startX: touch.clientX, 3493 startY: touch.clientY, 3494 dismissOnTouchEnd: false, 3495 dismissOnMouseDown: true 3496 }; 3497 cancelDismissOnEndTimeout.start(1e3, () => { 3498 if (touchStateRef.current) { 3499 touchStateRef.current.dismissOnTouchEnd = false; 3500 touchStateRef.current.dismissOnMouseDown = false; 3501 } 3502 }); 3503 } 3504 } 3505 function addTargetEventListenerOnce(event, listener) { 3506 const target = getTarget(event); 3507 if (!target) { 3508 return; 3509 } 3510 const unsubscribe2 = addEventListener(target, event.type, () => { 3511 listener(event); 3512 unsubscribe2(); 3513 }); 3514 } 3515 function handleTouchStartCapture(event) { 3516 currentPointerTypeRef.current = "touch"; 3517 addTargetEventListenerOnce(event, handleTouchStart); 3518 } 3519 function closeOnPressOutsideCapture(event) { 3520 cancelDismissOnEndTimeout.clear(); 3521 if (event.type === "pointerdown") { 3522 currentPointerTypeRef.current = event.pointerType; 3523 } 3524 if (event.type === "mousedown" && touchStateRef.current && !touchStateRef.current.dismissOnMouseDown) { 3525 return; 3526 } 3527 addTargetEventListenerOnce(event, (targetEvent) => { 3528 if (targetEvent.type === "pointerdown") { 3529 handlePointerDown(targetEvent); 3530 } else { 3531 closeOnPressOutside(targetEvent); 3532 } 3533 }); 3534 } 3535 function handlePressEndCapture(event) { 3536 if (!pressStartedInsideRef.current) { 3537 return; 3538 } 3539 const pressStartedInsideDefaultPrevented = pressStartPreventedRef.current; 3540 resetPressStartState(); 3541 if (getOutsidePressEvent() !== "intentional") { 3542 return; 3543 } 3544 if (event.type === "pointercancel") { 3545 if (pressStartedInsideDefaultPrevented) { 3546 suppressImmediateOutsideClickAfterPreventedStart(); 3547 } 3548 return; 3549 } 3550 if (isEventWithinFloatingTree(event)) { 3551 return; 3552 } 3553 if (pressStartedInsideDefaultPrevented) { 3554 suppressImmediateOutsideClickAfterPreventedStart(); 3555 return; 3556 } 3557 if (typeof outsidePress2 === "function" && !outsidePress2(event)) { 3558 return; 3559 } 3560 preventedPressSuppressionTimeout.clear(); 3561 suppressNextOutsideClickRef.current = true; 3562 clearInsideReactTree(); 3563 } 3564 function handleTouchMove(event) { 3565 if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) { 3566 return; 3567 } 3568 const touch = event.touches[0]; 3569 if (!touch) { 3570 return; 3571 } 3572 const deltaX = Math.abs(touch.clientX - touchStateRef.current.startX); 3573 const deltaY = Math.abs(touch.clientY - touchStateRef.current.startY); 3574 const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); 3575 if (distance > 5) { 3576 touchStateRef.current.dismissOnTouchEnd = true; 3577 } 3578 if (distance > 10) { 3579 closeOnPressOutside(event); 3580 cancelDismissOnEndTimeout.clear(); 3581 touchStateRef.current = null; 3582 } 3583 } 3584 function handleTouchMoveCapture(event) { 3585 addTargetEventListenerOnce(event, handleTouchMove); 3586 } 3587 function handleTouchEnd(event) { 3588 if (getOutsidePressEvent() !== "sloppy" || !touchStateRef.current || isEventWithinOwnElements(event)) { 3589 return; 3590 } 3591 if (touchStateRef.current.dismissOnTouchEnd) { 3592 closeOnPressOutside(event); 3593 } 3594 cancelDismissOnEndTimeout.clear(); 3595 touchStateRef.current = null; 3596 } 3597 function handleTouchEndCapture(event) { 3598 addTargetEventListenerOnce(event, handleTouchEnd); 3599 } 3600 const doc = ownerDocument(floatingElement); 3601 const unsubscribe = mergeCleanups(escapeKey2 && mergeCleanups(addEventListener(doc, "keydown", closeOnEscapeKeyDown), addEventListener(doc, "compositionstart", handleCompositionStart), addEventListener(doc, "compositionend", handleCompositionEnd)), outsidePressEnabled && mergeCleanups(addEventListener(doc, "click", closeOnPressOutsideCapture, true), addEventListener(doc, "pointerdown", closeOnPressOutsideCapture, true), addEventListener(doc, "pointerup", handlePressEndCapture, true), addEventListener(doc, "pointercancel", handlePressEndCapture, true), addEventListener(doc, "mousedown", closeOnPressOutsideCapture, true), addEventListener(doc, "mouseup", handlePressEndCapture, true), addEventListener(doc, "touchstart", handleTouchStartCapture, true), addEventListener(doc, "touchmove", handleTouchMoveCapture, true), addEventListener(doc, "touchend", handleTouchEndCapture, true))); 3602 return () => { 3603 unsubscribe(); 3604 compositionTimeout.clear(); 3605 preventedPressSuppressionTimeout.clear(); 3606 resetPressStartState(); 3607 suppressNextOutsideClickRef.current = false; 3608 }; 3609 }, [dataRef, floatingElement, escapeKey2, outsidePressEnabled, outsidePress2, open, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, clearInsideReactTree, getOutsidePressEventProp, hasBlockingChild, isEventWithinOwnElements, tree, store2, cancelDismissOnEndTimeout]); 3610 React18.useEffect(clearInsideReactTree, [outsidePress2, clearInsideReactTree]); 3611 const reference = React18.useMemo(() => ({ 3612 onKeyDown: closeOnEscapeKeyDown, 3613 onPointerDown: closeOnReferencePress, 3614 onClick: closeOnReferencePress 3615 }), [closeOnEscapeKeyDown, closeOnReferencePress]); 3616 const floating = React18.useMemo(() => ({ 3617 onKeyDown: closeOnEscapeKeyDown, 3618 // `onMouseDown` may be blocked if `event.preventDefault()` is called in 3619 // `onPointerDown`, such as with <NumberField.ScrubArea>. 3620 // See https://github.com/mui/base-ui/pull/3379 3621 onPointerDown: markInsidePressStartPrevented, 3622 onMouseDown: markInsidePressStartPrevented, 3623 onClickCapture: markInsideReactTree, 3624 onMouseDownCapture(event) { 3625 markInsideReactTree(); 3626 markPressStartedInsideReactTree(event); 3627 }, 3628 onPointerDownCapture(event) { 3629 markInsideReactTree(); 3630 markPressStartedInsideReactTree(event); 3631 }, 3632 onMouseUpCapture: markInsideReactTree, 3633 onTouchEndCapture: markInsideReactTree, 3634 onTouchMoveCapture: markInsideReactTree 3635 }), [closeOnEscapeKeyDown, markInsideReactTree, markPressStartedInsideReactTree, markInsidePressStartPrevented]); 3636 return React18.useMemo(() => enabled ? { 3637 reference, 3638 floating, 3639 trigger: reference 3640 } : {}, [enabled, reference, floating]); 3641 } 3642 3643 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloating.mjs 3644 var React25 = __toESM(require_react(), 1); 3645 3646 // node_modules/@floating-ui/core/dist/floating-ui.core.mjs 3647 function computeCoordsFromPlacement(_ref, placement, rtl) { 3648 let { 3649 reference, 3650 floating 3651 } = _ref; 3652 const sideAxis = getSideAxis(placement); 3653 const alignmentAxis = getAlignmentAxis(placement); 3654 const alignLength = getAxisLength(alignmentAxis); 3655 const side = getSide(placement); 3656 const isVertical = sideAxis === "y"; 3657 const commonX = reference.x + reference.width / 2 - floating.width / 2; 3658 const commonY = reference.y + reference.height / 2 - floating.height / 2; 3659 const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; 3660 let coords; 3661 switch (side) { 3662 case "top": 3663 coords = { 3664 x: commonX, 3665 y: reference.y - floating.height 3666 }; 3667 break; 3668 case "bottom": 3669 coords = { 3670 x: commonX, 3671 y: reference.y + reference.height 3672 }; 3673 break; 3674 case "right": 3675 coords = { 3676 x: reference.x + reference.width, 3677 y: commonY 3678 }; 3679 break; 3680 case "left": 3681 coords = { 3682 x: reference.x - floating.width, 3683 y: commonY 3684 }; 3685 break; 3686 default: 3687 coords = { 3688 x: reference.x, 3689 y: reference.y 3690 }; 3691 } 3692 switch (getAlignment(placement)) { 3693 case "start": 3694 coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); 3695 break; 3696 case "end": 3697 coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); 3698 break; 3699 } 3700 return coords; 3701 } 3702 async function detectOverflow(state, options) { 3703 var _await$platform$isEle; 3704 if (options === void 0) { 3705 options = {}; 3706 } 3707 const { 3708 x, 3709 y, 3710 platform: platform3, 3711 rects, 3712 elements, 3713 strategy 3714 } = state; 3715 const { 3716 boundary = "clippingAncestors", 3717 rootBoundary = "viewport", 3718 elementContext = "floating", 3719 altBoundary = false, 3720 padding = 0 3721 } = evaluate(options, state); 3722 const paddingObject = getPaddingObject(padding); 3723 const altContext = elementContext === "floating" ? "reference" : "floating"; 3724 const element = elements[altBoundary ? altContext : elementContext]; 3725 const clippingClientRect = rectToClientRect(await platform3.getClippingRect({ 3726 element: ((_await$platform$isEle = await (platform3.isElement == null ? void 0 : platform3.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || await (platform3.getDocumentElement == null ? void 0 : platform3.getDocumentElement(elements.floating)), 3727 boundary, 3728 rootBoundary, 3729 strategy 3730 })); 3731 const rect = elementContext === "floating" ? { 3732 x, 3733 y, 3734 width: rects.floating.width, 3735 height: rects.floating.height 3736 } : rects.reference; 3737 const offsetParent = await (platform3.getOffsetParent == null ? void 0 : platform3.getOffsetParent(elements.floating)); 3738 const offsetScale = await (platform3.isElement == null ? void 0 : platform3.isElement(offsetParent)) ? await (platform3.getScale == null ? void 0 : platform3.getScale(offsetParent)) || { 3739 x: 1, 3740 y: 1 3741 } : { 3742 x: 1, 3743 y: 1 3744 }; 3745 const elementClientRect = rectToClientRect(platform3.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform3.convertOffsetParentRelativeRectToViewportRelativeRect({ 3746 elements, 3747 rect, 3748 offsetParent, 3749 strategy 3750 }) : rect); 3751 return { 3752 top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, 3753 bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, 3754 left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, 3755 right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x 3756 }; 3757 } 3758 var MAX_RESET_COUNT = 50; 3759 var computePosition = async (reference, floating, config) => { 3760 const { 3761 placement = "bottom", 3762 strategy = "absolute", 3763 middleware = [], 3764 platform: platform3 3765 } = config; 3766 const platformWithDetectOverflow = platform3.detectOverflow ? platform3 : { 3767 ...platform3, 3768 detectOverflow 3769 }; 3770 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(floating)); 3771 let rects = await platform3.getElementRects({ 3772 reference, 3773 floating, 3774 strategy 3775 }); 3776 let { 3777 x, 3778 y 3779 } = computeCoordsFromPlacement(rects, placement, rtl); 3780 let statefulPlacement = placement; 3781 let resetCount = 0; 3782 const middlewareData = {}; 3783 for (let i = 0; i < middleware.length; i++) { 3784 const currentMiddleware = middleware[i]; 3785 if (!currentMiddleware) { 3786 continue; 3787 } 3788 const { 3789 name, 3790 fn 3791 } = currentMiddleware; 3792 const { 3793 x: nextX, 3794 y: nextY, 3795 data, 3796 reset 3797 } = await fn({ 3798 x, 3799 y, 3800 initialPlacement: placement, 3801 placement: statefulPlacement, 3802 strategy, 3803 middlewareData, 3804 rects, 3805 platform: platformWithDetectOverflow, 3806 elements: { 3807 reference, 3808 floating 3809 } 3810 }); 3811 x = nextX != null ? nextX : x; 3812 y = nextY != null ? nextY : y; 3813 middlewareData[name] = { 3814 ...middlewareData[name], 3815 ...data 3816 }; 3817 if (reset && resetCount < MAX_RESET_COUNT) { 3818 resetCount++; 3819 if (typeof reset === "object") { 3820 if (reset.placement) { 3821 statefulPlacement = reset.placement; 3822 } 3823 if (reset.rects) { 3824 rects = reset.rects === true ? await platform3.getElementRects({ 3825 reference, 3826 floating, 3827 strategy 3828 }) : reset.rects; 3829 } 3830 ({ 3831 x, 3832 y 3833 } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); 3834 } 3835 i = -1; 3836 } 3837 } 3838 return { 3839 x, 3840 y, 3841 placement: statefulPlacement, 3842 strategy, 3843 middlewareData 3844 }; 3845 }; 3846 var flip = function(options) { 3847 if (options === void 0) { 3848 options = {}; 3849 } 3850 return { 3851 name: "flip", 3852 options, 3853 async fn(state) { 3854 var _middlewareData$arrow, _middlewareData$flip; 3855 const { 3856 placement, 3857 middlewareData, 3858 rects, 3859 initialPlacement, 3860 platform: platform3, 3861 elements 3862 } = state; 3863 const { 3864 mainAxis: checkMainAxis = true, 3865 crossAxis: checkCrossAxis = true, 3866 fallbackPlacements: specifiedFallbackPlacements, 3867 fallbackStrategy = "bestFit", 3868 fallbackAxisSideDirection = "none", 3869 flipAlignment = true, 3870 ...detectOverflowOptions 3871 } = evaluate(options, state); 3872 if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { 3873 return {}; 3874 } 3875 const side = getSide(placement); 3876 const initialSideAxis = getSideAxis(initialPlacement); 3877 const isBasePlacement = getSide(initialPlacement) === initialPlacement; 3878 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)); 3879 const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); 3880 const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; 3881 if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { 3882 fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); 3883 } 3884 const placements2 = [initialPlacement, ...fallbackPlacements]; 3885 const overflow = await platform3.detectOverflow(state, detectOverflowOptions); 3886 const overflows = []; 3887 let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; 3888 if (checkMainAxis) { 3889 overflows.push(overflow[side]); 3890 } 3891 if (checkCrossAxis) { 3892 const sides2 = getAlignmentSides(placement, rects, rtl); 3893 overflows.push(overflow[sides2[0]], overflow[sides2[1]]); 3894 } 3895 overflowsData = [...overflowsData, { 3896 placement, 3897 overflows 3898 }]; 3899 if (!overflows.every((side2) => side2 <= 0)) { 3900 var _middlewareData$flip2, _overflowsData$filter; 3901 const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; 3902 const nextPlacement = placements2[nextIndex]; 3903 if (nextPlacement) { 3904 const ignoreCrossAxisOverflow = checkCrossAxis === "alignment" ? initialSideAxis !== getSideAxis(nextPlacement) : false; 3905 if (!ignoreCrossAxisOverflow || // We leave the current main axis only if every placement on that axis 3906 // overflows the main axis. 3907 overflowsData.every((d) => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) { 3908 return { 3909 data: { 3910 index: nextIndex, 3911 overflows: overflowsData 3912 }, 3913 reset: { 3914 placement: nextPlacement 3915 } 3916 }; 3917 } 3918 } 3919 let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; 3920 if (!resetPlacement) { 3921 switch (fallbackStrategy) { 3922 case "bestFit": { 3923 var _overflowsData$filter2; 3924 const placement2 = (_overflowsData$filter2 = overflowsData.filter((d) => { 3925 if (hasFallbackAxisSideDirection) { 3926 const currentSideAxis = getSideAxis(d.placement); 3927 return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal 3928 // reading directions favoring greater width. 3929 currentSideAxis === "y"; 3930 } 3931 return true; 3932 }).map((d) => [d.placement, d.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; 3933 if (placement2) { 3934 resetPlacement = placement2; 3935 } 3936 break; 3937 } 3938 case "initialPlacement": 3939 resetPlacement = initialPlacement; 3940 break; 3941 } 3942 } 3943 if (placement !== resetPlacement) { 3944 return { 3945 reset: { 3946 placement: resetPlacement 3947 } 3948 }; 3949 } 3950 } 3951 return {}; 3952 } 3953 }; 3954 }; 3955 function getSideOffsets(overflow, rect) { 3956 return { 3957 top: overflow.top - rect.height, 3958 right: overflow.right - rect.width, 3959 bottom: overflow.bottom - rect.height, 3960 left: overflow.left - rect.width 3961 }; 3962 } 3963 function isAnySideFullyClipped(overflow) { 3964 return sides.some((side) => overflow[side] >= 0); 3965 } 3966 var hide = function(options) { 3967 if (options === void 0) { 3968 options = {}; 3969 } 3970 return { 3971 name: "hide", 3972 options, 3973 async fn(state) { 3974 const { 3975 rects, 3976 platform: platform3 3977 } = state; 3978 const { 3979 strategy = "referenceHidden", 3980 ...detectOverflowOptions 3981 } = evaluate(options, state); 3982 switch (strategy) { 3983 case "referenceHidden": { 3984 const overflow = await platform3.detectOverflow(state, { 3985 ...detectOverflowOptions, 3986 elementContext: "reference" 3987 }); 3988 const offsets = getSideOffsets(overflow, rects.reference); 3989 return { 3990 data: { 3991 referenceHiddenOffsets: offsets, 3992 referenceHidden: isAnySideFullyClipped(offsets) 3993 } 3994 }; 3995 } 3996 case "escaped": { 3997 const overflow = await platform3.detectOverflow(state, { 3998 ...detectOverflowOptions, 3999 altBoundary: true 4000 }); 4001 const offsets = getSideOffsets(overflow, rects.floating); 4002 return { 4003 data: { 4004 escapedOffsets: offsets, 4005 escaped: isAnySideFullyClipped(offsets) 4006 } 4007 }; 4008 } 4009 default: { 4010 return {}; 4011 } 4012 } 4013 } 4014 }; 4015 }; 4016 var originSides = /* @__PURE__ */ new Set(["left", "top"]); 4017 async function convertValueToCoords(state, options) { 4018 const { 4019 placement, 4020 platform: platform3, 4021 elements 4022 } = state; 4023 const rtl = await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)); 4024 const side = getSide(placement); 4025 const alignment = getAlignment(placement); 4026 const isVertical = getSideAxis(placement) === "y"; 4027 const mainAxisMulti = originSides.has(side) ? -1 : 1; 4028 const crossAxisMulti = rtl && isVertical ? -1 : 1; 4029 const rawValue = evaluate(options, state); 4030 let { 4031 mainAxis, 4032 crossAxis, 4033 alignmentAxis 4034 } = typeof rawValue === "number" ? { 4035 mainAxis: rawValue, 4036 crossAxis: 0, 4037 alignmentAxis: null 4038 } : { 4039 mainAxis: rawValue.mainAxis || 0, 4040 crossAxis: rawValue.crossAxis || 0, 4041 alignmentAxis: rawValue.alignmentAxis 4042 }; 4043 if (alignment && typeof alignmentAxis === "number") { 4044 crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; 4045 } 4046 return isVertical ? { 4047 x: crossAxis * crossAxisMulti, 4048 y: mainAxis * mainAxisMulti 4049 } : { 4050 x: mainAxis * mainAxisMulti, 4051 y: crossAxis * crossAxisMulti 4052 }; 4053 } 4054 var offset = function(options) { 4055 if (options === void 0) { 4056 options = 0; 4057 } 4058 return { 4059 name: "offset", 4060 options, 4061 async fn(state) { 4062 var _middlewareData$offse, _middlewareData$arrow; 4063 const { 4064 x, 4065 y, 4066 placement, 4067 middlewareData 4068 } = state; 4069 const diffCoords = await convertValueToCoords(state, options); 4070 if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { 4071 return {}; 4072 } 4073 return { 4074 x: x + diffCoords.x, 4075 y: y + diffCoords.y, 4076 data: { 4077 ...diffCoords, 4078 placement 4079 } 4080 }; 4081 } 4082 }; 4083 }; 4084 var shift = function(options) { 4085 if (options === void 0) { 4086 options = {}; 4087 } 4088 return { 4089 name: "shift", 4090 options, 4091 async fn(state) { 4092 const { 4093 x, 4094 y, 4095 placement, 4096 platform: platform3 4097 } = state; 4098 const { 4099 mainAxis: checkMainAxis = true, 4100 crossAxis: checkCrossAxis = false, 4101 limiter = { 4102 fn: (_ref) => { 4103 let { 4104 x: x2, 4105 y: y2 4106 } = _ref; 4107 return { 4108 x: x2, 4109 y: y2 4110 }; 4111 } 4112 }, 4113 ...detectOverflowOptions 4114 } = evaluate(options, state); 4115 const coords = { 4116 x, 4117 y 4118 }; 4119 const overflow = await platform3.detectOverflow(state, detectOverflowOptions); 4120 const crossAxis = getSideAxis(getSide(placement)); 4121 const mainAxis = getOppositeAxis(crossAxis); 4122 let mainAxisCoord = coords[mainAxis]; 4123 let crossAxisCoord = coords[crossAxis]; 4124 if (checkMainAxis) { 4125 const minSide = mainAxis === "y" ? "top" : "left"; 4126 const maxSide = mainAxis === "y" ? "bottom" : "right"; 4127 const min2 = mainAxisCoord + overflow[minSide]; 4128 const max2 = mainAxisCoord - overflow[maxSide]; 4129 mainAxisCoord = clamp(min2, mainAxisCoord, max2); 4130 } 4131 if (checkCrossAxis) { 4132 const minSide = crossAxis === "y" ? "top" : "left"; 4133 const maxSide = crossAxis === "y" ? "bottom" : "right"; 4134 const min2 = crossAxisCoord + overflow[minSide]; 4135 const max2 = crossAxisCoord - overflow[maxSide]; 4136 crossAxisCoord = clamp(min2, crossAxisCoord, max2); 4137 } 4138 const limitedCoords = limiter.fn({ 4139 ...state, 4140 [mainAxis]: mainAxisCoord, 4141 [crossAxis]: crossAxisCoord 4142 }); 4143 return { 4144 ...limitedCoords, 4145 data: { 4146 x: limitedCoords.x - x, 4147 y: limitedCoords.y - y, 4148 enabled: { 4149 [mainAxis]: checkMainAxis, 4150 [crossAxis]: checkCrossAxis 4151 } 4152 } 4153 }; 4154 } 4155 }; 4156 }; 4157 var limitShift = function(options) { 4158 if (options === void 0) { 4159 options = {}; 4160 } 4161 return { 4162 options, 4163 fn(state) { 4164 const { 4165 x, 4166 y, 4167 placement, 4168 rects, 4169 middlewareData 4170 } = state; 4171 const { 4172 offset: offset4 = 0, 4173 mainAxis: checkMainAxis = true, 4174 crossAxis: checkCrossAxis = true 4175 } = evaluate(options, state); 4176 const coords = { 4177 x, 4178 y 4179 }; 4180 const crossAxis = getSideAxis(placement); 4181 const mainAxis = getOppositeAxis(crossAxis); 4182 let mainAxisCoord = coords[mainAxis]; 4183 let crossAxisCoord = coords[crossAxis]; 4184 const rawOffset = evaluate(offset4, state); 4185 const computedOffset = typeof rawOffset === "number" ? { 4186 mainAxis: rawOffset, 4187 crossAxis: 0 4188 } : { 4189 mainAxis: 0, 4190 crossAxis: 0, 4191 ...rawOffset 4192 }; 4193 if (checkMainAxis) { 4194 const len = mainAxis === "y" ? "height" : "width"; 4195 const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis; 4196 const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis; 4197 if (mainAxisCoord < limitMin) { 4198 mainAxisCoord = limitMin; 4199 } else if (mainAxisCoord > limitMax) { 4200 mainAxisCoord = limitMax; 4201 } 4202 } 4203 if (checkCrossAxis) { 4204 var _middlewareData$offse, _middlewareData$offse2; 4205 const len = mainAxis === "y" ? "width" : "height"; 4206 const isOriginSide = originSides.has(getSide(placement)); 4207 const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis); 4208 const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0); 4209 if (crossAxisCoord < limitMin) { 4210 crossAxisCoord = limitMin; 4211 } else if (crossAxisCoord > limitMax) { 4212 crossAxisCoord = limitMax; 4213 } 4214 } 4215 return { 4216 [mainAxis]: mainAxisCoord, 4217 [crossAxis]: crossAxisCoord 4218 }; 4219 } 4220 }; 4221 }; 4222 var size = function(options) { 4223 if (options === void 0) { 4224 options = {}; 4225 } 4226 return { 4227 name: "size", 4228 options, 4229 async fn(state) { 4230 var _state$middlewareData, _state$middlewareData2; 4231 const { 4232 placement, 4233 rects, 4234 platform: platform3, 4235 elements 4236 } = state; 4237 const { 4238 apply = () => { 4239 }, 4240 ...detectOverflowOptions 4241 } = evaluate(options, state); 4242 const overflow = await platform3.detectOverflow(state, detectOverflowOptions); 4243 const side = getSide(placement); 4244 const alignment = getAlignment(placement); 4245 const isYAxis = getSideAxis(placement) === "y"; 4246 const { 4247 width, 4248 height 4249 } = rects.floating; 4250 let heightSide; 4251 let widthSide; 4252 if (side === "top" || side === "bottom") { 4253 heightSide = side; 4254 widthSide = alignment === (await (platform3.isRTL == null ? void 0 : platform3.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right"; 4255 } else { 4256 widthSide = side; 4257 heightSide = alignment === "end" ? "top" : "bottom"; 4258 } 4259 const maximumClippingHeight = height - overflow.top - overflow.bottom; 4260 const maximumClippingWidth = width - overflow.left - overflow.right; 4261 const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight); 4262 const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth); 4263 const noShift = !state.middlewareData.shift; 4264 let availableHeight = overflowAvailableHeight; 4265 let availableWidth = overflowAvailableWidth; 4266 if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { 4267 availableWidth = maximumClippingWidth; 4268 } 4269 if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { 4270 availableHeight = maximumClippingHeight; 4271 } 4272 if (noShift && !alignment) { 4273 const xMin = max(overflow.left, 0); 4274 const xMax = max(overflow.right, 0); 4275 const yMin = max(overflow.top, 0); 4276 const yMax = max(overflow.bottom, 0); 4277 if (isYAxis) { 4278 availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)); 4279 } else { 4280 availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)); 4281 } 4282 } 4283 await apply({ 4284 ...state, 4285 availableWidth, 4286 availableHeight 4287 }); 4288 const nextDimensions = await platform3.getDimensions(elements.floating); 4289 if (width !== nextDimensions.width || height !== nextDimensions.height) { 4290 return { 4291 reset: { 4292 rects: true 4293 } 4294 }; 4295 } 4296 return {}; 4297 } 4298 }; 4299 }; 4300 4301 // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs 4302 function getCssDimensions(element) { 4303 const css = getComputedStyle2(element); 4304 let width = parseFloat(css.width) || 0; 4305 let height = parseFloat(css.height) || 0; 4306 const hasOffset = isHTMLElement(element); 4307 const offsetWidth = hasOffset ? element.offsetWidth : width; 4308 const offsetHeight = hasOffset ? element.offsetHeight : height; 4309 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; 4310 if (shouldFallback) { 4311 width = offsetWidth; 4312 height = offsetHeight; 4313 } 4314 return { 4315 width, 4316 height, 4317 $: shouldFallback 4318 }; 4319 } 4320 function unwrapElement(element) { 4321 return !isElement(element) ? element.contextElement : element; 4322 } 4323 function getScale(element) { 4324 const domElement = unwrapElement(element); 4325 if (!isHTMLElement(domElement)) { 4326 return createCoords(1); 4327 } 4328 const rect = domElement.getBoundingClientRect(); 4329 const { 4330 width, 4331 height, 4332 $ 4333 } = getCssDimensions(domElement); 4334 let x = ($ ? round(rect.width) : rect.width) / width; 4335 let y = ($ ? round(rect.height) : rect.height) / height; 4336 if (!x || !Number.isFinite(x)) { 4337 x = 1; 4338 } 4339 if (!y || !Number.isFinite(y)) { 4340 y = 1; 4341 } 4342 return { 4343 x, 4344 y 4345 }; 4346 } 4347 var noOffsets = /* @__PURE__ */ createCoords(0); 4348 function getVisualOffsets(element) { 4349 const win = getWindow(element); 4350 if (!isWebKit() || !win.visualViewport) { 4351 return noOffsets; 4352 } 4353 return { 4354 x: win.visualViewport.offsetLeft, 4355 y: win.visualViewport.offsetTop 4356 }; 4357 } 4358 function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { 4359 if (isFixed === void 0) { 4360 isFixed = false; 4361 } 4362 if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) { 4363 return false; 4364 } 4365 return isFixed; 4366 } 4367 function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { 4368 if (includeScale === void 0) { 4369 includeScale = false; 4370 } 4371 if (isFixedStrategy === void 0) { 4372 isFixedStrategy = false; 4373 } 4374 const clientRect = element.getBoundingClientRect(); 4375 const domElement = unwrapElement(element); 4376 let scale = createCoords(1); 4377 if (includeScale) { 4378 if (offsetParent) { 4379 if (isElement(offsetParent)) { 4380 scale = getScale(offsetParent); 4381 } 4382 } else { 4383 scale = getScale(element); 4384 } 4385 } 4386 const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); 4387 let x = (clientRect.left + visualOffsets.x) / scale.x; 4388 let y = (clientRect.top + visualOffsets.y) / scale.y; 4389 let width = clientRect.width / scale.x; 4390 let height = clientRect.height / scale.y; 4391 if (domElement) { 4392 const win = getWindow(domElement); 4393 const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; 4394 let currentWin = win; 4395 let currentIFrame = getFrameElement(currentWin); 4396 while (currentIFrame && offsetParent && offsetWin !== currentWin) { 4397 const iframeScale = getScale(currentIFrame); 4398 const iframeRect = currentIFrame.getBoundingClientRect(); 4399 const css = getComputedStyle2(currentIFrame); 4400 const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; 4401 const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; 4402 x *= iframeScale.x; 4403 y *= iframeScale.y; 4404 width *= iframeScale.x; 4405 height *= iframeScale.y; 4406 x += left; 4407 y += top; 4408 currentWin = getWindow(currentIFrame); 4409 currentIFrame = getFrameElement(currentWin); 4410 } 4411 } 4412 return rectToClientRect({ 4413 width, 4414 height, 4415 x, 4416 y 4417 }); 4418 } 4419 function getWindowScrollBarX(element, rect) { 4420 const leftScroll = getNodeScroll(element).scrollLeft; 4421 if (!rect) { 4422 return getBoundingClientRect(getDocumentElement(element)).left + leftScroll; 4423 } 4424 return rect.left + leftScroll; 4425 } 4426 function getHTMLOffset(documentElement, scroll) { 4427 const htmlRect = documentElement.getBoundingClientRect(); 4428 const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect); 4429 const y = htmlRect.top + scroll.scrollTop; 4430 return { 4431 x, 4432 y 4433 }; 4434 } 4435 function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { 4436 let { 4437 elements, 4438 rect, 4439 offsetParent, 4440 strategy 4441 } = _ref; 4442 const isFixed = strategy === "fixed"; 4443 const documentElement = getDocumentElement(offsetParent); 4444 const topLayer = elements ? isTopLayer(elements.floating) : false; 4445 if (offsetParent === documentElement || topLayer && isFixed) { 4446 return rect; 4447 } 4448 let scroll = { 4449 scrollLeft: 0, 4450 scrollTop: 0 4451 }; 4452 let scale = createCoords(1); 4453 const offsets = createCoords(0); 4454 const isOffsetParentAnElement = isHTMLElement(offsetParent); 4455 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 4456 if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { 4457 scroll = getNodeScroll(offsetParent); 4458 } 4459 if (isOffsetParentAnElement) { 4460 const offsetRect = getBoundingClientRect(offsetParent); 4461 scale = getScale(offsetParent); 4462 offsets.x = offsetRect.x + offsetParent.clientLeft; 4463 offsets.y = offsetRect.y + offsetParent.clientTop; 4464 } 4465 } 4466 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); 4467 return { 4468 width: rect.width * scale.x, 4469 height: rect.height * scale.y, 4470 x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, 4471 y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y 4472 }; 4473 } 4474 function getClientRects(element) { 4475 return Array.from(element.getClientRects()); 4476 } 4477 function getDocumentRect(element) { 4478 const html = getDocumentElement(element); 4479 const scroll = getNodeScroll(element); 4480 const body = element.ownerDocument.body; 4481 const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); 4482 const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); 4483 let x = -scroll.scrollLeft + getWindowScrollBarX(element); 4484 const y = -scroll.scrollTop; 4485 if (getComputedStyle2(body).direction === "rtl") { 4486 x += max(html.clientWidth, body.clientWidth) - width; 4487 } 4488 return { 4489 width, 4490 height, 4491 x, 4492 y 4493 }; 4494 } 4495 var SCROLLBAR_MAX = 25; 4496 function getViewportRect(element, strategy) { 4497 const win = getWindow(element); 4498 const html = getDocumentElement(element); 4499 const visualViewport = win.visualViewport; 4500 let width = html.clientWidth; 4501 let height = html.clientHeight; 4502 let x = 0; 4503 let y = 0; 4504 if (visualViewport) { 4505 width = visualViewport.width; 4506 height = visualViewport.height; 4507 const visualViewportBased = isWebKit(); 4508 if (!visualViewportBased || visualViewportBased && strategy === "fixed") { 4509 x = visualViewport.offsetLeft; 4510 y = visualViewport.offsetTop; 4511 } 4512 } 4513 const windowScrollbarX = getWindowScrollBarX(html); 4514 if (windowScrollbarX <= 0) { 4515 const doc = html.ownerDocument; 4516 const body = doc.body; 4517 const bodyStyles = getComputedStyle(body); 4518 const bodyMarginInline = doc.compatMode === "CSS1Compat" ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0; 4519 const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline); 4520 if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) { 4521 width -= clippingStableScrollbarWidth; 4522 } 4523 } else if (windowScrollbarX <= SCROLLBAR_MAX) { 4524 width += windowScrollbarX; 4525 } 4526 return { 4527 width, 4528 height, 4529 x, 4530 y 4531 }; 4532 } 4533 function getInnerBoundingClientRect(element, strategy) { 4534 const clientRect = getBoundingClientRect(element, true, strategy === "fixed"); 4535 const top = clientRect.top + element.clientTop; 4536 const left = clientRect.left + element.clientLeft; 4537 const scale = isHTMLElement(element) ? getScale(element) : createCoords(1); 4538 const width = element.clientWidth * scale.x; 4539 const height = element.clientHeight * scale.y; 4540 const x = left * scale.x; 4541 const y = top * scale.y; 4542 return { 4543 width, 4544 height, 4545 x, 4546 y 4547 }; 4548 } 4549 function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { 4550 let rect; 4551 if (clippingAncestor === "viewport") { 4552 rect = getViewportRect(element, strategy); 4553 } else if (clippingAncestor === "document") { 4554 rect = getDocumentRect(getDocumentElement(element)); 4555 } else if (isElement(clippingAncestor)) { 4556 rect = getInnerBoundingClientRect(clippingAncestor, strategy); 4557 } else { 4558 const visualOffsets = getVisualOffsets(element); 4559 rect = { 4560 x: clippingAncestor.x - visualOffsets.x, 4561 y: clippingAncestor.y - visualOffsets.y, 4562 width: clippingAncestor.width, 4563 height: clippingAncestor.height 4564 }; 4565 } 4566 return rectToClientRect(rect); 4567 } 4568 function hasFixedPositionAncestor(element, stopNode) { 4569 const parentNode = getParentNode(element); 4570 if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { 4571 return false; 4572 } 4573 return getComputedStyle2(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); 4574 } 4575 function getClippingElementAncestors(element, cache) { 4576 const cachedResult = cache.get(element); 4577 if (cachedResult) { 4578 return cachedResult; 4579 } 4580 let result = getOverflowAncestors(element, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body"); 4581 let currentContainingBlockComputedStyle = null; 4582 const elementIsFixed = getComputedStyle2(element).position === "fixed"; 4583 let currentNode = elementIsFixed ? getParentNode(element) : element; 4584 while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { 4585 const computedStyle = getComputedStyle2(currentNode); 4586 const currentNodeIsContaining = isContainingBlock(currentNode); 4587 if (!currentNodeIsContaining && computedStyle.position === "fixed") { 4588 currentContainingBlockComputedStyle = null; 4589 } 4590 const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && (currentContainingBlockComputedStyle.position === "absolute" || currentContainingBlockComputedStyle.position === "fixed") || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); 4591 if (shouldDropCurrentNode) { 4592 result = result.filter((ancestor) => ancestor !== currentNode); 4593 } else { 4594 currentContainingBlockComputedStyle = computedStyle; 4595 } 4596 currentNode = getParentNode(currentNode); 4597 } 4598 cache.set(element, result); 4599 return result; 4600 } 4601 function getClippingRect(_ref) { 4602 let { 4603 element, 4604 boundary, 4605 rootBoundary, 4606 strategy 4607 } = _ref; 4608 const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary); 4609 const clippingAncestors = [...elementClippingAncestors, rootBoundary]; 4610 const firstRect = getClientRectFromClippingAncestor(element, clippingAncestors[0], strategy); 4611 let top = firstRect.top; 4612 let right = firstRect.right; 4613 let bottom = firstRect.bottom; 4614 let left = firstRect.left; 4615 for (let i = 1; i < clippingAncestors.length; i++) { 4616 const rect = getClientRectFromClippingAncestor(element, clippingAncestors[i], strategy); 4617 top = max(rect.top, top); 4618 right = min(rect.right, right); 4619 bottom = min(rect.bottom, bottom); 4620 left = max(rect.left, left); 4621 } 4622 return { 4623 width: right - left, 4624 height: bottom - top, 4625 x: left, 4626 y: top 4627 }; 4628 } 4629 function getDimensions(element) { 4630 const { 4631 width, 4632 height 4633 } = getCssDimensions(element); 4634 return { 4635 width, 4636 height 4637 }; 4638 } 4639 function getRectRelativeToOffsetParent(element, offsetParent, strategy) { 4640 const isOffsetParentAnElement = isHTMLElement(offsetParent); 4641 const documentElement = getDocumentElement(offsetParent); 4642 const isFixed = strategy === "fixed"; 4643 const rect = getBoundingClientRect(element, true, isFixed, offsetParent); 4644 let scroll = { 4645 scrollLeft: 0, 4646 scrollTop: 0 4647 }; 4648 const offsets = createCoords(0); 4649 function setLeftRTLScrollbarOffset() { 4650 offsets.x = getWindowScrollBarX(documentElement); 4651 } 4652 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 4653 if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { 4654 scroll = getNodeScroll(offsetParent); 4655 } 4656 if (isOffsetParentAnElement) { 4657 const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); 4658 offsets.x = offsetRect.x + offsetParent.clientLeft; 4659 offsets.y = offsetRect.y + offsetParent.clientTop; 4660 } else if (documentElement) { 4661 setLeftRTLScrollbarOffset(); 4662 } 4663 } 4664 if (isFixed && !isOffsetParentAnElement && documentElement) { 4665 setLeftRTLScrollbarOffset(); 4666 } 4667 const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); 4668 const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; 4669 const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; 4670 return { 4671 x, 4672 y, 4673 width: rect.width, 4674 height: rect.height 4675 }; 4676 } 4677 function isStaticPositioned(element) { 4678 return getComputedStyle2(element).position === "static"; 4679 } 4680 function getTrueOffsetParent(element, polyfill) { 4681 if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") { 4682 return null; 4683 } 4684 if (polyfill) { 4685 return polyfill(element); 4686 } 4687 let rawOffsetParent = element.offsetParent; 4688 if (getDocumentElement(element) === rawOffsetParent) { 4689 rawOffsetParent = rawOffsetParent.ownerDocument.body; 4690 } 4691 return rawOffsetParent; 4692 } 4693 function getOffsetParent(element, polyfill) { 4694 const win = getWindow(element); 4695 if (isTopLayer(element)) { 4696 return win; 4697 } 4698 if (!isHTMLElement(element)) { 4699 let svgOffsetParent = getParentNode(element); 4700 while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { 4701 if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { 4702 return svgOffsetParent; 4703 } 4704 svgOffsetParent = getParentNode(svgOffsetParent); 4705 } 4706 return win; 4707 } 4708 let offsetParent = getTrueOffsetParent(element, polyfill); 4709 while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) { 4710 offsetParent = getTrueOffsetParent(offsetParent, polyfill); 4711 } 4712 if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { 4713 return win; 4714 } 4715 return offsetParent || getContainingBlock(element) || win; 4716 } 4717 var getElementRects = async function(data) { 4718 const getOffsetParentFn = this.getOffsetParent || getOffsetParent; 4719 const getDimensionsFn = this.getDimensions; 4720 const floatingDimensions = await getDimensionsFn(data.floating); 4721 return { 4722 reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), 4723 floating: { 4724 x: 0, 4725 y: 0, 4726 width: floatingDimensions.width, 4727 height: floatingDimensions.height 4728 } 4729 }; 4730 }; 4731 function isRTL(element) { 4732 return getComputedStyle2(element).direction === "rtl"; 4733 } 4734 var platform2 = { 4735 convertOffsetParentRelativeRectToViewportRelativeRect, 4736 getDocumentElement, 4737 getClippingRect, 4738 getOffsetParent, 4739 getElementRects, 4740 getClientRects, 4741 getDimensions, 4742 getScale, 4743 isElement, 4744 isRTL 4745 }; 4746 function rectsAreEqual(a, b) { 4747 return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; 4748 } 4749 function observeMove(element, onMove) { 4750 let io = null; 4751 let timeoutId; 4752 const root = getDocumentElement(element); 4753 function cleanup() { 4754 var _io; 4755 clearTimeout(timeoutId); 4756 (_io = io) == null || _io.disconnect(); 4757 io = null; 4758 } 4759 function refresh(skip, threshold) { 4760 if (skip === void 0) { 4761 skip = false; 4762 } 4763 if (threshold === void 0) { 4764 threshold = 1; 4765 } 4766 cleanup(); 4767 const elementRectForRootMargin = element.getBoundingClientRect(); 4768 const { 4769 left, 4770 top, 4771 width, 4772 height 4773 } = elementRectForRootMargin; 4774 if (!skip) { 4775 onMove(); 4776 } 4777 if (!width || !height) { 4778 return; 4779 } 4780 const insetTop = floor(top); 4781 const insetRight = floor(root.clientWidth - (left + width)); 4782 const insetBottom = floor(root.clientHeight - (top + height)); 4783 const insetLeft = floor(left); 4784 const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; 4785 const options = { 4786 rootMargin, 4787 threshold: max(0, min(1, threshold)) || 1 4788 }; 4789 let isFirstUpdate = true; 4790 function handleObserve(entries) { 4791 const ratio = entries[0].intersectionRatio; 4792 if (ratio !== threshold) { 4793 if (!isFirstUpdate) { 4794 return refresh(); 4795 } 4796 if (!ratio) { 4797 timeoutId = setTimeout(() => { 4798 refresh(false, 1e-7); 4799 }, 1e3); 4800 } else { 4801 refresh(false, ratio); 4802 } 4803 } 4804 if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) { 4805 refresh(); 4806 } 4807 isFirstUpdate = false; 4808 } 4809 try { 4810 io = new IntersectionObserver(handleObserve, { 4811 ...options, 4812 // Handle <iframe>s 4813 root: root.ownerDocument 4814 }); 4815 } catch (_e) { 4816 io = new IntersectionObserver(handleObserve, options); 4817 } 4818 io.observe(element); 4819 } 4820 refresh(true); 4821 return cleanup; 4822 } 4823 function autoUpdate(reference, floating, update2, options) { 4824 if (options === void 0) { 4825 options = {}; 4826 } 4827 const { 4828 ancestorScroll = true, 4829 ancestorResize = true, 4830 elementResize = typeof ResizeObserver === "function", 4831 layoutShift = typeof IntersectionObserver === "function", 4832 animationFrame = false 4833 } = options; 4834 const referenceEl = unwrapElement(reference); 4835 const ancestors = ancestorScroll || ancestorResize ? [...referenceEl ? getOverflowAncestors(referenceEl) : [], ...floating ? getOverflowAncestors(floating) : []] : []; 4836 ancestors.forEach((ancestor) => { 4837 ancestorScroll && ancestor.addEventListener("scroll", update2, { 4838 passive: true 4839 }); 4840 ancestorResize && ancestor.addEventListener("resize", update2); 4841 }); 4842 const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update2) : null; 4843 let reobserveFrame = -1; 4844 let resizeObserver = null; 4845 if (elementResize) { 4846 resizeObserver = new ResizeObserver((_ref) => { 4847 let [firstEntry] = _ref; 4848 if (firstEntry && firstEntry.target === referenceEl && resizeObserver && floating) { 4849 resizeObserver.unobserve(floating); 4850 cancelAnimationFrame(reobserveFrame); 4851 reobserveFrame = requestAnimationFrame(() => { 4852 var _resizeObserver; 4853 (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating); 4854 }); 4855 } 4856 update2(); 4857 }); 4858 if (referenceEl && !animationFrame) { 4859 resizeObserver.observe(referenceEl); 4860 } 4861 if (floating) { 4862 resizeObserver.observe(floating); 4863 } 4864 } 4865 let frameId; 4866 let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null; 4867 if (animationFrame) { 4868 frameLoop(); 4869 } 4870 function frameLoop() { 4871 const nextRefRect = getBoundingClientRect(reference); 4872 if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) { 4873 update2(); 4874 } 4875 prevRefRect = nextRefRect; 4876 frameId = requestAnimationFrame(frameLoop); 4877 } 4878 update2(); 4879 return () => { 4880 var _resizeObserver2; 4881 ancestors.forEach((ancestor) => { 4882 ancestorScroll && ancestor.removeEventListener("scroll", update2); 4883 ancestorResize && ancestor.removeEventListener("resize", update2); 4884 }); 4885 cleanupIo == null || cleanupIo(); 4886 (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect(); 4887 resizeObserver = null; 4888 if (animationFrame) { 4889 cancelAnimationFrame(frameId); 4890 } 4891 }; 4892 } 4893 var offset2 = offset; 4894 var shift2 = shift; 4895 var flip2 = flip; 4896 var size2 = size; 4897 var hide2 = hide; 4898 var limitShift2 = limitShift; 4899 var computePosition2 = (reference, floating, options) => { 4900 const cache = /* @__PURE__ */ new Map(); 4901 const mergedOptions = { 4902 platform: platform2, 4903 ...options 4904 }; 4905 const platformWithCache = { 4906 ...mergedOptions.platform, 4907 _c: cache 4908 }; 4909 return computePosition(reference, floating, { 4910 ...mergedOptions, 4911 platform: platformWithCache 4912 }); 4913 }; 4914 4915 // node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs 4916 var React19 = __toESM(require_react(), 1); 4917 var import_react2 = __toESM(require_react(), 1); 4918 var ReactDOM3 = __toESM(require_react_dom(), 1); 4919 var isClient = typeof document !== "undefined"; 4920 var noop2 = function noop3() { 4921 }; 4922 var index = isClient ? import_react2.useLayoutEffect : noop2; 4923 function deepEqual(a, b) { 4924 if (a === b) { 4925 return true; 4926 } 4927 if (typeof a !== typeof b) { 4928 return false; 4929 } 4930 if (typeof a === "function" && a.toString() === b.toString()) { 4931 return true; 4932 } 4933 let length; 4934 let i; 4935 let keys; 4936 if (a && b && typeof a === "object") { 4937 if (Array.isArray(a)) { 4938 length = a.length; 4939 if (length !== b.length) return false; 4940 for (i = length; i-- !== 0; ) { 4941 if (!deepEqual(a[i], b[i])) { 4942 return false; 4943 } 4944 } 4945 return true; 4946 } 4947 keys = Object.keys(a); 4948 length = keys.length; 4949 if (length !== Object.keys(b).length) { 4950 return false; 4951 } 4952 for (i = length; i-- !== 0; ) { 4953 if (!{}.hasOwnProperty.call(b, keys[i])) { 4954 return false; 4955 } 4956 } 4957 for (i = length; i-- !== 0; ) { 4958 const key = keys[i]; 4959 if (key === "_owner" && a.$$typeof) { 4960 continue; 4961 } 4962 if (!deepEqual(a[key], b[key])) { 4963 return false; 4964 } 4965 } 4966 return true; 4967 } 4968 return a !== a && b !== b; 4969 } 4970 function getDPR(element) { 4971 if (typeof window === "undefined") { 4972 return 1; 4973 } 4974 const win = element.ownerDocument.defaultView || window; 4975 return win.devicePixelRatio || 1; 4976 } 4977 function roundByDPR(element, value) { 4978 const dpr = getDPR(element); 4979 return Math.round(value * dpr) / dpr; 4980 } 4981 function useLatestRef(value) { 4982 const ref = React19.useRef(value); 4983 index(() => { 4984 ref.current = value; 4985 }); 4986 return ref; 4987 } 4988 function useFloating(options) { 4989 if (options === void 0) { 4990 options = {}; 4991 } 4992 const { 4993 placement = "bottom", 4994 strategy = "absolute", 4995 middleware = [], 4996 platform: platform3, 4997 elements: { 4998 reference: externalReference, 4999 floating: externalFloating 5000 } = {}, 5001 transform = true, 5002 whileElementsMounted, 5003 open 5004 } = options; 5005 const [data, setData] = React19.useState({ 5006 x: 0, 5007 y: 0, 5008 strategy, 5009 placement, 5010 middlewareData: {}, 5011 isPositioned: false 5012 }); 5013 const [latestMiddleware, setLatestMiddleware] = React19.useState(middleware); 5014 if (!deepEqual(latestMiddleware, middleware)) { 5015 setLatestMiddleware(middleware); 5016 } 5017 const [_reference, _setReference] = React19.useState(null); 5018 const [_floating, _setFloating] = React19.useState(null); 5019 const setReference = React19.useCallback((node) => { 5020 if (node !== referenceRef.current) { 5021 referenceRef.current = node; 5022 _setReference(node); 5023 } 5024 }, []); 5025 const setFloating = React19.useCallback((node) => { 5026 if (node !== floatingRef.current) { 5027 floatingRef.current = node; 5028 _setFloating(node); 5029 } 5030 }, []); 5031 const referenceEl = externalReference || _reference; 5032 const floatingEl = externalFloating || _floating; 5033 const referenceRef = React19.useRef(null); 5034 const floatingRef = React19.useRef(null); 5035 const dataRef = React19.useRef(data); 5036 const hasWhileElementsMounted = whileElementsMounted != null; 5037 const whileElementsMountedRef = useLatestRef(whileElementsMounted); 5038 const platformRef = useLatestRef(platform3); 5039 const openRef = useLatestRef(open); 5040 const update2 = React19.useCallback(() => { 5041 if (!referenceRef.current || !floatingRef.current) { 5042 return; 5043 } 5044 const config = { 5045 placement, 5046 strategy, 5047 middleware: latestMiddleware 5048 }; 5049 if (platformRef.current) { 5050 config.platform = platformRef.current; 5051 } 5052 computePosition2(referenceRef.current, floatingRef.current, config).then((data2) => { 5053 const fullData = { 5054 ...data2, 5055 // The floating element's position may be recomputed while it's closed 5056 // but still mounted (such as when transitioning out). To ensure 5057 // `isPositioned` will be `false` initially on the next open, avoid 5058 // setting it to `true` when `open === false` (must be specified). 5059 isPositioned: openRef.current !== false 5060 }; 5061 if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) { 5062 dataRef.current = fullData; 5063 ReactDOM3.flushSync(() => { 5064 setData(fullData); 5065 }); 5066 } 5067 }); 5068 }, [latestMiddleware, placement, strategy, platformRef, openRef]); 5069 index(() => { 5070 if (open === false && dataRef.current.isPositioned) { 5071 dataRef.current.isPositioned = false; 5072 setData((data2) => ({ 5073 ...data2, 5074 isPositioned: false 5075 })); 5076 } 5077 }, [open]); 5078 const isMountedRef = React19.useRef(false); 5079 index(() => { 5080 isMountedRef.current = true; 5081 return () => { 5082 isMountedRef.current = false; 5083 }; 5084 }, []); 5085 index(() => { 5086 if (referenceEl) referenceRef.current = referenceEl; 5087 if (floatingEl) floatingRef.current = floatingEl; 5088 if (referenceEl && floatingEl) { 5089 if (whileElementsMountedRef.current) { 5090 return whileElementsMountedRef.current(referenceEl, floatingEl, update2); 5091 } 5092 update2(); 5093 } 5094 }, [referenceEl, floatingEl, update2, whileElementsMountedRef, hasWhileElementsMounted]); 5095 const refs = React19.useMemo(() => ({ 5096 reference: referenceRef, 5097 floating: floatingRef, 5098 setReference, 5099 setFloating 5100 }), [setReference, setFloating]); 5101 const elements = React19.useMemo(() => ({ 5102 reference: referenceEl, 5103 floating: floatingEl 5104 }), [referenceEl, floatingEl]); 5105 const floatingStyles = React19.useMemo(() => { 5106 const initialStyles = { 5107 position: strategy, 5108 left: 0, 5109 top: 0 5110 }; 5111 if (!elements.floating) { 5112 return initialStyles; 5113 } 5114 const x = roundByDPR(elements.floating, data.x); 5115 const y = roundByDPR(elements.floating, data.y); 5116 if (transform) { 5117 return { 5118 ...initialStyles, 5119 transform: "translate(" + x + "px, " + y + "px)", 5120 ...getDPR(elements.floating) >= 1.5 && { 5121 willChange: "transform" 5122 } 5123 }; 5124 } 5125 return { 5126 position: strategy, 5127 left: x, 5128 top: y 5129 }; 5130 }, [strategy, transform, elements.floating, data.x, data.y]); 5131 return React19.useMemo(() => ({ 5132 ...data, 5133 update: update2, 5134 refs, 5135 elements, 5136 floatingStyles 5137 }), [data, update2, refs, elements, floatingStyles]); 5138 } 5139 var offset3 = (options, deps) => { 5140 const result = offset2(options); 5141 return { 5142 name: result.name, 5143 fn: result.fn, 5144 options: [options, deps] 5145 }; 5146 }; 5147 var shift3 = (options, deps) => { 5148 const result = shift2(options); 5149 return { 5150 name: result.name, 5151 fn: result.fn, 5152 options: [options, deps] 5153 }; 5154 }; 5155 var limitShift3 = (options, deps) => { 5156 const result = limitShift2(options); 5157 return { 5158 fn: result.fn, 5159 options: [options, deps] 5160 }; 5161 }; 5162 var flip3 = (options, deps) => { 5163 const result = flip2(options); 5164 return { 5165 name: result.name, 5166 fn: result.fn, 5167 options: [options, deps] 5168 }; 5169 }; 5170 var size3 = (options, deps) => { 5171 const result = size2(options); 5172 return { 5173 name: result.name, 5174 fn: result.fn, 5175 options: [options, deps] 5176 }; 5177 }; 5178 var hide3 = (options, deps) => { 5179 const result = hide2(options); 5180 return { 5181 name: result.name, 5182 fn: result.fn, 5183 options: [options, deps] 5184 }; 5185 }; 5186 5187 // node_modules/@base-ui/react/utils/popups/popupStoreUtils.mjs 5188 var React24 = __toESM(require_react(), 1); 5189 var ReactDOM4 = __toESM(require_react_dom(), 1); 5190 5191 // node_modules/@base-ui/react/floating-ui-react/hooks/useSyncedFloatingRootContext.mjs 5192 var React23 = __toESM(require_react(), 1); 5193 5194 // node_modules/@base-ui/utils/store/createSelector.mjs 5195 var createSelector2 = (a, b, c, d, e, f, ...other) => { 5196 if (other.length > 0) { 5197 throw new Error(true ? "Unsupported number of selectors" : formatErrorMessage_default(1)); 5198 } 5199 let selector; 5200 if (a && b && c && d && e && f) { 5201 selector = (state, a1, a2, a3) => { 5202 const va = a(state, a1, a2, a3); 5203 const vb = b(state, a1, a2, a3); 5204 const vc = c(state, a1, a2, a3); 5205 const vd = d(state, a1, a2, a3); 5206 const ve = e(state, a1, a2, a3); 5207 return f(va, vb, vc, vd, ve, a1, a2, a3); 5208 }; 5209 } else if (a && b && c && d && e) { 5210 selector = (state, a1, a2, a3) => { 5211 const va = a(state, a1, a2, a3); 5212 const vb = b(state, a1, a2, a3); 5213 const vc = c(state, a1, a2, a3); 5214 const vd = d(state, a1, a2, a3); 5215 return e(va, vb, vc, vd, a1, a2, a3); 5216 }; 5217 } else if (a && b && c && d) { 5218 selector = (state, a1, a2, a3) => { 5219 const va = a(state, a1, a2, a3); 5220 const vb = b(state, a1, a2, a3); 5221 const vc = c(state, a1, a2, a3); 5222 return d(va, vb, vc, a1, a2, a3); 5223 }; 5224 } else if (a && b && c) { 5225 selector = (state, a1, a2, a3) => { 5226 const va = a(state, a1, a2, a3); 5227 const vb = b(state, a1, a2, a3); 5228 return c(va, vb, a1, a2, a3); 5229 }; 5230 } else if (a && b) { 5231 selector = (state, a1, a2, a3) => { 5232 const va = a(state, a1, a2, a3); 5233 return b(va, a1, a2, a3); 5234 }; 5235 } else if (a) { 5236 selector = a; 5237 } else { 5238 throw ( 5239 /* minify-error-disabled */ 5240 new Error("Missing arguments") 5241 ); 5242 } 5243 return selector; 5244 }; 5245 5246 // node_modules/@base-ui/utils/store/useStore.mjs 5247 var React21 = __toESM(require_react(), 1); 5248 var import_shim = __toESM(require_shim(), 1); 5249 var import_with_selector = __toESM(require_with_selector(), 1); 5250 5251 // node_modules/@base-ui/utils/fastHooks.mjs 5252 var React20 = __toESM(require_react(), 1); 5253 var hooks = []; 5254 var currentInstance = void 0; 5255 function getInstance() { 5256 return currentInstance; 5257 } 5258 function register2(hook) { 5259 hooks.push(hook); 5260 } 5261 function fastComponent(fn) { 5262 const FastComponent = (props, forwardedRef) => { 5263 const instance = useRefWithInit(createInstance).current; 5264 let result; 5265 try { 5266 currentInstance = instance; 5267 for (const hook of hooks) { 5268 hook.before(instance); 5269 } 5270 result = fn(props, forwardedRef); 5271 for (const hook of hooks) { 5272 hook.after(instance); 5273 } 5274 instance.didInitialize = true; 5275 } finally { 5276 currentInstance = void 0; 5277 } 5278 return result; 5279 }; 5280 FastComponent.displayName = fn.displayName || fn.name; 5281 return FastComponent; 5282 } 5283 function fastComponentRef(fn) { 5284 return /* @__PURE__ */ React20.forwardRef(fastComponent(fn)); 5285 } 5286 function createInstance() { 5287 return { 5288 didInitialize: false 5289 }; 5290 } 5291 5292 // node_modules/@base-ui/utils/store/useStore.mjs 5293 var canUseRawUseSyncExternalStore = isReactVersionAtLeast(19); 5294 var useStoreImplementation = canUseRawUseSyncExternalStore ? useStoreFast : useStoreLegacy; 5295 function useStore(store2, selector, a1, a2, a3) { 5296 return useStoreImplementation(store2, selector, a1, a2, a3); 5297 } 5298 function useStoreR19(store2, selector, a1, a2, a3) { 5299 const getSelection = React21.useCallback(() => selector(store2.getSnapshot(), a1, a2, a3), [store2, selector, a1, a2, a3]); 5300 return (0, import_shim.useSyncExternalStore)(store2.subscribe, getSelection, getSelection); 5301 } 5302 register2({ 5303 before(instance) { 5304 instance.syncIndex = 0; 5305 if (!instance.didInitialize) { 5306 instance.syncTick = 1; 5307 instance.syncHooks = []; 5308 instance.didChangeStore = true; 5309 instance.getSnapshot = () => { 5310 let didChange2 = false; 5311 for (let i = 0; i < instance.syncHooks.length; i += 1) { 5312 const hook = instance.syncHooks[i]; 5313 const value = hook.selector(hook.store.state, hook.a1, hook.a2, hook.a3); 5314 if (!Object.is(hook.value, value)) { 5315 didChange2 = true; 5316 hook.value = value; 5317 } 5318 } 5319 if (didChange2) { 5320 instance.syncTick += 1; 5321 } 5322 return instance.syncTick; 5323 }; 5324 } 5325 }, 5326 after(instance) { 5327 if (instance.syncHooks.length > 0) { 5328 if (instance.didChangeStore) { 5329 instance.didChangeStore = false; 5330 instance.subscribe = (onStoreChange) => { 5331 const stores = /* @__PURE__ */ new Set(); 5332 for (const hook of instance.syncHooks) { 5333 stores.add(hook.store); 5334 } 5335 const unsubscribes = []; 5336 for (const store2 of stores) { 5337 unsubscribes.push(store2.subscribe(onStoreChange)); 5338 } 5339 return () => { 5340 for (const unsubscribe of unsubscribes) { 5341 unsubscribe(); 5342 } 5343 }; 5344 }; 5345 } 5346 (0, import_shim.useSyncExternalStore)(instance.subscribe, instance.getSnapshot, instance.getSnapshot); 5347 } 5348 } 5349 }); 5350 function useStoreFast(store2, selector, a1, a2, a3) { 5351 const instance = getInstance(); 5352 if (!instance) { 5353 return useStoreR19(store2, selector, a1, a2, a3); 5354 } 5355 const index2 = instance.syncIndex; 5356 instance.syncIndex += 1; 5357 let hook; 5358 if (!instance.didInitialize) { 5359 hook = { 5360 store: store2, 5361 selector, 5362 a1, 5363 a2, 5364 a3, 5365 value: selector(store2.getSnapshot(), a1, a2, a3) 5366 }; 5367 instance.syncHooks.push(hook); 5368 } else { 5369 hook = instance.syncHooks[index2]; 5370 if (hook.store !== store2 || hook.selector !== selector || !Object.is(hook.a1, a1) || !Object.is(hook.a2, a2) || !Object.is(hook.a3, a3)) { 5371 if (hook.store !== store2) { 5372 instance.didChangeStore = true; 5373 } 5374 hook.store = store2; 5375 hook.selector = selector; 5376 hook.a1 = a1; 5377 hook.a2 = a2; 5378 hook.a3 = a3; 5379 hook.value = selector(store2.getSnapshot(), a1, a2, a3); 5380 } 5381 } 5382 return hook.value; 5383 } 5384 function useStoreLegacy(store2, selector, a1, a2, a3) { 5385 return (0, import_with_selector.useSyncExternalStoreWithSelector)(store2.subscribe, store2.getSnapshot, store2.getSnapshot, (state) => selector(state, a1, a2, a3)); 5386 } 5387 5388 // node_modules/@base-ui/utils/store/Store.mjs 5389 var Store = class { 5390 /** 5391 * The current state of the store. 5392 * This property is updated immediately when the state changes as a result of calling {@link setState}, {@link update}, or {@link set}. 5393 * To subscribe to state changes, use the {@link useState} method. The value returned by {@link useState} is updated after the component renders (similarly to React's useState). 5394 * The values can be used directly (to avoid subscribing to the store) in effects or event handlers. 5395 * 5396 * Do not modify properties in state directly. Instead, use the provided methods to ensure proper state management and listener notification. 5397 */ 5398 // Internal state to handle recursive `setState()` calls 5399 constructor(state) { 5400 this.state = state; 5401 this.listeners = /* @__PURE__ */ new Set(); 5402 this.updateTick = 0; 5403 } 5404 /** 5405 * Registers a listener that will be called whenever the store's state changes. 5406 * 5407 * @param fn The listener function to be called on state changes. 5408 * @returns A function to unsubscribe the listener. 5409 */ 5410 subscribe = (fn) => { 5411 this.listeners.add(fn); 5412 return () => { 5413 this.listeners.delete(fn); 5414 }; 5415 }; 5416 /** 5417 * Returns the current state of the store. 5418 */ 5419 getSnapshot = () => { 5420 return this.state; 5421 }; 5422 /** 5423 * Updates the entire store's state and notifies all registered listeners. 5424 * 5425 * @param newState The new state to set for the store. 5426 */ 5427 setState(newState) { 5428 if (this.state === newState) { 5429 return; 5430 } 5431 this.state = newState; 5432 this.updateTick += 1; 5433 const currentTick = this.updateTick; 5434 for (const listener of this.listeners) { 5435 if (currentTick !== this.updateTick) { 5436 return; 5437 } 5438 listener(newState); 5439 } 5440 } 5441 /** 5442 * Merges the provided changes into the current state and notifies listeners if there are changes. 5443 * 5444 * @param changes An object containing the changes to apply to the current state. 5445 */ 5446 update(changes) { 5447 for (const key in changes) { 5448 if (!Object.is(this.state[key], changes[key])) { 5449 this.setState({ 5450 ...this.state, 5451 ...changes 5452 }); 5453 return; 5454 } 5455 } 5456 } 5457 /** 5458 * Sets a specific key in the store's state to a new value and notifies listeners if the value has changed. 5459 * 5460 * @param key The key in the store's state to update. 5461 * @param value The new value to set for the specified key. 5462 */ 5463 set(key, value) { 5464 if (!Object.is(this.state[key], value)) { 5465 this.setState({ 5466 ...this.state, 5467 [key]: value 5468 }); 5469 } 5470 } 5471 /** 5472 * Gives the state a new reference and updates all registered listeners. 5473 */ 5474 notifyAll() { 5475 const newState = { 5476 ...this.state 5477 }; 5478 this.setState(newState); 5479 } 5480 use(selector, a1, a2, a3) { 5481 return useStore(this, selector, a1, a2, a3); 5482 } 5483 }; 5484 5485 // node_modules/@base-ui/utils/store/ReactStore.mjs 5486 var React22 = __toESM(require_react(), 1); 5487 var ReactStore = class extends Store { 5488 /** 5489 * Creates a new ReactStore instance. 5490 * 5491 * @param state Initial state of the store. 5492 * @param context Non-reactive context values. 5493 * @param selectors Optional selectors for use with `useState`. 5494 */ 5495 constructor(state, context = {}, selectors3) { 5496 super(state); 5497 this.context = context; 5498 this.selectors = selectors3; 5499 } 5500 /** 5501 * Non-reactive values such as refs, callbacks, etc. 5502 */ 5503 /** 5504 * Synchronizes a single external value into the store. 5505 * 5506 * Note that the while the value in `state` is updated immediately, the value returned 5507 * by `useState` is updated before the next render (similarly to React's `useState`). 5508 */ 5509 useSyncedValue(key, value) { 5510 React22.useDebugValue(key); 5511 const store2 = this; 5512 useIsoLayoutEffect(() => { 5513 if (store2.state[key] !== value) { 5514 store2.set(key, value); 5515 } 5516 }, [store2, key, value]); 5517 } 5518 /** 5519 * Synchronizes a single external value into the store and 5520 * cleans it up (sets to `undefined`) on unmount. 5521 * 5522 * Note that the while the value in `state` is updated immediately, the value returned 5523 * by `useState` is updated before the next render (similarly to React's `useState`). 5524 */ 5525 useSyncedValueWithCleanup(key, value) { 5526 const store2 = this; 5527 useIsoLayoutEffect(() => { 5528 if (store2.state[key] !== value) { 5529 store2.set(key, value); 5530 } 5531 return () => { 5532 store2.set(key, void 0); 5533 }; 5534 }, [store2, key, value]); 5535 } 5536 /** 5537 * Synchronizes multiple external values into the store. 5538 * 5539 * Note that the while the values in `state` are updated immediately, the values returned 5540 * by `useState` are updated before the next render (similarly to React's `useState`). 5541 */ 5542 useSyncedValues(statePart) { 5543 const store2 = this; 5544 if (true) { 5545 React22.useDebugValue(statePart, (p) => Object.keys(p)); 5546 const keys = React22.useRef(Object.keys(statePart)).current; 5547 const nextKeys = Object.keys(statePart); 5548 if (keys.length !== nextKeys.length || keys.some((key, index2) => key !== nextKeys[index2])) { 5549 console.error("ReactStore.useSyncedValues expects the same prop keys on every render. Keys should be stable."); 5550 } 5551 } 5552 const dependencies = Object.values(statePart); 5553 useIsoLayoutEffect(() => { 5554 store2.update(statePart); 5555 }, [store2, ...dependencies]); 5556 } 5557 /** 5558 * Registers a controllable prop pair (`controlled`, `defaultValue`) for a specific key. If `controlled` 5559 * is non-undefined, the store's state at `key` is updated to match `controlled`. 5560 */ 5561 useControlledProp(key, controlled) { 5562 React22.useDebugValue(key); 5563 const store2 = this; 5564 const isControlled = controlled !== void 0; 5565 useIsoLayoutEffect(() => { 5566 if (isControlled && !Object.is(store2.state[key], controlled)) { 5567 store2.setState({ 5568 ...store2.state, 5569 [key]: controlled 5570 }); 5571 } 5572 }, [store2, key, controlled, isControlled]); 5573 if (true) { 5574 const cache = this.controlledValues ??= /* @__PURE__ */ new Map(); 5575 if (!cache.has(key)) { 5576 cache.set(key, isControlled); 5577 } 5578 const previouslyControlled = cache.get(key); 5579 if (previouslyControlled !== void 0 && previouslyControlled !== isControlled) { 5580 console.error(`A component is changing the $isControlled ? "" : "un"}controlled state of $key.toString()} to be $isControlled ? "un" : ""}controlled. Elements should not switch from uncontrolled to controlled (or vice versa).`); 5581 } 5582 } 5583 } 5584 /** Gets the current value from the store using a selector with the provided key. 5585 * 5586 * @param key Key of the selector to use. 5587 */ 5588 select(key, a1, a2, a3) { 5589 const selector = this.selectors[key]; 5590 return selector(this.state, a1, a2, a3); 5591 } 5592 /** 5593 * Returns a value from the store's state using a selector function. 5594 * Used to subscribe to specific parts of the state. 5595 * This methods causes a rerender whenever the selected state changes. 5596 * 5597 * @param key Key of the selector to use. 5598 */ 5599 useState(key, a1, a2, a3) { 5600 React22.useDebugValue(key); 5601 return useStore(this, this.selectors[key], a1, a2, a3); 5602 } 5603 /** 5604 * Wraps a function with `useStableCallback` to ensure it has a stable reference 5605 * and assigns it to the context. 5606 * 5607 * @param key Key of the event callback. Must be a function in the context. 5608 * @param fn Function to assign. 5609 */ 5610 useContextCallback(key, fn) { 5611 React22.useDebugValue(key); 5612 const stableFunction = useStableCallback(fn ?? NOOP); 5613 this.context[key] = stableFunction; 5614 } 5615 /** 5616 * Returns a stable setter function for a specific key in the store's state. 5617 * It's commonly used to pass as a ref callback to React elements. 5618 * 5619 * @param key Key of the state to set. 5620 */ 5621 useStateSetter(key) { 5622 const ref = React22.useRef(void 0); 5623 if (ref.current === void 0) { 5624 ref.current = (value) => { 5625 this.set(key, value); 5626 }; 5627 } 5628 return ref.current; 5629 } 5630 /** 5631 * Observes changes derived from the store's selectors and calls the listener when the selected value changes. 5632 * 5633 * @param key Key of the selector to observe. 5634 * @param listener Listener function called when the selector result changes. 5635 */ 5636 observe(selector, listener) { 5637 let selectFn; 5638 if (typeof selector === "function") { 5639 selectFn = selector; 5640 } else { 5641 selectFn = this.selectors[selector]; 5642 } 5643 let prevValue = selectFn(this.state); 5644 listener(prevValue, prevValue, this); 5645 return this.subscribe((nextState) => { 5646 const nextValue = selectFn(nextState); 5647 if (!Object.is(prevValue, nextValue)) { 5648 const oldValue = prevValue; 5649 prevValue = nextValue; 5650 listener(nextValue, oldValue, this); 5651 } 5652 }); 5653 } 5654 }; 5655 5656 // node_modules/@base-ui/react/floating-ui-react/components/FloatingRootStore.mjs 5657 var selectors = { 5658 open: createSelector2((state) => state.open), 5659 transitionStatus: createSelector2((state) => state.transitionStatus), 5660 domReferenceElement: createSelector2((state) => state.domReferenceElement), 5661 referenceElement: createSelector2((state) => state.positionReference ?? state.referenceElement), 5662 floatingElement: createSelector2((state) => state.floatingElement), 5663 floatingId: createSelector2((state) => state.floatingId) 5664 }; 5665 var FloatingRootStore = class extends ReactStore { 5666 constructor(options) { 5667 const { 5668 syncOnly, 5669 nested, 5670 onOpenChange, 5671 triggerElements, 5672 ...initialState 5673 } = options; 5674 super({ 5675 ...initialState, 5676 positionReference: initialState.referenceElement, 5677 domReferenceElement: initialState.referenceElement 5678 }, { 5679 onOpenChange, 5680 dataRef: { 5681 current: {} 5682 }, 5683 events: createEventEmitter(), 5684 nested, 5685 triggerElements 5686 }, selectors); 5687 this.syncOnly = syncOnly; 5688 } 5689 /** 5690 * Syncs the event used by hover logic to distinguish hover-open from click-like interaction. 5691 */ 5692 syncOpenEvent = (newOpen, event) => { 5693 if (!newOpen || !this.state.open || // Prevent a pending hover-open from overwriting a click-open event, while allowing 5694 // click events to upgrade a hover-open. 5695 event != null && isClickLikeEvent(event)) { 5696 this.context.dataRef.current.openEvent = newOpen ? event : void 0; 5697 } 5698 }; 5699 /** 5700 * Runs the root-owned side effects for an open state change. 5701 */ 5702 dispatchOpenChange = (newOpen, eventDetails) => { 5703 this.syncOpenEvent(newOpen, eventDetails.event); 5704 const details = { 5705 open: newOpen, 5706 reason: eventDetails.reason, 5707 nativeEvent: eventDetails.event, 5708 nested: this.context.nested, 5709 triggerElement: eventDetails.trigger 5710 }; 5711 this.context.events.emit("openchange", details); 5712 }; 5713 /** 5714 * Emits the `openchange` event through the internal event emitter and calls the `onOpenChange` handler with the provided arguments. 5715 * 5716 * @param newOpen The new open state. 5717 * @param eventDetails Details about the event that triggered the open state change. 5718 */ 5719 setOpen = (newOpen, eventDetails) => { 5720 if (this.syncOnly) { 5721 this.context.onOpenChange?.(newOpen, eventDetails); 5722 return; 5723 } 5724 this.dispatchOpenChange(newOpen, eventDetails); 5725 this.context.onOpenChange?.(newOpen, eventDetails); 5726 }; 5727 }; 5728 5729 // node_modules/@base-ui/react/floating-ui-react/hooks/useSyncedFloatingRootContext.mjs 5730 function useSyncedFloatingRootContext(options) { 5731 const { 5732 popupStore, 5733 treatPopupAsFloatingElement = false, 5734 floatingRootContext: floatingRootContextProp, 5735 floatingId, 5736 nested, 5737 onOpenChange 5738 } = options; 5739 const open = popupStore.useState("open"); 5740 const referenceElement = popupStore.useState("activeTriggerElement"); 5741 const floatingElement = popupStore.useState(treatPopupAsFloatingElement ? "popupElement" : "positionerElement"); 5742 const triggerElements = popupStore.context.triggerElements; 5743 const handleOpenChange = onOpenChange; 5744 const internalStoreRef = React23.useRef(null); 5745 if (floatingRootContextProp === void 0 && internalStoreRef.current === null) { 5746 internalStoreRef.current = new FloatingRootStore({ 5747 open, 5748 transitionStatus: void 0, 5749 referenceElement, 5750 floatingElement, 5751 triggerElements, 5752 onOpenChange: handleOpenChange, 5753 floatingId, 5754 syncOnly: true, 5755 nested 5756 }); 5757 } 5758 const store2 = floatingRootContextProp ?? internalStoreRef.current; 5759 popupStore.useSyncedValue("floatingId", floatingId); 5760 useIsoLayoutEffect(() => { 5761 const valuesToSync = { 5762 open, 5763 floatingId, 5764 referenceElement, 5765 floatingElement 5766 }; 5767 if (isElement(referenceElement)) { 5768 valuesToSync.domReferenceElement = referenceElement; 5769 } 5770 if (store2.state.positionReference === store2.state.referenceElement) { 5771 valuesToSync.positionReference = referenceElement; 5772 } 5773 store2.update(valuesToSync); 5774 }, [open, floatingId, referenceElement, floatingElement, store2]); 5775 store2.context.onOpenChange = handleOpenChange; 5776 store2.context.nested = nested; 5777 return store2; 5778 } 5779 5780 // node_modules/@base-ui/react/utils/popups/popupStoreUtils.mjs 5781 var FOCUSABLE_POPUP_PROPS = { 5782 tabIndex: -1, 5783 [FOCUSABLE_ATTRIBUTE]: "" 5784 }; 5785 function usePopupStore(externalStore, createStore, treatPopupAsFloatingElement = false) { 5786 const floatingId = useId(); 5787 const nested = useFloatingParentNodeId() != null; 5788 const internalStoreRef = React24.useRef(null); 5789 if (externalStore === void 0 && internalStoreRef.current === null) { 5790 internalStoreRef.current = createStore(floatingId, nested); 5791 } 5792 const store2 = externalStore ?? internalStoreRef.current; 5793 useSyncedFloatingRootContext({ 5794 popupStore: store2, 5795 treatPopupAsFloatingElement, 5796 floatingRootContext: store2.state.floatingRootContext, 5797 floatingId, 5798 nested, 5799 onOpenChange: store2.setOpen 5800 }); 5801 return { 5802 store: store2, 5803 internalStore: internalStoreRef.current 5804 }; 5805 } 5806 function useTriggerRegistration(id, store2) { 5807 const registeredElementIdRef = React24.useRef(null); 5808 const registeredElementRef = React24.useRef(null); 5809 return React24.useCallback((element) => { 5810 if (id === void 0) { 5811 return; 5812 } 5813 let shouldSyncTriggerCount = false; 5814 if (registeredElementIdRef.current !== null) { 5815 const registeredId = registeredElementIdRef.current; 5816 const registeredElement = registeredElementRef.current; 5817 const currentElement = store2.context.triggerElements.getById(registeredId); 5818 if (registeredElement && currentElement === registeredElement) { 5819 store2.context.triggerElements.delete(registeredId); 5820 shouldSyncTriggerCount = true; 5821 } 5822 registeredElementIdRef.current = null; 5823 registeredElementRef.current = null; 5824 } 5825 if (element !== null) { 5826 registeredElementIdRef.current = id; 5827 registeredElementRef.current = element; 5828 store2.context.triggerElements.add(id, element); 5829 shouldSyncTriggerCount = true; 5830 } 5831 if (shouldSyncTriggerCount) { 5832 const triggerCount = store2.context.triggerElements.size; 5833 if (store2.select("open") && store2.state.triggerCount !== triggerCount) { 5834 store2.set("triggerCount", triggerCount); 5835 } 5836 } 5837 }, [store2, id]); 5838 } 5839 function setPopupOpenState(state, open, trigger, preventUnmountOnClose = false) { 5840 if (open) { 5841 state.preventUnmountingOnClose = false; 5842 } else if (preventUnmountOnClose) { 5843 state.preventUnmountingOnClose = true; 5844 } 5845 const triggerId = trigger?.id ?? null; 5846 if (triggerId || open) { 5847 state.activeTriggerId = triggerId; 5848 state.activeTriggerElement = trigger ?? null; 5849 } 5850 } 5851 function attachPreventUnmountOnClose(eventDetails) { 5852 let preventUnmountOnClose = false; 5853 eventDetails.preventUnmountOnClose = () => { 5854 preventUnmountOnClose = true; 5855 }; 5856 return () => preventUnmountOnClose; 5857 } 5858 function applyPopupOpenChange(store2, nextOpen, eventDetails, options = {}) { 5859 const reason = eventDetails.reason; 5860 const isHover = reason === reason_parts_exports.triggerHover; 5861 const isFocusOpen = nextOpen && reason === reason_parts_exports.triggerFocus; 5862 const isDismissClose = !nextOpen && (reason === reason_parts_exports.triggerPress || reason === reason_parts_exports.escapeKey); 5863 const shouldPreventUnmountOnClose = attachPreventUnmountOnClose(eventDetails); 5864 store2.context.onOpenChange?.(nextOpen, eventDetails); 5865 if (eventDetails.isCanceled) { 5866 return; 5867 } 5868 options.onBeforeDispatch?.(); 5869 store2.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails); 5870 const changeState = () => { 5871 const updatedState = { 5872 ...options.extraState, 5873 open: nextOpen 5874 }; 5875 if (isFocusOpen) { 5876 updatedState.instantType = "focus"; 5877 } else if (isDismissClose) { 5878 updatedState.instantType = "dismiss"; 5879 } else if (isHover) { 5880 updatedState.instantType = void 0; 5881 } 5882 setPopupOpenState(updatedState, nextOpen, eventDetails.trigger, shouldPreventUnmountOnClose()); 5883 store2.update(updatedState); 5884 }; 5885 if (isHover) { 5886 ReactDOM4.flushSync(changeState); 5887 } else { 5888 changeState(); 5889 } 5890 } 5891 function useInitialOpenSync(store2, openProp, defaultOpen, defaultTriggerId) { 5892 useOnFirstRender(() => { 5893 if (openProp === void 0 && store2.state.open === false && defaultOpen) { 5894 store2.state = { 5895 ...store2.state, 5896 open: true, 5897 activeTriggerId: defaultTriggerId, 5898 preventUnmountingOnClose: false 5899 }; 5900 } 5901 }); 5902 } 5903 function useTriggerDataForwarding(triggerId, triggerElementRef, store2, stateUpdates) { 5904 const isMountedByThisTrigger = store2.useState("isMountedByTrigger", triggerId); 5905 const baseRegisterTrigger = useTriggerRegistration(triggerId, store2); 5906 const registerTrigger = useStableCallback((element) => { 5907 baseRegisterTrigger(element); 5908 if (!element) { 5909 return; 5910 } 5911 const open = store2.select("open"); 5912 const activeTriggerId = store2.select("activeTriggerId"); 5913 if (activeTriggerId === triggerId) { 5914 store2.update({ 5915 activeTriggerElement: element, 5916 ...open ? stateUpdates : null 5917 }); 5918 return; 5919 } 5920 if (activeTriggerId == null && open) { 5921 store2.update({ 5922 activeTriggerId: triggerId, 5923 activeTriggerElement: element, 5924 ...stateUpdates 5925 }); 5926 } 5927 }); 5928 useIsoLayoutEffect(() => { 5929 if (isMountedByThisTrigger) { 5930 store2.update({ 5931 activeTriggerElement: triggerElementRef.current, 5932 ...stateUpdates 5933 }); 5934 } 5935 }, [isMountedByThisTrigger, store2, triggerElementRef, ...Object.values(stateUpdates)]); 5936 return { 5937 registerTrigger, 5938 isMountedByThisTrigger 5939 }; 5940 } 5941 function useImplicitActiveTrigger(store2, options = {}) { 5942 const { 5943 closeOnActiveTriggerUnmount = false 5944 } = options; 5945 const open = store2.useState("open"); 5946 const reactiveTriggerCount = store2.useState("triggerCount"); 5947 useIsoLayoutEffect(() => { 5948 if (!open) { 5949 if (store2.state.triggerCount !== 0) { 5950 store2.set("triggerCount", 0); 5951 } 5952 return; 5953 } 5954 const triggerCount = store2.context.triggerElements.size; 5955 const stateUpdates = {}; 5956 if (store2.state.triggerCount !== triggerCount) { 5957 stateUpdates.triggerCount = triggerCount; 5958 } 5959 const activeTriggerId = store2.select("activeTriggerId"); 5960 let lostActiveTriggerId = null; 5961 if (activeTriggerId) { 5962 const activeTriggerElement = store2.context.triggerElements.getById(activeTriggerId); 5963 if (!activeTriggerElement) { 5964 lostActiveTriggerId = activeTriggerId; 5965 } else if (activeTriggerElement !== store2.state.activeTriggerElement) { 5966 stateUpdates.activeTriggerElement = activeTriggerElement; 5967 } 5968 } 5969 if (!lostActiveTriggerId && !activeTriggerId && triggerCount === 1) { 5970 const iteratorResult = store2.context.triggerElements.entries().next(); 5971 if (!iteratorResult.done) { 5972 const [implicitTriggerId, implicitTriggerElement] = iteratorResult.value; 5973 stateUpdates.activeTriggerId = implicitTriggerId; 5974 stateUpdates.activeTriggerElement = implicitTriggerElement; 5975 } 5976 } 5977 if (stateUpdates.triggerCount !== void 0 || stateUpdates.activeTriggerId !== void 0 || stateUpdates.activeTriggerElement !== void 0) { 5978 store2.update(stateUpdates); 5979 } 5980 if (lostActiveTriggerId) { 5981 if (closeOnActiveTriggerUnmount) { 5982 queueMicrotask(() => { 5983 if (store2.select("open") && store2.select("activeTriggerId") === lostActiveTriggerId && !store2.context.triggerElements.getById(lostActiveTriggerId)) { 5984 const eventDetails = createChangeEventDetails(reason_parts_exports.none); 5985 store2.setOpen(false, eventDetails); 5986 if (!eventDetails.isCanceled) { 5987 store2.update({ 5988 activeTriggerId: null, 5989 activeTriggerElement: null 5990 }); 5991 } 5992 } 5993 }); 5994 } 5995 } 5996 }, [open, store2, reactiveTriggerCount, closeOnActiveTriggerUnmount]); 5997 } 5998 function useOpenStateTransitions(open, store2, onUnmount) { 5999 const { 6000 mounted, 6001 setMounted, 6002 transitionStatus 6003 } = useTransitionStatus(open); 6004 const preventUnmountingOnClose = store2.useState("preventUnmountingOnClose"); 6005 const syncedPreventUnmountingOnClose = open ? false : preventUnmountingOnClose; 6006 store2.useSyncedValues({ 6007 mounted, 6008 transitionStatus, 6009 preventUnmountingOnClose: syncedPreventUnmountingOnClose 6010 }); 6011 const forceUnmount = useStableCallback(() => { 6012 setMounted(false); 6013 store2.update({ 6014 activeTriggerId: null, 6015 activeTriggerElement: null, 6016 mounted: false, 6017 preventUnmountingOnClose: false 6018 }); 6019 onUnmount?.(); 6020 store2.context.onOpenChangeComplete?.(false); 6021 }); 6022 useOpenChangeComplete({ 6023 enabled: mounted && !open && !syncedPreventUnmountingOnClose, 6024 open, 6025 ref: store2.context.popupRef, 6026 onComplete() { 6027 if (!open) { 6028 forceUnmount(); 6029 } 6030 } 6031 }); 6032 return { 6033 forceUnmount, 6034 transitionStatus 6035 }; 6036 } 6037 function usePopupInteractionProps(store2, statePart) { 6038 store2.useSyncedValues(statePart); 6039 useIsoLayoutEffect(() => () => { 6040 store2.update({ 6041 activeTriggerProps: EMPTY_OBJECT, 6042 inactiveTriggerProps: EMPTY_OBJECT, 6043 popupProps: EMPTY_OBJECT 6044 }); 6045 }, [store2]); 6046 } 6047 6048 // node_modules/@base-ui/react/utils/popups/popupTriggerMap.mjs 6049 var PopupTriggerMap = class { 6050 constructor() { 6051 this.elementsSet = /* @__PURE__ */ new Set(); 6052 this.idMap = /* @__PURE__ */ new Map(); 6053 } 6054 /** 6055 * Adds a trigger element with the given ID. 6056 * 6057 * Note: The provided element is assumed to not be registered under multiple IDs. 6058 */ 6059 add(id, element) { 6060 const existingElement = this.idMap.get(id); 6061 if (existingElement === element) { 6062 return; 6063 } 6064 if (existingElement !== void 0) { 6065 this.elementsSet.delete(existingElement); 6066 } 6067 this.elementsSet.add(element); 6068 this.idMap.set(id, element); 6069 if (true) { 6070 if (this.elementsSet.size !== this.idMap.size) { 6071 throw new Error("Base UI: A trigger element cannot be registered under multiple IDs in PopupTriggerMap."); 6072 } 6073 } 6074 } 6075 /** 6076 * Removes the trigger element with the given ID. 6077 */ 6078 delete(id) { 6079 const element = this.idMap.get(id); 6080 if (element) { 6081 this.elementsSet.delete(element); 6082 this.idMap.delete(id); 6083 } 6084 } 6085 /** 6086 * Whether the given element is registered as a trigger. 6087 */ 6088 hasElement(element) { 6089 return this.elementsSet.has(element); 6090 } 6091 /** 6092 * Whether there is a registered trigger element matching the given predicate. 6093 */ 6094 hasMatchingElement(predicate) { 6095 for (const element of this.elementsSet) { 6096 if (predicate(element)) { 6097 return true; 6098 } 6099 } 6100 return false; 6101 } 6102 /** 6103 * Returns the trigger element associated with the given ID, or undefined if no such element exists. 6104 */ 6105 getById(id) { 6106 return this.idMap.get(id); 6107 } 6108 /** 6109 * Returns an iterable of all registered trigger entries, where each entry is a tuple of [id, element]. 6110 */ 6111 entries() { 6112 return this.idMap.entries(); 6113 } 6114 /** 6115 * Returns an iterable of all registered trigger elements. 6116 */ 6117 elements() { 6118 return this.elementsSet.values(); 6119 } 6120 /** 6121 * Returns the number of registered trigger elements. 6122 */ 6123 get size() { 6124 return this.idMap.size; 6125 } 6126 }; 6127 6128 // node_modules/@base-ui/react/floating-ui-react/utils/getEmptyRootContext.mjs 6129 function getEmptyRootContext() { 6130 return new FloatingRootStore({ 6131 open: false, 6132 transitionStatus: void 0, 6133 floatingElement: null, 6134 referenceElement: null, 6135 triggerElements: new PopupTriggerMap(), 6136 floatingId: void 0, 6137 syncOnly: false, 6138 nested: false, 6139 onOpenChange: void 0 6140 }); 6141 } 6142 6143 // node_modules/@base-ui/react/utils/popups/store.mjs 6144 function createInitialPopupStoreState() { 6145 return { 6146 open: false, 6147 openProp: void 0, 6148 mounted: false, 6149 transitionStatus: void 0, 6150 floatingRootContext: getEmptyRootContext(), 6151 floatingId: void 0, 6152 triggerCount: 0, 6153 preventUnmountingOnClose: false, 6154 payload: void 0, 6155 activeTriggerId: null, 6156 activeTriggerElement: null, 6157 triggerIdProp: void 0, 6158 popupElement: null, 6159 positionerElement: null, 6160 activeTriggerProps: EMPTY_OBJECT, 6161 inactiveTriggerProps: EMPTY_OBJECT, 6162 popupProps: EMPTY_OBJECT 6163 }; 6164 } 6165 function createPopupFloatingRootContext(triggerElements, floatingId, nested = false) { 6166 return new FloatingRootStore({ 6167 open: false, 6168 transitionStatus: void 0, 6169 floatingElement: null, 6170 referenceElement: null, 6171 triggerElements, 6172 floatingId, 6173 syncOnly: true, 6174 nested, 6175 onOpenChange: void 0 6176 }); 6177 } 6178 var activeTriggerIdSelector = createSelector2((state) => state.triggerIdProp ?? state.activeTriggerId); 6179 var openSelector = createSelector2((state) => state.openProp ?? state.open); 6180 var popupIdSelector = createSelector2((state) => { 6181 const popupId = state.popupElement?.id ?? state.floatingId; 6182 return popupId || void 0; 6183 }); 6184 function triggerOwnsOpenPopup(state, triggerId) { 6185 return triggerId !== void 0 && openSelector(state) && activeTriggerIdSelector(state) === triggerId; 6186 } 6187 function triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) { 6188 if (triggerOwnsOpenPopup(state, triggerId)) { 6189 return true; 6190 } 6191 return triggerId !== void 0 && openSelector(state) && activeTriggerIdSelector(state) == null && state.triggerCount === 1; 6192 } 6193 var popupStoreSelectors = { 6194 open: openSelector, 6195 mounted: createSelector2((state) => state.mounted), 6196 transitionStatus: createSelector2((state) => state.transitionStatus), 6197 floatingRootContext: createSelector2((state) => state.floatingRootContext), 6198 triggerCount: createSelector2((state) => state.triggerCount), 6199 preventUnmountingOnClose: createSelector2((state) => state.preventUnmountingOnClose), 6200 payload: createSelector2((state) => state.payload), 6201 activeTriggerId: activeTriggerIdSelector, 6202 activeTriggerElement: createSelector2((state) => state.mounted ? state.activeTriggerElement : null), 6203 popupId: popupIdSelector, 6204 /** 6205 * Whether the trigger with the given ID was used to open the popup. 6206 */ 6207 isTriggerActive: createSelector2((state, triggerId) => triggerId !== void 0 && activeTriggerIdSelector(state) === triggerId), 6208 /** 6209 * Whether the popup is open and was activated by a trigger with the given ID. 6210 */ 6211 isOpenedByTrigger: createSelector2((state, triggerId) => triggerOwnsOpenPopup(state, triggerId)), 6212 /** 6213 * Whether the popup is mounted and was activated by a trigger with the given ID. 6214 */ 6215 isMountedByTrigger: createSelector2((state, triggerId) => triggerId !== void 0 && activeTriggerIdSelector(state) === triggerId && state.mounted), 6216 triggerProps: createSelector2((state, isActive) => isActive ? state.activeTriggerProps : state.inactiveTriggerProps), 6217 /** 6218 * Popup id for the trigger that currently owns the open popup. 6219 */ 6220 triggerPopupId: createSelector2((state, triggerId) => triggerOwnsOpenPopupOrIsOnlyTrigger(state, triggerId) ? popupIdSelector(state) : void 0), 6221 popupProps: createSelector2((state) => state.popupProps), 6222 popupElement: createSelector2((state) => state.popupElement), 6223 positionerElement: createSelector2((state) => state.positionerElement) 6224 }; 6225 6226 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloatingRootContext.mjs 6227 function useFloatingRootContext(options) { 6228 const { 6229 open = false, 6230 onOpenChange, 6231 elements = {} 6232 } = options; 6233 const floatingId = useId(); 6234 const nested = useFloatingParentNodeId() != null; 6235 if (true) { 6236 const optionDomReference = elements.reference; 6237 if (optionDomReference && !isElement(optionDomReference)) { 6238 console.error("Cannot pass a virtual element to the `elements.reference` option,", "as it must be a real DOM element. Use `context.setPositionReference()`", "instead."); 6239 } 6240 } 6241 const store2 = useRefWithInit(() => new FloatingRootStore({ 6242 open, 6243 transitionStatus: void 0, 6244 onOpenChange, 6245 referenceElement: elements.reference ?? null, 6246 floatingElement: elements.floating ?? null, 6247 triggerElements: new PopupTriggerMap(), 6248 floatingId, 6249 syncOnly: false, 6250 nested 6251 })).current; 6252 useIsoLayoutEffect(() => { 6253 const valuesToSync = { 6254 open, 6255 floatingId 6256 }; 6257 if (elements.reference !== void 0) { 6258 valuesToSync.referenceElement = elements.reference; 6259 valuesToSync.domReferenceElement = isElement(elements.reference) ? elements.reference : null; 6260 } 6261 if (elements.floating !== void 0) { 6262 valuesToSync.floatingElement = elements.floating; 6263 } 6264 store2.update(valuesToSync); 6265 }, [open, floatingId, elements.reference, elements.floating, store2]); 6266 store2.context.onOpenChange = onOpenChange; 6267 store2.context.nested = nested; 6268 return store2; 6269 } 6270 6271 // node_modules/@base-ui/react/floating-ui-react/hooks/useFloating.mjs 6272 function useFloating2(options = {}) { 6273 const { 6274 nodeId, 6275 externalTree 6276 } = options; 6277 const internalStore = useFloatingRootContext(options); 6278 const store2 = options.rootContext || internalStore; 6279 const referenceElement = store2.useState("referenceElement"); 6280 const floatingElement = store2.useState("floatingElement"); 6281 const domReferenceElement = store2.useState("domReferenceElement"); 6282 const open = store2.useState("open"); 6283 const floatingId = store2.useState("floatingId"); 6284 const [positionReference, setPositionReferenceRaw] = React25.useState(null); 6285 const [localDomReference, setLocalDomReference] = React25.useState(void 0); 6286 const [localFloatingElement, setLocalFloatingElement] = React25.useState(void 0); 6287 const domReferenceRef = React25.useRef(null); 6288 const tree = useFloatingTree(externalTree); 6289 const storeElements = React25.useMemo(() => ({ 6290 reference: referenceElement, 6291 floating: floatingElement, 6292 domReference: domReferenceElement 6293 }), [referenceElement, floatingElement, domReferenceElement]); 6294 const position = useFloating({ 6295 ...options, 6296 elements: { 6297 ...storeElements, 6298 ...positionReference && { 6299 reference: positionReference 6300 } 6301 } 6302 }); 6303 const localDomReferenceElement = isElement(localDomReference) ? localDomReference : null; 6304 const syncedFloatingElement = localFloatingElement === void 0 ? store2.state.floatingElement : localFloatingElement; 6305 store2.useSyncedValue("referenceElement", localDomReference ?? null); 6306 store2.useSyncedValue("domReferenceElement", localDomReference === void 0 ? domReferenceElement : localDomReferenceElement); 6307 store2.useSyncedValue("floatingElement", syncedFloatingElement); 6308 const setPositionReference = React25.useCallback((node) => { 6309 const computedPositionReference = isElement(node) ? { 6310 getBoundingClientRect: () => node.getBoundingClientRect(), 6311 getClientRects: () => node.getClientRects(), 6312 contextElement: node 6313 } : node; 6314 setPositionReferenceRaw(computedPositionReference); 6315 position.refs.setReference(computedPositionReference); 6316 }, [position.refs]); 6317 const setReference = React25.useCallback((node) => { 6318 if (isElement(node) || node === null) { 6319 domReferenceRef.current = node; 6320 setLocalDomReference(node); 6321 } 6322 if (isElement(position.refs.reference.current) || position.refs.reference.current === null || // Don't allow setting virtual elements using the old technique back to 6323 // `null` to support `positionReference` + an unstable `reference` 6324 // callback ref. 6325 node !== null && !isElement(node)) { 6326 position.refs.setReference(node); 6327 } 6328 }, [position.refs, setLocalDomReference]); 6329 const setFloating = React25.useCallback((node) => { 6330 setLocalFloatingElement(node); 6331 position.refs.setFloating(node); 6332 }, [position.refs]); 6333 const refs = React25.useMemo(() => ({ 6334 ...position.refs, 6335 setReference, 6336 setFloating, 6337 setPositionReference, 6338 domReference: domReferenceRef 6339 }), [position.refs, setReference, setFloating, setPositionReference]); 6340 const elements = React25.useMemo(() => ({ 6341 ...position.elements, 6342 domReference: domReferenceElement 6343 }), [position.elements, domReferenceElement]); 6344 const context = React25.useMemo(() => ({ 6345 ...position, 6346 dataRef: store2.context.dataRef, 6347 open, 6348 onOpenChange: store2.setOpen, 6349 events: store2.context.events, 6350 floatingId, 6351 refs, 6352 elements, 6353 nodeId, 6354 rootStore: store2 6355 }), [position, refs, elements, nodeId, store2, open, floatingId]); 6356 useIsoLayoutEffect(() => { 6357 if (domReferenceElement) { 6358 domReferenceRef.current = domReferenceElement; 6359 } 6360 }, [domReferenceElement]); 6361 useIsoLayoutEffect(() => { 6362 store2.context.dataRef.current.floatingContext = context; 6363 const node = tree?.nodesRef.current.find((n) => n.id === nodeId); 6364 if (node) { 6365 node.context = context; 6366 } 6367 }); 6368 return React25.useMemo(() => ({ 6369 ...position, 6370 context, 6371 refs, 6372 elements, 6373 rootStore: store2 6374 }), [position, refs, elements, context, store2]); 6375 } 6376 6377 // node_modules/@base-ui/react/floating-ui-react/hooks/useFocus.mjs 6378 var React26 = __toESM(require_react(), 1); 6379 var isMacSafari = parts_exports.os.mac && parts_exports.engine.webkit; 6380 function useFocus(context, props = {}) { 6381 const { 6382 enabled = true, 6383 delay 6384 } = props; 6385 const store2 = "rootStore" in context ? context.rootStore : context; 6386 const { 6387 events, 6388 dataRef 6389 } = store2.context; 6390 const blockFocusRef = React26.useRef(false); 6391 const blockedReferenceRef = React26.useRef(null); 6392 const keyboardModalityRef = React26.useRef(true); 6393 const timeout = useTimeout(); 6394 React26.useEffect(() => { 6395 const domReference = store2.select("domReferenceElement"); 6396 if (!enabled) { 6397 return void 0; 6398 } 6399 const win = getWindow(domReference); 6400 function onBlur() { 6401 const currentDomReference = store2.select("domReferenceElement"); 6402 if (!store2.select("open") && isHTMLElement(currentDomReference) && currentDomReference === activeElement(ownerDocument(currentDomReference))) { 6403 blockFocusRef.current = true; 6404 } 6405 } 6406 function onKeyDown() { 6407 keyboardModalityRef.current = true; 6408 } 6409 function onPointerDown() { 6410 keyboardModalityRef.current = false; 6411 } 6412 return mergeCleanups(addEventListener(win, "blur", onBlur), isMacSafari && addEventListener(win, "keydown", onKeyDown, true), isMacSafari && addEventListener(win, "pointerdown", onPointerDown, true)); 6413 }, [store2, enabled]); 6414 React26.useEffect(() => { 6415 if (!enabled) { 6416 return void 0; 6417 } 6418 function onOpenChangeLocal(details) { 6419 if (details.reason === reason_parts_exports.triggerPress || details.reason === reason_parts_exports.escapeKey) { 6420 const referenceElement = store2.select("domReferenceElement"); 6421 if (isElement(referenceElement)) { 6422 blockedReferenceRef.current = referenceElement; 6423 blockFocusRef.current = true; 6424 } 6425 } 6426 } 6427 events.on("openchange", onOpenChangeLocal); 6428 return () => { 6429 events.off("openchange", onOpenChangeLocal); 6430 }; 6431 }, [events, enabled, store2]); 6432 const reference = React26.useMemo(() => { 6433 function resetBlockedFocus() { 6434 blockFocusRef.current = false; 6435 blockedReferenceRef.current = null; 6436 } 6437 return { 6438 onMouseLeave() { 6439 resetBlockedFocus(); 6440 }, 6441 onFocus(event) { 6442 const focusTarget = event.currentTarget; 6443 if (blockFocusRef.current) { 6444 if (blockedReferenceRef.current === focusTarget) { 6445 return; 6446 } 6447 resetBlockedFocus(); 6448 } 6449 const target = getTarget(event.nativeEvent); 6450 if (isElement(target)) { 6451 if (isMacSafari && !event.relatedTarget) { 6452 if (!keyboardModalityRef.current && !isTypeableElement(target)) { 6453 return; 6454 } 6455 } else if (!matchesFocusVisible(target)) { 6456 return; 6457 } 6458 } 6459 const movedFromOtherEnabledTrigger = isTargetInsideEnabledTrigger(event.relatedTarget, store2.context.triggerElements); 6460 const { 6461 nativeEvent, 6462 currentTarget 6463 } = event; 6464 const delayValue = typeof delay === "function" ? delay() : delay; 6465 if (store2.select("open") && movedFromOtherEnabledTrigger || delayValue === 0 || delayValue === void 0) { 6466 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent, currentTarget)); 6467 return; 6468 } 6469 timeout.start(delayValue, () => { 6470 if (blockFocusRef.current) { 6471 return; 6472 } 6473 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent, currentTarget)); 6474 }); 6475 }, 6476 onBlur(event) { 6477 resetBlockedFocus(); 6478 const relatedTarget = event.relatedTarget; 6479 const nativeEvent = event.nativeEvent; 6480 const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute("focus-guard")) && relatedTarget.getAttribute("data-type") === "outside"; 6481 timeout.start(0, () => { 6482 const domReference = store2.select("domReferenceElement"); 6483 const activeEl = activeElement(ownerDocument(domReference)); 6484 if (!relatedTarget && activeEl === domReference) { 6485 return; 6486 } 6487 if (contains(dataRef.current.floatingContext?.refs.floating.current, activeEl) || contains(domReference, activeEl) || movedToFocusGuard) { 6488 return; 6489 } 6490 const nextFocusedElement = relatedTarget ?? activeEl; 6491 if (isTargetInsideEnabledTrigger(nextFocusedElement, store2.context.triggerElements)) { 6492 return; 6493 } 6494 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerFocus, nativeEvent)); 6495 }); 6496 } 6497 }; 6498 }, [dataRef, delay, store2, timeout]); 6499 return React26.useMemo(() => enabled ? { 6500 reference, 6501 trigger: reference 6502 } : {}, [enabled, reference]); 6503 } 6504 6505 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverFloatingInteraction.mjs 6506 var React27 = __toESM(require_react(), 1); 6507 6508 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverInteractionSharedState.mjs 6509 var HoverInteraction = class _HoverInteraction { 6510 constructor() { 6511 this.pointerType = void 0; 6512 this.interactedInside = false; 6513 this.handler = void 0; 6514 this.blockMouseMove = true; 6515 this.performedPointerEventsMutation = false; 6516 this.pointerEventsScopeElement = null; 6517 this.pointerEventsReferenceElement = null; 6518 this.pointerEventsFloatingElement = null; 6519 this.restTimeoutPending = false; 6520 this.openChangeTimeout = new Timeout(); 6521 this.restTimeout = new Timeout(); 6522 this.handleCloseOptions = void 0; 6523 } 6524 static create() { 6525 return new _HoverInteraction(); 6526 } 6527 dispose = () => { 6528 this.openChangeTimeout.clear(); 6529 this.restTimeout.clear(); 6530 }; 6531 disposeEffect = () => { 6532 return this.dispose; 6533 }; 6534 }; 6535 var pointerEventsMutationOwnerByScopeElement = /* @__PURE__ */ new WeakMap(); 6536 function clearSafePolygonPointerEventsMutation(instance) { 6537 if (!instance.performedPointerEventsMutation) { 6538 return; 6539 } 6540 const scopeElement = instance.pointerEventsScopeElement; 6541 if (scopeElement && pointerEventsMutationOwnerByScopeElement.get(scopeElement) === instance) { 6542 instance.pointerEventsScopeElement?.style.removeProperty("pointer-events"); 6543 instance.pointerEventsReferenceElement?.style.removeProperty("pointer-events"); 6544 instance.pointerEventsFloatingElement?.style.removeProperty("pointer-events"); 6545 pointerEventsMutationOwnerByScopeElement.delete(scopeElement); 6546 } 6547 instance.performedPointerEventsMutation = false; 6548 instance.pointerEventsScopeElement = null; 6549 instance.pointerEventsReferenceElement = null; 6550 instance.pointerEventsFloatingElement = null; 6551 } 6552 function applySafePolygonPointerEventsMutation(instance, options) { 6553 const { 6554 scopeElement, 6555 referenceElement, 6556 floatingElement 6557 } = options; 6558 const existingOwner = pointerEventsMutationOwnerByScopeElement.get(scopeElement); 6559 if (existingOwner && existingOwner !== instance) { 6560 clearSafePolygonPointerEventsMutation(existingOwner); 6561 } 6562 clearSafePolygonPointerEventsMutation(instance); 6563 instance.performedPointerEventsMutation = true; 6564 instance.pointerEventsScopeElement = scopeElement; 6565 instance.pointerEventsReferenceElement = referenceElement; 6566 instance.pointerEventsFloatingElement = floatingElement; 6567 pointerEventsMutationOwnerByScopeElement.set(scopeElement, instance); 6568 scopeElement.style.pointerEvents = "none"; 6569 referenceElement.style.pointerEvents = "auto"; 6570 floatingElement.style.pointerEvents = "auto"; 6571 } 6572 function useHoverInteractionSharedState(store2) { 6573 const data = store2.context.dataRef.current; 6574 const instance = useRefWithInit(() => data.hoverInteractionState ?? HoverInteraction.create()).current; 6575 if (!data.hoverInteractionState) { 6576 data.hoverInteractionState = instance; 6577 } 6578 useOnMount(data.hoverInteractionState.disposeEffect); 6579 return data.hoverInteractionState; 6580 } 6581 6582 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverFloatingInteraction.mjs 6583 function useHoverFloatingInteraction(context, parameters = {}) { 6584 const { 6585 enabled = true, 6586 closeDelay: closeDelayProp = 0, 6587 nodeId: nodeIdProp 6588 } = parameters; 6589 const store2 = "rootStore" in context ? context.rootStore : context; 6590 const open = store2.useState("open"); 6591 const floatingElement = store2.useState("floatingElement"); 6592 const domReferenceElement = store2.useState("domReferenceElement"); 6593 const { 6594 dataRef 6595 } = store2.context; 6596 const tree = useFloatingTree(); 6597 const parentId = useFloatingParentNodeId(); 6598 const instance = useHoverInteractionSharedState(store2); 6599 const childClosedTimeout = useTimeout(); 6600 const isClickLikeOpenEvent2 = useStableCallback(() => { 6601 return isClickLikeOpenEvent(dataRef.current.openEvent?.type, instance.interactedInside); 6602 }); 6603 const isHoverOpen = useStableCallback(() => { 6604 return isHoverOpenEvent(dataRef.current.openEvent?.type); 6605 }); 6606 const clearPointerEvents = useStableCallback(() => { 6607 clearSafePolygonPointerEventsMutation(instance); 6608 }); 6609 useIsoLayoutEffect(() => { 6610 if (!open) { 6611 instance.pointerType = void 0; 6612 instance.restTimeoutPending = false; 6613 instance.interactedInside = false; 6614 clearPointerEvents(); 6615 } 6616 }, [open, instance, clearPointerEvents]); 6617 React27.useEffect(() => { 6618 return clearPointerEvents; 6619 }, [clearPointerEvents]); 6620 useIsoLayoutEffect(() => { 6621 if (!enabled) { 6622 return void 0; 6623 } 6624 if (open && instance.handleCloseOptions?.blockPointerEvents && isHoverOpen() && isElement(domReferenceElement) && floatingElement) { 6625 const ref = domReferenceElement; 6626 const floatingEl = floatingElement; 6627 const doc = ownerDocument(floatingElement); 6628 const parentFloating = tree?.nodesRef.current.find((node) => node.id === parentId)?.context?.elements.floating; 6629 if (parentFloating) { 6630 parentFloating.style.pointerEvents = ""; 6631 } 6632 const cachedScopeElement = instance.pointerEventsScopeElement !== floatingEl ? instance.pointerEventsScopeElement : null; 6633 const parentScopeElement = parentFloating !== floatingEl ? parentFloating : null; 6634 const scopeElement = instance.handleCloseOptions?.getScope?.() ?? cachedScopeElement ?? parentScopeElement ?? ref.closest("[data-rootownerid]") ?? doc.body; 6635 applySafePolygonPointerEventsMutation(instance, { 6636 scopeElement, 6637 referenceElement: ref, 6638 floatingElement: floatingEl 6639 }); 6640 return () => { 6641 clearPointerEvents(); 6642 }; 6643 } 6644 return void 0; 6645 }, [enabled, open, domReferenceElement, floatingElement, instance, isHoverOpen, tree, parentId, clearPointerEvents]); 6646 React27.useEffect(() => { 6647 if (!enabled) { 6648 return void 0; 6649 } 6650 function hasParentChildren() { 6651 return !!(tree && parentId && getNodeChildren(tree.nodesRef.current, parentId).length > 0); 6652 } 6653 function closeWithDelay(event) { 6654 const closeDelay = getDelay(closeDelayProp, "close", instance.pointerType); 6655 const close = () => { 6656 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event)); 6657 tree?.events.emit("floating.closed", event); 6658 }; 6659 if (closeDelay) { 6660 instance.openChangeTimeout.start(closeDelay, close); 6661 } else { 6662 instance.openChangeTimeout.clear(); 6663 close(); 6664 } 6665 } 6666 function handleInteractInside(event) { 6667 const target = getTarget(event); 6668 if (!isInteractiveElement(target)) { 6669 instance.interactedInside = false; 6670 return; 6671 } 6672 instance.interactedInside = target?.closest("[aria-haspopup]") != null; 6673 } 6674 function onFloatingMouseEnter() { 6675 instance.openChangeTimeout.clear(); 6676 childClosedTimeout.clear(); 6677 tree?.events.off("floating.closed", onNodeClosed); 6678 clearPointerEvents(); 6679 } 6680 function onFloatingMouseLeave(event) { 6681 if (hasParentChildren() && tree) { 6682 tree.events.on("floating.closed", onNodeClosed); 6683 return; 6684 } 6685 if (isTargetInsideEnabledTrigger(event.relatedTarget, store2.context.triggerElements)) { 6686 return; 6687 } 6688 const currentNodeId = dataRef.current.floatingContext?.nodeId ?? nodeIdProp; 6689 const relatedTarget = event.relatedTarget; 6690 const isMovingIntoDescendantFloating = tree && currentNodeId && isElement(relatedTarget) && getNodeChildren(tree.nodesRef.current, currentNodeId, false).some((node) => contains(node.context?.elements.floating, relatedTarget)); 6691 if (isMovingIntoDescendantFloating) { 6692 return; 6693 } 6694 if (instance.handler) { 6695 instance.handler(event); 6696 return; 6697 } 6698 clearPointerEvents(); 6699 if (isHoverOpen() && !isClickLikeOpenEvent2()) { 6700 closeWithDelay(event); 6701 } 6702 } 6703 function onNodeClosed(event) { 6704 if (!tree || !parentId || hasParentChildren()) { 6705 return; 6706 } 6707 childClosedTimeout.start(0, () => { 6708 tree.events.off("floating.closed", onNodeClosed); 6709 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event)); 6710 tree.events.emit("floating.closed", event); 6711 }); 6712 } 6713 const floating = floatingElement; 6714 return mergeCleanups(floating && addEventListener(floating, "mouseenter", onFloatingMouseEnter), floating && addEventListener(floating, "mouseleave", onFloatingMouseLeave), floating && addEventListener(floating, "pointerdown", handleInteractInside, true), () => { 6715 tree?.events.off("floating.closed", onNodeClosed); 6716 }); 6717 }, [enabled, floatingElement, store2, dataRef, closeDelayProp, nodeIdProp, isHoverOpen, isClickLikeOpenEvent2, clearPointerEvents, instance, tree, parentId, childClosedTimeout]); 6718 } 6719 6720 // node_modules/@base-ui/react/floating-ui-react/hooks/useHoverReferenceInteraction.mjs 6721 var React28 = __toESM(require_react(), 1); 6722 var ReactDOM5 = __toESM(require_react_dom(), 1); 6723 var EMPTY_REF = { 6724 current: null 6725 }; 6726 function useHoverReferenceInteraction(context, props = {}) { 6727 const { 6728 enabled = true, 6729 delay = 0, 6730 handleClose = null, 6731 mouseOnly = false, 6732 restMs = 0, 6733 move = true, 6734 triggerElementRef = EMPTY_REF, 6735 externalTree, 6736 isActiveTrigger = true, 6737 getHandleCloseContext, 6738 isClosing, 6739 shouldOpen: shouldOpenProp 6740 } = props; 6741 const store2 = "rootStore" in context ? context.rootStore : context; 6742 const { 6743 dataRef, 6744 events 6745 } = store2.context; 6746 const tree = useFloatingTree(externalTree); 6747 const instance = useHoverInteractionSharedState(store2); 6748 const isHoverCloseActiveRef = React28.useRef(false); 6749 const handleCloseRef = useValueAsRef(handleClose); 6750 const delayRef = useValueAsRef(delay); 6751 const restMsRef = useValueAsRef(restMs); 6752 const enabledRef = useValueAsRef(enabled); 6753 const shouldOpenRef = useValueAsRef(shouldOpenProp); 6754 const isClosingRef = useValueAsRef(isClosing); 6755 const isClickLikeOpenEvent2 = useStableCallback(() => { 6756 return isClickLikeOpenEvent(dataRef.current.openEvent?.type, instance.interactedInside); 6757 }); 6758 const checkShouldOpen = useStableCallback(() => { 6759 return shouldOpenRef.current?.() !== false; 6760 }); 6761 const isOverInactiveTrigger = useStableCallback((currentDomReference, currentTarget, target) => { 6762 const allTriggers = store2.context.triggerElements; 6763 if (allTriggers.hasElement(currentTarget)) { 6764 return !currentDomReference || !contains(currentDomReference, currentTarget); 6765 } 6766 if (!isElement(target)) { 6767 return false; 6768 } 6769 const targetElement = target; 6770 return allTriggers.hasMatchingElement((trigger) => contains(trigger, targetElement)) && (!currentDomReference || !contains(currentDomReference, targetElement)); 6771 }); 6772 const cleanupMouseMoveHandler = useStableCallback(() => { 6773 if (!instance.handler) { 6774 return; 6775 } 6776 const doc = ownerDocument(store2.select("domReferenceElement")); 6777 doc.removeEventListener("mousemove", instance.handler); 6778 instance.handler = void 0; 6779 }); 6780 const clearPointerEvents = useStableCallback(() => { 6781 clearSafePolygonPointerEventsMutation(instance); 6782 }); 6783 if (isActiveTrigger) { 6784 instance.handleCloseOptions = handleCloseRef.current?.__options; 6785 } 6786 React28.useEffect(() => cleanupMouseMoveHandler, [cleanupMouseMoveHandler]); 6787 React28.useEffect(() => { 6788 if (!enabled) { 6789 return void 0; 6790 } 6791 function onOpenChangeLocal(details) { 6792 if (!details.open) { 6793 isHoverCloseActiveRef.current = details.reason === reason_parts_exports.triggerHover; 6794 cleanupMouseMoveHandler(); 6795 instance.openChangeTimeout.clear(); 6796 instance.restTimeout.clear(); 6797 instance.blockMouseMove = true; 6798 instance.restTimeoutPending = false; 6799 } else { 6800 isHoverCloseActiveRef.current = false; 6801 } 6802 } 6803 events.on("openchange", onOpenChangeLocal); 6804 return () => { 6805 events.off("openchange", onOpenChangeLocal); 6806 }; 6807 }, [enabled, events, instance, cleanupMouseMoveHandler]); 6808 React28.useEffect(() => { 6809 if (!enabled) { 6810 return void 0; 6811 } 6812 function closeWithDelay(event, runElseBranch = true) { 6813 const closeDelay = getDelay(delayRef.current, "close", instance.pointerType); 6814 if (closeDelay) { 6815 instance.openChangeTimeout.start(closeDelay, () => { 6816 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event)); 6817 tree?.events.emit("floating.closed", event); 6818 }); 6819 } else if (runElseBranch) { 6820 instance.openChangeTimeout.clear(); 6821 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event)); 6822 tree?.events.emit("floating.closed", event); 6823 } 6824 } 6825 const trigger = triggerElementRef.current ?? (isActiveTrigger ? store2.select("domReferenceElement") : null); 6826 if (!isElement(trigger)) { 6827 return void 0; 6828 } 6829 function onMouseEnter(event) { 6830 instance.openChangeTimeout.clear(); 6831 instance.blockMouseMove = false; 6832 if (mouseOnly && !isMouseLikePointerType(instance.pointerType)) { 6833 return; 6834 } 6835 const restMsValue = getRestMs(restMsRef.current); 6836 const openDelay = getDelay(delayRef.current, "open", instance.pointerType); 6837 const eventTarget = getTarget(event); 6838 const currentTarget = event.currentTarget ?? null; 6839 const currentDomReference = store2.select("domReferenceElement"); 6840 let triggerNode = currentTarget; 6841 if (isElement(eventTarget) && !store2.context.triggerElements.hasElement(eventTarget)) { 6842 for (const triggerElement of store2.context.triggerElements.elements()) { 6843 if (contains(triggerElement, eventTarget)) { 6844 triggerNode = triggerElement; 6845 break; 6846 } 6847 } 6848 } 6849 if (isElement(currentTarget) && isElement(currentDomReference) && !store2.context.triggerElements.hasElement(currentTarget) && contains(currentTarget, currentDomReference)) { 6850 triggerNode = currentDomReference; 6851 } 6852 const isOverInactive = triggerNode == null ? false : isOverInactiveTrigger(currentDomReference, triggerNode, eventTarget); 6853 const isOpen = store2.select("open"); 6854 const isInClosingTransition = isClosingRef.current?.() ?? store2.select("transitionStatus") === "ending"; 6855 const isHoverCloseTransition = !isOpen && isInClosingTransition && isHoverCloseActiveRef.current; 6856 const isReenteringSameTriggerDuringCloseTransition = !isOverInactive && isElement(triggerNode) && isElement(currentDomReference) && contains(currentDomReference, triggerNode) && isHoverCloseTransition; 6857 const isRestOnlyDelay = restMsValue > 0 && !openDelay; 6858 const shouldOpenImmediately = isOverInactive && (isOpen || isHoverCloseTransition) || isReenteringSameTriggerDuringCloseTransition; 6859 const shouldOpen = !isOpen || isOverInactive; 6860 if (shouldOpenImmediately) { 6861 if (checkShouldOpen()) { 6862 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode)); 6863 } 6864 return; 6865 } 6866 if (isRestOnlyDelay) { 6867 return; 6868 } 6869 if (openDelay) { 6870 instance.openChangeTimeout.start(openDelay, () => { 6871 if (shouldOpen && checkShouldOpen()) { 6872 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode)); 6873 } 6874 }); 6875 } else if (shouldOpen) { 6876 if (checkShouldOpen()) { 6877 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerNode)); 6878 } 6879 } 6880 } 6881 function onMouseLeave(event) { 6882 if (isClickLikeOpenEvent2()) { 6883 clearPointerEvents(); 6884 return; 6885 } 6886 cleanupMouseMoveHandler(); 6887 const domReferenceElement = store2.select("domReferenceElement"); 6888 const doc = ownerDocument(domReferenceElement); 6889 instance.restTimeout.clear(); 6890 instance.restTimeoutPending = false; 6891 const handleCloseContextBase = dataRef.current.floatingContext ?? getHandleCloseContext?.(); 6892 if (isTargetInsideEnabledTrigger(event.relatedTarget, store2.context.triggerElements)) { 6893 return; 6894 } 6895 if (handleCloseRef.current && handleCloseContextBase) { 6896 if (!store2.select("open")) { 6897 instance.openChangeTimeout.clear(); 6898 } 6899 const currentTrigger = triggerElementRef.current; 6900 instance.handler = handleCloseRef.current({ 6901 ...handleCloseContextBase, 6902 tree, 6903 x: event.clientX, 6904 y: event.clientY, 6905 onClose() { 6906 clearPointerEvents(); 6907 cleanupMouseMoveHandler(); 6908 if (enabledRef.current && !isClickLikeOpenEvent2() && currentTrigger === store2.select("domReferenceElement")) { 6909 closeWithDelay(event, true); 6910 } 6911 } 6912 }); 6913 doc.addEventListener("mousemove", instance.handler); 6914 instance.handler(event); 6915 return; 6916 } 6917 const shouldClose = instance.pointerType === "touch" ? !contains(store2.select("floatingElement"), event.relatedTarget) : true; 6918 if (shouldClose) { 6919 closeWithDelay(event); 6920 } 6921 } 6922 if (move) { 6923 return mergeCleanups(addEventListener(trigger, "mousemove", onMouseEnter, { 6924 once: true 6925 }), addEventListener(trigger, "mouseenter", onMouseEnter), addEventListener(trigger, "mouseleave", onMouseLeave)); 6926 } 6927 return mergeCleanups(addEventListener(trigger, "mouseenter", onMouseEnter), addEventListener(trigger, "mouseleave", onMouseLeave)); 6928 }, [cleanupMouseMoveHandler, clearPointerEvents, dataRef, delayRef, store2, enabled, handleCloseRef, instance, isActiveTrigger, isOverInactiveTrigger, isClickLikeOpenEvent2, mouseOnly, move, restMsRef, triggerElementRef, tree, enabledRef, getHandleCloseContext, isClosingRef, checkShouldOpen]); 6929 return React28.useMemo(() => { 6930 if (!enabled) { 6931 return void 0; 6932 } 6933 function setPointerRef(event) { 6934 instance.pointerType = event.pointerType; 6935 } 6936 return { 6937 onPointerDown: setPointerRef, 6938 onPointerEnter: setPointerRef, 6939 onMouseMove(event) { 6940 const { 6941 nativeEvent 6942 } = event; 6943 const trigger = event.currentTarget; 6944 const currentDomReference = store2.select("domReferenceElement"); 6945 const currentOpen = store2.select("open"); 6946 const isOverInactive = isOverInactiveTrigger(currentDomReference, trigger, event.target); 6947 if (mouseOnly && !isMouseLikePointerType(instance.pointerType)) { 6948 return; 6949 } 6950 if (currentOpen && isOverInactive && instance.handleCloseOptions?.blockPointerEvents) { 6951 const floatingElement = store2.select("floatingElement"); 6952 if (floatingElement) { 6953 const scopeElement = instance.handleCloseOptions?.getScope?.() ?? trigger.ownerDocument.body; 6954 applySafePolygonPointerEventsMutation(instance, { 6955 scopeElement, 6956 referenceElement: trigger, 6957 floatingElement 6958 }); 6959 } 6960 } 6961 const restMsValue = getRestMs(restMsRef.current); 6962 if (currentOpen && !isOverInactive || restMsValue === 0) { 6963 return; 6964 } 6965 if (!isOverInactive && instance.restTimeoutPending && event.movementX ** 2 + event.movementY ** 2 < 2) { 6966 return; 6967 } 6968 instance.restTimeout.clear(); 6969 function handleMouseMove() { 6970 instance.restTimeoutPending = false; 6971 if (isClickLikeOpenEvent2()) { 6972 return; 6973 } 6974 const latestOpen = store2.select("open"); 6975 if (!instance.blockMouseMove && (!latestOpen || isOverInactive) && checkShouldOpen()) { 6976 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, nativeEvent, trigger)); 6977 } 6978 } 6979 if (instance.pointerType === "touch") { 6980 ReactDOM5.flushSync(() => { 6981 handleMouseMove(); 6982 }); 6983 } else if (isOverInactive && currentOpen) { 6984 handleMouseMove(); 6985 } else { 6986 instance.restTimeoutPending = true; 6987 instance.restTimeout.start(restMsValue, handleMouseMove); 6988 } 6989 } 6990 }; 6991 }, [enabled, instance, isClickLikeOpenEvent2, isOverInactiveTrigger, mouseOnly, store2, restMsRef, checkShouldOpen]); 6992 } 6993 6994 // node_modules/@base-ui/react/floating-ui-react/safePolygon.mjs 6995 var CURSOR_SPEED_THRESHOLD = 0.1; 6996 var CURSOR_SPEED_THRESHOLD_SQUARED = CURSOR_SPEED_THRESHOLD * CURSOR_SPEED_THRESHOLD; 6997 var POLYGON_BUFFER = 0.5; 6998 function hasIntersectingEdge(pointX, pointY, xi, yi, xj, yj) { 6999 return yi >= pointY !== yj >= pointY && pointX <= (xj - xi) * (pointY - yi) / (yj - yi) + xi; 7000 } 7001 function isPointInQuadrilateral(pointX, pointY, x1, y1, x2, y2, x3, y3, x4, y4) { 7002 let isInsideValue = false; 7003 if (hasIntersectingEdge(pointX, pointY, x1, y1, x2, y2)) { 7004 isInsideValue = !isInsideValue; 7005 } 7006 if (hasIntersectingEdge(pointX, pointY, x2, y2, x3, y3)) { 7007 isInsideValue = !isInsideValue; 7008 } 7009 if (hasIntersectingEdge(pointX, pointY, x3, y3, x4, y4)) { 7010 isInsideValue = !isInsideValue; 7011 } 7012 if (hasIntersectingEdge(pointX, pointY, x4, y4, x1, y1)) { 7013 isInsideValue = !isInsideValue; 7014 } 7015 return isInsideValue; 7016 } 7017 function isInsideRect(pointX, pointY, rect) { 7018 return pointX >= rect.x && pointX <= rect.x + rect.width && pointY >= rect.y && pointY <= rect.y + rect.height; 7019 } 7020 function isInsideAxisAlignedRect(pointX, pointY, x1, y1, x2, y2) { 7021 const minX = Math.min(x1, x2); 7022 const maxX = Math.max(x1, x2); 7023 const minY = Math.min(y1, y2); 7024 const maxY = Math.max(y1, y2); 7025 return pointX >= minX && pointX <= maxX && pointY >= minY && pointY <= maxY; 7026 } 7027 function safePolygon(options = {}) { 7028 const { 7029 blockPointerEvents = false 7030 } = options; 7031 const timeout = new Timeout(); 7032 const fn = ({ 7033 x, 7034 y, 7035 placement, 7036 elements, 7037 onClose, 7038 nodeId, 7039 tree 7040 }) => { 7041 const side = placement?.split("-")[0]; 7042 let hasLanded = false; 7043 let lastX = null; 7044 let lastY = null; 7045 let lastCursorTime = typeof performance !== "undefined" ? performance.now() : 0; 7046 function isCursorMovingSlowly(nextX, nextY) { 7047 const currentTime = performance.now(); 7048 const elapsedTime = currentTime - lastCursorTime; 7049 if (lastX === null || lastY === null || elapsedTime === 0) { 7050 lastX = nextX; 7051 lastY = nextY; 7052 lastCursorTime = currentTime; 7053 return false; 7054 } 7055 const deltaX = nextX - lastX; 7056 const deltaY = nextY - lastY; 7057 const distanceSquared = deltaX * deltaX + deltaY * deltaY; 7058 const thresholdSquared = elapsedTime * elapsedTime * CURSOR_SPEED_THRESHOLD_SQUARED; 7059 lastX = nextX; 7060 lastY = nextY; 7061 lastCursorTime = currentTime; 7062 return distanceSquared < thresholdSquared; 7063 } 7064 function close() { 7065 timeout.clear(); 7066 onClose(); 7067 } 7068 return function onMouseMove(event) { 7069 timeout.clear(); 7070 const domReference = elements.domReference; 7071 const floating = elements.floating; 7072 if (!domReference || !floating || side == null || x == null || y == null) { 7073 return void 0; 7074 } 7075 const { 7076 clientX, 7077 clientY 7078 } = event; 7079 const target = getTarget(event); 7080 const isLeave = event.type === "mouseleave"; 7081 const isOverFloatingEl = contains(floating, target); 7082 const isOverReferenceEl = contains(domReference, target); 7083 if (isOverFloatingEl) { 7084 hasLanded = true; 7085 if (!isLeave) { 7086 return void 0; 7087 } 7088 } 7089 if (isOverReferenceEl) { 7090 hasLanded = false; 7091 if (!isLeave) { 7092 hasLanded = true; 7093 return void 0; 7094 } 7095 } 7096 if (isLeave && isElement(event.relatedTarget) && contains(floating, event.relatedTarget)) { 7097 return void 0; 7098 } 7099 function hasOpenChildNode() { 7100 return Boolean(tree && getNodeChildren(tree.nodesRef.current, nodeId).length > 0); 7101 } 7102 function closeIfNoOpenChild() { 7103 if (!hasOpenChildNode()) { 7104 close(); 7105 } 7106 } 7107 if (hasOpenChildNode()) { 7108 return void 0; 7109 } 7110 const refRect = domReference.getBoundingClientRect(); 7111 const rect = floating.getBoundingClientRect(); 7112 const cursorLeaveFromRight = x > rect.right - rect.width / 2; 7113 const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2; 7114 const isFloatingWider = rect.width > refRect.width; 7115 const isFloatingTaller = rect.height > refRect.height; 7116 const left = (isFloatingWider ? refRect : rect).left; 7117 const right = (isFloatingWider ? refRect : rect).right; 7118 const top = (isFloatingTaller ? refRect : rect).top; 7119 const bottom = (isFloatingTaller ? refRect : rect).bottom; 7120 if (side === "top" && y >= refRect.bottom - 1 || side === "bottom" && y <= refRect.top + 1 || side === "left" && x >= refRect.right - 1 || side === "right" && x <= refRect.left + 1) { 7121 closeIfNoOpenChild(); 7122 return void 0; 7123 } 7124 let isInsideTroughRect = false; 7125 switch (side) { 7126 case "top": 7127 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, left, refRect.top + 1, right, rect.bottom - 1); 7128 break; 7129 case "bottom": 7130 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, left, rect.top + 1, right, refRect.bottom - 1); 7131 break; 7132 case "left": 7133 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, rect.right - 1, bottom, refRect.left + 1, top); 7134 break; 7135 case "right": 7136 isInsideTroughRect = isInsideAxisAlignedRect(clientX, clientY, refRect.right - 1, bottom, rect.left + 1, top); 7137 break; 7138 default: 7139 } 7140 if (isInsideTroughRect) { 7141 return void 0; 7142 } 7143 if (hasLanded && !isInsideRect(clientX, clientY, refRect)) { 7144 closeIfNoOpenChild(); 7145 return void 0; 7146 } 7147 if (!isLeave && isCursorMovingSlowly(clientX, clientY)) { 7148 closeIfNoOpenChild(); 7149 return void 0; 7150 } 7151 let isInsidePolygon = false; 7152 switch (side) { 7153 case "top": { 7154 const cursorXOffset = isFloatingWider ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4; 7155 const cursorPointOneX = isFloatingWider ? x + cursorXOffset : cursorLeaveFromRight ? x + cursorXOffset : x - cursorXOffset; 7156 const cursorPointTwoX = isFloatingWider ? x - cursorXOffset : cursorLeaveFromRight ? x + cursorXOffset : x - cursorXOffset; 7157 const cursorPointY = y + POLYGON_BUFFER + 1; 7158 const commonYLeft = cursorLeaveFromRight ? rect.bottom - POLYGON_BUFFER : isFloatingWider ? rect.bottom - POLYGON_BUFFER : rect.top; 7159 const commonYRight = cursorLeaveFromRight ? isFloatingWider ? rect.bottom - POLYGON_BUFFER : rect.top : rect.bottom - POLYGON_BUFFER; 7160 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointOneX, cursorPointY, cursorPointTwoX, cursorPointY, rect.left, commonYLeft, rect.right, commonYRight); 7161 break; 7162 } 7163 case "bottom": { 7164 const cursorXOffset = isFloatingWider ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4; 7165 const cursorPointOneX = isFloatingWider ? x + cursorXOffset : cursorLeaveFromRight ? x + cursorXOffset : x - cursorXOffset; 7166 const cursorPointTwoX = isFloatingWider ? x - cursorXOffset : cursorLeaveFromRight ? x + cursorXOffset : x - cursorXOffset; 7167 const cursorPointY = y - POLYGON_BUFFER; 7168 const commonYLeft = cursorLeaveFromRight ? rect.top + POLYGON_BUFFER : isFloatingWider ? rect.top + POLYGON_BUFFER : rect.bottom; 7169 const commonYRight = cursorLeaveFromRight ? isFloatingWider ? rect.top + POLYGON_BUFFER : rect.bottom : rect.top + POLYGON_BUFFER; 7170 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointOneX, cursorPointY, cursorPointTwoX, cursorPointY, rect.left, commonYLeft, rect.right, commonYRight); 7171 break; 7172 } 7173 case "left": { 7174 const cursorYOffset = isFloatingTaller ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4; 7175 const cursorPointOneY = isFloatingTaller ? y + cursorYOffset : cursorLeaveFromBottom ? y + cursorYOffset : y - cursorYOffset; 7176 const cursorPointTwoY = isFloatingTaller ? y - cursorYOffset : cursorLeaveFromBottom ? y + cursorYOffset : y - cursorYOffset; 7177 const cursorPointX = x + POLYGON_BUFFER + 1; 7178 const commonXTop = cursorLeaveFromBottom ? rect.right - POLYGON_BUFFER : isFloatingTaller ? rect.right - POLYGON_BUFFER : rect.left; 7179 const commonXBottom = cursorLeaveFromBottom ? isFloatingTaller ? rect.right - POLYGON_BUFFER : rect.left : rect.right - POLYGON_BUFFER; 7180 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, commonXTop, rect.top, commonXBottom, rect.bottom, cursorPointX, cursorPointOneY, cursorPointX, cursorPointTwoY); 7181 break; 7182 } 7183 case "right": { 7184 const cursorYOffset = isFloatingTaller ? POLYGON_BUFFER / 2 : POLYGON_BUFFER * 4; 7185 const cursorPointOneY = isFloatingTaller ? y + cursorYOffset : cursorLeaveFromBottom ? y + cursorYOffset : y - cursorYOffset; 7186 const cursorPointTwoY = isFloatingTaller ? y - cursorYOffset : cursorLeaveFromBottom ? y + cursorYOffset : y - cursorYOffset; 7187 const cursorPointX = x - POLYGON_BUFFER; 7188 const commonXTop = cursorLeaveFromBottom ? rect.left + POLYGON_BUFFER : isFloatingTaller ? rect.left + POLYGON_BUFFER : rect.right; 7189 const commonXBottom = cursorLeaveFromBottom ? isFloatingTaller ? rect.left + POLYGON_BUFFER : rect.right : rect.left + POLYGON_BUFFER; 7190 isInsidePolygon = isPointInQuadrilateral(clientX, clientY, cursorPointX, cursorPointOneY, cursorPointX, cursorPointTwoY, commonXTop, rect.top, commonXBottom, rect.bottom); 7191 break; 7192 } 7193 default: 7194 } 7195 if (!isInsidePolygon) { 7196 closeIfNoOpenChild(); 7197 } else if (!hasLanded) { 7198 timeout.start(40, closeIfNoOpenChild); 7199 } 7200 return void 0; 7201 }; 7202 }; 7203 fn.__options = { 7204 ...options, 7205 blockPointerEvents 7206 }; 7207 return fn; 7208 } 7209 7210 // node_modules/@base-ui/react/utils/popupStateMapping.mjs 7211 var CommonPopupDataAttributes = (function(CommonPopupDataAttributes2) { 7212 CommonPopupDataAttributes2["open"] = "data-open"; 7213 CommonPopupDataAttributes2["closed"] = "data-closed"; 7214 CommonPopupDataAttributes2[CommonPopupDataAttributes2["startingStyle"] = TransitionStatusDataAttributes.startingStyle] = "startingStyle"; 7215 CommonPopupDataAttributes2[CommonPopupDataAttributes2["endingStyle"] = TransitionStatusDataAttributes.endingStyle] = "endingStyle"; 7216 CommonPopupDataAttributes2["anchorHidden"] = "data-anchor-hidden"; 7217 CommonPopupDataAttributes2["side"] = "data-side"; 7218 CommonPopupDataAttributes2["align"] = "data-align"; 7219 return CommonPopupDataAttributes2; 7220 })({}); 7221 var CommonTriggerDataAttributes = /* @__PURE__ */ (function(CommonTriggerDataAttributes2) { 7222 CommonTriggerDataAttributes2["popupOpen"] = "data-popup-open"; 7223 CommonTriggerDataAttributes2["pressed"] = "data-pressed"; 7224 return CommonTriggerDataAttributes2; 7225 })({}); 7226 var TRIGGER_HOOK = { 7227 [CommonTriggerDataAttributes.popupOpen]: "" 7228 }; 7229 var PRESSABLE_TRIGGER_HOOK = { 7230 [CommonTriggerDataAttributes.popupOpen]: "", 7231 [CommonTriggerDataAttributes.pressed]: "" 7232 }; 7233 var POPUP_OPEN_HOOK = { 7234 [CommonPopupDataAttributes.open]: "" 7235 }; 7236 var POPUP_CLOSED_HOOK = { 7237 [CommonPopupDataAttributes.closed]: "" 7238 }; 7239 var ANCHOR_HIDDEN_HOOK = { 7240 [CommonPopupDataAttributes.anchorHidden]: "" 7241 }; 7242 var triggerOpenStateMapping = { 7243 open(value) { 7244 if (value) { 7245 return TRIGGER_HOOK; 7246 } 7247 return null; 7248 } 7249 }; 7250 var popupStateMapping = { 7251 open(value) { 7252 if (value) { 7253 return POPUP_OPEN_HOOK; 7254 } 7255 return POPUP_CLOSED_HOOK; 7256 }, 7257 anchorHidden(value) { 7258 if (value) { 7259 return ANCHOR_HIDDEN_HOOK; 7260 } 7261 return null; 7262 } 7263 }; 7264 7265 // node_modules/@base-ui/utils/inertValue.mjs 7266 function inertValue(value) { 7267 if (isReactVersionAtLeast(19)) { 7268 return value; 7269 } 7270 return value ? "true" : void 0; 7271 } 7272 7273 // node_modules/@base-ui/react/utils/useAnchorPositioning.mjs 7274 var React29 = __toESM(require_react(), 1); 7275 7276 // node_modules/@base-ui/react/floating-ui-react/middleware/arrow.mjs 7277 var baseArrow = (options) => ({ 7278 name: "arrow", 7279 options, 7280 async fn(state) { 7281 const { 7282 x, 7283 y, 7284 placement, 7285 rects, 7286 platform: platform3, 7287 elements, 7288 middlewareData 7289 } = state; 7290 const { 7291 element, 7292 padding = 0, 7293 offsetParent = "real" 7294 } = evaluate(options, state) || {}; 7295 if (element == null) { 7296 return {}; 7297 } 7298 const paddingObject = getPaddingObject(padding); 7299 const coords = { 7300 x, 7301 y 7302 }; 7303 const axis = getAlignmentAxis(placement); 7304 const length = getAxisLength(axis); 7305 const arrowDimensions = await platform3.getDimensions(element); 7306 const isYAxis = axis === "y"; 7307 const minProp = isYAxis ? "top" : "left"; 7308 const maxProp = isYAxis ? "bottom" : "right"; 7309 const clientProp = isYAxis ? "clientHeight" : "clientWidth"; 7310 const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length]; 7311 const startDiff = coords[axis] - rects.reference[axis]; 7312 const arrowOffsetParent = offsetParent === "real" ? await platform3.getOffsetParent?.(element) : elements.floating; 7313 let clientSize = elements.floating[clientProp] || rects.floating[length]; 7314 if (!clientSize || !await platform3.isElement?.(arrowOffsetParent)) { 7315 clientSize = elements.floating[clientProp] || rects.floating[length]; 7316 } 7317 const centerToReference = endDiff / 2 - startDiff / 2; 7318 const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1; 7319 const minPadding = Math.min(paddingObject[minProp], largestPossiblePadding); 7320 const maxPadding = Math.min(paddingObject[maxProp], largestPossiblePadding); 7321 const min2 = minPadding; 7322 const max2 = clientSize - arrowDimensions[length] - maxPadding; 7323 const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference; 7324 const offset4 = clamp(min2, center, max2); 7325 const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset4 && rects.reference[length] / 2 - (center < min2 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0; 7326 const alignmentOffset = shouldAddOffset ? center < min2 ? center - min2 : center - max2 : 0; 7327 return { 7328 [axis]: coords[axis] + alignmentOffset, 7329 data: { 7330 [axis]: offset4, 7331 centerOffset: center - offset4 - alignmentOffset, 7332 ...shouldAddOffset && { 7333 alignmentOffset 7334 } 7335 }, 7336 reset: shouldAddOffset 7337 }; 7338 } 7339 }); 7340 var arrow4 = (options, deps) => ({ 7341 ...baseArrow(options), 7342 options: [options, deps] 7343 }); 7344 7345 // node_modules/@base-ui/react/utils/hideMiddleware.mjs 7346 var nativeHideFn = hide3().fn; 7347 var hide4 = { 7348 name: "hide", 7349 async fn(state) { 7350 const { 7351 width, 7352 height, 7353 x, 7354 y 7355 } = state.rects.reference; 7356 const anchorHidden = width === 0 && height === 0 && x === 0 && y === 0; 7357 const nativeHideResult = await nativeHideFn(state); 7358 return { 7359 data: { 7360 referenceHidden: nativeHideResult.data?.referenceHidden || anchorHidden 7361 } 7362 }; 7363 } 7364 }; 7365 7366 // node_modules/@base-ui/react/utils/adaptiveOriginMiddleware.mjs 7367 var DEFAULT_SIDES = { 7368 sideX: "left", 7369 sideY: "top" 7370 }; 7371 var adaptiveOrigin = { 7372 name: "adaptiveOrigin", 7373 async fn(state) { 7374 const { 7375 x: rawX, 7376 y: rawY, 7377 rects: { 7378 floating: floatRect 7379 }, 7380 elements: { 7381 floating 7382 }, 7383 platform: platform3, 7384 strategy, 7385 placement 7386 } = state; 7387 const win = getWindow(floating); 7388 const styles = win.getComputedStyle(floating); 7389 const hasTransition = styles.transitionDuration !== "0s" && styles.transitionDuration !== ""; 7390 if (!hasTransition) { 7391 return { 7392 x: rawX, 7393 y: rawY, 7394 data: DEFAULT_SIDES 7395 }; 7396 } 7397 const offsetParent = await platform3.getOffsetParent?.(floating); 7398 let offsetDimensions = { 7399 width: 0, 7400 height: 0 7401 }; 7402 if (strategy === "fixed" && win?.visualViewport) { 7403 offsetDimensions = { 7404 width: win.visualViewport.width, 7405 height: win.visualViewport.height 7406 }; 7407 } else if (offsetParent === win) { 7408 const doc = ownerDocument(floating); 7409 offsetDimensions = { 7410 width: doc.documentElement.clientWidth, 7411 height: doc.documentElement.clientHeight 7412 }; 7413 } else if (await platform3.isElement?.(offsetParent)) { 7414 offsetDimensions = await platform3.getDimensions(offsetParent); 7415 } 7416 const currentSide = getSide(placement); 7417 let x = rawX; 7418 let y = rawY; 7419 if (currentSide === "left") { 7420 x = offsetDimensions.width - (rawX + floatRect.width); 7421 } 7422 if (currentSide === "top") { 7423 y = offsetDimensions.height - (rawY + floatRect.height); 7424 } 7425 const sideX = currentSide === "left" ? "right" : DEFAULT_SIDES.sideX; 7426 const sideY = currentSide === "top" ? "bottom" : DEFAULT_SIDES.sideY; 7427 return { 7428 x, 7429 y, 7430 data: { 7431 sideX, 7432 sideY 7433 } 7434 }; 7435 } 7436 }; 7437 7438 // node_modules/@base-ui/react/utils/useAnchorPositioning.mjs 7439 function getLogicalSide(sideParam, renderedSide, isRtl) { 7440 const isLogicalSideParam = sideParam === "inline-start" || sideParam === "inline-end"; 7441 const logicalRight = isRtl ? "inline-start" : "inline-end"; 7442 const logicalLeft = isRtl ? "inline-end" : "inline-start"; 7443 return { 7444 top: "top", 7445 right: isLogicalSideParam ? logicalRight : "right", 7446 bottom: "bottom", 7447 left: isLogicalSideParam ? logicalLeft : "left" 7448 }[renderedSide]; 7449 } 7450 function getOffsetData(state, sideParam, isRtl) { 7451 const { 7452 rects, 7453 placement 7454 } = state; 7455 const data = { 7456 side: getLogicalSide(sideParam, getSide(placement), isRtl), 7457 align: getAlignment(placement) || "center", 7458 anchor: { 7459 width: rects.reference.width, 7460 height: rects.reference.height 7461 }, 7462 positioner: { 7463 width: rects.floating.width, 7464 height: rects.floating.height 7465 } 7466 }; 7467 return data; 7468 } 7469 function useAnchorPositioning(params) { 7470 const { 7471 // Public parameters 7472 anchor, 7473 positionMethod = "absolute", 7474 side: sideParam = "bottom", 7475 sideOffset = 0, 7476 align = "center", 7477 alignOffset = 0, 7478 collisionBoundary, 7479 collisionPadding: collisionPaddingParam = 5, 7480 sticky = false, 7481 arrowPadding = 5, 7482 disableAnchorTracking = false, 7483 inline: inlineMiddleware, 7484 // Private parameters 7485 keepMounted = false, 7486 floatingRootContext, 7487 mounted, 7488 collisionAvoidance, 7489 shiftCrossAxis = false, 7490 nodeId, 7491 adaptiveOrigin: adaptiveOrigin2, 7492 lazyFlip = false, 7493 externalTree 7494 } = params; 7495 const [mountSide, setMountSide] = React29.useState(null); 7496 if (!mounted && mountSide !== null) { 7497 setMountSide(null); 7498 } 7499 const collisionAvoidanceSide = collisionAvoidance.side || "flip"; 7500 const collisionAvoidanceAlign = collisionAvoidance.align || "flip"; 7501 const collisionAvoidanceFallbackAxisSide = collisionAvoidance.fallbackAxisSide || "end"; 7502 const anchorFn = typeof anchor === "function" ? anchor : void 0; 7503 const anchorFnCallback = useStableCallback(anchorFn); 7504 const anchorDep = anchorFn ? anchorFnCallback : anchor; 7505 const anchorValueRef = useValueAsRef(anchor); 7506 const mountedRef = useValueAsRef(mounted); 7507 const direction = useDirection(); 7508 const isRtl = direction === "rtl"; 7509 const side = mountSide || { 7510 top: "top", 7511 right: "right", 7512 bottom: "bottom", 7513 left: "left", 7514 "inline-end": isRtl ? "left" : "right", 7515 "inline-start": isRtl ? "right" : "left" 7516 }[sideParam]; 7517 const placement = align === "center" ? side : `$side}-$align}`; 7518 let collisionPadding = collisionPaddingParam; 7519 const bias = 1; 7520 const biasTop = sideParam === "bottom" ? bias : 0; 7521 const biasBottom = sideParam === "top" ? bias : 0; 7522 const biasLeft = sideParam === "right" ? bias : 0; 7523 const biasRight = sideParam === "left" ? bias : 0; 7524 if (typeof collisionPadding === "number") { 7525 collisionPadding = { 7526 top: collisionPadding + biasTop, 7527 right: collisionPadding + biasRight, 7528 bottom: collisionPadding + biasBottom, 7529 left: collisionPadding + biasLeft 7530 }; 7531 } else if (collisionPadding) { 7532 collisionPadding = { 7533 top: (collisionPadding.top || 0) + biasTop, 7534 right: (collisionPadding.right || 0) + biasRight, 7535 bottom: (collisionPadding.bottom || 0) + biasBottom, 7536 left: (collisionPadding.left || 0) + biasLeft 7537 }; 7538 } 7539 const commonCollisionProps = { 7540 boundary: collisionBoundary === "clipping-ancestors" ? "clippingAncestors" : collisionBoundary, 7541 padding: collisionPadding 7542 }; 7543 const arrowRef = React29.useRef(null); 7544 const sideOffsetRef = useValueAsRef(sideOffset); 7545 const alignOffsetRef = useValueAsRef(alignOffset); 7546 const sideOffsetDep = typeof sideOffset !== "function" ? sideOffset : 0; 7547 const alignOffsetDep = typeof alignOffset !== "function" ? alignOffset : 0; 7548 const middleware = []; 7549 if (inlineMiddleware) { 7550 middleware.push(inlineMiddleware); 7551 } 7552 middleware.push(offset3((state) => { 7553 const data = getOffsetData(state, sideParam, isRtl); 7554 const sideAxis = typeof sideOffsetRef.current === "function" ? sideOffsetRef.current(data) : sideOffsetRef.current; 7555 const alignAxis = typeof alignOffsetRef.current === "function" ? alignOffsetRef.current(data) : alignOffsetRef.current; 7556 return { 7557 mainAxis: sideAxis, 7558 crossAxis: alignAxis, 7559 alignmentAxis: alignAxis 7560 }; 7561 }, [sideOffsetDep, alignOffsetDep, isRtl, sideParam])); 7562 const shiftDisabled = collisionAvoidanceAlign === "none" && collisionAvoidanceSide !== "shift"; 7563 const crossAxisShiftEnabled = !shiftDisabled && (sticky || shiftCrossAxis || collisionAvoidanceSide === "shift"); 7564 const flipMiddleware = collisionAvoidanceSide === "none" ? null : flip3({ 7565 ...commonCollisionProps, 7566 // Ensure the popup flips if it's been limited by its --available-height and it resizes. 7567 // Since the size() padding is smaller than the flip() padding, flip() will take precedence. 7568 padding: { 7569 top: collisionPadding.top + bias, 7570 right: collisionPadding.right + bias, 7571 bottom: collisionPadding.bottom + bias, 7572 left: collisionPadding.left + bias 7573 }, 7574 mainAxis: !shiftCrossAxis && collisionAvoidanceSide === "flip", 7575 crossAxis: collisionAvoidanceAlign === "flip" ? "alignment" : false, 7576 fallbackAxisSideDirection: collisionAvoidanceFallbackAxisSide 7577 }); 7578 const shiftMiddleware = shiftDisabled ? null : shift3((data) => { 7579 const html = ownerDocument(data.elements.floating).documentElement; 7580 return { 7581 ...commonCollisionProps, 7582 // Use the Layout Viewport to avoid shifting around when pinch-zooming 7583 // for context menus. 7584 rootBoundary: shiftCrossAxis ? { 7585 x: 0, 7586 y: 0, 7587 width: html.clientWidth, 7588 height: html.clientHeight 7589 } : void 0, 7590 mainAxis: collisionAvoidanceAlign !== "none", 7591 crossAxis: crossAxisShiftEnabled, 7592 limiter: sticky || shiftCrossAxis ? void 0 : limitShift3((limitData) => { 7593 if (!arrowRef.current) { 7594 return {}; 7595 } 7596 const { 7597 width, 7598 height 7599 } = arrowRef.current.getBoundingClientRect(); 7600 const sideAxis = getSideAxis(getSide(limitData.placement)); 7601 const arrowSize = sideAxis === "y" ? width : height; 7602 const offsetAmount = sideAxis === "y" ? collisionPadding.left + collisionPadding.right : collisionPadding.top + collisionPadding.bottom; 7603 return { 7604 offset: arrowSize / 2 + offsetAmount / 2 7605 }; 7606 }) 7607 }; 7608 }, [commonCollisionProps, sticky, shiftCrossAxis, collisionPadding, collisionAvoidanceAlign]); 7609 if (collisionAvoidanceSide === "shift" || collisionAvoidanceAlign === "shift" || align === "center") { 7610 middleware.push(shiftMiddleware, flipMiddleware); 7611 } else { 7612 middleware.push(flipMiddleware, shiftMiddleware); 7613 } 7614 middleware.push(size3({ 7615 ...commonCollisionProps, 7616 apply({ 7617 elements: { 7618 floating 7619 }, 7620 availableWidth, 7621 availableHeight, 7622 rects 7623 }) { 7624 if (!mountedRef.current) { 7625 return; 7626 } 7627 const floatingStyle = floating.style; 7628 floatingStyle.setProperty("--available-width", `$availableWidth}px`); 7629 floatingStyle.setProperty("--available-height", `$availableHeight}px`); 7630 const dpr = getWindow(floating).devicePixelRatio || 1; 7631 const { 7632 x: x2, 7633 y: y2, 7634 width, 7635 height 7636 } = rects.reference; 7637 const anchorWidth = (Math.round((x2 + width) * dpr) - Math.round(x2 * dpr)) / dpr; 7638 const anchorHeight = (Math.round((y2 + height) * dpr) - Math.round(y2 * dpr)) / dpr; 7639 floatingStyle.setProperty("--anchor-width", `$anchorWidth}px`); 7640 floatingStyle.setProperty("--anchor-height", `$anchorHeight}px`); 7641 } 7642 }), arrow4((state) => ({ 7643 // `transform-origin` calculations rely on an element existing. If the arrow hasn't been set, 7644 // we'll create a fake element. 7645 element: arrowRef.current || ownerDocument(state.elements.floating).createElement("div"), 7646 padding: arrowPadding, 7647 offsetParent: "floating" 7648 }), [arrowPadding]), { 7649 name: "transformOrigin", 7650 fn(state) { 7651 const { 7652 elements: elements2, 7653 middlewareData: middlewareData2, 7654 placement: renderedPlacement2, 7655 rects, 7656 y: y2 7657 } = state; 7658 const currentRenderedSide = getSide(renderedPlacement2); 7659 const currentRenderedAxis = getSideAxis(currentRenderedSide); 7660 const arrowEl = arrowRef.current; 7661 const arrowX = middlewareData2.arrow?.x || 0; 7662 const arrowY = middlewareData2.arrow?.y || 0; 7663 const arrowWidth = arrowEl?.clientWidth || 0; 7664 const arrowHeight = arrowEl?.clientHeight || 0; 7665 const transformX = arrowX + arrowWidth / 2; 7666 const transformY = arrowY + arrowHeight / 2; 7667 const shiftY = Math.abs(middlewareData2.shift?.y || 0); 7668 const halfAnchorHeight = rects.reference.height / 2; 7669 const sideOffsetValue = typeof sideOffset === "function" ? sideOffset(getOffsetData(state, sideParam, isRtl)) : sideOffset; 7670 const isOverlappingAnchor = shiftY > sideOffsetValue; 7671 const adjacentTransformOrigin = { 7672 top: `$transformX}px calc(100% + $sideOffsetValue}px)`, 7673 bottom: `$transformX}px ${-sideOffsetValue}px`, 7674 left: `calc(100% + $sideOffsetValue}px) $transformY}px`, 7675 right: `${-sideOffsetValue}px $transformY}px` 7676 }[currentRenderedSide]; 7677 const overlapTransformOrigin = `$transformX}px $rects.reference.y + halfAnchorHeight - y2}px`; 7678 elements2.floating.style.setProperty("--transform-origin", crossAxisShiftEnabled && currentRenderedAxis === "y" && isOverlappingAnchor ? overlapTransformOrigin : adjacentTransformOrigin); 7679 return {}; 7680 } 7681 }, hide4, adaptiveOrigin2); 7682 useIsoLayoutEffect(() => { 7683 if (!mounted && floatingRootContext) { 7684 floatingRootContext.update({ 7685 referenceElement: null, 7686 floatingElement: null, 7687 domReferenceElement: null, 7688 positionReference: null 7689 }); 7690 } 7691 }, [mounted, floatingRootContext]); 7692 const autoUpdateOptions = React29.useMemo(() => ({ 7693 elementResize: !disableAnchorTracking && typeof ResizeObserver !== "undefined", 7694 layoutShift: !disableAnchorTracking && typeof IntersectionObserver !== "undefined" 7695 }), [disableAnchorTracking]); 7696 const { 7697 refs, 7698 elements, 7699 x, 7700 y, 7701 middlewareData, 7702 update: update2, 7703 placement: renderedPlacement, 7704 context, 7705 isPositioned, 7706 floatingStyles: originalFloatingStyles 7707 } = useFloating2({ 7708 rootContext: floatingRootContext, 7709 open: keepMounted ? mounted : void 0, 7710 placement, 7711 middleware, 7712 strategy: positionMethod, 7713 whileElementsMounted: keepMounted ? void 0 : (...args) => autoUpdate(...args, autoUpdateOptions), 7714 nodeId, 7715 externalTree 7716 }); 7717 const { 7718 sideX, 7719 sideY 7720 } = middlewareData.adaptiveOrigin || DEFAULT_SIDES; 7721 const resolvedPosition = isPositioned ? positionMethod : "fixed"; 7722 const floatingStyles = React29.useMemo(() => { 7723 const base = adaptiveOrigin2 ? { 7724 position: resolvedPosition, 7725 [sideX]: x, 7726 [sideY]: y 7727 } : { 7728 position: resolvedPosition, 7729 ...originalFloatingStyles 7730 }; 7731 if (!isPositioned) { 7732 base.opacity = 0; 7733 } 7734 return base; 7735 }, [adaptiveOrigin2, resolvedPosition, sideX, x, sideY, y, originalFloatingStyles, isPositioned]); 7736 const registeredPositionReferenceRef = React29.useRef(null); 7737 useIsoLayoutEffect(() => { 7738 if (!mounted) { 7739 return; 7740 } 7741 const anchorValue = anchorValueRef.current; 7742 const resolvedAnchor = typeof anchorValue === "function" ? anchorValue() : anchorValue; 7743 const unwrappedElement = (isRef(resolvedAnchor) ? resolvedAnchor.current : resolvedAnchor) || null; 7744 const finalAnchor = unwrappedElement || null; 7745 if (finalAnchor !== registeredPositionReferenceRef.current) { 7746 refs.setPositionReference(finalAnchor); 7747 registeredPositionReferenceRef.current = finalAnchor; 7748 } 7749 }, [mounted, refs, anchorDep, anchorValueRef]); 7750 React29.useEffect(() => { 7751 if (!mounted) { 7752 return; 7753 } 7754 const anchorValue = anchorValueRef.current; 7755 if (typeof anchorValue === "function") { 7756 return; 7757 } 7758 if (isRef(anchorValue) && anchorValue.current !== registeredPositionReferenceRef.current) { 7759 refs.setPositionReference(anchorValue.current); 7760 registeredPositionReferenceRef.current = anchorValue.current; 7761 } 7762 }, [mounted, refs, anchorDep, anchorValueRef]); 7763 React29.useEffect(() => { 7764 if (keepMounted && mounted && elements.reference && elements.floating) { 7765 return autoUpdate(elements.reference, elements.floating, update2, autoUpdateOptions); 7766 } 7767 return void 0; 7768 }, [keepMounted, mounted, elements, update2, autoUpdateOptions]); 7769 const renderedSide = getSide(renderedPlacement); 7770 const logicalRenderedSide = getLogicalSide(sideParam, renderedSide, isRtl); 7771 const renderedAlign = getAlignment(renderedPlacement) || "center"; 7772 const anchorHidden = Boolean(middlewareData.hide?.referenceHidden); 7773 useIsoLayoutEffect(() => { 7774 if (lazyFlip && mounted && isPositioned) { 7775 setMountSide(renderedSide); 7776 } 7777 }, [lazyFlip, mounted, isPositioned, renderedSide]); 7778 const arrowStyles = React29.useMemo(() => ({ 7779 position: "absolute", 7780 top: middlewareData.arrow?.y, 7781 left: middlewareData.arrow?.x 7782 }), [middlewareData.arrow]); 7783 const arrowUncentered = middlewareData.arrow?.centerOffset !== 0; 7784 return React29.useMemo(() => ({ 7785 positionerStyles: floatingStyles, 7786 arrowStyles, 7787 arrowRef, 7788 arrowUncentered, 7789 side: logicalRenderedSide, 7790 align: renderedAlign, 7791 physicalSide: renderedSide, 7792 anchorHidden, 7793 refs, 7794 context, 7795 isPositioned, 7796 update: update2 7797 }), [floatingStyles, arrowStyles, arrowRef, arrowUncentered, logicalRenderedSide, renderedAlign, renderedSide, anchorHidden, refs, context, isPositioned, update2]); 7798 } 7799 function isRef(param) { 7800 return param != null && "current" in param; 7801 } 7802 7803 // node_modules/@base-ui/react/utils/getDisabledMountTransitionStyles.mjs 7804 function getDisabledMountTransitionStyles(transitionStatus) { 7805 return transitionStatus === "starting" ? DISABLED_TRANSITIONS_STYLE : EMPTY_OBJECT; 7806 } 7807 7808 // node_modules/@base-ui/react/utils/usePositioner.mjs 7809 function usePositioner(componentProps, state, { 7810 styles, 7811 transitionStatus, 7812 props, 7813 refs, 7814 hidden, 7815 inert = false 7816 }) { 7817 const style = { 7818 ...styles 7819 }; 7820 if (inert) { 7821 style.pointerEvents = "none"; 7822 } 7823 return useRenderElement("div", componentProps, { 7824 state, 7825 ref: refs, 7826 props: [{ 7827 role: "presentation", 7828 hidden, 7829 style 7830 }, getDisabledMountTransitionStyles(transitionStatus), props], 7831 stateAttributesMapping: popupStateMapping 7832 }); 7833 } 7834 7835 // node_modules/@base-ui/react/utils/usePopupViewport.mjs 7836 var React32 = __toESM(require_react(), 1); 7837 var ReactDOM6 = __toESM(require_react_dom(), 1); 7838 7839 // node_modules/@base-ui/utils/usePreviousValue.mjs 7840 var React30 = __toESM(require_react(), 1); 7841 function usePreviousValue(value) { 7842 const [state, setState] = React30.useState({ 7843 current: value, 7844 previous: null 7845 }); 7846 if (value !== state.current) { 7847 setState({ 7848 current: value, 7849 previous: state.current 7850 }); 7851 } 7852 return state.previous; 7853 } 7854 7855 // node_modules/@base-ui/react/utils/usePopupAutoResize.mjs 7856 var React31 = __toESM(require_react(), 1); 7857 7858 // node_modules/@base-ui/react/utils/getCssDimensions.mjs 7859 function getCssDimensions2(element) { 7860 const css = getComputedStyle2(element); 7861 let width = parseFloat(css.width) || 0; 7862 let height = parseFloat(css.height) || 0; 7863 const hasOffset = isHTMLElement(element); 7864 const offsetWidth = hasOffset ? element.offsetWidth : width; 7865 const offsetHeight = hasOffset ? element.offsetHeight : height; 7866 const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; 7867 if (shouldFallback) { 7868 width = offsetWidth; 7869 height = offsetHeight; 7870 } 7871 return { 7872 width, 7873 height 7874 }; 7875 } 7876 7877 // node_modules/@base-ui/react/utils/usePopupAutoResize.mjs 7878 function usePopupAutoResize(parameters) { 7879 const { 7880 popupElement, 7881 positionerElement, 7882 content, 7883 mounted, 7884 onMeasureLayout: onMeasureLayoutParam, 7885 onMeasureLayoutComplete: onMeasureLayoutCompleteParam, 7886 side, 7887 direction 7888 } = parameters; 7889 const runOnceAnimationsFinish = useAnimationsFinished(popupElement, true, false); 7890 const animationFrame = useAnimationFrame(); 7891 const committedDimensionsRef = React31.useRef(null); 7892 const isInitialRenderRef = React31.useRef(true); 7893 const restoreAnchoringStylesRef = React31.useRef(NOOP); 7894 const onMeasureLayout = useStableCallback(onMeasureLayoutParam); 7895 const onMeasureLayoutComplete = useStableCallback(onMeasureLayoutCompleteParam); 7896 const anchoringStyles = React31.useMemo(() => { 7897 let isOriginSide = side === "top"; 7898 let isPhysicalLeft = side === "left"; 7899 if (direction === "rtl") { 7900 isOriginSide = isOriginSide || side === "inline-end"; 7901 isPhysicalLeft = isPhysicalLeft || side === "inline-end"; 7902 } else { 7903 isOriginSide = isOriginSide || side === "inline-start"; 7904 isPhysicalLeft = isPhysicalLeft || side === "inline-start"; 7905 } 7906 return isOriginSide ? { 7907 position: "absolute", 7908 [side === "top" ? "bottom" : "top"]: "0", 7909 [isPhysicalLeft ? "right" : "left"]: "0" 7910 } : EMPTY_OBJECT; 7911 }, [side, direction]); 7912 useIsoLayoutEffect(() => { 7913 if (!mounted) { 7914 restoreAnchoringStylesRef.current = NOOP; 7915 isInitialRenderRef.current = true; 7916 committedDimensionsRef.current = null; 7917 return void 0; 7918 } 7919 if (!popupElement || !positionerElement) { 7920 return void 0; 7921 } 7922 restoreAnchoringStylesRef.current = applyElementStyles(popupElement, anchoringStyles); 7923 setPopupCssSize(popupElement, "auto"); 7924 const restorePopupPosition = overrideElementStyle(popupElement, "position", "static"); 7925 const restorePopupTransform = overrideElementStyle(popupElement, "transform", "none"); 7926 const restorePopupScale = overrideElementStyle(popupElement, "scale", "1"); 7927 const restorePositionerAvailableSize = applyElementStyles(positionerElement, { 7928 "--available-width": "max-content", 7929 "--available-height": "max-content" 7930 }); 7931 function restoreMeasurementOverrides() { 7932 restorePopupPosition(); 7933 restorePopupTransform(); 7934 restorePositionerAvailableSize(); 7935 } 7936 function restoreMeasurementOverridesIncludingScale() { 7937 restoreMeasurementOverrides(); 7938 restorePopupScale(); 7939 } 7940 onMeasureLayout?.(); 7941 if (isInitialRenderRef.current || committedDimensionsRef.current === null) { 7942 setPositionerCssSize(positionerElement, "max-content"); 7943 const dimensions = getCssDimensions2(popupElement); 7944 committedDimensionsRef.current = dimensions; 7945 setPositionerCssSize(positionerElement, dimensions); 7946 restoreMeasurementOverridesIncludingScale(); 7947 onMeasureLayoutComplete?.(null, dimensions); 7948 isInitialRenderRef.current = false; 7949 return () => { 7950 restoreAnchoringStylesRef.current(); 7951 restoreAnchoringStylesRef.current = NOOP; 7952 }; 7953 } 7954 setPositionerCssSize(positionerElement, "max-content"); 7955 const previousDimensions = committedDimensionsRef.current; 7956 const newDimensions = getCssDimensions2(popupElement); 7957 committedDimensionsRef.current = newDimensions; 7958 setPopupCssSize(popupElement, previousDimensions); 7959 restoreMeasurementOverridesIncludingScale(); 7960 onMeasureLayoutComplete?.(previousDimensions, newDimensions); 7961 setPositionerCssSize(positionerElement, newDimensions); 7962 const abortController = new AbortController(); 7963 animationFrame.request(() => { 7964 setPopupCssSize(popupElement, newDimensions); 7965 runOnceAnimationsFinish(() => { 7966 popupElement.style.setProperty("--popup-width", "auto"); 7967 popupElement.style.setProperty("--popup-height", "auto"); 7968 }, abortController.signal); 7969 }); 7970 return () => { 7971 abortController.abort(); 7972 animationFrame.cancel(); 7973 restoreAnchoringStylesRef.current(); 7974 restoreAnchoringStylesRef.current = NOOP; 7975 }; 7976 }, [content, popupElement, positionerElement, runOnceAnimationsFinish, animationFrame, mounted, onMeasureLayout, onMeasureLayoutComplete, anchoringStyles]); 7977 } 7978 function overrideElementStyle(element, property, value) { 7979 const originalValue = element.style.getPropertyValue(property); 7980 element.style.setProperty(property, value); 7981 return () => { 7982 element.style.setProperty(property, originalValue); 7983 }; 7984 } 7985 function applyElementStyles(element, styles) { 7986 const restorers = []; 7987 for (const [key, value] of Object.entries(styles)) { 7988 restorers.push(overrideElementStyle(element, key, value)); 7989 } 7990 return restorers.length ? () => { 7991 restorers.forEach((restore) => restore()); 7992 } : NOOP; 7993 } 7994 function setPopupCssSize(popupElement, size4) { 7995 const width = size4 === "auto" ? "auto" : `$size4.width}px`; 7996 const height = size4 === "auto" ? "auto" : `$size4.height}px`; 7997 popupElement.style.setProperty("--popup-width", width); 7998 popupElement.style.setProperty("--popup-height", height); 7999 } 8000 function setPositionerCssSize(positionerElement, size4) { 8001 const width = size4 === "max-content" ? "max-content" : `$size4.width}px`; 8002 const height = size4 === "max-content" ? "max-content" : `$size4.height}px`; 8003 positionerElement.style.setProperty("--positioner-width", width); 8004 positionerElement.style.setProperty("--positioner-height", height); 8005 } 8006 8007 // node_modules/@base-ui/react/utils/usePopupViewport.mjs 8008 var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1); 8009 function usePopupViewport(parameters) { 8010 const { 8011 store: store2, 8012 side, 8013 cssVars, 8014 children 8015 } = parameters; 8016 const direction = useDirection(); 8017 const activeTrigger = store2.useState("activeTriggerElement"); 8018 const activeTriggerId = store2.useState("activeTriggerId"); 8019 const open = store2.useState("open"); 8020 const payload = store2.useState("payload"); 8021 const mounted = store2.useState("mounted"); 8022 const popupElement = store2.useState("popupElement"); 8023 const positionerElement = store2.useState("positionerElement"); 8024 const previousActiveTrigger = usePreviousValue(open ? activeTrigger : null); 8025 const currentContentKey = usePopupContentKey(activeTriggerId, payload); 8026 const capturedNodeRef = React32.useRef(null); 8027 const [previousContentNode, setPreviousContentNode] = React32.useState(null); 8028 const [newTriggerOffset, setNewTriggerOffset] = React32.useState(null); 8029 const currentContainerRef = React32.useRef(null); 8030 const previousContainerRef = React32.useRef(null); 8031 const onAnimationsFinished = useAnimationsFinished(currentContainerRef, true, false); 8032 const cleanupFrame = useAnimationFrame(); 8033 const [previousContentDimensions, setPreviousContentDimensions] = React32.useState(null); 8034 const [showStartingStyleAttribute, setShowStartingStyleAttribute] = React32.useState(false); 8035 useIsoLayoutEffect(() => { 8036 store2.set("hasViewport", true); 8037 return () => { 8038 store2.set("hasViewport", false); 8039 }; 8040 }, [store2]); 8041 const handleMeasureLayout = useStableCallback(() => { 8042 currentContainerRef.current?.style.setProperty("animation", "none"); 8043 currentContainerRef.current?.style.setProperty("transition", "none"); 8044 previousContainerRef.current?.style.setProperty("display", "none"); 8045 }); 8046 const handleMeasureLayoutComplete = useStableCallback((previousDimensions) => { 8047 currentContainerRef.current?.style.removeProperty("animation"); 8048 currentContainerRef.current?.style.removeProperty("transition"); 8049 previousContainerRef.current?.style.removeProperty("display"); 8050 if (previousDimensions) { 8051 setPreviousContentDimensions(previousDimensions); 8052 } 8053 }); 8054 const lastHandledTriggerRef = React32.useRef(null); 8055 useIsoLayoutEffect(() => { 8056 if (!open || !mounted) { 8057 lastHandledTriggerRef.current = null; 8058 } 8059 }, [open, mounted]); 8060 useIsoLayoutEffect(() => { 8061 if (activeTrigger && previousActiveTrigger && activeTrigger !== previousActiveTrigger && lastHandledTriggerRef.current !== activeTrigger && capturedNodeRef.current) { 8062 setPreviousContentNode(capturedNodeRef.current); 8063 setShowStartingStyleAttribute(true); 8064 const offset4 = calculateRelativePosition(previousActiveTrigger, activeTrigger); 8065 setNewTriggerOffset(offset4); 8066 cleanupFrame.request(() => { 8067 ReactDOM6.flushSync(() => { 8068 setShowStartingStyleAttribute(false); 8069 }); 8070 onAnimationsFinished(() => { 8071 setPreviousContentNode(null); 8072 setPreviousContentDimensions(null); 8073 capturedNodeRef.current = null; 8074 }); 8075 }); 8076 lastHandledTriggerRef.current = activeTrigger; 8077 } 8078 }, [activeTrigger, previousActiveTrigger, previousContentNode, onAnimationsFinished, cleanupFrame]); 8079 useIsoLayoutEffect(() => { 8080 const source = currentContainerRef.current; 8081 if (!source) { 8082 return; 8083 } 8084 const wrapper = ownerDocument(source).createElement("div"); 8085 for (const child of Array.from(source.childNodes)) { 8086 wrapper.appendChild(child.cloneNode(true)); 8087 } 8088 capturedNodeRef.current = wrapper; 8089 }); 8090 const isTransitioning = previousContentNode != null; 8091 let childrenToRender; 8092 if (!isTransitioning) { 8093 childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { 8094 "data-current": true, 8095 ref: currentContainerRef, 8096 children 8097 }, currentContentKey); 8098 } else { 8099 childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(React32.Fragment, { 8100 children: [/* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { 8101 "data-previous": true, 8102 inert: inertValue(true), 8103 ref: previousContainerRef, 8104 style: { 8105 ...previousContentDimensions ? { 8106 [cssVars.popupWidth]: `$previousContentDimensions.width}px`, 8107 [cssVars.popupHeight]: `$previousContentDimensions.height}px` 8108 } : null, 8109 position: "absolute" 8110 }, 8111 "data-ending-style": showStartingStyleAttribute ? void 0 : "" 8112 }, "previous"), /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { 8113 "data-current": true, 8114 ref: currentContainerRef, 8115 "data-starting-style": showStartingStyleAttribute ? "" : void 0, 8116 children 8117 }, currentContentKey)] 8118 }); 8119 } 8120 useIsoLayoutEffect(() => { 8121 const container = previousContainerRef.current; 8122 if (!container || !previousContentNode) { 8123 return; 8124 } 8125 container.replaceChildren(...Array.from(previousContentNode.childNodes)); 8126 }, [previousContentNode]); 8127 usePopupAutoResize({ 8128 popupElement, 8129 positionerElement, 8130 mounted, 8131 content: payload, 8132 onMeasureLayout: handleMeasureLayout, 8133 onMeasureLayoutComplete: handleMeasureLayoutComplete, 8134 side, 8135 direction 8136 }); 8137 const state = { 8138 activationDirection: getActivationDirection(newTriggerOffset), 8139 transitioning: isTransitioning 8140 }; 8141 return { 8142 children: childrenToRender, 8143 state 8144 }; 8145 } 8146 function getActivationDirection(offset4) { 8147 if (!offset4) { 8148 return void 0; 8149 } 8150 return `$getValueWithTolerance(offset4.horizontal, 5, "right", "left")} $getValueWithTolerance(offset4.vertical, 5, "down", "up")}`; 8151 } 8152 function getValueWithTolerance(value, tolerance, positiveLabel, negativeLabel) { 8153 if (value > tolerance) { 8154 return positiveLabel; 8155 } 8156 if (value < -tolerance) { 8157 return negativeLabel; 8158 } 8159 return ""; 8160 } 8161 function calculateRelativePosition(from, to) { 8162 const fromRect = from.getBoundingClientRect(); 8163 const toRect = to.getBoundingClientRect(); 8164 const fromCenter = { 8165 x: fromRect.left + fromRect.width / 2, 8166 y: fromRect.top + fromRect.height / 2 8167 }; 8168 const toCenter = { 8169 x: toRect.left + toRect.width / 2, 8170 y: toRect.top + toRect.height / 2 8171 }; 8172 return { 8173 horizontal: toCenter.x - fromCenter.x, 8174 vertical: toCenter.y - fromCenter.y 8175 }; 8176 } 8177 function usePopupContentKey(activeTriggerId, payload) { 8178 const [contentKey, setContentKey] = React32.useState(0); 8179 const previousActiveTriggerIdRef = React32.useRef(activeTriggerId); 8180 const previousPayloadRef = React32.useRef(payload); 8181 const pendingPayloadUpdateRef = React32.useRef(false); 8182 useIsoLayoutEffect(() => { 8183 const previousActiveTriggerId = previousActiveTriggerIdRef.current; 8184 const previousPayload = previousPayloadRef.current; 8185 const triggerIdChanged = activeTriggerId !== previousActiveTriggerId; 8186 const payloadChanged = payload !== previousPayload; 8187 if (triggerIdChanged) { 8188 setContentKey((value) => value + 1); 8189 pendingPayloadUpdateRef.current = !payloadChanged; 8190 } else if (pendingPayloadUpdateRef.current && payloadChanged) { 8191 setContentKey((value) => value + 1); 8192 pendingPayloadUpdateRef.current = false; 8193 } 8194 previousActiveTriggerIdRef.current = activeTriggerId; 8195 previousPayloadRef.current = payload; 8196 }, [activeTriggerId, payload]); 8197 return `$activeTriggerId ?? "current"}-$contentKey}`; 8198 } 8199 8200 // node_modules/@base-ui/react/utils/FloatingPortalLite.mjs 8201 var React33 = __toESM(require_react(), 1); 8202 var ReactDOM7 = __toESM(require_react_dom(), 1); 8203 var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1); 8204 var FloatingPortalLite = /* @__PURE__ */ React33.forwardRef(function FloatingPortalLite2(componentProps, forwardedRef) { 8205 const { 8206 children, 8207 container, 8208 className, 8209 render, 8210 style, 8211 ...elementProps 8212 } = componentProps; 8213 const { 8214 portalNode, 8215 portalSubtree 8216 } = useFloatingPortalNode({ 8217 container, 8218 ref: forwardedRef, 8219 componentProps, 8220 elementProps 8221 }); 8222 if (!portalSubtree && !portalNode) { 8223 return null; 8224 } 8225 return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(React33.Fragment, { 8226 children: [portalSubtree, portalNode && /* @__PURE__ */ ReactDOM7.createPortal(children, portalNode)] 8227 }); 8228 }); 8229 if (true) FloatingPortalLite.displayName = "FloatingPortalLite"; 8230 8231 // node_modules/@base-ui/react/tooltip/index.parts.mjs 8232 var index_parts_exports = {}; 8233 __export(index_parts_exports, { 8234 Arrow: () => TooltipArrow, 8235 Handle: () => TooltipHandle, 8236 Popup: () => TooltipPopup, 8237 Portal: () => TooltipPortal, 8238 Positioner: () => TooltipPositioner, 8239 Provider: () => TooltipProvider, 8240 Root: () => TooltipRoot, 8241 Trigger: () => TooltipTrigger, 8242 Viewport: () => TooltipViewport, 8243 createHandle: () => createTooltipHandle 8244 }); 8245 8246 // node_modules/@base-ui/react/tooltip/root/TooltipRoot.mjs 8247 var React36 = __toESM(require_react(), 1); 8248 8249 // node_modules/@base-ui/react/tooltip/root/TooltipRootContext.mjs 8250 var React34 = __toESM(require_react(), 1); 8251 var TooltipRootContext = /* @__PURE__ */ React34.createContext(void 0); 8252 if (true) TooltipRootContext.displayName = "TooltipRootContext"; 8253 function useTooltipRootContext(optional) { 8254 const context = React34.useContext(TooltipRootContext); 8255 if (context === void 0 && !optional) { 8256 throw new Error(true ? "Base UI: TooltipRootContext is missing. Tooltip parts must be placed within <Tooltip.Root>." : formatErrorMessage_default(72)); 8257 } 8258 return context; 8259 } 8260 8261 // node_modules/@base-ui/react/tooltip/store/TooltipStore.mjs 8262 var React35 = __toESM(require_react(), 1); 8263 var selectors2 = { 8264 ...popupStoreSelectors, 8265 disabled: createSelector2((state) => state.disabled), 8266 instantType: createSelector2((state) => state.instantType), 8267 isInstantPhase: createSelector2((state) => state.isInstantPhase), 8268 trackCursorAxis: createSelector2((state) => state.trackCursorAxis), 8269 disableHoverablePopup: createSelector2((state) => state.disableHoverablePopup), 8270 lastOpenChangeReason: createSelector2((state) => state.openChangeReason), 8271 closeOnClick: createSelector2((state) => state.closeOnClick), 8272 closeDelay: createSelector2((state) => state.closeDelay), 8273 hasViewport: createSelector2((state) => state.hasViewport) 8274 }; 8275 var TooltipStore = class _TooltipStore extends ReactStore { 8276 constructor(initialState, floatingId, nested = false) { 8277 const triggerElements = new PopupTriggerMap(); 8278 const state = { 8279 ...createInitialState(), 8280 ...initialState 8281 }; 8282 state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested); 8283 super(state, { 8284 popupRef: /* @__PURE__ */ React35.createRef(), 8285 onOpenChange: void 0, 8286 onOpenChangeComplete: void 0, 8287 triggerElements 8288 }, selectors2); 8289 } 8290 setOpen = (nextOpen, eventDetails) => { 8291 applyPopupOpenChange(this, nextOpen, eventDetails, { 8292 extraState: { 8293 openChangeReason: eventDetails.reason 8294 } 8295 }); 8296 }; 8297 // Used by trigger clicks to clear a delayed hover open without reporting a public open-state change. 8298 cancelPendingOpen(event) { 8299 this.state.floatingRootContext.dispatchOpenChange(false, createChangeEventDetails(reason_parts_exports.triggerPress, event)); 8300 } 8301 static useStore(externalStore, initialState) { 8302 const store2 = usePopupStore(externalStore, (floatingId, nested) => new _TooltipStore(initialState, floatingId, nested)).store; 8303 return store2; 8304 } 8305 }; 8306 function createInitialState() { 8307 return { 8308 ...createInitialPopupStoreState(), 8309 disabled: false, 8310 instantType: void 0, 8311 isInstantPhase: false, 8312 trackCursorAxis: "none", 8313 disableHoverablePopup: false, 8314 openChangeReason: null, 8315 closeOnClick: true, 8316 closeDelay: 0, 8317 hasViewport: false 8318 }; 8319 } 8320 8321 // node_modules/@base-ui/react/tooltip/root/TooltipRoot.mjs 8322 var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1); 8323 var TooltipRoot = fastComponent(function TooltipRoot2(props) { 8324 const { 8325 disabled: disabled2 = false, 8326 defaultOpen = false, 8327 open: openProp, 8328 disableHoverablePopup = false, 8329 trackCursorAxis = "none", 8330 actionsRef, 8331 onOpenChange, 8332 onOpenChangeComplete, 8333 handle, 8334 triggerId: triggerIdProp, 8335 defaultTriggerId: defaultTriggerIdProp = null, 8336 children 8337 } = props; 8338 const store2 = TooltipStore.useStore(handle?.store, { 8339 open: defaultOpen, 8340 openProp, 8341 activeTriggerId: defaultTriggerIdProp, 8342 triggerIdProp 8343 }); 8344 useInitialOpenSync(store2, openProp, defaultOpen, defaultTriggerIdProp); 8345 store2.useControlledProp("openProp", openProp); 8346 store2.useControlledProp("triggerIdProp", triggerIdProp); 8347 store2.useContextCallback("onOpenChange", onOpenChange); 8348 store2.useContextCallback("onOpenChangeComplete", onOpenChangeComplete); 8349 const openState = store2.useState("open"); 8350 const open = !disabled2 && openState; 8351 const activeTriggerId = store2.useState("activeTriggerId"); 8352 const mounted = store2.useState("mounted"); 8353 const payload = store2.useState("payload"); 8354 store2.useSyncedValues({ 8355 trackCursorAxis, 8356 disableHoverablePopup 8357 }); 8358 store2.useSyncedValue("disabled", disabled2); 8359 useImplicitActiveTrigger(store2, { 8360 closeOnActiveTriggerUnmount: true 8361 }); 8362 const { 8363 forceUnmount, 8364 transitionStatus 8365 } = useOpenStateTransitions(open, store2); 8366 const isInstantPhase = store2.useState("isInstantPhase"); 8367 const instantType = store2.useState("instantType"); 8368 const lastOpenChangeReason = store2.useState("lastOpenChangeReason"); 8369 const previousInstantTypeRef = React36.useRef(null); 8370 useIsoLayoutEffect(() => { 8371 if (openState && disabled2) { 8372 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.disabled)); 8373 } 8374 }, [openState, disabled2, store2]); 8375 useIsoLayoutEffect(() => { 8376 if (transitionStatus === "ending" && lastOpenChangeReason === reason_parts_exports.none || transitionStatus !== "ending" && isInstantPhase) { 8377 if (instantType !== "delay") { 8378 previousInstantTypeRef.current = instantType; 8379 } 8380 store2.set("instantType", "delay"); 8381 } else if (previousInstantTypeRef.current !== null) { 8382 store2.set("instantType", previousInstantTypeRef.current); 8383 previousInstantTypeRef.current = null; 8384 } 8385 }, [transitionStatus, isInstantPhase, lastOpenChangeReason, instantType, store2]); 8386 useIsoLayoutEffect(() => { 8387 if (open) { 8388 if (activeTriggerId == null) { 8389 store2.set("payload", void 0); 8390 } 8391 } 8392 }, [store2, activeTriggerId, open]); 8393 const handleImperativeClose = React36.useCallback(() => { 8394 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction)); 8395 }, [store2]); 8396 React36.useImperativeHandle(actionsRef, () => ({ 8397 unmount: forceUnmount, 8398 close: handleImperativeClose 8399 }), [forceUnmount, handleImperativeClose]); 8400 const shouldRenderInteractions = open || mounted || !disabled2 && trackCursorAxis !== "none"; 8401 return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(TooltipRootContext.Provider, { 8402 value: store2, 8403 children: [shouldRenderInteractions && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(TooltipInteractions, { 8404 store: store2, 8405 disabled: disabled2, 8406 trackCursorAxis 8407 }), typeof children === "function" ? children({ 8408 payload 8409 }) : children] 8410 }); 8411 }); 8412 if (true) TooltipRoot.displayName = "TooltipRoot"; 8413 function TooltipInteractions({ 8414 store: store2, 8415 disabled: disabled2, 8416 trackCursorAxis 8417 }) { 8418 const floatingRootContext = store2.useState("floatingRootContext"); 8419 const dismiss = useDismiss(floatingRootContext, { 8420 enabled: !disabled2, 8421 referencePress: () => store2.select("closeOnClick") 8422 }); 8423 const clientPoint = useClientPoint(floatingRootContext, { 8424 enabled: !disabled2 && trackCursorAxis !== "none", 8425 axis: trackCursorAxis === "none" ? void 0 : trackCursorAxis 8426 }); 8427 const activeTriggerProps = React36.useMemo(() => mergeProps(clientPoint.reference, dismiss.reference), [clientPoint.reference, dismiss.reference]); 8428 const inactiveTriggerProps = React36.useMemo(() => mergeProps(clientPoint.trigger, dismiss.trigger), [clientPoint.trigger, dismiss.trigger]); 8429 const popupProps = React36.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, clientPoint.floating, dismiss.floating), [clientPoint.floating, dismiss.floating]); 8430 usePopupInteractionProps(store2, { 8431 activeTriggerProps, 8432 inactiveTriggerProps, 8433 popupProps 8434 }); 8435 return null; 8436 } 8437 8438 // node_modules/@base-ui/react/tooltip/trigger/TooltipTrigger.mjs 8439 var React38 = __toESM(require_react(), 1); 8440 8441 // node_modules/@base-ui/react/tooltip/provider/TooltipProviderContext.mjs 8442 var React37 = __toESM(require_react(), 1); 8443 var TooltipProviderContext = /* @__PURE__ */ React37.createContext(void 0); 8444 if (true) TooltipProviderContext.displayName = "TooltipProviderContext"; 8445 function useTooltipProviderContext() { 8446 return React37.useContext(TooltipProviderContext); 8447 } 8448 8449 // node_modules/@base-ui/react/tooltip/trigger/TooltipTriggerDataAttributes.mjs 8450 var TooltipTriggerDataAttributes = (function(TooltipTriggerDataAttributes2) { 8451 TooltipTriggerDataAttributes2[TooltipTriggerDataAttributes2["popupOpen"] = CommonTriggerDataAttributes.popupOpen] = "popupOpen"; 8452 TooltipTriggerDataAttributes2["triggerDisabled"] = "data-trigger-disabled"; 8453 return TooltipTriggerDataAttributes2; 8454 })({}); 8455 8456 // node_modules/@base-ui/react/tooltip/utils/constants.mjs 8457 var OPEN_DELAY = 600; 8458 8459 // node_modules/@base-ui/react/tooltip/trigger/TooltipTrigger.mjs 8460 var TOOLTIP_TRIGGER_IDENTIFIER = "data-base-ui-tooltip-trigger"; 8461 function getTargetElement(event) { 8462 if ("composedPath" in event) { 8463 const path = event.composedPath(); 8464 for (let i = 0; i < path.length; i += 1) { 8465 const element = path[i]; 8466 if (isElement(element)) { 8467 return element; 8468 } 8469 } 8470 } 8471 const target = event.target; 8472 if (isElement(target)) { 8473 return target; 8474 } 8475 return null; 8476 } 8477 function closestEnabledTooltipTrigger(element) { 8478 let current = element; 8479 while (current) { 8480 if (current.hasAttribute(TOOLTIP_TRIGGER_IDENTIFIER)) { 8481 return current; 8482 } 8483 const parentElement = current.parentElement; 8484 if (parentElement) { 8485 current = parentElement; 8486 continue; 8487 } 8488 const root = current.getRootNode(); 8489 current = "host" in root && isElement(root.host) ? root.host : null; 8490 } 8491 return null; 8492 } 8493 var TooltipTrigger = fastComponentRef(function TooltipTrigger2(componentProps, forwardedRef) { 8494 const { 8495 render, 8496 className, 8497 style, 8498 handle, 8499 payload, 8500 disabled: disabledProp, 8501 delay, 8502 closeOnClick = true, 8503 closeDelay, 8504 id: idProp, 8505 ...elementProps 8506 } = componentProps; 8507 const rootContext = useTooltipRootContext(true); 8508 const store2 = handle?.store ?? rootContext; 8509 if (!store2) { 8510 throw new Error(true ? "Base UI: <Tooltip.Trigger> must be either used within a <Tooltip.Root> component or provided with a handle." : formatErrorMessage_default(82)); 8511 } 8512 const thisTriggerId = useBaseUiId(idProp); 8513 const isTriggerActive = store2.useState("isTriggerActive", thisTriggerId); 8514 const isOpenedByThisTrigger = store2.useState("isOpenedByTrigger", thisTriggerId); 8515 const floatingRootContext = store2.useState("floatingRootContext"); 8516 const triggerElementRef = React38.useRef(null); 8517 const delayWithDefault = delay ?? OPEN_DELAY; 8518 const closeDelayWithDefault = closeDelay ?? 0; 8519 const { 8520 registerTrigger, 8521 isMountedByThisTrigger 8522 } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store2, { 8523 payload, 8524 closeOnClick, 8525 closeDelay: closeDelayWithDefault 8526 }); 8527 const providerContext = useTooltipProviderContext(); 8528 const { 8529 delayRef, 8530 isInstantPhase, 8531 hasProvider 8532 } = useDelayGroup(floatingRootContext, { 8533 open: isOpenedByThisTrigger 8534 }); 8535 const hoverInteraction = useHoverInteractionSharedState(floatingRootContext); 8536 store2.useSyncedValue("isInstantPhase", isInstantPhase); 8537 const rootDisabled = store2.useState("disabled"); 8538 const disabled2 = disabledProp ?? rootDisabled; 8539 const disabledRef = useValueAsRef(disabled2); 8540 const trackCursorAxis = store2.useState("trackCursorAxis"); 8541 const disableHoverablePopup = store2.useState("disableHoverablePopup"); 8542 const isNestedTriggerHoveredRef = React38.useRef(false); 8543 const nestedTriggerOpenTimeout = useTimeout(); 8544 const pointerTypeRef = React38.useRef(void 0); 8545 function getOpenDelay() { 8546 const providerDelay = providerContext?.delay; 8547 const groupOpenValue = typeof delayRef.current === "object" ? delayRef.current.open : void 0; 8548 let computedOpenDelay = delayWithDefault; 8549 if (hasProvider) { 8550 if (groupOpenValue !== 0) { 8551 computedOpenDelay = delay ?? providerDelay ?? delayWithDefault; 8552 } else { 8553 computedOpenDelay = 0; 8554 } 8555 } 8556 return computedOpenDelay; 8557 } 8558 function isEnabledNestedTriggerTarget(target) { 8559 const triggerEl = triggerElementRef.current; 8560 if (!triggerEl || !target) { 8561 return false; 8562 } 8563 const nearestTrigger = closestEnabledTooltipTrigger(target); 8564 return nearestTrigger !== null && nearestTrigger !== triggerEl && contains(triggerEl, nearestTrigger); 8565 } 8566 function detectNestedTriggerHover(target) { 8567 const nestedTriggerHovered = isEnabledNestedTriggerTarget(target); 8568 isNestedTriggerHoveredRef.current = nestedTriggerHovered; 8569 if (nestedTriggerHovered) { 8570 hoverInteraction.openChangeTimeout.clear(); 8571 hoverInteraction.restTimeout.clear(); 8572 hoverInteraction.restTimeoutPending = false; 8573 nestedTriggerOpenTimeout.clear(); 8574 } 8575 return nestedTriggerHovered; 8576 } 8577 const hoverProps = useHoverReferenceInteraction(floatingRootContext, { 8578 enabled: !disabled2, 8579 mouseOnly: true, 8580 move: false, 8581 handleClose: !disableHoverablePopup && trackCursorAxis !== "both" ? safePolygon() : null, 8582 restMs: getOpenDelay, 8583 delay() { 8584 const closeValue = typeof delayRef.current === "object" ? delayRef.current.close : void 0; 8585 let computedCloseDelay = closeDelayWithDefault; 8586 if (closeDelay == null && hasProvider) { 8587 computedCloseDelay = closeValue; 8588 } 8589 return { 8590 close: computedCloseDelay 8591 }; 8592 }, 8593 triggerElementRef, 8594 isActiveTrigger: isTriggerActive, 8595 isClosing: () => store2.select("transitionStatus") === "ending", 8596 shouldOpen() { 8597 return !isNestedTriggerHoveredRef.current; 8598 } 8599 }); 8600 const focusProps = useFocus(floatingRootContext, { 8601 enabled: !disabled2 8602 }).reference; 8603 const handleNestedTriggerHover = (event) => { 8604 const wasNestedTriggerHovered = isNestedTriggerHoveredRef.current; 8605 const target = getTargetElement(event); 8606 const nestedTriggerHovered = detectNestedTriggerHover(target); 8607 const triggerEl = triggerElementRef.current; 8608 const targetInsideTrigger = triggerEl && target && contains(triggerEl, target); 8609 if (nestedTriggerHovered && store2.select("open") && store2.select("lastOpenChangeReason") === reason_parts_exports.triggerHover) { 8610 store2.setOpen(false, createChangeEventDetails(reason_parts_exports.triggerHover, event)); 8611 return; 8612 } 8613 if (wasNestedTriggerHovered && !nestedTriggerHovered && targetInsideTrigger && !disabledRef.current && !store2.select("open") && triggerEl && // Match the hover hook's non-strict mouse fallback for mouse-only event sequences. 8614 isMouseLikePointerType(pointerTypeRef.current)) { 8615 const open = () => { 8616 if (!isNestedTriggerHoveredRef.current && !disabledRef.current && !store2.select("open")) { 8617 store2.setOpen(true, createChangeEventDetails(reason_parts_exports.triggerHover, event, triggerEl)); 8618 } 8619 }; 8620 const openDelay = getOpenDelay(); 8621 if (openDelay === 0) { 8622 nestedTriggerOpenTimeout.clear(); 8623 open(); 8624 } else { 8625 nestedTriggerOpenTimeout.start(openDelay, open); 8626 } 8627 } 8628 }; 8629 const rootTriggerProps = store2.useState("triggerProps", isMountedByThisTrigger); 8630 const shouldApplyRootTriggerProps = isMountedByThisTrigger || trackCursorAxis !== "none"; 8631 const state = { 8632 open: isOpenedByThisTrigger 8633 }; 8634 const element = useRenderElement("button", componentProps, { 8635 state, 8636 ref: [forwardedRef, registerTrigger, triggerElementRef], 8637 props: [hoverProps, focusProps, shouldApplyRootTriggerProps ? rootTriggerProps : void 0, { 8638 onMouseOver(event) { 8639 handleNestedTriggerHover(event.nativeEvent); 8640 }, 8641 onFocus(event) { 8642 if (isEnabledNestedTriggerTarget(getTargetElement(event.nativeEvent))) { 8643 event.preventBaseUIHandler(); 8644 } 8645 }, 8646 onMouseLeave() { 8647 isNestedTriggerHoveredRef.current = false; 8648 nestedTriggerOpenTimeout.clear(); 8649 pointerTypeRef.current = void 0; 8650 }, 8651 onPointerEnter(event) { 8652 pointerTypeRef.current = event.pointerType; 8653 }, 8654 onPointerDown(event) { 8655 pointerTypeRef.current = event.pointerType; 8656 store2.set("closeOnClick", closeOnClick); 8657 if (closeOnClick && !store2.select("open")) { 8658 store2.cancelPendingOpen(event.nativeEvent); 8659 } 8660 }, 8661 onClick(event) { 8662 if (closeOnClick && !store2.select("open")) { 8663 store2.cancelPendingOpen(event.nativeEvent); 8664 } 8665 }, 8666 id: thisTriggerId, 8667 [TooltipTriggerDataAttributes.triggerDisabled]: disabled2 ? "" : void 0, 8668 [TOOLTIP_TRIGGER_IDENTIFIER]: disabled2 ? void 0 : "" 8669 }, elementProps], 8670 stateAttributesMapping: triggerOpenStateMapping 8671 }); 8672 return element; 8673 }); 8674 if (true) TooltipTrigger.displayName = "TooltipTrigger"; 8675 8676 // node_modules/@base-ui/react/tooltip/portal/TooltipPortal.mjs 8677 var React40 = __toESM(require_react(), 1); 8678 8679 // node_modules/@base-ui/react/tooltip/portal/TooltipPortalContext.mjs 8680 var React39 = __toESM(require_react(), 1); 8681 var TooltipPortalContext = /* @__PURE__ */ React39.createContext(void 0); 8682 if (true) TooltipPortalContext.displayName = "TooltipPortalContext"; 8683 function useTooltipPortalContext() { 8684 const value = React39.useContext(TooltipPortalContext); 8685 if (value === void 0) { 8686 throw new Error(true ? "Base UI: <Tooltip.Portal> is missing." : formatErrorMessage_default(70)); 8687 } 8688 return value; 8689 } 8690 8691 // node_modules/@base-ui/react/tooltip/portal/TooltipPortal.mjs 8692 var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1); 8693 var TooltipPortal = /* @__PURE__ */ React40.forwardRef(function TooltipPortal2(props, forwardedRef) { 8694 const { 8695 keepMounted = false, 8696 ...portalProps 8697 } = props; 8698 const store2 = useTooltipRootContext(); 8699 const mounted = store2.useState("mounted"); 8700 const shouldRender = mounted || keepMounted; 8701 if (!shouldRender) { 8702 return null; 8703 } 8704 return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(TooltipPortalContext.Provider, { 8705 value: keepMounted, 8706 children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(FloatingPortalLite, { 8707 ref: forwardedRef, 8708 ...portalProps 8709 }) 8710 }); 8711 }); 8712 if (true) TooltipPortal.displayName = "TooltipPortal"; 8713 8714 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositioner.mjs 8715 var React42 = __toESM(require_react(), 1); 8716 8717 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositionerContext.mjs 8718 var React41 = __toESM(require_react(), 1); 8719 var TooltipPositionerContext = /* @__PURE__ */ React41.createContext(void 0); 8720 if (true) TooltipPositionerContext.displayName = "TooltipPositionerContext"; 8721 function useTooltipPositionerContext() { 8722 const context = React41.useContext(TooltipPositionerContext); 8723 if (context === void 0) { 8724 throw new Error(true ? "Base UI: TooltipPositionerContext is missing. TooltipPositioner parts must be placed within <Tooltip.Positioner>." : formatErrorMessage_default(71)); 8725 } 8726 return context; 8727 } 8728 8729 // node_modules/@base-ui/react/tooltip/positioner/TooltipPositioner.mjs 8730 var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1); 8731 var TooltipPositioner = /* @__PURE__ */ React42.forwardRef(function TooltipPositioner2(componentProps, forwardedRef) { 8732 const { 8733 render, 8734 className, 8735 anchor, 8736 positionMethod = "absolute", 8737 side = "top", 8738 align = "center", 8739 sideOffset = 0, 8740 alignOffset = 0, 8741 collisionBoundary = "clipping-ancestors", 8742 collisionPadding = 5, 8743 arrowPadding = 5, 8744 sticky = false, 8745 disableAnchorTracking = false, 8746 collisionAvoidance = POPUP_COLLISION_AVOIDANCE, 8747 style, 8748 ...elementProps 8749 } = componentProps; 8750 const store2 = useTooltipRootContext(); 8751 const keepMounted = useTooltipPortalContext(); 8752 const open = store2.useState("open"); 8753 const mounted = store2.useState("mounted"); 8754 const trackCursorAxis = store2.useState("trackCursorAxis"); 8755 const disableHoverablePopup = store2.useState("disableHoverablePopup"); 8756 const floatingRootContext = store2.useState("floatingRootContext"); 8757 const instantType = store2.useState("instantType"); 8758 const transitionStatus = store2.useState("transitionStatus"); 8759 const hasViewport = store2.useState("hasViewport"); 8760 const positioning = useAnchorPositioning({ 8761 anchor, 8762 positionMethod, 8763 floatingRootContext, 8764 mounted, 8765 side, 8766 sideOffset, 8767 align, 8768 alignOffset, 8769 collisionBoundary, 8770 collisionPadding, 8771 sticky, 8772 arrowPadding, 8773 disableAnchorTracking, 8774 keepMounted, 8775 collisionAvoidance, 8776 adaptiveOrigin: hasViewport ? adaptiveOrigin : void 0 8777 }); 8778 const state = React42.useMemo(() => ({ 8779 open, 8780 side: positioning.side, 8781 align: positioning.align, 8782 anchorHidden: positioning.anchorHidden, 8783 instant: trackCursorAxis !== "none" ? "tracking-cursor" : instantType 8784 }), [open, positioning.side, positioning.align, positioning.anchorHidden, trackCursorAxis, instantType]); 8785 const element = usePositioner(componentProps, state, { 8786 styles: positioning.positionerStyles, 8787 transitionStatus, 8788 props: elementProps, 8789 refs: [forwardedRef, store2.useStateSetter("positionerElement")], 8790 hidden: !mounted, 8791 inert: !open || trackCursorAxis === "both" || disableHoverablePopup 8792 }); 8793 return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(TooltipPositionerContext.Provider, { 8794 value: positioning, 8795 children: element 8796 }); 8797 }); 8798 if (true) TooltipPositioner.displayName = "TooltipPositioner"; 8799 8800 // node_modules/@base-ui/react/tooltip/popup/TooltipPopup.mjs 8801 var React43 = __toESM(require_react(), 1); 8802 var stateAttributesMapping = { 8803 ...popupStateMapping, 8804 ...transitionStatusMapping 8805 }; 8806 var TooltipPopup = /* @__PURE__ */ React43.forwardRef(function TooltipPopup2(componentProps, forwardedRef) { 8807 const { 8808 render, 8809 className, 8810 style, 8811 ...elementProps 8812 } = componentProps; 8813 const store2 = useTooltipRootContext(); 8814 const { 8815 side, 8816 align 8817 } = useTooltipPositionerContext(); 8818 const open = store2.useState("open"); 8819 const instantType = store2.useState("instantType"); 8820 const transitionStatus = store2.useState("transitionStatus"); 8821 const popupProps = store2.useState("popupProps"); 8822 const floatingContext = store2.useState("floatingRootContext"); 8823 const disabled2 = store2.useState("disabled"); 8824 const closeDelay = store2.useState("closeDelay"); 8825 useOpenChangeComplete({ 8826 open, 8827 ref: store2.context.popupRef, 8828 onComplete() { 8829 if (open) { 8830 store2.context.onOpenChangeComplete?.(true); 8831 } 8832 } 8833 }); 8834 useHoverFloatingInteraction(floatingContext, { 8835 enabled: !disabled2, 8836 closeDelay 8837 }); 8838 const setPopupElement = store2.useStateSetter("popupElement"); 8839 const state = { 8840 open, 8841 side, 8842 align, 8843 instant: instantType, 8844 transitionStatus 8845 }; 8846 const element = useRenderElement("div", componentProps, { 8847 state, 8848 ref: [forwardedRef, store2.context.popupRef, setPopupElement], 8849 props: [popupProps, getDisabledMountTransitionStyles(transitionStatus), elementProps], 8850 stateAttributesMapping 8851 }); 8852 return element; 8853 }); 8854 if (true) TooltipPopup.displayName = "TooltipPopup"; 8855 8856 // node_modules/@base-ui/react/tooltip/arrow/TooltipArrow.mjs 8857 var React44 = __toESM(require_react(), 1); 8858 var TooltipArrow = /* @__PURE__ */ React44.forwardRef(function TooltipArrow2(componentProps, forwardedRef) { 8859 const { 8860 render, 8861 className, 8862 style, 8863 ...elementProps 8864 } = componentProps; 8865 const store2 = useTooltipRootContext(); 8866 const { 8867 arrowRef, 8868 side, 8869 align, 8870 arrowUncentered, 8871 arrowStyles 8872 } = useTooltipPositionerContext(); 8873 const open = store2.useState("open"); 8874 const instantType = store2.useState("instantType"); 8875 const state = { 8876 open, 8877 side, 8878 align, 8879 uncentered: arrowUncentered, 8880 instant: instantType 8881 }; 8882 const element = useRenderElement("div", componentProps, { 8883 state, 8884 ref: [forwardedRef, arrowRef], 8885 props: [{ 8886 style: arrowStyles, 8887 "aria-hidden": true 8888 }, elementProps], 8889 stateAttributesMapping: popupStateMapping 8890 }); 8891 return element; 8892 }); 8893 if (true) TooltipArrow.displayName = "TooltipArrow"; 8894 8895 // node_modules/@base-ui/react/tooltip/provider/TooltipProvider.mjs 8896 var React45 = __toESM(require_react(), 1); 8897 var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1); 8898 var TooltipProvider = function TooltipProvider2(props) { 8899 const { 8900 delay, 8901 closeDelay, 8902 timeout = 400 8903 } = props; 8904 const contextValue = React45.useMemo(() => ({ 8905 delay, 8906 closeDelay 8907 }), [delay, closeDelay]); 8908 const delayValue = React45.useMemo(() => ({ 8909 open: delay, 8910 close: closeDelay 8911 }), [delay, closeDelay]); 8912 return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(TooltipProviderContext.Provider, { 8913 value: contextValue, 8914 children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FloatingDelayGroup, { 8915 delay: delayValue, 8916 timeoutMs: timeout, 8917 children: props.children 8918 }) 8919 }); 8920 }; 8921 if (true) TooltipProvider.displayName = "TooltipProvider"; 8922 8923 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewport.mjs 8924 var React46 = __toESM(require_react(), 1); 8925 8926 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewportCssVars.mjs 8927 var TooltipViewportCssVars = /* @__PURE__ */ (function(TooltipViewportCssVars2) { 8928 TooltipViewportCssVars2["popupWidth"] = "--popup-width"; 8929 TooltipViewportCssVars2["popupHeight"] = "--popup-height"; 8930 return TooltipViewportCssVars2; 8931 })({}); 8932 8933 // node_modules/@base-ui/react/tooltip/viewport/TooltipViewport.mjs 8934 var stateAttributesMapping2 = { 8935 activationDirection: (value) => value ? { 8936 "data-activation-direction": value 8937 } : null 8938 }; 8939 var TooltipViewport = /* @__PURE__ */ React46.forwardRef(function TooltipViewport2(componentProps, forwardedRef) { 8940 const { 8941 render, 8942 className, 8943 style, 8944 children, 8945 ...elementProps 8946 } = componentProps; 8947 const store2 = useTooltipRootContext(); 8948 const positioner = useTooltipPositionerContext(); 8949 const instantType = store2.useState("instantType"); 8950 const { 8951 children: childrenToRender, 8952 state: viewportState 8953 } = usePopupViewport({ 8954 store: store2, 8955 side: positioner.side, 8956 cssVars: TooltipViewportCssVars, 8957 children 8958 }); 8959 const state = { 8960 activationDirection: viewportState.activationDirection, 8961 transitioning: viewportState.transitioning, 8962 instant: instantType 8963 }; 8964 return useRenderElement("div", componentProps, { 8965 state, 8966 ref: forwardedRef, 8967 props: [elementProps, { 8968 children: childrenToRender 8969 }], 8970 stateAttributesMapping: stateAttributesMapping2 8971 }); 8972 }); 8973 if (true) TooltipViewport.displayName = "TooltipViewport"; 8974 8975 // node_modules/@base-ui/react/tooltip/store/TooltipHandle.mjs 8976 var TooltipHandle = class { 8977 /** 8978 * Internal store holding the tooltip state. 8979 * @internal 8980 */ 8981 constructor() { 8982 this.store = new TooltipStore(); 8983 } 8984 /** 8985 * Opens the tooltip and associates it with the trigger with the given ID. 8986 * The trigger must be a Tooltip.Trigger component with this handle passed as a prop. 8987 * 8988 * This method should only be called in an event handler or an effect (not during rendering). 8989 * 8990 * @param triggerId ID of the trigger to associate with the tooltip. 8991 */ 8992 open(triggerId) { 8993 const triggerElement = triggerId ? this.store.context.triggerElements.getById(triggerId) : void 0; 8994 if (triggerId && !triggerElement) { 8995 throw new Error(true ? `Base UI: TooltipHandle.open: No trigger found with id "$triggerId}".` : formatErrorMessage_default(81, triggerId)); 8996 } 8997 this.store.setOpen(true, createChangeEventDetails(reason_parts_exports.imperativeAction, void 0, triggerElement)); 8998 } 8999 /** 9000 * Closes the tooltip. 9001 */ 9002 close() { 9003 this.store.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction, void 0, void 0)); 9004 } 9005 /** 9006 * Indicates whether the tooltip is currently open. 9007 */ 9008 get isOpen() { 9009 return this.store.select("open"); 9010 } 9011 }; 9012 function createTooltipHandle() { 9013 return new TooltipHandle(); 9014 } 9015 9016 // node_modules/@base-ui/react/use-render/useRender.mjs 9017 function useRender(params) { 9018 return useRenderElement(params.defaultTagName ?? "div", params, params); 9019 } 9020 9021 // packages/icons/build-module/icon/index.mjs 9022 var import_element11 = __toESM(require_element(), 1); 9023 var icon_default = (0, import_element11.forwardRef)( 9024 ({ icon, size: size4 = 24, ...props }, ref) => { 9025 return (0, import_element11.cloneElement)(icon, { 9026 width: size4, 9027 height: size4, 9028 ...props, 9029 ref 9030 }); 9031 } 9032 ); 9033 9034 // packages/icons/build-module/library/star-empty.mjs 9035 var import_primitives = __toESM(require_primitives(), 1); 9036 var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1); 9037 var star_empty_default = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives.Path, { fillRule: "evenodd", clipRule: "evenodd", d: "M9.706 8.646a.25.25 0 01-.188.137l-4.626.672a.25.25 0 00-.139.427l3.348 3.262a.25.25 0 01.072.222l-.79 4.607a.25.25 0 00.362.264l4.138-2.176a.25.25 0 01.233 0l4.137 2.175a.25.25 0 00.363-.263l-.79-4.607a.25.25 0 01.072-.222l3.347-3.262a.25.25 0 00-.139-.427l-4.626-.672a.25.25 0 01-.188-.137l-2.069-4.192a.25.25 0 00-.448 0L9.706 8.646zM12 7.39l-.948 1.921a1.75 1.75 0 01-1.317.957l-2.12.308 1.534 1.495c.412.402.6.982.503 1.55l-.362 2.11 1.896-.997a1.75 1.75 0 011.629 0l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39z" }) }); 9038 9039 // packages/icons/build-module/library/star-filled.mjs 9040 var import_primitives2 = __toESM(require_primitives(), 1); 9041 var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1); 9042 var star_filled_default = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives2.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives2.Path, { d: "M11.776 4.454a.25.25 0 01.448 0l2.069 4.192a.25.25 0 00.188.137l4.626.672a.25.25 0 01.139.426l-3.348 3.263a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.362.263l-4.138-2.175a.25.25 0 00-.232 0l-4.138 2.175a.25.25 0 01-.363-.263l.79-4.607a.25.25 0 00-.071-.222L4.754 9.881a.25.25 0 01.139-.426l4.626-.672a.25.25 0 00.188-.137l2.069-4.192z" }) }); 9043 9044 // packages/icons/build-module/library/star-half.mjs 9045 var import_primitives3 = __toESM(require_primitives(), 1); 9046 var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1); 9047 var star_half_default = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives3.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives3.Path, { d: "M9.518 8.783a.25.25 0 00.188-.137l2.069-4.192a.25.25 0 01.448 0l2.07 4.192a.25.25 0 00.187.137l4.626.672a.25.25 0 01.139.427l-3.347 3.262a.25.25 0 00-.072.222l.79 4.607a.25.25 0 01-.363.264l-4.137-2.176a.25.25 0 00-.233 0l-4.138 2.175a.25.25 0 01-.362-.263l.79-4.607a.25.25 0 00-.072-.222L4.753 9.882a.25.25 0 01.14-.427l4.625-.672zM12 14.533c.28 0 .559.067.814.2l1.895.997-.362-2.11a1.75 1.75 0 01.504-1.55l1.533-1.495-2.12-.308a1.75 1.75 0 01-1.317-.957L12 7.39v7.143z" }) }); 9048 9049 // packages/ui/build-module/utils/render-slot-with-children.mjs 9050 var import_element12 = __toESM(require_element(), 1); 9051 function renderSlotWithChildren(slot, defaultSlot, children) { 9052 return (0, import_element12.cloneElement)(slot ?? defaultSlot, { children }); 9053 } 9054 9055 // packages/ui/build-module/utils/theme-provider.mjs 9056 var theme = __toESM(require_theme(), 1); 9057 9058 // packages/ui/build-module/lock-unlock.mjs 9059 var import_private_apis = __toESM(require_private_apis(), 1); 9060 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 9061 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 9062 "@wordpress/ui" 9063 ); 9064 9065 // packages/ui/build-module/utils/theme-provider.mjs 9066 function getThemeProvider() { 9067 const themePackage = theme; 9068 if (themePackage.ThemeProvider) { 9069 return themePackage.ThemeProvider; 9070 } 9071 if (!themePackage.privateApis) { 9072 throw new Error( 9073 "@wordpress/ui: @wordpress/theme must expose `ThemeProvider` or `privateApis.ThemeProvider`." 9074 ); 9075 } 9076 return unlock( 9077 themePackage.privateApis 9078 ).ThemeProvider; 9079 } 9080 var ThemeProvider = getThemeProvider(); 9081 9082 // packages/ui/build-module/tooltip/index.mjs 9083 var tooltip_exports = {}; 9084 __export(tooltip_exports, { 9085 Popup: () => Popup, 9086 Portal: () => Portal, 9087 Positioner: () => Positioner, 9088 Provider: () => Provider, 9089 Root: () => Root, 9090 Trigger: () => Trigger 9091 }); 9092 9093 // packages/ui/build-module/tooltip/popup.mjs 9094 var import_element15 = __toESM(require_element(), 1); 9095 9096 // packages/ui/build-module/tooltip/portal.mjs 9097 var import_element13 = __toESM(require_element(), 1); 9098 9099 // packages/ui/build-module/utils/wp-compat-overlay-slot.mjs 9100 var STYLE_HASH_ATTRIBUTE = "data-wp-hash"; 9101 function getRuntime() { 9102 const globalScope = globalThis; 9103 if (globalScope.__wpStyleRuntime) { 9104 return globalScope.__wpStyleRuntime; 9105 } 9106 globalScope.__wpStyleRuntime = { 9107 documents: /* @__PURE__ */ new Map(), 9108 styles: /* @__PURE__ */ new Map(), 9109 injectedStyles: /* @__PURE__ */ new WeakMap() 9110 }; 9111 if (typeof document !== "undefined") { 9112 registerDocument(document); 9113 } 9114 return globalScope.__wpStyleRuntime; 9115 } 9116 function documentContainsStyleHash(targetDocument, hash) { 9117 if (!targetDocument.head) { 9118 return false; 9119 } 9120 for (const style of targetDocument.head.querySelectorAll( 9121 `style[$STYLE_HASH_ATTRIBUTE}]` 9122 )) { 9123 if (style.getAttribute(STYLE_HASH_ATTRIBUTE) === hash) { 9124 return true; 9125 } 9126 } 9127 return false; 9128 } 9129 function injectStyle(targetDocument, hash, css) { 9130 if (!targetDocument.head) { 9131 return; 9132 } 9133 const runtime = getRuntime(); 9134 let injectedStyles = runtime.injectedStyles.get(targetDocument); 9135 if (!injectedStyles) { 9136 injectedStyles = /* @__PURE__ */ new Set(); 9137 runtime.injectedStyles.set(targetDocument, injectedStyles); 9138 } 9139 if (injectedStyles.has(hash)) { 9140 return; 9141 } 9142 if (documentContainsStyleHash(targetDocument, hash)) { 9143 injectedStyles.add(hash); 9144 return; 9145 } 9146 const style = targetDocument.createElement("style"); 9147 style.setAttribute(STYLE_HASH_ATTRIBUTE, hash); 9148 style.appendChild(targetDocument.createTextNode(css)); 9149 targetDocument.head.appendChild(style); 9150 injectedStyles.add(hash); 9151 } 9152 function registerDocument(targetDocument) { 9153 const runtime = getRuntime(); 9154 runtime.documents.set( 9155 targetDocument, 9156 (runtime.documents.get(targetDocument) ?? 0) + 1 9157 ); 9158 for (const [hash, css] of runtime.styles) { 9159 injectStyle(targetDocument, hash, css); 9160 } 9161 return () => { 9162 const count = runtime.documents.get(targetDocument); 9163 if (count === void 0) { 9164 return; 9165 } 9166 if (count <= 1) { 9167 runtime.documents.delete(targetDocument); 9168 return; 9169 } 9170 runtime.documents.set(targetDocument, count - 1); 9171 }; 9172 } 9173 function registerStyle(hash, css) { 9174 const runtime = getRuntime(); 9175 runtime.styles.set(hash, css); 9176 for (const targetDocument of runtime.documents.keys()) { 9177 injectStyle(targetDocument, hash, css); 9178 } 9179 } 9180 if (typeof process === "undefined" || true) { 9181 registerStyle("be37f31c1e", "._11fc52b637ff8a7e__slot{inset:0;isolation:isolate;pointer-events:none;position:fixed;z-index:1000000003}@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._11fc52b637ff8a7e__slot>*{pointer-events:auto}}}"); 9182 } 9183 var wp_compat_overlay_slot_default = { "slot": "_11fc52b637ff8a7e__slot" }; 9184 var WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE = "data-wp-compat-overlay-slot"; 9185 function resolveOwnerDocument() { 9186 return typeof document === "undefined" ? null : document; 9187 } 9188 function isInWordPressEnvironment() { 9189 let topWp; 9190 try { 9191 topWp = window.top?.wp; 9192 } catch { 9193 } 9194 const wp = topWp ?? window.wp; 9195 return typeof wp?.components === "object" && wp.components !== null; 9196 } 9197 var cachedSlot = null; 9198 function createSlot(ownerDocument2) { 9199 const element = ownerDocument2.createElement("div"); 9200 element.setAttribute(WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE, ""); 9201 if (wp_compat_overlay_slot_default.slot) { 9202 element.classList.add(wp_compat_overlay_slot_default.slot); 9203 } 9204 ownerDocument2.body.appendChild(element); 9205 return element; 9206 } 9207 function getWpCompatOverlaySlot() { 9208 if (typeof window === "undefined") { 9209 return void 0; 9210 } 9211 if (!isInWordPressEnvironment() && window.__wpUiCompatOverlaySlotEnabled !== true) { 9212 return void 0; 9213 } 9214 const ownerDocument2 = resolveOwnerDocument(); 9215 if (!ownerDocument2 || !ownerDocument2.body) { 9216 return void 0; 9217 } 9218 if (cachedSlot && cachedSlot.ownerDocument === ownerDocument2 && cachedSlot.isConnected) { 9219 return cachedSlot; 9220 } 9221 const existing = ownerDocument2.querySelector( 9222 `[$WP_COMPAT_OVERLAY_SLOT_ATTRIBUTE}]` 9223 ); 9224 if (existing instanceof HTMLDivElement) { 9225 cachedSlot = existing; 9226 return existing; 9227 } 9228 if (cachedSlot?.isConnected) { 9229 cachedSlot.remove(); 9230 } 9231 cachedSlot = createSlot(ownerDocument2); 9232 return cachedSlot; 9233 } 9234 9235 // packages/ui/build-module/tooltip/portal.mjs 9236 var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1); 9237 var Portal = (0, import_element13.forwardRef)( 9238 function TooltipPortal3({ container, ...restProps }, ref) { 9239 return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)( 9240 index_parts_exports.Portal, 9241 { 9242 container: container ?? getWpCompatOverlaySlot(), 9243 ...restProps, 9244 ref 9245 } 9246 ); 9247 } 9248 ); 9249 9250 // packages/ui/build-module/tooltip/positioner.mjs 9251 var import_element14 = __toESM(require_element(), 1); 9252 var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1); 9253 var STYLE_HASH_ATTRIBUTE2 = "data-wp-hash"; 9254 function getRuntime2() { 9255 const globalScope = globalThis; 9256 if (globalScope.__wpStyleRuntime) { 9257 return globalScope.__wpStyleRuntime; 9258 } 9259 globalScope.__wpStyleRuntime = { 9260 documents: /* @__PURE__ */ new Map(), 9261 styles: /* @__PURE__ */ new Map(), 9262 injectedStyles: /* @__PURE__ */ new WeakMap() 9263 }; 9264 if (typeof document !== "undefined") { 9265 registerDocument2(document); 9266 } 9267 return globalScope.__wpStyleRuntime; 9268 } 9269 function documentContainsStyleHash2(targetDocument, hash) { 9270 if (!targetDocument.head) { 9271 return false; 9272 } 9273 for (const style of targetDocument.head.querySelectorAll( 9274 `style[$STYLE_HASH_ATTRIBUTE2}]` 9275 )) { 9276 if (style.getAttribute(STYLE_HASH_ATTRIBUTE2) === hash) { 9277 return true; 9278 } 9279 } 9280 return false; 9281 } 9282 function injectStyle2(targetDocument, hash, css) { 9283 if (!targetDocument.head) { 9284 return; 9285 } 9286 const runtime = getRuntime2(); 9287 let injectedStyles = runtime.injectedStyles.get(targetDocument); 9288 if (!injectedStyles) { 9289 injectedStyles = /* @__PURE__ */ new Set(); 9290 runtime.injectedStyles.set(targetDocument, injectedStyles); 9291 } 9292 if (injectedStyles.has(hash)) { 9293 return; 9294 } 9295 if (documentContainsStyleHash2(targetDocument, hash)) { 9296 injectedStyles.add(hash); 9297 return; 9298 } 9299 const style = targetDocument.createElement("style"); 9300 style.setAttribute(STYLE_HASH_ATTRIBUTE2, hash); 9301 style.appendChild(targetDocument.createTextNode(css)); 9302 targetDocument.head.appendChild(style); 9303 injectedStyles.add(hash); 9304 } 9305 function registerDocument2(targetDocument) { 9306 const runtime = getRuntime2(); 9307 runtime.documents.set( 9308 targetDocument, 9309 (runtime.documents.get(targetDocument) ?? 0) + 1 9310 ); 9311 for (const [hash, css] of runtime.styles) { 9312 injectStyle2(targetDocument, hash, css); 9313 } 9314 return () => { 9315 const count = runtime.documents.get(targetDocument); 9316 if (count === void 0) { 9317 return; 9318 } 9319 if (count <= 1) { 9320 runtime.documents.delete(targetDocument); 9321 return; 9322 } 9323 runtime.documents.set(targetDocument, count - 1); 9324 }; 9325 } 9326 function registerStyle2(hash, css) { 9327 const runtime = getRuntime2(); 9328 runtime.styles.set(hash, css); 9329 for (const targetDocument of runtime.documents.keys()) { 9330 injectStyle2(targetDocument, hash, css); 9331 } 9332 } 9333 if (typeof process === "undefined" || true) { 9334 registerStyle2("10f3806643", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer utilities{._336cd3e4e743482f__box-sizing{box-sizing:border-box;*,:after,:before{box-sizing:inherit}}}}"); 9335 } 9336 var resets_default = { "box-sizing": "_336cd3e4e743482f__box-sizing" }; 9337 if (typeof process === "undefined" || true) { 9338 registerStyle2("19fcc06039", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._480b748dd3510e64__positioner{z-index:var(--wp-ui-tooltip-z-index,initial)}._50096b232db7709d__popup{--_wp-ui-elevation-sm:0 1px 2px rgba(0,0,0,.05),0 2px 3px rgba(0,0,0,.04),0 6px 6px rgba(0,0,0,.03),0 8px 8px rgba(0,0,0,.02);background-color:var(--wpds-color-background-surface-neutral-strong,#fff);border-radius:var(--wpds-border-radius-md,4px);box-shadow:var(--_wp-ui-elevation-sm);color:var(--wpds-color-foreground-content-neutral,#1e1e1e);font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-size:var(--wpds-typography-font-size-sm,12px);line-height:1.4;padding:var(--wpds-dimension-padding-xs,4px) var(--wpds-dimension-padding-sm,8px);@media (forced-colors:active){border-bottom-color:CanvasText;border-bottom-style:solid;border-bottom-width:1px;border-left-color:CanvasText;border-left-style:solid;border-left-width:1px;border-right-color:CanvasText;border-right-style:solid;border-right-width:1px;border-top-color:CanvasText;border-top-style:solid;border-top-width:1px}}}}'); 9339 } 9340 var style_default = { "positioner": "_480b748dd3510e64__positioner", "popup": "_50096b232db7709d__popup" }; 9341 var Positioner = (0, import_element14.forwardRef)( 9342 function TooltipPositioner3({ align = "center", className, side = "top", sideOffset = 4, ...props }, ref) { 9343 return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)( 9344 index_parts_exports.Positioner, 9345 { 9346 ref, 9347 align, 9348 side, 9349 sideOffset, 9350 ...props, 9351 className: clsx_default( 9352 resets_default["box-sizing"], 9353 style_default.positioner, 9354 className 9355 ) 9356 } 9357 ); 9358 } 9359 ); 9360 9361 // packages/ui/build-module/tooltip/popup.mjs 9362 var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1); 9363 var STYLE_HASH_ATTRIBUTE3 = "data-wp-hash"; 9364 function getRuntime3() { 9365 const globalScope = globalThis; 9366 if (globalScope.__wpStyleRuntime) { 9367 return globalScope.__wpStyleRuntime; 9368 } 9369 globalScope.__wpStyleRuntime = { 9370 documents: /* @__PURE__ */ new Map(), 9371 styles: /* @__PURE__ */ new Map(), 9372 injectedStyles: /* @__PURE__ */ new WeakMap() 9373 }; 9374 if (typeof document !== "undefined") { 9375 registerDocument3(document); 9376 } 9377 return globalScope.__wpStyleRuntime; 9378 } 9379 function documentContainsStyleHash3(targetDocument, hash) { 9380 if (!targetDocument.head) { 9381 return false; 9382 } 9383 for (const style of targetDocument.head.querySelectorAll( 9384 `style[$STYLE_HASH_ATTRIBUTE3}]` 9385 )) { 9386 if (style.getAttribute(STYLE_HASH_ATTRIBUTE3) === hash) { 9387 return true; 9388 } 9389 } 9390 return false; 9391 } 9392 function injectStyle3(targetDocument, hash, css) { 9393 if (!targetDocument.head) { 9394 return; 9395 } 9396 const runtime = getRuntime3(); 9397 let injectedStyles = runtime.injectedStyles.get(targetDocument); 9398 if (!injectedStyles) { 9399 injectedStyles = /* @__PURE__ */ new Set(); 9400 runtime.injectedStyles.set(targetDocument, injectedStyles); 9401 } 9402 if (injectedStyles.has(hash)) { 9403 return; 9404 } 9405 if (documentContainsStyleHash3(targetDocument, hash)) { 9406 injectedStyles.add(hash); 9407 return; 9408 } 9409 const style = targetDocument.createElement("style"); 9410 style.setAttribute(STYLE_HASH_ATTRIBUTE3, hash); 9411 style.appendChild(targetDocument.createTextNode(css)); 9412 targetDocument.head.appendChild(style); 9413 injectedStyles.add(hash); 9414 } 9415 function registerDocument3(targetDocument) { 9416 const runtime = getRuntime3(); 9417 runtime.documents.set( 9418 targetDocument, 9419 (runtime.documents.get(targetDocument) ?? 0) + 1 9420 ); 9421 for (const [hash, css] of runtime.styles) { 9422 injectStyle3(targetDocument, hash, css); 9423 } 9424 return () => { 9425 const count = runtime.documents.get(targetDocument); 9426 if (count === void 0) { 9427 return; 9428 } 9429 if (count <= 1) { 9430 runtime.documents.delete(targetDocument); 9431 return; 9432 } 9433 runtime.documents.set(targetDocument, count - 1); 9434 }; 9435 } 9436 function registerStyle3(hash, css) { 9437 const runtime = getRuntime3(); 9438 runtime.styles.set(hash, css); 9439 for (const targetDocument of runtime.documents.keys()) { 9440 injectStyle3(targetDocument, hash, css); 9441 } 9442 } 9443 if (typeof process === "undefined" || true) { 9444 registerStyle3("19fcc06039", '@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{._480b748dd3510e64__positioner{z-index:var(--wp-ui-tooltip-z-index,initial)}._50096b232db7709d__popup{--_wp-ui-elevation-sm:0 1px 2px rgba(0,0,0,.05),0 2px 3px rgba(0,0,0,.04),0 6px 6px rgba(0,0,0,.03),0 8px 8px rgba(0,0,0,.02);background-color:var(--wpds-color-background-surface-neutral-strong,#fff);border-radius:var(--wpds-border-radius-md,4px);box-shadow:var(--_wp-ui-elevation-sm);color:var(--wpds-color-foreground-content-neutral,#1e1e1e);font-family:var(--wpds-typography-font-family-body,-apple-system,system-ui,"Segoe UI","Roboto","Oxygen-Sans","Ubuntu","Cantarell","Helvetica Neue",sans-serif);font-size:var(--wpds-typography-font-size-sm,12px);line-height:1.4;padding:var(--wpds-dimension-padding-xs,4px) var(--wpds-dimension-padding-sm,8px);@media (forced-colors:active){border-bottom-color:CanvasText;border-bottom-style:solid;border-bottom-width:1px;border-left-color:CanvasText;border-left-style:solid;border-left-width:1px;border-right-color:CanvasText;border-right-style:solid;border-right-width:1px;border-top-color:CanvasText;border-top-style:solid;border-top-width:1px}}}}'); 9445 } 9446 var style_default2 = { "positioner": "_480b748dd3510e64__positioner", "popup": "_50096b232db7709d__popup" }; 9447 var POPUP_COLOR = { background: "#1e1e1e" }; 9448 var Popup = (0, import_element15.forwardRef)(function TooltipPopup3({ portal, positioner, children, className, ...props }, ref) { 9449 const popupContent = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ThemeProvider, { color: POPUP_COLOR, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)( 9450 index_parts_exports.Popup, 9451 { 9452 ref, 9453 className: clsx_default(style_default2.popup, className), 9454 ...props, 9455 children 9456 } 9457 ) }); 9458 const positionedPopup = renderSlotWithChildren( 9459 positioner, 9460 /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Positioner, {}), 9461 popupContent 9462 ); 9463 return renderSlotWithChildren(portal, /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Portal, {}), positionedPopup); 9464 }); 9465 9466 // packages/ui/build-module/tooltip/trigger.mjs 9467 var import_element16 = __toESM(require_element(), 1); 9468 var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1); 9469 var Trigger = (0, import_element16.forwardRef)( 9470 function TooltipTrigger3(props, ref) { 9471 return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(index_parts_exports.Trigger, { ref, ...props }); 9472 } 9473 ); 9474 9475 // packages/ui/build-module/tooltip/root.mjs 9476 var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1); 9477 function Root(props) { 9478 return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(index_parts_exports.Root, { ...props }); 9479 } 9480 9481 // packages/ui/build-module/tooltip/provider.mjs 9482 var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1); 9483 function Provider({ ...props }) { 9484 return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(index_parts_exports.Provider, { ...props }); 9485 } 9486 9487 // packages/ui/build-module/visually-hidden/visually-hidden.mjs 9488 var import_element17 = __toESM(require_element(), 1); 9489 var STYLE_HASH_ATTRIBUTE4 = "data-wp-hash"; 9490 function getRuntime4() { 9491 const globalScope = globalThis; 9492 if (globalScope.__wpStyleRuntime) { 9493 return globalScope.__wpStyleRuntime; 9494 } 9495 globalScope.__wpStyleRuntime = { 9496 documents: /* @__PURE__ */ new Map(), 9497 styles: /* @__PURE__ */ new Map(), 9498 injectedStyles: /* @__PURE__ */ new WeakMap() 9499 }; 9500 if (typeof document !== "undefined") { 9501 registerDocument4(document); 9502 } 9503 return globalScope.__wpStyleRuntime; 9504 } 9505 function documentContainsStyleHash4(targetDocument, hash) { 9506 if (!targetDocument.head) { 9507 return false; 9508 } 9509 for (const style of targetDocument.head.querySelectorAll( 9510 `style[$STYLE_HASH_ATTRIBUTE4}]` 9511 )) { 9512 if (style.getAttribute(STYLE_HASH_ATTRIBUTE4) === hash) { 9513 return true; 9514 } 9515 } 9516 return false; 9517 } 9518 function injectStyle4(targetDocument, hash, css) { 9519 if (!targetDocument.head) { 9520 return; 9521 } 9522 const runtime = getRuntime4(); 9523 let injectedStyles = runtime.injectedStyles.get(targetDocument); 9524 if (!injectedStyles) { 9525 injectedStyles = /* @__PURE__ */ new Set(); 9526 runtime.injectedStyles.set(targetDocument, injectedStyles); 9527 } 9528 if (injectedStyles.has(hash)) { 9529 return; 9530 } 9531 if (documentContainsStyleHash4(targetDocument, hash)) { 9532 injectedStyles.add(hash); 9533 return; 9534 } 9535 const style = targetDocument.createElement("style"); 9536 style.setAttribute(STYLE_HASH_ATTRIBUTE4, hash); 9537 style.appendChild(targetDocument.createTextNode(css)); 9538 targetDocument.head.appendChild(style); 9539 injectedStyles.add(hash); 9540 } 9541 function registerDocument4(targetDocument) { 9542 const runtime = getRuntime4(); 9543 runtime.documents.set( 9544 targetDocument, 9545 (runtime.documents.get(targetDocument) ?? 0) + 1 9546 ); 9547 for (const [hash, css] of runtime.styles) { 9548 injectStyle4(targetDocument, hash, css); 9549 } 9550 return () => { 9551 const count = runtime.documents.get(targetDocument); 9552 if (count === void 0) { 9553 return; 9554 } 9555 if (count <= 1) { 9556 runtime.documents.delete(targetDocument); 9557 return; 9558 } 9559 runtime.documents.set(targetDocument, count - 1); 9560 }; 9561 } 9562 function registerStyle4(hash, css) { 9563 const runtime = getRuntime4(); 9564 runtime.styles.set(hash, css); 9565 for (const targetDocument of runtime.documents.keys()) { 9566 injectStyle4(targetDocument, hash, css); 9567 } 9568 } 9569 if (typeof process === "undefined" || true) { 9570 registerStyle4("fa606a57ae", "@layer wp-ui{@layer utilities, components, compositions, overrides;@layer components{.f37b9e2e191ebd66__visually-hidden{word-wrap:normal;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal}}}"); 9571 } 9572 var style_default3 = { "visually-hidden": "f37b9e2e191ebd66__visually-hidden" }; 9573 var VisuallyHidden = (0, import_element17.forwardRef)( 9574 function VisuallyHidden2({ render, ...restProps }, ref) { 9575 const element = useRender({ 9576 render, 9577 ref, 9578 props: mergeProps( 9579 { className: style_default3["visually-hidden"] }, 9580 restProps, 9581 { 9582 // @ts-expect-error Arbitrary data-* attributes aren't indexable on the typed div props. Kept hardcoded so consumers can't change or remove it. 9583 "data-visually-hidden": "" 9584 } 9585 ) 9586 }); 9587 return element; 9588 } 9589 ); 9590 9591 // packages/block-directory/build-module/components/block-ratings/stars.mjs 9592 var import_i18n2 = __toESM(require_i18n(), 1); 9593 var import_jsx_runtime20 = __toESM(require_jsx_runtime(), 1); 9594 function Stars({ rating }) { 9595 const stars = Math.round(rating / 0.5) * 0.5; 9596 const fullStarCount = Math.floor(rating); 9597 const halfStarCount = Math.ceil(rating - fullStarCount); 9598 const emptyStarCount = 5 - (fullStarCount + halfStarCount); 9599 return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)( 9600 "span", 9601 { 9602 "aria-label": (0, import_i18n2.sprintf)( 9603 /* translators: %s: number of stars. */ 9604 (0, import_i18n2.__)("%s out of 5 stars"), 9605 stars 9606 ), 9607 children: [ 9608 Array.from({ length: fullStarCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)( 9609 icon_default, 9610 { 9611 className: "block-directory-block-ratings__star-full", 9612 icon: star_filled_default, 9613 size: 16 9614 }, 9615 `full_stars_$i}` 9616 )), 9617 Array.from({ length: halfStarCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)( 9618 icon_default, 9619 { 9620 className: "block-directory-block-ratings__star-half-full", 9621 icon: star_half_default, 9622 size: 16 9623 }, 9624 `half_stars_$i}` 9625 )), 9626 Array.from({ length: emptyStarCount }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)( 9627 icon_default, 9628 { 9629 className: "block-directory-block-ratings__star-empty", 9630 icon: star_empty_default, 9631 size: 16 9632 }, 9633 `empty_stars_$i}` 9634 )) 9635 ] 9636 } 9637 ); 9638 } 9639 var stars_default = Stars; 9640 9641 // packages/block-directory/build-module/components/block-ratings/index.mjs 9642 var import_jsx_runtime21 = __toESM(require_jsx_runtime(), 1); 9643 var BlockRatings = ({ rating }) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "block-directory-block-ratings", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(stars_default, { rating }) }); 9644 var block_ratings_default = BlockRatings; 9645 9646 // packages/block-directory/build-module/components/downloadable-block-icon/index.mjs 9647 var import_block_editor2 = __toESM(require_block_editor(), 1); 9648 var import_jsx_runtime22 = __toESM(require_jsx_runtime(), 1); 9649 function DownloadableBlockIcon({ icon }) { 9650 const className = "block-directory-downloadable-block-icon"; 9651 return icon.match(/\.(jpeg|jpg|gif|png|svg)(?:\?.*)?$/) !== null ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("img", { className, src: icon, alt: "" }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_block_editor2.BlockIcon, { className, icon, showColors: true }); 9652 } 9653 var downloadable_block_icon_default = DownloadableBlockIcon; 9654 9655 // packages/block-directory/build-module/components/downloadable-block-notice/index.mjs 9656 var import_i18n3 = __toESM(require_i18n(), 1); 9657 var import_data5 = __toESM(require_data(), 1); 9658 var import_jsx_runtime23 = __toESM(require_jsx_runtime(), 1); 9659 var DownloadableBlockNotice = ({ block }) => { 9660 const errorNotice = (0, import_data5.useSelect)( 9661 (select) => select(store).getErrorNoticeForBlock(block.id), 9662 [block] 9663 ); 9664 if (!errorNotice) { 9665 return null; 9666 } 9667 return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "block-directory-downloadable-block-notice", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "block-directory-downloadable-block-notice__content", children: [ 9668 errorNotice.message, 9669 errorNotice.isFatal ? " " + (0, import_i18n3.__)("Try reloading the page.") : null 9670 ] }) }); 9671 }; 9672 var downloadable_block_notice_default = DownloadableBlockNotice; 9673 9674 // packages/block-directory/build-module/components/downloadable-block-list-item/index.mjs 9675 var import_jsx_runtime24 = __toESM(require_jsx_runtime(), 1); 9676 function getDownloadableBlockLabel({ title, rating, ratingCount }, { hasNotice, isInstalled, isInstalling: isInstalling2 }) { 9677 const stars = Math.round(rating / 0.5) * 0.5; 9678 if (!isInstalled && hasNotice) { 9679 return (0, import_i18n4.sprintf)("Retry installing %s.", (0, import_html_entities.decodeEntities)(title)); 9680 } 9681 if (isInstalled) { 9682 return (0, import_i18n4.sprintf)("Add %s.", (0, import_html_entities.decodeEntities)(title)); 9683 } 9684 if (isInstalling2) { 9685 return (0, import_i18n4.sprintf)("Installing %s.", (0, import_html_entities.decodeEntities)(title)); 9686 } 9687 if (ratingCount < 1) { 9688 return (0, import_i18n4.sprintf)("Install %s.", (0, import_html_entities.decodeEntities)(title)); 9689 } 9690 return (0, import_i18n4.sprintf)( 9691 /* translators: 1: block title, 2: average rating, 3: total ratings count. */ 9692 (0, import_i18n4._n)( 9693 "Install %1$s. %2$s stars with %3$s review.", 9694 "Install %1$s. %2$s stars with %3$s reviews.", 9695 ratingCount 9696 ), 9697 (0, import_html_entities.decodeEntities)(title), 9698 stars, 9699 ratingCount 9700 ); 9701 } 9702 function DownloadableBlockListItem({ item, onClick }) { 9703 const { author, description, icon, rating, title } = item; 9704 const isInstalled = !!(0, import_blocks3.getBlockType)(item.name); 9705 const { hasNotice, isInstalling: isInstalling2, isInstallable } = (0, import_data6.useSelect)( 9706 (select) => { 9707 const { getErrorNoticeForBlock: getErrorNoticeForBlock2, isInstalling: isBlockInstalling } = select(store); 9708 const notice = getErrorNoticeForBlock2(item.id); 9709 const hasFatal = notice && notice.isFatal; 9710 return { 9711 hasNotice: !!notice, 9712 isInstalling: isBlockInstalling(item.id), 9713 isInstallable: !hasFatal 9714 }; 9715 }, 9716 [item] 9717 ); 9718 let statusText = ""; 9719 if (isInstalled) { 9720 statusText = (0, import_i18n4.__)("Installed!"); 9721 } else if (isInstalling2) { 9722 statusText = (0, import_i18n4.__)("Installing\u2026"); 9723 } 9724 const itemLabel = getDownloadableBlockLabel(item, { 9725 hasNotice, 9726 isInstalled, 9727 isInstalling: isInstalling2 9728 }); 9729 return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(tooltip_exports.Root, { children: [ 9730 /* @__PURE__ */ (0, import_jsx_runtime24.jsx)( 9731 tooltip_exports.Trigger, 9732 { 9733 render: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)( 9734 import_components.Composite.Item, 9735 { 9736 className: clsx_default( 9737 "block-directory-downloadable-block-list-item", 9738 isInstalling2 && "is-installing" 9739 ), 9740 accessibleWhenDisabled: true, 9741 disabled: isInstalling2 || !isInstallable, 9742 onClick: (event) => { 9743 event.preventDefault(); 9744 onClick(); 9745 }, 9746 "aria-label": itemLabel, 9747 type: "button", 9748 role: "option", 9749 children: [ 9750 /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "block-directory-downloadable-block-list-item__icon", children: [ 9751 /* @__PURE__ */ (0, import_jsx_runtime24.jsx)( 9752 downloadable_block_icon_default, 9753 { 9754 icon, 9755 title 9756 } 9757 ), 9758 isInstalling2 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "block-directory-downloadable-block-list-item__spinner", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_components.Spinner, {}) }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(block_ratings_default, { rating }) 9759 ] }), 9760 /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "block-directory-downloadable-block-list-item__details", children: [ 9761 /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "block-directory-downloadable-block-list-item__title", children: (0, import_element18.createInterpolateElement)( 9762 (0, import_i18n4.sprintf)( 9763 /* translators: 1: block title. 2: author name. */ 9764 (0, import_i18n4.__)("%1$s <span>by %2$s</span>"), 9765 (0, import_html_entities.decodeEntities)(title), 9766 author 9767 ), 9768 { 9769 span: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "block-directory-downloadable-block-list-item__author" }) 9770 } 9771 ) }), 9772 hasNotice ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(downloadable_block_notice_default, { block: item }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [ 9773 /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "block-directory-downloadable-block-list-item__desc", children: !!statusText ? statusText : (0, import_html_entities.decodeEntities)(description) }), 9774 isInstallable && !(isInstalled || isInstalling2) && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(VisuallyHidden, { children: (0, import_i18n4.__)("Install block") }) 9775 ] }) 9776 ] }) 9777 ] 9778 } 9779 ) 9780 } 9781 ), 9782 /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(tooltip_exports.Popup, { children: itemLabel }) 9783 ] }); 9784 } 9785 var downloadable_block_list_item_default = DownloadableBlockListItem; 9786 9787 // packages/block-directory/build-module/components/downloadable-blocks-list/index.mjs 9788 var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1); 9789 var noop4 = () => { 9790 }; 9791 function DownloadableBlocksList({ items, onHover = noop4, onSelect }) { 9792 const { installBlockType: installBlockType2 } = (0, import_data7.useDispatch)(store); 9793 if (!items.length) { 9794 return null; 9795 } 9796 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 9797 import_components2.Composite, 9798 { 9799 role: "listbox", 9800 className: "block-directory-downloadable-blocks-list", 9801 "aria-label": (0, import_i18n5.__)("Blocks available for install"), 9802 children: items.map((item) => { 9803 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 9804 downloadable_block_list_item_default, 9805 { 9806 onClick: () => { 9807 if ((0, import_blocks4.getBlockType)(item.name)) { 9808 onSelect(item); 9809 } else { 9810 installBlockType2(item).then((success) => { 9811 if (success) { 9812 onSelect(item); 9813 } 9814 }); 9815 } 9816 onHover(null); 9817 }, 9818 onHover, 9819 item 9820 }, 9821 item.id 9822 ); 9823 }) 9824 } 9825 ); 9826 } 9827 var downloadable_blocks_list_default = DownloadableBlocksList; 9828 9829 // packages/block-directory/build-module/components/downloadable-blocks-panel/inserter-panel.mjs 9830 var import_i18n6 = __toESM(require_i18n(), 1); 9831 var import_element19 = __toESM(require_element(), 1); 9832 var import_a11y = __toESM(require_a11y(), 1); 9833 var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1); 9834 function DownloadableBlocksInserterPanel({ 9835 children, 9836 downloadableItems, 9837 hasLocalBlocks 9838 }) { 9839 const count = downloadableItems.length; 9840 (0, import_element19.useEffect)(() => { 9841 (0, import_a11y.speak)( 9842 (0, import_i18n6.sprintf)( 9843 /* translators: %d: number of available blocks. */ 9844 (0, import_i18n6._n)( 9845 "%d additional block is available to install.", 9846 "%d additional blocks are available to install.", 9847 count 9848 ), 9849 count 9850 ) 9851 ); 9852 }, [count]); 9853 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [ 9854 !hasLocalBlocks && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "block-directory-downloadable-blocks-panel__no-local", children: (0, import_i18n6.__)("No results available from your installed blocks.") }), 9855 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "block-editor-inserter__quick-inserter-separator" }), 9856 /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "block-directory-downloadable-blocks-panel", children: [ 9857 /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "block-directory-downloadable-blocks-panel__header", children: [ 9858 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h2", { className: "block-directory-downloadable-blocks-panel__title", children: (0, import_i18n6.__)("Available to install") }), 9859 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "block-directory-downloadable-blocks-panel__description", children: (0, import_i18n6.__)( 9860 "Select a block to install and add it to your post." 9861 ) }) 9862 ] }), 9863 children 9864 ] }) 9865 ] }); 9866 } 9867 var inserter_panel_default = DownloadableBlocksInserterPanel; 9868 9869 // packages/block-directory/build-module/components/downloadable-blocks-panel/no-results.mjs 9870 var import_i18n7 = __toESM(require_i18n(), 1); 9871 var import_components3 = __toESM(require_components(), 1); 9872 var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1); 9873 function DownloadableBlocksNoResults() { 9874 return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [ 9875 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "block-editor-inserter__no-results", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { children: (0, import_i18n7.__)("No results found.") }) }), 9876 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "block-editor-inserter__tips", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_components3.Tip, { children: [ 9877 (0, import_i18n7.__)("Interested in creating your own block?"), 9878 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("br", {}), 9879 /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_components3.ExternalLink, { href: "https://developer.wordpress.org/block-editor/", children: [ 9880 (0, import_i18n7.__)("Get started here"), 9881 "." 9882 ] }) 9883 ] }) }) 9884 ] }); 9885 } 9886 var no_results_default = DownloadableBlocksNoResults; 9887 9888 // packages/block-directory/build-module/components/downloadable-blocks-panel/index.mjs 9889 var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1); 9890 var EMPTY_ARRAY3 = []; 9891 var useDownloadableBlocks = (filterValue) => (0, import_data8.useSelect)( 9892 (select) => { 9893 const { 9894 getDownloadableBlocks: getDownloadableBlocks3, 9895 isRequestingDownloadableBlocks: isRequestingDownloadableBlocks2, 9896 getInstalledBlockTypes: getInstalledBlockTypes2 9897 } = select(store); 9898 const hasPermission = select(import_core_data.store).canUser( 9899 "read", 9900 "block-directory/search" 9901 ); 9902 let downloadableBlocks2 = EMPTY_ARRAY3; 9903 if (hasPermission) { 9904 downloadableBlocks2 = getDownloadableBlocks3(filterValue); 9905 const installedBlockTypes = getInstalledBlockTypes2(); 9906 const installableBlocks = downloadableBlocks2.filter( 9907 ({ name }) => { 9908 const isJustInstalled = installedBlockTypes.some( 9909 (blockType) => blockType.name === name 9910 ); 9911 const isPreviouslyInstalled = (0, import_blocks5.getBlockType)(name); 9912 return isJustInstalled || !isPreviouslyInstalled; 9913 } 9914 ); 9915 if (installableBlocks.length !== downloadableBlocks2.length) { 9916 downloadableBlocks2 = installableBlocks; 9917 } 9918 if (downloadableBlocks2.length === 0) { 9919 downloadableBlocks2 = EMPTY_ARRAY3; 9920 } 9921 } 9922 return { 9923 hasPermission, 9924 downloadableBlocks: downloadableBlocks2, 9925 isLoading: isRequestingDownloadableBlocks2(filterValue) 9926 }; 9927 }, 9928 [filterValue] 9929 ); 9930 function DownloadableBlocksPanel({ 9931 onSelect, 9932 onHover, 9933 hasLocalBlocks, 9934 isTyping, 9935 filterValue 9936 }) { 9937 const { hasPermission, downloadableBlocks: downloadableBlocks2, isLoading } = useDownloadableBlocks(filterValue); 9938 if (hasPermission === void 0 || isLoading || isTyping) { 9939 return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [ 9940 hasPermission && !hasLocalBlocks && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [ 9941 /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "block-directory-downloadable-blocks-panel__no-local", children: (0, import_i18n8.__)( 9942 "No results available from your installed blocks." 9943 ) }), 9944 /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "block-editor-inserter__quick-inserter-separator" }) 9945 ] }), 9946 /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "block-directory-downloadable-blocks-panel has-blocks-loading", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_components4.Spinner, {}) }) 9947 ] }); 9948 } 9949 if (false === hasPermission) { 9950 if (!hasLocalBlocks) { 9951 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(no_results_default, {}); 9952 } 9953 return null; 9954 } 9955 if (downloadableBlocks2.length === 0) { 9956 return hasLocalBlocks ? null : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(no_results_default, {}); 9957 } 9958 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( 9959 inserter_panel_default, 9960 { 9961 downloadableItems: downloadableBlocks2, 9962 hasLocalBlocks, 9963 children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)( 9964 downloadable_blocks_list_default, 9965 { 9966 items: downloadableBlocks2, 9967 onSelect, 9968 onHover 9969 } 9970 ) 9971 } 9972 ); 9973 } 9974 9975 // packages/block-directory/build-module/plugins/inserter-menu-downloadable-blocks-panel/index.mjs 9976 var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1); 9977 function InserterMenuDownloadableBlocksPanel() { 9978 const [debouncedFilterValue, setFilterValue] = (0, import_element20.useState)(""); 9979 const debouncedSetFilterValue = (0, import_compose.debounce)(setFilterValue, 400); 9980 return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_block_editor3.__unstableInserterMenuExtension, { children: ({ onSelect, onHover, filterValue, hasItems }) => { 9981 if (debouncedFilterValue !== filterValue) { 9982 debouncedSetFilterValue(filterValue); 9983 } 9984 if (!debouncedFilterValue) { 9985 return null; 9986 } 9987 return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)( 9988 DownloadableBlocksPanel, 9989 { 9990 onSelect, 9991 onHover, 9992 filterValue: debouncedFilterValue, 9993 hasLocalBlocks: hasItems, 9994 isTyping: filterValue !== debouncedFilterValue 9995 } 9996 ); 9997 } }); 9998 } 9999 var inserter_menu_downloadable_blocks_panel_default = InserterMenuDownloadableBlocksPanel; 10000 10001 // packages/block-directory/build-module/plugins/installed-blocks-pre-publish-panel/index.mjs 10002 var import_i18n10 = __toESM(require_i18n(), 1); 10003 var import_data9 = __toESM(require_data(), 1); 10004 var import_editor2 = __toESM(require_editor(), 1); 10005 10006 // packages/block-directory/build-module/components/compact-list/index.mjs 10007 var import_i18n9 = __toESM(require_i18n(), 1); 10008 var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1); 10009 function CompactList({ items }) { 10010 if (!items.length) { 10011 return null; 10012 } 10013 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("ul", { className: "block-directory-compact-list", children: items.map(({ icon, id, title, author }) => /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("li", { className: "block-directory-compact-list__item", children: [ 10014 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(downloadable_block_icon_default, { icon, title }), 10015 /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "block-directory-compact-list__item-details", children: [ 10016 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "block-directory-compact-list__item-title", children: title }), 10017 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "block-directory-compact-list__item-author", children: (0, import_i18n9.sprintf)( 10018 /* translators: %s: Name of the block author. */ 10019 (0, import_i18n9.__)("By %s"), 10020 author 10021 ) }) 10022 ] }) 10023 ] }, id)) }); 10024 } 10025 10026 // packages/block-directory/build-module/plugins/installed-blocks-pre-publish-panel/index.mjs 10027 var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1); 10028 function InstalledBlocksPrePublishPanel() { 10029 const newBlockTypes = (0, import_data9.useSelect)( 10030 (select) => select(store).getNewBlockTypes(), 10031 [] 10032 ); 10033 if (!newBlockTypes.length) { 10034 return null; 10035 } 10036 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)( 10037 import_editor2.PluginPrePublishPanel, 10038 { 10039 title: (0, import_i18n10.sprintf)( 10040 // translators: %d: number of blocks (number). 10041 (0, import_i18n10._n)( 10042 "Added: %d block", 10043 "Added: %d blocks", 10044 newBlockTypes.length 10045 ), 10046 newBlockTypes.length 10047 ), 10048 initialOpen: true, 10049 children: [ 10050 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "installed-blocks-pre-publish-panel__copy", children: (0, import_i18n10._n)( 10051 "The following block has been added to your site.", 10052 "The following blocks have been added to your site.", 10053 newBlockTypes.length 10054 ) }), 10055 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(CompactList, { items: newBlockTypes }) 10056 ] 10057 } 10058 ); 10059 } 10060 10061 // packages/block-directory/build-module/plugins/get-install-missing/index.mjs 10062 var import_i18n12 = __toESM(require_i18n(), 1); 10063 var import_components6 = __toESM(require_components(), 1); 10064 var import_blocks7 = __toESM(require_blocks(), 1); 10065 var import_element21 = __toESM(require_element(), 1); 10066 var import_data11 = __toESM(require_data(), 1); 10067 var import_core_data2 = __toESM(require_core_data(), 1); 10068 var import_block_editor5 = __toESM(require_block_editor(), 1); 10069 10070 // packages/block-directory/build-module/plugins/get-install-missing/install-button.mjs 10071 var import_i18n11 = __toESM(require_i18n(), 1); 10072 var import_components5 = __toESM(require_components(), 1); 10073 var import_blocks6 = __toESM(require_blocks(), 1); 10074 var import_data10 = __toESM(require_data(), 1); 10075 var import_block_editor4 = __toESM(require_block_editor(), 1); 10076 var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1); 10077 function InstallButton({ attributes, block, clientId }) { 10078 const isInstallingBlock = (0, import_data10.useSelect)( 10079 (select) => select(store).isInstalling(block.id), 10080 [block.id] 10081 ); 10082 const { installBlockType: installBlockType2 } = (0, import_data10.useDispatch)(store); 10083 const { replaceBlock } = (0, import_data10.useDispatch)(import_block_editor4.store); 10084 return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 10085 import_components5.Button, 10086 { 10087 __next40pxDefaultSize: true, 10088 onClick: () => installBlockType2(block).then((success) => { 10089 if (success) { 10090 const blockType = (0, import_blocks6.getBlockType)(block.name); 10091 const [originalBlock] = (0, import_blocks6.parse)( 10092 attributes.originalContent 10093 ); 10094 if (originalBlock && blockType) { 10095 replaceBlock( 10096 clientId, 10097 (0, import_blocks6.createBlock)( 10098 blockType.name, 10099 originalBlock.attributes, 10100 originalBlock.innerBlocks 10101 ) 10102 ); 10103 } 10104 } 10105 }), 10106 accessibleWhenDisabled: true, 10107 disabled: isInstallingBlock, 10108 isBusy: isInstallingBlock, 10109 variant: "primary", 10110 children: (0, import_i18n11.sprintf)( 10111 /* translators: %s: block name */ 10112 (0, import_i18n11.__)("Install %s"), 10113 block.title 10114 ) 10115 } 10116 ); 10117 } 10118 10119 // packages/block-directory/build-module/plugins/get-install-missing/index.mjs 10120 var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1); 10121 var getInstallMissing = (OriginalComponent) => (props) => { 10122 const { originalName } = props.attributes; 10123 const { block, hasPermission } = (0, import_data11.useSelect)( 10124 (select) => { 10125 const { getDownloadableBlocks: getDownloadableBlocks3 } = select(store); 10126 const blocks = getDownloadableBlocks3( 10127 "block:" + originalName 10128 ).filter(({ name }) => originalName === name); 10129 return { 10130 hasPermission: select(import_core_data2.store).canUser( 10131 "read", 10132 "block-directory/search" 10133 ), 10134 block: blocks.length && blocks[0] 10135 }; 10136 }, 10137 [originalName] 10138 ); 10139 if (!hasPermission || !block) { 10140 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(OriginalComponent, { ...props }); 10141 } 10142 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ModifiedWarning, { ...props, originalBlock: block }); 10143 }; 10144 var ModifiedWarning = ({ originalBlock, ...props }) => { 10145 const { originalName, originalUndelimitedContent, clientId } = props.attributes; 10146 const { replaceBlock } = (0, import_data11.useDispatch)(import_block_editor5.store); 10147 const convertToHTML = () => { 10148 replaceBlock( 10149 props.clientId, 10150 (0, import_blocks7.createBlock)("core/html", {}, [], [originalUndelimitedContent]) 10151 ); 10152 }; 10153 const hasContent = !!originalUndelimitedContent; 10154 const hasHTMLBlock = (0, import_data11.useSelect)( 10155 (select) => { 10156 const { canInsertBlockType, getBlockRootClientId } = select(import_block_editor5.store); 10157 return canInsertBlockType( 10158 "core/html", 10159 getBlockRootClientId(clientId) 10160 ); 10161 }, 10162 [clientId] 10163 ); 10164 let messageHTML = (0, import_i18n12.sprintf)( 10165 /* translators: %s: block name */ 10166 (0, import_i18n12.__)( 10167 "Your site doesn\u2019t include support for the %s block. You can try installing the block or remove it entirely." 10168 ), 10169 originalBlock.title || originalName 10170 ); 10171 const actions = [ 10172 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 10173 InstallButton, 10174 { 10175 block: originalBlock, 10176 attributes: props.attributes, 10177 clientId: props.clientId 10178 }, 10179 "install" 10180 ) 10181 ]; 10182 if (hasContent && hasHTMLBlock) { 10183 messageHTML = (0, import_i18n12.sprintf)( 10184 /* translators: %s: block name */ 10185 (0, import_i18n12.__)( 10186 "Your site doesn\u2019t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely." 10187 ), 10188 originalBlock.title || originalName 10189 ); 10190 actions.push( 10191 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 10192 import_components6.Button, 10193 { 10194 __next40pxDefaultSize: true, 10195 onClick: convertToHTML, 10196 variant: "tertiary", 10197 children: (0, import_i18n12.__)("Keep as HTML") 10198 }, 10199 "convert" 10200 ) 10201 ); 10202 } 10203 return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { ...(0, import_block_editor5.useBlockProps)(), children: [ 10204 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_block_editor5.Warning, { actions, children: messageHTML }), 10205 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_element21.RawHTML, { children: originalUndelimitedContent }) 10206 ] }); 10207 }; 10208 var get_install_missing_default = getInstallMissing; 10209 10210 // packages/block-directory/build-module/plugins/index.mjs 10211 var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1); 10212 (0, import_plugins.registerPlugin)("block-directory", { 10213 // The icon is explicitly set to undefined to prevent PluginPrePublishPanel 10214 // from rendering the fallback icon pluginIcon. 10215 icon: void 0, 10216 render() { 10217 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [ 10218 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(AutoBlockUninstaller, {}), 10219 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(inserter_menu_downloadable_blocks_panel_default, {}), 10220 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(InstalledBlocksPrePublishPanel, {}) 10221 ] }); 10222 } 10223 }); 10224 (0, import_hooks.addFilter)( 10225 "blocks.registerBlockType", 10226 "block-directory/fallback", 10227 (settings, name) => { 10228 if (name !== "core/missing") { 10229 return settings; 10230 } 10231 settings.edit = get_install_missing_default(settings.edit); 10232 return settings; 10233 } 10234 ); 10235 return __toCommonJS(index_exports); 10236 })(); 10237 /*! Bundled license information: 10238 10239 use-sync-external-store/cjs/use-sync-external-store-shim.development.js: 10240 (** 10241 * @license React 10242 * use-sync-external-store-shim.development.js 10243 * 10244 * Copyright (c) Meta Platforms, Inc. and affiliates. 10245 * 10246 * This source code is licensed under the MIT license found in the 10247 * LICENSE file in the root directory of this source tree. 10248 *) 10249 10250 use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js: 10251 (** 10252 * @license React 10253 * use-sync-external-store-shim/with-selector.development.js 10254 * 10255 * Copyright (c) Meta Platforms, Inc. and affiliates. 10256 * 10257 * This source code is licensed under the MIT license found in the 10258 * LICENSE file in the root directory of this source tree. 10259 *) 10260 */
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sun Jul 19 08:20:17 2026 | Cross-referenced by PHPXref |