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.
- package/README.md +118 -109
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/components/Modal.d.ts +10 -0
- package/dist/client/components/Modal.d.ts.map +1 -1
- package/dist/client/components/Modal.js +36 -15
- package/dist/client/components/Modal.js.map +1 -1
- package/dist/client/components/PopupPanel.d.ts +9 -0
- package/dist/client/components/PopupPanel.d.ts.map +1 -1
- package/dist/client/components/PopupPanel.js +11 -10
- package/dist/client/components/PopupPanel.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/overlay/Menu.d.ts +30 -0
- package/dist/client/overlay/Menu.d.ts.map +1 -0
- package/dist/client/overlay/Menu.js +322 -0
- package/dist/client/overlay/Menu.js.map +1 -0
- package/dist/client/overlay/Overlay.d.ts +11 -0
- package/dist/client/overlay/Overlay.d.ts.map +1 -0
- package/dist/client/overlay/Overlay.js +402 -0
- package/dist/client/overlay/Overlay.js.map +1 -0
- package/dist/client/overlay/OverlayProvider.d.ts +27 -0
- package/dist/client/overlay/OverlayProvider.d.ts.map +1 -0
- package/dist/client/overlay/OverlayProvider.js +79 -0
- package/dist/client/overlay/OverlayProvider.js.map +1 -0
- package/dist/client/overlay/Surface.d.ts +22 -0
- package/dist/client/overlay/Surface.d.ts.map +1 -0
- package/dist/client/overlay/Surface.js +64 -0
- package/dist/client/overlay/Surface.js.map +1 -0
- package/dist/client/overlay/index.d.ts +14 -0
- package/dist/client/overlay/index.d.ts.map +1 -0
- package/dist/client/overlay/index.js +13 -0
- package/dist/client/overlay/index.js.map +1 -0
- package/dist/client/overlay/position.d.ts +15 -0
- package/dist/client/overlay/position.d.ts.map +1 -0
- package/dist/client/overlay/position.js +199 -0
- package/dist/client/overlay/position.js.map +1 -0
- package/dist/client/overlay/presets.d.ts +32 -0
- package/dist/client/overlay/presets.d.ts.map +1 -0
- package/dist/client/overlay/presets.js +165 -0
- package/dist/client/overlay/presets.js.map +1 -0
- package/dist/client/overlay/types.d.ts +489 -0
- package/dist/client/overlay/types.d.ts.map +1 -0
- package/dist/client/overlay/types.js +30 -0
- package/dist/client/overlay/types.js.map +1 -0
- package/dist/markdown/client/MarkdownEditor.d.ts +6 -0
- package/dist/markdown/client/MarkdownEditor.d.ts.map +1 -1
- package/dist/markdown/client/MarkdownEditor.js.map +1 -1
- package/dist/markdown/client/MarkdownEditorInternal.d.ts.map +1 -1
- package/dist/markdown/client/MarkdownEditorInternal.js +2 -2
- package/dist/markdown/client/MarkdownEditorInternal.js.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.d.ts +18 -11
- package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.d.ts.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.js +270 -313
- package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.js.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.d.ts +24 -8
- package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.d.ts.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.js +256 -251
- package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.js.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.d.ts +1 -1
- package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.d.ts.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.js +29 -42
- package/dist/markdown/client/ProseMirrorEditor/SlashCommandMenu.js.map +1 -1
- package/dist/markdown/client/ProseMirrorEditor/schema.d.ts +2 -2
- package/dist/markdown/client/SelectionActionBar.d.ts +23 -0
- package/dist/markdown/client/SelectionActionBar.d.ts.map +1 -0
- package/dist/markdown/client/SelectionActionBar.js +154 -0
- package/dist/markdown/client/SelectionActionBar.js.map +1 -0
- package/dist/markdown/client/index.d.ts +4 -0
- package/dist/markdown/client/index.d.ts.map +1 -1
- package/dist/markdown/client/index.js +2 -0
- package/dist/markdown/client/index.js.map +1 -1
- package/dist/markdown/client/markdownComponents.d.ts +9 -6
- package/dist/markdown/client/markdownComponents.d.ts.map +1 -1
- package/dist/markdown/client/markdownComponents.js +2 -2
- package/dist/markdown/client/markdownComponents.js.map +1 -1
- package/dist/markdown/shared/SelectionAction.d.ts +48 -0
- package/dist/markdown/shared/SelectionAction.d.ts.map +1 -0
- package/dist/markdown/shared/SelectionAction.js +36 -0
- package/dist/markdown/shared/SelectionAction.js.map +1 -0
- package/package.json +2 -1
- package/src/cli/version.ts +1 -1
- package/src/client/components/Modal.tsx +74 -41
- package/src/client/components/PopupPanel.tsx +14 -12
- package/src/client/index.ts +2 -0
- package/src/client/overlay/Menu.tsx +649 -0
- package/src/client/overlay/Overlay.tsx +484 -0
- package/src/client/overlay/OverlayProvider.tsx +107 -0
- package/src/client/overlay/Surface.tsx +106 -0
- package/src/client/overlay/index.ts +63 -0
- package/src/client/overlay/position.ts +249 -0
- package/src/client/overlay/presets.tsx +354 -0
- package/src/client/overlay/types.ts +535 -0
- package/src/markdown/client/MarkdownEditor.tsx +6 -0
- package/src/markdown/client/MarkdownEditorInternal.tsx +2 -0
- package/src/markdown/client/ProseMirrorEditor/EditorContextMenu.tsx +311 -575
- package/src/markdown/client/ProseMirrorEditor/FloatingToolbar.tsx +308 -426
- package/src/markdown/client/ProseMirrorEditor/SlashCommandMenu.tsx +51 -52
- package/src/markdown/client/SelectionActionBar.tsx +223 -0
- package/src/markdown/client/index.ts +10 -0
- package/src/markdown/client/markdownComponents.tsx +12 -5
- 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
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
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
|
|
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
|
-
##
|
|
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`
|
|
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
|
|
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
|
|
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.990";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -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,
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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,
|
|
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;
|
|
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("
|
|
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":";
|
|
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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/client/index.js
CHANGED
|
@@ -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';
|
package/dist/client/index.js.map
CHANGED
|
@@ -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"}
|