├── .prettierignore ├── src ├── app.d.ts ├── common │ └── lib │ │ ├── index.ts │ │ └── helpers │ │ ├── delay │ │ ├── index.ts │ │ └── delay.ts │ │ ├── memoizeTtl │ │ └── index.ts │ │ ├── typeGuards │ │ ├── index.ts │ │ └── typeGuards.ts │ │ ├── fileExtension │ │ ├── index.ts │ │ └── fileExtension.ts │ │ └── index.ts ├── renderer │ ├── src │ │ ├── index.scss │ │ ├── app │ │ │ ├── index.ts │ │ │ ├── styles │ │ │ │ ├── index.scss │ │ │ │ ├── tokens │ │ │ │ │ ├── line-height.tokens.css │ │ │ │ │ ├── line-height.tokens.scss │ │ │ │ │ ├── shadows.tokens.css.map │ │ │ │ │ ├── font-size.tokens.css.map │ │ │ │ │ ├── font-weight.tokens.css │ │ │ │ │ ├── line-height.tokens.css.map │ │ │ │ │ ├── font-weight.tokens.css.map │ │ │ │ │ ├── border-radius.tokens.css.map │ │ │ │ │ ├── letter-spacing.tokens.css.map │ │ │ │ │ ├── shadows.tokens.css │ │ │ │ │ ├── font-weight.tokens.scss │ │ │ │ │ ├── opacity.tokens.css.map │ │ │ │ │ ├── font-size.tokens.css │ │ │ │ │ ├── shadows.tokens.scss │ │ │ │ │ ├── font-size.tokens.scss │ │ │ │ │ ├── border.tokens.css.map │ │ │ │ │ ├── border-radius.tokens.css │ │ │ │ │ ├── letter-spacing.tokens.css │ │ │ │ │ ├── border-radius.tokens.scss │ │ │ │ │ ├── letter-spacing.tokens.scss │ │ │ │ │ ├── spacings.tokens.css.map │ │ │ │ │ ├── easings.tokens.css.map │ │ │ │ │ ├── opacity.tokens.css │ │ │ │ │ ├── opacity.tokens.scss │ │ │ │ │ ├── spacings.tokens.scss │ │ │ │ │ ├── color.tokens.css.map │ │ │ │ │ └── spacings.tokens.css │ │ │ │ └── _fonts.scss │ │ │ ├── ui │ │ │ │ └── index.ts │ │ │ └── providers │ │ │ │ ├── index.ts │ │ │ │ └── providers.ts │ │ ├── pages │ │ │ ├── Backup │ │ │ │ ├── Backup.module.scss │ │ │ │ ├── Story.module.scss │ │ │ │ ├── __mocks__ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Backup.mock.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── Backup.type.ts │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── Backup.test.tsx.snap │ │ │ │ └── Backup.tsx │ │ │ ├── Settings │ │ │ │ ├── Story.module.scss │ │ │ │ ├── Settings.module.scss │ │ │ │ ├── __mocks__ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Settings.mock.tsx │ │ │ │ ├── index.ts │ │ │ │ └── Settings.type.ts │ │ │ ├── BaldursGate3 │ │ │ │ ├── Story.module.scss │ │ │ │ ├── __mocks__ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── BaldursGate3.mock.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── BaldursGate3.type.ts │ │ │ │ ├── BaldursGate3.module.scss │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── BaldursGate3.test.tsx.snap │ │ │ │ └── BaldursGate3.tsx │ │ │ └── index.ts │ │ ├── shared │ │ │ ├── types │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── ui │ │ │ │ ├── Card │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Card.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Card.module.scss │ │ │ │ │ ├── Card.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Card.test.tsx.snap │ │ │ │ │ └── Card.tsx │ │ │ │ ├── Link │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Link.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── Link.test.tsx.snap │ │ │ │ ├── Menu │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Menu.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Menu.test.tsx.snap │ │ │ │ │ └── Menu.type.ts │ │ │ │ ├── Text │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Text.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Text.test.tsx.snap │ │ │ │ │ ├── Text.module.scss │ │ │ │ │ ├── Text.type.ts │ │ │ │ │ └── Text.tsx │ │ │ │ ├── Checkbox │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Checkbox.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Checkbox.test.tsx │ │ │ │ │ ├── Checkbox.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── Checkbox.test.tsx.snap │ │ │ │ ├── Container │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Container.mock.tsx │ │ │ │ │ ├── Container.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Container.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Container.test.tsx.snap │ │ │ │ │ └── Container.tsx │ │ │ │ ├── Loading │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Loading.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Loading.test.tsx.snap │ │ │ │ │ ├── Loading.test.tsx │ │ │ │ │ └── Loading.module.scss │ │ │ │ ├── MenuItem │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── MenuItem.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── MenuItem.test.tsx.snap │ │ │ │ │ └── MenuItem.type.ts │ │ │ │ ├── Select │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Select.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── Select.module.scss │ │ │ │ ├── StickyBlock │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── StickyBlock.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── StickyBlock.module.scss │ │ │ │ │ ├── StickyBlock.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── StickyBlock.test.tsx.snap │ │ │ │ │ └── StickyBlock.tsx │ │ │ │ ├── Table │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Table.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Table.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Table.test.tsx.snap │ │ │ │ │ ├── Table.tsx │ │ │ │ │ └── Table.module.scss │ │ │ │ ├── TextArea │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── TextArea.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── TextArea.module.scss │ │ │ │ ├── TextField │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── TextField.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── TextField.module.scss │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── TextField.test.tsx.snap │ │ │ │ ├── FakeButton │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── FakeButton.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── FakeButton.module.scss │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── FakeButton.test.tsx.snap │ │ │ │ │ └── FakeButton.type.ts │ │ │ │ ├── Button │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Button.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── Button.test.tsx.snap │ │ │ │ ├── Search │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Search.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ └── Search.module.scss │ │ │ │ ├── LazyImage │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── LazyImage.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── LazyImage.type.ts │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── LazyImage.test.tsx.snap │ │ │ │ ├── NoImage │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── NoImage.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── NoImage.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── NoImage.test.tsx.snap │ │ │ │ │ ├── NoImage.module.scss │ │ │ │ │ ├── NoImage.tsx │ │ │ │ │ └── Story.module.scss │ │ │ │ ├── Spinner │ │ │ │ │ ├── Spinner.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Spinner.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Spinner.test.tsx.snap │ │ │ │ │ └── Story.module.scss │ │ │ │ ├── IconButton │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── IconButton.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── IconButton.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── IconButton.test.tsx.snap │ │ │ │ ├── LinkButton │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── LinkButton.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── LinkButton.test.tsx.snap │ │ │ │ │ ├── LinkButton.module.scss │ │ │ │ │ └── LinkButton.type.ts │ │ │ │ ├── ToggleButton │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── ToggleButton.mock.tsx │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ToggleButton.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── ToggleButton.test.tsx.snap │ │ │ │ │ └── ToggleButton.module.scss │ │ │ │ └── Heading │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Heading.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ └── Heading.test.tsx.snap │ │ │ ├── components │ │ │ │ ├── Error │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── Error.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── Error.type.ts │ │ │ │ │ ├── Error.module.scss │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── Error.test.tsx.snap │ │ │ │ │ └── Error.tsx │ │ │ │ ├── DataTable │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── DataTable.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── DataTable.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── DataTable.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── DataTable.test.tsx.snap │ │ │ │ │ └── DataTable.test.tsx │ │ │ │ ├── SuspenseError │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── SuspenseError.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── SuspenseError.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── SuspenseError.type.ts │ │ │ │ │ └── SuspenseError.tsx │ │ │ │ ├── ErrorBoundary │ │ │ │ │ ├── ErrorBoundary.module.scss │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── lib │ │ │ │ ├── schemas │ │ │ │ │ ├── index.ts │ │ │ │ │ └── rules │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── rules.ts │ │ │ │ ├── helpers │ │ │ │ │ ├── delay │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── delay.ts │ │ │ │ │ ├── compose │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── getNodeText │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── getNodeText.ts │ │ │ │ │ ├── typeGuards │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── typeGuards.ts │ │ │ │ │ ├── trpc │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── classNames │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── classNames.ts │ │ │ │ │ ├── lazyImport │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── lazyImport.type.ts │ │ │ │ │ │ └── __mocks__ │ │ │ │ │ │ │ └── TestComponent.tsx │ │ │ │ │ ├── mergeRefs │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── mergeRefs.ts │ │ │ │ │ ├── storybookDecorators │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── storybookDecorators.tsx │ │ │ │ │ ├── testUtils │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── testUtils.type.ts │ │ │ │ │ └── index.ts │ │ │ │ └── hooks │ │ │ │ │ ├── useTheme │ │ │ │ │ ├── useTheme.type.ts │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── useTheme.mock.ts │ │ │ │ │ └── index.ts │ │ │ │ │ ├── useWorkerManager │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── workerManager │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── workerManager.type.ts │ │ │ │ │ └── useWorkerManager.ts │ │ │ │ │ ├── useMutationObserver │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useMutationObserver.test.tsx │ │ │ │ │ ├── useOutsideClick │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useOutsideClick.type.ts │ │ │ │ │ └── index.ts │ │ │ ├── config │ │ │ │ ├── config.ts │ │ │ │ └── index.ts │ │ │ ├── assets │ │ │ │ ├── images │ │ │ │ │ ├── BG3-logo.png │ │ │ │ │ ├── mountain.webp │ │ │ │ │ ├── mountain-@360.webp │ │ │ │ │ ├── man-bear-pig-avif-1x.avif │ │ │ │ │ ├── man-bear-pig-avif-2x.avif │ │ │ │ │ ├── man-bear-pig-avif-3x.avif │ │ │ │ │ ├── man-bear-pig-jpg-1x.jpg │ │ │ │ │ ├── man-bear-pig-jpg-2x.jpg │ │ │ │ │ ├── man-bear-pig-jpg-3x.jpg │ │ │ │ │ ├── man-bear-pig-webp-1x.webp │ │ │ │ │ ├── man-bear-pig-webp-2x.webp │ │ │ │ │ ├── man-bear-pig-webp-3x.webp │ │ │ │ │ ├── mountain-moonlight.webp │ │ │ │ │ └── mountain-moonlight-@360.webp │ │ │ │ ├── icons │ │ │ │ │ ├── check.svg │ │ │ │ │ ├── done.svg │ │ │ │ │ ├── delete.svg │ │ │ │ │ ├── error.svg │ │ │ │ │ ├── copy.svg │ │ │ │ │ ├── grid.svg │ │ │ │ │ ├── brands │ │ │ │ │ │ └── facebook.svg │ │ │ │ │ ├── delete-forever.svg │ │ │ │ │ ├── search.svg │ │ │ │ │ ├── restore.svg │ │ │ │ │ ├── visibility.svg │ │ │ │ │ ├── arrow-down.svg │ │ │ │ │ └── tick.svg │ │ │ │ └── spinners │ │ │ │ │ ├── eclipse-1s-200px.svg │ │ │ │ │ ├── rolling-1s-200px.svg │ │ │ │ │ └── oval.svg │ │ │ └── styles │ │ │ │ ├── _card-base.scss │ │ │ │ └── _vars.scss │ │ ├── routes │ │ │ ├── AppRoutes │ │ │ │ ├── Story.module.scss │ │ │ │ ├── AppRoutes.module.scss │ │ │ │ ├── __mocks__ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── AppRoutes.mock.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── AppRoutes.test.tsx.snap │ │ │ │ ├── AppRoutes.type.ts │ │ │ │ └── AppRoutes.test.tsx │ │ │ └── index.ts │ │ ├── widgets │ │ │ ├── ui │ │ │ │ ├── AppNavBar │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── AppNavBar.mock.tsx │ │ │ │ │ ├── AppNavBar.type.ts │ │ │ │ │ ├── AppNavBar.module.scss │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── AppNavBar.test.tsx.snap │ │ │ │ ├── BackupSection │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── BackupSection.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── BackupSection.module.scss │ │ │ │ │ ├── BackupSection.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── BackupSection.test.tsx.snap │ │ │ │ ├── GameNavBar │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── ui │ │ │ │ │ │ ├── GameNavLink │ │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ │ ├── GameNavLink.module.scss │ │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── GameNavLink.mock.tsx │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── GameNavLink.type.ts │ │ │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ │ │ └── GameNavLink.test.tsx.snap │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── GameNavBar.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── GameNavBar.module.scss │ │ │ │ │ ├── GameNavBar.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── GameNavBar.test.tsx.snap │ │ │ │ ├── ModFileSection │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── ModFileSection.mock.tsx │ │ │ │ │ ├── ModFileSection.module.scss │ │ │ │ │ ├── ModFileSection.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── ModFileSection.test.tsx.snap │ │ │ │ ├── InstalledModsSection │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── InstalledModsSection.module.scss │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── InstalledModsSection.mock.tsx │ │ │ │ │ ├── InstalledModsSection.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── InstalledModsSection.test.tsx.snap │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── features │ │ │ ├── backup │ │ │ │ ├── ui │ │ │ │ │ ├── Backup │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── Backup.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── Backup.module.scss │ │ │ │ │ │ └── Backup.type.ts │ │ │ │ │ ├── BackupList │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── BackupList.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── BackupList.module.scss │ │ │ │ │ │ ├── BackupList.type.ts │ │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ │ └── BackupList.test.tsx.snap │ │ │ │ │ ├── SaveSettingsButton │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── SaveSettingsButton.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── SaveSettingsButton.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── SaveSettingsButton.type.ts │ │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ │ └── SaveSettingsButton.test.tsx.snap │ │ │ │ │ └── RestoreDefaultSettings │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── RestoreDefaultSettings.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── RestoreDefaultSettings.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── RestoreDefaultSettings.type.ts │ │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── RestoreDefaultSettings.test.tsx.snap │ │ │ │ └── index.ts │ │ │ ├── modFile │ │ │ │ ├── ui │ │ │ │ │ ├── EmptyList │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── EmptyList.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── EmptyList.type.ts │ │ │ │ │ │ └── EmptyList.module.scss │ │ │ │ │ ├── ModFileButton │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── ModFileButton.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── ModFileButton.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── ModFileButton.type.ts │ │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ │ └── ModFileButton.test.tsx.snap │ │ │ │ │ ├── ModFileForm │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── ModFileForm.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── ModFileForm.type.ts │ │ │ │ │ │ └── ModFileForm.module.scss │ │ │ │ │ ├── ModFileList │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── ModFileList.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── ModFileList.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── ModFileList.type.ts │ │ │ │ │ └── ModFileRow │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── ModFileRow.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── ModFileRow.test.tsx │ │ │ │ │ │ ├── ModFileRow.module.scss │ │ │ │ │ │ └── ModFileRow.type.ts │ │ │ │ └── index.ts │ │ │ ├── settings │ │ │ │ ├── ui │ │ │ │ │ └── SettingsForm │ │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── SettingsForm.mock.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── SettingsForm.module.scss │ │ │ │ │ │ └── SettingsForm.type.ts │ │ │ │ └── index.ts │ │ │ └── modSettingsFile │ │ │ │ ├── ui │ │ │ │ ├── EmptyList │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── EmptyList.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── EmptyList.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── EmptyList.type.ts │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── EmptyList.test.tsx.snap │ │ │ │ │ ├── EmptyList.tsx │ │ │ │ │ └── EmptyList.test.tsx │ │ │ │ ├── ModsOrder │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── ModsOrder.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── ModsOrder.type.ts │ │ │ │ ├── InstalledMod │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── InstalledMod.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── InstalledMod.type.ts │ │ │ │ │ └── InstalledMod.module.scss │ │ │ │ ├── InstalledModsList │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── InstalledModsList.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── InstalledModsList.module.scss │ │ │ │ │ └── InstalledModsList.type.ts │ │ │ │ └── ToggleActiveModButton │ │ │ │ │ ├── Story.module.scss │ │ │ │ │ ├── ToggleActiveModButton.module.scss │ │ │ │ │ ├── __mocks__ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── ToggleActiveModButton.mock.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── ToggleActiveModButton.type.ts │ │ │ │ │ └── __snapshots__ │ │ │ │ │ └── ToggleActiveModButton.test.tsx.snap │ │ │ │ └── index.ts │ │ └── main.tsx │ └── index.html ├── main │ ├── features │ │ ├── types │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── backup │ │ │ ├── getBackupsHandler │ │ │ │ └── index.ts │ │ │ ├── createBackupHandler │ │ │ │ └── index.ts │ │ │ ├── deleteBackupHandler │ │ │ │ ├── index.ts │ │ │ │ └── deleteBackupHandler.ts │ │ │ ├── restoreFromFileHandler │ │ │ │ ├── index.ts │ │ │ │ ├── restoreFromFileHandler.type.ts │ │ │ │ └── restoreFromFileHandler.ts │ │ │ ├── copyBackupContentHandler │ │ │ │ ├── index.ts │ │ │ │ └── copyBackupContentHandler.ts │ │ │ ├── restoreDefaultSettingsHandler │ │ │ │ ├── index.ts │ │ │ │ └── restoreDefaultSettingsHandler.ts │ │ │ └── index.ts │ │ ├── mod │ │ │ ├── reorderActiveModsHandler │ │ │ │ └── index.ts │ │ │ ├── toggleActiveModHandler │ │ │ │ ├── lib │ │ │ │ │ └── helpers │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── isActiveMod │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── isActiveMod.ts │ │ │ │ └── index.ts │ │ │ ├── installModsHandler │ │ │ │ ├── lib │ │ │ │ │ └── helpers │ │ │ │ │ │ ├── copyPakFile │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── extractContents │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── installModsHandler.ts │ │ │ ├── deleteModsHandler │ │ │ │ ├── index.ts │ │ │ │ └── lib │ │ │ │ │ └── helpers │ │ │ │ │ ├── removePakFiles │ │ │ │ │ └── index.ts │ │ │ │ │ ├── removeModFromSettings │ │ │ │ │ ├── index.ts │ │ │ │ │ └── removeModFromSettings.ts │ │ │ │ │ └── index.ts │ │ │ ├── getInstalledModsHandler │ │ │ │ ├── index.ts │ │ │ │ └── getInstalledModsHandler.type.ts │ │ │ ├── readModsHandler │ │ │ │ ├── index.ts │ │ │ │ ├── readModsHandler.type.ts │ │ │ │ └── worker.ts │ │ │ └── index.ts │ │ └── settings │ │ │ ├── getGameSettingsHandler │ │ │ ├── index.ts │ │ │ └── getGameSettingsHandler.ts │ │ │ ├── updateGameSettingsHandler │ │ │ ├── index.ts │ │ │ └── updateGameSettingsHandler.type.ts │ │ │ └── index.ts │ ├── shared │ │ ├── lib │ │ │ └── helpers │ │ │ │ ├── trpc │ │ │ │ ├── index.ts │ │ │ │ └── trpc.ts │ │ │ │ ├── appPaths │ │ │ │ ├── index.ts │ │ │ │ └── appPaths.ts │ │ │ │ ├── memoizeTtl │ │ │ │ └── index.ts │ │ │ │ ├── validation │ │ │ │ ├── index.ts │ │ │ │ └── validation.ts │ │ │ │ ├── fileExtension │ │ │ │ ├── index.ts │ │ │ │ └── fileExtension.ts │ │ │ │ ├── netConnection │ │ │ │ ├── index.ts │ │ │ │ └── netConnection.ts │ │ │ │ ├── getGameSettings │ │ │ │ ├── index.ts │ │ │ │ └── getGameSettings.ts │ │ │ │ ├── resolveHtmlPath │ │ │ │ ├── index.ts │ │ │ │ └── resolveHtmlPath.ts │ │ │ │ ├── ipcRequestHandler │ │ │ │ └── index.ts │ │ │ │ ├── workerManager │ │ │ │ ├── index.ts │ │ │ │ └── workerManager.type.ts │ │ │ │ └── index.ts │ │ ├── types │ │ │ ├── index.ts │ │ │ ├── api.ts │ │ │ └── types.ts │ │ └── config │ │ │ ├── index.ts │ │ │ └── config.type.ts │ ├── controllers │ │ ├── mod │ │ │ └── index.ts │ │ ├── backup │ │ │ ├── index.ts │ │ │ └── validation.ts │ │ ├── settings │ │ │ ├── index.ts │ │ │ └── validation.ts │ │ └── index.ts │ ├── entities │ │ ├── mod │ │ │ ├── lib │ │ │ │ └── helpers │ │ │ │ │ ├── activateMod │ │ │ │ │ └── index.ts │ │ │ │ │ ├── createModNode │ │ │ │ │ └── index.ts │ │ │ │ │ ├── deactivateMod │ │ │ │ │ └── index.ts │ │ │ │ │ ├── createModNodeOrder │ │ │ │ │ ├── index.ts │ │ │ │ │ └── createModNodeOrder.ts │ │ │ │ │ ├── getConventionalVersion │ │ │ │ │ └── index.ts │ │ │ │ │ ├── getModData │ │ │ │ │ ├── lib │ │ │ │ │ │ ├── getPakFileDataFromArchive │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── getPakFileDataFromArchive.type.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── getModData.ts │ │ │ │ │ ├── getModInfo │ │ │ │ │ ├── index.ts │ │ │ │ │ └── getModInfo.type.ts │ │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ └── modSettingsFile │ │ │ ├── lib │ │ │ └── helpers │ │ │ │ ├── removeDuplicates │ │ │ │ └── index.ts │ │ │ │ ├── saveModSettings │ │ │ │ └── index.ts │ │ │ │ ├── verifyModSettings │ │ │ │ └── index.ts │ │ │ │ ├── getCurrentSettings │ │ │ │ ├── index.ts │ │ │ │ └── getCurrentSettings.ts │ │ │ │ └── index.ts │ │ │ └── index.ts │ ├── router.ts │ └── init.ts ├── reset.d.ts ├── electron-env.d.ts └── setupTests.ts ├── .npmrc ├── .husky └── pre-commit ├── .prettierrc ├── resources └── icon.png ├── dev-app-update.yml ├── PakReader ├── CompressionMethod.cs ├── CompressionLevel.cs ├── Resource.cs ├── PackageVersion.cs └── PackageInfo.cs ├── .github ├── config.yml └── ISSUE_TEMPLATE │ ├── 3-Feature_request.md │ ├── 2-Question.md │ └── 1-Bug_report.md ├── .eslintignore ├── config └── build │ ├── afterSign.js │ ├── beforeBuild.js │ └── afterAllArtifactBuild.js ├── .versionrc.js ├── scripts └── clean.js ├── versionBumper.js ├── .gitignore └── tsconfig.node.json /.prettierignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | pnpm-lock.yaml 4 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | declare const APP_VERSION: string; 2 | -------------------------------------------------------------------------------- /src/common/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./helpers"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/index.scss: -------------------------------------------------------------------------------- 1 | @import "./app/styles"; 2 | -------------------------------------------------------------------------------- /src/main/features/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./types"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/app/index.ts: -------------------------------------------------------------------------------- 1 | export { App } from "./ui"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/index.scss: -------------------------------------------------------------------------------- 1 | @import "./global"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/app/ui/index.ts: -------------------------------------------------------------------------------- 1 | export { App } from "./App"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/Backup.module.scss: -------------------------------------------------------------------------------- 1 | .Backup { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Settings/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./types"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Link/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Menu/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/trpc/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./trpc"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Loading/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/MenuItem/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Select/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story {} 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextArea/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextField/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/common/lib/helpers/delay/index.ts: -------------------------------------------------------------------------------- 1 | export { delay } from "./delay"; 2 | -------------------------------------------------------------------------------- /src/common/lib/helpers/memoizeTtl/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./memoizedTtl"; 2 | -------------------------------------------------------------------------------- /src/common/lib/helpers/typeGuards/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./typeGuards"; 2 | -------------------------------------------------------------------------------- /src/main/controllers/mod/index.ts: -------------------------------------------------------------------------------- 1 | export { modController } from "./mod"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/appPaths/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./appPaths"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Settings/Settings.module.scss: -------------------------------------------------------------------------------- 1 | .Settings { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/AppRoutes.module.scss: -------------------------------------------------------------------------------- 1 | .AppRoutes { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/schemas/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./common"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/common/lib/helpers/fileExtension/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./fileExtension"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/memoizeTtl/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./memoizedTtl"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/validation/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./validation"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/Backup/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/EmptyList/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/schemas/rules/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./rules"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/main/controllers/backup/index.ts: -------------------------------------------------------------------------------- 1 | export { backupController } from "./backup"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/fileExtension/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./fileExtension"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/netConnection/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./netConnection"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/app/providers/index.ts: -------------------------------------------------------------------------------- 1 | export { withProviders } from "./providers"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileForm/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileList/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/ui/SettingsForm/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/delay/index.ts: -------------------------------------------------------------------------------- 1 | export { delay } from "./delay"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ 2 | shamefully-hoist=true 3 | -------------------------------------------------------------------------------- /src/main/controllers/settings/index.ts: -------------------------------------------------------------------------------- 1 | export { settingsController } from "./settings"; 2 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/activateMod/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./activateMod"; 2 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/createModNode/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./createModNode"; 2 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/deactivateMod/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./deactivateMod"; 2 | -------------------------------------------------------------------------------- /src/main/features/backup/getBackupsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getBackupsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/getGameSettings/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getGameSettings"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/resolveHtmlPath/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./resolveHtmlPath"; 2 | -------------------------------------------------------------------------------- /src/main/shared/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./types"; 2 | 3 | export * from "./api"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ModsOrder/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/routes/index.ts: -------------------------------------------------------------------------------- 1 | export { AppRoutes, APP_ROUTES } from "./AppRoutes"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/DataTable.module.scss: -------------------------------------------------------------------------------- 1 | .DataTable { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/compose/index.ts: -------------------------------------------------------------------------------- 1 | export { compose } from "./compose"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/getNodeText/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getNodeText"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/typeGuards/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./typeGuards"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Card.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Link/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Link.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Menu/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Menu.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Text.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/index.ts: -------------------------------------------------------------------------------- 1 | export { AppNavBar } from "./AppNavBar"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/main/features/backup/createBackupHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./createBackupHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/backup/deleteBackupHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./deleteBackupHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/types/types.ts: -------------------------------------------------------------------------------- 1 | export type { ReadModResult } from "../mod/readModsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/ipcRequestHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./ipcRequestHandler"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileForm } from "./ui/ModFileForm"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileList/ModFileList.module.scss: -------------------------------------------------------------------------------- 1 | .ModFileList { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledMod/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/index.ts: -------------------------------------------------------------------------------- 1 | export { SettingsForm } from "./ui/SettingsForm"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/trpc/index.ts: -------------------------------------------------------------------------------- 1 | export { trpc, trpcClient } from "./trpc"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Button/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Button.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Search/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Search.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Select/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Select.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Table.mock"; 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/createModNodeOrder/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./createModNodeOrder"; 2 | -------------------------------------------------------------------------------- /src/main/features/backup/restoreFromFileHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./restoreFromFileHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/reorderActiveModsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./reorderActiveModsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/toggleActiveModHandler/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./isActiveMod"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/ModFileButton.module.scss: -------------------------------------------------------------------------------- 1 | .ModFileButton { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.module.scss: -------------------------------------------------------------------------------- 1 | .EmptyList { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledModsList/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Error.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/ErrorBoundary/ErrorBoundary.module.scss: -------------------------------------------------------------------------------- 1 | .ErrorBoundary { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/SuspenseError.module.scss: -------------------------------------------------------------------------------- 1 | .SuspenseError { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/classNames/index.ts: -------------------------------------------------------------------------------- 1 | export { classNames } from "./classNames"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/lazyImport/index.ts: -------------------------------------------------------------------------------- 1 | export { lazyImport } from "./lazyImport"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/mergeRefs/index.ts: -------------------------------------------------------------------------------- 1 | export { mergeRefs } from "./mergeRefs"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useTheme/useTheme.type.ts: -------------------------------------------------------------------------------- 1 | export type Theme = "dark" | "light"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useWorkerManager/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./useWorkerManager"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Checkbox.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Container.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LazyImage/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./LazyImage.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/MenuItem/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./MenuItem.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./NoImage.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Spinner/Spinner.module.scss: -------------------------------------------------------------------------------- 1 | .Spinner { 2 | fill: currentcolor; 3 | } 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextArea/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./TextArea.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextField/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./TextField.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/GameNavLink.module.scss: -------------------------------------------------------------------------------- 1 | .GameNavLink { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/index.ts: -------------------------------------------------------------------------------- 1 | export { GameNavLink } from "./GameNavLink"; 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "endOfLine": "lf", 4 | "trailingComma": "all" 5 | } 6 | -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/resources/icon.png -------------------------------------------------------------------------------- /src/main/features/backup/copyBackupContentHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./copyBackupContentHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/installModsHandler/lib/helpers/copyPakFile/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./copyPakFile"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupMock as Backup } from "./Backup.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/ErrorBoundary/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ErrorBoundary"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./FakeButton.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/IconButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./IconButton.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LinkButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./LinkButton.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./StickyBlock.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./AppNavBar.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileSection } from "./ModFileSection"; 2 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getConventionalVersion/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getConventionalVersion"; 2 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/lib/helpers/removeDuplicates/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./removeDuplicates"; 2 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/lib/helpers/saveModSettings/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./saveModSettings"; 2 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/lib/helpers/verifyModSettings/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./verifyModSettings"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/deleteModsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { deleteModsHandler } from "./deleteModsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/deleteModsHandler/lib/helpers/removePakFiles/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./removePakFiles"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/installModsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { installModsHandler } from "./installModsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/toggleActiveModHandler/lib/helpers/isActiveMod/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./isActiveMod"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/EmptyList/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./EmptyList.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./DataTable.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ToggleButton.mock"; 2 | -------------------------------------------------------------------------------- /src/reset.d.ts: -------------------------------------------------------------------------------- 1 | // Do not add any other lines of code to this file! 2 | import "@total-typescript/ts-reset"; 3 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/lib/helpers/getCurrentSettings/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getCurrentSettings"; 2 | -------------------------------------------------------------------------------- /src/main/features/backup/restoreDefaultSettingsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./restoreDefaultSettingsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/installModsHandler/lib/helpers/extractContents/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./extractContents"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/installModsHandler/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export { extractContents } from "./extractContents"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/SaveSettingsButton.module.scss: -------------------------------------------------------------------------------- 1 | .SaveSettingsButton { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileForm/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ModFileForm.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ModFileRow.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/index.ts: -------------------------------------------------------------------------------- 1 | export { InstalledModsList } from "./ui/InstalledModsList"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/index.ts: -------------------------------------------------------------------------------- 1 | export { Backup } from "./Backup"; 2 | 3 | export * from "./Backup.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Settings/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { SettingsMock as Settings } from "./Settings.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Card"; 2 | 3 | export * from "./Card.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Link/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Link"; 2 | 3 | export * from "./Link.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Menu/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Menu"; 2 | 3 | export * from "./Menu.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Text"; 2 | 3 | export * from "./Text.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | display: grid; 3 | gap: 20px; 4 | } 5 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/InstalledModsSection.module.scss: -------------------------------------------------------------------------------- 1 | .InstalledModsSection { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/Backup/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupMock as Backup } from "./Backup.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ModFileButton.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./EmptyList.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ModsOrder/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ModsOrder.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { AppRoutesMock as AppRoutes } from "./AppRoutes.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./SuspenseError.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/storybookDecorators/index.ts: -------------------------------------------------------------------------------- 1 | export { withRouter } from "./storybookDecorators"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Button/index.ts: -------------------------------------------------------------------------------- 1 | export { Button } from "./Button"; 2 | 3 | export * from "./Button.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Heading/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | .variants { 3 | margin: 2rem 0; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Search/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Search"; 2 | 3 | export * from "./Search.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Select/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Select"; 2 | 3 | export * from "./Select.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Table"; 2 | 3 | export * from "./Table.type"; 4 | -------------------------------------------------------------------------------- /src/main/features/mod/deleteModsHandler/lib/helpers/removeModFromSettings/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./removeModFromSettings"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/getInstalledModsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { getInstalledModsHandler } from "./getInstalledModsHandler"; 2 | -------------------------------------------------------------------------------- /src/main/features/mod/toggleActiveModHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { toggleActiveModHandler } from "./toggleActiveModHandler"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledMod/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./InstalledMod.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Settings/index.ts: -------------------------------------------------------------------------------- 1 | export { Settings } from "./Settings"; 2 | 3 | export * from "./Settings.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Error"; 2 | 3 | export * from "./Error.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/testUtils/index.ts: -------------------------------------------------------------------------------- 1 | export { renderWithRouter, withQueryProvider } from "./testUtils"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useMutationObserver/index.ts: -------------------------------------------------------------------------------- 1 | export { useMutationObserver } from "./useMutationObserver"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useTheme/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { useThemeMock as useTheme } from "./useTheme.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useTheme/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./useTheme"; 2 | 3 | export * from "./useTheme.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Checkbox"; 2 | 3 | export * from "./Checkbox.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Heading/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Heading"; 2 | 3 | export * from "./Heading.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Loading/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Loading"; 2 | 3 | export * from "./Loading.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/MenuItem/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./MenuItem"; 2 | 3 | export * from "./MenuItem.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./NoImage"; 2 | 3 | export * from "./NoImage.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Spinner/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Spinner"; 2 | 3 | export * from "./Spinner.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextArea/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./TextArea"; 2 | 3 | export * from "./TextArea.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { GameNavBarMock as GameNavBar } from "./GameNavBar.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/index.ts: -------------------------------------------------------------------------------- 1 | export { InstalledModsSection } from "./InstalledModsSection"; 2 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModData/lib/getPakFileDataFromArchive/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getPakFileDataFromArchive"; 2 | -------------------------------------------------------------------------------- /src/main/features/settings/getGameSettingsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { getGameSettingsHandler } from "./getGameSettingsHandler"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/Backup/index.ts: -------------------------------------------------------------------------------- 1 | export { Backup } from "./Backup"; 2 | 3 | export * from "./Backup.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/RestoreDefaultSettings.module.scss: -------------------------------------------------------------------------------- 1 | .RestoreDefaultSettings { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { BaldursGate3Mock as BaldursGate3 } from "./BaldursGate3.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/index.ts: -------------------------------------------------------------------------------- 1 | export { AppRoutes } from "./AppRoutes"; 2 | 3 | export * from "./AppRoutes.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/Container.module.scss: -------------------------------------------------------------------------------- 1 | .Container { 2 | margin-inline: auto; 3 | max-width: 106rem; 4 | } 5 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./Container"; 2 | 3 | export * from "./Container.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LazyImage/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./LazyImage"; 2 | 3 | export * from "./LazyImage.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextField/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./TextField"; 2 | 3 | export * from "./TextField.type"; 4 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModData/lib/index.ts: -------------------------------------------------------------------------------- 1 | export { getPakFileDataFromArchive } from "./getPakFileDataFromArchive"; 2 | -------------------------------------------------------------------------------- /src/main/features/settings/updateGameSettingsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { updateGameSettingsHandler } from "./updateGameSettingsHandler"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupListMock as BackupList } from "./BackupList.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/ToggleActiveModButton.module.scss: -------------------------------------------------------------------------------- 1 | .ToggleActiveModButton { 2 | } 3 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./FakeButton"; 2 | 3 | export * from "./FakeButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/IconButton/index.ts: -------------------------------------------------------------------------------- 1 | export { IconButton } from "./IconButton"; 2 | 3 | export * from "./IconButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LinkButton/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./LinkButton"; 2 | 3 | export * from "./LinkButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./StickyBlock"; 2 | 3 | export * from "./StickyBlock.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/index.ts: -------------------------------------------------------------------------------- 1 | export { GameNavBar } from "./GameNavBar"; 2 | 3 | export * from "./GameNavBar.type"; 4 | -------------------------------------------------------------------------------- /dev-app-update.yml: -------------------------------------------------------------------------------- 1 | provider: generic 2 | url: https://example.com/auto-updates 3 | updaterCacheDirName: baldurs-gate3-mod-manager-updater 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/EmptyList/index.ts: -------------------------------------------------------------------------------- 1 | export { EmptyList } from "./EmptyList"; 2 | 3 | export * from "./EmptyList.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileList/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileListMock as ModFileList } from "./ModFileList.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/index.ts: -------------------------------------------------------------------------------- 1 | export { BaldursGate3 } from "./BaldursGate3"; 2 | 3 | export * from "./BaldursGate3.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./DataTable"; 2 | 3 | export * from "./DataTable.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/Card.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/card-base.scss"; 2 | 3 | .Card { 4 | @extend %card-base; 5 | } 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ToggleButton"; 2 | 3 | export * from "./ToggleButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupSectionMock as BackupSection } from "./BackupSection.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileSectionMock as ModFileSection } from "./ModFileSection.mock"; 2 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModData/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getModData"; 2 | 3 | export { getPakFileDataFromArchive } from "./lib"; 4 | -------------------------------------------------------------------------------- /src/main/features/mod/deleteModsHandler/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./removeModFromSettings"; 2 | 3 | export * from "./removePakFiles"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupList } from "./BackupList"; 2 | 3 | export * from "./BackupList.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileRow } from "./ModFileRow"; 2 | 3 | export * from "./ModFileRow.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/ui/SettingsForm/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { SettingsFormMock as SettingsForm } from "./SettingsForm.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useOutsideClick/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./useOutsideClick"; 2 | 3 | export * from "./useOutsideClick.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { GameNavLinkMock as GameNavLink } from "./GameNavLink.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/ModFileSection.module.scss: -------------------------------------------------------------------------------- 1 | .ModFileSection { 2 | display: flex; 3 | flex-direction: column; 4 | } 5 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/workerManager/index.ts: -------------------------------------------------------------------------------- 1 | export { WorkerManager } from "./workerManager"; 2 | 3 | export * from "./workerManager.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/BackupList.module.scss: -------------------------------------------------------------------------------- 1 | .BackupList { 2 | background-color: orange; 3 | max-width: 60rem; 4 | } 5 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileForm/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileForm } from "./ModFileForm"; 2 | 3 | export * from "./ModFileForm.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileList/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileList } from "./ModFileList"; 2 | 3 | export * from "./ModFileList.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/index.ts: -------------------------------------------------------------------------------- 1 | export { EmptyList } from "./EmptyList"; 2 | 3 | export * from "./EmptyList.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ModsOrder/index.ts: -------------------------------------------------------------------------------- 1 | export { ModsOrder } from "./ModsOrder"; 2 | 3 | export * from "./ModsOrder.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./SuspenseError"; 2 | 3 | export * from "./SuspenseError.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/IconButton/IconButton.type.ts: -------------------------------------------------------------------------------- 1 | import { ButtonProps } from "../Button"; 2 | 3 | export type IconButtonProps = ButtonProps; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextField/TextField.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/input-base"; 2 | 3 | .TextField { 4 | @extend %input-base; 5 | } 6 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupSection } from "./BackupSection"; 2 | 3 | export * from "./BackupSection.type"; 4 | -------------------------------------------------------------------------------- /PakReader/CompressionMethod.cs: -------------------------------------------------------------------------------- 1 | namespace PakReader; 2 | 3 | public enum CompressionMethod 4 | { 5 | None = 0, 6 | Zlib = 1, 7 | LZ4 = 2 8 | } 9 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | getCurrentSettings, 3 | saveModSettings, 4 | verifyModSettings, 5 | } from "./lib/helpers"; 6 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/ui/SettingsForm/index.ts: -------------------------------------------------------------------------------- 1 | export { SettingsForm } from "./SettingsForm"; 2 | 3 | export * from "./SettingsForm.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/config/config.ts: -------------------------------------------------------------------------------- 1 | const BG3_SETTINGS_DIR = process.env.REACT_APP_BG3_SETTINGS_DIR as string; 2 | 3 | export { BG3_SETTINGS_DIR }; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/index.ts: -------------------------------------------------------------------------------- 1 | export { GameNavLink } from "./GameNavLink"; 2 | 3 | export * from "./GameNavLink.type"; 4 | -------------------------------------------------------------------------------- /.github/config.yml: -------------------------------------------------------------------------------- 1 | requiredHeaders: 2 | - Prerequisites 3 | - Expected Behavior 4 | - Current Behavior 5 | - Possible Solution 6 | - Your Environment 7 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/index.ts: -------------------------------------------------------------------------------- 1 | export { ModFileButton } from "./ModFileButton"; 2 | 3 | export * from "./ModFileButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledMod/index.ts: -------------------------------------------------------------------------------- 1 | export { InstalledMod } from "./InstalledMod"; 2 | 3 | export * from "./InstalledMod.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/__mocks__/AppRoutes.mock.tsx: -------------------------------------------------------------------------------- 1 | const AppRoutesMock = () =>
; 2 | 3 | export { AppRoutesMock }; 4 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { SaveSettingsButtonMock as SaveSettingsButton } from "./SaveSettingsButton.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useWorkerManager/workerManager/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./workerManager"; 2 | 3 | export * from "./workerManager.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { InstalledModsSectionMock as InstalledModsSection } from "./InstalledModsSection.mock"; 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/3-Feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: You want something added to the boilerplate. 🎉 4 | labels: "enhancement" 5 | --- 6 | -------------------------------------------------------------------------------- /src/main/features/mod/readModsHandler/index.ts: -------------------------------------------------------------------------------- 1 | export { readModsHandler } from "./readModsHandler"; 2 | 3 | export type { ReadModResult } from "./readModsHandler.type"; 4 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/validation/validation.ts: -------------------------------------------------------------------------------- 1 | import z from "zod"; 2 | 3 | const gameKeyValidation = z.literal("BG3"); 4 | 5 | export { gameKeyValidation }; 6 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledModsList/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { InstalledModsListMock as InstalledModsList } from "./InstalledModsList.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/BG3-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/BG3-logo.png -------------------------------------------------------------------------------- /src/renderer/src/widgets/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | AppNavBar, 3 | BackupSection, 4 | GameNavBar, 5 | InstalledModsSection, 6 | ModFileSection, 7 | } from "./ui"; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/index.ts: -------------------------------------------------------------------------------- 1 | export { SaveSettingsButton } from "./SaveSettingsButton"; 2 | 3 | export * from "./SaveSettingsButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/pages/index.ts: -------------------------------------------------------------------------------- 1 | export { Backup } from "./Backup"; 2 | 3 | export { BaldursGate3 } from "./BaldursGate3"; 4 | 5 | export { Settings } from "./Settings"; 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/mountain.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain.webp -------------------------------------------------------------------------------- /PakReader/CompressionLevel.cs: -------------------------------------------------------------------------------- 1 | namespace PakReader; 2 | 3 | public enum CompressionLevel 4 | { 5 | FastCompression, 6 | DefaultCompression, 7 | MaxCompression 8 | } 9 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/line-height.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Line Heights 4 | * @presenter LineHeight 5 | */ 6 | --line-height: 1.5; 7 | } 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { RestoreDefaultSettingsMock as RestoreDefaultSettings } from "./RestoreDefaultSettings.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledModsList/index.ts: -------------------------------------------------------------------------------- 1 | export { InstalledModsList } from "./InstalledModsList"; 2 | 3 | export * from "./InstalledModsList.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/testUtils/testUtils.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type WithTrpcProviderArgs = { 4 | children: ReactNode; 5 | }; 6 | -------------------------------------------------------------------------------- /src/main/controllers/index.ts: -------------------------------------------------------------------------------- 1 | export { backupController } from "./backup"; 2 | 3 | export { modController } from "./mod"; 4 | 5 | export { settingsController } from "./settings"; 6 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModInfo/index.ts: -------------------------------------------------------------------------------- 1 | export { getModInfoFromBytes, getModInfoFromFile } from "./getModInfo"; 2 | 3 | export type { ModInfo } from "./getModInfo.type"; 4 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./getCurrentSettings"; 2 | 3 | export * from "./saveModSettings"; 4 | 5 | export * from "./verifyModSettings"; 6 | -------------------------------------------------------------------------------- /src/main/features/settings/index.ts: -------------------------------------------------------------------------------- 1 | export { getGameSettingsHandler } from "./getGameSettingsHandler"; 2 | 3 | export { updateGameSettingsHandler } from "./updateGameSettingsHandler"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/line-height.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Line Heights 5 | * @presenter LineHeight 6 | */ 7 | --line-height: 1.5; 8 | } 9 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/__mocks__/index.ts: -------------------------------------------------------------------------------- 1 | export { ToggleActiveModButtonMock as ToggleActiveModButton } from "./ToggleActiveModButton.mock"; 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/mountain-@360.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain-@360.webp -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | out 4 | electron.vite.config.ts 5 | vitest.config.ts 6 | /scripts 7 | 8 | 9 | ### OSX 10 | .DS_Store 11 | 12 | ### Editors 13 | .idea 14 | -------------------------------------------------------------------------------- /src/renderer/src/app/providers/providers.ts: -------------------------------------------------------------------------------- 1 | import { compose } from "@renderer/shared/lib/helpers"; 2 | 3 | const withProviders = compose(() => null); 4 | 5 | export { withProviders }; 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/StickyBlock.module.scss: -------------------------------------------------------------------------------- 1 | .StickyBlock { 2 | background-color: var(--surface-1); 3 | padding: 1rem 0; 4 | position: sticky; 5 | top: 0; 6 | } 7 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-Question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask a question.❓ 4 | labels: "question" 5 | --- 6 | 7 | ## Summary 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModData/lib/getPakFileDataFromArchive/getPakFileDataFromArchive.type.ts: -------------------------------------------------------------------------------- 1 | export type PakFileData = { 2 | fileName: string; 3 | data?: Int8Array; 4 | }; 5 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/index.ts: -------------------------------------------------------------------------------- 1 | export { RestoreDefaultSettings } from "./RestoreDefaultSettings"; 2 | 3 | export * from "./RestoreDefaultSettings.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/check.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/done.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-avif-1x.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-avif-1x.avif -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-avif-2x.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-avif-2x.avif -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-avif-3x.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-avif-3x.avif -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-jpg-1x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-jpg-1x.jpg -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-jpg-2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-jpg-2x.jpg -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-jpg-3x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-jpg-3x.jpg -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-webp-1x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-webp-1x.webp -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-webp-2x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-webp-2x.webp -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/man-bear-pig-webp-3x.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/man-bear-pig-webp-3x.webp -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/mountain-moonlight.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain-moonlight.webp -------------------------------------------------------------------------------- /src/common/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export { delay } from "./delay"; 2 | 3 | export * from "./fileExtension"; 4 | 5 | export { memoizeTtl } from "./memoizeTtl"; 6 | 7 | export * from "./typeGuards"; 8 | -------------------------------------------------------------------------------- /src/main/features/mod/readModsHandler/readModsHandler.type.ts: -------------------------------------------------------------------------------- 1 | import { ModInfo } from "@main/entities/mod"; 2 | 3 | export type ReadModResult = { 4 | filePath: string; 5 | info?: ModInfo; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/index.ts: -------------------------------------------------------------------------------- 1 | export { ToggleActiveModButton } from "./ToggleActiveModButton"; 2 | 3 | export * from "./ToggleActiveModButton.type"; 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/typeGuards/typeGuards.ts: -------------------------------------------------------------------------------- 1 | const isHtmlElement = (value: unknown): value is HTMLElement => 2 | value instanceof HTMLElement; 3 | 4 | export { isHtmlElement }; 5 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Menu/__snapshots__/Menu.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = `
`; 4 | -------------------------------------------------------------------------------- /src/main/features/mod/getInstalledModsHandler/getInstalledModsHandler.type.ts: -------------------------------------------------------------------------------- 1 | import { ModInfo } from "@main/entities/mod"; 2 | 3 | export type InstalledMod = ModInfo & { 4 | isActive: boolean; 5 | }; 6 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/_fonts.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable */ 2 | @import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap"); 3 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/shadows.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["shadows.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA","file":"shadows.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/images/mountain-moonlight-@360.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mkinfrared/baldurs-gate3-mod-manager/HEAD/src/renderer/src/shared/assets/images/mountain-moonlight-@360.webp -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/NoImage.type.ts: -------------------------------------------------------------------------------- 1 | export type NoImageProps = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/GameNavBar.module.scss: -------------------------------------------------------------------------------- 1 | .GameNavBar { 2 | display: flex; 3 | flex-direction: column; 4 | gap: var(--spacing-4); 5 | padding-block: var(--spacing-5); 6 | } 7 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useOutsideClick/useOutsideClick.type.ts: -------------------------------------------------------------------------------- 1 | import { RefObject } from "react"; 2 | 3 | export type Callback = () => void; 4 | 5 | export type Refs = RefObject[]; 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/schemas/rules/rules.ts: -------------------------------------------------------------------------------- 1 | const password = { 2 | upperCase: /[A-Z]/, 3 | lowerCase: /[a-z]/, 4 | number: /\d/, 5 | special: /[#?!@$%^&*-]/, 6 | }; 7 | 8 | export { password }; 9 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/font-size.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["font-size.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA","file":"font-size.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/font-weight.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Font Weights 4 | * @presenter FontWeight 5 | */ 6 | --font-weight-regular: 400; 7 | --font-weight-bold: 600; 8 | } 9 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/line-height.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["line-height.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA","file":"line-height.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/__snapshots__/AppRoutes.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = `
`; 4 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/AppNavBar.type.ts: -------------------------------------------------------------------------------- 1 | export type AppNavBarProps = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/GameNavBar.type.ts: -------------------------------------------------------------------------------- 1 | export type GameNavBarProps = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | }; 7 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/trpc/trpc.ts: -------------------------------------------------------------------------------- 1 | import { initTRPC } from "@trpc/server"; 2 | import superjson from "superjson"; 3 | 4 | const t = initTRPC.create({ 5 | transformer: superjson, 6 | }); 7 | 8 | export { t }; 9 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/font-weight.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["font-weight.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA","file":"font-weight.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/BaldursGate3.type.ts: -------------------------------------------------------------------------------- 1 | export type BaldursGate3Props = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/SuspenseError.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type SuspenseErrorProps = { 4 | children?: ReactNode; 5 | loadingFallback?: ReactNode; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DataTable } from "./DataTable"; 2 | 3 | export { default as Error } from "./Error"; 4 | 5 | export { default as SuspenseError } from "./SuspenseError"; 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/lazyImport/lazyImport.type.ts: -------------------------------------------------------------------------------- 1 | import { ComponentType } from "react"; 2 | 3 | export type LazyFunction> = () => Promise<{ 4 | default: T; 5 | }>; 6 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Search/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | } 3 | 4 | .option { 5 | align-items: center; 6 | display: flex; 7 | gap: 1rem; 8 | 9 | img { 10 | height: 6rem; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /PakReader/Resource.cs: -------------------------------------------------------------------------------- 1 | namespace PakReader; 2 | 3 | public class InvalidFormatException : Exception 4 | { 5 | public InvalidFormatException(string message) 6 | : base(message) 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/features/backup/restoreFromFileHandler/restoreFromFileHandler.type.ts: -------------------------------------------------------------------------------- 1 | import { GameKey } from "@main/shared/config"; 2 | 3 | export type RestoreFromFileDto = { 4 | file: string; 5 | gameKey: GameKey; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/border-radius.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["border-radius.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAKA;EACA;EACA","file":"border-radius.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/letter-spacing.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["letter-spacing.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA","file":"letter-spacing.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/shadows.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Shadows 4 | * @presenter Shadow 5 | */ 6 | --shadow-m: 0 1px 3px rgb(0 0 0 / 20%); 7 | --shadow-l: 0 1px 5px rgb(0 0 0 / 30%); 8 | } 9 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/BaldursGate3.module.scss: -------------------------------------------------------------------------------- 1 | .BaldursGate3 { 2 | display: grid; 3 | gap: var(--spacing-10); 4 | grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); 5 | min-height: 100dvh; 6 | } 7 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/Error.type.ts: -------------------------------------------------------------------------------- 1 | export type ErrorProps = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | error?: string; 7 | }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useWorkerManager/workerManager/workerManager.type.ts: -------------------------------------------------------------------------------- 1 | import { Remote } from "comlink"; 2 | 3 | export type AppWorker = Remote>; 4 | 5 | export type WorkerFactory = () => Worker; 6 | -------------------------------------------------------------------------------- /src/main/shared/config/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | APP_SETTINGS, 3 | PAK_READER_PATH, 4 | createBackupDir, 5 | saveSettings, 6 | } from "./config"; 7 | 8 | export type { AppSettings, GameSettings, GameKey } from "./config.type"; 9 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/getGameSettings/getGameSettings.ts: -------------------------------------------------------------------------------- 1 | import { APP_SETTINGS, GameKey } from "@main/shared/config"; 2 | 3 | const getGameSettings = (key: GameKey) => APP_SETTINGS[key]; 4 | 5 | export { getGameSettings }; 6 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/font-weight.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Font Weights 5 | * @presenter FontWeight 6 | */ 7 | --font-weight-regular: 400; 8 | --font-weight-bold: 600; 9 | } 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/lazyImport/__mocks__/TestComponent.tsx: -------------------------------------------------------------------------------- 1 | const TestComponent = () => ( 2 |
3 |

Test Component

4 |
5 | ); 6 | 7 | export default TestComponent; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/BackupSection.module.scss: -------------------------------------------------------------------------------- 1 | .BackupSection { 2 | .buttonGroup { 3 | display: flex; 4 | gap: var(--spacing-5); 5 | margin-block: var(--spacing-6) var(--spacing-12); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/opacity.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["opacity.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"opacity.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/features/backup/index.ts: -------------------------------------------------------------------------------- 1 | export { BackupList } from "./ui/BackupList"; 2 | 3 | export { RestoreDefaultSettings } from "./ui/RestoreDefaultSettings"; 4 | 5 | export { SaveSettingsButton } from "./ui/SaveSettingsButton"; 6 | -------------------------------------------------------------------------------- /src/renderer/src/main.tsx: -------------------------------------------------------------------------------- 1 | import ReactDOM from "react-dom/client"; 2 | 3 | import "./index.scss"; 4 | import { App } from "./app"; 5 | 6 | ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( 7 | , 8 | ); 9 | -------------------------------------------------------------------------------- /src/main/features/backup/deleteBackupHandler/deleteBackupHandler.ts: -------------------------------------------------------------------------------- 1 | import { rm } from "fs/promises"; 2 | 3 | const deleteBackupHandler = async (filePath: string) => { 4 | await rm(filePath); 5 | }; 6 | 7 | export { deleteBackupHandler }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/font-size.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Font Sizes 4 | * @presenter FontSize 5 | */ 6 | --font-size-s: 0.75rem; 7 | --font-size-m: 0.875rem; 8 | --font-size-l: 1rem; 9 | } 10 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/shadows.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Shadows 5 | * @presenter Shadow 6 | */ 7 | --shadow-m: 0 1px 3px rgb(0 0 0 / 20%); 8 | --shadow-l: 0 1px 5px rgb(0 0 0 / 30%); 9 | } 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/types/types.ts: -------------------------------------------------------------------------------- 1 | import { GameKey as GK } from "@main/shared/config"; 2 | 3 | export type { IpcRequest } from "@main/shared/types"; 4 | 5 | export type { AppRouter } from "@main/router"; 6 | 7 | export type Game = GK; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/font-size.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Font Sizes 5 | * @presenter FontSize 6 | */ 7 | --font-size-s: 0.75rem; 8 | --font-size-m: 0.875rem; 9 | --font-size-l: 1rem; 10 | } 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/__mocks__/Card.mock.tsx: -------------------------------------------------------------------------------- 1 | import { CardProps } from "../Card.type"; 2 | 3 | const CardMock = (props: CardProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default CardMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/FakeButton.module.scss: -------------------------------------------------------------------------------- 1 | @use "../../styles/_vars.scss" as v; 2 | 3 | .FakeButton { 4 | height: 100%; 5 | width: 100%; 6 | 7 | &:focus-visible { 8 | @include v.focus-visible; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Link/__mocks__/Link.mock.tsx: -------------------------------------------------------------------------------- 1 | import { LinkProps } from "../Link.type"; 2 | 3 | const LinkMock = (props: LinkProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default LinkMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Menu/__mocks__/Menu.mock.tsx: -------------------------------------------------------------------------------- 1 | import { MenuProps } from "../Menu.type"; 2 | 3 | const MenuMock = (props: MenuProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default MenuMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/__mocks__/Text.mock.tsx: -------------------------------------------------------------------------------- 1 | import { TextProps } from "../Text.type"; 2 | 3 | const TextMock = (props: TextProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default TextMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/border.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["border.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"border.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/border-radius.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Border Radius 4 | * @presenter BorderRadius 5 | */ 6 | --border-radius-s: 4px; 7 | --border-radius-m: 8px; 8 | --border-radius-l: 16px; 9 | } 10 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/__mocks__/Backup.mock.tsx: -------------------------------------------------------------------------------- 1 | import { BackupProps } from "../Backup.type"; 2 | 3 | const BackupMock = (props: BackupProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { BackupMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/__mocks__/Table.mock.tsx: -------------------------------------------------------------------------------- 1 | import { TableProps } from "../Table.type"; 2 | 3 | const TableMock = (props: TableProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default TableMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/letter-spacing.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Letter Spacings 4 | * @presenter LetterSpacing 5 | */ 6 | --letter-spacing-none: 0; 7 | --letter-spacing-s: 1px; 8 | --letter-spacing-m: 2px; 9 | } 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledModsList/InstalledModsList.module.scss: -------------------------------------------------------------------------------- 1 | .InstalledModsList { 2 | .table { 3 | width: 100%; 4 | 5 | th:first-child, 6 | td:first-child { 7 | width: 50px; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/__mocks__/Error.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ErrorProps } from "../Error.type"; 2 | 3 | const ErrorMock = (props: ErrorProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ErrorMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Button/__mocks__/Button.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ButtonProps } from "../Button.type"; 2 | 3 | const ButtonMock = (props: ButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ButtonMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/border-radius.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Border Radius 5 | * @presenter BorderRadius 6 | */ 7 | 8 | --border-radius-s: 4px; 9 | --border-radius-m: 8px; 10 | --border-radius-l: 16px; 11 | } 12 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/letter-spacing.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Letter Spacings 5 | * @presenter LetterSpacing 6 | */ 7 | --letter-spacing-none: 0; 8 | --letter-spacing-s: 1px; 9 | --letter-spacing-m: 2px; 10 | } 11 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/Backup/__mocks__/Backup.mock.tsx: -------------------------------------------------------------------------------- 1 | import { BackupProps } from "../Backup.type"; 2 | 3 | const BackupMock = (props: BackupProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { BackupMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Search/__mocks__/Search.mock.tsx: -------------------------------------------------------------------------------- 1 | import { SearchProps } from "../Search.type"; 2 | 3 | const SearchMock = (props: SearchProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default SearchMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Select/__mocks__/Select.mock.tsx: -------------------------------------------------------------------------------- 1 | import { SelectProps } from "../Select.type"; 2 | 3 | const SelectMock = (props: SelectProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default SelectMock; 8 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/workerManager/workerManager.type.ts: -------------------------------------------------------------------------------- 1 | import { Worker } from "node:worker_threads"; 2 | 3 | import { Remote } from "comlink"; 4 | 5 | export type AppWorker = Remote; 6 | 7 | export type WorkerFactory = (options: WorkerOptions) => Worker; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/spacings.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["spacings.tokens.scss"],"names":[],"mappings":"AAAA;AAEA;AACE;AAAA;AAAA;AAAA;EAKE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAEF;EACA;EACA;EACA","file":"spacings.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/pages/Settings/__mocks__/Settings.mock.tsx: -------------------------------------------------------------------------------- 1 | import { SettingsProps } from "../Settings.type"; 2 | 3 | const SettingsMock = (props: SettingsProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { SettingsMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Heading/Heading.type.ts: -------------------------------------------------------------------------------- 1 | export type HeadingProps = { 2 | className?: string; 3 | children?: React.ReactNode; 4 | onClick?: (event: React.MouseEvent) => void; 5 | variant?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; 6 | }; 7 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/__mocks__/NoImage.mock.tsx: -------------------------------------------------------------------------------- 1 | import { NoImageProps } from "../NoImage.type"; 2 | 3 | const NoImageMock = (props: NoImageProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default NoImageMock; 8 | -------------------------------------------------------------------------------- /config/build/afterSign.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires,no-console */ 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | 5 | const afterSign = () => { 6 | console.log("after sign"); 7 | }; 8 | 9 | exports.default = afterSign; 10 | -------------------------------------------------------------------------------- /src/common/lib/helpers/typeGuards/typeGuards.ts: -------------------------------------------------------------------------------- 1 | const isHtmlElement = (value: unknown): value is HTMLElement => 2 | value instanceof HTMLElement; 3 | 4 | const isError = (value: unknown): value is Error => value instanceof Error; 5 | 6 | export { isHtmlElement, isError }; 7 | -------------------------------------------------------------------------------- /src/main/shared/config/config.type.ts: -------------------------------------------------------------------------------- 1 | export type AppSettings = Record; 2 | 3 | export type GameKey = "BG3"; 4 | 5 | export type GameSettings = { 6 | MODS_DIRECTORY: string; 7 | MOD_SETTINGS_PATH: string; 8 | BACKUP_DIR: string; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export { useMutationObserver } from "./useMutationObserver"; 2 | 3 | export { useOutsideClick } from "./useOutsideClick"; 4 | 5 | export { useTheme } from "./useTheme"; 6 | 7 | export { useWorkerManager } from "./useWorkerManager"; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/Card.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type CardProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | children?: ReactNode; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Spinner/Spinner.type.ts: -------------------------------------------------------------------------------- 1 | export type SpinnerProps = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | type?: "bars" | "oval" | "puff" | "rings" | "ripple" | "tail-spin"; 7 | }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/Backup.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type BackupProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/__mocks__/Checkbox.mock.tsx: -------------------------------------------------------------------------------- 1 | import { CheckboxProps } from "../Checkbox.type"; 2 | 3 | const CheckboxMock = (props: CheckboxProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default CheckboxMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/Table.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type TableProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | children?: ReactNode; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextArea/__mocks__/TextArea.mock.tsx: -------------------------------------------------------------------------------- 1 | import { TextAreaProps } from "../TextArea.type"; 2 | 3 | const TextAreaMock = (props: TextAreaProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default TextAreaMock; 8 | -------------------------------------------------------------------------------- /src/electron-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import type { ElectronHandler } from "./preload"; 4 | 5 | declare global { 6 | // eslint-disable-next-line no-unused-vars 7 | interface Window { 8 | electron: ElectronHandler; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModInfo/getModInfo.type.ts: -------------------------------------------------------------------------------- 1 | export type ModInfo = { 2 | author?: string; 3 | fileName: string; 4 | folder?: string; 5 | md5?: string; 6 | name?: string; 7 | uuid?: string; 8 | version?: string; 9 | versionType?: string; 10 | }; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/__mocks__/Container.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ContainerProps } from "../Container.type"; 2 | 3 | const ContainerMock = (props: ContainerProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ContainerMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LazyImage/__mocks__/LazyImage.mock.tsx: -------------------------------------------------------------------------------- 1 | import { LazyImageProps } from "../LazyImage.type"; 2 | 3 | const LazyImageMock = (props: LazyImageProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default LazyImageMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/MenuItem/__mocks__/MenuItem.mock.tsx: -------------------------------------------------------------------------------- 1 | import { MenuItemProps } from "../MenuItem.type"; 2 | 3 | const MenuItemMock = (props: MenuItemProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default MenuItemMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextField/__mocks__/TextField.mock.tsx: -------------------------------------------------------------------------------- 1 | import { TextFieldProps } from "../TextField.type"; 2 | 3 | const TextFieldMock = (props: TextFieldProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default TextFieldMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/__mocks__/AppNavBar.mock.tsx: -------------------------------------------------------------------------------- 1 | import { AppNavBarProps } from "../AppNavBar.type"; 2 | 3 | const AppNavBarMock = (props: AppNavBarProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default AppNavBarMock; 8 | -------------------------------------------------------------------------------- /src/main/entities/mod/index.ts: -------------------------------------------------------------------------------- 1 | export type { ModInfo } from "./lib/helpers"; 2 | 3 | export { 4 | activateMod, 5 | createModNode, 6 | createModNodeOrder, 7 | deactivateMod, 8 | getModInfoFromFile, 9 | getModInfoFromBytes, 10 | getModData, 11 | } from "./lib/helpers"; 12 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./activateMod"; 2 | 3 | export * from "./createModNode"; 4 | 5 | export * from "./createModNodeOrder"; 6 | 7 | export * from "./deactivateMod"; 8 | 9 | export * from "./getModData"; 10 | 11 | export * from "./getModInfo"; 12 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Settings/Settings.type.ts: -------------------------------------------------------------------------------- 1 | import { GameKey } from "@main/shared/config"; 2 | 3 | export type SettingsProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: GameKey; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/Container.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type ContainerProps = { 4 | children?: ReactNode; 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/__snapshots__/Text.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |

9 |

10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/__mocks__/GameNavBar.mock.tsx: -------------------------------------------------------------------------------- 1 | import { GameNavBarProps } from "../GameNavBar.type"; 2 | 3 | const GameNavBarMock = (props: GameNavBarProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { GameNavBarMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/EmptyList/__mocks__/EmptyList.mock.tsx: -------------------------------------------------------------------------------- 1 | import { EmptyListProps } from "../EmptyList.type"; 2 | 3 | const EmptyListMock = (props: EmptyListProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default EmptyListMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/error.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/renderer/src/shared/config/index.ts: -------------------------------------------------------------------------------- 1 | import * as secrets from "./config"; 2 | 3 | Object.entries(secrets).forEach(([key, value]) => { 4 | if (typeof value === "undefined") { 5 | throw new Error(`${key} config was not provided`); 6 | } 7 | }); 8 | 9 | export * from "./config"; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/__snapshots__/Card.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/__mocks__/FakeButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { FakeButtonProps } from "../FakeButton.type"; 2 | 3 | const FakeButtonMock = (props: FakeButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default FakeButtonMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/IconButton/__mocks__/IconButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { IconButtonProps } from "../IconButton.type"; 2 | 3 | const IconButtonMock = (props: IconButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default IconButtonMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LinkButton/__mocks__/LinkButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { LinkButtonProps } from "../LinkButton.type"; 2 | 3 | const LinkButtonMock = (props: LinkButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default LinkButtonMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/StickyBlock.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type StickyBlockProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | children?: ReactNode; 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/features/settings/updateGameSettingsHandler/updateGameSettingsHandler.type.ts: -------------------------------------------------------------------------------- 1 | import { GameKey } from "@main/shared/config"; 2 | 3 | export type GameSettingsUpdateDto = { 4 | modSettingsFile: string; 5 | modsDirectory: string; 6 | backupDirectory: string; 7 | gameKey: GameKey; 8 | }; 9 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/__mocks__/BackupList.mock.tsx: -------------------------------------------------------------------------------- 1 | import { BackupListProps } from "../BackupList.type"; 2 | 3 | const BackupListMock = (props: BackupListProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { BackupListMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/ui/SettingsForm/SettingsForm.module.scss: -------------------------------------------------------------------------------- 1 | .SettingsForm { 2 | display: grid; 3 | gap: var(--spacing-8); 4 | grid-template-columns: 1fr; 5 | margin-block: var(--spacing-12) 0; 6 | 7 | .submitButton { 8 | justify-self: flex-start; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/__mocks__/BaldursGate3.mock.tsx: -------------------------------------------------------------------------------- 1 | import { BaldursGate3Props } from "../BaldursGate3.type"; 2 | 3 | const BaldursGate3Mock = (props: BaldursGate3Props) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { BaldursGate3Mock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/__mocks__/DataTable.mock.tsx: -------------------------------------------------------------------------------- 1 | import { DataTableProps } from "../DataTable.type"; 2 | 3 | const DataTableMock = (props: DataTableProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default DataTableMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Loading/Loading.type.ts: -------------------------------------------------------------------------------- 1 | import { SpinnerProps } from "../Spinner"; 2 | 3 | export type LoadingProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | type?: SpinnerProps["type"]; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/__mocks__/StickyBlock.mock.tsx: -------------------------------------------------------------------------------- 1 | import { StickyBlockProps } from "../StickyBlock.type"; 2 | 3 | const StickyBlockMock = (props: StickyBlockProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default StickyBlockMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/__snapshots__/Table.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 | 10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/BackupList.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type BackupListProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/__mocks__/ModFileRow.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ModFileRowProps } from "../ModFileRow.type"; 2 | 3 | const ModFileRowMock = (props: ModFileRowProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ModFileRowMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/__mocks__/EmptyList.mock.tsx: -------------------------------------------------------------------------------- 1 | import { EmptyListProps } from "../EmptyList.type"; 2 | 3 | const EmptyListMock = (props: EmptyListProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default EmptyListMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ModsOrder/__mocks__/ModsOrder.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ModsOrderProps } from "../ModsOrder.type"; 2 | 3 | const ModsOrderMock = (props: ModsOrderProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ModsOrderMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useTheme/__mocks__/useTheme.mock.ts: -------------------------------------------------------------------------------- 1 | import { vi } from "vitest"; 2 | 3 | const useThemeMock = (themeKey: string) => ({ 4 | toggleTheme: vi.fn(), 5 | setPreferredTheme: vi.fn(), 6 | theme: `mockedTheme-${themeKey}`, 7 | }); 8 | 9 | export { useThemeMock }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/BackupSection.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type BackupSectionProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileForm/__mocks__/ModFileForm.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ModFileFormProps } from "../ModFileForm.type"; 2 | 3 | const ModFileFormMock = (props: ModFileFormProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ModFileFormMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileList/__mocks__/ModFileList.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ModFileListProps } from "../ModFileList.type"; 2 | 3 | const ModFileListMock = (props: ModFileListProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { ModFileListMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type EmptyListProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | children?: ReactNode; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Heading/__snapshots__/Heading.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |

9 |

10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Spinner/__snapshots__/Spinner.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 8 | oval.svg 9 | 10 |
11 | `; 12 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/__mocks__/ToggleButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ToggleButtonProps } from "../ToggleButton.type"; 2 | 3 | const ToggleButtonMock = (props: ToggleButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ToggleButtonMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/ModFileSection.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type ModFileSectionProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /PakReader/PackageVersion.cs: -------------------------------------------------------------------------------- 1 | namespace PakReader; 2 | 3 | public enum PackageVersion 4 | { 5 | V7 = 7, // D:OS 1 6 | V9 = 9, // D:OS 1 EE 7 | V10 = 10, // D:OS 2 8 | V13 = 13, // D:OS 2 DE 9 | V15 = 15, // BG3 EA 10 | V16 = 16, // BG3 EA Patch4 11 | V18 = 18 // BG3 Release 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/ModFileRow.test.tsx: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from "vitest"; 2 | 3 | import { ModFileRow } from "./ModFileRow"; 4 | 5 | describe("", () => { 6 | it("should be defined", () => { 7 | expect(ModFileRow).toBeDefined(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/ui/SettingsForm/__mocks__/SettingsForm.mock.tsx: -------------------------------------------------------------------------------- 1 | import { SettingsFormProps } from "../SettingsForm.type"; 2 | 3 | const SettingsFormMock = (props: SettingsFormProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { SettingsFormMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/__mocks__/BackupSection.mock.tsx: -------------------------------------------------------------------------------- 1 | import { BackupSectionProps } from "../BackupSection.type"; 2 | 3 | const BackupSectionMock = (props: BackupSectionProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { BackupSectionMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/__mocks__/GameNavLink.mock.tsx: -------------------------------------------------------------------------------- 1 | import { GameNavLinkProps } from "../GameNavLink.type"; 2 | 3 | const GameNavLinkMock = (props: GameNavLinkProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { GameNavLinkMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/AppRoutes.type.ts: -------------------------------------------------------------------------------- 1 | import { route } from "react-router-typesafe-routes/dom"; 2 | 3 | export const APP_ROUTES = { 4 | BaldursGate3: route( 5 | "BG3", 6 | {}, 7 | { 8 | BACKUP: route("backup"), 9 | SETTINGS: route("settings"), 10 | }, 11 | ), 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/__snapshots__/Container.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/Backup/Backup.module.scss: -------------------------------------------------------------------------------- 1 | .Backup { 2 | align-items: center; 3 | display: flex; 4 | gap: var(--spacing-3); 5 | padding: var(--spacing-5); 6 | 7 | .copy { 8 | margin-left: auto; 9 | } 10 | 11 | &:not(:last-child) { 12 | border-bottom: none; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/__mocks__/SuspenseError.mock.tsx: -------------------------------------------------------------------------------- 1 | import { SuspenseErrorProps } from "../SuspenseError.type"; 2 | 3 | const SuspenseErrorMock = (props: SuspenseErrorProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default SuspenseErrorMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/__snapshots__/GameNavBar.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/InstalledModsSection.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type InstalledModsSectionProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/__mocks__/ModFileSection.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ModFileSectionProps } from "../ModFileSection.type"; 2 | 3 | const ModFileSectionMock = (props: ModFileSectionProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { ModFileSectionMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/index.ts: -------------------------------------------------------------------------------- 1 | export { AppNavBar } from "./AppNavBar"; 2 | 3 | export { BackupSection } from "./BackupSection"; 4 | 5 | export { InstalledModsSection } from "./InstalledModsSection"; 6 | 7 | export { GameNavBar } from "./GameNavBar"; 8 | 9 | export { ModFileSection } from "./ModFileSection"; 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/SaveSettingsButton.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type SaveSettingsButtonProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/__mocks__/ModFileButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ModFileButtonProps } from "../ModFileButton.type"; 2 | 3 | const ModFileButtonMock = (props: ModFileButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default ModFileButtonMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledMod/__mocks__/InstalledMod.mock.tsx: -------------------------------------------------------------------------------- 1 | import { InstalledModProps } from "../InstalledMod.type"; 2 | 3 | const InstalledModMock = (props: InstalledModProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export default InstalledModMock; 8 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/__snapshots__/BaldursGate3.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/__snapshots__/StickyBlock.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/main/features/backup/copyBackupContentHandler/copyBackupContentHandler.ts: -------------------------------------------------------------------------------- 1 | import { readFile } from "fs/promises"; 2 | 3 | const copyBackupContentHandler = async (filePath: string) => { 4 | const content = await readFile(filePath); 5 | 6 | return content.toString(); 7 | }; 8 | 9 | export { copyBackupContentHandler }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/BackupList/__snapshots__/BackupList.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/__snapshots__/EmptyList.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useMutationObserver/useMutationObserver.test.tsx: -------------------------------------------------------------------------------- 1 | import { useMutationObserver } from "./useMutationObserver"; 2 | 3 | describe("useMutationObserver", () => { 4 | const hook = useMutationObserver; 5 | 6 | it("should be defined", () => { 7 | expect(hook).toBeDefined(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/Text.module.scss: -------------------------------------------------------------------------------- 1 | .Text { 2 | --font-size: 1.4rem; 3 | --line-height: 2rem; 4 | 5 | color: inherit; 6 | font-size: var(--font-size); 7 | line-height: var(--line-height); 8 | margin: 0; 9 | 10 | &.small { 11 | --font-size: 1.2rem; 12 | --line-height: 1.8rem; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/Text.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type TextProps = { 4 | children?: ReactNode; 5 | 6 | /** 7 | * a string that will be applied as a css class to parent element 8 | */ 9 | className?: string; 10 | id?: string; 11 | size?: "regular" | "small"; 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/Backup/Backup.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type BackupProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | name: string; 9 | filePath: string; 10 | game: Game; 11 | }; 12 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/RestoreDefaultSettings.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type RestoreDefaultSettingsProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/appPaths/appPaths.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | 3 | const src = path.resolve(__dirname, "../../../../../"); 4 | const main = path.join(src, "main"); 5 | const renderer = path.join(src, "renderer"); 6 | 7 | const appPaths = { 8 | src, 9 | main, 10 | renderer, 11 | }; 12 | 13 | export { appPaths }; 14 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LinkButton/__snapshots__/LinkButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 9 |
10 | `; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/DataTable.type.ts: -------------------------------------------------------------------------------- 1 | import { ColumnDef } from "@tanstack/react-table"; 2 | 3 | export type DataTableProps = { 4 | columns: ColumnDef[]; 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | data: Array; 10 | }; 11 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Search/Search.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/input-base"; 2 | @import "../../styles/vars"; 3 | 4 | .Search { 5 | @extend %input-base; 6 | 7 | .container { 8 | input { 9 | cursor: pointer; 10 | } 11 | } 12 | 13 | .container:focus-visible { 14 | @include focus-visible; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LinkButton/LinkButton.module.scss: -------------------------------------------------------------------------------- 1 | @use "../Button/Button.module.scss"; 2 | @use "../IconButton/IconButton.module.scss"; 3 | 4 | .LinkButton { 5 | text-decoration: none; 6 | 7 | &.button { 8 | @extend %button; 9 | 10 | gap: 10px; 11 | } 12 | 13 | &.icon { 14 | @extend %icon-button; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/setupTests.ts: -------------------------------------------------------------------------------- 1 | import { cleanup } from "@testing-library/react"; 2 | import { afterEach, vi } from "vitest"; 3 | import "@testing-library/jest-dom/vitest"; 4 | import "@testing-library/jest-dom"; 5 | 6 | // runs a cleanup after each test case (e.g. clearing jsdom) 7 | afterEach(() => { 8 | cleanup(); 9 | 10 | vi.resetAllMocks(); 11 | }); 12 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/MenuItem/__snapshots__/MenuItem.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
12 | `; 13 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/easings.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["easings.tokens.scss"],"names":[],"mappings":"AAAA;AAEE;AAAA;AAAA;AAAA;EAIA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"easings.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/__mocks__/SaveSettingsButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { SaveSettingsButtonProps } from "../SaveSettingsButton.type"; 2 | 3 | const SaveSettingsButtonMock = (props: SaveSettingsButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { SaveSettingsButtonMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledModsList/__mocks__/InstalledModsList.mock.tsx: -------------------------------------------------------------------------------- 1 | import { InstalledModsListProps } from "../InstalledModsList.type"; 2 | 3 | const InstalledModsListMock = (props: InstalledModsListProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { InstalledModsListMock }; 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/1-Bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: You're having technical issues. 🐞 4 | labels: "bug" 5 | --- 6 | 7 | ## Your Environment 8 | 9 | 10 | 11 | - Manager Version : 12 | - Link to problem mod : 13 | - Operating System and version : 14 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/opacity.tokens.css: -------------------------------------------------------------------------------- 1 | :root { 2 | /** 3 | * @tokens Opacities 4 | * @presenter Opacity 5 | */ 6 | --opacity-1: 0.1; 7 | --opacity-2: 0.2; 8 | --opacity-3: 0.3; 9 | --opacity-4: 0.4; 10 | --opacity-5: 0.5; 11 | --opacity-6: 0.6; 12 | --opacity-7: 0.7; 13 | --opacity-8: 0.8; 14 | --opacity-9: 0.9; 15 | } 16 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/__snapshots__/FakeButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
11 |
12 | `; 13 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/__mocks__/InstalledModsSection.mock.tsx: -------------------------------------------------------------------------------- 1 | import { InstalledModsSectionProps } from "../InstalledModsSection.type"; 2 | 3 | const InstalledModsSectionMock = (props: InstalledModsSectionProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { InstalledModsSectionMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/opacity.tokens.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | 3 | /** 4 | * @tokens Opacities 5 | * @presenter Opacity 6 | */ 7 | --opacity-1: 0.1; 8 | --opacity-2: 0.2; 9 | --opacity-3: 0.3; 10 | --opacity-4: 0.4; 11 | --opacity-5: 0.5; 12 | --opacity-6: 0.6; 13 | --opacity-7: 0.7; 14 | --opacity-8: 0.8; 15 | --opacity-9: 0.9; 16 | } 17 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/grid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Link/__snapshots__/Link.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
12 | `; 13 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/InstalledModsSection/__snapshots__/InstalledModsSection.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
10 | `; 11 | -------------------------------------------------------------------------------- /.versionrc.js: -------------------------------------------------------------------------------- 1 | const electronBuilderJson = { 2 | filename: "./electron-builder.json", 3 | updater: require("./versionBumper.js"), 4 | }; 5 | 6 | const mainPackageJson = { 7 | filename: "./package.json", 8 | type: "json", 9 | }; 10 | 11 | module.exports = { 12 | bumpFiles: [mainPackageJson, electronBuilderJson], 13 | packageFiles: [mainPackageJson], 14 | }; 15 | -------------------------------------------------------------------------------- /config/build/beforeBuild.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console,@typescript-eslint/no-var-requires */ 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | 5 | const beforeBuild = () => { 6 | console.log("before build") 7 | const buildDir = path.resolve(__dirname, "../../dist"); 8 | 9 | fs.rmSync(buildDir); 10 | }; 11 | 12 | exports.default = beforeBuild; 13 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/spacings.tokens.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable */ 2 | 3 | :root { 4 | /** 5 | * @tokens Spacings 6 | * @presenter Spacing 7 | */ 8 | @for $i from 1 through 10 { 9 | --spacing-#{$i}: #{$i * 0.2}rem; 10 | } 11 | --spacing-11: 2.4rem; 12 | --spacing-12: 3.2rem; 13 | --spacing-13: 4.8rem; 14 | --spacing-14: 6.4rem; 15 | } 16 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/AppNavBar.module.scss: -------------------------------------------------------------------------------- 1 | .AppNavBar { 2 | --border-color: var(--primary-2); 3 | 4 | @media (prefers-color-scheme: light) { 5 | --border-color: var(--primary-3); 6 | } 7 | 8 | border-right: 1px solid var(--border-color); 9 | display: flex; 10 | flex: 1; 11 | flex-direction: column; 12 | padding: 1rem 0.5rem; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/features/settings/getGameSettingsHandler/getGameSettingsHandler.ts: -------------------------------------------------------------------------------- 1 | import { GameKey } from "@main/shared/config"; 2 | import { getGameSettings } from "@main/shared/lib/helpers"; 3 | 4 | const getGameSettingsHandler = (gameKey: GameKey) => { 5 | const settings = getGameSettings(gameKey); 6 | 7 | return settings; 8 | }; 9 | 10 | export { getGameSettingsHandler }; 11 | -------------------------------------------------------------------------------- /src/main/controllers/backup/validation.ts: -------------------------------------------------------------------------------- 1 | import z from "zod"; 2 | 3 | import { gameKeyValidation } from "@main/shared/lib/helpers/validation"; 4 | 5 | const stringValidation = z.string(); 6 | 7 | const restoreFromFileValidation = z.object({ 8 | file: stringValidation, 9 | gameKey: gameKeyValidation, 10 | }); 11 | 12 | export { restoreFromFileValidation, stringValidation }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/GameNavLink.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import { LinkProps } from "react-router-dom"; 3 | 4 | export type GameNavLinkProps = { 5 | children?: ReactNode; 6 | /** 7 | * a string that will be applied as a css class to parent element 8 | */ 9 | className?: string; 10 | to: LinkProps["to"]; 11 | }; 12 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/__mocks__/RestoreDefaultSettings.mock.tsx: -------------------------------------------------------------------------------- 1 | import { RestoreDefaultSettingsProps } from "../RestoreDefaultSettings.type"; 2 | 3 | const RestoreDefaultSettingsMock = (props: RestoreDefaultSettingsProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { RestoreDefaultSettingsMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/__mocks__/ToggleActiveModButton.mock.tsx: -------------------------------------------------------------------------------- 1 | import { ToggleActiveModButtonProps } from "../ToggleActiveModButton.type"; 2 | 3 | const ToggleActiveModButtonMock = (props: ToggleActiveModButtonProps) => ( 4 |
{JSON.stringify(props)}
5 | ); 6 | 7 | export { ToggleActiveModButtonMock }; 8 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/EmptyList/EmptyList.type.ts: -------------------------------------------------------------------------------- 1 | import { ChangeEventHandler } from "react"; 2 | 3 | export type EmptyListProps = { 4 | acceptedFileTypes: string[]; 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | error?: string; 10 | onFilesSelect: ChangeEventHandler; 11 | }; 12 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/brands/facebook.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/delete-forever.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LazyImage/LazyImage.type.ts: -------------------------------------------------------------------------------- 1 | import { ImgHTMLAttributes, ReactNode, RefObject } from "react"; 2 | 3 | export type LazyImageProps = ImgHTMLAttributes & { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | imageRef?: RefObject; 9 | children?: ReactNode; 10 | }; 11 | -------------------------------------------------------------------------------- /src/main/controllers/settings/validation.ts: -------------------------------------------------------------------------------- 1 | import z from "zod"; 2 | 3 | import { gameKeyValidation } from "@main/shared/lib/helpers/validation"; 4 | 5 | const updateGameSettingsValidation = z.object({ 6 | backupDirectory: z.string(), 7 | modSettingsFile: z.string(), 8 | modsDirectory: z.string(), 9 | gameKey: gameKeyValidation, 10 | }); 11 | 12 | export { updateGameSettingsValidation }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/ModFileRow.module.scss: -------------------------------------------------------------------------------- 1 | .ModFileRow { 2 | align-items: center; 3 | display: grid; 4 | font-size: 1.6rem; 5 | gap: 1%; 6 | grid-template-columns: 44% 34% 20%; 7 | white-space: nowrap; 8 | 9 | + .ModFileRow { 10 | border-top: none; 11 | } 12 | 13 | span { 14 | overflow: hidden; 15 | text-overflow: ellipsis; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Card/Card.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | 3 | import css from "./Card.module.scss"; 4 | import { CardProps } from "./Card.type"; 5 | 6 | const Card = ({ className, children }: CardProps) => ( 7 |
8 | {children} 9 |
10 | ); 11 | 12 | export default Card; 13 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/BackupSection/__snapshots__/BackupSection.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
12 |
13 |
14 | `; 15 | -------------------------------------------------------------------------------- /scripts/clean.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | const { rimraf } = require("rimraf"); 4 | 5 | const buildDir = path.resolve(__dirname, "../dist"); 6 | const dotnetBuildDir = path.resolve(__dirname, "../PakReader/bin"); 7 | 8 | if (fs.existsSync(buildDir)) { 9 | rimraf(buildDir); 10 | } 11 | 12 | if (fs.existsSync(dotnetBuildDir)) { 13 | rimraf(dotnetBuildDir); 14 | } 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/styles/_card-base.scss: -------------------------------------------------------------------------------- 1 | %card-base { 2 | @layer base { 3 | --background: var(--surface-1); 4 | --border-color: var(--primary-2); 5 | 6 | @media (prefers-color-scheme: light) { 7 | --border-color: var(--primary-3); 8 | } 9 | 10 | background-color: var(--background); 11 | border: 1px solid var(--border-color); 12 | padding: 1rem; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/MenuItem/MenuItem.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | export type MenuItemProps = { 4 | children?: ReactNode; 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | isSelected?: boolean; 10 | onClick?: (value?: T) => void; 11 | onFocus?: (value?: T) => void; 12 | value?: T; 13 | }; 14 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/__snapshots__/NoImage.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 | 12 | cross-circle.svg 13 | 14 |
15 |
16 | `; 17 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/__snapshots__/DataTable.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 | 10 | 11 | 12 | 13 |
14 |
15 | `; 16 | -------------------------------------------------------------------------------- /src/common/lib/helpers/delay/delay.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * a function returning a promise which resolves 3 | * after a passed timout in milliseconds 4 | * @param timeout - a timeout before promise resolves 5 | * @example 6 | * delay(500); 7 | * await delay(700); 8 | */ 9 | const delay = (timeout: number) => 10 | new Promise((resolve) => { 11 | setTimeout(resolve, timeout); 12 | }); 13 | 14 | export { delay }; 15 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ModsOrder/ModsOrder.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | import { InstalledMod } from "../InstalledModsList/InstalledModsList.type"; 4 | 5 | export type ModsOrderProps = { 6 | /** 7 | * a string that will be applied as a css class to parent element 8 | */ 9 | className?: string; 10 | game: Game; 11 | mods?: InstalledMod[]; 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/restore.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/storybookDecorators/storybookDecorators.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable import/no-unused-modules */ 2 | import { MemoryRouter as Router } from "react-router-dom"; 3 | 4 | type StoryFunc = () => T; 5 | 6 | const withRouter = (Story: StoryFunc) => ( 7 | 8 | 9 | 10 | ); 11 | 12 | export { withRouter }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/Table.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | 3 | import css from "./Table.module.scss"; 4 | import { TableProps } from "./Table.type"; 5 | 6 | const Table = ({ className, children }: TableProps) => ( 7 | 8 | {children} 9 |
10 | ); 11 | 12 | export default Table; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/ToggleButton.type.ts: -------------------------------------------------------------------------------- 1 | import { MouseEventHandler, ReactNode } from "react"; 2 | 3 | export type ToggleButtonProps = { 4 | active?: boolean; 5 | children?: ReactNode; 6 | /** 7 | * a string that will be applied as a css class to parent element 8 | */ 9 | className?: string; 10 | disabled?: boolean; 11 | onClick?: MouseEventHandler; 12 | }; 13 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export { appPaths } from "./appPaths"; 2 | 3 | export { ipcRequestHandler } from "./ipcRequestHandler"; 4 | 5 | export { getGameSettings } from "./getGameSettings"; 6 | 7 | export { netConnection } from "./netConnection"; 8 | 9 | export { resolveHtmlPath } from "./resolveHtmlPath"; 10 | 11 | export { WorkerManager } from "./workerManager"; 12 | 13 | export { t } from "./trpc"; 14 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/ToggleActiveModButton.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type ToggleActiveModButtonProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | fileName: string; 9 | game: Game; 10 | isActive: boolean; 11 | uuid: string | undefined; 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/__snapshots__/Backup.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |

13 | Backups 14 |

15 |
16 |
17 | `; 18 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/visibility.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export { classNames } from "./classNames"; 2 | 3 | export { compose } from "./compose"; 4 | 5 | export { delay } from "./delay"; 6 | 7 | export { getNodeText } from "./getNodeText"; 8 | 9 | export { lazyImport } from "./lazyImport"; 10 | 11 | export { mergeRefs } from "./mergeRefs"; 12 | 13 | export { trpcClient, trpc } from "./trpc"; 14 | 15 | export * from "./typeGuards"; 16 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LazyImage/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | .def { 3 | height: 200px; 4 | width: 150px; 5 | } 6 | 7 | .grid { 8 | display: grid; 9 | gap: 2rem; 10 | grid-auto-rows: 200px; 11 | grid-template-columns: repeat(2, 300px); 12 | } 13 | 14 | .skeleton { 15 | --stop-hue: 53; 16 | --sk-color-1: var(--primary-4); 17 | --sk-color-2: var(--primary-5); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /config/build/afterAllArtifactBuild.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires,no-console */ 2 | const fs = require("fs"); 3 | const path = require("path"); 4 | const { promisify } = require("util"); 5 | const exec = promisify(require("child_process").exec); 6 | 7 | const afterAllArtifactBuild = (context) => { 8 | console.log("after all artifact build"); 9 | }; 10 | 11 | exports.default = afterAllArtifactBuild; 12 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileForm/ModFileForm.type.ts: -------------------------------------------------------------------------------- 1 | import { RouterOutputs } from "@main/shared/types"; 2 | import { Game } from "@renderer/shared/types"; 3 | 4 | export type ModFileFormProps = { 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | game: Game; 10 | }; 11 | 12 | export type ReadModResult = RouterOutputs["mod"]["readMods"]; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/delay/delay.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * a function returning a promise which resolves 3 | * after a passed timout in milliseconds 4 | * @param timeout - a timeout before promise resolves 5 | * @example 6 | * delay(500); 7 | * await delay(700); 8 | */ 9 | const delay = (timeout: number) => 10 | new Promise((resolve) => { 11 | setTimeout(resolve, timeout); 12 | }); 13 | 14 | export { delay }; 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/FakeButton/FakeButton.type.ts: -------------------------------------------------------------------------------- 1 | import { MouseEvent, ReactNode } from "react"; 2 | 3 | export type FakeButtonProps = { 4 | ariaLabel?: string; 5 | ariaLabelledby?: string; 6 | autoFocus?: boolean; 7 | /** 8 | * a string that will be applied as a css class to parent element 9 | */ 10 | className?: string; 11 | children?: ReactNode; 12 | onClick?: (event: MouseEvent) => void; 13 | }; 14 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextArea/TextArea.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/input-base"; 2 | 3 | .TextArea { 4 | @extend %input-base; 5 | 6 | .counter { 7 | @extend %input-base, .label; 8 | 9 | margin-inline-start: auto; 10 | width: fit-content; 11 | } 12 | 13 | .container { 14 | height: 100%; 15 | } 16 | 17 | .labelBlock { 18 | align-items: baseline; 19 | display: flex; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileRow/ModFileRow.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type ModFileRowProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | modName?: string; 10 | modVersion?: string | number | null; 11 | currentModVersion?: string | number; 12 | modFilePath: string; 13 | }; 14 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/ModFileButton.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type ModFileButtonProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | modPath: string; 10 | currentModVersion: string | number | undefined; 11 | modVersion: string | number | null | undefined; 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/__snapshots__/ToggleButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 14 |
15 | `; 16 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/GameNavBar/ui/GameNavLink/__snapshots__/GameNavLink.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
15 | `; 16 | -------------------------------------------------------------------------------- /PakReader/PackageInfo.cs: -------------------------------------------------------------------------------- 1 | namespace PakReader; 2 | 3 | public class PackageInfo 4 | { 5 | public PackageInfo(string name, Stream input) 6 | { 7 | using (MemoryStream ms = new MemoryStream()) 8 | { 9 | input.CopyTo(ms); 10 | Data = ms.ToArray(); 11 | } 12 | 13 | Name = name; 14 | } 15 | 16 | public byte[] Data { get; set; } 17 | public string Name { get; set; } 18 | } 19 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/Error.module.scss: -------------------------------------------------------------------------------- 1 | .Error { 2 | --error-color: var(--danger-4); 3 | 4 | color: var(--error-color); 5 | 6 | @media (prefers-color-scheme: light) { 7 | --error-color: var(--danger-7); 8 | } 9 | 10 | .header { 11 | align-items: center; 12 | display: flex; 13 | gap: 1rem; 14 | margin-bottom: 2rem; 15 | } 16 | 17 | svg { 18 | fill: var(--error-color); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/NoImage.module.scss: -------------------------------------------------------------------------------- 1 | .NoImage { 2 | --hue: 275; 3 | 4 | background-color: var(--primary-4); 5 | display: grid; 6 | grid-template-columns: 1fr; 7 | height: 100%; 8 | padding: 1rem; 9 | place-items: center; 10 | width: 100%; 11 | 12 | .cross { 13 | aspect-ratio: 1/1; 14 | fill: var(--primary-8); 15 | max-width: 10rem; 16 | min-width: 1rem; 17 | opacity: 0.6; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/features/mod/index.ts: -------------------------------------------------------------------------------- 1 | export { deleteModsHandler } from "./deleteModsHandler"; 2 | 3 | export { getInstalledModsHandler } from "./getInstalledModsHandler"; 4 | 5 | export { installModsHandler } from "./installModsHandler"; 6 | 7 | export { readModsHandler } from "./readModsHandler"; 8 | 9 | export { reorderActiveModsHandler } from "./reorderActiveModsHandler"; 10 | 11 | export { toggleActiveModHandler } from "./toggleActiveModHandler"; 12 | -------------------------------------------------------------------------------- /src/main/router.ts: -------------------------------------------------------------------------------- 1 | import { 2 | backupController, 3 | modController, 4 | settingsController, 5 | } from "./controllers"; 6 | import { t } from "./shared/lib/helpers"; 7 | 8 | const appRouter = t.router({ 9 | backup: t.router({ ...backupController }), 10 | mod: t.router({ ...modController }), 11 | settings: t.router({ ...settingsController }), 12 | }); 13 | 14 | export type AppRouter = typeof appRouter; 15 | 16 | export { appRouter }; 17 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileForm/ModFileForm.module.scss: -------------------------------------------------------------------------------- 1 | .ModFileForm { 2 | display: flex; 3 | flex-direction: column; 4 | min-height: 75dvh; 5 | 6 | &.isLoading { 7 | cursor: progress; 8 | } 9 | 10 | .header { 11 | font-weight: 500; 12 | 13 | *:last-child { 14 | pointer-events: none; 15 | visibility: hidden; 16 | } 17 | } 18 | 19 | .clear { 20 | margin-top: 2rem; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/renderer/src/features/settings/ui/SettingsForm/SettingsForm.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | export type SettingsFormProps = { 4 | /** 5 | * a string that will be applied as a css class to parent element 6 | */ 7 | className?: string; 8 | game: Game; 9 | }; 10 | 11 | export type SettingsFormValues = { 12 | modSettingsFile: string; 13 | modsDirectory: string; 14 | backupDirectory: string; 15 | }; 16 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Container/Container.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | 3 | import css from "./Container.module.scss"; 4 | import { ContainerProps } from "./Container.type"; 5 | 6 | const Container = ({ children, className }: ContainerProps) => ( 7 |
8 | {children} 9 |
10 | ); 11 | 12 | export default Container; 13 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/createModNodeOrder/createModNodeOrder.ts: -------------------------------------------------------------------------------- 1 | import { ModInfo } from "../getModInfo"; 2 | 3 | const createModNodeOrder = (mod: ModInfo) => { 4 | const template = ` 5 | 6 | 7 | 8 | 9 | `; 10 | 11 | return template; 12 | }; 13 | 14 | export { createModNodeOrder }; 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Loading/__snapshots__/Loading.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
7 |
11 | 14 | oval.svg 15 | 16 |
17 |
18 | `; 19 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledMod/InstalledMod.type.ts: -------------------------------------------------------------------------------- 1 | import { RouterOutputs } from "@main/shared/types"; 2 | import { Game } from "@renderer/shared/types"; 3 | 4 | export type InstalledModProps = { 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | game: Game; 10 | mod: RouterOutputs["mod"]["getInstalledMods"]["installedMods"][number]; 11 | position: number; 12 | }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LazyImage/__snapshots__/LazyImage.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 9 | 12 | 15 | skeleton.svg 16 | 17 | 18 |
19 | `; 20 | -------------------------------------------------------------------------------- /src/main/features/backup/index.ts: -------------------------------------------------------------------------------- 1 | export { createBackupHandler } from "./createBackupHandler"; 2 | 3 | export { copyBackupContentHandler } from "./copyBackupContentHandler"; 4 | 5 | export { deleteBackupHandler } from "./deleteBackupHandler"; 6 | 7 | export { getBackupsHandler } from "./getBackupsHandler"; 8 | 9 | export { restoreDefaultSettingsHandler } from "./restoreDefaultSettingsHandler"; 10 | 11 | export { restoreFromFileHandler } from "./restoreFromFileHandler"; 12 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/IconButton/__snapshots__/IconButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 16 |
17 | `; 18 | -------------------------------------------------------------------------------- /src/main/features/backup/restoreDefaultSettingsHandler/restoreDefaultSettingsHandler.ts: -------------------------------------------------------------------------------- 1 | import { saveModSettings } from "@main/entities/modSettingsFile"; 2 | import { GameKey } from "@main/shared/config"; 3 | 4 | import { defaults } from "./defaults"; 5 | 6 | const restoreDefaultSettingsHandler = async (gameKey: GameKey) => { 7 | const content = defaults[gameKey]; 8 | 9 | await saveModSettings(content, gameKey); 10 | }; 11 | 12 | export { restoreDefaultSettingsHandler }; 13 | -------------------------------------------------------------------------------- /src/renderer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Electron 6 | 7 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/entities/mod/lib/helpers/getModData/getModData.ts: -------------------------------------------------------------------------------- 1 | import { memoizeTtl } from "@common/lib"; 2 | 3 | import { getPakFileDataFromArchive } from "./lib"; 4 | 5 | const getModData = async (filePath: string) => { 6 | const pakFileData = await getPakFileDataFromArchive(filePath); 7 | const result = { filePath, pakFileData }; 8 | 9 | return result; 10 | }; 11 | 12 | const getModDataMemoized = memoizeTtl(getModData); 13 | 14 | export { getModDataMemoized as getModData }; 15 | -------------------------------------------------------------------------------- /src/main/features/mod/toggleActiveModHandler/lib/helpers/isActiveMod/isActiveMod.ts: -------------------------------------------------------------------------------- 1 | import { getCurrentSettings } from "@main/entities/modSettingsFile"; 2 | import { GameKey } from "@main/shared/config"; 3 | 4 | const isActiveMod = async (modUUID: string, key: GameKey) => { 5 | const settings = await getCurrentSettings(key); 6 | const attribute = settings(`#ModOrder children [value="${modUUID}"]`); 7 | 8 | return !!attribute.length; 9 | }; 10 | 11 | export { isActiveMod }; 12 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Loading/Loading.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | 3 | import Loading from "./Loading"; 4 | 5 | describe("", () => { 6 | const Component = ; 7 | 8 | it("should be defined", () => { 9 | expect(Loading).toBeDefined(); 10 | }); 11 | 12 | it("should match the snapshot", () => { 13 | const { container } = render(Component); 14 | 15 | expect(container).toMatchSnapshot(); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Select/Select.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/input-base"; 2 | @import "../../styles/vars"; 3 | 4 | .Select { 5 | @extend %input-base; 6 | 7 | .container { 8 | svg { 9 | transition: transform 250ms ease-in-out; 10 | } 11 | 12 | &[aria-expanded="true"] { 13 | svg { 14 | transform: rotateX(180deg); 15 | } 16 | } 17 | } 18 | 19 | .container:focus-visible { 20 | @include focus-visible; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/shared/types/api.ts: -------------------------------------------------------------------------------- 1 | import { inferReactQueryProcedureOptions } from "@trpc/react-query"; 2 | import { inferRouterInputs, inferRouterOutputs } from "@trpc/server"; 3 | 4 | import { AppRouter } from "@main/router"; 5 | 6 | type ReactQueryOptions = inferReactQueryProcedureOptions; 7 | 8 | type RouterInputs = inferRouterInputs; 9 | 10 | type RouterOutputs = inferRouterOutputs; 11 | 12 | export type { ReactQueryOptions, RouterInputs, RouterOutputs }; 13 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledModsList/InstalledModsList.type.ts: -------------------------------------------------------------------------------- 1 | import { RouterOutputs } from "@main/shared/types"; 2 | import { Game } from "@renderer/shared/types"; 3 | 4 | export type InstalledModsListProps = { 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | game: Game; 10 | }; 11 | 12 | export type InstalledMod = 13 | RouterOutputs["mod"]["getInstalledMods"]["installedMods"][number]; 14 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/StickyBlock/StickyBlock.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | 3 | import css from "./StickyBlock.module.scss"; 4 | import { StickyBlockProps } from "./StickyBlock.type"; 5 | 6 | const StickyBlock = ({ className, children }: StickyBlockProps) => ( 7 |
11 | {children} 12 |
13 | ); 14 | 15 | export default StickyBlock; 16 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/spinners/eclipse-1s-200px.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Button/__snapshots__/Button.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` 19 |
20 | `; 21 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/InstalledMod/InstalledMod.module.scss: -------------------------------------------------------------------------------- 1 | .InstalledMod { 2 | align-items: center; 3 | counter-increment: modOrder; 4 | display: grid; 5 | font-size: 1.6rem; 6 | gap: 1%; 7 | grid-template-columns: 5% 40% 24% 20% 6%; 8 | white-space: nowrap; 9 | 10 | + .InstalledMod { 11 | border-top: none; 12 | } 13 | 14 | span { 15 | overflow: hidden; 16 | text-overflow: ellipsis; 17 | } 18 | 19 | .delete { 20 | aspect-ratio: 1; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/init.ts: -------------------------------------------------------------------------------- 1 | import { verifyModSettings } from "@main/entities/modSettingsFile"; 2 | import { createBackupHandler, getBackupsHandler } from "@main/features/backup"; 3 | import { createBackupDir } from "@main/shared/config"; 4 | 5 | const init = async () => { 6 | await verifyModSettings("BG3"); 7 | 8 | createBackupDir(); 9 | 10 | const backupFiles = await getBackupsHandler("BG3"); 11 | 12 | if (!backupFiles.length) { 13 | await createBackupHandler("BG3"); 14 | } 15 | }; 16 | 17 | export { init }; 18 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/EmptyList/EmptyList.module.scss: -------------------------------------------------------------------------------- 1 | @layer EmptyList, base; 2 | 3 | .EmptyList { 4 | display: grid; 5 | flex: 1; 6 | place-content: center; 7 | 8 | @layer EmptyList { 9 | border-top: none; 10 | } 11 | 12 | .header { 13 | margin-bottom: 2rem; 14 | place-self: center; 15 | } 16 | 17 | .button { 18 | place-self: center; 19 | } 20 | 21 | > input { 22 | display: none; 23 | } 24 | 25 | .error { 26 | padding-bottom: 5rem; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/renderer/src/shared/styles/_vars.scss: -------------------------------------------------------------------------------- 1 | @mixin focus-visible { 2 | outline: 0.2rem solid var(--warning-6); 3 | outline-offset: 0.2rem; 4 | transition: outline-offset 250ms ease-out; 5 | 6 | &:active { 7 | outline-offset: 0; 8 | } 9 | } 10 | 11 | @mixin theme($value: "dark") { 12 | @if $value == "light" { 13 | @at-root [data-theme="light"] & { 14 | @content; 15 | } 16 | } @else if $value == "dark" { 17 | @at-root [data-theme="dark"] & { 18 | @content; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/AppNavBar/__snapshots__/AppNavBar.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 | 12 | Baldur's Gate 3 Logo 16 | 17 |
18 |
19 | `; 20 | -------------------------------------------------------------------------------- /src/main/features/mod/installModsHandler/installModsHandler.ts: -------------------------------------------------------------------------------- 1 | import { GameKey } from "@main/shared/config"; 2 | 3 | import { extractContents } from "./lib/helpers"; 4 | 5 | const installModsHandler = async (filePaths: string[], key: GameKey) => { 6 | try { 7 | const extractResults = await Promise.all( 8 | filePaths.map((file) => extractContents(file, key)), 9 | ); 10 | 11 | return extractResults; 12 | } catch (e) { 13 | console.error(e); 14 | } 15 | }; 16 | 17 | export { installModsHandler }; 18 | -------------------------------------------------------------------------------- /src/main/features/backup/restoreFromFileHandler/restoreFromFileHandler.ts: -------------------------------------------------------------------------------- 1 | import { readFile } from "fs/promises"; 2 | 3 | import { saveModSettings } from "@main/entities/modSettingsFile"; 4 | 5 | import { RestoreFromFileDto } from "./restoreFromFileHandler.type"; 6 | 7 | const restoreFromFileHandler = async ({ 8 | file, 9 | gameKey, 10 | }: RestoreFromFileDto) => { 11 | const content = await readFile(file); 12 | 13 | await saveModSettings(content.toString(), gameKey); 14 | }; 15 | 16 | export { restoreFromFileHandler }; 17 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/icons/tick.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Spinner/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | display: grid; 3 | grid-auto-rows: 200px; 4 | grid-template-columns: repeat(4, 200px); /* stylelint-disable-line */ 5 | 6 | .loader { 7 | align-items: center; 8 | display: flex; 9 | flex-direction: column; 10 | justify-content: center; 11 | padding: 20px; 12 | 13 | p { 14 | color: #ffffff; 15 | margin-bottom: 10px; 16 | } 17 | 18 | svg { 19 | height: 100%; 20 | width: 100%; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/shared/types/types.ts: -------------------------------------------------------------------------------- 1 | export type IpcRequest = { 2 | body: any; 3 | headers: any; 4 | method: string; 5 | url: string; 6 | }; 7 | 8 | export type IpcResponse = { 9 | body: any; 10 | headers: any; 11 | status: number; 12 | }; 13 | 14 | export interface IElectronAPI { 15 | node: () => string; 16 | chrome: () => string; 17 | electron: () => string; 18 | trpc: (req: IpcRequest) => Promise; 19 | } 20 | 21 | declare global { 22 | interface Window { 23 | appApi: IElectronAPI; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | import { Card } from "@renderer/shared/ui"; 3 | 4 | import css from "./EmptyList.module.scss"; 5 | import { EmptyListProps } from "./EmptyList.type"; 6 | 7 | const EmptyList = ({ className, children }: EmptyListProps) => ( 8 | 12 | {children} 13 | 14 | ); 15 | 16 | export { EmptyList }; 17 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/resolveHtmlPath/resolveHtmlPath.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import { URL } from "url"; 3 | 4 | const resolveHtmlPath = (htmlFileName: string) => { 5 | if (process.env.NODE_ENV === "development") { 6 | const port = process.env.PORT || 1212; 7 | const url = new URL(`http://localhost:${port}`); 8 | 9 | url.pathname = htmlFileName; 10 | 11 | return url.href; 12 | } 13 | 14 | return `file://${path.resolve(__dirname, "../renderer/", htmlFileName)}`; 15 | }; 16 | 17 | export { resolveHtmlPath }; 18 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/Checkbox.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import { describe, expect, it } from "vitest"; 3 | 4 | import { Checkbox } from "./Checkbox"; 5 | 6 | describe("", () => { 7 | const Component = ; 8 | 9 | it("should be defined", () => { 10 | expect(Checkbox).toBeDefined(); 11 | }); 12 | 13 | it("should match the snapshot", () => { 14 | const { container } = render(Component); 15 | 16 | expect(container).toMatchSnapshot(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/LinkButton/LinkButton.type.ts: -------------------------------------------------------------------------------- 1 | import { AnchorHTMLAttributes } from "react"; 2 | 3 | import { ButtonProps } from "../Button"; 4 | 5 | type AnchorAttributes = AnchorHTMLAttributes; 6 | 7 | export type LinkButtonProps = AnchorAttributes & 8 | Pick & { 9 | as?: LinkButtonType; 10 | /** 11 | * a string that will be applied as a css class to parent element 12 | */ 13 | className?: string; 14 | }; 15 | 16 | export type LinkButtonType = "button" | "icon"; 17 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/spinners/rolling-1s-200px.svg: -------------------------------------------------------------------------------- 1 | 3 | 5 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/getNodeText/getNodeText.ts: -------------------------------------------------------------------------------- 1 | import { ReactElement, ReactNode } from "react"; 2 | 3 | const getNodeText = (node: ReactNode): number | string => { 4 | if (typeof node === "string" || typeof node === "number") { 5 | return node; 6 | } 7 | 8 | if (node instanceof Array) { 9 | return node.map(getNodeText).join(""); 10 | } 11 | 12 | if (typeof node === "object" && node) { 13 | return getNodeText((node as ReactElement).props.children); 14 | } 15 | 16 | return ""; 17 | }; 18 | 19 | export { getNodeText }; 20 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/hooks/useWorkerManager/useWorkerManager.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | import WorkerManager, { WorkerFactory } from "./workerManager"; 4 | 5 | const useWorkerManager = (workerFactory: WorkerFactory) => { 6 | const [manager] = useState(() => new WorkerManager(workerFactory)); 7 | 8 | useEffect(() => { 9 | manager.init(); 10 | 11 | return () => { 12 | manager.destoy(); 13 | }; 14 | }, [manager]); 15 | 16 | return { manager }; 17 | }; 18 | 19 | export { useWorkerManager }; 20 | -------------------------------------------------------------------------------- /versionBumper.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-var-requires,import/group-exports,no-unsafe-optional-chaining,padding-line-between-statements */ 2 | module.exports.readVersion = (contents) => { 3 | try { 4 | const config = JSON.parse(contents); 5 | 6 | return config.buildVersion; 7 | } catch (e) { 8 | console.error(e); 9 | } 10 | }; 11 | 12 | module.exports.writeVersion = (contents, version) => { 13 | const config = JSON.parse(contents); 14 | 15 | config.buildVersion = version; 16 | 17 | return JSON.stringify(config); 18 | }; 19 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileList/ModFileList.type.ts: -------------------------------------------------------------------------------- 1 | import { Game } from "@renderer/shared/types"; 2 | 3 | import { EmptyListProps } from "../EmptyList"; 4 | import { ReadModResult } from "../ModFileForm/ModFileForm.type"; 5 | 6 | export type ModFileListProps = Pick< 7 | EmptyListProps, 8 | "acceptedFileTypes" | "onFilesSelect" 9 | > & { 10 | /** 11 | * a string that will be applied as a css class to parent element 12 | */ 13 | className?: string; 14 | error?: string; 15 | game: Game; 16 | zipFiles: ReadModResult | null; 17 | }; 18 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Loading/Loading.module.scss: -------------------------------------------------------------------------------- 1 | .Loading { 2 | --color: 255, 255, 255; 3 | --background: rgb(var(--color) 0.05); 4 | 5 | @media (prefers-color-scheme: light) { 6 | --color: 0, 0, 0; 7 | } 8 | 9 | align-items: center; 10 | background-color: var(--background); 11 | display: flex; 12 | justify-content: center; 13 | left: 0; 14 | max-height: 100vh; 15 | position: absolute; 16 | top: 0; 17 | width: 100%; 18 | 19 | .spinner { 20 | aspect-ratio: initial; 21 | height: 50px; 22 | width: 50px; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/features/mod/readModsHandler/worker.ts: -------------------------------------------------------------------------------- 1 | import { parentPort } from "worker_threads"; 2 | 3 | import { expose } from "comlink"; 4 | import nodeEndpoint from "comlink/dist/umd/node-adapter"; 5 | 6 | import { getModData } from "@main/entities/mod/lib/helpers/getModData/getModData"; 7 | 8 | export class ReadDataWorker { 9 | startGetModData = async (path: string) => { 10 | const { filePath, pakFileData } = await getModData(path); 11 | 12 | return { pakFileData, filePath }; 13 | }; 14 | } 15 | 16 | expose(new ReadDataWorker(), nodeEndpoint(parentPort!)); 17 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/EmptyList/EmptyList.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import { describe, expect, it } from "vitest"; 3 | 4 | import { EmptyList } from "./EmptyList"; 5 | 6 | describe("", () => { 7 | const Component = ; 8 | 9 | it("should be defined", () => { 10 | expect(EmptyList).toBeDefined(); 11 | }); 12 | 13 | it("should match the snapshot", () => { 14 | const { container } = render(Component); 15 | 16 | expect(container).toMatchSnapshot(); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/classNames/classNames.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Filters out falsy values and generates a string of concatenated 3 | * class names 4 | * @param {(string | number | undefined | null | boolean)[]} args 5 | * @returns {string} - a string of concatenated classes separated by a space 6 | * @example 7 | * // returns "foo bar" 8 | * classNames(false, "foo", undefined, "bar"); 9 | */ 10 | const classNames = ( 11 | ...args: (boolean | number | string | null | undefined)[] 12 | ) => args.filter((arg) => !!arg).join(" "); 13 | 14 | export { classNames }; 15 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Table/Table.module.scss: -------------------------------------------------------------------------------- 1 | .Table { 2 | --background: var(--secondary-8); 3 | --border-color: var(--secondary-7); 4 | 5 | @media (prefers-color-scheme: light) { 6 | --background: var(--secondary-2); 7 | --border-color: var(--secondary-3); 8 | } 9 | 10 | background-color: var(--background); 11 | border: 1px solid; 12 | border-collapse: collapse; 13 | border-color: var(--border-color); 14 | font-size: 16px; 15 | 16 | th, 17 | td { 18 | border: 1px solid var(--border-color); 19 | padding: 5px 10px; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Text/Text.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | 3 | import css from "./Text.module.scss"; 4 | import { TextProps } from "./Text.type"; 5 | 6 | const Text = ({ children, className, id, size = "regular" }: TextProps) => { 7 | const classes = [css.Text, className]; 8 | 9 | if (size === "small") { 10 | classes.push(css.small); 11 | } 12 | 13 | return ( 14 |

15 | {children} 16 |

17 | ); 18 | }; 19 | 20 | export default Text; 21 | -------------------------------------------------------------------------------- /src/renderer/src/pages/Backup/Backup.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | import { Heading } from "@renderer/shared/ui"; 3 | import { BackupSection } from "@renderer/widgets"; 4 | 5 | import css from "./Backup.module.scss"; 6 | import { BackupProps } from "./Backup.type"; 7 | 8 | const Backup = ({ className, game }: BackupProps) => ( 9 |
10 | Backups 11 | 12 |
13 | ); 14 | 15 | export { Backup }; 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Editors 2 | ## Idea 3 | .idea 4 | 5 | ## VS Code 6 | .vscode 7 | 8 | # Logs 9 | logs 10 | *.log 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | .eslintcache 20 | 21 | ### Dependency 22 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 23 | node_modules 24 | 25 | 26 | ### Generated Code 27 | ## Build 28 | dist 29 | out 30 | *.log* 31 | 32 | ## Cache 33 | .*cache 34 | 35 | # OSX 36 | .DS_Store 37 | 38 | ## .NET 39 | **/bin 40 | **/obj 41 | -------------------------------------------------------------------------------- /src/renderer/src/features/modFile/ui/ModFileButton/__snapshots__/ModFileButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 21 |
22 | `; 23 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/NoImage.tsx: -------------------------------------------------------------------------------- 1 | import { memo } from "react"; 2 | 3 | import Cross from "@renderer/shared/assets/icons/cross-circle.svg"; 4 | import { classNames } from "@renderer/shared/lib/helpers"; 5 | 6 | import css from "./NoImage.module.scss"; 7 | import { NoImageProps } from "./NoImage.type"; 8 | 9 | const NoImage = ({ className }: NoImageProps) => ( 10 |
11 | 12 |
13 | ); 14 | 15 | export { NoImage }; 16 | 17 | export default memo(NoImage); 18 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/color.tokens.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sourceRoot":"","sources":["color.tokens.scss"],"names":[],"mappings":"AAAA;AAuBA;AACE;AAAA;AAAA;AAAA;AAME;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;AARF;AAAA;AAAA;EAKA;EAGE;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA","file":"color.tokens.css"} -------------------------------------------------------------------------------- /src/renderer/src/widgets/ui/ModFileSection/__snapshots__/ModFileSection.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |
13 |

17 | Modification Files 18 |

19 |
20 |
21 |
22 | `; 23 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/Checkbox.type.ts: -------------------------------------------------------------------------------- 1 | export type CheckboxProps = { 2 | /** 3 | * a string that will be applied as a css class to parent element 4 | */ 5 | className?: string; 6 | checked?: boolean; 7 | defaultChecked?: boolean; 8 | disabled?: boolean; 9 | error?: boolean; 10 | name?: string; 11 | inputRef?: React.Ref; 12 | /** 13 | * label text to render next to checkbox 14 | */ 15 | label?: string; 16 | onChange?: React.ChangeEventHandler; 17 | readOnly?: boolean; 18 | value?: string; 19 | }; 20 | -------------------------------------------------------------------------------- /src/common/lib/helpers/fileExtension/fileExtension.ts: -------------------------------------------------------------------------------- 1 | const isJson = (fileName: string) => { 2 | const regex = /\.json$/i; 3 | 4 | return regex.test(fileName); 5 | }; 6 | 7 | const isZip = (fileName: string) => { 8 | const regex = /\.zip$/i; 9 | 10 | return regex.test(fileName); 11 | }; 12 | 13 | const isPak = (fileName: string) => { 14 | const regex = /\.pak$/i; 15 | 16 | return regex.test(fileName); 17 | }; 18 | 19 | const isLsx = (fileName: string) => { 20 | const regex = /\.lsx$/i; 21 | 22 | return regex.test(fileName); 23 | }; 24 | 25 | export { isJson, isZip, isPak, isLsx }; 26 | -------------------------------------------------------------------------------- /src/main/features/mod/deleteModsHandler/lib/helpers/removeModFromSettings/removeModFromSettings.ts: -------------------------------------------------------------------------------- 1 | import { 2 | getCurrentSettings, 3 | saveModSettings, 4 | } from "@main/entities/modSettingsFile"; 5 | import { GameKey } from "@main/shared/config"; 6 | 7 | const removeModFromSettings = async (modUUID: string, key: GameKey) => { 8 | const settings = await getCurrentSettings(key); 9 | const attribute = settings(`#Mods children [value="${modUUID}"]`); 10 | 11 | attribute.parent().remove(); 12 | 13 | await saveModSettings(settings.xml(), key); 14 | }; 15 | 16 | export { removeModFromSettings }; 17 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/__snapshots__/Error.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 |
9 |

13 | 14 | error.svg 15 | 16 | Error: 17 |

18 |

22 | foobar 23 |

24 |
25 |
26 | `; 27 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", 3 | "include": [ 4 | "electron.vite.config.*", 5 | "src/main", 6 | "src/preload", 7 | "src/common", 8 | "src/electron-env.d.ts" 9 | ], 10 | "compilerOptions": { 11 | "baseUrl": ".", 12 | "composite": true, 13 | "noImplicitReturns": false, 14 | "paths": { 15 | "@common/*": ["src/common/*"], 16 | "@main/*": ["src/main/*"], 17 | "@preload/*": ["src/preload/*"] 18 | }, 19 | "types": ["electron-vite/node"] 20 | }, 21 | "exclude": ["node_modules"] 22 | } 23 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/fileExtension/fileExtension.ts: -------------------------------------------------------------------------------- 1 | const isJson = (fileName: string) => { 2 | const regex = /\.json$/i; 3 | 4 | return regex.test(fileName); 5 | }; 6 | 7 | const isZip = (fileName: string) => { 8 | const regex = /\.zip$/i; 9 | 10 | return regex.test(fileName); 11 | }; 12 | 13 | const isPak = (fileName: string) => { 14 | const regex = /\.pak$/i; 15 | 16 | return regex.test(fileName); 17 | }; 18 | 19 | const isLsx = (fileName: string) => { 20 | const regex = /\.lsx$/i; 21 | 22 | return regex.test(fileName); 23 | }; 24 | 25 | export { isJson, isZip, isPak, isLsx }; 26 | -------------------------------------------------------------------------------- /src/renderer/src/app/styles/tokens/spacings.tokens.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable */ 2 | :root { 3 | /** 4 | * @tokens Spacings 5 | * @presenter Spacing 6 | */ 7 | --spacing-1: 0.2rem; 8 | --spacing-2: 0.4rem; 9 | --spacing-3: 0.6rem; 10 | --spacing-4: 0.8rem; 11 | --spacing-5: 1rem; 12 | --spacing-6: 1.2rem; 13 | --spacing-7: 1.4rem; 14 | --spacing-8: 1.6rem; 15 | --spacing-9: 1.8rem; 16 | --spacing-10: 2rem; 17 | --spacing-11: 2.4rem; 18 | --spacing-12: 3.2rem; 19 | --spacing-13: 4.8rem; 20 | --spacing-14: 6.4rem; 21 | } 22 | 23 | /*# sourceMappingURL=spacings.tokens.css.map */ 24 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/NoImage/Story.module.scss: -------------------------------------------------------------------------------- 1 | .Story { 2 | > div { 3 | &:not(:last-child) { 4 | margin-bottom: 2rem; 5 | } 6 | 7 | &:nth-child(1) { 8 | height: 32px; 9 | width: 32px; 10 | } 11 | 12 | &:nth-child(2) { 13 | height: 64px; 14 | width: 64px; 15 | } 16 | 17 | &:nth-child(3) { 18 | height: 500px; 19 | width: 300px; 20 | } 21 | 22 | &:nth-child(4) { 23 | height: 300px; 24 | width: 500px; 25 | } 26 | 27 | &:nth-child(5) { 28 | height: 480px; 29 | width: 768px; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/renderer/src/features/modSettingsFile/ui/ToggleActiveModButton/__snapshots__/ToggleActiveModButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 21 |
22 | `; 23 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/ToggleButton/ToggleButton.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/button-base"; 2 | 3 | .ToggleButton { 4 | @extend %button-base; 5 | 6 | // TODO ask Natasha about button width 7 | justify-content: flex-start; 8 | 9 | &:is(.active:not(:disabled)) { 10 | --border-color: var(--secondary-4); 11 | --background: var(--secondary-6); 12 | 13 | cursor: auto; 14 | pointer-events: none; 15 | } 16 | 17 | .content { 18 | align-items: center; 19 | display: inline-flex; 20 | gap: 1rem; 21 | max-height: var(--text-height); 22 | white-space: nowrap; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/SaveSettingsButton/__snapshots__/SaveSettingsButton.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 21 |
22 | `; 23 | -------------------------------------------------------------------------------- /src/renderer/src/routes/AppRoutes/AppRoutes.test.tsx: -------------------------------------------------------------------------------- 1 | import { describe, expect, it, vi } from "vitest"; 2 | 3 | import { renderWithRouter } from "@renderer/shared/lib/helpers/testUtils"; 4 | 5 | import { AppRoutes } from "./AppRoutes"; 6 | 7 | vi.mock("@renderer/pages"); 8 | 9 | describe("", () => { 10 | const Component = ; 11 | 12 | it("should be defined", () => { 13 | expect(AppRoutes).toBeDefined(); 14 | }); 15 | 16 | it("should match the snapshot", () => { 17 | const { container } = renderWithRouter(Component); 18 | 19 | expect(container).toMatchSnapshot(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/renderer/src/shared/lib/helpers/mergeRefs/mergeRefs.ts: -------------------------------------------------------------------------------- 1 | import { Ref, RefObject } from "react"; 2 | 3 | type Mutable = { 4 | -readonly [k in keyof T]: T[k]; 5 | }; 6 | 7 | type Refs = (Ref | undefined)[]; 8 | 9 | const mergeRefs = 10 | (...refs: Refs) => 11 | (value: T): void => { 12 | for (let i = 0; i < refs.length; i++) { 13 | const ref = refs[i]; 14 | 15 | if (typeof ref === "function") { 16 | ref(value); 17 | } else if (ref) { 18 | (ref as Mutable>).current = value; 19 | } 20 | } 21 | }; 22 | 23 | export { mergeRefs }; 24 | -------------------------------------------------------------------------------- /src/renderer/src/features/backup/ui/RestoreDefaultSettings/__snapshots__/RestoreDefaultSettings.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 21 |
22 | `; 23 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/TextField/__snapshots__/TextField.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 26 |
27 | `; 28 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/DataTable/DataTable.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from "@testing-library/react"; 2 | import { describe, expect, it } from "vitest"; 3 | 4 | import DataTable from "./DataTable"; 5 | 6 | describe("", () => { 7 | const data: any[] = []; 8 | const columns: any[] = []; 9 | const Component = ; 10 | 11 | it("should be defined", () => { 12 | expect(DataTable).toBeDefined(); 13 | }); 14 | 15 | it("should match the snapshot", () => { 16 | const { container } = render(Component); 17 | 18 | expect(container).toMatchSnapshot(); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/Error/Error.tsx: -------------------------------------------------------------------------------- 1 | import ErrorIcon from "@renderer/shared/assets/icons/error.svg"; 2 | import { classNames } from "@renderer/shared/lib/helpers"; 3 | import { Heading } from "@renderer/shared/ui"; 4 | 5 | import css from "./Error.module.scss"; 6 | import { ErrorProps } from "./Error.type"; 7 | 8 | const Error = ({ className, error }: ErrorProps) => ( 9 |
10 | 11 | 12 | Error: 13 | 14 | {error} 15 |
16 | ); 17 | 18 | export default Error; 19 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Checkbox/__snapshots__/Checkbox.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html 2 | 3 | exports[` > should match the snapshot 1`] = ` 4 |
5 | 28 |
29 | `; 30 | -------------------------------------------------------------------------------- /src/renderer/src/shared/assets/spinners/oval.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/renderer/src/shared/components/SuspenseError/SuspenseError.tsx: -------------------------------------------------------------------------------- 1 | import { QueryErrorResetBoundary } from "@tanstack/react-query"; 2 | import { Suspense } from "react"; 3 | 4 | import ErrorBoundary from "../ErrorBoundary"; 5 | 6 | import { SuspenseErrorProps } from "./SuspenseError.type"; 7 | 8 | const SuspenseError = ({ children, loadingFallback }: SuspenseErrorProps) => ( 9 | 10 | {({ reset }) => ( 11 | 12 | {children} 13 | 14 | )} 15 | 16 | ); 17 | 18 | export default SuspenseError; 19 | -------------------------------------------------------------------------------- /src/renderer/src/shared/ui/Menu/Menu.type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode, RefObject } from "react"; 2 | 3 | export type MenuProps = { 4 | children?: ReactNode; 5 | /** 6 | * a string that will be applied as a css class to parent element 7 | */ 8 | className?: string; 9 | /** 10 | * a ref to an element that combobox will attach to during render 11 | */ 12 | comboboxRef: RefObject; 13 | /** 14 | * a unique id to use in conjunction with aria-controls 15 | */ 16 | id: string; 17 | /** 18 | * a callback which fires on outside click of Menu 19 | * to close the current Modal component 20 | */ 21 | onClose: () => void; 22 | }; 23 | -------------------------------------------------------------------------------- /src/main/entities/modSettingsFile/lib/helpers/getCurrentSettings/getCurrentSettings.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs/promises"; 2 | 3 | import { load } from "cheerio"; 4 | 5 | import { GameKey } from "@main/shared/config"; 6 | import { getGameSettings } from "@main/shared/lib/helpers"; 7 | 8 | const getCurrentSettings = async (key: GameKey) => { 9 | const { MOD_SETTINGS_PATH } = getGameSettings(key); 10 | const modSettingsFile = await fs.readFile(MOD_SETTINGS_PATH); 11 | const contents = modSettingsFile.toString(); 12 | const cheerioAPI = load(contents, { xmlMode: true, decodeEntities: false }); 13 | 14 | return cheerioAPI; 15 | }; 16 | 17 | export { getCurrentSettings }; 18 | -------------------------------------------------------------------------------- /src/main/shared/lib/helpers/netConnection/netConnection.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from "path"; 2 | 3 | import { app } from "electron"; 4 | import { ConnectionBuilder } from "electron-cgi"; 5 | 6 | import { PAK_READER_PATH } from "@main/shared/config"; 7 | 8 | let pakReaderPath = PAK_READER_PATH; 9 | 10 | if (app.isPackaged) { 11 | pakReaderPath = resolve(process.resourcesPath, "./bin/PakReader"); 12 | } 13 | 14 | const netConnection = new ConnectionBuilder().connectTo(pakReaderPath).build(); 15 | 16 | netConnection.onDisconnect = () => { 17 | // eslint-disable-next-line no-console 18 | console.log("Lost connection to the .Net process"); 19 | }; 20 | 21 | export { netConnection }; 22 | -------------------------------------------------------------------------------- /src/renderer/src/pages/BaldursGate3/BaldursGate3.tsx: -------------------------------------------------------------------------------- 1 | import { classNames } from "@renderer/shared/lib/helpers"; 2 | import { InstalledModsSection, ModFileSection } from "@renderer/widgets"; 3 | 4 | import css from "./BaldursGate3.module.scss"; 5 | import { BaldursGate3Props } from "./BaldursGate3.type"; 6 | 7 | const BaldursGate3 = ({ className }: BaldursGate3Props) => { 8 | const game = "BG3"; 9 | 10 | return ( 11 |
15 | 16 | 17 |
18 | ); 19 | }; 20 | 21 | export { BaldursGate3 }; 22 | --------------------------------------------------------------------------------