@basictech/react 0.12.0-beta.3 → 0.12.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/create-basic.tsx","../src/context.ts","../src/create-client.ts","../src/adapters/broadcast-channel.ts","../src/adapters/navigation.ts","../src/adapters/persistence.ts","../src/adapters/storage.ts","../src/adapters/token-store.ts","../src/adapters/upload.ts","../src/provider.tsx","../src/hooks/accounts.ts","../src/hooks/client.ts","../src/hooks/auth.ts","../src/hooks/basic.ts","../src/hooks/db.ts","../src/hooks/repos.ts","../src/hooks/status.ts","../src/hooks/files.ts","../src/hooks/mounts.ts","../src/hooks/query.ts","../src/hooks/profile.ts","../src/components.tsx"],"sourcesContent":["import { useContext, type ReactElement, type ReactNode } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n FileListQuery,\n InferValue,\n JsonObject,\n MountViewerFiles,\n MountsQuery,\n OwnerFiles,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\nimport { BasicProvider } from './provider'\nimport { useAccountsFor, type UseAccountsResult } from './hooks/accounts'\nimport { useAuthFor, type UseAuthResult } from './hooks/auth'\nimport { useBasicFor, type UseBasicResult } from './hooks/basic'\nimport { useCollectionFor } from './hooks/db'\nimport {\n useFilesFor,\n useStorageInfoFor,\n type UseFilesResult,\n type UseStorageInfoResult,\n} from './hooks/files'\nimport {\n useMountsFor,\n useOutgoingSharesFor,\n type UseMountsResult,\n type UseOutgoingSharesResult,\n} from './hooks/mounts'\nimport { useQueryFor, type UseQueryResult } from './hooks/query'\nimport { useReposFor, type UseReposResult } from './hooks/repos'\nimport { useProjectProfileFor, type UseProjectProfileResult } from './hooks/profile'\nimport { useSchemaStatusFor, useSyncStatusFor, type UseSyncStatusResult } from './hooks/status'\nimport type { SchemaStatus } from '@basictech/core'\n\nexport type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & { schema: S }\n\nexport interface BoundBasicProviderProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport interface CreatedBasic<S extends BasicSchema> {\n client: BasicClient<S>\n Provider(props: BoundBasicProviderProps): ReactElement\n useBasic(): UseBasicResult<S>\n useAuth(): UseAuthResult\n useAccounts(): UseAccountsResult\n useDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n useDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n useDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n useCollection<T extends TableNames<S>>(\n name: T,\n options?: { source?: SourceRef },\n ): Collection<InferValue<S, T> & JsonObject>\n useQuery<T extends TableNames<S>>(\n collection: T,\n query?: Query<InferValue<S, T> & JsonObject>,\n options?: { source?: SourceRef },\n ): UseQueryResult<InferValue<S, T> & JsonObject>\n useSyncStatus(source?: SourceRef): UseSyncStatusResult\n useSchemaStatus(source?: SourceRef): SchemaStatus\n useRepos(): UseReposResult\n useProjectProfile(enabled?: boolean): UseProjectProfileResult\n useFiles(query?: FileListQuery, options?: { source?: SourceRef }): UseFilesResult\n useStorageInfo(): UseStorageInfoResult\n useMounts(query?: MountsQuery): UseMountsResult<S>\n useOutgoingShares(): UseOutgoingSharesResult\n}\n\n/** Create one browser client and a complete hook surface bound to its schema. */\nexport function createBasic<const S extends BasicSchema>(config: CreateBasicConfig<S>): CreatedBasic<S> {\n const client = createBasicClient(config)\n\n function Provider({ children, renderWhileLoading }: BoundBasicProviderProps) {\n return (\n <BasicProvider client={client} renderWhileLoading={renderWhileLoading}>\n {children}\n </BasicProvider>\n )\n }\n\n /** The Provider owns start()/stop(); a bound hook outside it would read a client that never starts. */\n function useBound(): BasicClient<S> {\n if (useContext(BasicClientContext) !== client) {\n throw new Error('Bound Basic hooks must be used within their own <basic.Provider>')\n }\n return client\n }\n\n function useBoundDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n function useBoundDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n function useBoundDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n function useBoundDb(\n source: SourceRef = 'default',\n ): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useBound().db(source)\n }\n\n return {\n client,\n Provider,\n useBasic: () => useBasicFor(useBound()),\n useAuth: () => useAuthFor(useBound()),\n useAccounts: () => useAccountsFor(useBound()),\n useDb: useBoundDb,\n useCollection: (name, options = {}) => useCollectionFor(useBound(), name, options),\n useQuery: (collection, query = {}, options = {}) =>\n useQueryFor(useBound(), collection, query, options),\n useSyncStatus: (source) => useSyncStatusFor(useBound(), source),\n useSchemaStatus: (source = 'default') => useSchemaStatusFor(useBound(), source),\n useRepos: () => useReposFor(useBound()),\n useProjectProfile: (enabled) => useProjectProfileFor(useBound(), enabled),\n useFiles: (query = {}, options = {}) => useFilesFor(useBound(), query, options),\n useStorageInfo: () => useStorageInfoFor(useBound()),\n useMounts: (query = {}) => useMountsFor(useBound(), query),\n useOutgoingShares: () => useOutgoingSharesFor(useBound()),\n }\n}\n","import { createContext } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\n\nexport const BasicClientContext = createContext<BasicClient<BasicSchema> | null>(null)\n","import {\n MemoryKeyValueStorage,\n MemoryReplicaStoreFactory,\n createBasicClient as createCoreClient,\n type BasicClient,\n type BasicConfig,\n type BasicSchema,\n} from '@basictech/core'\nimport {\n createBrowserAuthChannelFactory,\n createBrowserMessageChannel,\n supportsAccessTokenAdoption,\n} from './adapters/broadcast-channel'\nimport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nimport { PersistenceStore } from './adapters/persistence'\nimport { browserStorage } from './adapters/storage'\nimport { BrowserTokenStore } from './adapters/token-store'\nimport { browserUploadTransport } from './adapters/upload'\n\nexport type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>\n\nfunction browserReconcileTrigger(listener: () => void): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const onVisible = () => {\n if (document.visibilityState === 'visible') listener()\n }\n window.addEventListener('focus', listener)\n window.addEventListener('online', listener)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', listener)\n window.removeEventListener('online', listener)\n document.removeEventListener('visibilitychange', onVisible)\n }\n}\n\n/** Create a core client with the complete browser adapter set installed. */\nexport function createBasicClient<S extends BasicSchema>(\n config: BrowserBasicConfig<S>,\n): BasicClient<S> {\n const local = browserStorage('localStorage') ?? new MemoryKeyValueStorage()\n const session = browserStorage('sessionStorage') ?? new MemoryKeyValueStorage()\n const tokenStore = config.tokenStore ?? new BrowserTokenStore(local)\n const canBroadcast = typeof BroadcastChannel !== 'undefined'\n const canPersistReplica = typeof indexedDB !== 'undefined'\n // Cross-tab auth always uses BroadcastChannel; access-token adoption is added\n // when the token store keeps access tokens in memory (the browser default).\n const messageChannel = !canBroadcast\n ? undefined\n : supportsAccessTokenAdoption(tokenStore)\n ? createBrowserAuthChannelFactory(tokenStore)\n : createBrowserMessageChannel\n\n return createCoreClient({\n ...config,\n kv: config.kv ?? local,\n tokenStore,\n sessionStorage: config.sessionStorage ?? session,\n replicaStore: config.replicaStore ?? (\n canPersistReplica ? new PersistenceStore(config.clientId) : new MemoryReplicaStoreFactory()\n ),\n navigate: config.navigate ?? browserNavigate,\n currentUrl: config.currentUrl ?? browserCurrentUrl,\n replaceUrl: config.replaceUrl ?? browserReplaceUrl,\n reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,\n createMessageChannel: config.createMessageChannel ?? messageChannel,\n uploadTransport: config.uploadTransport ?? (\n typeof XMLHttpRequest === 'undefined' ? undefined : browserUploadTransport\n ),\n })\n}\n","import type { AuthChannelContext, AuthMessageChannel } from '@basictech/core'\nimport type { BrowserTokenStore } from './token-store'\n\n/** The subset of BrowserTokenStore the auth channel needs; any token store providing it works. */\nexport type AccessTokenAdopter = Pick<BrowserTokenStore, 'accessToken' | 'adoptAccessToken'>\n\nexport function supportsAccessTokenAdoption(store: unknown): store is AccessTokenAdopter {\n const candidate = store as Partial<AccessTokenAdopter> | null\n return typeof candidate?.accessToken === 'function' && typeof candidate?.adoptAccessToken === 'function'\n}\n\nexport interface BrowserMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AccessTokenMessage {\n type?: string\n expiresAt?: number\n __basicAccessToken?: string\n __basicRefreshToken?: string\n}\n\n/** Core message-channel adapter backed by the browser BroadcastChannel API. */\nexport function createBrowserMessageChannel(name: string): BrowserMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: BrowserMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Access tokens may cross tabs transiently but are never written to browser\n * storage. The receiving adapter adopts the token before core handles the\n * ordinary token-rotation notification. Core supplies the token key for the\n * profile's auth channel; channels without a context (the accounts channel)\n * are plain BroadcastChannels.\n */\nexport function createBrowserAuthChannelFactory(\n tokenStore: AccessTokenAdopter,\n): (name: string, context?: AuthChannelContext) => AuthMessageChannel {\n return (name, context) => {\n const channel = createBrowserMessageChannel(name)\n if (!context) return channel\n const { tokenKey } = context\n const adapter: AuthMessageChannel = {\n postMessage: (message) => {\n const outgoing = message as AccessTokenMessage\n const access = outgoing?.type === 'tokens' ? tokenStore.accessToken(tokenKey) : null\n channel.postMessage(access ? {\n ...outgoing,\n expiresAt: access.expiresAt,\n __basicAccessToken: access.value,\n __basicRefreshToken: access.refreshToken,\n } satisfies AccessTokenMessage : message)\n },\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => {\n void (async () => {\n const incoming = event.data as AccessTokenMessage\n if (incoming?.type === 'tokens' && incoming.__basicAccessToken && incoming.__basicRefreshToken) {\n await tokenStore.adoptAccessToken(\n tokenKey,\n incoming.__basicAccessToken,\n incoming.expiresAt ?? 0,\n incoming.__basicRefreshToken,\n )\n }\n adapter.onmessage?.({ data: event.data })\n })()\n }\n return adapter\n }\n}\n","import { BasicError } from '@basictech/core'\n\nexport function browserNavigate(url: string): void {\n if (typeof location === 'undefined') throw new BasicError('NAVIGATE_ADAPTER_REQUIRED')\n location.assign(url)\n}\n\nexport function browserCurrentUrl(): string {\n return typeof location === 'undefined' ? '' : location.href\n}\n\nexport function browserReplaceUrl(url: string): void {\n if (typeof history !== 'undefined') history.replaceState({}, '', url)\n}\n","import Dexie, { type Table } from 'dexie'\nimport {\n BasicError,\n partitionKey,\n type PersistedReplicaState,\n type PersistenceLeaderHooks,\n type ReplicaStore,\n type ReplicaStoreFactory,\n type StoragePartition,\n type SyncOp,\n} from '@basictech/core'\n\nexport type { PersistedReplicaState, StoragePartition } from '@basictech/core'\n\ninterface PartitionRow {\n key: string\n profileId: string\n state: PersistedReplicaState\n updatedAt: number\n}\n\nexport interface ReplicaMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AvailableLock {\n name: string\n}\n\nexport interface BrowserLockManager {\n request<T>(\n name: string,\n options: { mode?: 'exclusive'; ifAvailable?: true },\n callback: (lock: AvailableLock | null) => T | Promise<T>,\n ): Promise<T>\n}\n\nexport interface PersistenceStoreOptions {\n locks?: BrowserLockManager | null\n createChannel?: ((name: string) => ReplicaMessageChannel) | null\n}\n\ntype CoordinatorMessage =\n | { type: 'mutation'; requestId: string; operation: SyncOp }\n | { type: 'mutation-result'; requestId: string; opId?: string; code?: string; message?: string }\n | { type: 'state'; state: PersistedReplicaState }\n\nfunction browserLocks(): BrowserLockManager | null {\n if (typeof navigator === 'undefined' || !navigator.locks) return null\n return navigator.locks as unknown as BrowserLockManager\n}\n\nfunction browserChannel(name: string): ReplicaMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: ReplicaMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Per-partition single-writer coordinator. With Web Locks, followers forward\n * mutations and consume committed-state broadcasts. Browsers lacking Locks\n * use the documented degraded last-committed-writer-wins mode: every tab may\n * write, the version guard rejects stale commits, and broadcasts refresh\n * surviving views. Concurrent offline intent can be lost in that fallback.\n */\nclass PartitionCoordinator implements PersistenceLeaderHooks {\n private readonly mutationListeners = new Set<(operation: SyncOp) => Promise<string>>()\n private readonly stateListeners = new Set<(state: PersistedReplicaState) => void>()\n private readonly leadershipListeners = new Set<(isLeader: boolean) => void | Promise<void>>()\n private readonly pending = new Map<string, {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n }>()\n private readonly election: Promise<boolean>\n private leadershipReady: Promise<void> = Promise.resolve()\n private releaseLock: (() => void) | null = null\n private leader = true\n private closed = false\n\n constructor(\n name: string,\n locks: BrowserLockManager | null,\n private readonly channel: ReplicaMessageChannel | null,\n ) {\n this.channel && (this.channel.onmessage = (event) => this.receive(event.data))\n if (!locks || !channel) {\n this.election = Promise.resolve(true)\n return\n }\n this.leader = false\n this.election = new Promise<boolean>((resolve) => {\n void locks.request(`basic-replica:${name}`, { ifAvailable: true }, async (lock) => {\n this.setLeader(Boolean(lock))\n resolve(this.leader)\n if (!lock) {\n this.waitForLeadership(locks, name)\n return\n }\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n }).catch(() => {\n this.setLeader(true)\n resolve(true)\n })\n })\n }\n\n async isLeader(): Promise<boolean> {\n await this.election\n await this.leadershipReady\n return this.leader\n }\n\n subscribeLeadership(listener: (isLeader: boolean) => void | Promise<void>): () => void {\n this.leadershipListeners.add(listener)\n return () => this.leadershipListeners.delete(listener)\n }\n\n async forwardMutation(operation: SyncOp): Promise<string> {\n if (await this.isLeader()) return this.dispatchMutation(operation)\n if (this.closed) throw new BasicError('PARTITION_COORDINATOR_CLOSED')\n if (!this.channel) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n const requestId = crypto.randomUUID()\n return new Promise<string>((resolve, reject) => {\n const flight = { operation, resolve, reject, deadline: Date.now() + 10_000 }\n this.pending.set(requestId, flight)\n this.sendPending(requestId, flight)\n })\n }\n\n subscribeMutations(listener: (operation: SyncOp) => Promise<string>): () => void {\n this.mutationListeners.add(listener)\n return () => this.mutationListeners.delete(listener)\n }\n\n publishState(state: PersistedReplicaState): void {\n this.channel?.postMessage({ type: 'state', state } satisfies CoordinatorMessage)\n }\n\n subscribeState(listener: (state: PersistedReplicaState) => void): () => void {\n this.stateListeners.add(listener)\n return () => this.stateListeners.delete(listener)\n }\n\n close(): void {\n this.closed = true\n this.setLeader(false)\n this.releaseLock?.()\n this.releaseLock = null\n this.channel?.close()\n for (const flight of this.pending.values()) {\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(new BasicError('PARTITION_COORDINATOR_CLOSED'))\n }\n this.pending.clear()\n }\n\n private waitForLeadership(locks: BrowserLockManager, name: string): void {\n void locks.request(`basic-replica:${name}`, { mode: 'exclusive' }, async (lock) => {\n if (!lock || this.closed) return\n this.setLeader(true)\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n this.setLeader(false)\n }).catch(() => {\n if (!this.closed) this.setLeader(true)\n })\n }\n\n private setLeader(isLeader: boolean): void {\n if (this.leader === isLeader) return\n this.leader = isLeader\n this.leadershipReady = Promise.all(\n [...this.leadershipListeners].map((listener) => listener(isLeader)),\n ).then(() => {})\n if (isLeader) void this.leadershipReady.then(() => this.drainPending()).catch(() => {})\n }\n\n private receive(value: unknown): void {\n if (this.closed || !value || typeof value !== 'object') return\n const message = value as CoordinatorMessage\n if (message.type === 'state') {\n for (const listener of this.stateListeners) listener(structuredClone(message.state))\n } else if (message.type === 'mutation' && this.leader) {\n void this.leadershipReady.then(() => this.dispatchMutation(message.operation)).then(\n (opId) => this.channel?.postMessage({\n type: 'mutation-result', requestId: message.requestId, opId,\n } satisfies CoordinatorMessage),\n (error: unknown) => this.channel?.postMessage({\n type: 'mutation-result',\n requestId: message.requestId,\n code: error instanceof BasicError ? error.code : 'FORWARDED_MUTATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n } satisfies CoordinatorMessage),\n )\n } else if (message.type === 'mutation-result') {\n const flight = this.pending.get(message.requestId)\n if (!flight) return\n if (!message.opId && (message.code === 'STALE_STATE_VERSION' ||\n message.code === 'PARTITION_LEADER_UNAVAILABLE')) {\n this.sendPending(message.requestId, flight)\n return\n }\n this.pending.delete(message.requestId)\n if (flight.timer) clearTimeout(flight.timer)\n if (message.opId) flight.resolve(message.opId)\n else flight.reject(new BasicError(message.code ?? 'FORWARDED_MUTATION_FAILED', message.message))\n }\n }\n\n private async dispatchMutation(operation: SyncOp): Promise<string> {\n const listener = this.mutationListeners.values().next().value\n if (!listener) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n return listener(operation)\n }\n\n private drainPending(): void {\n for (const [requestId, flight] of this.pending) {\n void this.dispatchMutation(flight.operation).then(\n (opId) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.resolve(opId)\n },\n (error: unknown) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(error instanceof Error ? error : new BasicError('FORWARDED_MUTATION_FAILED'))\n },\n )\n }\n }\n\n private sendPending(\n requestId: string,\n flight: {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n },\n ): void {\n if (this.pending.get(requestId) !== flight) return\n if (flight.timer) clearTimeout(flight.timer)\n const remaining = flight.deadline - Date.now()\n if (remaining <= 0) {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_TIMEOUT'))\n return\n }\n try {\n this.channel?.postMessage({\n type: 'mutation', requestId, operation: flight.operation,\n } satisfies CoordinatorMessage)\n } catch {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_UNAVAILABLE'))\n return\n }\n flight.timer = setTimeout(() => this.sendPending(requestId, flight), Math.min(100, remaining))\n }\n}\n\nclass DexieReplicaStore implements ReplicaStore {\n constructor(\n private readonly table: Table<PartitionRow, string>,\n readonly partition: StoragePartition,\n readonly key: string,\n readonly leader: PartitionCoordinator,\n ) {}\n\n async load(): Promise<PersistedReplicaState | null> {\n return (await this.table.get(this.key))?.state ?? null\n }\n\n async save(state: PersistedReplicaState): Promise<void> {\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new BasicError('INVALID_STATE_VERSION')\n }\n await this.table.db.transaction('rw', this.table, async () => {\n const current = await this.table.get(this.key)\n if ((current?.state.version ?? 0) >= state.version) throw new BasicError('STALE_STATE_VERSION')\n await this.table.put({\n key: this.key,\n profileId: this.partition.profileId,\n state: structuredClone(state),\n updatedAt: Date.now(),\n })\n })\n this.leader.publishState(structuredClone(state))\n }\n\n async delete(): Promise<void> {\n await this.table.delete(this.key)\n }\n}\n\n/** Dexie adapter for core's six-field, version-guarded replica store. */\nexport class PersistenceStore implements ReplicaStoreFactory {\n private readonly db: Dexie\n private readonly stores = new Map<string, DexieReplicaStore>()\n private readonly locks: BrowserLockManager | null\n private readonly createChannel: ((name: string) => ReplicaMessageChannel) | null\n private opened = false\n\n constructor(appKey: string, options: PersistenceStoreOptions = {}) {\n this.db = new Dexie(`basic:${appKey}`)\n this.db.version(1).stores({ partitions: 'key' })\n this.db.version(2).stores({ partitions: 'key,profileId' }).upgrade((transaction) =>\n transaction.table('partitions').clear())\n this.locks = options.locks === undefined ? browserLocks() : options.locks\n this.createChannel = options.createChannel === undefined\n ? (typeof BroadcastChannel === 'undefined' ? null : browserChannel)\n : options.createChannel\n }\n\n private get partitions(): Table<PartitionRow, string> {\n return this.db.table<PartitionRow, string>('partitions')\n }\n\n async open(): Promise<void> {\n if (this.opened) return\n await cleanupLegacyState()\n await this.db.open()\n this.opened = true\n }\n\n forPartition(partition: StoragePartition): ReplicaStore {\n const key = partitionKey(partition)\n let store = this.stores.get(key)\n if (!store) {\n const channelName = `basic-replica:${this.db.name}:${key}`\n const channel = this.createChannel?.(channelName) ?? null\n const leader = new PartitionCoordinator(channelName, this.locks, channel)\n store = new DexieReplicaStore(this.partitions, { ...partition }, key, leader)\n this.stores.set(key, store)\n }\n return store\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.partitions.where('profileId').equals(profileId).delete()\n for (const [key, store] of this.stores) {\n if (store.partition.profileId !== profileId) continue\n store.leader.close()\n this.stores.delete(key)\n }\n }\n\n close(): void {\n for (const store of this.stores.values()) store.leader.close()\n this.stores.clear()\n if (this.opened) this.db.close()\n this.opened = false\n }\n}\n\n/** Best-effort cleanup of pre-repo-era IndexedDB databases. */\nexport async function cleanupLegacyState(): Promise<void> {\n try {\n const idb = (globalThis as { indexedDB?: IDBFactory }).indexedDB\n if (!idb || typeof idb.databases !== 'function') return\n for (const info of await idb.databases()) {\n if (!info.name?.startsWith('basic-sync:')) continue\n await new Promise<void>((resolve) => {\n const request = idb.deleteDatabase(info.name!)\n request.onsuccess = request.onerror = request.onblocked = () => resolve()\n })\n }\n } catch {\n // Legacy cleanup is deliberately best effort.\n }\n}\n","import type { KeyValueStorage } from '@basictech/core'\n\n/** Synchronous browser Storage adapted to core's key-value contract. */\nexport class BrowserKeyValueStorage implements KeyValueStorage {\n constructor(private readonly storage: Storage) {}\n\n get(key: string): string | null {\n return this.storage.getItem(key)\n }\n\n set(key: string, value: string): void {\n this.storage.setItem(key, value)\n }\n\n remove(key: string): void {\n this.storage.removeItem(key)\n }\n}\n\nexport function browserStorage(\n name: 'localStorage' | 'sessionStorage',\n): BrowserKeyValueStorage | null {\n try {\n const storage = globalThis[name]\n return storage ? new BrowserKeyValueStorage(storage) : null\n } catch {\n return null\n }\n}\n","import type { KeyValueStorage, TokenSet, TokenStore } from '@basictech/core'\n\nconst ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100\n\ninterface MemoryAccessToken {\n value: string\n expiresAt: number\n refreshToken: string\n}\n\ninterface AccessWaiter {\n refreshToken: string\n resolve(access: MemoryAccessToken | null): void\n}\n\ntype PersistedTokenSet = Omit<TokenSet, 'access_token' | 'expires_at'>\n\nfunction parseTokens(value: string | null): Partial<TokenSet> | null {\n if (!value) return null\n try {\n const parsed = JSON.parse(value) as Partial<TokenSet>\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * Browser token policy: refresh tokens survive reloads in the supplied\n * persistent store; access tokens exist only in this JavaScript realm.\n */\nexport class BrowserTokenStore implements TokenStore {\n private readonly accessTokens = new Map<string, MemoryAccessToken>()\n private readonly accessWaiters = new Map<string, AccessWaiter[]>()\n\n constructor(private readonly persistent: KeyValueStorage) {}\n\n async get(key: string): Promise<string | null> {\n const persisted = parseTokens(await this.persistent.get(key))\n if (!persisted?.refresh_token || typeof persisted.token_type !== 'string') return null\n const refreshToken = persisted.refresh_token\n let access = this.accessTokens.get(key)\n if (access && access.refreshToken !== refreshToken) {\n access = await this.waitForAccessToken(key, refreshToken) ?? undefined\n }\n return JSON.stringify({\n ...persisted,\n access_token: access?.refreshToken === refreshToken ? access.value : '',\n expires_at: access?.refreshToken === refreshToken ? access.expiresAt : 0,\n token_type: persisted.token_type,\n refresh_token: refreshToken,\n } satisfies TokenSet)\n }\n\n async set(key: string, value: string): Promise<void> {\n const tokens = parseTokens(value)\n if (!tokens?.refresh_token || typeof tokens.access_token !== 'string' ||\n typeof tokens.token_type !== 'string') {\n throw new TypeError('invalid token set')\n }\n this.accessTokens.set(key, {\n value: tokens.access_token,\n expiresAt: tokens.expires_at ?? 0,\n refreshToken: tokens.refresh_token,\n })\n const { access_token: _accessToken, expires_at: _expiresAt, ...persisted } = tokens\n await this.persistent.set(key, JSON.stringify(persisted satisfies Partial<PersistedTokenSet>))\n this.resolveAccessWaiters(key)\n }\n\n async remove(key: string): Promise<void> {\n this.accessTokens.delete(key)\n for (const waiter of this.accessWaiters.get(key) ?? []) waiter.resolve(null)\n this.accessWaiters.delete(key)\n await this.persistent.remove(key)\n }\n\n accessToken(key: string): MemoryAccessToken | null {\n return this.accessTokens.get(key) ?? null\n }\n\n async adoptAccessToken(\n key: string,\n value: string,\n expiresAt: number,\n refreshToken: string,\n ): Promise<void> {\n if (!value) return\n const persisted = parseTokens(await this.persistent.get(key))\n if (persisted?.refresh_token !== refreshToken) return\n this.accessTokens.set(key, { value, expiresAt, refreshToken })\n this.resolveAccessWaiters(key)\n }\n\n private resolveAccessWaiters(key: string): void {\n const access = this.accessTokens.get(key)\n if (!access) return\n const waiting = this.accessWaiters.get(key) ?? []\n const remaining = waiting.filter((waiter) => {\n if (waiter.refreshToken !== access.refreshToken) return true\n waiter.resolve(access)\n return false\n })\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n }\n\n private waitForAccessToken(key: string, refreshToken: string): Promise<MemoryAccessToken | null> {\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const waiter: AccessWaiter = {\n refreshToken,\n resolve: (access) => {\n clearTimeout(timer)\n resolve(access)\n },\n }\n const waiters = this.accessWaiters.get(key) ?? []\n waiters.push(waiter)\n this.accessWaiters.set(key, waiters)\n timer = setTimeout(() => {\n const remaining = (this.accessWaiters.get(key) ?? [])\n .filter((candidate) => candidate !== waiter)\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n resolve(null)\n }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS)\n })\n }\n}\n","import {\n BasicError,\n type UploadTransportAdapter,\n type UploadTransportRequest,\n} from '@basictech/core'\n\nfunction responseHeaders(xhr: XMLHttpRequest): Headers {\n const headers = new Headers()\n for (const line of xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/)) {\n if (!line) continue\n const separator = line.indexOf(':')\n if (separator > 0) headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n }\n return headers\n}\n\n/** Browser multipart transport with upload progress, adapted from the Drive UI. */\nexport const browserUploadTransport: UploadTransportAdapter = {\n upload(request: UploadTransportRequest): Promise<Response> {\n if (typeof XMLHttpRequest === 'undefined') {\n return Promise.reject(new BasicError('XHR_UNAVAILABLE'))\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n let settled = false\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n if (request.signal) request.signal.removeEventListener('abort', abort)\n callback()\n }\n const abort = () => xhr.abort()\n\n xhr.open('POST', request.url)\n if (request.accessToken) xhr.setRequestHeader('authorization', `Bearer ${request.accessToken}`)\n xhr.setRequestHeader('idempotency-key', request.idempotencyKey)\n if (request.onProgress) {\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) request.onProgress?.(event.loaded, event.total)\n }\n }\n if (request.signal) {\n if (request.signal.aborted) {\n reject(request.signal.reason ?? new DOMException('Aborted', 'AbortError'))\n return\n }\n request.signal.addEventListener('abort', abort, { once: true })\n }\n xhr.onload = () => finish(() => resolve(new Response(xhr.responseText || null, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: responseHeaders(xhr),\n })))\n xhr.onerror = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload could not reach the server')))\n xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException('Aborted', 'AbortError')))\n xhr.ontimeout = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload timed out')))\n\n const form = new FormData()\n form.append('path', request.path)\n if (request.name !== undefined) form.append('name', request.name)\n if (request.mtime !== undefined) form.append('mtime', String(request.mtime))\n form.append('file', request.file, request.filename)\n xhr.send(form)\n })\n },\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\n\ninterface ProviderChildrenProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport type BasicProviderProps<S extends BasicSchema = BasicSchema> = ProviderChildrenProps & (\n | { client: BasicClient<S> }\n | (BrowserBasicConfig<S> & { client?: never })\n)\n\ninterface ClientLifecycle {\n references: number\n start: Promise<void> | null\n stopTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst clientLifecycles = new WeakMap<BasicClient<BasicSchema>, ClientLifecycle>()\n\nfunction retainClient(client: BasicClient<BasicSchema>): {\n started: Promise<void>\n release: () => void\n} {\n let lifecycle = clientLifecycles.get(client)\n if (!lifecycle) {\n lifecycle = { references: 0, start: null, stopTimer: null }\n clientLifecycles.set(client, lifecycle)\n }\n lifecycle.references += 1\n if (lifecycle.stopTimer) {\n clearTimeout(lifecycle.stopTimer)\n lifecycle.stopTimer = null\n }\n lifecycle.start ??= Promise.resolve(client.start()).catch((error: unknown) => {\n lifecycle!.start = null\n throw error\n })\n\n let released = false\n return {\n started: lifecycle.start,\n release: () => {\n if (released) return\n released = true\n lifecycle!.references = Math.max(0, lifecycle!.references - 1)\n if (lifecycle!.references > 0 || lifecycle!.stopTimer) return\n lifecycle!.stopTimer = setTimeout(() => {\n lifecycle!.stopTimer = null\n if (lifecycle!.references > 0) return\n const started = lifecycle!.start ?? Promise.resolve()\n void started.catch(() => {}).then(() => {\n if (lifecycle!.references > 0) return\n client.stop()\n lifecycle!.start = null\n })\n }, 0)\n },\n }\n}\n\n/** Generic provider for schema-less or explicitly generic applications. */\nexport function BasicProvider<S extends BasicSchema = BasicSchema>(props: BasicProviderProps<S>) {\n const clientRef = useRef<BasicClient<S> | null>(null)\n if (!clientRef.current) {\n if ('client' in props && props.client) {\n clientRef.current = props.client\n } else {\n const { children: _children, renderWhileLoading: _renderWhileLoading, ...config } = props\n clientRef.current = createBasicClient(config as BrowserBasicConfig<S>)\n }\n }\n const client = clientRef.current\n const [startError, setStartError] = useState<unknown>(null)\n\n useEffect(() => {\n let active = true\n const retained = retainClient(client as BasicClient<BasicSchema>)\n void retained.started.catch((error: unknown) => {\n if (active) setStartError(error)\n })\n return () => {\n active = false\n retained.release()\n }\n }, [client])\n\n const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n if (startError) throw startError\n\n return (\n <BasicClientContext.Provider value={client as BasicClient<BasicSchema>}>\n {(snapshot.isReady || props.renderWhileLoading) && props.children}\n </BasicClientContext.Provider>\n )\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicAccount, BasicClient, BasicProfile, BasicSchema } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAccountsResult {\n accounts: BasicAccount[]\n activeAccount: BasicAccount | null\n switchAccount(id: string): Promise<void>\n addAccount(options?: { signIn?: boolean }): Promise<BasicProfile>\n removeAccount(id: string): Promise<void>\n}\n\nexport function useAccountsFor<S extends BasicSchema>(client: BasicClient<S>): UseAccountsResult {\n const snapshot = useClientSnapshot(client)\n const switchAccount = useCallback((id: string) => client.switchAccount(id), [client])\n const addAccount = useCallback((options?: { signIn?: boolean }) => client.addAccount(options), [client])\n const removeAccount = useCallback((id: string) => client.removeAccount(id), [client])\n\n return useMemo(() => ({\n accounts: snapshot.accounts,\n activeAccount: snapshot.activeAccount,\n switchAccount,\n addAccount,\n removeAccount,\n }), [snapshot.accounts, snapshot.activeAccount, switchAccount, addAccount, removeAccount])\n}\n\nexport function useAccounts(): UseAccountsResult {\n return useAccountsFor(useRequiredClient())\n}\n","import { useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicClientSnapshot,\n type BasicSchema,\n} from '@basictech/core'\nimport { BasicClientContext } from '../context'\n\nexport interface AsyncResult<T> {\n data: T\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useRequiredClient<S extends BasicSchema = BasicSchema>(): BasicClient<S> {\n const client = useContext(BasicClientContext)\n if (!client) throw new Error('Basic hooks must be used within a <BasicProvider>')\n return client as unknown as BasicClient<S>\n}\n\nexport function useClientSnapshot<S extends BasicSchema>(\n client: BasicClient<S>,\n): BasicClientSnapshot {\n return useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n}\n\n/**\n * Server-backed lists need a signed-in account. While one is missing, the hook\n * reports the read-only reason as its error instead of an indistinguishable empty list.\n * This prerequisite error is stable within each hook. It is distinct from the\n * raw auth diagnostic (for example invalid_grant) exposed by useAuth().error.\n */\nexport function useSignInGate(snapshot: BasicClientSnapshot): BasicError | null {\n const code = snapshot.isReady && !snapshot.isSignedIn\n ? snapshot.readOnlyReason ?? 'AUTHORIZATION_REQUIRED'\n : null\n return useMemo(() => code === null ? null : new BasicError(code, code === 'AUTH_EXPIRED'\n ? 'Session expired. Sign in again to load this list.'\n : 'Sign in to load this list.'), [code])\n}\n\nexport function toBasicError(error: unknown, fallback = 'UNKNOWN_ERROR'): BasicError {\n if (error instanceof BasicError) return error\n return new BasicError(fallback, error instanceof Error ? error.message : String(error))\n}\n\nexport function useAsyncResult<T>(\n load: () => Promise<T>,\n initialData: T,\n enabled: boolean,\n settled: boolean,\n dependencies: readonly unknown[],\n): AsyncResult<T> {\n const loadRef = useRef(load)\n loadRef.current = load\n const [refreshVersion, setRefreshVersion] = useState(0)\n const [state, setState] = useState<Omit<AsyncResult<T>, 'refresh'>>({\n data: initialData,\n isLoading: !settled || enabled,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!enabled) {\n setState({ data: initialData, isLoading: !settled, error: null })\n return () => {\n active = false\n }\n }\n setState((current) => ({ ...current, isLoading: true, error: null }))\n void loadRef.current().then(\n (data) => {\n if (active) setState({ data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setState((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error),\n }))\n },\n )\n return () => {\n active = false\n }\n // The caller supplies semantic dependencies; load identity is held in a ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, settled, refreshVersion, ...dependencies])\n\n return {\n ...state,\n refresh: () => setRefreshVersion((version) => version + 1),\n }\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n AuthStatus,\n AuthUser,\n BasicClient,\n BasicError,\n BasicSchema,\n ReadOnlyReason,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAuthResult {\n isReady: boolean\n isSignedIn: boolean\n isAnonymous: boolean\n canWrite: boolean\n readOnlyReason: ReadOnlyReason | null\n status: AuthStatus\n /** Raw auth diagnostic; stable identity while its code and expired state are unchanged. */\n error: BasicError | null\n user: AuthUser | null\n did: string | null\n handle: string | null\n signIn(input?: string): Promise<void>\n signOut(): Promise<void>\n getToken(): Promise<string>\n}\n\nexport function useAuthFor<S extends BasicSchema>(client: BasicClient<S>): UseAuthResult {\n const snapshot = useClientSnapshot(client)\n const signIn = useCallback((input?: string) => client.signIn(input), [client])\n const signOut = useCallback(() => client.signOut(), [client])\n const getToken = useCallback(() => client.getToken(), [client])\n\n return useMemo(() => ({\n isReady: snapshot.isReady,\n isSignedIn: snapshot.isSignedIn,\n isAnonymous: snapshot.isAnonymous,\n canWrite: snapshot.canWrite,\n readOnlyReason: snapshot.readOnlyReason,\n status: snapshot.authStatus,\n error: snapshot.authError,\n user: snapshot.user,\n did: snapshot.did,\n handle: snapshot.handle,\n signIn,\n signOut,\n getToken,\n }), [snapshot, signIn, signOut, getToken])\n}\n\nexport function useAuth(): UseAuthResult {\n return useAuthFor(useRequiredClient())\n}\n","import { useMemo } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Repo,\n} from '@basictech/core'\nimport { useAccountsFor, type UseAccountsResult } from './accounts'\nimport { useAuthFor, type UseAuthResult } from './auth'\nimport { useRequiredClient } from './client'\nimport { useDbFor } from './db'\nimport { useReposFor } from './repos'\nimport { useSyncStatusFor, type UseSyncStatusResult } from './status'\n\nexport interface UseBasicResult<S extends BasicSchema = BasicSchema> extends UseAuthResult {\n client: BasicClient<S>\n db: BasicDb<S>\n accounts: UseAccountsResult\n sync: UseSyncStatusResult\n repos: Repo[]\n}\n\nexport function useBasicFor<S extends BasicSchema>(client: BasicClient<S>): UseBasicResult<S> {\n const auth = useAuthFor(client)\n const accounts = useAccountsFor(client)\n const sync = useSyncStatusFor(client)\n const repos = useReposFor(client).repos\n const db = useDbFor(client)\n return useMemo(() => ({\n ...auth,\n client,\n db,\n accounts,\n sync,\n repos,\n }), [auth, client, db, accounts, sync, repos])\n}\n\nexport function useBasic<S extends BasicSchema = BasicSchema>(): UseBasicResult<S> {\n return useBasicFor(useRequiredClient<S>())\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n InferValue,\n JsonObject,\n MountViewerFiles,\n OwnerFiles,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { useRequiredClient } from './client'\n\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n}\n\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useRequiredClient<S>().db(source)\n}\n\nexport function useCollectionFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n name: T,\n options: { source?: SourceRef } = {},\n): Collection<InferValue<S, T> & JsonObject> {\n return client.db(options.source ?? 'default').collection(name)\n}\n\nexport function useCollection<V extends JsonObject = JsonObject>(\n name: string,\n options: { source?: SourceRef } = {},\n): Collection<V> {\n return useRequiredClient().db(options.source ?? 'default').collection<V>(name)\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicSchema, JsonObject, Repo } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseReposResult {\n repos: Repo[]\n defaultRepoId: string | null\n refresh(): Promise<Repo[]>\n create(input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }): Promise<Repo>\n archive(repoId: string): Promise<void>\n}\n\nexport function useReposFor<S extends BasicSchema>(client: BasicClient<S>): UseReposResult {\n const snapshot = useClientSnapshot(client)\n const refresh = useCallback(() => client.refreshRepos(), [client])\n const create = useCallback((input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }) => client.createRepo(input), [client])\n const archive = useCallback((repoId: string) => client.archiveRepo(repoId), [client])\n\n return useMemo(() => ({\n repos: snapshot.repos,\n defaultRepoId: snapshot.defaultRepoId,\n refresh,\n create,\n archive,\n }), [snapshot.repos, snapshot.defaultRepoId, refresh, create, archive])\n}\n\nexport function useRepos(): UseReposResult {\n return useReposFor(useRequiredClient())\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n BasicClient,\n BasicConflict,\n BasicRejection,\n BasicSchema,\n BasicSyncStatus,\n SchemaStatus,\n SourceRef,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseSyncStatusResult {\n status: BasicSyncStatus\n pendingCount: number\n rejected: BasicRejection[]\n conflicts: BasicConflict[]\n resolveConflict(opId: string, choice: 'keep-mine' | 'keep-theirs'): Promise<boolean>\n discardRejected(opId: string): Promise<boolean>\n}\n\nexport function useSyncStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: SourceRef,\n): UseSyncStatusResult {\n const snapshot = useClientSnapshot(client)\n const sourceKey = JSON.stringify(source)\n const resolveConflict = useCallback(\n (opId: string, choice: 'keep-mine' | 'keep-theirs') =>\n client.resolveConflict(opId, choice, source ?? 'default'),\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const discardRejected = useCallback(\n (opId: string) => client.discardRejected(opId, source ?? 'default'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n\n return useMemo(() => ({\n status: source === undefined ? snapshot.syncStatus : client.status(source),\n pendingCount: client.pending(source).length,\n rejected: client.rejected(source),\n conflicts: client.conflicts(source),\n resolveConflict,\n discardRejected,\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [client, snapshot, sourceKey, resolveConflict, discardRejected])\n}\n\nexport function useSyncStatus(source?: SourceRef): UseSyncStatusResult {\n return useSyncStatusFor(useRequiredClient(), source)\n}\n\nexport function useSchemaStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): SchemaStatus {\n useClientSnapshot(client)\n return client.schemaStatus(source)\n}\n\nexport function useSchemaStatus(source: SourceRef = 'default'): SchemaStatus {\n return useSchemaStatusFor(useRequiredClient(), source)\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n FileListQuery,\n FileRecord,\n MountFileInfo,\n SourceRef,\n StorageInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient, useSignInGate } from './client'\n\nconst zero = () => 0\n\nexport interface UseFilesResult {\n data: Array<FileRecord | MountFileInfo>\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useFilesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, '_files'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const version = useSyncExternalStore(subscription.subscribe, subscription.getSnapshot, zero)\n return useAsyncResult(\n async () => (await client.db(source).files.list(query)).data,\n [],\n snapshot.isReady,\n snapshot.isReady,\n [sourceKey, queryKey, version, snapshot.activeAccount?.id],\n )\n}\n\nexport function useFiles(\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n return useFilesFor(useRequiredClient(), query, options)\n}\n\nexport interface UseStorageInfoResult {\n data: StorageInfo | null\n isLoading: boolean\n /** Load failure, or the sign-in requirement while no account is signed in. */\n error: BasicError | null\n refresh(): void\n}\n\nexport function useStorageInfoFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseStorageInfoResult {\n const snapshot = useClientSnapshot(client)\n const gate = useSignInGate(snapshot)\n const result = useAsyncResult(\n () => client.storageInfo(client.resolveRepoId()),\n null,\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeAccount?.id],\n )\n return { ...result, error: result.error ?? gate }\n}\n\nexport function useStorageInfo(): UseStorageInfoResult {\n return useStorageInfoFor(useRequiredClient())\n}\n","import { useCallback } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n CreateOutgoingShareInput,\n MountHandle,\n MountInfo,\n MountsQuery,\n OutgoingShareInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient, useSignInGate } from './client'\n\nexport interface UseMountsResult<S extends BasicSchema = BasicSchema> {\n data: MountInfo[]\n isLoading: boolean\n /** Load failure, or the sign-in requirement while no account is signed in. */\n error: BasicError | null\n refresh(): void\n open(mountId: string): Promise<MountHandle<S>>\n manageUrl(): string\n}\n\nexport function useMountsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: MountsQuery = {},\n): UseMountsResult<S> {\n const snapshot = useClientSnapshot(client)\n const gate = useSignInGate(snapshot)\n const queryKey = JSON.stringify(query)\n const result = useAsyncResult(\n () => client.shares.mounts(query),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [queryKey, snapshot.activeAccount?.id],\n )\n const open = useCallback(\n (mountId: string) => client.shares.mount(mountId),\n [client],\n )\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n return { ...result, error: result.error ?? gate, open, manageUrl }\n}\n\nexport function useMounts(query: MountsQuery = {}): UseMountsResult {\n return useMountsFor(useRequiredClient(), query)\n}\n\nexport interface UseOutgoingSharesResult {\n data: OutgoingShareInfo[]\n isLoading: boolean\n /** Load failure, or the sign-in requirement while no account is signed in. */\n error: BasicError | null\n refresh(): void\n create(input: CreateOutgoingShareInput): Promise<OutgoingShareInfo>\n get(id: string): Promise<OutgoingShareInfo>\n cancel(id: string): Promise<OutgoingShareInfo>\n revoke(id: string): Promise<OutgoingShareInfo>\n getContactHandle(did: string): Promise<string | null>\n manageUrl(): string\n}\n\nexport function useOutgoingSharesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseOutgoingSharesResult {\n const snapshot = useClientSnapshot(client)\n const gate = useSignInGate(snapshot)\n const result = useAsyncResult(\n () => client.shares.listOutgoing(),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeAccount?.id],\n )\n const create = useCallback((input: CreateOutgoingShareInput) =>\n client.shares.createOutgoing(input), [client])\n const get = useCallback((id: string) => client.shares.getOutgoing(id), [client])\n const cancel = useCallback((id: string) => client.shares.cancel(id), [client])\n const revoke = useCallback((id: string) => client.shares.revoke(id), [client])\n const getContactHandle = useCallback((did: string) => client.shares.getContactHandle(did), [client])\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n return {\n ...result,\n error: result.error ?? gate,\n create,\n get,\n cancel,\n revoke,\n getContactHandle,\n manageUrl,\n }\n}\n\nexport function useOutgoingShares(): UseOutgoingSharesResult {\n return useOutgoingSharesFor(useRequiredClient())\n}\n","import { useEffect, useState } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicRecord,\n BasicSchema,\n InferValue,\n JsonObject,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { toBasicError, useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseQueryResult<V extends JsonObject> {\n data: BasicRecord<V>[]\n isLoading: boolean\n error: BasicError | null\n}\n\n/**\n * A live view of `collection.watch(query)`: the collection re-runs the query\n * after every local or synced change, so the hook only mirrors its pages.\n */\nexport function useQueryValueFor<\n S extends BasicSchema,\n V extends JsonObject,\n>(\n client: BasicClient<S>,\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const [result, setResult] = useState<UseQueryResult<V>>({\n data: [],\n isLoading: true,\n error: null,\n })\n\n useEffect(() => {\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n if (!snapshot.isReady) return\n try {\n return client.db(source).collection<V>(collection).watch(\n query,\n (page) => setResult({ data: page.data, isLoading: false, error: null }),\n (error) => setResult((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error, 'QUERY_FAILED'),\n })),\n )\n } catch (error) {\n setResult((current) => ({ ...current, isLoading: false, error: toBasicError(error, 'QUERY_FAILED') }))\n return\n }\n // source and query are represented by their stable semantic keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, collection, sourceKey, queryKey, snapshot.isReady])\n\n return result\n}\n\nexport function useQueryFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n collection: T,\n query: Query<InferValue<S, T> & JsonObject> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<InferValue<S, T> & JsonObject> {\n return useQueryValueFor(client, collection, query, options)\n}\n\nexport function useQuery<V extends JsonObject = JsonObject>(\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n return useQueryValueFor(useRequiredClient(), collection, query, options)\n}\n","import {\n BasicError,\n type BasicClient,\n type BasicSchema,\n type ProjectProfile,\n type ProjectProfilePatch,\n} from '@basictech/core'\nimport {\n useAsyncResult,\n useClientSnapshot,\n useRequiredClient,\n type AsyncResult,\n} from './client'\n\nexport interface UseProjectProfileResult\n extends AsyncResult<ProjectProfile | null> {\n update(patch: ProjectProfilePatch): Promise<ProjectProfile>\n reset(): Promise<ProjectProfile>\n}\n\nexport function useProjectProfileFor<S extends BasicSchema>(\n client: BasicClient<S>,\n enabled = true,\n): UseProjectProfileResult {\n const snapshot = useClientSnapshot(client)\n const accountId = snapshot.activeAccount?.id\n const result = useAsyncResult(\n async () => ({ accountId, profile: await client.getProjectProfile() }),\n null as { accountId: string | undefined; profile: ProjectProfile } | null,\n enabled && snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeAccount?.id],\n )\n const checkAccount = () => {\n if (client.getSnapshot().activeAccount?.id !== accountId)\n throw new BasicError('ACCOUNT_CHANGED')\n }\n return {\n ...result,\n data:\n enabled &&\n snapshot.isSignedIn &&\n result.data &&\n result.data.accountId === accountId\n ? result.data.profile\n : null,\n async update(patch) {\n checkAccount()\n const profile = await client.updateProjectProfile(patch)\n checkAccount()\n result.refresh()\n return profile\n },\n async reset() {\n checkAccount()\n const profile = await client.resetProjectProfile()\n checkAccount()\n result.refresh()\n return profile\n },\n }\n}\n\nexport function useProjectProfile(enabled = true): UseProjectProfileResult {\n return useProjectProfileFor(useRequiredClient(), enabled)\n}\n","'use client'\n\nimport {\n createContext,\n Fragment,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { Avatar } from '@base-ui/react/avatar'\nimport { Dialog } from '@base-ui/react/dialog'\nimport { Menu } from '@base-ui/react/menu'\nimport { Tabs } from '@base-ui/react/tabs'\nimport { BasicError } from '@basictech/core'\nimport type {\n BasicProfile,\n ProjectProfilePatch,\n CreateOutgoingShareInput,\n SourceRef,\n} from '@basictech/core'\nimport { useAuth, type UseAuthResult } from './hooks/auth'\nimport { useAccounts, type UseAccountsResult } from './hooks/accounts'\nimport { useSyncStatus, type UseSyncStatusResult } from './hooks/status'\nimport { useOutgoingShares, type UseOutgoingSharesResult } from './hooks/mounts'\nimport {\n useProjectProfile,\n type UseProjectProfileResult,\n} from './hooks/profile'\nimport { useRequiredClient } from './hooks/client'\n\nexport interface BasicAppearance {\n theme?: 'light' | 'dark'\n /** Background color. Choose a light or dark base to match the theme. */\n base?: string\n /** Hex colors get automatic black/white foreground contrast. */\n accent?: string\n radius?: string\n density?: 'compact' | 'comfortable'\n}\n\nconst AppearanceContext = createContext<BasicAppearance>({})\nfunction accentText(accent: string): string {\n if (!/^#([\\da-f]{3}|[\\da-f]{6})$/i.test(accent)) return '#fff'\n const hex = accent.length === 4\n ? accent.slice(1).split('').map((digit) => digit + digit).join('')\n : accent.slice(1)\n const [red, green, blue] = [0, 2, 4].map((offset) => {\n const channel = parseInt(hex.slice(offset, offset + 2), 16) / 255\n return channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4\n })\n return 0.2126 * red! + 0.7152 * green! + 0.0722 * blue! > 0.179 ? '#000' : '#fff'\n}\n\nfunction appearanceStyle(appearance: BasicAppearance): CSSProperties {\n return {\n ...(appearance.base ? { '--basic-surface': appearance.base } : {}),\n ...(appearance.accent ? {\n '--basic-accent': appearance.accent,\n '--basic-accent-text': accentText(appearance.accent),\n } : {}),\n ...(appearance.radius ? { '--basic-radius': appearance.radius } : {}),\n } as CSSProperties\n}\n\n/** Optional styling provider. CSS is opt-in via @basictech/react/styles.css. */\nexport function BasicUIProvider({\n appearance = {},\n children,\n}: {\n appearance?: BasicAppearance\n children: ReactNode\n}) {\n const parent = useContext(AppearanceContext)\n const value = { ...parent, ...appearance }\n return (\n <AppearanceContext.Provider value={value}>\n <div\n className=\"basic-ui\"\n data-theme={value.theme ?? 'light'}\n data-density={value.density ?? 'comfortable'}\n style={appearanceStyle(value)}\n >\n {children}\n </div>\n </AppearanceContext.Provider>\n )\n}\n\n// Portals retain React context but not CSS inheritance from the provider's DOM node.\nfunction useAppearanceProps() {\n const appearance = useContext(AppearanceContext)\n return {\n 'data-theme': appearance.theme ?? 'light',\n 'data-density': appearance.density ?? 'comfortable',\n style: appearanceStyle(appearance),\n }\n}\n\nexport interface BasicButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'solid' | 'outline' | 'ghost'\n}\nexport const BasicButton = forwardRef<HTMLButtonElement, BasicButtonProps>(\n function BasicButton(\n { variant = 'outline', className = '', type = 'button', ...props },\n ref,\n ) {\n return (\n <button\n {...props}\n ref={ref}\n type={type}\n className={`basic-button ${className}`}\n data-variant={variant}\n />\n )\n },\n)\n\nfunction useAction() {\n const [pending, setPending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const busy = useRef(false)\n const mounted = useRef(true)\n useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n }\n }, [])\n async function run(action: () => unknown) {\n if (busy.current) return\n busy.current = true\n setPending(true)\n setError(null)\n try {\n await action()\n } catch (cause) {\n if (mounted.current)\n setError(\n cause instanceof BasicError &&\n cause.code === 'REDIRECT_URI_NOT_REGISTERED'\n ? 'Sign-in is unavailable on this URL. Ask the app owner to register its callback URL in project settings.'\n : cause instanceof Error\n ? cause.message\n : 'The action failed. Please try again.',\n )\n } finally {\n busy.current = false\n if (mounted.current) setPending(false)\n }\n }\n return { pending, error, run, clearError: () => setError(null) }\n}\n\nexport interface AuthButtonProps extends BasicButtonProps {\n auth?: UseAuthResult\n input?: string\n}\nfunction AuthButton({\n auth: supplied,\n input,\n signOut = false,\n children,\n disabled,\n onClick,\n ...props\n}: AuthButtonProps & { signOut?: boolean }) {\n const live = useAuth()\n const auth = supplied ?? live\n const action = useAction()\n const expired = auth.status === 'expired'\n return (\n <span className=\"basic-action\">\n <BasicButton\n {...props}\n disabled={\n disabled ||\n !auth.isReady ||\n action.pending ||\n (signOut ? !auth.isSignedIn && !expired : auth.isSignedIn && !expired)\n }\n aria-busy={action.pending}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented)\n void action.run(() =>\n signOut ? auth.signOut() : auth.signIn(input),\n )\n }}\n >\n {action.pending\n ? 'Please wait…'\n : (children ??\n (signOut ? 'Sign out' : expired ? 'Sign in again' : 'Sign in'))}\n </BasicButton>\n <ActionError error={action.error} onClose={action.clearError} />\n </span>\n )\n}\nexport function SignInButton(props: AuthButtonProps) {\n return <AuthButton {...props} />\n}\nexport function SignOutButton(props: AuthButtonProps) {\n return <AuthButton {...props} signOut />\n}\n\nexport interface UserAvatarProps extends HTMLAttributes<HTMLSpanElement> {\n profile?:\n | (Pick<BasicProfile, 'name' | 'handle' | 'email' | 'picture'> &\n Partial<Pick<BasicProfile, 'kind'>>)\n | null\n size?: number\n showSyncBadge?: boolean\n sync?: UseSyncStatusResult\n accounts?: UseAccountsResult\n auth?: UseAuthResult\n projectProfile?: UseProjectProfileResult\n allowAddAccount?: boolean\n menuItems?: UserMenuItem[]\n}\nexport function UserAvatar({\n accounts,\n auth,\n projectProfile,\n allowAddAccount,\n menuItems,\n ...avatarProps\n}: UserAvatarProps) {\n return (\n <UserMenu\n accounts={accounts}\n auth={auth}\n projectProfile={projectProfile}\n allowAddAccount={allowAddAccount}\n menuItems={menuItems}\n sync={avatarProps.sync}\n showSyncBadge={avatarProps.showSyncBadge}\n avatarProps={avatarProps}\n />\n )\n}\n\nfunction AccountAvatar({\n profile: supplied,\n size = 32,\n showSyncBadge,\n sync,\n className = '',\n style,\n ...props\n}: UserAvatarProps) {\n const accounts = useAccounts()\n const client = useRequiredClient()\n const profile = supplied === undefined ? accounts.activeAccount : supplied\n const name =\n profile?.name ||\n (profile?.kind === 'anon'\n ? 'Local account'\n : profile?.handle || profile?.email || 'Guest')\n const initials = name\n .trim()\n .split(/\\s+/)\n .slice(0, 2)\n .map((part) => Array.from(part)[0])\n .join('')\n .toUpperCase()\n const avatar = (\n <Avatar.Root\n {...props}\n className={`basic-avatar ${className}`}\n style={{ width: size, height: size, ...style }}\n role=\"img\"\n aria-label={props['aria-label'] ?? name}\n >\n {profile?.picture && (\n <Avatar.Image\n src={profile.picture}\n alt=\"\"\n className=\"basic-avatar-image\"\n referrerPolicy=\"no-referrer\"\n />\n )}\n <Avatar.Fallback className=\"basic-avatar-fallback\">\n {initials || '?'}\n </Avatar.Fallback>\n </Avatar.Root>\n )\n return (showSyncBadge ?? client.mode === 'sync') ? (\n <span className=\"basic-avatar-container\">\n {avatar}\n <SyncStatus sync={sync} className=\"basic-avatar-sync\" />\n </span>\n ) : (\n avatar\n )\n}\n\nexport function AuthStatus({\n auth: supplied,\n className = '',\n ...props\n}: HTMLAttributes<HTMLSpanElement> & { auth?: UseAuthResult }) {\n const live = useAuth()\n const auth = supplied ?? live\n const expired = auth.status === 'expired'\n const label =\n !auth.isReady || auth.status === 'bootstrapping'\n ? 'Checking session'\n : expired\n ? 'Session expired'\n : auth.status === 'recovering'\n ? 'Reconnecting session'\n : auth.isSignedIn\n ? 'Signed in'\n : auth.isAnonymous\n ? 'Guest · local only'\n : 'Signed out'\n return (\n <span\n {...props}\n role=\"status\"\n className={`basic-status ${className}`}\n data-tone={\n expired || auth.error\n ? 'warning'\n : auth.isSignedIn\n ? 'success'\n : 'neutral'\n }\n >\n <span className=\"basic-dot\" />\n {label}\n </span>\n )\n}\n\nexport function SyncStatus({\n sync: supplied,\n source,\n className = '',\n ...props\n}: HTMLAttributes<HTMLSpanElement> & {\n sync?: UseSyncStatusResult\n source?: SourceRef\n}) {\n const live = useSyncStatus(source)\n const client = useRequiredClient()\n const sync = supplied ?? live\n if (client.mode === 'rest') return null\n const issues = sync.rejected.length + sync.conflicts.length\n const labels: Record<UseSyncStatusResult['status'], string> = {\n idle: 'Idle',\n bootstrapping: 'Starting sync',\n connecting: 'Connecting',\n online: 'Synced',\n offline: 'Offline',\n stopped: 'Sync stopped',\n error: 'Sync error',\n local: 'Local only',\n stale: 'Sync stale',\n ended: 'Access ended',\n }\n const label = issues\n ? `${issues} sync ${issues === 1 ? 'issue' : 'issues'}`\n : sync.status === 'online' && sync.pendingCount\n ? 'Syncing'\n : labels[sync.status]\n return (\n <span\n {...props}\n role=\"status\"\n title={\n props.title ??\n `${label}${sync.pendingCount > 0 ? ` · ${sync.pendingCount} pending` : ''}`\n }\n className={`basic-status ${className}`}\n data-tone={\n issues || ['error', 'stale', 'ended'].includes(sync.status)\n ? 'warning'\n : sync.status === 'online' && !sync.pendingCount\n ? 'success'\n : ['bootstrapping', 'connecting'].includes(sync.status) ||\n (sync.status === 'online' && sync.pendingCount > 0)\n ? 'progress'\n : 'neutral'\n }\n >\n <span className=\"basic-dot\" />\n {label}\n {sync.pendingCount > 0 && ` · ${sync.pendingCount} pending`}\n </span>\n )\n}\n\nfunction displayHandle(handle: string | null | undefined) {\n return handle ? `@${handle.replace(/^@+/, '')}` : ''\n}\n\n/** App-owned items appear after Manage account and before Sign out. */\nexport type UserMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n disabled?: boolean\n} & (\n | { href: string; onClick?: never }\n | { onClick: () => void | Promise<void>; href?: never }\n)\n\nexport interface UserButtonProps {\n accounts?: UseAccountsResult\n auth?: UseAuthResult\n sync?: UseSyncStatusResult\n /** Show synchronization status in the account menu. Defaults to true. */\n showSyncStatus?: boolean\n /** Defaults to enabled in sync mode. */\n showSyncBadge?: boolean\n shape?: 'rounded' | 'square'\n projectProfile?: UseProjectProfileResult\n /** Show the action to sign in to another account. Defaults to true. */\n allowAddAccount?: boolean\n className?: string\n accountSettingsUrl?: string\n menuItems?: UserMenuItem[]\n}\n\nexport function UserButton(props: UserButtonProps) {\n return <UserMenu {...props} trigger=\"button\" />\n}\n\nexport interface UserMenuProps extends UserButtonProps {\n trigger?: 'avatar' | 'button'\n avatarProps?: UserAvatarProps\n}\n\nexport function UserMenu({\n accounts: supplied,\n auth: suppliedAuth,\n sync,\n showSyncStatus = true,\n showSyncBadge,\n shape = 'rounded',\n trigger = 'avatar',\n avatarProps,\n projectProfile,\n allowAddAccount = true,\n className = '',\n accountSettingsUrl,\n menuItems = [],\n}: UserMenuProps) {\n const liveAccounts = useAccounts()\n const liveAuth = useAuth()\n const accounts = supplied ?? liveAccounts\n const auth = suppliedAuth ?? liveAuth\n const action = useAction()\n const [settingsOpen, setSettingsOpen] = useState(false)\n const [clearAccountId, setClearAccountId] = useState<string | null>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const appearance = useAppearanceProps()\n const expired = auth.status === 'expired'\n const active = accounts.activeAccount\n const otherAccounts = accounts.accounts.filter(\n (account) => account.id !== active?.id,\n )\n const name =\n active?.name ||\n (active?.kind !== 'anon' && displayHandle(active?.handle)) ||\n 'Local account'\n return (\n <span className={`basic-action ${className}`}>\n <Menu.Root>\n <Menu.Trigger\n ref={triggerRef}\n className={`basic-button basic-account-trigger basic-trigger-${trigger}`}\n data-shape={shape}\n disabled={!auth.isReady || action.pending}\n aria-label=\"Open user menu\"\n >\n <AccountAvatar\n profile={accounts.activeAccount}\n sync={sync}\n showSyncBadge={showSyncBadge}\n {...avatarProps}\n />\n {trigger === 'button' && (\n <>\n <span className=\"basic-identity\">\n <strong>{name}</strong>\n {active?.kind !== 'anon' && active?.handle && (\n <small>{displayHandle(active.handle)}</small>\n )}\n </span>\n <svg\n className=\"basic-chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </>\n )}\n </Menu.Trigger>\n <Menu.Portal>\n <Menu.Positioner sideOffset={8} className=\"basic-positioner\">\n <Menu.Popup {...appearance} className=\"basic-ui basic-menu\">\n <div className=\"basic-menu-profile\">\n <AccountAvatar\n profile={active}\n size={48}\n sync={sync}\n showSyncBadge={false}\n />\n <span className=\"basic-identity\">\n <strong>{active ? name : 'No active account'}</strong>\n {active?.kind !== 'anon' && active?.handle && (\n <small>{displayHandle(active.handle)}</small>\n )}\n <span className=\"basic-account-statuses\">\n {expired && (\n <span className=\"basic-status\" data-tone=\"warning\">\n Expired\n </span>\n )}\n {showSyncStatus && <SyncStatus sync={sync} />}\n </span>\n </span>\n </div>\n {expired && (\n <Menu.Item\n className=\"basic-menu-item basic-menu-reauth\"\n disabled={action.pending}\n onClick={() => void action.run(() => auth.signIn())}\n >\n Sign in again\n </Menu.Item>\n )}\n <Menu.Item\n className=\"basic-menu-item basic-manage-account\"\n onClick={() => setSettingsOpen(true)}\n >\n <svg\n className=\"basic-menu-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n </svg>\n Manage account\n </Menu.Item>\n {menuItems.map((item) => (\n <Menu.Item\n key={item.id}\n className=\"basic-menu-item\"\n render={item.href !== undefined ? <a href={item.href} /> : undefined}\n disabled={item.disabled || action.pending}\n onClick={() => {\n if (item.onClick) void action.run(item.onClick)\n }}\n >\n <span className=\"basic-menu-icon\" aria-hidden=\"true\">{item.icon}</span>\n {item.label}\n </Menu.Item>\n ))}\n {(auth.isSignedIn || expired || active?.kind === 'anon') && (\n <Menu.Item\n className=\"basic-menu-item basic-menu-signout\"\n disabled={action.pending}\n onClick={() =>\n active?.kind === 'anon'\n ? setClearAccountId(active.id)\n : void action.run(() => auth.signOut())\n }\n >\n <svg\n className=\"basic-menu-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9\" />\n </svg>\n {active?.kind === 'anon' ? 'Clear account' : 'Sign out'}\n </Menu.Item>\n )}\n {otherAccounts.length > 0 && (\n <>\n <Menu.Separator className=\"basic-separator\" />\n <div className=\"basic-menu-heading\">Switch accounts</div>\n </>\n )}\n {otherAccounts.map((account) => (\n <Menu.Item\n key={account.id}\n className=\"basic-menu-item\"\n disabled={action.pending}\n onClick={() =>\n void action.run(() => accounts.switchAccount(account.id))\n }\n >\n <AccountAvatar\n profile={account}\n size={32}\n sync={sync}\n showSyncBadge={false}\n />\n <span className=\"basic-identity\">\n <strong>\n {account.name ||\n (account.kind !== 'anon' &&\n displayHandle(account.handle)) ||\n (account.kind === 'anon' ? 'Local account' : 'Account')}\n </strong>\n {account.kind !== 'anon' && account.handle && (\n <small>{displayHandle(account.handle)}</small>\n )}\n </span>\n <span className=\"basic-account-statuses\">\n {account.auth.status === 'expired' ? (\n <span className=\"basic-status\" data-tone=\"warning\">\n Expired\n </span>\n ) : null}\n </span>\n </Menu.Item>\n ))}\n {(allowAddAccount || (!auth.isSignedIn && !expired)) && (\n <Menu.Item\n className=\"basic-menu-item\"\n disabled={action.pending}\n onClick={() =>\n void action.run(() =>\n allowAddAccount\n ? accounts.addAccount({ signIn: true })\n : auth.signIn(),\n )\n }\n >\n <svg\n className=\"basic-menu-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n Add account\n </Menu.Item>\n )}\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n <ActionError\n error={action.error}\n onClose={action.clearError}\n finalFocus={triggerRef}\n />\n <Modal\n open={clearAccountId !== null}\n onOpenChange={(open) => {\n if (!open) setClearAccountId(null)\n }}\n trigger={null}\n finalFocus={triggerRef}\n title=\"Clear local account?\"\n description=\"This deletes this account’s local data, including unsynced changes. This cannot be undone.\"\n >\n <div className=\"basic-actions\">\n <BasicButton\n disabled={action.pending}\n onClick={() => setClearAccountId(null)}\n >\n Cancel\n </BasicButton>\n <BasicButton\n disabled={action.pending}\n onClick={() => {\n const id = clearAccountId\n if (!id) return\n setClearAccountId(null)\n void action.run(() => accounts.removeAccount(id))\n }}\n >\n Clear account\n </BasicButton>\n </div>\n </Modal>\n <AccountSettingsModal\n auth={auth}\n accounts={accounts}\n open={settingsOpen}\n onOpenChange={setSettingsOpen}\n trigger={null}\n finalFocus={triggerRef}\n accountSettingsUrl={accountSettingsUrl}\n projectProfile={projectProfile}\n sync={sync}\n />\n </span>\n )\n}\n\nexport interface BasicModalProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n finalFocus?: RefObject<HTMLElement>\n /** Supply a button element; null omits the trigger for controlled use. */\n trigger?: ReactNode\n}\nfunction ActionError({\n error,\n onClose,\n finalFocus,\n}: {\n error: string | null\n onClose(): void\n finalFocus?: RefObject<HTMLElement>\n}) {\n return (\n <Modal\n open={!!error}\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n trigger={null}\n finalFocus={finalFocus}\n title=\"Unable to complete action\"\n description=\"Your request could not be completed.\"\n >\n <p role=\"alert\" className=\"basic-error\">\n {error}\n </p>\n <BasicButton onClick={onClose}>Dismiss</BasicButton>\n </Modal>\n )\n}\nfunction Modal({\n open,\n onOpenChange,\n trigger,\n finalFocus,\n title,\n description,\n header,\n sectionLabel,\n children,\n}: BasicModalProps & {\n title: string\n description: string\n header?: ReactNode\n sectionLabel?: string\n children: ReactNode\n}) {\n const appearance = useAppearanceProps()\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n {trigger !== null &&\n (isValidElement(trigger) ? (\n <Dialog.Trigger render={trigger} />\n ) : (\n <Dialog.Trigger render={<BasicButton />}>\n {trigger ?? title}\n </Dialog.Trigger>\n ))}\n <Dialog.Portal>\n <Dialog.Backdrop className=\"basic-backdrop\" />\n <Dialog.Popup\n {...appearance}\n finalFocus={finalFocus}\n className=\"basic-ui basic-dialog\"\n >\n <div\n className={`basic-dialog-heading${header ? ' basic-dialog-heading-overlay' : ''}`}\n >\n <Dialog.Title className={header ? 'basic-sr-only' : 'basic-title'}>\n {title}\n </Dialog.Title>\n <Dialog.Close\n className=\"basic-button\"\n aria-label={`Close ${title.toLowerCase()}`}\n >\n ✕\n </Dialog.Close>\n </div>\n {header}\n <Dialog.Description\n className={header ? 'basic-sr-only' : 'basic-muted'}\n >\n {description}\n </Dialog.Description>\n {sectionLabel && (\n <div className=\"basic-modal-section\">{sectionLabel}</div>\n )}\n {children}\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n\nexport interface AccountSettingsModalProps extends BasicModalProps {\n auth?: UseAuthResult\n accounts?: UseAccountsResult\n projectProfile?: UseProjectProfileResult\n sync?: UseSyncStatusResult\n accountSettingsUrl?: string\n children?: ReactNode\n}\nexport function AccountSettingsModal({\n auth: suppliedAuth,\n accounts: suppliedAccounts,\n accountSettingsUrl,\n projectProfile,\n sync,\n children,\n ...props\n}: AccountSettingsModalProps) {\n const liveAuth = useAuth()\n const liveAccounts = useAccounts()\n const auth = suppliedAuth ?? liveAuth\n const accounts = suppliedAccounts ?? liveAccounts\n const liveSync = useSyncStatus()\n const syncState = sync ?? liveSync\n const client = useRequiredClient()\n const account = accounts.activeAccount\n const copyAction = useAction()\n const [copied, setCopied] = useState<string | null>(null)\n const details = [\n [\n 'Account DID',\n account?.kind === 'anon'\n ? 'Not assigned (local account)'\n : (account?.did ?? auth.did ?? 'Unavailable'),\n ],\n [\n 'PDS URL',\n account?.kind === 'anon'\n ? 'Not connected (local account)'\n : (auth.user?.pds_url ?? 'Unavailable'),\n ],\n ['Local account ID', account?.id ?? 'None'],\n ['Account kind', account?.kind ?? 'None'],\n ['Storage prefix', account?.storagePrefix ?? 'None'],\n ['Client mode', client.mode],\n ['Auth state', auth.status],\n ['Ready', auth.isReady ? 'Yes' : 'No'],\n ['Can write', auth.canWrite ? 'Yes' : 'No'],\n ['Read-only reason', auth.readOnlyReason ?? 'None'],\n ['Auth error code', auth.error?.code ?? 'None'],\n ['Sync state', syncState.status],\n ['Pending writes', String(syncState.pendingCount)],\n ['Rejected writes', String(syncState.rejected.length)],\n ['Conflicts', String(syncState.conflicts.length)],\n ]\n const diagnostics = JSON.stringify(Object.fromEntries(details), null, 2)\n return (\n <Modal\n {...props}\n title=\"Account settings\"\n description=\"Your identity and session on this device.\"\n header={<AccountHeader account={accounts.activeAccount} sync={sync} />}\n >\n <Tabs.Root defaultValue=\"profile\">\n <Tabs.List\n className=\"basic-tabs\"\n aria-label=\"Account settings sections\"\n >\n <Tabs.Tab value=\"profile\">Profile</Tabs.Tab>\n <Tabs.Tab value=\"advanced\">Advanced</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"profile\" keepMounted>\n {auth.isSignedIn && (\n <ProjectProfileEditor\n key={accounts.activeAccount?.id ?? auth.did}\n profile={projectProfile}\n canWrite={auth.canWrite}\n />\n )}\n {accountSettingsUrl && (\n <a className=\"basic-link\" href={accountSettingsUrl}>\n Manage profile and security ↗\n </a>\n )}\n {children}\n {!auth.isSignedIn && (\n <div className=\"basic-actions\">\n <SignInButton auth={auth} />\n </div>\n )}\n </Tabs.Panel>\n <Tabs.Panel value=\"advanced\">\n <p className=\"basic-muted\">Read-only diagnostics for this account.</p>\n <dl className=\"basic-details\">\n {details.map(([label, value]) => (\n <Fragment key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </Fragment>\n ))}\n </dl>\n <div className=\"basic-actions\">\n <BasicButton\n disabled={copyAction.pending}\n onClick={() => {\n setCopied(null)\n void copyAction.run(async () => {\n if (!navigator.clipboard?.writeText)\n throw new Error('Clipboard is unavailable in this browser.')\n await navigator.clipboard.writeText(diagnostics)\n setCopied(diagnostics)\n })\n }}\n >\n Copy to clipboard\n </BasicButton>\n {copied === diagnostics && (\n <span role=\"status\" className=\"basic-muted\">\n Copied\n </span>\n )}\n </div>\n {copyAction.error && (\n <p role=\"alert\" className=\"basic-error\">\n {copyAction.error}\n </p>\n )}\n </Tabs.Panel>\n </Tabs.Root>\n </Modal>\n )\n}\n\nfunction AccountHeader({\n account,\n sync,\n}: {\n account: UseAccountsResult['activeAccount']\n sync?: UseSyncStatusResult\n}) {\n return (\n <div className=\"basic-profile\">\n <AccountAvatar\n profile={account}\n size={72}\n sync={sync}\n showSyncBadge={false}\n />\n <span className=\"basic-identity\">\n <strong>\n {account?.name ||\n (account?.kind !== 'anon' && displayHandle(account?.handle)) ||\n 'Local account'}\n </strong>\n {account?.kind !== 'anon' && account?.handle && (\n <small>{displayHandle(account.handle)}</small>\n )}\n <span className=\"basic-account-statuses\">\n <SyncStatus sync={sync} />\n </span>\n </span>\n </div>\n )\n}\n\nfunction ProjectProfileEditor({\n profile: supplied,\n canWrite,\n}: {\n profile?: UseProjectProfileResult\n canWrite: boolean\n}) {\n const live = useProjectProfile(supplied === undefined)\n const profile = supplied ?? live\n const action = useAction()\n const [draft, setDraft] = useState<ProjectProfilePatch>({})\n const [saved, setSaved] = useState(false)\n return (\n <form\n className=\"basic-profile-editor\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!canWrite || !Object.keys(draft).length) return\n void action.run(async () => {\n await profile.update(draft)\n setDraft({})\n setSaved(true)\n })\n }}\n >\n <h3 className=\"basic-section-label\">Personal information</h3>\n <p className=\"basic-muted\">\n Only this app sees these overrides. Clear a field to use your universal\n profile value.\n </p>\n {profile.isLoading ? (\n <p role=\"status\">Loading project profile…</p>\n ) : profile.error ? (\n <>\n <p role=\"alert\" className=\"basic-error\">\n {profile.error.message}\n </p>\n <BasicButton onClick={profile.refresh}>Retry profile</BasicButton>\n </>\n ) : (\n profile.data && (\n <fieldset disabled={!canWrite || action.pending}>\n <label className=\"basic-field\">\n Display name\n <input\n className=\"basic-input\"\n type=\"text\"\n maxLength={64}\n value={\n ('name' in draft ? draft.name : profile.data?.profile.name) ??\n ''\n }\n onChange={(event) => {\n setSaved(false)\n setDraft((current) => ({\n ...current,\n name: event.target.value || null,\n }))\n }}\n />\n </label>\n <div className=\"basic-actions basic-modal-footer\">\n <BasicButton\n variant=\"ghost\"\n onClick={() => {\n setDraft({})\n setSaved(false)\n }}\n >\n Cancel\n </BasicButton>\n <BasicButton\n type=\"submit\"\n variant=\"solid\"\n disabled={!Object.keys(draft).length}\n >\n Save changes\n </BasicButton>\n </div>\n </fieldset>\n )\n )}\n {action.error && (\n <p role=\"alert\" className=\"basic-error\">\n {action.error}\n </p>\n )}\n {saved && <p role=\"status\">Project profile saved.</p>}\n </form>\n )\n}\n\nexport interface SharesModalProps extends BasicModalProps {\n auth?: UseAuthResult\n accounts?: UseAccountsResult\n sync?: UseSyncStatusResult\n shares?: UseOutgoingSharesResult\n /** Explicit least-privilege scope; the component never infers all tables. */\n scope: CreateOutgoingShareInput['scope']\n repo?: CreateOutgoingShareInput['repo']\n}\nexport function SharesModal({\n auth: supplied,\n accounts: suppliedAccounts,\n sync,\n shares,\n scope,\n repo = 'default',\n ...props\n}: SharesModalProps) {\n const live = useAuth()\n const liveAccounts = useAccounts()\n const auth = supplied ?? live\n return (\n <Modal\n {...props}\n title=\"Shares\"\n description=\"Manage incoming invitations and share access to selected data.\"\n header={\n <AccountHeader\n account={(suppliedAccounts ?? liveAccounts).activeAccount}\n sync={sync}\n />\n }\n >\n {!auth.isReady ? (\n <p role=\"status\">Checking session…</p>\n ) : !auth.isSignedIn ? (\n <>\n <p className=\"basic-muted\">Sign in to share data.</p>\n <SignInButton auth={auth} />\n </>\n ) : (\n <SharesContent\n key={auth.did ?? 'account'}\n shares={shares}\n scope={scope}\n repo={repo}\n canWrite={auth.canWrite}\n />\n )}\n </Modal>\n )\n}\n\nfunction SharesContent({\n shares: supplied,\n scope,\n repo,\n canWrite,\n}: Pick<SharesModalProps, 'shares' | 'scope'> & {\n repo: NonNullable<SharesModalProps['repo']>\n canWrite: boolean\n}) {\n const live = useOutgoingShares()\n const shares = supplied ?? live\n const action = useAction()\n const [recipient, setRecipient] = useState('')\n const [role, setRole] = useState<'viewer' | 'editor'>('viewer')\n const [confirmation, setConfirmation] = useState<string | null>(null)\n const [message, setMessage] = useState('')\n const scopeValid =\n scope.length > 0 &&\n scope.every(\n (item) =>\n item.table.trim() &&\n (item.recordIds === undefined || item.recordIds.length > 0),\n )\n return (\n <Tabs.Root defaultValue=\"outgoing\" className=\"basic-shares\">\n <Tabs.List className=\"basic-tabs\" aria-label=\"Share direction\">\n <Tabs.Tab value=\"outgoing\">Outgoing</Tabs.Tab>\n <Tabs.Tab value=\"incoming\">Incoming invitations</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"incoming\">\n <section aria-label=\"Incoming invitations\">\n <h3 className=\"basic-title\">Incoming invitations</h3>\n <p className=\"basic-muted\">\n View, accept, or decline incoming invitations in Basic ID. Your app\n session cannot access the account-wide inbox.\n </p>\n <a className=\"basic-link\" href={shares.manageUrl()}>\n Open incoming invitations in Basic ID ↗\n </a>\n </section>\n </Tabs.Panel>\n <Tabs.Panel value=\"outgoing\">\n <p className=\"basic-muted\">\n Revoking access stops future requests. It cannot retract data the\n recipient already downloaded.\n </p>\n <div className=\"basic-scope\">\n <strong>New invitation permissions</strong>\n {scope.map((item, index) => (\n <span key={index}>\n {item.table} ·{' '}\n {item.recordIds\n ? `${item.recordIds.length} selected records`\n : 'all records'}\n </span>\n ))}\n </div>\n {!canWrite && (\n <p className=\"basic-error\">\n This session is read only. Sharing changes are disabled.\n </p>\n )}\n <form\n className=\"basic-share-form\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!recipient.trim() || !scopeValid || !canWrite) return\n void action.run(async () => {\n await shares.create({\n repo,\n scope,\n role,\n ...(recipient.trim().startsWith('did:')\n ? { recipientDid: recipient.trim() }\n : { recipientHandle: recipient.trim().replace(/^@+/, '') }),\n })\n setRecipient('')\n setMessage('Invitation sent.')\n shares.refresh()\n })\n }}\n >\n <label className=\"basic-field\">\n Recipient handle or DID\n <input\n className=\"basic-input\"\n value={recipient}\n onChange={(event) => setRecipient(event.target.value)}\n placeholder=\"@alex.basic.id\"\n required\n disabled={action.pending || !canWrite}\n />\n </label>\n <label className=\"basic-field\">\n Permission\n <select\n className=\"basic-input\"\n value={role}\n onChange={(event) =>\n setRole(event.target.value as 'viewer' | 'editor')\n }\n disabled={action.pending || !canWrite}\n >\n <option value=\"viewer\">Can view</option>\n <option value=\"editor\">Can edit</option>\n </select>\n </label>\n <BasicButton\n type=\"submit\"\n variant=\"solid\"\n disabled={\n action.pending || !canWrite || !scopeValid || !recipient.trim()\n }\n >\n {action.pending ? 'Please wait…' : 'Send invitation'}\n </BasicButton>\n </form>\n {!scopeValid && (\n <p role=\"alert\" className=\"basic-error\">\n Select at least one table or record to share.\n </p>\n )}\n {action.error && (\n <p role=\"alert\" className=\"basic-error\">\n {action.error}\n </p>\n )}\n {message && (\n <p role=\"status\" className=\"basic-muted\">\n {message}\n </p>\n )}\n <div className=\"basic-section-heading\">\n <h3 className=\"basic-title\">Outgoing shares · all permissions</h3>\n <BasicButton\n disabled={action.pending || shares.isLoading}\n onClick={shares.refresh}\n >\n Refresh\n </BasicButton>\n </div>\n {shares.isLoading ? (\n <p role=\"status\">Loading shares…</p>\n ) : shares.error ? (\n <p role=\"alert\" className=\"basic-error\">\n {shares.error.message}\n </p>\n ) : !shares.data.length ? (\n <p className=\"basic-empty\">No outgoing shares yet.</p>\n ) : (\n <ul className=\"basic-share-list\">\n {shares.data.map((share) => (\n <li key={share.id}>\n <div className=\"basic-identity\">\n <strong>\n {share.display.shareName || share.recipientDid}\n </strong>\n <small>\n {share.role === 'viewer' ? 'Can view' : 'Can edit'} ·{' '}\n {share.effectiveState} ·{' '}\n {share.scope.map((item) => item.table).join(', ')}\n </small>\n </div>\n {share.state !== 'ended' &&\n (confirmation === share.id ? (\n <div className=\"basic-actions\">\n <span>Remove access?</span>\n <BasicButton\n disabled={action.pending || !canWrite}\n onClick={() =>\n void action.run(async () => {\n await (share.state === 'pending'\n ? shares.cancel(share.id)\n : shares.revoke(share.id))\n setConfirmation(null)\n setMessage(\n share.state === 'pending'\n ? 'Invitation canceled.'\n : 'Access revoked.',\n )\n shares.refresh()\n })\n }\n >\n Confirm{' '}\n {share.state === 'pending' ? 'cancel' : 'revoke'}\n </BasicButton>\n <BasicButton\n disabled={action.pending}\n onClick={() => setConfirmation(null)}\n >\n Keep access\n </BasicButton>\n </div>\n ) : (\n <BasicButton\n disabled={action.pending || !canWrite}\n onClick={() => setConfirmation(share.id)}\n >\n {share.state === 'pending'\n ? 'Cancel invitation'\n : 'Revoke access'}\n </BasicButton>\n ))}\n </li>\n ))}\n </ul>\n )}\n </Tabs.Panel>\n </Tabs.Root>\n )\n}\n"],"mappings":"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","names":["useContext","BasicError","BasicError","useMemo","useEffect","useRef","useState","useSyncExternalStore","BasicError","useSyncExternalStore","BasicError","useRef","useState","useEffect","useMemo","useCallback","useMemo","useCallback","useMemo","useMemo","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useMemo","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useCallback","useCallback","useEffect","useState","useState","useEffect","BasicError","BasicError","jsx","useContext","createContext","useContext","useEffect","useRef","useState","BasicError","Fragment","jsx","createContext","useContext","BasicButton","useState","useRef","useEffect","BasicError"]}
1
+ {"version":3,"sources":["../src/create-basic.tsx","../src/context.ts","../src/create-client.ts","../src/adapters/broadcast-channel.ts","../src/adapters/navigation.ts","../src/adapters/persistence.ts","../src/adapters/storage.ts","../src/adapters/token-store.ts","../src/adapters/upload.ts","../src/provider.tsx","../src/hooks/accounts.ts","../src/hooks/client.ts","../src/hooks/auth.ts","../src/hooks/basic.ts","../src/hooks/db.ts","../src/hooks/repos.ts","../src/hooks/status.ts","../src/hooks/files.ts","../src/hooks/mounts.ts","../src/hooks/query.ts","../src/hooks/profile.ts","../src/hooks/invites.ts","../src/hooks/recipients.ts","../src/components.tsx","../src/avatar-marble.tsx"],"sourcesContent":["import { useContext, type ReactElement, type ReactNode } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n FileListQuery,\n InferValue,\n JsonObject,\n MountViewerFiles,\n MountsQuery,\n OwnerFiles,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\nimport { BasicProvider } from './provider'\nimport { useAccountsFor, type UseAccountsResult } from './hooks/accounts'\nimport { useAuthFor, type UseAuthResult } from './hooks/auth'\nimport { useBasicFor, type UseBasicResult } from './hooks/basic'\nimport { useCollectionFor } from './hooks/db'\nimport {\n useFilesFor,\n useStorageInfoFor,\n type UseFilesResult,\n type UseStorageInfoResult,\n} from './hooks/files'\nimport {\n useMountsFor,\n useOutgoingSharesFor,\n type UseMountsResult,\n type UseOutgoingSharesResult,\n} from './hooks/mounts'\nimport { useQueryFor, type UseQueryResult } from './hooks/query'\nimport { useReposFor, type UseReposResult } from './hooks/repos'\nimport { useProjectProfileFor, type UseProjectProfileResult } from './hooks/profile'\nimport { useShareInvitesFor, type UseShareInvitesResult } from './hooks/invites'\nimport { useShareRecipientsFor, type UseShareRecipientsResult } from './hooks/recipients'\nimport { useSchemaStatusFor, useSyncStatusFor, type UseSyncStatusResult } from './hooks/status'\nimport type { SchemaStatus } from '@basictech/core'\n\nexport type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & { schema: S }\n\nexport interface BoundBasicProviderProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport interface CreatedBasic<S extends BasicSchema> {\n client: BasicClient<S>\n Provider(props: BoundBasicProviderProps): ReactElement\n useBasic(): UseBasicResult<S>\n useAuth(): UseAuthResult\n useAccounts(): UseAccountsResult\n useDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n useDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n useDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n useCollection<T extends TableNames<S>>(\n name: T,\n options?: { source?: SourceRef },\n ): Collection<InferValue<S, T> & JsonObject>\n useQuery<T extends TableNames<S>>(\n collection: T,\n query?: Query<InferValue<S, T> & JsonObject>,\n options?: { source?: SourceRef },\n ): UseQueryResult<InferValue<S, T> & JsonObject>\n useSyncStatus(source?: SourceRef): UseSyncStatusResult\n useSchemaStatus(source?: SourceRef): SchemaStatus\n useRepos(): UseReposResult\n useProjectProfile(enabled?: boolean): UseProjectProfileResult\n useFiles(query?: FileListQuery, options?: { source?: SourceRef }): UseFilesResult\n useStorageInfo(): UseStorageInfoResult\n useMounts(query?: MountsQuery): UseMountsResult<S>\n useOutgoingShares(): UseOutgoingSharesResult\n useShareInvites(enabled?: boolean): UseShareInvitesResult\n useShareRecipients(dids: readonly string[]): UseShareRecipientsResult\n}\n\n/** Create one browser client and a complete hook surface bound to its schema. */\nexport function createBasic<const S extends BasicSchema>(config: CreateBasicConfig<S>): CreatedBasic<S> {\n const client = createBasicClient(config)\n\n function Provider({ children, renderWhileLoading }: BoundBasicProviderProps) {\n return (\n <BasicProvider client={client} renderWhileLoading={renderWhileLoading}>\n {children}\n </BasicProvider>\n )\n }\n\n /** The Provider owns start()/stop(); a bound hook outside it would read a client that never starts. */\n function useBound(): BasicClient<S> {\n if (useContext(BasicClientContext) !== client) {\n throw new Error('Bound Basic hooks must be used within their own <basic.Provider>')\n }\n return client\n }\n\n function useBoundDb(source: { mountId: string }): BasicDb<S, MountViewerFiles>\n function useBoundDb(source?: 'default' | { repoId: string }): BasicDb<S, OwnerFiles>\n function useBoundDb(source: SourceRef): BasicDb<S, OwnerFiles | MountViewerFiles>\n function useBoundDb(\n source: SourceRef = 'default',\n ): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useBound().db(source)\n }\n\n return {\n client,\n Provider,\n useBasic: () => useBasicFor(useBound()),\n useAuth: () => useAuthFor(useBound()),\n useAccounts: () => useAccountsFor(useBound()),\n useDb: useBoundDb,\n useCollection: (name, options = {}) => useCollectionFor(useBound(), name, options),\n useQuery: (collection, query = {}, options = {}) =>\n useQueryFor(useBound(), collection, query, options),\n useSyncStatus: (source) => useSyncStatusFor(useBound(), source),\n useSchemaStatus: (source = 'default') => useSchemaStatusFor(useBound(), source),\n useRepos: () => useReposFor(useBound()),\n useProjectProfile: (enabled) => useProjectProfileFor(useBound(), enabled),\n useFiles: (query = {}, options = {}) => useFilesFor(useBound(), query, options),\n useStorageInfo: () => useStorageInfoFor(useBound()),\n useMounts: (query = {}) => useMountsFor(useBound(), query),\n useOutgoingShares: () => useOutgoingSharesFor(useBound()),\n useShareInvites: (enabled) => useShareInvitesFor(useBound(), enabled),\n useShareRecipients: (dids) => useShareRecipientsFor(useBound(), dids),\n }\n}\n","import { createContext } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\n\nexport const BasicClientContext = createContext<BasicClient<BasicSchema> | null>(null)\n","import {\n MemoryKeyValueStorage,\n MemoryReplicaStoreFactory,\n createBasicClient as createCoreClient,\n type BasicClient,\n type BasicConfig,\n type BasicSchema,\n} from '@basictech/core'\nimport {\n createBrowserAuthChannelFactory,\n createBrowserMessageChannel,\n supportsAccessTokenAdoption,\n} from './adapters/broadcast-channel'\nimport { browserCurrentUrl, browserNavigate, browserReplaceUrl } from './adapters/navigation'\nimport { PersistenceStore } from './adapters/persistence'\nimport { browserStorage } from './adapters/storage'\nimport { BrowserTokenStore } from './adapters/token-store'\nimport { browserUploadTransport } from './adapters/upload'\n\nexport type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>\n\nfunction browserReconcileTrigger(listener: () => void): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n const onVisible = () => {\n if (document.visibilityState === 'visible') listener()\n }\n window.addEventListener('focus', listener)\n window.addEventListener('online', listener)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', listener)\n window.removeEventListener('online', listener)\n document.removeEventListener('visibilitychange', onVisible)\n }\n}\n\n/** Create a core client with the complete browser adapter set installed. */\nexport function createBasicClient<S extends BasicSchema>(\n config: BrowserBasicConfig<S>,\n): BasicClient<S> {\n const local = browserStorage('localStorage') ?? new MemoryKeyValueStorage()\n const session = browserStorage('sessionStorage') ?? new MemoryKeyValueStorage()\n const tokenStore = config.tokenStore ?? new BrowserTokenStore(local)\n const canBroadcast = typeof BroadcastChannel !== 'undefined'\n const canPersistReplica = typeof indexedDB !== 'undefined'\n // Cross-tab auth always uses BroadcastChannel; access-token adoption is added\n // when the token store keeps access tokens in memory (the browser default).\n const messageChannel = !canBroadcast\n ? undefined\n : supportsAccessTokenAdoption(tokenStore)\n ? createBrowserAuthChannelFactory(tokenStore)\n : createBrowserMessageChannel\n\n return createCoreClient({\n ...config,\n kv: config.kv ?? local,\n tokenStore,\n sessionStorage: config.sessionStorage ?? session,\n replicaStore: config.replicaStore ?? (\n canPersistReplica ? new PersistenceStore(config.clientId) : new MemoryReplicaStoreFactory()\n ),\n navigate: config.navigate ?? browserNavigate,\n currentUrl: config.currentUrl ?? browserCurrentUrl,\n replaceUrl: config.replaceUrl ?? browserReplaceUrl,\n reconcileTrigger: config.reconcileTrigger ?? browserReconcileTrigger,\n createMessageChannel: config.createMessageChannel ?? messageChannel,\n uploadTransport: config.uploadTransport ?? (\n typeof XMLHttpRequest === 'undefined' ? undefined : browserUploadTransport\n ),\n })\n}\n","import type { AuthChannelContext, AuthMessageChannel } from '@basictech/core'\nimport type { BrowserTokenStore } from './token-store'\n\n/** The subset of BrowserTokenStore the auth channel needs; any token store providing it works. */\nexport type AccessTokenAdopter = Pick<BrowserTokenStore, 'accessToken' | 'adoptAccessToken'>\n\nexport function supportsAccessTokenAdoption(store: unknown): store is AccessTokenAdopter {\n const candidate = store as Partial<AccessTokenAdopter> | null\n return typeof candidate?.accessToken === 'function' && typeof candidate?.adoptAccessToken === 'function'\n}\n\nexport interface BrowserMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AccessTokenMessage {\n type?: string\n expiresAt?: number\n __basicAccessToken?: string\n __basicRefreshToken?: string\n}\n\n/** Core message-channel adapter backed by the browser BroadcastChannel API. */\nexport function createBrowserMessageChannel(name: string): BrowserMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: BrowserMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Access tokens may cross tabs transiently but are never written to browser\n * storage. The receiving adapter adopts the token before core handles the\n * ordinary token-rotation notification. Core supplies the token key for the\n * profile's auth channel; channels without a context (the accounts channel)\n * are plain BroadcastChannels.\n */\nexport function createBrowserAuthChannelFactory(\n tokenStore: AccessTokenAdopter,\n): (name: string, context?: AuthChannelContext) => AuthMessageChannel {\n return (name, context) => {\n const channel = createBrowserMessageChannel(name)\n if (!context) return channel\n const { tokenKey } = context\n const adapter: AuthMessageChannel = {\n postMessage: (message) => {\n const outgoing = message as AccessTokenMessage\n const access = outgoing?.type === 'tokens' ? tokenStore.accessToken(tokenKey) : null\n channel.postMessage(access ? {\n ...outgoing,\n expiresAt: access.expiresAt,\n __basicAccessToken: access.value,\n __basicRefreshToken: access.refreshToken,\n } satisfies AccessTokenMessage : message)\n },\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => {\n void (async () => {\n const incoming = event.data as AccessTokenMessage\n if (incoming?.type === 'tokens' && incoming.__basicAccessToken && incoming.__basicRefreshToken) {\n await tokenStore.adoptAccessToken(\n tokenKey,\n incoming.__basicAccessToken,\n incoming.expiresAt ?? 0,\n incoming.__basicRefreshToken,\n )\n }\n adapter.onmessage?.({ data: event.data })\n })()\n }\n return adapter\n }\n}\n","import { BasicError } from '@basictech/core'\n\nexport function browserNavigate(url: string): void {\n if (typeof location === 'undefined') throw new BasicError('NAVIGATE_ADAPTER_REQUIRED')\n location.assign(url)\n}\n\nexport function browserCurrentUrl(): string {\n return typeof location === 'undefined' ? '' : location.href\n}\n\nexport function browserReplaceUrl(url: string): void {\n if (typeof history !== 'undefined') history.replaceState({}, '', url)\n}\n","import Dexie, { type Table } from 'dexie'\nimport {\n BasicError,\n partitionKey,\n type PersistedReplicaState,\n type PersistenceLeaderHooks,\n type ReplicaStore,\n type ReplicaStoreFactory,\n type StoragePartition,\n type SyncOp,\n} from '@basictech/core'\n\nexport type { PersistedReplicaState, StoragePartition } from '@basictech/core'\n\ninterface PartitionRow {\n key: string\n profileId: string\n state: PersistedReplicaState\n updatedAt: number\n}\n\nexport interface ReplicaMessageChannel {\n postMessage(message: unknown): void\n close(): void\n onmessage: ((event: { data: unknown }) => void) | null\n}\n\ninterface AvailableLock {\n name: string\n}\n\nexport interface BrowserLockManager {\n request<T>(\n name: string,\n options: { mode?: 'exclusive'; ifAvailable?: true },\n callback: (lock: AvailableLock | null) => T | Promise<T>,\n ): Promise<T>\n}\n\nexport interface PersistenceStoreOptions {\n locks?: BrowserLockManager | null\n createChannel?: ((name: string) => ReplicaMessageChannel) | null\n}\n\ntype CoordinatorMessage =\n | { type: 'mutation'; requestId: string; operation: SyncOp }\n | { type: 'mutation-result'; requestId: string; opId?: string; code?: string; message?: string }\n | { type: 'state'; state: PersistedReplicaState }\n\nfunction browserLocks(): BrowserLockManager | null {\n if (typeof navigator === 'undefined' || !navigator.locks) return null\n return navigator.locks as unknown as BrowserLockManager\n}\n\nfunction browserChannel(name: string): ReplicaMessageChannel {\n const channel = new BroadcastChannel(name)\n const adapter: ReplicaMessageChannel = {\n postMessage: (message) => channel.postMessage(message),\n close: () => channel.close(),\n onmessage: null,\n }\n channel.onmessage = (event) => adapter.onmessage?.({ data: event.data })\n return adapter\n}\n\n/**\n * Per-partition single-writer coordinator. With Web Locks, followers forward\n * mutations and consume committed-state broadcasts. Browsers lacking Locks\n * use the documented degraded last-committed-writer-wins mode: every tab may\n * write, the version guard rejects stale commits, and broadcasts refresh\n * surviving views. Concurrent offline intent can be lost in that fallback.\n */\nclass PartitionCoordinator implements PersistenceLeaderHooks {\n private readonly mutationListeners = new Set<(operation: SyncOp) => Promise<string>>()\n private readonly stateListeners = new Set<(state: PersistedReplicaState) => void>()\n private readonly leadershipListeners = new Set<(isLeader: boolean) => void | Promise<void>>()\n private readonly pending = new Map<string, {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n }>()\n private readonly election: Promise<boolean>\n private leadershipReady: Promise<void> = Promise.resolve()\n private releaseLock: (() => void) | null = null\n private leader = true\n private closed = false\n\n constructor(\n name: string,\n locks: BrowserLockManager | null,\n private readonly channel: ReplicaMessageChannel | null,\n ) {\n this.channel && (this.channel.onmessage = (event) => this.receive(event.data))\n if (!locks || !channel) {\n this.election = Promise.resolve(true)\n return\n }\n this.leader = false\n this.election = new Promise<boolean>((resolve) => {\n void locks.request(`basic-replica:${name}`, { ifAvailable: true }, async (lock) => {\n this.setLeader(Boolean(lock))\n resolve(this.leader)\n if (!lock) {\n this.waitForLeadership(locks, name)\n return\n }\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n }).catch(() => {\n this.setLeader(true)\n resolve(true)\n })\n })\n }\n\n async isLeader(): Promise<boolean> {\n await this.election\n await this.leadershipReady\n return this.leader\n }\n\n subscribeLeadership(listener: (isLeader: boolean) => void | Promise<void>): () => void {\n this.leadershipListeners.add(listener)\n return () => this.leadershipListeners.delete(listener)\n }\n\n async forwardMutation(operation: SyncOp): Promise<string> {\n if (await this.isLeader()) return this.dispatchMutation(operation)\n if (this.closed) throw new BasicError('PARTITION_COORDINATOR_CLOSED')\n if (!this.channel) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n const requestId = crypto.randomUUID()\n return new Promise<string>((resolve, reject) => {\n const flight = { operation, resolve, reject, deadline: Date.now() + 10_000 }\n this.pending.set(requestId, flight)\n this.sendPending(requestId, flight)\n })\n }\n\n subscribeMutations(listener: (operation: SyncOp) => Promise<string>): () => void {\n this.mutationListeners.add(listener)\n return () => this.mutationListeners.delete(listener)\n }\n\n publishState(state: PersistedReplicaState): void {\n this.channel?.postMessage({ type: 'state', state } satisfies CoordinatorMessage)\n }\n\n subscribeState(listener: (state: PersistedReplicaState) => void): () => void {\n this.stateListeners.add(listener)\n return () => this.stateListeners.delete(listener)\n }\n\n close(): void {\n this.closed = true\n this.setLeader(false)\n this.releaseLock?.()\n this.releaseLock = null\n this.channel?.close()\n for (const flight of this.pending.values()) {\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(new BasicError('PARTITION_COORDINATOR_CLOSED'))\n }\n this.pending.clear()\n }\n\n private waitForLeadership(locks: BrowserLockManager, name: string): void {\n void locks.request(`basic-replica:${name}`, { mode: 'exclusive' }, async (lock) => {\n if (!lock || this.closed) return\n this.setLeader(true)\n await new Promise<void>((release) => {\n this.releaseLock = release\n })\n this.setLeader(false)\n }).catch(() => {\n if (!this.closed) this.setLeader(true)\n })\n }\n\n private setLeader(isLeader: boolean): void {\n if (this.leader === isLeader) return\n this.leader = isLeader\n this.leadershipReady = Promise.all(\n [...this.leadershipListeners].map((listener) => listener(isLeader)),\n ).then(() => {})\n if (isLeader) void this.leadershipReady.then(() => this.drainPending()).catch(() => {})\n }\n\n private receive(value: unknown): void {\n if (this.closed || !value || typeof value !== 'object') return\n const message = value as CoordinatorMessage\n if (message.type === 'state') {\n for (const listener of this.stateListeners) listener(structuredClone(message.state))\n } else if (message.type === 'mutation' && this.leader) {\n void this.leadershipReady.then(() => this.dispatchMutation(message.operation)).then(\n (opId) => this.channel?.postMessage({\n type: 'mutation-result', requestId: message.requestId, opId,\n } satisfies CoordinatorMessage),\n (error: unknown) => this.channel?.postMessage({\n type: 'mutation-result',\n requestId: message.requestId,\n code: error instanceof BasicError ? error.code : 'FORWARDED_MUTATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n } satisfies CoordinatorMessage),\n )\n } else if (message.type === 'mutation-result') {\n const flight = this.pending.get(message.requestId)\n if (!flight) return\n if (!message.opId && (message.code === 'STALE_STATE_VERSION' ||\n message.code === 'PARTITION_LEADER_UNAVAILABLE')) {\n this.sendPending(message.requestId, flight)\n return\n }\n this.pending.delete(message.requestId)\n if (flight.timer) clearTimeout(flight.timer)\n if (message.opId) flight.resolve(message.opId)\n else flight.reject(new BasicError(message.code ?? 'FORWARDED_MUTATION_FAILED', message.message))\n }\n }\n\n private async dispatchMutation(operation: SyncOp): Promise<string> {\n const listener = this.mutationListeners.values().next().value\n if (!listener) throw new BasicError('PARTITION_LEADER_UNAVAILABLE')\n return listener(operation)\n }\n\n private drainPending(): void {\n for (const [requestId, flight] of this.pending) {\n void this.dispatchMutation(flight.operation).then(\n (opId) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.resolve(opId)\n },\n (error: unknown) => {\n if (this.pending.get(requestId) !== flight) return\n this.pending.delete(requestId)\n if (flight.timer) clearTimeout(flight.timer)\n flight.reject(error instanceof Error ? error : new BasicError('FORWARDED_MUTATION_FAILED'))\n },\n )\n }\n }\n\n private sendPending(\n requestId: string,\n flight: {\n operation: SyncOp\n resolve: (opId: string) => void\n reject: (error: Error) => void\n deadline: number\n timer?: ReturnType<typeof setTimeout>\n },\n ): void {\n if (this.pending.get(requestId) !== flight) return\n if (flight.timer) clearTimeout(flight.timer)\n const remaining = flight.deadline - Date.now()\n if (remaining <= 0) {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_TIMEOUT'))\n return\n }\n try {\n this.channel?.postMessage({\n type: 'mutation', requestId, operation: flight.operation,\n } satisfies CoordinatorMessage)\n } catch {\n this.pending.delete(requestId)\n flight.reject(new BasicError('PARTITION_LEADER_UNAVAILABLE'))\n return\n }\n flight.timer = setTimeout(() => this.sendPending(requestId, flight), Math.min(100, remaining))\n }\n}\n\nclass DexieReplicaStore implements ReplicaStore {\n constructor(\n private readonly table: Table<PartitionRow, string>,\n readonly partition: StoragePartition,\n readonly key: string,\n readonly leader: PartitionCoordinator,\n ) {}\n\n async load(): Promise<PersistedReplicaState | null> {\n return (await this.table.get(this.key))?.state ?? null\n }\n\n async save(state: PersistedReplicaState): Promise<void> {\n if (!Number.isSafeInteger(state.version) || state.version < 1) {\n throw new BasicError('INVALID_STATE_VERSION')\n }\n await this.table.db.transaction('rw', this.table, async () => {\n const current = await this.table.get(this.key)\n if ((current?.state.version ?? 0) >= state.version) throw new BasicError('STALE_STATE_VERSION')\n await this.table.put({\n key: this.key,\n profileId: this.partition.profileId,\n state: structuredClone(state),\n updatedAt: Date.now(),\n })\n })\n this.leader.publishState(structuredClone(state))\n }\n\n async delete(): Promise<void> {\n await this.table.delete(this.key)\n }\n}\n\n/** Dexie adapter for core's six-field, version-guarded replica store. */\nexport class PersistenceStore implements ReplicaStoreFactory {\n private readonly db: Dexie\n private readonly stores = new Map<string, DexieReplicaStore>()\n private readonly locks: BrowserLockManager | null\n private readonly createChannel: ((name: string) => ReplicaMessageChannel) | null\n private opened = false\n\n constructor(appKey: string, options: PersistenceStoreOptions = {}) {\n this.db = new Dexie(`basic:${appKey}`)\n this.db.version(1).stores({ partitions: 'key' })\n this.db.version(2).stores({ partitions: 'key,profileId' }).upgrade((transaction) =>\n transaction.table('partitions').clear())\n this.locks = options.locks === undefined ? browserLocks() : options.locks\n this.createChannel = options.createChannel === undefined\n ? (typeof BroadcastChannel === 'undefined' ? null : browserChannel)\n : options.createChannel\n }\n\n private get partitions(): Table<PartitionRow, string> {\n return this.db.table<PartitionRow, string>('partitions')\n }\n\n async open(): Promise<void> {\n if (this.opened) return\n await cleanupLegacyState()\n await this.db.open()\n this.opened = true\n }\n\n forPartition(partition: StoragePartition): ReplicaStore {\n const key = partitionKey(partition)\n let store = this.stores.get(key)\n if (!store) {\n const channelName = `basic-replica:${this.db.name}:${key}`\n const channel = this.createChannel?.(channelName) ?? null\n const leader = new PartitionCoordinator(channelName, this.locks, channel)\n store = new DexieReplicaStore(this.partitions, { ...partition }, key, leader)\n this.stores.set(key, store)\n }\n return store\n }\n\n async deleteProfile(profileId: string): Promise<void> {\n await this.partitions.where('profileId').equals(profileId).delete()\n for (const [key, store] of this.stores) {\n if (store.partition.profileId !== profileId) continue\n store.leader.close()\n this.stores.delete(key)\n }\n }\n\n close(): void {\n for (const store of this.stores.values()) store.leader.close()\n this.stores.clear()\n if (this.opened) this.db.close()\n this.opened = false\n }\n}\n\n/** Best-effort cleanup of pre-repo-era IndexedDB databases. */\nexport async function cleanupLegacyState(): Promise<void> {\n try {\n const idb = (globalThis as { indexedDB?: IDBFactory }).indexedDB\n if (!idb || typeof idb.databases !== 'function') return\n for (const info of await idb.databases()) {\n if (!info.name?.startsWith('basic-sync:')) continue\n await new Promise<void>((resolve) => {\n const request = idb.deleteDatabase(info.name!)\n request.onsuccess = request.onerror = request.onblocked = () => resolve()\n })\n }\n } catch {\n // Legacy cleanup is deliberately best effort.\n }\n}\n","import type { KeyValueStorage } from '@basictech/core'\n\n/** Synchronous browser Storage adapted to core's key-value contract. */\nexport class BrowserKeyValueStorage implements KeyValueStorage {\n constructor(private readonly storage: Storage) {}\n\n get(key: string): string | null {\n return this.storage.getItem(key)\n }\n\n set(key: string, value: string): void {\n this.storage.setItem(key, value)\n }\n\n remove(key: string): void {\n this.storage.removeItem(key)\n }\n}\n\nexport function browserStorage(\n name: 'localStorage' | 'sessionStorage',\n): BrowserKeyValueStorage | null {\n try {\n const storage = globalThis[name]\n return storage ? new BrowserKeyValueStorage(storage) : null\n } catch {\n return null\n }\n}\n","import type { KeyValueStorage, TokenSet, TokenStore } from '@basictech/core'\n\nconst ACCESS_TOKEN_ADOPTION_TIMEOUT_MS = 100\n\ninterface MemoryAccessToken {\n value: string\n expiresAt: number\n refreshToken: string\n}\n\ninterface AccessWaiter {\n refreshToken: string\n resolve(access: MemoryAccessToken | null): void\n}\n\ntype PersistedTokenSet = Omit<TokenSet, 'access_token' | 'expires_at'>\n\nfunction parseTokens(value: string | null): Partial<TokenSet> | null {\n if (!value) return null\n try {\n const parsed = JSON.parse(value) as Partial<TokenSet>\n return parsed && typeof parsed === 'object' ? parsed : null\n } catch {\n return null\n }\n}\n\n/**\n * Browser token policy: refresh tokens survive reloads in the supplied\n * persistent store; access tokens exist only in this JavaScript realm.\n */\nexport class BrowserTokenStore implements TokenStore {\n private readonly accessTokens = new Map<string, MemoryAccessToken>()\n private readonly accessWaiters = new Map<string, AccessWaiter[]>()\n\n constructor(private readonly persistent: KeyValueStorage) {}\n\n async get(key: string): Promise<string | null> {\n const persisted = parseTokens(await this.persistent.get(key))\n if (!persisted?.refresh_token || typeof persisted.token_type !== 'string') return null\n const refreshToken = persisted.refresh_token\n let access = this.accessTokens.get(key)\n if (access && access.refreshToken !== refreshToken) {\n access = await this.waitForAccessToken(key, refreshToken) ?? undefined\n }\n return JSON.stringify({\n ...persisted,\n access_token: access?.refreshToken === refreshToken ? access.value : '',\n expires_at: access?.refreshToken === refreshToken ? access.expiresAt : 0,\n token_type: persisted.token_type,\n refresh_token: refreshToken,\n } satisfies TokenSet)\n }\n\n async set(key: string, value: string): Promise<void> {\n const tokens = parseTokens(value)\n if (!tokens?.refresh_token || typeof tokens.access_token !== 'string' ||\n typeof tokens.token_type !== 'string') {\n throw new TypeError('invalid token set')\n }\n this.accessTokens.set(key, {\n value: tokens.access_token,\n expiresAt: tokens.expires_at ?? 0,\n refreshToken: tokens.refresh_token,\n })\n const { access_token: _accessToken, expires_at: _expiresAt, ...persisted } = tokens\n await this.persistent.set(key, JSON.stringify(persisted satisfies Partial<PersistedTokenSet>))\n this.resolveAccessWaiters(key)\n }\n\n async remove(key: string): Promise<void> {\n this.accessTokens.delete(key)\n for (const waiter of this.accessWaiters.get(key) ?? []) waiter.resolve(null)\n this.accessWaiters.delete(key)\n await this.persistent.remove(key)\n }\n\n accessToken(key: string): MemoryAccessToken | null {\n return this.accessTokens.get(key) ?? null\n }\n\n async adoptAccessToken(\n key: string,\n value: string,\n expiresAt: number,\n refreshToken: string,\n ): Promise<void> {\n if (!value) return\n const persisted = parseTokens(await this.persistent.get(key))\n if (persisted?.refresh_token !== refreshToken) return\n this.accessTokens.set(key, { value, expiresAt, refreshToken })\n this.resolveAccessWaiters(key)\n }\n\n private resolveAccessWaiters(key: string): void {\n const access = this.accessTokens.get(key)\n if (!access) return\n const waiting = this.accessWaiters.get(key) ?? []\n const remaining = waiting.filter((waiter) => {\n if (waiter.refreshToken !== access.refreshToken) return true\n waiter.resolve(access)\n return false\n })\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n }\n\n private waitForAccessToken(key: string, refreshToken: string): Promise<MemoryAccessToken | null> {\n return new Promise((resolve) => {\n let timer: ReturnType<typeof setTimeout>\n const waiter: AccessWaiter = {\n refreshToken,\n resolve: (access) => {\n clearTimeout(timer)\n resolve(access)\n },\n }\n const waiters = this.accessWaiters.get(key) ?? []\n waiters.push(waiter)\n this.accessWaiters.set(key, waiters)\n timer = setTimeout(() => {\n const remaining = (this.accessWaiters.get(key) ?? [])\n .filter((candidate) => candidate !== waiter)\n if (remaining.length) this.accessWaiters.set(key, remaining)\n else this.accessWaiters.delete(key)\n resolve(null)\n }, ACCESS_TOKEN_ADOPTION_TIMEOUT_MS)\n })\n }\n}\n","import {\n BasicError,\n type UploadTransportAdapter,\n type UploadTransportRequest,\n} from '@basictech/core'\n\nfunction responseHeaders(xhr: XMLHttpRequest): Headers {\n const headers = new Headers()\n for (const line of xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/)) {\n if (!line) continue\n const separator = line.indexOf(':')\n if (separator > 0) headers.append(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\n }\n return headers\n}\n\n/** Browser multipart transport with upload progress, adapted from the Drive UI. */\nexport const browserUploadTransport: UploadTransportAdapter = {\n upload(request: UploadTransportRequest): Promise<Response> {\n if (typeof XMLHttpRequest === 'undefined') {\n return Promise.reject(new BasicError('XHR_UNAVAILABLE'))\n }\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n let settled = false\n const finish = (callback: () => void) => {\n if (settled) return\n settled = true\n if (request.signal) request.signal.removeEventListener('abort', abort)\n callback()\n }\n const abort = () => xhr.abort()\n\n xhr.open('POST', request.url)\n if (request.accessToken) xhr.setRequestHeader('authorization', `Bearer ${request.accessToken}`)\n xhr.setRequestHeader('idempotency-key', request.idempotencyKey)\n if (request.onProgress) {\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) request.onProgress?.(event.loaded, event.total)\n }\n }\n if (request.signal) {\n if (request.signal.aborted) {\n reject(request.signal.reason ?? new DOMException('Aborted', 'AbortError'))\n return\n }\n request.signal.addEventListener('abort', abort, { once: true })\n }\n xhr.onload = () => finish(() => resolve(new Response(xhr.responseText || null, {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: responseHeaders(xhr),\n })))\n xhr.onerror = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload could not reach the server')))\n xhr.onabort = () => finish(() => reject(request.signal?.reason ?? new DOMException('Aborted', 'AbortError')))\n xhr.ontimeout = () => finish(() => reject(new BasicError('NETWORK_ERROR', 'the upload timed out')))\n\n const form = new FormData()\n form.append('path', request.path)\n if (request.name !== undefined) form.append('name', request.name)\n if (request.mtime !== undefined) form.append('mtime', String(request.mtime))\n form.append('file', request.file, request.filename)\n xhr.send(form)\n })\n },\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { BasicClient, BasicSchema } from '@basictech/core'\nimport { BasicClientContext } from './context'\nimport { createBasicClient, type BrowserBasicConfig } from './create-client'\n\ninterface ProviderChildrenProps {\n children: ReactNode\n renderWhileLoading?: boolean\n}\n\nexport type BasicProviderProps<S extends BasicSchema = BasicSchema> = ProviderChildrenProps & (\n | { client: BasicClient<S> }\n | (BrowserBasicConfig<S> & { client?: never })\n)\n\ninterface ClientLifecycle {\n references: number\n start: Promise<void> | null\n stopTimer: ReturnType<typeof setTimeout> | null\n}\n\nconst clientLifecycles = new WeakMap<BasicClient<BasicSchema>, ClientLifecycle>()\n\nfunction retainClient(client: BasicClient<BasicSchema>): {\n started: Promise<void>\n release: () => void\n} {\n let lifecycle = clientLifecycles.get(client)\n if (!lifecycle) {\n lifecycle = { references: 0, start: null, stopTimer: null }\n clientLifecycles.set(client, lifecycle)\n }\n lifecycle.references += 1\n if (lifecycle.stopTimer) {\n clearTimeout(lifecycle.stopTimer)\n lifecycle.stopTimer = null\n }\n lifecycle.start ??= Promise.resolve(client.start()).catch((error: unknown) => {\n lifecycle!.start = null\n throw error\n })\n\n let released = false\n return {\n started: lifecycle.start,\n release: () => {\n if (released) return\n released = true\n lifecycle!.references = Math.max(0, lifecycle!.references - 1)\n if (lifecycle!.references > 0 || lifecycle!.stopTimer) return\n lifecycle!.stopTimer = setTimeout(() => {\n lifecycle!.stopTimer = null\n if (lifecycle!.references > 0) return\n const started = lifecycle!.start ?? Promise.resolve()\n void started.catch(() => {}).then(() => {\n if (lifecycle!.references > 0) return\n client.stop()\n lifecycle!.start = null\n })\n }, 0)\n },\n }\n}\n\n/** Generic provider for schema-less or explicitly generic applications. */\nexport function BasicProvider<S extends BasicSchema = BasicSchema>(props: BasicProviderProps<S>) {\n const clientRef = useRef<BasicClient<S> | null>(null)\n if (!clientRef.current) {\n if ('client' in props && props.client) {\n clientRef.current = props.client\n } else {\n const { children: _children, renderWhileLoading: _renderWhileLoading, ...config } = props\n clientRef.current = createBasicClient(config as BrowserBasicConfig<S>)\n }\n }\n const client = clientRef.current\n const [startError, setStartError] = useState<unknown>(null)\n\n useEffect(() => {\n let active = true\n const retained = retainClient(client as BasicClient<BasicSchema>)\n void retained.started.catch((error: unknown) => {\n if (active) setStartError(error)\n })\n return () => {\n active = false\n retained.release()\n }\n }, [client])\n\n const snapshot = useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n if (startError) throw startError\n\n return (\n <BasicClientContext.Provider value={client as BasicClient<BasicSchema>}>\n {(snapshot.isReady || props.renderWhileLoading) && props.children}\n </BasicClientContext.Provider>\n )\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicAccount, BasicClient, BasicProfile, BasicSchema } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAccountsResult {\n accounts: BasicAccount[]\n activeAccount: BasicAccount | null\n switchAccount(id: string): Promise<void>\n addAccount(options?: { signIn?: boolean }): Promise<BasicProfile>\n removeAccount(id: string): Promise<void>\n}\n\nexport function useAccountsFor<S extends BasicSchema>(client: BasicClient<S>): UseAccountsResult {\n const snapshot = useClientSnapshot(client)\n const switchAccount = useCallback((id: string) => client.switchAccount(id), [client])\n const addAccount = useCallback((options?: { signIn?: boolean }) => client.addAccount(options), [client])\n const removeAccount = useCallback((id: string) => client.removeAccount(id), [client])\n\n return useMemo(() => ({\n accounts: snapshot.accounts,\n activeAccount: snapshot.activeAccount,\n switchAccount,\n addAccount,\n removeAccount,\n }), [snapshot.accounts, snapshot.activeAccount, switchAccount, addAccount, removeAccount])\n}\n\nexport function useAccounts(): UseAccountsResult {\n return useAccountsFor(useRequiredClient())\n}\n","import { useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicClientSnapshot,\n type BasicSchema,\n} from '@basictech/core'\nimport { BasicClientContext } from '../context'\n\nexport interface AsyncResult<T> {\n data: T\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useRequiredClient<S extends BasicSchema = BasicSchema>(): BasicClient<S> {\n const client = useContext(BasicClientContext)\n if (!client) throw new Error('Basic hooks must be used within a <BasicProvider>')\n return client as unknown as BasicClient<S>\n}\n\nexport function useClientSnapshot<S extends BasicSchema>(\n client: BasicClient<S>,\n): BasicClientSnapshot {\n return useSyncExternalStore(client.subscribe, client.getSnapshot, client.getSnapshot)\n}\n\n/**\n * Server-backed lists need a signed-in account. While one is missing, the hook\n * reports the read-only reason as its error instead of an indistinguishable empty list.\n * This prerequisite error is stable within each hook. It is distinct from the\n * raw auth diagnostic (for example invalid_grant) exposed by useAuth().error.\n */\nexport function useSignInGate(snapshot: BasicClientSnapshot): BasicError | null {\n const code = snapshot.isReady && !snapshot.isSignedIn\n ? snapshot.readOnlyReason ?? 'AUTHORIZATION_REQUIRED'\n : null\n return useMemo(() => code === null ? null : new BasicError(code, code === 'AUTH_EXPIRED'\n ? 'Session expired. Sign in again to load this list.'\n : 'Sign in to load this list.'), [code])\n}\n\nexport function toBasicError(error: unknown, fallback = 'UNKNOWN_ERROR'): BasicError {\n if (error instanceof BasicError) return error\n return new BasicError(fallback, error instanceof Error ? error.message : String(error))\n}\n\nexport function useAsyncResult<T>(\n load: () => Promise<T>,\n initialData: T,\n enabled: boolean,\n settled: boolean,\n dependencies: readonly unknown[],\n): AsyncResult<T> {\n const loadRef = useRef(load)\n loadRef.current = load\n const [refreshVersion, setRefreshVersion] = useState(0)\n const [state, setState] = useState<Omit<AsyncResult<T>, 'refresh'>>({\n data: initialData,\n isLoading: !settled || enabled,\n error: null,\n })\n\n useEffect(() => {\n let active = true\n if (!enabled) {\n setState({ data: initialData, isLoading: !settled, error: null })\n return () => {\n active = false\n }\n }\n setState((current) => ({ ...current, isLoading: true, error: null }))\n void loadRef.current().then(\n (data) => {\n if (active) setState({ data, isLoading: false, error: null })\n },\n (error: unknown) => {\n if (active) setState((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error),\n }))\n },\n )\n return () => {\n active = false\n }\n // The caller supplies semantic dependencies; load identity is held in a ref.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, settled, refreshVersion, ...dependencies])\n\n return {\n ...state,\n refresh: () => setRefreshVersion((version) => version + 1),\n }\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n AuthStatus,\n AuthUser,\n BasicClient,\n BasicError,\n BasicSchema,\n ReadOnlyReason,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseAuthResult {\n isReady: boolean\n isSignedIn: boolean\n isAnonymous: boolean\n canWrite: boolean\n readOnlyReason: ReadOnlyReason | null\n status: AuthStatus\n /** Raw auth diagnostic; stable identity while its code and expired state are unchanged. */\n error: BasicError | null\n user: AuthUser | null\n did: string | null\n handle: string | null\n signIn(input?: string): Promise<void>\n signOut(): Promise<void>\n getToken(): Promise<string>\n}\n\nexport function useAuthFor<S extends BasicSchema>(client: BasicClient<S>): UseAuthResult {\n const snapshot = useClientSnapshot(client)\n const signIn = useCallback((input?: string) => client.signIn(input), [client])\n const signOut = useCallback(() => client.signOut(), [client])\n const getToken = useCallback(() => client.getToken(), [client])\n\n return useMemo(() => ({\n isReady: snapshot.isReady,\n isSignedIn: snapshot.isSignedIn,\n isAnonymous: snapshot.isAnonymous,\n canWrite: snapshot.canWrite,\n readOnlyReason: snapshot.readOnlyReason,\n status: snapshot.authStatus,\n error: snapshot.authError,\n user: snapshot.user,\n did: snapshot.did,\n handle: snapshot.handle,\n signIn,\n signOut,\n getToken,\n }), [snapshot, signIn, signOut, getToken])\n}\n\nexport function useAuth(): UseAuthResult {\n return useAuthFor(useRequiredClient())\n}\n","import { useMemo } from 'react'\nimport type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Repo,\n} from '@basictech/core'\nimport { useAccountsFor, type UseAccountsResult } from './accounts'\nimport { useAuthFor, type UseAuthResult } from './auth'\nimport { useRequiredClient } from './client'\nimport { useDbFor } from './db'\nimport { useReposFor } from './repos'\nimport { useSyncStatusFor, type UseSyncStatusResult } from './status'\n\nexport interface UseBasicResult<S extends BasicSchema = BasicSchema> extends UseAuthResult {\n client: BasicClient<S>\n db: BasicDb<S>\n accounts: UseAccountsResult\n sync: UseSyncStatusResult\n repos: Repo[]\n}\n\nexport function useBasicFor<S extends BasicSchema>(client: BasicClient<S>): UseBasicResult<S> {\n const auth = useAuthFor(client)\n const accounts = useAccountsFor(client)\n const sync = useSyncStatusFor(client)\n const repos = useReposFor(client).repos\n const db = useDbFor(client)\n return useMemo(() => ({\n ...auth,\n client,\n db,\n accounts,\n sync,\n repos,\n }), [auth, client, db, accounts, sync, repos])\n}\n\nexport function useBasic<S extends BasicSchema = BasicSchema>(): UseBasicResult<S> {\n return useBasicFor(useRequiredClient<S>())\n}\n","import type {\n BasicClient,\n BasicDb,\n BasicSchema,\n Collection,\n InferValue,\n JsonObject,\n MountViewerFiles,\n OwnerFiles,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { useRequiredClient } from './client'\n\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDbFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return client.db(source)\n}\n\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: { mountId: string },\n): BasicDb<S, MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source?: 'default' | { repoId: string },\n): BasicDb<S, OwnerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef,\n): BasicDb<S, OwnerFiles | MountViewerFiles>\nexport function useDb<S extends BasicSchema = BasicSchema>(\n source: SourceRef = 'default',\n): BasicDb<S, OwnerFiles | MountViewerFiles> {\n return useRequiredClient<S>().db(source)\n}\n\nexport function useCollectionFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n name: T,\n options: { source?: SourceRef } = {},\n): Collection<InferValue<S, T> & JsonObject> {\n return client.db(options.source ?? 'default').collection(name)\n}\n\nexport function useCollection<V extends JsonObject = JsonObject>(\n name: string,\n options: { source?: SourceRef } = {},\n): Collection<V> {\n return useRequiredClient().db(options.source ?? 'default').collection<V>(name)\n}\n","import { useCallback, useMemo } from 'react'\nimport type { BasicClient, BasicSchema, JsonObject, Repo } from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseReposResult {\n repos: Repo[]\n defaultRepoId: string | null\n refresh(): Promise<Repo[]>\n create(input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }): Promise<Repo>\n archive(repoId: string): Promise<void>\n}\n\nexport function useReposFor<S extends BasicSchema>(client: BasicClient<S>): UseReposResult {\n const snapshot = useClientSnapshot(client)\n const refresh = useCallback(() => client.refreshRepos(), [client])\n const create = useCallback((input: {\n name: string\n schema_type?: Repo['schema_type']\n schema?: JsonObject\n }) => client.createRepo(input), [client])\n const archive = useCallback((repoId: string) => client.archiveRepo(repoId), [client])\n\n return useMemo(() => ({\n repos: snapshot.repos,\n defaultRepoId: snapshot.defaultRepoId,\n refresh,\n create,\n archive,\n }), [snapshot.repos, snapshot.defaultRepoId, refresh, create, archive])\n}\n\nexport function useRepos(): UseReposResult {\n return useReposFor(useRequiredClient())\n}\n","import { useCallback, useMemo } from 'react'\nimport type {\n BasicClient,\n BasicConflict,\n BasicRejection,\n BasicSchema,\n BasicSyncStatus,\n SchemaStatus,\n SourceRef,\n} from '@basictech/core'\nimport { useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseSyncStatusResult {\n status: BasicSyncStatus\n pendingCount: number\n rejected: BasicRejection[]\n conflicts: BasicConflict[]\n resolveConflict(opId: string, choice: 'keep-mine' | 'keep-theirs'): Promise<boolean>\n discardRejected(opId: string): Promise<boolean>\n}\n\nexport function useSyncStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source?: SourceRef,\n): UseSyncStatusResult {\n const snapshot = useClientSnapshot(client)\n const sourceKey = JSON.stringify(source)\n const resolveConflict = useCallback(\n (opId: string, choice: 'keep-mine' | 'keep-theirs') =>\n client.resolveConflict(opId, choice, source ?? 'default'),\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const discardRejected = useCallback(\n (opId: string) => client.discardRejected(opId, source ?? 'default'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n\n return useMemo(() => ({\n status: source === undefined ? snapshot.syncStatus : client.status(source),\n pendingCount: client.pending(source).length,\n rejected: client.rejected(source),\n conflicts: client.conflicts(source),\n resolveConflict,\n discardRejected,\n // sourceKey captures semantic source identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [client, snapshot, sourceKey, resolveConflict, discardRejected])\n}\n\nexport function useSyncStatus(source?: SourceRef): UseSyncStatusResult {\n return useSyncStatusFor(useRequiredClient(), source)\n}\n\nexport function useSchemaStatusFor<S extends BasicSchema>(\n client: BasicClient<S>,\n source: SourceRef = 'default',\n): SchemaStatus {\n useClientSnapshot(client)\n return client.schemaStatus(source)\n}\n\nexport function useSchemaStatus(source: SourceRef = 'default'): SchemaStatus {\n return useSchemaStatusFor(useRequiredClient(), source)\n}\n","import { useMemo, useSyncExternalStore } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n FileListQuery,\n FileRecord,\n MountFileInfo,\n SourceRef,\n StorageInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient, useSignInGate } from './client'\n\nconst zero = () => 0\n\nexport interface UseFilesResult {\n data: Array<FileRecord | MountFileInfo>\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n}\n\nexport function useFilesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const subscription = useMemo(\n () => client.queryStore.collection(source, '_files'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client, sourceKey],\n )\n const version = useSyncExternalStore(subscription.subscribe, subscription.getSnapshot, zero)\n return useAsyncResult(\n async () => (await client.db(source).files.list(query)).data,\n [],\n snapshot.isReady,\n snapshot.isReady,\n [sourceKey, queryKey, version, snapshot.activeAccount?.id],\n )\n}\n\nexport function useFiles(\n query: FileListQuery = {},\n options: { source?: SourceRef } = {},\n): UseFilesResult {\n return useFilesFor(useRequiredClient(), query, options)\n}\n\nexport interface UseStorageInfoResult {\n data: StorageInfo | null\n isLoading: boolean\n /** Load failure, or the sign-in requirement while no account is signed in. */\n error: BasicError | null\n refresh(): void\n}\n\nexport function useStorageInfoFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseStorageInfoResult {\n const snapshot = useClientSnapshot(client)\n const gate = useSignInGate(snapshot)\n const result = useAsyncResult(\n () => client.storageInfo(client.resolveRepoId()),\n null,\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeAccount?.id],\n )\n return { ...result, error: result.error ?? gate }\n}\n\nexport function useStorageInfo(): UseStorageInfoResult {\n return useStorageInfoFor(useRequiredClient())\n}\n","import { useCallback } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicSchema,\n CreateOutgoingShareInput,\n MountHandle,\n MountInfo,\n MountsQuery,\n OutgoingShareInfo,\n} from '@basictech/core'\nimport { useAsyncResult, useClientSnapshot, useRequiredClient, useSignInGate } from './client'\n\nexport interface UseMountsResult<S extends BasicSchema = BasicSchema> {\n data: MountInfo[]\n isLoading: boolean\n /** Load failure, or the sign-in requirement while no account is signed in. */\n error: BasicError | null\n refresh(): void\n open(mountId: string): Promise<MountHandle<S>>\n manageUrl(): string\n}\n\nexport function useMountsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n query: MountsQuery = {},\n): UseMountsResult<S> {\n const snapshot = useClientSnapshot(client)\n const gate = useSignInGate(snapshot)\n const queryKey = JSON.stringify(query)\n const result = useAsyncResult(\n () => client.shares.mounts(query),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [queryKey, snapshot.activeAccount?.id],\n )\n const open = useCallback(\n (mountId: string) => client.shares.mount(mountId),\n [client],\n )\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n return { ...result, error: result.error ?? gate, open, manageUrl }\n}\n\nexport function useMounts(query: MountsQuery = {}): UseMountsResult {\n return useMountsFor(useRequiredClient(), query)\n}\n\nexport interface UseOutgoingSharesResult {\n data: OutgoingShareInfo[]\n isLoading: boolean\n /** Load failure, or the sign-in requirement while no account is signed in. */\n error: BasicError | null\n refresh(): void\n create(input: CreateOutgoingShareInput): Promise<OutgoingShareInfo>\n get(id: string): Promise<OutgoingShareInfo>\n cancel(id: string): Promise<OutgoingShareInfo>\n revoke(id: string): Promise<OutgoingShareInfo>\n getContactHandle(did: string): Promise<string | null>\n manageUrl(): string\n}\n\nexport function useOutgoingSharesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n): UseOutgoingSharesResult {\n const snapshot = useClientSnapshot(client)\n const gate = useSignInGate(snapshot)\n const result = useAsyncResult(\n () => client.shares.listOutgoing(),\n [],\n snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeAccount?.id],\n )\n const create = useCallback((input: CreateOutgoingShareInput) =>\n client.shares.createOutgoing(input), [client])\n const get = useCallback((id: string) => client.shares.getOutgoing(id), [client])\n const cancel = useCallback((id: string) => client.shares.cancel(id), [client])\n const revoke = useCallback((id: string) => client.shares.revoke(id), [client])\n const getContactHandle = useCallback((did: string) => client.shares.getContactHandle(did), [client])\n const manageUrl = useCallback(() => client.shares.manageUrl(), [client])\n return {\n ...result,\n error: result.error ?? gate,\n create,\n get,\n cancel,\n revoke,\n getContactHandle,\n manageUrl,\n }\n}\n\nexport function useOutgoingShares(): UseOutgoingSharesResult {\n return useOutgoingSharesFor(useRequiredClient())\n}\n","import { useEffect, useState } from 'react'\nimport type {\n BasicClient,\n BasicError,\n BasicRecord,\n BasicSchema,\n InferValue,\n JsonObject,\n Query,\n SourceRef,\n TableNames,\n} from '@basictech/core'\nimport { toBasicError, useClientSnapshot, useRequiredClient } from './client'\n\nexport interface UseQueryResult<V extends JsonObject> {\n data: BasicRecord<V>[]\n isLoading: boolean\n error: BasicError | null\n}\n\n/**\n * A live view of `collection.watch(query)`: the collection re-runs the query\n * after every local or synced change, so the hook only mirrors its pages.\n */\nexport function useQueryValueFor<\n S extends BasicSchema,\n V extends JsonObject,\n>(\n client: BasicClient<S>,\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n const source = options.source ?? 'default'\n const sourceKey = JSON.stringify(source)\n const queryKey = JSON.stringify(query)\n const snapshot = useClientSnapshot(client)\n const [result, setResult] = useState<UseQueryResult<V>>({\n data: [],\n isLoading: true,\n error: null,\n })\n\n useEffect(() => {\n setResult((current) => ({ ...current, isLoading: true, error: null }))\n if (!snapshot.isReady) return\n try {\n return client.db(source).collection<V>(collection).watch(\n query,\n (page) => setResult({ data: page.data, isLoading: false, error: null }),\n (error) => setResult((current) => ({\n ...current,\n isLoading: false,\n error: toBasicError(error, 'QUERY_FAILED'),\n })),\n )\n } catch (error) {\n setResult((current) => ({ ...current, isLoading: false, error: toBasicError(error, 'QUERY_FAILED') }))\n return\n }\n // source and query are represented by their stable semantic keys.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, collection, sourceKey, queryKey, snapshot.isReady])\n\n return result\n}\n\nexport function useQueryFor<\n S extends BasicSchema,\n T extends TableNames<S>,\n>(\n client: BasicClient<S>,\n collection: T,\n query: Query<InferValue<S, T> & JsonObject> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<InferValue<S, T> & JsonObject> {\n return useQueryValueFor(client, collection, query, options)\n}\n\nexport function useQuery<V extends JsonObject = JsonObject>(\n collection: string,\n query: Query<V> = {},\n options: { source?: SourceRef } = {},\n): UseQueryResult<V> {\n return useQueryValueFor(useRequiredClient(), collection, query, options)\n}\n","import {\n BasicError,\n type BasicClient,\n type BasicSchema,\n type ProjectProfile,\n type ProjectProfilePatch,\n} from '@basictech/core'\nimport {\n useAsyncResult,\n useClientSnapshot,\n useRequiredClient,\n type AsyncResult,\n} from './client'\n\nexport interface UseProjectProfileResult\n extends AsyncResult<ProjectProfile | null> {\n update(patch: ProjectProfilePatch): Promise<ProjectProfile>\n reset(): Promise<ProjectProfile>\n}\n\nexport function useProjectProfileFor<S extends BasicSchema>(\n client: BasicClient<S>,\n enabled = true,\n): UseProjectProfileResult {\n const snapshot = useClientSnapshot(client)\n const accountId = snapshot.activeAccount?.id\n const result = useAsyncResult(\n async () => ({ accountId, profile: await client.getProjectProfile() }),\n null as { accountId: string | undefined; profile: ProjectProfile } | null,\n enabled && snapshot.isReady && snapshot.isSignedIn,\n snapshot.isReady,\n [snapshot.activeAccount?.id],\n )\n const checkAccount = () => {\n if (client.getSnapshot().activeAccount?.id !== accountId)\n throw new BasicError('ACCOUNT_CHANGED')\n }\n return {\n ...result,\n data:\n enabled &&\n snapshot.isSignedIn &&\n result.data &&\n result.data.accountId === accountId\n ? result.data.profile\n : null,\n async update(patch) {\n checkAccount()\n const profile = await client.updateProjectProfile(patch)\n checkAccount()\n result.refresh()\n return profile\n },\n async reset() {\n checkAccount()\n const profile = await client.resetProjectProfile()\n checkAccount()\n result.refresh()\n return profile\n },\n }\n}\n\nexport function useProjectProfile(enabled = true): UseProjectProfileResult {\n return useProjectProfileFor(useRequiredClient(), enabled)\n}\n","import { useCallback, useRef } from 'react'\nimport {\n BasicError,\n type BasicClient,\n type BasicSchema,\n type MountInfo,\n type ShareInviteInfo,\n} from '@basictech/core'\nimport {\n useAsyncResult,\n useClientSnapshot,\n useRequiredClient,\n useSignInGate,\n toBasicError,\n} from './client'\n\nexport interface UseShareInvitesResult {\n data: ShareInviteInfo[]\n isLoading: boolean\n error: BasicError | null\n refresh(): void\n get(id: string): Promise<ShareInviteInfo>\n accept(id: string): Promise<MountInfo>\n decline(id: string): Promise<ShareInviteInfo>\n delete(id: string): Promise<ShareInviteInfo>\n resolveContactHandle(did: string): Promise<string | null>\n}\n\n/** App-scoped by default; explicit root Shares grants may expose other apps' invitations. */\nexport function useShareInvitesFor<S extends BasicSchema>(\n client: BasicClient<S>,\n enabled = true,\n): UseShareInvitesResult {\n const snapshot = useClientSnapshot(client)\n const accountId = snapshot.activeAccount?.id\n const currentClient = useRef(client)\n currentClient.current = client\n const gate = useSignInGate(snapshot)\n const canLoad = enabled && snapshot.isReady && snapshot.isSignedIn\n const result = useAsyncResult(\n async () => {\n try {\n return {\n client,\n accountId,\n data: await client.shares.listInvites(),\n error: null,\n }\n } catch (error) {\n return {\n client,\n accountId,\n data: [] as ShareInviteInfo[],\n error: toBasicError(error),\n }\n }\n },\n null as {\n client: BasicClient<S>\n accountId: string | undefined\n data: ShareInviteInfo[]\n error: BasicError | null\n } | null,\n canLoad,\n !enabled || snapshot.isReady,\n [client, accountId],\n )\n const current =\n result.data?.client === client && result.data.accountId === accountId\n ? result.data\n : null\n const resolveContactHandle = useCallback(\n (did: string) => client.shares.resolveContactHandle(did),\n [client],\n )\n const checkAccount = () => {\n if (\n currentClient.current !== client ||\n client.getSnapshot().activeAccount?.id !== accountId\n )\n throw new BasicError('ACCOUNT_CHANGED')\n }\n async function run<T>(action: () => Promise<T>, refresh = true): Promise<T> {\n checkAccount()\n try {\n const value = await action()\n checkAccount()\n return value\n } catch (error) {\n checkAccount()\n throw error\n } finally {\n // Acceptance can enter `accepting` even when the origin request fails.\n if (\n refresh &&\n currentClient.current === client &&\n client.getSnapshot().activeAccount?.id === accountId\n )\n result.refresh()\n }\n }\n return {\n data: canLoad ? (current?.data ?? []) : [],\n isLoading:\n enabled &&\n (!snapshot.isReady || (canLoad && (result.isLoading || !current))),\n error: enabled\n ? (gate ?? (canLoad ? (current?.error ?? null) : null))\n : null,\n refresh: result.refresh,\n get: (id) => run(() => client.shares.getInvite(id), false),\n accept: (id) => run(() => client.shares.acceptInvite(id)),\n decline: (id) => run(() => client.shares.declineInvite(id)),\n delete: (id) => run(() => client.shares.deleteInvite(id)),\n resolveContactHandle,\n }\n}\n\nexport function useShareInvites(enabled = true): UseShareInvitesResult {\n return useShareInvitesFor(useRequiredClient(), enabled)\n}\n","import type { BasicClient, BasicSchema } from '@basictech/core'\nimport {\n useAsyncResult,\n useRequiredClient,\n toBasicError,\n type AsyncResult,\n} from './client'\n\n/** Names/photos are optional app-supplied data, never inferred from a share title. */\nexport interface ShareRecipient {\n did: string\n name?: string | null\n handle?: string | null\n picture?: string | null\n}\n\nexport type UseShareRecipientsResult = AsyncResult<ShareRecipient[]>\n\n/** Public, verified identity lookup; does not require a signed-in account. */\nexport function useShareRecipientsFor<S extends BasicSchema>(\n client: BasicClient<S>,\n dids: readonly string[],\n): UseShareRecipientsResult {\n const unique = [...new Set(dids)]\n // Compare contents, not the identity of an array built during render.\n const key = JSON.stringify(unique)\n const result = useAsyncResult<\n | (Pick<UseShareRecipientsResult, 'data' | 'error'> & {\n client: BasicClient<S>\n key: string\n })\n | null\n >(\n async () => {\n const handles = await Promise.allSettled(\n unique.map((did) => client.shares.resolveContactHandle(did)),\n )\n const failed = handles.find((handle) => handle.status === 'rejected')\n return {\n client,\n key,\n data: unique.map((did, index) => {\n const handle = handles[index]!\n return {\n did,\n handle: handle.status === 'fulfilled' ? handle.value : null,\n }\n }),\n error: failed ? toBasicError(failed.reason) : null,\n }\n },\n null,\n unique.length > 0,\n true,\n [client, key],\n )\n // Never display another input list/client's identities, even before effects run.\n const current =\n result.data?.client === client && result.data.key === key\n ? result.data\n : null\n return {\n data: current?.data ?? unique.map((did) => ({ did, handle: null })),\n isLoading: unique.length > 0 && (result.isLoading || !current),\n error: result.isLoading ? null : (current?.error ?? null),\n refresh: result.refresh,\n }\n}\n\nexport function useShareRecipients(\n dids: readonly string[],\n): UseShareRecipientsResult {\n return useShareRecipientsFor(useRequiredClient(), dids)\n}\n","'use client'\n\nimport {\n createContext,\n Fragment,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { Avatar } from '@base-ui/react/avatar'\nimport { Dialog } from '@base-ui/react/dialog'\nimport { Menu } from '@base-ui/react/menu'\nimport { Tabs } from '@base-ui/react/tabs'\nimport { BasicError } from '@basictech/core'\nimport type {\n BasicProfile,\n ProjectProfilePatch,\n CreateOutgoingShareInput,\n ShareInviteInfo,\n SourceRef,\n} from '@basictech/core'\nimport { useAuth, type UseAuthResult } from './hooks/auth'\nimport { useAccounts, type UseAccountsResult } from './hooks/accounts'\nimport { useSyncStatus, type UseSyncStatusResult } from './hooks/status'\nimport { useOutgoingShares, type UseOutgoingSharesResult } from './hooks/mounts'\nimport { useShareInvites, type UseShareInvitesResult } from './hooks/invites'\nimport type { ShareRecipient } from './hooks/recipients'\nimport {\n useProjectProfile,\n type UseProjectProfileResult,\n} from './hooks/profile'\nimport { useRequiredClient } from './hooks/client'\nimport { MarbleAvatar } from './avatar-marble'\n\nexport interface BasicAppearance {\n theme?: 'light' | 'dark'\n /** Background color. Choose a light or dark base to match the theme. */\n base?: string\n /** Hex colors get automatic black/white foreground contrast. */\n accent?: string\n radius?: string\n density?: 'compact' | 'comfortable'\n}\n\nconst AppearanceContext = createContext<BasicAppearance>({})\nfunction accentText(accent: string): string {\n if (!/^#([\\da-f]{3}|[\\da-f]{6})$/i.test(accent)) return '#fff'\n const hex = accent.length === 4\n ? accent.slice(1).split('').map((digit) => digit + digit).join('')\n : accent.slice(1)\n const [red, green, blue] = [0, 2, 4].map((offset) => {\n const channel = parseInt(hex.slice(offset, offset + 2), 16) / 255\n return channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4\n })\n return 0.2126 * red! + 0.7152 * green! + 0.0722 * blue! > 0.179 ? '#000' : '#fff'\n}\n\nfunction appearanceStyle(appearance: BasicAppearance): CSSProperties {\n return {\n ...(appearance.base ? { '--basic-surface': appearance.base } : {}),\n ...(appearance.accent ? {\n '--basic-accent': appearance.accent,\n '--basic-accent-text': accentText(appearance.accent),\n } : {}),\n ...(appearance.radius ? { '--basic-radius': appearance.radius } : {}),\n } as CSSProperties\n}\n\n/** Optional styling provider. CSS is opt-in via @basictech/react/styles.css. */\nexport function BasicUIProvider({\n appearance = {},\n children,\n}: {\n appearance?: BasicAppearance\n children: ReactNode\n}) {\n const parent = useContext(AppearanceContext)\n const value = { ...parent, ...appearance }\n return (\n <AppearanceContext.Provider value={value}>\n <div\n className=\"basic-ui\"\n data-theme={value.theme ?? 'light'}\n data-density={value.density ?? 'comfortable'}\n style={appearanceStyle(value)}\n >\n {children}\n </div>\n </AppearanceContext.Provider>\n )\n}\n\n// Portals retain React context but not CSS inheritance from the provider's DOM node.\nfunction useAppearanceProps() {\n const appearance = useContext(AppearanceContext)\n return {\n 'data-theme': appearance.theme ?? 'light',\n 'data-density': appearance.density ?? 'comfortable',\n style: appearanceStyle(appearance),\n }\n}\n\nexport interface BasicButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'solid' | 'outline' | 'ghost'\n}\nexport const BasicButton = forwardRef<HTMLButtonElement, BasicButtonProps>(\n function BasicButton(\n { variant = 'outline', className = '', type = 'button', ...props },\n ref,\n ) {\n return (\n <button\n {...props}\n ref={ref}\n type={type}\n className={`basic-button ${className}`}\n data-variant={variant}\n />\n )\n },\n)\n\nfunction useAction() {\n const [pending, setPending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const busy = useRef(false)\n const mounted = useRef(true)\n useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n }\n }, [])\n async function run(action: () => unknown) {\n if (busy.current) return\n busy.current = true\n setPending(true)\n setError(null)\n try {\n await action()\n } catch (cause) {\n if (mounted.current)\n setError(\n cause instanceof BasicError &&\n cause.code === 'REDIRECT_URI_NOT_REGISTERED'\n ? 'Sign-in is unavailable on this URL. Ask the app owner to register its callback URL in project settings.'\n : cause instanceof Error\n ? cause.message\n : 'The action failed. Please try again.',\n )\n } finally {\n busy.current = false\n if (mounted.current) setPending(false)\n }\n }\n return { pending, error, run, clearError: () => setError(null) }\n}\n\nexport interface AuthButtonProps extends BasicButtonProps {\n auth?: UseAuthResult\n input?: string\n}\nfunction AuthButton({\n auth: supplied,\n input,\n signOut = false,\n children,\n disabled,\n onClick,\n ...props\n}: AuthButtonProps & { signOut?: boolean }) {\n const live = useAuth()\n const auth = supplied ?? live\n const action = useAction()\n const expired = auth.status === 'expired'\n return (\n <span className=\"basic-action\">\n <BasicButton\n {...props}\n disabled={\n disabled ||\n !auth.isReady ||\n action.pending ||\n (signOut ? !auth.isSignedIn && !expired : auth.isSignedIn && !expired)\n }\n aria-busy={action.pending}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented)\n void action.run(() =>\n signOut ? auth.signOut() : auth.signIn(input),\n )\n }}\n >\n {action.pending\n ? 'Please wait…'\n : (children ??\n (signOut ? 'Sign out' : expired ? 'Sign in again' : 'Sign in'))}\n </BasicButton>\n <ActionError error={action.error} onClose={action.clearError} />\n </span>\n )\n}\nexport function SignInButton(props: AuthButtonProps) {\n return <AuthButton {...props} />\n}\nexport function SignOutButton(props: AuthButtonProps) {\n return <AuthButton {...props} signOut />\n}\n\nexport interface UserAvatarProps extends HTMLAttributes<HTMLSpanElement> {\n profile?:\n | (Pick<BasicProfile, 'name' | 'handle' | 'email' | 'picture'> &\n Partial<Pick<BasicProfile, 'id' | 'did' | 'kind'>>)\n | null\n size?: number\n showSyncBadge?: boolean\n sync?: UseSyncStatusResult\n accounts?: UseAccountsResult\n auth?: UseAuthResult\n projectProfile?: UseProjectProfileResult\n invites?: UseShareInvitesResult\n showInvites?: boolean\n allowAddAccount?: boolean\n menuItems?: UserMenuItem[]\n}\n\nconst ANONYMOUS_ACCOUNT_NAME = 'Local User'\n\nfunction accountName(\n profile: UserAvatarProps['profile'],\n emptyFallback = 'Guest',\n) {\n if (!profile) return emptyFallback\n return (\n profile.name ||\n (profile.kind === 'anon'\n ? ANONYMOUS_ACCOUNT_NAME\n : displayHandle(profile.handle) || profile.email || 'Account')\n )\n}\n\nfunction avatarSeed(profile: UserAvatarProps['profile']) {\n if (!profile) return 'guest'\n return (\n profile.did ||\n (profile.id && `account:${profile.id}`) ||\n profile.handle ||\n profile.email ||\n profile.name ||\n 'guest'\n )\n}\n\nexport function UserAvatar({\n accounts,\n auth,\n projectProfile,\n invites,\n showInvites,\n allowAddAccount,\n menuItems,\n ...avatarProps\n}: UserAvatarProps) {\n return (\n <UserMenu\n accounts={accounts}\n auth={auth}\n projectProfile={projectProfile}\n invites={invites}\n showInvites={showInvites}\n allowAddAccount={allowAddAccount}\n menuItems={menuItems}\n sync={avatarProps.sync}\n showSyncBadge={avatarProps.showSyncBadge}\n avatarProps={avatarProps}\n />\n )\n}\n\nfunction AccountAvatar({\n profile: supplied,\n size = 32,\n showSyncBadge,\n sync,\n ...props\n}: UserAvatarProps) {\n const accounts = useAccounts()\n const client = useRequiredClient()\n const profile = supplied === undefined ? accounts.activeAccount : supplied\n const avatar = <ProfileAvatar {...props} profile={profile} size={size} />\n return (showSyncBadge ?? client.mode === 'sync') ? (\n <span className=\"basic-avatar-container\">\n {avatar}\n <SyncStatus sync={sync} className=\"basic-avatar-sync\" />\n </span>\n ) : (\n avatar\n )\n}\n\nfunction ProfileAvatar({\n profile,\n size = 32,\n className = '',\n style,\n ...props\n}: HTMLAttributes<HTMLSpanElement> & {\n profile: UserAvatarProps['profile']\n size?: number\n}) {\n return (\n <Avatar.Root\n {...props}\n className={`basic-avatar ${className}`}\n style={{ width: size, height: size, ...style }}\n role=\"img\"\n aria-label={props['aria-label'] ?? accountName(profile)}\n >\n {profile?.picture && (\n <Avatar.Image\n src={profile.picture}\n alt=\"\"\n className=\"basic-avatar-image\"\n referrerPolicy=\"no-referrer\"\n />\n )}\n <Avatar.Fallback className=\"basic-avatar-fallback\">\n <MarbleAvatar seed={avatarSeed(profile)} />\n </Avatar.Fallback>\n </Avatar.Root>\n )\n}\n\nexport interface ShareRecipientAvatarProps\n extends HTMLAttributes<HTMLSpanElement> {\n recipient: ShareRecipient\n size?: number\n}\n\n/** Display-only identity: no account menu, sync badge, provider, or profile lookup. */\nexport function ShareRecipientAvatar({\n recipient,\n ...props\n}: ShareRecipientAvatarProps) {\n return (\n <ProfileAvatar\n title={displayHandle(recipient.handle) || recipient.name || recipient.did}\n {...props}\n profile={{\n ...recipient,\n name:\n recipient.name || displayHandle(recipient.handle) || recipient.did,\n kind: 'account',\n }}\n />\n )\n}\n\nexport type ShareRecipientLabelProps = ShareRecipientAvatarProps\n\n/** Avatar and visible handle; accepts the same data as the avatar-only components. */\nexport function ShareRecipientLabel({\n recipient,\n size = 24,\n className = '',\n ...props\n}: ShareRecipientLabelProps) {\n const label =\n displayHandle(recipient.handle) || recipient.name || 'Unknown user'\n return (\n <span\n title={recipient.did}\n {...props}\n className={`basic-recipient-label ${className}`}\n >\n <ShareRecipientAvatar\n recipient={recipient}\n size={size}\n aria-hidden=\"true\"\n title={undefined}\n />\n <span className=\"basic-recipient-handle\">{label}</span>\n </span>\n )\n}\n\nexport interface ShareRecipientAvatarsProps\n extends HTMLAttributes<HTMLSpanElement> {\n recipients: readonly ShareRecipient[]\n size?: number\n max?: number\n}\n\nexport function ShareRecipientAvatars({\n recipients,\n size = 32,\n max = 4,\n className = '',\n ...props\n}: ShareRecipientAvatarsProps) {\n const unique = [\n ...new Map(\n recipients.map((recipient) => [recipient.did, recipient]),\n ).values(),\n ]\n const visible = unique.slice(0, Math.max(1, max))\n const remaining = unique.length - visible.length\n return (\n <span\n {...props}\n className={`basic-recipient-avatars ${className}`}\n role=\"group\"\n aria-label={\n props['aria-label'] ?? `Shared with ${unique.length} recipients`\n }\n >\n {visible.map((recipient) => (\n <ShareRecipientAvatar\n key={recipient.did}\n recipient={recipient}\n size={size}\n />\n ))}\n {remaining > 0 && (\n <span\n className=\"basic-recipient-overflow\"\n aria-label={`${remaining} more recipients`}\n >\n +{remaining}\n </span>\n )}\n </span>\n )\n}\n\nexport function AuthStatus({\n auth: supplied,\n className = '',\n ...props\n}: HTMLAttributes<HTMLSpanElement> & { auth?: UseAuthResult }) {\n const live = useAuth()\n const auth = supplied ?? live\n const expired = auth.status === 'expired'\n const label =\n !auth.isReady || auth.status === 'bootstrapping'\n ? 'Checking session'\n : expired\n ? 'Session expired'\n : auth.status === 'recovering'\n ? 'Reconnecting session'\n : auth.isSignedIn\n ? 'Signed in'\n : auth.isAnonymous\n ? 'Guest · local only'\n : 'Signed out'\n return (\n <span\n {...props}\n role=\"status\"\n className={`basic-status ${className}`}\n data-tone={\n expired || auth.error\n ? 'warning'\n : auth.isSignedIn\n ? 'success'\n : 'neutral'\n }\n >\n <span className=\"basic-dot\" />\n {label}\n </span>\n )\n}\n\nexport function SyncStatus({\n sync: supplied,\n source,\n className = '',\n ...props\n}: HTMLAttributes<HTMLSpanElement> & {\n sync?: UseSyncStatusResult\n source?: SourceRef\n}) {\n const live = useSyncStatus(source)\n const client = useRequiredClient()\n const sync = supplied ?? live\n if (client.mode === 'rest') return null\n const issues = sync.rejected.length + sync.conflicts.length\n const labels: Record<UseSyncStatusResult['status'], string> = {\n idle: 'Idle',\n bootstrapping: 'Starting sync',\n connecting: 'Connecting',\n online: 'Synced',\n offline: 'Offline',\n stopped: 'Sync stopped',\n error: 'Sync error',\n local: 'Local only',\n stale: 'Sync stale',\n ended: 'Access ended',\n }\n const label = issues\n ? `${issues} sync ${issues === 1 ? 'issue' : 'issues'}`\n : sync.status === 'online' && sync.pendingCount\n ? 'Syncing'\n : labels[sync.status]\n return (\n <span\n {...props}\n role=\"status\"\n title={\n props.title ??\n `${label}${sync.pendingCount > 0 ? ` · ${sync.pendingCount} pending` : ''}`\n }\n className={`basic-status ${className}`}\n data-tone={\n issues || ['error', 'stale', 'ended'].includes(sync.status)\n ? 'warning'\n : sync.status === 'online' && !sync.pendingCount\n ? 'success'\n : ['bootstrapping', 'connecting'].includes(sync.status) ||\n (sync.status === 'online' && sync.pendingCount > 0)\n ? 'progress'\n : 'neutral'\n }\n >\n <span className=\"basic-dot\" />\n {label}\n {sync.pendingCount > 0 && ` · ${sync.pendingCount} pending`}\n </span>\n )\n}\n\nfunction displayHandle(handle: string | null | undefined) {\n return handle ? `@${handle.replace(/^@+/, '')}` : ''\n}\n\n/** App-owned items appear after Manage account and before Sign out. */\nexport type UserMenuItem = {\n id: string\n label: string\n icon?: ReactNode\n disabled?: boolean\n} & (\n | { href: string; onClick?: never }\n | { onClick: () => void | Promise<void>; href?: never }\n)\n\nexport interface UserButtonProps {\n accounts?: UseAccountsResult\n auth?: UseAuthResult\n sync?: UseSyncStatusResult\n /** Show synchronization status in the account menu. Defaults to true. */\n showSyncStatus?: boolean\n /** Defaults to enabled in sync mode. */\n showSyncBadge?: boolean\n shape?: 'rounded' | 'square'\n projectProfile?: UseProjectProfileResult\n invites?: UseShareInvitesResult\n showInvites?: boolean\n /** Show the action to sign in to another account. Defaults to true. */\n allowAddAccount?: boolean\n className?: string\n accountSettingsUrl?: string\n menuItems?: UserMenuItem[]\n}\n\nexport function UserButton(props: UserButtonProps) {\n return <UserMenu {...props} trigger=\"button\" />\n}\n\nexport interface UserMenuProps extends UserButtonProps {\n trigger?: 'avatar' | 'button'\n avatarProps?: UserAvatarProps\n}\n\nexport function UserMenu({\n accounts: supplied,\n auth: suppliedAuth,\n sync,\n showSyncStatus = true,\n showSyncBadge,\n shape = 'rounded',\n trigger = 'avatar',\n avatarProps,\n projectProfile,\n invites,\n showInvites,\n allowAddAccount = true,\n className = '',\n accountSettingsUrl,\n menuItems = [],\n}: UserMenuProps) {\n const liveAccounts = useAccounts()\n const liveAuth = useAuth()\n const accounts = supplied ?? liveAccounts\n const auth = suppliedAuth ?? liveAuth\n const action = useAction()\n const [settingsOpen, setSettingsOpen] = useState(false)\n const [clearAccountId, setClearAccountId] = useState<string | null>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const appearance = useAppearanceProps()\n const expired = auth.status === 'expired'\n const active = accounts.activeAccount\n const otherAccounts = accounts.accounts.filter(\n (account) => account.id !== active?.id,\n )\n const name = active ? accountName(active) : 'Local account'\n return (\n <span className={`basic-action ${className}`}>\n <Menu.Root>\n <Menu.Trigger\n ref={triggerRef}\n className={`basic-button basic-account-trigger basic-trigger-${trigger}`}\n data-shape={shape}\n disabled={!auth.isReady || action.pending}\n aria-label=\"Open user menu\"\n >\n <AccountAvatar\n profile={accounts.activeAccount}\n sync={sync}\n showSyncBadge={showSyncBadge}\n {...avatarProps}\n />\n {trigger === 'button' && (\n <>\n <span className=\"basic-identity\">\n <strong>{name}</strong>\n {active?.kind !== 'anon' && active?.handle && (\n <small>{displayHandle(active.handle)}</small>\n )}\n </span>\n <svg\n className=\"basic-chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </>\n )}\n </Menu.Trigger>\n <Menu.Portal>\n <Menu.Positioner sideOffset={8} className=\"basic-positioner\">\n <Menu.Popup {...appearance} className=\"basic-ui basic-menu\">\n <div className=\"basic-menu-profile\">\n <AccountAvatar\n profile={active}\n size={48}\n sync={sync}\n showSyncBadge={false}\n />\n <span className=\"basic-identity\">\n <strong>{active ? name : 'No active account'}</strong>\n {active?.kind !== 'anon' && active?.handle && (\n <small>{displayHandle(active.handle)}</small>\n )}\n <span className=\"basic-account-statuses\">\n {expired && (\n <span className=\"basic-status\" data-tone=\"warning\">\n Expired\n </span>\n )}\n {showSyncStatus && <SyncStatus sync={sync} />}\n </span>\n </span>\n </div>\n {expired && (\n <Menu.Item\n className=\"basic-menu-item basic-menu-reauth\"\n disabled={action.pending}\n onClick={() => void action.run(() => auth.signIn())}\n >\n Sign in again\n </Menu.Item>\n )}\n <Menu.Item\n className=\"basic-menu-item basic-manage-account\"\n onClick={() => setSettingsOpen(true)}\n >\n <svg\n className=\"basic-menu-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n </svg>\n Manage account\n </Menu.Item>\n {menuItems.map((item) => (\n <Menu.Item\n key={item.id}\n className=\"basic-menu-item\"\n render={item.href !== undefined ? <a href={item.href} /> : undefined}\n disabled={item.disabled || action.pending}\n onClick={() => {\n if (item.onClick) void action.run(item.onClick)\n }}\n >\n <span className=\"basic-menu-icon\" aria-hidden=\"true\">{item.icon}</span>\n {item.label}\n </Menu.Item>\n ))}\n {(auth.isSignedIn || expired || active?.kind === 'anon') && (\n <Menu.Item\n className=\"basic-menu-item basic-menu-signout\"\n disabled={action.pending}\n onClick={() =>\n active?.kind === 'anon'\n ? setClearAccountId(active.id)\n : void action.run(() => auth.signOut())\n }\n >\n <svg\n className=\"basic-menu-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9\" />\n </svg>\n {active?.kind === 'anon' ? 'Clear account' : 'Sign out'}\n </Menu.Item>\n )}\n {otherAccounts.length > 0 && (\n <>\n <Menu.Separator className=\"basic-separator\" />\n <div className=\"basic-menu-heading\">Switch accounts</div>\n </>\n )}\n {otherAccounts.map((account) => (\n <Menu.Item\n key={account.id}\n className=\"basic-menu-item\"\n disabled={action.pending}\n onClick={() =>\n void action.run(() => accounts.switchAccount(account.id))\n }\n >\n <AccountAvatar\n profile={account}\n size={32}\n sync={sync}\n showSyncBadge={false}\n />\n <span className=\"basic-identity\">\n <strong>\n {accountName(account, 'Account')}\n </strong>\n {account.kind !== 'anon' && account.handle && (\n <small>{displayHandle(account.handle)}</small>\n )}\n </span>\n <span className=\"basic-account-statuses\">\n {account.auth.status === 'expired' ? (\n <span className=\"basic-status\" data-tone=\"warning\">\n Expired\n </span>\n ) : null}\n </span>\n </Menu.Item>\n ))}\n {(allowAddAccount || (!auth.isSignedIn && !expired)) && (\n <Menu.Item\n className=\"basic-menu-item\"\n disabled={action.pending}\n onClick={() =>\n void action.run(() =>\n allowAddAccount\n ? accounts.addAccount({ signIn: true })\n : auth.signIn(),\n )\n }\n >\n <svg\n className=\"basic-menu-icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n Add account\n </Menu.Item>\n )}\n </Menu.Popup>\n </Menu.Positioner>\n </Menu.Portal>\n </Menu.Root>\n <ActionError\n error={action.error}\n onClose={action.clearError}\n finalFocus={triggerRef}\n />\n <Modal\n open={clearAccountId !== null}\n onOpenChange={(open) => {\n if (!open) setClearAccountId(null)\n }}\n trigger={null}\n finalFocus={triggerRef}\n title=\"Clear local account?\"\n description=\"This deletes this account’s local data, including unsynced changes. This cannot be undone.\"\n >\n <div className=\"basic-actions\">\n <BasicButton\n disabled={action.pending}\n onClick={() => setClearAccountId(null)}\n >\n Cancel\n </BasicButton>\n <BasicButton\n disabled={action.pending}\n onClick={() => {\n const id = clearAccountId\n if (!id) return\n setClearAccountId(null)\n void action.run(() => accounts.removeAccount(id))\n }}\n >\n Clear account\n </BasicButton>\n </div>\n </Modal>\n <AccountSettingsModal\n auth={auth}\n accounts={accounts}\n open={settingsOpen}\n onOpenChange={setSettingsOpen}\n trigger={null}\n finalFocus={triggerRef}\n accountSettingsUrl={accountSettingsUrl}\n projectProfile={projectProfile}\n invites={invites}\n showInvites={showInvites}\n sync={sync}\n />\n </span>\n )\n}\n\nexport interface BasicModalProps {\n open?: boolean\n onOpenChange?: (open: boolean) => void\n finalFocus?: RefObject<HTMLElement>\n /** Supply a button element; null omits the trigger for controlled use. */\n trigger?: ReactNode\n}\nfunction ActionError({\n error,\n onClose,\n finalFocus,\n}: {\n error: string | null\n onClose(): void\n finalFocus?: RefObject<HTMLElement>\n}) {\n return (\n <Modal\n open={!!error}\n onOpenChange={(open) => {\n if (!open) onClose()\n }}\n trigger={null}\n finalFocus={finalFocus}\n title=\"Unable to complete action\"\n description=\"Your request could not be completed.\"\n >\n <p role=\"alert\" className=\"basic-error\">\n {error}\n </p>\n <BasicButton onClick={onClose}>Dismiss</BasicButton>\n </Modal>\n )\n}\nfunction Modal({\n open,\n onOpenChange,\n trigger,\n finalFocus,\n title,\n description,\n hideTitle = false,\n header,\n sectionLabel,\n children,\n}: BasicModalProps & {\n title: string\n description?: string\n hideTitle?: boolean\n header?: ReactNode\n sectionLabel?: string\n children: ReactNode\n}) {\n const appearance = useAppearanceProps()\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n {trigger !== null &&\n (isValidElement(trigger) ? (\n <Dialog.Trigger render={trigger} />\n ) : (\n <Dialog.Trigger render={<BasicButton />}>\n {trigger ?? title}\n </Dialog.Trigger>\n ))}\n <Dialog.Portal>\n <Dialog.Backdrop className=\"basic-backdrop\" />\n <Dialog.Popup\n {...appearance}\n finalFocus={finalFocus}\n className=\"basic-ui basic-dialog\"\n >\n <div\n className={`basic-dialog-heading${header || hideTitle ? ' basic-dialog-heading-overlay' : ''}`}\n >\n <Dialog.Title\n className={header || hideTitle ? 'basic-sr-only' : 'basic-title'}\n >\n {title}\n </Dialog.Title>\n <Dialog.Close\n className=\"basic-button\"\n aria-label={`Close ${title.toLowerCase()}`}\n >\n ✕\n </Dialog.Close>\n </div>\n {header}\n {description && (\n <Dialog.Description\n className={header ? 'basic-sr-only' : 'basic-muted'}\n >\n {description}\n </Dialog.Description>\n )}\n {sectionLabel && (\n <div className=\"basic-modal-section\">{sectionLabel}</div>\n )}\n {children}\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n\nexport interface AccountSettingsModalProps extends BasicModalProps {\n auth?: UseAuthResult\n accounts?: UseAccountsResult\n projectProfile?: UseProjectProfileResult\n invites?: UseShareInvitesResult\n /** Show the in-app invitation inbox. Defaults to true; loads only when selected. */\n showInvites?: boolean\n sync?: UseSyncStatusResult\n accountSettingsUrl?: string\n children?: ReactNode\n}\nexport function AccountSettingsModal({\n auth: suppliedAuth,\n accounts: suppliedAccounts,\n accountSettingsUrl,\n projectProfile,\n invites,\n showInvites = true,\n sync,\n children,\n ...props\n}: AccountSettingsModalProps) {\n const liveAuth = useAuth()\n const liveAccounts = useAccounts()\n const auth = suppliedAuth ?? liveAuth\n const accounts = suppliedAccounts ?? liveAccounts\n const liveSync = useSyncStatus()\n const syncState = sync ?? liveSync\n const client = useRequiredClient()\n const account = accounts.activeAccount\n const copyAction = useAction()\n const [copied, setCopied] = useState<string | null>(null)\n const details = [\n [\n 'Account DID',\n account?.kind === 'anon'\n ? 'Not assigned (local account)'\n : (account?.did ?? auth.did ?? 'Unavailable'),\n ],\n [\n 'PDS URL',\n account?.kind === 'anon'\n ? 'Not connected (local account)'\n : (auth.user?.pds_url ?? 'Unavailable'),\n ],\n ['Local account ID', account?.id ?? 'None'],\n ['Account kind', account?.kind ?? 'None'],\n ['Storage prefix', account?.storagePrefix ?? 'None'],\n ['Client mode', client.mode],\n ['Auth state', auth.status],\n ['Ready', auth.isReady ? 'Yes' : 'No'],\n ['Can write', auth.canWrite ? 'Yes' : 'No'],\n ['Read-only reason', auth.readOnlyReason ?? 'None'],\n ['Auth error code', auth.error?.code ?? 'None'],\n ['Sync state', syncState.status],\n ['Pending writes', String(syncState.pendingCount)],\n ['Rejected writes', String(syncState.rejected.length)],\n ['Conflicts', String(syncState.conflicts.length)],\n ]\n const diagnostics = JSON.stringify(Object.fromEntries(details), null, 2)\n return (\n <Modal\n {...props}\n title=\"Account settings\"\n description=\"Your identity and session on this device.\"\n header={<AccountHeader account={accounts.activeAccount} sync={sync} />}\n >\n <Tabs.Root defaultValue=\"profile\">\n <Tabs.List\n className=\"basic-tabs\"\n aria-label=\"Account settings sections\"\n >\n <Tabs.Tab value=\"profile\">Profile</Tabs.Tab>\n {showInvites && <Tabs.Tab value=\"invites\">Share Invites</Tabs.Tab>}\n <Tabs.Tab value=\"advanced\">Advanced</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"profile\" keepMounted>\n {auth.isSignedIn && (\n <ProjectProfileEditor\n key={accounts.activeAccount?.id ?? auth.did}\n profile={projectProfile}\n canWrite={auth.canWrite}\n />\n )}\n {accountSettingsUrl && (\n <a className=\"basic-link\" href={accountSettingsUrl}>\n Manage profile and security ↗\n </a>\n )}\n {children}\n {!auth.isSignedIn && (\n <div className=\"basic-actions\">\n <SignInButton auth={auth} />\n </div>\n )}\n </Tabs.Panel>\n {showInvites && <Tabs.Panel value=\"invites\">\n <ShareInvites auth={auth} accounts={accounts} invites={invites} />\n </Tabs.Panel>}\n <Tabs.Panel value=\"advanced\">\n <p className=\"basic-muted\">Read-only diagnostics for this account.</p>\n <dl className=\"basic-details\">\n {details.map(([label, value]) => (\n <Fragment key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </Fragment>\n ))}\n </dl>\n <div className=\"basic-actions\">\n <BasicButton\n disabled={copyAction.pending}\n onClick={() => {\n setCopied(null)\n void copyAction.run(async () => {\n if (!navigator.clipboard?.writeText)\n throw new Error('Clipboard is unavailable in this browser.')\n await navigator.clipboard.writeText(diagnostics)\n setCopied(diagnostics)\n })\n }}\n >\n Copy to clipboard\n </BasicButton>\n {copied === diagnostics && (\n <span role=\"status\" className=\"basic-muted\">\n Copied\n </span>\n )}\n </div>\n {copyAction.error && (\n <p role=\"alert\" className=\"basic-error\">\n {copyAction.error}\n </p>\n )}\n </Tabs.Panel>\n </Tabs.Root>\n </Modal>\n )\n}\n\nfunction AccountHeader({\n account,\n sync,\n}: {\n account: UseAccountsResult['activeAccount']\n sync?: UseSyncStatusResult\n}) {\n return (\n <div className=\"basic-profile\">\n <AccountAvatar\n profile={account}\n size={72}\n sync={sync}\n showSyncBadge={false}\n />\n <span className=\"basic-identity\">\n <strong>\n {account ? accountName(account) : 'Local account'}\n </strong>\n {account?.kind !== 'anon' && account?.handle && (\n <small>{displayHandle(account.handle)}</small>\n )}\n <span className=\"basic-account-statuses\">\n <SyncStatus sync={sync} />\n </span>\n </span>\n </div>\n )\n}\n\nfunction ProjectProfileEditor({\n profile: supplied,\n canWrite,\n}: {\n profile?: UseProjectProfileResult\n canWrite: boolean\n}) {\n const live = useProjectProfile(supplied === undefined)\n const profile = supplied ?? live\n const action = useAction()\n const [draft, setDraft] = useState<ProjectProfilePatch>({})\n const [saved, setSaved] = useState(false)\n return (\n <form\n className=\"basic-profile-editor\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!canWrite || !Object.keys(draft).length) return\n void action.run(async () => {\n await profile.update(draft)\n setDraft({})\n setSaved(true)\n })\n }}\n >\n <h3 className=\"basic-section-label\">Personal information</h3>\n <p className=\"basic-muted\">\n Only this app sees these overrides. Clear a field to use your universal\n profile value.\n </p>\n {profile.isLoading ? (\n <p role=\"status\">Loading project profile…</p>\n ) : profile.error ? (\n <>\n <p role=\"alert\" className=\"basic-error\">\n {profile.error.message}\n </p>\n <BasicButton onClick={profile.refresh}>Retry profile</BasicButton>\n </>\n ) : (\n profile.data && (\n <fieldset disabled={!canWrite || action.pending}>\n <label className=\"basic-field\">\n Display name\n <input\n className=\"basic-input\"\n type=\"text\"\n maxLength={64}\n value={\n ('name' in draft ? draft.name : profile.data?.profile.name) ??\n ''\n }\n onChange={(event) => {\n setSaved(false)\n setDraft((current) => ({\n ...current,\n name: event.target.value || null,\n }))\n }}\n />\n </label>\n <div className=\"basic-actions basic-modal-footer\">\n <BasicButton\n variant=\"ghost\"\n onClick={() => {\n setDraft({})\n setSaved(false)\n }}\n >\n Cancel\n </BasicButton>\n <BasicButton\n type=\"submit\"\n variant=\"solid\"\n disabled={!Object.keys(draft).length}\n >\n Save changes\n </BasicButton>\n </div>\n </fieldset>\n )\n )}\n {action.error && (\n <p role=\"alert\" className=\"basic-error\">\n {action.error}\n </p>\n )}\n {saved && <p role=\"status\">Project profile saved.</p>}\n </form>\n )\n}\n\nexport interface ShareInvitesProps extends HTMLAttributes<HTMLElement> {\n auth?: UseAuthResult\n accounts?: UseAccountsResult\n /** Optional complete hook result, useful for previews or app-owned state. */\n invites?: UseShareInvitesResult\n}\n\n/** Inline invitation inbox, shared by standalone and account-settings dialogs. */\nexport function ShareInvites({\n auth: suppliedAuth,\n accounts: suppliedAccounts,\n invites,\n className = '',\n ...props\n}: ShareInvitesProps) {\n const liveAuth = useAuth()\n const liveAccounts = useAccounts()\n const auth = suppliedAuth ?? liveAuth\n const accounts = suppliedAccounts ?? liveAccounts\n return (\n <section\n {...props}\n className={`basic-invites ${className}`}\n aria-label={props['aria-label'] ?? 'Share Invites'}\n >\n {(!auth.isReady || !auth.isSignedIn) && (\n <h3 className=\"basic-title\">Share Invites</h3>\n )}\n {!auth.isReady ? (\n <p role=\"status\">Checking session…</p>\n ) : !auth.isSignedIn ? (\n <>\n <p className=\"basic-muted\">Sign in to view invites.</p>\n <SignInButton auth={auth} />\n </>\n ) : (\n <ShareInvitesContent\n key={accounts.activeAccount?.id ?? auth.did}\n invites={invites}\n canWrite={auth.canWrite}\n />\n )}\n </section>\n )\n}\n\nfunction ShareInvitesContent({\n invites: supplied,\n canWrite,\n}: {\n invites?: UseShareInvitesResult\n canWrite: boolean\n}) {\n const live = useShareInvites(supplied === undefined)\n const invites = supplied ?? live\n const action = useAction()\n const [message, setMessage] = useState('')\n const visible = invites.data.filter((invite) => invite.state !== 'deleted')\n return (\n <>\n <div className=\"basic-section-heading\">\n <h3 className=\"basic-title\">Share Invites</h3>\n <BasicButton\n disabled={invites.isLoading || action.pending}\n onClick={invites.refresh}\n >\n Refresh\n </BasicButton>\n </div>\n {!canWrite && (\n <p className=\"basic-error\">\n Read-only session. Invite changes are disabled.\n </p>\n )}\n {action.error && (\n <p role=\"alert\" className=\"basic-error\">\n {action.error}\n </p>\n )}\n {message && <p role=\"status\">{message}</p>}\n {action.pending && <p role=\"status\">Updating invite…</p>}\n {invites.isLoading ? (\n <p role=\"status\">Loading invites…</p>\n ) : invites.error ? (\n <p role=\"alert\" className=\"basic-error\">\n {invites.error.message}\n </p>\n ) : !visible.length ? (\n <p className=\"basic-empty\">No share invites.</p>\n ) : (\n <ul className=\"basic-share-list basic-invite-list\">\n {visible.map((invite) => {\n const title =\n invite.display.shareName ||\n invite.display.repoName ||\n 'Shared data'\n return (\n <ShareInviteRow\n key={invite.id}\n invite={invite}\n title={title}\n resolveContactHandle={invites.resolveContactHandle}\n disabled={!canWrite || action.pending}\n onDecision={(decision) =>\n void action.run(async () => {\n setMessage('')\n await invites[decision](invite.id)\n setMessage(\n `${decision === 'accept' ? 'Accepted' : 'Declined'} “${title}”.`,\n )\n })\n }\n />\n )\n })}\n </ul>\n )}\n </>\n )\n}\n\nfunction ShareInviteRow({\n invite,\n title,\n resolveContactHandle,\n disabled,\n onDecision,\n}: {\n invite: ShareInviteInfo\n title: string\n resolveContactHandle: UseShareInvitesResult['resolveContactHandle']\n disabled: boolean\n onDecision(decision: 'accept' | 'decline'): void\n}) {\n const did = invite.originOwnerDid\n const [sender, setSender] = useState<{\n did: string\n handle: string | null\n } | null>(null)\n useEffect(() => {\n let active = true\n void resolveContactHandle(did).then(\n (handle) => {\n if (active) setSender({ did, handle })\n },\n () => {\n if (active) setSender({ did, handle: null })\n },\n )\n return () => {\n active = false\n }\n }, [did, resolveContactHandle])\n const handle = sender?.did === did ? sender.handle : null\n const pending = invite.state === 'pending'\n const accepting = invite.state === 'accepting'\n const expiresAt = new Date(invite.acceptBy)\n const expired = expiresAt.getTime() <= Date.now()\n const blocked =\n invite.compatibility.state === 'app_connection_required'\n ? 'Connect this app to accept.'\n : invite.compatibility.state === 'compatible_repo_required'\n ? 'A compatible repository is required.'\n : null\n const status =\n pending && !expired\n ? null\n : (pending || accepting) && expired\n ? 'Expired'\n : accepting\n ? 'Retry to finish accepting'\n : invite.state === 'accepted'\n ? 'Accepted'\n : invite.state === 'declined'\n ? 'Declined'\n : 'Acceptance rejected'\n return (\n <li>\n <ShareRecipientAvatar\n recipient={{\n did,\n name: handle ? displayHandle(handle) : 'Unknown sender',\n }}\n size={32}\n />\n <div className=\"basic-identity\">\n <strong>{title}</strong>\n <small>{handle ? displayHandle(handle) : 'Unknown sender'}</small>\n <small>{invite.role === 'editor' ? 'Can edit' : 'Can view'}</small>\n {status && <span className=\"basic-invite-state\">{status}</span>}\n {blocked && (pending || accepting) && (\n <p className=\"basic-error\">{blocked}</p>\n )}\n </div>\n {(pending || accepting) && (\n <div className=\"basic-invite-actions\">\n <BasicButton\n variant=\"solid\"\n disabled={disabled || expired || !!blocked}\n onClick={() => onDecision('accept')}\n >\n {accepting ? 'Retry acceptance' : 'Accept'}\n </BasicButton>\n {pending && (\n <BasicButton\n disabled={disabled}\n onClick={() => onDecision('decline')}\n >\n Decline\n </BasicButton>\n )}\n </div>\n )}\n <details className=\"basic-invite-details\">\n <summary>Details</summary>\n <div className=\"basic-invite-scope\">\n {invite.scope.map((scope, index) => (\n <div key={index}>\n <strong>{scope.table}</strong> ·{' '}\n {scope.recordIds\n ? `${scope.recordIds.length} selected records`\n : 'all records'}\n {scope.recordIds && <code>{scope.recordIds.join(', ')}</code>}\n </div>\n ))}\n <small>Sender DID: {did}</small>\n <small>\n Expires{' '}\n <time dateTime={invite.acceptBy}>\n {expiresAt.toLocaleString('en-US', {\n dateStyle: 'medium',\n timeStyle: 'short',\n timeZone: 'UTC',\n })}{' '}\n UTC\n </time>\n </small>\n </div>\n </details>\n </li>\n )\n}\n\nexport interface ShareInvitesModalProps extends BasicModalProps {\n auth?: UseAuthResult\n accounts?: UseAccountsResult\n invites?: UseShareInvitesResult\n}\n\nexport function ShareInvitesModal({\n auth,\n accounts,\n invites,\n ...props\n}: ShareInvitesModalProps) {\n return (\n <Modal {...props} title=\"Share Invites\" hideTitle>\n <ShareInvites auth={auth} accounts={accounts} invites={invites} />\n </Modal>\n )\n}\n\nexport interface SharesModalProps extends BasicModalProps {\n auth?: UseAuthResult\n accounts?: UseAccountsResult\n sync?: UseSyncStatusResult\n shares?: UseOutgoingSharesResult\n invites?: UseShareInvitesResult\n /** Explicit least-privilege scope; the component never infers all tables. */\n scope: CreateOutgoingShareInput['scope']\n repo?: CreateOutgoingShareInput['repo']\n}\nexport function SharesModal({\n auth: supplied,\n accounts: suppliedAccounts,\n sync,\n shares,\n invites,\n scope,\n repo = 'default',\n ...props\n}: SharesModalProps) {\n const live = useAuth()\n const liveAccounts = useAccounts()\n const auth = supplied ?? live\n return (\n <Modal\n {...props}\n title=\"Shares\"\n description=\"Manage incoming invitations and share access to selected data.\"\n header={\n <AccountHeader\n account={(suppliedAccounts ?? liveAccounts).activeAccount}\n sync={sync}\n />\n }\n >\n {!auth.isReady ? (\n <p role=\"status\">Checking session…</p>\n ) : !auth.isSignedIn ? (\n <>\n <p className=\"basic-muted\">Sign in to share data.</p>\n <SignInButton auth={auth} />\n </>\n ) : (\n <SharesContent\n key={(suppliedAccounts ?? liveAccounts).activeAccount?.id ?? auth.did}\n shares={shares}\n invites={invites}\n auth={auth}\n accounts={suppliedAccounts ?? liveAccounts}\n scope={scope}\n repo={repo}\n canWrite={auth.canWrite}\n />\n )}\n </Modal>\n )\n}\n\nfunction SharesContent({\n shares: supplied,\n invites,\n auth,\n accounts,\n scope,\n repo,\n canWrite,\n}: Pick<SharesModalProps, 'shares' | 'scope' | 'invites' | 'auth' | 'accounts'> & {\n repo: NonNullable<SharesModalProps['repo']>\n canWrite: boolean\n}) {\n const live = useOutgoingShares()\n const shares = supplied ?? live\n const action = useAction()\n const [recipient, setRecipient] = useState('')\n const [role, setRole] = useState<'viewer' | 'editor'>('viewer')\n const [confirmation, setConfirmation] = useState<string | null>(null)\n const [message, setMessage] = useState('')\n const scopeValid =\n scope.length > 0 &&\n scope.every(\n (item) =>\n item.table.trim() &&\n (item.recordIds === undefined || item.recordIds.length > 0),\n )\n return (\n <Tabs.Root defaultValue=\"outgoing\" className=\"basic-shares\">\n <Tabs.List className=\"basic-tabs\" aria-label=\"Share direction\">\n <Tabs.Tab value=\"outgoing\">Outgoing</Tabs.Tab>\n <Tabs.Tab value=\"incoming\">Share Invites</Tabs.Tab>\n </Tabs.List>\n <Tabs.Panel value=\"incoming\">\n <ShareInvites invites={invites} auth={auth} accounts={accounts} />\n </Tabs.Panel>\n <Tabs.Panel value=\"outgoing\">\n <p className=\"basic-muted\">\n Revoking access stops future requests. It cannot retract data the\n recipient already downloaded.\n </p>\n <div className=\"basic-scope\">\n <strong>New invitation permissions</strong>\n {scope.map((item, index) => (\n <span key={index}>\n {item.table} ·{' '}\n {item.recordIds\n ? `${item.recordIds.length} selected records`\n : 'all records'}\n </span>\n ))}\n </div>\n {!canWrite && (\n <p className=\"basic-error\">\n This session is read only. Sharing changes are disabled.\n </p>\n )}\n <form\n className=\"basic-share-form\"\n onSubmit={(event) => {\n event.preventDefault()\n if (!recipient.trim() || !scopeValid || !canWrite) return\n void action.run(async () => {\n await shares.create({\n repo,\n scope,\n role,\n ...(recipient.trim().startsWith('did:')\n ? { recipientDid: recipient.trim() }\n : { recipientHandle: recipient.trim().replace(/^@+/, '') }),\n })\n setRecipient('')\n setMessage('Invitation sent.')\n shares.refresh()\n })\n }}\n >\n <label className=\"basic-field\">\n Recipient handle or DID\n <input\n className=\"basic-input\"\n value={recipient}\n onChange={(event) => setRecipient(event.target.value)}\n placeholder=\"@alex.basic.id\"\n required\n disabled={action.pending || !canWrite}\n />\n </label>\n <label className=\"basic-field\">\n Permission\n <select\n className=\"basic-input\"\n value={role}\n onChange={(event) =>\n setRole(event.target.value as 'viewer' | 'editor')\n }\n disabled={action.pending || !canWrite}\n >\n <option value=\"viewer\">Can view</option>\n <option value=\"editor\">Can edit</option>\n </select>\n </label>\n <BasicButton\n type=\"submit\"\n variant=\"solid\"\n disabled={\n action.pending || !canWrite || !scopeValid || !recipient.trim()\n }\n >\n {action.pending ? 'Please wait…' : 'Send invitation'}\n </BasicButton>\n </form>\n {!scopeValid && (\n <p role=\"alert\" className=\"basic-error\">\n Select at least one table or record to share.\n </p>\n )}\n {action.error && (\n <p role=\"alert\" className=\"basic-error\">\n {action.error}\n </p>\n )}\n {message && (\n <p role=\"status\" className=\"basic-muted\">\n {message}\n </p>\n )}\n <div className=\"basic-section-heading\">\n <h3 className=\"basic-title\">Outgoing shares · all permissions</h3>\n <BasicButton\n disabled={action.pending || shares.isLoading}\n onClick={shares.refresh}\n >\n Refresh\n </BasicButton>\n </div>\n {shares.isLoading ? (\n <p role=\"status\">Loading shares…</p>\n ) : shares.error ? (\n <p role=\"alert\" className=\"basic-error\">\n {shares.error.message}\n </p>\n ) : !shares.data.length ? (\n <p className=\"basic-empty\">No outgoing shares yet.</p>\n ) : (\n <ul className=\"basic-share-list\">\n {shares.data.map((share) => (\n <li key={share.id}>\n <ShareRecipientAvatar recipient={{ did: share.recipientDid }} />\n <div className=\"basic-identity\">\n <strong>\n {share.display.shareName || share.recipientDid}\n </strong>\n {share.display.shareName && <small>To {share.recipientDid}</small>}\n <small>\n {share.role === 'viewer' ? 'Can view' : 'Can edit'} ·{' '}\n {share.effectiveState} ·{' '}\n {share.scope.map((item) => item.table).join(', ')}\n </small>\n </div>\n {share.state !== 'ended' &&\n (confirmation === share.id ? (\n <div className=\"basic-actions\">\n <span>Remove access?</span>\n <BasicButton\n disabled={action.pending || !canWrite}\n onClick={() =>\n void action.run(async () => {\n await (share.state === 'pending'\n ? shares.cancel(share.id)\n : shares.revoke(share.id))\n setConfirmation(null)\n setMessage(\n share.state === 'pending'\n ? 'Invitation canceled.'\n : 'Access revoked.',\n )\n shares.refresh()\n })\n }\n >\n Confirm{' '}\n {share.state === 'pending' ? 'cancel' : 'revoke'}\n </BasicButton>\n <BasicButton\n disabled={action.pending}\n onClick={() => setConfirmation(null)}\n >\n Keep access\n </BasicButton>\n </div>\n ) : (\n <BasicButton\n disabled={action.pending || !canWrite}\n onClick={() => setConfirmation(share.id)}\n >\n {share.state === 'pending'\n ? 'Cancel invitation'\n : 'Revoke access'}\n </BasicButton>\n ))}\n </li>\n ))}\n </ul>\n )}\n </Tabs.Panel>\n </Tabs.Root>\n )\n}\n","import { useId } from 'react'\n\n// Adapted from boring-avatars 2.0.4's Marble renderer under the MIT License.\n// Source: https://github.com/boringdesigners/boring-avatars/blob/89270f1d423a60a2fa2c241127e1744cba38aa38/src/lib/components/avatar-marble.tsx\n// See ../THIRD_PARTY_NOTICES.md for the required copyright and license notice.\n\nconst ELEMENTS = 3\nconst SIZE = 80\nconst COLORS = ['#92A1C6', '#146A7C', '#F0AB3D', '#C271B4', '#C20D90']\n\nfunction hashCode(value: string) {\n let hash = 0\n for (let index = 0; index < value.length; index += 1) {\n hash = (hash << 5) - hash + value.charCodeAt(index)\n hash &= hash\n }\n return Math.abs(hash)\n}\n\nfunction getDigit(value: number, position: number) {\n return Math.floor((value / 10 ** position) % 10)\n}\n\nfunction getUnit(value: number, range: number, position?: number) {\n const unit = value % range\n return position && getDigit(value, position) % 2 === 0 ? -unit : unit\n}\n\nfunction generateProperties(seed: string) {\n const value = hashCode(seed)\n return Array.from({ length: ELEMENTS }, (_, index) => ({\n color: COLORS[(value + index) % COLORS.length],\n translateX: getUnit(value * (index + 1), SIZE / 10, 1),\n translateY: getUnit(value * (index + 1), SIZE / 10, 2),\n scale: 1.2 + getUnit(value * (index + 1), SIZE / 20) / 10,\n rotate: getUnit(value * (index + 1), 360, 1),\n }))\n}\n\nexport function MarbleAvatar({ seed }: { seed: string }) {\n const properties = generateProperties(seed)\n const instanceId = useId().replaceAll(':', '')\n const maskId = `basic-avatar-mask-${instanceId}`\n const filterId = `basic-avatar-filter-${instanceId}`\n return (\n <svg\n viewBox={`0 0 ${SIZE} ${SIZE}`}\n width=\"100%\"\n height=\"100%\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <mask\n id={maskId}\n maskUnits=\"userSpaceOnUse\"\n x=\"0\"\n y=\"0\"\n width={SIZE}\n height={SIZE}\n >\n <rect width={SIZE} height={SIZE} rx={SIZE * 2} fill=\"#FFFFFF\" />\n </mask>\n <g mask={`url(#${maskId})`}>\n <rect width={SIZE} height={SIZE} fill={properties[0]!.color} />\n <path\n filter={`url(#${filterId})`}\n d=\"M32.414 59.35L50.376 70.5H72.5v-71H33.728L26.5 13.381l19.057 27.08L32.414 59.35z\"\n fill={properties[1]!.color}\n transform={`translate(${properties[1]!.translateX} ${properties[1]!.translateY}) rotate(${properties[1]!.rotate} ${SIZE / 2} ${SIZE / 2}) scale(${properties[2]!.scale})`}\n />\n <path\n filter={`url(#${filterId})`}\n style={{ mixBlendMode: 'overlay' }}\n d=\"M22.216 24L0 46.75l14.108 38.129L78 86l-3.081-59.276-22.378 4.005 12.972 20.186-23.35 27.395L22.215 24z\"\n fill={properties[2]!.color}\n transform={`translate(${properties[2]!.translateX} ${properties[2]!.translateY}) rotate(${properties[2]!.rotate} ${SIZE / 2} ${SIZE / 2}) scale(${properties[2]!.scale})`}\n />\n </g>\n <defs>\n <filter\n id={filterId}\n filterUnits=\"userSpaceOnUse\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend\n in=\"SourceGraphic\"\n in2=\"BackgroundImageFix\"\n result=\"shape\"\n />\n <feGaussianBlur stdDeviation=\"7\" result=\"effect1_foregroundBlur\" />\n </filter>\n </defs>\n </svg>\n )\n}\n"],"mappings":"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","names":["useContext","BasicError","BasicError","useMemo","useEffect","useRef","useState","useSyncExternalStore","BasicError","useSyncExternalStore","BasicError","useRef","useState","useEffect","useMemo","useCallback","useMemo","useCallback","useMemo","useMemo","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useCallback","useMemo","useMemo","useMemo","useSyncExternalStore","useMemo","useSyncExternalStore","useCallback","useCallback","useEffect","useState","useState","useEffect","BasicError","BasicError","useCallback","useRef","BasicError","useRef","useCallback","BasicError","jsx","useContext","createContext","useContext","useEffect","useRef","useState","BasicError","jsx","Fragment","jsx","jsxs","createContext","useContext","BasicButton","useState","useRef","useEffect","BasicError","handle"]}