{"version":3,"file":"BjPE5kFV.mjs","sources":["../../../../../../src/lib/unsaved-changes.ts"],"sourcesContent":["/**\n * v0.9.67 — Unsaved-changes registry.\n *\n * The update auto-apply flow (see `pwa/update-manager.ts`) needs\n * to know whether the user is mid-edit on a form. If they are,\n * auto-applying the SW update would reload the page and discard\n * their changes — bad UX. The right behavior is to show the\n * \"Update available\" banner and wait for the user to finish\n * (or click \"Update now\" explicitly).\n *\n * This module provides a tiny pubsub:\n *\n *   - `registerUnsavedChanges(key, label)` — called by a form on\n *     focus, dirty state change, etc. Pass an opaque key\n *     (usually a UUID generated per-form-instance) and a\n *     human-readable label for debugging.\n *   - `unregisterUnsavedChanges(key)` — called on submit, cancel,\n *     or navigation away.\n *   - `hasUnsavedChanges()` — returns the first registered key\n *     + label, or `null` if no unsaved state.\n *\n * The registry is intentionally global (module-level) so any\n * form on any page can register without prop-drilling. The\n * `key` is per-form-instance so two open forms don't collide.\n */\nimport { onDestroy } from 'svelte';\n\ninterface UnsavedEntry {\n\tkey: string;\n\tlabel: string;\n\tregisteredAt: number;\n}\n\nconst registry = new Map<string, UnsavedEntry>();\n\n/**\n * Register a form as having unsaved changes. Returns an\n * unregister fn. Caller MUST call unregister on submit/cancel/\n * navigation-away — `onDestroy` from Svelte 5 covers the\n * navigation-away case.\n */\nexport function registerUnsavedChanges(key: string, label: string): () => void {\n\tregistry.set(key, { key, label, registeredAt: Date.now() });\n\treturn () => unregisterUnsavedChanges(key);\n}\n\n/** Unregister by key. Idempotent — safe to call multiple times. */\nexport function unregisterUnsavedChanges(key: string): void {\n\tregistry.delete(key);\n}\n\n/**\n * Returns the first registered entry (any unsaved state), or\n * `null` if no forms have unsaved changes. The \"first\" order\n * is insertion order (Map semantics).\n */\nexport function getFirstUnsavedChanges(): { key: string; label: string } | null {\n\tconst first = registry.values().next().value;\n\tif (!first) return null;\n\treturn { key: first.key, label: first.label };\n}\n\n/** Count of registered unsaved forms. Used for debugging. */\nexport function unsavedChangesCount(): number {\n\treturn registry.size;\n}\n\n/**\n * Svelte 5 helper: register unsaved changes for the lifetime\n * of the calling component. The returned unregister fn is\n * wired to `onDestroy` automatically.\n *\n * Usage:\n *   onMount(() => {\n *     useUnsavedChangesForLifetime('parameter-1-2-note', 'Field note for parameter 1-2');\n *   });\n */\nexport function useUnsavedChangesForLifetime(key: string, label: string): void {\n\tregisterUnsavedChanges(key, label);\n\tonDestroy(() => {\n\t\tunregisterUnsavedChanges(key);\n\t});\n}\n\n/** Test-only: clear the registry. */\nexport function _resetUnsavedChangesForTesting(): void {\n\tregistry.clear();\n}\n"],"names":["registry","registerUnsavedChanges","key","label","unregisterUnsavedChanges","getFirstUnsavedChanges","first"],"mappings":"AAiCA,MAAMA,MAAe,IAQd,SAASC,EAAuBC,EAAaC,EAA2B,CAC9E,OAAAH,EAAS,IAAIE,EAAK,CAAE,IAAAA,EAAK,MAAAC,EAAO,aAAc,KAAK,IAAA,EAAO,EACnD,IAAMC,EAAyBF,CAAG,CAC1C,CAGO,SAASE,EAAyBF,EAAmB,CAC3DF,EAAS,OAAOE,CAAG,CACpB,CAOO,SAASG,GAAgE,CAC/E,MAAMC,EAAQN,EAAS,OAAA,EAAS,OAAO,MACvC,OAAKM,EACE,CAAE,IAAKA,EAAM,IAAK,MAAOA,EAAM,KAAA,EADnB,IAEpB"}