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.
Files changed (157) hide show
  1. package/MIGRATION.md +128 -0
  2. package/dist/cli/version.d.ts +1 -1
  3. package/dist/cli/version.js +1 -1
  4. package/dist/client/animation/animatedValue.d.ts +5 -0
  5. package/dist/client/animation/animatedValue.d.ts.map +1 -1
  6. package/dist/client/animation/animatedValue.js +19 -1
  7. package/dist/client/animation/animatedValue.js.map +1 -1
  8. package/dist/client/animation/useAnimatedTransition.d.ts +92 -0
  9. package/dist/client/animation/useAnimatedTransition.d.ts.map +1 -0
  10. package/dist/client/animation/useAnimatedTransition.js +235 -0
  11. package/dist/client/animation/useAnimatedTransition.js.map +1 -0
  12. package/dist/client/animation/useScrollAnimation.d.ts +32 -0
  13. package/dist/client/animation/useScrollAnimation.d.ts.map +1 -0
  14. package/dist/client/animation/useScrollAnimation.js +82 -0
  15. package/dist/client/animation/useScrollAnimation.js.map +1 -0
  16. package/dist/client/components/Alert.d.ts +9 -0
  17. package/dist/client/components/Alert.d.ts.map +1 -0
  18. package/dist/client/components/Alert.js +60 -0
  19. package/dist/client/components/Alert.js.map +1 -0
  20. package/dist/client/components/AnimatedInput.d.ts +129 -0
  21. package/dist/client/components/AnimatedInput.d.ts.map +1 -0
  22. package/dist/client/components/AnimatedInput.js +264 -0
  23. package/dist/client/components/AnimatedInput.js.map +1 -0
  24. package/dist/client/components/AnimatedList.d.ts +32 -0
  25. package/dist/client/components/AnimatedList.d.ts.map +1 -0
  26. package/dist/client/components/AnimatedList.js +140 -0
  27. package/dist/client/components/AnimatedList.js.map +1 -0
  28. package/dist/client/components/AppScrollViewProvider.d.ts +35 -0
  29. package/dist/client/components/AppScrollViewProvider.d.ts.map +1 -0
  30. package/dist/client/components/AppScrollViewProvider.js +36 -0
  31. package/dist/client/components/AppScrollViewProvider.js.map +1 -0
  32. package/dist/client/components/CardStack.d.ts +48 -0
  33. package/dist/client/components/CardStack.d.ts.map +1 -0
  34. package/dist/client/components/CardStack.js +717 -0
  35. package/dist/client/components/CardStack.js.map +1 -0
  36. package/dist/client/components/CelebrationOverlay.d.ts +9 -0
  37. package/dist/client/components/CelebrationOverlay.d.ts.map +1 -0
  38. package/dist/client/components/CelebrationOverlay.js +91 -0
  39. package/dist/client/components/CelebrationOverlay.js.map +1 -0
  40. package/dist/client/components/Confetti.d.ts +11 -0
  41. package/dist/client/components/Confetti.d.ts.map +1 -0
  42. package/dist/client/components/Confetti.js +181 -0
  43. package/dist/client/components/Confetti.js.map +1 -0
  44. package/dist/client/components/DatePicker.d.ts +8 -0
  45. package/dist/client/components/DatePicker.d.ts.map +1 -0
  46. package/dist/client/components/DatePicker.js +26 -0
  47. package/dist/client/components/DatePicker.js.map +1 -0
  48. package/dist/client/components/DateRangePicker.d.ts +23 -0
  49. package/dist/client/components/DateRangePicker.d.ts.map +1 -0
  50. package/dist/client/components/DateRangePicker.js +217 -0
  51. package/dist/client/components/DateRangePicker.js.map +1 -0
  52. package/dist/client/components/DateTimePicker.d.ts +8 -0
  53. package/dist/client/components/DateTimePicker.d.ts.map +1 -0
  54. package/dist/client/components/DateTimePicker.js +36 -0
  55. package/dist/client/components/DateTimePicker.js.map +1 -0
  56. package/dist/client/components/DrawingCanvas.d.ts +16 -0
  57. package/dist/client/components/DrawingCanvas.d.ts.map +1 -0
  58. package/dist/client/components/DrawingCanvas.js +308 -0
  59. package/dist/client/components/DrawingCanvas.js.map +1 -0
  60. package/dist/client/components/FlatList.d.ts +46 -0
  61. package/dist/client/components/FlatList.d.ts.map +1 -0
  62. package/dist/client/components/FlatList.js +203 -0
  63. package/dist/client/components/FlatList.js.map +1 -0
  64. package/dist/client/components/LayoutSize.d.ts +25 -0
  65. package/dist/client/components/LayoutSize.d.ts.map +1 -0
  66. package/dist/client/components/LayoutSize.js +107 -0
  67. package/dist/client/components/LayoutSize.js.map +1 -0
  68. package/dist/client/components/Loading.d.ts +10 -0
  69. package/dist/client/components/Loading.d.ts.map +1 -0
  70. package/dist/client/components/Loading.js +58 -0
  71. package/dist/client/components/Loading.js.map +1 -0
  72. package/dist/client/components/Pager.d.ts +17 -0
  73. package/dist/client/components/Pager.d.ts.map +1 -0
  74. package/dist/client/components/Pager.js +250 -0
  75. package/dist/client/components/Pager.js.map +1 -0
  76. package/dist/client/components/ResponsiveGrid.d.ts +15 -0
  77. package/dist/client/components/ResponsiveGrid.d.ts.map +1 -0
  78. package/dist/client/components/ResponsiveGrid.js +38 -0
  79. package/dist/client/components/ResponsiveGrid.js.map +1 -0
  80. package/dist/client/components/ScrollAnimatedView.d.ts +17 -0
  81. package/dist/client/components/ScrollAnimatedView.d.ts.map +1 -0
  82. package/dist/client/components/ScrollAnimatedView.js +26 -0
  83. package/dist/client/components/ScrollAnimatedView.js.map +1 -0
  84. package/dist/client/components/ScrollDownArrow.d.ts +4 -0
  85. package/dist/client/components/ScrollDownArrow.d.ts.map +1 -0
  86. package/dist/client/components/ScrollDownArrow.js +43 -0
  87. package/dist/client/components/ScrollDownArrow.js.map +1 -0
  88. package/dist/client/components/ScrollIndicator.d.ts +2 -0
  89. package/dist/client/components/ScrollIndicator.d.ts.map +1 -0
  90. package/dist/client/components/ScrollIndicator.js +69 -0
  91. package/dist/client/components/ScrollIndicator.js.map +1 -0
  92. package/dist/client/components/ScrollView.d.ts +18 -5
  93. package/dist/client/components/ScrollView.d.ts.map +1 -1
  94. package/dist/client/components/ScrollView.js +167 -5
  95. package/dist/client/components/ScrollView.js.map +1 -1
  96. package/dist/client/components/SelectView.d.ts +37 -0
  97. package/dist/client/components/SelectView.d.ts.map +1 -0
  98. package/dist/client/components/SelectView.js +170 -0
  99. package/dist/client/components/SelectView.js.map +1 -0
  100. package/dist/client/components/SimpleScrollView.d.ts +15 -0
  101. package/dist/client/components/SimpleScrollView.d.ts.map +1 -0
  102. package/dist/client/components/SimpleScrollView.js +66 -0
  103. package/dist/client/components/SimpleScrollView.js.map +1 -0
  104. package/dist/client/components/TabPicker.d.ts +41 -0
  105. package/dist/client/components/TabPicker.d.ts.map +1 -0
  106. package/dist/client/components/TabPicker.js +185 -0
  107. package/dist/client/components/TabPicker.js.map +1 -0
  108. package/dist/client/components/ValidatedTextInput.d.ts +40 -0
  109. package/dist/client/components/ValidatedTextInput.d.ts.map +1 -0
  110. package/dist/client/components/ValidatedTextInput.js +335 -0
  111. package/dist/client/components/ValidatedTextInput.js.map +1 -0
  112. package/dist/client/components/View.d.ts +3 -2
  113. package/dist/client/components/View.d.ts.map +1 -1
  114. package/dist/client/components/View.js +2 -2
  115. package/dist/client/components/View.js.map +1 -1
  116. package/dist/client/components/WheelPicker.d.ts +10 -0
  117. package/dist/client/components/WheelPicker.d.ts.map +1 -0
  118. package/dist/client/components/WheelPicker.js +124 -0
  119. package/dist/client/components/WheelPicker.js.map +1 -0
  120. package/dist/client/components/WizardView.d.ts +51 -0
  121. package/dist/client/components/WizardView.d.ts.map +1 -0
  122. package/dist/client/components/WizardView.js +171 -0
  123. package/dist/client/components/WizardView.js.map +1 -0
  124. package/dist/client/components/ZoomPanPinch.d.ts +26 -0
  125. package/dist/client/components/ZoomPanPinch.d.ts.map +1 -0
  126. package/dist/client/components/ZoomPanPinch.js +290 -0
  127. package/dist/client/components/ZoomPanPinch.js.map +1 -0
  128. package/dist/client/components/index.d.ts +43 -0
  129. package/dist/client/components/index.d.ts.map +1 -1
  130. package/dist/client/components/index.js +26 -0
  131. package/dist/client/components/index.js.map +1 -1
  132. package/dist/client/createSocket.d.ts +8 -4
  133. package/dist/client/createSocket.d.ts.map +1 -1
  134. package/dist/client/createSocket.js +10 -2
  135. package/dist/client/createSocket.js.map +1 -1
  136. package/dist/client/index.d.ts +5 -1
  137. package/dist/client/index.d.ts.map +1 -1
  138. package/dist/client/index.js +3 -1
  139. package/dist/client/index.js.map +1 -1
  140. package/dist/server/DB.d.ts +15 -25
  141. package/dist/server/DB.d.ts.map +1 -1
  142. package/dist/server/DB.js +117 -143
  143. package/dist/server/DB.js.map +1 -1
  144. package/dist/server/NatsStore.d.ts +22 -0
  145. package/dist/server/NatsStore.d.ts.map +1 -1
  146. package/dist/server/NatsStore.js +71 -1
  147. package/dist/server/NatsStore.js.map +1 -1
  148. package/dist/server/Socket.d.ts.map +1 -1
  149. package/dist/server/Socket.js +91 -27
  150. package/dist/server/Socket.js.map +1 -1
  151. package/dist/shared/DB.d.ts +29 -46
  152. package/dist/shared/DB.d.ts.map +1 -1
  153. package/dist/shared/DB.js +7 -7
  154. package/dist/shared/DB.js.map +1 -1
  155. package/package.json +6 -1
  156. package/templates/gitignore +1 -0
  157. 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)
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.74";
1
+ export declare const CLI_VERSION = "0.1.76";
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.74";
2
+ export const CLI_VERSION = "0.1.76";
3
3
  //# sourceMappingURL=version.js.map
@@ -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":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CACvB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;IAC3D,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;CACM,CAAC;AAiCpD,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEnD,SAAS,MAAM;QACb,KAAK,MAAM,EAAE,IAAI,WAAW;YAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,SAAS,IAAI;QACX,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC5B,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QACD,WAAW,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,SAAS,GAAG,CAAC,KAAa;QACxB,IAAI,EAAE,CAAC;QACP,OAAO,GAAG,KAAK,CAAC;QAChB,MAAM,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;QACpB,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,EAAE,CAAC;IACX,CAAC;IAED,SAAS,KAAK,CAAC,UAAkB,EAAE,MAAmB;QACpD,IAAI,EAAE,CAAC;QACP,MAAM,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QAExB,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,GAAG,CAAC,UAAU,CAAC,CAAC;YAChB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,GAAG,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,eAAe,CAAC,OAAO,CAAC;QACzD,MAAM,UAAU,GAAG,OAAO,CAAC;QAC3B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,SAAS,KAAK,CAAC,GAAW;gBACxB,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;gBAChC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC1C,OAAO,GAAG,UAAU,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7D,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;gBACtB,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC5B,MAAM,EAAE,CAAC;gBAET,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACV,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,UAAU,CAAC;oBACrB,GAAG,CAAC,OAAO,GAAG,UAAU,CAAC;oBACzB,WAAW,GAAG,KAAK,CAAC;oBACpB,KAAK,GAAG,IAAI,CAAC;oBACb,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC;oBACxB,MAAM,EAAE,CAAC;oBACT,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAED,WAAW,GAAG,IAAI,CAAC;YACnB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;YACvB,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,SAAS,CAAC,QAA6B;QAC9C,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,SAAS,EAAE,CAAI,SAA2B;QACxC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAqB;QAC5B,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,CAAC,CAAC;YACX,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;QACD,IAAI,MAAM;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,CAAC,CAAC;YACV,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;QACD,IAAI,WAAW;YACb,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,WAAW,CAAC,CAAC;YACf,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,EAAE;QACF,KAAK;QACL,GAAG;QACH,IAAI;QACJ,SAAS;KACV,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE1C,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,GAAG,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
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"}