[{"data":1,"prerenderedAt":2401},["ShallowReactive",2],{"navigation_docs":3,"-guide-opening-and-closing":188,"-guide-opening-and-closing-surround":2396},[4,9,27,52,101,130,163],{"title":5,"path":6,"stem":7,"icon":8},"Playground","\u002Fplayground","1.playground","i-lucide-flask-conical",{"title":10,"path":11,"stem":12,"children":13,"page":26},"Getting Started","\u002Fgetting-started","2.getting-started",[14,18,22],{"title":15,"path":16,"stem":17},"Introduction","\u002Fgetting-started\u002Fintroduction","2.getting-started\u002F1.introduction",{"title":19,"path":20,"stem":21},"Installation","\u002Fgetting-started\u002Finstallation","2.getting-started\u002F2.installation",{"title":23,"path":24,"stem":25},"First modal","\u002Fgetting-started\u002Ffirst-modal","2.getting-started\u002F3.first-modal",false,{"title":28,"path":29,"stem":30,"children":31,"page":26},"Concepts","\u002Fconcepts","3.concepts",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Architecture","\u002Fconcepts\u002Farchitecture","3.concepts\u002F1.architecture",{"title":37,"path":38,"stem":39},"Imperative flow","\u002Fconcepts\u002Fimperative-flow","3.concepts\u002F2.imperative-flow",{"title":41,"path":42,"stem":43},"Stacking","\u002Fconcepts\u002Fstacking","3.concepts\u002F3.stacking",{"title":45,"path":46,"stem":47},"Groups","\u002Fconcepts\u002Fgroups","3.concepts\u002F4.groups",{"title":49,"path":50,"stem":51},"Headless primitives","\u002Fconcepts\u002Fheadless-primitives","3.concepts\u002F5.headless-primitives",{"title":53,"path":54,"stem":55,"children":56,"page":26},"Guide","\u002Fguide","4.guide",[57,61,65,69,73,77,81,85,89,93,97],{"title":58,"path":59,"stem":60},"Writing a modal","\u002Fguide\u002Fwriting-a-modal","4.guide\u002F01.writing-a-modal",{"title":62,"path":63,"stem":64},"Opening & closing","\u002Fguide\u002Fopening-and-closing","4.guide\u002F02.opening-and-closing",{"title":66,"path":67,"stem":68},"Props & results","\u002Fguide\u002Fpassing-props-and-results","4.guide\u002F03.passing-props-and-results",{"title":70,"path":71,"stem":72},"Behavior options","\u002Fguide\u002Fbehavior-options","4.guide\u002F04.behavior-options",{"title":74,"path":75,"stem":76},"Animations & styling","\u002Fguide\u002Fstyling-and-animations","4.guide\u002F05.styling-and-animations",{"title":78,"path":79,"stem":80},"useModal composable","\u002Fguide\u002Fusemodal-composable","4.guide\u002F06.usemodal-composable",{"title":82,"path":83,"stem":84},"Modal context","\u002Fguide\u002Fmodal-context","4.guide\u002F07.modal-context",{"title":86,"path":87,"stem":88},"Multiple targets","\u002Fguide\u002Fmultiple-targets","4.guide\u002F08.multiple-targets",{"title":90,"path":91,"stem":92},"Overlay","\u002Fguide\u002Foverlay","4.guide\u002F09.overlay",{"title":94,"path":95,"stem":96},"Async components","\u002Fguide\u002Fasync-components","4.guide\u002F10.async-components",{"title":98,"path":99,"stem":100},"TypeScript","\u002Fguide\u002Ftypescript","4.guide\u002F11.typescript",{"title":102,"path":103,"stem":104,"children":105,"page":26},"Recipes","\u002Frecipes","5.recipes",[106,110,114,118,122,126],{"title":107,"path":108,"stem":109},"Confirm dialog","\u002Frecipes\u002Fconfirm-dialog","5.recipes\u002F1.confirm-dialog",{"title":111,"path":112,"stem":113},"Form modal with validation","\u002Frecipes\u002Fform-modal-with-validation","5.recipes\u002F2.form-modal-with-validation",{"title":115,"path":116,"stem":117},"Image lightbox","\u002Frecipes\u002Fimage-lightbox","5.recipes\u002F3.image-lightbox",{"title":119,"path":120,"stem":121},"Command palette","\u002Frecipes\u002Fcommand-palette","5.recipes\u002F4.command-palette",{"title":123,"path":124,"stem":125},"Nested flows \u002F wizards","\u002Frecipes\u002Fnested-flows","5.recipes\u002F5.nested-flows",{"title":127,"path":128,"stem":129},"Global error modal","\u002Frecipes\u002Fglobal-error-modal","5.recipes\u002F6.global-error-modal",{"title":131,"path":132,"stem":133,"children":134,"page":26},"Api","\u002Fapi","6.api",[135,139,143,147,151,155,159],{"title":136,"path":137,"stem":138},"Functions","\u002Fapi\u002Ffunctions","6.api\u002F1.functions",{"title":140,"path":141,"stem":142},"Components","\u002Fapi\u002Fcomponents","6.api\u002F2.components",{"title":144,"path":145,"stem":146},"Composables","\u002Fapi\u002Fcomposables","6.api\u002F3.composables",{"title":148,"path":149,"stem":150},"Plugin","\u002Fapi\u002Fplugin","6.api\u002F4.plugin",{"title":152,"path":153,"stem":154},"State helpers","\u002Fapi\u002Fstate","6.api\u002F5.state",{"title":156,"path":157,"stem":158},"Global events","\u002Fapi\u002Fevents","6.api\u002F6.events",{"title":160,"path":161,"stem":162},"Types","\u002Fapi\u002Ftypes","6.api\u002F7.types",{"title":164,"path":165,"stem":166,"children":167,"page":26},"Resources","\u002Fresources","7.resources",[168,172,176,180,184],{"title":169,"path":170,"stem":171},"Migration from v1","\u002Fresources\u002Fmigration-from-v1","7.resources\u002F1.migration-from-v1",{"title":173,"path":174,"stem":175},"FAQ","\u002Fresources\u002Ffaq","7.resources\u002F2.faq",{"title":177,"path":178,"stem":179},"Troubleshooting","\u002Fresources\u002Ftroubleshooting","7.resources\u002F3.troubleshooting",{"title":181,"path":182,"stem":183},"Comparison","\u002Fresources\u002Fcomparison","7.resources\u002F4.comparison",{"title":185,"path":186,"stem":187},"Changelog","\u002Fresources\u002Fchangelog","7.resources\u002F5.changelog",{"id":189,"title":62,"body":190,"description":2390,"extension":2391,"links":2392,"meta":2393,"navigation":328,"path":63,"seo":2394,"stem":64,"__hash__":2395},"docs\u002F4.guide\u002F02.opening-and-closing.md",{"type":191,"value":192,"toc":2364},"minimark",[193,197,206,213,218,455,491,664,678,684,687,833,839,923,929,932,1004,1007,1071,1081,1084,1234,1257,1321,1327,1330,1409,1415,1465,1469,1475,1486,1634,1664,1670,1683,1801,1809,1844,1849,1868,1926,1942,1950,2104,2116,2212,2269,2273,2286,2348,2360],[194,195,62],"h1",{"id":196},"opening-closing",[198,199,200,201,205],"p",{},"All action functions are top-level exports from ",[202,203,204],"code",{},"@kolirt\u002Fvue-modal",". They operate on the global modal stack.",[207,208,210],"h2",{"id":209},"openmodal",[202,211,212],{},"openModal",[214,215,217],"h3",{"id":216},"signature","Signature",[219,220,225],"pre",{"className":221,"code":222,"language":223,"meta":224,"style":224},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","function openModal\u003CT = unknown, C extends Component = Component>(\n  component: C,\n  options?: OpenModalOptions\u003CC>\n): ModalHandle\u003CT>\n\ninterface OpenModalOptions\u003CC extends Component> {\n  props?: ExtractComponentProps\u003CC>     \u002F\u002F typed props forwarded to the component\n  on?: Record\u003Cstring, (...args: any[]) => void> \u002F\u002F event listeners\n  group?: ModalGroup                   \u002F\u002F target ModalTarget; falls back to component's defineOptions({ modalGroup })\n  instantEnter?: boolean               \u002F\u002F skip enter animation (default false)\n}\n","ts","",[202,226,227,273,288,308,323,330,352,374,421,435,449],{"__ignoreMap":224},[228,229,232,236,240,244,248,251,254,257,260,263,266,268,270],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"spNyl","function",[228,237,239],{"class":238},"s2Zo4"," openModal",[228,241,243],{"class":242},"sMK4o","\u003C",[228,245,247],{"class":246},"sBMFI","T",[228,249,250],{"class":242}," =",[228,252,253],{"class":246}," unknown",[228,255,256],{"class":242},",",[228,258,259],{"class":246}," C",[228,261,262],{"class":234}," extends",[228,264,265],{"class":246}," Component",[228,267,250],{"class":242},[228,269,265],{"class":246},[228,271,272],{"class":242},">(\n",[228,274,276,280,283,285],{"class":230,"line":275},2,[228,277,279],{"class":278},"sHdIc","  component",[228,281,282],{"class":242},":",[228,284,259],{"class":246},[228,286,287],{"class":242},",\n",[228,289,291,294,297,300,302,305],{"class":230,"line":290},3,[228,292,293],{"class":278},"  options",[228,295,296],{"class":242},"?:",[228,298,299],{"class":246}," OpenModalOptions",[228,301,243],{"class":242},[228,303,304],{"class":246},"C",[228,306,307],{"class":242},">\n",[228,309,311,314,317,319,321],{"class":230,"line":310},4,[228,312,313],{"class":242},"):",[228,315,316],{"class":246}," ModalHandle",[228,318,243],{"class":242},[228,320,247],{"class":246},[228,322,307],{"class":242},[228,324,326],{"class":230,"line":325},5,[228,327,329],{"emptyLinePlaceholder":328},true,"\n",[228,331,333,336,338,340,342,344,346,349],{"class":230,"line":332},6,[228,334,335],{"class":234},"interface",[228,337,299],{"class":246},[228,339,243],{"class":242},[228,341,304],{"class":246},[228,343,262],{"class":234},[228,345,265],{"class":246},[228,347,348],{"class":242},">",[228,350,351],{"class":242}," {\n",[228,353,355,359,361,364,366,368,370],{"class":230,"line":354},7,[228,356,358],{"class":357},"swJcz","  props",[228,360,296],{"class":242},[228,362,363],{"class":246}," ExtractComponentProps",[228,365,243],{"class":242},[228,367,304],{"class":246},[228,369,348],{"class":242},[228,371,373],{"class":372},"sHwdD","     \u002F\u002F typed props forwarded to the component\n",[228,375,377,380,382,385,387,390,392,395,398,400,403,407,410,413,416,418],{"class":230,"line":376},8,[228,378,379],{"class":357},"  on",[228,381,296],{"class":242},[228,383,384],{"class":246}," Record",[228,386,243],{"class":242},[228,388,389],{"class":246},"string",[228,391,256],{"class":242},[228,393,394],{"class":242}," (...",[228,396,397],{"class":278},"args",[228,399,282],{"class":242},[228,401,402],{"class":246}," any",[228,404,406],{"class":405},"sTEyZ","[]",[228,408,409],{"class":242},")",[228,411,412],{"class":234}," =>",[228,414,415],{"class":246}," void",[228,417,348],{"class":242},[228,419,420],{"class":372}," \u002F\u002F event listeners\n",[228,422,424,427,429,432],{"class":230,"line":423},9,[228,425,426],{"class":357},"  group",[228,428,296],{"class":242},[228,430,431],{"class":246}," ModalGroup",[228,433,434],{"class":372},"                   \u002F\u002F target ModalTarget; falls back to component's defineOptions({ modalGroup })\n",[228,436,438,441,443,446],{"class":230,"line":437},10,[228,439,440],{"class":357},"  instantEnter",[228,442,296],{"class":242},[228,444,445],{"class":246}," boolean",[228,447,448],{"class":372},"               \u002F\u002F skip enter animation (default false)\n",[228,450,452],{"class":230,"line":451},11,[228,453,454],{"class":242},"}\n",[198,456,457,458,461,462,465,466,469,470,469,473,469,476,469,479,482,483,486,487,490],{},"Mounts ",[202,459,460],{},"component"," and returns a ",[202,463,464],{},"ModalHandle\u003CT>"," — a promise enriched with ",[202,467,468],{},"id",", ",[202,471,472],{},"group",[202,474,475],{},"close",[202,477,478],{},"on",[202,480,481],{},"off",". The promise resolves when the modal calls ",[202,484,485],{},"confirm(data)"," and rejects with ",[202,488,489],{},"ModalClosedError"," on dismiss.",[219,492,494],{"className":221,"code":493,"language":223,"meta":224,"style":224},"import { openModal } from '@kolirt\u002Fvue-modal'\nimport EditDialog from '.\u002FEditDialog.vue'\n\nconst result = await openModal\u003C{ name: string }>(EditDialog, {\n  props: { userId: 42 }\n}).catch(() => null)\n\nif (result) console.log('saved', result.name)\n",[202,495,496,522,539,543,580,600,627,631],{"__ignoreMap":224},[228,497,498,502,505,507,510,513,516,519],{"class":230,"line":231},[228,499,501],{"class":500},"s7zQu","import",[228,503,504],{"class":242}," {",[228,506,239],{"class":405},[228,508,509],{"class":242}," }",[228,511,512],{"class":500}," from",[228,514,515],{"class":242}," '",[228,517,204],{"class":518},"sfazB",[228,520,521],{"class":242},"'\n",[228,523,524,526,529,532,534,537],{"class":230,"line":275},[228,525,501],{"class":500},[228,527,528],{"class":405}," EditDialog ",[228,530,531],{"class":500},"from",[228,533,515],{"class":242},[228,535,536],{"class":518},".\u002FEditDialog.vue",[228,538,521],{"class":242},[228,540,541],{"class":230,"line":290},[228,542,329],{"emptyLinePlaceholder":328},[228,544,545,548,551,554,557,559,562,565,567,570,573,576,578],{"class":230,"line":310},[228,546,547],{"class":234},"const",[228,549,550],{"class":405}," result ",[228,552,553],{"class":242},"=",[228,555,556],{"class":500}," await",[228,558,239],{"class":238},[228,560,561],{"class":242},"\u003C{",[228,563,564],{"class":357}," name",[228,566,282],{"class":242},[228,568,569],{"class":246}," string",[228,571,572],{"class":242}," }>",[228,574,575],{"class":405},"(EditDialog",[228,577,256],{"class":242},[228,579,351],{"class":242},[228,581,582,584,586,588,591,593,597],{"class":230,"line":325},[228,583,358],{"class":357},[228,585,282],{"class":242},[228,587,504],{"class":242},[228,589,590],{"class":357}," userId",[228,592,282],{"class":242},[228,594,596],{"class":595},"sbssI"," 42",[228,598,599],{"class":242}," }\n",[228,601,602,605,607,610,613,616,619,621,624],{"class":230,"line":332},[228,603,604],{"class":242},"}",[228,606,409],{"class":405},[228,608,609],{"class":242},".",[228,611,612],{"class":238},"catch",[228,614,615],{"class":405},"(",[228,617,618],{"class":242},"()",[228,620,412],{"class":234},[228,622,623],{"class":242}," null",[228,625,626],{"class":405},")\n",[228,628,629],{"class":230,"line":354},[228,630,329],{"emptyLinePlaceholder":328},[228,632,633,636,639,641,644,646,649,652,654,656,659,661],{"class":230,"line":376},[228,634,635],{"class":500},"if",[228,637,638],{"class":405}," (result) console",[228,640,609],{"class":242},[228,642,643],{"class":238},"log",[228,645,615],{"class":405},[228,647,648],{"class":242},"'",[228,650,651],{"class":518},"saved",[228,653,648],{"class":242},[228,655,256],{"class":242},[228,657,658],{"class":405}," result",[228,660,609],{"class":242},[228,662,663],{"class":405},"name)\n",[198,665,666,667,669,670,673,674,677],{},"A ",[202,668,472],{}," is required — either via ",[202,671,672],{},"options.group"," or ",[202,675,676],{},"defineOptions({ modalGroup: '...' })"," on the component.",[207,679,681],{"id":680},"closemodal",[202,682,683],{},"closeModal",[214,685,217],{"id":686},"signature-1",[219,688,690],{"className":221,"code":689,"language":223,"meta":224,"style":224},"function closeModal\u003CT = unknown>(\n  opts?: CloseModalOptions\u003CT> & { group?: ModalGroup }\n): Promise\u003Cvoid>\n\ninterface CloseModalOptions\u003CT = unknown> {\n  success?: boolean    \u002F\u002F false → reject (default), true → resolve with `data`\n  data?: T             \u002F\u002F value passed to resolve when success: true\n  ignoreGuard?: boolean \u002F\u002F skip every onBeforeClose guard\n  instantExit?: boolean \u002F\u002F skip exit animation, finalize synchronously\n}\n\u002F\u002F + optional `group` here narrows the target to one stack\n",[202,691,692,709,739,753,757,775,787,800,812,824,828],{"__ignoreMap":224},[228,693,694,696,699,701,703,705,707],{"class":230,"line":231},[228,695,235],{"class":234},[228,697,698],{"class":238}," closeModal",[228,700,243],{"class":242},[228,702,247],{"class":246},[228,704,250],{"class":242},[228,706,253],{"class":246},[228,708,272],{"class":242},[228,710,711,714,716,719,721,723,725,728,730,733,735,737],{"class":230,"line":275},[228,712,713],{"class":278},"  opts",[228,715,296],{"class":242},[228,717,718],{"class":246}," CloseModalOptions",[228,720,243],{"class":242},[228,722,247],{"class":246},[228,724,348],{"class":242},[228,726,727],{"class":242}," &",[228,729,504],{"class":242},[228,731,732],{"class":357}," group",[228,734,296],{"class":242},[228,736,431],{"class":246},[228,738,599],{"class":242},[228,740,741,743,746,748,751],{"class":230,"line":290},[228,742,313],{"class":242},[228,744,745],{"class":246}," Promise",[228,747,243],{"class":242},[228,749,750],{"class":246},"void",[228,752,307],{"class":242},[228,754,755],{"class":230,"line":310},[228,756,329],{"emptyLinePlaceholder":328},[228,758,759,761,763,765,767,769,771,773],{"class":230,"line":325},[228,760,335],{"class":234},[228,762,718],{"class":246},[228,764,243],{"class":242},[228,766,247],{"class":246},[228,768,250],{"class":242},[228,770,253],{"class":246},[228,772,348],{"class":242},[228,774,351],{"class":242},[228,776,777,780,782,784],{"class":230,"line":332},[228,778,779],{"class":357},"  success",[228,781,296],{"class":242},[228,783,445],{"class":246},[228,785,786],{"class":372},"    \u002F\u002F false → reject (default), true → resolve with `data`\n",[228,788,789,792,794,797],{"class":230,"line":354},[228,790,791],{"class":357},"  data",[228,793,296],{"class":242},[228,795,796],{"class":246}," T",[228,798,799],{"class":372},"             \u002F\u002F value passed to resolve when success: true\n",[228,801,802,805,807,809],{"class":230,"line":376},[228,803,804],{"class":357},"  ignoreGuard",[228,806,296],{"class":242},[228,808,445],{"class":246},[228,810,811],{"class":372}," \u002F\u002F skip every onBeforeClose guard\n",[228,813,814,817,819,821],{"class":230,"line":423},[228,815,816],{"class":357},"  instantExit",[228,818,296],{"class":242},[228,820,445],{"class":246},[228,822,823],{"class":372}," \u002F\u002F skip exit animation, finalize synchronously\n",[228,825,826],{"class":230,"line":437},[228,827,454],{"class":242},[228,829,830],{"class":230,"line":451},[228,831,832],{"class":372},"\u002F\u002F + optional `group` here narrows the target to one stack\n",[198,834,835,836,838],{},"Closes the topmost modal globally, or the topmost in a specific group when ",[202,837,472],{}," is supplied. Returns a promise that resolves once the close intent has been processed (guards awaited, animation pending or skipped).",[219,840,842],{"className":221,"code":841,"language":223,"meta":224,"style":224},"await closeModal()                              \u002F\u002F topmost across all groups\nawait closeModal({ group: 'confirm' })          \u002F\u002F topmost in 'confirm'\nawait closeModal({ success: true, data: 42 })   \u002F\u002F resolve instead of reject\n",[202,843,844,857,887],{"__ignoreMap":224},[228,845,846,849,851,854],{"class":230,"line":231},[228,847,848],{"class":500},"await",[228,850,698],{"class":238},[228,852,853],{"class":405},"()                              ",[228,855,856],{"class":372},"\u002F\u002F topmost across all groups\n",[228,858,859,861,863,865,868,870,872,874,877,879,881,884],{"class":230,"line":275},[228,860,848],{"class":500},[228,862,698],{"class":238},[228,864,615],{"class":405},[228,866,867],{"class":242},"{",[228,869,732],{"class":357},[228,871,282],{"class":242},[228,873,515],{"class":242},[228,875,876],{"class":518},"confirm",[228,878,648],{"class":242},[228,880,509],{"class":242},[228,882,883],{"class":405},")          ",[228,885,886],{"class":372},"\u002F\u002F topmost in 'confirm'\n",[228,888,889,891,893,895,897,900,902,906,908,911,913,915,917,920],{"class":230,"line":290},[228,890,848],{"class":500},[228,892,698],{"class":238},[228,894,615],{"class":405},[228,896,867],{"class":242},[228,898,899],{"class":357}," success",[228,901,282],{"class":242},[228,903,905],{"class":904},"sfNiH"," true",[228,907,256],{"class":242},[228,909,910],{"class":357}," data",[228,912,282],{"class":242},[228,914,596],{"class":595},[228,916,509],{"class":242},[228,918,919],{"class":405},")   ",[228,921,922],{"class":372},"\u002F\u002F resolve instead of reject\n",[207,924,926],{"id":925},"closemodalbyid",[202,927,928],{},"closeModalById",[214,930,217],{"id":931},"signature-2",[219,933,935],{"className":221,"code":934,"language":223,"meta":224,"style":224},"function closeModalById\u003CT = unknown>(\n  id: number,        \u002F\u002F modal instance id (handle.id, controller.instanceId)\n  opts?: CloseModalOptions\u003CT>\n): Promise\u003Cvoid>\n\n\u002F\u002F CloseModalOptions\u003CT> shape — see closeModal above.\n",[202,936,937,954,969,983,995,999],{"__ignoreMap":224},[228,938,939,941,944,946,948,950,952],{"class":230,"line":231},[228,940,235],{"class":234},[228,942,943],{"class":238}," closeModalById",[228,945,243],{"class":242},[228,947,247],{"class":246},[228,949,250],{"class":242},[228,951,253],{"class":246},[228,953,272],{"class":242},[228,955,956,959,961,964,966],{"class":230,"line":275},[228,957,958],{"class":278},"  id",[228,960,282],{"class":242},[228,962,963],{"class":246}," number",[228,965,256],{"class":242},[228,967,968],{"class":372},"        \u002F\u002F modal instance id (handle.id, controller.instanceId)\n",[228,970,971,973,975,977,979,981],{"class":230,"line":290},[228,972,713],{"class":278},[228,974,296],{"class":242},[228,976,718],{"class":246},[228,978,243],{"class":242},[228,980,247],{"class":246},[228,982,307],{"class":242},[228,984,985,987,989,991,993],{"class":230,"line":310},[228,986,313],{"class":242},[228,988,745],{"class":246},[228,990,243],{"class":242},[228,992,750],{"class":246},[228,994,307],{"class":242},[228,996,997],{"class":230,"line":325},[228,998,329],{"emptyLinePlaceholder":328},[228,1000,1001],{"class":230,"line":332},[228,1002,1003],{"class":372},"\u002F\u002F CloseModalOptions\u003CT> shape — see closeModal above.\n",[198,1005,1006],{},"Close a specific modal by id — useful when the modal is not the topmost. No-op if no such modal exists.",[219,1008,1010],{"className":221,"code":1009,"language":223,"meta":224,"style":224},"const handle = openModal(MyDialog)\n\u002F\u002F later …\nawait closeModalById(handle.id, { success: true, data: 'ok' })\n",[202,1011,1012,1026,1031],{"__ignoreMap":224},[228,1013,1014,1016,1019,1021,1023],{"class":230,"line":231},[228,1015,547],{"class":234},[228,1017,1018],{"class":405}," handle ",[228,1020,553],{"class":242},[228,1022,239],{"class":238},[228,1024,1025],{"class":405},"(MyDialog)\n",[228,1027,1028],{"class":230,"line":275},[228,1029,1030],{"class":372},"\u002F\u002F later …\n",[228,1032,1033,1035,1037,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1065,1067,1069],{"class":230,"line":290},[228,1034,848],{"class":500},[228,1036,943],{"class":238},[228,1038,1039],{"class":405},"(handle",[228,1041,609],{"class":242},[228,1043,468],{"class":405},[228,1045,256],{"class":242},[228,1047,504],{"class":242},[228,1049,899],{"class":357},[228,1051,282],{"class":242},[228,1053,905],{"class":904},[228,1055,256],{"class":242},[228,1057,910],{"class":357},[228,1059,282],{"class":242},[228,1061,515],{"class":242},[228,1063,1064],{"class":518},"ok",[228,1066,648],{"class":242},[228,1068,509],{"class":242},[228,1070,626],{"class":405},[207,1072,1074,1077,1078],{"id":1073},"closemodalsbygroup-closeallmodals",[202,1075,1076],{},"closeModalsByGroup"," \u002F ",[202,1079,1080],{},"closeAllModals",[214,1082,217],{"id":1083},"signature-3",[219,1085,1087],{"className":221,"code":1086,"language":223,"meta":224,"style":224},"function closeModalsByGroup(\n  group: ModalGroup,                   \u002F\u002F restrict close to this stack\n  opts?: CloseFlags\n): Promise\u003C{ closed: number; vetoed: number }>\n\nfunction closeAllModals(\n  opts?: CloseFlags\n): Promise\u003C{ closed: number; vetoed: number }>\n\ninterface CloseFlags {\n  ignoreGuard?: boolean \u002F\u002F skip every onBeforeClose guard\n  instantExit?: boolean \u002F\u002F skip exit animations\n}\n",[202,1088,1089,1099,1112,1121,1149,1153,1162,1170,1194,1198,1207,1217,1229],{"__ignoreMap":224},[228,1090,1091,1093,1096],{"class":230,"line":231},[228,1092,235],{"class":234},[228,1094,1095],{"class":238}," closeModalsByGroup",[228,1097,1098],{"class":242},"(\n",[228,1100,1101,1103,1105,1107,1109],{"class":230,"line":275},[228,1102,426],{"class":278},[228,1104,282],{"class":242},[228,1106,431],{"class":246},[228,1108,256],{"class":242},[228,1110,1111],{"class":372},"                   \u002F\u002F restrict close to this stack\n",[228,1113,1114,1116,1118],{"class":230,"line":290},[228,1115,713],{"class":278},[228,1117,296],{"class":242},[228,1119,1120],{"class":246}," CloseFlags\n",[228,1122,1123,1125,1127,1129,1132,1134,1136,1139,1142,1144,1146],{"class":230,"line":310},[228,1124,313],{"class":242},[228,1126,745],{"class":246},[228,1128,561],{"class":242},[228,1130,1131],{"class":357}," closed",[228,1133,282],{"class":242},[228,1135,963],{"class":246},[228,1137,1138],{"class":242},";",[228,1140,1141],{"class":357}," vetoed",[228,1143,282],{"class":242},[228,1145,963],{"class":246},[228,1147,1148],{"class":242}," }>\n",[228,1150,1151],{"class":230,"line":325},[228,1152,329],{"emptyLinePlaceholder":328},[228,1154,1155,1157,1160],{"class":230,"line":332},[228,1156,235],{"class":234},[228,1158,1159],{"class":238}," closeAllModals",[228,1161,1098],{"class":242},[228,1163,1164,1166,1168],{"class":230,"line":354},[228,1165,713],{"class":278},[228,1167,296],{"class":242},[228,1169,1120],{"class":246},[228,1171,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192],{"class":230,"line":376},[228,1173,313],{"class":242},[228,1175,745],{"class":246},[228,1177,561],{"class":242},[228,1179,1131],{"class":357},[228,1181,282],{"class":242},[228,1183,963],{"class":246},[228,1185,1138],{"class":242},[228,1187,1141],{"class":357},[228,1189,282],{"class":242},[228,1191,963],{"class":246},[228,1193,1148],{"class":242},[228,1195,1196],{"class":230,"line":423},[228,1197,329],{"emptyLinePlaceholder":328},[228,1199,1200,1202,1205],{"class":230,"line":437},[228,1201,335],{"class":234},[228,1203,1204],{"class":246}," CloseFlags",[228,1206,351],{"class":242},[228,1208,1209,1211,1213,1215],{"class":230,"line":451},[228,1210,804],{"class":357},[228,1212,296],{"class":242},[228,1214,445],{"class":246},[228,1216,811],{"class":372},[228,1218,1220,1222,1224,1226],{"class":230,"line":1219},12,[228,1221,816],{"class":357},[228,1223,296],{"class":242},[228,1225,445],{"class":246},[228,1227,1228],{"class":372}," \u002F\u002F skip exit animations\n",[228,1230,1232],{"class":230,"line":1231},13,[228,1233,454],{"class":242},[198,1235,1236,1237,1244,1245,1248,1249,1252,1253,1256],{},"Close every modal in a group (top-down) or across the entire app. Both accept ",[1238,1239,1241],"a",{"href":1240},"#closeflags",[202,1242,1243],{},"CloseFlags"," — bulk-close functions never resolve, only reject, so ",[202,1246,1247],{},"success","\u002F",[202,1250,1251],{},"data"," aren't part of the shape. The result reports how many were closed vs. blocked by ",[202,1254,1255],{},"onBeforeClose"," guards. Useful in route guards:",[219,1258,1260],{"className":221,"code":1259,"language":223,"meta":224,"style":224},"router.beforeEach(async () => {\n  await closeAllModals({ ignoreGuard: true, instantExit: true })\n})\n",[202,1261,1262,1284,1315],{"__ignoreMap":224},[228,1263,1264,1267,1269,1272,1274,1277,1280,1282],{"class":230,"line":231},[228,1265,1266],{"class":405},"router",[228,1268,609],{"class":242},[228,1270,1271],{"class":238},"beforeEach",[228,1273,615],{"class":405},[228,1275,1276],{"class":234},"async",[228,1278,1279],{"class":242}," ()",[228,1281,412],{"class":234},[228,1283,351],{"class":242},[228,1285,1286,1289,1291,1293,1295,1298,1300,1302,1304,1307,1309,1311,1313],{"class":230,"line":275},[228,1287,1288],{"class":500},"  await",[228,1290,1159],{"class":238},[228,1292,615],{"class":357},[228,1294,867],{"class":242},[228,1296,1297],{"class":357}," ignoreGuard",[228,1299,282],{"class":242},[228,1301,905],{"class":904},[228,1303,256],{"class":242},[228,1305,1306],{"class":357}," instantExit",[228,1308,282],{"class":242},[228,1310,905],{"class":904},[228,1312,509],{"class":242},[228,1314,626],{"class":357},[228,1316,1317,1319],{"class":230,"line":290},[228,1318,604],{"class":242},[228,1320,626],{"class":405},[207,1322,1324],{"id":1323},"replacemodal",[202,1325,1326],{},"replaceModal",[214,1328,217],{"id":1329},"signature-4",[219,1331,1333],{"className":221,"code":1332,"language":223,"meta":224,"style":224},"function replaceModal\u003CT = unknown, C extends Component = Component>(\n  component: C,\n  options?: OpenModalOptions\u003CC>\n): ModalHandle\u003CT>\n\n\u002F\u002F OpenModalOptions\u003CC> shape — see openModal above.\n",[202,1334,1335,1364,1374,1388,1400,1404],{"__ignoreMap":224},[228,1336,1337,1339,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362],{"class":230,"line":231},[228,1338,235],{"class":234},[228,1340,1341],{"class":238}," replaceModal",[228,1343,243],{"class":242},[228,1345,247],{"class":246},[228,1347,250],{"class":242},[228,1349,253],{"class":246},[228,1351,256],{"class":242},[228,1353,259],{"class":246},[228,1355,262],{"class":234},[228,1357,265],{"class":246},[228,1359,250],{"class":242},[228,1361,265],{"class":246},[228,1363,272],{"class":242},[228,1365,1366,1368,1370,1372],{"class":230,"line":275},[228,1367,279],{"class":278},[228,1369,282],{"class":242},[228,1371,259],{"class":246},[228,1373,287],{"class":242},[228,1375,1376,1378,1380,1382,1384,1386],{"class":230,"line":290},[228,1377,293],{"class":278},[228,1379,296],{"class":242},[228,1381,299],{"class":246},[228,1383,243],{"class":242},[228,1385,304],{"class":246},[228,1387,307],{"class":242},[228,1389,1390,1392,1394,1396,1398],{"class":230,"line":310},[228,1391,313],{"class":242},[228,1393,316],{"class":246},[228,1395,243],{"class":242},[228,1397,247],{"class":246},[228,1399,307],{"class":242},[228,1401,1402],{"class":230,"line":325},[228,1403,329],{"emptyLinePlaceholder":328},[228,1405,1406],{"class":230,"line":332},[228,1407,1408],{"class":372},"\u002F\u002F OpenModalOptions\u003CC> shape — see openModal above.\n",[198,1410,1411,1412,1414],{},"Closes the topmost modal of the target group instantly (skipping its exit animation, ignoring guards) and opens ",[202,1413,460],{},". Modals in other groups are left untouched. Use it for wizard step swaps:",[219,1416,1418],{"className":221,"code":1417,"language":223,"meta":224,"style":224},"replaceModal(StepTwo, {\n  props: { step: 2 },\n  instantEnter: true\n})\n",[202,1419,1420,1431,1450,1459],{"__ignoreMap":224},[228,1421,1422,1424,1427,1429],{"class":230,"line":231},[228,1423,1326],{"class":238},[228,1425,1426],{"class":405},"(StepTwo",[228,1428,256],{"class":242},[228,1430,351],{"class":242},[228,1432,1433,1435,1437,1439,1442,1444,1447],{"class":230,"line":275},[228,1434,358],{"class":357},[228,1436,282],{"class":242},[228,1438,504],{"class":242},[228,1440,1441],{"class":357}," step",[228,1443,282],{"class":242},[228,1445,1446],{"class":595}," 2",[228,1448,1449],{"class":242}," },\n",[228,1451,1452,1454,1456],{"class":230,"line":290},[228,1453,440],{"class":357},[228,1455,282],{"class":242},[228,1457,1458],{"class":904}," true\n",[228,1460,1461,1463],{"class":230,"line":310},[228,1462,604],{"class":242},[228,1464,626],{"class":405},[207,1466,1468],{"id":1467},"options","Options",[214,1470,1472],{"id":1471},"openmodaloptionsc",[202,1473,1474],{},"OpenModalOptions\u003CC>",[198,1476,1477,1478,469,1480,1482,1483,609],{},"Accepted by ",[202,1479,212],{},[202,1481,1326],{},", and ",[202,1484,1485],{},"useModal(...).open()",[1487,1488,1489,1508],"table",{},[1490,1491,1492],"thead",{},[1493,1494,1495,1499,1502,1505],"tr",{},[1496,1497,1498],"th",{},"Property",[1496,1500,1501],{},"Type",[1496,1503,1504],{},"Default",[1496,1506,1507],{},"Description",[1509,1510,1511,1540,1570,1598],"tbody",{},[1493,1512,1513,1519,1524,1529],{},[1514,1515,1516],"td",{},[202,1517,1518],{},"props",[1514,1520,1521],{},[202,1522,1523],{},"ExtractComponentProps\u003CC>",[1514,1525,1526],{},[202,1527,1528],{},"{}",[1514,1530,1531,1532,1535,1536,1539],{},"Forwarded to the component as ",[202,1533,1534],{},"v-bind",". Type-checked against the component's ",[202,1537,1538],{},"defineProps"," — required props become required keys.",[1493,1541,1542,1546,1551,1555],{},[1514,1543,1544],{},[202,1545,478],{},[1514,1547,1548],{},[202,1549,1550],{},"Record\u003Cstring, (...args) => void>",[1514,1552,1553],{},[202,1554,1528],{},[1514,1556,1557,1558,469,1561,1564,1565,1569],{},"Listeners forwarded to the component. Each key is an emit name (e.g. ",[202,1559,1560],{},"progress",[202,1562,1563],{},"update:value","). Listeners run on ",[1566,1567,1568],"strong",{},"every"," emit until the modal closes.",[1493,1571,1572,1576,1581,1587],{},[1514,1573,1574],{},[202,1575,472],{},[1514,1577,1578],{},[202,1579,1580],{},"ModalGroup",[1514,1582,1583,1586],{},[202,1584,1585],{},"component.modalGroup"," if set",[1514,1588,1589,1590,1593,1594,1597],{},"Which ",[202,1591,1592],{},"\u003CModalTarget>"," mounts the modal. Resolved as ",[202,1595,1596],{},"options.group ?? defineOptions({ modalGroup }).modalGroup",". Throws if neither is provided — there is no fallback.",[1493,1599,1600,1605,1610,1615],{},[1514,1601,1602],{},[202,1603,1604],{},"instantEnter",[1514,1606,1607],{},[202,1608,1609],{},"boolean",[1514,1611,1612],{},[202,1613,1614],{},"false",[1514,1616,1617,1618,1621,1622,1625,1626,1629,1630,1633],{},"Skip the enter animation. Adds ",[202,1619,1620],{},"data-instant=\"\""," to ",[202,1623,1624],{},"\u003CModalContent>"," and the topmost ",[202,1627,1628],{},"\u003CModalOverlay>","; bundled CSS scoped to ",[202,1631,1632],{},"[data-state=\"open\"]"," suppresses the animation. Exit animations still run.",[198,1635,1636,1638,1639,469,1642,1645,1646,1648,1649,1652,1653,1656,1657,1660,1661,609],{},[202,1637,1523],{}," is the package's helper that strips Vue's internal props (",[202,1640,1641],{},"key",[202,1643,1644],{},"ref",", etc.) so only your component's own ",[202,1647,1538],{}," shape remains. With ",[202,1650,1651],{},"\u003Cscript setup lang=\"ts\">"," it's fully inferred — TypeScript will refuse ",[202,1654,1655],{},"openModal(EditDialog, { props: { wrong: 1 } })"," if ",[202,1658,1659],{},"EditDialog"," doesn't expose ",[202,1662,1663],{},"wrong",[214,1665,1667],{"id":1666},"closemodaloptionst",[202,1668,1669],{},"CloseModalOptions\u003CT>",[198,1671,1477,1672,469,1674,469,1676,1679,1680,609],{},[202,1673,683],{},[202,1675,928],{},[202,1677,1678],{},"handle.close()",", and the modal-side ",[202,1681,1682],{},"useModalContext().close(opts)",[1487,1684,1685,1697],{},[1490,1686,1687],{},[1493,1688,1689,1691,1693,1695],{},[1496,1690,1498],{},[1496,1692,1501],{},[1496,1694,1504],{},[1496,1696,1507],{},[1509,1698,1699,1729,1759,1783],{},[1493,1700,1701,1705,1709,1713],{},[1514,1702,1703],{},[202,1704,1247],{},[1514,1706,1707],{},[202,1708,1609],{},[1514,1710,1711],{},[202,1712,1614],{},[1514,1714,1715,1716,1719,1720,1722,1723,1725,1726,1728],{},"Determines how the modal's promise settles. ",[202,1717,1718],{},"true"," → resolves with ",[202,1721,1251],{},". ",[202,1724,1614],{}," → rejects with a ",[202,1727,489],{}," (this is what users get when they dismiss the modal — Esc, overlay click, close button).",[1493,1730,1731,1735,1739,1742],{},[1514,1732,1733],{},[202,1734,1251],{},[1514,1736,1737],{},[202,1738,247],{},[1514,1740,1741],{},"—",[1514,1743,1744,1745,1748,1749,1752,1753,1755,1756,609],{},"Value passed to ",[202,1746,1747],{},"resolve"," when ",[202,1750,1751],{},"success: true",". Ignored otherwise. Typed by the ",[202,1754,247],{}," you pass to ",[202,1757,1758],{},"openModal\u003CT>(...)",[1493,1760,1761,1766,1770,1774],{},[1514,1762,1763],{},[202,1764,1765],{},"ignoreGuard",[1514,1767,1768],{},[202,1769,1609],{},[1514,1771,1772],{},[202,1773,1614],{},[1514,1775,1776,1777,1779,1780,1782],{},"Skip every registered ",[202,1778,1255],{}," async guard. Use for hard close (route guard, app teardown). Without it, any guard returning ",[202,1781,1614],{}," cancels the close.",[1493,1784,1785,1790,1794,1798],{},[1514,1786,1787],{},[202,1788,1789],{},"instantExit",[1514,1791,1792],{},[202,1793,1609],{},[1514,1795,1796],{},[202,1797,1614],{},[1514,1799,1800],{},"Finalize synchronously without waiting for the exit animation. The DOM node unmounts immediately. Useful for tests and programmatic flows where the user shouldn't see the modal flicker out.",[198,1802,1803,1805,1806,282],{},[202,1804,683],{}," adds one extra property on top of ",[202,1807,1808],{},"CloseModalOptions",[1487,1810,1811,1823],{},[1490,1812,1813],{},[1493,1814,1815,1817,1819,1821],{},[1496,1816,1498],{},[1496,1818,1501],{},[1496,1820,1504],{},[1496,1822,1507],{},[1509,1824,1825],{},[1493,1826,1827,1831,1835,1837],{},[1514,1828,1829],{},[202,1830,472],{},[1514,1832,1833],{},[202,1834,1580],{},[1514,1836,1741],{},[1514,1838,1839,1840,1843],{},"When set, only the topmost modal of that group is closed. When omitted, the topmost modal across ",[1566,1841,1842],{},"all"," groups is closed.",[214,1845,1847],{"id":1846},"closeflags",[202,1848,1243],{},[198,1850,1851,1852,1854,1855,1858,1859,1862,1863,1077,1865,1867],{},"A subset of ",[202,1853,1808],{}," accepted by bulk-close functions: ",[202,1856,1857],{},"closeAllModals(opts?)"," and ",[202,1860,1861],{},"closeModalsByGroup(group, opts?)",". These functions never resolve a modal — they always reject the affected promises — so ",[202,1864,1247],{},[202,1866,1251],{}," are not part of the shape.",[1487,1869,1870,1882],{},[1490,1871,1872],{},[1493,1873,1874,1876,1878,1880],{},[1496,1875,1498],{},[1496,1877,1501],{},[1496,1879,1504],{},[1496,1881,1507],{},[1509,1883,1884,1907],{},[1493,1885,1886,1890,1894,1898],{},[1514,1887,1888],{},[202,1889,1765],{},[1514,1891,1892],{},[202,1893,1609],{},[1514,1895,1896],{},[202,1897,1614],{},[1514,1899,1900,1901,1903,1904,1906],{},"Same as on ",[202,1902,1808],{},". Pass ",[202,1905,1718],{}," to bypass every guard.",[1493,1908,1909,1913,1917,1921],{},[1514,1910,1911],{},[202,1912,1789],{},[1514,1914,1915],{},[202,1916,1609],{},[1514,1918,1919],{},[202,1920,1614],{},[1514,1922,1900,1923,1925],{},[202,1924,1808],{},". Skip exit animations on every closure.",[198,1927,1928,1929,1932,1933,1936,1937,1748,1939,1941],{},"Both bulk functions resolve with ",[202,1930,1931],{},"{ closed: number, vetoed: number }"," — ",[202,1934,1935],{},"vetoed"," counts modals whose guards returned ",[202,1938,1614],{},[202,1940,1765],{}," was not set.",[207,1943,1945,1946,1949],{"id":1944},"the-modalhandle-api","The ",[202,1947,1948],{},"ModalHandle"," API",[219,1951,1953],{"className":221,"code":1952,"language":223,"meta":224,"style":224},"interface ModalHandle\u003CT> extends Promise\u003CT> {\n  id: number\n  group: ModalGroup\n  close(opts?: CloseModalOptions\u003CT>): void\n  on(event: string, handler: (...args: any[]) => void): void\n  off(event: string, handler: (...args: any[]) => void): void\n}\n",[202,1954,1955,1979,1988,1997,2021,2061,2100],{"__ignoreMap":224},[228,1956,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977],{"class":230,"line":231},[228,1958,335],{"class":234},[228,1960,316],{"class":246},[228,1962,243],{"class":242},[228,1964,247],{"class":246},[228,1966,348],{"class":242},[228,1968,262],{"class":234},[228,1970,745],{"class":246},[228,1972,243],{"class":242},[228,1974,247],{"class":246},[228,1976,348],{"class":242},[228,1978,351],{"class":242},[228,1980,1981,1983,1985],{"class":230,"line":275},[228,1982,958],{"class":357},[228,1984,282],{"class":242},[228,1986,1987],{"class":246}," number\n",[228,1989,1990,1992,1994],{"class":230,"line":290},[228,1991,426],{"class":357},[228,1993,282],{"class":242},[228,1995,1996],{"class":246}," ModalGroup\n",[228,1998,1999,2002,2004,2007,2009,2011,2013,2015,2018],{"class":230,"line":310},[228,2000,2001],{"class":357},"  close",[228,2003,615],{"class":242},[228,2005,2006],{"class":278},"opts",[228,2008,296],{"class":242},[228,2010,718],{"class":246},[228,2012,243],{"class":242},[228,2014,247],{"class":246},[228,2016,2017],{"class":242},">):",[228,2019,2020],{"class":246}," void\n",[228,2022,2023,2025,2027,2030,2032,2034,2036,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059],{"class":230,"line":325},[228,2024,379],{"class":357},[228,2026,615],{"class":242},[228,2028,2029],{"class":278},"event",[228,2031,282],{"class":242},[228,2033,569],{"class":246},[228,2035,256],{"class":242},[228,2037,2038],{"class":238}," handler",[228,2040,282],{"class":242},[228,2042,394],{"class":242},[228,2044,397],{"class":278},[228,2046,282],{"class":242},[228,2048,402],{"class":246},[228,2050,406],{"class":405},[228,2052,409],{"class":242},[228,2054,412],{"class":234},[228,2056,415],{"class":246},[228,2058,313],{"class":242},[228,2060,2020],{"class":246},[228,2062,2063,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098],{"class":230,"line":332},[228,2064,2065],{"class":357},"  off",[228,2067,615],{"class":242},[228,2069,2029],{"class":278},[228,2071,282],{"class":242},[228,2073,569],{"class":246},[228,2075,256],{"class":242},[228,2077,2038],{"class":238},[228,2079,282],{"class":242},[228,2081,394],{"class":242},[228,2083,397],{"class":278},[228,2085,282],{"class":242},[228,2087,402],{"class":246},[228,2089,406],{"class":405},[228,2091,409],{"class":242},[228,2093,412],{"class":234},[228,2095,415],{"class":246},[228,2097,313],{"class":242},[228,2099,2020],{"class":246},[228,2101,2102],{"class":230,"line":354},[228,2103,454],{"class":242},[198,2105,2106,2107,469,2109,469,2112,2115],{},"Use ",[202,2108,848],{},[202,2110,2111],{},".then",[202,2113,2114],{},".catch"," like any promise. Attach extra listeners after opening:",[219,2117,2119],{"className":221,"code":2118,"language":223,"meta":224,"style":224},"const handle = openModal(EditDialog)\n\nhandle.on('progress', (pct: number) => updateProgressBar(pct))\nhandle.catch(() => null)\n\nconst result = await handle\n",[202,2120,2121,2134,2138,2177,2195,2199],{"__ignoreMap":224},[228,2122,2123,2125,2127,2129,2131],{"class":230,"line":231},[228,2124,547],{"class":234},[228,2126,1018],{"class":405},[228,2128,553],{"class":242},[228,2130,239],{"class":238},[228,2132,2133],{"class":405},"(EditDialog)\n",[228,2135,2136],{"class":230,"line":275},[228,2137,329],{"emptyLinePlaceholder":328},[228,2139,2140,2143,2145,2147,2149,2151,2153,2155,2157,2160,2163,2165,2167,2169,2171,2174],{"class":230,"line":290},[228,2141,2142],{"class":405},"handle",[228,2144,609],{"class":242},[228,2146,478],{"class":238},[228,2148,615],{"class":405},[228,2150,648],{"class":242},[228,2152,1560],{"class":518},[228,2154,648],{"class":242},[228,2156,256],{"class":242},[228,2158,2159],{"class":242}," (",[228,2161,2162],{"class":278},"pct",[228,2164,282],{"class":242},[228,2166,963],{"class":246},[228,2168,409],{"class":242},[228,2170,412],{"class":234},[228,2172,2173],{"class":238}," updateProgressBar",[228,2175,2176],{"class":405},"(pct))\n",[228,2178,2179,2181,2183,2185,2187,2189,2191,2193],{"class":230,"line":310},[228,2180,2142],{"class":405},[228,2182,609],{"class":242},[228,2184,612],{"class":238},[228,2186,615],{"class":405},[228,2188,618],{"class":242},[228,2190,412],{"class":234},[228,2192,623],{"class":242},[228,2194,626],{"class":405},[228,2196,2197],{"class":230,"line":325},[228,2198,329],{"emptyLinePlaceholder":328},[228,2200,2201,2203,2205,2207,2209],{"class":230,"line":332},[228,2202,547],{"class":234},[228,2204,550],{"class":405},[228,2206,553],{"class":242},[228,2208,556],{"class":500},[228,2210,2211],{"class":405}," handle\n",[1487,2213,2214,2224],{},[1490,2215,2216],{},[1493,2217,2218,2221],{},[1496,2219,2220],{},"Where you are",[1496,2222,2223],{},"How to close",[1509,2225,2226,2239,2249,2259],{},[1493,2227,2228,2231],{},[1514,2229,2230],{},"Inside the modal",[1514,2232,2233,1077,2236],{},[202,2234,2235],{},"useModalContext().close()",[202,2237,2238],{},"confirm()",[1493,2240,2241,2244],{},[1514,2242,2243],{},"Outside, by group",[1514,2245,2246],{},[202,2247,2248],{},"closeModal({ group: 'default' })",[1493,2250,2251,2254],{},[1514,2252,2253],{},"Outside, by id",[1514,2255,2256],{},[202,2257,2258],{},"closeModalById(handle.id, opts)",[1493,2260,2261,2264],{},[1514,2262,2263],{},"Outside, via handle",[1514,2265,2266],{},[202,2267,2268],{},"handle.close(opts)",[207,2270,2272],{"id":2271},"pitfalls","Pitfalls",[198,2274,2275,2278,2279,2281,2282,2285],{},[1566,2276,2277],{},"Forgetting to handle dismiss."," ",[202,2280,212],{}," rejects when the user dismisses. Without ",[202,2283,2284],{},".catch()"," you get an unhandled rejection on every cancel.",[219,2287,2289],{"className":221,"code":2288,"language":223,"meta":224,"style":224},"\u002F\u002F bad — crashes on dismiss\nconst result = await openModal(MyDialog)\n\n\u002F\u002F good\nconst result = await openModal(MyDialog).catch(() => null)\n",[202,2290,2291,2296,2310,2314,2319],{"__ignoreMap":224},[228,2292,2293],{"class":230,"line":231},[228,2294,2295],{"class":372},"\u002F\u002F bad — crashes on dismiss\n",[228,2297,2298,2300,2302,2304,2306,2308],{"class":230,"line":275},[228,2299,547],{"class":234},[228,2301,550],{"class":405},[228,2303,553],{"class":242},[228,2305,556],{"class":500},[228,2307,239],{"class":238},[228,2309,1025],{"class":405},[228,2311,2312],{"class":230,"line":290},[228,2313,329],{"emptyLinePlaceholder":328},[228,2315,2316],{"class":230,"line":310},[228,2317,2318],{"class":372},"\u002F\u002F good\n",[228,2320,2321,2323,2325,2327,2329,2331,2334,2336,2338,2340,2342,2344,2346],{"class":230,"line":325},[228,2322,547],{"class":234},[228,2324,550],{"class":405},[228,2326,553],{"class":242},[228,2328,556],{"class":500},[228,2330,239],{"class":238},[228,2332,2333],{"class":405},"(MyDialog)",[228,2335,609],{"class":242},[228,2337,612],{"class":238},[228,2339,615],{"class":405},[228,2341,618],{"class":242},[228,2343,412],{"class":234},[228,2345,623],{"class":242},[228,2347,626],{"class":405},[198,2349,2350,2353,2354,1077,2357,2359],{},[1566,2351,2352],{},"Double-close is a no-op."," Once a modal is closing, further ",[202,2355,2356],{},"close()",[202,2358,2238],{}," calls are silently ignored.",[2361,2362,2363],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":224,"searchDepth":275,"depth":275,"links":2365},[2366,2369,2372,2375,2379,2382,2387,2389],{"id":209,"depth":275,"text":212,"children":2367},[2368],{"id":216,"depth":290,"text":217},{"id":680,"depth":275,"text":683,"children":2370},[2371],{"id":686,"depth":290,"text":217},{"id":925,"depth":275,"text":928,"children":2373},[2374],{"id":931,"depth":290,"text":217},{"id":1073,"depth":275,"text":2376,"children":2377},"closeModalsByGroup \u002F closeAllModals",[2378],{"id":1083,"depth":290,"text":217},{"id":1323,"depth":275,"text":1326,"children":2380},[2381],{"id":1329,"depth":290,"text":217},{"id":1467,"depth":275,"text":1468,"children":2383},[2384,2385,2386],{"id":1471,"depth":290,"text":1474},{"id":1666,"depth":290,"text":1669},{"id":1846,"depth":290,"text":1243},{"id":1944,"depth":275,"text":2388},"The ModalHandle API",{"id":2271,"depth":275,"text":2272},"openModal, closeModal, replaceModal — signatures, return values, and pitfalls.","md",null,{},{"title":62,"description":2390},"fTEweQ8yNQJbgQZN0MM8JjSPJPgnO5pIOcu4Wm-3VJY",[2397,2399],{"title":58,"path":59,"stem":60,"description":2398,"children":-1},"Structure of a modal component using ModalRoot, ModalContent, and useModalContext.",{"title":66,"path":67,"stem":68,"description":2400,"children":-1},"How props flow into a modal and how to type the result promise end-to-end.",1779523617515]