ugly-app 0.1.74 → 0.1.76
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/MIGRATION.md +128 -0
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/client/animation/animatedValue.d.ts +5 -0
- package/dist/client/animation/animatedValue.d.ts.map +1 -1
- package/dist/client/animation/animatedValue.js +19 -1
- package/dist/client/animation/animatedValue.js.map +1 -1
- package/dist/client/animation/useAnimatedTransition.d.ts +92 -0
- package/dist/client/animation/useAnimatedTransition.d.ts.map +1 -0
- package/dist/client/animation/useAnimatedTransition.js +235 -0
- package/dist/client/animation/useAnimatedTransition.js.map +1 -0
- package/dist/client/animation/useScrollAnimation.d.ts +32 -0
- package/dist/client/animation/useScrollAnimation.d.ts.map +1 -0
- package/dist/client/animation/useScrollAnimation.js +82 -0
- package/dist/client/animation/useScrollAnimation.js.map +1 -0
- package/dist/client/components/Alert.d.ts +9 -0
- package/dist/client/components/Alert.d.ts.map +1 -0
- package/dist/client/components/Alert.js +60 -0
- package/dist/client/components/Alert.js.map +1 -0
- package/dist/client/components/AnimatedInput.d.ts +129 -0
- package/dist/client/components/AnimatedInput.d.ts.map +1 -0
- package/dist/client/components/AnimatedInput.js +264 -0
- package/dist/client/components/AnimatedInput.js.map +1 -0
- package/dist/client/components/AnimatedList.d.ts +32 -0
- package/dist/client/components/AnimatedList.d.ts.map +1 -0
- package/dist/client/components/AnimatedList.js +140 -0
- package/dist/client/components/AnimatedList.js.map +1 -0
- package/dist/client/components/AppScrollViewProvider.d.ts +35 -0
- package/dist/client/components/AppScrollViewProvider.d.ts.map +1 -0
- package/dist/client/components/AppScrollViewProvider.js +36 -0
- package/dist/client/components/AppScrollViewProvider.js.map +1 -0
- package/dist/client/components/CardStack.d.ts +48 -0
- package/dist/client/components/CardStack.d.ts.map +1 -0
- package/dist/client/components/CardStack.js +717 -0
- package/dist/client/components/CardStack.js.map +1 -0
- package/dist/client/components/CelebrationOverlay.d.ts +9 -0
- package/dist/client/components/CelebrationOverlay.d.ts.map +1 -0
- package/dist/client/components/CelebrationOverlay.js +91 -0
- package/dist/client/components/CelebrationOverlay.js.map +1 -0
- package/dist/client/components/Confetti.d.ts +11 -0
- package/dist/client/components/Confetti.d.ts.map +1 -0
- package/dist/client/components/Confetti.js +181 -0
- package/dist/client/components/Confetti.js.map +1 -0
- package/dist/client/components/DatePicker.d.ts +8 -0
- package/dist/client/components/DatePicker.d.ts.map +1 -0
- package/dist/client/components/DatePicker.js +26 -0
- package/dist/client/components/DatePicker.js.map +1 -0
- package/dist/client/components/DateRangePicker.d.ts +23 -0
- package/dist/client/components/DateRangePicker.d.ts.map +1 -0
- package/dist/client/components/DateRangePicker.js +217 -0
- package/dist/client/components/DateRangePicker.js.map +1 -0
- package/dist/client/components/DateTimePicker.d.ts +8 -0
- package/dist/client/components/DateTimePicker.d.ts.map +1 -0
- package/dist/client/components/DateTimePicker.js +36 -0
- package/dist/client/components/DateTimePicker.js.map +1 -0
- package/dist/client/components/DrawingCanvas.d.ts +16 -0
- package/dist/client/components/DrawingCanvas.d.ts.map +1 -0
- package/dist/client/components/DrawingCanvas.js +308 -0
- package/dist/client/components/DrawingCanvas.js.map +1 -0
- package/dist/client/components/FlatList.d.ts +46 -0
- package/dist/client/components/FlatList.d.ts.map +1 -0
- package/dist/client/components/FlatList.js +203 -0
- package/dist/client/components/FlatList.js.map +1 -0
- package/dist/client/components/LayoutSize.d.ts +25 -0
- package/dist/client/components/LayoutSize.d.ts.map +1 -0
- package/dist/client/components/LayoutSize.js +107 -0
- package/dist/client/components/LayoutSize.js.map +1 -0
- package/dist/client/components/Loading.d.ts +10 -0
- package/dist/client/components/Loading.d.ts.map +1 -0
- package/dist/client/components/Loading.js +58 -0
- package/dist/client/components/Loading.js.map +1 -0
- package/dist/client/components/Pager.d.ts +17 -0
- package/dist/client/components/Pager.d.ts.map +1 -0
- package/dist/client/components/Pager.js +250 -0
- package/dist/client/components/Pager.js.map +1 -0
- package/dist/client/components/ResponsiveGrid.d.ts +15 -0
- package/dist/client/components/ResponsiveGrid.d.ts.map +1 -0
- package/dist/client/components/ResponsiveGrid.js +38 -0
- package/dist/client/components/ResponsiveGrid.js.map +1 -0
- package/dist/client/components/ScrollAnimatedView.d.ts +17 -0
- package/dist/client/components/ScrollAnimatedView.d.ts.map +1 -0
- package/dist/client/components/ScrollAnimatedView.js +26 -0
- package/dist/client/components/ScrollAnimatedView.js.map +1 -0
- package/dist/client/components/ScrollDownArrow.d.ts +4 -0
- package/dist/client/components/ScrollDownArrow.d.ts.map +1 -0
- package/dist/client/components/ScrollDownArrow.js +43 -0
- package/dist/client/components/ScrollDownArrow.js.map +1 -0
- package/dist/client/components/ScrollIndicator.d.ts +2 -0
- package/dist/client/components/ScrollIndicator.d.ts.map +1 -0
- package/dist/client/components/ScrollIndicator.js +69 -0
- package/dist/client/components/ScrollIndicator.js.map +1 -0
- package/dist/client/components/ScrollView.d.ts +18 -5
- package/dist/client/components/ScrollView.d.ts.map +1 -1
- package/dist/client/components/ScrollView.js +167 -5
- package/dist/client/components/ScrollView.js.map +1 -1
- package/dist/client/components/SelectView.d.ts +37 -0
- package/dist/client/components/SelectView.d.ts.map +1 -0
- package/dist/client/components/SelectView.js +170 -0
- package/dist/client/components/SelectView.js.map +1 -0
- package/dist/client/components/SimpleScrollView.d.ts +15 -0
- package/dist/client/components/SimpleScrollView.d.ts.map +1 -0
- package/dist/client/components/SimpleScrollView.js +66 -0
- package/dist/client/components/SimpleScrollView.js.map +1 -0
- package/dist/client/components/TabPicker.d.ts +41 -0
- package/dist/client/components/TabPicker.d.ts.map +1 -0
- package/dist/client/components/TabPicker.js +185 -0
- package/dist/client/components/TabPicker.js.map +1 -0
- package/dist/client/components/ValidatedTextInput.d.ts +40 -0
- package/dist/client/components/ValidatedTextInput.d.ts.map +1 -0
- package/dist/client/components/ValidatedTextInput.js +335 -0
- package/dist/client/components/ValidatedTextInput.js.map +1 -0
- package/dist/client/components/View.d.ts +3 -2
- package/dist/client/components/View.d.ts.map +1 -1
- package/dist/client/components/View.js +2 -2
- package/dist/client/components/View.js.map +1 -1
- package/dist/client/components/WheelPicker.d.ts +10 -0
- package/dist/client/components/WheelPicker.d.ts.map +1 -0
- package/dist/client/components/WheelPicker.js +124 -0
- package/dist/client/components/WheelPicker.js.map +1 -0
- package/dist/client/components/WizardView.d.ts +51 -0
- package/dist/client/components/WizardView.d.ts.map +1 -0
- package/dist/client/components/WizardView.js +171 -0
- package/dist/client/components/WizardView.js.map +1 -0
- package/dist/client/components/ZoomPanPinch.d.ts +26 -0
- package/dist/client/components/ZoomPanPinch.d.ts.map +1 -0
- package/dist/client/components/ZoomPanPinch.js +290 -0
- package/dist/client/components/ZoomPanPinch.js.map +1 -0
- package/dist/client/components/index.d.ts +43 -0
- package/dist/client/components/index.d.ts.map +1 -1
- package/dist/client/components/index.js +26 -0
- package/dist/client/components/index.js.map +1 -1
- package/dist/client/createSocket.d.ts +8 -4
- package/dist/client/createSocket.d.ts.map +1 -1
- package/dist/client/createSocket.js +10 -2
- package/dist/client/createSocket.js.map +1 -1
- package/dist/client/index.d.ts +5 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/server/DB.d.ts +15 -25
- package/dist/server/DB.d.ts.map +1 -1
- package/dist/server/DB.js +117 -143
- package/dist/server/DB.js.map +1 -1
- package/dist/server/NatsStore.d.ts +22 -0
- package/dist/server/NatsStore.d.ts.map +1 -1
- package/dist/server/NatsStore.js +71 -1
- package/dist/server/NatsStore.js.map +1 -1
- package/dist/server/Socket.d.ts.map +1 -1
- package/dist/server/Socket.js +91 -27
- package/dist/server/Socket.js.map +1 -1
- package/dist/shared/DB.d.ts +29 -46
- package/dist/shared/DB.d.ts.map +1 -1
- package/dist/shared/DB.js +7 -7
- package/dist/shared/DB.js.map +1 -1
- package/package.json +6 -1
- package/templates/gitignore +1 -0
- package/templates/shared/collections.ts +24 -27
package/MIGRATION.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Migration Guide
|
|
2
|
+
|
|
3
|
+
## trackKeys Subscriptions + parentId Removal
|
|
4
|
+
|
|
5
|
+
### What changed
|
|
6
|
+
|
|
7
|
+
- `meta.parent` renamed to `meta.cascadeFrom` on `CollectionMeta` / `CollectionDef`
|
|
8
|
+
- `meta.trackKeys` added to `CollectionMeta` for scoped real-time subscriptions
|
|
9
|
+
- All `parentId` parameters removed from `TypedDB` methods
|
|
10
|
+
- `trackDocs` wire protocol changed: `filter` replaced by `keys` + `where`
|
|
11
|
+
- Client `socket.trackDocs` signature changed
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
### 1. Rename `parent` → `cascadeFrom` in collection definitions
|
|
16
|
+
|
|
17
|
+
**Before:**
|
|
18
|
+
```ts
|
|
19
|
+
message: {
|
|
20
|
+
type: {} as Message,
|
|
21
|
+
meta: { cache: false, trackable: true, public: true, parent: 'chat' },
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**After:**
|
|
26
|
+
```ts
|
|
27
|
+
message: {
|
|
28
|
+
type: {} as Message,
|
|
29
|
+
meta: { cache: false, trackable: true, public: true, cascadeFrom: 'chat', trackKeys: ['chatId'] },
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
### 2. Remove `parentId` from all `TypedDB` calls
|
|
36
|
+
|
|
37
|
+
**Before:**
|
|
38
|
+
```ts
|
|
39
|
+
await ctx.db.setDoc(collections.message, msg, { parentId: chatId });
|
|
40
|
+
await ctx.db.setDocFields(collections.message, msgId, fields, { parentId: chatId });
|
|
41
|
+
await ctx.db.getDocs(collections.message, filter, { parentId: chatId });
|
|
42
|
+
await ctx.db.deleteDoc(collections.message, msgId, { parentId: chatId });
|
|
43
|
+
await ctx.db.deleteQuery(collections.message, match, { parentId: chatId });
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**After:**
|
|
47
|
+
```ts
|
|
48
|
+
await ctx.db.setDoc(collections.message, msg);
|
|
49
|
+
await ctx.db.setDocFields(collections.message, msgId, fields);
|
|
50
|
+
await ctx.db.getDocs(collections.message, filter);
|
|
51
|
+
await ctx.db.deleteDoc(collections.message, msgId);
|
|
52
|
+
await ctx.db.deleteQuery(collections.message, match);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Because IDs are globally unique GUIDs, no scoping is needed.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### 3. Update `socket.trackDocs` on the client
|
|
60
|
+
|
|
61
|
+
**Before:**
|
|
62
|
+
```ts
|
|
63
|
+
const unsub = socket.trackDocs(
|
|
64
|
+
'message',
|
|
65
|
+
{ chatId: '1234' },
|
|
66
|
+
(messages) => setMessages(messages),
|
|
67
|
+
{ sort: { created: -1 }, limit: 50 },
|
|
68
|
+
);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**After:**
|
|
72
|
+
```ts
|
|
73
|
+
const unsub = socket.trackDocs(
|
|
74
|
+
collections.message,
|
|
75
|
+
{ keys: { chatId: '1234' }, sort: { created: -1 }, limit: 50 },
|
|
76
|
+
(messages) => setMessages(messages),
|
|
77
|
+
);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For collections without `trackKeys`, pass `keys: {}` and use `where` for filters:
|
|
81
|
+
```ts
|
|
82
|
+
socket.trackDocs(collections.post, { keys: {}, where: { published: true } }, (posts) => setPosts(posts));
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
### 4. Wire protocol change (client/server must deploy together)
|
|
88
|
+
|
|
89
|
+
The WebSocket `trackDocs` message shape changed:
|
|
90
|
+
|
|
91
|
+
| Field | Before | After |
|
|
92
|
+
|-------|--------|-------|
|
|
93
|
+
| `filter` | `Record<string, unknown>` (equality) | removed |
|
|
94
|
+
| `keys` | — | `Record<string, string>` (trackKeys values) |
|
|
95
|
+
| `where` | — | `Record<string, unknown>` (extra equality filters) |
|
|
96
|
+
|
|
97
|
+
This is a **breaking wire change**. Deploy client and server together.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### 5. `trackKeys` immutability constraint
|
|
102
|
+
|
|
103
|
+
Fields listed in `trackKeys` are assumed immutable after document creation. If a
|
|
104
|
+
`trackKeys` field value changes after insert, subscribers on the old key channel
|
|
105
|
+
will not be notified. Design your data model so `trackKeys` fields never change
|
|
106
|
+
(e.g. `chatId` on a message is set at creation and never updated).
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### 6. Data migration for existing apps using `parentId`
|
|
111
|
+
|
|
112
|
+
If your app previously used `parentId` in `setDoc`/`deleteDoc` calls, your MongoDB
|
|
113
|
+
documents may have compound `_id` values in the format `parentId:childId`. These
|
|
114
|
+
documents are no longer addressable by ugly-app's TypedDB after this change.
|
|
115
|
+
|
|
116
|
+
**Before deploying server changes**, run a migration to convert compound `_id` values
|
|
117
|
+
to plain leaf IDs. Write a migration script that:
|
|
118
|
+
1. Iterates each child collection (those that had `meta.parent` set)
|
|
119
|
+
2. Finds documents whose `_id` contains `:` (compound format: `parentId:childId`)
|
|
120
|
+
3. Inserts a copy with `_id` set to the leaf segment only (`childId`)
|
|
121
|
+
4. Deletes the original compound-ID document
|
|
122
|
+
|
|
123
|
+
Run the migration against staging first, then production.
|
|
124
|
+
|
|
125
|
+
Deployment order:
|
|
126
|
+
1. Deploy ugly-app framework update
|
|
127
|
+
2. Run the `_id` migration against your MongoDB
|
|
128
|
+
3. Deploy your app's server code changes (removing `parentId` from TypedDB calls)
|
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.76";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -38,4 +38,9 @@ export interface AnimatedValueRef {
|
|
|
38
38
|
}
|
|
39
39
|
export declare function createAnimatedValue(initial: number): AnimatedValueRef;
|
|
40
40
|
export declare function useAnimatedValue(initial: number): AnimatedValueRef;
|
|
41
|
+
/**
|
|
42
|
+
* Hook to track an animated value and trigger re-renders.
|
|
43
|
+
* Use this when you need React to re-render on animation updates.
|
|
44
|
+
*/
|
|
45
|
+
export declare function useAnimatedValueTracker(animatedValue: AnimatedValueRef): number;
|
|
41
46
|
//# sourceMappingURL=animatedValue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animatedValue.d.ts","sourceRoot":"","sources":["../../../src/client/animation/animatedValue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAEnD,eAAO,MAAM,eAAe;yBACd,MAAM;0BACL,MAAM;yBACP,MAAM;4BACH,MAAM;+BAEH,MAAM;+BAEN,MAAM;+BAEN,MAAM;uBAEd,MAAM;CACiC,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxD,2DAA2D;IAC3D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,kDAAkD;IAClD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mCAAmC;IACnC,IAAI,IAAI,IAAI,CAAC;IACb,yDAAyD;IACzD,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC1D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA6GrE;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAWlE"}
|
|
1
|
+
{"version":3,"file":"animatedValue.d.ts","sourceRoot":"","sources":["../../../src/client/animation/animatedValue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAEnD,eAAO,MAAM,eAAe;yBACd,MAAM;0BACL,MAAM;yBACP,MAAM;4BACH,MAAM;+BAEH,MAAM;+BAEN,MAAM;+BAEN,MAAM;uBAEd,MAAM;CACiC,CAAC;AAEpD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACxD,2DAA2D;IAC3D,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,kDAAkD;IAClD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mCAAmC;IACnC,IAAI,IAAI,IAAI,CAAC;IACb,yDAAyD;IACzD,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC1D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CA6GrE;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAWlE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,gBAAgB,GAAG,MAAM,CAe/E"}
|
|
@@ -107,7 +107,7 @@ export function createAnimatedValue(initial) {
|
|
|
107
107
|
};
|
|
108
108
|
return ref;
|
|
109
109
|
}
|
|
110
|
-
import { useEffect, useRef } from 'react';
|
|
110
|
+
import { useEffect, useRef, useState } from 'react';
|
|
111
111
|
export function useAnimatedValue(initial) {
|
|
112
112
|
const ref = useRef(null);
|
|
113
113
|
if (!ref.current) {
|
|
@@ -120,4 +120,22 @@ export function useAnimatedValue(initial) {
|
|
|
120
120
|
}, []);
|
|
121
121
|
return ref.current;
|
|
122
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Hook to track an animated value and trigger re-renders.
|
|
125
|
+
* Use this when you need React to re-render on animation updates.
|
|
126
|
+
*/
|
|
127
|
+
export function useAnimatedValueTracker(animatedValue) {
|
|
128
|
+
const [, forceUpdate] = useState({});
|
|
129
|
+
const valueRef = useRef(animatedValue.current);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
const unsubscribe = animatedValue.subscribe((value) => {
|
|
132
|
+
if (value !== valueRef.current) {
|
|
133
|
+
valueRef.current = value;
|
|
134
|
+
forceUpdate({});
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return unsubscribe;
|
|
138
|
+
}, [animatedValue]);
|
|
139
|
+
return valueRef.current;
|
|
140
|
+
}
|
|
123
141
|
//# sourceMappingURL=animatedValue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animatedValue.js","sourceRoot":"","sources":["../../../src/client/animation/animatedValue.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"animatedValue.js","sourceRoot":"","sources":["../../../src/client/animation/animatedValue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { AnimatedValueRef, AnimConfig } from './animatedValue.js';
|
|
2
|
+
export type TransitionPhase = 'enter' | 'update' | 'leave';
|
|
3
|
+
export interface TransitionItem<T> {
|
|
4
|
+
/** The original item */
|
|
5
|
+
item: T;
|
|
6
|
+
/** Unique key for this item */
|
|
7
|
+
key: string | number;
|
|
8
|
+
/** Current animation phase */
|
|
9
|
+
phase: TransitionPhase;
|
|
10
|
+
/** Animated value (0 = exited, 1 = entered) */
|
|
11
|
+
value: AnimatedValueRef;
|
|
12
|
+
}
|
|
13
|
+
export interface TransitionConfig extends AnimConfig {
|
|
14
|
+
/** Delay before starting enter animation (ms) */
|
|
15
|
+
enterDelay?: number;
|
|
16
|
+
/** Delay before starting leave animation (ms) */
|
|
17
|
+
leaveDelay?: number;
|
|
18
|
+
/** Initial value for entering items (default: 0) */
|
|
19
|
+
from?: number;
|
|
20
|
+
/** Target value for entered items (default: 1) */
|
|
21
|
+
to?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Hook for animating items as they enter and leave.
|
|
25
|
+
* Similar to react-spring's useTransition but simplified.
|
|
26
|
+
*
|
|
27
|
+
* @param items - Array of items to animate
|
|
28
|
+
* @param keyExtractor - Function to get unique key for each item
|
|
29
|
+
* @param config - Animation configuration
|
|
30
|
+
* @returns Array of TransitionItems with animation state
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* const items = ['a', 'b', 'c'];
|
|
35
|
+
* const transitions = useAnimatedTransition(
|
|
36
|
+
* items,
|
|
37
|
+
* item => item,
|
|
38
|
+
* { duration: 300 }
|
|
39
|
+
* );
|
|
40
|
+
*
|
|
41
|
+
* return (
|
|
42
|
+
* <>
|
|
43
|
+
* {transitions.map(({ item, key, value }) => (
|
|
44
|
+
* <Animated.div
|
|
45
|
+
* key={key}
|
|
46
|
+
* style={{
|
|
47
|
+
* opacity: value,
|
|
48
|
+
* transform: value.to(v => `translateY(${(1 - v) * 20}px)`),
|
|
49
|
+
* }}
|
|
50
|
+
* >
|
|
51
|
+
* {item}
|
|
52
|
+
* </Animated.div>
|
|
53
|
+
* ))}
|
|
54
|
+
* </>
|
|
55
|
+
* );
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function useAnimatedTransition<T>(items: T[], keyExtractor: (item: T) => string | number, config?: TransitionConfig): TransitionItem<T>[];
|
|
59
|
+
/**
|
|
60
|
+
* Wrapper component for a single animated transition item.
|
|
61
|
+
* This component owns the animated value for proper React lifecycle.
|
|
62
|
+
*/
|
|
63
|
+
export declare function TransitionItemWrapper<T>({ item, phase, config, children, }: {
|
|
64
|
+
item: T;
|
|
65
|
+
phase: TransitionPhase;
|
|
66
|
+
config?: TransitionConfig;
|
|
67
|
+
children: (value: AnimatedValueRef, item: T, phase: TransitionPhase) => React.ReactNode;
|
|
68
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
/**
|
|
70
|
+
* Simplified hook for single item mount/unmount animation.
|
|
71
|
+
* Use this when you just need to animate a single element in/out.
|
|
72
|
+
*
|
|
73
|
+
* @param show - Whether the item should be visible
|
|
74
|
+
* @param config - Animation configuration
|
|
75
|
+
* @returns Object with `visible` (whether to render), `value` (animated 0-1)
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```tsx
|
|
79
|
+
* const { visible, value } = useAnimatedPresence(isOpen, { duration: 200 });
|
|
80
|
+
*
|
|
81
|
+
* return visible ? (
|
|
82
|
+
* <Animated.div style={{ opacity: value }}>
|
|
83
|
+
* Content
|
|
84
|
+
* </Animated.div>
|
|
85
|
+
* ) : null;
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function useAnimatedPresence(show: boolean, config?: TransitionConfig): {
|
|
89
|
+
visible: boolean;
|
|
90
|
+
value: AnimatedValueRef;
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=useAnimatedTransition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnimatedTransition.d.ts","sourceRoot":"","sources":["../../../src/client/animation/useAnimatedTransition.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,UAAU,EAGX,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,wBAAwB;IACxB,IAAI,EAAE,CAAC,CAAC;IACR,+BAA+B;IAC/B,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,8BAA8B;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,+CAA+C;IAC/C,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,KAAK,EAAE,CAAC,EAAE,EACV,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,MAAM,EAC1C,MAAM,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,CAAC,CAAC,EAAE,CAqIrB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,EACvC,IAAI,EACJ,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,CACR,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,eAAe,KACnB,KAAK,CAAC,SAAS,CAAC;CACtB,2CAsBA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,gBAAgB,GACxB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAmC/C"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { easingFunctions, useAnimatedValue, } from './animatedValue.js';
|
|
4
|
+
/**
|
|
5
|
+
* Hook for animating items as they enter and leave.
|
|
6
|
+
* Similar to react-spring's useTransition but simplified.
|
|
7
|
+
*
|
|
8
|
+
* @param items - Array of items to animate
|
|
9
|
+
* @param keyExtractor - Function to get unique key for each item
|
|
10
|
+
* @param config - Animation configuration
|
|
11
|
+
* @returns Array of TransitionItems with animation state
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const items = ['a', 'b', 'c'];
|
|
16
|
+
* const transitions = useAnimatedTransition(
|
|
17
|
+
* items,
|
|
18
|
+
* item => item,
|
|
19
|
+
* { duration: 300 }
|
|
20
|
+
* );
|
|
21
|
+
*
|
|
22
|
+
* return (
|
|
23
|
+
* <>
|
|
24
|
+
* {transitions.map(({ item, key, value }) => (
|
|
25
|
+
* <Animated.div
|
|
26
|
+
* key={key}
|
|
27
|
+
* style={{
|
|
28
|
+
* opacity: value,
|
|
29
|
+
* transform: value.to(v => `translateY(${(1 - v) * 20}px)`),
|
|
30
|
+
* }}
|
|
31
|
+
* >
|
|
32
|
+
* {item}
|
|
33
|
+
* </Animated.div>
|
|
34
|
+
* ))}
|
|
35
|
+
* </>
|
|
36
|
+
* );
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function useAnimatedTransition(items, keyExtractor, config) {
|
|
40
|
+
const duration = config?.duration ?? 300;
|
|
41
|
+
const easing = config?.easing ?? easingFunctions.springGentle;
|
|
42
|
+
const enterDelay = config?.enterDelay ?? 0;
|
|
43
|
+
const leaveDelay = config?.leaveDelay ?? 0;
|
|
44
|
+
const fromValue = config?.from ?? 0;
|
|
45
|
+
const toValue = config?.to ?? 1;
|
|
46
|
+
// Track all active transition items
|
|
47
|
+
const transitionsRef = useRef(new Map());
|
|
48
|
+
const [, forceUpdate] = useState({});
|
|
49
|
+
// Track previous items for comparison
|
|
50
|
+
const prevItemsRef = useRef([]);
|
|
51
|
+
// Handle entering, updating, and leaving items
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
const prevItems = prevItemsRef.current;
|
|
54
|
+
const prevKeys = new Set(prevItems.map(keyExtractor));
|
|
55
|
+
const currentKeys = new Set(items.map(keyExtractor));
|
|
56
|
+
// Find entering items (in current but not in previous)
|
|
57
|
+
const enteringKeys = items
|
|
58
|
+
.map(keyExtractor)
|
|
59
|
+
.filter((key) => !prevKeys.has(key));
|
|
60
|
+
// Find leaving items (in previous but not in current)
|
|
61
|
+
const leavingKeys = prevItems
|
|
62
|
+
.map(keyExtractor)
|
|
63
|
+
.filter((key) => !currentKeys.has(key));
|
|
64
|
+
// Handle entering items
|
|
65
|
+
enteringKeys.forEach((key, index) => {
|
|
66
|
+
const item = items.find((i) => keyExtractor(i) === key);
|
|
67
|
+
const existing = transitionsRef.current.get(key);
|
|
68
|
+
if (existing) {
|
|
69
|
+
// Item was leaving but came back - update it
|
|
70
|
+
existing.item = item;
|
|
71
|
+
existing.phase = 'enter';
|
|
72
|
+
setTimeout(() => {
|
|
73
|
+
void existing.value.start(toValue, { duration, easing });
|
|
74
|
+
}, enterDelay + index * 50); // Stagger entering items
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// New item
|
|
78
|
+
const transitionItem = {
|
|
79
|
+
item,
|
|
80
|
+
key,
|
|
81
|
+
phase: 'enter',
|
|
82
|
+
value: null, // Will be set below
|
|
83
|
+
};
|
|
84
|
+
transitionsRef.current.set(key, transitionItem);
|
|
85
|
+
forceUpdate({});
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// Handle leaving items
|
|
89
|
+
leavingKeys.forEach((key) => {
|
|
90
|
+
const existing = transitionsRef.current.get(key);
|
|
91
|
+
if (existing && existing.phase !== 'leave') {
|
|
92
|
+
existing.phase = 'leave';
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
void existing.value
|
|
95
|
+
.start(fromValue, { duration, easing })
|
|
96
|
+
.then(() => {
|
|
97
|
+
// Remove from transitions after leave animation completes
|
|
98
|
+
transitionsRef.current.delete(key);
|
|
99
|
+
forceUpdate({});
|
|
100
|
+
});
|
|
101
|
+
}, leaveDelay);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// Update items that stayed
|
|
105
|
+
items.forEach((item) => {
|
|
106
|
+
const key = keyExtractor(item);
|
|
107
|
+
const existing = transitionsRef.current.get(key);
|
|
108
|
+
if (existing?.phase === 'update') {
|
|
109
|
+
existing.item = item;
|
|
110
|
+
}
|
|
111
|
+
else if (existing?.phase === 'enter') {
|
|
112
|
+
// Still entering
|
|
113
|
+
existing.item = item;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
prevItemsRef.current = items;
|
|
117
|
+
}, [
|
|
118
|
+
items,
|
|
119
|
+
keyExtractor,
|
|
120
|
+
duration,
|
|
121
|
+
easing,
|
|
122
|
+
enterDelay,
|
|
123
|
+
leaveDelay,
|
|
124
|
+
fromValue,
|
|
125
|
+
toValue,
|
|
126
|
+
]);
|
|
127
|
+
// Build the result array with proper ordering
|
|
128
|
+
// Items maintain their order, leaving items go at the end
|
|
129
|
+
const result = [];
|
|
130
|
+
// First, add current items in order
|
|
131
|
+
items.forEach((item) => {
|
|
132
|
+
const key = keyExtractor(item);
|
|
133
|
+
let transition = transitionsRef.current.get(key);
|
|
134
|
+
if (!transition) {
|
|
135
|
+
// Create new transition item - this is needed on first render
|
|
136
|
+
transition = {
|
|
137
|
+
item,
|
|
138
|
+
key,
|
|
139
|
+
phase: 'enter',
|
|
140
|
+
value: null,
|
|
141
|
+
};
|
|
142
|
+
transitionsRef.current.set(key, transition);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Update the item reference
|
|
146
|
+
transition.item = item;
|
|
147
|
+
}
|
|
148
|
+
result.push(transition);
|
|
149
|
+
});
|
|
150
|
+
// Then add leaving items at the end
|
|
151
|
+
transitionsRef.current.forEach((transition) => {
|
|
152
|
+
if (transition.phase === 'leave') {
|
|
153
|
+
result.push(transition);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Wrapper component for a single animated transition item.
|
|
160
|
+
* This component owns the animated value for proper React lifecycle.
|
|
161
|
+
*/
|
|
162
|
+
export function TransitionItemWrapper({ item, phase, config, children, }) {
|
|
163
|
+
const duration = config?.duration ?? 300;
|
|
164
|
+
const easing = config?.easing ?? easingFunctions.springGentle;
|
|
165
|
+
const fromValue = config?.from ?? 0;
|
|
166
|
+
const toValue = config?.to ?? 1;
|
|
167
|
+
const enterDelay = config?.enterDelay ?? 0;
|
|
168
|
+
const value = useAnimatedValue(phase === 'enter' ? fromValue : toValue);
|
|
169
|
+
const hasAnimatedRef = useRef(false);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (phase === 'enter' && !hasAnimatedRef.current) {
|
|
172
|
+
hasAnimatedRef.current = true;
|
|
173
|
+
setTimeout(() => {
|
|
174
|
+
void value.start(toValue, { duration, easing });
|
|
175
|
+
}, enterDelay);
|
|
176
|
+
}
|
|
177
|
+
else if (phase === 'leave') {
|
|
178
|
+
void value.start(fromValue, { duration, easing });
|
|
179
|
+
}
|
|
180
|
+
}, [phase, duration, easing, fromValue, toValue, enterDelay, value]);
|
|
181
|
+
return _jsx(_Fragment, { children: children(value, item, phase) });
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Simplified hook for single item mount/unmount animation.
|
|
185
|
+
* Use this when you just need to animate a single element in/out.
|
|
186
|
+
*
|
|
187
|
+
* @param show - Whether the item should be visible
|
|
188
|
+
* @param config - Animation configuration
|
|
189
|
+
* @returns Object with `visible` (whether to render), `value` (animated 0-1)
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```tsx
|
|
193
|
+
* const { visible, value } = useAnimatedPresence(isOpen, { duration: 200 });
|
|
194
|
+
*
|
|
195
|
+
* return visible ? (
|
|
196
|
+
* <Animated.div style={{ opacity: value }}>
|
|
197
|
+
* Content
|
|
198
|
+
* </Animated.div>
|
|
199
|
+
* ) : null;
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
export function useAnimatedPresence(show, config) {
|
|
203
|
+
const duration = config?.duration ?? 300;
|
|
204
|
+
const easing = config?.easing ?? easingFunctions.springGentle;
|
|
205
|
+
const fromValue = config?.from ?? 0;
|
|
206
|
+
const toValue = config?.to ?? 1;
|
|
207
|
+
const value = useAnimatedValue(show ? toValue : fromValue);
|
|
208
|
+
const [visible, setVisible] = useState(show);
|
|
209
|
+
const onRestCallback = useCallback(() => {
|
|
210
|
+
if (!show) {
|
|
211
|
+
setVisible(false);
|
|
212
|
+
}
|
|
213
|
+
config?.onRest?.();
|
|
214
|
+
}, [show, config?.onRest]);
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
if (show) {
|
|
217
|
+
setVisible(true);
|
|
218
|
+
void value.start(toValue, { duration, easing });
|
|
219
|
+
}
|
|
220
|
+
else if (visible) {
|
|
221
|
+
void value.start(fromValue, { duration, easing, onRest: onRestCallback });
|
|
222
|
+
}
|
|
223
|
+
}, [
|
|
224
|
+
show,
|
|
225
|
+
duration,
|
|
226
|
+
easing,
|
|
227
|
+
fromValue,
|
|
228
|
+
toValue,
|
|
229
|
+
onRestCallback,
|
|
230
|
+
value,
|
|
231
|
+
visible,
|
|
232
|
+
]);
|
|
233
|
+
return { visible, value };
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=useAnimatedTransition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnimatedTransition.js","sourceRoot":"","sources":["../../../src/client/animation/useAnimatedTransition.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type ScrollAnimationType = 'fadeIn' | 'slideUp' | 'slideDown' | 'slideLeft' | 'slideRight' | 'scale' | 'none';
|
|
2
|
+
export interface ScrollAnimationConfig {
|
|
3
|
+
/** Animation type to apply */
|
|
4
|
+
animation?: ScrollAnimationType;
|
|
5
|
+
/** Delay before animation starts in ms (default: 0) */
|
|
6
|
+
delay?: number;
|
|
7
|
+
/** Animation duration in ms (default: 600) */
|
|
8
|
+
duration?: number;
|
|
9
|
+
/** Viewport threshold to trigger animation (0-1, default: 0.2) */
|
|
10
|
+
threshold?: number;
|
|
11
|
+
/** Only animate once (default: true) */
|
|
12
|
+
once?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface ScrollAnimationStyle {
|
|
15
|
+
opacity: number;
|
|
16
|
+
transform: string;
|
|
17
|
+
transition?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function useScrollAnimation<T extends HTMLElement = HTMLDivElement>(config?: ScrollAnimationConfig): {
|
|
20
|
+
ref: import("react").RefObject<T | null>;
|
|
21
|
+
style: ScrollAnimationStyle;
|
|
22
|
+
isVisible: boolean;
|
|
23
|
+
progress: number;
|
|
24
|
+
};
|
|
25
|
+
export declare function useStaggerAnimation(config: {
|
|
26
|
+
baseDelay?: number;
|
|
27
|
+
startDelay?: number;
|
|
28
|
+
animation?: ScrollAnimationType;
|
|
29
|
+
duration?: number;
|
|
30
|
+
threshold?: number;
|
|
31
|
+
}): (index: number) => ScrollAnimationConfig;
|
|
32
|
+
//# sourceMappingURL=useScrollAnimation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollAnimation.d.ts","sourceRoot":"","sources":["../../../src/client/animation/useScrollAnimation.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EACvE,MAAM,GAAE,qBAA0B;;;;;EAiFnC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,WAUW,MAAM,KAAG,qBAAqB,CAQzC"}
|