diff --git a/apps/web/index.html b/apps/web/index.html index 1622230..62b1729 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -6,6 +6,8 @@ + + 人生重开模拟器 diff --git a/apps/web/package.json b/apps/web/package.json index bc6f050..4b9abc7 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -24,7 +24,6 @@ "@types/react-dom": "^19.2.4", "@vitejs/plugin-react": "^6.0.5", "eslint-config-react": "^1.1.7", - "jotai-devtools": "^0.14.0", "vite": "^8.1.3", "vitest": "^4.1.10" }, diff --git a/apps/web/src/Game.css b/apps/web/src/Game.css index c16c19a..690201f 100644 --- a/apps/web/src/Game.css +++ b/apps/web/src/Game.css @@ -1,6 +1,6 @@ .screen { min-width: 32rem; - max-width: calc(100dvw - 2rem); + max-width: min(calc(100dvw - 2rem), 48rem); position: relative; padding: 0; margin: 0; @@ -9,4 +9,27 @@ justify-content: center; align-items: center; > * { width: 100%; } + + > .section { + display: flex; + flex-direction: column; + gap: 0.5rem; + width: 100%; + padding: 0; + box-sizing: border-box; + .title { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-weight: bold; + width: 100%; + height: 2rem; + color: var(--base-text-color); + border: 0.0625rem solid var(--base-text-color); + border-bottom: 0.1875rem solid var(--color-primary); + box-sizing: border-box; + user-select: none; + } + } } \ No newline at end of file diff --git a/apps/web/src/Game.tsx b/apps/web/src/Game.tsx index c674ccf..d466401 100644 --- a/apps/web/src/Game.tsx +++ b/apps/web/src/Game.tsx @@ -1,5 +1,5 @@ -import { useEffect, useState } from 'react' -import { useInit } from '@/hooks/storage' +import { useEffect } from 'react' +import { useInit, useSaver } from '@/hooks/storage' import { useStep, Step } from '@remake/hooks' import Home from '@/containers/Home' import Pick from '@/containers/TalentPick' @@ -11,10 +11,14 @@ import './Game.css' export function Game() { const [inited, init] = useInit() + const saver = useSaver() const step = useStep() useEffect(() => { if (!inited) init() }, [inited]) + useEffect(() => { + saver() + }, [saver]) if (!inited) return switch (step) { case Step.Idle: diff --git a/apps/web/src/components/Talent.css b/apps/web/src/components/Talent.css index 693f793..1ce7fe5 100644 --- a/apps/web/src/components/Talent.css +++ b/apps/web/src/components/Talent.css @@ -4,28 +4,26 @@ justify-content: space-between; align-items: center; padding: 0 1rem; - line-height: 2rem; + height: 2rem; + font-size: 1rem; gap: 1rem; color: var(--color); background: var(--background, var(--base-background-color)); cursor: pointer; user-select: none; border: 0.0625rem solid var(--grade-color); + box-sizing: border-box; transition: all 0.2s ease-in-out; - &.talent-grade-0 { --grade-color: var(--color-grade-0); } - &.talent-grade-1 { --grade-color: var(--color-grade-1); } - &.talent-grade-2 { --grade-color: var(--color-grade-2); } - &.talent-grade-3 { --grade-color: var(--color-grade-3); } &.selected { --color: var(--base-background-color); --background: var(--grade-color); &:hover { --background: oklch(from var(--grade-color) calc(l + 0.1) c h); } } &:hover { --background: oklch(from var(--grade-color) calc(l + 0.5) c h); } + .talent-name { font-weight: bold; } .talent-description { color: oklch(from var(--color) calc(l + 0.1) c h); - font-size: 0.6rem; - align-self: flex-end; + font-size: 0.85rem; user-select: none; &::before { content: '['; margin-right: 0.125rem; } &::after { content: ']'; margin-left: 0.125rem; } diff --git a/apps/web/src/components/Talent.tsx b/apps/web/src/components/Talent.tsx index 10d2687..29210a7 100644 --- a/apps/web/src/components/Talent.tsx +++ b/apps/web/src/components/Talent.tsx @@ -1,6 +1,5 @@ import type { Talent } from '@remake/data/talent' import talents from '@remake/data/talent' -import cx from 'classnames' import './Talent.css' export interface TalentProps { @@ -12,7 +11,7 @@ export function TalentComponent({ id, selected }: TalentProps) { if (!talent) return null const grade = talent?.grade ?? 0 return ( -
+
{talent.name} {talent.description}
diff --git a/apps/web/src/components/ThemeToggle.css b/apps/web/src/components/ThemeToggle.css index f927128..834e305 100644 --- a/apps/web/src/components/ThemeToggle.css +++ b/apps/web/src/components/ThemeToggle.css @@ -1,24 +1,5 @@ -.theme-toggle-btn { - background: transparent; - border: none; - cursor: pointer; - padding: 0.25rem; - border-radius: 50%; - position: fixed; - top: 0.5rem; - right: 0.5rem; - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - -webkit-tap-highlight-color: transparent; - transition: background-color 0.3s; - --hover-color: rgba(0, 0, 0, 0.05); - &:hover { background-color: var(--hover-color);} -} - .theme-svg { + --svg-color: oklch(from var(--text-color, var(--base-text-color)) calc(l + 0.2) c h); transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); transform-origin: center; .sun-center, .sun-beams, .mask-cutter-group { @@ -26,21 +7,19 @@ transform-origin: center; } .mask-cutter-group { transform: translate(0.75rem, -0.75rem); } - .sun-center { fill: oklch(from var(--base-text-color) calc(l + 0.2) c h); } - .sun-beams { stroke: oklch(from var(--base-text-color) calc(l + 0.2) c h); } + .sun-center { + transition: fill 0.2s ease-in-out; + fill: var(--svg-color); + } + .sun-beams { + transition: stroke 0.2s ease-in-out; + stroke: var(--svg-color); + } } html[data-theme='dark'] { - .theme-toggle-btn { --hover-color: rgba(255, 255, 255, 0.1); } .mask-cutter-group { transform: translate(0, 0); } .theme-svg { transform: rotate(375deg); } - .sun-center { - transform: scale(1.5); - fill: #fbbf24; - } - .sun-beams { - opacity: 0; - transform: scale(0.6); - stroke: #fbbf24; - } + .sun-center { transform: scale(1.5); } + .sun-beams { opacity: 0; transform: scale(0.6); } } diff --git a/apps/web/src/components/ThemeToggle.tsx b/apps/web/src/components/ThemeToggle.tsx index 6a2f199..39269ea 100644 --- a/apps/web/src/components/ThemeToggle.tsx +++ b/apps/web/src/components/ThemeToggle.tsx @@ -1,13 +1,31 @@ import { useState, useEffect } from 'react' import './ThemeToggle.css' +export const updateThemeColor = () => { + let metas = document.querySelectorAll('meta[name="theme-color"]') + if (!metas.length) return + const element = document.body + const end = Date.now() + 300 + const update = () => { + const { backgroundColor } = getComputedStyle(element) + metas.forEach(meta => meta.setAttribute('content', backgroundColor)) + if (Date.now() < end) requestAnimationFrame(update) + } + requestAnimationFrame(update) +} + export function ThemeToggle() { - const [isDark, setIsDark] = useState( - () => matchMedia('(prefers-color-scheme: dark)').matches, - ) + const [isDark, setIsDark] = useState(() => { + const storedTheme = localStorage.getItem('theme') + if (storedTheme === 'dark') return true + if (storedTheme === 'light') return false + return matchMedia('(prefers-color-scheme: dark)').matches + }) useEffect(() => { document.documentElement.dataset.theme = isDark ? 'dark' : 'light' + updateThemeColor() + localStorage.setItem('theme', isDark ? 'dark' : 'light') }, [isDark]) return ( diff --git a/apps/web/src/config.ts b/apps/web/src/config.ts index 33efc52..215e829 100644 --- a/apps/web/src/config.ts +++ b/apps/web/src/config.ts @@ -1,59 +1,84 @@ import type { Config } from '@remake/hooks' -import type { TalentGrade } from '@remake/data/talent' - -function gadm(grade: TalentGrade, value: number) { - return new Map([[grade, { mode: 'multiply', value }]]) -} - -export const AdditonMap = { - times: [ - { value: 0, additions: new Map() }, - { value: 10, additions: gadm(2, 2) }, - { value: 30, additions: gadm(2, 3) }, - { value: 50, additions: gadm(2, 4) }, - { value: 70, additions: gadm(2, 5) }, - { value: 100, additions: gadm(2, 6) }, - ], - achievements: [ - { value: 0, additions: new Map() }, - { value: 10, additions: gadm(3, 2) }, - { value: 30, additions: gadm(3, 3) }, - { value: 50, additions: gadm(3, 4) }, - { value: 70, additions: gadm(3, 5) }, - { value: 100, additions: gadm(3, 6) }, - ], -} +export const AutoInterval = 500 +export const ModeLimit = 10 +export const PickLimit = 3 export const BasePoints = 20 +export const AllocLimit = 10 +export const DefaultSpirit = 5 +export const PullCount = 10 +export const PullRateBase: Config['pull']['rate']['base'] = new Map([ + [0, 889], + [1, 100], + [2, 10], + [3, 1], +]) + +export const JudgeMap = { + age: [0, 1, 10, 18, 40, 60, 70, 80, 90, 95, 100, 500], + summary: [0, 41, 50, 60, 80, 100, 110, 120], + times: [0, 10, 30, 50, 70, 100], + achievements: [0, 10, 30, 50, 70, 100], + charm: [0, 1, 2, 4, 7, 9, 11], + money: [0, 1, 2, 4, 7, 9, 11], + spirit: [0, 1, 2, 4, 7, 9, 11], + intelligence: [0, 1, 2, 4, 7, 9, 11, 21, 131, 501], + strength: [0, 1, 2, 4, 7, 9, 11, 21, 101, 401, 1001, 2001], + talent: [0, 0.3, 0.6, 0.9], + event: [0, 0.2, 0.4, 0.6], +} +export type Judges = keyof typeof JudgeMap +export function judge(key: Judges, value: number) { + const arr = JudgeMap[key] + for (let i = arr.length - 1; i >= 0; i--) { + if (value >= arr[i]!) return i + } + return 0 +} + +export const JudgeGradeMap = { + age: [0, 5, 7, 9], + summary: [0, 4, 5, 6], + times: [0, 1, 3, 5], + achievements: [0, 1, 3, 5], + charm: [0, 4, 5, 6], + money: [0, 4, 5, 6], + spirit: [0, 4, 5, 6], + intelligence: [0, 4, 5, 6], + strength: [0, 4, 5, 6], + talent: [0, 1, 2, 3], + event: [0, 1, 2, 3], +} +export function judgeGrade(key: Judges, level: number) { + const arr = JudgeGradeMap[key] + for (let i = arr.length - 1; i >= 0; i--) { + if (level >= arr[i]!) return i + } + return 0 +} + +export const PullRateAdditions: Config['pull']['rate']['additions'] = { + times: value => { + const level = judge('times', value) + return new Map([[2, { mode: 'multiply', value: level + 1 } as const]]) + }, + achievements: value => { + const level = judge('achievements', value.size) + return new Map([[3, { mode: 'multiply', value: level + 1 } as const]]) + }, +} export const config: Config = { - mode: 10, - pick: 3, + mode: ModeLimit, + pick: PickLimit, points: BasePoints, - allocate: 10, - spirit: 5, + allocate: AllocLimit, + spirit: DefaultSpirit, pull: { - count: 10, + count: PullCount, rate: { - base: new Map([ - [0, 889], - [1, 100], - [2, 10], - [3, 1], - ]), - additions: { - times: value => { - for (const item of AdditonMap.times.reverse()) - if (value >= item.value) return item.additions - return new Map() - }, - achievements: value => { - const size = value.size - for (const item of AdditonMap.achievements.reverse()) - if (size >= item.value) return item.additions - return new Map() - }, - }, + base: PullRateBase, + additions: PullRateAdditions, }, }, } diff --git a/apps/web/src/containers/Alloc.css b/apps/web/src/containers/Alloc.css index 094dfc5..220d63e 100644 --- a/apps/web/src/containers/Alloc.css +++ b/apps/web/src/containers/Alloc.css @@ -8,21 +8,23 @@ .allocation-input { display: flex; gap: 0; + height: 2rem; border: 0.0625rem solid var(--base-text-color); box-sizing: border-box; width: 100%; button { + flex: 1 0; padding: 0; margin: 0; - width: 2rem; - height: 2rem; + height: 100%; border: none; text-align: center; } input { - flex: 1; - height: 2rem; + flex: 1 0; + height: 100%; width: 2rem; + font-weight: bold; } } .points-detail { @@ -42,7 +44,8 @@ li { display: flex; justify-content: space-between; - line-height: 2rem; + align-items: center; + height: 2rem; padding: 0 0.5rem; gap: 0.5rem; } @@ -72,9 +75,11 @@ height: 2rem; border: 0.0625rem solid var(--base-text-color); border-bottom: none; - text-align: center; - line-height: 2rem; + display: flex; + justify-content: center; + align-items: center; box-sizing: border-box; + font-weight: bold; } } > li.left { @@ -87,10 +92,9 @@ > button { flex: 1; font-size: 1rem; - line-height: 2rem; + height: 2rem; width: 6rem; padding: 0; - box-sizing: border-box; } } } diff --git a/apps/web/src/containers/Alloc.tsx b/apps/web/src/containers/Alloc.tsx index 88cfc01..0e02c63 100644 --- a/apps/web/src/containers/Alloc.tsx +++ b/apps/web/src/containers/Alloc.tsx @@ -1,6 +1,6 @@ import { useState } from 'react' import { useAllocator, usePointRandomizer, useLeftPoints } from '@remake/hooks' -import { usePicked, useReplaced } from '@remake/hooks' +import { usePicked, useReplaced, useStart } from '@remake/hooks' import type { AdditionalPoint } from '@remake/hooks' import { properties } from '@/display' import { keys } from '@remake/vitex' @@ -59,9 +59,12 @@ export function Alloc() { const left = useLeftPoints() const [allocation, allocator] = useAllocator() const random = usePointRandomizer() + const start = useStart() const [showDetail, setShowDetail] = useState(false) const handleNext = () => { - // navigate('/life') + const achievements = start() + // TODO: Show achievements + console.log('Achievements', achievements) } return (
@@ -97,7 +100,7 @@ export function Alloc() { -
diff --git a/apps/web/src/containers/Home.css b/apps/web/src/containers/Home.css index 1d5b552..c4c8340 100644 --- a/apps/web/src/containers/Home.css +++ b/apps/web/src/containers/Home.css @@ -8,10 +8,22 @@ h1 { font-size: 4rem; margin: 0; + font-weight: bold; } h2 { font-size: 2rem; margin: 0; } } -} + .theme-toggle-btn { + display: flex; + width: 2.5rem; + height: 2.5rem; + padding: 0.25rem; + cursor: pointer; + align-items: center; + justify-content: center; + -webkit-tap-highlight-color: transparent; + transition: background-color 0.3s; + } +} \ No newline at end of file diff --git a/apps/web/src/containers/Home.tsx b/apps/web/src/containers/Home.tsx index 3aae358..1093dca 100644 --- a/apps/web/src/containers/Home.tsx +++ b/apps/web/src/containers/Home.tsx @@ -1,4 +1,5 @@ import { useRemake } from '@remake/hooks' +import { ThemeToggle } from '@/components/ThemeToggle' import './Home.css' export default function Home() { @@ -12,6 +13,7 @@ export default function Home() { +
) } diff --git a/apps/web/src/containers/Play.css b/apps/web/src/containers/Play.css new file mode 100644 index 0000000..f532056 --- /dev/null +++ b/apps/web/src/containers/Play.css @@ -0,0 +1,114 @@ +.screen.play { + height: calc(100dvh - 2rem); + gap: 1rem; + > ul.properties { + display: flex; + flex-direction: row; + gap: 0.5rem; + width: 100%; + font-weight: bold; + > li { + display: flex; + flex-direction: column; + flex: 1 0; + justify-content: space-between; + text-align: center; + min-width: 6rem; + user-select: none; + span { + display: flex; + justify-content: center; + align-items: center; + border: 0.0625rem solid var(--base-text-color); + box-sizing: border-box; + height: 2rem; + &:first-child { + border-bottom: none; + } + } + .value { + color: var(--color-primary); + font-size: 1.25rem; + font-weight: bold; + } + &.charm { order: 1 } + &.intelligence { order: 2 } + &.strength { order: 3 } + &.money { order: 4 } + &.spirit { order: 5 } + } + } + > ul.logs { + display: flex; + flex-direction: column; + flex: 1 0; + gap: 0.5rem; + padding: 0 0.5rem; + min-width: 32rem; + max-width: 100%; + height: 100%; + border: 0.0625rem solid var(--base-text-color); + box-sizing: border-box; + > li.log { + display: flex; + flex-direction: row; + line-height: 2rem; + gap: 0.5rem; + width: 100%; + user-select: none; + cursor: pointer; + > .age { + flex-shrink: 0; + width: 3rem; + height: 2rem; + text-align: right; + color: var(--color-primary); + font-weight: bold; + /* border-bottom: 0.0625rem solid var(--base-text-color); */ + box-sizing: border-box; + } + > .content { + position: relative; + &::before { + content: ''; + position: absolute; + left: -0.5rem; + bottom: 0; + height: calc(100% - 2rem); + width: calc(100% + 0.5rem); + border: 0.0625rem solid var(--base-text-color); + border-top: none; + border-right: none; + box-sizing: border-box; + pointer-events: none; + } + .tag, .name { + font-weight: bold; + } + } + } + >li:last-child { + margin-bottom: 2rem; + } + } + ul.log-inner { + > li { + color: var(--grade-color); + display: flex; + flex-direction: row; + gap: 0.5rem; + } + } + .controls { + display: flex; + flex-direction: row; + gap: 0.5rem; + width: 100%; + > button { + flex: 1 0; + min-width: 6rem; + font-size: 1.25rem; + height: 2.5rem; + } + } +} \ No newline at end of file diff --git a/apps/web/src/containers/Play.tsx b/apps/web/src/containers/Play.tsx index bc1ece9..88a5ee2 100644 --- a/apps/web/src/containers/Play.tsx +++ b/apps/web/src/containers/Play.tsx @@ -1,3 +1,151 @@ -export default function Life() { - return <> +import { useState, useRef } from 'react' +import { useLayoutEffect, useEffect } from 'react' +import { useNext, useGotoSummary } from '@remake/hooks' +import type { Log } from '@remake/hooks' +import { properties } from '@/display' +import { keys } from '@remake/vitex' +import { achievements, events, talents } from '@remake/data' +import { AutoInterval } from '@/config' +import './Play.css' + +function LogTalent({ id }: { id: number }) { + const { name, description, grade } = talents.get(id)! + return ( +
  • + [天赋] + {name} + {description} +
  • + ) } + +function LogTalents({ items }: { items: number[] }) { + if (items.length === 0) return null + const els = items.map(id => ) + return +} + +interface LogEventProps { + id: number + post: boolean +} +function LogEvent({ id, post }: LogEventProps) { + const { event, postEvent, grade } = events.get(id)! + return ( + <> +
  • {event}
  • + {post && postEvent && ( +
  • {postEvent}
  • + )} + + ) +} + +function LogEvents({ items }: { items: number[] }) { + const last = items.length - 1 + const els = items.map((id, i) => ( + + )) + return
      {els}
    +} + +function LogAchievement({ id }: { id: number }) { + const { name, description, grade } = achievements.get(id)! + return ( +
  • + [成就] + {name} + {description} +
  • + ) +} + +function LogAchievements({ items }: { items: number[] }) { + if (items.length === 0) return null + const els = items.map(id => ) + return
      {els}
    +} + +interface LogProps { + log: Log +} +function Log({ log }: LogProps) { + return ( +
  • + {log.age}岁 +
    + + + +
    +
  • + ) +} + +export function Play() { + const [{ state, logs, ended }, next] = useNext() + const [auto, setAuto] = useState(false) + const logRef = useRef(null) + const autoRef = useRef(0) + const gotoSummary = useGotoSummary() + const handleNext = () => { + if (ended) return + const achievements = next() + // TODO: Show achievements + console.debug('Achievements:', achievements) + } + const handleGotoSummary = () => { + if (!ended) return + const achievements = gotoSummary() + // TODO: Show achievements + console.debug('Achievements:', achievements) + } + useLayoutEffect(() => { + requestAnimationFrame(() => { + if (!logRef.current) return + logRef.current.scrollTop = logRef.current.scrollHeight + }) + }, [logs]) + useEffect(() => { + if (!auto) window.clearInterval(autoRef.current) + else autoRef.current = window.setInterval(handleNext, AutoInterval) + return () => window.clearInterval(autoRef.current) + }, [auto, handleNext]) + return ( +
    +
      + {keys(state.props.current, ['age']).map(key => ( +
    • + {properties[key]} + + {state.props.current[key]} + +
    • + ))} +
    +
      + {logs.map((log, index) => ( + + ))} +
    +
    + {!ended && ( + + )} + {ended && ( + + )} +
    +
    + ) +} + +export default Play diff --git a/apps/web/src/containers/Summary.css b/apps/web/src/containers/Summary.css new file mode 100644 index 0000000..366bdf7 --- /dev/null +++ b/apps/web/src/containers/Summary.css @@ -0,0 +1,43 @@ +.screen.summary { + gap: 1rem; + ul.judge-list { + display: flex; + flex-direction: row; + gap: 0.125rem; + width: 100%; + > li { + display: flex; + flex-direction: column; + flex: 1 0; + justify-content: space-between; + text-align: center; + min-width: 4rem; + user-select: none; + span { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + font-weight: bold; + border: 0.0625rem solid var(--grade-color); + box-sizing: border-box; + height: 2rem; + color: var(--grade-color); + &:not(:first-child) { + border-top: none; + } + } + .level { + font-size: 0.95rem; + background-color: var(--grade-color); + color: var(--base-background-color); + } + } + } + ul.talent-list { + display: flex; + flex-direction: column; + gap: 0.5rem; + width: 100%; + } +} diff --git a/apps/web/src/containers/Summary.tsx b/apps/web/src/containers/Summary.tsx index f0a37a7..e8e74d3 100644 --- a/apps/web/src/containers/Summary.tsx +++ b/apps/web/src/containers/Summary.tsx @@ -1,10 +1,64 @@ +import { useState } from 'react' +import { usePicked, useEnd } from '@remake/hooks' +import { useJudge } from '@/hooks/judge' +import type { JudgeKeys, Judge } from '@/hooks/judge' +import { properties, judgeDisplay } from '@/display' +import TalentComponent from '@/components/Talent' +import './Summary.css' + +interface JudgeItemProps { + prop: JudgeKeys + judge: Judge +} +function JudgeItem({ prop, judge }: JudgeItemProps) { + const { value, grade, level } = judge + return ( +
  • + {properties[prop]} + {value} + {judgeDisplay(prop, level)} +
  • + ) +} + export default function Summary() { + const picked = usePicked() + const judges = useJudge() + const end = useEnd() + const [locked, setLocked] = useState(null) + const handleSelect = (id: number) => { + if (locked === id) setLocked(null) + else setLocked(id) + } + const handleEnd = () => { + const achievements = end() + // TODO: Show achievements + console.log('Achievements', achievements) + } return (
    -

    人生总结

    -

    最终人生评分: {}

    - {/* 展现解锁的成就等 */} - +
      + {judges.map(([key, { value, grade, level }]) => ( + + ))} +
    +
    +
    你可以锁定一个天赋,下辈子还能抽到
    +
      + {Array.from(picked, id => ( +
    • handleSelect(id)}> + +
    • + ))} +
    +
    +
    ) } diff --git a/apps/web/src/display.ts b/apps/web/src/display.ts index fb83303..d23ec68 100644 --- a/apps/web/src/display.ts +++ b/apps/web/src/display.ts @@ -3,4 +3,29 @@ export const properties = { intelligence: '智力', strength: '体质', money: '家境', + spirit: '快乐', + age: '享年', + summary: '总评', +} + +const s = (str: string) => str.split('|') +const p = (prefix: string, arr: string[]) => arr.map(v => prefix + v) +const jbase = '地狱|折磨|不佳|普通|优秀|罕见|逆天|传说' +export const judges = { + summary: s(jbase), + charm: s(jbase), + money: s(jbase), + spirit: s('地狱|折磨|不幸|普通|幸福|极乐|天命'), + intelligence: s(jbase + '|识海|元神|仙魂'), + strength: s(jbase + '|凝气|筑基|金丹|元婴|仙体'), + age: s('胎死腹中|早夭|少年|盛年|中年|花甲|古稀|杖朝|南山|不老|修仙|仙寿'), +} + +export const rates = { + times: p('抽到紫色概率', s('不变|翻倍|三倍|四倍|五倍|六倍')), + achievement: p('抽到橙色概率', s('不变|翻倍|三倍|四倍|五倍|六倍')), +} + +export function judgeDisplay(key: keyof typeof judges, level: number) { + return judges[key][level] } diff --git a/apps/web/src/hooks/judge.ts b/apps/web/src/hooks/judge.ts new file mode 100644 index 0000000..62ebd12 --- /dev/null +++ b/apps/web/src/hooks/judge.ts @@ -0,0 +1,30 @@ +import { useMemo } from 'react' +import { useSummary, useGameState } from '@remake/hooks' +import type { Properties } from '@remake/hooks' +import { judge, judgeGrade } from '@/config' +import { keys } from '@remake/vitex' + +export interface Judge { + value: number + level: number + grade: number +} +export type JudgePropKeys = keyof Properties +export type JudgeKeys = 'summary' | JudgePropKeys +export type Judges = [JudgeKeys, Judge][] +export const useJudge = () => { + const summary = useSummary() + const state = useGameState() + if (!state) throw new Error('Game state is not set') + return useMemo(() => { + const props = { ...state.props.highest, summary } + const judges: Judges = [] + for (const key of keys(props)) { + const value = props[key] + const level = judge(key, value) + const grade = judgeGrade(key, level) + judges.push([key, { value, level, grade }]) + } + return judges + }, [state.props.highest, summary]) +} diff --git a/apps/web/src/hooks/storage.ts b/apps/web/src/hooks/storage.ts index bc12f25..cbbd55a 100644 --- a/apps/web/src/hooks/storage.ts +++ b/apps/web/src/hooks/storage.ts @@ -1,6 +1,6 @@ -import { useCallback, useTransition } from 'react' +import { useCallback } from 'react' import { atom, useAtom } from 'jotai' -import { useConfigInject, useProfile, useProfileInject } from '@remake/hooks' +import { useConfigInject, useRawProfile, useProfileInject } from '@remake/hooks' import { get, set } from '@/storage' import { config } from '@/config' @@ -10,35 +10,35 @@ export const useInit = () => { const configInject = useConfigInject() const profileInject = useProfileInject() const [inited, setInited] = useAtom(initedAtom) - const [_, startTransition] = useTransition() - const loader = useCallback(() => { + const loader = useCallback(async () => { + if (inited) return configInject(config) - startTransition(async () => { - const { profile } = await get(['profile']) - const parsed = profile ? JSON.parse(profile) || {} : {} - profileInject({ - ...parsed, - times: parsed.times || 0, - achievements: new Set(parsed.achievements || []), - events: new Set(parsed.events || []), - talents: new Set(parsed.talents || []), - }) - setInited(true) + const { profile } = await get(['profile']) + const parsed = profile ? JSON.parse(profile) || {} : {} + profileInject({ + ...parsed, + times: parsed.times || 0, + achievements: new Set(parsed.achievements || []), + events: new Set(parsed.events || []), + talents: new Set(parsed.talents || []), }) - }, []) + setInited(true) + }, [inited, configInject, profileInject, setInited]) return [inited, loader] as const } export const useSaver = () => { - const [profile] = useProfile() - const saver = useCallback(() => { + const [profile] = useRawProfile() + const [inited] = useAtom(initedAtom) + return useCallback(async () => { + if (!inited || !profile) return const str = JSON.stringify({ + ...profile, times: profile.times, achievements: Array.from(profile.achievements), events: Array.from(profile.events), talents: Array.from(profile.talents), }) - set({ profile: str }) - }, [profile]) - return saver + return await set({ profile: str }) + }, [inited, profile]) } diff --git a/apps/web/src/index.tsx b/apps/web/src/index.tsx index 95156cc..c3bde1c 100644 --- a/apps/web/src/index.tsx +++ b/apps/web/src/index.tsx @@ -1,8 +1,6 @@ import { createRoot } from 'react-dom/client' import { StrictMode } from 'react' import { Game } from './Game' -import { ThemeToggle } from './components/ThemeToggle' -import { Jotai } from './jotai' import './styles/colors.css' import './styles/common.css' @@ -10,8 +8,6 @@ const container = document.getElementById('remake')! const root = createRoot(container) root.render( - - , ) diff --git a/apps/web/src/jotai.ts b/apps/web/src/jotai.ts deleted file mode 100644 index 5582c9f..0000000 --- a/apps/web/src/jotai.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { useAtomsDevtools } from 'jotai-devtools/utils' -export function Jotai() { - useAtomsDevtools('Store') - return null -} -export default Jotai diff --git a/apps/web/src/storage.ts b/apps/web/src/storage.ts index 097213f..897fb99 100644 --- a/apps/web/src/storage.ts +++ b/apps/web/src/storage.ts @@ -1,3 +1,35 @@ +if (localStorage.getItem('version') !== '3.0.0') { + const times = parseInt(localStorage.getItem('times') || '0') + if (times) { + const achievements = ( + JSON.parse(localStorage.getItem('ACHV') || '[]') as [ + number, + number, + ][] + ) + .sort((a, b) => a[1] - b[1]) + .map(([id]) => id) + const events = JSON.parse(localStorage.getItem('AEVT') || '[]') + const talents = JSON.parse(localStorage.getItem('ATLT') || '[]') + const profile = { times, achievements, events, talents } as any + const lockedTalents = JSON.parse( + localStorage.getItem('extendTalent') || 'null', + ) + if (lockedTalents) profile.lockedTalent = lockedTalents + const unique = JSON.parse( + localStorage.getItem('uniqueWaTaShi') || 'null', + ) + if (unique) profile.unique = unique + localStorage.setItem('profile', JSON.stringify(profile)) + localStorage.removeItem('times') + localStorage.removeItem('ACHV') + localStorage.removeItem('AEVT') + localStorage.removeItem('ATLT') + localStorage.removeItem('extendTalent') + localStorage.removeItem('uniqueWaTaShi') + } + localStorage.setItem('version', '3.0.0') +} export async function get(keys: Key[]) { return Object.fromEntries(keys.map(k => [k, localStorage.getItem(k)])) as { [K in Key]: string | null diff --git a/apps/web/src/styles/colors.css b/apps/web/src/styles/colors.css index 3aa2f6c..99ba56a 100644 --- a/apps/web/src/styles/colors.css +++ b/apps/web/src/styles/colors.css @@ -11,4 +11,9 @@ --color-primary: light-dark(#61b700, #b9ff69); --color-info: light-dark(#454ad3, #b5b7ff); --color-error: light-dark(#e42b2b, #ff6969); -} \ No newline at end of file +} + +.grade-0 { --grade-color: var(--color-grade-0); } +.grade-1 { --grade-color: var(--color-grade-1); } +.grade-2 { --grade-color: var(--color-grade-2); } +.grade-3 { --grade-color: var(--color-grade-3); } \ No newline at end of file diff --git a/apps/web/src/styles/common.css b/apps/web/src/styles/common.css index db0f3f2..4345e8f 100644 --- a/apps/web/src/styles/common.css +++ b/apps/web/src/styles/common.css @@ -2,6 +2,7 @@ html { transition: all 0.2s ease-in-out; } html[data-theme='light'] { color-scheme: light; } html[data-theme='dark'] { color-scheme: dark; } :root { color: var(--base-text-color); } +.hide-scrollbar, html { overflow-y: auto; overflow-x: auto; @@ -18,17 +19,21 @@ body { margin: 1rem; padding: 0; background: var(--base-background-color); + transition: all 0.2s ease-in-out; +} + +html, body, button, input, select, textarea { font-family: - -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "PingFang SC", - "Noto Sans SC", "Noto Sans CJK SC", "Noto Sans", + -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "PingFang SC", + "Noto Sans SC", "Noto Sans CJK SC", "Noto Sans", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .font-mono { - font-family: - "SF Mono", SFMono-Regular, Menlo, Monaco, Consolas, + font-family: + "SF Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Noto Sans Mono CJK SC", "Noto Sans Mono", "Noto Code", ui-monospace, monospace; -webkit-font-smoothing: antialiased; @@ -47,12 +52,12 @@ button { border: var(--border-color) 0.0625rem solid; background: var(--background-color); font-size: 1.2rem; + font-weight: bold; padding: 0 1rem; - line-height: 2.5rem; + height: 2.5rem; display: inline-flex; align-items: center; justify-content: center; - font-family: Arial, sans-serif; user-select: none; transition: all 0.2s ease-in-out; &:hover { @@ -86,4 +91,4 @@ input { &::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } } -@media (max-width: 32rem) { :root { font-size: 2.8vw; } } \ No newline at end of file +@media (max-width: 32rem) { :root { font-size: 2.88vw; } } \ No newline at end of file diff --git a/package.json b/package.json index d592a80..5a00432 100644 --- a/package.json +++ b/package.json @@ -26,14 +26,15 @@ }, "devDependencies": { "@types/bun": "1.3.14", - "@typescript-eslint/eslint-plugin": "^8.66.0", - "@typescript-eslint/parser": "^8.66.0", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", "@typescript/native": "npm:typescript@^7.0.2", - "eslint": "^10.8.0", + "eslint": "^10.8.1", "typescript": "npm:@typescript/typescript6@^6.0.2" }, "workspaces": [ "packages/*", - "apps/*" + "apps/*", + "thirdparty/*" ] } diff --git a/packages/core/src/game.ts b/packages/core/src/game.ts index d6e0ccb..20b60fb 100644 --- a/packages/core/src/game.ts +++ b/packages/core/src/game.ts @@ -1,6 +1,7 @@ import type { Achievement, Event, Talent } from '@remake/data' import { ages, AchievementOpportunity as Ao } from '@remake/data' import type { Allocation, GameState, ProfileState } from './state' +import type { Properties } from './state' import { createState, nextProfile, propsEffect } from './state' import { summary as stateSummary } from './state' import type { PullOptions, ReplacementResult } from './talent' @@ -109,6 +110,6 @@ export function end( } export { pull, exclude } -export type { GameState, ProfileState, Allocation, RNG } -export type { PullOptions, ReplacementResult } +export type { GameState, ProfileState, Properties, RNG } +export type { PullOptions, ReplacementResult, Allocation } export type { AdditionalPoint, AdditionalPoints } diff --git a/packages/core/src/state.ts b/packages/core/src/state.ts index ad314e8..a9c265a 100644 --- a/packages/core/src/state.ts +++ b/packages/core/src/state.ts @@ -1,4 +1,4 @@ -import type { Achievement, Event, Talent } from '@remake/data' +import type { Achievement, Event, Talent, Character } from '@remake/data' import { produce } from 'immer' import { sum, keys } from '@remake/vitex' @@ -37,6 +37,9 @@ export interface GameState { talentTriggers: Map // 本局天赋触发次数 } +/** 唯一角色 */ +export type UniqueCharacter = Omit + /** 持久化存储的数据 */ export interface ProfileState { times: number // 游戏次数 @@ -46,6 +49,7 @@ export interface ProfileState { achievements: Set // 达成的成就 highest?: Properties // 历史最高属性 lowest?: Properties // 历史最低属性 + unique?: UniqueCharacter // 唯一角色属性 } export function createState( diff --git a/packages/hooks/src/config.ts b/packages/hooks/src/config.ts index 3c9e3e2..8bf4eca 100644 --- a/packages/hooks/src/config.ts +++ b/packages/hooks/src/config.ts @@ -7,6 +7,7 @@ export interface Config { pull: PullOptions points: number allocate: number + spirit: number mode: number } diff --git a/packages/hooks/src/play.ts b/packages/hooks/src/play.ts index 7630986..2249e78 100644 --- a/packages/hooks/src/play.ts +++ b/packages/hooks/src/play.ts @@ -1,9 +1,11 @@ -import { useTransition, useCallback } from 'react' +import { useCallback, useRef, useState } from 'react' import { atom, useSetAtom, useAtomValue, useAtom } from 'jotai' import { useConfig } from './config' import { useProfile } from './profile' -import { end } from '@remake/core' -import type { GameState } from '@remake/core' +import { useReplaced, useTalentReset } from './talent' +import { useAlloc, useAllocReset } from './alloc' +import { start, next, summary, end } from '@remake/core' +import type { GameState, Properties, NextResult } from '@remake/core' import type { Talent } from '@remake/data/talent' export enum Step { @@ -15,45 +17,123 @@ export enum Step { Summary = 'summary', } +export type Log = Omit & { + props: Omit +} + const stepAtom = atom(Step.Idle) const gameStateAtom = atom(null) +const logsAtom = atom([]) +const summaryAtom = atom(0) + +export const useStateReset = () => { + const setGameState = useSetAtom(gameStateAtom) + return useCallback(() => setGameState(null), [setGameState]) +} +export const useLogsReset = () => { + const setLogs = useSetAtom(logsAtom) + return useCallback(() => setLogs([]), [setLogs]) +} +export const useGameReset = () => { + const resetTalent = useTalentReset() + const resetAlloc = useAllocReset() + const resetState = useStateReset() + const resetLogs = useLogsReset() + return useCallback(() => { + resetTalent() + resetAlloc() + resetState() + resetLogs() + }, [resetTalent, resetAlloc, resetState, resetLogs]) +} export const useStep = () => useAtomValue(stepAtom) export const useSetStep = () => useSetAtom(stepAtom) +export const useGameState = () => useAtomValue(gameStateAtom) +export const useSummary = () => useAtomValue(summaryAtom) +export const useLogs = () => useAtomValue(logsAtom) export const useRemake = () => { - const config = useConfig() + const { mode } = useConfig() + const [{ times }] = useProfile() + const setStep = useSetAtom(stepAtom) + const reset = useGameReset() + return useCallback(() => { + reset() + setStep(times < mode ? Step.Pick : Step.Mode) + }, [mode, times, setStep, reset]) +} + +export const useStart = () => { + const { spirit } = useConfig() const [profile] = useProfile() const setStep = useSetAtom(stepAtom) + const setState = useSetAtom(gameStateAtom) + const allocate = useAlloc() + const { talents: tr } = useReplaced() return useCallback(() => { - const step = profile.times < config.mode ? Step.Pick : Step.Mode - setStep(step) - }, [config, profile, setStep]) + const alloc = { ...allocate, spirit } + const result = start(profile, alloc, tr.talents) + setState(result.state) + setStep(Step.Play) + return result.achievements + }, [profile, allocate, spirit, tr, setStep, setState]) +} + +export const useNext = () => { + const [profile] = useProfile() + const [state, setState] = useAtom(gameStateAtom) + const [logs, setLogs] = useAtom(logsAtom) + const endRef = useRef(false) + const [ended, setEnded] = useState(false) + if (!state) throw new Error('Game state is not available.') + const nexter = useCallback(() => { + if (!state) throw new Error('Game state is not available.') + if (endRef.current) throw new Error('Game state is already ended.') + const { state: s, ...result } = next(state, profile) + setState(s) + const { age, ...props } = s.props.current + const log = { ...result, props } + setLogs(prev => [...prev, log]) + if (s.life <= 0) { + endRef.current = true + setEnded(true) + } + return result.achievements + }, [state, profile, setState]) + return [{ state, logs, ended }, nexter] as const +} + +export const useGotoSummary = () => { + const [profile] = useProfile() + const [state, setState] = useAtom(gameStateAtom) + const setStep = useSetAtom(stepAtom) + const setSummary = useSetAtom(summaryAtom) + return useCallback(() => { + if (!state) throw new Error('Game state is not available.') + const result = summary(state, profile) + setSummary(result.summary) + setState(result.state) + setStep(Step.Summary) + return result.achievements + }, [state, profile, setStep, setState, setSummary]) } export const useEnd = () => { const [profile, setProfile] = useProfile() const [step, setStep] = useAtom(stepAtom) - const [state, setState] = useAtom(gameStateAtom) - const [pending, startTransition] = useTransition() - const ender = useCallback( + const state = useAtomValue(gameStateAtom) + const reset = useGameReset() + return useCallback( (talent?: Talent['id']) => { - startTransition(async () => { - if (!state || step === Step.Summary) - throw new Error( - 'Game state is not available or already ended.', - ) - const { profile: next, achievements } = end( - state, - profile, - talent, - ) - setStep(Step.Idle) - setState(null) - setProfile(next) - }) + if (!state) + throw new Error('Game state is not available or already ended.') + const result = end(state, profile, talent) + setStep(Step.Idle) + setProfile(result.profile) + reset() + return result.achievements }, - [state, step, profile, setStep, setState, setProfile], + [state, step, profile, setStep, setProfile, reset], ) - return [pending, ender] as const } diff --git a/packages/hooks/src/profile.ts b/packages/hooks/src/profile.ts index 40f66d2..94b9f9c 100644 --- a/packages/hooks/src/profile.ts +++ b/packages/hooks/src/profile.ts @@ -4,6 +4,8 @@ import type { ProfileState } from '@remake/core' const profileAtom = atom(null) +export const useRawProfile = () => useAtom(profileAtom) + export const useProfile = () => { const [profile, setProfile] = useAtom(profileAtom) if (!profile) throw new Error('Profile is not loaded') diff --git a/packages/hooks/src/talent.ts b/packages/hooks/src/talent.ts index 4824784..dc94fd1 100644 --- a/packages/hooks/src/talent.ts +++ b/packages/hooks/src/talent.ts @@ -10,6 +10,15 @@ import type { Talent } from '@remake/data/talent' const pickedAtom = atom(new Set()) const replacedAtom = atom(null) +export const useTalentReset = () => { + const setPicked = useSetAtom(pickedAtom) + const setReplaced = useSetAtom(replacedAtom) + return useCallback(() => { + setPicked(new Set()) + setReplaced(null) + }, [setPicked, setReplaced]) +} + export const usePicked = () => { const picked = useAtomValue(pickedAtom) if (!picked) throw new Error('No talents picked') @@ -26,11 +35,12 @@ export const useTalentPuller = () => { const [profile] = useProfile() const [pulled, setPulled] = useState(null) const puller = useCallback( - (rng?: RNG) => setPulled(pull(p, profile, rng)), - // (rng?: RNG) => - // setPulled([ - // 1142, 1143, 1144, 1145, 1146, 1086, 1122, 1111, 1130, 1048, - // ]), + // (rng?: RNG) => setPulled(pull(p, profile, rng)), + (rng?: RNG) => + setPulled([ + 1142, 1143, 1144, 1145, 1146, 1086, 1122, 1111, 1130, 1048, + 1033, + ]), [p, profile, setPulled], ) return [pulled, puller] as const diff --git a/packages/vitex/index.ts b/packages/vitex/index.ts index c3aad4a..b846f14 100644 --- a/packages/vitex/index.ts +++ b/packages/vitex/index.ts @@ -34,6 +34,12 @@ export function shuffle(array: T[], rng?: RNG): T[] { return result } -export function keys(obj: T): (keyof T)[] { - return Object.keys(obj) as (keyof T)[] +export function keys( + obj: T, + filter?: K[], +): Exclude[] { + const allKeys = Object.keys(obj) as (keyof T)[] + if (!filter || filter.length === 0) return allKeys as Exclude[] + const filterSet = new Set(filter) + return allKeys.filter(key => !filterSet.has(key)) as Exclude[] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1279254..55dd816 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,17 +12,17 @@ importers: specifier: 1.3.14 version: 1.3.14 '@typescript-eslint/eslint-plugin': - specifier: ^8.66.0 - version: 8.66.0(@typescript-eslint/parser@8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + specifier: ^8.67.0 + version: 8.67.0(@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) '@typescript-eslint/parser': - specifier: ^8.66.0 - version: 8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + specifier: ^8.67.0 + version: 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 eslint: - specifier: ^10.8.0 - version: 10.8.0(jiti@2.7.0)(supports-color@7.2.0) + specifier: ^10.8.1 + version: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' @@ -72,9 +72,6 @@ importers: eslint-config-react: specifier: ^1.1.7 version: 1.1.7 - jotai-devtools: - specifier: ^0.14.0 - version: 0.14.0(@types/react@19.2.18)(jotai@2.20.2(@types/react@19.2.18)(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(redux@5.0.1) vite: specifier: ^8.1.3 version: 8.1.5(@types/node@26.1.2)(jiti@2.7.0) @@ -195,27 +192,6 @@ packages: resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@floating-ui/core@1.8.0': - resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - - '@floating-ui/dom@1.8.0': - resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - - '@floating-ui/react-dom@2.1.9': - resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.12': - resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@happy-dom/global-registrator@20.11.1': resolution: {integrity: sha512-1C0wwHiyMlEdsbrJqff5ORE2PwaXBOam5rMqkZVOReAezd5nt6Tl/WGg28UAo75Ziuwchs0KaF8lvnn2oAtvJA==} engines: {node: '>=20.0.0'} @@ -243,26 +219,6 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@mantine/code-highlight@7.17.4': - resolution: {integrity: sha512-Ewi4X/4a5Lbty7MmOg5OTOv7QexxuVA5dwUZ79zWEvqB3e/AHzGK//5Nb92x78FvmuEZ9M0rK5eRtWTT/+4zeA==} - peerDependencies: - '@mantine/core': 7.17.4 - '@mantine/hooks': 7.17.4 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x - - '@mantine/core@7.17.4': - resolution: {integrity: sha512-Ea4M/98jxgIWCuxCdM0YIotVYjfLTGQsfIA6zDg0LsClgjo/ZLnnh4zbi+bLNgM+GGjP4ju7gv4MZvaTKuLO8g==} - peerDependencies: - '@mantine/hooks': 7.17.4 - react: ^18.x || ^19.x - react-dom: ^18.x || ^19.x - - '@mantine/hooks@7.17.4': - resolution: {integrity: sha512-PBcJxDAfGm8k1/JJmaDcxzRVQ3JSE1iXGktbgGz+qEOJmCxwbbAYe+CtGFFgi1xX2bPZ+7dtRr/+XFhnKtt/aw==} - peerDependencies: - react: ^18.x || ^19.x - '@napi-rs/wasm-runtime@1.2.0': resolution: {integrity: sha512-kDoONqMa+VnZ4vvvu/ZUurpJ4gkZU57e7g69qpNgWhYcZFPUHZM2CEMKm+cG6ufDVALbjMvfmMjFVqaK7uEMnA==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -273,11 +229,6 @@ packages: '@oxc-project/types@0.139.0': resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - '@redux-devtools/extension@3.3.0': - resolution: {integrity: sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==} - peerDependencies: - redux: ^3.1.0 || ^4.0.0 || ^5.0.0 - '@rolldown/binding-android-arm64@1.1.5': resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -410,9 +361,6 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/base16@1.0.5': - resolution: {integrity: sha512-OzOWrTluG9cwqidEzC/Q6FAmIPcnZfm8BFRlIx0+UIUqnuAmi5OS88O0RpT3Yz6qdmqObvUhasrbNsCofE4W9A==} - '@types/bun@1.3.14': resolution: {integrity: sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw==} @@ -431,9 +379,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/lodash@4.17.25': - resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} - '@types/node@26.1.2': resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} @@ -451,63 +396,63 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@typescript-eslint/eslint-plugin@8.66.0': - resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==} + '@typescript-eslint/eslint-plugin@8.67.0': + resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.66.0 + '@typescript-eslint/parser': ^8.67.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.66.0': - resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==} + '@typescript-eslint/parser@8.67.0': + resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.66.0': - resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==} + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.66.0': - resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.66.0': - resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.66.0': - resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==} + '@typescript-eslint/type-utils@8.67.0': + resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.66.0': - resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.66.0': - resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==} + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.66.0': - resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==} + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.66.0': - resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/typescript-aix-ppc64@7.0.2': @@ -693,10 +638,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} @@ -716,9 +657,6 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -734,36 +672,9 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -797,12 +708,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -835,8 +740,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.8.0: - resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} + eslint@10.8.1: + resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -910,10 +815,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -926,10 +827,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -941,9 +838,6 @@ packages: immer@11.1.15: resolution: {integrity: sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ==} - immutable@4.3.9: - resolution: {integrity: sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -952,9 +846,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -966,20 +857,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - jotai-devtools@0.14.0: - resolution: {integrity: sha512-vtUE3hlcZJeBpaziPMu07jB0kWu5MWUsGAsYBUUFBbTcE8Tzumb2+ZV6lPrIgEAJmVg5ZD1vf73URDzdgoKZaw==} - engines: {node: '>=14.0.0'} - peerDependencies: - jotai: '>=2.20.0' - react: '>=17.0.0' - jotai@2.20.2: resolution: {integrity: sha512-aHB4CNb9qRcyf0mwSB6EO5bCGAjx8cTwFgOFCE2leOnTzqACbnSWG8XoWB3LxCT1Qoj03I1OWAHszDmN4uHb/w==} engines: {node: '>=12.20.0'} @@ -1010,11 +891,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsondiffpatch@0.5.0: - resolution: {integrity: sha512-Quz3MvAwHxVYNXsOByL7xI5EB2WYOeFswqaHIA3qOK3isRWTxiplBEocmmru6XmxDB2L7jDNYtYA4FyimoAFEw==} - engines: {node: '>=8.17.0'} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -1100,9 +976,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -1179,76 +1052,14 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - react-base16-styling@0.9.1: - resolution: {integrity: sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==} - react-dom@19.2.8: resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} peerDependencies: react: ^19.2.8 - react-error-boundary@5.0.0: - resolution: {integrity: sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ==} - peerDependencies: - react: '>=16.13.1' - react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-json-tree@0.18.0: - resolution: {integrity: sha512-Qe6HKSXrr++n9Y31nkRJ3XvQMATISpqigH1vEKhLwB56+nk5thTP0ITThpjxY6ZG/ubpVq/aEHIcyLP/OPHxeA==} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - react-number-format@5.4.5: - resolution: {integrity: sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==} - peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-resizable-panels@2.1.7: - resolution: {integrity: sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==} - peerDependencies: - react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-textarea-autosize@8.5.9: - resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react@19.2.8: resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} @@ -1257,9 +1068,6 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - rolldown@1.1.5: resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1284,9 +1092,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1305,9 +1110,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - tabbable@6.5.0: - resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1336,10 +1138,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -1356,53 +1154,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-composed-ref@1.4.0: - resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-isomorphic-layout-effect@1.2.1: - resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-latest@1.3.0: - resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - vite@8.1.5: resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1551,9 +1302,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))': dependencies: - eslint: 10.8.0(jiti@2.7.0)(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1581,31 +1332,6 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@floating-ui/core@1.8.0': - dependencies: - '@floating-ui/utils': 0.2.12 - - '@floating-ui/dom@1.8.0': - dependencies: - '@floating-ui/core': 1.8.0 - '@floating-ui/utils': 0.2.12 - - '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@floating-ui/dom': 1.8.0 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@floating-ui/react@0.26.28(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@floating-ui/utils': 0.2.12 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - tabbable: 6.5.0 - - '@floating-ui/utils@0.2.12': {} - '@happy-dom/global-registrator@20.11.1': dependencies: '@types/node': 26.1.2 @@ -1632,33 +1358,6 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} - '@mantine/code-highlight@7.17.4(@mantine/core@7.17.4(@mantine/hooks@7.17.4(react@19.2.8))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@mantine/hooks@7.17.4(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@mantine/core': 7.17.4(@mantine/hooks@7.17.4(react@19.2.8))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@mantine/hooks': 7.17.4(react@19.2.8) - clsx: 2.1.1 - highlight.js: 11.11.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - '@mantine/core@7.17.4(@mantine/hooks@7.17.4(react@19.2.8))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': - dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@mantine/hooks': 7.17.4(react@19.2.8) - clsx: 2.1.1 - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - react-number-format: 5.4.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) - react-textarea-autosize: 8.5.9(@types/react@19.2.18)(react@19.2.8) - type-fest: 4.41.0 - transitivePeerDependencies: - - '@types/react' - - '@mantine/hooks@7.17.4(react@19.2.8)': - dependencies: - react: 19.2.8 - '@napi-rs/wasm-runtime@1.2.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 @@ -1668,12 +1367,6 @@ snapshots: '@oxc-project/types@0.139.0': {} - '@redux-devtools/extension@3.3.0(redux@5.0.1)': - dependencies: - '@babel/runtime': 7.29.7 - immutable: 4.3.9 - redux: 5.0.1 - '@rolldown/binding-android-arm64@1.1.5': optional: true @@ -1765,8 +1458,6 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/base16@1.0.5': {} - '@types/bun@1.3.14': dependencies: bun-types: 1.3.14 @@ -1784,8 +1475,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/lodash@4.17.25': {} - '@types/node@26.1.2': dependencies: undici-types: 8.3.0 @@ -1804,15 +1493,15 @@ snapshots: dependencies: '@types/node': 26.1.2 - '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/type-utils': 8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/utils': 8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/visitor-keys': 8.66.0 - eslint: 10.8.0(jiti@2.7.0)(supports-color@7.2.0) + '@typescript-eslint/parser': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/type-utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/visitor-keys': 8.67.0 + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) @@ -1820,56 +1509,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/parser@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3(supports-color@7.2.0) - eslint: 10.8.0(jiti@2.7.0)(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.66.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': + '@typescript-eslint/project-service@8.67.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/tsconfig-utils': 8.67.0(@typescript/typescript6@6.0.2) + '@typescript-eslint/types': 8.67.0 debug: 4.4.3(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.66.0': + '@typescript-eslint/scope-manager@8.67.0': dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 - '@typescript-eslint/tsconfig-utils@8.66.0(@typescript/typescript6@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.67.0(@typescript/typescript6@6.0.2)': dependencies: typescript: '@typescript/typescript6@6.0.2' - '@typescript-eslint/type-utils@8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/type-utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/utils': 8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/utils': 8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0) debug: 4.4.3(supports-color@7.2.0) - eslint: 10.8.0(jiti@2.7.0)(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.66.0': {} + '@typescript-eslint/types@8.67.0': {} - '@typescript-eslint/typescript-estree@8.66.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': + '@typescript-eslint/typescript-estree@8.67.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': dependencies: - '@typescript-eslint/project-service': 8.66.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/tsconfig-utils': 8.66.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/project-service': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/tsconfig-utils': 8.67.0(@typescript/typescript6@6.0.2) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.5 @@ -1879,20 +1568,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.66.0(@typescript/typescript6@6.0.2)(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/utils@8.67.0(@typescript/typescript6@6.0.2)(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0)) - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - eslint: 10.8.0(jiti@2.7.0)(supports-color@7.2.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + eslint: 10.8.1(jiti@2.7.0)(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.66.0': + '@typescript-eslint/visitor-keys@8.67.0': dependencies: - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 '@typescript/typescript-aix-ppc64@7.0.2': @@ -2020,10 +1709,6 @@ snapshots: ansi-regex@5.0.1: {} - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - ansi-styles@5.2.0: {} aria-query@5.3.0: @@ -2036,8 +1721,6 @@ snapshots: balanced-match@4.0.4: {} - base16@1.0.0: {} - brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -2052,37 +1735,8 @@ snapshots: chai@6.2.2: {} - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - classnames@2.5.1: {} - clsx@2.1.1: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - convert-source-map@2.0.0: {} cross-spawn@7.0.6: @@ -2107,10 +1761,6 @@ snapshots: detect-libc@2.1.2: {} - detect-node-es@1.1.0: {} - - diff-match-patch@1.0.5: {} - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -2134,9 +1784,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0): + eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(jiti@2.7.0)(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@7.2.0) '@eslint/config-helpers': 0.7.0 @@ -2224,8 +1874,6 @@ snapshots: fsevents@2.3.3: optional: true - get-nonce@1.0.1: {} - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -2243,9 +1891,8 @@ snapshots: - bufferutil - utf-8-validate - has-flag@4.0.0: {} - - highlight.js@11.11.1: {} + has-flag@4.0.0: + optional: true ignore@5.3.2: {} @@ -2253,14 +1900,10 @@ snapshots: immer@11.1.15: {} - immutable@4.3.9: {} - imurmurhash@0.1.4: {} indent-string@4.0.0: {} - is-arrayish@0.3.4: {} - is-extglob@2.1.1: {} is-glob@4.0.3: @@ -2269,31 +1912,9 @@ snapshots: isexe@2.0.0: {} - javascript-stringify@2.1.0: {} - jiti@2.7.0: optional: true - jotai-devtools@0.14.0(@types/react@19.2.18)(jotai@2.20.2(@types/react@19.2.18)(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(redux@5.0.1): - dependencies: - '@mantine/code-highlight': 7.17.4(@mantine/core@7.17.4(@mantine/hooks@7.17.4(react@19.2.8))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@mantine/hooks@7.17.4(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@mantine/core': 7.17.4(@mantine/hooks@7.17.4(react@19.2.8))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@mantine/hooks': 7.17.4(react@19.2.8) - '@redux-devtools/extension': 3.3.0(redux@5.0.1) - clsx: 2.1.1 - javascript-stringify: 2.1.0 - jotai: 2.20.2(@types/react@19.2.18)(react@19.2.8) - jsondiffpatch: 0.5.0 - react: 19.2.8 - react-base16-styling: 0.9.1 - react-error-boundary: 5.0.0(react@19.2.8) - react-json-tree: 0.18.0(@types/react@19.2.18)(react@19.2.8) - react-resizable-panels: 2.1.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - transitivePeerDependencies: - - '@types/react' - - react-dom - - redux - jotai@2.20.2(@types/react@19.2.18)(react@19.2.8): optionalDependencies: '@types/react': 19.2.18 @@ -2307,11 +1928,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jsondiffpatch@0.5.0: - dependencies: - chalk: 3.0.0 - diff-match-patch: 1.0.5 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -2374,8 +1990,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.curry@4.1.1: {} - lz-string@1.5.0: {} magic-string@0.30.21: @@ -2439,82 +2053,13 @@ snapshots: punycode@2.3.1: {} - react-base16-styling@0.9.1: - dependencies: - '@babel/runtime': 7.29.7 - '@types/base16': 1.0.5 - '@types/lodash': 4.17.25 - base16: 1.0.0 - color: 3.2.1 - csstype: 3.2.3 - lodash.curry: 4.1.1 - react-dom@19.2.8(react@19.2.8): dependencies: react: 19.2.8 scheduler: 0.27.0 - react-error-boundary@5.0.0(react@19.2.8): - dependencies: - '@babel/runtime': 7.29.7 - react: 19.2.8 - react-is@17.0.2: {} - react-json-tree@0.18.0(@types/react@19.2.18)(react@19.2.8): - dependencies: - '@babel/runtime': 7.29.7 - '@types/lodash': 4.17.25 - '@types/react': 19.2.18 - react: 19.2.8 - react-base16-styling: 0.9.1 - - react-number-format@5.4.5(react-dom@19.2.8(react@19.2.8))(react@19.2.8): - dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.2.8): - dependencies: - react: 19.2.8 - react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.18 - - react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.2.8): - dependencies: - react: 19.2.8 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.2.8) - react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.2.8) - use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.18 - - react-resizable-panels@2.1.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8): - dependencies: - react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - - react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.2.8): - dependencies: - get-nonce: 1.0.1 - react: 19.2.8 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.18 - - react-textarea-autosize@8.5.9(@types/react@19.2.18)(react@19.2.8): - dependencies: - '@babel/runtime': 7.29.7 - react: 19.2.8 - use-composed-ref: 1.4.0(@types/react@19.2.18)(react@19.2.8) - use-latest: 1.3.0(@types/react@19.2.18)(react@19.2.8) - transitivePeerDependencies: - - '@types/react' - react@19.2.8: {} redent@3.0.0: @@ -2522,8 +2067,6 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - redux@5.0.1: {} - rolldown@1.1.5: dependencies: '@oxc-project/types': 0.139.0 @@ -2557,10 +2100,6 @@ snapshots: siginfo@2.0.0: {} - simple-swizzle@0.2.4: - dependencies: - is-arrayish: 0.3.4 - source-map-js@1.2.1: {} stackback@0.0.2: {} @@ -2574,8 +2113,7 @@ snapshots: supports-color@7.2.0: dependencies: has-flag: 4.0.0 - - tabbable@6.5.0: {} + optional: true tinybench@2.9.0: {} @@ -2592,14 +2130,13 @@ snapshots: dependencies: typescript: '@typescript/typescript6@6.0.2' - tslib@2.8.1: {} + tslib@2.8.1: + optional: true type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - type-fest@4.41.0: {} - typescript@6.0.3: {} typescript@7.0.2: @@ -2631,40 +2168,6 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.2.8): - dependencies: - react: 19.2.8 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.18 - - use-composed-ref@1.4.0(@types/react@19.2.18)(react@19.2.8): - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.18 - - use-isomorphic-layout-effect@1.2.1(@types/react@19.2.18)(react@19.2.8): - dependencies: - react: 19.2.8 - optionalDependencies: - '@types/react': 19.2.18 - - use-latest@1.3.0(@types/react@19.2.18)(react@19.2.8): - dependencies: - react: 19.2.8 - use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.18)(react@19.2.8) - optionalDependencies: - '@types/react': 19.2.18 - - use-sidecar@1.1.3(@types/react@19.2.18)(react@19.2.8): - dependencies: - detect-node-es: 1.1.0 - react: 19.2.8 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.18 - vite@8.1.5(@types/node@26.1.2)(jiti@2.7.0): dependencies: lightningcss: 1.33.0