agentic-drive 0.10.0 → 0.10.2
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 +8 -0
- package/README.md +101 -2
- package/dist/{chunk-NHHBNW64.js → chunk-WOA2S56W.js} +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp.js +1 -1
- package/llms.txt +110 -7
- package/package.json +3 -3
- package/ui-dist/assets/index-BpKbn_as.css +1 -0
- package/ui-dist/assets/index-DkdU0nYK.js +49 -0
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/index-BiYPMlrf.js +0 -49
- package/ui-dist/assets/index-oybSrFGW.css +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.10.2
|
|
4
|
+
|
|
5
|
+
- Document all public exports and entry points. Check export names against README and llms.txt.
|
|
6
|
+
|
|
7
|
+
## 0.10.1
|
|
8
|
+
|
|
9
|
+
- Allow `agentic-design` versions 0.8 and 0.9 and `agentic-identity` versions 0.9 and 0.10.
|
|
10
|
+
|
|
3
11
|
## 0.10.0
|
|
4
12
|
|
|
5
13
|
### Added
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
Store, sort, and share files and folders.
|
|
9
9
|
|
|
10
|
-
> Status: 0.10.
|
|
10
|
+
> Status: 0.10.2, early. The library, CLI, MCP server, and HTTP API work, with sharing in the SDK, the HTTP API, the CLI, and the MCP server.
|
|
11
11
|
> A small web UI works. See [UI](#ui).
|
|
12
12
|
|
|
13
13
|
## Live demo
|
|
@@ -163,6 +163,105 @@ The root export, `agentic-drive`, also exports these names. The package typings
|
|
|
163
163
|
The local functions trust their caller. Local data is the trust boundary: anyone who can write the folder
|
|
164
164
|
can act as any principal in it.
|
|
165
165
|
|
|
166
|
+
## Public exports
|
|
167
|
+
|
|
168
|
+
Each import path below is part of the package. The examples use TypeScript.
|
|
169
|
+
The CLI and MCP are commands, not import paths. The package does not export
|
|
170
|
+
`agentic-drive/cli`, `agentic-drive/mcp`, or an adapters subpath.
|
|
171
|
+
|
|
172
|
+
### Root: `agentic-drive`
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
import { ROOT_ID, parseName, type SearchQuery } from "agentic-drive";
|
|
176
|
+
const name = parseName("report.txt");
|
|
177
|
+
const query: SearchQuery = { name: name.name };
|
|
178
|
+
console.log(ROOT_ID, query);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
The root values are `VERSION` (version), `ROOT_ID` (root id), `ACTOR_KINDS`
|
|
182
|
+
(principal kinds), `createDrive` (drive factory), `DriveError` and `ERROR_STATUS`
|
|
183
|
+
(errors and HTTP statuses), `parseName`, `parseSubject`, `subjectKindOf` (input
|
|
184
|
+
checks), `upload`, `sniffMime`, `DEFAULT_MAX_BYTES` (upload helpers), `buildExport`
|
|
185
|
+
(account ZIP), `readZip` and `writeZip` (stored ZIP entries), `importLegacyLocal`
|
|
186
|
+
(old local data), `AuthError`, `openLocal`, `addPrincipal`, `issueKey`,
|
|
187
|
+
`resolveToken`, `revokeKey`, `revokePrincipal`, `publicNode` (local access),
|
|
188
|
+
`backfillAuthorIds` and `backfillResources` (migrations), and `driveAccount`
|
|
189
|
+
(account plug-in). See Other exports and Features for behavior and limits.
|
|
190
|
+
|
|
191
|
+
Root types: `ActivityAction`, `ActivityEntry`, `Action`, `Actor`, `ActorKind`,
|
|
192
|
+
`Can`, `Ctx`, `Drive`, `DriveDeps`, `ErrorCode`, `Node`, `OnConflict`,
|
|
193
|
+
`UploadOptions`, `SearchQuery`, `BackfillOptions`, `BackfillResult`,
|
|
194
|
+
`DriveAccount`, and `DriveAccountDeps`. They describe activity, callers, drive
|
|
195
|
+
operations, uploads, migrations, and account operations.
|
|
196
|
+
|
|
197
|
+
### Client: `agentic-drive/client`
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
import { createClient, type ClientOptions } from "agentic-drive/client";
|
|
201
|
+
const options: ClientOptions = { baseUrl: "https://drive.example.com", token: "your-token" };
|
|
202
|
+
const client = createClient(options);
|
|
203
|
+
await client.list("/");
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
`createClient` makes the HTTP client; `DriveApiError` reports failures. Types:
|
|
207
|
+
`ActivityAction`, `ActivityEntry`, `ErrorCode`, `Node`, `Role`, `OnConflict`,
|
|
208
|
+
`SubjectKind`, `Subject`, `Item`, `PathItem`, `ApiErrorCode`, `ClientErrorCode`,
|
|
209
|
+
`ClientOptions`, `CallOptions`, `UploadBody`, `Downloaded`, and `DriveClient`.
|
|
210
|
+
These describe API data, options, errors, and results.
|
|
211
|
+
|
|
212
|
+
### Account: `agentic-drive/account`
|
|
213
|
+
|
|
214
|
+
```ts
|
|
215
|
+
import { driveAccount, type DriveAccountDeps } from "agentic-drive/account";
|
|
216
|
+
// Use the subject's own drive and context.
|
|
217
|
+
async function exportMine(deps: DriveAccountDeps) {
|
|
218
|
+
return driveAccount.exportAccount({ id: "u1", kind: "human" }, deps);
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
`driveAccount` exports and erases an account. `DriveAccount` describes the plug-in;
|
|
223
|
+
`DriveAccountDeps` describes its drive and caller context.
|
|
224
|
+
|
|
225
|
+
### Worker: `agentic-drive/worker`
|
|
226
|
+
|
|
227
|
+
```ts
|
|
228
|
+
import { createApp, type WorkerEnv } from "agentic-drive/worker";
|
|
229
|
+
const app = createApp<WorkerEnv>();
|
|
230
|
+
export default { fetch: app.fetch };
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The `default` export is the ready Worker. `createApp` makes an app with optional
|
|
234
|
+
injected ports. `authenticate` resolves a bearer token. `ERROR_STATUS` maps drive
|
|
235
|
+
errors to HTTP statuses. `backfillAuthorIds` and `backfillResources` migrate old
|
|
236
|
+
stores. Types: `ErrorCode`, `Node`, `BackfillOptions`, `BackfillResult`, `WorkerEnv`,
|
|
237
|
+
and `AppOptions` describe errors, items, migrations, bindings, and injected ports.
|
|
238
|
+
|
|
239
|
+
### UI: `agentic-drive/ui` and `agentic-drive/ui.css`
|
|
240
|
+
|
|
241
|
+
```ts
|
|
242
|
+
import "agentic-design/styles.css";
|
|
243
|
+
import "agentic-drive/ui.css";
|
|
244
|
+
import { mount, type DriveUiOptions } from "agentic-drive/ui";
|
|
245
|
+
const options: DriveUiOptions = { baseUrl: "https://drive.example.com", getToken: () => "your-token" };
|
|
246
|
+
const view = mount(document.getElementById("drive")!, options);
|
|
247
|
+
view.unmount();
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
`mount` returns a `MountedDrive` handle. `DriveBrowser` is the React component;
|
|
251
|
+
`DriveUiOptions` is its configuration. The CSS path supplies its styles.
|
|
252
|
+
|
|
253
|
+
### CLI, MCP, and adapters
|
|
254
|
+
|
|
255
|
+
```sh
|
|
256
|
+
npx agentic-drive ls /
|
|
257
|
+
npx agentic-drive mcp
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
The CLI uses `AGENTIC_DRIVE_TOKEN`. The MCP command serves tools over stdio;
|
|
261
|
+
call `drive_ls` with a path. Storage adapters are provided by `agentic-identity`,
|
|
262
|
+
not by a drive subpath. The Quick start shows `createFileStore` and
|
|
263
|
+
`createFileBlobs`; the Worker uses D1 and R2 adapters by default.
|
|
264
|
+
|
|
166
265
|
## Account export and erase
|
|
167
266
|
|
|
168
267
|
A host that runs account export and erase across many packages calls `driveAccount` (from `agentic-drive/account`). It has `exportAccount(subject, { drive, ctx })` and `eraseAccount(subject, { drive, ctx })`, so the host does not read the storage layout. `subject` is an id and a kind (`human`, or `agent` with its own identity), and `ctx` is the drive context of that subject. A context for someone else throws `FORBIDDEN`. A bad subject, or a missing `drive` or `ctx`, throws a `TypeError`.
|
|
@@ -209,7 +308,7 @@ drive.update({ baseUrl, getToken }); // use another server or callback
|
|
|
209
308
|
drive.unmount(); // remove the UI
|
|
210
309
|
```
|
|
211
310
|
|
|
212
|
-
`getToken` returns 1 to 512 letters, digits, `-` or `_`, or `undefined` to send no `authorization` header. A bad `baseUrl` or a `getToken` that is not a function makes `mount` throw a `TypeError`. The server still checks every request against the token. The embed shows files and trash with upload, rename, move, share, and the "Created by agent" label. It has no sign-in form, because your app owns sign-in. It does not change the page address, and it has no theme switch. `agentic-design/styles.css` sets base styles for the whole page, and it follows the dark mode of the system unless your page sets `data-theme`. Add `agentic-design
|
|
311
|
+
`getToken` returns 1 to 512 letters, digits, `-` or `_`, or `undefined` to send no `authorization` header. A bad `baseUrl` or a `getToken` that is not a function makes `mount` throw a `TypeError`. The server still checks every request against the token. The embed shows files and trash with upload, rename, move, share, and the "Created by agent" label. It has no sign-in form, because your app owns sign-in. It does not change the page address, and it has no theme switch. `agentic-design/styles.css` sets base styles for the whole page, and it follows the dark mode of the system unless your page sets `data-theme`. Add `agentic-design@">=0.8.0 <0.10.0"` to your own dependencies, because your page imports its files. The Worker sends no CORS headers, so the server must be on the origin of your page. Set `baseUrl` to the same address as `DRIVE_PUBLIC_URL`, or the UI refuses its download links. `unmount` and `update` abort the requests that run and stop an upload that has more files to send. The UI keeps the list or grid choice in `localStorage` under `agentic-drive-view`, and it has its own heading for each view. Dialogs, menus, and messages render in `document.body`, outside your element. A click with Ctrl, Cmd, Shift, or the middle button on a folder link does not open the folder. The class names start with `drive-`. The design-system classes start with `agd-`. `DriveBrowser` is the same UI as a React component. It closes its requests when it unmounts. Wrap it in `TooltipProvider` and `ToastProvider` from `agentic-design/react`. `react` and `react-dom` (version 19 or later) are optional peer dependencies. Install them in your project when you use `agentic-drive/ui`. The web UI that the Worker serves uses the same views.
|
|
213
312
|
|
|
214
313
|
### Serve the UI from the package
|
|
215
314
|
|
package/dist/cli.js
CHANGED
package/dist/index.js
CHANGED
package/dist/mcp.js
CHANGED
package/llms.txt
CHANGED
|
@@ -4,13 +4,7 @@ Store, sort, and share files and folders.
|
|
|
4
4
|
|
|
5
5
|
Keywords: drive,files,folders,storage,upload,sharing,agents,mcp,cli,r2.
|
|
6
6
|
|
|
7
|
-
- SDK: import { createDrive } from "agentic-drive".
|
|
8
|
-
- Other SDK exports: VERSION, ROOT_ID, ACTOR_KINDS, DEFAULT_MAX_BYTES, sniffMime, parseName, parseSubject, subjectKindOf, DriveError,
|
|
9
|
-
readZip, writeZip, AuthError, openLocal, addPrincipal, issueKey, resolveToken, revokeKey, revokePrincipal, publicNode.
|
|
10
|
-
See README, "Other exports".
|
|
11
|
-
- Remote SDK: import { createClient } from "agentic-drive/client". createClient({ baseUrl, token, fetch?, retries? }) has one method for each bearer route and each shared route (list, stat, mkdir, upload, download, move, trash, restore, purge, search, share, createLink, and more). A failed call throws DriveApiError with code and status. It runs in browsers, Workers, and Node 22.
|
|
12
|
-
- Worker: import { createApp } from "agentic-drive/worker". createApp({ store?, blobs?, auth? }) takes an injected Store, Blobs, and auth callback `(request, store, env) => Ctx | null`. Each may be a value or a function of the env. With no options, it uses D1, R2, and bearer tokens from the store. See README, "Inject a store, blobs, and sign-in".
|
|
13
|
-
- UI: import { mount } from "agentic-drive/ui"; import "agentic-drive/ui.css" (with agentic-design/styles.css). mount(element, { baseUrl, getToken }) renders the drive (files, trash, upload, share) and returns { update(options), unmount() }. getToken is called before each request and returns a token or undefined. It does not touch the page address or theme. DriveBrowser is the same as a React component. React 19 is an optional peer dependency.
|
|
7
|
+
- SDK: import { createDrive } from "agentic-drive". See the root example below.
|
|
14
8
|
- CLI: agentic-drive ls /. Needs a principal: set AGENTIC_DRIVE_TOKEN (or --token) to an API key. Make one with `principal add <id> [--of <person>]` and `key issue <id>`. No key, or a revoked key, exits 3.
|
|
15
9
|
- MCP: run agentic-drive mcp, then call drive_ls.
|
|
16
10
|
|
|
@@ -18,3 +12,112 @@ Keywords: drive,files,folders,storage,upload,sharing,agents,mcp,cli,r2.
|
|
|
18
12
|
|
|
19
13
|
- README: https://github.com/pooriaarab/agentic-drive
|
|
20
14
|
- License: MIT
|
|
15
|
+
|
|
16
|
+
## Public exports and usage
|
|
17
|
+
|
|
18
|
+
Each import path below is part of the package. The examples use TypeScript.
|
|
19
|
+
The CLI and MCP are commands, not import paths. The package does not export
|
|
20
|
+
`agentic-drive/cli`, `agentic-drive/mcp`, or an adapters subpath.
|
|
21
|
+
|
|
22
|
+
### Root: `agentic-drive`
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { ROOT_ID, parseName, type SearchQuery } from "agentic-drive";
|
|
26
|
+
const name = parseName("report.txt");
|
|
27
|
+
const query: SearchQuery = { name: name.name };
|
|
28
|
+
console.log(ROOT_ID, query);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The root values are `VERSION` (version), `ROOT_ID` (root id), `ACTOR_KINDS`
|
|
32
|
+
(principal kinds), `createDrive` (drive factory), `DriveError` and `ERROR_STATUS`
|
|
33
|
+
(errors and HTTP statuses), `parseName`, `parseSubject`, `subjectKindOf` (input
|
|
34
|
+
checks), `upload`, `sniffMime`, `DEFAULT_MAX_BYTES` (upload helpers), `buildExport`
|
|
35
|
+
(account ZIP), `readZip` and `writeZip` (stored ZIP entries), `importLegacyLocal`
|
|
36
|
+
(old local data), `AuthError`, `openLocal`, `addPrincipal`, `issueKey`,
|
|
37
|
+
`resolveToken`, `revokeKey`, `revokePrincipal`, `publicNode` (local access),
|
|
38
|
+
`backfillAuthorIds` and `backfillResources` (migrations), and `driveAccount`
|
|
39
|
+
(account plug-in). See README for behavior and limits.
|
|
40
|
+
|
|
41
|
+
Root types: `ActivityAction`, `ActivityEntry`, `Action`, `Actor`, `ActorKind`,
|
|
42
|
+
`Can`, `Ctx`, `Drive`, `DriveDeps`, `ErrorCode`, `Node`, `OnConflict`,
|
|
43
|
+
`UploadOptions`, `SearchQuery`, `BackfillOptions`, `BackfillResult`,
|
|
44
|
+
`DriveAccount`, and `DriveAccountDeps`. They describe activity, callers, drive
|
|
45
|
+
operations, uploads, migrations, and account operations.
|
|
46
|
+
|
|
47
|
+
### Client: `agentic-drive/client`
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { createClient, type ClientOptions } from "agentic-drive/client";
|
|
51
|
+
const options: ClientOptions = { baseUrl: "https://drive.example.com", token: "your-token" };
|
|
52
|
+
const client = createClient(options);
|
|
53
|
+
await client.list("/");
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
`createClient` makes the HTTP client; `DriveApiError` reports failures. Types:
|
|
57
|
+
`ActivityAction`, `ActivityEntry`, `ErrorCode`, `Node`, `Role`, `OnConflict`,
|
|
58
|
+
`SubjectKind`, `Subject`, `Item`, `PathItem`, `ApiErrorCode`, `ClientErrorCode`,
|
|
59
|
+
`ClientOptions`, `CallOptions`, `UploadBody`, `Downloaded`, and `DriveClient`.
|
|
60
|
+
These describe API data, options, errors, and results. The client runs in browsers,
|
|
61
|
+
Workers, and Node 22. It has a method for each bearer and shared route.
|
|
62
|
+
`DriveApiError` carries `code` and `status`. Client options also accept
|
|
63
|
+
a `fetch` function and a `retries` count for reads.
|
|
64
|
+
|
|
65
|
+
### Account: `agentic-drive/account`
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { driveAccount, type DriveAccountDeps } from "agentic-drive/account";
|
|
69
|
+
// Use the subject's own drive and context.
|
|
70
|
+
async function exportMine(deps: DriveAccountDeps) {
|
|
71
|
+
return driveAccount.exportAccount({ id: "u1", kind: "human" }, deps);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`driveAccount` exports and erases an account. `DriveAccount` describes the plug-in;
|
|
76
|
+
`DriveAccountDeps` describes its drive and caller context.
|
|
77
|
+
|
|
78
|
+
### Worker: `agentic-drive/worker`
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { createApp, type WorkerEnv } from "agentic-drive/worker";
|
|
82
|
+
const app = createApp<WorkerEnv>();
|
|
83
|
+
export default { fetch: app.fetch };
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The `default` export is the ready Worker. `createApp` makes an app with optional
|
|
87
|
+
injected ports. `authenticate` resolves a bearer token. `ERROR_STATUS` maps drive
|
|
88
|
+
errors to HTTP statuses. `backfillAuthorIds` and `backfillResources` migrate old
|
|
89
|
+
stores. Types: `ErrorCode`, `Node`, `BackfillOptions`, `BackfillResult`, `WorkerEnv`,
|
|
90
|
+
and `AppOptions` describe errors, items, migrations, bindings, and injected ports.
|
|
91
|
+
The `store`, `blobs`, and `auth` options each accept a value or a function of
|
|
92
|
+
the env. The auth callback has the signature `(request, store, env) => Ctx | null`
|
|
93
|
+
or returns a Promise of that result. With no options, the Worker uses bearer
|
|
94
|
+
tokens from the store.
|
|
95
|
+
|
|
96
|
+
### UI: `agentic-drive/ui` and `agentic-drive/ui.css`
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
import "agentic-design/styles.css";
|
|
100
|
+
import "agentic-drive/ui.css";
|
|
101
|
+
import { mount, type DriveUiOptions } from "agentic-drive/ui";
|
|
102
|
+
const options: DriveUiOptions = { baseUrl: "https://drive.example.com", getToken: () => "your-token" };
|
|
103
|
+
const view = mount(document.getElementById("drive")!, options);
|
|
104
|
+
view.unmount();
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`mount` returns a `MountedDrive` handle. `DriveBrowser` is the React component;
|
|
108
|
+
`DriveUiOptions` is its configuration. The CSS path supplies its styles. The handle
|
|
109
|
+
has `update` and `unmount` methods. The `getToken` callback runs before each request
|
|
110
|
+
and may return undefined. The UI does not change the page address or theme.
|
|
111
|
+
React 19 and React DOM 19 are optional peer dependencies.
|
|
112
|
+
|
|
113
|
+
### CLI, MCP, and adapters
|
|
114
|
+
|
|
115
|
+
```sh
|
|
116
|
+
npx agentic-drive ls /
|
|
117
|
+
npx agentic-drive mcp
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The CLI uses `AGENTIC_DRIVE_TOKEN`. The MCP command serves tools over stdio;
|
|
121
|
+
call `drive_ls` with a path. Storage adapters are provided by `agentic-identity`,
|
|
122
|
+
not by a drive subpath. For example: `import { createFileStore, createFileBlobs } from "agentic-identity/file"`;
|
|
123
|
+
pass `createFileStore({ path: "./data/db" })` and `createFileBlobs({ dir: "./data/blobs" })` to `createDrive`. The Worker uses D1 and R2 adapters by default.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-drive",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"description": "Store, sort, and share files and folders.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"drive",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
81
|
-
"agentic-design": "
|
|
82
|
-
"agentic-identity": "
|
|
81
|
+
"agentic-design": ">=0.8.0 <0.10.0",
|
|
82
|
+
"agentic-identity": ">=0.9.0 <0.11.0",
|
|
83
83
|
"hono": "^4.13.14",
|
|
84
84
|
"zod": "^4.6.6"
|
|
85
85
|
},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root,[data-theme=light]{color-scheme:light;--agd-color-bg: #FAFAFA;--agd-color-surface: #FFFFFF;--agd-color-surface-raised: #FFFFFF;--agd-color-surface-sunken: #F4F4F5;--agd-color-surface-hover: #ECECEE;--agd-color-text: #1D1D20;--agd-color-text-muted: #52525B;--agd-color-text-on-accent: #FFFFFF;--agd-color-border: #E4E4E7;--agd-color-border-strong: #82828B;--agd-color-accent: #4F46E5;--agd-color-accent-hover: #4338CA;--agd-color-accent-subtle: #EEF0FF;--agd-color-accent-text: #4338CA;--agd-color-agent: #8E2C86;--agd-color-agent-subtle: #F7E8F5;--agd-color-agent-text: #7A2273;--agd-color-danger: #B42318;--agd-color-danger-subtle: #FDECEA;--agd-color-danger-text: #A11D14;--agd-color-warning: #92520A;--agd-color-warning-subtle: #FDF1DC;--agd-color-warning-text: #7A4208;--agd-color-success: #1B6B3A;--agd-color-success-subtle: #E6F5EC;--agd-color-success-text: #175C32;--agd-color-focus: #4F46E5;--agd-color-scrim: rgb(24 24 27 / .32);--agd-shadow-raised: 0 1px 2px rgb(24 24 27 / .04), 0 2px 8px rgb(24 24 27 / .05);--agd-shadow-floating: 0 2px 4px rgb(24 24 27 / .04), 0 8px 24px rgb(24 24 27 / .1)}:root{--agd-space-1: .25rem;--agd-space-2: .5rem;--agd-space-3: .75rem;--agd-space-4: 1rem;--agd-space-6: 1.5rem;--agd-space-8: 2rem;--agd-space-12: 3rem;--agd-space-16: 4rem;--agd-space-24: 6rem;--agd-radius-sm: .25rem;--agd-radius-md: .5rem;--agd-radius-lg: 1rem;--agd-radius-full: 9999px;--agd-font-family-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;--agd-font-family-mono: "JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--agd-font-size-xs: .75rem;--agd-font-size-sm: .875rem;--agd-font-size-md: 1rem;--agd-font-size-lg: 1.125rem;--agd-font-size-xl: 1.375rem;--agd-font-size-2xl: 1.75rem;--agd-line-height-tight: 1.25;--agd-line-height-snug: 1.4;--agd-line-height-normal: 1.55;--agd-font-weight-regular: 400;--agd-font-weight-medium: 500;--agd-font-weight-semibold: 600;--agd-duration-fast: .1s;--agd-duration-base: .16s;--agd-duration-slow: .24s;--agd-easing-out: cubic-bezier(.16, 1, .3, 1);--agd-size-control: 2.25rem;--agd-size-control-touch: 2.75rem;--agd-size-sidebar: 16rem;--agd-size-sidebar-rail: 3.5rem;--agd-size-panel: 20rem;--agd-size-topbar: 3rem;--agd-size-content: 46rem}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--agd-color-bg: #151517;--agd-color-surface: #1B1B1E;--agd-color-surface-raised: #232326;--agd-color-surface-sunken: #101012;--agd-color-surface-hover: #2C2C31;--agd-color-text: #ECECEE;--agd-color-text-muted: #A1A1AA;--agd-color-text-on-accent: #14142E;--agd-color-border: #2C2C31;--agd-color-border-strong: #7E7E88;--agd-color-accent: #90A4FF;--agd-color-accent-hover: #A9B8FF;--agd-color-accent-subtle: #26264F;--agd-color-accent-text: #C3CDFF;--agd-color-agent: #E49BDC;--agd-color-agent-subtle: #3A1F37;--agd-color-agent-text: #F0B8E9;--agd-color-danger: #F2877D;--agd-color-danger-subtle: #3B1A17;--agd-color-danger-text: #F8A39B;--agd-color-warning: #E8B04A;--agd-color-warning-subtle: #3A2A0F;--agd-color-warning-text: #F0C677;--agd-color-success: #6FCF97;--agd-color-success-subtle: #14301F;--agd-color-success-text: #8BDBAC;--agd-color-focus: #A9B8FF;--agd-color-scrim: rgb(0 0 0 / .6);--agd-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--agd-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}}[data-theme=dark]{color-scheme:dark;--agd-color-bg: #151517;--agd-color-surface: #1B1B1E;--agd-color-surface-raised: #232326;--agd-color-surface-sunken: #101012;--agd-color-surface-hover: #2C2C31;--agd-color-text: #ECECEE;--agd-color-text-muted: #A1A1AA;--agd-color-text-on-accent: #14142E;--agd-color-border: #2C2C31;--agd-color-border-strong: #7E7E88;--agd-color-accent: #90A4FF;--agd-color-accent-hover: #A9B8FF;--agd-color-accent-subtle: #26264F;--agd-color-accent-text: #C3CDFF;--agd-color-agent: #E49BDC;--agd-color-agent-subtle: #3A1F37;--agd-color-agent-text: #F0B8E9;--agd-color-danger: #F2877D;--agd-color-danger-subtle: #3B1A17;--agd-color-danger-text: #F8A39B;--agd-color-warning: #E8B04A;--agd-color-warning-subtle: #3A2A0F;--agd-color-warning-text: #F0C677;--agd-color-success: #6FCF97;--agd-color-success-subtle: #14301F;--agd-color-success-text: #8BDBAC;--agd-color-focus: #A9B8FF;--agd-color-scrim: rgb(0 0 0 / .6);--agd-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--agd-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}@media(prefers-reduced-motion:reduce){:root{--agd-duration-fast: .01ms;--agd-duration-base: .01ms;--agd-duration-slow: .01ms}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;background:var(--agd-color-bg);color:var(--agd-color-text);font-family:var(--agd-font-family-sans);font-size:var(--agd-font-size-sm);line-height:var(--agd-line-height-normal);font-feature-settings:"cv11","ss03";-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;line-height:var(--agd-line-height-tight);font-weight:var(--agd-font-weight-semibold);text-wrap:balance}h1{font-size:var(--agd-font-size-2xl);letter-spacing:-.015em}h2{font-size:var(--agd-font-size-xl);letter-spacing:-.01em}h3{font-size:var(--agd-font-size-lg)}h4{font-size:var(--agd-font-size-md)}p{margin:0;text-wrap:pretty}a{color:var(--agd-color-accent-text);text-underline-offset:.2em}code,kbd,pre{font-family:var(--agd-font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--agd-color-focus);outline-offset:2px}::selection{background:var(--agd-color-accent-subtle);color:var(--agd-color-accent-text)}.agd-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.agd-skip-link{position:absolute;inset-block-start:var(--agd-space-2);inset-inline-start:var(--agd-space-2);z-index:100;padding:var(--agd-space-2) var(--agd-space-4);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);color:var(--agd-color-text);box-shadow:var(--agd-shadow-floating);transform:translateY(-200%)}.agd-skip-link:focus{transform:none}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}:root{--agd-control-h: var(--agd-size-control)}@media(pointer:coarse){:root{--agd-control-h: var(--agd-size-control-touch)}}.agd-button{--button-bg: var(--agd-color-surface);--button-bg-hover: var(--agd-color-surface-hover);--button-bg-active: var(--agd-color-surface-sunken);--button-fg: var(--agd-color-text);--button-border: var(--agd-color-border);display:inline-flex;align-items:center;justify-content:center;gap:var(--agd-space-2);min-height:var(--agd-control-h);padding:0 var(--agd-space-4);border:1px solid var(--button-border);border-radius:var(--agd-radius-md);background:var(--button-bg);color:var(--button-fg);font:inherit;font-weight:var(--agd-font-weight-medium);line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--agd-duration-fast) var(--agd-easing-out)}.agd-button:hover{background:var(--button-bg-hover)}.agd-button:active{background:var(--button-bg-active)}.agd-button--sm{min-height:1.75rem;padding:0 var(--agd-space-3);font-size:var(--agd-font-size-xs)}@media(pointer:coarse){.agd-button--sm{min-height:var(--agd-control-h)}}.agd-button--primary{--button-bg: var(--agd-color-accent);--button-bg-hover: var(--agd-color-accent-hover);--button-bg-active: var(--agd-color-accent-hover);--button-fg: var(--agd-color-text-on-accent);--button-border: transparent}.agd-button--ghost{--button-bg: transparent;--button-border: transparent}.agd-button--danger{--button-bg-hover: var(--agd-color-danger-subtle);--button-bg-active: var(--agd-color-danger-subtle);--button-fg: var(--agd-color-danger-text);--button-border: var(--agd-color-border)}.agd-button:disabled{--button-bg: var(--agd-color-surface-sunken);--button-bg-hover: var(--agd-color-surface-sunken);--button-fg: var(--agd-color-text-muted);--button-border: var(--agd-color-border);border-style:dashed;cursor:not-allowed}.agd-button[aria-busy=true]{cursor:progress}.agd-icon-button{width:var(--agd-control-h);padding:0}.agd-icon-button.agd-button--sm{width:1.75rem}@media(pointer:coarse){.agd-icon-button.agd-button--sm{width:var(--agd-control-h)}}.agd-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:agd-spin .7s linear infinite}@keyframes agd-spin{to{transform:rotate(360deg)}}.agd-field{display:grid;gap:var(--agd-space-1)}.agd-field__label{font-weight:var(--agd-font-weight-medium)}.agd-field__hint{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs)}.agd-field__error{display:flex;align-items:flex-start;gap:var(--agd-space-1);color:var(--agd-color-danger-text);font-size:var(--agd-font-size-xs)}.agd-field__error svg{flex:none;margin-top:-.1em}.agd-input{width:100%;min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border:1px solid var(--agd-color-border-strong);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);color:var(--agd-color-text);font:inherit}.agd-input::placeholder{color:var(--agd-color-text-muted);opacity:1}.agd-input:hover:not(:disabled){background:var(--agd-color-surface-sunken)}.agd-input[aria-invalid=true]{border-color:var(--agd-color-danger);box-shadow:inset 0 0 0 1px var(--agd-color-danger)}.agd-input:disabled{background:var(--agd-color-surface-sunken);border-color:var(--agd-color-border);color:var(--agd-color-text-muted);cursor:not-allowed}.agd-textarea{min-height:5rem;padding:var(--agd-space-2) var(--agd-space-3);resize:vertical}.agd-select{position:relative;display:block}.agd-select select{appearance:none;padding-inline-end:var(--agd-space-8);cursor:pointer}.agd-select:after{content:"";position:absolute;inset-inline-end:var(--agd-space-3);inset-block-start:50%;width:.45rem;height:.45rem;border:solid var(--agd-color-text-muted);border-width:0 2px 2px 0;transform:translateY(-75%) rotate(45deg);pointer-events:none}.agd-toggle{display:grid;gap:var(--agd-space-1)}.agd-toggle__row{display:flex;align-items:center;gap:var(--agd-space-3);min-height:var(--agd-control-h);cursor:pointer}.agd-checkbox,.agd-switch{appearance:none;flex:none;margin:0;border:1px solid var(--agd-color-border-strong);background:var(--agd-color-surface);cursor:pointer;transition:background-color var(--agd-duration-fast) var(--agd-easing-out)}.agd-checkbox{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:var(--agd-radius-sm)}.agd-checkbox:before{content:"";width:.75rem;height:.75rem;background:var(--agd-color-text-on-accent);clip-path:polygon(14% 52%,0 66%,38% 100%,100% 20%,86% 8%,38% 72%);transform:scale(0);transition:transform var(--agd-duration-fast) var(--agd-easing-out)}.agd-checkbox:checked{background:var(--agd-color-accent);border-color:var(--agd-color-accent)}.agd-checkbox:checked:before{transform:scale(1)}.agd-switch{position:relative;width:2.25rem;height:1.375rem;border-radius:var(--agd-radius-full);background:var(--agd-color-surface-sunken)}.agd-switch:before{content:"";position:absolute;inset-block-start:50%;inset-inline-start:.2rem;width:.875rem;height:.875rem;border-radius:var(--agd-radius-full);background:var(--agd-color-text-muted);transform:translateY(-50%);transition:inset-inline-start var(--agd-duration-base) var(--agd-easing-out)}.agd-switch:checked{background:var(--agd-color-accent);border-color:var(--agd-color-accent)}.agd-switch:checked:before{background:var(--agd-color-text-on-accent);inset-inline-start:calc(100% - 1.075rem)}.agd-checkbox:disabled,.agd-switch:disabled{background:var(--agd-color-surface-sunken);border-color:var(--agd-color-border);cursor:not-allowed}.agd-checkbox:disabled:before{background:var(--agd-color-text-muted)}.agd-switch:disabled:before{background:var(--agd-color-border)}@keyframes agd-fade-in{0%{opacity:0}}@keyframes agd-pop-in{0%{opacity:0;scale:.97}}.agd-overlay{position:fixed;z-index:50;inset:0;background:var(--agd-color-scrim);animation:agd-fade-in var(--agd-duration-base) var(--agd-easing-out)}.agd-dialog{position:fixed;z-index:50;inset:0;margin:auto;width:min(32rem,calc(100vw - 2rem));height:fit-content;max-height:calc(100vh - 2rem);overflow:auto;padding:var(--agd-space-8);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-lg);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating);animation:agd-pop-in var(--agd-duration-base) var(--agd-easing-out)}.agd-dialog__title{padding-inline-end:var(--agd-space-8);font-size:var(--agd-font-size-lg)}.agd-dialog__description{margin-top:var(--agd-space-2);color:var(--agd-color-text-muted)}.agd-dialog__body{margin-top:var(--agd-space-4)}.agd-dialog__footer{display:flex;justify-content:flex-end;gap:var(--agd-space-2);margin-top:var(--agd-space-8)}.agd-dialog__close{position:absolute;inset-block-start:var(--agd-space-3);inset-inline-end:var(--agd-space-3)}.agd-tooltip{z-index:60;max-width:16rem;padding:var(--agd-space-1) var(--agd-space-2);border-radius:var(--agd-radius-sm);background:var(--agd-color-text);color:var(--agd-color-bg);font-size:var(--agd-font-size-xs);animation:agd-fade-in var(--agd-duration-fast) var(--agd-easing-out)}.agd-menu{z-index:60;min-width:11rem;padding:var(--agd-space-2);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-lg);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating);animation:agd-pop-in var(--agd-duration-fast) var(--agd-easing-out)}.agd-menu__item{display:flex;align-items:center;gap:var(--agd-space-2);min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border-radius:var(--agd-radius-md);color:var(--agd-color-text);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}.agd-menu__item[data-highlighted]{background:var(--agd-color-surface-hover)}.agd-menu__item[data-highlighted]:focus-visible,.agd-menu__item:focus-visible{outline:2px solid var(--agd-color-focus);outline-offset:-2px}.agd-menu__item[data-disabled]{color:var(--agd-color-text-muted);cursor:not-allowed}.agd-menu__item--danger{color:var(--agd-color-danger-text)}.agd-menu__shortcut{margin-inline-start:auto;color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs)}.agd-menu__separator{height:1px;margin:var(--agd-space-1) 0;background:var(--agd-color-border)}.agd-toast-viewport{position:fixed;inset-block-end:var(--agd-space-4);inset-inline-end:var(--agd-space-4);z-index:70;display:grid;gap:var(--agd-space-2);width:min(24rem,calc(100vw - 2rem));margin:0;padding:0;list-style:none}.agd-toast{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--agd-space-3);padding:var(--agd-space-3) var(--agd-space-3) var(--agd-space-3) var(--agd-space-4);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating)}.agd-toast[data-state=open]{animation:agd-pop-in var(--agd-duration-base) var(--agd-easing-out)}.agd-toast__icon{margin-top:var(--agd-space-1)}.agd-toast--info .agd-toast__icon{color:var(--agd-color-accent)}.agd-toast--success .agd-toast__icon{color:var(--agd-color-success)}.agd-toast--warning .agd-toast__icon{color:var(--agd-color-warning)}.agd-toast--danger .agd-toast__icon{color:var(--agd-color-danger)}.agd-toast__title{font-weight:var(--agd-font-weight-medium)}.agd-toast__description{margin-top:var(--agd-space-1);color:var(--agd-color-text-muted)}.agd-tabs__list{display:flex;gap:var(--agd-space-1);border-bottom:1px solid var(--agd-color-border)}.agd-tabs__trigger{position:relative;min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border:0;background:transparent;color:var(--agd-color-text-muted);font:inherit;cursor:pointer}.agd-tabs__trigger:hover{color:var(--agd-color-text)}.agd-tabs__trigger[data-state=active]{color:var(--agd-color-text);font-weight:var(--agd-font-weight-semibold)}.agd-tabs__trigger[data-state=active]:after{content:"";position:absolute;inset:auto var(--agd-space-3) -1px;height:2px;background:var(--agd-color-accent)}.agd-tabs__panel{padding-top:var(--agd-space-4)}.agd-shell{display:grid;grid-template-columns:var(--agd-size-sidebar) minmax(0,1fr);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar" "sidebar content";min-height:100vh}.agd-shell__sidebar{grid-area:sidebar;display:flex;flex-direction:column;gap:var(--agd-space-4);padding:var(--agd-space-4) var(--agd-space-3);border-inline-end:1px solid var(--agd-color-border);background:var(--agd-color-surface-sunken)}.agd-shell__brand{margin:0;font-weight:var(--agd-font-weight-semibold)}.agd-shell__topbar{grid-area:topbar;display:flex;align-items:center;gap:var(--agd-space-3);min-height:var(--agd-size-topbar);padding:0 var(--agd-space-6);border-bottom:1px solid var(--agd-color-border);background:var(--agd-color-bg)}.agd-shell__title{min-width:0;flex:0 1 auto}.agd-shell__actions,.agd-shell__secondary{display:flex;align-items:center;gap:var(--agd-space-4)}.agd-shell__actions{margin-inline-start:auto}.agd-shell__more{display:none}.agd-shell__content{grid-area:content;min-width:0;padding:var(--agd-space-8) var(--agd-space-6) var(--agd-space-24);outline:none}.agd-shell__menu{display:none}.agd-shell[data-panel]{grid-template-rows:auto 1fr auto;grid-template-areas:"sidebar topbar" "sidebar content" "sidebar panel"}@media(min-width:64rem){.agd-shell[data-panel]{grid-template-columns:var(--agd-size-sidebar) minmax(0,1fr) var(--agd-size-panel);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar topbar" "sidebar content panel"}}.agd-shell__panel{grid-area:panel;min-width:0;padding:var(--agd-space-6) var(--agd-space-4);border-block-start:1px solid var(--agd-color-border);background:var(--agd-color-surface-sunken)}@media(min-width:64rem){.agd-shell__panel{border-block-start:0;border-inline-start:1px solid var(--agd-color-border)}}@media(max-width:47.99rem){.agd-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr;grid-template-areas:"topbar" "sidebar" "content"}.agd-shell__menu{display:inline-flex}.agd-shell[data-panel]{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr auto;grid-template-areas:"topbar" "sidebar" "content" "panel"}.agd-shell__sidebar[data-open=false]{display:none}.agd-shell__sidebar{border-inline-end:0;border-bottom:1px solid var(--agd-color-border)}.agd-shell__topbar,.agd-shell__content{padding-inline:var(--agd-space-4)}.agd-shell__topbar{flex-wrap:wrap;gap:var(--agd-space-2) var(--agd-space-3);padding-block:var(--agd-space-2)}.agd-shell__brand{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:var(--agd-space-1);margin:calc(var(--agd-space-1) * -1)}.agd-shell__title{flex:1 1 8rem;overflow-wrap:anywhere}.agd-shell__actions{flex-wrap:wrap;gap:var(--agd-space-2) var(--agd-space-3);min-width:0}.agd-shell__more{display:inline-flex}.agd-shell__secondary{flex:1 0 100%;justify-content:flex-end}.agd-shell__secondary[data-open=false]:not(:focus-within){display:none}}.agd-sidebar-nav{display:grid;gap:var(--agd-space-1);margin:0;padding:0;list-style:none}.agd-sidebar-nav__link{display:flex;align-items:center;gap:var(--agd-space-2);min-height:var(--agd-control-h);padding:0 var(--agd-space-3);border-radius:var(--agd-radius-md);color:var(--agd-color-text);text-decoration:none}.agd-sidebar-nav__link:hover{background:var(--agd-color-surface-hover)}.agd-sidebar-nav__link[aria-current=page]{background:var(--agd-color-accent-subtle);color:var(--agd-color-accent-text);font-weight:var(--agd-font-weight-semibold)}.agd-toolbar{display:inline-flex;align-items:center;gap:var(--agd-space-1);padding:var(--agd-space-1);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface)}.agd-toolbar__separator{align-self:stretch;width:1px;margin:var(--agd-space-1);background:var(--agd-color-border)}.agd-toolbar__group{display:inline-flex;align-items:center;gap:var(--agd-space-1)}.agd-button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--button-border);font-weight:var(--agd-font-weight-semibold);--button-bg: var(--agd-color-accent-subtle);--button-bg-hover: var(--agd-color-accent-subtle);--button-fg: var(--agd-color-accent-text);--button-border: var(--agd-color-accent)}.agd-empty{display:grid;justify-items:center;gap:var(--agd-space-3);padding:var(--agd-space-12) var(--agd-space-6);text-align:center}.agd-empty__title{font-size:var(--agd-font-size-lg)}.agd-empty__description{max-width:28rem;color:var(--agd-color-text-muted)}.agd-files{margin:0;padding:0;list-style:none;border-top:1px solid var(--agd-color-border)}.agd-file-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:var(--agd-space-4);min-height:3rem;padding:var(--agd-space-1) var(--agd-space-2);border-bottom:1px solid var(--agd-color-border)}.agd-file-row:hover{background:var(--agd-color-surface-sunken)}.agd-file-row__icon{display:inline-flex;color:var(--agd-color-text-muted)}.agd-file-row__name{min-height:1.5rem;overflow:hidden;color:var(--agd-color-text);font-weight:var(--agd-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.agd-file-row__meta,.agd-file-row__time{display:inline-flex;align-items:center;gap:var(--agd-space-2);color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs)}.agd-file-row__actions{display:inline-flex}@media(max-width:47.99rem){.agd-file-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"icon name actions" ". meta meta" ". time time"}.agd-file-row__icon{grid-area:icon}.agd-file-row__name{grid-area:name}.agd-file-row__meta{grid-area:meta}.agd-file-row__time{grid-area:time}.agd-file-row__actions{grid-area:actions}}.agd-filetable{width:100%;table-layout:fixed;border-collapse:collapse;border-top:1px solid var(--agd-color-border)}.agd-filetable th,.agd-filetable td{padding:var(--agd-space-1) var(--agd-space-3);border-bottom:1px solid var(--agd-color-border);text-align:start;vertical-align:middle}.agd-filetable th{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold)}.agd-filetable th:nth-child(1){width:36%}.agd-filetable th:nth-child(2){width:36%}.agd-filetable th:nth-child(3){width:16%}.agd-filetable th:nth-child(4){width:12%}.agd-filetable td{height:3rem}.agd-filetable td:first-child{overflow:hidden}.agd-filetable .agd-chip{flex-wrap:wrap;row-gap:0}.agd-filetable tbody tr:hover{background:var(--agd-color-surface-sunken)}.agd-filetable__sort{display:inline-flex;align-items:center;gap:var(--agd-space-1);min-height:var(--agd-control-h);padding:0 var(--agd-space-2);border:0;border-radius:var(--agd-radius-md);background:none;color:inherit;font:inherit;cursor:pointer}.agd-filetable__sort:hover{background:var(--agd-color-surface-hover)}.agd-filetable__arrow{display:inline-block;min-width:1ch}.agd-filetable__name{display:flex;align-items:center;gap:var(--agd-space-3);min-width:0}.agd-filetable__name .agd-file-row__name{min-width:0;flex:1 1 auto}.agd-filetable td:has(.agd-skeleton){padding-block:var(--agd-space-3)}.agd-filegrid-wrap{display:grid;gap:var(--agd-space-4)}.agd-filegrid-wrap>.agd-field{max-width:16rem}.agd-filegrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));gap:var(--agd-space-4);margin:0;padding:0;list-style:none}.agd-filegrid__item{display:grid;align-content:start;gap:var(--agd-space-2);min-height:7rem;padding:var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface)}.agd-filegrid__head{display:flex;align-items:center;gap:var(--agd-space-2);min-width:0}.agd-filegrid__item .agd-file-row__actions{justify-self:end}.agd-skeleton{display:block;height:1rem;border-radius:var(--agd-radius-sm);background:var(--agd-color-surface-hover);animation:agd-pulse 1.4s ease-in-out infinite}.agd-filegrid__item.agd-skeleton{height:auto;min-height:7rem;border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md)}@keyframes agd-pulse{50%{opacity:.5}}@media(max-width:47.99rem){.agd-filetable,.agd-filetable tbody,.agd-filetable tr,.agd-filetable thead{display:block}.agd-filetable thead tr{display:flex;flex-wrap:wrap}.agd-filetable thead th:last-child{display:none}.agd-filetable thead th{width:auto}.agd-filetable tbody tr{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"name actions" "owner owner" "time time";padding-block:var(--agd-space-1);border-bottom:1px solid var(--agd-color-border)}.agd-filetable tbody td{padding:var(--agd-space-1) var(--agd-space-3);border-bottom:0}.agd-filetable tbody td:nth-child(1){grid-area:name}.agd-filetable tbody td:nth-child(2){grid-area:owner}.agd-filetable tbody td:nth-child(3){grid-area:time}.agd-filetable tbody td:nth-child(4){grid-area:actions}}.agd-avatar{display:inline-grid;flex:none;place-items:center;width:1.5rem;height:1.5rem;border:1px solid var(--agd-color-border-strong);background:var(--agd-color-surface-sunken);color:var(--agd-color-text);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-medium);line-height:1}.agd-avatar svg{width:.9rem;height:.9rem}.agd-avatar--person{border-radius:var(--agd-radius-full)}.agd-avatar--agent{border-color:var(--agd-color-agent);border-radius:var(--agd-radius-sm);background:var(--agd-color-agent-subtle);color:var(--agd-color-agent-text)}.agd-avatar--more{border-radius:var(--agd-radius-full);background:var(--agd-color-surface);color:var(--agd-color-text-muted)}.agd-chip{display:inline-flex;align-items:center;gap:var(--agd-space-2);max-width:100%;min-width:0}.agd-chip__name{overflow:hidden;color:var(--agd-color-text);font-weight:var(--agd-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.agd-chip__meta{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);min-width:0;overflow-wrap:anywhere}.agd-pill{flex:none;padding:.125rem var(--agd-space-2);border:1px solid var(--agd-color-agent);border-radius:var(--agd-radius-full);color:var(--agd-color-agent-text);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold);letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.agd-agent-badge{display:inline-flex;align-items:center;gap:var(--agd-space-2);max-width:100%;padding:.125rem var(--agd-space-2) .125rem .125rem;border:1px solid var(--agd-color-agent);border-radius:var(--agd-radius-md);background:var(--agd-color-agent-subtle);color:var(--agd-color-agent-text);font-size:var(--agd-font-size-xs)}.agd-agent-badge--compact{padding:0;border:0;background:none}.agd-agent-badge__label{font-weight:var(--agd-font-weight-semibold);white-space:nowrap}.agd-agent-badge__meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agd-title{display:inline-grid;min-width:0;max-width:100%}.agd-title__button,.agd-title__input,.agd-title__text{min-width:0;padding:var(--agd-space-1) var(--agd-space-2);font:inherit;font-size:var(--agd-font-size-lg);font-weight:var(--agd-font-weight-semibold)}.agd-title__button{border:1px solid transparent;border-radius:var(--agd-radius-md);background:none;color:var(--agd-color-text);cursor:text;text-align:start}.agd-title__button:hover{border-color:var(--agd-color-border-strong)}.agd-title__text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agd-title__input{width:min(28rem,100%);border:1px solid var(--agd-color-border-strong);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);color:var(--agd-color-text)}.agd-title__input[aria-invalid=true]{border-color:var(--agd-color-danger-text)}.agd-title__error{padding-inline:var(--agd-space-2);color:var(--agd-color-danger-text);font-size:var(--agd-font-size-xs)}.agd-stack{display:inline-flex;align-items:center;gap:var(--agd-space-3)}.agd-stack__list{display:flex;margin:0;padding:0;list-style:none}.agd-stack__list li+li{margin-inline-start:-.25rem}.agd-stack__list .agd-avatar{width:1.75rem;height:1.75rem;box-shadow:0 0 0 2px var(--agd-color-bg)}.agd-stack__summary{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);white-space:nowrap}@media(forced-colors:active){.agd-checkbox:checked,.agd-switch:checked{background:Highlight;border-color:Highlight}.agd-checkbox:before{background:HighlightText}.agd-switch{background:Canvas;border-color:ButtonText}.agd-switch:before{background:ButtonText}.agd-switch:checked:before{background:HighlightText}.agd-button[aria-busy=true]{border-style:dashed}.agd-button[aria-pressed=true]{background:Highlight;color:HighlightText;border-color:Highlight}.agd-tabs__trigger[data-state=active]:after{background:Highlight}.agd-skeleton{background:GrayText}.agd-filegrid__item,.agd-agent-badge,.agd-title__button:hover,.agd-title__input{border-color:CanvasText}.agd-agent-badge--compact{border:0}.agd-menu__item[data-highlighted]{outline:2px solid Highlight;outline-offset:-2px}}.agd-dialog:has(.agd-share){width:min(36rem,calc(100vw - 2rem))}.agd-share{display:grid;gap:var(--agd-space-4)}.agd-share__invite{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:start;gap:var(--agd-space-3)}.agd-share__invite .agd-field:first-child{grid-column:1 / -1}.agd-share__invite .agd-button{align-self:end}.agd-share__sent{color:var(--agd-color-success-text);font-size:var(--agd-font-size-xs)}.agd-share__people{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--agd-color-border)}.agd-share__people li{display:flex;align-items:center;justify-content:space-between;gap:var(--agd-space-3);padding:var(--agd-space-2) 0;border-bottom:1px solid var(--agd-color-border)}.agd-share__people .agd-field{min-width:9rem}.agd-share__controls{display:inline-flex;align-items:center;gap:var(--agd-space-2)}.agd-share__owner{padding-inline:var(--agd-space-3);color:var(--agd-color-text-muted)}.agd-share__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--agd-space-3)}.agd-share__copy{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--agd-space-3)}@media(max-width:30rem){.agd-share__invite,.agd-share__row,.agd-share__copy{grid-template-columns:1fr}}.agd-cursor{position:relative;display:inline-block;width:0;vertical-align:baseline;-webkit-user-select:none;user-select:none}.agd-cursor__caret{position:absolute;inset-block:-.2em -.15em;inset-inline-start:0;width:2px;background:var(--agd-color-accent)}.agd-cursor__tag{position:absolute;inset-block-end:1.45em;inset-inline-start:var(--agd-cursor-shift, 0px);padding:.0625rem var(--agd-space-2);border:1px solid var(--agd-color-accent);border-radius:var(--agd-radius-sm) var(--agd-radius-sm) var(--agd-radius-sm) 0;background:var(--agd-color-accent);color:var(--agd-color-text-on-accent);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-medium);line-height:1.3;width:max-content;max-inline-size:calc(100vw - 1rem);overflow-wrap:anywhere}.agd-cursor--agent .agd-cursor__caret{background:var(--agd-color-agent)}.agd-cursor--agent .agd-cursor__tag{border-color:var(--agd-color-agent);border-radius:var(--agd-radius-sm);background:var(--agd-color-agent-subtle);color:var(--agd-color-agent-text)}.agd-datatable{display:grid;gap:var(--agd-space-3);min-width:0}.agd-datatable__frame{position:relative;border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);overflow:hidden}.agd-datatable__scroller{height:var(--agd-dt-height);overflow:auto;overscroll-behavior:contain}.agd-datatable__inner{min-width:var(--agd-dt-min)}.agd-datatable__head{position:sticky;top:0;z-index:1;background:var(--agd-color-surface-sunken)}.agd-datatable__head .agd-datatable__row{border-bottom:1px solid var(--agd-color-border)}.agd-datatable__row{box-sizing:border-box;display:grid;grid-template-columns:var(--agd-dt-cols);align-items:center;height:var(--agd-dt-row)}.agd-datatable__body{position:relative}.agd-datatable__row--body{position:absolute;inset-inline:0;border-bottom:1px solid var(--agd-color-border)}.agd-datatable__row--body:hover{background:var(--agd-color-surface-sunken)}.agd-datatable__row--body.agd-datatable__row--selected{background:var(--agd-color-accent-subtle)}.agd-datatable__row--body:focus-visible{outline:2px solid var(--agd-color-focus);outline-offset:-2px}.agd-datatable__cell{min-width:0;padding:0 var(--agd-space-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--agd-font-size-sm)}.agd-datatable__head .agd-datatable__cell{color:var(--agd-color-text-muted);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold)}.agd-datatable__cell--check{display:grid;place-items:center;padding:0}.agd-datatable__cell .agd-skeleton{width:70%}.agd-datatable__state{position:absolute;inset:var(--agd-dt-row) 0 0;display:grid;place-items:center}.agd-datatable__bar{position:absolute;inset-inline:var(--agd-space-3);inset-block-end:var(--agd-space-3);display:flex;flex-wrap:wrap;align-items:center;gap:var(--agd-space-3);padding:var(--agd-space-2) var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating)}.agd-datatable__bar-count{font-size:var(--agd-font-size-sm);font-weight:var(--agd-font-weight-medium)}.agd-datatable__bar-actions{display:flex;flex:1;flex-wrap:wrap;gap:var(--agd-space-2)}@media(forced-colors:active){.agd-datatable__row--body.agd-datatable__row--selected{border-inline-start:.25rem solid Highlight}}.agd-datatable__group{position:absolute;inset-inline:0;display:grid;align-items:center;height:var(--agd-dt-row);background:var(--agd-color-surface-sunken);border-bottom:1px solid var(--agd-color-border);box-sizing:border-box}.agd-datatable__group-cell{padding:0 var(--agd-space-3);font-size:var(--agd-font-size-xs);font-weight:var(--agd-font-weight-semibold)}.agd-datatable__group-count{margin-inline-start:var(--agd-space-1);color:var(--agd-color-text-muted);font-weight:var(--agd-font-weight-regular)}.agd-datatoolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--agd-space-2)}.agd-datatoolbar__start,.agd-datatoolbar__end{display:flex;flex-wrap:wrap;align-items:center;gap:var(--agd-space-2);min-width:0}.agd-tablesearch{position:relative;display:flex;align-items:center}.agd-tablesearch__icon{position:absolute;inset-inline-start:var(--agd-space-3);color:var(--agd-color-text-muted);pointer-events:none}.agd-tablesearch__input{width:min(16rem,60vw);padding-inline-start:var(--agd-space-8);animation:agd-fade-in var(--agd-duration-base) var(--agd-easing-out)}.agd-filterchips,.agd-filterchips__list{display:flex;flex-wrap:wrap;align-items:center;gap:var(--agd-space-2);margin:0;padding:0;list-style:none}.agd-filterchip{display:inline-flex;align-items:center;gap:var(--agd-space-1);padding-inline-start:var(--agd-space-3);border:1px solid var(--agd-color-border-strong);border-radius:var(--agd-radius-full);background:var(--agd-color-surface);font-size:var(--agd-font-size-sm)}.agd-filterchip__label{padding-block:var(--agd-space-1)}.agd-filterchip__remove{border-radius:var(--agd-radius-full)}.agd-popover{z-index:60;padding:var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface-raised);box-shadow:var(--agd-shadow-floating);animation:agd-pop-in var(--agd-duration-fast) var(--agd-easing-out)}.agd-display{display:grid;gap:var(--agd-space-3);width:min(20rem,calc(100vw - 2rem))}.agd-display__order{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--agd-space-2)}.agd-display__columns{display:grid;gap:var(--agd-space-1);margin:0;padding:0;border:0}.agd-display__columns legend{padding:0;margin-block-end:var(--agd-space-1);font-weight:var(--agd-font-weight-medium)}.agd-display .agd-button[aria-disabled=true]{--button-bg: var(--agd-color-surface-sunken);--button-bg-hover: var(--agd-color-surface-sunken);--button-fg: var(--agd-color-text-muted);--button-border: var(--agd-color-border);border-style:dashed;cursor:not-allowed}.agd-appsidebar{display:flex;flex-direction:column;gap:var(--agd-space-2);flex:none;box-sizing:border-box;width:var(--agd-size-sidebar);padding:var(--agd-space-2);border-inline-end:1px solid var(--agd-color-border);background:var(--agd-color-surface-sunken)}.agd-appsidebar[data-ready]{transition:width var(--agd-duration-base) var(--agd-easing-out)}@media(max-width:47.99rem){.agd-appsidebar:not([data-collapsed=true]){max-width:60vw}}.agd-appsidebar[data-collapsed=true]{width:var(--agd-size-sidebar-rail);align-items:center;padding-inline:var(--agd-space-1)}.agd-appsidebar__toggle{align-self:flex-start}.agd-appsidebar[data-collapsed=true] .agd-appsidebar__toggle{align-self:center}.agd-appsidebar__content{flex:1;box-sizing:border-box;padding:var(--agd-space-1);min-width:0;min-height:0;width:100%;overflow-x:hidden;overflow-y:auto}.agd-appsidebar__content[hidden]{display:none}.drive-main{max-width:72rem}.drive-muted{color:var(--agd-color-text-muted)}.drive-status{display:flex;align-items:center;gap:var(--agd-space-2);color:var(--agd-color-text-muted)}.drive-signin{display:grid;gap:var(--agd-space-4);max-width:24rem}.drive-form{display:grid;gap:var(--agd-space-4)}.drive-form__actions{display:flex;justify-content:flex-end;gap:var(--agd-space-2)}.drive-drop{min-height:60vh;border:2px dashed transparent;border-radius:var(--agd-radius-md);padding:var(--agd-space-2)}.drive-drop--over{border-color:var(--agd-color-accent);background:var(--agd-color-accent-subtle)}.drive-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--agd-space-4);flex-wrap:wrap;margin-bottom:var(--agd-space-4)}.drive-bar h1{margin:0;font-size:var(--agd-font-size-xl);overflow-wrap:anywhere}.drive-crumbs ol{display:flex;flex-wrap:wrap;gap:var(--agd-space-2);list-style:none;margin:0 0 var(--agd-space-2);padding:0;color:var(--agd-color-text-muted)}.drive-crumbs li+li:before{content:"/";margin-right:var(--agd-space-2)}.drive-crumbs [aria-current=page]{color:var(--agd-color-text);font-weight:var(--agd-font-weight-semibold)}.drive-split{display:grid;grid-template-columns:14rem minmax(0,1fr);gap:var(--agd-space-6)}@media(max-width:48rem){.drive-split{grid-template-columns:1fr}}.drive-tree{list-style:none;margin:0;padding:0}.drive-tree .drive-tree{padding-left:var(--agd-space-4)}.drive-tree a{display:flex;align-items:center;gap:var(--agd-space-2);padding:var(--agd-space-1) var(--agd-space-2);border-radius:var(--agd-radius-sm);color:var(--agd-color-text);text-decoration:none}.drive-tree a:hover{background:var(--agd-color-surface-hover)}.drive-tree a[aria-current=page]{background:var(--agd-color-accent-subtle);color:var(--agd-color-accent-text);font-weight:var(--agd-font-weight-semibold)}.drive-tree svg{width:1rem;height:1rem;flex:none}.drive-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(12rem,1fr));gap:var(--agd-space-4);list-style:none;margin:0;padding:0}.drive-card{position:relative;display:grid;gap:var(--agd-space-2);padding:var(--agd-space-4);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface)}.drive-card__icon svg{width:2rem;height:2rem}.drive-card__name{overflow-wrap:anywhere;font-weight:var(--agd-font-weight-medium);color:var(--agd-color-text)}.drive-card__meta{font-size:var(--agd-font-size-sm);color:var(--agd-color-text-muted)}.drive-card__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--agd-space-2)}.drive-root{display:grid;grid-template-columns:12rem minmax(0,1fr);gap:var(--agd-space-6);color:var(--agd-color-text)}@media(max-width:48rem){.drive-root{grid-template-columns:1fr}}.drive-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.drive-tools{display:flex;justify-content:flex-end;margin-bottom:var(--agd-space-2)}.drive-search{display:flex;align-items:center;gap:var(--agd-space-2)}.drive-search__input{min-width:14rem;min-height:2.25rem;padding:0 var(--agd-space-3);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);color:var(--agd-color-text);font:inherit}.drive-search__input:focus-visible,.drive-sort:focus-visible{outline:2px solid var(--agd-color-accent);outline-offset:2px}.drive-table{width:100%;border-collapse:collapse}.drive-table th{padding:var(--agd-space-2) var(--agd-space-3);text-align:left;font-size:var(--agd-font-size-sm);font-weight:var(--agd-font-weight-medium);color:var(--agd-color-text-muted);border-bottom:1px solid var(--agd-color-border)}.drive-table td{padding:var(--agd-space-2) var(--agd-space-3);border-bottom:1px solid var(--agd-color-border);vertical-align:middle}.drive-table .drive-table__date{color:var(--agd-color-text-muted);white-space:nowrap}.drive-table__check{width:2.5rem}.drive-table__name{display:flex;align-items:center;gap:var(--agd-space-2);overflow-wrap:anywhere}.drive-table__name a{color:var(--agd-color-text);font-weight:var(--agd-font-weight-medium);text-decoration:none}.drive-table__name a:hover{text-decoration:underline}.drive-table__icon svg{width:1.25rem;height:1.25rem;color:var(--agd-color-text-muted)}.drive-table__actions>*{vertical-align:middle}.drive-table__actions{text-align:right;white-space:nowrap}.drive-row:hover,.drive-row[data-selected]{background:var(--agd-color-surface-sunken)}.drive-sort{all:unset;cursor:pointer;border-radius:var(--agd-radius-sm)}.drive-bulk{position:fixed;inset:auto 0 var(--agd-space-4);margin-inline:auto;width:max-content;max-width:calc(100vw - 2rem);display:flex;align-items:center;gap:var(--agd-space-3);padding:var(--agd-space-2) var(--agd-space-4);border:1px solid var(--agd-color-border);border-radius:var(--agd-radius-md);background:var(--agd-color-surface);box-shadow:0 4px 16px #00000029;z-index:20}@media(max-width:40rem){.drive-table .drive-table__who{display:none}}.drive-title{display:flex;align-items:center;gap:var(--agd-space-3);flex-wrap:wrap;min-width:0}.drive-title h1{margin:0}.drive-drop--bulk{padding-bottom:6rem}html:has(.drive-bulk){scroll-padding-bottom:6rem}.agd-checkbox:indeterminate{background-color:var(--agd-color-accent);border-color:var(--agd-color-accent);background-image:linear-gradient(var(--agd-color-surface),var(--agd-color-surface));background-size:60% 2px;background-repeat:no-repeat;background-position:center}.drive-activity{list-style:none;margin:0;padding:0;display:grid;gap:var(--agd-space-2)}.drive-activity li{padding:var(--agd-space-2) 0;border-bottom:1px solid var(--agd-color-border)}.drive-activity time{color:var(--agd-color-text-muted);font-size:.875em}
|