[{"data":1,"prerenderedAt":2684},["ShallowReactive",2],{"navigation_docs":3,"-recipes-global-error-modal":188,"-recipes-global-error-modal-surround":2679},[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":127,"body":190,"description":2673,"extension":2674,"links":2675,"meta":2676,"navigation":320,"path":128,"seo":2677,"stem":129,"__hash__":2678},"docs\u002F5.recipes\u002F6.global-error-modal.md",{"type":191,"value":192,"toc":2663},"minimark",[193,197,201,204,244,249,423,657,661,1342,1346,2345,2349,2454,2458,2551,2555,2564,2601,2604,2608,2615,2628,2642,2646,2659],[194,195,127],"h1",{"id":196},"global-error-modal",[198,199,200],"p",{},"Surfaces API errors in a styled dialog opened from a network interceptor — no component context required.",[198,202,203],{},"This recipe covers:",[205,206,207,221,232,238],"ul",{},[208,209,210,211,215,216,220],"li",{},"Opening a modal from ",[212,213,214],"strong",{},"non-component code"," (just import ",[217,218,219],"code",{},"openModal",").",[208,222,223,224,227,228,231],{},"A separate ",[217,225,226],{},"'errors'"," group with its own ",[217,229,230],{},"\u003CModalTarget>"," rendered above everything else.",[208,233,234,237],{},[217,235,236],{},"replaceModal"," to deduplicate — only one error modal shows at a time.",[208,239,240,243],{},[217,241,242],{},"closeModalsByGroup('errors')"," on logout or route change.",[245,246,248],"h2",{"id":247},"group-registration","Group registration",[250,251,257],"pre",{"className":252,"code":253,"filename":254,"language":255,"meta":256,"style":256},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createModal } from '@kolirt\u002Fvue-modal'\nimport type { DefineGroups } from '@kolirt\u002Fvue-modal'\n\ndeclare module '@kolirt\u002Fvue-modal' {\n  interface ModalGroupRegistry extends DefineGroups\u003C['default', 'errors']> {}\n}\n\napp.use(createModal())\n","main.ts","ts","",[217,258,259,292,315,322,342,390,396,401],{"__ignoreMap":256},[260,261,264,268,272,276,279,282,285,289],"span",{"class":262,"line":263},"line",1,[260,265,267],{"class":266},"s7zQu","import",[260,269,271],{"class":270},"sMK4o"," {",[260,273,275],{"class":274},"sTEyZ"," createModal",[260,277,278],{"class":270}," }",[260,280,281],{"class":266}," from",[260,283,284],{"class":270}," '",[260,286,288],{"class":287},"sfazB","@kolirt\u002Fvue-modal",[260,290,291],{"class":270},"'\n",[260,293,295,297,300,302,305,307,309,311,313],{"class":262,"line":294},2,[260,296,267],{"class":266},[260,298,299],{"class":266}," type",[260,301,271],{"class":270},[260,303,304],{"class":274}," DefineGroups",[260,306,278],{"class":270},[260,308,281],{"class":266},[260,310,284],{"class":270},[260,312,288],{"class":287},[260,314,291],{"class":270},[260,316,318],{"class":262,"line":317},3,[260,319,321],{"emptyLinePlaceholder":320},true,"\n",[260,323,325,329,332,334,336,339],{"class":262,"line":324},4,[260,326,328],{"class":327},"spNyl","declare",[260,330,331],{"class":327}," module",[260,333,284],{"class":270},[260,335,288],{"class":287},[260,337,338],{"class":270},"'",[260,340,341],{"class":270}," {\n",[260,343,345,348,352,355,357,360,364,366,369,371,374,376,379,381,384,387],{"class":262,"line":344},5,[260,346,347],{"class":327},"  interface",[260,349,351],{"class":350},"sBMFI"," ModalGroupRegistry",[260,353,354],{"class":327}," extends",[260,356,304],{"class":350},[260,358,359],{"class":270},"\u003C",[260,361,363],{"class":362},"swJcz","[",[260,365,338],{"class":270},[260,367,368],{"class":287},"default",[260,370,338],{"class":270},[260,372,373],{"class":270},",",[260,375,284],{"class":270},[260,377,378],{"class":287},"errors",[260,380,338],{"class":270},[260,382,383],{"class":362},"]",[260,385,386],{"class":270},">",[260,388,389],{"class":270}," {}\n",[260,391,393],{"class":262,"line":392},6,[260,394,395],{"class":270},"}\n",[260,397,399],{"class":262,"line":398},7,[260,400,321],{"emptyLinePlaceholder":320},[260,402,404,407,410,414,417,420],{"class":262,"line":403},8,[260,405,406],{"class":274},"app",[260,408,409],{"class":270},".",[260,411,413],{"class":412},"s2Zo4","use",[260,415,416],{"class":274},"(",[260,418,419],{"class":412},"createModal",[260,421,422],{"class":274},"())\n",[250,424,429],{"className":425,"code":426,"filename":427,"language":428,"meta":256,"style":256},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { ModalOverlay, ModalTarget } from '@kolirt\u002Fvue-modal'\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CRouterView \u002F>\n\n  \u003C!-- Normal modals -->\n  \u003CModalTarget group=\"default\">\n    \u003CModalOverlay class=\"bg-black\u002F40\" \u002F>\n  \u003C\u002FModalTarget>\n\n  \u003C!-- Error modals — rendered last, highest stacking context -->\n  \u003CModalTarget group=\"errors\" class=\"z-[9999]\">\n    \u003CModalOverlay class=\"bg-black\u002F50\" \u002F>\n  \u003C\u002FModalTarget>\n\u003C\u002Ftemplate>\n","App.vue","vue",[217,430,431,457,481,490,494,503,514,518,524,545,568,578,583,589,619,639,648],{"__ignoreMap":256},[260,432,433,435,438,441,444,447,450,452,454],{"class":262,"line":263},[260,434,359],{"class":270},[260,436,437],{"class":362},"script",[260,439,440],{"class":327}," setup",[260,442,443],{"class":327}," lang",[260,445,446],{"class":270},"=",[260,448,449],{"class":270},"\"",[260,451,255],{"class":287},[260,453,449],{"class":270},[260,455,456],{"class":270},">\n",[260,458,459,461,463,466,468,471,473,475,477,479],{"class":262,"line":294},[260,460,267],{"class":266},[260,462,271],{"class":270},[260,464,465],{"class":274}," ModalOverlay",[260,467,373],{"class":270},[260,469,470],{"class":274}," ModalTarget",[260,472,278],{"class":270},[260,474,281],{"class":266},[260,476,284],{"class":270},[260,478,288],{"class":287},[260,480,291],{"class":270},[260,482,483,486,488],{"class":262,"line":317},[260,484,485],{"class":270},"\u003C\u002F",[260,487,437],{"class":362},[260,489,456],{"class":270},[260,491,492],{"class":262,"line":324},[260,493,321],{"emptyLinePlaceholder":320},[260,495,496,498,501],{"class":262,"line":344},[260,497,359],{"class":270},[260,499,500],{"class":362},"template",[260,502,456],{"class":270},[260,504,505,508,511],{"class":262,"line":392},[260,506,507],{"class":270},"  \u003C",[260,509,510],{"class":362},"RouterView",[260,512,513],{"class":270}," \u002F>\n",[260,515,516],{"class":262,"line":398},[260,517,321],{"emptyLinePlaceholder":320},[260,519,520],{"class":262,"line":403},[260,521,523],{"class":522},"sHwdD","  \u003C!-- Normal modals -->\n",[260,525,527,529,532,535,537,539,541,543],{"class":262,"line":526},9,[260,528,507],{"class":270},[260,530,531],{"class":362},"ModalTarget",[260,533,534],{"class":327}," group",[260,536,446],{"class":270},[260,538,449],{"class":270},[260,540,368],{"class":287},[260,542,449],{"class":270},[260,544,456],{"class":270},[260,546,548,551,554,557,559,561,564,566],{"class":262,"line":547},10,[260,549,550],{"class":270},"    \u003C",[260,552,553],{"class":362},"ModalOverlay",[260,555,556],{"class":327}," class",[260,558,446],{"class":270},[260,560,449],{"class":270},[260,562,563],{"class":287},"bg-black\u002F40",[260,565,449],{"class":270},[260,567,513],{"class":270},[260,569,571,574,576],{"class":262,"line":570},11,[260,572,573],{"class":270},"  \u003C\u002F",[260,575,531],{"class":362},[260,577,456],{"class":270},[260,579,581],{"class":262,"line":580},12,[260,582,321],{"emptyLinePlaceholder":320},[260,584,586],{"class":262,"line":585},13,[260,587,588],{"class":522},"  \u003C!-- Error modals — rendered last, highest stacking context -->\n",[260,590,592,594,596,598,600,602,604,606,608,610,612,615,617],{"class":262,"line":591},14,[260,593,507],{"class":270},[260,595,531],{"class":362},[260,597,534],{"class":327},[260,599,446],{"class":270},[260,601,449],{"class":270},[260,603,378],{"class":287},[260,605,449],{"class":270},[260,607,556],{"class":327},[260,609,446],{"class":270},[260,611,449],{"class":270},[260,613,614],{"class":287},"z-[9999]",[260,616,449],{"class":270},[260,618,456],{"class":270},[260,620,622,624,626,628,630,632,635,637],{"class":262,"line":621},15,[260,623,550],{"class":270},[260,625,553],{"class":362},[260,627,556],{"class":327},[260,629,446],{"class":270},[260,631,449],{"class":270},[260,633,634],{"class":287},"bg-black\u002F50",[260,636,449],{"class":270},[260,638,513],{"class":270},[260,640,642,644,646],{"class":262,"line":641},16,[260,643,573],{"class":270},[260,645,531],{"class":362},[260,647,456],{"class":270},[260,649,651,653,655],{"class":262,"line":650},17,[260,652,485],{"class":270},[260,654,500],{"class":362},[260,656,456],{"class":270},[245,658,660],{"id":659},"the-error-modal-component","The error modal component",[250,662,665],{"className":425,"code":663,"filename":664,"language":428,"meta":256,"style":256},"\u003Cscript setup lang=\"ts\">\nimport {\n  ModalRoot,\n  ModalContent,\n  ModalTitle,\n  ModalDescription,\n  useModalContext\n} from '@kolirt\u002Fvue-modal'\n\ndefineOptions({ modalGroup: 'errors' })\n\nconst props = defineProps\u003C{\n  title?: string\n  message: string\n  code?: number | string\n}>()\n\nconst { close } = useModalContext()\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CModalRoot class=\"flex items-center justify-center p-4\">\n    \u003CModalContent class=\"relative w-full max-w-sm rounded-2xl bg-white shadow-2xl p-8 space-y-4\">\n        \u003Cdiv class=\"flex items-start gap-4\">\n          \u003Cdiv class=\"shrink-0 rounded-full bg-red-100 p-2\">\n            \u003Csvg class=\"h-5 w-5 text-red-600\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n              \u003Cpath fill-rule=\"evenodd\" d=\"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z\" clip-rule=\"evenodd\" \u002F>\n            \u003C\u002Fsvg>\n          \u003C\u002Fdiv>\n          \u003Cdiv>\n            \u003CModalTitle class=\"text-base font-semibold text-gray-900\">\n              {{ props.title ?? 'Something went wrong' }}\n            \u003C\u002FModalTitle>\n            \u003CModalDescription class=\"mt-1 text-sm text-gray-500\">\n              {{ props.message }}\n            \u003C\u002FModalDescription>\n            \u003Cp v-if=\"props.code\" class=\"mt-2 font-mono text-xs text-gray-400\">Error {{ props.code }}\u003C\u002Fp>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n\n        \u003Cdiv class=\"flex justify-end\">\n          \u003Cbutton\n            class=\"rounded-lg bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700\"\n            @click=\"close()\"\n          >\n            Dismiss\n          \u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n    \u003C\u002FModalContent>\n  \u003C\u002FModalRoot>\n\u003C\u002Ftemplate>\n","ErrorModal.vue",[217,666,667,687,693,701,708,715,722,727,740,744,771,775,791,802,811,826,834,838,858,867,872,881,902,923,945,966,1012,1058,1068,1078,1087,1108,1114,1123,1144,1150,1159,1200,1209,1219,1224,1244,1252,1268,1283,1289,1295,1305,1314,1324,1333],{"__ignoreMap":256},[260,668,669,671,673,675,677,679,681,683,685],{"class":262,"line":263},[260,670,359],{"class":270},[260,672,437],{"class":362},[260,674,440],{"class":327},[260,676,443],{"class":327},[260,678,446],{"class":270},[260,680,449],{"class":270},[260,682,255],{"class":287},[260,684,449],{"class":270},[260,686,456],{"class":270},[260,688,689,691],{"class":262,"line":294},[260,690,267],{"class":266},[260,692,341],{"class":270},[260,694,695,698],{"class":262,"line":317},[260,696,697],{"class":274},"  ModalRoot",[260,699,700],{"class":270},",\n",[260,702,703,706],{"class":262,"line":324},[260,704,705],{"class":274},"  ModalContent",[260,707,700],{"class":270},[260,709,710,713],{"class":262,"line":344},[260,711,712],{"class":274},"  ModalTitle",[260,714,700],{"class":270},[260,716,717,720],{"class":262,"line":392},[260,718,719],{"class":274},"  ModalDescription",[260,721,700],{"class":270},[260,723,724],{"class":262,"line":398},[260,725,726],{"class":274},"  useModalContext\n",[260,728,729,732,734,736,738],{"class":262,"line":403},[260,730,731],{"class":270},"}",[260,733,281],{"class":266},[260,735,284],{"class":270},[260,737,288],{"class":287},[260,739,291],{"class":270},[260,741,742],{"class":262,"line":526},[260,743,321],{"emptyLinePlaceholder":320},[260,745,746,749,751,754,757,760,762,764,766,768],{"class":262,"line":547},[260,747,748],{"class":412},"defineOptions",[260,750,416],{"class":274},[260,752,753],{"class":270},"{",[260,755,756],{"class":362}," modalGroup",[260,758,759],{"class":270},":",[260,761,284],{"class":270},[260,763,378],{"class":287},[260,765,338],{"class":270},[260,767,278],{"class":270},[260,769,770],{"class":274},")\n",[260,772,773],{"class":262,"line":570},[260,774,321],{"emptyLinePlaceholder":320},[260,776,777,780,783,785,788],{"class":262,"line":580},[260,778,779],{"class":327},"const",[260,781,782],{"class":274}," props ",[260,784,446],{"class":270},[260,786,787],{"class":412}," defineProps",[260,789,790],{"class":270},"\u003C{\n",[260,792,793,796,799],{"class":262,"line":585},[260,794,795],{"class":362},"  title",[260,797,798],{"class":270},"?:",[260,800,801],{"class":350}," string\n",[260,803,804,807,809],{"class":262,"line":591},[260,805,806],{"class":362},"  message",[260,808,759],{"class":270},[260,810,801],{"class":350},[260,812,813,816,818,821,824],{"class":262,"line":621},[260,814,815],{"class":362},"  code",[260,817,798],{"class":270},[260,819,820],{"class":350}," number",[260,822,823],{"class":270}," |",[260,825,801],{"class":350},[260,827,828,831],{"class":262,"line":641},[260,829,830],{"class":270},"}>",[260,832,833],{"class":274},"()\n",[260,835,836],{"class":262,"line":650},[260,837,321],{"emptyLinePlaceholder":320},[260,839,841,843,845,848,850,853,856],{"class":262,"line":840},18,[260,842,779],{"class":327},[260,844,271],{"class":270},[260,846,847],{"class":274}," close ",[260,849,731],{"class":270},[260,851,852],{"class":270}," =",[260,854,855],{"class":412}," useModalContext",[260,857,833],{"class":274},[260,859,861,863,865],{"class":262,"line":860},19,[260,862,485],{"class":270},[260,864,437],{"class":362},[260,866,456],{"class":270},[260,868,870],{"class":262,"line":869},20,[260,871,321],{"emptyLinePlaceholder":320},[260,873,875,877,879],{"class":262,"line":874},21,[260,876,359],{"class":270},[260,878,500],{"class":362},[260,880,456],{"class":270},[260,882,884,886,889,891,893,895,898,900],{"class":262,"line":883},22,[260,885,507],{"class":270},[260,887,888],{"class":362},"ModalRoot",[260,890,556],{"class":327},[260,892,446],{"class":270},[260,894,449],{"class":270},[260,896,897],{"class":287},"flex items-center justify-center p-4",[260,899,449],{"class":270},[260,901,456],{"class":270},[260,903,905,907,910,912,914,916,919,921],{"class":262,"line":904},23,[260,906,550],{"class":270},[260,908,909],{"class":362},"ModalContent",[260,911,556],{"class":327},[260,913,446],{"class":270},[260,915,449],{"class":270},[260,917,918],{"class":287},"relative w-full max-w-sm rounded-2xl bg-white shadow-2xl p-8 space-y-4",[260,920,449],{"class":270},[260,922,456],{"class":270},[260,924,926,929,932,934,936,938,941,943],{"class":262,"line":925},24,[260,927,928],{"class":270},"        \u003C",[260,930,931],{"class":362},"div",[260,933,556],{"class":327},[260,935,446],{"class":270},[260,937,449],{"class":270},[260,939,940],{"class":287},"flex items-start gap-4",[260,942,449],{"class":270},[260,944,456],{"class":270},[260,946,948,951,953,955,957,959,962,964],{"class":262,"line":947},25,[260,949,950],{"class":270},"          \u003C",[260,952,931],{"class":362},[260,954,556],{"class":327},[260,956,446],{"class":270},[260,958,449],{"class":270},[260,960,961],{"class":287},"shrink-0 rounded-full bg-red-100 p-2",[260,963,449],{"class":270},[260,965,456],{"class":270},[260,967,969,972,975,977,979,981,984,986,989,991,993,996,998,1001,1003,1005,1008,1010],{"class":262,"line":968},26,[260,970,971],{"class":270},"            \u003C",[260,973,974],{"class":362},"svg",[260,976,556],{"class":327},[260,978,446],{"class":270},[260,980,449],{"class":270},[260,982,983],{"class":287},"h-5 w-5 text-red-600",[260,985,449],{"class":270},[260,987,988],{"class":327}," viewBox",[260,990,446],{"class":270},[260,992,449],{"class":270},[260,994,995],{"class":287},"0 0 20 20",[260,997,449],{"class":270},[260,999,1000],{"class":327}," fill",[260,1002,446],{"class":270},[260,1004,449],{"class":270},[260,1006,1007],{"class":287},"currentColor",[260,1009,449],{"class":270},[260,1011,456],{"class":270},[260,1013,1015,1018,1021,1024,1026,1028,1031,1033,1036,1038,1040,1043,1045,1048,1050,1052,1054,1056],{"class":262,"line":1014},27,[260,1016,1017],{"class":270},"              \u003C",[260,1019,1020],{"class":362},"path",[260,1022,1023],{"class":327}," fill-rule",[260,1025,446],{"class":270},[260,1027,449],{"class":270},[260,1029,1030],{"class":287},"evenodd",[260,1032,449],{"class":270},[260,1034,1035],{"class":327}," d",[260,1037,446],{"class":270},[260,1039,449],{"class":270},[260,1041,1042],{"class":287},"M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.17 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 5a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 5zm0 9a1 1 0 100-2 1 1 0 000 2z",[260,1044,449],{"class":270},[260,1046,1047],{"class":327}," clip-rule",[260,1049,446],{"class":270},[260,1051,449],{"class":270},[260,1053,1030],{"class":287},[260,1055,449],{"class":270},[260,1057,513],{"class":270},[260,1059,1061,1064,1066],{"class":262,"line":1060},28,[260,1062,1063],{"class":270},"            \u003C\u002F",[260,1065,974],{"class":362},[260,1067,456],{"class":270},[260,1069,1071,1074,1076],{"class":262,"line":1070},29,[260,1072,1073],{"class":270},"          \u003C\u002F",[260,1075,931],{"class":362},[260,1077,456],{"class":270},[260,1079,1081,1083,1085],{"class":262,"line":1080},30,[260,1082,950],{"class":270},[260,1084,931],{"class":362},[260,1086,456],{"class":270},[260,1088,1090,1092,1095,1097,1099,1101,1104,1106],{"class":262,"line":1089},31,[260,1091,971],{"class":270},[260,1093,1094],{"class":362},"ModalTitle",[260,1096,556],{"class":327},[260,1098,446],{"class":270},[260,1100,449],{"class":270},[260,1102,1103],{"class":287},"text-base font-semibold text-gray-900",[260,1105,449],{"class":270},[260,1107,456],{"class":270},[260,1109,1111],{"class":262,"line":1110},32,[260,1112,1113],{"class":274},"              {{ props.title ?? 'Something went wrong' }}\n",[260,1115,1117,1119,1121],{"class":262,"line":1116},33,[260,1118,1063],{"class":270},[260,1120,1094],{"class":362},[260,1122,456],{"class":270},[260,1124,1126,1128,1131,1133,1135,1137,1140,1142],{"class":262,"line":1125},34,[260,1127,971],{"class":270},[260,1129,1130],{"class":362},"ModalDescription",[260,1132,556],{"class":327},[260,1134,446],{"class":270},[260,1136,449],{"class":270},[260,1138,1139],{"class":287},"mt-1 text-sm text-gray-500",[260,1141,449],{"class":270},[260,1143,456],{"class":270},[260,1145,1147],{"class":262,"line":1146},35,[260,1148,1149],{"class":274},"              {{ props.message }}\n",[260,1151,1153,1155,1157],{"class":262,"line":1152},36,[260,1154,1063],{"class":270},[260,1156,1130],{"class":362},[260,1158,456],{"class":270},[260,1160,1162,1164,1166,1169,1171,1173,1176,1178,1180,1182,1184,1187,1189,1191,1194,1196,1198],{"class":262,"line":1161},37,[260,1163,971],{"class":270},[260,1165,198],{"class":362},[260,1167,1168],{"class":327}," v-if",[260,1170,446],{"class":270},[260,1172,449],{"class":270},[260,1174,1175],{"class":287},"props.code",[260,1177,449],{"class":270},[260,1179,556],{"class":327},[260,1181,446],{"class":270},[260,1183,449],{"class":270},[260,1185,1186],{"class":287},"mt-2 font-mono text-xs text-gray-400",[260,1188,449],{"class":270},[260,1190,386],{"class":270},[260,1192,1193],{"class":274},"Error {{ props.code }}",[260,1195,485],{"class":270},[260,1197,198],{"class":362},[260,1199,456],{"class":270},[260,1201,1203,1205,1207],{"class":262,"line":1202},38,[260,1204,1073],{"class":270},[260,1206,931],{"class":362},[260,1208,456],{"class":270},[260,1210,1212,1215,1217],{"class":262,"line":1211},39,[260,1213,1214],{"class":270},"        \u003C\u002F",[260,1216,931],{"class":362},[260,1218,456],{"class":270},[260,1220,1222],{"class":262,"line":1221},40,[260,1223,321],{"emptyLinePlaceholder":320},[260,1225,1227,1229,1231,1233,1235,1237,1240,1242],{"class":262,"line":1226},41,[260,1228,928],{"class":270},[260,1230,931],{"class":362},[260,1232,556],{"class":327},[260,1234,446],{"class":270},[260,1236,449],{"class":270},[260,1238,1239],{"class":287},"flex justify-end",[260,1241,449],{"class":270},[260,1243,456],{"class":270},[260,1245,1247,1249],{"class":262,"line":1246},42,[260,1248,950],{"class":270},[260,1250,1251],{"class":362},"button\n",[260,1253,1255,1258,1260,1262,1265],{"class":262,"line":1254},43,[260,1256,1257],{"class":327},"            class",[260,1259,446],{"class":270},[260,1261,449],{"class":270},[260,1263,1264],{"class":287},"rounded-lg bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700",[260,1266,1267],{"class":270},"\"\n",[260,1269,1271,1274,1276,1278,1281],{"class":262,"line":1270},44,[260,1272,1273],{"class":327},"            @click",[260,1275,446],{"class":270},[260,1277,449],{"class":270},[260,1279,1280],{"class":287},"close()",[260,1282,1267],{"class":270},[260,1284,1286],{"class":262,"line":1285},45,[260,1287,1288],{"class":270},"          >\n",[260,1290,1292],{"class":262,"line":1291},46,[260,1293,1294],{"class":274},"            Dismiss\n",[260,1296,1298,1300,1303],{"class":262,"line":1297},47,[260,1299,1073],{"class":270},[260,1301,1302],{"class":362},"button",[260,1304,456],{"class":270},[260,1306,1308,1310,1312],{"class":262,"line":1307},48,[260,1309,1214],{"class":270},[260,1311,931],{"class":362},[260,1313,456],{"class":270},[260,1315,1317,1320,1322],{"class":262,"line":1316},49,[260,1318,1319],{"class":270},"    \u003C\u002F",[260,1321,909],{"class":362},[260,1323,456],{"class":270},[260,1325,1327,1329,1331],{"class":262,"line":1326},50,[260,1328,573],{"class":270},[260,1330,888],{"class":362},[260,1332,456],{"class":270},[260,1334,1336,1338,1340],{"class":262,"line":1335},51,[260,1337,485],{"class":270},[260,1339,500],{"class":362},[260,1341,456],{"class":270},[245,1343,1345],{"id":1344},"the-interceptor-utility","The interceptor utility",[1347,1348,1349,1654,2038],"code-group",{},[250,1350,1353],{"className":252,"code":1351,"filename":1352,"language":255,"meta":256,"style":256},"import { replaceModal, closeModalsByGroup } from '@kolirt\u002Fvue-modal'\nimport ErrorModal from '@\u002Fcomponents\u002FErrorModal.vue'\n\nexport interface ApiError {\n  message: string\n  title?: string\n  code?: number | string\n}\n\n\u002F**\n * Show an error modal. Replaces any existing error modal so only one\n * is visible at a time (deduplication via replaceModal).\n *\u002F\nexport function showErrorModal(error: ApiError) {\n  replaceModal(ErrorModal, {\n    props: {\n      message: error.message,\n      title: error.title,\n      code: error.code\n    }\n  })\n}\n\n\u002F**\n * Dismiss all error modals — call on logout or route-level error recovery.\n *\u002F\nexport function dismissAllErrors() {\n  closeModalsByGroup('errors', { ignoreGuard: true, instantExit: true })\n}\n","errorModal.ts",[217,1354,1355,1379,1396,1400,1413,1421,1429,1441,1445,1449,1454,1459,1464,1469,1494,1508,1517,1534,1550,1564,1569,1576,1580,1584,1588,1593,1597,1611,1650],{"__ignoreMap":256},[260,1356,1357,1359,1361,1364,1366,1369,1371,1373,1375,1377],{"class":262,"line":263},[260,1358,267],{"class":266},[260,1360,271],{"class":270},[260,1362,1363],{"class":274}," replaceModal",[260,1365,373],{"class":270},[260,1367,1368],{"class":274}," closeModalsByGroup",[260,1370,278],{"class":270},[260,1372,281],{"class":266},[260,1374,284],{"class":270},[260,1376,288],{"class":287},[260,1378,291],{"class":270},[260,1380,1381,1383,1386,1389,1391,1394],{"class":262,"line":294},[260,1382,267],{"class":266},[260,1384,1385],{"class":274}," ErrorModal ",[260,1387,1388],{"class":266},"from",[260,1390,284],{"class":270},[260,1392,1393],{"class":287},"@\u002Fcomponents\u002FErrorModal.vue",[260,1395,291],{"class":270},[260,1397,1398],{"class":262,"line":317},[260,1399,321],{"emptyLinePlaceholder":320},[260,1401,1402,1405,1408,1411],{"class":262,"line":324},[260,1403,1404],{"class":266},"export",[260,1406,1407],{"class":327}," interface",[260,1409,1410],{"class":350}," ApiError",[260,1412,341],{"class":270},[260,1414,1415,1417,1419],{"class":262,"line":344},[260,1416,806],{"class":362},[260,1418,759],{"class":270},[260,1420,801],{"class":350},[260,1422,1423,1425,1427],{"class":262,"line":392},[260,1424,795],{"class":362},[260,1426,798],{"class":270},[260,1428,801],{"class":350},[260,1430,1431,1433,1435,1437,1439],{"class":262,"line":398},[260,1432,815],{"class":362},[260,1434,798],{"class":270},[260,1436,820],{"class":350},[260,1438,823],{"class":270},[260,1440,801],{"class":350},[260,1442,1443],{"class":262,"line":403},[260,1444,395],{"class":270},[260,1446,1447],{"class":262,"line":526},[260,1448,321],{"emptyLinePlaceholder":320},[260,1450,1451],{"class":262,"line":547},[260,1452,1453],{"class":522},"\u002F**\n",[260,1455,1456],{"class":262,"line":570},[260,1457,1458],{"class":522}," * Show an error modal. Replaces any existing error modal so only one\n",[260,1460,1461],{"class":262,"line":580},[260,1462,1463],{"class":522}," * is visible at a time (deduplication via replaceModal).\n",[260,1465,1466],{"class":262,"line":585},[260,1467,1468],{"class":522}," *\u002F\n",[260,1470,1471,1473,1476,1479,1481,1485,1487,1489,1492],{"class":262,"line":591},[260,1472,1404],{"class":266},[260,1474,1475],{"class":327}," function",[260,1477,1478],{"class":412}," showErrorModal",[260,1480,416],{"class":270},[260,1482,1484],{"class":1483},"sHdIc","error",[260,1486,759],{"class":270},[260,1488,1410],{"class":350},[260,1490,1491],{"class":270},")",[260,1493,341],{"class":270},[260,1495,1496,1499,1501,1504,1506],{"class":262,"line":621},[260,1497,1498],{"class":412},"  replaceModal",[260,1500,416],{"class":362},[260,1502,1503],{"class":274},"ErrorModal",[260,1505,373],{"class":270},[260,1507,341],{"class":270},[260,1509,1510,1513,1515],{"class":262,"line":641},[260,1511,1512],{"class":362},"    props",[260,1514,759],{"class":270},[260,1516,341],{"class":270},[260,1518,1519,1522,1524,1527,1529,1532],{"class":262,"line":650},[260,1520,1521],{"class":362},"      message",[260,1523,759],{"class":270},[260,1525,1526],{"class":274}," error",[260,1528,409],{"class":270},[260,1530,1531],{"class":274},"message",[260,1533,700],{"class":270},[260,1535,1536,1539,1541,1543,1545,1548],{"class":262,"line":840},[260,1537,1538],{"class":362},"      title",[260,1540,759],{"class":270},[260,1542,1526],{"class":274},[260,1544,409],{"class":270},[260,1546,1547],{"class":274},"title",[260,1549,700],{"class":270},[260,1551,1552,1555,1557,1559,1561],{"class":262,"line":860},[260,1553,1554],{"class":362},"      code",[260,1556,759],{"class":270},[260,1558,1526],{"class":274},[260,1560,409],{"class":270},[260,1562,1563],{"class":274},"code\n",[260,1565,1566],{"class":262,"line":869},[260,1567,1568],{"class":270},"    }\n",[260,1570,1571,1574],{"class":262,"line":874},[260,1572,1573],{"class":270},"  }",[260,1575,770],{"class":362},[260,1577,1578],{"class":262,"line":883},[260,1579,395],{"class":270},[260,1581,1582],{"class":262,"line":904},[260,1583,321],{"emptyLinePlaceholder":320},[260,1585,1586],{"class":262,"line":925},[260,1587,1453],{"class":522},[260,1589,1590],{"class":262,"line":947},[260,1591,1592],{"class":522}," * Dismiss all error modals — call on logout or route-level error recovery.\n",[260,1594,1595],{"class":262,"line":968},[260,1596,1468],{"class":522},[260,1598,1599,1601,1603,1606,1609],{"class":262,"line":1014},[260,1600,1404],{"class":266},[260,1602,1475],{"class":327},[260,1604,1605],{"class":412}," dismissAllErrors",[260,1607,1608],{"class":270},"()",[260,1610,341],{"class":270},[260,1612,1613,1616,1618,1620,1622,1624,1626,1628,1631,1633,1637,1639,1642,1644,1646,1648],{"class":262,"line":1060},[260,1614,1615],{"class":412},"  closeModalsByGroup",[260,1617,416],{"class":362},[260,1619,338],{"class":270},[260,1621,378],{"class":287},[260,1623,338],{"class":270},[260,1625,373],{"class":270},[260,1627,271],{"class":270},[260,1629,1630],{"class":362}," ignoreGuard",[260,1632,759],{"class":270},[260,1634,1636],{"class":1635},"sfNiH"," true",[260,1638,373],{"class":270},[260,1640,1641],{"class":362}," instantExit",[260,1643,759],{"class":270},[260,1645,1636],{"class":1635},[260,1647,278],{"class":270},[260,1649,770],{"class":362},[260,1651,1652],{"class":262,"line":1070},[260,1653,395],{"class":270},[250,1655,1658],{"className":252,"code":1656,"filename":1657,"language":255,"meta":256,"style":256},"import axios from 'axios'\nimport { showErrorModal } from '@\u002Futils\u002FerrorModal'\n\nconst api = axios.create({ baseURL: '\u002Fapi' })\n\napi.interceptors.response.use(\n  (res) => res,\n  (error) => {\n    const status = error.response?.status\n    const data = error.response?.data\n\n    \u002F\u002F Don't surface 401 — handled by auth redirect\n    if (status === 401) return Promise.reject(error)\n\n    showErrorModal({\n      title: status ? `Error ${status}` : 'Network error',\n      message:\n        data?.message ||\n        error.message ||\n        'An unexpected error occurred. Please try again.',\n      code: data?.code\n    })\n\n    return Promise.reject(error)\n  }\n)\n\nexport { api }\n","api.ts (axios interceptor)",[217,1659,1660,1676,1695,1699,1735,1739,1761,1779,1791,1813,1833,1837,1842,1880,1884,1894,1931,1938,1950,1961,1973,1985,1992,1996,2013,2018,2022,2026],{"__ignoreMap":256},[260,1661,1662,1664,1667,1669,1671,1674],{"class":262,"line":263},[260,1663,267],{"class":266},[260,1665,1666],{"class":274}," axios ",[260,1668,1388],{"class":266},[260,1670,284],{"class":270},[260,1672,1673],{"class":287},"axios",[260,1675,291],{"class":270},[260,1677,1678,1680,1682,1684,1686,1688,1690,1693],{"class":262,"line":294},[260,1679,267],{"class":266},[260,1681,271],{"class":270},[260,1683,1478],{"class":274},[260,1685,278],{"class":270},[260,1687,281],{"class":266},[260,1689,284],{"class":270},[260,1691,1692],{"class":287},"@\u002Futils\u002FerrorModal",[260,1694,291],{"class":270},[260,1696,1697],{"class":262,"line":317},[260,1698,321],{"emptyLinePlaceholder":320},[260,1700,1701,1703,1706,1708,1711,1713,1716,1718,1720,1723,1725,1727,1729,1731,1733],{"class":262,"line":324},[260,1702,779],{"class":327},[260,1704,1705],{"class":274}," api ",[260,1707,446],{"class":270},[260,1709,1710],{"class":274}," axios",[260,1712,409],{"class":270},[260,1714,1715],{"class":412},"create",[260,1717,416],{"class":274},[260,1719,753],{"class":270},[260,1721,1722],{"class":362}," baseURL",[260,1724,759],{"class":270},[260,1726,284],{"class":270},[260,1728,132],{"class":287},[260,1730,338],{"class":270},[260,1732,278],{"class":270},[260,1734,770],{"class":274},[260,1736,1737],{"class":262,"line":344},[260,1738,321],{"emptyLinePlaceholder":320},[260,1740,1741,1744,1746,1749,1751,1754,1756,1758],{"class":262,"line":392},[260,1742,1743],{"class":274},"api",[260,1745,409],{"class":270},[260,1747,1748],{"class":274},"interceptors",[260,1750,409],{"class":270},[260,1752,1753],{"class":274},"response",[260,1755,409],{"class":270},[260,1757,413],{"class":412},[260,1759,1760],{"class":274},"(\n",[260,1762,1763,1766,1769,1771,1774,1777],{"class":262,"line":398},[260,1764,1765],{"class":270},"  (",[260,1767,1768],{"class":1483},"res",[260,1770,1491],{"class":270},[260,1772,1773],{"class":327}," =>",[260,1775,1776],{"class":274}," res",[260,1778,700],{"class":270},[260,1780,1781,1783,1785,1787,1789],{"class":262,"line":403},[260,1782,1765],{"class":270},[260,1784,1484],{"class":1483},[260,1786,1491],{"class":270},[260,1788,1773],{"class":327},[260,1790,341],{"class":270},[260,1792,1793,1796,1799,1801,1803,1805,1807,1810],{"class":262,"line":526},[260,1794,1795],{"class":327},"    const",[260,1797,1798],{"class":274}," status",[260,1800,852],{"class":270},[260,1802,1526],{"class":274},[260,1804,409],{"class":270},[260,1806,1753],{"class":274},[260,1808,1809],{"class":270},"?.",[260,1811,1812],{"class":274},"status\n",[260,1814,1815,1817,1820,1822,1824,1826,1828,1830],{"class":262,"line":547},[260,1816,1795],{"class":327},[260,1818,1819],{"class":274}," data",[260,1821,852],{"class":270},[260,1823,1526],{"class":274},[260,1825,409],{"class":270},[260,1827,1753],{"class":274},[260,1829,1809],{"class":270},[260,1831,1832],{"class":274},"data\n",[260,1834,1835],{"class":262,"line":570},[260,1836,321],{"emptyLinePlaceholder":320},[260,1838,1839],{"class":262,"line":580},[260,1840,1841],{"class":522},"    \u002F\u002F Don't surface 401 — handled by auth redirect\n",[260,1843,1844,1847,1850,1853,1856,1860,1863,1866,1869,1871,1874,1876,1878],{"class":262,"line":585},[260,1845,1846],{"class":266},"    if",[260,1848,1849],{"class":362}," (",[260,1851,1852],{"class":274},"status",[260,1854,1855],{"class":270}," ===",[260,1857,1859],{"class":1858},"sbssI"," 401",[260,1861,1862],{"class":362},") ",[260,1864,1865],{"class":266},"return",[260,1867,1868],{"class":350}," Promise",[260,1870,409],{"class":270},[260,1872,1873],{"class":412},"reject",[260,1875,416],{"class":362},[260,1877,1484],{"class":274},[260,1879,770],{"class":362},[260,1881,1882],{"class":262,"line":591},[260,1883,321],{"emptyLinePlaceholder":320},[260,1885,1886,1889,1891],{"class":262,"line":621},[260,1887,1888],{"class":412},"    showErrorModal",[260,1890,416],{"class":362},[260,1892,1893],{"class":270},"{\n",[260,1895,1896,1898,1900,1902,1905,1908,1911,1914,1916,1919,1922,1924,1927,1929],{"class":262,"line":641},[260,1897,1538],{"class":362},[260,1899,759],{"class":270},[260,1901,1798],{"class":274},[260,1903,1904],{"class":270}," ?",[260,1906,1907],{"class":270}," `",[260,1909,1910],{"class":287},"Error ",[260,1912,1913],{"class":270},"${",[260,1915,1852],{"class":274},[260,1917,1918],{"class":270},"}`",[260,1920,1921],{"class":270}," :",[260,1923,284],{"class":270},[260,1925,1926],{"class":287},"Network error",[260,1928,338],{"class":270},[260,1930,700],{"class":270},[260,1932,1933,1935],{"class":262,"line":650},[260,1934,1521],{"class":362},[260,1936,1937],{"class":270},":\n",[260,1939,1940,1943,1945,1947],{"class":262,"line":840},[260,1941,1942],{"class":274},"        data",[260,1944,1809],{"class":270},[260,1946,1531],{"class":274},[260,1948,1949],{"class":270}," ||\n",[260,1951,1952,1955,1957,1959],{"class":262,"line":860},[260,1953,1954],{"class":274},"        error",[260,1956,409],{"class":270},[260,1958,1531],{"class":274},[260,1960,1949],{"class":270},[260,1962,1963,1966,1969,1971],{"class":262,"line":869},[260,1964,1965],{"class":270},"        '",[260,1967,1968],{"class":287},"An unexpected error occurred. Please try again.",[260,1970,338],{"class":270},[260,1972,700],{"class":270},[260,1974,1975,1977,1979,1981,1983],{"class":262,"line":874},[260,1976,1554],{"class":362},[260,1978,759],{"class":270},[260,1980,1819],{"class":274},[260,1982,1809],{"class":270},[260,1984,1563],{"class":274},[260,1986,1987,1990],{"class":262,"line":883},[260,1988,1989],{"class":270},"    }",[260,1991,770],{"class":362},[260,1993,1994],{"class":262,"line":904},[260,1995,321],{"emptyLinePlaceholder":320},[260,1997,1998,2001,2003,2005,2007,2009,2011],{"class":262,"line":925},[260,1999,2000],{"class":266},"    return",[260,2002,1868],{"class":350},[260,2004,409],{"class":270},[260,2006,1873],{"class":412},[260,2008,416],{"class":362},[260,2010,1484],{"class":274},[260,2012,770],{"class":362},[260,2014,2015],{"class":262,"line":947},[260,2016,2017],{"class":270},"  }\n",[260,2019,2020],{"class":262,"line":968},[260,2021,770],{"class":274},[260,2023,2024],{"class":262,"line":1014},[260,2025,321],{"emptyLinePlaceholder":320},[260,2027,2028,2030,2032,2035],{"class":262,"line":1060},[260,2029,1404],{"class":266},[260,2031,271],{"class":270},[260,2033,2034],{"class":274}," api",[260,2036,2037],{"class":270}," }\n",[250,2039,2042],{"className":252,"code":2040,"filename":2041,"language":255,"meta":256,"style":256},"import { showErrorModal } from '@\u002Futils\u002FerrorModal'\n\nexport async function apiFetch\u003CT>(\n  input: RequestInfo,\n  init?: RequestInit\n): Promise\u003CT> {\n  const res = await fetch(input, init)\n  if (!res.ok) {\n    const body = await res.json().catch(() => ({}))\n    showErrorModal({\n      title: `Error ${res.status}`,\n      message: body?.message ?? res.statusText,\n      code: body?.code\n    })\n    throw new Error(body?.message ?? res.statusText)\n  }\n  return res.json() as Promise\u003CT>\n}\n","api.ts (native fetch wrapper)",[217,2043,2044,2062,2066,2086,2098,2108,2123,2150,2171,2210,2218,2240,2264,2276,2282,2312,2316,2341],{"__ignoreMap":256},[260,2045,2046,2048,2050,2052,2054,2056,2058,2060],{"class":262,"line":263},[260,2047,267],{"class":266},[260,2049,271],{"class":270},[260,2051,1478],{"class":274},[260,2053,278],{"class":270},[260,2055,281],{"class":266},[260,2057,284],{"class":270},[260,2059,1692],{"class":287},[260,2061,291],{"class":270},[260,2063,2064],{"class":262,"line":294},[260,2065,321],{"emptyLinePlaceholder":320},[260,2067,2068,2070,2073,2075,2078,2080,2083],{"class":262,"line":317},[260,2069,1404],{"class":266},[260,2071,2072],{"class":327}," async",[260,2074,1475],{"class":327},[260,2076,2077],{"class":412}," apiFetch",[260,2079,359],{"class":270},[260,2081,2082],{"class":350},"T",[260,2084,2085],{"class":270},">(\n",[260,2087,2088,2091,2093,2096],{"class":262,"line":324},[260,2089,2090],{"class":1483},"  input",[260,2092,759],{"class":270},[260,2094,2095],{"class":350}," RequestInfo",[260,2097,700],{"class":270},[260,2099,2100,2103,2105],{"class":262,"line":344},[260,2101,2102],{"class":1483},"  init",[260,2104,798],{"class":270},[260,2106,2107],{"class":350}," RequestInit\n",[260,2109,2110,2113,2115,2117,2119,2121],{"class":262,"line":392},[260,2111,2112],{"class":270},"):",[260,2114,1868],{"class":350},[260,2116,359],{"class":270},[260,2118,2082],{"class":350},[260,2120,386],{"class":270},[260,2122,341],{"class":270},[260,2124,2125,2128,2130,2132,2135,2138,2140,2143,2145,2148],{"class":262,"line":398},[260,2126,2127],{"class":327},"  const",[260,2129,1776],{"class":274},[260,2131,852],{"class":270},[260,2133,2134],{"class":266}," await",[260,2136,2137],{"class":412}," fetch",[260,2139,416],{"class":362},[260,2141,2142],{"class":274},"input",[260,2144,373],{"class":270},[260,2146,2147],{"class":274}," init",[260,2149,770],{"class":362},[260,2151,2152,2155,2157,2160,2162,2164,2167,2169],{"class":262,"line":403},[260,2153,2154],{"class":266},"  if",[260,2156,1849],{"class":362},[260,2158,2159],{"class":270},"!",[260,2161,1768],{"class":274},[260,2163,409],{"class":270},[260,2165,2166],{"class":274},"ok",[260,2168,1862],{"class":362},[260,2170,1893],{"class":270},[260,2172,2173,2175,2178,2180,2182,2184,2186,2189,2191,2193,2196,2198,2200,2202,2204,2207],{"class":262,"line":526},[260,2174,1795],{"class":327},[260,2176,2177],{"class":274}," body",[260,2179,852],{"class":270},[260,2181,2134],{"class":266},[260,2183,1776],{"class":274},[260,2185,409],{"class":270},[260,2187,2188],{"class":412},"json",[260,2190,1608],{"class":362},[260,2192,409],{"class":270},[260,2194,2195],{"class":412},"catch",[260,2197,416],{"class":362},[260,2199,1608],{"class":270},[260,2201,1773],{"class":327},[260,2203,1849],{"class":362},[260,2205,2206],{"class":270},"{}",[260,2208,2209],{"class":362},"))\n",[260,2211,2212,2214,2216],{"class":262,"line":547},[260,2213,1888],{"class":412},[260,2215,416],{"class":362},[260,2217,1893],{"class":270},[260,2219,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238],{"class":262,"line":570},[260,2221,1538],{"class":362},[260,2223,759],{"class":270},[260,2225,1907],{"class":270},[260,2227,1910],{"class":287},[260,2229,1913],{"class":270},[260,2231,1768],{"class":274},[260,2233,409],{"class":270},[260,2235,1852],{"class":274},[260,2237,1918],{"class":270},[260,2239,700],{"class":270},[260,2241,2242,2244,2246,2248,2250,2252,2255,2257,2259,2262],{"class":262,"line":580},[260,2243,1521],{"class":362},[260,2245,759],{"class":270},[260,2247,2177],{"class":274},[260,2249,1809],{"class":270},[260,2251,1531],{"class":274},[260,2253,2254],{"class":270}," ??",[260,2256,1776],{"class":274},[260,2258,409],{"class":270},[260,2260,2261],{"class":274},"statusText",[260,2263,700],{"class":270},[260,2265,2266,2268,2270,2272,2274],{"class":262,"line":585},[260,2267,1554],{"class":362},[260,2269,759],{"class":270},[260,2271,2177],{"class":274},[260,2273,1809],{"class":270},[260,2275,1563],{"class":274},[260,2277,2278,2280],{"class":262,"line":591},[260,2279,1989],{"class":270},[260,2281,770],{"class":362},[260,2283,2284,2287,2290,2293,2295,2298,2300,2302,2304,2306,2308,2310],{"class":262,"line":621},[260,2285,2286],{"class":266},"    throw",[260,2288,2289],{"class":270}," new",[260,2291,2292],{"class":412}," Error",[260,2294,416],{"class":362},[260,2296,2297],{"class":274},"body",[260,2299,1809],{"class":270},[260,2301,1531],{"class":274},[260,2303,2254],{"class":270},[260,2305,1776],{"class":274},[260,2307,409],{"class":270},[260,2309,2261],{"class":274},[260,2311,770],{"class":362},[260,2313,2314],{"class":262,"line":641},[260,2315,2017],{"class":270},[260,2317,2318,2321,2323,2325,2327,2330,2333,2335,2337,2339],{"class":262,"line":650},[260,2319,2320],{"class":266},"  return",[260,2322,1776],{"class":274},[260,2324,409],{"class":270},[260,2326,2188],{"class":412},[260,2328,2329],{"class":362},"() ",[260,2331,2332],{"class":266},"as",[260,2334,1868],{"class":350},[260,2336,359],{"class":270},[260,2338,2082],{"class":350},[260,2340,456],{"class":270},[260,2342,2343],{"class":262,"line":840},[260,2344,395],{"class":270},[245,2346,2348],{"id":2347},"clearing-errors-on-route-change","Clearing errors on route change",[250,2350,2353],{"className":252,"code":2351,"filename":2352,"language":255,"meta":256,"style":256},"import { createRouter } from 'vue-router'\nimport { dismissAllErrors } from '@\u002Futils\u002FerrorModal'\n\nconst router = createRouter({ \u002F* ... *\u002F })\n\nrouter.beforeEach(() => {\n  dismissAllErrors()\n})\n","router.ts",[217,2354,2355,2375,2393,2397,2419,2423,2441,2448],{"__ignoreMap":256},[260,2356,2357,2359,2361,2364,2366,2368,2370,2373],{"class":262,"line":263},[260,2358,267],{"class":266},[260,2360,271],{"class":270},[260,2362,2363],{"class":274}," createRouter",[260,2365,278],{"class":270},[260,2367,281],{"class":266},[260,2369,284],{"class":270},[260,2371,2372],{"class":287},"vue-router",[260,2374,291],{"class":270},[260,2376,2377,2379,2381,2383,2385,2387,2389,2391],{"class":262,"line":294},[260,2378,267],{"class":266},[260,2380,271],{"class":270},[260,2382,1605],{"class":274},[260,2384,278],{"class":270},[260,2386,281],{"class":266},[260,2388,284],{"class":270},[260,2390,1692],{"class":287},[260,2392,291],{"class":270},[260,2394,2395],{"class":262,"line":317},[260,2396,321],{"emptyLinePlaceholder":320},[260,2398,2399,2401,2404,2406,2408,2410,2412,2415,2417],{"class":262,"line":324},[260,2400,779],{"class":327},[260,2402,2403],{"class":274}," router ",[260,2405,446],{"class":270},[260,2407,2363],{"class":412},[260,2409,416],{"class":274},[260,2411,753],{"class":270},[260,2413,2414],{"class":522}," \u002F* ... *\u002F",[260,2416,278],{"class":270},[260,2418,770],{"class":274},[260,2420,2421],{"class":262,"line":344},[260,2422,321],{"emptyLinePlaceholder":320},[260,2424,2425,2428,2430,2433,2435,2437,2439],{"class":262,"line":392},[260,2426,2427],{"class":274},"router",[260,2429,409],{"class":270},[260,2431,2432],{"class":412},"beforeEach",[260,2434,416],{"class":274},[260,2436,1608],{"class":270},[260,2438,1773],{"class":327},[260,2440,341],{"class":270},[260,2442,2443,2446],{"class":262,"line":398},[260,2444,2445],{"class":412},"  dismissAllErrors",[260,2447,833],{"class":362},[260,2449,2450,2452],{"class":262,"line":403},[260,2451,731],{"class":270},[260,2453,770],{"class":274},[245,2455,2457],{"id":2456},"clearing-errors-on-logout","Clearing errors on logout",[250,2459,2462],{"className":252,"code":2460,"filename":2461,"language":255,"meta":256,"style":256},"import { dismissAllErrors } from '@\u002Futils\u002FerrorModal'\n\nexport async function logout() {\n  dismissAllErrors()\n  await api.auth.logout()\n  router.push('\u002Flogin')\n}\n","auth.ts",[217,2463,2464,2482,2486,2501,2507,2526,2547],{"__ignoreMap":256},[260,2465,2466,2468,2470,2472,2474,2476,2478,2480],{"class":262,"line":263},[260,2467,267],{"class":266},[260,2469,271],{"class":270},[260,2471,1605],{"class":274},[260,2473,278],{"class":270},[260,2475,281],{"class":266},[260,2477,284],{"class":270},[260,2479,1692],{"class":287},[260,2481,291],{"class":270},[260,2483,2484],{"class":262,"line":294},[260,2485,321],{"emptyLinePlaceholder":320},[260,2487,2488,2490,2492,2494,2497,2499],{"class":262,"line":317},[260,2489,1404],{"class":266},[260,2491,2072],{"class":327},[260,2493,1475],{"class":327},[260,2495,2496],{"class":412}," logout",[260,2498,1608],{"class":270},[260,2500,341],{"class":270},[260,2502,2503,2505],{"class":262,"line":324},[260,2504,2445],{"class":412},[260,2506,833],{"class":362},[260,2508,2509,2512,2514,2516,2519,2521,2524],{"class":262,"line":344},[260,2510,2511],{"class":266},"  await",[260,2513,2034],{"class":274},[260,2515,409],{"class":270},[260,2517,2518],{"class":274},"auth",[260,2520,409],{"class":270},[260,2522,2523],{"class":412},"logout",[260,2525,833],{"class":362},[260,2527,2528,2531,2533,2536,2538,2540,2543,2545],{"class":262,"line":392},[260,2529,2530],{"class":274},"  router",[260,2532,409],{"class":270},[260,2534,2535],{"class":412},"push",[260,2537,416],{"class":362},[260,2539,338],{"class":270},[260,2541,2542],{"class":287},"\u002Flogin",[260,2544,338],{"class":270},[260,2546,770],{"class":362},[260,2548,2549],{"class":262,"line":398},[260,2550,395],{"class":270},[245,2552,2554],{"id":2553},"why-replacemodal-for-deduplication","Why replaceModal for deduplication",[198,2556,2557,2558,2560,2561,2563],{},"Without deduplication, rapid API failures stack multiple error modals. ",[217,2559,236],{}," atomically closes the current topmost ",[217,2562,226],{}," modal (bypassing guards, no animation) and opens the new one:",[250,2565,2567],{"className":252,"code":2566,"language":255,"meta":256,"style":256},"replaceModal(ErrorModal, { props: { message } })\n\u002F\u002F = close last 'errors' modal (instant) + open new one\n",[217,2568,2569,2596],{"__ignoreMap":256},[260,2570,2571,2573,2576,2578,2580,2583,2585,2587,2590,2592,2594],{"class":262,"line":263},[260,2572,236],{"class":412},[260,2574,2575],{"class":274},"(ErrorModal",[260,2577,373],{"class":270},[260,2579,271],{"class":270},[260,2581,2582],{"class":362}," props",[260,2584,759],{"class":270},[260,2586,271],{"class":270},[260,2588,2589],{"class":274}," message ",[260,2591,731],{"class":270},[260,2593,278],{"class":270},[260,2595,770],{"class":274},[260,2597,2598],{"class":262,"line":294},[260,2599,2600],{"class":522},"\u002F\u002F = close last 'errors' modal (instant) + open new one\n",[198,2602,2603],{},"The user sees exactly one error at a time.",[245,2605,2607],{"id":2606},"why-a-separate-group","Why a separate group",[198,2609,2610,2611,2614],{},"Keeping errors in their own ",[217,2612,2613],{},"\u003CModalTarget group=\"errors\">"," means:",[205,2616,2617,2620,2625],{},[208,2618,2619],{},"Error modals always render above business modals (via DOM order \u002F z-index).",[208,2621,2622,2624],{},[217,2623,242],{}," clears only errors — active wizards or forms behind them are unaffected.",[208,2626,2627],{},"Behavior options (Esc, overlay) can be tuned for errors independently.",[2629,2630,2632,2634,2635,2637,2638,2641],"callout",{"type":2631},"note",[217,2633,219],{}," \u002F ",[217,2636,236],{}," can be called from any ",[217,2639,2640],{},".ts"," file — they are plain functions, not composables. No component instance is required.",[245,2643,2645],{"id":2644},"related","Related",[205,2647,2648,2654],{},[208,2649,2650],{},[2651,2652,2653],"a",{"href":137},"API reference — functions",[208,2655,2656],{},[2651,2657,2658],{"href":141},"API reference — components",[2660,2661,2662],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":256,"searchDepth":294,"depth":294,"links":2664},[2665,2666,2667,2668,2669,2670,2671,2672],{"id":247,"depth":294,"text":248},{"id":659,"depth":294,"text":660},{"id":1344,"depth":294,"text":1345},{"id":2347,"depth":294,"text":2348},{"id":2456,"depth":294,"text":2457},{"id":2553,"depth":294,"text":2554},{"id":2606,"depth":294,"text":2607},{"id":2644,"depth":294,"text":2645},"Wire a fetch\u002Faxios interceptor to open an error modal from anywhere. Uses a dedicated high-z-index group, replaceModal to deduplicate, and closeModalsByGroup on logout.","md",null,{},{"title":127,"description":2673},"ZVEOdEdWhfOHdtASBc9x7VHyhaN1dNdPGSItkalr7EY",[2680,2682],{"title":123,"path":124,"stem":125,"description":2681,"children":-1},"Build a multi-step wizard using replaceModal + instantEnter so steps swap without full open\u002Fclose transitions. Compares step-replace vs. stacking.",{"title":136,"path":137,"stem":138,"description":2683,"children":-1},"openModal, closeModal, closeModalById, closeAllModals, closeModalsByGroup, replaceModal, ModalClosedError.",1779523619900]