flemo 1.1.4 → 1.3.0

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.
@@ -2,9 +2,11 @@ import { RegisterRoute } from '../Route';
2
2
  import { TransitionName } from '../transition/typing';
3
3
  export default function useNavigate(): {
4
4
  push: <T extends keyof RegisterRoute>(path: T, params: RegisterRoute[T], options?: {
5
+ layoutId?: string | number;
5
6
  transitionName?: TransitionName;
6
7
  }) => Promise<void>;
7
8
  replace: <T extends keyof RegisterRoute>(path: T, params: RegisterRoute[T], options?: {
9
+ layoutId?: string | number;
8
10
  transitionName?: TransitionName;
9
11
  }) => Promise<void>;
10
12
  pop: () => void;
@@ -0,0 +1,4 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { MotionConfigProps } from 'motion/react';
3
+ declare function LayoutConfig({ children, ...props }: PropsWithChildren<MotionConfigProps>): import("react").JSX.Element;
4
+ export default LayoutConfig;
@@ -0,0 +1,4 @@
1
+ import { PropsWithChildren } from 'react';
2
+ import { HTMLMotionProps } from 'motion/react';
3
+ declare function ScreenLayout({ children, ...props }: PropsWithChildren<Omit<HTMLMotionProps<"div">, "initial" | "drag" | "dragControls" | "dragListener" | "onDragStart" | "onDrag" | "onDragEnd" | "onPointerDown" | "onPointerMove" | "onPointerUp">>): import("react").JSX.Element;
4
+ export default ScreenLayout;
@@ -1,17 +1,21 @@
1
1
  import { BaseTransition } from '../typing';
2
+ import { AnimationOptions, Target } from 'motion/react';
2
3
  export interface RegisterDecorator {
3
4
  }
4
5
  export type DecoratorName = RegisterDecorator[keyof RegisterDecorator] | "overlay";
5
6
  export type DecoratorOptions = {
6
7
  onSwipeStart?: (triggered: boolean, options: {
8
+ animate: (target: object, objectTarget: Target, options: AnimationOptions) => void;
7
9
  currentDecorator: HTMLDivElement;
8
10
  prevDecorator: HTMLDivElement;
9
11
  }) => void;
10
12
  onSwipe?: (triggered: boolean, progress: number, options: {
13
+ animate: (target: object, objectTarget: Target, options: AnimationOptions) => void;
11
14
  currentDecorator: HTMLDivElement;
12
15
  prevDecorator: HTMLDivElement;
13
16
  }) => void;
14
17
  onSwipeEnd?: (triggered: boolean, options: {
18
+ animate: (target: object, objectTarget: Target, options: AnimationOptions) => void;
15
19
  currentDecorator: HTMLDivElement;
16
20
  prevDecorator: HTMLDivElement;
17
21
  }) => void;
@@ -0,0 +1,2 @@
1
+ declare const layout: import('./typing').Transition;
2
+ export default layout;
@@ -1,30 +1,35 @@
1
- import { PanInfo, TargetAndTransition, Target, AnimationOptions, DragControls } from 'motion/react';
2
1
  import { NavigateStatus } from '../navigate/store';
3
2
  import { DecoratorName } from './decorator/typing';
3
+ import { PanInfo, TargetAndTransition, Target, AnimationOptions, DragControls } from 'motion/react';
4
4
  export interface RegisterTransition {
5
5
  }
6
- export type TransitionName = RegisterTransition[keyof RegisterTransition] | "none" | "cupertino" | "material";
6
+ export type TransitionName = RegisterTransition[keyof RegisterTransition] | "none" | "cupertino" | "material" | "layout";
7
7
  export type TransitionVariant = `${NavigateStatus}-${boolean}`;
8
8
  export type TransitionVariantValue = {
9
- value: Target;
10
- options: AnimationOptions;
9
+ value: Omit<Target, "transitionDuration" | "transitionDelay" | "transitionTimingFunction" | "transitionBehavior" | "transitionEnd" | "transitionProperty">;
10
+ options: Omit<AnimationOptions, "delay"> & {
11
+ delay?: number;
12
+ };
11
13
  };
12
14
  export type TransitionOptions = {
13
15
  decoratorName?: DecoratorName;
14
16
  swipeDirection: "x" | "y";
15
17
  onSwipeStart: (event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo, options: {
18
+ animate: (target: object, objectTarget: Target, options: AnimationOptions) => void;
16
19
  currentScreen: HTMLDivElement;
17
20
  prevScreen: HTMLDivElement;
18
21
  dragControls: DragControls;
19
22
  onStart?: (triggered: boolean) => void;
20
23
  }) => Promise<boolean>;
21
24
  onSwipe: (event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo, options: {
25
+ animate: (target: object, objectTarget: Target, options: AnimationOptions) => void;
22
26
  currentScreen: HTMLDivElement;
23
27
  prevScreen: HTMLDivElement;
24
28
  dragControls: DragControls;
25
29
  onProgress?: (triggered: boolean, progress: number) => void;
26
30
  }) => number;
27
31
  onSwipeEnd: (event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo, options: {
32
+ animate: (target: object, objectTarget: Target, options: AnimationOptions) => void;
28
33
  currentScreen: HTMLDivElement;
29
34
  prevScreen: HTMLDivElement;
30
35
  onStart?: (triggered: boolean) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flemo",
3
- "version": "1.1.4",
3
+ "version": "1.3.0",
4
4
  "description": "A modern React router library with built-in motion animations and smooth transitions",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",
@@ -31,7 +31,7 @@
31
31
  "url": "https://github.com/kimjh96/flemo/issues",
32
32
  "email": "kimjhs@kakao.com"
33
33
  },
34
- "homepage": "https://flemo-web.vercel.app",
34
+ "homepage": "https://flemo-dev.lovable.app",
35
35
  "license": "MIT",
36
36
  "scripts": {
37
37
  "build": "vite build",
@@ -50,7 +50,7 @@
50
50
  "@types/node": "^24.3.0",
51
51
  "@types/react": "^19.1.10",
52
52
  "@types/react-dom": "^19.1.7",
53
- "@vitejs/plugin-react-swc": "^4.0.0",
53
+ "@vitejs/plugin-react-swc": "^4.0.1",
54
54
  "eslint": "^9.33.0",
55
55
  "eslint-config-prettier": "^10.1.8",
56
56
  "eslint-import-resolver-typescript": "^4.4.4",
@@ -64,7 +64,7 @@
64
64
  "prettier": "^3.6.2",
65
65
  "typescript": "^5.9.2",
66
66
  "typescript-eslint": "^8.39.1",
67
- "vite": "^7.1.2",
67
+ "vite": "^7.1.5",
68
68
  "vite-plugin-dts": "^4.5.4"
69
69
  },
70
70
  "peerDependencies": {
@@ -1,299 +0,0 @@
1
- import C from "react";
2
- var d = {}, N;
3
- function H() {
4
- if (N) return d;
5
- N = 1, Object.defineProperty(d, "__esModule", { value: !0 }), d.TokenData = void 0, d.parse = m, d.compile = R, d.match = M, d.pathToRegexp = j, d.stringify = k;
6
- const c = "/", a = (n) => n, l = /^[$_\p{ID_Start}]$/u, h = /^[$\u200c\u200d\p{ID_Continue}]$/u, $ = "https://git.new/pathToRegexpError", b = {
7
- // Groups.
8
- "{": "{",
9
- "}": "}",
10
- // Reserved.
11
- "(": "(",
12
- ")": ")",
13
- "[": "[",
14
- "]": "]",
15
- "+": "+",
16
- "?": "?",
17
- "!": "!"
18
- };
19
- function _(n) {
20
- return n.replace(/[{}()\[\]+?!:*]/g, "\\$&");
21
- }
22
- function f(n) {
23
- return n.replace(/[.+*?^${}()[\]|/\\]/g, "\\$&");
24
- }
25
- function* I(n) {
26
- const t = [...n];
27
- let e = 0;
28
- function o() {
29
- let r = "";
30
- if (l.test(t[++e]))
31
- for (r += t[e]; h.test(t[++e]); )
32
- r += t[e];
33
- else if (t[e] === '"') {
34
- let s = e;
35
- for (; e < t.length; ) {
36
- if (t[++e] === '"') {
37
- e++, s = 0;
38
- break;
39
- }
40
- t[e] === "\\" ? r += t[++e] : r += t[e];
41
- }
42
- if (s)
43
- throw new TypeError(`Unterminated quote at ${s}: ${$}`);
44
- }
45
- if (!r)
46
- throw new TypeError(`Missing parameter name at ${e}: ${$}`);
47
- return r;
48
- }
49
- for (; e < t.length; ) {
50
- const r = t[e], s = b[r];
51
- if (s)
52
- yield { type: s, index: e++, value: r };
53
- else if (r === "\\")
54
- yield { type: "ESCAPED", index: e++, value: t[e++] };
55
- else if (r === ":") {
56
- const u = o();
57
- yield { type: "PARAM", index: e, value: u };
58
- } else if (r === "*") {
59
- const u = o();
60
- yield { type: "WILDCARD", index: e, value: u };
61
- } else
62
- yield { type: "CHAR", index: e, value: t[e++] };
63
- }
64
- return { type: "END", index: e, value: "" };
65
- }
66
- class g {
67
- constructor(t) {
68
- this.tokens = t;
69
- }
70
- peek() {
71
- if (!this._peek) {
72
- const t = this.tokens.next();
73
- this._peek = t.value;
74
- }
75
- return this._peek;
76
- }
77
- tryConsume(t) {
78
- const e = this.peek();
79
- if (e.type === t)
80
- return this._peek = void 0, e.value;
81
- }
82
- consume(t) {
83
- const e = this.tryConsume(t);
84
- if (e !== void 0)
85
- return e;
86
- const { type: o, index: r } = this.peek();
87
- throw new TypeError(`Unexpected ${o} at ${r}, expected ${t}: ${$}`);
88
- }
89
- text() {
90
- let t = "", e;
91
- for (; e = this.tryConsume("CHAR") || this.tryConsume("ESCAPED"); )
92
- t += e;
93
- return t;
94
- }
95
- }
96
- class x {
97
- constructor(t) {
98
- this.tokens = t;
99
- }
100
- }
101
- d.TokenData = x;
102
- function m(n, t = {}) {
103
- const { encodePath: e = a } = t, o = new g(I(n));
104
- function r(u) {
105
- const i = [];
106
- for (; ; ) {
107
- const p = o.text();
108
- p && i.push({ type: "text", value: e(p) });
109
- const y = o.tryConsume("PARAM");
110
- if (y) {
111
- i.push({
112
- type: "param",
113
- name: y
114
- });
115
- continue;
116
- }
117
- const S = o.tryConsume("WILDCARD");
118
- if (S) {
119
- i.push({
120
- type: "wildcard",
121
- name: S
122
- });
123
- continue;
124
- }
125
- if (o.tryConsume("{")) {
126
- i.push({
127
- type: "group",
128
- tokens: r("}")
129
- });
130
- continue;
131
- }
132
- return o.consume(u), i;
133
- }
134
- }
135
- const s = r("END");
136
- return new x(s);
137
- }
138
- function R(n, t = {}) {
139
- const { encode: e = encodeURIComponent, delimiter: o = c } = t, r = n instanceof x ? n : m(n, t), s = T(r.tokens, o, e);
140
- return function(i = {}) {
141
- const [p, ...y] = s(i);
142
- if (y.length)
143
- throw new TypeError(`Missing parameters: ${y.join(", ")}`);
144
- return p;
145
- };
146
- }
147
- function T(n, t, e) {
148
- const o = n.map((r) => P(r, t, e));
149
- return (r) => {
150
- const s = [""];
151
- for (const u of o) {
152
- const [i, ...p] = u(r);
153
- s[0] += i, s.push(...p);
154
- }
155
- return s;
156
- };
157
- }
158
- function P(n, t, e) {
159
- if (n.type === "text")
160
- return () => [n.value];
161
- if (n.type === "group") {
162
- const r = T(n.tokens, t, e);
163
- return (s) => {
164
- const [u, ...i] = r(s);
165
- return i.length ? [""] : [u];
166
- };
167
- }
168
- const o = e || a;
169
- return n.type === "wildcard" && e !== !1 ? (r) => {
170
- const s = r[n.name];
171
- if (s == null)
172
- return ["", n.name];
173
- if (!Array.isArray(s) || s.length === 0)
174
- throw new TypeError(`Expected "${n.name}" to be a non-empty array`);
175
- return [
176
- s.map((u, i) => {
177
- if (typeof u != "string")
178
- throw new TypeError(`Expected "${n.name}/${i}" to be a string`);
179
- return o(u);
180
- }).join(t)
181
- ];
182
- } : (r) => {
183
- const s = r[n.name];
184
- if (s == null)
185
- return ["", n.name];
186
- if (typeof s != "string")
187
- throw new TypeError(`Expected "${n.name}" to be a string`);
188
- return [o(s)];
189
- };
190
- }
191
- function M(n, t = {}) {
192
- const { decode: e = decodeURIComponent, delimiter: o = c } = t, { regexp: r, keys: s } = j(n, t), u = s.map((i) => e === !1 ? a : i.type === "param" ? e : (p) => p.split(o).map(e));
193
- return function(p) {
194
- const y = r.exec(p);
195
- if (!y)
196
- return !1;
197
- const S = y[0], w = /* @__PURE__ */ Object.create(null);
198
- for (let E = 1; E < y.length; E++) {
199
- if (y[E] === void 0)
200
- continue;
201
- const v = s[E - 1], A = u[E - 1];
202
- w[v.name] = A(y[E]);
203
- }
204
- return { path: S, params: w };
205
- };
206
- }
207
- function j(n, t = {}) {
208
- const { delimiter: e = c, end: o = !0, sensitive: r = !1, trailing: s = !0 } = t, u = [], i = [], p = r ? "" : "i", S = (Array.isArray(n) ? n : [n]).map((v) => v instanceof x ? v : m(v, t));
209
- for (const { tokens: v } of S)
210
- for (const A of D(v, 0, [])) {
211
- const B = L(A, e, u);
212
- i.push(B);
213
- }
214
- let w = `^(?:${i.join("|")})`;
215
- return s && (w += `(?:${f(e)}$)?`), w += o ? "$" : `(?=${f(e)}|$)`, { regexp: new RegExp(w, p), keys: u };
216
- }
217
- function* D(n, t, e) {
218
- if (t === n.length)
219
- return yield e;
220
- const o = n[t];
221
- if (o.type === "group") {
222
- const r = e.slice();
223
- for (const s of D(o.tokens, 0, r))
224
- yield* D(n, t + 1, s);
225
- } else
226
- e.push(o);
227
- yield* D(n, t + 1, e);
228
- }
229
- function L(n, t, e) {
230
- let o = "", r = "", s = !0;
231
- for (let u = 0; u < n.length; u++) {
232
- const i = n[u];
233
- if (i.type === "text") {
234
- o += f(i.value), r += i.value, s || (s = i.value.includes(t));
235
- continue;
236
- }
237
- if (i.type === "param" || i.type === "wildcard") {
238
- if (!s && !r)
239
- throw new TypeError(`Missing text after "${i.name}": ${$}`);
240
- i.type === "param" ? o += `(${q(t, s ? "" : r)}+)` : o += "([\\s\\S]+)", e.push(i), r = "", s = !1;
241
- continue;
242
- }
243
- }
244
- return o;
245
- }
246
- function q(n, t) {
247
- return t.length < 2 ? n.length < 2 ? `[^${f(n + t)}]` : `(?:(?!${f(n)})[^${f(t)}])` : n.length < 2 ? `(?:(?!${f(t)})[^${f(n)}])` : `(?:(?!${f(t)}|${f(n)})[\\s\\S])`;
248
- }
249
- function k(n) {
250
- return n.tokens.map(function t(e, o, r) {
251
- if (e.type === "text")
252
- return _(e.value);
253
- if (e.type === "group")
254
- return `{${e.tokens.map(t).join("")}}`;
255
- const u = F(e.name) && V(r[o + 1]) ? e.name : JSON.stringify(e.name);
256
- if (e.type === "param")
257
- return `:${u}`;
258
- if (e.type === "wildcard")
259
- return `*${u}`;
260
- throw new TypeError(`Unexpected token: ${e}`);
261
- }).join("");
262
- }
263
- function F(n) {
264
- const [t, ...e] = n;
265
- return l.test(t) ? e.every((o) => h.test(o)) : !1;
266
- }
267
- function V(n) {
268
- return n?.type !== "text" ? !0 : !h.test(n.value[0]);
269
- }
270
- return d;
271
- }
272
- var z = H();
273
- const O = (c) => {
274
- let a;
275
- const l = /* @__PURE__ */ new Set(), h = (g, x) => {
276
- const m = typeof g == "function" ? g(a) : g;
277
- if (!Object.is(m, a)) {
278
- const R = a;
279
- a = x ?? (typeof m != "object" || m === null) ? m : Object.assign({}, a, m), l.forEach((T) => T(a, R));
280
- }
281
- }, $ = () => a, f = { setState: h, getState: $, getInitialState: () => I, subscribe: (g) => (l.add(g), () => l.delete(g)) }, I = a = c(h, $, f);
282
- return f;
283
- }, W = (c) => c ? O(c) : O, G = (c) => c;
284
- function J(c, a = G) {
285
- const l = C.useSyncExternalStore(
286
- c.subscribe,
287
- C.useCallback(() => a(c.getState()), [c, a]),
288
- C.useCallback(() => a(c.getInitialState()), [c, a])
289
- );
290
- return C.useDebugValue(l), l;
291
- }
292
- const U = (c) => {
293
- const a = W(c), l = (h) => J(a, h);
294
- return Object.assign(l, a), l;
295
- }, Q = (c) => c ? U(c) : U;
296
- export {
297
- Q as c,
298
- z as d
299
- };