Restructure frontend code to allow for extensions (#4721)

# Description of Changes
Move frontend code into `core` folder and add infrastructure for
`proprietary` folder to include premium, non-OSS features
This commit is contained in:
James Brunton 2025-10-28 10:29:36 +00:00 committed by GitHub
parent 960d48f80c
commit d2b38ef4b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
725 changed files with 2485 additions and 2226 deletions

View File

@ -152,6 +152,8 @@ jobs:
cache-dependency-path: frontend/package-lock.json cache-dependency-path: frontend/package-lock.json
- name: Install frontend dependencies - name: Install frontend dependencies
run: cd frontend && npm ci run: cd frontend && npm ci
- name: Type-check frontend
run: cd frontend && npm run prebuild && npm run typecheck:all
- name: Lint frontend - name: Lint frontend
run: cd frontend && npm run lint run: cd frontend && npm run lint
- name: Build frontend - name: Build frontend

View File

@ -18,6 +18,6 @@
<body> <body>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div> <div id="root"></div>
<script type="module" src="/src/index.jsx"></script> <script type="module" src="/src/index.tsx"></script>
</body> </body>
</html> </html>

View File

@ -94,6 +94,7 @@
"typescript": "^5.9.2", "typescript": "^5.9.2",
"typescript-eslint": "^8.44.1", "typescript-eslint": "^8.44.1",
"vite": "^7.1.7", "vite": "^7.1.7",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4" "vitest": "^3.2.4"
} }
}, },
@ -7977,6 +7978,13 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/globrex": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
"integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
"dev": true,
"license": "MIT"
},
"node_modules/gonzales-pe": { "node_modules/gonzales-pe": {
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
@ -13298,6 +13306,27 @@
"node": ">=18" "node": ">=18"
} }
}, },
"node_modules/tsconfck": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz",
"integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==",
"dev": true,
"license": "MIT",
"bin": {
"tsconfck": "bin/tsconfck.js"
},
"engines": {
"node": "^18 || >=20"
},
"peerDependencies": {
"typescript": "^5.0.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/tsconfig-paths": { "node_modules/tsconfig-paths": {
"version": "4.2.0", "version": "4.2.0",
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
@ -13828,6 +13857,26 @@
"url": "https://opencollective.com/vitest" "url": "https://opencollective.com/vitest"
} }
}, },
"node_modules/vite-tsconfig-paths": {
"version": "5.1.4",
"resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz",
"integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.1",
"globrex": "^0.1.2",
"tsconfck": "^3.0.3"
},
"peerDependencies": {
"vite": "*"
},
"peerDependenciesMeta": {
"vite": {
"optional": true
}
}
},
"node_modules/vite/node_modules/fdir": { "node_modules/vite/node_modules/fdir": {
"version": "6.5.0", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",

View File

@ -57,12 +57,15 @@
}, },
"scripts": { "scripts": {
"predev": "npm run generate-icons", "predev": "npm run generate-icons",
"dev": "npm run typecheck && vite", "dev": "vite",
"prebuild": "npm run generate-icons", "prebuild": "npm run generate-icons",
"lint": "eslint --max-warnings=0", "lint": "eslint --max-warnings=0",
"build": "npm run typecheck && vite build", "build": "vite build",
"preview": "vite preview", "preview": "vite preview",
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"typecheck:core": "tsc --noEmit --project tsconfig.core.json",
"typecheck:proprietary": "tsc --noEmit --project tsconfig.proprietary.json",
"typecheck:all": "npm run typecheck:core && npm run typecheck:proprietary",
"check": "npm run typecheck && npm run lint && npm run test:run", "check": "npm run typecheck && npm run lint && npm run test:run",
"generate-licenses": "node scripts/generate-licenses.js", "generate-licenses": "node scripts/generate-licenses.js",
"generate-icons": "node scripts/generate-icons.js", "generate-icons": "node scripts/generate-icons.js",
@ -120,9 +123,9 @@
"@vitejs/plugin-react-swc": "^4.1.0", "@vitejs/plugin-react-swc": "^4.1.0",
"@vitest/coverage-v8": "^3.2.4", "@vitest/coverage-v8": "^3.2.4",
"eslint": "^9.36.0", "eslint": "^9.36.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-import-resolver-typescript": "^4.4.4", "eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-import": "^2.32.0", "eslint-plugin-import": "^2.32.0",
"eslint-plugin-react-hooks": "^5.2.0",
"jsdom": "^27.0.0", "jsdom": "^27.0.0",
"license-checker": "^25.0.1", "license-checker": "^25.0.1",
"madge": "^8.0.0", "madge": "^8.0.0",
@ -134,6 +137,7 @@
"typescript": "^5.9.2", "typescript": "^5.9.2",
"typescript-eslint": "^8.44.1", "typescript-eslint": "^8.44.1",
"vite": "^7.1.7", "vite": "^7.1.7",
"vite-tsconfig-paths": "^5.1.4",
"vitest": "^3.2.4" "vitest": "^3.2.4"
}, },
"depcheck": { "depcheck": {

View File

@ -3848,6 +3848,10 @@
"preview": "Preview" "preview": "Preview"
}, },
"config": { "config": {
"overview": {
"title": "Application Configuration",
"description": "Current application settings and configuration details."
},
"account": { "account": {
"overview": { "overview": {
"title": "Account Settings", "title": "Account Settings",

View File

@ -1,38 +0,0 @@
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

View File

@ -1,114 +0,0 @@
import { Suspense } from "react";
import { Routes, Route } from "react-router-dom";
import { RainbowThemeProvider } from "./components/shared/RainbowThemeProvider";
import { FileContextProvider } from "./contexts/FileContext";
import { NavigationProvider } from "./contexts/NavigationContext";
import { ToolRegistryProvider } from "./contexts/ToolRegistryProvider";
import { FilesModalProvider } from "./contexts/FilesModalContext";
import { ToolWorkflowProvider } from "./contexts/ToolWorkflowContext";
import { HotkeyProvider } from "./contexts/HotkeyContext";
import { SidebarProvider } from "./contexts/SidebarContext";
import { PreferencesProvider } from "./contexts/PreferencesContext";
import { AppConfigProvider } from "./contexts/AppConfigContext";
import { OnboardingProvider } from "./contexts/OnboardingContext";
import { TourOrchestrationProvider } from "./contexts/TourOrchestrationContext";
import ErrorBoundary from "./components/shared/ErrorBoundary";
import OnboardingTour from "./components/onboarding/OnboardingTour";
import { useScarfTracking } from "./hooks/useScarfTracking";
// Import auth components
import { AuthProvider } from "./auth/UseSession";
import Landing from "./routes/Landing";
import Login from "./routes/Login";
import Signup from "./routes/Signup";
import AuthCallback from "./routes/AuthCallback";
// Import global styles
import "./styles/tailwind.css";
import "./styles/cookieconsent.css";
import "./index.css";
import { RightRailProvider } from "./contexts/RightRailContext";
import { ViewerProvider } from "./contexts/ViewerContext";
import { SignatureProvider } from "./contexts/SignatureContext";
// Import file ID debugging helpers (development only)
import "./utils/fileIdSafety";
// Loading component for i18next suspense
const LoadingFallback = () => (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center",
height: "100vh",
fontSize: "18px",
color: "#666",
}}
>
Loading...
</div>
);
// Component to initialize scarf tracking (must be inside AppConfigProvider)
function ScarfTrackingInitializer() {
useScarfTracking();
return null;
}
export default function App() {
return (
<Suspense fallback={<LoadingFallback />}>
<PreferencesProvider>
<RainbowThemeProvider>
<ErrorBoundary>
<AuthProvider>
<Routes>
{/* Auth routes - no FileContext or other providers needed */}
<Route path="/login" element={<Login />} />
<Route path="/signup" element={<Signup />} />
<Route path="/auth/callback" element={<AuthCallback />} />
{/* Main app routes - wrapped with all providers */}
<Route
path="/*"
element={
<OnboardingProvider>
<AppConfigProvider>
<ScarfTrackingInitializer />
<FileContextProvider enableUrlSync={true} enablePersistence={true}>
<ToolRegistryProvider>
<NavigationProvider>
<FilesModalProvider>
<ToolWorkflowProvider>
<HotkeyProvider>
<SidebarProvider>
<ViewerProvider>
<SignatureProvider>
<RightRailProvider>
<TourOrchestrationProvider>
<Landing />
<OnboardingTour />
</TourOrchestrationProvider>
</RightRailProvider>
</SignatureProvider>
</ViewerProvider>
</SidebarProvider>
</HotkeyProvider>
</ToolWorkflowProvider>
</FilesModalProvider>
</NavigationProvider>
</ToolRegistryProvider>
</FileContextProvider>
</AppConfigProvider>
</OnboardingProvider>
}
/>
</Routes>
</AuthProvider>
</ErrorBoundary>
</RainbowThemeProvider>
</PreferencesProvider>
</Suspense>
);
}

24
frontend/src/core/App.tsx Normal file
View File

@ -0,0 +1,24 @@
import { Suspense } from "react";
import { AppProviders } from "@app/components/AppProviders";
import { LoadingFallback } from "@app/components/shared/LoadingFallback";
import HomePage from "@app/pages/HomePage";
import OnboardingTour from "@app/components/onboarding/OnboardingTour";
// Import global styles
import "@app/styles/tailwind.css";
import "@app/styles/cookieconsent.css";
import "@app/styles/index.css";
// Import file ID debugging helpers (development only)
import "@app/utils/fileIdSafety";
export default function App() {
return (
<Suspense fallback={<LoadingFallback />}>
<AppProviders>
<HomePage />
<OnboardingTour />
</AppProviders>
</Suspense>
);
}

View File

@ -0,0 +1,67 @@
import { ReactNode } from "react";
import { RainbowThemeProvider } from "@app/components/shared/RainbowThemeProvider";
import { FileContextProvider } from "@app/contexts/FileContext";
import { NavigationProvider } from "@app/contexts/NavigationContext";
import { ToolRegistryProvider } from "@app/contexts/ToolRegistryProvider";
import { FilesModalProvider } from "@app/contexts/FilesModalContext";
import { ToolWorkflowProvider } from "@app/contexts/ToolWorkflowContext";
import { HotkeyProvider } from "@app/contexts/HotkeyContext";
import { SidebarProvider } from "@app/contexts/SidebarContext";
import { PreferencesProvider } from "@app/contexts/PreferencesContext";
import { AppConfigProvider } from "@app/contexts/AppConfigContext";
import { RightRailProvider } from "@app/contexts/RightRailContext";
import { ViewerProvider } from "@app/contexts/ViewerContext";
import { SignatureProvider } from "@app/contexts/SignatureContext";
import { OnboardingProvider } from "@app/contexts/OnboardingContext";
import { TourOrchestrationProvider } from "@app/contexts/TourOrchestrationContext";
import ErrorBoundary from "@app/components/shared/ErrorBoundary";
import { useScarfTracking } from "@app/hooks/useScarfTracking";
// Component to initialize scarf tracking (must be inside AppConfigProvider)
function ScarfTrackingInitializer() {
useScarfTracking();
return null;
}
/**
* Core application providers
* Contains all providers needed for the core
*/
export function AppProviders({ children }: { children: ReactNode }) {
return (
<PreferencesProvider>
<RainbowThemeProvider>
<ErrorBoundary>
<OnboardingProvider>
<AppConfigProvider>
<ScarfTrackingInitializer />
<FileContextProvider enableUrlSync={true} enablePersistence={true}>
<ToolRegistryProvider>
<NavigationProvider>
<FilesModalProvider>
<ToolWorkflowProvider>
<HotkeyProvider>
<SidebarProvider>
<ViewerProvider>
<SignatureProvider>
<RightRailProvider>
<TourOrchestrationProvider>
{children}
</TourOrchestrationProvider>
</RightRailProvider>
</SignatureProvider>
</ViewerProvider>
</SidebarProvider>
</HotkeyProvider>
</ToolWorkflowProvider>
</FilesModalProvider>
</NavigationProvider>
</ToolRegistryProvider>
</FileContextProvider>
</AppConfigProvider>
</OnboardingProvider>
</ErrorBoundary>
</RainbowThemeProvider>
</PreferencesProvider>
);
}

View File

@ -1,17 +1,17 @@
import React, { useState, useCallback, useEffect } from 'react'; import React, { useState, useCallback, useEffect } from 'react';
import { Modal } from '@mantine/core'; import { Modal } from '@mantine/core';
import { Dropzone } from '@mantine/dropzone'; import { Dropzone } from '@mantine/dropzone';
import { StirlingFileStub } from '../types/fileContext'; import { StirlingFileStub } from '@app/types/fileContext';
import { useFileManager } from '../hooks/useFileManager'; import { useFileManager } from '@app/hooks/useFileManager';
import { useFilesModalContext } from '../contexts/FilesModalContext'; import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import { Tool } from '../types/tool'; import { Tool } from '@app/types/tool';
import MobileLayout from './fileManager/MobileLayout'; import MobileLayout from '@app/components/fileManager/MobileLayout';
import DesktopLayout from './fileManager/DesktopLayout'; import DesktopLayout from '@app/components/fileManager/DesktopLayout';
import DragOverlay from './fileManager/DragOverlay'; import DragOverlay from '@app/components/fileManager/DragOverlay';
import { FileManagerProvider } from '../contexts/FileManagerContext'; import { FileManagerProvider } from '@app/contexts/FileManagerContext';
import { Z_INDEX_FILE_MANAGER_MODAL } from '../styles/zIndex'; import { Z_INDEX_FILE_MANAGER_MODAL } from '@app/styles/zIndex';
import { isGoogleDriveConfigured } from '../services/googleDrivePickerService'; import { isGoogleDriveConfigured } from '@app/services/googleDrivePickerService';
import { loadScript } from '../utils/scriptLoader'; import { loadScript } from '@app/utils/scriptLoader';
interface FileManagerProps { interface FileManagerProps {
selectedTool?: Tool | null; selectedTool?: Tool | null;

View File

@ -3,9 +3,9 @@ import { Card, Group, Text, Button, Progress } from "@mantine/core";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import StorageIcon from "@mui/icons-material/Storage"; import StorageIcon from "@mui/icons-material/Storage";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import { StorageStats } from "../services/fileStorage"; import { StorageStats } from "@app/services/fileStorage";
import { formatFileSize } from "../utils/fileUtils"; import { formatFileSize } from "@app/utils/fileUtils";
import { getStorageUsagePercent } from "../utils/storageUtils"; import { getStorageUsagePercent } from "@app/utils/storageUtils";
interface StorageStatsCardProps { interface StorageStatsCardProps {
storageStats: StorageStats | null; storageStats: StorageStats | null;

View File

@ -1,9 +1,9 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Stack, Alert, Text } from '@mantine/core'; import { Stack, Alert, Text } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { DrawingControls } from './DrawingControls'; import { DrawingControls } from '@app/components/annotation/shared/DrawingControls';
import { ColorPicker } from './ColorPicker'; import { ColorPicker } from '@app/components/annotation/shared/ColorPicker';
import { usePDFAnnotation } from '../providers/PDFAnnotationProvider'; import { usePDFAnnotation } from '@app/components/annotation/providers/PDFAnnotationProvider';
export interface AnnotationToolConfig { export interface AnnotationToolConfig {
enableDrawing?: boolean; enableDrawing?: boolean;

View File

@ -1,7 +1,7 @@
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { Paper, Button, Modal, Stack, Text, Popover, ColorPicker as MantineColorPicker } from '@mantine/core'; import { Paper, Button, Modal, Stack, Text, Popover, ColorPicker as MantineColorPicker } from '@mantine/core';
import { ColorSwatchButton } from './ColorPicker'; import { ColorSwatchButton } from '@app/components/annotation/shared/ColorPicker';
import PenSizeSelector from '../../tools/sign/PenSizeSelector'; import PenSizeSelector from '@app/components/tools/sign/PenSizeSelector';
import SignaturePad from 'signature_pad'; import SignaturePad from 'signature_pad';
interface DrawingCanvasProps { interface DrawingCanvasProps {

View File

@ -1,7 +1,7 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Stack, TextInput, Select, Combobox, useCombobox, Group, Box } from '@mantine/core'; import { Stack, TextInput, Select, Combobox, useCombobox, Group, Box } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ColorPicker } from './ColorPicker'; import { ColorPicker } from '@app/components/annotation/shared/ColorPicker';
interface TextInputWithFontProps { interface TextInputWithFontProps {
text: string; text: string;

View File

@ -1,7 +1,7 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Stack } from '@mantine/core'; import { Stack } from '@mantine/core';
import { BaseAnnotationTool } from '../shared/BaseAnnotationTool'; import { BaseAnnotationTool } from '@app/components/annotation/shared/BaseAnnotationTool';
import { DrawingCanvas } from '../shared/DrawingCanvas'; import { DrawingCanvas } from '@app/components/annotation/shared/DrawingCanvas';
interface DrawingToolProps { interface DrawingToolProps {
onDrawingChange?: (data: string | null) => void; onDrawingChange?: (data: string | null) => void;

View File

@ -1,7 +1,7 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Stack } from '@mantine/core'; import { Stack } from '@mantine/core';
import { BaseAnnotationTool } from '../shared/BaseAnnotationTool'; import { BaseAnnotationTool } from '@app/components/annotation/shared/BaseAnnotationTool';
import { ImageUploader } from '../shared/ImageUploader'; import { ImageUploader } from '@app/components/annotation/shared/ImageUploader';
interface ImageToolProps { interface ImageToolProps {
onImageChange?: (data: string | null) => void; onImageChange?: (data: string | null) => void;

View File

@ -1,7 +1,7 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { Stack } from '@mantine/core'; import { Stack } from '@mantine/core';
import { BaseAnnotationTool } from '../shared/BaseAnnotationTool'; import { BaseAnnotationTool } from '@app/components/annotation/shared/BaseAnnotationTool';
import { TextInputWithFont } from '../shared/TextInputWithFont'; import { TextInputWithFont } from '@app/components/annotation/shared/TextInputWithFont';
interface TextToolProps { interface TextToolProps {
onTextChange?: (text: string) => void; onTextChange?: (text: string) => void;

View File

@ -2,10 +2,10 @@ import React, { useRef, useState } from 'react';
import { Button, Group, useMantineColorScheme } from '@mantine/core'; import { Button, Group, useMantineColorScheme } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import AddIcon from '@mui/icons-material/Add'; import AddIcon from '@mui/icons-material/Add';
import { useFilesModalContext } from '../../contexts/FilesModalContext'; import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import LocalIcon from '../shared/LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { BASE_PATH } from '../../constants/app'; import { BASE_PATH } from '@app/constants/app';
import styles from './FileEditor.module.css'; import styles from '@app/components/fileEditor/FileEditor.module.css';
interface AddFileCardProps { interface AddFileCardProps {
onFileSelect: (files: File[]) => void; onFileSelect: (files: File[]) => void;

View File

@ -3,17 +3,17 @@ import {
Text, Center, Box, LoadingOverlay, Stack Text, Center, Box, LoadingOverlay, Stack
} from '@mantine/core'; } from '@mantine/core';
import { Dropzone } from '@mantine/dropzone'; import { Dropzone } from '@mantine/dropzone';
import { useFileSelection, useFileState, useFileManagement, useFileActions, useFileContext } from '../../contexts/FileContext'; import { useFileSelection, useFileState, useFileManagement, useFileActions, useFileContext } from '@app/contexts/FileContext';
import { useNavigationActions } from '../../contexts/NavigationContext'; import { useNavigationActions } from '@app/contexts/NavigationContext';
import { zipFileService } from '../../services/zipFileService'; import { zipFileService } from '@app/services/zipFileService';
import { detectFileExtension } from '../../utils/fileUtils'; import { detectFileExtension } from '@app/utils/fileUtils';
import FileEditorThumbnail from './FileEditorThumbnail'; import FileEditorThumbnail from '@app/components/fileEditor/FileEditorThumbnail';
import AddFileCard from './AddFileCard'; import AddFileCard from '@app/components/fileEditor/AddFileCard';
import FilePickerModal from '../shared/FilePickerModal'; import FilePickerModal from '@app/components/shared/FilePickerModal';
import { FileId, StirlingFile } from '../../types/fileContext'; import { FileId, StirlingFile } from '@app/types/fileContext';
import { alert } from '../toast'; import { alert } from '@app/components/toast';
import { downloadBlob } from '../../utils/downloadUtils'; import { downloadBlob } from '@app/utils/downloadUtils';
import { useFileEditorRightRailButtons } from './fileEditorRightRailButtons'; import { useFileEditorRightRailButtons } from '@app/components/fileEditor/fileEditorRightRailButtons';
interface FileEditorProps { interface FileEditorProps {

View File

@ -1,7 +1,7 @@
import React, { useState, useCallback, useRef, useMemo } from 'react'; import React, { useState, useCallback, useRef, useMemo } from 'react';
import { Text, ActionIcon, CheckboxIndicator, Tooltip, Modal, Button, Group, Stack } from '@mantine/core'; import { Text, ActionIcon, CheckboxIndicator, Tooltip, Modal, Button, Group, Stack } from '@mantine/core';
import { useMediaQuery } from '@mantine/hooks'; import { useMediaQuery } from '@mantine/hooks';
import { alert } from '../toast'; import { alert } from '@app/components/toast';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import DownloadOutlinedIcon from '@mui/icons-material/DownloadOutlined'; import DownloadOutlinedIcon from '@mui/icons-material/DownloadOutlined';
import CloseIcon from '@mui/icons-material/Close'; import CloseIcon from '@mui/icons-material/Close';
@ -11,16 +11,16 @@ import PushPinIcon from '@mui/icons-material/PushPin';
import PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined'; import PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined';
import DragIndicatorIcon from '@mui/icons-material/DragIndicator'; import DragIndicatorIcon from '@mui/icons-material/DragIndicator';
import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'; import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
import { StirlingFileStub } from '../../types/fileContext'; import { StirlingFileStub } from '@app/types/fileContext';
import { zipFileService } from '../../services/zipFileService'; import { zipFileService } from '@app/services/zipFileService';
import styles from './FileEditor.module.css'; import styles from '@app/components/fileEditor/FileEditor.module.css';
import { useFileContext } from '../../contexts/FileContext'; import { useFileContext } from '@app/contexts/FileContext';
import { useFileState } from '../../contexts/file/fileHooks'; import { useFileState } from '@app/contexts/file/fileHooks';
import { FileId } from '../../types/file'; import { FileId } from '@app/types/file';
import { formatFileSize } from '../../utils/fileUtils'; import { formatFileSize } from '@app/utils/fileUtils';
import ToolChain from '../shared/ToolChain'; import ToolChain from '@app/components/shared/ToolChain';
import HoverActionMenu, { HoverAction } from '../shared/HoverActionMenu'; import HoverActionMenu, { HoverAction } from '@app/components/shared/HoverActionMenu';

View File

@ -1,7 +1,7 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useRightRailButtons, RightRailButtonWithAction } from '../../hooks/useRightRailButtons'; import { useRightRailButtons, RightRailButtonWithAction } from '@app/hooks/useRightRailButtons';
import LocalIcon from '../shared/LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
interface FileEditorRightRailButtonsParams { interface FileEditorRightRailButtonsParams {
totalItems: number; totalItems: number;

View File

@ -4,8 +4,8 @@ import PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf';
import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';
import ChevronRightIcon from '@mui/icons-material/ChevronRight'; import ChevronRightIcon from '@mui/icons-material/ChevronRight';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { getFileSize } from '../../utils/fileUtils'; import { getFileSize } from '@app/utils/fileUtils';
import { StirlingFileStub } from '../../types/fileContext'; import { StirlingFileStub } from '@app/types/fileContext';
interface CompactFileDetailsProps { interface CompactFileDetailsProps {
currentFile: StirlingFileStub | null; currentFile: StirlingFileStub | null;

View File

@ -1,12 +1,12 @@
import React from 'react'; import React from 'react';
import { Grid } from '@mantine/core'; import { Grid } from '@mantine/core';
import FileSourceButtons from './FileSourceButtons'; import FileSourceButtons from '@app/components/fileManager/FileSourceButtons';
import FileDetails from './FileDetails'; import FileDetails from '@app/components/fileManager/FileDetails';
import SearchInput from './SearchInput'; import SearchInput from '@app/components/fileManager/SearchInput';
import FileListArea from './FileListArea'; import FileListArea from '@app/components/fileManager/FileListArea';
import FileActions from './FileActions'; import FileActions from '@app/components/fileManager/FileActions';
import HiddenFileInput from './HiddenFileInput'; import HiddenFileInput from '@app/components/fileManager/HiddenFileInput';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
const DesktopLayout: React.FC = () => { const DesktopLayout: React.FC = () => {
const { const {

View File

@ -2,9 +2,9 @@ import React, { useState } from 'react';
import { Button, Group, Text, Stack, useMantineColorScheme } from '@mantine/core'; import { Button, Group, Text, Stack, useMantineColorScheme } from '@mantine/core';
import HistoryIcon from '@mui/icons-material/History'; import HistoryIcon from '@mui/icons-material/History';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
import LocalIcon from '../shared/LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { BASE_PATH } from '../../constants/app'; import { BASE_PATH } from '@app/constants/app';
const EmptyFilesState: React.FC = () => { const EmptyFilesState: React.FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();

View File

@ -4,7 +4,7 @@ import SelectAllIcon from "@mui/icons-material/SelectAll";
import DeleteIcon from "@mui/icons-material/Delete"; import DeleteIcon from "@mui/icons-material/Delete";
import DownloadIcon from "@mui/icons-material/Download"; import DownloadIcon from "@mui/icons-material/Download";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useFileManagerContext } from "../../contexts/FileManagerContext"; import { useFileManagerContext } from "@app/contexts/FileManagerContext";
const FileActions: React.FC = () => { const FileActions: React.FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();

View File

@ -1,11 +1,11 @@
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Stack, Button, Box } from '@mantine/core'; import { Stack, Button, Box } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useIndexedDBThumbnail } from '../../hooks/useIndexedDBThumbnail'; import { useIndexedDBThumbnail } from '@app/hooks/useIndexedDBThumbnail';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
import FilePreview from '../shared/FilePreview'; import FilePreview from '@app/components/shared/FilePreview';
import FileInfoCard from './FileInfoCard'; import FileInfoCard from '@app/components/fileManager/FileInfoCard';
import CompactFileDetails from './CompactFileDetails'; import CompactFileDetails from '@app/components/fileManager/CompactFileDetails';
interface FileDetailsProps { interface FileDetailsProps {
compact?: boolean; compact?: boolean;

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
import { Box, Text, Collapse, Group } from '@mantine/core'; import { Box, Text, Collapse, Group } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { StirlingFileStub } from '../../types/fileContext'; import { StirlingFileStub } from '@app/types/fileContext';
import FileListItem from './FileListItem'; import FileListItem from '@app/components/fileManager/FileListItem';
interface FileHistoryGroupProps { interface FileHistoryGroupProps {
leafFile: StirlingFileStub; leafFile: StirlingFileStub;

View File

@ -1,9 +1,9 @@
import React from 'react'; import React from 'react';
import { Stack, Card, Box, Text, Badge, Group, Divider, ScrollArea } from '@mantine/core'; import { Stack, Card, Box, Text, Badge, Group, Divider, ScrollArea } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { detectFileExtension, getFileSize } from '../../utils/fileUtils'; import { detectFileExtension, getFileSize } from '@app/utils/fileUtils';
import { StirlingFileStub } from '../../types/fileContext'; import { StirlingFileStub } from '@app/types/fileContext';
import ToolChain from '../shared/ToolChain'; import ToolChain from '@app/components/shared/ToolChain';
interface FileInfoCardProps { interface FileInfoCardProps {
currentFile: StirlingFileStub | null; currentFile: StirlingFileStub | null;

View File

@ -2,10 +2,10 @@ import React from 'react';
import { Center, ScrollArea, Text, Stack } from '@mantine/core'; import { Center, ScrollArea, Text, Stack } from '@mantine/core';
import CloudIcon from '@mui/icons-material/Cloud'; import CloudIcon from '@mui/icons-material/Cloud';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import FileListItem from './FileListItem'; import FileListItem from '@app/components/fileManager/FileListItem';
import FileHistoryGroup from './FileHistoryGroup'; import FileHistoryGroup from '@app/components/fileManager/FileHistoryGroup';
import EmptyFilesState from './EmptyFilesState'; import EmptyFilesState from '@app/components/fileManager/EmptyFilesState';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
interface FileListAreaProps { interface FileListAreaProps {
scrollAreaHeight: string; scrollAreaHeight: string;

View File

@ -7,12 +7,12 @@ import HistoryIcon from '@mui/icons-material/History';
import RestoreIcon from '@mui/icons-material/Restore'; import RestoreIcon from '@mui/icons-material/Restore';
import UnarchiveIcon from '@mui/icons-material/Unarchive'; import UnarchiveIcon from '@mui/icons-material/Unarchive';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { getFileSize, getFileDate } from '../../utils/fileUtils'; import { getFileSize, getFileDate } from '@app/utils/fileUtils';
import { FileId, StirlingFileStub } from '../../types/fileContext'; import { FileId, StirlingFileStub } from '@app/types/fileContext';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
import { zipFileService } from '../../services/zipFileService'; import { zipFileService } from '@app/services/zipFileService';
import ToolChain from '../shared/ToolChain'; import ToolChain from '@app/components/shared/ToolChain';
import { Z_INDEX_OVER_FILE_MANAGER_MODAL } from '../../styles/zIndex'; import { Z_INDEX_OVER_FILE_MANAGER_MODAL } from '@app/styles/zIndex';
interface FileListItemProps { interface FileListItemProps {
file: StirlingFileStub; file: StirlingFileStub;

View File

@ -4,8 +4,8 @@ import HistoryIcon from '@mui/icons-material/History';
import UploadIcon from '@mui/icons-material/Upload'; import UploadIcon from '@mui/icons-material/Upload';
import CloudIcon from '@mui/icons-material/Cloud'; import CloudIcon from '@mui/icons-material/Cloud';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
import { useGoogleDrivePicker } from '../../hooks/useGoogleDrivePicker'; import { useGoogleDrivePicker } from '@app/hooks/useGoogleDrivePicker';
interface FileSourceButtonsProps { interface FileSourceButtonsProps {
horizontal?: boolean; horizontal?: boolean;

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
const HiddenFileInput: React.FC = () => { const HiddenFileInput: React.FC = () => {
const { fileInputRef, onFileInputChange } = useFileManagerContext(); const { fileInputRef, onFileInputChange } = useFileManagerContext();

View File

@ -1,12 +1,12 @@
import React from 'react'; import React from 'react';
import { Box } from '@mantine/core'; import { Box } from '@mantine/core';
import FileSourceButtons from './FileSourceButtons'; import FileSourceButtons from '@app/components/fileManager/FileSourceButtons';
import FileDetails from './FileDetails'; import FileDetails from '@app/components/fileManager/FileDetails';
import SearchInput from './SearchInput'; import SearchInput from '@app/components/fileManager/SearchInput';
import FileListArea from './FileListArea'; import FileListArea from '@app/components/fileManager/FileListArea';
import FileActions from './FileActions'; import FileActions from '@app/components/fileManager/FileActions';
import HiddenFileInput from './HiddenFileInput'; import HiddenFileInput from '@app/components/fileManager/HiddenFileInput';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
const MobileLayout: React.FC = () => { const MobileLayout: React.FC = () => {
const { const {

View File

@ -2,7 +2,7 @@ import React from 'react';
import { TextInput } from '@mantine/core'; import { TextInput } from '@mantine/core';
import SearchIcon from '@mui/icons-material/Search'; import SearchIcon from '@mui/icons-material/Search';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFileManagerContext } from '../../contexts/FileManagerContext'; import { useFileManagerContext } from '@app/contexts/FileManagerContext';
interface SearchInputProps { interface SearchInputProps {
style?: React.CSSProperties; style?: React.CSSProperties;

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { HotkeyBinding } from '../../utils/hotkeys'; import { HotkeyBinding } from '@app/utils/hotkeys';
import { useHotkeys } from '../../contexts/HotkeyContext'; import { useHotkeys } from '@app/contexts/HotkeyContext';
interface HotkeyDisplayProps { interface HotkeyDisplayProps {
binding: HotkeyBinding | null | undefined; binding: HotkeyBinding | null | undefined;

View File

@ -1,22 +1,22 @@
import { Box } from '@mantine/core'; import { Box } from '@mantine/core';
import { useRainbowThemeContext } from '../shared/RainbowThemeProvider'; import { useRainbowThemeContext } from '@app/components/shared/RainbowThemeProvider';
import { useToolWorkflow } from '../../contexts/ToolWorkflowContext'; import { useToolWorkflow } from '@app/contexts/ToolWorkflowContext';
import { useFileHandler } from '../../hooks/useFileHandler'; import { useFileHandler } from '@app/hooks/useFileHandler';
import { useFileState } from '../../contexts/FileContext'; import { useFileState } from '@app/contexts/FileContext';
import { useNavigationState, useNavigationActions } from '../../contexts/NavigationContext'; import { useNavigationState, useNavigationActions } from '@app/contexts/NavigationContext';
import { isBaseWorkbench } from '../../types/workbench'; import { isBaseWorkbench } from '@app/types/workbench';
import { useViewer } from '../../contexts/ViewerContext'; import { useViewer } from '@app/contexts/ViewerContext';
import { useAppConfig } from '../../contexts/AppConfigContext'; import { useAppConfig } from '@app/contexts/AppConfigContext';
import './Workbench.css'; import '@app/components/layout/Workbench.css';
import TopControls from '../shared/TopControls'; import TopControls from '@app/components/shared/TopControls';
import FileEditor from '../fileEditor/FileEditor'; import FileEditor from '@app/components/fileEditor/FileEditor';
import PageEditor from '../pageEditor/PageEditor'; import PageEditor from '@app/components/pageEditor/PageEditor';
import PageEditorControls from '../pageEditor/PageEditorControls'; import PageEditorControls from '@app/components/pageEditor/PageEditorControls';
import Viewer from '../viewer/Viewer'; import Viewer from '@app/components/viewer/Viewer';
import LandingPage from '../shared/LandingPage'; import LandingPage from '@app/components/shared/LandingPage';
import Footer from '../shared/Footer'; import Footer from '@app/components/shared/Footer';
import DismissAllErrorsButton from '../shared/DismissAllErrorsButton'; import DismissAllErrorsButton from '@app/components/shared/DismissAllErrorsButton';
// No props needed - component uses contexts directly // No props needed - component uses contexts directly
export default function Workbench() { export default function Workbench() {

View File

@ -1,14 +1,14 @@
import React from "react"; import React from "react";
import { TourProvider, useTour, type StepType } from '@reactour/tour'; import { TourProvider, useTour, type StepType } from '@reactour/tour';
import { useOnboarding } from '../../contexts/OnboardingContext'; import { useOnboarding } from '@app/contexts/OnboardingContext';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { CloseButton, ActionIcon } from '@mantine/core'; import { CloseButton, ActionIcon } from '@mantine/core';
import { useFilesModalContext } from '../../contexts/FilesModalContext'; import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import { useTourOrchestration } from '../../contexts/TourOrchestrationContext'; import { useTourOrchestration } from '@app/contexts/TourOrchestrationContext';
import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; import ArrowForwardIcon from '@mui/icons-material/ArrowForward';
import CheckIcon from '@mui/icons-material/Check'; import CheckIcon from '@mui/icons-material/Check';
import TourWelcomeModal from './TourWelcomeModal'; import TourWelcomeModal from '@app/components/onboarding/TourWelcomeModal';
import './OnboardingTour.css'; import '@app/components/onboarding/OnboardingTour.css';
// Enum case order defines order steps will appear // Enum case order defines order steps will appear
enum TourStep { enum TourStep {

View File

@ -1,6 +1,6 @@
import { Modal, Title, Text, Button, Stack, Group } from '@mantine/core'; import { Modal, Title, Text, Button, Stack, Group } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '../../styles/zIndex'; import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '@app/styles/zIndex';
interface TourWelcomeModalProps { interface TourWelcomeModalProps {
opened: boolean; opened: boolean;

View File

@ -1,9 +1,9 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import classes from './bulkSelectionPanel/BulkSelectionPanel.module.css'; import classes from '@app/components/pageEditor/bulkSelectionPanel/BulkSelectionPanel.module.css';
import { parseSelectionWithDiagnostics } from '../../utils/bulkselection/parseSelection'; import { parseSelectionWithDiagnostics } from '@app/utils/bulkselection/parseSelection';
import PageSelectionInput from './bulkSelectionPanel/PageSelectionInput'; import PageSelectionInput from '@app/components/pageEditor/bulkSelectionPanel/PageSelectionInput';
import SelectedPagesDisplay from './bulkSelectionPanel/SelectedPagesDisplay'; import SelectedPagesDisplay from '@app/components/pageEditor/bulkSelectionPanel/SelectedPagesDisplay';
import AdvancedSelectionPanel from './bulkSelectionPanel/AdvancedSelectionPanel'; import AdvancedSelectionPanel from '@app/components/pageEditor/bulkSelectionPanel/AdvancedSelectionPanel';
interface BulkSelectionPanelProps { interface BulkSelectionPanelProps {
csvInput: string; csvInput: string;

View File

@ -1,7 +1,7 @@
import React, { useRef, useEffect, useState, useCallback } from 'react'; import React, { useRef, useEffect, useState, useCallback } from 'react';
import { Box } from '@mantine/core'; import { Box } from '@mantine/core';
import { useVirtualizer } from '@tanstack/react-virtual'; import { useVirtualizer } from '@tanstack/react-virtual';
import { GRID_CONSTANTS } from './constants'; import { GRID_CONSTANTS } from '@app/components/pageEditor/constants';
interface DragDropItem { interface DragDropItem {
id: string; id: string;

View File

@ -9,9 +9,9 @@ import PushPinOutlinedIcon from '@mui/icons-material/PushPinOutlined';
import DragIndicatorIcon from '@mui/icons-material/DragIndicator'; import DragIndicatorIcon from '@mui/icons-material/DragIndicator';
import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'; import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
import styles from './PageEditor.module.css'; import styles from '@app/components/pageEditor/PageEditor.module.css';
import { useFileContext } from '../../contexts/FileContext'; import { useFileContext } from '@app/contexts/FileContext';
import { FileId } from '../../types/file'; import { FileId } from '@app/types/file';
interface FileItem { interface FileItem {
id: FileId; id: FileId;

View File

@ -1,19 +1,19 @@
import { useState, useCallback, useRef, useEffect } from "react"; import { useState, useCallback, useRef, useEffect } from "react";
import { Text, Center, Box, LoadingOverlay, Stack } from "@mantine/core"; import { Text, Center, Box, LoadingOverlay, Stack } from "@mantine/core";
import { useFileState, useFileActions } from "../../contexts/FileContext"; import { useFileState, useFileActions } from "@app/contexts/FileContext";
import { useNavigationGuard } from "../../contexts/NavigationContext"; import { useNavigationGuard } from "@app/contexts/NavigationContext";
import { PDFDocument, PageEditorFunctions } from "../../types/pageEditor"; import { PDFDocument, PageEditorFunctions } from "@app/types/pageEditor";
import { pdfExportService } from "../../services/pdfExportService"; import { pdfExportService } from "@app/services/pdfExportService";
import { documentManipulationService } from "../../services/documentManipulationService"; import { documentManipulationService } from "@app/services/documentManipulationService";
import { exportProcessedDocumentsToFiles } from "../../services/pdfExportHelpers"; import { exportProcessedDocumentsToFiles } from "@app/services/pdfExportHelpers";
import { createStirlingFilesAndStubs } from "../../services/fileStubHelpers"; import { createStirlingFilesAndStubs } from "@app/services/fileStubHelpers";
// Thumbnail generation is now handled by individual PageThumbnail components // Thumbnail generation is now handled by individual PageThumbnail components
import './PageEditor.module.css'; import '@app/components/pageEditor/PageEditor.module.css';
import PageThumbnail from './PageThumbnail'; import PageThumbnail from '@app/components/pageEditor/PageThumbnail';
import DragDropGrid from './DragDropGrid'; import DragDropGrid from '@app/components/pageEditor/DragDropGrid';
import SkeletonLoader from '../shared/SkeletonLoader'; import SkeletonLoader from '@app/components/shared/SkeletonLoader';
import NavigationWarningModal from '../shared/NavigationWarningModal'; import NavigationWarningModal from '@app/components/shared/NavigationWarningModal';
import { FileId } from "../../types/file"; import { FileId } from "@app/types/file";
import { import {
DeletePagesCommand, DeletePagesCommand,
@ -22,12 +22,12 @@ import {
BulkRotateCommand, BulkRotateCommand,
PageBreakCommand, PageBreakCommand,
UndoManager UndoManager
} from './commands/pageCommands'; } from '@app/components/pageEditor/commands/pageCommands';
import { GRID_CONSTANTS } from './constants'; import { GRID_CONSTANTS } from '@app/components/pageEditor/constants';
import { usePageDocument } from './hooks/usePageDocument'; import { usePageDocument } from '@app/components/pageEditor/hooks/usePageDocument';
import { usePageEditorState } from './hooks/usePageEditorState'; import { usePageEditorState } from '@app/components/pageEditor/hooks/usePageEditorState';
import { parseSelection } from "../../utils/bulkselection/parseSelection"; import { parseSelection } from "@app/utils/bulkselection/parseSelection";
import { usePageEditorRightRailButtons } from "./pageEditorRightRailButtons"; import { usePageEditorRightRailButtons } from "@app/components/pageEditor/pageEditorRightRailButtons";
export interface PageEditorProps { export interface PageEditorProps {
onFunctionsReady?: (functions: PageEditorFunctions) => void; onFunctionsReady?: (functions: PageEditorFunctions) => void;

View File

@ -1,7 +1,7 @@
import { ActionIcon, Popover } from '@mantine/core'; import { ActionIcon, Popover } from '@mantine/core';
import LocalIcon from '../shared/LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { Tooltip } from '../shared/Tooltip'; import { Tooltip } from '@app/components/shared/Tooltip';
import BulkSelectionPanel from './BulkSelectionPanel'; import BulkSelectionPanel from '@app/components/pageEditor/BulkSelectionPanel';
interface PageSelectByNumberButtonProps { interface PageSelectByNumberButtonProps {
disabled: boolean; disabled: boolean;

View File

@ -9,11 +9,11 @@ import DeleteIcon from '@mui/icons-material/Delete';
import ContentCutIcon from '@mui/icons-material/ContentCut'; import ContentCutIcon from '@mui/icons-material/ContentCut';
import AddIcon from '@mui/icons-material/Add'; import AddIcon from '@mui/icons-material/Add';
import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'; import { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
import { PDFPage, PDFDocument } from '../../types/pageEditor'; import { PDFPage, PDFDocument } from '@app/types/pageEditor';
import { useThumbnailGeneration } from '../../hooks/useThumbnailGeneration'; import { useThumbnailGeneration } from '@app/hooks/useThumbnailGeneration';
import { useFilesModalContext } from '../../contexts/FilesModalContext'; import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import styles from './PageEditor.module.css'; import styles from '@app/components/pageEditor/PageEditor.module.css';
import HoverActionMenu, { HoverAction } from '../shared/HoverActionMenu'; import HoverActionMenu, { HoverAction } from '@app/components/shared/HoverActionMenu';
interface PageThumbnailProps { interface PageThumbnailProps {

View File

@ -1,7 +1,7 @@
import { useState } from 'react'; import { useState } from 'react';
import { Flex } from '@mantine/core'; import { Flex } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import classes from './BulkSelectionPanel.module.css'; import classes from '@app/components/pageEditor/bulkSelectionPanel/BulkSelectionPanel.module.css';
import { import {
appendExpression, appendExpression,
insertOperatorSmart, insertOperatorSmart,
@ -10,9 +10,9 @@ import {
everyNthExpression, everyNthExpression,
rangeExpression, rangeExpression,
LogicalOperator, LogicalOperator,
} from './BulkSelection'; } from '@app/components/pageEditor/bulkSelectionPanel/BulkSelection';
import SelectPages from './SelectPages'; import SelectPages from '@app/components/pageEditor/bulkSelectionPanel/SelectPages';
import OperatorsSection from './OperatorsSection'; import OperatorsSection from '@app/components/pageEditor/bulkSelectionPanel/OperatorsSection';
interface AdvancedSelectionPanelProps { interface AdvancedSelectionPanelProps {
csvInput: string; csvInput: string;

View File

@ -1,7 +1,7 @@
import { Button, Text, Group, Divider } from '@mantine/core'; import { Button, Text, Group, Divider } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import classes from './BulkSelectionPanel.module.css'; import classes from '@app/components/pageEditor/bulkSelectionPanel/BulkSelectionPanel.module.css';
import { LogicalOperator } from './BulkSelection'; import { LogicalOperator } from '@app/components/pageEditor/bulkSelectionPanel/BulkSelection';
interface OperatorsSectionProps { interface OperatorsSectionProps {
csvInput: string; csvInput: string;

View File

@ -1,9 +1,9 @@
import { TextInput, Button, Text, Flex, Switch } from '@mantine/core'; import { TextInput, Button, Text, Flex, Switch } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import LocalIcon from '../../shared/LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { Tooltip } from '../../shared/Tooltip'; import { Tooltip } from '@app/components/shared/Tooltip';
import { usePageSelectionTips } from '../../tooltips/usePageSelectionTips'; import { usePageSelectionTips } from '@app/components/tooltips/usePageSelectionTips';
import classes from './BulkSelectionPanel.module.css'; import classes from '@app/components/pageEditor/bulkSelectionPanel/BulkSelectionPanel.module.css';
interface PageSelectionInputProps { interface PageSelectionInputProps {
csvInput: string; csvInput: string;

View File

@ -1,6 +1,6 @@
import { useState } from 'react'; import { useState } from 'react';
import { Button, Text, NumberInput, Group } from '@mantine/core'; import { Button, Text, NumberInput, Group } from '@mantine/core';
import classes from './BulkSelectionPanel.module.css'; import classes from '@app/components/pageEditor/bulkSelectionPanel/BulkSelectionPanel.module.css';
interface SelectPagesProps { interface SelectPagesProps {
title: string; title: string;

View File

@ -1,5 +1,5 @@
import { Text } from '@mantine/core'; import { Text } from '@mantine/core';
import classes from './BulkSelectionPanel.module.css'; import classes from '@app/components/pageEditor/bulkSelectionPanel/BulkSelectionPanel.module.css';
interface SelectedPagesDisplayProps { interface SelectedPagesDisplayProps {
selectedPageIds: string[]; selectedPageIds: string[];

View File

@ -1,5 +1,5 @@
import { FileId } from '../../../types/file'; import { FileId } from '@app/types/file';
import { PDFDocument, PDFPage } from '../../../types/pageEditor'; import { PDFDocument, PDFPage } from '@app/types/pageEditor';
// V1-style DOM-first command system (replaces the old React state commands) // V1-style DOM-first command system (replaces the old React state commands)
export abstract class DOMCommand { export abstract class DOMCommand {
@ -694,7 +694,7 @@ export class InsertFilesCommand extends DOMCommand {
private async generateThumbnailsForInsertedPages(updatedDocument: PDFDocument): Promise<void> { private async generateThumbnailsForInsertedPages(updatedDocument: PDFDocument): Promise<void> {
try { try {
const { thumbnailGenerationService } = await import('../../../services/thumbnailGenerationService'); const { thumbnailGenerationService } = await import('@app/services/thumbnailGenerationService');
// Group pages by file ID to generate thumbnails efficiently // Group pages by file ID to generate thumbnails efficiently
const pagesByFileId = new Map<FileId, PDFPage[]>(); const pagesByFileId = new Map<FileId, PDFPage[]>();
@ -776,7 +776,7 @@ export class InsertFilesCommand extends DOMCommand {
const clonedArrayBuffer = arrayBuffer.slice(0); const clonedArrayBuffer = arrayBuffer.slice(0);
// Use PDF.js via the worker manager to extract pages // Use PDF.js via the worker manager to extract pages
const { pdfWorkerManager } = await import('../../../services/pdfWorkerManager'); const { pdfWorkerManager } = await import('@app/services/pdfWorkerManager');
const pdf = await pdfWorkerManager.createDocument(clonedArrayBuffer); const pdf = await pdfWorkerManager.createDocument(clonedArrayBuffer);
const pageCount = pdf.numPages; const pageCount = pdf.numPages;

View File

@ -1,7 +1,7 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useFileState } from '../../../contexts/FileContext'; import { useFileState } from '@app/contexts/FileContext';
import { PDFDocument, PDFPage } from '../../../types/pageEditor'; import { PDFDocument, PDFPage } from '@app/types/pageEditor';
import { FileId } from '../../../types/file'; import { FileId } from '@app/types/file';
export interface PageDocumentHook { export interface PageDocumentHook {
document: PDFDocument | null; document: PDFDocument | null;

View File

@ -1,8 +1,8 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useRightRailButtons, RightRailButtonWithAction } from '../../hooks/useRightRailButtons'; import { useRightRailButtons, RightRailButtonWithAction } from '@app/hooks/useRightRailButtons';
import LocalIcon from '../shared/LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import PageSelectByNumberButton from './PageSelectByNumberButton'; import PageSelectByNumberButton from '@app/components/pageEditor/PageSelectByNumberButton';
interface PageEditorRightRailButtonsParams { interface PageEditorRightRailButtonsParams {
totalPages: number; totalPages: number;

View File

@ -1,9 +1,9 @@
import { Modal, Stack, Button, Text, Title, Anchor } from '@mantine/core'; import { Modal, Stack, Button, Text, Title, Anchor } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useState } from 'react'; import { useState } from 'react';
import { Z_ANALYTICS_MODAL } from '../../styles/zIndex'; import { Z_ANALYTICS_MODAL } from '@app/styles/zIndex';
import { useAppConfig } from '../../contexts/AppConfigContext'; import { useAppConfig } from '@app/contexts/AppConfigContext';
import apiClient from '../../services/apiClient'; import apiClient from '@app/services/apiClient';
interface AdminAnalyticsChoiceModalProps { interface AdminAnalyticsChoiceModalProps {
opened: boolean; opened: boolean;

View File

@ -1,11 +1,11 @@
import React from 'react'; import React from 'react';
import { ActionIcon } from '@mantine/core'; import { ActionIcon } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Tooltip } from './Tooltip'; import { Tooltip } from '@app/components/shared/Tooltip';
import AppsIcon from '@mui/icons-material/AppsRounded'; import AppsIcon from '@mui/icons-material/AppsRounded';
import { useToolWorkflow } from '../../contexts/ToolWorkflowContext'; import { useToolWorkflow } from '@app/contexts/ToolWorkflowContext';
import { useSidebarNavigation } from '../../hooks/useSidebarNavigation'; import { useSidebarNavigation } from '@app/hooks/useSidebarNavigation';
import { handleUnlessSpecialClick } from '../../utils/clickHandlers'; import { handleUnlessSpecialClick } from '@app/utils/clickHandlers';
interface AllToolsNavButtonProps { interface AllToolsNavButtonProps {
activeButton: string; activeButton: string;

View File

@ -1,12 +1,12 @@
import React, { useMemo, useState, useEffect } from 'react'; import React, { useMemo, useState, useEffect } from 'react';
import { Modal, Text, ActionIcon } from '@mantine/core'; import { Modal, Text, ActionIcon } from '@mantine/core';
import { useMediaQuery } from '@mantine/hooks'; import { useMediaQuery } from '@mantine/hooks';
import LocalIcon from './LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import Overview from './config/configSections/Overview'; import Overview from '@app/components/shared/config/configSections/Overview';
import { createConfigNavSections } from './config/configNavSections'; import { createConfigNavSections } from '@app/components/shared/config/configNavSections';
import { NavKey } from './config/types'; import { NavKey } from '@app/components/shared/config/types';
import './AppConfigModal.css'; import '@app/components/shared/AppConfigModal.css';
import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '../../styles/zIndex'; import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '@app/styles/zIndex';
interface AppConfigModalProps { interface AppConfigModalProps {
opened: boolean; opened: boolean;

View File

@ -1,7 +1,7 @@
import { describe, expect, test, vi, beforeEach } from 'vitest'; import { describe, expect, test, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react'; import { render, screen, fireEvent } from '@testing-library/react';
import { MantineProvider } from '@mantine/core'; import { MantineProvider } from '@mantine/core';
import ButtonSelector from './ButtonSelector'; import ButtonSelector from '@app/components/shared/ButtonSelector';
// Wrapper component to provide Mantine context // Wrapper component to provide Mantine context
const TestWrapper = ({ children }: { children: React.ReactNode }) => ( const TestWrapper = ({ children }: { children: React.ReactNode }) => (

View File

@ -1,5 +1,5 @@
import { Button, Group, Stack, Text } from "@mantine/core"; import { Button, Group, Stack, Text } from "@mantine/core";
import FitText from "./FitText"; import FitText from "@app/components/shared/FitText";
export interface ButtonOption<T> { export interface ButtonOption<T> {
value: T; value: T;

View File

@ -1,5 +1,5 @@
import { Stack, Card, Text, Flex } from '@mantine/core'; import { Stack, Card, Text, Flex } from '@mantine/core';
import { Tooltip } from './Tooltip'; import { Tooltip } from '@app/components/shared/Tooltip';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
export interface CardOption<T = string> { export interface CardOption<T = string> {

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
import { Button, Group } from '@mantine/core'; import { Button, Group } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFileState } from '../../contexts/FileContext'; import { useFileState } from '@app/contexts/FileContext';
import { useFileActions } from '../../contexts/file/fileHooks'; import { useFileActions } from '@app/contexts/file/fileHooks';
import CloseIcon from '@mui/icons-material/Close'; import CloseIcon from '@mui/icons-material/Close';
interface DismissAllErrorsButtonProps { interface DismissAllErrorsButtonProps {

View File

@ -6,9 +6,9 @@ import StorageIcon from "@mui/icons-material/Storage";
import VisibilityIcon from "@mui/icons-material/Visibility"; import VisibilityIcon from "@mui/icons-material/Visibility";
import EditIcon from "@mui/icons-material/Edit"; import EditIcon from "@mui/icons-material/Edit";
import { StirlingFileStub } from "../../types/fileContext"; import { StirlingFileStub } from "@app/types/fileContext";
import { getFileSize, getFileDate } from "../../utils/fileUtils"; import { getFileSize, getFileDate } from "@app/utils/fileUtils";
import { useIndexedDBThumbnail } from "../../hooks/useIndexedDBThumbnail"; import { useIndexedDBThumbnail } from "@app/hooks/useIndexedDBThumbnail";
interface FileCardProps { interface FileCardProps {
file: File; file: File;

View File

@ -2,7 +2,7 @@ import React from 'react';
import { Menu, Loader, Group, Text } from '@mantine/core'; import { Menu, Loader, Group, Text } from '@mantine/core';
import VisibilityIcon from '@mui/icons-material/Visibility'; import VisibilityIcon from '@mui/icons-material/Visibility';
import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
import FitText from './FitText'; import FitText from '@app/components/shared/FitText';
interface FileDropdownMenuProps { interface FileDropdownMenuProps {
displayName: string; displayName: string;

View File

@ -3,9 +3,9 @@ import { Box, Flex, Group, Text, Button, TextInput, Select } from "@mantine/core
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import SearchIcon from "@mui/icons-material/Search"; import SearchIcon from "@mui/icons-material/Search";
import SortIcon from "@mui/icons-material/Sort"; import SortIcon from "@mui/icons-material/Sort";
import FileCard from "./FileCard"; import FileCard from "@app/components/shared/FileCard";
import { StirlingFileStub } from "../../types/fileContext"; import { StirlingFileStub } from "@app/types/fileContext";
import { FileId } from "../../types/file"; import { FileId } from "@app/types/file";
interface FileGridProps { interface FileGridProps {
files: Array<{ file: File; record?: StirlingFileStub }>; files: Array<{ file: File; record?: StirlingFileStub }>;

View File

@ -15,7 +15,7 @@ import {
} from '@mantine/core'; } from '@mantine/core';
import PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf'; import PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { FileId } from '../../types/file'; import { FileId } from '@app/types/file';
interface FilePickerModalProps { interface FilePickerModalProps {
opened: boolean; opened: boolean;

View File

@ -1,11 +1,11 @@
import React from 'react'; import React from 'react';
import { Box, Center } from '@mantine/core'; import { Box, Center } from '@mantine/core';
import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
import { StirlingFileStub } from '../../types/fileContext'; import { StirlingFileStub } from '@app/types/fileContext';
import DocumentThumbnail from './filePreview/DocumentThumbnail'; import DocumentThumbnail from '@app/components/shared/filePreview/DocumentThumbnail';
import DocumentStack from './filePreview/DocumentStack'; import DocumentStack from '@app/components/shared/filePreview/DocumentStack';
import HoverOverlay from './filePreview/HoverOverlay'; import HoverOverlay from '@app/components/shared/filePreview/HoverOverlay';
import NavigationArrows from './filePreview/NavigationArrows'; import NavigationArrows from '@app/components/shared/filePreview/NavigationArrows';
export interface FilePreviewProps { export interface FilePreviewProps {
// Core file data // Core file data

View File

@ -1,5 +1,5 @@
import React, { CSSProperties, useMemo, useRef } from 'react'; import React, { CSSProperties, useMemo, useRef } from 'react';
import { useAdjustFontSizeToFit } from './fitText/textFit'; import { useAdjustFontSizeToFit } from '@app/components/shared/fitText/textFit';
type FitTextProps = { type FitTextProps = {
text: string; text: string;

View File

@ -1,6 +1,6 @@
import { Flex } from '@mantine/core'; import { Flex } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useCookieConsent } from '../../hooks/useCookieConsent'; import { useCookieConsent } from '@app/hooks/useCookieConsent';
interface FooterProps { interface FooterProps {
privacyPolicy?: string; privacyPolicy?: string;

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { ActionIcon, Tooltip } from '@mantine/core'; import { ActionIcon, Tooltip } from '@mantine/core';
import styles from './HoverActionMenu.module.css'; import styles from '@app/components/shared/HoverActionMenu.module.css';
export interface HoverAction { export interface HoverAction {
id: string; id: string;

View File

@ -1,11 +1,11 @@
import React from 'react'; import React from 'react';
import { Container, Button, Group, useMantineColorScheme } from '@mantine/core'; import { Container, Button, Group, useMantineColorScheme } from '@mantine/core';
import { Dropzone } from '@mantine/dropzone'; import { Dropzone } from '@mantine/dropzone';
import LocalIcon from './LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFileHandler } from '../../hooks/useFileHandler'; import { useFileHandler } from '@app/hooks/useFileHandler';
import { useFilesModalContext } from '../../contexts/FilesModalContext'; import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import { BASE_PATH } from '../../constants/app'; import { BASE_PATH } from '@app/constants/app';
const LandingPage = () => { const LandingPage = () => {
const { addFiles } = useFileHandler(); const { addFiles } = useFileHandler();

View File

@ -1,10 +1,10 @@
import React, { useState, useEffect } from 'react'; import React, { useState, useEffect } from 'react';
import { Menu, Button, ScrollArea, ActionIcon, Tooltip } from '@mantine/core'; import { Menu, Button, ScrollArea, ActionIcon, Tooltip } from '@mantine/core';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { supportedLanguages } from '../../i18n'; import { supportedLanguages } from '@app/i18n';
import LocalIcon from './LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import styles from './LanguageSelector.module.css'; import styles from '@app/components/shared/LanguageSelector.module.css';
import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '../../styles/zIndex'; import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '@app/styles/zIndex';
// Types // Types
interface LanguageSelectorProps { interface LanguageSelectorProps {

View File

@ -0,0 +1,19 @@
/**
* Loading fallback component for i18next suspense
*/
export function LoadingFallback() {
return (
<div
style={{
display: "flex",
justifyContent: "center",
alignItems: "center",
height: "100vh",
fontSize: "18px",
color: "#666",
}}
>
Loading...
</div>
);
}

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { addCollection, Icon } from '@iconify/react'; import { addCollection, Icon } from '@iconify/react';
import iconSet from '../../assets/material-symbols-icons.json'; import iconSet from '../../../assets/material-symbols-icons.json';
// Load icons synchronously at import time - guaranteed to be ready on first render // Load icons synchronously at import time - guaranteed to be ready on first render
let iconsLoaded = false; let iconsLoaded = false;

View File

@ -1,5 +1,5 @@
import { Modal, Text, Button, Group, Stack } from "@mantine/core"; import { Modal, Text, Button, Group, Stack } from "@mantine/core";
import { useNavigationGuard } from "../../contexts/NavigationContext"; import { useNavigationGuard } from "@app/contexts/NavigationContext";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline";

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import styles from './ObscuredOverlay/ObscuredOverlay.module.css'; import styles from '@app/components/shared/ObscuredOverlay/ObscuredOverlay.module.css';
type ObscuredOverlayProps = { type ObscuredOverlayProps = {
obscured: boolean; obscured: boolean;

View File

@ -1,25 +1,25 @@
import React, { useState, useRef, forwardRef, useEffect } from "react"; import React, { useState, useRef, forwardRef, useEffect } from "react";
import { ActionIcon, Stack, Divider } from "@mantine/core"; import { ActionIcon, Stack, Divider } from "@mantine/core";
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import LocalIcon from './LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { useRainbowThemeContext } from "./RainbowThemeProvider"; import { useRainbowThemeContext } from "@app/components/shared/RainbowThemeProvider";
import { useIsOverflowing } from '../../hooks/useIsOverflowing'; import { useIsOverflowing } from '@app/hooks/useIsOverflowing';
import { useFilesModalContext } from '../../contexts/FilesModalContext'; import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import { useToolWorkflow } from '../../contexts/ToolWorkflowContext'; import { useToolWorkflow } from '@app/contexts/ToolWorkflowContext';
import { useSidebarNavigation } from '../../hooks/useSidebarNavigation'; import { useSidebarNavigation } from '@app/hooks/useSidebarNavigation';
import { handleUnlessSpecialClick } from '../../utils/clickHandlers'; import { handleUnlessSpecialClick } from '@app/utils/clickHandlers';
import { ButtonConfig } from '../../types/sidebar'; import { ButtonConfig } from '@app/types/sidebar';
import './quickAccessBar/QuickAccessBar.css'; import '@app/components/shared/quickAccessBar/QuickAccessBar.css';
import AllToolsNavButton from './AllToolsNavButton'; import AllToolsNavButton from '@app/components/shared/AllToolsNavButton';
import ActiveToolButton from "./quickAccessBar/ActiveToolButton"; import ActiveToolButton from "@app/components/shared/quickAccessBar/ActiveToolButton";
import AppConfigModal from './AppConfigModal'; import AppConfigModal from '@app/components/shared/AppConfigModal';
import { useAppConfig } from '../../contexts/AppConfigContext'; import { useAppConfig } from '@app/contexts/AppConfigContext';
import { useOnboarding } from '../../contexts/OnboardingContext'; import { useOnboarding } from '@app/contexts/OnboardingContext';
import { import {
isNavButtonActive, isNavButtonActive,
getNavButtonStyle, getNavButtonStyle,
getActiveNavButton, getActiveNavButton,
} from './quickAccessBar/QuickAccessBar'; } from '@app/components/shared/quickAccessBar/QuickAccessBar';
const QuickAccessBar = forwardRef<HTMLDivElement>((_, ref) => { const QuickAccessBar = forwardRef<HTMLDivElement>((_, ref) => {
const { t } = useTranslation(); const { t } = useTranslation();

View File

@ -1,12 +1,12 @@
import { createContext, useContext, ReactNode } from 'react'; import { createContext, useContext, ReactNode } from 'react';
import { MantineProvider } from '@mantine/core'; import { MantineProvider } from '@mantine/core';
import { useRainbowTheme } from '../../hooks/useRainbowTheme'; import { useRainbowTheme } from '@app/hooks/useRainbowTheme';
import { mantineTheme } from '../../theme/mantineTheme'; import { mantineTheme } from '@app/theme/mantineTheme';
import rainbowStyles from '../../styles/rainbow.module.css'; import rainbowStyles from '@app/styles/rainbow.module.css';
import { ToastProvider } from '../toast'; import { ToastProvider } from '@app/components/toast';
import ToastRenderer from '../toast/ToastRenderer'; import ToastRenderer from '@app/components/toast/ToastRenderer';
import { ToastPortalBinder } from '../toast'; import { ToastPortalBinder } from '@app/components/toast';
import type { ThemeMode } from '../../constants/theme'; import type { ThemeMode } from '@app/constants/theme';
interface RainbowThemeContextType { interface RainbowThemeContextType {
themeMode: ThemeMode; themeMode: ThemeMode;

View File

@ -1,21 +1,21 @@
import React, { useCallback, useMemo } from 'react'; import React, { useCallback, useMemo } from 'react';
import { ActionIcon, Divider } from '@mantine/core'; import { ActionIcon, Divider } from '@mantine/core';
import './rightRail/RightRail.css'; import '@app/components/shared/rightRail/RightRail.css';
import { useToolWorkflow } from '../../contexts/ToolWorkflowContext'; import { useToolWorkflow } from '@app/contexts/ToolWorkflowContext';
import { useRightRail } from '../../contexts/RightRailContext'; import { useRightRail } from '@app/contexts/RightRailContext';
import { useFileState, useFileSelection } from '../../contexts/FileContext'; import { useFileState, useFileSelection } from '@app/contexts/FileContext';
import { useNavigationState } from '../../contexts/NavigationContext'; import { useNavigationState } from '@app/contexts/NavigationContext';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import LanguageSelector from '../shared/LanguageSelector'; import LanguageSelector from '@app/components/shared/LanguageSelector';
import { useRainbowThemeContext } from '../shared/RainbowThemeProvider'; import { useRainbowThemeContext } from '@app/components/shared/RainbowThemeProvider';
import { Tooltip } from '../shared/Tooltip'; import { Tooltip } from '@app/components/shared/Tooltip';
import { ViewerContext } from '../../contexts/ViewerContext'; import { ViewerContext } from '@app/contexts/ViewerContext';
import { useSignature } from '../../contexts/SignatureContext'; import { useSignature } from '@app/contexts/SignatureContext';
import LocalIcon from './LocalIcon'; import LocalIcon from '@app/components/shared/LocalIcon';
import { useSidebarContext } from '../../contexts/SidebarContext'; import { useSidebarContext } from '@app/contexts/SidebarContext';
import { RightRailButtonConfig, RightRailRenderContext, RightRailSection } from '../../types/rightRail'; import { RightRailButtonConfig, RightRailRenderContext, RightRailSection } from '@app/types/rightRail';
const SECTION_ORDER: RightRailSection[] = ['top', 'middle', 'bottom']; const SECTION_ORDER: RightRailSection[] = ['top', 'middle', 'bottom'];

Some files were not shown because too many files have changed in this diff Show More