agentic-drive 0.5.0 → 0.6.1
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 +14 -0
- package/README.md +88 -15
- package/dist/{chunk-B7E2Q3RB.js → chunk-5Z3SFBUK.js} +1 -1
- package/dist/{chunk-T6C5Y2WA.js → chunk-EAKQK7ST.js} +209 -201
- package/dist/{chunk-WQHJNHAR.js → chunk-H6JK62SP.js} +1 -1
- package/dist/chunk-S4AGCKXW.js +241 -0
- package/dist/cli.js +2 -2
- package/dist/client.d.ts +1 -1
- package/dist/client.js +4 -236
- package/dist/{drive-Cn3mpuDW.d.ts → drive-BtRyexUP.d.ts} +1 -1
- package/dist/embed.css +154 -0
- package/dist/embed.d.ts +21 -0
- package/dist/embed.js +412 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +2 -2
- package/dist/worker.d.ts +23 -4
- package/dist/worker.js +48 -23
- package/llms.txt +5 -0
- package/package.json +24 -4
- package/ui-dist/assets/{index-xUEd8lQS.css → index-B9nizMSQ.css} +1 -1
- package/ui-dist/assets/index-DQzn7NQP.js +49 -0
- package/ui-dist/index.html +2 -2
- package/ui-dist/assets/index-BiU4TGuq.js +0 -49
package/dist/worker.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
2
|
import { D1Like, R2Like } from 'agentic-identity/cloudflare';
|
|
3
|
-
import { Store } from 'agentic-identity';
|
|
4
|
-
import { C as Ctx, D as Drive } from './drive-
|
|
3
|
+
import { Store, Blobs } from 'agentic-identity';
|
|
4
|
+
import { C as Ctx, D as Drive } from './drive-BtRyexUP.js';
|
|
5
5
|
export { B as BackfillOptions, a as BackfillResult, b as backfillAuthorIds, c as backfillResources } from './migrate-B79gRPMu.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -21,6 +21,22 @@ interface WorkerEnv {
|
|
|
21
21
|
DRIVE_URL_SECRET?: string;
|
|
22
22
|
DRIVE_REGION?: string;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* What a host injects into `createApp`. Each part is optional, and the default is the D1 store, the R2 blobs,
|
|
26
|
+
* and the bearer-token check of agentic-identity. A part may be a function of the Worker env, which runs on every request.
|
|
27
|
+
*/
|
|
28
|
+
interface AppOptions<Env = WorkerEnv> {
|
|
29
|
+
/** The store that holds items, shares, and credentials. With it, no `DB` binding is read and the table is not created. */
|
|
30
|
+
store?: Store | ((env: Env) => Store | Promise<Store>);
|
|
31
|
+
/** The blob store. With it, no `FILES` binding is read. It signs download URLs, so it must serve them from this Worker's `/api/v1/drive/blob`. */
|
|
32
|
+
blobs?: Blobs | ((env: Env) => Blobs | Promise<Blobs>);
|
|
33
|
+
/**
|
|
34
|
+
* Resolves the caller. Return null for no valid caller (the answer is 401). Return a whole Ctx: a `principal`, and an
|
|
35
|
+
* `owner` and `actor` that match it, or the request gets 401. With it, bearer tokens are not read from the store.
|
|
36
|
+
* A callback that reads a session cookie must check the request origin itself, because every write route is open to a cross-site form.
|
|
37
|
+
*/
|
|
38
|
+
auth?: (request: Request, store: Store, env: Env) => Ctx | null | Promise<Ctx | null>;
|
|
39
|
+
}
|
|
24
40
|
type App = {
|
|
25
41
|
Bindings: WorkerEnv;
|
|
26
42
|
Variables: {
|
|
@@ -29,9 +45,12 @@ type App = {
|
|
|
29
45
|
ctx: Ctx;
|
|
30
46
|
};
|
|
31
47
|
};
|
|
32
|
-
declare function createApp(): Hono<
|
|
48
|
+
declare function createApp<Env extends object = WorkerEnv>(options?: AppOptions<Env>): Hono<{
|
|
49
|
+
Bindings: Env;
|
|
50
|
+
Variables: App["Variables"];
|
|
51
|
+
}>;
|
|
33
52
|
declare const _default: {
|
|
34
53
|
fetch: (request: Request, env: WorkerEnv, ctx: unknown) => Response | Promise<Response>;
|
|
35
54
|
};
|
|
36
55
|
|
|
37
|
-
export { type WorkerEnv, authenticate, createApp, _default as default };
|
|
56
|
+
export { type AppOptions, type WorkerEnv, authenticate, createApp, _default as default };
|
package/dist/worker.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
backfillAuthorIds,
|
|
3
3
|
backfillResources
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5Z3SFBUK.js";
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_MAX_BYTES,
|
|
7
7
|
DEFAULT_URL_SECONDS,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
publicNode,
|
|
13
13
|
safeMime,
|
|
14
14
|
upload
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-EAKQK7ST.js";
|
|
16
16
|
|
|
17
17
|
// src/worker.ts
|
|
18
18
|
import { Hono } from "hono";
|
|
@@ -44,12 +44,12 @@ var STATUS = {
|
|
|
44
44
|
};
|
|
45
45
|
var fail = (code, message, status) => new Response(JSON.stringify({ error: { code, message } }), { status, headers: { "content-type": "application/json" } });
|
|
46
46
|
var schemas = /* @__PURE__ */ new WeakMap();
|
|
47
|
-
function settings(env) {
|
|
48
|
-
let publicUrl;
|
|
47
|
+
function settings(env, needUrl = true) {
|
|
48
|
+
let publicUrl = "";
|
|
49
49
|
try {
|
|
50
50
|
publicUrl = new URL(env.DRIVE_PUBLIC_URL ?? "").origin;
|
|
51
51
|
} catch {
|
|
52
|
-
return null;
|
|
52
|
+
if (needUrl) return null;
|
|
53
53
|
}
|
|
54
54
|
const urlSecret = env.DRIVE_URL_SECRET;
|
|
55
55
|
return typeof urlSecret === "string" && new TextEncoder().encode(urlSecret).length >= 32 ? { publicUrl, urlSecret } : null;
|
|
@@ -58,7 +58,7 @@ var regionOf = (env) => parseRegion(env.DRIVE_REGION ?? "eu");
|
|
|
58
58
|
function blobsFor(env, config) {
|
|
59
59
|
return createR2Blobs(env.FILES, { region: regionOf(env), urlBase: `${config.publicUrl}/api/v1/drive/blob`, urlSecret: config.urlSecret });
|
|
60
60
|
}
|
|
61
|
-
async function
|
|
61
|
+
async function defaultStore(env) {
|
|
62
62
|
let ready = schemas.get(env.DB);
|
|
63
63
|
if (!ready) {
|
|
64
64
|
ready = env.DB.prepare(D1_SCHEMA).run().catch((error) => {
|
|
@@ -68,8 +68,7 @@ async function driveFor(env, config) {
|
|
|
68
68
|
schemas.set(env.DB, ready);
|
|
69
69
|
}
|
|
70
70
|
await ready;
|
|
71
|
-
|
|
72
|
-
return { store, drive: createDrive({ store, blobs: blobsFor(env, config), sharing: createSharing(store) }) };
|
|
71
|
+
return createD1Store(env.DB, { region: regionOf(env) });
|
|
73
72
|
}
|
|
74
73
|
var number = (v, name) => {
|
|
75
74
|
if (v === void 0) return void 0;
|
|
@@ -78,16 +77,40 @@ var number = (v, name) => {
|
|
|
78
77
|
return n;
|
|
79
78
|
};
|
|
80
79
|
var claimedType = (header) => header === void 0 || /^(application\/x-www-form-urlencoded|application\/octet-stream|multipart\/form-data)\b/i.test(header) ? void 0 : header;
|
|
81
|
-
function createApp() {
|
|
80
|
+
function createApp(options = {}) {
|
|
81
|
+
const injected = options;
|
|
82
|
+
const unset = (message) => fail("NOT_CONFIGURED", message, 503);
|
|
83
|
+
const urlSettings = "set DRIVE_PUBLIC_URL and DRIVE_URL_SECRET (32 bytes or more)";
|
|
84
|
+
const secretOf = (env) => (injected.blobs ? settings(env, false) : settings(env))?.urlSecret;
|
|
85
|
+
const blobsOf = async (env) => {
|
|
86
|
+
if (injected.blobs) return typeof injected.blobs === "function" ? injected.blobs(env) : injected.blobs;
|
|
87
|
+
const config = settings(env);
|
|
88
|
+
if (!env.FILES) return unset("bind FILES (R2), or inject blobs");
|
|
89
|
+
return config ? blobsFor(env, config) : unset(urlSettings);
|
|
90
|
+
};
|
|
91
|
+
const resolve = async (env) => {
|
|
92
|
+
if (!injected.store && !env.DB) return { stop: unset("bind DB (D1), or inject a store") };
|
|
93
|
+
const blobs = await blobsOf(env);
|
|
94
|
+
if (blobs instanceof Response) return { stop: blobs };
|
|
95
|
+
const store = injected.store ? await (typeof injected.store === "function" ? injected.store(env) : injected.store) : await defaultStore(env);
|
|
96
|
+
return { store, drive: createDrive({ store, blobs, sharing: createSharing(store) }) };
|
|
97
|
+
};
|
|
98
|
+
const who = async (request, store, env) => {
|
|
99
|
+
if (!injected.auth) return authenticate(request, store);
|
|
100
|
+
const ctx = await injected.auth(request, store, env);
|
|
101
|
+
const p = ctx?.principal;
|
|
102
|
+
return ctx && p && ctx.owner === p.chain[0]?.id && ctx.actor?.id === p.principalId && ctx.actor.kind === p.kind ? ctx : null;
|
|
103
|
+
};
|
|
104
|
+
const unauthorized = () => fail("UNAUTHORIZED", injected.auth ? "sign in first" : "send a valid bearer token", 401);
|
|
82
105
|
const app2 = new Hono();
|
|
83
106
|
app2.get("/health", (c) => c.json({ ok: true }));
|
|
84
107
|
const api = new Hono();
|
|
85
108
|
api.use("*", async (c, next) => {
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
const { drive, store } =
|
|
89
|
-
const ctx = await
|
|
90
|
-
if (!ctx) return
|
|
109
|
+
const r = await resolve(c.env);
|
|
110
|
+
if ("stop" in r) return r.stop;
|
|
111
|
+
const { drive, store } = r;
|
|
112
|
+
const ctx = await who(c.req.raw, store, c.env);
|
|
113
|
+
if (!ctx) return unauthorized();
|
|
91
114
|
c.set("ctx", ctx);
|
|
92
115
|
c.set("drive", drive);
|
|
93
116
|
c.set("store", store);
|
|
@@ -186,11 +209,13 @@ function createApp() {
|
|
|
186
209
|
});
|
|
187
210
|
api.delete("/documents", async (c) => c.json(await c.var.drive.forgetDocument(c.var.ctx, need(q(c, "ref"), "ref"))));
|
|
188
211
|
app2.get("/api/v1/drive/blob", async (c) => {
|
|
189
|
-
const
|
|
190
|
-
if (!
|
|
191
|
-
const signed = await verifySignedBlobUrl(c.req.url, { secret
|
|
212
|
+
const secret = secretOf(c.env);
|
|
213
|
+
if (!secret) return unset(urlSettings);
|
|
214
|
+
const signed = await verifySignedBlobUrl(c.req.url, { secret });
|
|
192
215
|
if (!signed || signed.method !== "GET") return fail("INVALID_LINK", "this link is not valid, or it has expired", 403);
|
|
193
|
-
const
|
|
216
|
+
const blobs = await blobsOf(c.env);
|
|
217
|
+
if (blobs instanceof Response) return blobs;
|
|
218
|
+
const blob = await blobs.get(signed.key);
|
|
194
219
|
if (!blob) return fail("NOT_FOUND", "the bytes are gone", 404);
|
|
195
220
|
return new Response(blob.data, {
|
|
196
221
|
headers: {
|
|
@@ -254,11 +279,11 @@ function createApp() {
|
|
|
254
279
|
});
|
|
255
280
|
const shared = new Hono();
|
|
256
281
|
const visit = async (c) => {
|
|
257
|
-
const
|
|
258
|
-
if (
|
|
259
|
-
const { drive, store } =
|
|
260
|
-
const ctx = await
|
|
261
|
-
if (!ctx && c.req.header("authorization")) return { stop:
|
|
282
|
+
const r = await resolve(c.env);
|
|
283
|
+
if ("stop" in r) return r;
|
|
284
|
+
const { drive, store } = r;
|
|
285
|
+
const ctx = await who(c.req.raw, store, c.env);
|
|
286
|
+
if (!ctx && c.req.header("authorization")) return { stop: unauthorized() };
|
|
262
287
|
return { drive, principal: ctx?.principal ?? null, token: c.req.header("x-link-token") };
|
|
263
288
|
};
|
|
264
289
|
shared.get("/:id", async (c) => {
|
package/llms.txt
CHANGED
|
@@ -5,7 +5,12 @@ Store, sort, and share files and folders.
|
|
|
5
5
|
Keywords: drive,files,folders,storage,upload,sharing,agents,mcp,cli,r2.
|
|
6
6
|
|
|
7
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".
|
|
8
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.
|
|
9
14
|
- 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.
|
|
10
15
|
- MCP: run agentic-drive mcp, then call drive_ls.
|
|
11
16
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-drive",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Store, sort, and share files and folders.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"drive",
|
|
@@ -52,7 +52,12 @@
|
|
|
52
52
|
"./worker": {
|
|
53
53
|
"types": "./dist/worker.d.ts",
|
|
54
54
|
"import": "./dist/worker.js"
|
|
55
|
-
}
|
|
55
|
+
},
|
|
56
|
+
"./ui": {
|
|
57
|
+
"types": "./dist/embed.d.ts",
|
|
58
|
+
"import": "./dist/embed.js"
|
|
59
|
+
},
|
|
60
|
+
"./ui.css": "./dist/embed.css"
|
|
56
61
|
},
|
|
57
62
|
"scripts": {
|
|
58
63
|
"build": "tsup",
|
|
@@ -67,18 +72,21 @@
|
|
|
67
72
|
},
|
|
68
73
|
"dependencies": {
|
|
69
74
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
70
|
-
"agentic-
|
|
75
|
+
"agentic-design": "^0.1.0",
|
|
76
|
+
"agentic-identity": "^0.6.0",
|
|
71
77
|
"hono": "^4.13.14",
|
|
72
78
|
"zod": "^3.25.0"
|
|
73
79
|
},
|
|
74
80
|
"devDependencies": {
|
|
75
81
|
"@axe-core/playwright": "^4.14.0",
|
|
76
82
|
"@playwright/test": "^1.64.1",
|
|
83
|
+
"@types/jsdom": "^21.1.7",
|
|
77
84
|
"@types/node": "^22.0.0",
|
|
78
85
|
"@types/react": "^19.3.0",
|
|
79
86
|
"@types/react-dom": "^19.3.0",
|
|
80
87
|
"@vitejs/plugin-react": "^5.2.0",
|
|
81
|
-
"
|
|
88
|
+
"esbuild": "^0.27.7",
|
|
89
|
+
"jsdom": "^26.1.0",
|
|
82
90
|
"miniflare": "^4.20260730.0",
|
|
83
91
|
"react": "^19.3.1",
|
|
84
92
|
"react-dom": "^19.3.1",
|
|
@@ -90,5 +98,17 @@
|
|
|
90
98
|
},
|
|
91
99
|
"bin": {
|
|
92
100
|
"agentic-drive": "./dist/cli.js"
|
|
101
|
+
},
|
|
102
|
+
"peerDependencies": {
|
|
103
|
+
"react": ">=19",
|
|
104
|
+
"react-dom": ">=19"
|
|
105
|
+
},
|
|
106
|
+
"peerDependenciesMeta": {
|
|
107
|
+
"react": {
|
|
108
|
+
"optional": true
|
|
109
|
+
},
|
|
110
|
+
"react-dom": {
|
|
111
|
+
"optional": true
|
|
112
|
+
}
|
|
93
113
|
}
|
|
94
114
|
}
|
|
@@ -1 +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;--ad-color-bg: #FAF9F7;--ad-color-surface: #FFFFFF;--ad-color-surface-raised: #FFFFFF;--ad-color-surface-sunken: #F3F1EE;--ad-color-surface-hover: #E9E6E1;--ad-color-text: #1D1C1A;--ad-color-text-muted: #5E5A53;--ad-color-text-on-accent: #FFFFFF;--ad-color-border: #DAD7D1;--ad-color-border-strong: #827D73;--ad-color-accent: #2B4BC4;--ad-color-accent-hover: #223D9F;--ad-color-accent-subtle: #E8EDFC;--ad-color-accent-text: #223D9F;--ad-color-agent: #8E2C86;--ad-color-agent-subtle: #F7E8F5;--ad-color-agent-text: #7A2273;--ad-color-danger: #B42318;--ad-color-danger-subtle: #FDECEA;--ad-color-danger-text: #A11D14;--ad-color-warning: #92520A;--ad-color-warning-subtle: #FDF1DC;--ad-color-warning-text: #7A4208;--ad-color-success: #1B6B3A;--ad-color-success-subtle: #E6F5EC;--ad-color-success-text: #175C32;--ad-color-focus: #2B4BC4;--ad-color-scrim: rgb(29 28 26 / .4);--ad-shadow-raised: 0 1px 2px rgb(29 28 26 / .06), 0 2px 16px rgb(29 28 26 / .08);--ad-shadow-floating: 0 2px 6px rgb(29 28 26 / .08), 0 8px 40px rgb(29 28 26 / .16)}:root{--ad-space-1: .25rem;--ad-space-2: .5rem;--ad-space-3: .75rem;--ad-space-4: 1rem;--ad-space-6: 1.5rem;--ad-space-8: 2rem;--ad-space-12: 3rem;--ad-space-16: 4rem;--ad-space-24: 6rem;--ad-radius-sm: .25rem;--ad-radius-md: .5rem;--ad-radius-lg: .75rem;--ad-radius-full: 9999px;--ad-font-family-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;--ad-font-family-mono: "JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--ad-font-size-xs: .75rem;--ad-font-size-sm: .875rem;--ad-font-size-md: 1rem;--ad-font-size-lg: 1.125rem;--ad-font-size-xl: 1.5rem;--ad-font-size-2xl: 2rem;--ad-line-height-tight: 1.25;--ad-line-height-snug: 1.4;--ad-line-height-normal: 1.55;--ad-font-weight-regular: 400;--ad-font-weight-medium: 500;--ad-font-weight-semibold: 600;--ad-duration-fast: .1s;--ad-duration-base: .16s;--ad-duration-slow: .24s;--ad-easing-out: cubic-bezier(.16, 1, .3, 1);--ad-size-control: 2rem;--ad-size-control-touch: 2.75rem;--ad-size-sidebar: 16rem;--ad-size-topbar: 3rem;--ad-size-content: 46rem}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}}[data-theme=dark]{color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}@media(prefers-reduced-motion:reduce){:root{--ad-duration-fast: .01ms;--ad-duration-base: .01ms;--ad-duration-slow: .01ms}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;background:var(--ad-color-bg);color:var(--ad-color-text);font-family:var(--ad-font-family-sans);font-size:var(--ad-font-size-sm);line-height:var(--ad-line-height-normal);font-feature-settings:"cv11","ss03";-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;line-height:var(--ad-line-height-tight);font-weight:var(--ad-font-weight-semibold);text-wrap:balance}h1{font-size:var(--ad-font-size-2xl)}h2{font-size:var(--ad-font-size-xl)}h3{font-size:var(--ad-font-size-lg)}h4{font-size:var(--ad-font-size-md)}p{margin:0;text-wrap:pretty}a{color:var(--ad-color-accent-text);text-underline-offset:.2em}code,kbd,pre{font-family:var(--ad-font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:2px}::selection{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text)}.ad-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}.ad-skip-link{position:absolute;inset-block-start:var(--ad-space-2);inset-inline-start:var(--ad-space-2);z-index:100;padding:var(--ad-space-2) var(--ad-space-4);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);color:var(--ad-color-text);box-shadow:var(--ad-shadow-floating);transform:translateY(-200%)}.ad-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{--ad-control-h: var(--ad-size-control)}@media(pointer:coarse){:root{--ad-control-h: var(--ad-size-control-touch)}}.ad-button{--button-bg: var(--ad-color-surface);--button-bg-hover: var(--ad-color-surface-hover);--button-bg-active: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text);--button-border: var(--ad-color-border-strong);display:inline-flex;align-items:center;justify-content:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-4);border:1px solid var(--button-border);border-radius:var(--ad-radius-md);background:var(--button-bg);color:var(--button-fg);font:inherit;font-weight:var(--ad-font-weight-medium);line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-button:hover{background:var(--button-bg-hover)}.ad-button:active{background:var(--button-bg-active)}.ad-button--sm{min-height:1.75rem;padding:0 var(--ad-space-3);font-size:var(--ad-font-size-xs)}@media(pointer:coarse){.ad-button--sm{min-height:var(--ad-control-h)}}.ad-button--primary{--button-bg: var(--ad-color-accent);--button-bg-hover: var(--ad-color-accent-hover);--button-bg-active: var(--ad-color-accent-hover);--button-fg: var(--ad-color-text-on-accent);--button-border: transparent}.ad-button--ghost{--button-bg: transparent;--button-border: transparent}.ad-button--danger{--button-bg-hover: var(--ad-color-danger-subtle);--button-bg-active: var(--ad-color-danger-subtle);--button-fg: var(--ad-color-danger-text);--button-border: var(--ad-color-danger)}.ad-button:disabled{--button-bg: var(--ad-color-surface-sunken);--button-bg-hover: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text-muted);--button-border: var(--ad-color-border);cursor:not-allowed}.ad-button[aria-busy=true]{cursor:progress}.ad-icon-button{width:var(--ad-control-h);padding:0}.ad-icon-button.ad-button--sm{width:1.75rem}@media(pointer:coarse){.ad-icon-button.ad-button--sm{width:var(--ad-control-h)}}.ad-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:ad-spin .7s linear infinite}@keyframes ad-spin{to{transform:rotate(360deg)}}.ad-field{display:grid;gap:var(--ad-space-1)}.ad-field__label{font-weight:var(--ad-font-weight-medium)}.ad-field__hint{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-field__error{display:flex;align-items:flex-start;gap:var(--ad-space-1);color:var(--ad-color-danger-text);font-size:var(--ad-font-size-xs)}.ad-field__error svg{flex:none;margin-top:-.1em}.ad-input{width:100%;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:1px solid var(--ad-color-border-strong);border-radius:var(--ad-radius-md);background:var(--ad-color-surface);color:var(--ad-color-text);font:inherit}.ad-input::placeholder{color:var(--ad-color-text-muted);opacity:1}.ad-input:hover:not(:disabled){background:var(--ad-color-surface-sunken)}.ad-input[aria-invalid=true]{border-color:var(--ad-color-danger);box-shadow:inset 0 0 0 1px var(--ad-color-danger)}.ad-input:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);color:var(--ad-color-text-muted);cursor:not-allowed}.ad-textarea{min-height:5rem;padding:var(--ad-space-2) var(--ad-space-3);resize:vertical}.ad-select{position:relative;display:block}.ad-select select{appearance:none;padding-inline-end:var(--ad-space-8);cursor:pointer}.ad-select:after{content:"";position:absolute;inset-inline-end:var(--ad-space-3);inset-block-start:50%;width:.45rem;height:.45rem;border:solid var(--ad-color-text-muted);border-width:0 2px 2px 0;transform:translateY(-75%) rotate(45deg);pointer-events:none}.ad-toggle{display:grid;gap:var(--ad-space-1)}.ad-toggle__row{display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-control-h);cursor:pointer}.ad-checkbox,.ad-switch{appearance:none;flex:none;margin:0;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface);cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:var(--ad-radius-sm)}.ad-checkbox:before{content:"";width:.75rem;height:.75rem;background:var(--ad-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(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-checkbox:checked:before{transform:scale(1)}.ad-switch{position:relative;width:2.25rem;height:1.375rem;border-radius:var(--ad-radius-full);background:var(--ad-color-surface-sunken)}.ad-switch:before{content:"";position:absolute;inset-block-start:50%;inset-inline-start:.2rem;width:.875rem;height:.875rem;border-radius:var(--ad-radius-full);background:var(--ad-color-text-muted);transform:translateY(-50%);transition:inset-inline-start var(--ad-duration-base) var(--ad-easing-out)}.ad-switch:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-switch:checked:before{background:var(--ad-color-text-on-accent);inset-inline-start:calc(100% - 1.075rem)}.ad-checkbox:disabled,.ad-switch:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);cursor:not-allowed}.ad-checkbox:disabled:before{background:var(--ad-color-text-muted)}.ad-switch:disabled:before{background:var(--ad-color-border)}@keyframes ad-fade-in{0%{opacity:0}}@keyframes ad-pop-in{0%{opacity:0;scale:.97}}.ad-overlay{position:fixed;z-index:50;inset:0;background:var(--ad-color-scrim);animation:ad-fade-in var(--ad-duration-base) var(--ad-easing-out)}.ad-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(--ad-space-6);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-lg);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-dialog__title{padding-inline-end:var(--ad-space-8);font-size:var(--ad-font-size-lg)}.ad-dialog__description{margin-top:var(--ad-space-2);color:var(--ad-color-text-muted)}.ad-dialog__body{margin-top:var(--ad-space-4)}.ad-dialog__footer{display:flex;justify-content:flex-end;gap:var(--ad-space-2);margin-top:var(--ad-space-6)}.ad-dialog__close{position:absolute;inset-block-start:var(--ad-space-3);inset-inline-end:var(--ad-space-3)}.ad-tooltip{z-index:60;max-width:16rem;padding:var(--ad-space-1) var(--ad-space-2);border-radius:var(--ad-radius-sm);background:var(--ad-color-text);color:var(--ad-color-bg);font-size:var(--ad-font-size-xs);animation:ad-fade-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu{z-index:60;min-width:11rem;padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu__item{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-sm);color:var(--ad-color-text);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}.ad-menu__item[data-highlighted]{background:var(--ad-color-surface-hover)}.ad-menu__item[data-highlighted]:focus-visible,.ad-menu__item:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:-2px}.ad-menu__item[data-disabled]{color:var(--ad-color-text-muted);cursor:not-allowed}.ad-menu__item--danger{color:var(--ad-color-danger-text)}.ad-menu__shortcut{margin-inline-start:auto;color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-menu__separator{height:1px;margin:var(--ad-space-1) 0;background:var(--ad-color-border)}.ad-toast-viewport{position:fixed;inset-block-end:var(--ad-space-4);inset-inline-end:var(--ad-space-4);z-index:70;display:grid;gap:var(--ad-space-2);width:min(24rem,calc(100vw - 2rem));margin:0;padding:0;list-style:none}.ad-toast{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--ad-space-3);padding:var(--ad-space-3) var(--ad-space-3) var(--ad-space-3) var(--ad-space-4);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating)}.ad-toast[data-state=open]{animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-toast__icon{margin-top:var(--ad-space-1)}.ad-toast--info .ad-toast__icon{color:var(--ad-color-accent)}.ad-toast--success .ad-toast__icon{color:var(--ad-color-success)}.ad-toast--warning .ad-toast__icon{color:var(--ad-color-warning)}.ad-toast--danger .ad-toast__icon{color:var(--ad-color-danger)}.ad-toast__title{font-weight:var(--ad-font-weight-medium)}.ad-toast__description{margin-top:var(--ad-space-1);color:var(--ad-color-text-muted)}.ad-tabs__list{display:flex;gap:var(--ad-space-1);border-bottom:1px solid var(--ad-color-border)}.ad-tabs__trigger{position:relative;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:0;background:transparent;color:var(--ad-color-text-muted);font:inherit;cursor:pointer}.ad-tabs__trigger:hover{color:var(--ad-color-text)}.ad-tabs__trigger[data-state=active]{color:var(--ad-color-text);font-weight:var(--ad-font-weight-semibold)}.ad-tabs__trigger[data-state=active]:after{content:"";position:absolute;inset:auto var(--ad-space-3) -1px;height:2px;background:var(--ad-color-accent)}.ad-tabs__panel{padding-top:var(--ad-space-4)}.ad-shell{display:grid;grid-template-columns:var(--ad-size-sidebar) minmax(0,1fr);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar" "sidebar content";min-height:100vh}.ad-shell__sidebar{grid-area:sidebar;display:flex;flex-direction:column;gap:var(--ad-space-4);padding:var(--ad-space-4) var(--ad-space-3);border-inline-end:1px solid var(--ad-color-border);background:var(--ad-color-surface-sunken)}.ad-shell__brand{padding:0 var(--ad-space-3);font-weight:var(--ad-font-weight-semibold)}.ad-shell__topbar{grid-area:topbar;display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-size-topbar);padding:0 var(--ad-space-6);border-bottom:1px solid var(--ad-color-border);background:var(--ad-color-bg)}.ad-shell__actions{display:flex;align-items:center;gap:var(--ad-space-4);margin-inline-start:auto}.ad-shell__content{grid-area:content;min-width:0;padding:var(--ad-space-8) var(--ad-space-6) var(--ad-space-24);outline:none}.ad-shell__menu{display:none}@media(max-width:47.99rem){.ad-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr;grid-template-areas:"topbar" "sidebar" "content"}.ad-shell__menu{display:inline-flex}.ad-shell__sidebar[data-open=false]{display:none}.ad-shell__sidebar{border-inline-end:0;border-bottom:1px solid var(--ad-color-border)}.ad-shell__topbar,.ad-shell__content{padding-inline:var(--ad-space-4)}}.ad-sidebar-nav{display:grid;gap:var(--ad-space-1);margin:0;padding:0;list-style:none}.ad-sidebar-nav__link{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-md);color:var(--ad-color-text);text-decoration:none}.ad-sidebar-nav__link:hover{background:var(--ad-color-surface-hover)}.ad-sidebar-nav__link[aria-current=page]{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text);font-weight:var(--ad-font-weight-semibold)}.ad-toolbar{display:inline-flex;align-items:center;gap:var(--ad-space-1);padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface)}.ad-toolbar__separator{align-self:stretch;width:1px;margin:var(--ad-space-1);background:var(--ad-color-border)}.ad-button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--button-border);font-weight:var(--ad-font-weight-semibold);--button-bg: var(--ad-color-accent-subtle);--button-bg-hover: var(--ad-color-accent-subtle);--button-fg: var(--ad-color-accent-text);--button-border: var(--ad-color-accent)}.ad-empty{display:grid;justify-items:center;gap:var(--ad-space-3);padding:var(--ad-space-12) var(--ad-space-6);text-align:center}.ad-empty__title{font-size:var(--ad-font-size-lg)}.ad-empty__description{max-width:28rem;color:var(--ad-color-text-muted)}.ad-files{margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-file-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:var(--ad-space-4);min-height:3rem;padding:var(--ad-space-1) var(--ad-space-2);border-bottom:1px solid var(--ad-color-border)}.ad-file-row:hover{background:var(--ad-color-surface-sunken)}.ad-file-row__icon{display:inline-flex;color:var(--ad-color-text-muted)}.ad-file-row__name{min-height:1.5rem;overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-file-row__meta,.ad-file-row__time{display:inline-flex;align-items:center;gap:var(--ad-space-2);color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-file-row__actions{display:inline-flex}@media(max-width:47.99rem){.ad-file-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"icon name actions" ". meta meta" ". time time"}.ad-file-row__icon{grid-area:icon}.ad-file-row__name{grid-area:name}.ad-file-row__meta{grid-area:meta}.ad-file-row__time{grid-area:time}.ad-file-row__actions{grid-area:actions}}.ad-avatar{display:inline-grid;flex:none;place-items:center;width:1.5rem;height:1.5rem;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface-sunken);color:var(--ad-color-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1}.ad-avatar svg{width:.9rem;height:.9rem}.ad-avatar--person{border-radius:var(--ad-radius-full)}.ad-avatar--agent{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.ad-avatar--more{border-radius:var(--ad-radius-full);background:var(--ad-color-surface);color:var(--ad-color-text-muted)}.ad-chip{display:inline-flex;align-items:center;gap:var(--ad-space-2);max-width:100%;min-width:0}.ad-chip__name{overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-chip__meta{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}.ad-pill{flex:none;padding:.125rem var(--ad-space-2);border:1px solid var(--ad-color-agent);border-radius:var(--ad-radius-full);color:var(--ad-color-agent-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-semibold);letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.ad-stack{display:inline-flex;align-items:center;gap:var(--ad-space-3)}.ad-stack__list{display:flex;margin:0;padding:0;list-style:none}.ad-stack__list li+li{margin-inline-start:-.25rem}.ad-stack__list .ad-avatar{width:1.75rem;height:1.75rem;box-shadow:0 0 0 2px var(--ad-color-bg)}.ad-stack__summary{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}@media(forced-colors:active){.ad-checkbox:checked,.ad-switch:checked{background:Highlight;border-color:Highlight}.ad-checkbox:before{background:HighlightText}.ad-switch{background:Canvas;border-color:ButtonText}.ad-switch:before{background:ButtonText}.ad-switch:checked:before{background:HighlightText}.ad-button[aria-busy=true]{border-style:dashed}.ad-button[aria-pressed=true]{background:Highlight;color:HighlightText;border-color:Highlight}.ad-tabs__trigger[data-state=active]:after{background:Highlight}.ad-menu__item[data-highlighted]{outline:2px solid Highlight;outline-offset:-2px}}.ad-dialog:has(.ad-share){width:min(36rem,calc(100vw - 2rem))}.ad-share{display:grid;gap:var(--ad-space-4)}.ad-share__invite{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:start;gap:var(--ad-space-3)}.ad-share__invite .ad-field:first-child{grid-column:1 / -1}.ad-share__invite .ad-button{align-self:end}.ad-share__sent{color:var(--ad-color-success-text);font-size:var(--ad-font-size-xs)}.ad-share__people{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-share__people li{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-3);padding:var(--ad-space-2) 0;border-bottom:1px solid var(--ad-color-border)}.ad-share__people .ad-field{min-width:9rem}.ad-share__controls{display:inline-flex;align-items:center;gap:var(--ad-space-2)}.ad-share__owner{padding-inline:var(--ad-space-3);color:var(--ad-color-text-muted)}.ad-share__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--ad-space-3)}.ad-share__copy{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--ad-space-3)}@media(max-width:30rem){.ad-share__invite,.ad-share__row,.ad-share__copy{grid-template-columns:1fr}}.ad-cursor{position:relative;display:inline-block;width:0;vertical-align:baseline;-webkit-user-select:none;user-select:none}.ad-cursor__caret{position:absolute;inset-block:-.2em -.15em;inset-inline-start:0;width:2px;background:var(--ad-color-accent)}.ad-cursor__tag{position:absolute;inset-block-end:1.45em;inset-inline-start:0;padding:.0625rem var(--ad-space-2);border:1px solid var(--ad-color-accent);border-radius:var(--ad-radius-sm) var(--ad-radius-sm) var(--ad-radius-sm) 0;background:var(--ad-color-accent);color:var(--ad-color-text-on-accent);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1.3;white-space:nowrap}.ad-cursor--agent .ad-cursor__caret{background:var(--ad-color-agent)}.ad-cursor--agent .ad-cursor__tag{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.drive-main{max-width:72rem}.drive-muted{color:var(--ad-color-text-muted)}.drive-status{display:flex;align-items:center;gap:var(--ad-space-2);color:var(--ad-color-text-muted)}.drive-signin{display:grid;gap:var(--ad-space-4);max-width:24rem}.drive-form{display:grid;gap:var(--ad-space-4)}.drive-form__actions{display:flex;justify-content:flex-end;gap:var(--ad-space-2)}.drive-drop{min-height:60vh;border:2px dashed transparent;border-radius:var(--ad-radius-md);padding:var(--ad-space-2)}.drive-drop--over{border-color:var(--ad-color-accent);background:var(--ad-color-accent-subtle)}.drive-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-4);flex-wrap:wrap;margin-bottom:var(--ad-space-4)}.drive-bar h1{margin:0;font-size:var(--ad-font-size-xl);overflow-wrap:anywhere}.drive-crumbs ol{display:flex;flex-wrap:wrap;gap:var(--ad-space-2);list-style:none;margin:0 0 var(--ad-space-2);padding:0;color:var(--ad-color-text-muted)}.drive-crumbs li+li:before{content:"/";margin-right:var(--ad-space-2)}.drive-crumbs [aria-current=page]{color:var(--ad-color-text);font-weight:var(--ad-font-weight-semibold)}.drive-split{display:grid;grid-template-columns:14rem minmax(0,1fr);gap:var(--ad-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(--ad-space-4)}.drive-tree a{display:flex;align-items:center;gap:var(--ad-space-2);padding:var(--ad-space-1) var(--ad-space-2);border-radius:var(--ad-radius-sm);color:var(--ad-color-text);text-decoration:none}.drive-tree a:hover{background:var(--ad-color-surface-hover)}.drive-tree a[aria-current=page]{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text);font-weight:var(--ad-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(--ad-space-4);list-style:none;margin:0;padding:0}.drive-card{position:relative;display:grid;gap:var(--ad-space-2);padding:var(--ad-space-4);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface)}.drive-card__icon svg{width:2rem;height:2rem}.drive-card__name{overflow-wrap:anywhere;font-weight:var(--ad-font-weight-medium);color:var(--ad-color-text)}.drive-card__meta{font-size:var(--ad-font-size-sm);color:var(--ad-color-text-muted)}.drive-card__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-2)}
|
|
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;--ad-color-bg: #FAF9F7;--ad-color-surface: #FFFFFF;--ad-color-surface-raised: #FFFFFF;--ad-color-surface-sunken: #F3F1EE;--ad-color-surface-hover: #E9E6E1;--ad-color-text: #1D1C1A;--ad-color-text-muted: #5E5A53;--ad-color-text-on-accent: #FFFFFF;--ad-color-border: #DAD7D1;--ad-color-border-strong: #827D73;--ad-color-accent: #2B4BC4;--ad-color-accent-hover: #223D9F;--ad-color-accent-subtle: #E8EDFC;--ad-color-accent-text: #223D9F;--ad-color-agent: #8E2C86;--ad-color-agent-subtle: #F7E8F5;--ad-color-agent-text: #7A2273;--ad-color-danger: #B42318;--ad-color-danger-subtle: #FDECEA;--ad-color-danger-text: #A11D14;--ad-color-warning: #92520A;--ad-color-warning-subtle: #FDF1DC;--ad-color-warning-text: #7A4208;--ad-color-success: #1B6B3A;--ad-color-success-subtle: #E6F5EC;--ad-color-success-text: #175C32;--ad-color-focus: #2B4BC4;--ad-color-scrim: rgb(29 28 26 / .4);--ad-shadow-raised: 0 1px 2px rgb(29 28 26 / .06), 0 2px 16px rgb(29 28 26 / .08);--ad-shadow-floating: 0 2px 6px rgb(29 28 26 / .08), 0 8px 40px rgb(29 28 26 / .16)}:root{--ad-space-1: .25rem;--ad-space-2: .5rem;--ad-space-3: .75rem;--ad-space-4: 1rem;--ad-space-6: 1.5rem;--ad-space-8: 2rem;--ad-space-12: 3rem;--ad-space-16: 4rem;--ad-space-24: 6rem;--ad-radius-sm: .25rem;--ad-radius-md: .5rem;--ad-radius-lg: .75rem;--ad-radius-full: 9999px;--ad-font-family-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;--ad-font-family-mono: "JetBrains Mono Variable", ui-monospace, "SF Mono", Menlo, monospace;--ad-font-size-xs: .75rem;--ad-font-size-sm: .875rem;--ad-font-size-md: 1rem;--ad-font-size-lg: 1.125rem;--ad-font-size-xl: 1.5rem;--ad-font-size-2xl: 2rem;--ad-line-height-tight: 1.25;--ad-line-height-snug: 1.4;--ad-line-height-normal: 1.55;--ad-font-weight-regular: 400;--ad-font-weight-medium: 500;--ad-font-weight-semibold: 600;--ad-duration-fast: .1s;--ad-duration-base: .16s;--ad-duration-slow: .24s;--ad-easing-out: cubic-bezier(.16, 1, .3, 1);--ad-size-control: 2rem;--ad-size-control-touch: 2.75rem;--ad-size-sidebar: 16rem;--ad-size-topbar: 3rem;--ad-size-content: 46rem}@media(prefers-color-scheme:dark){:root:not([data-theme]){color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}}[data-theme=dark]{color-scheme:dark;--ad-color-bg: #141311;--ad-color-surface: #1B1A18;--ad-color-surface-raised: #232220;--ad-color-surface-sunken: #100F0E;--ad-color-surface-hover: #2E2C29;--ad-color-text: #EDEBE7;--ad-color-text-muted: #A9A49A;--ad-color-text-on-accent: #0E1633;--ad-color-border: #2E2C29;--ad-color-border-strong: #7A756B;--ad-color-accent: #8EA4FF;--ad-color-accent-hover: #A9BAFF;--ad-color-accent-subtle: #1E2745;--ad-color-accent-text: #B3C2FF;--ad-color-agent: #E49BDC;--ad-color-agent-subtle: #3A1F37;--ad-color-agent-text: #F0B8E9;--ad-color-danger: #F2877D;--ad-color-danger-subtle: #3B1A17;--ad-color-danger-text: #F8A39B;--ad-color-warning: #E8B04A;--ad-color-warning-subtle: #3A2A0F;--ad-color-warning-text: #F0C677;--ad-color-success: #6FCF97;--ad-color-success-subtle: #14301F;--ad-color-success-text: #8BDBAC;--ad-color-focus: #A9BAFF;--ad-color-scrim: rgb(0 0 0 / .6);--ad-shadow-raised: 0 1px 2px rgb(0 0 0 / .3), 0 2px 16px rgb(0 0 0 / .3);--ad-shadow-floating: 0 2px 6px rgb(0 0 0 / .3), 0 8px 40px rgb(0 0 0 / .5)}@media(prefers-reduced-motion:reduce){:root{--ad-duration-fast: .01ms;--ad-duration-base: .01ms;--ad-duration-slow: .01ms}}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%}body{margin:0;background:var(--ad-color-bg);color:var(--ad-color-text);font-family:var(--ad-font-family-sans);font-size:var(--ad-font-size-sm);line-height:var(--ad-line-height-normal);font-feature-settings:"cv11","ss03";-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;line-height:var(--ad-line-height-tight);font-weight:var(--ad-font-weight-semibold);text-wrap:balance}h1{font-size:var(--ad-font-size-2xl)}h2{font-size:var(--ad-font-size-xl)}h3{font-size:var(--ad-font-size-lg)}h4{font-size:var(--ad-font-size-md)}p{margin:0;text-wrap:pretty}a{color:var(--ad-color-accent-text);text-underline-offset:.2em}code,kbd,pre{font-family:var(--ad-font-family-mono);font-size:.9em}:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:2px}::selection{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text)}.ad-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}.ad-skip-link{position:absolute;inset-block-start:var(--ad-space-2);inset-inline-start:var(--ad-space-2);z-index:100;padding:var(--ad-space-2) var(--ad-space-4);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);color:var(--ad-color-text);box-shadow:var(--ad-shadow-floating);transform:translateY(-200%)}.ad-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{--ad-control-h: var(--ad-size-control)}@media(pointer:coarse){:root{--ad-control-h: var(--ad-size-control-touch)}}.ad-button{--button-bg: var(--ad-color-surface);--button-bg-hover: var(--ad-color-surface-hover);--button-bg-active: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text);--button-border: var(--ad-color-border-strong);display:inline-flex;align-items:center;justify-content:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-4);border:1px solid var(--button-border);border-radius:var(--ad-radius-md);background:var(--button-bg);color:var(--button-fg);font:inherit;font-weight:var(--ad-font-weight-medium);line-height:1;white-space:nowrap;cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-button:hover{background:var(--button-bg-hover)}.ad-button:active{background:var(--button-bg-active)}.ad-button--sm{min-height:1.75rem;padding:0 var(--ad-space-3);font-size:var(--ad-font-size-xs)}@media(pointer:coarse){.ad-button--sm{min-height:var(--ad-control-h)}}.ad-button--primary{--button-bg: var(--ad-color-accent);--button-bg-hover: var(--ad-color-accent-hover);--button-bg-active: var(--ad-color-accent-hover);--button-fg: var(--ad-color-text-on-accent);--button-border: transparent}.ad-button--ghost{--button-bg: transparent;--button-border: transparent}.ad-button--danger{--button-bg-hover: var(--ad-color-danger-subtle);--button-bg-active: var(--ad-color-danger-subtle);--button-fg: var(--ad-color-danger-text);--button-border: var(--ad-color-danger)}.ad-button:disabled{--button-bg: var(--ad-color-surface-sunken);--button-bg-hover: var(--ad-color-surface-sunken);--button-fg: var(--ad-color-text-muted);--button-border: var(--ad-color-border);cursor:not-allowed}.ad-button[aria-busy=true]{cursor:progress}.ad-icon-button{width:var(--ad-control-h);padding:0}.ad-icon-button.ad-button--sm{width:1.75rem}@media(pointer:coarse){.ad-icon-button.ad-button--sm{width:var(--ad-control-h)}}.ad-spinner{width:1em;height:1em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:ad-spin .7s linear infinite}@keyframes ad-spin{to{transform:rotate(360deg)}}.ad-field{display:grid;gap:var(--ad-space-1)}.ad-field__label{font-weight:var(--ad-font-weight-medium)}.ad-field__hint{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-field__error{display:flex;align-items:flex-start;gap:var(--ad-space-1);color:var(--ad-color-danger-text);font-size:var(--ad-font-size-xs)}.ad-field__error svg{flex:none;margin-top:-.1em}.ad-input{width:100%;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:1px solid var(--ad-color-border-strong);border-radius:var(--ad-radius-md);background:var(--ad-color-surface);color:var(--ad-color-text);font:inherit}.ad-input::placeholder{color:var(--ad-color-text-muted);opacity:1}.ad-input:hover:not(:disabled){background:var(--ad-color-surface-sunken)}.ad-input[aria-invalid=true]{border-color:var(--ad-color-danger);box-shadow:inset 0 0 0 1px var(--ad-color-danger)}.ad-input:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);color:var(--ad-color-text-muted);cursor:not-allowed}.ad-textarea{min-height:5rem;padding:var(--ad-space-2) var(--ad-space-3);resize:vertical}.ad-select{position:relative;display:block}.ad-select select{appearance:none;padding-inline-end:var(--ad-space-8);cursor:pointer}.ad-select:after{content:"";position:absolute;inset-inline-end:var(--ad-space-3);inset-block-start:50%;width:.45rem;height:.45rem;border:solid var(--ad-color-text-muted);border-width:0 2px 2px 0;transform:translateY(-75%) rotate(45deg);pointer-events:none}.ad-toggle{display:grid;gap:var(--ad-space-1)}.ad-toggle__row{display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-control-h);cursor:pointer}.ad-checkbox,.ad-switch{appearance:none;flex:none;margin:0;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface);cursor:pointer;transition:background-color var(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:var(--ad-radius-sm)}.ad-checkbox:before{content:"";width:.75rem;height:.75rem;background:var(--ad-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(--ad-duration-fast) var(--ad-easing-out)}.ad-checkbox:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-checkbox:checked:before{transform:scale(1)}.ad-switch{position:relative;width:2.25rem;height:1.375rem;border-radius:var(--ad-radius-full);background:var(--ad-color-surface-sunken)}.ad-switch:before{content:"";position:absolute;inset-block-start:50%;inset-inline-start:.2rem;width:.875rem;height:.875rem;border-radius:var(--ad-radius-full);background:var(--ad-color-text-muted);transform:translateY(-50%);transition:inset-inline-start var(--ad-duration-base) var(--ad-easing-out)}.ad-switch:checked{background:var(--ad-color-accent);border-color:var(--ad-color-accent)}.ad-switch:checked:before{background:var(--ad-color-text-on-accent);inset-inline-start:calc(100% - 1.075rem)}.ad-checkbox:disabled,.ad-switch:disabled{background:var(--ad-color-surface-sunken);border-color:var(--ad-color-border);cursor:not-allowed}.ad-checkbox:disabled:before{background:var(--ad-color-text-muted)}.ad-switch:disabled:before{background:var(--ad-color-border)}@keyframes ad-fade-in{0%{opacity:0}}@keyframes ad-pop-in{0%{opacity:0;scale:.97}}.ad-overlay{position:fixed;z-index:50;inset:0;background:var(--ad-color-scrim);animation:ad-fade-in var(--ad-duration-base) var(--ad-easing-out)}.ad-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(--ad-space-6);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-lg);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-dialog__title{padding-inline-end:var(--ad-space-8);font-size:var(--ad-font-size-lg)}.ad-dialog__description{margin-top:var(--ad-space-2);color:var(--ad-color-text-muted)}.ad-dialog__body{margin-top:var(--ad-space-4)}.ad-dialog__footer{display:flex;justify-content:flex-end;gap:var(--ad-space-2);margin-top:var(--ad-space-6)}.ad-dialog__close{position:absolute;inset-block-start:var(--ad-space-3);inset-inline-end:var(--ad-space-3)}.ad-tooltip{z-index:60;max-width:16rem;padding:var(--ad-space-1) var(--ad-space-2);border-radius:var(--ad-radius-sm);background:var(--ad-color-text);color:var(--ad-color-bg);font-size:var(--ad-font-size-xs);animation:ad-fade-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu{z-index:60;min-width:11rem;padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating);animation:ad-pop-in var(--ad-duration-fast) var(--ad-easing-out)}.ad-menu__item{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-sm);color:var(--ad-color-text);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none}.ad-menu__item[data-highlighted]{background:var(--ad-color-surface-hover)}.ad-menu__item[data-highlighted]:focus-visible,.ad-menu__item:focus-visible{outline:2px solid var(--ad-color-focus);outline-offset:-2px}.ad-menu__item[data-disabled]{color:var(--ad-color-text-muted);cursor:not-allowed}.ad-menu__item--danger{color:var(--ad-color-danger-text)}.ad-menu__shortcut{margin-inline-start:auto;color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-menu__separator{height:1px;margin:var(--ad-space-1) 0;background:var(--ad-color-border)}.ad-toast-viewport{position:fixed;inset-block-end:var(--ad-space-4);inset-inline-end:var(--ad-space-4);z-index:70;display:grid;gap:var(--ad-space-2);width:min(24rem,calc(100vw - 2rem));margin:0;padding:0;list-style:none}.ad-toast{display:grid;grid-template-columns:auto 1fr auto;align-items:start;gap:var(--ad-space-3);padding:var(--ad-space-3) var(--ad-space-3) var(--ad-space-3) var(--ad-space-4);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface-raised);box-shadow:var(--ad-shadow-floating)}.ad-toast[data-state=open]{animation:ad-pop-in var(--ad-duration-base) var(--ad-easing-out)}.ad-toast__icon{margin-top:var(--ad-space-1)}.ad-toast--info .ad-toast__icon{color:var(--ad-color-accent)}.ad-toast--success .ad-toast__icon{color:var(--ad-color-success)}.ad-toast--warning .ad-toast__icon{color:var(--ad-color-warning)}.ad-toast--danger .ad-toast__icon{color:var(--ad-color-danger)}.ad-toast__title{font-weight:var(--ad-font-weight-medium)}.ad-toast__description{margin-top:var(--ad-space-1);color:var(--ad-color-text-muted)}.ad-tabs__list{display:flex;gap:var(--ad-space-1);border-bottom:1px solid var(--ad-color-border)}.ad-tabs__trigger{position:relative;min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border:0;background:transparent;color:var(--ad-color-text-muted);font:inherit;cursor:pointer}.ad-tabs__trigger:hover{color:var(--ad-color-text)}.ad-tabs__trigger[data-state=active]{color:var(--ad-color-text);font-weight:var(--ad-font-weight-semibold)}.ad-tabs__trigger[data-state=active]:after{content:"";position:absolute;inset:auto var(--ad-space-3) -1px;height:2px;background:var(--ad-color-accent)}.ad-tabs__panel{padding-top:var(--ad-space-4)}.ad-shell{display:grid;grid-template-columns:var(--ad-size-sidebar) minmax(0,1fr);grid-template-rows:auto 1fr;grid-template-areas:"sidebar topbar" "sidebar content";min-height:100vh}.ad-shell__sidebar{grid-area:sidebar;display:flex;flex-direction:column;gap:var(--ad-space-4);padding:var(--ad-space-4) var(--ad-space-3);border-inline-end:1px solid var(--ad-color-border);background:var(--ad-color-surface-sunken)}.ad-shell__brand{padding:0 var(--ad-space-3);font-weight:var(--ad-font-weight-semibold)}.ad-shell__topbar{grid-area:topbar;display:flex;align-items:center;gap:var(--ad-space-3);min-height:var(--ad-size-topbar);padding:0 var(--ad-space-6);border-bottom:1px solid var(--ad-color-border);background:var(--ad-color-bg)}.ad-shell__actions{display:flex;align-items:center;gap:var(--ad-space-4);margin-inline-start:auto}.ad-shell__content{grid-area:content;min-width:0;padding:var(--ad-space-8) var(--ad-space-6) var(--ad-space-24);outline:none}.ad-shell__menu{display:none}@media(max-width:47.99rem){.ad-shell{grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto 1fr;grid-template-areas:"topbar" "sidebar" "content"}.ad-shell__menu{display:inline-flex}.ad-shell__sidebar[data-open=false]{display:none}.ad-shell__sidebar{border-inline-end:0;border-bottom:1px solid var(--ad-color-border)}.ad-shell__topbar,.ad-shell__content{padding-inline:var(--ad-space-4)}}.ad-sidebar-nav{display:grid;gap:var(--ad-space-1);margin:0;padding:0;list-style:none}.ad-sidebar-nav__link{display:flex;align-items:center;gap:var(--ad-space-2);min-height:var(--ad-control-h);padding:0 var(--ad-space-3);border-radius:var(--ad-radius-md);color:var(--ad-color-text);text-decoration:none}.ad-sidebar-nav__link:hover{background:var(--ad-color-surface-hover)}.ad-sidebar-nav__link[aria-current=page]{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text);font-weight:var(--ad-font-weight-semibold)}.ad-toolbar{display:inline-flex;align-items:center;gap:var(--ad-space-1);padding:var(--ad-space-1);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface)}.ad-toolbar__separator{align-self:stretch;width:1px;margin:var(--ad-space-1);background:var(--ad-color-border)}.ad-button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--button-border);font-weight:var(--ad-font-weight-semibold);--button-bg: var(--ad-color-accent-subtle);--button-bg-hover: var(--ad-color-accent-subtle);--button-fg: var(--ad-color-accent-text);--button-border: var(--ad-color-accent)}.ad-empty{display:grid;justify-items:center;gap:var(--ad-space-3);padding:var(--ad-space-12) var(--ad-space-6);text-align:center}.ad-empty__title{font-size:var(--ad-font-size-lg)}.ad-empty__description{max-width:28rem;color:var(--ad-color-text-muted)}.ad-files{margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-file-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:var(--ad-space-4);min-height:3rem;padding:var(--ad-space-1) var(--ad-space-2);border-bottom:1px solid var(--ad-color-border)}.ad-file-row:hover{background:var(--ad-color-surface-sunken)}.ad-file-row__icon{display:inline-flex;color:var(--ad-color-text-muted)}.ad-file-row__name{min-height:1.5rem;overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-file-row__meta,.ad-file-row__time{display:inline-flex;align-items:center;gap:var(--ad-space-2);color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs)}.ad-file-row__actions{display:inline-flex}@media(max-width:47.99rem){.ad-file-row{grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"icon name actions" ". meta meta" ". time time"}.ad-file-row__icon{grid-area:icon}.ad-file-row__name{grid-area:name}.ad-file-row__meta{grid-area:meta}.ad-file-row__time{grid-area:time}.ad-file-row__actions{grid-area:actions}}.ad-avatar{display:inline-grid;flex:none;place-items:center;width:1.5rem;height:1.5rem;border:1px solid var(--ad-color-border-strong);background:var(--ad-color-surface-sunken);color:var(--ad-color-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1}.ad-avatar svg{width:.9rem;height:.9rem}.ad-avatar--person{border-radius:var(--ad-radius-full)}.ad-avatar--agent{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.ad-avatar--more{border-radius:var(--ad-radius-full);background:var(--ad-color-surface);color:var(--ad-color-text-muted)}.ad-chip{display:inline-flex;align-items:center;gap:var(--ad-space-2);max-width:100%;min-width:0}.ad-chip__name{overflow:hidden;color:var(--ad-color-text);font-weight:var(--ad-font-weight-medium);text-overflow:ellipsis;white-space:nowrap}.ad-chip__meta{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}.ad-pill{flex:none;padding:.125rem var(--ad-space-2);border:1px solid var(--ad-color-agent);border-radius:var(--ad-radius-full);color:var(--ad-color-agent-text);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-semibold);letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.ad-stack{display:inline-flex;align-items:center;gap:var(--ad-space-3)}.ad-stack__list{display:flex;margin:0;padding:0;list-style:none}.ad-stack__list li+li{margin-inline-start:-.25rem}.ad-stack__list .ad-avatar{width:1.75rem;height:1.75rem;box-shadow:0 0 0 2px var(--ad-color-bg)}.ad-stack__summary{color:var(--ad-color-text-muted);font-size:var(--ad-font-size-xs);white-space:nowrap}@media(forced-colors:active){.ad-checkbox:checked,.ad-switch:checked{background:Highlight;border-color:Highlight}.ad-checkbox:before{background:HighlightText}.ad-switch{background:Canvas;border-color:ButtonText}.ad-switch:before{background:ButtonText}.ad-switch:checked:before{background:HighlightText}.ad-button[aria-busy=true]{border-style:dashed}.ad-button[aria-pressed=true]{background:Highlight;color:HighlightText;border-color:Highlight}.ad-tabs__trigger[data-state=active]:after{background:Highlight}.ad-menu__item[data-highlighted]{outline:2px solid Highlight;outline-offset:-2px}}.ad-dialog:has(.ad-share){width:min(36rem,calc(100vw - 2rem))}.ad-share{display:grid;gap:var(--ad-space-4)}.ad-share__invite{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:start;gap:var(--ad-space-3)}.ad-share__invite .ad-field:first-child{grid-column:1 / -1}.ad-share__invite .ad-button{align-self:end}.ad-share__sent{color:var(--ad-color-success-text);font-size:var(--ad-font-size-xs)}.ad-share__people{display:grid;margin:0;padding:0;list-style:none;border-top:1px solid var(--ad-color-border)}.ad-share__people li{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-3);padding:var(--ad-space-2) 0;border-bottom:1px solid var(--ad-color-border)}.ad-share__people .ad-field{min-width:9rem}.ad-share__controls{display:inline-flex;align-items:center;gap:var(--ad-space-2)}.ad-share__owner{padding-inline:var(--ad-space-3);color:var(--ad-color-text-muted)}.ad-share__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--ad-space-3)}.ad-share__copy{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:var(--ad-space-3)}@media(max-width:30rem){.ad-share__invite,.ad-share__row,.ad-share__copy{grid-template-columns:1fr}}.ad-cursor{position:relative;display:inline-block;width:0;vertical-align:baseline;-webkit-user-select:none;user-select:none}.ad-cursor__caret{position:absolute;inset-block:-.2em -.15em;inset-inline-start:0;width:2px;background:var(--ad-color-accent)}.ad-cursor__tag{position:absolute;inset-block-end:1.45em;inset-inline-start:0;padding:.0625rem var(--ad-space-2);border:1px solid var(--ad-color-accent);border-radius:var(--ad-radius-sm) var(--ad-radius-sm) var(--ad-radius-sm) 0;background:var(--ad-color-accent);color:var(--ad-color-text-on-accent);font-size:var(--ad-font-size-xs);font-weight:var(--ad-font-weight-medium);line-height:1.3;white-space:nowrap}.ad-cursor--agent .ad-cursor__caret{background:var(--ad-color-agent)}.ad-cursor--agent .ad-cursor__tag{border-color:var(--ad-color-agent);border-radius:var(--ad-radius-sm);background:var(--ad-color-agent-subtle);color:var(--ad-color-agent-text)}.drive-main{max-width:72rem}.drive-muted{color:var(--ad-color-text-muted)}.drive-status{display:flex;align-items:center;gap:var(--ad-space-2);color:var(--ad-color-text-muted)}.drive-signin{display:grid;gap:var(--ad-space-4);max-width:24rem}.drive-form{display:grid;gap:var(--ad-space-4)}.drive-form__actions{display:flex;justify-content:flex-end;gap:var(--ad-space-2)}.drive-drop{min-height:60vh;border:2px dashed transparent;border-radius:var(--ad-radius-md);padding:var(--ad-space-2)}.drive-drop--over{border-color:var(--ad-color-accent);background:var(--ad-color-accent-subtle)}.drive-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-4);flex-wrap:wrap;margin-bottom:var(--ad-space-4)}.drive-bar h1{margin:0;font-size:var(--ad-font-size-xl);overflow-wrap:anywhere}.drive-crumbs ol{display:flex;flex-wrap:wrap;gap:var(--ad-space-2);list-style:none;margin:0 0 var(--ad-space-2);padding:0;color:var(--ad-color-text-muted)}.drive-crumbs li+li:before{content:"/";margin-right:var(--ad-space-2)}.drive-crumbs [aria-current=page]{color:var(--ad-color-text);font-weight:var(--ad-font-weight-semibold)}.drive-split{display:grid;grid-template-columns:14rem minmax(0,1fr);gap:var(--ad-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(--ad-space-4)}.drive-tree a{display:flex;align-items:center;gap:var(--ad-space-2);padding:var(--ad-space-1) var(--ad-space-2);border-radius:var(--ad-radius-sm);color:var(--ad-color-text);text-decoration:none}.drive-tree a:hover{background:var(--ad-color-surface-hover)}.drive-tree a[aria-current=page]{background:var(--ad-color-accent-subtle);color:var(--ad-color-accent-text);font-weight:var(--ad-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(--ad-space-4);list-style:none;margin:0;padding:0}.drive-card{position:relative;display:grid;gap:var(--ad-space-2);padding:var(--ad-space-4);border:1px solid var(--ad-color-border);border-radius:var(--ad-radius-md);background:var(--ad-color-surface)}.drive-card__icon svg{width:2rem;height:2rem}.drive-card__name{overflow-wrap:anywhere;font-weight:var(--ad-font-weight-medium);color:var(--ad-color-text)}.drive-card__meta{font-size:var(--ad-font-size-sm);color:var(--ad-color-text-muted)}.drive-card__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--ad-space-2)}.drive-root{display:grid;grid-template-columns:12rem minmax(0,1fr);gap:var(--ad-space-6);color:var(--ad-color-text)}@media(max-width:48rem){.drive-root{grid-template-columns:1fr}}
|