[{"data":1,"prerenderedAt":3230},["ShallowReactive",2],{"navigation_docs":3,"-recipes-form-modal-with-validation":188,"-recipes-form-modal-with-validation-surround":3225},[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":111,"body":190,"description":3219,"extension":3220,"links":3221,"meta":3222,"navigation":286,"path":112,"seo":3223,"stem":113,"__hash__":3224},"docs\u002F5.recipes\u002F2.form-modal-with-validation.md",{"type":191,"value":192,"toc":3212},"minimark",[193,197,201,230,235,352,508,512,2953,2957,2977,3049,3070,3074,3081,3184,3188,3208],[194,195,111],"h1",{"id":196},"form-modal-with-validation",[198,199,200],"p",{},"This recipe shows a form inside a modal that:",[202,203,204,213,220,227],"ul",{},[205,206,207,208,212],"li",{},"Returns typed, validated data via ",[209,210,211],"code",{},"confirm(data)",".",[205,214,215,216,219],{},"Warns the user before closing with unsaved changes (Esc, overlay click, programmatic ",[209,217,218],{},"close()",").",[205,221,222,223,226],{},"Supports an ",[209,224,225],{},"initialValue"," prop for pre-filling (edit flows).",[205,228,229],{},"Submits asynchronously before resolving.",[231,232,234],"h2",{"id":233},"group-registration","Group registration",[236,237,243],"pre",{"className":238,"code":239,"filename":240,"language":241,"meta":242,"style":242},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { DefineGroups } from '@kolirt\u002Fvue-modal'\n\ndeclare module '@kolirt\u002Fvue-modal' {\n  interface ModalGroupRegistry extends DefineGroups\u003C['forms']> {}\n}\n","main.ts","ts","",[209,244,245,281,288,308,346],{"__ignoreMap":242},[246,247,250,254,257,261,265,268,271,274,278],"span",{"class":248,"line":249},"line",1,[246,251,253],{"class":252},"s7zQu","import",[246,255,256],{"class":252}," type",[246,258,260],{"class":259},"sMK4o"," {",[246,262,264],{"class":263},"sTEyZ"," DefineGroups",[246,266,267],{"class":259}," }",[246,269,270],{"class":252}," from",[246,272,273],{"class":259}," '",[246,275,277],{"class":276},"sfazB","@kolirt\u002Fvue-modal",[246,279,280],{"class":259},"'\n",[246,282,284],{"class":248,"line":283},2,[246,285,287],{"emptyLinePlaceholder":286},true,"\n",[246,289,291,295,298,300,302,305],{"class":248,"line":290},3,[246,292,294],{"class":293},"spNyl","declare",[246,296,297],{"class":293}," module",[246,299,273],{"class":259},[246,301,277],{"class":276},[246,303,304],{"class":259},"'",[246,306,307],{"class":259}," {\n",[246,309,311,314,318,321,323,326,330,332,335,337,340,343],{"class":248,"line":310},4,[246,312,313],{"class":293},"  interface",[246,315,317],{"class":316},"sBMFI"," ModalGroupRegistry",[246,319,320],{"class":293}," extends",[246,322,264],{"class":316},[246,324,325],{"class":259},"\u003C",[246,327,329],{"class":328},"swJcz","[",[246,331,304],{"class":259},[246,333,334],{"class":276},"forms",[246,336,304],{"class":259},[246,338,339],{"class":328},"]",[246,341,342],{"class":259},">",[246,344,345],{"class":259}," {}\n",[246,347,349],{"class":248,"line":348},5,[246,350,351],{"class":259},"}\n",[236,353,358],{"className":354,"code":355,"filename":356,"language":357,"meta":242,"style":242},"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  \u003CModalTarget group=\"forms\">\n    \u003CModalOverlay class=\"bg-black\u002F40\" \u002F>\n  \u003C\u002FModalTarget>\n\u003C\u002Ftemplate>\n","App.vue","vue",[209,359,360,386,411,420,424,433,445,466,489,499],{"__ignoreMap":242},[246,361,362,364,367,370,373,376,379,381,383],{"class":248,"line":249},[246,363,325],{"class":259},[246,365,366],{"class":328},"script",[246,368,369],{"class":293}," setup",[246,371,372],{"class":293}," lang",[246,374,375],{"class":259},"=",[246,377,378],{"class":259},"\"",[246,380,241],{"class":276},[246,382,378],{"class":259},[246,384,385],{"class":259},">\n",[246,387,388,390,392,395,398,401,403,405,407,409],{"class":248,"line":283},[246,389,253],{"class":252},[246,391,260],{"class":259},[246,393,394],{"class":263}," ModalOverlay",[246,396,397],{"class":259},",",[246,399,400],{"class":263}," ModalTarget",[246,402,267],{"class":259},[246,404,270],{"class":252},[246,406,273],{"class":259},[246,408,277],{"class":276},[246,410,280],{"class":259},[246,412,413,416,418],{"class":248,"line":290},[246,414,415],{"class":259},"\u003C\u002F",[246,417,366],{"class":328},[246,419,385],{"class":259},[246,421,422],{"class":248,"line":310},[246,423,287],{"emptyLinePlaceholder":286},[246,425,426,428,431],{"class":248,"line":348},[246,427,325],{"class":259},[246,429,430],{"class":328},"template",[246,432,385],{"class":259},[246,434,436,439,442],{"class":248,"line":435},6,[246,437,438],{"class":259},"  \u003C",[246,440,441],{"class":328},"RouterView",[246,443,444],{"class":259}," \u002F>\n",[246,446,448,450,453,456,458,460,462,464],{"class":248,"line":447},7,[246,449,438],{"class":259},[246,451,452],{"class":328},"ModalTarget",[246,454,455],{"class":293}," group",[246,457,375],{"class":259},[246,459,378],{"class":259},[246,461,334],{"class":276},[246,463,378],{"class":259},[246,465,385],{"class":259},[246,467,469,472,475,478,480,482,485,487],{"class":248,"line":468},8,[246,470,471],{"class":259},"    \u003C",[246,473,474],{"class":328},"ModalOverlay",[246,476,477],{"class":293}," class",[246,479,375],{"class":259},[246,481,378],{"class":259},[246,483,484],{"class":276},"bg-black\u002F40",[246,486,378],{"class":259},[246,488,444],{"class":259},[246,490,492,495,497],{"class":248,"line":491},9,[246,493,494],{"class":259},"  \u003C\u002F",[246,496,452],{"class":328},[246,498,385],{"class":259},[246,500,502,504,506],{"class":248,"line":501},10,[246,503,415],{"class":259},[246,505,430],{"class":328},[246,507,385],{"class":259},[231,509,511],{"id":510},"the-modal-component","The modal component",[513,514,515,2557],"code-group",{},[236,516,519],{"className":354,"code":517,"filename":518,"language":357,"meta":242,"style":242},"\u003Cscript setup lang=\"ts\">\nimport { reactive, ref, computed } from 'vue'\nimport {\n  ModalRoot,\n  ModalContent,\n  ModalTitle,\n  useModalContext\n} from '@kolirt\u002Fvue-modal'\n\ndefineOptions({ modalGroup: 'forms' })\n\nexport interface ProfileData {\n  name: string\n  email: string\n}\n\nconst props = withDefaults(\n  defineProps\u003C{ initialValue?: Partial\u003CProfileData> }>(),\n  { initialValue: () => ({}) }\n)\n\n\u002F\u002F Typed result — confirm() only accepts ProfileData\nconst { close, confirm, onBeforeClose } = useModalContext\u003CProfileData>()\n\nconst form = reactive\u003CProfileData>({\n  name: props.initialValue.name ?? '',\n  email: props.initialValue.email ?? ''\n})\n\nconst errors = reactive({ name: '', email: '' })\nconst submitting = ref(false)\nconst serverError = ref('')\n\nconst isDirty = computed(\n  () =>\n    form.name !== (props.initialValue.name ?? '') ||\n    form.email !== (props.initialValue.email ?? '')\n)\n\n\u002F\u002F Guard: if the form is dirty, ask before closing\nonBeforeClose(async () => {\n  if (!isDirty.value) return true\n  return window.confirm('You have unsaved changes. Discard them?')\n})\n\nfunction validate(): boolean {\n  errors.name = form.name.trim() ? '' : 'Name is required.'\n  errors.email = \u002F^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\u002F.test(form.email)\n    ? ''\n    : 'Enter a valid email address.'\n  return !errors.name && !errors.email\n}\n\nasync function submit() {\n  serverError.value = ''\n  if (!validate()) return\n\n  submitting.value = true\n  try {\n    await api.users.updateProfile(form)\n    \u002F\u002F Resolve the modal with the saved data — bypass the dirty-form guard\n    \u002F\u002F since the changes have just been persisted\n    confirm({ name: form.name, email: form.email }, { ignoreGuard: true })\n  } catch (e: any) {\n    serverError.value = e?.message ?? 'Something went wrong.'\n  } finally {\n    submitting.value = false\n  }\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CModalRoot class=\"flex items-center justify-center p-4\">\n    \u003CModalContent class=\"relative w-full max-w-md rounded-2xl bg-white shadow-2xl p-8 space-y-6\">\n        \u003CModalTitle class=\"text-xl font-bold text-gray-900\">Edit profile\u003C\u002FModalTitle>\n\n        \u003Cform class=\"space-y-4\" @submit.prevent=\"submit\">\n          \u003Cdiv>\n            \u003Clabel class=\"block text-sm font-medium text-gray-700 mb-1\">Name\u003C\u002Flabel>\n            \u003Cinput\n              v-model=\"form.name\"\n              type=\"text\"\n              class=\"w-full rounded-lg border px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-indigo-500\"\n              :class=\"errors.name ? 'border-red-400' : 'border-gray-300'\"\n              placeholder=\"Jane Doe\"\n            \u002F>\n            \u003Cp v-if=\"errors.name\" class=\"mt-1 text-xs text-red-500\">{{ errors.name }}\u003C\u002Fp>\n          \u003C\u002Fdiv>\n\n          \u003Cdiv>\n            \u003Clabel class=\"block text-sm font-medium text-gray-700 mb-1\">Email\u003C\u002Flabel>\n            \u003Cinput\n              v-model=\"form.email\"\n              type=\"email\"\n              class=\"w-full rounded-lg border px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-indigo-500\"\n              :class=\"errors.email ? 'border-red-400' : 'border-gray-300'\"\n              placeholder=\"jane@example.com\"\n            \u002F>\n            \u003Cp v-if=\"errors.email\" class=\"mt-1 text-xs text-red-500\">{{ errors.email }}\u003C\u002Fp>\n          \u003C\u002Fdiv>\n\n          \u003Cp v-if=\"serverError\" class=\"text-sm text-red-600 bg-red-50 rounded-lg px-3 py-2\">\n            {{ serverError }}\n          \u003C\u002Fp>\n\n          \u003Cdiv class=\"flex justify-end gap-3 pt-2\">\n            \u003Cbutton\n              type=\"button\"\n              class=\"rounded-lg px-4 py-2 text-sm font-medium text-gray-700 ring-1 ring-gray-300 hover:bg-gray-50\"\n              @click=\"close()\"\n            >\n              Cancel\n            \u003C\u002Fbutton>\n            \u003Cbutton\n              type=\"submit\"\n              class=\"rounded-lg px-4 py-2 text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 disabled:opacity-50 flex items-center gap-2\"\n              :disabled=\"submitting\"\n            >\n              \u003Csvg v-if=\"submitting\" class=\"h-4 w-4 animate-spin\" viewBox=\"0 0 24 24\" fill=\"none\">\n                \u003Ccircle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" \u002F>\n                \u003Cpath class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8v8H4z\" \u002F>\n              \u003C\u002Fsvg>\n              Save changes\n            \u003C\u002Fbutton>\n          \u003C\u002Fdiv>\n        \u003C\u002Fform>\n    \u003C\u002FModalContent>\n  \u003C\u002FModalRoot>\n\u003C\u002Ftemplate>\n","EditProfileModal.vue",[209,520,521,541,570,576,584,591,598,603,616,620,649,654,668,679,689,694,699,716,749,776,781,786,793,830,835,858,885,908,915,920,956,976,995,1000,1014,1023,1056,1083,1088,1093,1099,1116,1143,1168,1175,1180,1197,1240,1307,1315,1328,1355,1360,1365,1380,1394,1412,1417,1431,1439,1464,1470,1476,1525,1550,1581,1591,1606,1612,1617,1626,1631,1640,1661,1682,1713,1718,1750,1761,1792,1800,1816,1831,1846,1861,1876,1882,1923,1933,1938,1947,1975,1982,1996,2009,2022,2036,2050,2055,2094,2103,2108,2139,2145,2154,2159,2179,2187,2201,2215,2229,2235,2241,2251,2258,2271,2285,2300,2305,2361,2442,2485,2495,2501,2510,2519,2529,2539,2548],{"__ignoreMap":242},[246,522,523,525,527,529,531,533,535,537,539],{"class":248,"line":249},[246,524,325],{"class":259},[246,526,366],{"class":328},[246,528,369],{"class":293},[246,530,372],{"class":293},[246,532,375],{"class":259},[246,534,378],{"class":259},[246,536,241],{"class":276},[246,538,378],{"class":259},[246,540,385],{"class":259},[246,542,543,545,547,550,552,555,557,560,562,564,566,568],{"class":248,"line":283},[246,544,253],{"class":252},[246,546,260],{"class":259},[246,548,549],{"class":263}," reactive",[246,551,397],{"class":259},[246,553,554],{"class":263}," ref",[246,556,397],{"class":259},[246,558,559],{"class":263}," computed",[246,561,267],{"class":259},[246,563,270],{"class":252},[246,565,273],{"class":259},[246,567,357],{"class":276},[246,569,280],{"class":259},[246,571,572,574],{"class":248,"line":290},[246,573,253],{"class":252},[246,575,307],{"class":259},[246,577,578,581],{"class":248,"line":310},[246,579,580],{"class":263},"  ModalRoot",[246,582,583],{"class":259},",\n",[246,585,586,589],{"class":248,"line":348},[246,587,588],{"class":263},"  ModalContent",[246,590,583],{"class":259},[246,592,593,596],{"class":248,"line":435},[246,594,595],{"class":263},"  ModalTitle",[246,597,583],{"class":259},[246,599,600],{"class":248,"line":447},[246,601,602],{"class":263},"  useModalContext\n",[246,604,605,608,610,612,614],{"class":248,"line":468},[246,606,607],{"class":259},"}",[246,609,270],{"class":252},[246,611,273],{"class":259},[246,613,277],{"class":276},[246,615,280],{"class":259},[246,617,618],{"class":248,"line":491},[246,619,287],{"emptyLinePlaceholder":286},[246,621,622,626,629,632,635,638,640,642,644,646],{"class":248,"line":501},[246,623,625],{"class":624},"s2Zo4","defineOptions",[246,627,628],{"class":263},"(",[246,630,631],{"class":259},"{",[246,633,634],{"class":328}," modalGroup",[246,636,637],{"class":259},":",[246,639,273],{"class":259},[246,641,334],{"class":276},[246,643,304],{"class":259},[246,645,267],{"class":259},[246,647,648],{"class":263},")\n",[246,650,652],{"class":248,"line":651},11,[246,653,287],{"emptyLinePlaceholder":286},[246,655,657,660,663,666],{"class":248,"line":656},12,[246,658,659],{"class":252},"export",[246,661,662],{"class":293}," interface",[246,664,665],{"class":316}," ProfileData",[246,667,307],{"class":259},[246,669,671,674,676],{"class":248,"line":670},13,[246,672,673],{"class":328},"  name",[246,675,637],{"class":259},[246,677,678],{"class":316}," string\n",[246,680,682,685,687],{"class":248,"line":681},14,[246,683,684],{"class":328},"  email",[246,686,637],{"class":259},[246,688,678],{"class":316},[246,690,692],{"class":248,"line":691},15,[246,693,351],{"class":259},[246,695,697],{"class":248,"line":696},16,[246,698,287],{"emptyLinePlaceholder":286},[246,700,702,705,708,710,713],{"class":248,"line":701},17,[246,703,704],{"class":293},"const",[246,706,707],{"class":263}," props ",[246,709,375],{"class":259},[246,711,712],{"class":624}," withDefaults",[246,714,715],{"class":263},"(\n",[246,717,719,722,725,728,731,734,736,739,741,744,747],{"class":248,"line":718},18,[246,720,721],{"class":624},"  defineProps",[246,723,724],{"class":259},"\u003C{",[246,726,727],{"class":328}," initialValue",[246,729,730],{"class":259},"?:",[246,732,733],{"class":316}," Partial",[246,735,325],{"class":259},[246,737,738],{"class":316},"ProfileData",[246,740,342],{"class":259},[246,742,743],{"class":259}," }>",[246,745,746],{"class":263},"()",[246,748,583],{"class":259},[246,750,752,755,757,759,762,765,768,771,774],{"class":248,"line":751},19,[246,753,754],{"class":259},"  {",[246,756,727],{"class":624},[246,758,637],{"class":259},[246,760,761],{"class":259}," ()",[246,763,764],{"class":293}," =>",[246,766,767],{"class":263}," (",[246,769,770],{"class":259},"{}",[246,772,773],{"class":263},") ",[246,775,351],{"class":259},[246,777,779],{"class":248,"line":778},20,[246,780,648],{"class":263},[246,782,784],{"class":248,"line":783},21,[246,785,287],{"emptyLinePlaceholder":286},[246,787,789],{"class":248,"line":788},22,[246,790,792],{"class":791},"sHwdD","\u002F\u002F Typed result — confirm() only accepts ProfileData\n",[246,794,796,798,800,803,805,808,810,813,815,818,821,823,825,827],{"class":248,"line":795},23,[246,797,704],{"class":293},[246,799,260],{"class":259},[246,801,802],{"class":263}," close",[246,804,397],{"class":259},[246,806,807],{"class":263}," confirm",[246,809,397],{"class":259},[246,811,812],{"class":263}," onBeforeClose ",[246,814,607],{"class":259},[246,816,817],{"class":259}," =",[246,819,820],{"class":624}," useModalContext",[246,822,325],{"class":259},[246,824,738],{"class":316},[246,826,342],{"class":259},[246,828,829],{"class":263},"()\n",[246,831,833],{"class":248,"line":832},24,[246,834,287],{"emptyLinePlaceholder":286},[246,836,838,840,843,845,847,849,851,853,855],{"class":248,"line":837},25,[246,839,704],{"class":293},[246,841,842],{"class":263}," form ",[246,844,375],{"class":259},[246,846,549],{"class":624},[246,848,325],{"class":259},[246,850,738],{"class":316},[246,852,342],{"class":259},[246,854,628],{"class":263},[246,856,857],{"class":259},"{\n",[246,859,861,863,865,868,870,872,874,877,880,883],{"class":248,"line":860},26,[246,862,673],{"class":328},[246,864,637],{"class":259},[246,866,867],{"class":263}," props",[246,869,212],{"class":259},[246,871,225],{"class":263},[246,873,212],{"class":259},[246,875,876],{"class":263},"name ",[246,878,879],{"class":259},"??",[246,881,882],{"class":259}," ''",[246,884,583],{"class":259},[246,886,888,890,892,894,896,898,900,903,905],{"class":248,"line":887},27,[246,889,684],{"class":328},[246,891,637],{"class":259},[246,893,867],{"class":263},[246,895,212],{"class":259},[246,897,225],{"class":263},[246,899,212],{"class":259},[246,901,902],{"class":263},"email ",[246,904,879],{"class":259},[246,906,907],{"class":259}," ''\n",[246,909,911,913],{"class":248,"line":910},28,[246,912,607],{"class":259},[246,914,648],{"class":263},[246,916,918],{"class":248,"line":917},29,[246,919,287],{"emptyLinePlaceholder":286},[246,921,923,925,928,930,932,934,936,939,941,943,945,948,950,952,954],{"class":248,"line":922},30,[246,924,704],{"class":293},[246,926,927],{"class":263}," errors ",[246,929,375],{"class":259},[246,931,549],{"class":624},[246,933,628],{"class":263},[246,935,631],{"class":259},[246,937,938],{"class":328}," name",[246,940,637],{"class":259},[246,942,882],{"class":259},[246,944,397],{"class":259},[246,946,947],{"class":328}," email",[246,949,637],{"class":259},[246,951,882],{"class":259},[246,953,267],{"class":259},[246,955,648],{"class":263},[246,957,959,961,964,966,968,970,974],{"class":248,"line":958},31,[246,960,704],{"class":293},[246,962,963],{"class":263}," submitting ",[246,965,375],{"class":259},[246,967,554],{"class":624},[246,969,628],{"class":263},[246,971,973],{"class":972},"sfNiH","false",[246,975,648],{"class":263},[246,977,979,981,984,986,988,990,993],{"class":248,"line":978},32,[246,980,704],{"class":293},[246,982,983],{"class":263}," serverError ",[246,985,375],{"class":259},[246,987,554],{"class":624},[246,989,628],{"class":263},[246,991,992],{"class":259},"''",[246,994,648],{"class":263},[246,996,998],{"class":248,"line":997},33,[246,999,287],{"emptyLinePlaceholder":286},[246,1001,1003,1005,1008,1010,1012],{"class":248,"line":1002},34,[246,1004,704],{"class":293},[246,1006,1007],{"class":263}," isDirty ",[246,1009,375],{"class":259},[246,1011,559],{"class":624},[246,1013,715],{"class":263},[246,1015,1017,1020],{"class":248,"line":1016},35,[246,1018,1019],{"class":259},"  ()",[246,1021,1022],{"class":293}," =>\n",[246,1024,1026,1029,1031,1033,1036,1039,1041,1043,1045,1047,1049,1051,1053],{"class":248,"line":1025},36,[246,1027,1028],{"class":263},"    form",[246,1030,212],{"class":259},[246,1032,876],{"class":263},[246,1034,1035],{"class":259},"!==",[246,1037,1038],{"class":263}," (props",[246,1040,212],{"class":259},[246,1042,225],{"class":263},[246,1044,212],{"class":259},[246,1046,876],{"class":263},[246,1048,879],{"class":259},[246,1050,882],{"class":259},[246,1052,773],{"class":263},[246,1054,1055],{"class":259},"||\n",[246,1057,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077,1079,1081],{"class":248,"line":1058},37,[246,1060,1028],{"class":263},[246,1062,212],{"class":259},[246,1064,902],{"class":263},[246,1066,1035],{"class":259},[246,1068,1038],{"class":263},[246,1070,212],{"class":259},[246,1072,225],{"class":263},[246,1074,212],{"class":259},[246,1076,902],{"class":263},[246,1078,879],{"class":259},[246,1080,882],{"class":259},[246,1082,648],{"class":263},[246,1084,1086],{"class":248,"line":1085},38,[246,1087,648],{"class":263},[246,1089,1091],{"class":248,"line":1090},39,[246,1092,287],{"emptyLinePlaceholder":286},[246,1094,1096],{"class":248,"line":1095},40,[246,1097,1098],{"class":791},"\u002F\u002F Guard: if the form is dirty, ask before closing\n",[246,1100,1102,1105,1107,1110,1112,1114],{"class":248,"line":1101},41,[246,1103,1104],{"class":624},"onBeforeClose",[246,1106,628],{"class":263},[246,1108,1109],{"class":293},"async",[246,1111,761],{"class":259},[246,1113,764],{"class":293},[246,1115,307],{"class":259},[246,1117,1119,1122,1124,1127,1130,1132,1135,1137,1140],{"class":248,"line":1118},42,[246,1120,1121],{"class":252},"  if",[246,1123,767],{"class":328},[246,1125,1126],{"class":259},"!",[246,1128,1129],{"class":263},"isDirty",[246,1131,212],{"class":259},[246,1133,1134],{"class":263},"value",[246,1136,773],{"class":328},[246,1138,1139],{"class":252},"return",[246,1141,1142],{"class":972}," true\n",[246,1144,1146,1149,1152,1154,1157,1159,1161,1164,1166],{"class":248,"line":1145},43,[246,1147,1148],{"class":252},"  return",[246,1150,1151],{"class":263}," window",[246,1153,212],{"class":259},[246,1155,1156],{"class":624},"confirm",[246,1158,628],{"class":328},[246,1160,304],{"class":259},[246,1162,1163],{"class":276},"You have unsaved changes. Discard them?",[246,1165,304],{"class":259},[246,1167,648],{"class":328},[246,1169,1171,1173],{"class":248,"line":1170},44,[246,1172,607],{"class":259},[246,1174,648],{"class":263},[246,1176,1178],{"class":248,"line":1177},45,[246,1179,287],{"emptyLinePlaceholder":286},[246,1181,1183,1186,1189,1192,1195],{"class":248,"line":1182},46,[246,1184,1185],{"class":293},"function",[246,1187,1188],{"class":624}," validate",[246,1190,1191],{"class":259},"():",[246,1193,1194],{"class":316}," boolean",[246,1196,307],{"class":259},[246,1198,1200,1203,1205,1208,1210,1213,1215,1217,1219,1222,1225,1228,1230,1233,1235,1238],{"class":248,"line":1199},47,[246,1201,1202],{"class":263},"  errors",[246,1204,212],{"class":259},[246,1206,1207],{"class":263},"name",[246,1209,817],{"class":259},[246,1211,1212],{"class":263}," form",[246,1214,212],{"class":259},[246,1216,1207],{"class":263},[246,1218,212],{"class":259},[246,1220,1221],{"class":624},"trim",[246,1223,1224],{"class":328},"() ",[246,1226,1227],{"class":259},"?",[246,1229,882],{"class":259},[246,1231,1232],{"class":259}," :",[246,1234,273],{"class":259},[246,1236,1237],{"class":276},"Name is required.",[246,1239,280],{"class":259},[246,1241,1243,1245,1247,1250,1252,1255,1258,1261,1264,1267,1270,1272,1274,1276,1279,1281,1283,1285,1288,1291,1293,1296,1298,1301,1303,1305],{"class":248,"line":1242},48,[246,1244,1202],{"class":263},[246,1246,212],{"class":259},[246,1248,1249],{"class":263},"email",[246,1251,817],{"class":259},[246,1253,1254],{"class":259}," \u002F",[246,1256,1257],{"class":252},"^",[246,1259,1260],{"class":259},"[^",[246,1262,1263],{"class":276},"\\s@",[246,1265,1266],{"class":259},"]+",[246,1268,1269],{"class":276},"@",[246,1271,1260],{"class":259},[246,1273,1263],{"class":276},[246,1275,1266],{"class":259},[246,1277,1278],{"class":263},"\\.",[246,1280,1260],{"class":259},[246,1282,1263],{"class":276},[246,1284,1266],{"class":259},[246,1286,1287],{"class":252},"$",[246,1289,1290],{"class":259},"\u002F",[246,1292,212],{"class":259},[246,1294,1295],{"class":624},"test",[246,1297,628],{"class":328},[246,1299,1300],{"class":263},"form",[246,1302,212],{"class":259},[246,1304,1249],{"class":263},[246,1306,648],{"class":328},[246,1308,1310,1313],{"class":248,"line":1309},49,[246,1311,1312],{"class":259},"    ?",[246,1314,907],{"class":259},[246,1316,1318,1321,1323,1326],{"class":248,"line":1317},50,[246,1319,1320],{"class":259},"    :",[246,1322,273],{"class":259},[246,1324,1325],{"class":276},"Enter a valid email address.",[246,1327,280],{"class":259},[246,1329,1331,1333,1336,1339,1341,1343,1346,1348,1350,1352],{"class":248,"line":1330},51,[246,1332,1148],{"class":252},[246,1334,1335],{"class":259}," !",[246,1337,1338],{"class":263},"errors",[246,1340,212],{"class":259},[246,1342,1207],{"class":263},[246,1344,1345],{"class":259}," &&",[246,1347,1335],{"class":259},[246,1349,1338],{"class":263},[246,1351,212],{"class":259},[246,1353,1354],{"class":263},"email\n",[246,1356,1358],{"class":248,"line":1357},52,[246,1359,351],{"class":259},[246,1361,1363],{"class":248,"line":1362},53,[246,1364,287],{"emptyLinePlaceholder":286},[246,1366,1368,1370,1373,1376,1378],{"class":248,"line":1367},54,[246,1369,1109],{"class":293},[246,1371,1372],{"class":293}," function",[246,1374,1375],{"class":624}," submit",[246,1377,746],{"class":259},[246,1379,307],{"class":259},[246,1381,1383,1386,1388,1390,1392],{"class":248,"line":1382},55,[246,1384,1385],{"class":263},"  serverError",[246,1387,212],{"class":259},[246,1389,1134],{"class":263},[246,1391,817],{"class":259},[246,1393,907],{"class":259},[246,1395,1397,1399,1401,1403,1406,1409],{"class":248,"line":1396},56,[246,1398,1121],{"class":252},[246,1400,767],{"class":328},[246,1402,1126],{"class":259},[246,1404,1405],{"class":624},"validate",[246,1407,1408],{"class":328},"()) ",[246,1410,1411],{"class":252},"return\n",[246,1413,1415],{"class":248,"line":1414},57,[246,1416,287],{"emptyLinePlaceholder":286},[246,1418,1420,1423,1425,1427,1429],{"class":248,"line":1419},58,[246,1421,1422],{"class":263},"  submitting",[246,1424,212],{"class":259},[246,1426,1134],{"class":263},[246,1428,817],{"class":259},[246,1430,1142],{"class":972},[246,1432,1434,1437],{"class":248,"line":1433},59,[246,1435,1436],{"class":252},"  try",[246,1438,307],{"class":259},[246,1440,1442,1445,1448,1450,1453,1455,1458,1460,1462],{"class":248,"line":1441},60,[246,1443,1444],{"class":252},"    await",[246,1446,1447],{"class":263}," api",[246,1449,212],{"class":259},[246,1451,1452],{"class":263},"users",[246,1454,212],{"class":259},[246,1456,1457],{"class":624},"updateProfile",[246,1459,628],{"class":328},[246,1461,1300],{"class":263},[246,1463,648],{"class":328},[246,1465,1467],{"class":248,"line":1466},61,[246,1468,1469],{"class":791},"    \u002F\u002F Resolve the modal with the saved data — bypass the dirty-form guard\n",[246,1471,1473],{"class":248,"line":1472},62,[246,1474,1475],{"class":791},"    \u002F\u002F since the changes have just been persisted\n",[246,1477,1479,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1511,1513,1516,1518,1521,1523],{"class":248,"line":1478},63,[246,1480,1481],{"class":624},"    confirm",[246,1483,628],{"class":328},[246,1485,631],{"class":259},[246,1487,938],{"class":328},[246,1489,637],{"class":259},[246,1491,1212],{"class":263},[246,1493,212],{"class":259},[246,1495,1207],{"class":263},[246,1497,397],{"class":259},[246,1499,947],{"class":328},[246,1501,637],{"class":259},[246,1503,1212],{"class":263},[246,1505,212],{"class":259},[246,1507,1249],{"class":263},[246,1509,1510],{"class":259}," },",[246,1512,260],{"class":259},[246,1514,1515],{"class":328}," ignoreGuard",[246,1517,637],{"class":259},[246,1519,1520],{"class":972}," true",[246,1522,267],{"class":259},[246,1524,648],{"class":328},[246,1526,1528,1531,1534,1536,1540,1542,1545,1548],{"class":248,"line":1527},64,[246,1529,1530],{"class":259},"  }",[246,1532,1533],{"class":252}," catch",[246,1535,767],{"class":259},[246,1537,1539],{"class":1538},"sHdIc","e",[246,1541,637],{"class":259},[246,1543,1544],{"class":316}," any",[246,1546,1547],{"class":259},")",[246,1549,307],{"class":259},[246,1551,1553,1556,1558,1560,1562,1565,1568,1571,1574,1576,1579],{"class":248,"line":1552},65,[246,1554,1555],{"class":263},"    serverError",[246,1557,212],{"class":259},[246,1559,1134],{"class":263},[246,1561,817],{"class":259},[246,1563,1564],{"class":263}," e",[246,1566,1567],{"class":259},"?.",[246,1569,1570],{"class":263},"message",[246,1572,1573],{"class":259}," ??",[246,1575,273],{"class":259},[246,1577,1578],{"class":276},"Something went wrong.",[246,1580,280],{"class":259},[246,1582,1584,1586,1589],{"class":248,"line":1583},66,[246,1585,1530],{"class":259},[246,1587,1588],{"class":252}," finally",[246,1590,307],{"class":259},[246,1592,1594,1597,1599,1601,1603],{"class":248,"line":1593},67,[246,1595,1596],{"class":263},"    submitting",[246,1598,212],{"class":259},[246,1600,1134],{"class":263},[246,1602,817],{"class":259},[246,1604,1605],{"class":972}," false\n",[246,1607,1609],{"class":248,"line":1608},68,[246,1610,1611],{"class":259},"  }\n",[246,1613,1615],{"class":248,"line":1614},69,[246,1616,351],{"class":259},[246,1618,1620,1622,1624],{"class":248,"line":1619},70,[246,1621,415],{"class":259},[246,1623,366],{"class":328},[246,1625,385],{"class":259},[246,1627,1629],{"class":248,"line":1628},71,[246,1630,287],{"emptyLinePlaceholder":286},[246,1632,1634,1636,1638],{"class":248,"line":1633},72,[246,1635,325],{"class":259},[246,1637,430],{"class":328},[246,1639,385],{"class":259},[246,1641,1643,1645,1648,1650,1652,1654,1657,1659],{"class":248,"line":1642},73,[246,1644,438],{"class":259},[246,1646,1647],{"class":328},"ModalRoot",[246,1649,477],{"class":293},[246,1651,375],{"class":259},[246,1653,378],{"class":259},[246,1655,1656],{"class":276},"flex items-center justify-center p-4",[246,1658,378],{"class":259},[246,1660,385],{"class":259},[246,1662,1664,1666,1669,1671,1673,1675,1678,1680],{"class":248,"line":1663},74,[246,1665,471],{"class":259},[246,1667,1668],{"class":328},"ModalContent",[246,1670,477],{"class":293},[246,1672,375],{"class":259},[246,1674,378],{"class":259},[246,1676,1677],{"class":276},"relative w-full max-w-md rounded-2xl bg-white shadow-2xl p-8 space-y-6",[246,1679,378],{"class":259},[246,1681,385],{"class":259},[246,1683,1685,1688,1691,1693,1695,1697,1700,1702,1704,1707,1709,1711],{"class":248,"line":1684},75,[246,1686,1687],{"class":259},"        \u003C",[246,1689,1690],{"class":328},"ModalTitle",[246,1692,477],{"class":293},[246,1694,375],{"class":259},[246,1696,378],{"class":259},[246,1698,1699],{"class":276},"text-xl font-bold text-gray-900",[246,1701,378],{"class":259},[246,1703,342],{"class":259},[246,1705,1706],{"class":263},"Edit profile",[246,1708,415],{"class":259},[246,1710,1690],{"class":328},[246,1712,385],{"class":259},[246,1714,1716],{"class":248,"line":1715},76,[246,1717,287],{"emptyLinePlaceholder":286},[246,1719,1721,1723,1725,1727,1729,1731,1734,1736,1739,1741,1743,1746,1748],{"class":248,"line":1720},77,[246,1722,1687],{"class":259},[246,1724,1300],{"class":328},[246,1726,477],{"class":293},[246,1728,375],{"class":259},[246,1730,378],{"class":259},[246,1732,1733],{"class":276},"space-y-4",[246,1735,378],{"class":259},[246,1737,1738],{"class":293}," @submit.prevent",[246,1740,375],{"class":259},[246,1742,378],{"class":259},[246,1744,1745],{"class":276},"submit",[246,1747,378],{"class":259},[246,1749,385],{"class":259},[246,1751,1753,1756,1759],{"class":248,"line":1752},78,[246,1754,1755],{"class":259},"          \u003C",[246,1757,1758],{"class":328},"div",[246,1760,385],{"class":259},[246,1762,1764,1767,1770,1772,1774,1776,1779,1781,1783,1786,1788,1790],{"class":248,"line":1763},79,[246,1765,1766],{"class":259},"            \u003C",[246,1768,1769],{"class":328},"label",[246,1771,477],{"class":293},[246,1773,375],{"class":259},[246,1775,378],{"class":259},[246,1777,1778],{"class":276},"block text-sm font-medium text-gray-700 mb-1",[246,1780,378],{"class":259},[246,1782,342],{"class":259},[246,1784,1785],{"class":263},"Name",[246,1787,415],{"class":259},[246,1789,1769],{"class":328},[246,1791,385],{"class":259},[246,1793,1795,1797],{"class":248,"line":1794},80,[246,1796,1766],{"class":259},[246,1798,1799],{"class":328},"input\n",[246,1801,1803,1806,1808,1810,1813],{"class":248,"line":1802},81,[246,1804,1805],{"class":293},"              v-model",[246,1807,375],{"class":259},[246,1809,378],{"class":259},[246,1811,1812],{"class":276},"form.name",[246,1814,1815],{"class":259},"\"\n",[246,1817,1819,1822,1824,1826,1829],{"class":248,"line":1818},82,[246,1820,1821],{"class":293},"              type",[246,1823,375],{"class":259},[246,1825,378],{"class":259},[246,1827,1828],{"class":276},"text",[246,1830,1815],{"class":259},[246,1832,1834,1837,1839,1841,1844],{"class":248,"line":1833},83,[246,1835,1836],{"class":293},"              class",[246,1838,375],{"class":259},[246,1840,378],{"class":259},[246,1842,1843],{"class":276},"w-full rounded-lg border px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-indigo-500",[246,1845,1815],{"class":259},[246,1847,1849,1852,1854,1856,1859],{"class":248,"line":1848},84,[246,1850,1851],{"class":293},"              :class",[246,1853,375],{"class":259},[246,1855,378],{"class":259},[246,1857,1858],{"class":276},"errors.name ? 'border-red-400' : 'border-gray-300'",[246,1860,1815],{"class":259},[246,1862,1864,1867,1869,1871,1874],{"class":248,"line":1863},85,[246,1865,1866],{"class":293},"              placeholder",[246,1868,375],{"class":259},[246,1870,378],{"class":259},[246,1872,1873],{"class":276},"Jane Doe",[246,1875,1815],{"class":259},[246,1877,1879],{"class":248,"line":1878},86,[246,1880,1881],{"class":259},"            \u002F>\n",[246,1883,1885,1887,1889,1892,1894,1896,1899,1901,1903,1905,1907,1910,1912,1914,1917,1919,1921],{"class":248,"line":1884},87,[246,1886,1766],{"class":259},[246,1888,198],{"class":328},[246,1890,1891],{"class":293}," v-if",[246,1893,375],{"class":259},[246,1895,378],{"class":259},[246,1897,1898],{"class":276},"errors.name",[246,1900,378],{"class":259},[246,1902,477],{"class":293},[246,1904,375],{"class":259},[246,1906,378],{"class":259},[246,1908,1909],{"class":276},"mt-1 text-xs text-red-500",[246,1911,378],{"class":259},[246,1913,342],{"class":259},[246,1915,1916],{"class":263},"{{ errors.name }}",[246,1918,415],{"class":259},[246,1920,198],{"class":328},[246,1922,385],{"class":259},[246,1924,1926,1929,1931],{"class":248,"line":1925},88,[246,1927,1928],{"class":259},"          \u003C\u002F",[246,1930,1758],{"class":328},[246,1932,385],{"class":259},[246,1934,1936],{"class":248,"line":1935},89,[246,1937,287],{"emptyLinePlaceholder":286},[246,1939,1941,1943,1945],{"class":248,"line":1940},90,[246,1942,1755],{"class":259},[246,1944,1758],{"class":328},[246,1946,385],{"class":259},[246,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1969,1971,1973],{"class":248,"line":1949},91,[246,1951,1766],{"class":259},[246,1953,1769],{"class":328},[246,1955,477],{"class":293},[246,1957,375],{"class":259},[246,1959,378],{"class":259},[246,1961,1778],{"class":276},[246,1963,378],{"class":259},[246,1965,342],{"class":259},[246,1967,1968],{"class":263},"Email",[246,1970,415],{"class":259},[246,1972,1769],{"class":328},[246,1974,385],{"class":259},[246,1976,1978,1980],{"class":248,"line":1977},92,[246,1979,1766],{"class":259},[246,1981,1799],{"class":328},[246,1983,1985,1987,1989,1991,1994],{"class":248,"line":1984},93,[246,1986,1805],{"class":293},[246,1988,375],{"class":259},[246,1990,378],{"class":259},[246,1992,1993],{"class":276},"form.email",[246,1995,1815],{"class":259},[246,1997,1999,2001,2003,2005,2007],{"class":248,"line":1998},94,[246,2000,1821],{"class":293},[246,2002,375],{"class":259},[246,2004,378],{"class":259},[246,2006,1249],{"class":276},[246,2008,1815],{"class":259},[246,2010,2012,2014,2016,2018,2020],{"class":248,"line":2011},95,[246,2013,1836],{"class":293},[246,2015,375],{"class":259},[246,2017,378],{"class":259},[246,2019,1843],{"class":276},[246,2021,1815],{"class":259},[246,2023,2025,2027,2029,2031,2034],{"class":248,"line":2024},96,[246,2026,1851],{"class":293},[246,2028,375],{"class":259},[246,2030,378],{"class":259},[246,2032,2033],{"class":276},"errors.email ? 'border-red-400' : 'border-gray-300'",[246,2035,1815],{"class":259},[246,2037,2039,2041,2043,2045,2048],{"class":248,"line":2038},97,[246,2040,1866],{"class":293},[246,2042,375],{"class":259},[246,2044,378],{"class":259},[246,2046,2047],{"class":276},"jane@example.com",[246,2049,1815],{"class":259},[246,2051,2053],{"class":248,"line":2052},98,[246,2054,1881],{"class":259},[246,2056,2058,2060,2062,2064,2066,2068,2071,2073,2075,2077,2079,2081,2083,2085,2088,2090,2092],{"class":248,"line":2057},99,[246,2059,1766],{"class":259},[246,2061,198],{"class":328},[246,2063,1891],{"class":293},[246,2065,375],{"class":259},[246,2067,378],{"class":259},[246,2069,2070],{"class":276},"errors.email",[246,2072,378],{"class":259},[246,2074,477],{"class":293},[246,2076,375],{"class":259},[246,2078,378],{"class":259},[246,2080,1909],{"class":276},[246,2082,378],{"class":259},[246,2084,342],{"class":259},[246,2086,2087],{"class":263},"{{ errors.email }}",[246,2089,415],{"class":259},[246,2091,198],{"class":328},[246,2093,385],{"class":259},[246,2095,2097,2099,2101],{"class":248,"line":2096},100,[246,2098,1928],{"class":259},[246,2100,1758],{"class":328},[246,2102,385],{"class":259},[246,2104,2106],{"class":248,"line":2105},101,[246,2107,287],{"emptyLinePlaceholder":286},[246,2109,2111,2113,2115,2117,2119,2121,2124,2126,2128,2130,2132,2135,2137],{"class":248,"line":2110},102,[246,2112,1755],{"class":259},[246,2114,198],{"class":328},[246,2116,1891],{"class":293},[246,2118,375],{"class":259},[246,2120,378],{"class":259},[246,2122,2123],{"class":276},"serverError",[246,2125,378],{"class":259},[246,2127,477],{"class":293},[246,2129,375],{"class":259},[246,2131,378],{"class":259},[246,2133,2134],{"class":276},"text-sm text-red-600 bg-red-50 rounded-lg px-3 py-2",[246,2136,378],{"class":259},[246,2138,385],{"class":259},[246,2140,2142],{"class":248,"line":2141},103,[246,2143,2144],{"class":263},"            {{ serverError }}\n",[246,2146,2148,2150,2152],{"class":248,"line":2147},104,[246,2149,1928],{"class":259},[246,2151,198],{"class":328},[246,2153,385],{"class":259},[246,2155,2157],{"class":248,"line":2156},105,[246,2158,287],{"emptyLinePlaceholder":286},[246,2160,2162,2164,2166,2168,2170,2172,2175,2177],{"class":248,"line":2161},106,[246,2163,1755],{"class":259},[246,2165,1758],{"class":328},[246,2167,477],{"class":293},[246,2169,375],{"class":259},[246,2171,378],{"class":259},[246,2173,2174],{"class":276},"flex justify-end gap-3 pt-2",[246,2176,378],{"class":259},[246,2178,385],{"class":259},[246,2180,2182,2184],{"class":248,"line":2181},107,[246,2183,1766],{"class":259},[246,2185,2186],{"class":328},"button\n",[246,2188,2190,2192,2194,2196,2199],{"class":248,"line":2189},108,[246,2191,1821],{"class":293},[246,2193,375],{"class":259},[246,2195,378],{"class":259},[246,2197,2198],{"class":276},"button",[246,2200,1815],{"class":259},[246,2202,2204,2206,2208,2210,2213],{"class":248,"line":2203},109,[246,2205,1836],{"class":293},[246,2207,375],{"class":259},[246,2209,378],{"class":259},[246,2211,2212],{"class":276},"rounded-lg px-4 py-2 text-sm font-medium text-gray-700 ring-1 ring-gray-300 hover:bg-gray-50",[246,2214,1815],{"class":259},[246,2216,2218,2221,2223,2225,2227],{"class":248,"line":2217},110,[246,2219,2220],{"class":293},"              @click",[246,2222,375],{"class":259},[246,2224,378],{"class":259},[246,2226,218],{"class":276},[246,2228,1815],{"class":259},[246,2230,2232],{"class":248,"line":2231},111,[246,2233,2234],{"class":259},"            >\n",[246,2236,2238],{"class":248,"line":2237},112,[246,2239,2240],{"class":263},"              Cancel\n",[246,2242,2244,2247,2249],{"class":248,"line":2243},113,[246,2245,2246],{"class":259},"            \u003C\u002F",[246,2248,2198],{"class":328},[246,2250,385],{"class":259},[246,2252,2254,2256],{"class":248,"line":2253},114,[246,2255,1766],{"class":259},[246,2257,2186],{"class":328},[246,2259,2261,2263,2265,2267,2269],{"class":248,"line":2260},115,[246,2262,1821],{"class":293},[246,2264,375],{"class":259},[246,2266,378],{"class":259},[246,2268,1745],{"class":276},[246,2270,1815],{"class":259},[246,2272,2274,2276,2278,2280,2283],{"class":248,"line":2273},116,[246,2275,1836],{"class":293},[246,2277,375],{"class":259},[246,2279,378],{"class":259},[246,2281,2282],{"class":276},"rounded-lg px-4 py-2 text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 disabled:opacity-50 flex items-center gap-2",[246,2284,1815],{"class":259},[246,2286,2288,2291,2293,2295,2298],{"class":248,"line":2287},117,[246,2289,2290],{"class":293},"              :disabled",[246,2292,375],{"class":259},[246,2294,378],{"class":259},[246,2296,2297],{"class":276},"submitting",[246,2299,1815],{"class":259},[246,2301,2303],{"class":248,"line":2302},118,[246,2304,2234],{"class":259},[246,2306,2308,2311,2314,2316,2318,2320,2322,2324,2326,2328,2330,2333,2335,2338,2340,2342,2345,2347,2350,2352,2354,2357,2359],{"class":248,"line":2307},119,[246,2309,2310],{"class":259},"              \u003C",[246,2312,2313],{"class":328},"svg",[246,2315,1891],{"class":293},[246,2317,375],{"class":259},[246,2319,378],{"class":259},[246,2321,2297],{"class":276},[246,2323,378],{"class":259},[246,2325,477],{"class":293},[246,2327,375],{"class":259},[246,2329,378],{"class":259},[246,2331,2332],{"class":276},"h-4 w-4 animate-spin",[246,2334,378],{"class":259},[246,2336,2337],{"class":293}," viewBox",[246,2339,375],{"class":259},[246,2341,378],{"class":259},[246,2343,2344],{"class":276},"0 0 24 24",[246,2346,378],{"class":259},[246,2348,2349],{"class":293}," fill",[246,2351,375],{"class":259},[246,2353,378],{"class":259},[246,2355,2356],{"class":276},"none",[246,2358,378],{"class":259},[246,2360,385],{"class":259},[246,2362,2364,2367,2370,2372,2374,2376,2379,2381,2384,2386,2388,2391,2393,2396,2398,2400,2402,2404,2407,2409,2411,2414,2416,2419,2421,2423,2426,2428,2431,2433,2435,2438,2440],{"class":248,"line":2363},120,[246,2365,2366],{"class":259},"                \u003C",[246,2368,2369],{"class":328},"circle",[246,2371,477],{"class":293},[246,2373,375],{"class":259},[246,2375,378],{"class":259},[246,2377,2378],{"class":276},"opacity-25",[246,2380,378],{"class":259},[246,2382,2383],{"class":293}," cx",[246,2385,375],{"class":259},[246,2387,378],{"class":259},[246,2389,2390],{"class":276},"12",[246,2392,378],{"class":259},[246,2394,2395],{"class":293}," cy",[246,2397,375],{"class":259},[246,2399,378],{"class":259},[246,2401,2390],{"class":276},[246,2403,378],{"class":259},[246,2405,2406],{"class":293}," r",[246,2408,375],{"class":259},[246,2410,378],{"class":259},[246,2412,2413],{"class":276},"10",[246,2415,378],{"class":259},[246,2417,2418],{"class":293}," stroke",[246,2420,375],{"class":259},[246,2422,378],{"class":259},[246,2424,2425],{"class":276},"currentColor",[246,2427,378],{"class":259},[246,2429,2430],{"class":293}," stroke-width",[246,2432,375],{"class":259},[246,2434,378],{"class":259},[246,2436,2437],{"class":276},"4",[246,2439,378],{"class":259},[246,2441,444],{"class":259},[246,2443,2445,2447,2450,2452,2454,2456,2459,2461,2463,2465,2467,2469,2471,2474,2476,2478,2481,2483],{"class":248,"line":2444},121,[246,2446,2366],{"class":259},[246,2448,2449],{"class":328},"path",[246,2451,477],{"class":293},[246,2453,375],{"class":259},[246,2455,378],{"class":259},[246,2457,2458],{"class":276},"opacity-75",[246,2460,378],{"class":259},[246,2462,2349],{"class":293},[246,2464,375],{"class":259},[246,2466,378],{"class":259},[246,2468,2425],{"class":276},[246,2470,378],{"class":259},[246,2472,2473],{"class":293}," d",[246,2475,375],{"class":259},[246,2477,378],{"class":259},[246,2479,2480],{"class":276},"M4 12a8 8 0 018-8v8H4z",[246,2482,378],{"class":259},[246,2484,444],{"class":259},[246,2486,2488,2491,2493],{"class":248,"line":2487},122,[246,2489,2490],{"class":259},"              \u003C\u002F",[246,2492,2313],{"class":328},[246,2494,385],{"class":259},[246,2496,2498],{"class":248,"line":2497},123,[246,2499,2500],{"class":263},"              Save changes\n",[246,2502,2504,2506,2508],{"class":248,"line":2503},124,[246,2505,2246],{"class":259},[246,2507,2198],{"class":328},[246,2509,385],{"class":259},[246,2511,2513,2515,2517],{"class":248,"line":2512},125,[246,2514,1928],{"class":259},[246,2516,1758],{"class":328},[246,2518,385],{"class":259},[246,2520,2522,2525,2527],{"class":248,"line":2521},126,[246,2523,2524],{"class":259},"        \u003C\u002F",[246,2526,1300],{"class":328},[246,2528,385],{"class":259},[246,2530,2532,2535,2537],{"class":248,"line":2531},127,[246,2533,2534],{"class":259},"    \u003C\u002F",[246,2536,1668],{"class":328},[246,2538,385],{"class":259},[246,2540,2542,2544,2546],{"class":248,"line":2541},128,[246,2543,494],{"class":259},[246,2545,1647],{"class":328},[246,2547,385],{"class":259},[246,2549,2551,2553,2555],{"class":248,"line":2550},129,[246,2552,415],{"class":259},[246,2554,430],{"class":328},[246,2556,385],{"class":259},[236,2558,2561],{"className":354,"code":2559,"filename":2560,"language":357,"meta":242,"style":242},"\u003Cscript setup lang=\"ts\">\nimport { openModal, ModalClosedError } from '@kolirt\u002Fvue-modal'\nimport EditProfileModal, { type ProfileData } from '.\u002FEditProfileModal.vue'\nimport { useToast } from '@\u002Fcomposables\u002FuseToast'\n\nconst toast = useToast()\nconst user = ref({ name: 'Jane Doe', email: 'jane@example.com' })\n\nasync function editProfile() {\n  try {\n    const saved = await openModal\u003CProfileData>(EditProfileModal, {\n      props: { initialValue: user.value }\n    })\n    \u002F\u002F saved is ProfileData — fully typed\n    user.value = saved\n    toast.success('Profile updated')\n  } catch (e) {\n    if (e instanceof ModalClosedError) return \u002F\u002F user cancelled — that's fine\n    toast.error('Unexpected error')\n  }\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cbutton @click=\"editProfile\">Edit profile\u003C\u002Fbutton>\n\u003C\u002Ftemplate>\n","ProfileSettings.vue (caller)",[209,2562,2563,2583,2607,2633,2653,2657,2670,2711,2715,2728,2734,2764,2787,2794,2799,2813,2834,2848,2869,2889,2893,2897,2905,2909,2917,2945],{"__ignoreMap":242},[246,2564,2565,2567,2569,2571,2573,2575,2577,2579,2581],{"class":248,"line":249},[246,2566,325],{"class":259},[246,2568,366],{"class":328},[246,2570,369],{"class":293},[246,2572,372],{"class":293},[246,2574,375],{"class":259},[246,2576,378],{"class":259},[246,2578,241],{"class":276},[246,2580,378],{"class":259},[246,2582,385],{"class":259},[246,2584,2585,2587,2589,2592,2594,2597,2599,2601,2603,2605],{"class":248,"line":283},[246,2586,253],{"class":252},[246,2588,260],{"class":259},[246,2590,2591],{"class":263}," openModal",[246,2593,397],{"class":259},[246,2595,2596],{"class":263}," ModalClosedError",[246,2598,267],{"class":259},[246,2600,270],{"class":252},[246,2602,273],{"class":259},[246,2604,277],{"class":276},[246,2606,280],{"class":259},[246,2608,2609,2611,2614,2616,2618,2620,2622,2624,2626,2628,2631],{"class":248,"line":290},[246,2610,253],{"class":252},[246,2612,2613],{"class":263}," EditProfileModal",[246,2615,397],{"class":259},[246,2617,260],{"class":259},[246,2619,256],{"class":252},[246,2621,665],{"class":263},[246,2623,267],{"class":259},[246,2625,270],{"class":252},[246,2627,273],{"class":259},[246,2629,2630],{"class":276},".\u002FEditProfileModal.vue",[246,2632,280],{"class":259},[246,2634,2635,2637,2639,2642,2644,2646,2648,2651],{"class":248,"line":310},[246,2636,253],{"class":252},[246,2638,260],{"class":259},[246,2640,2641],{"class":263}," useToast",[246,2643,267],{"class":259},[246,2645,270],{"class":252},[246,2647,273],{"class":259},[246,2649,2650],{"class":276},"@\u002Fcomposables\u002FuseToast",[246,2652,280],{"class":259},[246,2654,2655],{"class":248,"line":348},[246,2656,287],{"emptyLinePlaceholder":286},[246,2658,2659,2661,2664,2666,2668],{"class":248,"line":435},[246,2660,704],{"class":293},[246,2662,2663],{"class":263}," toast ",[246,2665,375],{"class":259},[246,2667,2641],{"class":624},[246,2669,829],{"class":263},[246,2671,2672,2674,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695,2697,2699,2701,2703,2705,2707,2709],{"class":248,"line":447},[246,2673,704],{"class":293},[246,2675,2676],{"class":263}," user ",[246,2678,375],{"class":259},[246,2680,554],{"class":624},[246,2682,628],{"class":263},[246,2684,631],{"class":259},[246,2686,938],{"class":328},[246,2688,637],{"class":259},[246,2690,273],{"class":259},[246,2692,1873],{"class":276},[246,2694,304],{"class":259},[246,2696,397],{"class":259},[246,2698,947],{"class":328},[246,2700,637],{"class":259},[246,2702,273],{"class":259},[246,2704,2047],{"class":276},[246,2706,304],{"class":259},[246,2708,267],{"class":259},[246,2710,648],{"class":263},[246,2712,2713],{"class":248,"line":468},[246,2714,287],{"emptyLinePlaceholder":286},[246,2716,2717,2719,2721,2724,2726],{"class":248,"line":491},[246,2718,1109],{"class":293},[246,2720,1372],{"class":293},[246,2722,2723],{"class":624}," editProfile",[246,2725,746],{"class":259},[246,2727,307],{"class":259},[246,2729,2730,2732],{"class":248,"line":501},[246,2731,1436],{"class":252},[246,2733,307],{"class":259},[246,2735,2736,2739,2742,2744,2747,2749,2751,2753,2755,2757,2760,2762],{"class":248,"line":651},[246,2737,2738],{"class":293},"    const",[246,2740,2741],{"class":263}," saved",[246,2743,817],{"class":259},[246,2745,2746],{"class":252}," await",[246,2748,2591],{"class":624},[246,2750,325],{"class":259},[246,2752,738],{"class":316},[246,2754,342],{"class":259},[246,2756,628],{"class":328},[246,2758,2759],{"class":263},"EditProfileModal",[246,2761,397],{"class":259},[246,2763,307],{"class":259},[246,2765,2766,2769,2771,2773,2775,2777,2780,2782,2784],{"class":248,"line":656},[246,2767,2768],{"class":328},"      props",[246,2770,637],{"class":259},[246,2772,260],{"class":259},[246,2774,727],{"class":328},[246,2776,637],{"class":259},[246,2778,2779],{"class":263}," user",[246,2781,212],{"class":259},[246,2783,1134],{"class":263},[246,2785,2786],{"class":259}," }\n",[246,2788,2789,2792],{"class":248,"line":670},[246,2790,2791],{"class":259},"    }",[246,2793,648],{"class":328},[246,2795,2796],{"class":248,"line":681},[246,2797,2798],{"class":791},"    \u002F\u002F saved is ProfileData — fully typed\n",[246,2800,2801,2804,2806,2808,2810],{"class":248,"line":691},[246,2802,2803],{"class":263},"    user",[246,2805,212],{"class":259},[246,2807,1134],{"class":263},[246,2809,817],{"class":259},[246,2811,2812],{"class":263}," saved\n",[246,2814,2815,2818,2820,2823,2825,2827,2830,2832],{"class":248,"line":696},[246,2816,2817],{"class":263},"    toast",[246,2819,212],{"class":259},[246,2821,2822],{"class":624},"success",[246,2824,628],{"class":328},[246,2826,304],{"class":259},[246,2828,2829],{"class":276},"Profile updated",[246,2831,304],{"class":259},[246,2833,648],{"class":328},[246,2835,2836,2838,2840,2842,2844,2846],{"class":248,"line":701},[246,2837,1530],{"class":259},[246,2839,1533],{"class":252},[246,2841,767],{"class":328},[246,2843,1539],{"class":263},[246,2845,773],{"class":328},[246,2847,857],{"class":259},[246,2849,2850,2853,2855,2857,2860,2862,2864,2866],{"class":248,"line":718},[246,2851,2852],{"class":252},"    if",[246,2854,767],{"class":328},[246,2856,1539],{"class":263},[246,2858,2859],{"class":259}," instanceof",[246,2861,2596],{"class":316},[246,2863,773],{"class":328},[246,2865,1139],{"class":252},[246,2867,2868],{"class":791}," \u002F\u002F user cancelled — that's fine\n",[246,2870,2871,2873,2875,2878,2880,2882,2885,2887],{"class":248,"line":751},[246,2872,2817],{"class":263},[246,2874,212],{"class":259},[246,2876,2877],{"class":624},"error",[246,2879,628],{"class":328},[246,2881,304],{"class":259},[246,2883,2884],{"class":276},"Unexpected error",[246,2886,304],{"class":259},[246,2888,648],{"class":328},[246,2890,2891],{"class":248,"line":778},[246,2892,1611],{"class":259},[246,2894,2895],{"class":248,"line":783},[246,2896,351],{"class":259},[246,2898,2899,2901,2903],{"class":248,"line":788},[246,2900,415],{"class":259},[246,2902,366],{"class":328},[246,2904,385],{"class":259},[246,2906,2907],{"class":248,"line":795},[246,2908,287],{"emptyLinePlaceholder":286},[246,2910,2911,2913,2915],{"class":248,"line":832},[246,2912,325],{"class":259},[246,2914,430],{"class":328},[246,2916,385],{"class":259},[246,2918,2919,2921,2923,2926,2928,2930,2933,2935,2937,2939,2941,2943],{"class":248,"line":837},[246,2920,438],{"class":259},[246,2922,2198],{"class":328},[246,2924,2925],{"class":293}," @click",[246,2927,375],{"class":259},[246,2929,378],{"class":259},[246,2931,2932],{"class":276},"editProfile",[246,2934,378],{"class":259},[246,2936,342],{"class":259},[246,2938,1706],{"class":263},[246,2940,415],{"class":259},[246,2942,2198],{"class":328},[246,2944,385],{"class":259},[246,2946,2947,2949,2951],{"class":248,"line":860},[246,2948,415],{"class":259},[246,2950,430],{"class":328},[246,2952,385],{"class":259},[231,2954,2956],{"id":2955},"how-onbeforeclose-works","How onBeforeClose works",[198,2958,2959,2962,2963,2967,2968,2970,2971,2973,2974,2976],{},[209,2960,2961],{},"onBeforeClose(handler)"," registers a guard that runs before the modal closes for ",[2964,2965,2966],"strong",{},"any"," reason — Esc, overlay click, or programmatic ",[209,2969,218],{},". Return ",[209,2972,973],{}," (or a promise resolving to ",[209,2975,973],{},") to cancel the close.",[236,2978,2980],{"className":238,"code":2979,"language":241,"meta":242,"style":242},"onBeforeClose(async () => {\n  if (!isDirty.value) return   \u002F\u002F allow close\n  return window.confirm('Discard changes?')\n  \u002F\u002F false → close is cancelled, true \u002F undefined → allowed\n})\n",[209,2981,2982,2996,3017,3038,3043],{"__ignoreMap":242},[246,2983,2984,2986,2988,2990,2992,2994],{"class":248,"line":249},[246,2985,1104],{"class":624},[246,2987,628],{"class":263},[246,2989,1109],{"class":293},[246,2991,761],{"class":259},[246,2993,764],{"class":293},[246,2995,307],{"class":259},[246,2997,2998,3000,3002,3004,3006,3008,3010,3012,3014],{"class":248,"line":283},[246,2999,1121],{"class":252},[246,3001,767],{"class":328},[246,3003,1126],{"class":259},[246,3005,1129],{"class":263},[246,3007,212],{"class":259},[246,3009,1134],{"class":263},[246,3011,773],{"class":328},[246,3013,1139],{"class":252},[246,3015,3016],{"class":791},"   \u002F\u002F allow close\n",[246,3018,3019,3021,3023,3025,3027,3029,3031,3034,3036],{"class":248,"line":290},[246,3020,1148],{"class":252},[246,3022,1151],{"class":263},[246,3024,212],{"class":259},[246,3026,1156],{"class":624},[246,3028,628],{"class":328},[246,3030,304],{"class":259},[246,3032,3033],{"class":276},"Discard changes?",[246,3035,304],{"class":259},[246,3037,648],{"class":328},[246,3039,3040],{"class":248,"line":310},[246,3041,3042],{"class":791},"  \u002F\u002F false → close is cancelled, true \u002F undefined → allowed\n",[246,3044,3045,3047],{"class":248,"line":348},[246,3046,607],{"class":259},[246,3048,648],{"class":263},[3050,3051,3053,3054,3056,3057,3059,3060,3062,3063,3066,3067,212],"callout",{"type":3052},"note","Both ",[209,3055,218],{}," and ",[209,3058,211],{}," run ",[209,3061,1104],{}," guards. To bypass them (e.g. on a successful save where you want to skip the dirty-check), pass ",[209,3064,3065],{},"{ ignoreGuard: true }",": ",[209,3068,3069],{},"confirm(data, { ignoreGuard: true })",[231,3071,3073],{"id":3072},"using-usemodal-for-repeated-opens","Using useModal for repeated opens",[198,3075,3076,3077,3080],{},"If you open the same form many times from one component, ",[209,3078,3079],{},"useModal"," keeps the handle reactive and cleans up on unmount:",[236,3082,3084],{"className":238,"code":3083,"language":241,"meta":242,"style":242},"const editModal = useModal\u003CProfileData>(EditProfileModal, {\n  props: { initialValue: user.value }\n})\n\n\u002F\u002F editModal.isOpen — reactive boolean\nawait editModal.open({ props: { initialValue: freshUser } })\n",[209,3085,3086,3111,3133,3139,3143,3148],{"__ignoreMap":242},[246,3087,3088,3090,3093,3095,3098,3100,3102,3104,3107,3109],{"class":248,"line":249},[246,3089,704],{"class":293},[246,3091,3092],{"class":263}," editModal ",[246,3094,375],{"class":259},[246,3096,3097],{"class":624}," useModal",[246,3099,325],{"class":259},[246,3101,738],{"class":316},[246,3103,342],{"class":259},[246,3105,3106],{"class":263},"(EditProfileModal",[246,3108,397],{"class":259},[246,3110,307],{"class":259},[246,3112,3113,3116,3118,3120,3122,3124,3126,3128,3131],{"class":248,"line":283},[246,3114,3115],{"class":328},"  props",[246,3117,637],{"class":259},[246,3119,260],{"class":259},[246,3121,727],{"class":328},[246,3123,637],{"class":259},[246,3125,2779],{"class":263},[246,3127,212],{"class":259},[246,3129,3130],{"class":263},"value ",[246,3132,351],{"class":259},[246,3134,3135,3137],{"class":248,"line":290},[246,3136,607],{"class":259},[246,3138,648],{"class":263},[246,3140,3141],{"class":248,"line":310},[246,3142,287],{"emptyLinePlaceholder":286},[246,3144,3145],{"class":248,"line":348},[246,3146,3147],{"class":791},"\u002F\u002F editModal.isOpen — reactive boolean\n",[246,3149,3150,3153,3156,3158,3161,3163,3165,3167,3169,3171,3173,3175,3178,3180,3182],{"class":248,"line":435},[246,3151,3152],{"class":252},"await",[246,3154,3155],{"class":263}," editModal",[246,3157,212],{"class":259},[246,3159,3160],{"class":624},"open",[246,3162,628],{"class":263},[246,3164,631],{"class":259},[246,3166,867],{"class":328},[246,3168,637],{"class":259},[246,3170,260],{"class":259},[246,3172,727],{"class":328},[246,3174,637],{"class":259},[246,3176,3177],{"class":263}," freshUser ",[246,3179,607],{"class":259},[246,3181,267],{"class":259},[246,3183,648],{"class":263},[231,3185,3187],{"id":3186},"related","Related",[202,3189,3190,3195,3200,3204],{},[205,3191,3192],{},[3193,3194,82],"a",{"href":83},[205,3196,3197],{},[3193,3198,3199],{"href":145},"API reference — composables",[205,3201,3202],{},[3193,3203,107],{"href":108},[205,3205,3206],{},[3193,3207,123],{"href":124},[3209,3210,3211],"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}",{"title":242,"searchDepth":283,"depth":283,"links":3213},[3214,3215,3216,3217,3218],{"id":233,"depth":283,"text":234},{"id":510,"depth":283,"text":511},{"id":2955,"depth":283,"text":2956},{"id":3072,"depth":283,"text":3073},{"id":3186,"depth":283,"text":3187},"A modal that hosts a form, returns validated data via confirm(data), and guards against accidental dirty-close.","md",null,{},{"title":111,"description":3219},"uTqvOD4hnnMKCOxEREHus9kOAdHZsB4ABS4CwnSl5Ag",[3226,3228],{"title":107,"path":108,"stem":109,"description":3227,"children":-1},"A reusable ConfirmDialog component paired with a confirm() helper that returns Promise\u003Cboolean>. Covers loading state and destructive variants.",{"title":115,"path":116,"stem":117,"description":3229,"children":-1},"A full-screen lightbox that navigates a list of images with arrow keys, closes on backdrop or Esc, and transitions instantly between images using replaceModal.",1779523619835]