akanjs 2.0.6 → 2.0.7

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 (45) hide show
  1. package/README.ko.md +1 -1
  2. package/README.md +1 -1
  3. package/cli/application/application.command.ts +4 -1
  4. package/cli/application/application.runner.ts +5 -7
  5. package/cli/build.ts +1 -0
  6. package/cli/index.js +114 -74
  7. package/constant/serialize.ts +1 -1
  8. package/devkit/capacitor.base.config.ts +18 -4
  9. package/devkit/capacitorApp.ts +118 -64
  10. package/devkit/mobile/mobileTarget.ts +2 -1
  11. package/devkit/scanInfo.ts +1 -0
  12. package/package.json +1 -1
  13. package/server/akanApp.ts +53 -12
  14. package/server/processMetricsCollector.ts +79 -1
  15. package/server/resolver/database.resolver.ts +82 -31
  16. package/server/resolver/signal.resolver.ts +67 -28
  17. package/service/ipcTypes.ts +5 -0
  18. package/service/predefinedAdaptor/database.adaptor.ts +95 -27
  19. package/service/predefinedAdaptor/solidSqlite.ts +7 -7
  20. package/service/predefinedAdaptor/storage.adaptor.ts +35 -9
  21. package/signal/index.ts +1 -0
  22. package/signal/middleware.ts +5 -1
  23. package/signal/signalContext.ts +85 -31
  24. package/signal/trace.ts +279 -0
  25. package/types/devkit/capacitorApp.d.ts +14 -5
  26. package/types/server/processMetricsCollector.d.ts +2 -0
  27. package/types/service/ipcTypes.d.ts +5 -0
  28. package/types/service/predefinedAdaptor/database.adaptor.d.ts +26 -32
  29. package/types/service/predefinedAdaptor/solidSqlite.d.ts +3 -3
  30. package/types/service/predefinedAdaptor/storage.adaptor.d.ts +8 -2
  31. package/types/signal/index.d.ts +1 -0
  32. package/types/signal/signalContext.d.ts +4 -1
  33. package/types/signal/trace.d.ts +97 -0
  34. package/types/ui/Signal/style.d.ts +15 -0
  35. package/ui/Signal/Arg.tsx +22 -15
  36. package/ui/Signal/Doc.tsx +28 -21
  37. package/ui/Signal/Listener.tsx +15 -39
  38. package/ui/Signal/Message.tsx +32 -50
  39. package/ui/Signal/Object.tsx +16 -13
  40. package/ui/Signal/PubSub.tsx +29 -47
  41. package/ui/Signal/Response.tsx +7 -17
  42. package/ui/Signal/RestApi.tsx +41 -57
  43. package/ui/Signal/WebSocket.tsx +1 -1
  44. package/ui/Signal/style.ts +36 -0
  45. package/webkit/useCsrValues.ts +147 -37
@@ -12,6 +12,7 @@ import { Signal } from ".";
12
12
  import Arg from "./Arg";
13
13
  import { getExampleData } from "./makeExample";
14
14
  import Response from "./Response";
15
+ import { getEndpointBadgeClassName, getGuardBadgeClassName, signalUi } from "./style";
15
16
 
16
17
  type RestApiFetchFn = (
17
18
  ...args: [...args: unknown[], option: { token?: string; crystalize?: boolean }]
@@ -100,55 +101,38 @@ const RestApiEndpoint = ({
100
101
  const [viewStatus, setViewStatus] = useState<"doc" | "test">("doc");
101
102
  const path = FetchClient.makeHttpUrl(endpointKey, endpoint, signalPrefix, new Map());
102
103
  return (
103
- <div className="collapse-arrow collapse my-1 bg-base-300">
104
- <input type="checkbox" checked={open} />
104
+ <div className={signalUi.endpointCard}>
105
+ <input type="checkbox" defaultChecked={open} />
105
106
  <div className="collapse-title">
106
- <div className="flex items-center gap-3">
107
- <div className={`btn btn-xs w-16 ${endpoint.type === "query" ? "btn-success" : "btn-accent"}`}>
108
- {endpoint.type === "query" ? "GET" : "POST"}
109
- </div>
110
- {path} <span className="text-lg">({l._(`${refName}.signal.${endpointKey}`)})</span>
107
+ <div className="flex flex-wrap items-center gap-2">
108
+ <div className={getEndpointBadgeClassName(endpoint.type)}>{endpoint.type === "query" ? "GET" : "POST"}</div>
109
+ <div className="font-bold text-lg">{path}</div>
110
+ <div className="text-base-content/70 text-sm">{l._(`${refName}.signal.${endpointKey}`)}</div>
111
111
  </div>
112
112
  </div>
113
- <div className="collapse-content w-full bg-base-200">
114
- <div className="mt-4 text-lg">
115
- <div className="font-extrabold text-lg">Description</div>
116
- <hr className="my-2 border-[0.1px] border-gray-400" />
113
+ <div className={signalUi.endpointContent}>
114
+ <div className="rounded-xl bg-base-100 p-3">
115
+ <div className={signalUi.sectionTitle}>Description</div>
117
116
  {endpoint.guards?.some((guard) => guard !== "None") ? (
118
- <div className="flex items-center gap-2 pb-3 pl-3 font-normal text-base">
119
- - Guards:
117
+ <div className="mt-2 flex flex-wrap items-center gap-2 font-normal text-sm">
118
+ <span className="text-base-content/70">Guards</span>
120
119
  {endpoint.guards.map((guard) => (
121
- <span
122
- className={`badge ${
123
- guard === "Public"
124
- ? "badge-success"
125
- : guard === "SuperAdmin"
126
- ? "badge-error"
127
- : guard === "Admin"
128
- ? "badge-error"
129
- : guard === "User"
130
- ? "badge-accent"
131
- : guard === "Owner"
132
- ? "badge-accent"
133
- : guard === "Every"
134
- ? "badge-warning"
135
- : ""
136
- }`}
137
- key={guard}
138
- >
120
+ <span className={getGuardBadgeClassName(guard)} key={guard}>
139
121
  {guard}
140
122
  </span>
141
123
  ))}
142
124
  </div>
143
125
  ) : null}
144
- <div className="pb-3 pl-3 font-normal text-base">- {l._(`${refName}.signal.${endpointKey}.desc`)}</div>
126
+ <div className="mt-2 font-normal text-base-content/70 text-sm">
127
+ {l._(`${refName}.signal.${endpointKey}.desc`)}
128
+ </div>
145
129
  </div>
146
- <div className="my-4 flex w-full gap-5 px-5">
130
+ <div className="join w-fit">
147
131
  <button
148
132
  onClick={() => {
149
133
  setViewStatus("doc");
150
134
  }}
151
- className={`btn btn-success w-1/2 ${viewStatus === "doc" ? "" : "btn-outline"}`}
135
+ className={`btn join-item btn-sm ${viewStatus === "doc" ? "btn-primary" : "btn-outline"}`}
152
136
  >
153
137
  <AiOutlineFileWord className="text-xl" /> View Doc
154
138
  </button>
@@ -156,7 +140,7 @@ const RestApiEndpoint = ({
156
140
  onClick={() => {
157
141
  setViewStatus("test");
158
142
  }}
159
- className={`btn btn-primary w-1/2 ${viewStatus === "test" ? "" : "btn-outline"}`}
143
+ className={`btn join-item btn-sm ${viewStatus === "test" ? "btn-primary" : "btn-outline"}`}
160
144
  >
161
145
  <AiOutlineApi className="text-xl" /> Restful API
162
146
  </button>
@@ -195,32 +179,32 @@ const RestApiInterface = ({ refName, endpointKey, endpoint }: RestApiInterfacePr
195
179
  <div className="flex w-full flex-col gap-4">
196
180
  {uploadArgs.length ? (
197
181
  <div>
198
- <div className="font-extrabold text-lg">Form data upload</div>
199
- <div className="overflow-x-auto rounded-md bg-base-100 p-3">
182
+ <div className={signalUi.sectionTitle}>Form data upload</div>
183
+ <div className={signalUi.tablePanel}>
200
184
  <Arg.Table refName={refName} endpointKey={endpointKey} args={uploadArgs} />
201
185
  </div>
202
186
  </div>
203
187
  ) : null}
204
188
  {paramArgs.length ? (
205
189
  <div>
206
- <div className="font-extrabold text-lg">Parameters</div>
207
- <div className="overflow-x-auto rounded-md bg-base-100 p-3">
190
+ <div className={signalUi.sectionTitle}>Parameters</div>
191
+ <div className={signalUi.tablePanel}>
208
192
  <Arg.Table refName={refName} endpointKey={endpointKey} args={paramArgs} />
209
193
  </div>
210
194
  </div>
211
195
  ) : null}
212
196
  {searchArgs.length ? (
213
197
  <div>
214
- <div className="font-extrabold text-lg">Query</div>
215
- <div className="overflow-x-auto rounded-md bg-base-100 p-3">
198
+ <div className={signalUi.sectionTitle}>Query</div>
199
+ <div className={signalUi.tablePanel}>
216
200
  <Arg.Table refName={refName} endpointKey={endpointKey} args={searchArgs} />
217
201
  </div>
218
202
  </div>
219
203
  ) : null}
220
204
  {bodyArgs.length ? (
221
205
  <div>
222
- <div className="font-extrabold text-lg">Body</div>
223
- <div className="overflow-x-auto rounded-md bg-base-100 p-3">
206
+ <div className={signalUi.sectionTitle}>Body</div>
207
+ <div className={signalUi.tablePanel}>
224
208
  <Arg.Table refName={refName} endpointKey={endpointKey} args={bodyArgs} />
225
209
  </div>
226
210
  </div>
@@ -228,14 +212,14 @@ const RestApiInterface = ({ refName, endpointKey, endpoint }: RestApiInterfacePr
228
212
  <div className="font-bold text-lg">
229
213
  <div className="flex w-full flex-col gap-2 rounded-md font-normal md:flex-row">
230
214
  <div className="w-full md:w-1/2">
231
- <div className="font-extrabold text-lg">Response Type</div>
232
- <div className="max-h-72 overflow-auto rounded-md bg-base-100 p-4 md:h-72">
215
+ <div className={signalUi.sectionTitle}>Response Type</div>
216
+ <div className="max-h-72 overflow-auto rounded-xl bg-base-100 p-4 md:h-72">
233
217
  Returns: <Signal.Object.Type objRef={returnRef} arrDepth={endpoint.returns.arrDepth ?? 0} />
234
218
  {isReturnModelType ? <Signal.Object.Detail objRef={returnRef as ConstantCls} /> : null}
235
219
  </div>
236
220
  </div>
237
221
  <div className="w-full md:w-1/2">
238
- <div className="font-extrabold text-lg">Response Example</div>
222
+ <div className={signalUi.sectionTitle}>Response Example</div>
239
223
  <Response.Example endpoint={endpoint} />
240
224
  </div>
241
225
  </div>
@@ -313,8 +297,8 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
313
297
  };
314
298
  return (
315
299
  <div className="flex w-full flex-col gap-4">
316
- <div className="flex items-center gap-2 text-lg">
317
- <div className="font-extrabold text-lg">Request URL:</div>
300
+ <div className="flex flex-wrap items-center gap-2 rounded-xl bg-base-100 p-3">
301
+ <div className={signalUi.sectionTitle}>Request URL</div>
318
302
  <Copy text={`${httpUri ?? ""}${requestPath}`}>
319
303
  <button className="btn btn-sm btn-outline">
320
304
  {requestPath} <AiOutlineCopy />
@@ -323,7 +307,7 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
323
307
  </div>
324
308
  {uploadArgs.length ? (
325
309
  <div>
326
- <div className="text-lg">Form data uplaod</div>
310
+ <div className={signalUi.sectionTitle}>Form data upload</div>
327
311
  {uploadArgs.map((arg) => (
328
312
  <Arg.FormData
329
313
  key={arg.name}
@@ -338,8 +322,8 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
338
322
  </div>
339
323
  ) : null}
340
324
  {paramArgs.length ? (
341
- <div className="border-gray-400 border-t pt-5">
342
- <div className="font-extrabold text-lg">Parameters</div>
325
+ <div className={signalUi.sectionPanel}>
326
+ <div className={signalUi.sectionTitle}>Parameters</div>
343
327
  {paramArgs.map((arg, idx) => (
344
328
  <Arg.Param
345
329
  key={idx}
@@ -354,8 +338,8 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
354
338
  </div>
355
339
  ) : null}
356
340
  {queryArgs.length ? (
357
- <div>
358
- <div className="font-extrabold text-lg">Queries</div>
341
+ <div className={signalUi.sectionPanel}>
342
+ <div className={signalUi.sectionTitle}>Queries</div>
359
343
  {queryArgs.map((arg, idx) => (
360
344
  <Arg.Query
361
345
  key={idx}
@@ -371,17 +355,17 @@ const RestApiTry = ({ signalPrefix, refName, endpointKey, endpoint, fetch, httpU
371
355
  ) : null}
372
356
  {bodyArgs.length ? (
373
357
  <div>
374
- <div className="text-lg">Body</div>
358
+ <div className={signalUi.sectionTitle}>Body</div>
375
359
  <Arg.Json value={bodyRequest} onChange={setBodyRequest} />
376
360
  </div>
377
361
  ) : null}
378
- <div className="border-gray-400 border-b pb-5">
379
- <button className="btn w-full bg-success" onClick={() => void onSend()}>
362
+ <div>
363
+ <button className="btn btn-primary w-full" onClick={() => void onSend()}>
380
364
  <AiOutlineSend className="-mt-0.5" /> Send Request
381
365
  </button>
382
366
  </div>
383
367
  <div>
384
- <div className="font-extrabold text-lg">Response</div>
368
+ <div className={signalUi.sectionTitle}>Response</div>
385
369
  <Response.Result status={response.status} data={response.data as object} />
386
370
  </div>
387
371
  </div>
@@ -23,7 +23,7 @@ const WebSocketEndpoints = ({ refName, fetch, openAll }: WebSocketEndpointsProps
23
23
  return false;
24
24
  });
25
25
  return (
26
- <div>
26
+ <div className="flex flex-col gap-2">
27
27
  {endpointEntries.map(([endpointKey, endpoint], idx) => {
28
28
  if (endpoint.type === "pubsub") {
29
29
  return (
@@ -0,0 +1,36 @@
1
+ "use client";
2
+
3
+ export const signalUi = {
4
+ sectionTitle: "font-extrabold text-lg",
5
+ sectionDescription: "text-base-content/70 text-sm",
6
+ sectionPanel: "rounded-xl bg-base-100 p-3",
7
+ endpointCard: "collapse-arrow collapse my-2 bg-base-200",
8
+ endpointContent: "collapse-content flex w-full flex-col gap-4 bg-base-100/60",
9
+ tablePanel: "overflow-x-auto rounded-xl bg-base-100 p-3",
10
+ inputRow: "flex w-full flex-col gap-2 py-2 md:flex-row md:items-center",
11
+ inputLabel: "w-full font-semibold text-base-content/70 text-sm md:w-36",
12
+ codePanel:
13
+ "textarea min-h-[300px] w-full rounded-xl border border-base-300 bg-base-100 p-4 font-normal text-sm text-base-content",
14
+ };
15
+
16
+ export const getEndpointBadgeClassName = (type: string) =>
17
+ type === "query" || type === "pubsub" ? "badge badge-primary" : "badge badge-secondary";
18
+
19
+ export const getGuardBadgeClassName = (guard: string) =>
20
+ guard === "Public" ? "badge badge-primary" : guard === "None" ? "badge" : "badge badge-secondary";
21
+
22
+ export const getStatusBadgeClassName = (status: string) =>
23
+ status === "error"
24
+ ? "badge badge-error"
25
+ : status === "success" || status === "listening"
26
+ ? "badge badge-primary"
27
+ : "badge badge-outline";
28
+
29
+ export const getStatusTextareaClassName = (status: string) =>
30
+ status === "error"
31
+ ? "border-error text-error"
32
+ : status === "success" || status === "listening"
33
+ ? "border-primary"
34
+ : status === "loading"
35
+ ? "textarea-disabled"
36
+ : "";
@@ -21,6 +21,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
21
21
  import { useHistory } from "./useHistory";
22
22
  import { useLocation } from "./useLocation";
23
23
 
24
+ const linearEasing = (t: number) => t;
25
+
24
26
  const useNoneTrans = ({ clientHeight, location, prevLocation }: RouteState): UseCsrTransition => {
25
27
  const transDirection = "none";
26
28
  const transUnit = useSpringValue(0, { config: { clamp: true } });
@@ -107,19 +109,15 @@ const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }:
107
109
 
108
110
  useEffect(() => {
109
111
  onBack.current.fade = async () => {
110
- const startValue = transUnitRange[0];
111
- if (startValue) await transUnit.start(startValue);
112
+ await transUnit.start(transUnitRange[0]);
112
113
  };
113
114
  }, []);
114
115
  useEffect(() => {
115
116
  if (history.current.type === "forward") {
116
- const startValue = transUnitRange[0];
117
- if (startValue) void transUnit.start(startValue, { immediate: true });
118
- const endValue = transUnitRange[1];
119
- if (endValue) void transUnit.start(endValue, { config: { duration: 150 } });
117
+ void transUnit.start(transUnitRange[0], { immediate: true });
118
+ void transUnit.start(transUnitRange[1], { config: { duration: 150 } });
120
119
  } else {
121
- const endValue = transUnitRange[1];
122
- if (endValue) void transUnit.start(endValue, { immediate: true });
120
+ void transUnit.start(transUnitRange[1], { immediate: true });
123
121
  return;
124
122
  }
125
123
  }, [location.pathname]);
@@ -173,9 +171,11 @@ const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }:
173
171
  height: transProgress.to([0, 1], [prevPageState.topInset, pageState.topInset]),
174
172
  },
175
173
  contentStyle: {
174
+ top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
176
175
  opacity: transProgress.to((progress) => progress),
177
176
  },
178
177
  prevContentStyle: {
178
+ top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
179
179
  opacity: transProgress.to((progress) => 1 - progress),
180
180
  },
181
181
  },
@@ -191,11 +191,143 @@ const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }:
191
191
  ),
192
192
  },
193
193
  contentStyle: {
194
- top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
194
+ top: transProgress.to(
195
+ [0, 1],
196
+ [
197
+ 0,
198
+ 0,
199
+ ],
200
+ ),
195
201
  opacity: transProgress.to((progress) => progress),
202
+
203
+ transformOrigin: "top",
204
+ },
205
+ prevContentStyle: {
206
+
207
+ height: transProgress.to(
208
+ [0, 1],
209
+ [
210
+ prevPageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
211
+ pageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
212
+ ],
213
+ ),
214
+ opacity: transProgress.to((progress) => 1 - progress),
215
+ transformOrigin: "top",
216
+ },
217
+ },
218
+ };
219
+
220
+ const useCsrTransition: UseCsrTransition = {
221
+ ...csrTranstionStyles,
222
+ pageBind: () => ({}),
223
+ pageClassName: "",
224
+ transDirection,
225
+ transUnitRange,
226
+ transUnit,
227
+ transPercent,
228
+ transProgress,
229
+ };
230
+ return useCsrTransition;
231
+ };
232
+
233
+ const useScaleOutTrans = ({ clientHeight, location, prevLocation, onBack, history }: RouteState): UseCsrTransition => {
234
+ const transDirection = "none";
235
+ const transUnit = useSpringValue(1, { config: { clamp: true } });
236
+ const transUnitRange = useMemo(() => [0, 1], []);
237
+ const transProgress = transUnit.to((unit) => unit);
238
+ const transPercent = transUnit.to([0, 1], [0, 100], "clamp");
239
+ const pageState = location.pathRoute.pageState;
240
+ const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
241
+
242
+ useEffect(() => {
243
+ onBack.current.scaleOut = async () => {
244
+ await transUnit.start(transUnitRange[0]);
245
+ };
246
+ }, []);
247
+ useEffect(() => {
248
+ if (history.current.type === "forward") {
249
+ void transUnit.start(transUnitRange[0], { immediate: true });
250
+ void transUnit.start(transUnitRange[1], { config: { duration: 180 } });
251
+ } else {
252
+ void transUnit.start(transUnitRange[1], { immediate: true });
253
+ return;
254
+ }
255
+ }, [location.pathname]);
256
+
257
+ const csrTranstionStyles: CsrTransitionStyles = {
258
+ topSafeArea: {
259
+ containerStyle: {
260
+ height: transProgress.to([0, 1], [prevPageState.topSafeArea, pageState.topSafeArea]),
261
+ },
262
+ },
263
+ bottomSafeArea: {
264
+ containerStyle: {
265
+ top: transProgress.to(
266
+ [0, 1],
267
+ [clientHeight - prevPageState.bottomSafeArea, clientHeight - pageState.bottomSafeArea],
268
+ ),
269
+ height: transProgress.to([0, 1], [prevPageState.bottomSafeArea, pageState.bottomSafeArea]),
270
+ },
271
+ },
272
+ page: {
273
+ containerStyle: {
274
+ transform: transProgress.to((progress) => `scale(${0.96 + progress * 0.04})`),
275
+ },
276
+ contentStyle: {
277
+ paddingTop: pageState.topSafeArea + pageState.topInset,
278
+ paddingBottom: pageState.bottomInset + pageState.bottomSafeArea,
279
+ opacity: transProgress,
280
+ height: clientHeight,
281
+ },
282
+ },
283
+ prevPage: {
284
+ containerStyle: {
285
+ paddingTop: prevPageState.topSafeArea + prevPageState.topInset,
286
+ transform: transProgress.to((progress) => `scale(${1 - progress * 0.04})`),
287
+ },
288
+ contentStyle: {
289
+ opacity: transProgress.to((progress) => 1 - progress / 2),
290
+ },
291
+ },
292
+ topInset: {
293
+ containerStyle: {
294
+ top: transProgress.to([0, 1], [prevPageState.topSafeArea, pageState.topSafeArea]),
295
+ height: transProgress.to([0, 1], [prevPageState.topInset, pageState.topInset]),
296
+ },
297
+ contentStyle: {
298
+ opacity: transProgress,
299
+ },
300
+ prevContentStyle: {
301
+ opacity: transProgress.to((progress) => 1 - progress),
302
+ },
303
+ },
304
+ topLeftAction: {
305
+ containerStyle: {
306
+ top: transProgress.to([0, 1], [prevPageState.topSafeArea, pageState.topSafeArea]),
307
+ height: transProgress.to([0, 1], [prevPageState.topInset, pageState.topInset]),
308
+ },
309
+ contentStyle: {
310
+ opacity: transProgress,
311
+ },
312
+ prevContentStyle: {
313
+ opacity: transProgress.to((progress) => 1 - progress),
314
+ },
315
+ },
316
+ bottomInset: {
317
+ containerStyle: {
318
+ height: transProgress.to([0, 1], [prevPageState.bottomInset, pageState.bottomInset]),
319
+ top: transProgress.to(
320
+ [0, 1],
321
+ [
322
+ clientHeight - prevPageState.bottomInset - prevPageState.bottomSafeArea,
323
+ clientHeight - pageState.bottomInset - pageState.bottomSafeArea,
324
+ ],
325
+ ),
326
+ },
327
+ contentStyle: {
328
+ opacity: transProgress,
196
329
  },
197
330
  prevContentStyle: {
198
- top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset) * 2]),
199
331
  opacity: transProgress.to((progress) => 1 - progress),
200
332
  },
201
333
  },
@@ -337,28 +469,10 @@ const useStackTrans = ({
337
469
  ),
338
470
  },
339
471
  contentStyle: {
340
- top: transProgress.to(
341
- [0, 1],
342
- [
343
- 0,
344
- 0,
345
- ],
346
- ),
347
472
  opacity: transProgress.to((progress) => progress),
348
-
349
- transformOrigin: "top",
350
473
  },
351
474
  prevContentStyle: {
352
-
353
- height: transProgress.to(
354
- [0, 1],
355
- [
356
- prevPageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
357
- pageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0,
358
- ],
359
- ),
360
475
  opacity: transProgress.to((progress) => 1 - progress),
361
- transformOrigin: "top",
362
476
  },
363
477
  },
364
478
  };
@@ -388,7 +502,7 @@ const useBottomUpTrans = ({
388
502
  const transUnit = useSpringValue(0, { config: { clamp: true } });
389
503
  const transUnitRange = useMemo(() => [clientHeight, 0], []);
390
504
  const transUnitReversed = transUnit.to((unit) => transUnitRange[0] - unit);
391
- const transUnitRangeReversed = useMemo(() => [0, clientWidth], []);
505
+ const transUnitRangeReversed = useMemo(() => [0, clientHeight], []);
392
506
  const transProgress = transUnitReversed.to(transUnitRangeReversed, [0, 1], "clamp");
393
507
  const transPercent = transUnitReversed.to(transUnitRangeReversed, [0, 100], "clamp");
394
508
  const initThreshold = useMemo(() => Math.floor(clientWidth / 3), []);
@@ -397,13 +511,13 @@ const useBottomUpTrans = ({
397
511
  const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
398
512
  useEffect(() => {
399
513
  onBack.current.bottomUp = async () => {
400
- await transUnit.start(transUnitRange[0]);
514
+ await transUnit.start(transUnitRange[0], { config: { duration: 220, easing: linearEasing } });
401
515
  };
402
516
  }, []);
403
517
  useEffect(() => {
404
518
  if (history.current.type === "forward") {
405
519
  void transUnit.start(transUnitRange[0], { immediate: true });
406
- void transUnit.start(transUnitRange[1], { config: { duration: 150 } });
520
+ void transUnit.start(transUnitRange[1], { config: { duration: 220, easing: linearEasing } });
407
521
  } else {
408
522
  void transUnit.start(transUnitRange[1], { immediate: true });
409
523
  return;
@@ -495,14 +609,9 @@ const useBottomUpTrans = ({
495
609
  ),
496
610
  },
497
611
  contentStyle: {
498
- top: transProgress.to(
499
- [0, 1],
500
- [0, prevPageState.bottomInset ? -(pageState.bottomInset - prevPageState.bottomInset) : 0],
501
- ),
502
612
  opacity: transProgress.to((progress) => progress),
503
613
  },
504
614
  prevContentStyle: {
505
- top: transProgress.to([0, 1], [0, -(pageState.bottomInset - prevPageState.bottomInset)]),
506
615
  opacity: transProgress.to((progress) => 1 - progress),
507
616
  },
508
617
  },
@@ -625,6 +734,7 @@ export const useCsrValues = (rootRouteGuide: RouteGuide, pathRoutes: PathRoute[]
625
734
  };
626
735
  const useNonTransition = useNoneTrans(routeState);
627
736
  const useFadeTransition = useFadeTrans(routeState);
737
+ const useScaleOutTransition = useScaleOutTrans(routeState);
628
738
  const useStackTransition = useStackTrans(routeState);
629
739
  const useBottomUpTransition = useBottomUpTrans(routeState);
630
740
  const useCsrTransitionMap: { [key in TransitionType]: UseCsrTransition } = {
@@ -632,7 +742,7 @@ export const useCsrValues = (rootRouteGuide: RouteGuide, pathRoutes: PathRoute[]
632
742
  fade: useFadeTransition,
633
743
  stack: useStackTransition,
634
744
  bottomUp: useBottomUpTransition,
635
- scaleOut: useNonTransition,
745
+ scaleOut: useScaleOutTransition,
636
746
  };
637
747
 
638
748
  useEffect(() => {