@berenjena/react-dev-panel 0.0.1-beta.1

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 (118) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/BooleanControl.css +1 -0
  3. package/dist/assets/ButtonControl.css +1 -0
  4. package/dist/assets/ColorControl.css +1 -0
  5. package/dist/assets/DevPanel.css +1 -0
  6. package/dist/assets/EmptyContent.css +1 -0
  7. package/dist/assets/NumberControl.css +1 -0
  8. package/dist/assets/Section.css +1 -0
  9. package/dist/assets/SelectControl.css +1 -0
  10. package/dist/assets/TextControl.css +1 -0
  11. package/dist/assets/index.css +1 -0
  12. package/dist/components/ControlRenderer/ControlRenderer.d.ts +6 -0
  13. package/dist/components/ControlRenderer/ControlRenderer.js +8 -0
  14. package/dist/components/ControlRenderer/controls/BooleanControl/BooleanControl.d.ts +16 -0
  15. package/dist/components/ControlRenderer/controls/BooleanControl/BooleanControl.js +24 -0
  16. package/dist/components/ControlRenderer/controls/BooleanControl/index.d.ts +1 -0
  17. package/dist/components/ControlRenderer/controls/BooleanControl/index.js +4 -0
  18. package/dist/components/ControlRenderer/controls/ButtonControl/ButtonControl.d.ts +16 -0
  19. package/dist/components/ControlRenderer/controls/ButtonControl/ButtonControl.js +10 -0
  20. package/dist/components/ControlRenderer/controls/ButtonControl/index.d.ts +1 -0
  21. package/dist/components/ControlRenderer/controls/ButtonControl/index.js +4 -0
  22. package/dist/components/ControlRenderer/controls/ColorControl/ColorControl.d.ts +16 -0
  23. package/dist/components/ControlRenderer/controls/ColorControl/ColorControl.js +19 -0
  24. package/dist/components/ControlRenderer/controls/ColorControl/index.d.ts +1 -0
  25. package/dist/components/ControlRenderer/controls/ColorControl/index.js +4 -0
  26. package/dist/components/ControlRenderer/controls/NumberControl/NumberControl.d.ts +16 -0
  27. package/dist/components/ControlRenderer/controls/NumberControl/NumberControl.js +22 -0
  28. package/dist/components/ControlRenderer/controls/NumberControl/index.d.ts +1 -0
  29. package/dist/components/ControlRenderer/controls/NumberControl/index.js +4 -0
  30. package/dist/components/ControlRenderer/controls/SelectControl/SelectControl.d.ts +15 -0
  31. package/dist/components/ControlRenderer/controls/SelectControl/SelectControl.js +13 -0
  32. package/dist/components/ControlRenderer/controls/SelectControl/index.d.ts +1 -0
  33. package/dist/components/ControlRenderer/controls/SelectControl/index.js +4 -0
  34. package/dist/components/ControlRenderer/controls/TextControl/TextControl.d.ts +17 -0
  35. package/dist/components/ControlRenderer/controls/TextControl/TextControl.js +20 -0
  36. package/dist/components/ControlRenderer/controls/TextControl/index.d.ts +1 -0
  37. package/dist/components/ControlRenderer/controls/TextControl/index.js +4 -0
  38. package/dist/components/ControlRenderer/controls/index.d.ts +13 -0
  39. package/dist/components/ControlRenderer/controls/index.js +37 -0
  40. package/dist/components/ControlRenderer/index.d.ts +1 -0
  41. package/dist/components/ControlRenderer/index.js +4 -0
  42. package/dist/components/DevPanel/DevPanel.d.ts +11 -0
  43. package/dist/components/DevPanel/DevPanel.js +74 -0
  44. package/dist/components/DevPanel/index.d.ts +1 -0
  45. package/dist/components/DevPanel/index.js +4 -0
  46. package/dist/components/EmptyContent/EmptyContent.d.ts +1 -0
  47. package/dist/components/EmptyContent/EmptyContent.js +18 -0
  48. package/dist/components/EmptyContent/index.d.ts +1 -0
  49. package/dist/components/EmptyContent/index.js +4 -0
  50. package/dist/components/Section/Section.d.ts +7 -0
  51. package/dist/components/Section/Section.js +23 -0
  52. package/dist/components/Section/index.d.ts +1 -0
  53. package/dist/components/Section/index.js +4 -0
  54. package/dist/components/index.d.ts +2 -0
  55. package/dist/components/index.js +7 -0
  56. package/dist/components/logger.d.ts +5 -0
  57. package/dist/components/logger.js +7 -0
  58. package/dist/hooks/useDevPanel/index.d.ts +1 -0
  59. package/dist/hooks/useDevPanel/index.js +4 -0
  60. package/dist/hooks/useDevPanel/useDevPanel.d.ts +24 -0
  61. package/dist/hooks/useDevPanel/useDevPanel.js +15 -0
  62. package/dist/hooks/useDragAndDrop/index.d.ts +1 -0
  63. package/dist/hooks/useDragAndDrop/index.js +4 -0
  64. package/dist/hooks/useDragAndDrop/useDragAndDrop.d.ts +16 -0
  65. package/dist/hooks/useDragAndDrop/useDragAndDrop.js +55 -0
  66. package/dist/hooks/useHotkeys/example.d.ts +5 -0
  67. package/dist/hooks/useHotkeys/example.js +266 -0
  68. package/dist/hooks/useHotkeys/index.d.ts +2 -0
  69. package/dist/hooks/useHotkeys/index.js +6 -0
  70. package/dist/hooks/useHotkeys/useHotkey.d.ts +17 -0
  71. package/dist/hooks/useHotkeys/useHotkey.js +7 -0
  72. package/dist/hooks/useHotkeys/useHotkeys.d.ts +38 -0
  73. package/dist/hooks/useHotkeys/useHotkeys.js +31 -0
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.js +7 -0
  76. package/dist/utils/className/className.d.ts +14 -0
  77. package/dist/utils/className/className.js +15 -0
  78. package/dist/utils/className/index.d.ts +1 -0
  79. package/dist/utils/className/index.js +4 -0
  80. package/dist/utils/createHotkey/createHotkey.d.ts +19 -0
  81. package/dist/utils/createHotkey/createHotkey.js +14 -0
  82. package/dist/utils/createHotkey/index.d.ts +1 -0
  83. package/dist/utils/createHotkey/index.js +4 -0
  84. package/dist/utils/debounce/debounce.d.ts +7 -0
  85. package/dist/utils/debounce/debounce.js +9 -0
  86. package/dist/utils/debounce/index.d.ts +1 -0
  87. package/dist/utils/debounce/index.js +4 -0
  88. package/dist/utils/formatHotkey/formatHotkey.d.ts +12 -0
  89. package/dist/utils/formatHotkey/formatHotkey.js +8 -0
  90. package/dist/utils/formatHotkey/index.d.ts +1 -0
  91. package/dist/utils/formatHotkey/index.js +4 -0
  92. package/dist/utils/getConstrainedPosition/getConstrainedPosition.d.ts +8 -0
  93. package/dist/utils/getConstrainedPosition/getConstrainedPosition.js +10 -0
  94. package/dist/utils/getConstrainedPosition/index.d.ts +1 -0
  95. package/dist/utils/getConstrainedPosition/index.js +4 -0
  96. package/dist/utils/getCurrentElementPosition/getCurrentElementPosition.d.ts +7 -0
  97. package/dist/utils/getCurrentElementPosition/getCurrentElementPosition.js +10 -0
  98. package/dist/utils/getCurrentElementPosition/index.d.ts +1 -0
  99. package/dist/utils/getCurrentElementPosition/index.js +4 -0
  100. package/dist/utils/getPositionAdjustment/getPositionAdjustment.d.ts +10 -0
  101. package/dist/utils/getPositionAdjustment/getPositionAdjustment.js +16 -0
  102. package/dist/utils/getPositionAdjustment/index.d.ts +1 -0
  103. package/dist/utils/getPositionAdjustment/index.js +4 -0
  104. package/dist/utils/hasControlChanged/hasControlChanged.d.ts +5 -0
  105. package/dist/utils/hasControlChanged/hasControlChanged.js +14 -0
  106. package/dist/utils/hasControlChanged/index.d.ts +1 -0
  107. package/dist/utils/hasControlChanged/index.js +4 -0
  108. package/dist/utils/index.d.ts +10 -0
  109. package/dist/utils/index.js +27 -0
  110. package/dist/utils/isMacOS/index.d.ts +1 -0
  111. package/dist/utils/isMacOS/index.js +4 -0
  112. package/dist/utils/isMacOS/isMacOS.d.ts +5 -0
  113. package/dist/utils/isMacOS/isMacOS.js +6 -0
  114. package/dist/utils/store/index.d.ts +1 -0
  115. package/dist/utils/store/index.js +9 -0
  116. package/dist/utils/store/store.d.ts +40 -0
  117. package/dist/utils/store/store.js +103 -0
  118. package/package.json +97 -0
@@ -0,0 +1,8 @@
1
+ import { Position } from '../../types';
2
+ /**
3
+ * Calculates the constrained position within viewport boundaries
4
+ * @param position - The desired position
5
+ * @param element - The HTML element to constrain
6
+ * @returns The constrained position that keeps the element within viewport bounds
7
+ */
8
+ export declare function getConstrainedPosition(position: Position, element: HTMLElement): Position;
@@ -0,0 +1,10 @@
1
+ function m(t, i) {
2
+ const n = i.getBoundingClientRect(), e = window.innerWidth, o = window.innerHeight, h = 0, c = 0, a = e - n.width, r = o - n.height;
3
+ return {
4
+ x: Math.max(h, Math.min(a, t.x)),
5
+ y: Math.max(c, Math.min(r, t.y))
6
+ };
7
+ }
8
+ export {
9
+ m as getConstrainedPosition
10
+ };
@@ -0,0 +1 @@
1
+ export * from './getConstrainedPosition';
@@ -0,0 +1,4 @@
1
+ import { getConstrainedPosition as e } from "./getConstrainedPosition.js";
2
+ export {
3
+ e as getConstrainedPosition
4
+ };
@@ -0,0 +1,7 @@
1
+ import { Position } from '../../types';
2
+ /**
3
+ * Gets the current position of an element relative to the viewport
4
+ * @param element - The HTML element
5
+ * @returns The current position of the element
6
+ */
7
+ export declare function getCurrentElementPosition(element: HTMLElement): Position;
@@ -0,0 +1,10 @@
1
+ function n(e) {
2
+ const t = e.getBoundingClientRect();
3
+ return {
4
+ x: t.left,
5
+ y: t.top
6
+ };
7
+ }
8
+ export {
9
+ n as getCurrentElementPosition
10
+ };
@@ -0,0 +1 @@
1
+ export * from './getCurrentElementPosition';
@@ -0,0 +1,4 @@
1
+ import { getCurrentElementPosition as o } from "./getCurrentElementPosition.js";
2
+ export {
3
+ o as getCurrentElementPosition
4
+ };
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Checks if a position adjustment is needed after window resize
3
+ * @param element - The HTML element to check
4
+ * @returns Object containing the current position, constrained position, and whether adjustment is needed
5
+ */
6
+ export declare function getPositionAdjustment(element: HTMLElement): {
7
+ currentPosition: import('../../types').Position;
8
+ constrainedPosition: import('../../types').Position;
9
+ needsAdjustment: boolean;
10
+ };
@@ -0,0 +1,16 @@
1
+ import { getConstrainedPosition as r } from "../getConstrainedPosition/getConstrainedPosition.js";
2
+ import { getCurrentElementPosition as s } from "../getCurrentElementPosition/getCurrentElementPosition.js";
3
+ function m(n) {
4
+ const t = s(n), o = r(
5
+ t,
6
+ n
7
+ ), i = o.x !== t.x || o.y !== t.y;
8
+ return {
9
+ currentPosition: t,
10
+ constrainedPosition: o,
11
+ needsAdjustment: i
12
+ };
13
+ }
14
+ export {
15
+ m as getPositionAdjustment
16
+ };
@@ -0,0 +1 @@
1
+ export * from './getPositionAdjustment';
@@ -0,0 +1,4 @@
1
+ import { getPositionAdjustment as e } from "./getPositionAdjustment.js";
2
+ export {
3
+ e as getPositionAdjustment
4
+ };
@@ -0,0 +1,5 @@
1
+ import { ControlsGroup } from '../../components/ControlRenderer/controls/types';
2
+ /**
3
+ * Compares if the controls have changed (shallow comparison)
4
+ */
5
+ export declare function hasControlsChanged(current: ControlsGroup, previous?: ControlsGroup): boolean;
@@ -0,0 +1,14 @@
1
+ function s(n, r) {
2
+ if (!r) return !0;
3
+ const i = Object.keys(n), l = Object.keys(r);
4
+ if (i.length !== l.length) return !0;
5
+ for (const u of i) {
6
+ const t = n[u], e = r[u];
7
+ if (!e || t.type !== e.type || t.label !== e.label || t.disabled !== e.disabled || "value" in t && "value" in e && t.value !== e.value || t.type === "number" && e.type === "number" && (t.min !== e.min || t.max !== e.max || t.step !== e.step) || t.type === "select" && e.type === "select" && JSON.stringify(t.options) !== JSON.stringify(e.options) || t.type === "text" && e.type === "text" && t.placeholder !== e.placeholder)
8
+ return !0;
9
+ }
10
+ return !1;
11
+ }
12
+ export {
13
+ s as hasControlsChanged
14
+ };
@@ -0,0 +1 @@
1
+ export * from './hasControlChanged';
@@ -0,0 +1,4 @@
1
+ import { hasControlsChanged as a } from "./hasControlChanged.js";
2
+ export {
3
+ a as hasControlsChanged
4
+ };
@@ -0,0 +1,10 @@
1
+ export * from './className';
2
+ export * from './createHotkey';
3
+ export * from './debounce';
4
+ export * from './formatHotkey';
5
+ export * from './getConstrainedPosition';
6
+ export * from './getCurrentElementPosition';
7
+ export * from './getPositionAdjustment';
8
+ export * from './hasControlChanged';
9
+ export * from './isMacOS';
10
+ export * from './store';
@@ -0,0 +1,27 @@
1
+ import { className as t } from "./className/className.js";
2
+ import { createHotkey as s } from "./createHotkey/createHotkey.js";
3
+ import { debounce as a } from "./debounce/debounce.js";
4
+ import { formatHotkey as m } from "./formatHotkey/formatHotkey.js";
5
+ import { getConstrainedPosition as f } from "./getConstrainedPosition/getConstrainedPosition.js";
6
+ import { getCurrentElementPosition as x } from "./getCurrentElementPosition/getCurrentElementPosition.js";
7
+ import { getPositionAdjustment as u } from "./getPositionAdjustment/getPositionAdjustment.js";
8
+ import { hasControlsChanged as v } from "./hasControlChanged/hasControlChanged.js";
9
+ import { isMacOS as d } from "./isMacOS/isMacOS.js";
10
+ import { useDevPanelActions as g, useDevPanelCollapsed as S, useDevPanelPosition as b, useDevPanelSections as h, useDevPanelStore as k, useDevPanelVisible as y } from "./store/store.js";
11
+ export {
12
+ t as className,
13
+ s as createHotkey,
14
+ a as debounce,
15
+ m as formatHotkey,
16
+ f as getConstrainedPosition,
17
+ x as getCurrentElementPosition,
18
+ u as getPositionAdjustment,
19
+ v as hasControlsChanged,
20
+ d as isMacOS,
21
+ g as useDevPanelActions,
22
+ S as useDevPanelCollapsed,
23
+ b as useDevPanelPosition,
24
+ h as useDevPanelSections,
25
+ k as useDevPanelStore,
26
+ y as useDevPanelVisible
27
+ };
@@ -0,0 +1 @@
1
+ export * from './isMacOS';
@@ -0,0 +1,4 @@
1
+ import { isMacOS as a } from "./isMacOS.js";
2
+ export {
3
+ a as isMacOS
4
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Utility function to detect if the user is on macOS
3
+ * Uses modern alternatives to deprecated navigator.platform
4
+ */
5
+ export declare function isMacOS(): boolean;
@@ -0,0 +1,6 @@
1
+ function e() {
2
+ return typeof navigator < "u" && "userAgentData" in navigator ? navigator.userAgentData?.platform === "macOS" : typeof navigator < "u" && navigator.userAgent ? /Mac|iPhone|iPad|iPod/i.test(navigator.userAgent) : typeof navigator < "u" && navigator.platform?.toLowerCase().includes("mac") || !1;
3
+ }
4
+ export {
5
+ e as isMacOS
6
+ };
@@ -0,0 +1 @@
1
+ export * from './store';
@@ -0,0 +1,9 @@
1
+ import { useDevPanelActions as l, useDevPanelCollapsed as n, useDevPanelPosition as o, useDevPanelSections as a, useDevPanelStore as P, useDevPanelVisible as i } from "./store.js";
2
+ export {
3
+ l as useDevPanelActions,
4
+ n as useDevPanelCollapsed,
5
+ o as useDevPanelPosition,
6
+ a as useDevPanelSections,
7
+ P as useDevPanelStore,
8
+ i as useDevPanelVisible
9
+ };
@@ -0,0 +1,40 @@
1
+ import { ControlsGroup } from '../../components/ControlRenderer/controls/types';
2
+ import { DevPanelStore } from '../../components/DevPanel/types';
3
+ export declare const useDevPanelStore: import('zustand').UseBoundStore<Omit<import('zustand').StoreApi<DevPanelStore>, "persist"> & {
4
+ persist: {
5
+ setOptions: (options: Partial<import('zustand/middleware').PersistOptions<DevPanelStore, {
6
+ isVisible: boolean;
7
+ isCollapsed: boolean;
8
+ position: import('../../types').Position;
9
+ sectionCollapseState: {
10
+ [k: string]: boolean | undefined;
11
+ };
12
+ }>>) => void;
13
+ clearStorage: () => void;
14
+ rehydrate: () => Promise<void> | void;
15
+ hasHydrated: () => boolean;
16
+ onHydrate: (fn: (state: DevPanelStore) => void) => () => void;
17
+ onFinishHydration: (fn: (state: DevPanelStore) => void) => () => void;
18
+ getOptions: () => Partial<import('zustand/middleware').PersistOptions<DevPanelStore, {
19
+ isVisible: boolean;
20
+ isCollapsed: boolean;
21
+ position: import('../../types').Position;
22
+ sectionCollapseState: {
23
+ [k: string]: boolean | undefined;
24
+ };
25
+ }>>;
26
+ };
27
+ }>;
28
+ export declare const useDevPanelVisible: () => boolean;
29
+ export declare const useDevPanelCollapsed: () => boolean;
30
+ export declare const useDevPanelPosition: () => import('../../types').Position;
31
+ export declare const useDevPanelSections: () => Record<string, import('../../components/DevPanel/types').DevPanelSection>;
32
+ export declare const useDevPanelActions: () => {
33
+ setVisible: (visible: boolean) => void;
34
+ setCollapsed: (collapsed: boolean) => void;
35
+ setPosition: (position: import('../../types').Position) => void;
36
+ registerSection: (name: string, controls: ControlsGroup) => void;
37
+ unregisterSection: (name: string) => void;
38
+ toggleSectionCollapse: (name: string) => void;
39
+ reset: () => void;
40
+ };
@@ -0,0 +1,103 @@
1
+ import { create as a } from "zustand";
2
+ import { persist as d } from "zustand/middleware";
3
+ import { useShallow as C } from "zustand/react/shallow";
4
+ const c = { x: 20, y: 20 }, t = a()(
5
+ d(
6
+ (e) => ({
7
+ // State
8
+ isVisible: !1,
9
+ isCollapsed: !1,
10
+ sections: {},
11
+ position: c,
12
+ // Actions
13
+ setVisible: (s) => {
14
+ e({ isVisible: s });
15
+ },
16
+ setCollapsed: (s) => {
17
+ e({ isCollapsed: s });
18
+ },
19
+ setPosition: (s) => {
20
+ e({ position: s });
21
+ },
22
+ registerSection: (s, i) => {
23
+ e((o) => {
24
+ const l = o.sections[s];
25
+ let n = !1;
26
+ try {
27
+ const r = localStorage.getItem("berenjena-dev-panel-storage");
28
+ r && (n = JSON.parse(r).state?.sectionCollapseState?.[s] ?? !1);
29
+ } catch {
30
+ }
31
+ const p = l?.isCollapsed ?? n;
32
+ return {
33
+ sections: {
34
+ ...o.sections,
35
+ [s]: {
36
+ name: s,
37
+ controls: i,
38
+ isCollapsed: p
39
+ }
40
+ }
41
+ };
42
+ });
43
+ },
44
+ unregisterSection: (s) => {
45
+ e((i) => {
46
+ const { [s]: o, ...l } = i.sections;
47
+ return { sections: l };
48
+ });
49
+ },
50
+ toggleSectionCollapse: (s) => {
51
+ e((i) => {
52
+ const o = i.sections[s];
53
+ return o ? {
54
+ sections: {
55
+ ...i.sections,
56
+ [s]: {
57
+ ...o,
58
+ isCollapsed: !o.isCollapsed
59
+ }
60
+ }
61
+ } : i;
62
+ });
63
+ },
64
+ reset: () => {
65
+ e({
66
+ isVisible: !1,
67
+ isCollapsed: !1,
68
+ sections: {},
69
+ position: c
70
+ });
71
+ }
72
+ }),
73
+ {
74
+ name: "dev-panel-storage",
75
+ partialize: (e) => ({
76
+ isVisible: e.isVisible,
77
+ isCollapsed: e.isCollapsed,
78
+ position: e.position,
79
+ // DO NOT persist sections - they are dynamic and are recreated on mount
80
+ // Only save the collapse state of each section
81
+ sectionCollapseState: Object.fromEntries(Object.entries(e.sections).map(([s, i]) => [s, i.isCollapsed]))
82
+ })
83
+ }
84
+ )
85
+ ), f = () => t((e) => e.isVisible), P = () => t((e) => e.isCollapsed), V = () => t((e) => e.position), v = () => t((e) => e.sections), m = () => t(
86
+ C((e) => ({
87
+ setVisible: e.setVisible,
88
+ setCollapsed: e.setCollapsed,
89
+ setPosition: e.setPosition,
90
+ registerSection: e.registerSection,
91
+ unregisterSection: e.unregisterSection,
92
+ toggleSectionCollapse: e.toggleSectionCollapse,
93
+ reset: e.reset
94
+ }))
95
+ );
96
+ export {
97
+ m as useDevPanelActions,
98
+ P as useDevPanelCollapsed,
99
+ V as useDevPanelPosition,
100
+ v as useDevPanelSections,
101
+ t as useDevPanelStore,
102
+ f as useDevPanelVisible
103
+ };
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@berenjena/react-dev-panel",
3
+ "description": "A React development panel with various tools and utilities.",
4
+ "keywords": [
5
+ "react",
6
+ "development",
7
+ "panel",
8
+ "tools",
9
+ "utilities"
10
+ ],
11
+ "homepage": "https://github.com/Berenjenas/react-dev-panel",
12
+ "bugs": "https://github.com/Berenjenas/react-dev-panel/issues",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/Berenjenas/react-dev-panel.git"
16
+ },
17
+ "private": false,
18
+ "version": "0.0.1-beta.1",
19
+ "type": "module",
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "main": "./dist/index.umd.js",
24
+ "module": "./dist/index.js",
25
+ "exports": {
26
+ ".": {
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.umd.js"
29
+ },
30
+ "./styles.css": "./dist/styles.css"
31
+ },
32
+ "sideEffects": [
33
+ "*.css"
34
+ ],
35
+ "license": "MIT",
36
+ "contributors": [
37
+ {
38
+ "name": "David Gallegos",
39
+ "email": "admin@berenjena.com.ar",
40
+ "url": "https://github.com/dallegos"
41
+ },
42
+ {
43
+ "name": "Emilio Dominguez",
44
+ "email": "admin@berenjena.com.ar",
45
+ "url": "https://github.com/emiliodominguez"
46
+ },
47
+ {
48
+ "name": "Maximiliano Kucan",
49
+ "email": "admin@berenjena.com.ar",
50
+ "url": "https://github.com/maxikucan"
51
+ }
52
+ ],
53
+ "scripts": {
54
+ "dev": "vite",
55
+ "build": "tsc -b && vite build",
56
+ "lint": "eslint .",
57
+ "preview": "vite preview",
58
+ "storybook": "storybook dev -p 6006",
59
+ "build-storybook": "storybook build",
60
+ "test": "vitest"
61
+ },
62
+ "peerDependencies": {
63
+ "react": "^19.1.0",
64
+ "react-dom": "^19.1.0",
65
+ "zustand": "^5.0.6"
66
+ },
67
+ "devDependencies": {
68
+ "@eslint/js": "^9.30.1",
69
+ "@storybook/addon-docs": "^9.0.17",
70
+ "@storybook/react-vite": "^9.0.17",
71
+ "@types/node": "^24.0.15",
72
+ "@types/react": "^19.1.8",
73
+ "@types/react-dom": "^19.1.6",
74
+ "@vitejs/plugin-react-swc": "^3.10.2",
75
+ "@vitest/coverage-v8": "^3.2.4",
76
+ "@vitest/ui": "^3.2.4",
77
+ "eslint": "^9.30.1",
78
+ "eslint-plugin-react-hooks": "^5.2.0",
79
+ "eslint-plugin-react-refresh": "^0.4.20",
80
+ "eslint-plugin-simple-import-sort": "^12.1.1",
81
+ "eslint-plugin-storybook": "^9.0.17",
82
+ "glob": "^11.0.3",
83
+ "globals": "^16.3.0",
84
+ "happy-dom": "^18.0.1",
85
+ "react": "^19.1.0",
86
+ "react-dom": "^19.1.0",
87
+ "sass-embedded": "^1.89.2",
88
+ "storybook": "^9.0.17",
89
+ "typescript": "~5.8.3",
90
+ "typescript-eslint": "^8.35.1",
91
+ "vite": "^7.0.4",
92
+ "vite-plugin-dts": "^4.5.4",
93
+ "vite-plugin-lib-inject-css": "^2.2.2",
94
+ "vitest": "^3.2.4",
95
+ "zustand": "^5.0.6"
96
+ }
97
+ }