From 3e23dc59b66c05a5ab3afd9aa4e7e9f4a7dfcfc0 Mon Sep 17 00:00:00 2001 From: James Brunton Date: Mon, 20 Oct 2025 15:07:40 +0100 Subject: [PATCH] Add onboarding flow using Reactour (#4635) # Description of Changes Add onboarding flow --- frontend/package-lock.json | 723 +++++++++++++++++- frontend/package.json | 3 + .../public/locales/en-GB/translation.json | 43 +- frontend/public/samples/Sample.pdf | Bin 0 -> 264772 bytes frontend/scripts/sample-pdf/generate.mjs | 105 +++ frontend/scripts/sample-pdf/styles.css | 432 +++++++++++ frontend/scripts/sample-pdf/template.html | 234 ++++++ frontend/src/App.tsx | 46 +- .../fileEditor/FileEditorThumbnail.tsx | 6 +- .../components/fileManager/DesktopLayout.tsx | 2 +- frontend/src/components/layout/Workbench.tsx | 1 + .../components/onboarding/OnboardingTour.css | 8 + .../components/onboarding/OnboardingTour.tsx | 331 ++++++++ .../onboarding/TourWelcomeModal.tsx | 82 ++ .../src/components/shared/AppConfigModal.tsx | 2 +- frontend/src/components/shared/FileCard.tsx | 1 + .../src/components/shared/QuickAccessBar.tsx | 89 ++- frontend/src/components/shared/RightRail.tsx | 4 +- .../src/components/shared/TopControls.tsx | 3 +- .../shared/config/configNavSections.tsx | 4 +- .../shared/quickAccessBar/QuickAccessBar.css | 1 + .../tools/FullscreenToolSurface.tsx | 1 + frontend/src/components/tools/ToolPanel.tsx | 3 +- .../tools/crop/CropAreaSelector.tsx | 3 +- .../components/tools/crop/CropSettings.tsx | 15 +- .../tools/fullscreen/CompactToolItem.tsx | 1 + .../tools/fullscreen/DetailedToolItem.tsx | 1 + .../tools/shared/OperationButton.tsx | 5 +- .../tools/shared/createToolFlow.tsx | 1 + .../tools/toolPicker/ToolButton.tsx | 31 +- frontend/src/contexts/OnboardingContext.tsx | 80 ++ .../src/contexts/TourOrchestrationContext.tsx | 207 +++++ frontend/src/services/preferencesService.ts | 2 + frontend/src/tools/Crop.tsx | 2 +- 34 files changed, 2381 insertions(+), 91 deletions(-) create mode 100644 frontend/public/samples/Sample.pdf create mode 100755 frontend/scripts/sample-pdf/generate.mjs create mode 100644 frontend/scripts/sample-pdf/styles.css create mode 100644 frontend/scripts/sample-pdf/template.html create mode 100644 frontend/src/components/onboarding/OnboardingTour.css create mode 100644 frontend/src/components/onboarding/OnboardingTour.tsx create mode 100644 frontend/src/components/onboarding/TourWelcomeModal.tsx create mode 100644 frontend/src/contexts/OnboardingContext.tsx create mode 100644 frontend/src/contexts/TourOrchestrationContext.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e74347837e..387138b056 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -37,6 +37,7 @@ "@mantine/hooks": "^8.3.1", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", + "@reactour/tour": "^3.8.0", "@tailwindcss/postcss": "^4.1.13", "@tanstack/react-virtual": "^3.13.12", "autoprefixer": "^10.4.21", @@ -87,6 +88,7 @@ "postcss-cli": "^11.0.1", "postcss-preset-mantine": "^1.18.0", "postcss-simple-vars": "^7.0.1", + "puppeteer": "^24.25.0", "typescript": "^5.9.2", "typescript-eslint": "^8.44.1", "vite": "^7.1.7", @@ -2554,6 +2556,79 @@ "integrity": "sha512-igElrcnRPJh2nWYACschjH4OwGwzSa6xVFzRDVzpnjirUivdJ8nv4hE+H31nvwE56MFhvvglfHuotnWLMcRW7w==", "license": "MIT" }, + "node_modules/@puppeteer/browsers": { + "version": "2.10.12", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.12.tgz", + "integrity": "sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.3", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@reactour/mask": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reactour/mask/-/mask-1.2.0.tgz", + "integrity": "sha512-XLgBLWfKJybtZjNTSO5lt/SIvRlCZBadB6JfE/hO1ErqURRjYhnv+edC0Ki1haUCqMGFppWk3lwcPCjmK0xNog==", + "license": "MIT", + "dependencies": { + "@reactour/utils": "*" + }, + "peerDependencies": { + "react": "16.x || 17.x || 18.x || 19.x" + } + }, + "node_modules/@reactour/popover": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@reactour/popover/-/popover-1.3.0.tgz", + "integrity": "sha512-YdyjSmHPvEeQEcJM4gcGFa5pI/Yf4nZGqwG4JnT+rK1SyUJBIPnm4Gkl/h7/+1g0KCFMkwNwagS3ZiXvZB7ThA==", + "license": "MIT", + "dependencies": { + "@reactour/utils": "*" + }, + "peerDependencies": { + "react": "16.x || 17.x || 18.x || 19.x" + } + }, + "node_modules/@reactour/tour": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@reactour/tour/-/tour-3.8.0.tgz", + "integrity": "sha512-KZTFi1pAvoTVKKRdBN5+XCYxXBp4k4Ql/acZcXyPvec8VU24fkMSEeV+v8krfYQpoVcewxIu3gM6xWZZLjxi7w==", + "license": "MIT", + "dependencies": { + "@reactour/mask": "*", + "@reactour/popover": "*", + "@reactour/utils": "*" + }, + "peerDependencies": { + "react": "16.x || 17.x || 18.x || 19.x" + } + }, + "node_modules/@reactour/utils": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@reactour/utils/-/utils-0.6.0.tgz", + "integrity": "sha512-GqaLjQi7MJsgtAKjdiw2Eak1toFkADoLRnm1+HZpaD+yl+DkaHpC1N7JAl+kVOO5I17bWInPA+OFbXjO9Co8Qg==", + "license": "MIT", + "dependencies": { + "@rooks/use-mutation-observer": "^4.11.2", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": "16.x || 17.x || 18.x || 19.x" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.35", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz", @@ -2869,6 +2944,15 @@ "win32" ] }, + "node_modules/@rooks/use-mutation-observer": { + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@rooks/use-mutation-observer/-/use-mutation-observer-4.11.2.tgz", + "integrity": "sha512-vpsdrZdr6TkB1zZJcHx+fR1YC/pHs2BaqcuYiEGjBVbwY5xcC49+h0hAUtQKHth3oJqXfIX/Ng8S7s5HFHdM/A==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -3502,6 +3586,13 @@ "@testing-library/dom": ">=7.21.4" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, "node_modules/@ts-graphviz/adapter": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.6.tgz", @@ -3734,6 +3825,17 @@ "@types/react": "*" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.44.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", @@ -4428,6 +4530,26 @@ "node": ">=18" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/ast-v8-to-istanbul": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", @@ -4510,6 +4632,21 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -4532,6 +4669,103 @@ "dev": true, "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz", + "integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.11.tgz", + "integrity": "sha512-Bejmm9zRMvMTRoHS+2adgmXw1ANZnCNx+B5dgZpGwlP1E3x6Yuxea8RToddHUbWtVV0iUMWqsgZr8+jcgUI2SA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.0.tgz", + "integrity": "sha512-c+RCqMSZbkz97Mw1LWR0gcOqwK82oyYKfLoHJ8k13ybi1+I80ffdDzUy0TdAburdrR/kI0/VuN8YgEnJqX+Nyw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -4562,6 +4796,16 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/bidi-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", @@ -4699,6 +4943,16 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4879,6 +5133,20 @@ "node": ">=18" } }, + "node_modules/chromium-bidi": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", + "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -5138,6 +5406,16 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/data-urls": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.0.tgz", @@ -5269,6 +5547,21 @@ "node": ">=10" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5483,6 +5776,13 @@ "typescript": "^5.4.4" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1508733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz", + "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -5545,6 +5845,16 @@ "dev": true, "license": "MIT" }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -5571,6 +5881,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/eol": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/eol/-/eol-0.10.0.tgz", @@ -5989,6 +6309,16 @@ "node": ">=0.10.0" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/expect-type": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", @@ -6006,6 +6336,43 @@ "dev": true, "license": "MIT" }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6013,6 +6380,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -6067,6 +6441,16 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fflate": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", @@ -6445,6 +6829,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6900,6 +7299,16 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8056,6 +8465,13 @@ "node": ">= 18" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -8178,6 +8594,16 @@ "dev": true, "license": "MIT" }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -8480,6 +8906,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -8663,6 +9123,13 @@ "@napi-rs/canvas": "^0.1.77" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9178,6 +9645,16 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -9195,12 +9672,53 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9211,6 +9729,74 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "24.25.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.25.0.tgz", + "integrity": "sha512-P3rUaom2w/Ubrnz3v3kSbxGkN7SpbtQeGRPb7iO86Bv/dAz2WUmGQBHr37W/Rp1fbAocMvu0rHFbCIJvjiNhGw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.12", + "chromium-bidi": "9.1.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1508733", + "puppeteer-core": "24.25.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.25.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.25.0.tgz", + "integrity": "sha512-8Xs6q3Ut+C8y7sAaqjIhzv1QykGWG4gc2mEZ2mYE7siZFuRp4xQVehOf8uQKSQAkeL7jXUs3mknEeiqnRqUKvQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.12", + "chromium-bidi": "9.1.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1508733", + "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.3.7", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/quansync": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", @@ -9699,6 +10285,12 @@ "node": ">=10.13.0" } }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -9917,9 +10509,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -10023,6 +10615,47 @@ "node": "*" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -10145,6 +10778,18 @@ "any-promise": "^1.1.0" } }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -10424,6 +11069,33 @@ "node": ">=18" } }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/test-exclude": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", @@ -10460,6 +11132,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -10719,6 +11401,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, "node_modules/typescript": { "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", @@ -11273,6 +11962,13 @@ "integrity": "sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==", "license": "Apache-2.0" }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.7.tgz", + "integrity": "sha512-wIx5Gu/LLTeexxilpk8WxU2cpGAKlfbWRO5h+my6EMD1k5PYqM1qQO1MHUFf4f3KRnhBvpbZU7VkizAgeSEf7g==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz", @@ -11507,6 +12203,17 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -11519,6 +12226,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/frontend/package.json b/frontend/package.json index f111844714..a508f7f9bb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -33,6 +33,7 @@ "@mantine/hooks": "^8.3.1", "@mui/icons-material": "^7.3.2", "@mui/material": "^7.3.2", + "@reactour/tour": "^3.8.0", "@tailwindcss/postcss": "^4.1.13", "@tanstack/react-virtual": "^3.13.12", "autoprefixer": "^10.4.21", @@ -66,6 +67,7 @@ "generate-licenses": "node scripts/generate-licenses.js", "generate-icons": "node scripts/generate-icons.js", "generate-icons:verbose": "node scripts/generate-icons.js --verbose", + "generate-sample-pdf": "node scripts/sample-pdf/generate.mjs", "test": "vitest", "test:run": "vitest run", "test:watch": "vitest --watch", @@ -126,6 +128,7 @@ "postcss-cli": "^11.0.1", "postcss-preset-mantine": "^1.18.0", "postcss-simple-vars": "^7.0.1", + "puppeteer": "^24.25.0", "typescript": "^5.9.2", "typescript-eslint": "^8.44.1", "vite": "^7.1.7", diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json index 20c3590e89..5cb16aacdc 100644 --- a/frontend/public/locales/en-GB/translation.json +++ b/frontend/public/locales/en-GB/translation.json @@ -94,8 +94,8 @@ "save": "Save", "saveToBrowser": "Save to Browser", "download": "Download", - "pin": "Pin", - "unpin": "Unpin", + "pin": "Pin File (keep active after tool run)", + "unpin": "Unpin File (replace after tool run)", "undoOperationTooltip": "Click to undo the last operation and restore the original files", "undo": "Undo", "moreOptions": "More Options", @@ -455,6 +455,9 @@ "alphabetical": "Alphabetical", "globalPopularity": "Global Popularity", "sortBy": "Sort by:", + "mobile": { + "brandAlt": "Stirling PDF logo" + }, "multiTool": { "tags": "multiple,tools", "title": "PDF Multi Tool", @@ -3469,6 +3472,7 @@ "automate": "Automate", "files": "Files", "activity": "Activity", + "help": "Help", "account": "Account", "config": "Config", "allTools": "All Tools" @@ -3969,5 +3973,38 @@ "undoQuotaError": "Cannot undo: insufficient storage space", "undoStorageError": "Undo completed but some files could not be saved to storage", "undoSuccess": "Operation undone successfully", - "unsupported": "Unsupported" + "unsupported": "Unsupported", + "onboarding": { + "welcomeModal": { + "title": "Welcome to Stirling PDF!", + "description": "Would you like to take a quick 1-minute tour to learn the key features and how to get started?", + "helpHint": "You can always access this tour later from the Help button in the bottom left.", + "startTour": "Start Tour", + "maybeLater": "Maybe Later", + "dontShowAgain": "Don't Show Again" + }, + "allTools": "This is the All Tools panel, where you can browse and select from all available PDF tools.", + "selectCropTool": "Let's select the Crop tool to demonstrate how to use one of the tools.", + "toolInterface": "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet.", + "filesButton": "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on.", + "fileSources": "You can upload new files or access recent files from here. For the tour, we'll just use a sample file.", + "workbench": "This is the Workbench - the main area where you view and edit your PDFs.", + "viewSwitcher": "Use these controls to select how you want to view your PDFs.", + "viewer": "The Viewer lets you read and annotate your PDFs.", + "pageEditor": "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting.", + "activeFiles": "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process.", + "fileCheckbox": "Clicking one of the files selects it for processing. You can select multiple files for batch operations.", + "selectControls": "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language.", + "cropSettings": "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to.", + "runButton": "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs.", + "results": "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. ", + "fileReplacement": "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools.", + "pinButton": "You can use the Pin button if you'd rather your files stay active after running tools on them.", + "wrapUp": "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again.", + "previous": "Previous", + "next": "Next", + "finish": "Finish", + "startTour": "Start Tour", + "startTourDescription": "Take a guided tour of Stirling PDF's key features" + } } diff --git a/frontend/public/samples/Sample.pdf b/frontend/public/samples/Sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d78d9e1efd4bf65b9a01c47f05c2c9f6f51637fc GIT binary patch literal 264772 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 { + console.error('Fatal error:', error); + process.exit(1); +}); diff --git a/frontend/scripts/sample-pdf/styles.css b/frontend/scripts/sample-pdf/styles.css new file mode 100644 index 0000000000..067452833c --- /dev/null +++ b/frontend/scripts/sample-pdf/styles.css @@ -0,0 +1,432 @@ +/* Stirling PDF Sample Document Styles */ + +:root { + /* Brand Colors */ + --brand-red: #8e3231; + --brand-blue: #3b82f6; + + /* Category Colors */ + --color-general: #3b82f6; + --color-security: #f59e0b; + --color-formatting: #8b5cf6; + --color-automation: #ec4899; + + /* Neutral Colors */ + --color-black: #111827; + --color-gray-dark: #4b5563; + --color-gray-medium: #6b7280; + --color-gray-light: #e5e7eb; + --color-gray-lighter: #f3f4f6; + --color-white: #ffffff; + + /* Font Stack */ + --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-family); + color: var(--color-black); + line-height: 1.6; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Page Structure - A4 Dimensions */ +.page { + width: 210mm; + height: 297mm; + background: white; + page-break-after: always; + position: relative; + overflow: hidden; +} + +.page:last-child { + page-break-after: auto; +} + +/* Page 1: Hero / Cover */ +.page-1 { + background: var(--brand-red); + display: flex; + align-items: center; + justify-content: center; + position: relative; + overflow: hidden; +} + +/* Decorative shapes container */ +.decorative-shapes { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 0; +} + +.shape { + position: absolute; +} + +/* Logo SVG shape - top-right */ +.shape-1 { + top: -120px; + right: -100px; + width: 450px; + height: auto; + opacity: 0.12; +} + +/* Logo SVG shape - top-left */ +.shape-2 { + top: -80px; + left: -80px; + width: 350px; + height: auto; + opacity: 0.08; +} + +/* Logo SVG shape - bottom-left */ +.shape-3 { + bottom: -180px; + left: -150px; + width: 550px; + height: auto; + opacity: 0.15; +} + +/* Logo SVG shape - bottom-right */ +.shape-4 { + bottom: -100px; + right: -120px; + width: 400px; + height: auto; + opacity: 0.1; +} + +/* Small accent shape center-right */ +.shape-5 { + top: 50%; + right: -30px; + width: 200px; + height: auto; + opacity: 0.08; + transform: translateY(-50%); +} + +.hero-content { + text-align: center; + padding: 60px; + position: relative; + z-index: 1; +} + +.logo-container { + margin-bottom: 48px; + position: relative; +} + +.hero-logo { + width: 280px; + height: auto; +} + +.hero-tagline { + font-size: 32px; + font-weight: 600; + color: var(--color-white); + margin-bottom: 32px; + line-height: 1.3; +} + +.hero-stats { + margin-bottom: 40px; +} + +.stat-badge { + display: inline-flex; + flex-direction: column; + align-items: center; + padding: 24px 48px; + background: rgba(255, 255, 255, 0.95); + border-radius: 16px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); +} + +.stat-number { + font-size: 48px; + font-weight: 700; + color: var(--brand-red); + line-height: 1; +} + +.stat-label { + font-size: 18px; + color: var(--color-gray-dark); + margin-top: 8px; + font-weight: 500; +} + +.hero-features { + display: flex; + justify-content: center; + gap: 16px; + flex-wrap: wrap; +} + +.feature-pill { + padding: 12px 24px; + background: rgba(255, 255, 255, 0.2); + color: white; + border-radius: 24px; + font-size: 16px; + font-weight: 500; + border: 2px solid rgba(255, 255, 255, 0.3); + backdrop-filter: blur(10px); +} + +/* Page 2: What is Stirling PDF */ +.page-2 { + padding: 60px; +} + +.content-wrapper { + max-width: 700px; + margin: 0 auto; +} + +.page-title { + font-size: 36px; + font-weight: 700; + color: var(--brand-red); + margin-bottom: 24px; + border-bottom: 4px solid var(--brand-red); + padding-bottom: 16px; +} + +.intro-text { + font-size: 16px; + color: var(--color-gray-dark); + margin-bottom: 48px; + line-height: 1.8; +} + +.value-props { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 32px; +} + +.value-prop { + display: flex; + flex-direction: column; + gap: 12px; +} + +.value-icon { + width: 48px; + height: 48px; + color: var(--brand-red); + margin-bottom: 8px; +} + +.value-icon svg { + width: 100%; + height: 100%; +} + +.value-prop h3 { + font-size: 20px; + font-weight: 600; + color: var(--color-black); +} + +.value-prop p { + font-size: 14px; + color: var(--color-gray-dark); + line-height: 1.6; +} + +/* Page 3: Key Features */ +.page-3 { + padding: 60px; +} + +.features-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; + margin-bottom: 32px; +} + +.feature-card { + background: white; + border: 2px solid var(--color-gray-light); + border-radius: 12px; + padding: 24px; + transition: all 0.2s ease; +} + +.feature-card[data-category="general"] { + border-color: var(--color-general); +} + +.feature-card[data-category="security"] { + border-color: var(--color-security); +} + +.feature-card[data-category="formatting"] { + border-color: var(--color-formatting); +} + +.feature-card[data-category="automation"] { + border-color: var(--color-automation); +} + +.feature-header { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 16px; +} + +.feature-icon-large { + width: 40px; + height: 40px; + flex-shrink: 0; +} + +.feature-card[data-category="general"] .feature-icon-large { + color: var(--color-general); +} + +.feature-card[data-category="security"] .feature-icon-large { + color: var(--color-security); +} + +.feature-card[data-category="formatting"] .feature-icon-large { + color: var(--color-formatting); +} + +.feature-card[data-category="automation"] .feature-icon-large { + color: var(--color-automation); +} + +.feature-icon-large svg { + width: 100%; + height: 100%; +} + +.feature-card h3 { + font-size: 18px; + font-weight: 600; + color: var(--color-black); +} + +.feature-list { + list-style: none; + padding: 0; +} + +.feature-list li { + font-size: 14px; + color: var(--color-gray-dark); + padding: 6px 0; + padding-left: 20px; + position: relative; +} + +.feature-list li::before { + content: "•"; + position: absolute; + left: 0; + color: var(--brand-red); + font-weight: bold; +} + +.additional-features { + background: white; + border: 2px solid var(--brand-red); + padding: 24px; + border-radius: 12px; + margin-top: 24px; +} + +.additional-features-header { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 16px; +} + +.additional-features-icon { + width: 40px; + height: 40px; + color: var(--brand-red); + flex-shrink: 0; +} + +.additional-features-icon svg { + width: 100%; + height: 100%; +} + +.additional-features h3 { + font-size: 18px; + font-weight: 600; + color: var(--color-black); + margin: 0; +} + +.additional-features-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 32px; +} + +.additional-features-grid ul { + list-style: none; + padding: 0; + margin: 0; +} + +.additional-features-grid li { + font-size: 15px; + color: var(--color-gray-dark); + padding: 4px 0; + padding-left: 24px; + position: relative; + line-height: 1.5; +} + +.additional-features-grid li::before { + content: "•"; + position: absolute; + left: 0; + color: var(--brand-red); + font-weight: bold; + font-size: 18px; +} + +/* Print Styles */ +@media print { + body { + margin: 0; + padding: 0; + } + + .page { + margin: 0; + border: none; + box-shadow: none; + } +} diff --git a/frontend/scripts/sample-pdf/template.html b/frontend/scripts/sample-pdf/template.html new file mode 100644 index 0000000000..e4ae57e508 --- /dev/null +++ b/frontend/scripts/sample-pdf/template.html @@ -0,0 +1,234 @@ + + + + + + Stirling PDF - Sample Document + + + + +
+
+ + + + + +
+
+
+ +
+

The Free Adobe Acrobat Alternative

+
+
+ 10M+ + Downloads +
+
+
+
Open Source
+
Privacy First
+
Self-Hosted
+
+
+
+ + +
+
+

What is Stirling PDF?

+

+ Stirling PDF is a robust, web-based PDF manipulation tool. + It enables you to carry out various operations on PDF files, including splitting, + merging, converting, rearranging, adding images, rotating, compressing, and more. +

+ +
+
+
+ + + +
+

50+ PDF Operations

+

Comprehensive toolkit covering all your PDF needs. From basic operations to advanced processing.

+
+ +
+
+ + + +
+

Workflow Automation

+

Chain multiple operations together and save them as reusable workflows. Perfect for recurring tasks.

+
+ +
+
+ + + + + +
+

Multi-Language Support

+

Available in over 30 languages with community-contributed translations. Accessible to users worldwide.

+
+ +
+
+ + + + + +
+

Privacy First

+

Self-hosted solution means your data stays on your infrastructure. You have full control over your documents.

+
+ +
+
+ + + + +
+

Open Source

+

Transparent, community-driven development. Inspect the code, contribute features, and adapt as needed.

+
+ +
+
+ + + + +
+

API Access

+

RESTful API for integration with external tools and scripts. Automate PDF operations programmatically.

+
+
+
+
+ + +
+
+

Key Features

+ +
+
+
+
+ + + + + + + +
+

Page Operations

+
+
    +
  • Merge & split PDFs
  • +
  • Rearrange pages
  • +
  • Rotate & crop
  • +
  • Extract pages
  • +
  • Multi-page layout
  • +
+
+ +
+
+
+ + + + +
+

Security & Signing

+
+
    +
  • Password protection
  • +
  • Digital signatures
  • +
  • Watermarks
  • +
  • Permission controls
  • +
  • Redaction tools
  • +
+
+ +
+
+
+ + + +
+

File Conversions

+
+
    +
  • PDF to/from images
  • +
  • Office documents
  • +
  • HTML to PDF
  • +
  • Markdown to PDF
  • +
  • PDF to Word/Excel
  • +
+
+ +
+
+
+ + + +
+

Automation

+
+
    +
  • Multi-step workflows
  • +
  • Chain PDF operations
  • +
  • Save recurring tasks
  • +
  • Batch file processing
  • +
  • API integration
  • +
+
+
+ +
+
+
+ + + +
+

Plus Many More

+
+
+
    +
  • OCR text recognition
  • +
  • Compress PDFs
  • +
  • Add images & stamps
  • +
  • Detect blank pages
  • +
  • Extract images
  • +
  • Edit metadata
  • +
+
    +
  • Flatten forms
  • +
  • PDF/A conversion
  • +
  • Add page numbers
  • +
  • Remove pages
  • +
  • Repair PDFs
  • +
  • And 40+ more tools
  • +
+
+
+
+
+ + + diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 5db513d4aa..406eef5d2b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -7,8 +7,11 @@ import { ToolWorkflowProvider } from "./contexts/ToolWorkflowContext"; import { HotkeyProvider } from "./contexts/HotkeyContext"; import { SidebarProvider } from "./contexts/SidebarContext"; import { PreferencesProvider } from "./contexts/PreferencesContext"; +import { OnboardingProvider } from "./contexts/OnboardingContext"; +import { TourOrchestrationProvider } from "./contexts/TourOrchestrationContext"; import ErrorBoundary from "./components/shared/ErrorBoundary"; import HomePage from "./pages/HomePage"; +import OnboardingTour from "./components/onboarding/OnboardingTour"; // Import global styles import "./styles/tailwind.css"; @@ -43,25 +46,30 @@ export default function App() { - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/components/fileEditor/FileEditorThumbnail.tsx b/frontend/src/components/fileEditor/FileEditorThumbnail.tsx index 5f14779a61..7f6bf09503 100644 --- a/frontend/src/components/fileEditor/FileEditorThumbnail.tsx +++ b/frontend/src/components/fileEditor/FileEditorThumbnail.tsx @@ -247,6 +247,7 @@ const FileEditorThumbnail = ({ ref={fileElementRef} data-file-id={file.id} data-testid="file-thumbnail" + data-tour="file-card-checkbox" data-selected={isSelected} data-supported={isSupported} className={`${styles.card} w-[18rem] h-[22rem] select-none flex flex-col shadow-sm transition-all relative`} @@ -293,11 +294,12 @@ const FileEditorThumbnail = ({ {/* Action buttons group */}
{/* Pin/Unpin icon */} - + { e.stopPropagation(); if (actualFile) { diff --git a/frontend/src/components/fileManager/DesktopLayout.tsx b/frontend/src/components/fileManager/DesktopLayout.tsx index 8d1e32ffc3..78f90a97ab 100644 --- a/frontend/src/components/fileManager/DesktopLayout.tsx +++ b/frontend/src/components/fileManager/DesktopLayout.tsx @@ -23,7 +23,7 @@ const DesktopLayout: React.FC = () => { width: '13.625rem', flexShrink: 0, height: '100%', - }}> + }} data-tour="file-sources"> diff --git a/frontend/src/components/layout/Workbench.tsx b/frontend/src/components/layout/Workbench.tsx index 8d69a9b715..74356b97da 100644 --- a/frontend/src/components/layout/Workbench.tsx +++ b/frontend/src/components/layout/Workbench.tsx @@ -153,6 +153,7 @@ export default function Workbench() { return ( { + const wasClosedNowOpen = !previousIsOpenRef.current && isOpen; + previousIsOpenRef.current = isOpen; + + if (wasClosedNowOpen) { + // Tour is being opened (Help button pressed), reset to first step + setCurrentStep(0); + } + setIsOpen(isOpen); + }, [isOpen, setIsOpen, setCurrentStep]); + + return null; +} + +export default function OnboardingTour() { + const { t } = useTranslation(); + const { completeTour, showWelcomeModal, setShowWelcomeModal, startTour } = useOnboarding(); + const { openFilesModal, closeFilesModal } = useFilesModalContext(); + const { + saveWorkbenchState, + restoreWorkbenchState, + backToAllTools, + selectCropTool, + loadSampleFile, + switchToViewer, + switchToPageEditor, + switchToActiveFiles, + selectFirstFile, + pinFile, + modifyCropSettings, + executeTool, + } = useTourOrchestration(); + + // Define steps as object keyed by enum - TypeScript ensures all keys are present + const stepsConfig: Record = { + [TourStep.ALL_TOOLS]: { + selector: '[data-tour="tool-panel"]', + content: t('onboarding.allTools', 'This is the All Tools panel, where you can browse and select from all available PDF tools.'), + position: 'center', + padding: 0, + action: () => { + saveWorkbenchState(); + closeFilesModal(); + backToAllTools(); + }, + }, + [TourStep.SELECT_CROP_TOOL]: { + selector: '[data-tour="tool-button-crop"]', + content: t('onboarding.selectCropTool', "Let's select the Crop tool to demonstrate how to use one of the tools."), + position: 'right', + padding: 0, + actionAfter: () => selectCropTool(), + }, + [TourStep.TOOL_INTERFACE]: { + selector: '[data-tour="tool-panel"]', + content: t('onboarding.toolInterface', "This is the Crop tool interface. As you can see, there's not much there because we haven't added any PDF files to work with yet."), + position: 'center', + padding: 0, + }, + [TourStep.FILES_BUTTON]: { + selector: '[data-tour="files-button"]', + content: t('onboarding.filesButton', "The Files button on the Quick Access bar allows you to upload PDFs to use the tools on."), + position: 'right', + padding: 10, + action: () => openFilesModal(), + }, + [TourStep.FILE_SOURCES]: { + selector: '[data-tour="file-sources"]', + content: t('onboarding.fileSources', "You can upload new files or access recent files from here. For the tour, we'll just use a sample file."), + position: 'right', + padding: 0, + actionAfter: () => { + loadSampleFile(); + closeFilesModal(); + } + }, + [TourStep.WORKBENCH]: { + selector: '[data-tour="workbench"]', + content: t('onboarding.workbench', 'This is the Workbench - the main area where you view and edit your PDFs.'), + position: 'center', + padding: 0, + }, + [TourStep.VIEW_SWITCHER]: { + selector: '[data-tour="view-switcher"]', + content: t('onboarding.viewSwitcher', 'Use these controls to select how you want to view your PDFs.'), + position: 'bottom', + padding: 0, + }, + [TourStep.VIEWER]: { + selector: '[data-tour="workbench"]', + content: t('onboarding.viewer', "The Viewer lets you read and annotate your PDFs."), + position: 'center', + padding: 0, + action: () => switchToViewer(), + }, + [TourStep.PAGE_EDITOR]: { + selector: '[data-tour="workbench"]', + content: t('onboarding.pageEditor', "The Page Editor allows you to do various operations on the pages within your PDFs, such as reordering, rotating and deleting."), + position: 'center', + padding: 0, + action: () => switchToPageEditor(), + }, + [TourStep.ACTIVE_FILES]: { + selector: '[data-tour="workbench"]', + content: t('onboarding.activeFiles', "The Active Files view shows all of the PDFs you have loaded into the tool, and allows you to select which ones to process."), + position: 'center', + padding: 0, + action: () => switchToActiveFiles(), + }, + [TourStep.FILE_CHECKBOX]: { + selector: '[data-tour="file-card-checkbox"]', + content: t('onboarding.fileCheckbox', "Clicking one of the files selects it for processing. You can select multiple files for batch operations."), + position: 'top', + padding: 10, + }, + [TourStep.SELECT_CONTROLS]: { + selector: '[data-tour="right-rail-controls"]', + highlightedSelectors: ['[data-tour="right-rail-controls"]', '[data-tour="right-rail-settings"]'], + content: t('onboarding.selectControls', "The Right Rail contains buttons to quickly select/deselect all of your active PDFs, along with buttons to change the app's theme or language."), + position: 'left', + padding: 5, + action: () => selectFirstFile(), + }, + [TourStep.CROP_SETTINGS]: { + selector: '[data-tour="crop-settings"]', + content: t('onboarding.cropSettings', "Now that we've selected the file we want crop, we can configure the Crop tool to choose the area that we want to crop the PDF to."), + position: 'left', + padding: 10, + action: () => modifyCropSettings(), + }, + [TourStep.RUN_BUTTON]: { + selector: '[data-tour="run-button"]', + content: t('onboarding.runButton', "Once the tool has been configured, this button allows you to run the tool on all the selected PDFs."), + position: 'top', + padding: 10, + actionAfter: () => executeTool(), + }, + [TourStep.RESULTS]: { + selector: '[data-tour="tool-panel"]', + content: t('onboarding.results', "After the tool has finished running, the Review step will show a preview of the results in this panel, and allow you to undo the operation or download the file. "), + position: 'center', + padding: 0, + }, + [TourStep.FILE_REPLACEMENT]: { + selector: '[data-tour="file-card-checkbox"]', + content: t('onboarding.fileReplacement', "The modified file will replace the original file in the Workbench automatically, allowing you to easily run it through more tools."), + position: 'left', + padding: 10, + }, + [TourStep.PIN_BUTTON]: { + selector: '[data-tour="file-card-pin"]', + content: t('onboarding.pinButton', "You can use the Pin button if you'd rather your files stay active after running tools on them."), + position: 'left', + padding: 10, + action: () => pinFile(), + }, + [TourStep.WRAP_UP]: { + selector: '[data-tour="help-button"]', + content: t('onboarding.wrapUp', "You're all set! You've learnt about the main areas of the app and how to use them. Click the Help button whenever you like to see this tour again."), + position: 'right', + padding: 10, + }, + }; + + // Convert to array using enum's numeric ordering + const steps = Object.values(stepsConfig); + + const advanceTour = ({ setCurrentStep, currentStep, steps, setIsOpen }: { + setCurrentStep: (value: number | ((prev: number) => number)) => void; + currentStep: number; + steps?: StepType[]; + setIsOpen: (value: boolean) => void; + }) => { + if (steps && currentStep === steps.length - 1) { + setIsOpen(false); + restoreWorkbenchState(); + completeTour(); + } else if (steps) { + setCurrentStep((s) => (s === steps.length - 1 ? 0 : s + 1)); + } + }; + + const handleCloseTour = ({ setIsOpen }: { setIsOpen: (value: boolean) => void }) => { + setIsOpen(false); + restoreWorkbenchState(); + completeTour(); + }; + + return ( + <> + { + setShowWelcomeModal(false); + startTour(); + }} + onMaybeLater={() => { + setShowWelcomeModal(false); + }} + onDontShowAgain={() => { + setShowWelcomeModal(false); + completeTour(); + }} + /> + { + e.stopPropagation(); + advanceTour(clickProps); + }} + keyboardHandler={(e, clickProps, status) => { + // Handle right arrow key to advance tour + if (e.key === 'ArrowRight' && !status?.isRightDisabled && clickProps) { + e.preventDefault(); + advanceTour(clickProps); + } + // Handle escape key to close tour + else if (e.key === 'Escape' && !status?.isEscDisabled && clickProps) { + e.preventDefault(); + handleCloseTour(clickProps); + } + }} + styles={{ + popover: (base) => ({ + ...base, + backgroundColor: 'var(--mantine-color-body)', + color: 'var(--mantine-color-text)', + borderRadius: '8px', + padding: '20px', + boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)', + maxWidth: '400px', + }), + maskArea: (base) => ({ + ...base, + rx: 8, + }), + badge: (base) => ({ + ...base, + backgroundColor: 'var(--mantine-primary-color-filled)', + }), + controls: (base) => ({ + ...base, + justifyContent: 'center', + }), + }} + highlightedMaskClassName="tour-highlight-glow" + showNavigation={true} + showBadge={false} + showCloseButton={true} + disableInteraction={true} + disableDotsNavigation={true} + prevButton={() => null} + nextButton={({ currentStep, stepsLength, setCurrentStep, setIsOpen }) => { + const isLast = currentStep === stepsLength - 1; + + return ( + { + advanceTour({ setCurrentStep, currentStep, steps, setIsOpen }); + }} + variant="subtle" + size="lg" + aria-label={isLast ? t('onboarding.finish', 'Finish') : t('onboarding.next', 'Next')} + > + {isLast ? : } + + ); + }} + components={{ + Close: ({ onClick }) => ( + + ), + Content: ({ content } : {content: string}) => ( +
+ ), + }} + > + + + + ); +} diff --git a/frontend/src/components/onboarding/TourWelcomeModal.tsx b/frontend/src/components/onboarding/TourWelcomeModal.tsx new file mode 100644 index 0000000000..82aeaf26aa --- /dev/null +++ b/frontend/src/components/onboarding/TourWelcomeModal.tsx @@ -0,0 +1,82 @@ +import { Modal, Title, Text, Button, Stack, Group } from '@mantine/core'; +import { useTranslation } from 'react-i18next'; +import { Z_INDEX_OVER_FULLSCREEN_SURFACE } from '../../styles/zIndex'; + +interface TourWelcomeModalProps { + opened: boolean; + onStartTour: () => void; + onMaybeLater: () => void; + onDontShowAgain: () => void; +} + +export default function TourWelcomeModal({ + opened, + onStartTour, + onMaybeLater, + onDontShowAgain, +}: TourWelcomeModalProps) { + const { t } = useTranslation(); + + return ( + + + + + {t('onboarding.welcomeModal.title', 'Welcome to Stirling PDF!')} + + + {t('onboarding.welcomeModal.description', + "Would you like to take a quick 1-minute tour to learn the key features and how to get started?" + )} + + Help button in the bottom left.' + ) + }} + /> + + + + + + + + + + + + + + ); +} diff --git a/frontend/src/components/shared/AppConfigModal.tsx b/frontend/src/components/shared/AppConfigModal.tsx index 1605471800..eb7125b726 100644 --- a/frontend/src/components/shared/AppConfigModal.tsx +++ b/frontend/src/components/shared/AppConfigModal.tsx @@ -155,4 +155,4 @@ const AppConfigModal: React.FC = ({ opened, onClose }) => { ); }; -export default AppConfigModal; \ No newline at end of file +export default AppConfigModal; diff --git a/frontend/src/components/shared/FileCard.tsx b/frontend/src/components/shared/FileCard.tsx index 173cfa4048..50d43dc06e 100644 --- a/frontend/src/components/shared/FileCard.tsx +++ b/frontend/src/components/shared/FileCard.tsx @@ -51,6 +51,7 @@ const FileCard = ({ file, fileStub, onRemove, onDoubleClick, onView, onEdit, isS onMouseLeave={() => setIsHovered(false)} onClick={onSelect} data-testid="file-card" + data-tour="file-card-checkbox" > ((_, ref) => { const { handleReaderToggle, handleToolSelect, selectedToolKey, leftPanelView, toolRegistry, readerMode, resetTool } = useToolWorkflow(); const { getToolNavigation } = useSidebarNavigation(); const { config } = useAppConfig(); + const { startTour } = useOnboarding(); const [configModalOpen, setConfigModalOpen] = useState(false); const [activeButton, setActiveButton] = useState('tools'); const scrollableRef = useRef(null); @@ -60,7 +62,12 @@ const QuickAccessBar = forwardRef((_, ref) => { // Render navigation button with conditional URL support return ( -
+
((_, ref) => { ); }; - - const buttonConfigs: ButtonConfig[] = [ + const mainButtons: ButtonConfig[] = [ { id: 'read', name: t("quickAccess.read", "Read"), @@ -131,6 +137,9 @@ const QuickAccessBar = forwardRef((_, ref) => { } } }, + ]; + + const middleButtons: ButtonConfig[] = [ { id: 'files', name: t("quickAccess.files", "Files"), @@ -150,6 +159,20 @@ const QuickAccessBar = forwardRef((_, ref) => { // type: 'navigation', // onClick: () => setActiveButton('activity') //}, + ]; + + const bottomButtons: ButtonConfig[] = [ + { + id: 'help', + name: t("quickAccess.help", "Help"), + icon: , + isRound: true, + size: 'lg', + type: 'action', + onClick: () => { + startTour(); + }, + }, { id: 'config', name: config?.enableLogin ? t("quickAccess.account", "Account") : t("quickAccess.config", "Config"), @@ -162,8 +185,6 @@ const QuickAccessBar = forwardRef((_, ref) => { } ]; - - return (
((_, ref) => { }} >
- {/* Top section with main buttons */} + {/* Main navigation section */} - {buttonConfigs.slice(0, -1).map((config, index) => ( + {mainButtons.map((config, index) => ( {renderNavButton(config, index)} - - {/* Add divider after Automate button (index 1) and Files button (index 2) */} - {index === 1 && ( - - )} ))} - {/* Spacer to push Config button to bottom */} + {/* Divider after main buttons */} + + + {/* Middle section */} + + {middleButtons.map((config, index) => ( + + {renderNavButton(config, index)} + + ))} + + + {/* Spacer to push bottom buttons to bottom */}
- {/* Config button at the bottom */} - {buttonConfigs - .filter(config => config.id === 'config') - .map(config => ( -
- - - {config.icon} - - - - {config.name} - -
+ {/* Bottom section */} + + {bottomButtons.map((config, index) => ( + + {renderNavButton(config, index)} + ))} +
diff --git a/frontend/src/components/shared/RightRail.tsx b/frontend/src/components/shared/RightRail.tsx index c8168f373a..149aa9eaaf 100644 --- a/frontend/src/components/shared/RightRail.tsx +++ b/frontend/src/components/shared/RightRail.tsx @@ -168,7 +168,7 @@ export default function RightRail() {
{sectionsWithButtons.map(({ section, buttons: sectionButtons }) => ( -
+
{sectionButtons.map((btn, index) => { const content = renderButton(btn); if (!content) return null; @@ -186,7 +186,7 @@ export default function RightRail() { ))} -
+
{renderWithTooltip( view.data != null) .map((view) => ({ label: ( @@ -169,6 +169,7 @@ const TopControls = ({
void }>, - onLogoutClick: () => void + onLogoutClick: () => void, ): ConfigNavSection[] => { const sections: ConfigNavSection[] = [ { @@ -61,4 +61,4 @@ export const createConfigNavSections = ( ]; return sections; -}; \ No newline at end of file +}; diff --git a/frontend/src/components/shared/quickAccessBar/QuickAccessBar.css b/frontend/src/components/shared/quickAccessBar/QuickAccessBar.css index 05f2264176..e2c261b525 100644 --- a/frontend/src/components/shared/quickAccessBar/QuickAccessBar.css +++ b/frontend/src/components/shared/quickAccessBar/QuickAccessBar.css @@ -145,6 +145,7 @@ .content-divider { width: 3.75rem; border-color: var(--color-gray-300); + margin: 1rem 0; } /* Spacer */ diff --git a/frontend/src/components/tools/FullscreenToolSurface.tsx b/frontend/src/components/tools/FullscreenToolSurface.tsx index 69b3c205de..05cf475719 100644 --- a/frontend/src/components/tools/FullscreenToolSurface.tsx +++ b/frontend/src/components/tools/FullscreenToolSurface.tsx @@ -94,6 +94,7 @@ const FullscreenToolSurface = ({ style={style} role="region" aria-label={t('toolPanel.fullscreen.heading', 'All tools (fullscreen view)')} + data-tour="tool-panel" >
{!isMobile && leftPanelView === 'toolPicker' && ( - = ({ border: `2px solid ${theme.other.crop.overlayBorder}`, backgroundColor: theme.other.crop.overlayBackground, cursor: 'move', - pointerEvents: 'auto' + pointerEvents: 'auto', + transition: (isDragging || isResizing) ? undefined : 'all 1s ease-in-out' }} onMouseDown={handleOverlayMouseDown} > diff --git a/frontend/src/components/tools/crop/CropSettings.tsx b/frontend/src/components/tools/crop/CropSettings.tsx index 624ab3b88b..9643b39ae8 100644 --- a/frontend/src/components/tools/crop/CropSettings.tsx +++ b/frontend/src/components/tools/crop/CropSettings.tsx @@ -93,6 +93,19 @@ const CropSettings = ({ parameters, disabled = false }: CropSettingsProps) => { loadPDFDimensions(); }, [selectedStub, selectedFile, parameters]); + // Listen for tour events to set crop area + useEffect(() => { + const handleSetCropArea = (event: Event) => { + const customEvent = event as CustomEvent; + if (customEvent.detail && pdfBounds) { + parameters.setCropArea(customEvent.detail, pdfBounds); + } + }; + + window.addEventListener('tour:setCropArea', handleSetCropArea); + return () => window.removeEventListener('tour:setCropArea', handleSetCropArea); + }, [parameters, pdfBounds]); + // Current crop area const cropArea = parameters.getCropArea(); @@ -137,7 +150,7 @@ const CropSettings = ({ parameters, disabled = false }: CropSettingsProps) => { const isFullCrop = parameters.isFullPDFCrop(pdfBounds); return ( - + {/* PDF Preview with Crop Selector */} diff --git a/frontend/src/components/tools/fullscreen/CompactToolItem.tsx b/frontend/src/components/tools/fullscreen/CompactToolItem.tsx index 896d704395..31323ee817 100644 --- a/frontend/src/components/tools/fullscreen/CompactToolItem.tsx +++ b/frontend/src/components/tools/fullscreen/CompactToolItem.tsx @@ -42,6 +42,7 @@ const CompactToolItem: React.FC = ({ id, tool, isSelected, onClick={onClick} aria-disabled={disabled} disabled={disabled} + data-tour={`tool-button-${id}`} > {tool.icon ? ( = ({ id, tool, isSelecte onClick={onClick} aria-disabled={disabled} disabled={disabled} + data-tour={`tool-button-${id}`} > {tool.icon ? ( { const { t } = useTranslation(); @@ -43,6 +45,7 @@ const OperationButton = ({ variant={variant} color={color} data-testid={dataTestId} + data-tour={dataTour} style={{ minHeight: '2.5rem' }} > {isLoading diff --git a/frontend/src/components/tools/shared/createToolFlow.tsx b/frontend/src/components/tools/shared/createToolFlow.tsx index ffa4b0db61..53d74c47b7 100644 --- a/frontend/src/components/tools/shared/createToolFlow.tsx +++ b/frontend/src/components/tools/shared/createToolFlow.tsx @@ -105,6 +105,7 @@ export function createToolFlow(config: ToolFlowConfig) { loadingText={config.executeButton.loadingText} submitText={config.executeButton.text} data-testid={config.executeButton.testId} + data-tour="run-button" /> )} diff --git a/frontend/src/components/tools/toolPicker/ToolButton.tsx b/frontend/src/components/tools/toolPicker/ToolButton.tsx index 72affa2d09..fc39631286 100644 --- a/frontend/src/components/tools/toolPicker/ToolButton.tsx +++ b/frontend/src/components/tools/toolPicker/ToolButton.tsx @@ -112,10 +112,11 @@ const ToolButton: React.FC = ({ id, tool, isSelected, onSelect, fullWidth justify="flex-start" className="tool-button" - styles={{ - root: { - borderRadius: 0, - color: "var(--tools-text-and-icon-color)", + data-tour={`tool-button-${id}`} + styles={{ + root: { + borderRadius: 0, + color: "var(--tools-text-and-icon-color)", overflow: 'visible' }, label: { overflow: 'visible' } @@ -137,10 +138,11 @@ const ToolButton: React.FC = ({ id, tool, isSelected, onSelect, fullWidth justify="flex-start" className="tool-button" - styles={{ - root: { - borderRadius: 0, - color: "var(--tools-text-and-icon-color)", + data-tour={`tool-button-${id}`} + styles={{ + root: { + borderRadius: 0, + color: "var(--tools-text-and-icon-color)", overflow: 'visible' }, label: { overflow: 'visible' } @@ -159,14 +161,15 @@ const ToolButton: React.FC = ({ id, tool, isSelected, onSelect, justify="flex-start" className="tool-button" aria-disabled={isUnavailable} + data-tour={`tool-button-${id}`} styles={{ - root: { - borderRadius: 0, - color: "var(--tools-text-and-icon-color)", - cursor: isUnavailable ? 'not-allowed' : undefined, + root: { + borderRadius: 0, + color: "var(--tools-text-and-icon-color)", + cursor: isUnavailable ? 'not-allowed' : undefined, overflow: 'visible' - }, - label: { overflow: 'visible' } + }, + label: { overflow: 'visible' } }} > {buttonContent} diff --git a/frontend/src/contexts/OnboardingContext.tsx b/frontend/src/contexts/OnboardingContext.tsx new file mode 100644 index 0000000000..78a3461c16 --- /dev/null +++ b/frontend/src/contexts/OnboardingContext.tsx @@ -0,0 +1,80 @@ +import React, { createContext, useContext, useState, useEffect, useCallback } from 'react'; +import { usePreferences } from './PreferencesContext'; +import { useMediaQuery } from '@mantine/hooks'; + +interface OnboardingContextValue { + isOpen: boolean; + currentStep: number; + setCurrentStep: (step: number) => void; + startTour: () => void; + closeTour: () => void; + completeTour: () => void; + resetTour: () => void; + showWelcomeModal: boolean; + setShowWelcomeModal: (show: boolean) => void; +} + +const OnboardingContext = createContext(undefined); + +export const OnboardingProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const { preferences, updatePreference } = usePreferences(); + const [isOpen, setIsOpen] = useState(false); + const [currentStep, setCurrentStep] = useState(0); + const [showWelcomeModal, setShowWelcomeModal] = useState(false); + const isMobile = useMediaQuery("(max-width: 1024px)"); + + // Auto-show welcome modal for first-time users after preferences load + // Only show after user has seen the tool panel mode prompt + // Also, don't show tour on mobile devices because it feels clunky + useEffect(() => { + if (!preferences.hasCompletedOnboarding && preferences.toolPanelModePromptSeen && !isMobile) { + setShowWelcomeModal(true); + } + }, [preferences.hasCompletedOnboarding, preferences.toolPanelModePromptSeen, isMobile]); + + const startTour = useCallback(() => { + setCurrentStep(0); + setIsOpen(true); + }, []); + + const closeTour = useCallback(() => { + setIsOpen(false); + }, []); + + const completeTour = useCallback(() => { + setIsOpen(false); + updatePreference('hasCompletedOnboarding', true); + }, [updatePreference]); + + const resetTour = useCallback(() => { + updatePreference('hasCompletedOnboarding', false); + setCurrentStep(0); + setIsOpen(true); + }, [updatePreference]); + + return ( + + {children} + + ); +}; + +export const useOnboarding = (): OnboardingContextValue => { + const context = useContext(OnboardingContext); + if (!context) { + throw new Error('useOnboarding must be used within an OnboardingProvider'); + } + return context; +}; diff --git a/frontend/src/contexts/TourOrchestrationContext.tsx b/frontend/src/contexts/TourOrchestrationContext.tsx new file mode 100644 index 0000000000..8c6c0c05bf --- /dev/null +++ b/frontend/src/contexts/TourOrchestrationContext.tsx @@ -0,0 +1,207 @@ +import React, { createContext, useContext, useCallback, useRef } from 'react'; +import { useFileHandler } from '../hooks/useFileHandler'; +import { useFilesModalContext } from './FilesModalContext'; +import { useNavigationActions } from './NavigationContext'; +import { useToolWorkflow } from './ToolWorkflowContext'; +import { useAllFiles, useFileManagement } from './FileContext'; +import { StirlingFile } from '../types/fileContext'; +import { fileStorage } from '../services/fileStorage'; + +interface TourOrchestrationContextType { + // State management + saveWorkbenchState: () => void; + restoreWorkbenchState: () => Promise; + + // Tool deselection + backToAllTools: () => void; + + // Tool selection + selectCropTool: () => void; + + // File operations + loadSampleFile: () => Promise; + + // View switching + switchToViewer: () => void; + switchToPageEditor: () => void; + switchToActiveFiles: () => void; + + // File operations + selectFirstFile: () => void; + pinFile: () => void; + + // Crop settings (placeholder for now) + modifyCropSettings: () => void; + + // Tool execution + executeTool: () => void; +} + +const TourOrchestrationContext = createContext(undefined); + +export const TourOrchestrationProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const { addFiles } = useFileHandler(); + const { closeFilesModal } = useFilesModalContext(); + const { actions: navActions } = useNavigationActions(); + const { handleToolSelect, handleBackToTools } = useToolWorkflow(); + const { files } = useAllFiles(); + const { clearAllFiles } = useFileManagement(); + + // Store the user's files before tour starts + const savedFilesRef = useRef([]); + + // Keep a ref to always have the latest files + const filesRef = useRef(files); + React.useEffect(() => { + filesRef.current = files; + }, [files]); + + const saveWorkbenchState = useCallback(() => { + // Get fresh files from ref + const currentFiles = filesRef.current; + console.log('Saving workbench state, files count:', currentFiles.length); + savedFilesRef.current = [...currentFiles]; + // Clear all files for clean demo + clearAllFiles(); + }, [clearAllFiles]); + + const restoreWorkbenchState = useCallback(async () => { + console.log('Restoring workbench state, saved files count:', savedFilesRef.current.length); + + // Go back to All Tools + handleBackToTools(); + + // Clear all files (including tour sample) + clearAllFiles(); + + // Delete all active files from storage (they're just the ones from the tour) + const currentFiles = filesRef.current; + if (currentFiles.length > 0) { + try { + await Promise.all(currentFiles.map(file => fileStorage.deleteStirlingFile(file.fileId))); + console.log(`Deleted ${currentFiles.length} file(s) from storage`); + } catch (error) { + console.error('Failed to delete files from storage:', error); + } + } + + // Restore saved files + if (savedFilesRef.current.length > 0) { + // Create fresh File objects from StirlingFile to avoid ID conflicts + const filesToRestore = await Promise.all( + savedFilesRef.current.map(async (sf) => { + const buffer = await sf.arrayBuffer(); + return new File([buffer], sf.name, { type: sf.type, lastModified: sf.lastModified }); + }) + ); + console.log('Restoring files:', filesToRestore.map(f => f.name)); + await addFiles(filesToRestore); + savedFilesRef.current = []; + } + }, [clearAllFiles, addFiles, handleBackToTools]); + + const backToAllTools = useCallback(() => { + handleBackToTools(); + }, [handleBackToTools]); + + const selectCropTool = useCallback(() => { + handleToolSelect('crop'); + }, [handleToolSelect]); + + const loadSampleFile = useCallback(async () => { + try { + const response = await fetch('/samples/Sample.pdf'); + const blob = await response.blob(); + const file = new File([blob], 'Sample.pdf', { type: 'application/pdf' }); + + await addFiles([file]); + closeFilesModal(); + } catch (error) { + console.error('Failed to load sample file:', error); + } + }, [addFiles, closeFilesModal]); + + const switchToViewer = useCallback(() => { + navActions.setWorkbench('viewer'); + }, [navActions]); + + const switchToPageEditor = useCallback(() => { + navActions.setWorkbench('pageEditor'); + }, [navActions]); + + const switchToActiveFiles = useCallback(() => { + navActions.setWorkbench('fileEditor'); + }, [navActions]); + + const selectFirstFile = useCallback(() => { + // File selection is handled by FileCard onClick + // This function could trigger a click event on the first file card + const firstFileCard = document.querySelector('[data-tour="file-card-checkbox"]') as HTMLElement; + if (firstFileCard) { + // Check if already selected (data-selected attribute) + const isSelected = firstFileCard.getAttribute('data-selected') === 'true'; + // Only click if not already selected (to avoid toggling off) + if (!isSelected) { + firstFileCard.click(); + } + } + }, []); + + const pinFile = useCallback(() => { + // Click the pin button directly + const pinButton = document.querySelector('[data-tour="file-card-pin"]') as HTMLElement; + if (pinButton) { + pinButton.click(); + } + }, []); + + const modifyCropSettings = useCallback(() => { + // Dispatch a custom event to modify crop settings + const event = new CustomEvent('tour:setCropArea', { + detail: { + x: 80, + y: 435, + width: 440, + height: 170, + } + }); + window.dispatchEvent(event); + }, []); + + const executeTool = useCallback(() => { + // Trigger the run button click + const runButton = document.querySelector('[data-tour="run-button"]') as HTMLElement; + if (runButton) { + runButton.click(); + } + }, []); + + const value: TourOrchestrationContextType = { + saveWorkbenchState, + restoreWorkbenchState, + backToAllTools, + selectCropTool, + loadSampleFile, + switchToViewer, + switchToPageEditor, + switchToActiveFiles, + selectFirstFile, + pinFile, + modifyCropSettings, + executeTool, + }; + + return ( + + {children} + + ); +}; + +export const useTourOrchestration = (): TourOrchestrationContextType => { + const context = useContext(TourOrchestrationContext); + if (!context) { + throw new Error('useTourOrchestration must be used within TourOrchestrationProvider'); + } + return context; +}; diff --git a/frontend/src/services/preferencesService.ts b/frontend/src/services/preferencesService.ts index 5a8ff6286a..da5e4350be 100644 --- a/frontend/src/services/preferencesService.ts +++ b/frontend/src/services/preferencesService.ts @@ -8,6 +8,7 @@ export interface UserPreferences { theme: ThemeMode; toolPanelModePromptSeen: boolean; showLegacyToolDescriptions: boolean; + hasCompletedOnboarding: boolean; } export const DEFAULT_PREFERENCES: UserPreferences = { @@ -17,6 +18,7 @@ export const DEFAULT_PREFERENCES: UserPreferences = { theme: getSystemTheme(), toolPanelModePromptSeen: false, showLegacyToolDescriptions: false, + hasCompletedOnboarding: false, }; const STORAGE_KEY = 'stirlingpdf_preferences'; diff --git a/frontend/src/tools/Crop.tsx b/frontend/src/tools/Crop.tsx index d185e38772..4cf6e6b6e0 100644 --- a/frontend/src/tools/Crop.tsx +++ b/frontend/src/tools/Crop.tsx @@ -28,7 +28,7 @@ const Crop = (props: BaseToolProps) => { steps: [ { title: t("crop.steps.selectArea", "Select Crop Area"), - isCollapsed: !base.hasFiles, // Collapsed until files selected + isCollapsed: base.settingsCollapsed, onCollapsedClick: base.hasResults ? base.handleSettingsReset : undefined, tooltip: tooltips, content: (