@basictech/react 0.12.0-beta.1 → 0.12.0-beta.3
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.
- package/CHANGELOG.md +31 -0
- package/README.md +145 -9
- package/dist/index.d.mts +126 -5
- package/dist/index.d.ts +126 -5
- package/dist/index.js +1122 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1122 -1
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +564 -0
- package/dist/styles.css.map +1 -0
- package/dist/styles.d.mts +2 -0
- package/dist/styles.d.ts +2 -0
- package/package.json +10 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @basictech/react
|
|
2
2
|
|
|
3
|
+
## 0.12.0-beta.3
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- fc5772a: Add app-owned menu actions and links with optional icons to UserAvatar, UserButton, and UserMenu.
|
|
8
|
+
Add a base background color to BasicUIProvider, derive borders and hover backgrounds from it,
|
|
9
|
+
and choose black or white text for hex accent colors. Preserve appearance in menu and modal
|
|
10
|
+
portals. Document component selection, simple theming, menu extensions, and Base UI dependencies.
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- @basictech/core@0.12.0-beta.3
|
|
15
|
+
|
|
16
|
+
## 0.12.0-beta.2
|
|
17
|
+
|
|
18
|
+
### Minor Changes
|
|
19
|
+
|
|
20
|
+
- 85388da: Add Base UI-backed account, auth, sync-status, avatar, and sharing components with optional scoped
|
|
21
|
+
styles and an appearance provider. Include a React DOM peer dependency for the portaled UI.
|
|
22
|
+
Add app-token project-profile read/update/reset APIs, React hook and settings editor, per-account
|
|
23
|
+
menu badges, and an optional avatar sync indicator.
|
|
24
|
+
Expose the components and project-profile hook through the Next.js client entry.
|
|
25
|
+
Share the saved-account registry between REST and sync modes, support add-account sign-in,
|
|
26
|
+
and keep cached display identity up to date after profile saves. Include read-only account
|
|
27
|
+
diagnostics with clipboard export and suppress sync badges in REST mode.
|
|
28
|
+
|
|
29
|
+
### Patch Changes
|
|
30
|
+
|
|
31
|
+
- Updated dependencies [85388da]
|
|
32
|
+
- @basictech/core@0.12.0-beta.2
|
|
33
|
+
|
|
3
34
|
## 0.12.0-beta.1
|
|
4
35
|
|
|
5
36
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -18,14 +18,19 @@ its package metadata.
|
|
|
18
18
|
|
|
19
19
|
## Install
|
|
20
20
|
|
|
21
|
-
This README describes
|
|
21
|
+
This README describes `0.12.0-beta.3`. After publication, install
|
|
22
22
|
matching versions of the React SDK and the schema package you import directly:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
npm install @basictech/react@0.12.0-beta.
|
|
25
|
+
npm install @basictech/react@0.12.0-beta.3 @basictech/schema@0.12.0-beta.3
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
React
|
|
28
|
+
React and React DOM (18+) are peer dependencies and must already be installed by your application.
|
|
29
|
+
Use Node.js 24+ for development, CI, and builds to match the supported engine range.
|
|
30
|
+
`@base-ui/react` (`^1.8.0`) is installed automatically as a dependency, not a peer.
|
|
31
|
+
We import its `avatar`, `dialog`, `menu`, and `tabs` subpaths and leave them external in the SDK
|
|
32
|
+
build. Your app's bundler resolves those imports; we do not bundle the entire Base UI library
|
|
33
|
+
inside the SDK. Installing the dependency does install the Base UI package on disk.
|
|
29
34
|
|
|
30
35
|
## Auth update guide
|
|
31
36
|
|
|
@@ -33,9 +38,9 @@ Upgrade the packages you use together. npm's `latest` channel remains on `0.11.0
|
|
|
33
38
|
does not contain all of the API changes described here:
|
|
34
39
|
|
|
35
40
|
```bash
|
|
36
|
-
npm install @basictech/react@0.12.0-beta.
|
|
41
|
+
npm install @basictech/react@0.12.0-beta.3 @basictech/schema@0.12.0-beta.3
|
|
37
42
|
# If you import core directly, update that dependency too:
|
|
38
|
-
npm install @basictech/core@0.12.0-beta.
|
|
43
|
+
npm install @basictech/core@0.12.0-beta.3
|
|
39
44
|
```
|
|
40
45
|
|
|
41
46
|
Keep the public packages on matching versions. No browser storage reset or persisted-profile
|
|
@@ -328,6 +333,135 @@ With the default `renderWhileLoading={false}`, hooks under the Provider first re
|
|
|
328
333
|
client is ready. Setting it to `true` is useful for an application shell that reads `isReady` and
|
|
329
334
|
owns its loading UI.
|
|
330
335
|
|
|
336
|
+
## Prebuilt components
|
|
337
|
+
|
|
338
|
+
Drop-in account and sharing UI uses Base UI's accessible menu, avatar, and dialog primitives.
|
|
339
|
+
Components use the nearest `BasicProvider` (including `basic.Provider`); they do not create a
|
|
340
|
+
second auth client. Import the optional stylesheet once. Omit it to supply your own styles.
|
|
341
|
+
|
|
342
|
+
**Which one should I use?** `UserButton` gives you the avatar, name, handle, and menu.
|
|
343
|
+
Choose `UserAvatar` for the same menu with an avatar-only trigger. `UserMenu` is the shared
|
|
344
|
+
component underneath both; you normally do not need to render it separately.
|
|
345
|
+
|
|
346
|
+
```tsx
|
|
347
|
+
import {
|
|
348
|
+
BasicUIProvider, SignInButton, UserButton, AuthStatus, SyncStatus, SharesModal,
|
|
349
|
+
} from '@basictech/react'
|
|
350
|
+
import '@basictech/react/styles.css'
|
|
351
|
+
import { basic } from './basic'
|
|
352
|
+
|
|
353
|
+
export function AccountTools() {
|
|
354
|
+
return (
|
|
355
|
+
<basic.Provider>
|
|
356
|
+
<BasicUIProvider appearance={{ theme: 'light', accent: '#354f45', radius: '8px' }}>
|
|
357
|
+
<SignInButton />
|
|
358
|
+
<UserButton allowAddAccount />
|
|
359
|
+
<AuthStatus />
|
|
360
|
+
<SyncStatus />
|
|
361
|
+
<SharesModal scope={[{ table: 'todos', recordIds: ['todo-1'] }]} />
|
|
362
|
+
</BasicUIProvider>
|
|
363
|
+
</basic.Provider>
|
|
364
|
+
)
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
| Component | Options and behavior |
|
|
369
|
+
| --- | --- |
|
|
370
|
+
| `BasicButton` | Native button props/ref; `variant="solid\|outline\|ghost"`. Defaults to `type="button"`. |
|
|
371
|
+
| `SignInButton`, `SignOutButton` | Native button props and variant, pending/error feedback. Sign-in accepts `input` (handle/DID); `onClick.preventDefault()` cancels the action. Expired sessions can reauthorize or sign out. |
|
|
372
|
+
| `UserAvatar` | Borderless avatar trigger for the shared user menu. Current account or explicit `profile` (`null` means guest); `size`, `className`, `style`; image failure falls back to initials. Sync badge defaults on in sync mode; `showSyncBadge={false}` hides it. REST mode never shows a sync badge. |
|
|
373
|
+
| `UserButton` | Avatar, name, handle, and dropdown icon with a bordered hoverable trigger. `shape="rounded\|square"` defaults to rounded. Opens the shared user menu. Local accounts never show a handle. |
|
|
374
|
+
| `UserMenu` | Shared menu used by both triggers; `trigger="avatar\|button"` defaults to avatar. Current account at top, Manage account, other saved accounts, and auth actions. The switch section appears only when other accounts exist. Only expired auth gets an `Expired` warning; no signed-in badge. `showSyncStatus={false}` hides the header's sync label; REST mode always hides sync badges. `allowAddAccount` defaults to true, starting sign-in in a new profile in REST or sync mode. Local accounts offer Clear account with a destructive-action confirmation. Optional `accountSettingsUrl`. |
|
|
375
|
+
| `AuthStatus` | Loading, signed-in, guest, signed-out, recovering, and expired session labels. UI visibility is not authorization. |
|
|
376
|
+
| `SyncStatus` | Connectivity, pending counts, and conflict/rejection count; optional `source` for a repo or mount. An online queue is not labelled synced. |
|
|
377
|
+
| `AccountSettingsModal` | Profile tab edits the project display name with Cancel/Save changes; drafts survive tab switches. Advanced shows read-only DID, PDS URL, local account/storage identifiers, auth/write state, and sync counts. No tokens or credentials are rendered. Local accounts show explicit DID/PDS fallbacks. `projectProfile` supplies a complete preview hook result. Optional `accountSettingsUrl` links to universal identity settings; `children` adds host-owned Profile content. |
|
|
378
|
+
| `SharesModal` | Same identity-header layout with Outgoing/Incoming tabs. Required explicit `scope`, optional `repo` (default: `'default'`). Viewer/editor invitations by handle/DID, outgoing list, refresh, confirmed cancellation/revocation. Incoming acceptance and mount management remain in Basic ID. |
|
|
379
|
+
|
|
380
|
+
Both modals accept `open`/`onOpenChange`, an optional button element or label as `trigger`, and
|
|
381
|
+
`finalFocus` for externally controlled use. `trigger={null}` omits the trigger. Custom trigger
|
|
382
|
+
components must forward their ref and DOM props. Dialogs trap focus and close with Escape.
|
|
383
|
+
|
|
384
|
+
### Simple colors and custom menu items
|
|
385
|
+
|
|
386
|
+
`appearance.base`, automatic accent contrast, and `menuItems` require `0.12.0-beta.3` or newer;
|
|
387
|
+
they are not available in beta.2.
|
|
388
|
+
|
|
389
|
+
Start with `theme: 'light'` or `'dark'`. Optionally set a `base` background and an `accent`.
|
|
390
|
+
Light mode uses black text; dark mode uses white text, with muted shades for secondary text.
|
|
391
|
+
Borders and hover backgrounds follow the base color. Choose a light base for light mode and a
|
|
392
|
+
dark base for dark mode. Omit the accent for neutral black/white buttons. For an accent, use
|
|
393
|
+
`#RGB` or `#RRGGBB`: solid buttons automatically choose black or white text for contrast.
|
|
394
|
+
Other CSS accent values retain white foreground text; check their contrast yourself.
|
|
395
|
+
|
|
396
|
+
```tsx
|
|
397
|
+
import { BasicUIProvider, UserButton } from '@basictech/react'
|
|
398
|
+
import '@basictech/react/styles.css'
|
|
399
|
+
|
|
400
|
+
// Inside your existing BasicProvider. openPreferences is your app's callback.
|
|
401
|
+
<BasicUIProvider appearance={{ theme: 'dark', base: '#201d17', accent: '#d4af37' }}>
|
|
402
|
+
<UserButton menuItems={[
|
|
403
|
+
{ id: 'preferences', label: 'Preferences', onClick: openPreferences },
|
|
404
|
+
{ id: 'about', label: 'About', href: '/about' },
|
|
405
|
+
]} />
|
|
406
|
+
</BasicUIProvider>
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
`UserAvatar`, `UserButton`, and `UserMenu` all accept `menuItems`. Each item has a unique `id`,
|
|
410
|
+
`label`, either `href` or `onClick`, and optional `icon` (a React node) and `disabled`.
|
|
411
|
+
Icons are decorative, sized to 16px, and can come from your app's existing icon library:
|
|
412
|
+
`{ id: 'preferences', label: 'Preferences', icon: <SettingsIcon />, onClick: openPreferences }`.
|
|
413
|
+
Items appear after Manage account and before Sign out/Clear account. Selecting an item closes
|
|
414
|
+
the menu; async action failures use the SDK's dismissible error dialog. Use `onClick` to call
|
|
415
|
+
your router when you need client-side navigation rather than a normal link.
|
|
416
|
+
|
|
417
|
+
Nested appearance providers inherit settings, including in portaled menus and modals.
|
|
418
|
+
Pass your app's current light/dark mode to `theme`; there is no separate theme listener.
|
|
419
|
+
Existing `radius` and `density: 'comfortable' | 'compact'` options remain available.
|
|
420
|
+
Fonts inherit from the host. No icon pack or additional provider is needed.
|
|
421
|
+
|
|
422
|
+
To replace custom auth UI, keep your existing BasicProvider, import the stylesheet once,
|
|
423
|
+
and replace the old avatar/dropdown with `UserButton` or `UserAvatar`. Move app-owned actions
|
|
424
|
+
into `menuItems`; account switching and sign-out remain SDK-managed. `accountSettingsUrl`
|
|
425
|
+
only adds a link inside the built-in settings modal—it does not replace Manage account.
|
|
426
|
+
|
|
427
|
+
For controlled previews, components accept complete hook results via `auth`, `accounts`, `sync`,
|
|
428
|
+
or `shares` as appropriate. These replace rendered state **and action callbacks**; a BasicProvider
|
|
429
|
+
is still required and hooks still subscribe/read. Do not use these props as an authorization
|
|
430
|
+
boundary. Real mutations remain subject to SDK and server permissions.
|
|
431
|
+
|
|
432
|
+
Share creation requires an explicit nonempty table/record scope and defaults to viewer access.
|
|
433
|
+
The list is labelled **all permissions**, not filtered to the new-invitation scope. Revocation cannot
|
|
434
|
+
retract downloaded data. Signing out removes the account's local cache and pending edits.
|
|
435
|
+
The incoming-invitations section links to Basic ID: inbox/accept/decline APIs require owner
|
|
436
|
+
credentials, not app tokens. Server project-profile GET/PATCH/DELETE APIs exist at
|
|
437
|
+
`/account/:project_id/profile` with `app:profile:read/update/delete` grants respectively.
|
|
438
|
+
Configure those requested OAuth scopes and reauthorize existing sessions when needed.
|
|
439
|
+
The shared menu shows sync status and any expiry warning with the current account in its header.
|
|
440
|
+
Inactive accounts show saved expiry state, not the active account's sync status.
|
|
441
|
+
Both `UserButton` and `UserAvatar` accept `showSyncBadge` (default follows SDK sync mode); circles use
|
|
442
|
+
green for synced, blue for connecting/pending, orange for errors, gray for offline/local/idle.
|
|
443
|
+
The demo's `?page=components` gallery offers live behavior, isolated simulated actions, design
|
|
444
|
+
controls, and a copyable usage recipe. Live OAuth/shares require a configured signed-in account.
|
|
445
|
+
|
|
446
|
+
### Project profile API
|
|
447
|
+
|
|
448
|
+
`basic.useProjectProfile()` (also exported as `useProjectProfile`) returns `data`, `isLoading`,
|
|
449
|
+
`error`, `refresh()`, `update(patch)`, and `reset()`. Pass `false` to disable automatic reads.
|
|
450
|
+
`data` is `{ profile: { name?, avatar_url?, status? }, meta? }` or null before loading/sign-in.
|
|
451
|
+
The core client exposes the same operations directly:
|
|
452
|
+
|
|
453
|
+
```ts
|
|
454
|
+
await basic.client.getProjectProfile()
|
|
455
|
+
await basic.client.updateProjectProfile({ name: 'Name in this app', status: null })
|
|
456
|
+
await basic.client.resetProjectProfile()
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
Requests always target the configured client ID using the active app token. Omitted fields stay
|
|
460
|
+
unchanged; null removes an override. Metadata objects merge on the server; `meta: null` clears
|
|
461
|
+
metadata. Reset removes all project overrides and metadata. Universal profile data is untouched.
|
|
462
|
+
Permission failures propagate as SDK errors. Profile responses are not written into the local
|
|
463
|
+
account registry; consumers needing the updated project identity should use this hook's data.
|
|
464
|
+
|
|
331
465
|
## Hook reference
|
|
332
466
|
|
|
333
467
|
The schema-bound factory returns every hook below. Bound hooks are preferred because they reject
|
|
@@ -412,14 +546,16 @@ replicas and returns to another local profile or a fresh anonymous one when enab
|
|
|
412
546
|
- `accounts: BasicAccount[]` lists local profiles with per-account auth summaries.
|
|
413
547
|
- `activeAccount: BasicAccount | null` is this tab's selected profile and auth summary.
|
|
414
548
|
- `switchAccount(id): Promise<void>` changes the active profile in this tab.
|
|
415
|
-
- `addAccount(): Promise<BasicProfile>` creates and activates a new
|
|
416
|
-
|
|
549
|
+
- `addAccount({ signIn?: boolean }): Promise<BasicProfile>` creates and activates a new profile.
|
|
550
|
+
Omit options to stay local; pass `{ signIn: true }` to validate redirect configuration first and
|
|
551
|
+
start sign-in in the new profile. The prebuilt menu uses this sign-in option.
|
|
417
552
|
- `removeAccount(id): Promise<void>` removes that profile and its local credentials/replicas. If it
|
|
418
553
|
is active, this follows the sign-out path. It does not delete the server account.
|
|
419
554
|
|
|
420
555
|
`BasicProfile` contains `id`, `kind: 'anon' | 'account'`, `storagePrefix`, `createdAt`,
|
|
421
|
-
`lastActiveAt`, and optional/null `did`, `handle`, `email`, `name`, and `picture`.
|
|
422
|
-
`addAccount(
|
|
556
|
+
`lastActiveAt`, and optional/null `did`, `handle`, `email`, `name`, and `picture`. Saved accounts and
|
|
557
|
+
switching work in REST and sync modes. `addAccount({ signIn: true })` works in either mode;
|
|
558
|
+
`addAccount()` without sign-in still requires sync mode with anonymous profiles enabled.
|
|
423
559
|
|
|
424
560
|
```tsx
|
|
425
561
|
// file: AccountSwitcher.tsx
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ReactNode, ReactElement } from 'react';
|
|
3
|
-
import { BasicSchema, BasicConfig, BasicClient, BasicAccount, BasicProfile, ReadOnlyReason, AuthStatus, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthChannelContext, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
|
|
2
|
+
import { ReactNode, ReactElement, RefObject, ButtonHTMLAttributes, HTMLAttributes } from 'react';
|
|
3
|
+
import { BasicSchema, BasicConfig, BasicClient, BasicAccount, BasicProfile, ReadOnlyReason, AuthStatus as AuthStatus$1, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, ProjectProfile, ProjectProfilePatch, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthChannelContext, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
|
|
4
4
|
|
|
5
5
|
type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>;
|
|
6
6
|
/** Create a core client with the complete browser adapter set installed. */
|
|
@@ -10,7 +10,9 @@ interface UseAccountsResult {
|
|
|
10
10
|
accounts: BasicAccount[];
|
|
11
11
|
activeAccount: BasicAccount | null;
|
|
12
12
|
switchAccount(id: string): Promise<void>;
|
|
13
|
-
addAccount(
|
|
13
|
+
addAccount(options?: {
|
|
14
|
+
signIn?: boolean;
|
|
15
|
+
}): Promise<BasicProfile>;
|
|
14
16
|
removeAccount(id: string): Promise<void>;
|
|
15
17
|
}
|
|
16
18
|
declare function useAccounts(): UseAccountsResult;
|
|
@@ -21,7 +23,7 @@ interface UseAuthResult {
|
|
|
21
23
|
isAnonymous: boolean;
|
|
22
24
|
canWrite: boolean;
|
|
23
25
|
readOnlyReason: ReadOnlyReason | null;
|
|
24
|
-
status: AuthStatus;
|
|
26
|
+
status: AuthStatus$1;
|
|
25
27
|
/** Raw auth diagnostic; stable identity while its code and expired state are unchanged. */
|
|
26
28
|
error: BasicError | null;
|
|
27
29
|
user: AuthUser | null;
|
|
@@ -118,6 +120,19 @@ interface UseReposResult {
|
|
|
118
120
|
}
|
|
119
121
|
declare function useRepos(): UseReposResult;
|
|
120
122
|
|
|
123
|
+
interface AsyncResult<T> {
|
|
124
|
+
data: T;
|
|
125
|
+
isLoading: boolean;
|
|
126
|
+
error: BasicError | null;
|
|
127
|
+
refresh(): void;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
interface UseProjectProfileResult extends AsyncResult<ProjectProfile | null> {
|
|
131
|
+
update(patch: ProjectProfilePatch): Promise<ProjectProfile>;
|
|
132
|
+
reset(): Promise<ProjectProfile>;
|
|
133
|
+
}
|
|
134
|
+
declare function useProjectProfile(enabled?: boolean): UseProjectProfileResult;
|
|
135
|
+
|
|
121
136
|
type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & {
|
|
122
137
|
schema: S;
|
|
123
138
|
};
|
|
@@ -147,6 +162,7 @@ interface CreatedBasic<S extends BasicSchema> {
|
|
|
147
162
|
useSyncStatus(source?: SourceRef): UseSyncStatusResult;
|
|
148
163
|
useSchemaStatus(source?: SourceRef): SchemaStatus;
|
|
149
164
|
useRepos(): UseReposResult;
|
|
165
|
+
useProjectProfile(enabled?: boolean): UseProjectProfileResult;
|
|
150
166
|
useFiles(query?: FileListQuery, options?: {
|
|
151
167
|
source?: SourceRef;
|
|
152
168
|
}): UseFilesResult;
|
|
@@ -180,6 +196,111 @@ declare function useCollection<V extends JsonObject = JsonObject>(name: string,
|
|
|
180
196
|
source?: SourceRef;
|
|
181
197
|
}): Collection<V>;
|
|
182
198
|
|
|
199
|
+
interface BasicAppearance {
|
|
200
|
+
theme?: 'light' | 'dark';
|
|
201
|
+
/** Background color. Choose a light or dark base to match the theme. */
|
|
202
|
+
base?: string;
|
|
203
|
+
/** Hex colors get automatic black/white foreground contrast. */
|
|
204
|
+
accent?: string;
|
|
205
|
+
radius?: string;
|
|
206
|
+
density?: 'compact' | 'comfortable';
|
|
207
|
+
}
|
|
208
|
+
/** Optional styling provider. CSS is opt-in via @basictech/react/styles.css. */
|
|
209
|
+
declare function BasicUIProvider({ appearance, children, }: {
|
|
210
|
+
appearance?: BasicAppearance;
|
|
211
|
+
children: ReactNode;
|
|
212
|
+
}): react.JSX.Element;
|
|
213
|
+
interface BasicButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
214
|
+
variant?: 'solid' | 'outline' | 'ghost';
|
|
215
|
+
}
|
|
216
|
+
declare const BasicButton: react.ForwardRefExoticComponent<BasicButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
217
|
+
interface AuthButtonProps extends BasicButtonProps {
|
|
218
|
+
auth?: UseAuthResult;
|
|
219
|
+
input?: string;
|
|
220
|
+
}
|
|
221
|
+
declare function SignInButton(props: AuthButtonProps): react.JSX.Element;
|
|
222
|
+
declare function SignOutButton(props: AuthButtonProps): react.JSX.Element;
|
|
223
|
+
interface UserAvatarProps extends HTMLAttributes<HTMLSpanElement> {
|
|
224
|
+
profile?: (Pick<BasicProfile, 'name' | 'handle' | 'email' | 'picture'> & Partial<Pick<BasicProfile, 'kind'>>) | null;
|
|
225
|
+
size?: number;
|
|
226
|
+
showSyncBadge?: boolean;
|
|
227
|
+
sync?: UseSyncStatusResult;
|
|
228
|
+
accounts?: UseAccountsResult;
|
|
229
|
+
auth?: UseAuthResult;
|
|
230
|
+
projectProfile?: UseProjectProfileResult;
|
|
231
|
+
allowAddAccount?: boolean;
|
|
232
|
+
menuItems?: UserMenuItem[];
|
|
233
|
+
}
|
|
234
|
+
declare function UserAvatar({ accounts, auth, projectProfile, allowAddAccount, menuItems, ...avatarProps }: UserAvatarProps): react.JSX.Element;
|
|
235
|
+
declare function AuthStatus({ auth: supplied, className, ...props }: HTMLAttributes<HTMLSpanElement> & {
|
|
236
|
+
auth?: UseAuthResult;
|
|
237
|
+
}): react.JSX.Element;
|
|
238
|
+
declare function SyncStatus({ sync: supplied, source, className, ...props }: HTMLAttributes<HTMLSpanElement> & {
|
|
239
|
+
sync?: UseSyncStatusResult;
|
|
240
|
+
source?: SourceRef;
|
|
241
|
+
}): react.JSX.Element | null;
|
|
242
|
+
/** App-owned items appear after Manage account and before Sign out. */
|
|
243
|
+
type UserMenuItem = {
|
|
244
|
+
id: string;
|
|
245
|
+
label: string;
|
|
246
|
+
icon?: ReactNode;
|
|
247
|
+
disabled?: boolean;
|
|
248
|
+
} & ({
|
|
249
|
+
href: string;
|
|
250
|
+
onClick?: never;
|
|
251
|
+
} | {
|
|
252
|
+
onClick: () => void | Promise<void>;
|
|
253
|
+
href?: never;
|
|
254
|
+
});
|
|
255
|
+
interface UserButtonProps {
|
|
256
|
+
accounts?: UseAccountsResult;
|
|
257
|
+
auth?: UseAuthResult;
|
|
258
|
+
sync?: UseSyncStatusResult;
|
|
259
|
+
/** Show synchronization status in the account menu. Defaults to true. */
|
|
260
|
+
showSyncStatus?: boolean;
|
|
261
|
+
/** Defaults to enabled in sync mode. */
|
|
262
|
+
showSyncBadge?: boolean;
|
|
263
|
+
shape?: 'rounded' | 'square';
|
|
264
|
+
projectProfile?: UseProjectProfileResult;
|
|
265
|
+
/** Show the action to sign in to another account. Defaults to true. */
|
|
266
|
+
allowAddAccount?: boolean;
|
|
267
|
+
className?: string;
|
|
268
|
+
accountSettingsUrl?: string;
|
|
269
|
+
menuItems?: UserMenuItem[];
|
|
270
|
+
}
|
|
271
|
+
declare function UserButton(props: UserButtonProps): react.JSX.Element;
|
|
272
|
+
interface UserMenuProps extends UserButtonProps {
|
|
273
|
+
trigger?: 'avatar' | 'button';
|
|
274
|
+
avatarProps?: UserAvatarProps;
|
|
275
|
+
}
|
|
276
|
+
declare function UserMenu({ accounts: supplied, auth: suppliedAuth, sync, showSyncStatus, showSyncBadge, shape, trigger, avatarProps, projectProfile, allowAddAccount, className, accountSettingsUrl, menuItems, }: UserMenuProps): react.JSX.Element;
|
|
277
|
+
interface BasicModalProps {
|
|
278
|
+
open?: boolean;
|
|
279
|
+
onOpenChange?: (open: boolean) => void;
|
|
280
|
+
finalFocus?: RefObject<HTMLElement>;
|
|
281
|
+
/** Supply a button element; null omits the trigger for controlled use. */
|
|
282
|
+
trigger?: ReactNode;
|
|
283
|
+
}
|
|
284
|
+
interface AccountSettingsModalProps extends BasicModalProps {
|
|
285
|
+
auth?: UseAuthResult;
|
|
286
|
+
accounts?: UseAccountsResult;
|
|
287
|
+
projectProfile?: UseProjectProfileResult;
|
|
288
|
+
sync?: UseSyncStatusResult;
|
|
289
|
+
accountSettingsUrl?: string;
|
|
290
|
+
children?: ReactNode;
|
|
291
|
+
}
|
|
292
|
+
declare function AccountSettingsModal({ auth: suppliedAuth, accounts: suppliedAccounts, accountSettingsUrl, projectProfile, sync, children, ...props }: AccountSettingsModalProps): react.JSX.Element;
|
|
293
|
+
interface SharesModalProps extends BasicModalProps {
|
|
294
|
+
auth?: UseAuthResult;
|
|
295
|
+
accounts?: UseAccountsResult;
|
|
296
|
+
sync?: UseSyncStatusResult;
|
|
297
|
+
shares?: UseOutgoingSharesResult;
|
|
298
|
+
/** Explicit least-privilege scope; the component never infers all tables. */
|
|
299
|
+
scope: CreateOutgoingShareInput['scope'];
|
|
300
|
+
repo?: CreateOutgoingShareInput['repo'];
|
|
301
|
+
}
|
|
302
|
+
declare function SharesModal({ auth: supplied, accounts: suppliedAccounts, sync, shares, scope, repo, ...props }: SharesModalProps): react.JSX.Element;
|
|
303
|
+
|
|
183
304
|
/** Synchronous browser Storage adapted to core's key-value contract. */
|
|
184
305
|
declare class BrowserKeyValueStorage implements KeyValueStorage {
|
|
185
306
|
private readonly storage;
|
|
@@ -275,4 +396,4 @@ declare class PersistenceStore implements ReplicaStoreFactory {
|
|
|
275
396
|
/** Browser multipart transport with upload progress, adapted from the Drive UI. */
|
|
276
397
|
declare const browserUploadTransport: UploadTransportAdapter;
|
|
277
398
|
|
|
278
|
-
export { type AccessTokenAdopter, BasicProvider, type BasicProviderProps, type BoundBasicProviderProps, type BrowserBasicConfig, BrowserKeyValueStorage, type BrowserLockManager, type BrowserMessageChannel, BrowserTokenStore, type CreateBasicConfig, type CreatedBasic, PersistenceStore, type PersistenceStoreOptions, type UseAccountsResult, type UseAuthResult, type UseBasicResult, type UseFilesResult, type UseMountsResult, type UseOutgoingSharesResult, type UseQueryResult, type UseReposResult, type UseStorageInfoResult, type UseSyncStatusResult, browserCurrentUrl, browserNavigate, browserReplaceUrl, browserStorage, browserUploadTransport, createBasic, createBasicClient, createBrowserAuthChannelFactory, createBrowserMessageChannel, useAccounts, useAuth, useBasic, useCollection, useDb, useFiles, useMounts, useOutgoingShares, useQuery, useRepos, useSchemaStatus, useStorageInfo, useSyncStatus };
|
|
399
|
+
export { type AccessTokenAdopter, AccountSettingsModal, type AccountSettingsModalProps, type AuthButtonProps, AuthStatus, type BasicAppearance, BasicButton, type BasicButtonProps, type BasicModalProps, BasicProvider, type BasicProviderProps, BasicUIProvider, type BoundBasicProviderProps, type BrowserBasicConfig, BrowserKeyValueStorage, type BrowserLockManager, type BrowserMessageChannel, BrowserTokenStore, type CreateBasicConfig, type CreatedBasic, PersistenceStore, type PersistenceStoreOptions, SharesModal, type SharesModalProps, SignInButton, SignOutButton, SyncStatus, type UseAccountsResult, type UseAuthResult, type UseBasicResult, type UseFilesResult, type UseMountsResult, type UseOutgoingSharesResult, type UseProjectProfileResult, type UseQueryResult, type UseReposResult, type UseStorageInfoResult, type UseSyncStatusResult, UserAvatar, type UserAvatarProps, UserButton, type UserButtonProps, UserMenu, type UserMenuItem, type UserMenuProps, browserCurrentUrl, browserNavigate, browserReplaceUrl, browserStorage, browserUploadTransport, createBasic, createBasicClient, createBrowserAuthChannelFactory, createBrowserMessageChannel, useAccounts, useAuth, useBasic, useCollection, useDb, useFiles, useMounts, useOutgoingShares, useProjectProfile, useQuery, useRepos, useSchemaStatus, useStorageInfo, useSyncStatus };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { ReactNode, ReactElement } from 'react';
|
|
3
|
-
import { BasicSchema, BasicConfig, BasicClient, BasicAccount, BasicProfile, ReadOnlyReason, AuthStatus, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthChannelContext, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
|
|
2
|
+
import { ReactNode, ReactElement, RefObject, ButtonHTMLAttributes, HTMLAttributes } from 'react';
|
|
3
|
+
import { BasicSchema, BasicConfig, BasicClient, BasicAccount, BasicProfile, ReadOnlyReason, AuthStatus as AuthStatus$1, BasicError, AuthUser, BasicSyncStatus, BasicRejection, BasicConflict, SourceRef, SchemaStatus, BasicDb, Repo, FileRecord, MountFileInfo, StorageInfo, FileListQuery, MountInfo, MountHandle, OutgoingShareInfo, CreateOutgoingShareInput, MountsQuery, JsonObject, BasicRecord, Query, ProjectProfile, ProjectProfilePatch, MountViewerFiles, OwnerFiles, TableNames, Collection, InferValue, KeyValueStorage, TokenStore, AuthChannelContext, AuthMessageChannel, ReplicaStoreFactory, StoragePartition, ReplicaStore, UploadTransportAdapter } from '@basictech/core';
|
|
4
4
|
|
|
5
5
|
type BrowserBasicConfig<S extends BasicSchema = BasicSchema> = BasicConfig<S>;
|
|
6
6
|
/** Create a core client with the complete browser adapter set installed. */
|
|
@@ -10,7 +10,9 @@ interface UseAccountsResult {
|
|
|
10
10
|
accounts: BasicAccount[];
|
|
11
11
|
activeAccount: BasicAccount | null;
|
|
12
12
|
switchAccount(id: string): Promise<void>;
|
|
13
|
-
addAccount(
|
|
13
|
+
addAccount(options?: {
|
|
14
|
+
signIn?: boolean;
|
|
15
|
+
}): Promise<BasicProfile>;
|
|
14
16
|
removeAccount(id: string): Promise<void>;
|
|
15
17
|
}
|
|
16
18
|
declare function useAccounts(): UseAccountsResult;
|
|
@@ -21,7 +23,7 @@ interface UseAuthResult {
|
|
|
21
23
|
isAnonymous: boolean;
|
|
22
24
|
canWrite: boolean;
|
|
23
25
|
readOnlyReason: ReadOnlyReason | null;
|
|
24
|
-
status: AuthStatus;
|
|
26
|
+
status: AuthStatus$1;
|
|
25
27
|
/** Raw auth diagnostic; stable identity while its code and expired state are unchanged. */
|
|
26
28
|
error: BasicError | null;
|
|
27
29
|
user: AuthUser | null;
|
|
@@ -118,6 +120,19 @@ interface UseReposResult {
|
|
|
118
120
|
}
|
|
119
121
|
declare function useRepos(): UseReposResult;
|
|
120
122
|
|
|
123
|
+
interface AsyncResult<T> {
|
|
124
|
+
data: T;
|
|
125
|
+
isLoading: boolean;
|
|
126
|
+
error: BasicError | null;
|
|
127
|
+
refresh(): void;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
interface UseProjectProfileResult extends AsyncResult<ProjectProfile | null> {
|
|
131
|
+
update(patch: ProjectProfilePatch): Promise<ProjectProfile>;
|
|
132
|
+
reset(): Promise<ProjectProfile>;
|
|
133
|
+
}
|
|
134
|
+
declare function useProjectProfile(enabled?: boolean): UseProjectProfileResult;
|
|
135
|
+
|
|
121
136
|
type CreateBasicConfig<S extends BasicSchema> = BrowserBasicConfig<S> & {
|
|
122
137
|
schema: S;
|
|
123
138
|
};
|
|
@@ -147,6 +162,7 @@ interface CreatedBasic<S extends BasicSchema> {
|
|
|
147
162
|
useSyncStatus(source?: SourceRef): UseSyncStatusResult;
|
|
148
163
|
useSchemaStatus(source?: SourceRef): SchemaStatus;
|
|
149
164
|
useRepos(): UseReposResult;
|
|
165
|
+
useProjectProfile(enabled?: boolean): UseProjectProfileResult;
|
|
150
166
|
useFiles(query?: FileListQuery, options?: {
|
|
151
167
|
source?: SourceRef;
|
|
152
168
|
}): UseFilesResult;
|
|
@@ -180,6 +196,111 @@ declare function useCollection<V extends JsonObject = JsonObject>(name: string,
|
|
|
180
196
|
source?: SourceRef;
|
|
181
197
|
}): Collection<V>;
|
|
182
198
|
|
|
199
|
+
interface BasicAppearance {
|
|
200
|
+
theme?: 'light' | 'dark';
|
|
201
|
+
/** Background color. Choose a light or dark base to match the theme. */
|
|
202
|
+
base?: string;
|
|
203
|
+
/** Hex colors get automatic black/white foreground contrast. */
|
|
204
|
+
accent?: string;
|
|
205
|
+
radius?: string;
|
|
206
|
+
density?: 'compact' | 'comfortable';
|
|
207
|
+
}
|
|
208
|
+
/** Optional styling provider. CSS is opt-in via @basictech/react/styles.css. */
|
|
209
|
+
declare function BasicUIProvider({ appearance, children, }: {
|
|
210
|
+
appearance?: BasicAppearance;
|
|
211
|
+
children: ReactNode;
|
|
212
|
+
}): react.JSX.Element;
|
|
213
|
+
interface BasicButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
214
|
+
variant?: 'solid' | 'outline' | 'ghost';
|
|
215
|
+
}
|
|
216
|
+
declare const BasicButton: react.ForwardRefExoticComponent<BasicButtonProps & react.RefAttributes<HTMLButtonElement>>;
|
|
217
|
+
interface AuthButtonProps extends BasicButtonProps {
|
|
218
|
+
auth?: UseAuthResult;
|
|
219
|
+
input?: string;
|
|
220
|
+
}
|
|
221
|
+
declare function SignInButton(props: AuthButtonProps): react.JSX.Element;
|
|
222
|
+
declare function SignOutButton(props: AuthButtonProps): react.JSX.Element;
|
|
223
|
+
interface UserAvatarProps extends HTMLAttributes<HTMLSpanElement> {
|
|
224
|
+
profile?: (Pick<BasicProfile, 'name' | 'handle' | 'email' | 'picture'> & Partial<Pick<BasicProfile, 'kind'>>) | null;
|
|
225
|
+
size?: number;
|
|
226
|
+
showSyncBadge?: boolean;
|
|
227
|
+
sync?: UseSyncStatusResult;
|
|
228
|
+
accounts?: UseAccountsResult;
|
|
229
|
+
auth?: UseAuthResult;
|
|
230
|
+
projectProfile?: UseProjectProfileResult;
|
|
231
|
+
allowAddAccount?: boolean;
|
|
232
|
+
menuItems?: UserMenuItem[];
|
|
233
|
+
}
|
|
234
|
+
declare function UserAvatar({ accounts, auth, projectProfile, allowAddAccount, menuItems, ...avatarProps }: UserAvatarProps): react.JSX.Element;
|
|
235
|
+
declare function AuthStatus({ auth: supplied, className, ...props }: HTMLAttributes<HTMLSpanElement> & {
|
|
236
|
+
auth?: UseAuthResult;
|
|
237
|
+
}): react.JSX.Element;
|
|
238
|
+
declare function SyncStatus({ sync: supplied, source, className, ...props }: HTMLAttributes<HTMLSpanElement> & {
|
|
239
|
+
sync?: UseSyncStatusResult;
|
|
240
|
+
source?: SourceRef;
|
|
241
|
+
}): react.JSX.Element | null;
|
|
242
|
+
/** App-owned items appear after Manage account and before Sign out. */
|
|
243
|
+
type UserMenuItem = {
|
|
244
|
+
id: string;
|
|
245
|
+
label: string;
|
|
246
|
+
icon?: ReactNode;
|
|
247
|
+
disabled?: boolean;
|
|
248
|
+
} & ({
|
|
249
|
+
href: string;
|
|
250
|
+
onClick?: never;
|
|
251
|
+
} | {
|
|
252
|
+
onClick: () => void | Promise<void>;
|
|
253
|
+
href?: never;
|
|
254
|
+
});
|
|
255
|
+
interface UserButtonProps {
|
|
256
|
+
accounts?: UseAccountsResult;
|
|
257
|
+
auth?: UseAuthResult;
|
|
258
|
+
sync?: UseSyncStatusResult;
|
|
259
|
+
/** Show synchronization status in the account menu. Defaults to true. */
|
|
260
|
+
showSyncStatus?: boolean;
|
|
261
|
+
/** Defaults to enabled in sync mode. */
|
|
262
|
+
showSyncBadge?: boolean;
|
|
263
|
+
shape?: 'rounded' | 'square';
|
|
264
|
+
projectProfile?: UseProjectProfileResult;
|
|
265
|
+
/** Show the action to sign in to another account. Defaults to true. */
|
|
266
|
+
allowAddAccount?: boolean;
|
|
267
|
+
className?: string;
|
|
268
|
+
accountSettingsUrl?: string;
|
|
269
|
+
menuItems?: UserMenuItem[];
|
|
270
|
+
}
|
|
271
|
+
declare function UserButton(props: UserButtonProps): react.JSX.Element;
|
|
272
|
+
interface UserMenuProps extends UserButtonProps {
|
|
273
|
+
trigger?: 'avatar' | 'button';
|
|
274
|
+
avatarProps?: UserAvatarProps;
|
|
275
|
+
}
|
|
276
|
+
declare function UserMenu({ accounts: supplied, auth: suppliedAuth, sync, showSyncStatus, showSyncBadge, shape, trigger, avatarProps, projectProfile, allowAddAccount, className, accountSettingsUrl, menuItems, }: UserMenuProps): react.JSX.Element;
|
|
277
|
+
interface BasicModalProps {
|
|
278
|
+
open?: boolean;
|
|
279
|
+
onOpenChange?: (open: boolean) => void;
|
|
280
|
+
finalFocus?: RefObject<HTMLElement>;
|
|
281
|
+
/** Supply a button element; null omits the trigger for controlled use. */
|
|
282
|
+
trigger?: ReactNode;
|
|
283
|
+
}
|
|
284
|
+
interface AccountSettingsModalProps extends BasicModalProps {
|
|
285
|
+
auth?: UseAuthResult;
|
|
286
|
+
accounts?: UseAccountsResult;
|
|
287
|
+
projectProfile?: UseProjectProfileResult;
|
|
288
|
+
sync?: UseSyncStatusResult;
|
|
289
|
+
accountSettingsUrl?: string;
|
|
290
|
+
children?: ReactNode;
|
|
291
|
+
}
|
|
292
|
+
declare function AccountSettingsModal({ auth: suppliedAuth, accounts: suppliedAccounts, accountSettingsUrl, projectProfile, sync, children, ...props }: AccountSettingsModalProps): react.JSX.Element;
|
|
293
|
+
interface SharesModalProps extends BasicModalProps {
|
|
294
|
+
auth?: UseAuthResult;
|
|
295
|
+
accounts?: UseAccountsResult;
|
|
296
|
+
sync?: UseSyncStatusResult;
|
|
297
|
+
shares?: UseOutgoingSharesResult;
|
|
298
|
+
/** Explicit least-privilege scope; the component never infers all tables. */
|
|
299
|
+
scope: CreateOutgoingShareInput['scope'];
|
|
300
|
+
repo?: CreateOutgoingShareInput['repo'];
|
|
301
|
+
}
|
|
302
|
+
declare function SharesModal({ auth: supplied, accounts: suppliedAccounts, sync, shares, scope, repo, ...props }: SharesModalProps): react.JSX.Element;
|
|
303
|
+
|
|
183
304
|
/** Synchronous browser Storage adapted to core's key-value contract. */
|
|
184
305
|
declare class BrowserKeyValueStorage implements KeyValueStorage {
|
|
185
306
|
private readonly storage;
|
|
@@ -275,4 +396,4 @@ declare class PersistenceStore implements ReplicaStoreFactory {
|
|
|
275
396
|
/** Browser multipart transport with upload progress, adapted from the Drive UI. */
|
|
276
397
|
declare const browserUploadTransport: UploadTransportAdapter;
|
|
277
398
|
|
|
278
|
-
export { type AccessTokenAdopter, BasicProvider, type BasicProviderProps, type BoundBasicProviderProps, type BrowserBasicConfig, BrowserKeyValueStorage, type BrowserLockManager, type BrowserMessageChannel, BrowserTokenStore, type CreateBasicConfig, type CreatedBasic, PersistenceStore, type PersistenceStoreOptions, type UseAccountsResult, type UseAuthResult, type UseBasicResult, type UseFilesResult, type UseMountsResult, type UseOutgoingSharesResult, type UseQueryResult, type UseReposResult, type UseStorageInfoResult, type UseSyncStatusResult, browserCurrentUrl, browserNavigate, browserReplaceUrl, browserStorage, browserUploadTransport, createBasic, createBasicClient, createBrowserAuthChannelFactory, createBrowserMessageChannel, useAccounts, useAuth, useBasic, useCollection, useDb, useFiles, useMounts, useOutgoingShares, useQuery, useRepos, useSchemaStatus, useStorageInfo, useSyncStatus };
|
|
399
|
+
export { type AccessTokenAdopter, AccountSettingsModal, type AccountSettingsModalProps, type AuthButtonProps, AuthStatus, type BasicAppearance, BasicButton, type BasicButtonProps, type BasicModalProps, BasicProvider, type BasicProviderProps, BasicUIProvider, type BoundBasicProviderProps, type BrowserBasicConfig, BrowserKeyValueStorage, type BrowserLockManager, type BrowserMessageChannel, BrowserTokenStore, type CreateBasicConfig, type CreatedBasic, PersistenceStore, type PersistenceStoreOptions, SharesModal, type SharesModalProps, SignInButton, SignOutButton, SyncStatus, type UseAccountsResult, type UseAuthResult, type UseBasicResult, type UseFilesResult, type UseMountsResult, type UseOutgoingSharesResult, type UseProjectProfileResult, type UseQueryResult, type UseReposResult, type UseStorageInfoResult, type UseSyncStatusResult, UserAvatar, type UserAvatarProps, UserButton, type UserButtonProps, UserMenu, type UserMenuItem, type UserMenuProps, browserCurrentUrl, browserNavigate, browserReplaceUrl, browserStorage, browserUploadTransport, createBasic, createBasicClient, createBrowserAuthChannelFactory, createBrowserMessageChannel, useAccounts, useAuth, useBasic, useCollection, useDb, useFiles, useMounts, useOutgoingShares, useProjectProfile, useQuery, useRepos, useSchemaStatus, useStorageInfo, useSyncStatus };
|