Skip to content

Commit 76ee6ba

Browse files
Feat: Add Hooks and partial stories
1 parent 8eadf60 commit 76ee6ba

File tree

109 files changed

+5579
-530
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+5579
-530
lines changed

package-lock.json

+145-395
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+17-10
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,17 @@
7171
"@radix-ui/react-toggle-group": "^1.1.2",
7272
"@radix-ui/react-tooltip": "^1.1.8",
7373
"@tailwindcss/postcss": "^4.0.12",
74-
"react": "^19.0.0",
7574
"cmdk": "^1.1.1",
75+
"copy-to-clipboard": "^3.3.3",
7676
"embla-carousel-react": "^8.5.2",
7777
"input-otp": "^1.4.2",
78+
"js-cookie": "^3.0.5",
79+
"react": "^19.0.0",
7880
"react-day-picker": "^9.6.2",
7981
"react-dom": "^19.0.0",
8082
"react-hook-form": "^7.54.2",
8183
"react-resizable-panels": "^2.1.7",
84+
"screenfull": "^6.0.2",
8285
"vaul": "^1.1.2"
8386
},
8487
"devDependencies": {
@@ -111,6 +114,7 @@
111114
"@testing-library/react": "^16.0.1",
112115
"@testing-library/user-event": "^14.4.3",
113116
"@types/jest": "^29.5.0",
117+
"@types/js-cookie": "^3.0.6",
114118
"@types/react": "^19.0.10",
115119
"@types/react-dom": "^19.0.4",
116120
"autoprefixer": "^10.4.20",
@@ -163,10 +167,10 @@
163167
"dependencies": {
164168
"@babel/runtime": "^7.26.0",
165169
"@hookform/resolvers": "^4.1.3",
166-
"@radix-ui/react-accordion": "^1.2.3",
167-
"@radix-ui/react-alert-dialog": "^1.1.6",
168-
"@radix-ui/react-aspect-ratio": "^1.1.2",
169-
"@radix-ui/react-avatar": "^1.1.3",
170+
"@radix-ui/react-accordion": "^1.2.1",
171+
"@radix-ui/react-alert-dialog": "^1.1.2",
172+
"@radix-ui/react-aspect-ratio": "^1.1.0",
173+
"@radix-ui/react-avatar": "^1.1.1",
170174
"@radix-ui/react-checkbox": "^1.1.4",
171175
"@radix-ui/react-collapsible": "^1.1.3",
172176
"@radix-ui/react-context-menu": "^2.2.6",
@@ -183,24 +187,27 @@
183187
"@radix-ui/react-select": "^2.1.6",
184188
"@radix-ui/react-separator": "^1.1.2",
185189
"@radix-ui/react-slider": "^1.2.3",
186-
"@radix-ui/react-slot": "^1.1.2",
190+
"@radix-ui/react-slot": "^1.1.0",
187191
"@radix-ui/react-switch": "^1.1.3",
188192
"@radix-ui/react-tabs": "^1.1.3",
189193
"@radix-ui/react-toast": "^1.2.6",
190194
"@radix-ui/react-toggle": "^1.1.2",
191195
"@radix-ui/react-toggle-group": "^1.1.2",
192196
"@radix-ui/react-tooltip": "^1.1.8",
193-
"cmdk": "^1.0.0",
197+
"cmdk": "^1.1.1",
198+
"copy-to-clipboard": "^3.3.3",
194199
"date-fns": "^4.1.0",
195-
"embla-carousel-react": "^7.1.0",
200+
"embla-carousel-react": "^8.5.2",
196201
"input-otp": "^1.4.2",
202+
"js-cookie": "^3.0.5",
197203
"next-themes": "^0.4.5",
198204
"react": "^19.0.0",
199-
"react-day-picker": "^8.10.1",
205+
"react-day-picker": "^9.6.2",
200206
"react-dom": "^19.0.0",
201207
"react-hook-form": "^7.54.2",
202208
"react-resizable-panels": "^2.1.7",
203209
"recharts": "^2.15.1",
210+
"screenfull": "^6.0.2",
204211
"sonner": "^2.0.1",
205212
"vaul": "^1.1.2",
206213
"zod": "^3.24.2"
@@ -267,4 +274,4 @@
267274
]
268275
}
269276
}
270-
}
277+
}

src/hooks/factory/createBreakpoint.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { useEffect, useMemo, useState } from "react";
2+
import { isBrowser, off, on } from "../misc/util";
3+
4+
const createBreakpoint =
5+
(
6+
breakpoints: { [name: string]: number } = {
7+
laptopL: 1440,
8+
laptop: 1024,
9+
tablet: 768,
10+
},
11+
) =>
12+
() => {
13+
const [screen, setScreen] = useState(isBrowser ? window.innerWidth : 0);
14+
15+
useEffect(() => {
16+
const setSideScreen = (): void => {
17+
setScreen(window.innerWidth);
18+
};
19+
setSideScreen();
20+
on(window, "resize", setSideScreen);
21+
return () => {
22+
off(window, "resize", setSideScreen);
23+
};
24+
});
25+
const sortedBreakpoints = useMemo(
26+
() => Object.entries(breakpoints).sort((a, b) => (a[1] >= b[1] ? 1 : -1)),
27+
[breakpoints],
28+
);
29+
const result = sortedBreakpoints.reduce((acc, [name, width]) => {
30+
if (screen >= width) {
31+
return name;
32+
} else {
33+
return acc;
34+
}
35+
}, sortedBreakpoints[0][0]);
36+
return result;
37+
};
38+
39+
export default createBreakpoint;
+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import { useState } from "react";
3+
import {
4+
IHookStateInitAction,
5+
IHookStateSetAction,
6+
resolveHookState,
7+
} from "../misc/hookState";
8+
import useEffectOnce from "../useEffectOnce";
9+
import useIsomorphicLayoutEffect from "../useIsomorphicLayoutEffect";
10+
11+
export function createGlobalState<S = any>(
12+
initialState: IHookStateInitAction<S>,
13+
): () => [S, (state: IHookStateSetAction<S>) => void];
14+
export function createGlobalState<S = undefined>(): () => [
15+
S,
16+
(state: IHookStateSetAction<S>) => void,
17+
];
18+
19+
export function createGlobalState<S>(initialState?: S) {
20+
const store: {
21+
state: S;
22+
setState: (state: IHookStateSetAction<S>) => void;
23+
setters: any[];
24+
} = {
25+
state: initialState instanceof Function ? initialState() : initialState,
26+
setState(nextState: IHookStateSetAction<S>) {
27+
store.state = resolveHookState(nextState, store.state);
28+
store.setters.forEach((setter) => setter(store.state));
29+
},
30+
setters: [],
31+
};
32+
33+
return () => {
34+
const [globalState, stateSetter] = useState<S | undefined>(store.state);
35+
36+
useEffectOnce(() => () => {
37+
store.setters = store.setters.filter((setter) => setter !== stateSetter);
38+
});
39+
40+
useIsomorphicLayoutEffect(() => {
41+
if (!store.setters.includes(stateSetter)) {
42+
store.setters.push(stateSetter);
43+
}
44+
});
45+
46+
return [globalState, store.setState];
47+
};
48+
}
49+
50+
export default createGlobalState;

0 commit comments

Comments
 (0)