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 e74347837..387138b05 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 f11184471..a508f7f9b 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 20c3590e8..5cb16aacd 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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

{Nm283 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 F{}0M;F$@3z literal 0 HcmV?d00001 diff --git a/frontend/scripts/sample-pdf/generate.mjs b/frontend/scripts/sample-pdf/generate.mjs new file mode 100755 index 000000000..93e5cf7ee --- /dev/null +++ b/frontend/scripts/sample-pdf/generate.mjs @@ -0,0 +1,105 @@ +#!/usr/bin/env node + +/** + * Stirling PDF Sample Document Generator + * + * This script uses Puppeteer to generate a sample PDF from a HTML template. + * The output is used in the onboarding tour and as a demo document + * for users to experiment with Stirling PDF's features. + */ + +import puppeteer from 'puppeteer'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; +import { existsSync, mkdirSync, statSync } from 'fs'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const TEMPLATE_PATH = join(__dirname, 'template.html'); +const OUTPUT_DIR = join(__dirname, '../../public/samples'); +const OUTPUT_PATH = join(OUTPUT_DIR, 'Sample.pdf'); + +async function generatePDF() { + console.log('🚀 Starting Stirling PDF sample document generation...\n'); + + // Ensure output directory exists + if (!existsSync(OUTPUT_DIR)) { + mkdirSync(OUTPUT_DIR, { recursive: true }); + console.log(`✅ Created output directory: ${OUTPUT_DIR}`); + } + + // Check if template exists + if (!existsSync(TEMPLATE_PATH)) { + console.error(`❌ Template file not found: ${TEMPLATE_PATH}`); + process.exit(1); + } + + console.log(`📄 Reading template: ${TEMPLATE_PATH}`); + + let browser; + try { + // Launch Puppeteer + console.log('🌐 Launching browser...'); + browser = await puppeteer.launch({ + headless: 'new', + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + + const page = await browser.newPage(); + + // Set viewport to match A4 proportions + await page.setViewport({ + width: 794, // A4 width in pixels at 96 DPI + height: 1123, // A4 height in pixels at 96 DPI + deviceScaleFactor: 2 // Higher quality rendering + }); + + // Navigate to the template file + const fileUrl = `file://${TEMPLATE_PATH}`; + console.log('📖 Loading HTML template...'); + await page.goto(fileUrl, { + waitUntil: 'networkidle0' // Wait for all resources to load + }); + + // Generate PDF with A4 dimensions + console.log('📝 Generating PDF...'); + await page.pdf({ + path: OUTPUT_PATH, + format: 'A4', + printBackground: true, + margin: { + top: 0, + right: 0, + bottom: 0, + left: 0 + }, + preferCSSPageSize: true + }); + + console.log('\n✅ PDF generated successfully!'); + console.log(`📦 Output: ${OUTPUT_PATH}`); + + // Get file size + const stats = statSync(OUTPUT_PATH); + const fileSizeInKB = (stats.size / 1024).toFixed(2); + console.log(`📊 File size: ${fileSizeInKB} KB`); + + } catch (error) { + console.error('\n❌ Error generating PDF:', error.message); + process.exit(1); + } finally { + if (browser) { + await browser.close(); + console.log('🔒 Browser closed.'); + } + } + + console.log('\n🎉 Done! Sample PDF is ready for use in Stirling PDF.\n'); +} + +// Run the generator +generatePDF().catch(error => { + 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 000000000..067452833 --- /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 000000000..e4ae57e50 --- /dev/null +++ b/frontend/scripts/sample-pdf/template.html @@ -0,0 +1,234 @@ + + + + + + Stirling PDF - Sample Document + + + + +

+ + +
+
+

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 5db513d4a..406eef5d2 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 5f14779a6..7f6bf0950 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 8d1e32ffc..78f90a97a 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 8d69a9b71..74356b97d 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 000000000..82aeaf26a --- /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 160547180..eb7125b72 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 173cfa404..50d43dc06 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 c8168f373..149aa9eaa 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 05f226417..e2c261b52 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 69b3c205d..05cf47571 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 624ab3b88..9643b39ae 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 896d70439..31323ee81 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 ffa4b0db6..53d74c47b 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 72affa2d0..fc3963128 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 000000000..78a3461c1 --- /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 000000000..8c6c0c05b --- /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 5a8ff6286..da5e4350b 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 d185e3877..4cf6e6b6e 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: (