diff --git a/package.json b/package.json index 09a22b0..ed6796d 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "bech32": "^2.0.0", "bip39": "^3.1.0", "buffer": "^6.0.3", + "d3-force": "^3.0.0", "date-fns": "^3.6.0", "dompurify": "^3.0.6", "dotenv": "^17.2.3", @@ -88,6 +89,7 @@ "@tailwindcss/forms": "^0.5.10", "@tailwindcss/postcss": "^4.1.13", "@tailwindcss/typography": "^0.5.19", + "@types/d3-force": "^3.0.10", "@types/dompurify": "^3.0.5", "@types/markdown-it": "^13.0.7", "@typescript-eslint/eslint-plugin": "^6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67c7509..8924770 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,6 +101,9 @@ importers: buffer: specifier: ^6.0.3 version: 6.0.3 + d3-force: + specifier: ^3.0.0 + version: 3.0.0 date-fns: specifier: ^3.6.0 version: 3.6.0 @@ -198,6 +201,9 @@ importers: '@tailwindcss/typography': specifier: ^0.5.19 version: 0.5.19(tailwindcss@4.1.13) + '@types/d3-force': + specifier: ^3.0.10 + version: 3.0.10 '@types/dompurify': specifier: ^3.0.5 version: 3.2.0 @@ -1529,6 +1535,9 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + '@types/dompurify@3.2.0': resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. @@ -2245,6 +2254,22 @@ packages: engines: {node: '>=4'} hasBin: true + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -6372,6 +6397,8 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/d3-force@3.0.10': {} + '@types/dompurify@3.2.0': dependencies: dompurify: 3.3.1 @@ -7201,6 +7228,18 @@ snapshots: cssesc@3.0.0: {} + d3-dispatch@3.0.1: {} + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-quadtree@3.0.1: {} + + d3-timer@3.0.1: {} + d@1.0.2: dependencies: es5-ext: 0.10.64 diff --git a/src/components/CulinaryMesh.svelte b/src/components/CulinaryMesh.svelte new file mode 100644 index 0000000..e7142ee --- /dev/null +++ b/src/components/CulinaryMesh.svelte @@ -0,0 +1,610 @@ + + +
+ + + + + +
+ + diff --git a/src/components/DesktopSideNav.svelte b/src/components/DesktopSideNav.svelte index de2dfef..0664d43 100644 --- a/src/components/DesktopSideNav.svelte +++ b/src/components/DesktopSideNav.svelte @@ -76,8 +76,7 @@ href: '/groups', label: 'Groups', icon: UsersThreeIcon, - match: (p) => p.startsWith('/groups'), - badge: 'members' + match: (p) => p.startsWith('/groups') }, { href: '/messages', diff --git a/src/components/MembershipBeltBadge.svelte b/src/components/MembershipBeltBadge.svelte new file mode 100644 index 0000000..e7e999d --- /dev/null +++ b/src/components/MembershipBeltBadge.svelte @@ -0,0 +1,111 @@ + + +{#if isActiveMember} + + + + + + + + + + + + + + +{/if} diff --git a/src/components/UserSidePanel.svelte b/src/components/UserSidePanel.svelte index d3007b8..81ce58c 100644 --- a/src/components/UserSidePanel.svelte +++ b/src/components/UserSidePanel.svelte @@ -445,9 +445,6 @@ > The Pantry - Members diff --git a/src/components/mesh/MeshCanvas.svelte b/src/components/mesh/MeshCanvas.svelte new file mode 100644 index 0000000..6e0adcb --- /dev/null +++ b/src/components/mesh/MeshCanvas.svelte @@ -0,0 +1,187 @@ + + + diff --git a/src/components/mesh/MeshControlPanel.svelte b/src/components/mesh/MeshControlPanel.svelte new file mode 100644 index 0000000..e6332eb --- /dev/null +++ b/src/components/mesh/MeshControlPanel.svelte @@ -0,0 +1,401 @@ + + +
+ +
+
+

+ {isConstellation ? 'Star Map' : 'Culinary Mesh'} +

+ {#if !loading && !hasError} +

+ {recipeCount} recipes · {tagCount} tags · {connectionCount} connections +

+ {/if} +
+ +
+ + + + + +
+
+ + + {#if showFilters} +
+ +
+ + {#if searchValue} + + {/if} +
+ + +
+ Layers: +
+ + + +
+
+ + + {#if cuisineTags.length > 0} +
+ Cuisine: +
+ {#each cuisineTags.slice(0, 12) as tag} + + {/each} +
+
+ {/if} + + + {#if hasActiveFilters} +
+ +
+ {/if} +
+ {/if} +
+ + diff --git a/src/components/mesh/MeshDetailDrawer.svelte b/src/components/mesh/MeshDetailDrawer.svelte new file mode 100644 index 0000000..9ada699 --- /dev/null +++ b/src/components/mesh/MeshDetailDrawer.svelte @@ -0,0 +1,259 @@ + + + + + +