diff --git a/backend/FwLite/FwLiteWeb/FwLiteWebServer.cs b/backend/FwLite/FwLiteWeb/FwLiteWebServer.cs index 433f928396..2e725a6b5d 100644 --- a/backend/FwLite/FwLiteWeb/FwLiteWebServer.cs +++ b/backend/FwLite/FwLiteWeb/FwLiteWebServer.cs @@ -120,7 +120,10 @@ public static WebApplication SetupAppServer(WebApplicationOptions options, Actio app.MapStaticAssets(); app.MapRazorComponents() - .AddInteractiveServerRenderMode() + .AddInteractiveServerRenderMode(endpointOptions => + { + endpointOptions.ContentSecurityFrameAncestorsPolicy = "self http://localhost:*"; + }) .AddAdditionalAssemblies(typeof(FwLiteShared._Imports).Assembly); return app; } diff --git a/backend/FwLite/FwLiteWeb/Program.cs b/backend/FwLite/FwLiteWeb/Program.cs index 97513e5595..e58a59753c 100644 --- a/backend/FwLite/FwLiteWeb/Program.cs +++ b/backend/FwLite/FwLiteWeb/Program.cs @@ -2,6 +2,8 @@ using FwLiteWeb; using Microsoft.Extensions.Options; +//paratext won't let us change the working directory, and if it's not set correctly then loading js files doesn't work +Directory.SetCurrentDirectory(Path.GetDirectoryName(typeof(Program).Assembly.Location)!); var app = FwLiteWebServer.SetupAppServer(new() {Args = args}); await using (app) { diff --git a/frontend/platform.bible-extension/Taskfile.yml b/frontend/platform.bible-extension/Taskfile.yml index 62f5e35612..0ad3d705c0 100644 --- a/frontend/platform.bible-extension/Taskfile.yml +++ b/frontend/platform.bible-extension/Taskfile.yml @@ -12,18 +12,19 @@ tasks: - npm install package: - deps: [ build-fw-lite-web, build-viewer-component, install ] + deps: [ build-fw-lite-web, install ] cmds: - npm run package run: - deps: [ build-fw-lite-web, build-viewer-component, install ] + deps: [ build-fw-lite-web, install ] cmds: - npm run start build-fw-lite-web: + deps: [build-viewer] cmds: - dotnet publish ../../backend/FwLite/FwLiteWeb/FwLiteWeb.csproj --configuration Release --sc --output ./public/fw-lite - build-viewer-component: + build-viewer: dir: ../viewer - cmd: pnpm run build + cmd: pnpm run build-app diff --git a/frontend/platform.bible-extension/package-lock.json b/frontend/platform.bible-extension/package-lock.json index 74eb919f4b..38a7365772 100644 --- a/frontend/platform.bible-extension/package-lock.json +++ b/frontend/platform.bible-extension/package-lock.json @@ -9,8 +9,7 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "platform-bible-utils": "file:../../../paranext-core/lib/platform-bible-utils", - "viewer": "file:../viewer" + "platform-bible-utils": "file:../../../paranext-core/lib/platform-bible-utils" }, "devDependencies": { "@types/node": "^18.17.12", @@ -736,7 +735,7 @@ }, "../node_modules/.pnpm/@egoist+tailwindcss-icons@1.9.0_tailwindcss@3.4.17/node_modules/@egoist/tailwindcss-icons": { "version": "1.9.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@iconify/utils": "^2.2.1" @@ -764,7 +763,7 @@ }, "../node_modules/.pnpm/@iconify-json+mdi@1.2.3/node_modules/@iconify-json/mdi": { "version": "1.2.3", - "dev": true, + "extraneous": true, "license": "Apache-2.0", "dependencies": { "@iconify/types": "*" @@ -772,7 +771,7 @@ }, "../node_modules/.pnpm/@mdi+js@7.4.47/node_modules/@mdi/js": { "version": "7.4.47", - "dev": true, + "extraneous": true, "license": "Apache-2.0", "devDependencies": { "@mdi/svg": "^7.4.47", @@ -781,6 +780,7 @@ }, "../node_modules/.pnpm/@microsoft+dotnet-js-interop@8.0.0/node_modules/@microsoft/dotnet-js-interop": { "version": "8.0.0", + "extraneous": true, "license": "MIT", "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.26.0", @@ -794,6 +794,7 @@ }, "../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr": { "version": "8.0.7", + "extraneous": true, "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", @@ -812,7 +813,7 @@ }, "../node_modules/.pnpm/@stylistic+eslint-plugin@2.13.0_eslint@9.20.1_jiti@2.4.2__typescript@5.7.3/node_modules/@stylistic/eslint-plugin": { "version": "2.13.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^8.13.0", @@ -830,7 +831,7 @@ }, "../node_modules/.pnpm/@sveltejs+vite-plugin-svelte@5.0.3_svelte@5.20.0_vite@6.1.0_@types+node@20.17.17_jiti@2.4.2_yaml@2.7.0_/node_modules/@sveltejs/vite-plugin-svelte": { "version": "5.0.3", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", @@ -857,7 +858,7 @@ }, "../node_modules/.pnpm/@tailwindcss+typography@0.5.16_tailwindcss@3.4.17/node_modules/@tailwindcss/typography": { "version": "0.5.16", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "lodash.castarray": "^4.4.0", @@ -886,7 +887,7 @@ }, "../node_modules/.pnpm/@testing-library+jest-dom@6.6.3/node_modules/@testing-library/jest-dom": { "version": "6.6.3", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.4.0", @@ -921,7 +922,7 @@ }, "../node_modules/.pnpm/@testing-library+svelte@5.2.7_svelte@5.20.0_vite@6.1.0_@types+node@20.17.17_jiti@2.4.2_yaml@2_zgpglvz6qbptdywmm4qhmenv6i/node_modules/@testing-library/svelte": { "version": "5.2.7", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@testing-library/dom": "^10.0.0" @@ -979,7 +980,7 @@ }, "../node_modules/.pnpm/@testing-library+user-event@14.6.1_@testing-library+dom@10.4.0/node_modules/@testing-library/user-event": { "version": "14.6.1", - "dev": true, + "extraneous": true, "license": "MIT", "devDependencies": { "@esbuild-plugins/node-modules-polyfill": "^0.2.2", @@ -1023,12 +1024,12 @@ }, "../node_modules/.pnpm/@tsconfig+svelte@5.0.4/node_modules/@tsconfig/svelte": { "version": "5.0.4", - "dev": true, + "extraneous": true, "license": "MIT" }, "../node_modules/.pnpm/@typescript-eslint+eslint-plugin@8.24.0_@typescript-eslint+parser@8.24.0_eslint@9.20.1_jiti@2_7uqydk2jfd4poqdo32srs7nrzi/node_modules/@typescript-eslint/eslint-plugin": { "version": "8.24.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", @@ -1082,7 +1083,7 @@ }, "../node_modules/.pnpm/@typescript-eslint+parser@8.24.0_eslint@9.20.1_jiti@2.4.2__typescript@5.7.3/node_modules/@typescript-eslint/parser": { "version": "8.24.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.24.0", @@ -1115,7 +1116,7 @@ }, "../node_modules/.pnpm/@vitest+ui@3.0.5_vitest@3.0.5/node_modules/@vitest/ui": { "version": "3.0.5", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@vitest/utils": "3.0.5", @@ -1167,6 +1168,7 @@ }, "../node_modules/.pnpm/autoprefixer@10.4.20_postcss@8.5.2/node_modules/autoprefixer": { "version": "10.4.20", + "extraneous": true, "funding": [ { "type": "opencollective", @@ -1202,7 +1204,7 @@ }, "../node_modules/.pnpm/eslint-plugin-svelte@2.46.1_eslint@9.20.1_jiti@2.4.2__svelte@5.20.0/node_modules/eslint-plugin-svelte": { "version": "2.46.1", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -1270,7 +1272,7 @@ }, "../node_modules/.pnpm/eslint@9.20.1_jiti@2.4.2/node_modules/eslint": { "version": "9.20.1", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -1393,6 +1395,7 @@ }, "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch": { "version": "3.1.1", + "extraneous": true, "license": "MIT", "devDependencies": { "benchmark": "^2.1.4", @@ -1414,7 +1417,7 @@ }, "../node_modules/.pnpm/happy-dom@17.1.0/node_modules/happy-dom": { "version": "17.1.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "webidl-conversions": "^7.0.0", @@ -1434,10 +1437,12 @@ }, "../node_modules/.pnpm/just-throttle@4.2.0/node_modules/just-throttle": { "version": "4.2.0", + "extraneous": true, "license": "MIT" }, "../node_modules/.pnpm/postcss@8.5.2/node_modules/postcss": { "version": "8.5.2", + "extraneous": true, "funding": [ { "type": "opencollective", @@ -1464,7 +1469,7 @@ }, "../node_modules/.pnpm/svelte-check@4.1.4_picomatch@4.0.2_svelte@5.20.0_typescript@5.7.3/node_modules/svelte-check": { "version": "4.1.4", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", @@ -1505,6 +1510,7 @@ }, "../node_modules/.pnpm/svelte-dnd-action@0.9.57_svelte@5.20.0/node_modules/svelte-dnd-action": { "version": "0.9.57", + "extraneous": true, "license": "MIT", "devDependencies": { "@babel/core": "^7.9.6", @@ -1526,7 +1532,7 @@ }, "../node_modules/.pnpm/svelte-eslint-parser@1.0.0-next.13_svelte@5.20.0/node_modules/svelte-eslint-parser": { "version": "1.0.0-next.13", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "eslint-scope": "^8.2.0", @@ -1604,6 +1610,7 @@ }, "../node_modules/.pnpm/svelte-exmarkdown@4.0.2_svelte@5.20.0/node_modules/svelte-exmarkdown": { "version": "4.0.2", + "extraneous": true, "license": "MIT", "dependencies": { "remark-gfm": "^4.0.0", @@ -1662,6 +1669,7 @@ }, "../node_modules/.pnpm/svelte-preprocess@6.0.3_@babel+core@7.26.8_postcss-load-config@4.0.2_postcss@8.5.2__postcss@8_jypx3bzkchyqnqhqtbpygiez5q/node_modules/svelte-preprocess": { "version": "6.0.3", + "extraneous": true, "hasInstallScript": true, "license": "MIT", "devDependencies": { @@ -1744,6 +1752,7 @@ }, "../node_modules/.pnpm/svelte-routing@2.13.0/node_modules/svelte-routing": { "version": "2.13.0", + "extraneous": true, "license": "MIT", "devDependencies": { "prettier": "^3.2.5", @@ -1753,6 +1762,7 @@ }, "../node_modules/.pnpm/svelte-ux@0.76.0_@babel+core@7.26.8_postcss-load-config@4.0.2_postcss@8.5.2__postcss@8.5.2_svelte@5.20.0/node_modules/svelte-ux": { "version": "0.76.0", + "extraneous": true, "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.12", @@ -1812,7 +1822,7 @@ }, "../node_modules/.pnpm/svelte@5.20.0/node_modules/svelte": { "version": "5.20.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", @@ -1853,7 +1863,7 @@ }, "../node_modules/.pnpm/tailwindcss@3.4.17/node_modules/tailwindcss": { "version": "3.4.17", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -1910,12 +1920,12 @@ }, "../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib": { "version": "2.8.1", - "dev": true, + "extraneous": true, "license": "0BSD" }, "../node_modules/.pnpm/tw-colors@3.3.2_tailwindcss@3.4.17/node_modules/tw-colors": { "version": "3.3.2", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "color": "^4.2.3", @@ -1941,6 +1951,7 @@ }, "../node_modules/.pnpm/type-fest@4.34.1/node_modules/type-fest": { "version": "4.34.1", + "extraneous": true, "license": "(MIT OR CC0-1.0)", "devDependencies": { "expect-type": "^1.1.0", @@ -1958,7 +1969,7 @@ }, "../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript": { "version": "5.7.3", - "dev": true, + "extraneous": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -2016,7 +2027,7 @@ }, "../node_modules/.pnpm/vite@6.1.0_@types+node@20.17.17_jiti@2.4.2_yaml@2.7.0/node_modules/vite": { "version": "6.1.0", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "esbuild": "^0.24.2", @@ -2147,7 +2158,7 @@ }, "../node_modules/.pnpm/vitest@3.0.5_@types+debug@4.1.12_@types+node@20.17.17_@vitest+ui@3.0.5_happy-dom@17.1.0_jiti@2.4.2_yaml@2.7.0/node_modules/vitest": { "version": "3.0.5", - "dev": true, + "extraneous": true, "license": "MIT", "dependencies": { "@vitest/expect": "3.0.5", @@ -2246,27 +2257,45 @@ }, "../viewer": { "version": "1.0.0", + "extraneous": true, "dependencies": { + "@lingui/core": "^5.2.0", "@microsoft/dotnet-js-interop": "^8.0.0", "@microsoft/signalr": "^8.0.0", "autoprefixer": "^10.4.19", "fast-json-patch": "^3.1.1", "just-throttle": "^4.2.0", "postcss": "catalog:", + "prosemirror-commands": "^1.7.0", + "prosemirror-history": "^1.4.1", + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.25.0", + "prosemirror-state": "^1.4.3", + "prosemirror-view": "^1.38.1", + "runed": "catalog:", "svelte-dnd-action": "^0.9.57", "svelte-exmarkdown": "catalog:", + "svelte-i18n-lingui": "^0.2.2", "svelte-preprocess": "catalog:", "svelte-routing": "^2.12.0", "svelte-ux": "^0.76.0", - "type-fest": "^4.18.2" + "tabbable": "^6.2.0", + "type-fest": "^4.18.2", + "virtua": "^0.41.2" }, "devDependencies": { - "@egoist/tailwindcss-icons": "^1.8.0", + "@argos-ci/playwright": "^5.0.4", + "@egoist/tailwindcss-icons": "^1.9.0", "@iconify-json/mdi": "^1.1.66", + "@lingui/cli": "^5.2.0", + "@lingui/format-json": "^5.2.0", + "@lingui/vite-plugin": "^5.2.0", "@mdi/js": "^7.4.47", + "@playwright/test": "catalog:", "@stylistic/eslint-plugin": "catalog:", "@sveltejs/vite-plugin-svelte": "catalog:", - "@tailwindcss/typography": "^0.5.13", + "@tailwindcss/container-queries": "^0.1.1", + "@tailwindcss/typography": "^0.5.16", "@testing-library/jest-dom": "^6.6.3", "@testing-library/svelte": "^5.2.6", "@testing-library/user-event": "^14.5.2", @@ -2274,17 +2303,28 @@ "@typescript-eslint/eslint-plugin": "catalog:", "@typescript-eslint/parser": "catalog:", "@vitest/ui": "catalog:", + "autoprefixer": "^10.4.20", + "bits-ui": "1.4.3", + "clsx": "^2.1.1", "eslint": "catalog:", "eslint-plugin-svelte": "catalog:", "happy-dom": "^17.1.0", + "mode-watcher": "^1.0.7", + "paneforge": "1.0.0-next.4", "svelte": "catalog:", "svelte-check": "catalog:", "svelte-eslint-parser": "catalog:", + "svelte-sonner": "^0.3.28", + "tailwind-merge": "^3.0.2", + "tailwind-variants": "^1.0.0", "tailwindcss": "catalog:", + "tailwindcss-animate": "^1.0.7", "tslib": "catalog:", "tw-colors": "^3.3.1", "typescript": "catalog:", + "vaul-svelte": "1.0.0-next.6", "vite": "catalog:", + "vite-plugin-webfont-dl": "^3.10.4", "vitest": "catalog:" }, "engines": { @@ -2292,154 +2332,6 @@ "pnpm": ">=9" } }, - "../viewer/node_modules/@egoist/tailwindcss-icons": { - "resolved": "../node_modules/.pnpm/@egoist+tailwindcss-icons@1.9.0_tailwindcss@3.4.17/node_modules/@egoist/tailwindcss-icons", - "link": true - }, - "../viewer/node_modules/@iconify-json/mdi": { - "resolved": "../node_modules/.pnpm/@iconify-json+mdi@1.2.3/node_modules/@iconify-json/mdi", - "link": true - }, - "../viewer/node_modules/@mdi/js": { - "resolved": "../node_modules/.pnpm/@mdi+js@7.4.47/node_modules/@mdi/js", - "link": true - }, - "../viewer/node_modules/@microsoft/dotnet-js-interop": { - "resolved": "../node_modules/.pnpm/@microsoft+dotnet-js-interop@8.0.0/node_modules/@microsoft/dotnet-js-interop", - "link": true - }, - "../viewer/node_modules/@microsoft/signalr": { - "resolved": "../node_modules/.pnpm/@microsoft+signalr@8.0.7/node_modules/@microsoft/signalr", - "link": true - }, - "../viewer/node_modules/@stylistic/eslint-plugin": { - "resolved": "../node_modules/.pnpm/@stylistic+eslint-plugin@2.13.0_eslint@9.20.1_jiti@2.4.2__typescript@5.7.3/node_modules/@stylistic/eslint-plugin", - "link": true - }, - "../viewer/node_modules/@sveltejs/vite-plugin-svelte": { - "resolved": "../node_modules/.pnpm/@sveltejs+vite-plugin-svelte@5.0.3_svelte@5.20.0_vite@6.1.0_@types+node@20.17.17_jiti@2.4.2_yaml@2.7.0_/node_modules/@sveltejs/vite-plugin-svelte", - "link": true - }, - "../viewer/node_modules/@tailwindcss/typography": { - "resolved": "../node_modules/.pnpm/@tailwindcss+typography@0.5.16_tailwindcss@3.4.17/node_modules/@tailwindcss/typography", - "link": true - }, - "../viewer/node_modules/@testing-library/jest-dom": { - "resolved": "../node_modules/.pnpm/@testing-library+jest-dom@6.6.3/node_modules/@testing-library/jest-dom", - "link": true - }, - "../viewer/node_modules/@testing-library/svelte": { - "resolved": "../node_modules/.pnpm/@testing-library+svelte@5.2.7_svelte@5.20.0_vite@6.1.0_@types+node@20.17.17_jiti@2.4.2_yaml@2_zgpglvz6qbptdywmm4qhmenv6i/node_modules/@testing-library/svelte", - "link": true - }, - "../viewer/node_modules/@testing-library/user-event": { - "resolved": "../node_modules/.pnpm/@testing-library+user-event@14.6.1_@testing-library+dom@10.4.0/node_modules/@testing-library/user-event", - "link": true - }, - "../viewer/node_modules/@tsconfig/svelte": { - "resolved": "../node_modules/.pnpm/@tsconfig+svelte@5.0.4/node_modules/@tsconfig/svelte", - "link": true - }, - "../viewer/node_modules/@typescript-eslint/eslint-plugin": { - "resolved": "../node_modules/.pnpm/@typescript-eslint+eslint-plugin@8.24.0_@typescript-eslint+parser@8.24.0_eslint@9.20.1_jiti@2_7uqydk2jfd4poqdo32srs7nrzi/node_modules/@typescript-eslint/eslint-plugin", - "link": true - }, - "../viewer/node_modules/@typescript-eslint/parser": { - "resolved": "../node_modules/.pnpm/@typescript-eslint+parser@8.24.0_eslint@9.20.1_jiti@2.4.2__typescript@5.7.3/node_modules/@typescript-eslint/parser", - "link": true - }, - "../viewer/node_modules/@vitest/ui": { - "resolved": "../node_modules/.pnpm/@vitest+ui@3.0.5_vitest@3.0.5/node_modules/@vitest/ui", - "link": true - }, - "../viewer/node_modules/autoprefixer": { - "resolved": "../node_modules/.pnpm/autoprefixer@10.4.20_postcss@8.5.2/node_modules/autoprefixer", - "link": true - }, - "../viewer/node_modules/eslint": { - "resolved": "../node_modules/.pnpm/eslint@9.20.1_jiti@2.4.2/node_modules/eslint", - "link": true - }, - "../viewer/node_modules/eslint-plugin-svelte": { - "resolved": "../node_modules/.pnpm/eslint-plugin-svelte@2.46.1_eslint@9.20.1_jiti@2.4.2__svelte@5.20.0/node_modules/eslint-plugin-svelte", - "link": true - }, - "../viewer/node_modules/fast-json-patch": { - "resolved": "../node_modules/.pnpm/fast-json-patch@3.1.1/node_modules/fast-json-patch", - "link": true - }, - "../viewer/node_modules/happy-dom": { - "resolved": "../node_modules/.pnpm/happy-dom@17.1.0/node_modules/happy-dom", - "link": true - }, - "../viewer/node_modules/just-throttle": { - "resolved": "../node_modules/.pnpm/just-throttle@4.2.0/node_modules/just-throttle", - "link": true - }, - "../viewer/node_modules/postcss": { - "resolved": "../node_modules/.pnpm/postcss@8.5.2/node_modules/postcss", - "link": true - }, - "../viewer/node_modules/svelte": { - "resolved": "../node_modules/.pnpm/svelte@5.20.0/node_modules/svelte", - "link": true - }, - "../viewer/node_modules/svelte-check": { - "resolved": "../node_modules/.pnpm/svelte-check@4.1.4_picomatch@4.0.2_svelte@5.20.0_typescript@5.7.3/node_modules/svelte-check", - "link": true - }, - "../viewer/node_modules/svelte-dnd-action": { - "resolved": "../node_modules/.pnpm/svelte-dnd-action@0.9.57_svelte@5.20.0/node_modules/svelte-dnd-action", - "link": true - }, - "../viewer/node_modules/svelte-eslint-parser": { - "resolved": "../node_modules/.pnpm/svelte-eslint-parser@1.0.0-next.13_svelte@5.20.0/node_modules/svelte-eslint-parser", - "link": true - }, - "../viewer/node_modules/svelte-exmarkdown": { - "resolved": "../node_modules/.pnpm/svelte-exmarkdown@4.0.2_svelte@5.20.0/node_modules/svelte-exmarkdown", - "link": true - }, - "../viewer/node_modules/svelte-preprocess": { - "resolved": "../node_modules/.pnpm/svelte-preprocess@6.0.3_@babel+core@7.26.8_postcss-load-config@4.0.2_postcss@8.5.2__postcss@8_jypx3bzkchyqnqhqtbpygiez5q/node_modules/svelte-preprocess", - "link": true - }, - "../viewer/node_modules/svelte-routing": { - "resolved": "../node_modules/.pnpm/svelte-routing@2.13.0/node_modules/svelte-routing", - "link": true - }, - "../viewer/node_modules/svelte-ux": { - "resolved": "../node_modules/.pnpm/svelte-ux@0.76.0_@babel+core@7.26.8_postcss-load-config@4.0.2_postcss@8.5.2__postcss@8.5.2_svelte@5.20.0/node_modules/svelte-ux", - "link": true - }, - "../viewer/node_modules/tailwindcss": { - "resolved": "../node_modules/.pnpm/tailwindcss@3.4.17/node_modules/tailwindcss", - "link": true - }, - "../viewer/node_modules/tslib": { - "resolved": "../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib", - "link": true - }, - "../viewer/node_modules/tw-colors": { - "resolved": "../node_modules/.pnpm/tw-colors@3.3.2_tailwindcss@3.4.17/node_modules/tw-colors", - "link": true - }, - "../viewer/node_modules/type-fest": { - "resolved": "../node_modules/.pnpm/type-fest@4.34.1/node_modules/type-fest", - "link": true - }, - "../viewer/node_modules/typescript": { - "resolved": "../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript", - "link": true - }, - "../viewer/node_modules/vite": { - "resolved": "../node_modules/.pnpm/vite@6.1.0_@types+node@20.17.17_jiti@2.4.2_yaml@2.7.0/node_modules/vite", - "link": true - }, - "../viewer/node_modules/vitest": { - "resolved": "../node_modules/.pnpm/vitest@3.0.5_@types+debug@4.1.12_@types+node@20.17.17_@vitest+ui@3.0.5_happy-dom@17.1.0_jiti@2.4.2_yaml@2.7.0/node_modules/vitest", - "link": true - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "dev": true, @@ -13746,10 +13638,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/viewer": { - "resolved": "../viewer", - "link": true - }, "node_modules/walker": { "version": "1.0.8", "dev": true, diff --git a/frontend/platform.bible-extension/package.json b/frontend/platform.bible-extension/package.json index c7b808b505..bd818cf8d2 100644 --- a/frontend/platform.bible-extension/package.json +++ b/frontend/platform.bible-extension/package.json @@ -75,7 +75,6 @@ "zip-build": "^1.8.0" }, "dependencies": { - "platform-bible-utils": "file:../../../paranext-core/lib/platform-bible-utils", - "viewer": "file:../viewer" + "platform-bible-utils": "file:../../../paranext-core/lib/platform-bible-utils" } } diff --git a/frontend/platform.bible-extension/src/extension-template.web-view.tsx b/frontend/platform.bible-extension/src/extension-template.web-view.tsx index ac05df026e..567eed9928 100644 --- a/frontend/platform.bible-extension/src/extension-template.web-view.tsx +++ b/frontend/platform.bible-extension/src/extension-template.web-view.tsx @@ -1,35 +1,41 @@ import papi, { logger } from '@papi/frontend'; import type {FindEntryEvent, LaunchServerEvent} from 'fw-lite-extension'; import { useEvent } from 'platform-bible-react'; -import 'viewer/component'; -import {useState} from 'react'; +import {useState, useRef, useEffect} from 'react'; globalThis.webViewComponent = function ExtensionTemplate() { const [baseUrl, setBaseUrl] = useState(''); + const iframe = useRef(null); useEvent( papi.network.getNetworkEvent('fwLiteExtension.findEntry'), ({ entry }) => { - window.lexbox.Search.openSearch(entry); + iframe.current?.contentWindow.postMessage({type: 'notification', message: 'hello from Paratext'}, new URL(baseUrl).origin); }, ); useEvent( papi.network.getNetworkEvent('fwLiteExtension.launchServer'), ({ baseUrl }) => { + // console.log('launchServer', baseUrl); setBaseUrl(baseUrl); }, ); + + useEffect(() => void updateUrl(), []); + + async function updateUrl() { + const result = await papi.commands.sendCommand('fwLiteExtension.getBaseUrl'); + setBaseUrl(result.baseUrl); + } + if (!baseUrl) { - return ; + return ; } return ( <> - + ); }; diff --git a/frontend/platform.bible-extension/src/main.ts b/frontend/platform.bible-extension/src/main.ts index 3f31d386d6..97fae0d70d 100644 --- a/frontend/platform.bible-extension/src/main.ts +++ b/frontend/platform.bible-extension/src/main.ts @@ -10,8 +10,6 @@ import extensionTemplateReact from './extension-template.web-view?inline'; import extensionTemplatestyles from './styles.css?inline'; import type {GetWebViewOptions} from 'shared/models/web-view.model'; -logger.info('FwLite extension is importing!'); - const reactWebViewType = 'fw-lite-extension.react'; /** @@ -28,7 +26,8 @@ const reactWebViewProvider: IWebViewProvider = { title: 'FW Lite Extension React', content: extensionTemplateReact, styles: extensionTemplatestyles, - iconUrl: 'papi-extension://fw-lite-extension/assets/logo-dark.png' + iconUrl: 'papi-extension://fw-lite-extension/assets/logo-dark.png', + allowedFrameSources: ['http://localhost:*'] }; }, }; @@ -49,10 +48,9 @@ export async function activate(context: ExecutionActivationContext) { 'fwLiteExtension.launchServer', ); let baseUrlHolder = {baseUrl: ''}; - launchFwLiteFwLiteWeb(context).then(baseUrl => { - baseUrlHolder.baseUrl = baseUrl; - onLaunchServerEmitter.emit({baseUrl}); - }); + let {fwLiteProcess, baseUrl} = launchFwLiteFwLiteWeb(context); + baseUrlHolder.baseUrl = baseUrl; + onLaunchServerEmitter.emit(baseUrlHolder); const getBaseUrlCommandPromise = papi.commands.registerCommand( 'fwLiteExtension.getBaseUrl', @@ -86,7 +84,7 @@ export async function activate(context: ExecutionActivationContext) { // anywhere; it just has to match `webViewType`. See `paranext-core's hello-someone.ts` for an // example of keeping an existing WebView that was specifically created by // `paranext-core's hello-someone`. - void papi.webViews.getWebView(reactWebViewType, undefined, {existingId: '?'}); + void papi.webViews.openWebView(reactWebViewType, undefined, {existingId: '?'}); // Await the data provider promise at the end so we don't hold everything else up context.registrations.add( @@ -95,7 +93,8 @@ export async function activate(context: ExecutionActivationContext) { await simpleFindEntryCommandPromise, await getBaseUrlCommandPromise, onFindEntryEmitter, - onLaunchServerEmitter + onLaunchServerEmitter, + () => fwLiteProcess.kill() ); logger.info('FwLite is finished activating!'); @@ -106,7 +105,7 @@ export async function deactivate() { return true; } -async function launchFwLiteFwLiteWeb(context: ExecutionActivationContext) { +function launchFwLiteFwLiteWeb(context: ExecutionActivationContext) { let binaryPath = 'fw-lite/FwLiteWeb.exe'; if (context.elevatedPrivileges.createProcess === undefined) { throw new Error('FwLite requires createProcess elevated privileges'); @@ -116,16 +115,17 @@ async function launchFwLiteFwLiteWeb(context: ExecutionActivationContext) { } //todo instead of hardcoding the url and port we should run it and find the url in the output let baseUrl = 'http://localhost:29348'; - context.elevatedPrivileges.createProcess.spawn( + + const fwLiteProcess = context.elevatedPrivileges.createProcess.spawn( context.executionToken, binaryPath, [ '--urls', baseUrl, '--FwLiteWeb:OpenBrowser=false', '--FwLiteWeb:CorsAllowAny=true', - '--FwLiteWeb:LogFileName=fw-lite-web.log', + '--FwLiteWeb:LogFileName=./../../fw-lite-web.log',//required at dev time otherwise the log file will trigger a restart of the extension by PT ], {stdio: [null, null, null]} ); - return baseUrl; + return {baseUrl, fwLiteProcess}; } diff --git a/frontend/platform.bible-extension/src/styles.css b/frontend/platform.bible-extension/src/styles.css index 293d3b1f13..169e1de68d 100644 --- a/frontend/platform.bible-extension/src/styles.css +++ b/frontend/platform.bible-extension/src/styles.css @@ -1,3 +1,12 @@ -body { +body, html, div { + overflow: hidden; +} +body, html, div, iframe { + height: 100%; + width: 100%; margin: 0; } + +iframe { + border: none; +} diff --git a/frontend/viewer/src/ShadcnProjectView.svelte b/frontend/viewer/src/ShadcnProjectView.svelte index 2713a27005..41386cbb11 100644 --- a/frontend/viewer/src/ShadcnProjectView.svelte +++ b/frontend/viewer/src/ShadcnProjectView.svelte @@ -21,6 +21,7 @@ import DialogsProvider from '$lib/DialogsProvider.svelte'; import {navigate, Route, useRouter} from 'svelte-routing'; import ActivityView from '$lib/activity/ActivityView.svelte'; + import {AppNotification} from '$lib/notifications/notifications'; const { onloaded, @@ -42,7 +43,21 @@ }); let open = $state(true); const {base} = useRouter(); + + type FwLiteEvent = {type: 'notification', message: string}; + + function isFwLiteMessage(data: any): data is FwLiteEvent { + return typeof data ==='object' && data.type === 'notification' && typeof data.message === 'string' && data.message.length > 0 ; + } + + //listenting to messages from paratext + function onMessage(event: {data: any}) { + if (isFwLiteMessage(event.data)) { + AppNotification.display(event.data.message, 'info', 'long'); + } + } +