From 2af01695152ca894b8ced76464ee6087f19a0fa3 Mon Sep 17 00:00:00 2001 From: Ignatius Bagus Date: Sun, 31 Mar 2024 16:57:36 +0700 Subject: [PATCH 1/5] dogfooding svelte 5 --- package.json | 4 +- pnpm-lock.yaml | 142 +++++++++++----------- src/app.d.ts | 2 +- src/client/svelte.js | 7 +- src/entry.ts | 4 +- src/lib/components/Button.svelte | 13 +- src/lib/components/Divider.svelte | 8 +- src/lib/components/Indexer.svelte | 15 ++- src/lib/components/Resizable.svelte | 14 ++- src/lib/nodes/Block.svelte | 14 ++- src/lib/nodes/Element.svelte | 37 +++--- src/lib/nodes/ElementAttributes.svelte | 26 ++-- src/lib/nodes/Ellipsis.svelte | 10 +- src/lib/nodes/Iteration.svelte | 10 +- src/lib/nodes/Node.svelte | 45 +++---- src/lib/nodes/Slot.svelte | 10 +- src/lib/panel/Editable.svelte | 27 ++-- src/lib/panel/Expandable.svelte | 48 ++++---- src/lib/panel/PropertyList.svelte | 12 +- src/lib/{runtime.ts => runtime.svelte.ts} | 57 ++++----- src/routes/+layout.svelte | 101 ++++++++------- src/routes/Breadcrumbs.svelte | 25 ++-- src/routes/ConnectMessage.svelte | 2 +- src/routes/Inspector.svelte | 27 ++-- src/routes/ProfileButton.svelte | 4 +- src/routes/Profiler.svelte | 18 +-- src/routes/ProfilerFrame.svelte | 14 ++- src/routes/SearchBox.svelte | 26 ++-- src/routes/VisibilitySelection.svelte | 10 +- svelte.config.js | 4 + 30 files changed, 396 insertions(+), 340 deletions(-) rename src/lib/{runtime.ts => runtime.svelte.ts} (65%) diff --git a/package.json b/package.json index d945580..f64dac6 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "scripts": { "dev": "pnpm run --parallel \"/dev:*/\"", - "dev:app": "vite build --watch", + "dev:app": "vite build -wd --minify=false --sourcemap=inline", "dev:scripts": "rollup -cw", "build": "rollup -c && vite build", "build:zip": "cd build && zip -r svelte-devtools.zip *", @@ -22,7 +22,7 @@ "prettier-plugin-sort-package-json": "^0.2.0", "prettier-plugin-svelte": "^3.2.1", "rollup": "^4.12.0", - "svelte": "^4.2.11", + "svelte": "5.0.0-next.90", "svelte-check": "^3.6.4", "typescript": "^5.3.3", "vite": "^5.1.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f14987..aab52af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ settings: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.0.2 - version: 3.0.2(svelte@4.2.11)(vite@5.1.4) + version: 3.0.2(svelte@5.0.0-next.90)(vite@5.1.4) '@types/chrome': specifier: ^0.0.260 version: 0.0.260 @@ -22,16 +22,16 @@ devDependencies: version: 0.2.0(prettier@3.2.5) prettier-plugin-svelte: specifier: ^3.2.1 - version: 3.2.1(prettier@3.2.5)(svelte@4.2.11) + version: 3.2.1(prettier@3.2.5)(svelte@5.0.0-next.90) rollup: specifier: ^4.12.0 version: 4.12.0 svelte: - specifier: ^4.2.11 - version: 4.2.11 + specifier: 5.0.0-next.90 + version: 5.0.0-next.90 svelte-check: specifier: ^3.6.4 - version: 3.6.4(svelte@4.2.11) + version: 3.6.4(svelte@5.0.0-next.90) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -41,12 +41,12 @@ devDependencies: packages: - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@esbuild/aix-ppc64@0.19.12: @@ -256,13 +256,13 @@ packages: dev: true optional: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@jridgewell/resolve-uri@3.1.2: @@ -270,8 +270,8 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} dev: true @@ -286,6 +286,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -411,7 +418,7 @@ packages: dev: true optional: true - /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4): + /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@5.0.0-next.90)(vite@5.1.4): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} engines: {node: ^18.0.0 || >=20} peerDependencies: @@ -419,28 +426,28 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.11)(vite@5.1.4) + '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@5.0.0-next.90)(vite@5.1.4) debug: 4.3.4 - svelte: 4.2.11 + svelte: 5.0.0-next.90 vite: 5.1.4(@types/node@20.11.19) transitivePeerDependencies: - supports-color dev: true - /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.11)(vite@5.1.4): + /@sveltejs/vite-plugin-svelte@3.0.2(svelte@5.0.0-next.90)(vite@5.1.4): resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} engines: {node: ^18.0.0 || >=20} peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.11)(vite@5.1.4) + '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@5.0.0-next.90)(vite@5.1.4) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.7 - svelte: 4.2.11 - svelte-hmr: 0.15.3(svelte@4.2.11) + svelte: 5.0.0-next.90 + svelte-hmr: 0.15.3(svelte@5.0.0-next.90) vite: 5.1.4(@types/node@20.11.19) vitefu: 0.2.5(vite@5.1.4) transitivePeerDependencies: @@ -482,6 +489,14 @@ packages: resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} dev: true + /acorn-typescript@1.4.13(acorn@8.11.3): + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + dependencies: + acorn: 8.11.3 + dev: true + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} @@ -555,28 +570,10 @@ packages: fsevents: 2.3.3 dev: true - /code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.5 - acorn: 8.11.3 - estree-walker: 3.0.3 - periscopic: 3.1.0 - dev: true - /concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true - /css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.0.2 - dev: true - /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -639,9 +636,14 @@ packages: '@esbuild/win32-x64': 0.19.12 dev: true - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + /esm-env@1.0.0: + resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + dev: true + + /esrap@1.2.1: + resolution: {integrity: sha512-dhkcOLfN/aDdMFI1iwPEcy/XqAZzGNfgfEJjZozy2tia6u0dQoZyXzkRshHTckuNsM+c0CYQndY+uRFe3N+AIQ==} dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 '@types/estree': 1.0.5 dev: true @@ -768,8 +770,11 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /merge2@1.4.1: @@ -845,14 +850,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - dependencies: - '@types/estree': 1.0.5 - estree-walker: 3.0.3 - is-reference: 3.0.2 - dev: true - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -879,14 +876,14 @@ packages: prettier: 3.2.5 dev: true - /prettier-plugin-svelte@3.2.1(prettier@3.2.5)(svelte@4.2.11): + /prettier-plugin-svelte@3.2.1(prettier@3.2.5)(svelte@5.0.0-next.90): resolution: {integrity: sha512-ENAPbIxASf2R79IZwgkG5sBdeNA9kLRlXVvKKmTXh79zWTy0KKoT86XO2pHrTitUPINd+iXWy12MRmgzKGVckA==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 dependencies: prettier: 3.2.5 - svelte: 4.2.11 + svelte: 5.0.0-next.90 dev: true /prettier@3.2.5: @@ -990,7 +987,7 @@ packages: min-indent: 1.0.1 dev: true - /svelte-check@3.6.4(svelte@4.2.11): + /svelte-check@3.6.4(svelte@5.0.0-next.90): resolution: {integrity: sha512-mY/dqucqm46p72M8yZmn81WPZx9mN6uuw8UVfR3ZKQeLxQg5HDGO3HHm5AZuWZPYNMLJ+TRMn+TeN53HfQ/vsw==} hasBin: true peerDependencies: @@ -1002,8 +999,8 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.2.11 - svelte-preprocess: 5.1.3(svelte@4.2.11)(typescript@5.3.3) + svelte: 5.0.0-next.90 + svelte-preprocess: 5.1.3(svelte@5.0.0-next.90)(typescript@5.3.3) typescript: 5.3.3 transitivePeerDependencies: - '@babel/core' @@ -1017,16 +1014,16 @@ packages: - sugarss dev: true - /svelte-hmr@0.15.3(svelte@4.2.11): + /svelte-hmr@0.15.3(svelte@5.0.0-next.90): resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.2.11 + svelte: 5.0.0-next.90 dev: true - /svelte-preprocess@5.1.3(svelte@4.2.11)(typescript@5.3.3): + /svelte-preprocess@5.1.3(svelte@5.0.0-next.90)(typescript@5.3.3): resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} engines: {node: '>= 16.0.0', pnpm: ^8.0.0} requiresBuild: true @@ -1069,28 +1066,27 @@ packages: magic-string: 0.30.7 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.2.11 + svelte: 5.0.0-next.90 typescript: 5.3.3 dev: true - /svelte@4.2.11: - resolution: {integrity: sha512-YIQk3J4X89wOLhjsqIW8tqY3JHPuBdtdOIkASP2PZeAMcSW9RsIjQzMesCrxOF3gdWYC0mKknlKF7OqmLM+Zqg==} - engines: {node: '>=16'} + /svelte@5.0.0-next.90: + resolution: {integrity: sha512-qx5shVIRQ9b3VPgj/rim16dWi3md8B8HjHSO5p6RCSg/GP00f9CVUoUtnuCpT4f7ZnBJa/IG3v2rgW9Zn9zEqg==} + engines: {node: '>=18'} dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 '@types/estree': 1.0.5 acorn: 8.11.3 + acorn-typescript: 1.4.13(acorn@8.11.3) aria-query: 5.3.0 axobject-query: 4.0.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 + esm-env: 1.0.0 + esrap: 1.2.1 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.7 - periscopic: 3.1.0 + magic-string: 0.30.8 + zimmerframe: 1.1.2 dev: true /to-regex-range@5.0.1: @@ -1160,3 +1156,7 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true + + /zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + dev: true diff --git a/src/app.d.ts b/src/app.d.ts index e7fd4d4..70beaea 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -34,7 +34,7 @@ declare global { }; type SvelteBlockDetail = { - id: number; + id: string; source: string; type: | 'anchor' diff --git a/src/client/svelte.js b/src/client/svelte.js index ee19f15..f36958c 100644 --- a/src/client/svelte.js +++ b/src/client/svelte.js @@ -3,7 +3,6 @@ import { listeners } from './listener.js'; /** @type {undefined | SvelteBlockDetail} */ let current_block; -let pointer = 0; /** @param {number | Node} id */ export function getNode(id) { @@ -81,7 +80,7 @@ document.addEventListener('SvelteRegisterComponent', ({ detail }) => { let last_promise; document.addEventListener('SvelteRegisterBlock', ({ detail }) => { const { type, id, block, ...rest } = detail; - const current_node_id = pointer++; + const current_node_id = crypto.randomUUID(); if (block.m) { const original = block.m; @@ -134,7 +133,7 @@ document.addEventListener('SvelteRegisterBlock', ({ detail }) => { // @ts-expect-error - each block fallback group = /** @type {SvelteBlockDetail} */ ({ version: '', - id: pointer++, + id: crypto.randomUUID(), type: 'block', tagName: 'each', container: parent, @@ -214,7 +213,7 @@ document.addEventListener('SvelteDOMInsert', ({ detail }) => { target, // @ts-expect-error - missing properties are irrelevant node: { - id: pointer++, + id: crypto.randomUUID(), type, detail: element, tagName: element.nodeName.toLowerCase(), diff --git a/src/entry.ts b/src/entry.ts index 6775fb8..054f97f 100644 --- a/src/entry.ts +++ b/src/entry.ts @@ -1,12 +1,14 @@ import './app.css'; import App from './routes/+layout.svelte'; +import { mount } from 'svelte'; + if (chrome.devtools.panels.themeName === 'dark') { document.body.classList.add('dark'); } else { document.body.classList.remove('dark'); } -export default new App({ +export default mount(App, { target: document.querySelector('#app')!, }); diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index f6038e0..2f57949 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -1,10 +1,15 @@ - diff --git a/src/lib/components/Divider.svelte b/src/lib/components/Divider.svelte index abd5d57..a44166d 100644 --- a/src/lib/components/Divider.svelte +++ b/src/lib/components/Divider.svelte @@ -1,6 +1,10 @@
diff --git a/src/lib/components/Indexer.svelte b/src/lib/components/Indexer.svelte index 4c69cb8..d966b46 100644 --- a/src/lib/components/Indexer.svelte +++ b/src/lib/components/Indexer.svelte @@ -1,20 +1,19 @@

- {#if i === -1 || $query.length < 2} + {#if i === -1 || app.query.length < 2} {text} {:else} {#if i !== 0}{text.slice(0, i)}{/if} - {text.slice(i, i + $query.length)} - {#if i + $query.length < text.length} - {text.slice(i + $query.length)} + {text.slice(i, i + app.query.length)} + {#if i + app.query.length < text.length} + {text.slice(i + app.query.length)} {/if} {/if}

diff --git a/src/lib/components/Resizable.svelte b/src/lib/components/Resizable.svelte index bb63298..0a0d2ab 100644 --- a/src/lib/components/Resizable.svelte +++ b/src/lib/components/Resizable.svelte @@ -1,13 +1,17 @@ (resizing = false)} - on:mousemove={({ pageX: x, pageY: y }) => { + onmouseup={() => (resizing = false)} + onmousemove={({ pageX: x, pageY: y }) => { if (!resizing) return; size = axis === 'x' ? window.innerWidth - x : window.innerHeight - y; }} @@ -15,7 +19,7 @@ diff --git a/src/lib/nodes/Block.svelte b/src/lib/nodes/Block.svelte index 85310f0..ca44996 100644 --- a/src/lib/nodes/Block.svelte +++ b/src/lib/nodes/Block.svelte @@ -2,20 +2,24 @@ import Indexer from '../components/Indexer.svelte'; import Ellipsis from './Ellipsis.svelte'; - export let tagName: string; - export let source: string | undefined; - export let expanded: boolean; + interface Props { + tagName: string; + source?: string; + expanded: boolean; + } + + let { tagName, source, expanded }: Props = $props(); - {:else} -