├── .npmrc ├── src ├── global.d.ts ├── routes │ ├── __layout.svelte │ ├── index.svelte │ └── examples │ │ ├── line-area.svelte │ │ └── bar.svelte ├── lib │ └── layercake-components │ │ ├── ArrowheadDef.svelte │ │ ├── Bar.svelte │ │ ├── Line.svelte │ │ ├── AreaStacked.svelte │ │ ├── Tooltip.svelte │ │ ├── Area.svelte │ │ ├── Scatter.svg.svelte │ │ ├── BarStacked.svelte │ │ ├── ColumnStacked.svelte │ │ ├── MultiLine.svelte │ │ ├── MapPoints.svelte │ │ ├── ColumnLinear.svelte │ │ ├── Annotations.svelte │ │ ├── Scatter.html.svelte │ │ ├── Voronoi.svelte │ │ ├── Column.svelte │ │ ├── ClevelandDotPlot.svelte │ │ ├── Labels.svelte │ │ ├── Scatter.canvas.svelte │ │ ├── SmallMultipleWrapper.svelte │ │ ├── SmallMultipleWrapper.percent-range.svelte │ │ ├── BeeswarmForce.svelte │ │ ├── ClevelandDotPlot.html.svelte │ │ ├── QuadTree.svelte │ │ ├── QuadTree.percent-range.svelte │ │ ├── BeeswarmForce.html.svelte │ │ ├── AxisRadial.svelte │ │ ├── Map.canvas.svelte │ │ ├── Radar.svelte │ │ ├── Sankey.svelte │ │ ├── Key.svelte │ │ ├── AxisY.svelte │ │ ├── Beeswarm.svelte │ │ ├── CalendarMonth.svelte │ │ ├── AxisX.html.svelte │ │ ├── CirclePackForce.svelte │ │ ├── Beeswarm.html.svelte │ │ ├── AxisX.svelte │ │ ├── AxisY.html.svelte │ │ ├── Map.svg.svelte │ │ ├── SyncedBrushWrapper.svelte │ │ ├── SharedTooltip.svelte │ │ ├── SyncedBrushWrapper.percent-range.svelte │ │ ├── SharedTooltip.percent-range.svelte │ │ ├── ForceDirectedGraph.svelte │ │ ├── Arrows.svelte │ │ ├── Brush.svelte │ │ ├── CirclePack.html.svelte │ │ └── Scatter.webgl.svelte └── app.html ├── .gitignore ├── jsconfig.json ├── svelte.config.js ├── package.json └── README.md /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /src/global.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /.svelte-kit 4 | /build 5 | /functions 6 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "$lib/*": ["src/lib/*"] 6 | } 7 | }, 8 | "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] 9 | } 10 | -------------------------------------------------------------------------------- /src/routes/__layout.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/routes/index.svelte: -------------------------------------------------------------------------------- 1 |

Layercake + Svelte kit template

2 | 3 |

Visit layercake.graphics for more information.

4 | 5 |

This repo mostly for trying to get the examples to work with SvelteKit, pull requests welcome with more examples!

6 | -------------------------------------------------------------------------------- /src/lib/layercake-components/ArrowheadDef.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %svelte.head% 8 | 9 | 10 |
%svelte.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('@sveltejs/kit').Config} */ 2 | const config = { 3 | kit: { 4 | target: '#svelte', 5 | 6 | vite: { 7 | ssr: { 8 | noExternal: [] 9 | }, 10 | optimizeDeps: { 11 | include: ['layercake'] 12 | } 13 | } 14 | } 15 | }; 16 | 17 | export default config; -------------------------------------------------------------------------------- /src/lib/layercake-components/Bar.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | {#each $data as d, i} 10 | 19 | {/each} 20 | 21 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Line.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | 17 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/lib/layercake-components/AreaStacked.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | {#each $data as d} 17 | 22 | {/each} 23 | 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "layercake-sveltekit-template", 3 | "version": "0.0.1", 4 | "scripts": { 5 | "dev": "svelte-kit dev", 6 | "build": "svelte-kit build", 7 | "preview": "svelte-kit preview" 8 | }, 9 | "devDependencies": { 10 | "@sveltejs/kit": "next", 11 | "svelte-preprocess": "^4.7.3", 12 | "svelte": "^3.34.0", 13 | "d3-color": "^2.0.0", 14 | "d3-format": "^2.0.0", 15 | "d3-interpolate": "^2.0.1", 16 | "d3-time-format": "^3.0.0" 17 | }, 18 | "type": "module", 19 | "dependencies": { 20 | "layercake": "^4.1.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Tooltip.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 | 18 | 19 | {#if evt.detail} 20 |
27 | 28 |
29 | {/if} 30 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Area.svelte: -------------------------------------------------------------------------------- 1 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Scatter.svg.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | {#each $data as d} 16 | 24 | {/each} 25 | 26 | -------------------------------------------------------------------------------- /src/lib/layercake-components/BarStacked.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | {#each $data as series} 15 | {#each series as d, i} 16 | 25 | {/each} 26 | {/each} 27 | 28 | -------------------------------------------------------------------------------- /src/lib/layercake-components/ColumnStacked.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | {#each $data as series, i} 15 | {#each series as d} 16 | 25 | {/each} 26 | {/each} 27 | 28 | -------------------------------------------------------------------------------- /src/lib/layercake-components/MultiLine.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 | {#each $data as group} 17 | 22 | {/each} 23 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /src/lib/layercake-components/MapPoints.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | {#each pointsData as d} 20 | 25 | 26 | {/each} 27 | 28 | 29 | 36 | -------------------------------------------------------------------------------- /src/lib/layercake-components/ColumnLinear.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | {#each $data as d, i} 24 | 35 | {/each} 36 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Annotations.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 |
25 | {#each annotations as d, i} 26 |
{d.text}
31 | {/each} 32 |
33 | 34 | 39 | 40 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Scatter.html.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 |
15 | {#each $data as d} 16 |
27 | {/each} 28 |
29 | 30 | 37 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Voronoi.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 35 | 36 | {#each uniquePoints as point, i} 37 | 38 | {/each} 39 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Column.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | {#each $data as d, i} 26 | 37 | {/each} 38 | 39 | -------------------------------------------------------------------------------- /src/lib/layercake-components/ClevelandDotPlot.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | {#each $data as row} 14 | 15 | 21 | 22 | {#each $xGet(row) as circleX, i} 23 | 29 | {/each} 30 | 31 | {/each} 32 | 33 | 34 | 44 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Labels.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | {#each $data as group} 20 |
{cap(group.key)}
27 | {/each} 28 | 29 | 36 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Scatter.canvas.svelte: -------------------------------------------------------------------------------- 1 | 35 | -------------------------------------------------------------------------------- /src/routes/examples/line-area.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 | 29 | 30 |
31 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
44 | -------------------------------------------------------------------------------- /src/lib/layercake-components/SmallMultipleWrapper.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | d.field === 'x').accessor} 31 | y={extentGetters.find(d => d.field === 'y').accessor} 32 | {data} 33 | xDomain={$xDomain} 34 | yDomain={$yDomain} 35 | > 36 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # create-svelte 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte); 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm init svelte@next 12 | 13 | # create a new project in my-app 14 | npm init svelte@next my-app 15 | ``` 16 | 17 | > Note: the `@next` is temporary 18 | 19 | ## Developing 20 | 21 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 22 | 23 | ```bash 24 | npm run dev 25 | 26 | # or start the server and open the app in a new browser tab 27 | npm run dev -- --open 28 | ``` 29 | 30 | ## Building 31 | 32 | Before creating a production version of your app, install an [adapter](https://kit.svelte.dev/docs#adapters) for your target environment. Then: 33 | 34 | ```bash 35 | npm run build 36 | ``` 37 | 38 | > You can preview the built app with `npm run preview`, regardless of whether you installed an adapter. This should _not_ be used to serve your app in production. 39 | -------------------------------------------------------------------------------- /src/lib/layercake-components/SmallMultipleWrapper.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | d.field === 'x').accessor} 33 | y={extentGetters.find(d => d.field === 'y').accessor} 34 | {data} 35 | xDomain={$xDomain} 36 | yDomain={$yDomain} 37 | > 38 | 39 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/lib/layercake-components/BeeswarmForce.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 | 32 | {#each simulation.nodes() as node} 33 | 41 | {$custom.getTitle(node)} 42 | 43 | {/each} 44 | 45 | -------------------------------------------------------------------------------- /src/lib/layercake-components/ClevelandDotPlot.html.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 | {#each $data as row} 14 |
15 |
23 | 24 | {#each $xGet(row) as circleX, i} 25 |
35 | {/each} 36 |
37 | {/each} 38 |
39 | 40 | 53 | -------------------------------------------------------------------------------- /src/lib/layercake-components/QuadTree.svelte: -------------------------------------------------------------------------------- 1 | 36 | 37 | 46 | 47 |
52 | 59 | -------------------------------------------------------------------------------- /src/lib/layercake-components/QuadTree.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 40 | 41 | 50 | 51 |
56 | 63 | -------------------------------------------------------------------------------- /src/lib/layercake-components/BeeswarmForce.html.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 |
32 | {#each simulation.nodes() as node} 33 |
45 | {$custom.getTitle(node)} 46 |
47 | {/each} 48 |
49 | 50 | 58 | -------------------------------------------------------------------------------- /src/lib/layercake-components/AxisRadial.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | 26 | 35 | 43 | 44 | {#each $config.x as label, i} 45 | 54 | 55 | {label} 61 | {/each} 62 | 63 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Map.canvas.svelte: -------------------------------------------------------------------------------- 1 | 55 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Radar.svelte: -------------------------------------------------------------------------------- 1 | 29 | 30 | 33 | {#each $data as row} 34 | 35 | 42 | 43 | 44 | {#each $xGet(row) as circleR, i} 45 | 53 | {/each} 54 | {/each} 55 | 56 | 57 | 64 | -------------------------------------------------------------------------------- /src/routes/examples/bar.svelte: -------------------------------------------------------------------------------- 1 | 39 | 40 | 54 | 55 |
56 | 65 | 66 | 71 | 74 | 75 | 76 | 77 |
-------------------------------------------------------------------------------- /src/lib/layercake-components/Sankey.svelte: -------------------------------------------------------------------------------- 1 | 34 | 35 | 40 | 41 | 42 | 43 | {#each sankeyData.links as d} 44 | 50 | {/each} 51 | 52 | 53 | {#each sankeyData.nodes as d, i} 54 | 60 | 67 | {d.id} 68 | 69 | {/each} 70 | 71 | 72 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Key.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 68 | 69 |
70 | {#each $zDomain as item} 71 |
72 |
79 |
{displayName(item)}
80 |
81 | {/each} 82 |
83 | -------------------------------------------------------------------------------- /src/lib/layercake-components/AxisY.svelte: -------------------------------------------------------------------------------- 1 | 25 | 26 | 27 | {#each tickVals as tick, i} 28 | 29 | {#if gridlines !== false} 30 | 36 | {/if} 37 | {#if tickMarks === true} 38 | 45 | {/if} 46 | {formatTick(tick)} 53 | 54 | {/each} 55 | 56 | 57 | 78 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Beeswarm.svelte: -------------------------------------------------------------------------------- 1 | 57 | 58 | 59 | {#each circles as d} 60 | 68 | {$custom.getTitle(d)} 69 | 70 | {/each} 71 | 72 | -------------------------------------------------------------------------------- /src/lib/layercake-components/CalendarMonth.svelte: -------------------------------------------------------------------------------- 1 | 59 | 60 | {#each days as day} 61 | 70 | {/each} 71 | 72 | 79 | -------------------------------------------------------------------------------- /src/lib/layercake-components/AxisX.html.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 |
26 | {#each tickVals as tick, i} 27 | {#if gridlines !== false} 28 |
29 | {/if} 30 | {#if tickMarks === true} 31 |
32 | {/if} 33 |
36 |
{formatTick(tick)}
39 |
40 | {/each} 41 | {#if baseline === true} 42 |
43 | {/if} 44 |
45 | 46 | 88 | -------------------------------------------------------------------------------- /src/lib/layercake-components/CirclePackForce.svelte: -------------------------------------------------------------------------------- 1 | 60 | {#each nodes as point} 61 | 70 | 71 | 72 | {/each} 73 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Beeswarm.html.svelte: -------------------------------------------------------------------------------- 1 | 57 | 58 |
59 | {#each circles as d} 60 |
72 | {$custom.getTitle(d)} 73 |
74 | {/each} 75 |
76 | 77 | 85 | -------------------------------------------------------------------------------- /src/lib/layercake-components/AxisX.svelte: -------------------------------------------------------------------------------- 1 | 38 | 39 | 40 | {#each tickVals as tick, i} 41 | 42 | {#if gridlines !== false} 43 | 44 | {/if} 45 | {#if tickMarks === true} 46 | 47 | {/if} 48 | {formatTick(tick)} 54 | 55 | {/each} 56 | {#if baseline === true} 57 | 58 | {/if} 59 | 60 | 61 | 89 | -------------------------------------------------------------------------------- /src/lib/layercake-components/AxisY.html.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 |
28 | {#each tickVals as tick, i} 29 |
30 | {#if gridlines !== false} 31 |
32 | {/if} 33 | {#if baseline !== false && i === 0} 34 |
35 | {/if} 36 | {#if tickMarks === true} 37 |
38 | {/if} 39 |
{formatTick(tick)}
47 |
48 | {/each} 49 |
50 | 51 | 85 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Map.svg.svelte: -------------------------------------------------------------------------------- 1 | 53 | 54 | dispatch('mouseout')} 57 | > 58 | {#each features as feature} 59 | dispatch('mousemove', { e, props: feature.properties })} 66 | on:mousemove={handleMousemove(feature)} 67 | > 68 | {/each} 69 | 70 | 71 | 81 | -------------------------------------------------------------------------------- /src/lib/layercake-components/SyncedBrushWrapper.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 | 45 | 46 |
47 |
48 | 55 | 56 | { 58 | const filtered = ticks.filter(t => t % 1 === 0); 59 | if (filtered.length > 7) { 60 | return filtered.filter((t, i) => i % 2 === 0); 61 | } 62 | return filtered; 63 | }} 64 | /> 65 | 68 | 71 | 74 | 75 | 76 |
77 | 78 |
79 | 86 | 87 | 90 | 93 | 94 | 95 | 99 | 100 | 101 |
102 |
103 | -------------------------------------------------------------------------------- /src/lib/layercake-components/SharedTooltip.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 69 | 70 | 79 | {#if visible === true} 80 |
83 |
91 |
{formatTitle(found[$config.x])}
92 | {#each sortResult(found) as row} 93 |
{formatKey(row.key)}: {formatValue(row.value)}
94 | {/each} 95 |
96 | {/if} 97 |
98 | 99 | -------------------------------------------------------------------------------- /src/lib/layercake-components/SyncedBrushWrapper.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 24 | 25 | 45 | 46 |
47 |
48 | 57 | 58 | { 60 | const filtered = ticks.filter(t => t % 1 === 0); 61 | if (filtered.length > 7) { 62 | return filtered.filter((t, i) => i % 2 === 0); 63 | } 64 | return filtered; 65 | }} 66 | /> 67 | 70 | 71 | 72 | 75 | 78 | 79 | 80 |
81 | 82 |
83 | 92 | 93 | 96 | 99 | 100 | 101 | 105 | 106 | 107 |
108 |
109 | -------------------------------------------------------------------------------- /src/lib/layercake-components/SharedTooltip.percent-range.svelte: -------------------------------------------------------------------------------- 1 | 37 | 38 | 68 | 69 | 78 | {#if visible === true} 79 |
82 |
90 |
{formatTitle(found[$config.x])}
91 | {#each sortResult(found) as row} 92 |
{formatKey(row.key)}: {formatValue(row.value)}
93 | {/each} 94 |
95 | {/if} 96 |
97 | 98 | -------------------------------------------------------------------------------- /src/lib/layercake-components/ForceDirectedGraph.svelte: -------------------------------------------------------------------------------- 1 | 68 | {#each links as link} 69 | 70 | 76 | {$x(link.source)} 77 | 78 | 79 | {/each} 80 | 81 | {#each nodes as point} 82 | 91 | {$x(point)} 92 | 93 | {/each} 94 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Arrows.svelte: -------------------------------------------------------------------------------- 1 | 70 | 71 | 72 | {#if annotations.length} 73 | 74 | {#each annotations as anno, i} 75 | {#if anno.arrows} 76 | {#each anno.arrows as arrow} 77 | 80 | {/each} 81 | {/if} 82 | {/each} 83 | 84 | {/if} 85 | 86 | 98 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Brush.svelte: -------------------------------------------------------------------------------- 1 | 86 | 87 |
88 | {#if min !== null} 89 |
90 |
91 |
92 | {/if} 93 |
94 | 95 | 128 | -------------------------------------------------------------------------------- /src/lib/layercake-components/CirclePack.html.svelte: -------------------------------------------------------------------------------- 1 | 62 | 63 |
64 | {#each descendants as d} 65 |
70 |
74 |
87 |
{titleCase(d.data.id)}
88 | {#if d.data.data[valueKey]} 89 |
{commas(d.data.data[valueKey])}
90 | {/if} 91 |
92 |
93 | {/each} 94 |
95 | 96 | 156 | -------------------------------------------------------------------------------- /src/lib/layercake-components/Scatter.webgl.svelte: -------------------------------------------------------------------------------- 1 | 154 | --------------------------------------------------------------------------------