reend-components 1.1.0 → 1.2.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.
@@ -0,0 +1,462 @@
1
+ // src/tailwind-preset.ts
2
+ import tailwindcssAnimate from "tailwindcss-animate";
3
+ import plugin from "tailwindcss/plugin.js";
4
+ var reendPreset = {
5
+ darkMode: ["class"],
6
+ theme: {
7
+ extend: {
8
+ fontFamily: {
9
+ display: ["Orbitron", "monospace"],
10
+ ui: ["Orbitron", "monospace"],
11
+ mono: ["JetBrains Mono", "Courier New", "monospace"],
12
+ body: ["Source Han Sans", "Noto Sans SC", "Inter", "sans-serif"]
13
+ },
14
+ colors: {
15
+ border: {
16
+ DEFAULT: "hsl(var(--border))",
17
+ strong: "hsl(var(--border-strong))"
18
+ },
19
+ input: "hsl(var(--input))",
20
+ ring: "hsl(var(--ring))",
21
+ background: "hsl(var(--background))",
22
+ foreground: "hsl(var(--foreground))",
23
+ primary: {
24
+ DEFAULT: "hsl(var(--primary))",
25
+ foreground: "hsl(var(--primary-foreground))"
26
+ },
27
+ secondary: {
28
+ DEFAULT: "hsl(var(--secondary))",
29
+ foreground: "hsl(var(--secondary-foreground))"
30
+ },
31
+ destructive: {
32
+ DEFAULT: "hsl(var(--destructive))",
33
+ foreground: "hsl(var(--destructive-foreground))"
34
+ },
35
+ muted: {
36
+ DEFAULT: "hsl(var(--muted))",
37
+ foreground: "hsl(var(--muted-foreground))"
38
+ },
39
+ accent: {
40
+ DEFAULT: "hsl(var(--accent))",
41
+ foreground: "hsl(var(--accent-foreground))"
42
+ },
43
+ popover: {
44
+ DEFAULT: "hsl(var(--popover))",
45
+ foreground: "hsl(var(--popover-foreground))"
46
+ },
47
+ card: {
48
+ DEFAULT: "hsl(var(--card))",
49
+ foreground: "hsl(var(--card-foreground))"
50
+ },
51
+ ef: {
52
+ black: "hsl(var(--ef-black))",
53
+ "black-soft": "hsl(var(--ef-black-soft))",
54
+ "black-muted": "hsl(var(--ef-black-muted))",
55
+ "dark-gray": "hsl(var(--ef-dark-gray))",
56
+ gray: "hsl(var(--ef-gray))",
57
+ "gray-mid": "hsl(var(--ef-gray-mid))",
58
+ "gray-light": "hsl(var(--ef-gray-light))",
59
+ "white-muted": "hsl(var(--ef-white-muted))",
60
+ "white-soft": "hsl(var(--ef-white-soft))",
61
+ white: "hsl(var(--ef-white))",
62
+ "pure-white": "hsl(var(--ef-pure-white))",
63
+ yellow: "hsl(var(--ef-yellow))",
64
+ "yellow-dark": "hsl(var(--ef-yellow-dark))",
65
+ lime: "hsl(var(--ef-lime))",
66
+ "lime-dark": "hsl(var(--ef-lime-dark))",
67
+ blue: "hsl(var(--ef-blue))",
68
+ "blue-light": "hsl(var(--ef-blue-light))",
69
+ "blue-dark": "hsl(var(--ef-blue-dark))",
70
+ cyan: "hsl(var(--ef-cyan))",
71
+ red: "hsl(var(--ef-red))",
72
+ green: "hsl(var(--ef-green))",
73
+ orange: "hsl(var(--ef-orange))",
74
+ purple: "hsl(var(--ef-purple))"
75
+ },
76
+ surface: {
77
+ canvas: "hsl(var(--surface-canvas))",
78
+ 0: "hsl(var(--surface-0))",
79
+ 1: "hsl(var(--surface-1))",
80
+ 2: "hsl(var(--surface-2))",
81
+ 3: "hsl(var(--surface-3))",
82
+ hover: "hsl(var(--surface-hover))",
83
+ active: "hsl(var(--surface-active))"
84
+ },
85
+ chart: {
86
+ 1: "var(--chart-1)",
87
+ 2: "var(--chart-2)",
88
+ 3: "var(--chart-3)",
89
+ 4: "var(--chart-4)",
90
+ 5: "var(--chart-5)",
91
+ 6: "var(--chart-6)",
92
+ 7: "var(--chart-7)",
93
+ 8: "var(--chart-8)"
94
+ }
95
+ },
96
+ // ─── Opacity scale ────────────────────────────────────────────────────
97
+ opacity: {
98
+ overlay: "var(--opacity-overlay)",
99
+ hover: "var(--opacity-hover)",
100
+ disabled: "var(--opacity-disabled)",
101
+ border: "var(--opacity-border)",
102
+ focus: "var(--opacity-focus)",
103
+ muted: "var(--opacity-muted)"
104
+ },
105
+ borderRadius: {
106
+ lg: "var(--radius)",
107
+ md: "calc(var(--radius) - 2px)",
108
+ sm: "calc(var(--radius) - 4px)"
109
+ },
110
+ // ─── Shadows referencing CSS vars ───────────────────────────────────
111
+ boxShadow: {
112
+ sm: "var(--shadow-sm)",
113
+ md: "var(--shadow-md)",
114
+ lg: "var(--shadow-lg)",
115
+ glow: "var(--shadow-glow)",
116
+ "glow-sm": "var(--shadow-glow-sm)",
117
+ "glow-md": "var(--shadow-glow-md)",
118
+ "glow-lg": "var(--shadow-glow-lg)",
119
+ accent: "var(--shadow-accent)"
120
+ },
121
+ // ─── Z-Index scale matching CSS vars ────────────────────────────────
122
+ zIndex: {
123
+ below: "-1",
124
+ base: "0",
125
+ raised: "1",
126
+ dropdown: "100",
127
+ sticky: "200",
128
+ header: "1000",
129
+ overlay: "1500",
130
+ modal: "2000",
131
+ toast: "3000",
132
+ tooltip: "4000",
133
+ max: "9999"
134
+ },
135
+ // ─── Transition durations matching CSS vars ──────────────────────────
136
+ transitionDuration: {
137
+ instant: "100ms",
138
+ fast: "150ms",
139
+ normal: "300ms",
140
+ slow: "500ms",
141
+ slower: "800ms"
142
+ },
143
+ // ─── Transition easing matching CSS vars ─────────────────────────────
144
+ transitionTimingFunction: {
145
+ default: "cubic-bezier(0.25, 0.8, 0.25, 1)",
146
+ bounce: "cubic-bezier(0.34, 1.56, 0.64, 1)",
147
+ sharp: "cubic-bezier(0.4, 0, 0.2, 1)",
148
+ smooth: "cubic-bezier(0.45, 0, 0.55, 1)"
149
+ },
150
+ // ─── Type scale (v3.0) ───────────────────────────────────────────────
151
+ fontSize: {
152
+ "display-xl": [
153
+ "var(--type-display-xl-size,72px)",
154
+ { lineHeight: "var(--lh-display,0.95)" }
155
+ ],
156
+ "display-lg": [
157
+ "var(--type-display-lg-size,56px)",
158
+ { lineHeight: "var(--lh-display,0.95)" }
159
+ ],
160
+ h1: [
161
+ "var(--type-h1-size,48px)",
162
+ { lineHeight: "var(--lh-heading,1.0)" }
163
+ ],
164
+ h2: [
165
+ "var(--type-h2-size,36px)",
166
+ { lineHeight: "var(--lh-heading,1.0)" }
167
+ ],
168
+ h3: [
169
+ "var(--type-h3-size,28px)",
170
+ { lineHeight: "var(--lh-heading,1.0)" }
171
+ ],
172
+ h4: [
173
+ "var(--type-h4-size,22px)",
174
+ { lineHeight: "var(--lh-heading,1.0)" }
175
+ ],
176
+ "body-lg": [
177
+ "var(--type-body-lg-size,18px)",
178
+ { lineHeight: "var(--lh-body,1.6)" }
179
+ ],
180
+ body: [
181
+ "var(--type-body-size,16px)",
182
+ { lineHeight: "var(--lh-body,1.6)" }
183
+ ],
184
+ "body-sm": [
185
+ "var(--type-body-sm-size,14px)",
186
+ { lineHeight: "var(--lh-body,1.6)" }
187
+ ],
188
+ caption: [
189
+ "var(--type-caption-size,12px)",
190
+ { lineHeight: "var(--lh-caption,1.4)" }
191
+ ],
192
+ overline: [
193
+ "var(--type-overline-size,11px)",
194
+ { lineHeight: "1.2", letterSpacing: "0.12em" }
195
+ ]
196
+ },
197
+ // ─── Line heights (v3.0) ─────────────────────────────────────────────
198
+ lineHeight: {
199
+ heading: "var(--lh-heading, 1.0)",
200
+ display: "var(--lh-display, 0.95)",
201
+ body: "var(--lh-body, 1.6)",
202
+ caption: "var(--lh-caption, 1.4)"
203
+ },
204
+ // ─── Aspect ratios (v3.0) ────────────────────────────────────────────
205
+ aspectRatio: {
206
+ banner: "21 / 9",
207
+ feature: "16 / 9",
208
+ portrait: "3 / 4",
209
+ cinematic: "21 / 9"
210
+ },
211
+ // ─── Spacing tokens (v3.0 reference) ────────────────────────────────
212
+ spacing: {
213
+ "space-1": "var(--space-1, 4px)",
214
+ "space-2": "var(--space-2, 8px)",
215
+ "space-3": "var(--space-3, 12px)",
216
+ "space-4": "var(--space-4, 16px)",
217
+ "space-5": "var(--space-5, 20px)",
218
+ "space-6": "var(--space-6, 24px)",
219
+ "space-8": "var(--space-8, 32px)",
220
+ "space-10": "var(--space-10, 40px)",
221
+ "space-12": "var(--space-12, 48px)",
222
+ "space-16": "var(--space-16, 64px)",
223
+ "space-20": "var(--space-20, 80px)",
224
+ "space-24": "var(--space-24, 96px)",
225
+ "space-32": "var(--space-32, 128px)"
226
+ },
227
+ // ─── Keyframes ───────────────────────────────────────────────────────
228
+ keyframes: {
229
+ "accordion-down": {
230
+ from: { height: "0" },
231
+ to: { height: "var(--radix-accordion-content-height)" }
232
+ },
233
+ "accordion-up": {
234
+ from: { height: "var(--radix-accordion-content-height)" },
235
+ to: { height: "0" }
236
+ },
237
+ fadeIn: {
238
+ from: { opacity: "0" },
239
+ to: { opacity: "1" }
240
+ },
241
+ fadeInUp: {
242
+ from: { opacity: "0", transform: "translateY(16px)" },
243
+ to: { opacity: "1", transform: "translateY(0)" }
244
+ },
245
+ fadeInDown: {
246
+ from: { opacity: "0", transform: "translateY(-16px)" },
247
+ to: { opacity: "1", transform: "translateY(0)" }
248
+ },
249
+ slideInRight: {
250
+ from: { opacity: "0", transform: "translateX(-24px)" },
251
+ to: { opacity: "1", transform: "translateX(0)" }
252
+ },
253
+ scaleIn: {
254
+ from: { opacity: "0", transform: "scale(0.92)" },
255
+ to: { opacity: "1", transform: "scale(1)" }
256
+ },
257
+ rotate: {
258
+ from: { transform: "rotate(0deg)" },
259
+ to: { transform: "rotate(360deg)" }
260
+ },
261
+ loadingDot: {
262
+ "0%, 80%, 100%": { opacity: "0.2", transform: "scale(0.8)" },
263
+ "40%": { opacity: "1", transform: "scale(1)" }
264
+ },
265
+ slideDown: {
266
+ from: { transform: "scaleY(0)", opacity: "0" },
267
+ to: { transform: "scaleY(1)", opacity: "1" }
268
+ },
269
+ glitch: {
270
+ "0%, 90%, 100%": { transform: "translate(0)" },
271
+ "92%": { transform: "translate(-2px, 1px)" },
272
+ "94%": { transform: "translate(2px, -1px)" },
273
+ "96%": { transform: "translate(-1px, -1px)" },
274
+ "98%": { transform: "translate(1px, 1px)" }
275
+ },
276
+ cursorBlink: {
277
+ "0%, 50%": { opacity: "1" },
278
+ "51%, 100%": { opacity: "0" }
279
+ },
280
+ diamondSpin: {
281
+ from: { transform: "rotate(0deg)" },
282
+ to: { transform: "rotate(360deg)" }
283
+ },
284
+ pulseGlow: {
285
+ "0%, 100%": { boxShadow: "0 0 8px hsl(var(--primary) / 0.2)" },
286
+ "50%": { boxShadow: "0 0 20px hsl(var(--primary) / 0.4)" }
287
+ },
288
+ scanLine: {
289
+ "0%": { top: "-5%" },
290
+ "100%": { top: "105%" }
291
+ },
292
+ skeletonShimmer: {
293
+ "0%": { backgroundPosition: "-200% 0" },
294
+ "100%": { backgroundPosition: "200% 0" }
295
+ },
296
+ shrink: {
297
+ from: { transform: "scaleX(1)" },
298
+ to: { transform: "scaleX(0)" }
299
+ },
300
+ countUp: {
301
+ from: { opacity: "0", transform: "translateY(8px)" },
302
+ to: { opacity: "1", transform: "translateY(0)" }
303
+ },
304
+ "dialog-in": {
305
+ from: { opacity: "0", transform: "translate(-50%, -48%) scale(0.96)" },
306
+ to: { opacity: "1", transform: "translate(-50%, -50%) scale(1)" }
307
+ },
308
+ "switch-thumb-spin": {
309
+ from: { transform: "rotate(0deg)" },
310
+ to: { transform: "rotate(360deg)" }
311
+ },
312
+ "frequency-bar": {
313
+ "0%": { transform: "scaleY(0.15)" },
314
+ "100%": { transform: "scaleY(1)" }
315
+ },
316
+ slideUp: {
317
+ from: { transform: "translateY(100%)", opacity: "0" },
318
+ to: { transform: "translateY(0)", opacity: "1" }
319
+ },
320
+ shake: {
321
+ "0%, 100%": { transform: "translateX(0)" },
322
+ "20%, 60%": { transform: "translateX(-4px)" },
323
+ "40%, 80%": { transform: "translateX(4px)" }
324
+ },
325
+ particleDrift: {
326
+ "0%": { transform: "translate(0, 0)" },
327
+ "33%": { transform: "translate(2px, -3px)" },
328
+ "66%": { transform: "translate(-2px, 2px)" },
329
+ "100%": { transform: "translate(0, 0)" }
330
+ }
331
+ },
332
+ // ─── Animation utilities ─────────────────────────────────────────────
333
+ animation: {
334
+ "accordion-down": "accordion-down 0.2s ease-out",
335
+ "accordion-up": "accordion-up 0.2s ease-out",
336
+ "fade-in": "fadeIn 0.3s ease forwards",
337
+ "fade-in-up": "fadeInUp 0.4s var(--ease-default, ease) forwards",
338
+ "fade-in-down": "fadeInDown 0.4s var(--ease-default, ease) forwards",
339
+ "slide-in-right": "slideInRight 0.4s var(--ease-default, ease) forwards",
340
+ "scale-in": "scaleIn 0.3s var(--ease-default, ease) forwards",
341
+ rotate: "rotate 1s linear infinite",
342
+ "loading-dot": "loadingDot 1.4s ease-in-out infinite both",
343
+ "slide-down": "slideDown 0.3s ease forwards",
344
+ glitch: "glitch 3s infinite",
345
+ "cursor-blink": "cursorBlink 1s step-end infinite",
346
+ "diamond-spin": "diamondSpin 0.8s linear infinite",
347
+ "switch-spin": "switch-thumb-spin 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both",
348
+ "pulse-glow": "pulseGlow 2s ease-in-out infinite",
349
+ "scan-line": "scanLine 2s linear infinite",
350
+ skeleton: "skeletonShimmer 1.5s infinite",
351
+ shrink: "shrink 5s linear forwards",
352
+ "count-up": "countUp 0.4s var(--ease-default, ease) forwards",
353
+ "dialog-in": "dialog-in 0.3s var(--ease-default, ease) forwards",
354
+ "frequency-bar": "frequency-bar 0.8s ease-in-out infinite alternate",
355
+ "slide-up": "slideUp 0.3s var(--ease-sharp, ease) forwards",
356
+ shake: "shake 0.4s var(--ease-sharp, ease)",
357
+ "particle-drift": "particleDrift 3s ease-in-out infinite"
358
+ }
359
+ }
360
+ },
361
+ plugins: [
362
+ tailwindcssAnimate,
363
+ // ─── Endfield Signature Utilities ────────────────────────────────────
364
+ plugin(
365
+ ({
366
+ addUtilities,
367
+ addComponents
368
+ }) => {
369
+ addComponents({
370
+ ".clip-corner": {
371
+ "clip-path": "polygon(0 0, calc(100% - 12px) 0, 100% 12px, 100% 100%, 12px 100%, 0 calc(100% - 12px))"
372
+ },
373
+ ".clip-corner-sm": {
374
+ "clip-path": "polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px))"
375
+ },
376
+ ".clip-corner-lg": {
377
+ "clip-path": "polygon(0 0, calc(100% - 16px) 0, 100% 16px, 100% 100%, 16px 100%, 0 calc(100% - 16px))"
378
+ }
379
+ });
380
+ addComponents({
381
+ ".scanline-overlay": {
382
+ position: "relative"
383
+ },
384
+ ".scanline-overlay::after": {
385
+ content: '""',
386
+ position: "absolute",
387
+ inset: "0",
388
+ background: "repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(255, 255, 255, 0.015) 2px, rgba(255, 255, 255, 0.015) 4px)",
389
+ "pointer-events": "none",
390
+ "z-index": "1"
391
+ }
392
+ });
393
+ addUtilities({
394
+ ".animate-skeleton": {
395
+ background: "linear-gradient(90deg, hsl(var(--surface-1)) 0%, hsl(var(--surface-2)) 50%, hsl(var(--surface-1)) 100%)",
396
+ "background-size": "200% 100%",
397
+ animation: "skeletonShimmer 1.5s infinite"
398
+ }
399
+ });
400
+ addUtilities({
401
+ ".animate-slide-down": {
402
+ animation: "slideDown 0.3s ease forwards",
403
+ "transform-origin": "top",
404
+ overflow: "hidden"
405
+ }
406
+ });
407
+ addUtilities({
408
+ ".glow-yellow": {
409
+ "box-shadow": "0 0 20px hsl(var(--primary) / 0.2)"
410
+ },
411
+ ".glow-yellow-strong": {
412
+ "box-shadow": "0 0 40px hsl(var(--primary) / 0.3)"
413
+ },
414
+ ".text-glow-yellow": {
415
+ "text-shadow": "0 0 20px hsl(var(--primary) / 0.3)"
416
+ },
417
+ ".glow-lime": {
418
+ "box-shadow": "0 0 20px hsl(var(--ef-lime) / 0.2)"
419
+ },
420
+ ".text-glow-lime": {
421
+ "text-shadow": "0 0 16px hsl(var(--ef-lime) / 0.4)"
422
+ }
423
+ });
424
+ addUtilities({
425
+ ".bg-grid-pattern": {
426
+ "background-image": "linear-gradient(var(--bg-grid-color,rgba(255,255,255,0.03)) 1px, transparent 1px), linear-gradient(90deg, var(--bg-grid-color,rgba(255,255,255,0.03)) 1px, transparent 1px)",
427
+ "background-size": "var(--bg-grid-size,60px) var(--bg-grid-size,60px)"
428
+ },
429
+ ".bg-radial-glow": {
430
+ "background-image": "var(--bg-glow-primary)",
431
+ "background-repeat": "no-repeat",
432
+ "background-position": "center top",
433
+ "background-size": "100% 600px"
434
+ },
435
+ ".bg-radial-glow-lime": {
436
+ "background-image": "var(--bg-glow-lime)",
437
+ "background-repeat": "no-repeat",
438
+ "background-position": "center top",
439
+ "background-size": "100% 600px"
440
+ },
441
+ ".bg-diagonal-lines": {
442
+ "background-image": "var(--bg-diagonal)"
443
+ }
444
+ });
445
+ addUtilities({
446
+ ".gradient-line-h": {
447
+ height: "1px",
448
+ background: "linear-gradient(90deg, transparent 0%, hsl(var(--primary)) 50%, transparent 100%)"
449
+ },
450
+ ".gradient-line-v": {
451
+ width: "1px",
452
+ background: "linear-gradient(180deg, transparent 0%, hsl(var(--primary)) 50%, transparent 100%)"
453
+ }
454
+ });
455
+ }
456
+ )
457
+ ]
458
+ };
459
+ var tailwind_preset_default = reendPreset;
460
+ export {
461
+ tailwind_preset_default as default
462
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reend-components",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "private": false,
5
5
  "description": "Tactical, sci-fi, and gaming-inspired React component library — Arknights: Endfield Design System",
6
6
  "type": "module",
@@ -22,9 +22,10 @@
22
22
  "./variables.css": "./src/styles/variables.css",
23
23
  "./utilities.css": "./src/styles/utilities.css",
24
24
  "./tailwind": {
25
- "import": "./src/tailwind-preset.ts",
26
- "require": "./src/tailwind-preset.ts"
27
- }
25
+ "import": "./dist/tailwind/index.mjs",
26
+ "require": "./dist/tailwind/index.cjs"
27
+ },
28
+ "./package.json": "./package.json"
28
29
  },
29
30
  "bin": {
30
31
  "reend-ui": "dist/bin/cli.cjs"
@@ -32,11 +33,15 @@
32
33
  "files": [
33
34
  "dist/lib",
34
35
  "dist/bin",
36
+ "dist/tailwind",
35
37
  "src/styles",
36
38
  "src/tailwind-preset.ts",
37
39
  "README.md",
38
40
  "LICENSE"
39
41
  ],
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
40
45
  "sideEffects": [
41
46
  "**/*.css"
42
47
  ],
@@ -70,7 +75,10 @@
70
75
  "framer-motion": ">=10.0.0",
71
76
  "lucide-react": ">=0.400.0",
72
77
  "react": "^18.0.0 || ^19.0.0",
73
- "react-dom": "^18.0.0 || ^19.0.0"
78
+ "react-dom": "^18.0.0 || ^19.0.0",
79
+ "react-resizable-panels": ">=4.0.0",
80
+ "recharts": ">=3.0.0",
81
+ "tailwindcss": ">=3.4.0"
74
82
  },
75
83
  "peerDependenciesMeta": {
76
84
  "tailwindcss": {
@@ -91,14 +99,14 @@
91
99
  },
92
100
  "scripts": {
93
101
  "dev": "vite",
94
- "prebuild": "node --experimental-strip-types scripts/sync-release.ts",
102
+ "prebuild": "tsx scripts/sync-release.ts",
95
103
  "build": "vite build",
96
104
  "build:dev": "vite build --mode development",
97
105
  "build:lib": "vite build --config vite.lib.config.ts",
98
106
  "build:cli": "node scripts/build-cli.mjs",
99
107
  "prepublishOnly": "npm run build:lib && npm run build:cli",
100
- "version": "node --experimental-strip-types scripts/sync-release.ts && git add CHANGELOG.md public/llms.txt",
101
- "sync": "node --experimental-strip-types scripts/sync-release.ts",
108
+ "version": "tsx scripts/sync-release.ts && git add CHANGELOG.md public/llms.txt public/sitemap.xml src/cli/registry.ts",
109
+ "sync": "tsx scripts/sync-release.ts",
102
110
  "lint": "eslint .",
103
111
  "preview": "vite preview",
104
112
  "test": "vitest run",
@@ -122,8 +130,6 @@
122
130
  "@radix-ui/react-tooltip": "^1.2.7",
123
131
  "class-variance-authority": "^0.7.1",
124
132
  "clsx": "^2.1.1",
125
- "react-resizable-panels": "^4.6.4",
126
- "recharts": "^3.7.0",
127
133
  "sonner": "^1.7.4",
128
134
  "tailwind-merge": "^2.6.0",
129
135
  "tailwindcss-animate": "^1.0.7"
@@ -146,6 +152,7 @@
146
152
  "eslint": "^9.32.0",
147
153
  "eslint-plugin-react-hooks": "^5.2.0",
148
154
  "eslint-plugin-react-refresh": "^0.4.20",
155
+ "eslint-plugin-security": "^4.0.0",
149
156
  "framer-motion": "^12.34.0",
150
157
  "fuse.js": "^7.1.0",
151
158
  "globals": "^15.15.0",
@@ -159,9 +166,12 @@
159
166
  "react-dom": "^18.3.1",
160
167
  "react-error-boundary": "^6.1.1",
161
168
  "react-i18next": "^16.5.4",
169
+ "react-resizable-panels": "^4.6.4",
162
170
  "react-router-dom": "^6.30.1",
171
+ "recharts": "^3.7.0",
163
172
  "shiki": "^3.22.0",
164
173
  "tailwindcss": "^3.4.17",
174
+ "tsx": "^4.19.0",
165
175
  "typescript": "^5.8.3",
166
176
  "typescript-eslint": "^8.38.0",
167
177
  "vite": "^5.4.19",
@@ -369,7 +369,6 @@ const reendPreset: Partial<Config> = {
369
369
  "frequency-bar": "frequency-bar 0.8s ease-in-out infinite alternate",
370
370
  "slide-up": "slideUp 0.3s var(--ease-sharp, ease) forwards",
371
371
  shake: "shake 0.4s var(--ease-sharp, ease)",
372
- "slide-up": "slideUp 0.3s var(--ease-sharp, ease) forwards",
373
372
  "particle-drift": "particleDrift 3s ease-in-out infinite",
374
373
  },
375
374
  },