{"version":3,"sources":["/Users/gwakko/Projects/shared-websocket/dist/sync-vue.cjs","../src/adapters/vue/sync.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACA;ACLA;AACE;AACA;AACA;AACA;AACA;AAAA,0BAIK;AAKA,IAAM,WAAA,kBAAoC,MAAA,CAAO,SAAS,CAAA;AAS1D,SAAS,mBAAA,CAAoB,OAAA,EAAkB,OAAA,EAA+B;AACnF,EAAA,OAAO;AAAA,IACL,OAAA,CAAQ,GAAA,EAAU;AAChB,MAAA,MAAM,KAAA,EAAO,IAAI,8BAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AACzC,MAAA,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,IAAI,CAAA;AAE5B,MAAA,MAAM,gBAAA,EAAkB,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC5C,MAAA,GAAA,CAAI,QAAA,EAAU,CAAA,EAAA,GAAM;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AACrB,QAAA,eAAA,CAAgB,CAAA;AAAA,MAClB,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AACF;AASO,SAAS,iBAAA,CAAA,EAA6B;AAC3C,EAAA,MAAM,KAAA,EAAO,yBAAA,UAAiB,CAAA;AAC9B,EAAA,GAAA,CAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,+DAA+D,CAAA;AAAA,EACjF;AACA,EAAA,OAAO,IAAA;AACT;AAwBO,SAAS,UAAA,CAAc,GAAA,EAAa,YAAA,EAAiB,QAAA,EAAuC;AACjG,EAAA,MAAM,KAAA,EAAO,iBAAA,CAAkB,CAAA;AAC/B,EAAA,MAAM,MAAA,EAAQ,sBAAA,iBAAO,IAAA,CAAK,GAAA,CAAO,GAAG,CAAA,UAAK,cAAY,CAAA;AAErD,EAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,EAAA,CAAM,GAAA,EAAK,CAAC,CAAA,EAAA,GAAM;AACnC,IAAA,KAAA,CAAM,MAAA,EAAQ,CAAA;AACd,oBAAA,QAAA,wBAAA,CAAW,CAAC,GAAA;AAAA,EACd,CAAC,CAAA;AAED,EAAA,wBAAA;AAAA,IACE,KAAA;AAAA,IACA,CAAC,MAAA,EAAA,GAAW;AACV,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,EAAE,IAAA,EAAM,KAAK;AAAA,EACf,CAAA;AAEA,EAAA,8BAAA,KAAiB,CAAA;AACjB,EAAA,OAAO,KAAA;AACT;AASO,SAAS,eAAA,CAAmB,GAAA,EAAiC;AAClE,EAAA,MAAM,KAAA,EAAO,iBAAA,CAAkB,CAAA;AAC/B,EAAA,MAAM,MAAA,EAAQ,sBAAA,IAAmB,CAAK,GAAA,CAAO,GAAG,CAAC,CAAA;AAEjD,EAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,EAAA,CAAM,GAAA,EAAK,CAAC,CAAA,EAAA,GAAM;AACnC,IAAA,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,8BAAA,KAAiB,CAAA;AACjB,EAAA,OAAO,2BAAA,KAAc,CAAA;AACvB;AAUO,SAAS,kBAAA,CAAsB,GAAA,EAAa,QAAA,EAAoC;AACrF,EAAA,MAAM,KAAA,EAAO,iBAAA,CAAkB,CAAA;AAC/B,EAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,EAAA,CAAM,GAAA,EAAK,QAAQ,CAAA;AACtC,EAAA,8BAAA,KAAiB,CAAA;AACnB;AD9DA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,+PAAC","file":"/Users/gwakko/Projects/shared-websocket/dist/sync-vue.cjs","sourcesContent":[null,"import {\n  ref,\n  onUnmounted,\n  inject,\n  readonly,\n  watch,\n  type Ref,\n  type InjectionKey,\n  type App,\n} from 'vue';\nimport { TabSync } from '../../TabSync';\n\n// ─── Plugin ──────────────────────────────────────────────\n\nexport const TabSyncKey: InjectionKey<TabSync> = Symbol('TabSync');\n\n/**\n * Vue 3 plugin for TabSync.\n *\n * @example\n * const app = createApp(App);\n * app.use(createTabSyncPlugin('my-app'));\n */\nexport function createTabSyncPlugin(channel?: string, options?: { debug?: boolean }) {\n  return {\n    install(app: App) {\n      const sync = new TabSync(channel, options);\n      app.provide(TabSyncKey, sync);\n\n      const originalUnmount = app.unmount.bind(app);\n      app.unmount = () => {\n        sync[Symbol.dispose]();\n        originalUnmount();\n      };\n    },\n  };\n}\n\n/**\n * Access the TabSync instance from provided context.\n *\n * @example\n * const sync = useTabSyncContext();\n * sync.set('theme', 'dark');\n */\nexport function useTabSyncContext(): TabSync {\n  const sync = inject(TabSyncKey);\n  if (!sync) {\n    throw new Error('useTabSync: TabSync not provided. Did you install the plugin?');\n  }\n  return sync;\n}\n\n// ─── Composables ─────────────────────────────────────────\n\n/**\n * Two-way reactive state synced across tabs.\n * Mutating the ref broadcasts the change; changes from other tabs update the ref.\n *\n * @example\n * const theme = useTabSync('theme', 'light');\n * theme.value = 'dark'; // syncs to all tabs\n *\n * @example\n * // With side effect callback\n * const cart = useTabSync('cart', { items: [] }, (cart) => {\n *   document.title = `Cart (${cart.items.length})`;\n * });\n * cart.value = { items: [...cart.value.items, newItem] };\n *\n * @example\n * // Form draft synced across tabs\n * const draft = useTabSync('email-draft', '');\n * // <textarea v-model=\"draft\" />\n */\nexport function useTabSync<T>(key: string, initialValue: T, callback?: (value: T) => void): Ref<T> {\n  const sync = useTabSyncContext();\n  const value = ref<T>(sync.get<T>(key) ?? initialValue) as Ref<T>;\n\n  const unsub = sync.on<T>(key, (v) => {\n    value.value = v;\n    callback?.(v);\n  });\n\n  watch(\n    value,\n    (newVal) => {\n      sync.set(key, newVal);\n    },\n    { deep: true },\n  );\n\n  onUnmounted(unsub);\n  return value;\n}\n\n/**\n * Read-only subscription to a synced key. Returns undefined until first set.\n *\n * @example\n * const theme = useTabSyncValue<string>('theme');\n * // <div :class=\"theme === 'dark' ? 'dark' : 'light'\" />\n */\nexport function useTabSyncValue<T>(key: string): Ref<T | undefined> {\n  const sync = useTabSyncContext();\n  const value = ref<T | undefined>(sync.get<T>(key)) as Ref<T | undefined>;\n\n  const unsub = sync.on<T>(key, (v) => {\n    value.value = v;\n  });\n\n  onUnmounted(unsub);\n  return readonly(value) as Ref<T | undefined>;\n}\n\n/**\n * Fire-and-forget listener for a synced key. No ref, no return value.\n *\n * @example\n * useTabSyncCallback<string>('theme', (theme) => {\n *   document.documentElement.setAttribute('data-theme', theme);\n * });\n */\nexport function useTabSyncCallback<T>(key: string, callback: (value: T) => void): void {\n  const sync = useTabSyncContext();\n  const unsub = sync.on<T>(key, callback);\n  onUnmounted(unsub);\n}\n"]}