ugly-app 0.1.988 → 0.1.990

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.
Files changed (104) hide show
  1. package/README.md +118 -109
  2. package/dist/cli/version.d.ts +1 -1
  3. package/dist/cli/version.js +1 -1
  4. package/dist/client/components/Modal.d.ts +10 -0
  5. package/dist/client/components/Modal.d.ts.map +1 -1
  6. package/dist/client/components/Modal.js +36 -15
  7. package/dist/client/components/Modal.js.map +1 -1
  8. package/dist/client/components/PopupPanel.d.ts +9 -0
  9. package/dist/client/components/PopupPanel.d.ts.map +1 -1
  10. package/dist/client/components/PopupPanel.js +11 -10
  11. package/dist/client/components/PopupPanel.js.map +1 -1
  12. package/dist/client/index.d.ts +1 -0
  13. package/dist/client/index.d.ts.map +1 -1
  14. package/dist/client/index.js +2 -0
  15. package/dist/client/index.js.map +1 -1
  16. package/dist/client/overlay/Menu.d.ts +30 -0
  17. package/dist/client/overlay/Menu.d.ts.map +1 -0
  18. package/dist/client/overlay/Menu.js +322 -0
  19. package/dist/client/overlay/Menu.js.map +1 -0
  20. package/dist/client/overlay/Overlay.d.ts +11 -0
  21. package/dist/client/overlay/Overlay.d.ts.map +1 -0
  22. package/dist/client/overlay/Overlay.js +402 -0
  23. package/dist/client/overlay/Overlay.js.map +1 -0
  24. package/dist/client/overlay/OverlayProvider.d.ts +27 -0
  25. package/dist/client/overlay/OverlayProvider.d.ts.map +1 -0
  26. package/dist/client/overlay/OverlayProvider.js +79 -0
  27. package/dist/client/overlay/OverlayProvider.js.map +1 -0
  28. package/dist/client/overlay/Surface.d.ts +22 -0
  29. package/dist/client/overlay/Surface.d.ts.map +1 -0
  30. package/dist/client/overlay/Surface.js +64 -0
  31. package/dist/client/overlay/Surface.js.map +1 -0
  32. package/dist/client/overlay/index.d.ts +14 -0
  33. package/dist/client/overlay/index.d.ts.map +1 -0
  34. package/dist/client/overlay/index.js +13 -0
  35. package/dist/client/overlay/index.js.map +1 -0
  36. package/dist/client/overlay/position.d.ts +15 -0
  37. package/dist/client/overlay/position.d.ts.map +1 -0
  38. package/dist/client/overlay/position.js +199 -0
  39. package/dist/client/overlay/position.js.map +1 -0
  40. package/dist/client/overlay/presets.d.ts +32 -0
  41. package/dist/client/overlay/presets.d.ts.map +1 -0
  42. package/dist/client/overlay/presets.js +165 -0
  43. package/dist/client/overlay/presets.js.map +1 -0
  44. package/dist/client/overlay/types.d.ts +489 -0
  45. package/dist/client/overlay/types.d.ts.map +1 -0
  46. package/dist/client/overlay/types.js +30 -0
  47. package/dist/client/overlay/types.js.map +1 -0
  48. package/dist/markdown/client/MarkdownEditor.d.ts +6 -0
  49. package/dist/markdown/client/MarkdownEditor.d.ts.map +1 -1
  50. package/dist/markdown/client/MarkdownEditor.js.map +1 -1
  51. package/dist/markdown/client/MarkdownEditorInternal.d.ts.map +1 -1
  52. package/dist/markdown/client/MarkdownEditorInternal.js +2 -2
  53. package/dist/markdown/client/MarkdownEditorInternal.js.map +1 -1
  54. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.d.ts +18 -11
  55. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.d.ts.map +1 -1
  56. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.js +270 -313
  57. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.js.map +1 -1
  58. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.d.ts +24 -8
  59. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.d.ts.map +1 -1
  60. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.js +256 -251
  61. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.js.map +1 -1
  62. package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.d.ts +1 -1
  63. package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.d.ts.map +1 -1
  64. package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.js +29 -42
  65. package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.js.map +1 -1
  66. package/dist/markdown/client/ProseMirrorEditor/schema.d.ts +2 -2
  67. package/dist/markdown/client/SelectionActionBar.d.ts +23 -0
  68. package/dist/markdown/client/SelectionActionBar.d.ts.map +1 -0
  69. package/dist/markdown/client/SelectionActionBar.js +154 -0
  70. package/dist/markdown/client/SelectionActionBar.js.map +1 -0
  71. package/dist/markdown/client/index.d.ts +4 -0
  72. package/dist/markdown/client/index.d.ts.map +1 -1
  73. package/dist/markdown/client/index.js +2 -0
  74. package/dist/markdown/client/index.js.map +1 -1
  75. package/dist/markdown/client/markdownComponents.d.ts +9 -6
  76. package/dist/markdown/client/markdownComponents.d.ts.map +1 -1
  77. package/dist/markdown/client/markdownComponents.js +2 -2
  78. package/dist/markdown/client/markdownComponents.js.map +1 -1
  79. package/dist/markdown/shared/SelectionAction.d.ts +48 -0
  80. package/dist/markdown/shared/SelectionAction.d.ts.map +1 -0
  81. package/dist/markdown/shared/SelectionAction.js +36 -0
  82. package/dist/markdown/shared/SelectionAction.js.map +1 -0
  83. package/package.json +2 -1
  84. package/src/cli/version.ts +1 -1
  85. package/src/client/components/Modal.tsx +74 -41
  86. package/src/client/components/PopupPanel.tsx +14 -12
  87. package/src/client/index.ts +2 -0
  88. package/src/client/overlay/Menu.tsx +649 -0
  89. package/src/client/overlay/Overlay.tsx +484 -0
  90. package/src/client/overlay/OverlayProvider.tsx +107 -0
  91. package/src/client/overlay/Surface.tsx +106 -0
  92. package/src/client/overlay/index.ts +63 -0
  93. package/src/client/overlay/position.ts +249 -0
  94. package/src/client/overlay/presets.tsx +354 -0
  95. package/src/client/overlay/types.ts +535 -0
  96. package/src/markdown/client/MarkdownEditor.tsx +6 -0
  97. package/src/markdown/client/MarkdownEditorInternal.tsx +2 -0
  98. package/src/markdown/client/ProseMirrorEditor/EditorContextMenu.tsx +311 -575
  99. package/src/markdown/client/ProseMirrorEditor/FloatingToolbar.tsx +308 -426
  100. package/src/markdown/client/ProseMirrorEditor/SlashCommandMenu.tsx +51 -52
  101. package/src/markdown/client/SelectionActionBar.tsx +223 -0
  102. package/src/markdown/client/index.ts +10 -0
  103. package/src/markdown/client/markdownComponents.tsx +12 -5
  104. package/src/markdown/shared/SelectionAction.ts +62 -0
package/README.md CHANGED
@@ -1,15 +1,14 @@
1
1
  # ugly-app
2
2
 
3
- A full-stack TypeScript framework for shipping production web apps. Scaffold
4
- with `npx ugly-app init my-app` and you get an opinionated Node + React +
5
- Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc
6
- subscriptions, built-in auth, AI generation, storage, workers, cron, and a CLI
7
- for every workflow.
3
+ A full-stack TypeScript framework for shipping production web apps: Node +
4
+ React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc
5
+ subscriptions, built-in auth, AI generation, storage, cron / workers, and a
6
+ CLI for every workflow.
8
7
 
9
- ugly-app is designed to run against [ugly.bot](https://ugly.bot), which
10
- provides auth, infra (Postgres, Qdrant, NATS, S3-compatible object storage),
11
- AI provider keys, push, email, and deployment. Your app talks to all of it
12
- through the project's dev tunnel and its `UGLY_BOT_TOKEN`.
8
+ ugly-app runs against [ugly.bot](https://ugly.bot), which provides auth,
9
+ infra (Postgres, Qdrant, NATS, S3-compatible object storage), AI provider
10
+ keys, email, push, and deployment. Your app talks to all of it through the
11
+ project's dev tunnel and its `UGLY_BOT_TOKEN`.
13
12
 
14
13
  ```bash
15
14
  npx ugly-app init my-app
@@ -21,8 +20,8 @@ npm run dev
21
20
 
22
21
  | Import path | Contents |
23
22
  |-------------|----------|
24
- | `ugly-app` (a.k.a. `ugly-app/server`) | Server: `createApp`, `TypedDB`, auth, AI clients, storage, NATS, workers. |
25
- | `ugly-app/shared` | Cross-tier: `defineRequests`, `defineCollections`, `definePage`, `defineWorkers`, Zod, experiments. |
23
+ | `ugly-app` (a.k.a. `ugly-app/server`) | Server: `createApp`, `TypedDB`, auth, AI clients, storage, NATS. |
24
+ | `ugly-app/shared` | Cross-tier: `defineRequests`, `defineCollections`, `definePage`, `defineWorkers`, Zod, experiments, model catalogs. |
26
25
  | `ugly-app/client` | React: `bootstrapApp`, `createRouter`, `lazyPage` / `lazyPageLoader`, `AppProvider` / `useApp`, `SimpleScrollView`, animations, audio, AI helpers. |
27
26
  | `ugly-app/server/adapter/workers` | Cloudflare Workers entry (Hono router + Durable Objects + Neon HTTP driver + R2). |
28
27
  | `ugly-app/server/ssr` | SSR renderer used by the Workers adapter. |
@@ -35,7 +34,7 @@ Additional per-feature bundles: `conversation`, `character`, `collab`,
35
34
 
36
35
  ---
37
36
 
38
- ## Server — `createApp()`
37
+ ## 1. Server — `createApp()`
39
38
 
40
39
  `createApp` is the single server entry. It owns Express, the WebSocket
41
40
  server, the typed DB, and the RPC dispatcher.
@@ -108,7 +107,7 @@ for in-process invocation of any registered handler.
108
107
 
109
108
  | Member | Description |
110
109
  |--------|-------------|
111
- | `start(port?)` | Start the server (templates use 4321). |
110
+ | `start(port?)` | Start the server. Framework default is `3000`; templates pass `PORT` (default `4321`). |
112
111
  | `db` | `TypedDB<Map>` — map inferred from your collections + framework built-ins. |
113
112
  | `httpServer` | The underlying Node `http.Server`. |
114
113
  | `wss` | The main `WebSocketServer` (path set via `setWsPath`, default `/rpc`). |
@@ -180,7 +179,6 @@ override the framework's defaults. Rate-limited handlers are marked below.
180
179
  | `shareLink` | Mint a `https://ugly.bot/l/<code>` short link with OG metadata. Rate-limited 60/60s. |
181
180
  | `feedbackReportCreateNoAuth` | Public, same-origin feedback endpoint used by browser telemetry. Rate-limited 10/60s. |
182
181
  | `feedbackReportResolve` | Mark an in-app feedback report resolved/declined. Admin-gated. |
183
- | `submitFeedbackBot` | Feedback path used by the bot-swarm test tooling. |
184
182
  | `errorLogCaptureNoAuth` | Public error-log capture. |
185
183
  | `perfSnapshotCaptureNoAuth` | Public perf snapshot capture. Rate-limited 60/60s. |
186
184
  | `adminGetPerfLogs` | Admin-only perf log query used by the CLI `perf:*` commands. |
@@ -192,98 +190,12 @@ Add per-endpoint rate limits on your own handlers with
192
190
 
193
191
  ---
194
192
 
195
- ## Shared API definitions
196
-
197
- `shared/` is consumed by both server and client. Keep all Zod schemas,
198
- types, collections, and route declarations here.
199
-
200
- ### Requests (`shared/api.ts`)
201
-
202
- ```ts
203
- import { authReq, defineRequests, req, z } from 'ugly-app/shared';
204
-
205
- export const requests = defineRequests({
206
- // Public — handler signature: (userId: string | null, input) => Promise<output>
207
- getPublicData: req({
208
- input: z.object({ id: z.string() }),
209
- output: z.object({ data: z.string() }),
210
- }),
211
-
212
- // Authenticated — 401 enforced automatically, userId guaranteed string
213
- getMe: authReq({
214
- input: z.object({}),
215
- output: z.object({ userId: z.string(), email: z.string().optional() }),
216
- }),
217
-
218
- // Per-endpoint rate limiting — enforced before the handler runs
219
- submitFeedback: authReq({
220
- input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),
221
- output: z.object({ id: z.string() }),
222
- rateLimit: { max: 20, window: 60 },
223
- }),
224
- });
225
- ```
226
-
227
- Every request is reachable as **both** `socket.request(name, input)`
228
- (WebSocket) and `POST /api/:name { input }` (HTTP). `z` is re-exported from
229
- Zod for convenience.
230
-
231
- ### Collections (`shared/collections.ts`)
232
-
233
- ```ts
234
- import { defineCollections, InferDocType, neon } from 'ugly-app/shared';
235
- import { z } from 'zod';
236
-
237
- export const TodoSchema = z.object({
238
- userId: z.string(),
239
- text: z.string(),
240
- done: z.boolean(),
241
- });
242
- export type Todo = InferDocType<typeof TodoSchema>;
243
-
244
- export const collections = defineCollections({
245
- todo: {
246
- schema: TodoSchema,
247
- meta: {
248
- db: neon, // REQUIRED — `neon` (Postgres) or `d1` (SQLite / D1)
249
- cache: true, // or { ttlMs: 60_000 }
250
- trackable: true,
251
- public: false,
252
- cascadeFrom: null,
253
- },
254
- },
255
- });
256
- ```
257
-
258
- **`CollectionMeta`:**
259
- - `db` — **required.** `neon` (Postgres) or `d1` (Cloudflare D1 / SQLite). Both handles are exported from `ugly-app/shared`. Omitting it is a compile error and runtime throw.
260
- - `cache` — `true` / `false` / `{ ttlMs }`. When enabled, `getDoc` / `getByIds` read from an LRU cache; writes invalidate it.
261
- - `trackable` — enables real-time `trackDoc` / `trackDocs` via change-stream NATS notifications.
262
- - `public` — allow unauthenticated client reads.
263
- - `cascadeFrom` — parent collection: when the parent doc is deleted, docs in this collection are cascade-deleted.
264
- - `trackKeys?` — fields usable as NATS routing keys for scoped `trackDocs` subscriptions.
265
- - `getter?(ids)` — batch resolver for collections with no local table (e.g. `userPublic` resolves via ugly.bot).
266
- - `skipReadValidation?` — opt out of per-row zod validation on reads for very hot collections. Writes are always validated. Global kill-switch: `UGLY_DB_VALIDATE_READS=0`.
267
- - `search?: { fields, language? }` — full-text index over the named JSONB paths (Neon: Postgres FTS; D1: SQLite FTS5, ranked by bm25).
268
- - `vector?: { dimensions, metric?, filterable? }` — ANN index. Vector supplied out-of-band at write time (`setDoc(c, doc, { vec })`) — never stored in the doc JSON. Query with `getDocs(c, filter, { near })`.
269
-
270
- All documents extend `DBObject`: `{ _id, version, created, updated }`.
271
- Use `dbDefaults()` to stamp `version` / `created` / `updated` on inserts.
272
- **Always generate `_id` with `nanoid()`** — never `crypto.randomUUID()`,
273
- `Date.now()`, or `Math.random()` (see `CLAUDE.md`).
274
-
275
- After schema changes, run `npm run db:schema-gen` then `npm run db:migrate`.
276
- The app refuses to start when drift is detected (set `SCHEMA_CHECK_SKIP=true`
277
- only as a last resort).
278
-
279
- ---
280
-
281
- ## Routing
193
+ ## 2. Routing
282
194
 
283
195
  Route definitions live in `shared/pages.ts`; the client-side router is
284
196
  created by `createRouter({ pages, allPages?, ssrPages? })`.
285
197
 
286
- ### `definePage` / `definePages` (`shared/pages.ts`)
198
+ ### `definePage` / `definePages`
287
199
 
288
200
  ```ts
289
201
  import { definePage, definePages } from 'ugly-app/shared';
@@ -452,10 +364,10 @@ virtualized lists with scroll-position persistence, use the richer
452
364
 
453
365
  ---
454
366
 
455
- ## Client — `bootstrapApp()`
367
+ ## 3. Client — `bootstrapApp()` and `useApp()`
456
368
 
457
- The recommended entry point. Handles auth detection, socket creation,
458
- background account-sync with ugly.bot, and provider wiring.
369
+ The recommended client entry point. Handles auth detection, socket
370
+ creation, background account-sync with ugly.bot, and provider wiring.
459
371
 
460
372
  ```tsx
461
373
  // client/main.tsx
@@ -562,7 +474,7 @@ For pure HTTP (no WebSocket), use
562
474
 
563
475
  ---
564
476
 
565
- ## Auth
477
+ ## 4. Auth flow
566
478
 
567
479
  ugly-app uses HttpOnly cookies and server-side JWT injection — no
568
480
  `localStorage`, no client-side token handling.
@@ -631,12 +543,91 @@ configurator.setAuth({
631
543
 
632
544
  ---
633
545
 
634
- ## Database — `TypedDB`
546
+ ## 5. Database — `TypedDB`
635
547
 
636
548
  Access via `app.db`. All methods accept a `CollectionDef` (from
637
549
  `defineCollections()`) or, on the `raw*` / `getQuery*` variants, a plain
638
550
  collection name string.
639
551
 
552
+ ### Requests (`shared/api.ts`)
553
+
554
+ ```ts
555
+ import { authReq, defineRequests, req, z } from 'ugly-app/shared';
556
+
557
+ export const requests = defineRequests({
558
+ // Public — handler signature: (userId: string | null, input) => Promise<output>
559
+ getPublicData: req({
560
+ input: z.object({ id: z.string() }),
561
+ output: z.object({ data: z.string() }),
562
+ }),
563
+
564
+ // Authenticated — 401 enforced automatically, userId guaranteed string
565
+ getMe: authReq({
566
+ input: z.object({}),
567
+ output: z.object({ userId: z.string(), email: z.string().optional() }),
568
+ }),
569
+
570
+ // Per-endpoint rate limiting — enforced before the handler runs
571
+ submitFeedback: authReq({
572
+ input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),
573
+ output: z.object({ id: z.string() }),
574
+ rateLimit: { max: 20, window: 60 },
575
+ }),
576
+ });
577
+ ```
578
+
579
+ Every request is reachable as **both** `socket.request(name, input)`
580
+ (WebSocket) and `POST /api/:name { input }` (HTTP). `z` is re-exported from
581
+ Zod for convenience.
582
+
583
+ ### Collections (`shared/collections.ts`)
584
+
585
+ ```ts
586
+ import { defineCollections, InferDocType, neon } from 'ugly-app/shared';
587
+ import { z } from 'zod';
588
+
589
+ export const TodoSchema = z.object({
590
+ userId: z.string(),
591
+ text: z.string(),
592
+ done: z.boolean(),
593
+ });
594
+ export type Todo = InferDocType<typeof TodoSchema>;
595
+
596
+ export const collections = defineCollections({
597
+ todo: {
598
+ schema: TodoSchema,
599
+ meta: {
600
+ db: neon, // REQUIRED — `neon` (Postgres) or `d1` (SQLite / D1)
601
+ cache: true, // or { ttlMs: 60_000 }
602
+ trackable: true,
603
+ public: false,
604
+ cascadeFrom: null,
605
+ },
606
+ },
607
+ });
608
+ ```
609
+
610
+ **`CollectionMeta`:**
611
+ - `db` — **required.** `neon` (Postgres) or `d1` (Cloudflare D1 / SQLite). Both handles are exported from `ugly-app/shared`. Omitting it is a compile error and runtime throw.
612
+ - `cache` — `true` / `false` / `{ ttlMs }`. When enabled, `getDoc` / `getByIds` read from an LRU cache; writes invalidate it.
613
+ - `trackable` — enables real-time `trackDoc` / `trackDocs` via change-stream NATS notifications.
614
+ - `public` — allow unauthenticated client reads.
615
+ - `cascadeFrom` — parent collection: when the parent doc is deleted, docs in this collection are cascade-deleted.
616
+ - `trackKeys?` — fields usable as NATS routing keys for scoped `trackDocs` subscriptions.
617
+ - `getter?(ids)` — batch resolver for collections with no local table (e.g. `userPublic` resolves via ugly.bot).
618
+ - `skipReadValidation?` — opt out of per-row zod validation on reads for very hot collections. Writes are always validated. Global kill-switch: `UGLY_DB_VALIDATE_READS=0`.
619
+ - `search?: { fields, language? }` — full-text index over the named JSONB paths (Neon: Postgres FTS; D1: SQLite FTS5, ranked by bm25).
620
+ - `vector?: { dimensions, metric?, filterable? }` — ANN index. Vector supplied out-of-band at write time (`setDoc(c, doc, { vec })`) — never stored in the doc JSON. Query with `getDocs(c, filter, { near })`.
621
+
622
+ All documents extend `DBObject`: `{ _id, version, created, updated }`.
623
+ Use `dbDefaults()` to stamp `version` / `created` / `updated` on inserts.
624
+ **Always generate `_id` with `nanoid()`** — never `crypto.randomUUID()`,
625
+ `Date.now()`, or `Math.random()` (see `CLAUDE.md`).
626
+
627
+ After schema changes, run `npm run db:schema-gen` then `npm run db:migrate`.
628
+ The app refuses to start when drift is detected (set `SCHEMA_CHECK_SKIP=true`
629
+ only as a last resort).
630
+
640
631
  ### Writing
641
632
 
642
633
  ```ts
@@ -745,7 +736,7 @@ Imports available from `ugly-app`:
745
736
 
746
737
  ---
747
738
 
748
- ## AI providers
739
+ ## 6. AI providers
749
740
 
750
741
  AI calls are proxied through ugly.bot — your app never holds a provider
751
742
  key. Pass `UGLY_BOT_TOKEN` in the environment and the framework handles
@@ -758,6 +749,7 @@ import { createTextGen } from 'ugly-app';
758
749
  const textGen = createTextGen(userId);
759
750
 
760
751
  const text = await textGen.generate(messages, { model: 'gemini_2_5_flash' });
752
+ const obj = await textGen.generateJson(mySchema, messages, { model: 'gemini_2_5_flash' });
761
753
  ```
762
754
 
763
755
  Or invoke the framework `textGen` request through the RPC pipeline — its
@@ -794,6 +786,7 @@ const url = await imageGen.generate('A red panda eating noodles', { model: 'flux
794
786
  import { createEmbeddingClient, cosineSimilarity } from 'ugly-app';
795
787
  const embeddings = createEmbeddingClient();
796
788
  const vector = await embeddings.embed('hello world');
789
+ const many = await embeddings.embedBatch(['a', 'b', 'c']);
797
790
  const sim = cosineSimilarity(vectorA, vectorB);
798
791
  ```
799
792
 
@@ -838,9 +831,25 @@ const { speak, stop: stopTTS } = useTTS(uglyBotSocket);
838
831
  `uglyBotSocket` is the `UglyBotSocket` on `useApp()`; it opens a direct
839
832
  WebSocket to the platform.
840
833
 
834
+ ### Sharing / share links
835
+
836
+ ```ts
837
+ import { shareLink } from 'ugly-app'; // server
838
+ const url = await shareLink({
839
+ target: `/article/${id}`, // app route or absolute URL
840
+ og: { title, description, image }, // OG card metadata
841
+ requireAuth: false, // true → logged-out web users hit login
842
+ }); // → https://ugly.bot/l/<code>
843
+ ```
844
+
845
+ Minting is idempotent (deterministic code) and dedupes within a run.
846
+ Never hand-build outbound URLs (`${PUBLIC_URL}/article/${id}`) in emails,
847
+ push, or share flows — always go through `shareLink()`. See the "sharing
848
+ links" rule in `CLAUDE.md`.
849
+
841
850
  ---
842
851
 
843
- ## Storage
852
+ ## 7. Storage
844
853
 
845
854
  S3-compatible. Two logical buckets:
846
855
 
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.988";
1
+ export declare const CLI_VERSION = "0.1.990";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.988";
2
+ export const CLI_VERSION = "0.1.990";
3
3
  //# sourceMappingURL=version.js.map
@@ -6,5 +6,15 @@ export interface ModalProps {
6
6
  'className'?: string;
7
7
  'data-id'?: string;
8
8
  }
9
+ /**
10
+ * A centred, modal dialog.
11
+ *
12
+ * Built on the shared overlay tier, which is a behaviour change as well as a
13
+ * cosmetic one. It used to hardcode `bg-white dark:bg-gray-800` and so looked
14
+ * identical in every app regardless of theme; it now derives from the app's own
15
+ * tokens like every other surface. It also gains what it never had: focus
16
+ * return on close, a dismissal path that is not Escape-only, and the shared
17
+ * enter/exit transition.
18
+ */
9
19
  export declare function Modal({ title, children, onClose, className, 'data-id': dataId, }: ModalProps): ReactElement;
10
20
  //# sourceMappingURL=Modal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/client/components/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrE,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAc,EACd,SAAS,EAAE,MAAM,GAClB,EAAE,UAAU,GAAG,YAAY,CA8C3B"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/client/components/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKnE,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAc,EACd,SAAS,EAAE,MAAM,GAClB,EAAE,UAAU,GAAG,YAAY,CAmE3B"}
@@ -1,19 +1,40 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect } from 'react';
3
- import { Z } from './zIndex.js';
2
+ import { useMemo } from 'react';
3
+ import { Overlay } from '../overlay/Overlay.js';
4
+ import { Surface } from '../overlay/Surface.js';
5
+ /**
6
+ * A centred, modal dialog.
7
+ *
8
+ * Built on the shared overlay tier, which is a behaviour change as well as a
9
+ * cosmetic one. It used to hardcode `bg-white dark:bg-gray-800` and so looked
10
+ * identical in every app regardless of theme; it now derives from the app's own
11
+ * tokens like every other surface. It also gains what it never had: focus
12
+ * return on close, a dismissal path that is not Escape-only, and the shared
13
+ * enter/exit transition.
14
+ */
4
15
  export function Modal({ title, children, onClose, className = '', 'data-id': dataId, }) {
5
- // Close on Escape key
6
- useEffect(() => {
7
- const handler = (e) => {
8
- if (e.key === 'Escape') {
9
- onClose();
10
- }
11
- };
12
- document.addEventListener('keydown', handler);
13
- return () => {
14
- document.removeEventListener('keydown', handler);
15
- };
16
- }, [onClose]);
17
- return (_jsxs("div", { role: "dialog", "aria-modal": "true", "data-id": dataId, className: "fixed inset-0 flex items-center justify-center", style: { zIndex: Z.modal }, children: [_jsx("div", { className: "absolute inset-0 bg-black/50", onClick: onClose }), _jsxs("div", { className: `relative bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-lg w-full mx-4 max-h-[90vh] overflow-y-auto ${className}`, children: [title && (_jsxs("div", { className: "flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700", children: [_jsx("h2", { className: "text-lg font-semibold text-gray-900 dark:text-gray-100", children: title }), _jsx("button", { onClick: onClose, "aria-label": "Close dialog", className: "text-gray-400 hover:text-gray-600 dark:hover:text-gray-200", children: "\u2715" })] })), _jsx("div", { className: "p-4", children: children })] })] }));
16
+ const anchor = useMemo(() => ({ kind: 'viewport' }), []);
17
+ return (_jsx(Overlay, { open: true, anchor: anchor, layer: "modal", modal: true, reposition: "follow", dismissOn: { outside: true, escape: true }, onDismiss: onClose, role: "dialog", ...(title ? { 'aria-label': title } : {}), ...(dataId ? { 'data-id': dataId } : {}), children: (pos) => (_jsx(Surface, { variant: "dialog", style: {
18
+ width: 'min(32rem, calc(100vw - 2rem))',
19
+ maxHeight: pos.available.height,
20
+ overflowY: 'auto',
21
+ padding: 0,
22
+ }, children: _jsxs("div", { className: className, children: [title ? (_jsxs("div", { style: {
23
+ display: 'flex',
24
+ alignItems: 'center',
25
+ justifyContent: 'space-between',
26
+ gap: 12,
27
+ padding: '14px 16px',
28
+ borderBottom: '1px solid var(--app-border, rgba(0,0,0,.12))',
29
+ }, children: [_jsx("h2", { style: { margin: 0, fontSize: 17, fontWeight: 600 }, children: title }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close dialog", "data-id": "modal-close", style: {
30
+ border: 0,
31
+ background: 'none',
32
+ cursor: 'pointer',
33
+ color: 'inherit',
34
+ opacity: 0.6,
35
+ fontSize: 15,
36
+ lineHeight: 1,
37
+ padding: 4,
38
+ }, children: "\u2715" })] })) : null, _jsx("div", { style: { padding: 16 }, children: children })] }) })) }));
18
39
  }
19
40
  //# sourceMappingURL=Modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/client/components/Modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAqC,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAUhC,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,GAAG,EAAE,EACd,SAAS,EAAE,MAAM,GACN;IACX,sBAAsB;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,gBACF,MAAM,aACR,MAAM,EACf,SAAS,EAAC,gDAAgD,EAC1D,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,aAG1B,cAAK,SAAS,EAAC,8BAA8B,EAAC,OAAO,EAAE,OAAO,GAAI,EAElE,eACE,SAAS,EAAE,6GAA6G,SAAS,EAAE,aAElI,KAAK,IAAI,CACR,eAAK,SAAS,EAAC,qFAAqF,aAClG,aAAI,SAAS,EAAC,wDAAwD,YACnE,KAAK,GACH,EACL,iBACE,OAAO,EAAE,OAAO,gBACL,cAAc,EACzB,SAAS,EAAC,4DAA4D,uBAG/D,IACL,CACP,EACD,cAAK,SAAS,EAAC,KAAK,YAAE,QAAQ,GAAO,IACjC,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/client/components/Modal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAqC,MAAM,OAAO,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAWhD;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,GAAG,EAAE,EACd,SAAS,EAAE,MAAM,GACN;IACX,MAAM,MAAM,GAAG,OAAO,CAAgB,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAExE,OAAO,CACL,KAAC,OAAO,IACN,IAAI,QACJ,MAAM,EAAE,MAAM,EACd,KAAK,EAAC,OAAO,EACb,KAAK,QACL,UAAU,EAAC,QAAQ,EACnB,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAC1C,SAAS,EAAE,OAAO,EAClB,IAAI,EAAC,QAAQ,KACT,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACtC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAExC,CAAC,GAAG,EAAE,EAAE,CAAC,CACR,KAAC,OAAO,IACN,OAAO,EAAC,QAAQ,EAChB,KAAK,EAAE;gBACL,KAAK,EAAE,gCAAgC;gBACvC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM;gBAC/B,SAAS,EAAE,MAAM;gBACjB,OAAO,EAAE,CAAC;aACX,YAED,eAAK,SAAS,EAAE,SAAS,aACtB,KAAK,CAAC,CAAC,CAAC,CACP,eACE,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,eAAe;4BAC/B,GAAG,EAAE,EAAE;4BACP,OAAO,EAAE,WAAW;4BACpB,YAAY,EAAE,8CAA8C;yBAC7D,aAED,aAAI,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YACpD,KAAK,GACH,EACL,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,gBACL,cAAc,aACjB,aAAa,EACrB,KAAK,EAAE;oCACL,MAAM,EAAE,CAAC;oCACT,UAAU,EAAE,MAAM;oCAClB,MAAM,EAAE,SAAS;oCACjB,KAAK,EAAE,SAAS;oCAChB,OAAO,EAAE,GAAG;oCACZ,QAAQ,EAAE,EAAE;oCACZ,UAAU,EAAE,CAAC;oCACb,OAAO,EAAE,CAAC;iCACX,uBAGM,IACL,CACP,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAG,QAAQ,GAAO,IACzC,GACE,CACX,GACO,CACX,CAAC;AACJ,CAAC"}
@@ -5,5 +5,14 @@ export interface PopupPanelProps {
5
5
  dynamic?: boolean;
6
6
  style?: CSSProperties;
7
7
  }
8
+ /**
9
+ * A raised panel for popup content.
10
+ *
11
+ * Now a `Surface`, so it shares the one shadow ramp and radius with every other
12
+ * overlay instead of carrying its own glassmorphic treatment — the divergence
13
+ * this library exists to end. It stays a plain box: it does no positioning and
14
+ * no dismissal, because its callers place it themselves inside
15
+ * `router.openPopup`.
16
+ */
8
17
  export declare function PopupPanel({ children, dynamic, style, }: PopupPanelProps): ReactElement;
9
18
  //# sourceMappingURL=PopupPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PopupPanel.d.ts","sourceRoot":"","sources":["../../../src/client/components/PopupPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAe,EACf,KAAK,GACN,EAAE,eAAe,GAAG,YAAY,CAiBhC"}
1
+ {"version":3,"file":"PopupPanel.d.ts","sourceRoot":"","sources":["../../../src/client/components/PopupPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAe,EACf,KAAK,GACN,EAAE,eAAe,GAAG,YAAY,CAShC"}
@@ -1,14 +1,15 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Surface } from '../overlay/Surface.js';
3
+ /**
4
+ * A raised panel for popup content.
5
+ *
6
+ * Now a `Surface`, so it shares the one shadow ramp and radius with every other
7
+ * overlay instead of carrying its own glassmorphic treatment — the divergence
8
+ * this library exists to end. It stays a plain box: it does no positioning and
9
+ * no dismissal, because its callers place it themselves inside
10
+ * `router.openPopup`.
11
+ */
2
12
  export function PopupPanel({ children, dynamic = false, style, }) {
3
- return (_jsx("div", { style: {
4
- borderRadius: 16,
5
- background: 'var(--app-main, #fff)',
6
- backdropFilter: 'blur(12px)',
7
- WebkitBackdropFilter: 'blur(12px)',
8
- border: '1px solid rgba(255,255,255,0.2)',
9
- boxShadow: '0 20px 25px rgba(0,0,0,0.15)',
10
- flex: dynamic ? undefined : 1,
11
- ...style,
12
- }, children: children }));
13
+ return (_jsx(Surface, { variant: "sheet", style: { flex: dynamic ? undefined : 1, ...style }, children: children }));
13
14
  }
14
15
  //# sourceMappingURL=PopupPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PopupPanel.js","sourceRoot":"","sources":["../../../src/client/components/PopupPanel.tsx"],"names":[],"mappings":";AASA,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,GAAG,KAAK,EACf,KAAK,GACW;IAChB,OAAO,CACL,cACE,KAAK,EAAE;YACL,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,uBAAuB;YACnC,cAAc,EAAE,YAAY;YAC5B,oBAAoB,EAAE,YAAY;YAClC,MAAM,EAAE,iCAAiC;YACzC,SAAS,EAAE,8BAA8B;YACzC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC7B,GAAG,KAAK;SACT,YAEA,QAAQ,GACL,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"PopupPanel.js","sourceRoot":"","sources":["../../../src/client/components/PopupPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAShD;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,GAAG,KAAK,EACf,KAAK,GACW;IAChB,OAAO,CACL,KAAC,OAAO,IACN,OAAO,EAAC,OAAO,EACf,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,YAEjD,QAAQ,GACD,CACX,CAAC;AACJ,CAAC"}
@@ -44,6 +44,7 @@ export { uploadBlob, promoteBlob, downscaleImage } from './uploadBlob.js';
44
44
  export { crossOriginProps } from './components/crossOriginProps.js';
45
45
  export type { UploadedBlob, UploadBlobOptions } from './uploadBlob.js';
46
46
  export * from './components/index.js';
47
+ export * from './overlay/index.js';
47
48
  export { createHttpClient } from './createHttpClient.js';
48
49
  export type { AppHttpClient, CreateHttpClientOptions, } from './createHttpClient.js';
49
50
  export { createSocket } from './createSocket.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,8 @@ export { uploadBlob, promoteBlob, downscaleImage } from './uploadBlob.js';
30
30
  // see components/crossOriginProps.ts.
31
31
  export { crossOriginProps } from './components/crossOriginProps.js';
32
32
  export * from './components/index.js';
33
+ // Overlay controls — tooltips, dropdowns, context menus, popovers.
34
+ export * from './overlay/index.js';
33
35
  export { createHttpClient } from './createHttpClient.js';
34
36
  export { createSocket } from './createSocket.js';
35
37
  export { shareLink } from './shareLinkClient.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Menu — the node model rendered.
3
+ *
4
+ * Handles both layouts, because they are the same thing turned on its side: a
5
+ * stacked menu (ugly.bot's app menu, a right-click menu) and an inline one (the
6
+ * markdown editor's selection toolbar). Sharing the renderer is what keeps
7
+ * their theming, dismissal and keyboard behaviour identical, but a few things
8
+ * MUST differ by layout — see `Separator`, `checked` and the width bound.
9
+ */
10
+ import { type ReactElement } from 'react';
11
+ import { useSurfaceTokens } from './Surface.js';
12
+ import { useOverlayDefaults } from './OverlayProvider.js';
13
+ import type { DismissReason, MenuAction, MenuNode, MenuProps } from './types.js';
14
+ export declare const isSeparator: (n: MenuNode) => n is {
15
+ separator: true;
16
+ };
17
+ export declare const isHeading: (n: MenuNode) => n is Extract<MenuNode, {
18
+ heading: true;
19
+ }>;
20
+ export declare const isGroup: (n: MenuNode) => n is Extract<MenuNode, {
21
+ group: true;
22
+ }>;
23
+ export declare const isCustom: (n: MenuNode) => n is Extract<MenuNode, {
24
+ render: unknown;
25
+ }>;
26
+ export declare const isAction: (n: MenuNode) => n is MenuAction;
27
+ export declare function Menu(props: MenuProps): ReactElement | null;
28
+ export type { DismissReason };
29
+ export { useSurfaceTokens, useOverlayDefaults };
30
+ //# sourceMappingURL=Menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/client/overlay/Menu.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAQL,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAW,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,EAGV,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,WAAW,GAAI,GAAG,QAAQ,KAAG,CAAC,IAAI;IAAE,SAAS,EAAE,IAAI,CAAA;CAC9C,CAAC;AACnB,eAAO,MAAM,SAAS,GACpB,GAAG,QAAQ,KACV,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAmB,CAAC;AAC/D,eAAO,MAAM,OAAO,GAAI,GAAG,QAAQ,KAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,CAC9D,CAAC;AACf,eAAO,MAAM,QAAQ,GACnB,GAAG,QAAQ,KACV,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAkB,CAAC;AAChE,eAAO,MAAM,QAAQ,GAAI,GAAG,QAAQ,KAAG,CAAC,IAAI,UACqB,CAAC;AA4gBlE,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,YAAY,GAAG,IAAI,CA2E1D;AAED,YAAY,EAAE,aAAa,EAAE,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC"}