From 80e0a57c7010ac1cefa99d64e36f58a4f047f9fe Mon Sep 17 00:00:00 2001 From: Florian <45694132+flo-bit@users.noreply.github.com> Date: Sat, 15 Aug 2026 06:23:40 +0200 Subject: [PATCH] reorg --- package.json | 1 + pnpm-lock.yaml | 250 ++++++++++++++++++ src/lib/atproto/oauth.remote.ts | 4 +- .../components}/AccountMenuItem.svelte | 0 .../components}/AppMenu.svelte | 0 .../components}/Avatar.svelte | 2 +- .../components}/Container.svelte | 2 +- .../components}/ExternalRatings.svelte | 4 +- .../components}/Footer.svelte | 0 .../components}/ItemCard.svelte | 6 +- .../components}/ItemPage.svelte | 8 +- .../components}/ItemsGrid.svelte | 4 +- .../components}/ItemsList.svelte | 4 +- .../components}/MenuItem.svelte | 0 .../components}/Rating.svelte | 2 +- .../components}/RatingInput.svelte | 0 .../components}/ReviewDialog.svelte | 4 +- .../components}/SearchCommand.svelte | 8 +- .../components}/SearchMenuItem.svelte | 4 +- .../components}/TabSelect.svelte | 0 .../components}/TrailerDialog.svelte | 0 src/{routes/(app)/_lib => lib}/images.ts | 0 .../(app)/_lib => lib}/review.svelte.ts | 0 src/{routes/(app)/_lib => lib}/tmdb.server.ts | 0 src/{routes/(app)/_lib => lib}/types.ts | 0 src/{routes/(app)/_lib => lib}/utils.ts | 0 src/routes/(app)/+layout.svelte | 21 -- src/routes/(app)/README.md | 17 -- src/routes/{(app) => }/+layout.server.ts | 0 src/routes/+layout.svelte | 19 +- src/routes/{(app) => }/+page.server.ts | 2 +- src/routes/{(app) => }/+page.svelte | 8 +- .../{(app) => }/[kind]/[id]/+page.server.ts | 4 +- .../{(app) => }/[kind]/[id]/+page.svelte | 2 +- .../{(app) => }/[kind]/[id]/og.png/+server.ts | 6 +- src/routes/{(app) => }/api/search/+server.ts | 2 +- .../{(app) => }/cast/[id]/+page.server.ts | 4 +- src/routes/{(app) => }/cast/[id]/+page.svelte | 8 +- .../profile/[actor]/+layout.server.ts | 2 +- .../{(app) => }/profile/[actor]/+page.svelte | 6 +- vite.config.ts | 4 +- 41 files changed, 318 insertions(+), 90 deletions(-) rename src/{routes/(app)/_components => lib/components}/AccountMenuItem.svelte (100%) rename src/{routes/(app)/_components => lib/components}/AppMenu.svelte (100%) rename src/{routes/(app)/_components => lib/components}/Avatar.svelte (95%) rename src/{routes/(app)/_components => lib/components}/Container.svelte (88%) rename src/{routes/(app)/_components => lib/components}/ExternalRatings.svelte (97%) rename src/{routes/(app)/_components => lib/components}/Footer.svelte (100%) rename src/{routes/(app)/_components => lib/components}/ItemCard.svelte (92%) rename src/{routes/(app)/_components => lib/components}/ItemPage.svelte (95%) rename src/{routes/(app)/_components => lib/components}/ItemsGrid.svelte (81%) rename src/{routes/(app)/_components => lib/components}/ItemsList.svelte (82%) rename src/{routes/(app)/_components => lib/components}/MenuItem.svelte (100%) rename src/{routes/(app)/_components => lib/components}/Rating.svelte (97%) rename src/{routes/(app)/_components => lib/components}/RatingInput.svelte (100%) rename src/{routes/(app)/_components => lib/components}/ReviewDialog.svelte (97%) rename src/{routes/(app)/_components => lib/components}/SearchCommand.svelte (96%) rename src/{routes/(app)/_components => lib/components}/SearchMenuItem.svelte (95%) rename src/{routes/(app)/_components => lib/components}/TabSelect.svelte (100%) rename src/{routes/(app)/_components => lib/components}/TrailerDialog.svelte (100%) rename src/{routes/(app)/_lib => lib}/images.ts (100%) rename src/{routes/(app)/_lib => lib}/review.svelte.ts (100%) rename src/{routes/(app)/_lib => lib}/tmdb.server.ts (100%) rename src/{routes/(app)/_lib => lib}/types.ts (100%) rename src/{routes/(app)/_lib => lib}/utils.ts (100%) delete mode 100644 src/routes/(app)/+layout.svelte delete mode 100644 src/routes/(app)/README.md rename src/routes/{(app) => }/+layout.server.ts (100%) rename src/routes/{(app) => }/+page.server.ts (69%) rename src/routes/{(app) => }/+page.svelte (82%) rename src/routes/{(app) => }/[kind]/[id]/+page.server.ts (92%) rename src/routes/{(app) => }/[kind]/[id]/+page.svelte (70%) rename src/routes/{(app) => }/[kind]/[id]/og.png/+server.ts (90%) rename src/routes/{(app) => }/api/search/+server.ts (88%) rename src/routes/{(app) => }/cast/[id]/+page.server.ts (86%) rename src/routes/{(app) => }/cast/[id]/+page.svelte (92%) rename src/routes/{(app) => }/profile/[actor]/+layout.server.ts (97%) rename src/routes/{(app) => }/profile/[actor]/+page.svelte (85%) diff --git a/package.json b/package.json index 28df653..04ee4d5 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@atcute/client": "^5.1.1", "@atcute/lexicons": "^2.0.3", "@atmo-dev/contrail": "^0.17.0", + "@ethercorps/sveltekit-og": "^4.3.0", "@foxui/core": "^0.9.1", "@foxui/social": "^0.8.10", "@lorenzopant/tmdb": "^1.25.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 361b8db..c5d7fa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@atmo-dev/contrail': specifier: ^0.17.0 version: 0.17.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(prettier@3.9.6)(typescript@6.0.3) + '@ethercorps/sveltekit-og': + specifier: ^4.3.0 + version: 4.3.0(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0))) '@foxui/core': specifier: ^0.9.1 version: 0.9.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(tailwindcss@4.3.3) @@ -326,6 +329,15 @@ packages: resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@ethercorps/sveltekit-og@4.3.0': + resolution: {integrity: sha512-UjcR/D7XOXTSPpOHfMd9b1a5DrNe00lUCwdkkh0RhMY/VG4cPk0D/9Y+fZ7g0r04lorSajdosvr6YPro88eaaw==} + peerDependencies: + '@sveltejs/kit': '>=2.0.0' + takumi-js: ^2.0.1 + peerDependenciesMeta: + takumi-js: + optional: true + '@floating-ui/core@1.8.0': resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} @@ -453,6 +465,10 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@resvg/resvg-wasm@2.6.2': + resolution: {integrity: sha512-FqALmHI8D4o6lk/LRWDnhw95z5eO+eAa6ORjVg09YRR7BkcM6oPHU9uyC0gtQG5vpFLvgpeU4+zEAz2H8APHNw==} + engines: {node: '>= 10'} + '@rolldown/binding-android-arm64@1.2.4': resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -546,6 +562,11 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@shuding/opentype.js@1.4.0-beta.0': + resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} + engines: {node: '>= 8.0.0'} + hasBin: true + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1055,6 +1076,10 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + bits-ui@2.18.1: resolution: {integrity: sha512-KkemzKFH4T3gt3H+P86JcnAWExjByv/6vlwjm/BoCwTPHu03yiCdxbghdJLvFReQTe0acCAiRcKfmixxD6XvlA==} engines: {node: '>=20'} @@ -1070,6 +1095,9 @@ packages: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -1082,6 +1110,15 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1096,6 +1133,23 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-gradient-parser@0.0.17: + resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==} + engines: {node: '>=16'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1140,6 +1194,10 @@ packages: emoji-picker-element@1.29.1: resolution: {integrity: sha512-TOiHzu9Dqib3x4MwcAi3wi3RdyT4SoeB4b15AvH1ks4SBwTl7DeebhZ0d3x6dNi4XfNU7IGRZ7NBQllj0RqwrQ==} + emoji-regex-xs@2.0.1: + resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} + engines: {node: '>=10.0.0'} + enhanced-resolve@5.24.5: resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} @@ -1147,6 +1205,9 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1242,6 +1303,9 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1260,6 +1324,9 @@ packages: picomatch: optional: true + fflate@0.7.5: + resolution: {integrity: sha512-QieYf//cis6ywHNi5qW1+PXPQ4bC+XVJAtS4AXIML8P76GroEiOxm/oQtn1f02UkJY1+KsXMJcC+R2v/Eg4G3g==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1300,6 +1367,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + hex-rgb@4.3.0: + resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} + engines: {node: '>=6'} + highlight.js@11.11.2: resolution: {integrity: sha512-oaXMACAU0kzOMXBjWpNcX+vlwSBCIAiZ9BHa7gA15NOTtT2L/l8OSZDuqS2XppOhZBPJ7hm4o8ep2kyuip2uEQ==} engines: {node: '>=12.0.0'} @@ -1363,6 +1434,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + knitwork@1.3.0: + resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} + known-css-properties@0.37.0: resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} @@ -1522,6 +1596,9 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + linkifyjs@4.3.3: resolution: {integrity: sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==} @@ -1561,6 +1638,9 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mode-watcher@1.1.0: resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==} peerDependencies: @@ -1617,6 +1697,12 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parse-css-color@0.2.1: + resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + partysocket@1.3.0: resolution: {integrity: sha512-1zToNyolZFK/7nuAw/K2bZrNzFqaZyRoCEkS+9vG6WSC5ikrN6qWRe96q6ImU51uptz2r+dAwSkwhJVdQi4LiA==} peerDependencies: @@ -1643,6 +1729,12 @@ packages: resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + playwright-core@1.62.1: resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} engines: {node: '>=20'} @@ -1697,6 +1789,9 @@ packages: resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==} engines: {node: '>=4'} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.26: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} @@ -1858,6 +1953,13 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + satori-html@0.3.2: + resolution: {integrity: sha512-wjTh14iqADFKDK80e51/98MplTGfxz2RmIzh0GqShlf4a67+BooLywF17TvJPD6phO0Hxm7Mf1N5LtRYvdkYRA==} + + satori@0.25.0: + resolution: {integrity: sha512-utINfLxrYrmSnLvxFT4ZwgwWa8KOjrz7ans32V5wItgHVmzESl/9i33nE38uG0miycab8hUqQtDlOpqrIpB/iw==} + engines: {node: '>=16'} + semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -1891,6 +1993,9 @@ packages: std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} @@ -1967,6 +2072,9 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -2015,12 +2123,24 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.7.0: + resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} + undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} unicode-segmenter@0.17.3: resolution: {integrity: sha512-hKZwqBjJDmqNrq1+LjDxck1qLzJFcLLJM2Xq92ORRHOuau6GSHeELmn+uyk6zNH1CK9mogrUJGP9WJCJUQXMAw==} + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unwasm@0.5.3: + resolution: {integrity: sha512-keBgTSfp3r6+s9ZcSma+0chwxQdmLbB5+dAD9vjtB21UTMYuKAxHXCU1K2CbCtnP09EaWeRvACnXk0EJtUx+hw==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2194,6 +2314,9 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} + zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} @@ -2494,6 +2617,15 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 + '@ethercorps/sveltekit-og@4.3.0(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))': + dependencies: + '@resvg/resvg-wasm': 2.6.2 + '@sveltejs/kit': 2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)) + satori: 0.25.0 + satori-html: 0.3.2 + std-env: 4.2.0 + unwasm: 0.5.3 + '@floating-ui/core@1.8.0': dependencies: '@floating-ui/utils': 0.2.12 @@ -2691,6 +2823,8 @@ snapshots: '@polka/url@1.0.0-next.29': {} + '@resvg/resvg-wasm@2.6.2': {} + '@rolldown/binding-android-arm64@1.2.4': optional: true @@ -2735,6 +2869,11 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@shuding/opentype.js@1.4.0-beta.0': + dependencies: + fflate: 0.7.5 + string.prototype.codepointat: 0.2.1 + '@standard-schema/spec@1.1.0': {} '@svelte-atproto/oauth@0.3.0(@atcute/identity@2.0.2(@atcute/lexicons@2.0.3)(typescript@6.0.3))(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)': @@ -3286,6 +3425,8 @@ snapshots: balanced-match@4.0.4: {} + base64-js@0.0.8: {} + bits-ui@2.18.1(@internationalized/date@3.12.3)(@sveltejs/kit@2.70.2(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.56.9(@typescript-eslint/types@8.67.0))(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0))(typescript@6.0.3)(vite@8.2.1(@types/node@24.13.3)(jiti@2.7.0)))(svelte@5.56.9(@typescript-eslint/types@8.67.0)): dependencies: '@floating-ui/core': 1.8.0 @@ -3305,6 +3446,8 @@ snapshots: cac@7.0.0: {} + camelize@1.0.1: {} + chai@6.2.2: {} chokidar@4.0.3: @@ -3313,6 +3456,12 @@ snapshots: clsx@2.1.1: {} + color-name@1.1.4: {} + + confbox@0.1.8: {} + + confbox@0.2.4: {} + convert-source-map@2.0.0: {} cookie@0.6.0: {} @@ -3325,6 +3474,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-background-parser@0.1.0: {} + + css-box-shadow@1.0.0-3: {} + + css-color-keywords@1.0.0: {} + + css-gradient-parser@0.0.17: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + cssesc@3.0.0: {} custom-event-polyfill@1.0.7: {} @@ -3353,6 +3516,8 @@ snapshots: emoji-picker-element@1.29.1: {} + emoji-regex-xs@2.0.1: {} + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 @@ -3360,6 +3525,8 @@ snapshots: es-module-lexer@2.3.1: {} + escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} eslint-config-prettier@10.1.8(eslint@10.8.1(jiti@2.7.0)): @@ -3479,6 +3646,8 @@ snapshots: expect-type@1.4.0: {} + exsolve@1.1.1: {} + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.1.0: {} @@ -3489,6 +3658,8 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fflate@0.7.5: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3521,6 +3692,8 @@ snapshots: graceful-fs@4.2.11: {} + hex-rgb@4.3.0: {} + highlight.js@11.11.2: {} hls.js@1.7.0: {} @@ -3563,6 +3736,8 @@ snapshots: kleur@4.1.5: {} + knitwork@1.3.0: {} + known-css-properties@0.37.0: {} levn@0.4.1: @@ -3670,6 +3845,11 @@ snapshots: lilconfig@2.1.0: {} + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + linkifyjs@4.3.3: {} loadjs@4.3.0: {} @@ -3704,6 +3884,13 @@ snapshots: dependencies: brace-expansion: 5.0.9 + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + mode-watcher@1.1.0(svelte@5.56.9(@typescript-eslint/types@8.67.0)): dependencies: runed: 0.25.0(svelte@5.56.9(@typescript-eslint/types@8.67.0)) @@ -3749,6 +3936,13 @@ snapshots: dependencies: p-limit: 3.1.0 + pako@0.2.9: {} + + parse-css-color@0.2.1: + dependencies: + color-name: 1.1.4 + hex-rgb: 4.3.0 + partysocket@1.3.0: dependencies: event-target-polyfill: 0.0.4 @@ -3763,6 +3957,18 @@ snapshots: picomatch@4.0.5: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.1 + pathe: 2.0.3 + playwright-core@1.62.1: {} playwright@1.62.1: @@ -3808,6 +4014,8 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} + postcss@8.5.26: dependencies: nanoid: 3.3.18 @@ -3959,6 +4167,24 @@ snapshots: dependencies: mri: 1.2.0 + satori-html@0.3.2: + dependencies: + ultrahtml: 1.7.0 + + satori@0.25.0: + dependencies: + '@shuding/opentype.js': 1.4.0-beta.0 + css-background-parser: 0.1.0 + css-box-shadow: 1.0.0-3 + css-gradient-parser: 0.0.17 + css-to-react-native: 3.2.0 + emoji-regex-xs: 2.0.1 + escape-html: 1.0.3 + linebreak: 1.1.0 + parse-css-color: 0.2.1 + postcss-value-parser: 4.2.0 + yoga-layout: 3.2.1 + semver@7.8.5: {} set-cookie-parser@3.1.2: {} @@ -3983,6 +4209,8 @@ snapshots: std-env@4.2.0: {} + string.prototype.codepointat@0.2.1: {} + style-to-object@1.0.14: dependencies: inline-style-parser: 0.2.7 @@ -4076,6 +4304,8 @@ snapshots: tapable@2.3.3: {} + tiny-inflate@1.0.3: {} + tinybench@2.9.0: {} tinyexec@1.3.0: {} @@ -4114,10 +4344,28 @@ snapshots: typescript@6.0.3: {} + ufo@1.6.4: {} + + ultrahtml@1.7.0: {} + undici-types@7.18.2: {} unicode-segmenter@0.17.3: {} + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + + unwasm@0.5.3: + dependencies: + exsolve: 1.1.1 + knitwork: 1.3.0 + magic-string: 0.30.21 + mlly: 1.8.2 + pathe: 2.0.3 + pkg-types: 2.3.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -4205,4 +4453,6 @@ snapshots: yocto-queue@1.2.2: {} + yoga-layout@3.2.1: {} + zimmerframe@1.1.4: {} diff --git a/src/lib/atproto/oauth.remote.ts b/src/lib/atproto/oauth.remote.ts index a9239d6..5dd6a49 100644 --- a/src/lib/atproto/oauth.remote.ts +++ b/src/lib/atproto/oauth.remote.ts @@ -1,8 +1,6 @@ -import { command, getRequestEvent } from '$app/server'; -import { error } from '@sveltejs/kit'; +import { command } from '$app/server'; import * as v from 'valibot'; import { atproto } from '$lib/atproto'; -import { createTID } from '@svelte-atproto/oauth/helper'; export const oauthLogin = command( v.object({ diff --git a/src/routes/(app)/_components/AccountMenuItem.svelte b/src/lib/components/AccountMenuItem.svelte similarity index 100% rename from src/routes/(app)/_components/AccountMenuItem.svelte rename to src/lib/components/AccountMenuItem.svelte diff --git a/src/routes/(app)/_components/AppMenu.svelte b/src/lib/components/AppMenu.svelte similarity index 100% rename from src/routes/(app)/_components/AppMenu.svelte rename to src/lib/components/AppMenu.svelte diff --git a/src/routes/(app)/_components/Avatar.svelte b/src/lib/components/Avatar.svelte similarity index 95% rename from src/routes/(app)/_components/Avatar.svelte rename to src/lib/components/Avatar.svelte index dd69150..1b76002 100644 --- a/src/routes/(app)/_components/Avatar.svelte +++ b/src/lib/components/Avatar.svelte @@ -1,5 +1,5 @@ - -
-
- {@render children()} -
-
- - - diff --git a/src/routes/(app)/README.md b/src/routes/(app)/README.md deleted file mode 100644 index 7b703af..0000000 --- a/src/routes/(app)/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Movie, TV, and cast routes - -This route group is intentionally self-contained. It owns the search page, movie/TV and cast pages, their UI components, TMDB types/helpers, and server-side TMDB client. Nothing here imports `$lib` or AT Protocol code. - -To move the feature to another SvelteKit app, copy this entire `(app)` directory into `src/routes`. - -## Host app requirements - -- SvelteKit 2, Svelte 5, and Tailwind CSS 4 -- `bits-ui` for the keyboard-accessible search command -- `@lorenzopant/tmdb` for typed TMDB requests and image URLs -- A private `TMDB_ACCESS_TOKEN` environment variable containing a TMDB API read access token (`TMDB_API_KEY` remains supported for compatibility) -- A private `OMDB_API_KEY` environment variable for IMDb and Rotten Tomatoes ratings -- `@ethercorps/sveltekit-og` and its `sveltekitOG()` Vite plugin for the movie/TV `og.png` endpoint -- The `base-*` and `accent-*` Tailwind color tokens used by the markup (or replace those utility classes with the new app's palette) - -The `[kind]` route validates `movie` and `tv` itself, so it does not depend on a matcher in `src/params`. diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/+layout.server.ts similarity index 100% rename from src/routes/(app)/+layout.server.ts rename to src/routes/+layout.server.ts diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 65e8182..cd1f73a 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,7 +1,22 @@ -{@render children()} +
+
+ {@render children()} +
+
+
+ + + diff --git a/src/routes/(app)/+page.server.ts b/src/routes/+page.server.ts similarity index 69% rename from src/routes/(app)/+page.server.ts rename to src/routes/+page.server.ts index 75fc111..dc28c1a 100644 --- a/src/routes/(app)/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,4 +1,4 @@ import type { PageServerLoad } from './$types'; -import { getHomePage } from './_lib/tmdb.server'; +import { getHomePage } from '$lib/tmdb.server'; export const load: PageServerLoad = async () => getHomePage(); diff --git a/src/routes/(app)/+page.svelte b/src/routes/+page.svelte similarity index 82% rename from src/routes/(app)/+page.svelte rename to src/routes/+page.svelte index 5e46650..8625960 100644 --- a/src/routes/(app)/+page.svelte +++ b/src/routes/+page.svelte @@ -1,8 +1,8 @@ diff --git a/src/routes/(app)/[kind]/[id]/og.png/+server.ts b/src/routes/[kind]/[id]/og.png/+server.ts similarity index 90% rename from src/routes/(app)/[kind]/[id]/og.png/+server.ts rename to src/routes/[kind]/[id]/og.png/+server.ts index 527cec4..69d9853 100644 --- a/src/routes/(app)/[kind]/[id]/og.png/+server.ts +++ b/src/routes/[kind]/[id]/og.png/+server.ts @@ -1,8 +1,8 @@ import { ImageResponse } from '@ethercorps/sveltekit-og'; import { error, type RequestHandler } from '@sveltejs/kit'; -import { backdropUrl, posterUrl } from '../../../_lib/images'; -import { getDetails, TMDBError } from '../../../_lib/tmdb.server'; -import { isMediaKind, parseTmdbId } from '../../../_lib/utils'; +import { backdropUrl, posterUrl } from '$lib/images'; +import { getDetails, TMDBError } from '$lib/tmdb.server'; +import { isMediaKind, parseTmdbId } from '$lib/utils'; function escapeHtml(value: string) { return value diff --git a/src/routes/(app)/api/search/+server.ts b/src/routes/api/search/+server.ts similarity index 88% rename from src/routes/(app)/api/search/+server.ts rename to src/routes/api/search/+server.ts index 718a6b8..1949c82 100644 --- a/src/routes/(app)/api/search/+server.ts +++ b/src/routes/api/search/+server.ts @@ -1,5 +1,5 @@ import { json, type RequestHandler } from '@sveltejs/kit'; -import { searchMedia, TMDBError } from '../../_lib/tmdb.server'; +import { searchMedia, TMDBError } from '$lib/tmdb.server'; export const GET: RequestHandler = async ({ url, setHeaders }) => { const query = url.searchParams.get('q')?.trim() ?? ''; diff --git a/src/routes/(app)/cast/[id]/+page.server.ts b/src/routes/cast/[id]/+page.server.ts similarity index 86% rename from src/routes/(app)/cast/[id]/+page.server.ts rename to src/routes/cast/[id]/+page.server.ts index bf48bb0..bd20c06 100644 --- a/src/routes/(app)/cast/[id]/+page.server.ts +++ b/src/routes/cast/[id]/+page.server.ts @@ -1,7 +1,7 @@ import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -import { getPersonPage, TMDBError } from '../../_lib/tmdb.server'; -import { parseTmdbId } from '../../_lib/utils'; +import { getPersonPage, TMDBError } from '$lib/tmdb.server'; +import { parseTmdbId } from '$lib/utils'; export const load: PageServerLoad = async ({ params }) => { const id = parseTmdbId(params.id); diff --git a/src/routes/(app)/cast/[id]/+page.svelte b/src/routes/cast/[id]/+page.svelte similarity index 92% rename from src/routes/(app)/cast/[id]/+page.svelte rename to src/routes/cast/[id]/+page.svelte index 2289c2c..ac197cf 100644 --- a/src/routes/(app)/cast/[id]/+page.svelte +++ b/src/routes/cast/[id]/+page.svelte @@ -1,10 +1,10 @@