@yca-software/yca-react-core 0.0.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 (87) hide show
  1. package/README.md +129 -0
  2. package/dist/admin/index.d.ts +10 -0
  3. package/dist/admin/index.js +3 -0
  4. package/dist/admin/index.js.map +1 -0
  5. package/dist/admin-BVYdWtEy.d.ts +3 -0
  6. package/dist/api/index.d.ts +68 -0
  7. package/dist/api/index.js +3 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/auth/index.d.ts +49 -0
  10. package/dist/auth/index.js +3 -0
  11. package/dist/auth/index.js.map +1 -0
  12. package/dist/chunk-2HJO2ICF.js +339 -0
  13. package/dist/chunk-2HJO2ICF.js.map +1 -0
  14. package/dist/chunk-3AYG73DK.js +174 -0
  15. package/dist/chunk-3AYG73DK.js.map +1 -0
  16. package/dist/chunk-3SCZ4Z6P.js +26 -0
  17. package/dist/chunk-3SCZ4Z6P.js.map +1 -0
  18. package/dist/chunk-3ZLODBRJ.js +21 -0
  19. package/dist/chunk-3ZLODBRJ.js.map +1 -0
  20. package/dist/chunk-6LO5O4G6.js +224 -0
  21. package/dist/chunk-6LO5O4G6.js.map +1 -0
  22. package/dist/chunk-APZVW5SW.js +75 -0
  23. package/dist/chunk-APZVW5SW.js.map +1 -0
  24. package/dist/chunk-EVZBADFR.js +583 -0
  25. package/dist/chunk-EVZBADFR.js.map +1 -0
  26. package/dist/chunk-GXWVFQCK.js +52 -0
  27. package/dist/chunk-GXWVFQCK.js.map +1 -0
  28. package/dist/chunk-KG4JVAKS.js +13 -0
  29. package/dist/chunk-KG4JVAKS.js.map +1 -0
  30. package/dist/chunk-KZH56VPP.js +183 -0
  31. package/dist/chunk-KZH56VPP.js.map +1 -0
  32. package/dist/chunk-LP7Q75C6.js +96 -0
  33. package/dist/chunk-LP7Q75C6.js.map +1 -0
  34. package/dist/chunk-NL4NAHXG.js +3 -0
  35. package/dist/chunk-NL4NAHXG.js.map +1 -0
  36. package/dist/chunk-PLSNCPEC.js +2507 -0
  37. package/dist/chunk-PLSNCPEC.js.map +1 -0
  38. package/dist/chunk-QFKVPVFC.js +1391 -0
  39. package/dist/chunk-QFKVPVFC.js.map +1 -0
  40. package/dist/chunk-TSXUUD64.js +64 -0
  41. package/dist/chunk-TSXUUD64.js.map +1 -0
  42. package/dist/chunk-UCJ76BEC.js +32 -0
  43. package/dist/chunk-UCJ76BEC.js.map +1 -0
  44. package/dist/chunk-WFTIYYII.js +3 -0
  45. package/dist/chunk-WFTIYYII.js.map +1 -0
  46. package/dist/components/forms/index.d.ts +101 -0
  47. package/dist/components/forms/index.js +7 -0
  48. package/dist/components/forms/index.js.map +1 -0
  49. package/dist/components/marketing/index.d.ts +473 -0
  50. package/dist/components/marketing/index.js +5 -0
  51. package/dist/components/marketing/index.js.map +1 -0
  52. package/dist/components/spa/index.d.ts +275 -0
  53. package/dist/components/spa/index.js +8 -0
  54. package/dist/components/spa/index.js.map +1 -0
  55. package/dist/components/ui/index.d.ts +420 -0
  56. package/dist/components/ui/index.js +6 -0
  57. package/dist/components/ui/index.js.map +1 -0
  58. package/dist/constants/index.d.ts +2 -0
  59. package/dist/constants/index.js +4 -0
  60. package/dist/constants/index.js.map +1 -0
  61. package/dist/cookies-ZS_QYOR7.d.ts +8 -0
  62. package/dist/dateRangePickerTranslations-B99F2WQA.d.ts +9 -0
  63. package/dist/errors/index.d.ts +48 -0
  64. package/dist/errors/index.js +3 -0
  65. package/dist/errors/index.js.map +1 -0
  66. package/dist/forms-VpLvEFob.d.ts +18 -0
  67. package/dist/hooks/index.d.ts +18 -0
  68. package/dist/hooks/index.js +4 -0
  69. package/dist/hooks/index.js.map +1 -0
  70. package/dist/index.d.ts +42 -0
  71. package/dist/index.js +19 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/lib/index.d.ts +49 -0
  74. package/dist/lib/index.js +7 -0
  75. package/dist/lib/index.js.map +1 -0
  76. package/dist/pagination-CFqoqiAG.d.ts +10 -0
  77. package/dist/radix-overlays-BlCr-uem.d.ts +10 -0
  78. package/dist/styles.css +9 -0
  79. package/dist/theme/marketing.css +750 -0
  80. package/dist/theme/tokens.css +115 -0
  81. package/dist/types/index.d.ts +2 -0
  82. package/dist/types/index.js +3 -0
  83. package/dist/types/index.js.map +1 -0
  84. package/dist/types-BuNHOJ1h.d.ts +58 -0
  85. package/dist/types-CN73TWSY.d.ts +51 -0
  86. package/dist/useAdminListPage-C4ZTTllP.d.ts +26 -0
  87. package/package.json +152 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * YCA design tokens — override :root / .dark in your app to theme.
3
+ * Import via @yca-software/yca-react-core/styles.css
4
+ */
5
+
6
+ @custom-variant dark (&:is(.dark *));
7
+
8
+ @theme inline {
9
+ --radius-sm: calc(var(--radius) - 4px);
10
+ --radius-md: calc(var(--radius) - 2px);
11
+ --radius-lg: var(--radius);
12
+ --radius-xl: calc(var(--radius) + 4px);
13
+ --radius-2xl: calc(var(--radius) + 8px);
14
+ --radius-3xl: calc(var(--radius) + 12px);
15
+ --radius-4xl: calc(var(--radius) + 16px);
16
+
17
+ --color-background: var(--background);
18
+ --color-foreground: var(--foreground);
19
+ --color-card: var(--card);
20
+ --color-card-foreground: var(--card-foreground);
21
+ --color-popover: var(--popover);
22
+ --color-popover-foreground: var(--popover-foreground);
23
+ --color-primary: var(--primary);
24
+ --color-primary-foreground: var(--primary-foreground);
25
+ --color-secondary: var(--secondary);
26
+ --color-secondary-foreground: var(--secondary-foreground);
27
+ --color-muted: var(--muted);
28
+ --color-muted-foreground: var(--muted-foreground);
29
+ --color-accent: var(--accent);
30
+ --color-accent-foreground: var(--accent-foreground);
31
+ --color-destructive: var(--destructive);
32
+ --color-destructive-foreground: var(--destructive-foreground);
33
+ --color-border: var(--border);
34
+ --color-border-subtle: var(--border-subtle);
35
+ --color-input: var(--input);
36
+ --color-ring: var(--ring);
37
+ }
38
+
39
+ :root {
40
+ --font-sans:
41
+ ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
42
+ "Noto Color Emoji";
43
+
44
+ --radius: 0.75rem;
45
+
46
+ /* Soft neutral — warm gray, minimal hue (≈85) */
47
+ --background: oklch(0.985 0.004 85);
48
+ --foreground: oklch(0.22 0.012 85);
49
+ --card: oklch(0.995 0.003 85);
50
+ --card-foreground: oklch(0.22 0.012 85);
51
+ --popover: oklch(0.995 0.003 85);
52
+ --popover-foreground: oklch(0.22 0.012 85);
53
+ --primary: oklch(0.28 0.02 85);
54
+ --primary-foreground: oklch(0.98 0.004 85);
55
+ --secondary: oklch(0.96 0.008 85);
56
+ --secondary-foreground: oklch(0.32 0.014 85);
57
+ --muted: oklch(0.965 0.006 85);
58
+ --muted-foreground: oklch(0.52 0.012 85);
59
+ --accent: oklch(0.94 0.01 85);
60
+ --accent-foreground: oklch(0.28 0.014 85);
61
+ --destructive: oklch(0.55 0.2 25);
62
+ --destructive-foreground: oklch(0.99 0.004 85);
63
+ --border: oklch(0.9 0.008 85);
64
+ --border-subtle: oklch(0.93 0.006 85);
65
+ --input: oklch(0.93 0.006 85);
66
+ --ring: oklch(0.55 0.02 85);
67
+
68
+ --shadow-surface: 0 1px 2px color-mix(in oklch, var(--foreground) 4%, transparent);
69
+ --shadow-elevated:
70
+ 0 1px 0 color-mix(in oklch, var(--foreground) 4%, transparent) inset,
71
+ 0 8px 24px -8px color-mix(in oklch, var(--foreground) 10%, transparent);
72
+ }
73
+
74
+ .dark {
75
+ --background: oklch(0.16 0.01 85);
76
+ --foreground: oklch(0.96 0.006 85);
77
+ --card: oklch(0.2 0.012 85);
78
+ --card-foreground: oklch(0.96 0.006 85);
79
+ --popover: oklch(0.2 0.012 85);
80
+ --popover-foreground: oklch(0.96 0.006 85);
81
+ --primary: oklch(0.92 0.008 85);
82
+ --primary-foreground: oklch(0.18 0.012 85);
83
+ --secondary: oklch(0.26 0.012 85);
84
+ --secondary-foreground: oklch(0.94 0.006 85);
85
+ --muted: oklch(0.26 0.012 85);
86
+ --muted-foreground: oklch(0.68 0.01 85);
87
+ --accent: oklch(0.3 0.014 85);
88
+ --accent-foreground: oklch(0.94 0.006 85);
89
+ --destructive: oklch(0.55 0.2 25);
90
+ --destructive-foreground: oklch(0.99 0.004 85);
91
+ --border: oklch(0.32 0.012 85);
92
+ --border-subtle: oklch(0.28 0.01 85);
93
+ --input: oklch(0.28 0.01 85);
94
+ --ring: oklch(0.62 0.02 85);
95
+
96
+ --shadow-surface: 0 1px 2px color-mix(in oklch, var(--foreground) 6%, transparent);
97
+ --shadow-elevated:
98
+ 0 1px 0 color-mix(in oklch, var(--foreground) 6%, transparent) inset,
99
+ 0 12px 32px -10px color-mix(in oklch, var(--foreground) 18%, transparent);
100
+ }
101
+
102
+ @layer base {
103
+ * {
104
+ border-color: var(--border-subtle);
105
+ }
106
+
107
+ body {
108
+ background-color: var(--background);
109
+ color: var(--foreground);
110
+ font-family: var(--font-sans);
111
+ line-height: 1.5;
112
+ -webkit-font-smoothing: antialiased;
113
+ -moz-osx-font-smoothing: grayscale;
114
+ }
115
+ }
@@ -0,0 +1,2 @@
1
+ export { A as AdminDetailErrorKind } from '../admin-BVYdWtEy.js';
2
+ export { P as PermissionAction, a as PermissionGroup, b as PermissionOption, R as RoleOption } from '../forms-VpLvEFob.js';
@@ -0,0 +1,3 @@
1
+ import '../chunk-NL4NAHXG.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,58 @@
1
+ import * as date_fns from 'date-fns';
2
+ import { DateRange } from 'react-day-picker';
3
+
4
+ /** Preset id used when using default presets (for translation keys). */
5
+ type DefaultPresetId = 'today' | 'yesterday' | 'last7' | 'last14' | 'last30' | 'thisWeek' | 'lastWeek' | 'thisMonth' | 'lastMonth';
6
+ /** Labels for action buttons, form fields, and accessibility. Pass translated strings for i18n. */
7
+ interface DateRangePickerTranslations {
8
+ /** Apply/confirm button (e.g. "Apply"). */
9
+ applyButton?: string;
10
+ /** Cancel button (e.g. "Cancel"). */
11
+ cancelButton?: string;
12
+ /** Start date field label (e.g. "Start"). */
13
+ startLabel?: string;
14
+ /** End date field label (e.g. "End"). */
15
+ endLabel?: string;
16
+ /** Placeholder when no range selected (e.g. "Pick a date range"). Shown in trigger and inline inputs. */
17
+ placeholder?: string;
18
+ /** Accessibility label for the date range trigger input (e.g. "Date range"). */
19
+ ariaLabel?: string;
20
+ /** Labels for default presets when presets prop is not provided. Key is DefaultPresetId. */
21
+ presetLabels?: Partial<Record<DefaultPresetId, string>>;
22
+ /** Sidebar heading above preset buttons (e.g. "Quick ranges"). */
23
+ presetsHeading?: string;
24
+ }
25
+ /** A selectable preset range. Use for custom or translated presets. */
26
+ interface DateRangePickerPreset {
27
+ id: string;
28
+ label: string;
29
+ getRange: () => DateRange;
30
+ }
31
+ interface DateRangePickerProps {
32
+ value: DateRange | undefined;
33
+ onChange: (value: DateRange | undefined) => void;
34
+ /** Minimum selectable date (inclusive). Dates before this will be disabled. */
35
+ minDate?: Date;
36
+ /** Maximum selectable date (inclusive). Dates after this will be disabled. */
37
+ maxDate?: Date;
38
+ /** Optional placeholder text when no range is selected. */
39
+ placeholder?: string;
40
+ /**
41
+ * Show preset range buttons. When true and presets is not provided, default presets are shown (use translations.presetLabels to translate).
42
+ * When presets is provided, that array is used. Default true.
43
+ */
44
+ showPresets?: boolean;
45
+ /** Optional preset ranges. When provided, these are shown instead of default presets; labels are your translated strings. */
46
+ presets?: DateRangePickerPreset[];
47
+ /** Translations for action buttons, labels, and default preset names. Pass translated strings for i18n. */
48
+ translations?: DateRangePickerTranslations;
49
+ /** Locale for calendar month names and date formatting (e.g. from date-fns/locale). */
50
+ locale?: date_fns.Locale;
51
+ /** Callback when the user applies the selection (clicks Apply). If not set, selection is applied on every calendar change. */
52
+ onApply?: (range: DateRange | undefined) => void;
53
+ /** Optional function to disable specific dates (in addition to min/max). */
54
+ isDateDisabled?: (date: Date) => boolean;
55
+ className?: string;
56
+ }
57
+
58
+ export type { DateRangePickerPreset as D, DateRangePickerProps as a, DateRangePickerTranslations as b, DefaultPresetId as c };
@@ -0,0 +1,51 @@
1
+ interface RequestConfig {
2
+ endpoint: string;
3
+ method: string;
4
+ body?: unknown;
5
+ multipart?: boolean;
6
+ /** When set, forwarded to fetch init (e.g. `include` for HttpOnly auth cookies). */
7
+ credentials?: RequestCredentials;
8
+ }
9
+ /** API error body: stable code only (no translated message). */
10
+ interface ApiErrorBody {
11
+ errorCode: string;
12
+ extra?: unknown;
13
+ }
14
+ interface RequestError {
15
+ error?: ApiErrorBody | unknown;
16
+ status: number;
17
+ retry?: boolean;
18
+ }
19
+ type FetchFn = (config: RequestConfig) => Promise<unknown>;
20
+ interface RefreshBodyContext {
21
+ refreshToken: string | null;
22
+ useCookieCredentials: boolean;
23
+ }
24
+ /** Describes the HTTP refresh call. Built by react-core; apps override endpoint via `refreshEndpoint`. */
25
+ interface RefreshRequestConfig {
26
+ endpoint: string;
27
+ method: string;
28
+ buildBody: (ctx: RefreshBodyContext) => unknown;
29
+ parseAccessToken: (data: unknown) => string | null;
30
+ /** Endpoint prefixes that must not trigger automatic refresh retry on 401. */
31
+ excludedRetryPrefixes: string[];
32
+ credentials?: RequestCredentials;
33
+ }
34
+ interface RefreshConfig {
35
+ request: RefreshRequestConfig;
36
+ cookieCredentialsEnabled: () => boolean;
37
+ setAccessToken: (token: string) => void;
38
+ onFailure: () => void;
39
+ onStart?: () => void;
40
+ onEnd?: () => void;
41
+ }
42
+ interface ApiClientConfig {
43
+ baseURL: string;
44
+ getAccessToken: () => string | null;
45
+ getRefreshToken: () => string | null;
46
+ getAcceptLanguage?: () => string;
47
+ refresh?: RefreshConfig;
48
+ }
49
+ type ApiClientProviderConfig = Omit<ApiClientConfig, 'baseURL'>;
50
+
51
+ export type { ApiClientConfig as A, FetchFn as F, RefreshBodyContext as R, ApiClientProviderConfig as a, ApiErrorBody as b, RefreshConfig as c, RefreshRequestConfig as d, RequestConfig as e, RequestError as f };
@@ -0,0 +1,26 @@
1
+ import * as React from 'react';
2
+ import { KeyboardEvent } from 'react';
3
+ import { UseInfiniteQueryResult, InfiniteData } from '@tanstack/react-query';
4
+ import { P as PaginatedList } from './pagination-CFqoqiAG.js';
5
+
6
+ type AdminListPageResponse<T> = PaginatedList<T>;
7
+ type AdminListSearchMode = 'instant' | 'submit';
8
+ type UseAdminListPageOptions = {
9
+ debounceMs?: number;
10
+ /** `instant` debounces input into the query; `submit` applies search only via submitSearch/clearSearch. */
11
+ searchMode?: AdminListSearchMode;
12
+ };
13
+ declare function useAdminListPage<T>(useInfiniteQuery: (search: string) => UseInfiniteQueryResult<InfiniteData<AdminListPageResponse<T>>>, options?: UseAdminListPageOptions): {
14
+ search: string;
15
+ setSearch: React.Dispatch<React.SetStateAction<string>>;
16
+ debouncedSearch: string;
17
+ submitSearch: () => void;
18
+ clearSearch: () => void;
19
+ onSearchKeyDown: ((event: KeyboardEvent<HTMLInputElement>) => void) | undefined;
20
+ searchMode: AdminListSearchMode;
21
+ items: T[];
22
+ query: UseInfiniteQueryResult<InfiniteData<AdminListPageResponse<T>, unknown>>;
23
+ loadMoreRef: React.RefObject<HTMLTableRowElement | null>;
24
+ };
25
+
26
+ export { type AdminListPageResponse as A, type UseAdminListPageOptions as U, type AdminListSearchMode as a, useAdminListPage as u };
package/package.json ADDED
@@ -0,0 +1,152 @@
1
+ {
2
+ "name": "@yca-software/yca-react-core",
3
+ "version": "0.0.1",
4
+ "description": "Shared React components and helpers for YCA apps.",
5
+ "license": "MIT",
6
+ "packageManager": "pnpm@11.12.0",
7
+ "type": "module",
8
+ "sideEffects": [
9
+ "**/*.css"
10
+ ],
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/yca-software/yca-react-core.git"
22
+ },
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js"
27
+ },
28
+ "./styles.css": "./dist/styles.css",
29
+ "./ui": {
30
+ "types": "./dist/components/ui/index.d.ts",
31
+ "import": "./dist/components/ui/index.js"
32
+ },
33
+ "./marketing": {
34
+ "types": "./dist/components/marketing/index.d.ts",
35
+ "import": "./dist/components/marketing/index.js"
36
+ },
37
+ "./spa": {
38
+ "types": "./dist/components/spa/index.d.ts",
39
+ "import": "./dist/components/spa/index.js"
40
+ },
41
+ "./hooks": {
42
+ "types": "./dist/hooks/index.d.ts",
43
+ "import": "./dist/hooks/index.js"
44
+ },
45
+ "./api": {
46
+ "types": "./dist/api/index.d.ts",
47
+ "import": "./dist/api/index.js"
48
+ },
49
+ "./auth": {
50
+ "types": "./dist/auth/index.d.ts",
51
+ "import": "./dist/auth/index.js"
52
+ },
53
+ "./errors": {
54
+ "types": "./dist/errors/index.d.ts",
55
+ "import": "./dist/errors/index.js"
56
+ },
57
+ "./constants": {
58
+ "types": "./dist/constants/index.d.ts",
59
+ "import": "./dist/constants/index.js"
60
+ },
61
+ "./admin": {
62
+ "types": "./dist/admin/index.d.ts",
63
+ "import": "./dist/admin/index.js"
64
+ },
65
+ "./types": {
66
+ "types": "./dist/types/index.d.ts",
67
+ "import": "./dist/types/index.js"
68
+ },
69
+ "./forms": {
70
+ "types": "./dist/components/forms/index.d.ts",
71
+ "import": "./dist/components/forms/index.js"
72
+ },
73
+ "./lib": {
74
+ "types": "./dist/lib/index.d.ts",
75
+ "import": "./dist/lib/index.js"
76
+ }
77
+ },
78
+ "scripts": {
79
+ "build": "tsup && mkdir -p dist/theme && cp src/styles.css dist/styles.css && cp src/theme/*.css dist/theme/",
80
+ "prepublishOnly": "pnpm run build",
81
+ "lint": "biome check .",
82
+ "lint:fix": "biome check --write .",
83
+ "test": "vitest",
84
+ "test:run": "vitest run",
85
+ "dev": "storybook dev -p 6006",
86
+ "storybook": "storybook dev -p 6006",
87
+ "build-storybook": "storybook build",
88
+ "ci": "pnpm run lint && pnpm run test:run && pnpm run check-types",
89
+ "audit:ci": "pnpm audit --audit-level=high --prod",
90
+ "check-types": "tsc --noEmit"
91
+ },
92
+ "dependencies": {
93
+ "@radix-ui/react-alert-dialog": "^1.1.16",
94
+ "@radix-ui/react-avatar": "^1.1.12",
95
+ "@radix-ui/react-checkbox": "^1.3.4",
96
+ "@radix-ui/react-dialog": "^1.1.16",
97
+ "@radix-ui/react-dropdown-menu": "^2.1.17",
98
+ "@radix-ui/react-label": "^2.1.9",
99
+ "@radix-ui/react-popover": "^1.1.16",
100
+ "@radix-ui/react-scroll-area": "^1.2.11",
101
+ "@radix-ui/react-separator": "^1.1.9",
102
+ "@radix-ui/react-slot": "^1.2.5",
103
+ "@radix-ui/react-switch": "^1.3.0",
104
+ "@radix-ui/react-tabs": "^1.1.14",
105
+ "@radix-ui/react-tooltip": "^1.2.9",
106
+ "class-variance-authority": "^0.7.1",
107
+ "clsx": "^2.1.1",
108
+ "date-fns": "^4.4.0",
109
+ "js-cookie": "^3.0.8",
110
+ "jwt-decode": "^4.0.0",
111
+ "lucide-react": "^1.17.0",
112
+ "react-day-picker": "^10.0.1",
113
+ "tailwind-merge": "^3.6.0"
114
+ },
115
+ "devDependencies": {
116
+ "@biomejs/biome": "^2.4.16",
117
+ "@storybook/addon-a11y": "^10.4.2",
118
+ "@storybook/addon-docs": "^10.4.2",
119
+ "@storybook/react": "^10.4.2",
120
+ "@storybook/react-vite": "^10.4.2",
121
+ "@tailwindcss/vite": "^4.3.0",
122
+ "@tanstack/react-query": "^5.90.2",
123
+ "@testing-library/jest-dom": "^6.9.1",
124
+ "@testing-library/react": "^16.3.2",
125
+ "@testing-library/user-event": "^14.6.1",
126
+ "@types/js-cookie": "^3.0.6",
127
+ "@types/node": "^25.9.2",
128
+ "@types/react": "19.2.17",
129
+ "@types/react-dom": "19.2.3",
130
+ "@vitejs/plugin-react": "^6.0.2",
131
+ "jsdom": "^29.1.1",
132
+ "react": "^19.2.7",
133
+ "react-dom": "^19.2.7",
134
+ "react-hook-form": "^7.77.0",
135
+ "react-i18next": "^15.7.4",
136
+ "react-router": "^7.9.5",
137
+ "storybook": "^10.4.2",
138
+ "tailwindcss": "^4.3.0",
139
+ "tsup": "^8.5.0",
140
+ "typescript": "^6.0.3",
141
+ "vite": "^8.0.16",
142
+ "vitest": "^4.1.8"
143
+ },
144
+ "peerDependencies": {
145
+ "@tanstack/react-query": "^5.0.0",
146
+ "react": "^19.2.3",
147
+ "react-dom": "^19.2.3",
148
+ "react-hook-form": "^7.71.2",
149
+ "react-i18next": "^15.0.0",
150
+ "react-router": "^7.0.0"
151
+ }
152
+ }