From c12063ddea1981909734153f8db5d95f6e8486fd Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 26 Jun 2025 08:56:05 -0400 Subject: [PATCH 01/54] Add civiliation timeline examples --- .../docs/examples/Duration/+page.svelte | 109 ++++++++++++++++++ .../routes/docs/examples/Duration/+page.ts | 11 ++ .../examples/date/civilization-timeline.csv | 52 +++++++++ .../examples/date/civilization-timeline.d.ts | 9 ++ 4 files changed, 181 insertions(+) create mode 100644 packages/layerchart/static/data/examples/date/civilization-timeline.csv create mode 100644 packages/layerchart/static/data/examples/date/civilization-timeline.d.ts diff --git a/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte b/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte index 820c06050..0150a5393 100644 --- a/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte @@ -27,6 +27,10 @@ }; }); + function formatYear(number: number): string { + return Math.sign(number) === -1 ? Math.abs(number) + ' BC' : number + ' AD'; + } + let renderContext = $derived(shared.renderContext as 'svg' | 'canvas'); @@ -345,3 +349,108 @@ + +

Civilization timeline

+ + +
+ + {#snippet tooltip({ context })} + + {#snippet children({ data })} + {data.civilization} + + + + + + + + {/snippet} + + {/snippet} + +
+
+ +

Civilization timeline (dense)

+ + +
+ + {#snippet tooltip({ context })} + + {#snippet children({ data })} + {data.civilization} + + + + + + + + {/snippet} + + {/snippet} + +
+
diff --git a/packages/layerchart/src/routes/docs/examples/Duration/+page.ts b/packages/layerchart/src/routes/docs/examples/Duration/+page.ts index 34d38b74c..b630c13dd 100644 --- a/packages/layerchart/src/routes/docs/examples/Duration/+page.ts +++ b/packages/layerchart/src/routes/docs/examples/Duration/+page.ts @@ -1,6 +1,8 @@ import { csvParse, autoType } from 'd3-dsv'; import pageSource from './+page.svelte?raw'; import type { USEvents } from '$static/data/examples/date/us-events.js'; +import type { CivilizationTimeline } from '$static/data/examples/date/civilization-timeline.js'; +import { sortFunc } from '@layerstack/utils'; export async function load() { return { @@ -17,6 +19,15 @@ export async function load() { }; }); }), + civilizationEvents: await fetch('/data/examples/date/civilization-timeline.csv').then( + async (r) => { + return csvParse( + await r.text(), + // @ts-expect-error + autoType + ).sort(sortFunc('start')); + } + ), meta: { pageSource, supportedContexts: ['svg', 'canvas'], diff --git a/packages/layerchart/static/data/examples/date/civilization-timeline.csv b/packages/layerchart/static/data/examples/date/civilization-timeline.csv new file mode 100644 index 000000000..33dd19b4b --- /dev/null +++ b/packages/layerchart/static/data/examples/date/civilization-timeline.csv @@ -0,0 +1,52 @@ +civilization,start,end,startLabel,endLabel,region,timeline +Aegean civilization,-2000,-1200,,,Europe (and colonial offshoots),ANCIENT WORLD +"Age of pre-colonial civilization (Christian, Islamic, and traditional kingdoms)",650,1880,,,Sub-Saharan Africa,MEDIEVAL WORLD +Age of Turkic empires,500,1200,,,Middle East,MEDIEVAL WORLD +Age of united Caliphate,650,900,,,Middle East,MEDIEVAL WORLD +Ancient Andean region,-1000,500,,,pre-colonial Americas,ANCIENT WORLD +Ancient China,-2000,500,,,East Asia,ANCIENT WORLD +Ancient Steppe empires,-1000,500,,,the Steppe,ANCIENT WORLD +British India,1800,1945,,WWII,South Asia,MODERN WORLD +Classic age of Mesoamerica,100,900,,,pre-colonial Americas,ANCIENT WORLD +Colonial Africa,1880,1980,,,Sub-Saharan Africa,MODERN WORLD +Colonial United States,1500,1776,,,Europe (and colonial offshoots),MODERN WORLD +Early Islamic period,1200,1500,,,South Asia,MEDIEVAL WORLD +Early modern China,1500,1918,,WWI,East Asia,MODERN WORLD +Early modern Europe,1500,1800,,,Europe (and colonial offshoots),MODERN WORLD +Early Nubian civilization,-2000,-1000,,,Sub-Saharan Africa,ANCIENT WORLD +Egyptian civilization,-3000,-550,,,Middle East,ANCIENT WORLD +First Persian Empire,-550,-330,,,Middle East,ANCIENT WORLD +Formative age of Mesoamerica,-1500,100,,,pre-colonial Americas,ANCIENT WORLD +Formative Japan (age of Yamato rule),500,800,,,East Asia,MEDIEVAL WORLD +Formative US,1776,1865,,,Europe (and colonial offshoots),MODERN WORLD +Fractured Islamic world,900,2018,,present,Middle East,MODERN WORLD +Great power US,1865,1945,,WWII,Europe (and colonial offshoots),MODERN WORLD +Greek age,-1200,0,,,Europe (and colonial offshoots),ANCIENT WORLD +Heian age,800,1200,,,East Asia,MEDIEVAL WORLD +Imperial Japan,1870,1945,,WWII,East Asia,MODERN WORLD +Indian kingdom age,-500,1200,,,South Asia,ANCIENT WORLD +Indus civilization,-2500,-1500,,,South Asia,ANCIENT WORLD +Inter-Persian period,-330,200,,,Middle East,ANCIENT WORLD +Kush,-1000,300,,,Sub-Saharan Africa,ANCIENT WORLD +Medieval Andean region,500,1530,,,pre-colonial Americas,MEDIEVAL WORLD +Medieval China,500,1500,,,East Asia,MEDIEVAL WORLD +Medieval Europe,500,1500,,,Europe (and colonial offshoots),MEDIEVAL WORLD +Mesopotamian civilization,-3500,-550,,,Middle East,ANCIENT WORLD +Modern Africa,1980,2018,WWII,present,Sub-Saharan Africa,MODERN WORLD +Modern Europe,1800,2018,,present,Europe (and colonial offshoots),MODERN WORLD +Modern India,1945,2018,,present,South Asia,MODERN WORLD +Modern Japan,1945,2018,,present,East Asia,MODERN WORLD +Mongol Empire,1200,1300,,,the Steppe,MEDIEVAL WORLD +Mughal Empire,1500,1800,,,South Asia,MODERN WORLD +Peak of Aksum,300,650,,,Sub-Saharan Africa,MEDIEVAL WORLD +People's Republic of China,1945,2018,WWII,present,East Asia,MODERN WORLD +Postclassic age of Mesoamerica,900,1520,,,pre-colonial Americas,MEDIEVAL WORLD +Ptolemaic Egypt,-330,0,,,Middle East,ANCIENT WORLD +Republic of China,1918,1945,,,East Asia,MODERN WORLD +Roman > Byzantine Egypt,0,650,,,Middle East,ANCIENT WORLD +Roman Empire,0,500,,,Europe (and colonial offshoots),ANCIENT WORLD +Roman Republic,-500,0,,,Europe (and colonial offshoots),ANCIENT WORLD +Second Persian Empire,-200,650,,,Middle East,ANCIENT WORLD +Shogunate,1200,1870,,,East Asia,MEDIEVAL WORLD +Superpower US,1945,2018,,present,Europe (and colonial offshoots),MODERN WORLD +Vedic age,-1500,-500,,,South Asia,ANCIENT WORLD \ No newline at end of file diff --git a/packages/layerchart/static/data/examples/date/civilization-timeline.d.ts b/packages/layerchart/static/data/examples/date/civilization-timeline.d.ts new file mode 100644 index 000000000..8f147c710 --- /dev/null +++ b/packages/layerchart/static/data/examples/date/civilization-timeline.d.ts @@ -0,0 +1,9 @@ +export type CivilizationTimeline = { + civilization: string; + start: number; + end: number; + startLabel: string; + endLabel: string; + region: string; + timeline: string; +}; From eac6589b4d35edb33ecaed935f146094ef88edf4 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Sun, 29 Jun 2025 12:04:04 -0400 Subject: [PATCH 02/54] docs(Axis): Update scale override example to set ticks based on width --- .../layerchart/src/routes/docs/components/Axis/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/layerchart/src/routes/docs/components/Axis/+page.svelte b/packages/layerchart/src/routes/docs/components/Axis/+page.svelte index 886e6efa0..a02fa3678 100644 --- a/packages/layerchart/src/routes/docs/components/Axis/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Axis/+page.svelte @@ -441,13 +441,13 @@

Override axis ticks with custom scale

-
+
scaleTime(scale.domain(), scale.range()).ticks()} + ticks={(scale) => scaleTime(scale.domain(), scale.range()).ticks(scale.range()[1] / 80)} /> From 08348a10ec4eeb42d8e89b0d97848ce6bde5ef6f Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Wed, 2 Jul 2025 10:11:30 -0400 Subject: [PATCH 03/54] move import --- packages/layerchart/src/routes/docs/+layout.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/layerchart/src/routes/docs/+layout.svelte b/packages/layerchart/src/routes/docs/+layout.svelte index d134a16df..a72d04414 100644 --- a/packages/layerchart/src/routes/docs/+layout.svelte +++ b/packages/layerchart/src/routes/docs/+layout.svelte @@ -14,8 +14,6 @@ mdiGithub, mdiLink, } from '@mdi/js'; - // @ts-expect-error - import IconAlignLeft from '~icons/lucide/align-left'; import { ApiDocs, @@ -42,7 +40,9 @@ import { page } from '$app/state'; import { shared } from './shared.svelte.js'; - // @ts-ignore + // @ts-expect-error + import IconAlignLeft from '~icons/lucide/align-left'; + // @ts-expect-error import IconSettings from '~icons/lucide/settings'; const { children } = $props(); From 09aff3eacfd26d6f0aaace069c0a30c79ec539a5 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 3 Jul 2025 09:15:37 -0400 Subject: [PATCH 04/54] fix(Axis): Fix memory leak and improve performance when tick values are `Date` instances (#586) --- .changeset/old-lions-hide.md | 5 +++++ packages/layerchart/src/lib/components/Axis.svelte | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/old-lions-hide.md diff --git a/.changeset/old-lions-hide.md b/.changeset/old-lions-hide.md new file mode 100644 index 000000000..16224e791 --- /dev/null +++ b/.changeset/old-lions-hide.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Axis): Fix memory leak and improve performance when tick values are `Date` instances diff --git a/packages/layerchart/src/lib/components/Axis.svelte b/packages/layerchart/src/lib/components/Axis.svelte index ea270347b..8eb8193f2 100644 --- a/packages/layerchart/src/lib/components/Axis.svelte +++ b/packages/layerchart/src/lib/components/Axis.svelte @@ -400,7 +400,7 @@ {/if} - {#each tickVals as tick, index (tick)} + {#each tickVals as tick, index (tick.valueOf())} {@const tickCoords = getCoords(tick)} {@const [radialTickCoordsX, radialTickCoordsY] = pointRadial(tickCoords.x, tickCoords.y)} {@const [radialTickMarkCoordsX, radialTickMarkCoordsY] = pointRadial( From 7001e66e9ef02934e71b607baf0ce7194fae9947 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 09:22:36 -0400 Subject: [PATCH 05/54] Version Packages (next) (#587) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 1 + packages/layerchart/CHANGELOG.md | 6 ++++++ packages/layerchart/package.json | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 7a9c31a93..47ec47d24 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -52,6 +52,7 @@ "nine-pens-design", "ninety-ghosts-taste", "odd-pears-float", + "old-lions-hide", "open-bushes-run", "open-houses-vanish", "pink-flies-worry", diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index 26e8c4f43..c4b8159b0 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,11 @@ # LayerChart +## 2.0.0-next.28 + +### Patch Changes + +- fix(Axis): Fix memory leak and improve performance when tick values are `Date` instances ([#586](https://github.com/techniq/layerchart/pull/586)) + ## 2.0.0-next.27 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 836a02a2e..ab7f4c35a 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "2.0.0-next.27", + "version": "2.0.0-next.28", "scripts": { "dev": "vite dev --port 3002", "build": "vite build", From 0e0d337ee9338f5d94a44db1d8e850be88c31d00 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 3 Jul 2025 23:12:04 -0400 Subject: [PATCH 06/54] Improve getting started section --- .../src/routes/getting-started/+page.svelte | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/packages/layerchart/src/routes/getting-started/+page.svelte b/packages/layerchart/src/routes/getting-started/+page.svelte index 1327d89fe..2d3b7b437 100644 --- a/packages/layerchart/src/routes/getting-started/+page.svelte +++ b/packages/layerchart/src/routes/getting-started/+page.svelte @@ -43,7 +43,7 @@ guide.

- You can use LayerChart with your existing project, such as + You can also use LayerChart within your existing project, such as Skeleton, shadcn-svelte, or Daisy UI. See @@ -90,9 +90,54 @@ Tailwind + >.
- + + +

+ You will also need to add a few theme colors to your Tailwind config. This can be done + explicitly (includig mapping to existing CSS variables of popular frameworks). +

+ + + +

or by leveraging one of LayerStack's themes.

+ +

Usage

From 09d72cfbbd2949573364f34c4ef363d526fce890 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Sat, 5 Jul 2025 10:47:18 -0400 Subject: [PATCH 07/54] fix(Axis): Fix display of axis labels (#591) --- .changeset/cyan-cougars-occur.md | 5 + .../layerchart/src/lib/components/Axis.svelte | 6 +- .../routes/docs/components/Axis/+page.svelte | 123 ++++++++++++------ 3 files changed, 94 insertions(+), 40 deletions(-) create mode 100644 .changeset/cyan-cougars-occur.md diff --git a/.changeset/cyan-cougars-occur.md b/.changeset/cyan-cougars-occur.md new file mode 100644 index 000000000..cc2bfe564 --- /dev/null +++ b/.changeset/cyan-cougars-occur.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Axis): Fix display of axis labels diff --git a/packages/layerchart/src/lib/components/Axis.svelte b/packages/layerchart/src/lib/components/Axis.svelte index 8eb8193f2..46e630faa 100644 --- a/packages/layerchart/src/lib/components/Axis.svelte +++ b/packages/layerchart/src/lib/components/Axis.svelte @@ -361,13 +361,15 @@ }); const resolvedLabelProps = $derived({ - value: typeof label === 'function' ? '' : undefined, + value: typeof label === 'function' ? '' : label, x: resolvedLabelX, y: resolvedLabelY, textAnchor: resolvedLabelTextAnchor, verticalAnchor: resolvedLabelVerticalAnchor, rotate: orientation === 'vertical' && labelPlacement === 'middle' ? -90 : 0, - capHeight: '.5rem', // text-[10px] + // complement 10px text (until Text supports custom styles) + capHeight: '7px', + lineHeight: '11px', ...labelProps, class: cls( layerClass('axis-label'), diff --git a/packages/layerchart/src/routes/docs/components/Axis/+page.svelte b/packages/layerchart/src/routes/docs/components/Axis/+page.svelte index a02fa3678..7d8e85c70 100644 --- a/packages/layerchart/src/routes/docs/components/Axis/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Axis/+page.svelte @@ -12,6 +12,7 @@ timeMillisecond, } from 'd3-time'; import { RangeField } from 'svelte-ux'; + import { startOfInterval } from '@layerstack/utils'; import Preview from '$lib/docs/Preview.svelte'; @@ -21,31 +22,43 @@ const largeData = createDateSeries({ count: 100, min: 50, max: 100, value: 'integer' }); - const now = new Date(); + const today = startOfInterval('day', new Date()); - let initialXDomain = [timeYear.offset(now, -4), now]; - let xDomain = $state([timeYear.offset(now, -4), now]); + let initialXDomain = [timeYear.offset(today, -4), today]; + let xDomain = $state([timeYear.offset(today, -4), today]); const timeScaleExamples = [ - { label: '5 years', domain: [timeYear.offset(now, -5), now], interval: timeYear.every(1) }, - { label: '1 year', domain: [timeYear.offset(now, -1), now], interval: timeMonth.every(1) }, - { label: '6 months', domain: [timeMonth.offset(now, -6), now], interval: timeMonth.every(1) }, - { label: '90 days', domain: [timeDay.offset(now, -90), now], interval: timeDay.every(7) }, - { label: '30 days', domain: [timeDay.offset(now, -30), now], interval: timeDay.every(1) }, - { label: '10 days', domain: [timeDay.offset(now, -10), now], interval: timeDay.every(1) }, - { label: '7 days', domain: [timeDay.offset(now, -7), now], interval: timeDay.every(1) }, - { label: '3 days', domain: [timeDay.offset(now, -3), now], interval: timeHour.every(4) }, - { label: '24 hours', domain: [timeHour.offset(now, -24), now], interval: timeHour.every(1) }, - { label: '12 hours', domain: [timeHour.offset(now, -12), now], interval: timeHour.every(1) }, - { label: '1 hour', domain: [timeHour.offset(now, -1), now], interval: timeMinute.every(5) }, + { label: '5 years', domain: [timeYear.offset(today, -5), today], interval: timeYear.every(1) }, + { label: '1 year', domain: [timeYear.offset(today, -1), today], interval: timeMonth.every(1) }, + { + label: '6 months', + domain: [timeMonth.offset(today, -6), today], + interval: timeMonth.every(1), + }, + { label: '90 days', domain: [timeDay.offset(today, -90), today], interval: timeDay.every(7) }, + { label: '30 days', domain: [timeDay.offset(today, -30), today], interval: timeDay.every(1) }, + { label: '10 days', domain: [timeDay.offset(today, -10), today], interval: timeDay.every(1) }, + { label: '7 days', domain: [timeDay.offset(today, -7), today], interval: timeDay.every(1) }, + { label: '3 days', domain: [timeDay.offset(today, -3), today], interval: timeHour.every(4) }, + { + label: '24 hours', + domain: [timeHour.offset(today, -24), today], + interval: timeHour.every(1), + }, + { + label: '12 hours', + domain: [timeHour.offset(today, -12), today], + interval: timeHour.every(1), + }, + { label: '1 hour', domain: [timeHour.offset(today, -1), today], interval: timeMinute.every(5) }, { label: '1 minute', - domain: [timeMinute.offset(now, -1), now], + domain: [timeMinute.offset(today, -1), today], interval: timeSecond.every(10), }, { label: '1 second', - domain: [timeSecond.offset(now, -1), now], + domain: [timeSecond.offset(today, -1), today], interval: timeMillisecond.every(100), }, ]; @@ -63,7 +76,7 @@
- +
- +
- + @@ -310,7 +335,7 @@
@@ -400,7 +425,11 @@
- + {#if debug} @@ -485,7 +514,7 @@
- + {#if debug} @@ -508,7 +537,11 @@
- + {#if debug} @@ -536,7 +569,11 @@
- + {#if debug} @@ -593,7 +630,12 @@
- + @@ -606,7 +648,12 @@
- + From c675d72720518980d9d07bbb89a14c0293d9bd6b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 5 Jul 2025 10:47:55 -0400 Subject: [PATCH 08/54] Version Packages (next) (#592) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 1 + packages/layerchart/CHANGELOG.md | 6 ++++++ packages/layerchart/package.json | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 47ec47d24..37fc54fd4 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -21,6 +21,7 @@ "cruel-cameras-begin", "cruel-rats-taste", "curly-lies-write", + "cyan-cougars-occur", "dark-pandas-start", "dirty-kings-send", "early-peaches-accept", diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index c4b8159b0..d4145608b 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,11 @@ # LayerChart +## 2.0.0-next.29 + +### Patch Changes + +- fix(Axis): Fix display of axis labels ([#591](https://github.com/techniq/layerchart/pull/591)) + ## 2.0.0-next.28 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index ab7f4c35a..111ff6b78 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "2.0.0-next.28", + "version": "2.0.0-next.29", "scripts": { "dev": "vite dev --port 3002", "build": "vite build", From fec3a5b03aed177b5d6be14477270e3874f8c55b Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Tue, 8 Jul 2025 11:51:45 -0400 Subject: [PATCH 09/54] Update Svelte UX with overhauled icons support (#596) * Update Svelte UX with overhauled icons support * Update config * Replace all mdi/js usage with unplugin-icons/Lucide * Remove no longer needed @ts-expect-error --- packages/layerchart/package.json | 3 +- packages/layerchart/src/app.d.ts | 88 ++++++++++--------- .../lib/components/TransformControls.svelte | 36 ++++---- .../layerchart/src/lib/components/index.ts | 2 +- .../layerchart/src/lib/docs/Blockquote.svelte | 6 +- .../layerchart/src/lib/docs/Preview.svelte | 9 +- .../src/lib/docs/ViewSourceButton.svelte | 4 +- packages/layerchart/src/routes/+layout.svelte | 29 +++--- .../layerchart/src/routes/_NavMenu.svelte | 13 ++- .../layerchart/src/routes/docs/+layout.svelte | 55 ++++++------ .../docs/components/BrushContext/+page.svelte | 26 ++---- .../docs/examples/AnimatedGlobe/+page.svelte | 17 +++- .../docs/examples/GeoPoint/+page.svelte | 1 - .../routes/docs/examples/Sankey/+page.svelte | 7 +- .../docs/tools/ShapefilePreview/+page.svelte | 6 +- packages/layerchart/vite.config.js | 12 ++- pnpm-lock.yaml | 19 ++-- 17 files changed, 169 insertions(+), 164 deletions(-) diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 111ff6b78..c28ec3631 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -21,7 +21,6 @@ "devDependencies": { "@changesets/cli": "^2.29.4", "@iconify-json/lucide": "^1.2.48", - "@mdi/js": "^7.4.47", "@rollup/plugin-dsv": "^3.0.5", "@sveltejs/adapter-cloudflare": "^7.0.4", "@sveltejs/kit": "^2.21.5", @@ -69,7 +68,7 @@ "svelte": "5.34.1", "svelte-check": "^4.2.1", "svelte-json-tree": "^2.2.0", - "svelte-ux": "2.0.0-next.13", + "svelte-ux": "2.0.0-next.14", "svelte2tsx": "^0.7.39", "tailwindcss": "^4.1.10", "topojson-client": "^3.1.0", diff --git a/packages/layerchart/src/app.d.ts b/packages/layerchart/src/app.d.ts index 95b4c707b..b198320e4 100644 --- a/packages/layerchart/src/app.d.ts +++ b/packages/layerchart/src/app.d.ts @@ -1,57 +1,59 @@ -// export * from 'unplugin-icons/types/svelte'; +import 'unplugin-icons/types/svelte'; // See https://kit.svelte.dev/docs/types#app // for information about these interfaces // and what to do when importing types -declare namespace App { - // interface Error {} - // interface Locals {} - - interface PageData { - meta: { - title?: string; - description?: string; - source?: string; - pageSource?: string; - api?: SveldJson; - features?: string[]; - related?: string[]; - hideUsage?: boolean; - hideTableOfContents?: boolean; - status?: string; - supportedContexts?: Array<'svg' | 'canvas' | 'html'>; - }; +declare global { + namespace App { + // interface Error {} + // interface Locals {} + + interface PageData { + meta: { + title?: string; + description?: string; + source?: string; + pageSource?: string; + api?: SveldJson; + features?: string[]; + related?: string[]; + hideUsage?: boolean; + hideTableOfContents?: boolean; + status?: string; + supportedContexts?: Array<'svg' | 'canvas' | 'html'>; + }; + } + + // interface PageState {} + // interface Platform {} } - // interface PageState {} - // interface Platform {} -} + // TODO: Can this be referenced from `@layerstack/svelte-actions` types.d.ts without breaking other things? + // https://github.com/sveltejs/language-tools/blob/master/docs/preprocessors/typescript.md + namespace svelteHTML { + interface LayerStackActionEvents { + // use:intersection + 'on:intersecting'?: (event: CustomEvent) => void; -// TODO: Can this be referenced from `@layerstack/svelte-actions` types.d.ts without breaking other things? -// https://github.com/sveltejs/language-tools/blob/master/docs/preprocessors/typescript.md -declare namespace svelteHTML { - interface LayerStackActionEvents { - // use:intersection - 'on:intersecting'?: (event: CustomEvent) => void; + // use:mutate + 'on:mutate'?: (event: CustomEvent) => void; - // use:mutate - 'on:mutate'?: (event: CustomEvent) => void; + // use:movable + 'on:movestart'?: (event: CustomEvent<{ x: number; y: number }>) => void; + 'on:move'?: (event: CustomEvent<{ x: number; y: number; dx: number; dy: number }>) => void; + 'on:moveend'?: (event: CustomEvent<{ x: number; y: number }>) => void; - // use:movable - 'on:movestart'?: (event: CustomEvent<{ x: number; y: number }>) => void; - 'on:move'?: (event: CustomEvent<{ x: number; y: number; dx: number; dy: number }>) => void; - 'on:moveend'?: (event: CustomEvent<{ x: number; y: number }>) => void; + // use:popover + 'on:clickOutside'?: (event: CustomEvent) => void; - // use:popover - 'on:clickOutside'?: (event: CustomEvent) => void; + // use:overflow + 'on:overflow'?: (event: CustomEvent<{ overflowX: number; overflowY: number }>) => void; - // use:overflow - 'on:overflow'?: (event: CustomEvent<{ overflowX: number; overflowY: number }>) => void; + // use:longpress + 'on:longpress'?: (event: CustomEvent) => void; + } - // use:longpress - 'on:longpress'?: (event: CustomEvent) => void; + interface HTMLAttributes extends LayerStackActionEvents {} + interface SVGAttributes extends LayerStackActionEvents {} } - - interface HTMLAttributes extends LayerStackActionEvents {} - interface SVGAttributes extends LayerStackActionEvents {} } diff --git a/packages/layerchart/src/lib/components/TransformControls.svelte b/packages/layerchart/src/lib/components/TransformControls.svelte index 594c718a7..f5c740c09 100644 --- a/packages/layerchart/src/lib/components/TransformControls.svelte +++ b/packages/layerchart/src/lib/components/TransformControls.svelte @@ -34,18 +34,14 @@ import { Button, Icon, MenuButton, Tooltip } from 'svelte-ux'; import { cls } from '@layerstack/tailwind'; - // TODO: maybe we include the icons as I think importing them like this - // will bog down the dev server - import { - mdiArrowULeftTop, - mdiMagnifyPlusOutline, - mdiMagnifyMinusOutline, - mdiImageFilterCenterFocus, - mdiChevronDown, - mdiResize, - mdiArrowExpandAll, - mdiCancel, - } from '@mdi/js'; + import LucideFocus from '~icons/lucide/focus'; + import LucideChevronDown from '~icons/lucide/chevron-down'; + import LucideCircleOff from '~icons/lucide/circle-off'; + import LucideImageUpscale from '~icons/lucide/image-upscale'; + import LucideMove from '~icons/lucide/move'; + import LucideUndo2 from '~icons/lucide/undo-2'; + import LucideZoomIn from '~icons/lucide/zoom-in'; + import LucideZoomOut from '~icons/lucide/zoom-out'; import { getTransformContext } from './TransformContext.svelte'; import type { Without } from '$lib/utils/types.js'; @@ -113,7 +109,7 @@ {#if show.includes('zoomIn')}
diff --git a/packages/layerchart/src/lib/docs/Preview.svelte b/packages/layerchart/src/lib/docs/Preview.svelte index 864cebb06..6f1ac198a 100644 --- a/packages/layerchart/src/lib/docs/Preview.svelte +++ b/packages/layerchart/src/lib/docs/Preview.svelte @@ -3,7 +3,9 @@ // TODO: No longer copy from svelte-ux after prismjs is migrated to ESM (commonjs causes issue with Vite from another library) import Prism from 'prismjs'; import 'prism-svelte'; - import { mdiCodeTags, mdiTable } from '@mdi/js'; + + import LucideCode from '~icons/lucide/code'; + import LucideTable from '~icons/lucide/table'; import { Button, CopyButton, Dialog, Toggle, Tooltip } from 'svelte-ux'; import { cls } from '@layerstack/tailwind'; @@ -68,7 +70,7 @@ {#if code} View data import type { ComponentProps } from 'svelte'; import { Button, Dialog, Toggle, Tooltip } from 'svelte-ux'; - import { mdiGithub } from '@mdi/js'; + import LucideGithub from '~icons/lucide/github.svelte'; import Code from './Code.svelte'; @@ -29,7 +29,7 @@
{#if href} - {/if} diff --git a/packages/layerchart/src/routes/+layout.svelte b/packages/layerchart/src/routes/+layout.svelte index 4b12bf148..71f616e28 100644 --- a/packages/layerchart/src/routes/+layout.svelte +++ b/packages/layerchart/src/routes/+layout.svelte @@ -3,7 +3,6 @@ import posthog from 'posthog-js'; import { watch } from 'runed'; - import { mdiArrowTopRight, mdiDotsVertical, mdiGithub, mdiTwitter } from '@mdi/js'; import 'prism-themes/themes/prism-vsc-dark-plus.css'; import { AppBar, @@ -20,6 +19,12 @@ import { sortFunc } from '@layerstack/utils'; import { MediaQueryPresets } from '@layerstack/svelte-state'; + import LucideArrowUpRight from '~icons/lucide/arrow-up-right'; + import LucideEllipsisVertical from '~icons/lucide/ellipsis-vertical'; + import LucideGithub from '~icons/lucide/github'; + import CustomBluesky from '~icons/custom-brands/bluesky'; + import CustomDiscord from '~icons/custom-brands/discord'; + import { dev } from '$app/environment'; import { afterNavigate, goto } from '$app/navigation'; import { page } from '$app/state'; @@ -141,7 +146,7 @@
diff --git a/packages/layerchart/src/routes/docs/examples/GeoPoint/+page.svelte b/packages/layerchart/src/routes/docs/examples/GeoPoint/+page.svelte index b0a0f6615..1b64810a0 100644 --- a/packages/layerchart/src/routes/docs/examples/GeoPoint/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/GeoPoint/+page.svelte @@ -7,7 +7,6 @@ import Preview from '$lib/docs/Preview.svelte'; import { shared } from '../../shared.svelte.js'; - // @ts-expect-error import LucideStar from '~icons/lucide/star'; let { data } = $props(); diff --git a/packages/layerchart/src/routes/docs/examples/Sankey/+page.svelte b/packages/layerchart/src/routes/docs/examples/Sankey/+page.svelte index 0a9713454..2ea8e819d 100644 --- a/packages/layerchart/src/routes/docs/examples/Sankey/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/Sankey/+page.svelte @@ -8,7 +8,8 @@ import { Icon } from 'svelte-ux'; import { sortFunc } from '@layerstack/utils'; import { cls } from '@layerstack/tailwind'; - import { mdiArrowRightBold } from '@mdi/js'; + + import LucideArrowRight from '~icons/lucide/arrow-right'; import { Chart, @@ -156,7 +157,7 @@ {data.node.name} {:else if data.link} {data.link.source.name} - + {data.link.target.name} {/if} @@ -343,7 +344,7 @@ {data.node.name} {:else if data.link} {data.link.source.name} - + {data.link.target.name} {/if} diff --git a/packages/layerchart/src/routes/docs/tools/ShapefilePreview/+page.svelte b/packages/layerchart/src/routes/docs/tools/ShapefilePreview/+page.svelte index 7084b90de..fbbca5099 100644 --- a/packages/layerchart/src/routes/docs/tools/ShapefilePreview/+page.svelte +++ b/packages/layerchart/src/routes/docs/tools/ShapefilePreview/+page.svelte @@ -23,7 +23,7 @@ Toggle, } from 'svelte-ux'; - import { mdiChevronDown } from '@mdi/js'; + import LucideChevronDown from '~icons/lucide/chevron-down'; import { goto } from '$app/navigation'; import { shared } from '../../shared.svelte.js'; @@ -61,8 +61,8 @@ - -
+

Axis labels inside

+ + +
+ +
+
+

Legend

From 48091b95a700c8f241eb881feb68ebb7b0ed956a Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Fri, 11 Jul 2025 21:43:03 -0400 Subject: [PATCH 11/54] doc(AnnotationLine): Add rotated alebsl with vertical line example --- .../components/AnnotationLine/+page.svelte | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.svelte b/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.svelte index a7e363eea..520cb81c1 100644 --- a/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.svelte @@ -82,6 +82,49 @@
+

Vertical with rotation

+ + +
+ + {#snippet aboveMarks({ context })} + + + + {/snippet} + +
+
+

Horizontal

From 962dbfeb30975f95ef1ab7882df790455f967dfa Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Sat, 12 Jul 2025 23:27:22 -0400 Subject: [PATCH 12/54] fix(AnnotationPoint): Do not propagate mouse/touch move/leave events to TooltipContext after switching from pointer events. Fixes #598 (#602) --- .changeset/clean-nights-jog.md | 5 ++++ .../src/lib/components/AnnotationPoint.svelte | 25 ++++++++++++------- .../components/tooltip/TooltipContext.svelte | 6 ++++- 3 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 .changeset/clean-nights-jog.md diff --git a/.changeset/clean-nights-jog.md b/.changeset/clean-nights-jog.md new file mode 100644 index 000000000..7aa215bae --- /dev/null +++ b/.changeset/clean-nights-jog.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(AnnotationPoint): Do not propagate mouse/touch move/leave events to TooltipContext after switching from pointer events. Fixes #598 diff --git a/packages/layerchart/src/lib/components/AnnotationPoint.svelte b/packages/layerchart/src/lib/components/AnnotationPoint.svelte index 64ecb37a1..d5198915e 100644 --- a/packages/layerchart/src/lib/components/AnnotationPoint.svelte +++ b/packages/layerchart/src/lib/components/AnnotationPoint.svelte @@ -88,23 +88,30 @@ ? 'start' : 'middle', }); - - { + function onPointerMove(e: PointerEvent | MouseEvent | TouchEvent) { if (details) { e.stopPropagation(); ctx.tooltip.show(e, { annotation: { label, details } }); } - }} - onpointerleave={() => { + } + + function onPointerLeave(e: PointerEvent | MouseEvent | TouchEvent) { if (details) { + e.stopPropagation(); ctx.tooltip.hide(); } - }} + } + + + diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte b/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte index 099ca93be..c7ef86ae3 100644 --- a/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte +++ b/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte @@ -22,7 +22,11 @@ y: number; data: T | null; payload: TooltipPayload[]; - show(e: PointerEvent, tooltipData?: any, payload?: TooltipPayload): void; + show( + e: PointerEvent | MouseEvent | TouchEvent, + tooltipData?: any, + payload?: TooltipPayload + ): void; hide(e?: PointerEvent): void; mode: TooltipMode; isHoveringTooltipArea: boolean; From 94813dde4da6e775baf8fd6b0760be34bedbdadd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 12 Jul 2025 23:32:31 -0400 Subject: [PATCH 13/54] Version Packages (next) (#603) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 1 + packages/layerchart/CHANGELOG.md | 6 ++++++ packages/layerchart/package.json | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 37fc54fd4..972cf530e 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -16,6 +16,7 @@ "calm-jars-mix", "chatty-flies-bet", "chatty-shirts-rule", + "clean-nights-jog", "clear-points-care", "crazy-friends-talk", "cruel-cameras-begin", diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index d4145608b..d68022be4 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,11 @@ # LayerChart +## 2.0.0-next.30 + +### Patch Changes + +- fix(AnnotationPoint): Do not propagate mouse/touch move/leave events to TooltipContext after switching from pointer events. Fixes #598 ([#602](https://github.com/techniq/layerchart/pull/602)) + ## 2.0.0-next.29 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index c28ec3631..b24bfcfb8 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "2.0.0-next.29", + "version": "2.0.0-next.30", "scripts": { "dev": "vite dev --port 3002", "build": "vite build", From 816c3489825e60685cf0ef85256af57a14e7c2d3 Mon Sep 17 00:00:00 2001 From: Vincent Esche <138017+regexident@users.noreply.github.com> Date: Sun, 20 Jul 2025 03:35:31 +0200 Subject: [PATCH 14/54] Add `onNodesChange` callback to `ForceSimulation` (#607) * chore(ForceSimulation): Simplify unnecessarily complex internal types of `ForceSimulation` * feat(ForceSimulation): Add `onNodesChange` callback to `ForceSimulation` --- .changeset/lemon-bats-change.md | 5 ++ .../src/lib/components/ForceSimulation.svelte | 64 ++++++++++++------- 2 files changed, 45 insertions(+), 24 deletions(-) create mode 100644 .changeset/lemon-bats-change.md diff --git a/.changeset/lemon-bats-change.md b/.changeset/lemon-bats-change.md new file mode 100644 index 000000000..88f901c66 --- /dev/null +++ b/.changeset/lemon-bats-change.md @@ -0,0 +1,5 @@ +--- +'layerchart': minor +--- + +feat(ForceSimulation): Added `onNodesChange` callback to `ForceSimulation` diff --git a/packages/layerchart/src/lib/components/ForceSimulation.svelte b/packages/layerchart/src/lib/components/ForceSimulation.svelte index 8a53bb0ee..1aded4a0a 100644 --- a/packages/layerchart/src/lib/components/ForceSimulation.svelte +++ b/packages/layerchart/src/lib/components/ForceSimulation.svelte @@ -31,7 +31,7 @@ > = { alpha: number; alphaTarget: number; - simulation: SimulationFor; + simulation: Simulation; }; export type OnTickEvent< @@ -40,9 +40,9 @@ > = { alpha: number; alphaTarget: number; - nodes: NodeDatumFor[]; - links: LinkDatumFor[]; - simulation: SimulationFor; + nodes: NodeDatum[]; + links: LinkDatum[]; + simulation: Simulation; }; export type OnEndEvent< @@ -51,7 +51,18 @@ > = { alpha: number; alphaTarget: number; - simulation: SimulationFor; + simulation: Simulation; + }; + + export type OnNodesChangeEvent< + NodeDatum extends SimulationNodeDatum, + LinkDatum extends SimulationLinkDatum | undefined, + > = { + alpha: number; + alphaTarget: number; + nodes: NodeDatum[]; + links: LinkDatum[]; + simulation: Simulation; }; /** @@ -81,16 +92,6 @@ */ export const DEFAULT_VELOCITY_DECAY: number = 0.4; - type NodeDatumFor = NodeDatum & SimulationNodeDatum; - - type LinkDatumFor = LinkDatum & - SimulationLinkDatum>; - - type SimulationFor = Simulation< - NodeDatumFor, - LinkDatumFor - >; - export type ForceSimulationProps< NodeDatum extends SimulationNodeDatum, LinkDatum extends SimulationLinkDatum | undefined, @@ -159,6 +160,11 @@ */ onStart?: (e: OnStartEvent) => void; + /** + * Callback function triggered right before nodes get passed to the simulation + */ + onNodesChange?: (e: OnNodesChangeEvent) => void; + /** * Callback function triggered on each simulation tick */ @@ -172,10 +178,10 @@ children?: Snippet< [ { - nodes: NodeDatumFor[]; - links: LinkDatumFor[]; + nodes: NodeDatum[]; + links: LinkDatum[]; linkPositions: LinkPosition[]; - simulation: SimulationFor; + simulation: Simulation; }, ] >; @@ -200,6 +206,7 @@ stopped = false, static: staticProp, onStart: onStartProp, + onNodesChange: onNodesChangeProp, onTick: onTickProp, onEnd: onEndProp, children, @@ -211,15 +218,13 @@ // MARK: Private Props let linkPositions: LinkPosition[] = $state([]); - let simulatedNodes: NodeDatumFor[] = $state([]); - let simulatedLinks: LinkDatumFor[] = $derived( - (data.links ?? []) as LinkDatumFor[] - ); + let simulatedNodes: NodeDatum[] = $state([]); + let simulatedLinks: LinkDatum[] = $derived(data.links ?? []); // This casting is unfortunately necessary, due to unfortunate // overloading choices made, over at `@typed/d3-force`: - const simulation: SimulationFor = ( - forceSimulation() as SimulationFor + const simulation: Simulation = ( + forceSimulation() as Simulation ).stop(); // d3.Simulation does not provide a `.forces()` getter, so we need to @@ -263,6 +268,7 @@ () => { // Any time the `nodes` prop, or the `data` store gets changed // we pass them to the internal d3 simulation object: + onNodesChange(); pushNodesToSimulation(data.nodes); runOrResumeSimulation(); } @@ -498,6 +504,16 @@ }); } + function onNodesChange() { + onNodesChangeProp?.({ + alpha, + alphaTarget, + nodes: data.nodes, + links: data.links ?? [], + simulation, + }); + } + $effect(() => { return () => { simulation.stop(); From e5ccdae39876c75bec55cfa8abe3f0297eaba294 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Sat, 19 Jul 2025 22:32:07 -0400 Subject: [PATCH 15/54] Time interval (#562) * Fix jsdoc typo * feat(Chart): Add `xInterval` / `yInterval` for time scales usage with bar charts * Fix merge * fix(Axis): Offset 1/2 time interval * Add missing data example * Automatically calculate xDomain / yDomain when using xInterval / yInterval * Fix handling of yInterval (horizontal bar chart) * feat(BarChart): Support time scale with `xInterval` / `yInterval` props * docs(BarChart): Fix example order * fix(Bar): Fix edge rounding for vertical bars * docs(BarChart): Add interval inset example * fix(Axis): Remove last tick when xInterval / yInterval is provided (ex. bar chart) * fix(Highlight): Properly handle area highlights with y-axis time scales * feat(TooltipContext): Support `band` mode with time scale (similar to band scale) * Switch back to using band mode for all BarChart (time or band scales) * Fix typo * Improve candlestick example (until Rule is updated) * docs(BarChart): Update brush example to use interval (time scale) which is better supported ATM. --- .changeset/eleven-corners-float.md | 5 ++ .changeset/funny-otters-kick.md | 5 ++ .changeset/new-turtles-clean.md | 5 ++ .changeset/sad-chairs-stand.md | 5 ++ .../layerchart/src/lib/components/Axis.svelte | 39 +++++----- .../layerchart/src/lib/components/Bar.svelte | 4 +- .../src/lib/components/Chart.svelte | 38 +++++++++- .../src/lib/components/Highlight.svelte | 11 +-- .../src/lib/components/charts/BarChart.svelte | 28 +++++--- .../components/tooltip/TooltipContext.svelte | 67 ++++++++++++++--- packages/layerchart/src/lib/utils/quadtree.ts | 1 + .../layerchart/src/lib/utils/rect.svelte.ts | 72 ++++++++++++++++++- .../layerchart/src/lib/utils/ticks.test.ts | 6 ++ packages/layerchart/src/lib/utils/ticks.ts | 16 ++++- .../docs/components/BarChart/+page.svelte | 68 ++++++++++++++++-- .../routes/docs/examples/Bars/+page.svelte | 70 ++++++++++++++++++ .../docs/examples/Candlestick/+page.svelte | 16 +++-- .../routes/docs/examples/Columns/+page.svelte | 70 ++++++++++++++++++ 18 files changed, 469 insertions(+), 57 deletions(-) create mode 100644 .changeset/eleven-corners-float.md create mode 100644 .changeset/funny-otters-kick.md create mode 100644 .changeset/new-turtles-clean.md create mode 100644 .changeset/sad-chairs-stand.md diff --git a/.changeset/eleven-corners-float.md b/.changeset/eleven-corners-float.md new file mode 100644 index 000000000..f299720bc --- /dev/null +++ b/.changeset/eleven-corners-float.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Highlight): Properly handle area highlights with y-axis time scales diff --git a/.changeset/funny-otters-kick.md b/.changeset/funny-otters-kick.md new file mode 100644 index 000000000..b86a03647 --- /dev/null +++ b/.changeset/funny-otters-kick.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +feat(TooltipContext): Support `band` mode with time scale (similar to band scale) diff --git a/.changeset/new-turtles-clean.md b/.changeset/new-turtles-clean.md new file mode 100644 index 000000000..b470884ce --- /dev/null +++ b/.changeset/new-turtles-clean.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +feat(BarChart): Support time scale with `xInterval` / `yInterval` props diff --git a/.changeset/sad-chairs-stand.md b/.changeset/sad-chairs-stand.md new file mode 100644 index 000000000..4a0a7f9d8 --- /dev/null +++ b/.changeset/sad-chairs-stand.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +feat(Chart): Add `xInterval` / `yInterval` for time scales usage with bar charts diff --git a/packages/layerchart/src/lib/components/Axis.svelte b/packages/layerchart/src/lib/components/Axis.svelte index 46e630faa..73001952d 100644 --- a/packages/layerchart/src/lib/components/Axis.svelte +++ b/packages/layerchart/src/lib/components/Axis.svelte @@ -44,7 +44,7 @@ ticks?: TicksConfig; /** - * Width or height of each tick in pxiels (responsive reduce) + * Width or height of each tick in pixels (enabling responsive count) */ tickSpacing?: number; @@ -96,7 +96,7 @@ transitionInParams?: TransitionParams; /** - * Scale for the axis + * Override scale for the axis */ scale?: any; @@ -183,6 +183,9 @@ const scale = $derived( scaleProp ?? (['horizontal', 'angle'].includes(orientation) ? ctx.xScale : ctx.yScale) ); + const interval = $derived( + ['horizontal', 'angle'].includes(orientation) ? ctx.xInterval : ctx.yInterval + ); const xRangeMinMax = $derived(extent(ctx.xRange)) as [number, number]; const yRangeMinMax = $derived(extent(ctx.yRange)) as [number, number]; @@ -206,7 +209,7 @@ ? Math.round(ctxSize / tickSpacing) : undefined ); - const tickVals = $derived(resolveTickVals(scale, ticks, tickCount)); + const tickVals = $derived(resolveTickVals(scale, ticks, tickCount, interval)); const tickFormat = $derived( resolveTickFormat({ scale, @@ -221,27 +224,29 @@ function getCoords(tick: any) { switch (placement) { case 'top': - return { - x: scale(tick) + (isScaleBand(scale) ? scale.bandwidth() / 2 : 0), - y: yRangeMinMax[0], - }; - case 'bottom': return { - x: scale(tick) + (isScaleBand(scale) ? scale.bandwidth() / 2 : 0), - y: yRangeMinMax[1], + x: + scale(tick) + + (isScaleBand(scale) + ? scale.bandwidth() / 2 + : ctx.xInterval + ? (scale(ctx.xInterval.offset(tick)) - scale(tick)) / 2 // offset 1/2 width of time interval + : 0), + y: placement === 'top' ? yRangeMinMax[0] : yRangeMinMax[1], }; case 'left': - return { - x: xRangeMinMax[0], - y: scale(tick) + (isScaleBand(scale) ? scale.bandwidth() / 2 : 0), - }; - case 'right': return { - x: xRangeMinMax[1], - y: scale(tick) + (isScaleBand(scale) ? scale.bandwidth() / 2 : 0), + x: placement === 'left' ? xRangeMinMax[0] : xRangeMinMax[1], + y: + scale(tick) + + (isScaleBand(scale) + ? scale.bandwidth() / 2 + : ctx.yInterval + ? (scale(ctx.yInterval.offset(tick)) - scale(tick)) / 2 // offset 1/2 height of time interval + : 0), }; case 'angle': diff --git a/packages/layerchart/src/lib/components/Bar.svelte b/packages/layerchart/src/lib/components/Bar.svelte index 98f6458af..9e284f217 100644 --- a/packages/layerchart/src/lib/components/Bar.svelte +++ b/packages/layerchart/src/lib/components/Bar.svelte @@ -81,7 +81,7 @@ import Rect from './Rect.svelte'; import Spline from './Spline.svelte'; - import { isScaleBand } from '../utils/scales.svelte.js'; + import { isScaleBand, isScaleTime } from '../utils/scales.svelte.js'; import { accessor, type Accessor } from '../utils/common.js'; import { getChartContext } from './Chart.svelte'; import type { CommonStyleProps, Without } from '$lib/utils/types.js'; @@ -127,7 +127,7 @@ const dimensions = $derived(getDimensions(data) ?? { x: 0, y: 0, width: 0, height: 0 }); - const isVertical = $derived(isScaleBand(ctx.xScale)); + const isVertical = $derived(isScaleBand(ctx.xScale) || isScaleTime(ctx.xScale)); const valueAccessor = $derived(accessor(isVertical ? y : x)); const value = $derived(valueAccessor(data)); const resolvedValue = $derived(Array.isArray(value) ? greatestAbs(value) : value); diff --git a/packages/layerchart/src/lib/components/Chart.svelte b/packages/layerchart/src/lib/components/Chart.svelte index ffc617384..102540067 100644 --- a/packages/layerchart/src/lib/components/Chart.svelte +++ b/packages/layerchart/src/lib/components/Chart.svelte @@ -7,6 +7,7 @@ createScale, getRange, isScaleBand, + isScaleTime, makeAccessor, type AnyScale, type DomainType, @@ -40,6 +41,7 @@ import TransformContext, { type TransformContextValue } from './TransformContext.svelte'; import BrushContext, { type BrushContextValue } from './BrushContext.svelte'; import { layerClass } from '$lib/utils/attributes.js'; + import type { TimeInterval } from 'd3-time'; const defaultPadding = { top: 0, right: 0, bottom: 0, left: 0 }; @@ -149,6 +151,8 @@ cGet: (d: T) => any; x1Get: (d: T) => any; y1Get: (d: T) => any; + xInterval: TimeInterval | null; + yInterval: TimeInterval | null; radial: boolean; tooltip: TooltipContextValue; geo: GeoContextValue; @@ -640,6 +644,16 @@ */ yBaseline?: number | null; + /** + * Time interval to use for the x-axis when using a time scale. + */ + xInterval?: TimeInterval | null; + + /** + * Time interval to use for the y-axis when using a time scale. + */ + yInterval?: TimeInterval | null; + /* Props passed to ChartContext */ /** @@ -738,6 +752,8 @@ rRange: rRangeProp, xBaseline = null, yBaseline = null, + xInterval = null, + yInterval = null, meta = {}, children: _children, radial = false, @@ -780,6 +796,12 @@ const _xDomain: DomainType | undefined = $derived.by(() => { if (xDomainProp !== undefined) return xDomainProp; + + if (xInterval != null && Array.isArray(data) && data.length > 0) { + const lastXValue = accessor(xProp)(data[data.length - 1]); + return [null, xInterval.offset(lastXValue)]; + } + if (xBaseline != null && Array.isArray(data)) { const xValues = data.flatMap(accessor(xProp)); return [min([xBaseline, ...xValues]), max([xBaseline, ...xValues])]; @@ -788,6 +810,12 @@ const _yDomain: DomainType | undefined = $derived.by(() => { if (yDomainProp !== undefined) return yDomainProp; + + if (yInterval != null && Array.isArray(data) && data.length > 0) { + const lastYValue = accessor(yProp)(data[data.length - 1]); + return [null, yInterval.offset(lastYValue)]; + } + if (yBaseline != null && Array.isArray(data)) { const yValues = data.flatMap(accessor(yProp)); return [min([yBaseline, ...yValues]), max([yBaseline, ...yValues])]; @@ -798,7 +826,9 @@ _yRangeProp ?? (radial ? ({ height }: { height: number }) => [0, height / 2] : undefined) ); - const yReverse = $derived(yScaleProp ? !isScaleBand(yScaleProp) : true); + const yReverse = $derived( + yScaleProp ? !isScaleBand(yScaleProp) && !isScaleTime(yScaleProp) : true + ); const x = $derived(makeAccessor(xProp)); const y = $derived(makeAccessor(yProp)); @@ -1247,6 +1277,12 @@ get y1Scale() { return y1Scale; }, + get xInterval() { + return xInterval; + }, + get yInterval() { + return yInterval; + }, get radial() { return radial; }, diff --git a/packages/layerchart/src/lib/components/Highlight.svelte b/packages/layerchart/src/lib/components/Highlight.svelte index a576b067c..c8fa85f74 100644 --- a/packages/layerchart/src/lib/components/Highlight.svelte +++ b/packages/layerchart/src/lib/components/Highlight.svelte @@ -116,7 +116,7 @@ import { notNull } from '@layerstack/utils'; import { cls } from '@layerstack/tailwind'; - import { isScaleBand } from '$lib/utils/scales.svelte.js'; + import { isScaleBand, isScaleTime } from '$lib/utils/scales.svelte.js'; import { asAny } from '$lib/utils/types.js'; import { getChartContext } from './Chart.svelte'; import { getTooltipContext } from './tooltip/TooltipContext.svelte'; @@ -158,7 +158,9 @@ Array.isArray(yValue) ? yValue.map((v) => ctx.yScale(v)) : ctx.yScale(yValue) ); const yOffset = $derived(isScaleBand(ctx.yScale) && !ctx.radial ? ctx.yScale.bandwidth() / 2 : 0); - const axis = $derived(axisProp == null ? (isScaleBand(ctx.yScale) ? 'y' : 'x') : axisProp); + const axis = $derived( + axisProp == null ? (isScaleBand(ctx.yScale) || isScaleTime(ctx.yScale) ? 'y' : 'x') : axisProp + ); const _lines: { x1: number; y1: number; x2: number; y2: number }[] = $derived.by(() => { let tmpLines: { x1: number; y1: number; x2: number; y2: number }[] = []; @@ -249,6 +251,7 @@ height: 0, }; if (!highlightData) return tmpArea; + if (axis === 'x' || axis === 'both') { // x area if (Array.isArray(xCoord)) { @@ -284,9 +287,9 @@ tmpArea.height = ctx.yScale.step(); } else { // Find width to next data point - const index = ctx.flatData.findIndex((d) => Number(x(d)) === Number(x(highlightData))); + const index = ctx.flatData.findIndex((d) => Number(y(d)) === Number(y(highlightData))); const isLastPoint = index + 1 === ctx.flatData.length; - const nextDataPoint = isLastPoint ? max(ctx.yDomain) : x(ctx.flatData[index + 1]); + const nextDataPoint = isLastPoint ? max(ctx.yDomain) : y(ctx.flatData[index + 1]); tmpArea.height = (ctx.yScale(nextDataPoint) ?? 0) - (yCoord ?? 0); } diff --git a/packages/layerchart/src/lib/components/charts/BarChart.svelte b/packages/layerchart/src/lib/components/charts/BarChart.svelte index fe7ca02b9..8f4d8bd00 100644 --- a/packages/layerchart/src/lib/components/charts/BarChart.svelte +++ b/packages/layerchart/src/lib/components/charts/BarChart.svelte @@ -141,6 +141,8 @@ bandPadding = radial ? 0 : 0.4, groupPadding = 0, stackPadding = 0, + xInterval, + yInterval, tooltip = true, children: childrenProp, aboveContext, @@ -211,21 +213,25 @@ const xScale = $derived( xScaleProp ?? - (isVertical - ? scaleBand().padding(bandPadding) - : accessor(xProp)(chartData[0]) instanceof Date // TODO: also check for Array instances (ex. x={['start', 'end']}) - ? scaleTime() - : scaleLinear()) + (xInterval + ? scaleTime() + : isVertical + ? scaleBand().padding(bandPadding) + : accessor(xProp)(chartData[0]) instanceof Date // TODO: also check for Array instances (ex. x={['start', 'end']}) + ? scaleTime() + : scaleLinear()) ); const xBaseline = $derived(isVertical || isScaleTime(xScale) ? undefined : 0); const yScale = $derived( yScaleProp ?? - (isVertical - ? accessor(yProp)(chartData[0]) instanceof Date // TODO: also check for Array instances (ex. y={['start', 'end']}) - ? scaleTime() - : scaleLinear() - : scaleBand().padding(bandPadding)) + (yInterval + ? scaleTime() + : isVertical + ? accessor(yProp)(chartData[0]) instanceof Date // TODO: also check for Array instances (ex. y={['start', 'end']}) + ? scaleTime() + : scaleLinear() + : scaleBand().padding(bandPadding)) ); const yBaseline = $derived(isVertical || isScaleTime(yScale) ? 0 : undefined); @@ -436,6 +442,7 @@ {x1Scale} {x1Domain} {x1Range} + {xInterval} y={resolveAccessor(yProp)} {yScale} {yBaseline} @@ -443,6 +450,7 @@ {y1Scale} {y1Domain} {y1Range} + {yInterval} c={isVertical ? yProp : xProp} cRange={['var(--color-primary)']} {radial} diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte b/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte index c7ef86ae3..c2e90b8fe 100644 --- a/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte +++ b/packages/layerchart/src/lib/components/tooltip/TooltipContext.svelte @@ -135,7 +135,7 @@ import ChartClipPath from './../ChartClipPath.svelte'; import Voronoi from './../Voronoi.svelte'; - import { isScaleBand, scaleInvert } from '$lib/utils/scales.svelte.js'; + import { isScaleBand, isScaleTime, scaleInvert } from '$lib/utils/scales.svelte.js'; import { cartesianToPolar } from '$lib/utils/math.js'; import { quadtreeRects } from '$lib/utils/quadtree.js'; import { raise } from '$lib/utils/chart.js'; @@ -493,14 +493,63 @@ const fullHeight = max(ctx.yRange) - min(ctx.yRange); if (mode === 'band') { - // full band width/height regardless of value - return { - x: isScaleBand(ctx.xScale) ? x - xOffset : min(ctx.xRange), - y: isScaleBand(ctx.yScale) ? y - yOffset : min(ctx.yRange), - width: isScaleBand(ctx.xScale) ? ctx.xScale.step() : fullWidth, - height: isScaleBand(ctx.yScale) ? ctx.yScale.step() : fullHeight, - data: d, - }; + if (isScaleBand(ctx.xScale)) { + // full band width/height regardless of value + return { + x: x - xOffset, + y: min(ctx.yRange), + width: ctx.xScale.step(), + height: fullHeight, + data: d, + }; + } else if (isScaleBand(ctx.yScale)) { + return { + x: min(ctx.xRange), + y: y - yOffset, + width: fullWidth, + height: ctx.yScale.step(), + data: d, + }; + } else if (isScaleTime(ctx.xScale)) { + // Find width to next data point + const index = ctx.flatData.findIndex( + (d2) => Number(ctx.x(d2)) === Number(ctx.x(d)) + ); + const isLastPoint = index + 1 === ctx.flatData.length; + const nextDataPoint = isLastPoint + ? max(ctx.xDomain) + : ctx.x(ctx.flatData[index + 1]); + + return { + x: x - xOffset, + y: min(ctx.yRange), + width: (ctx.xScale(nextDataPoint) ?? 0) - (xValue ?? 0), + height: fullHeight, + data: d, + }; + } else if (isScaleTime(ctx.yScale)) { + // Find height to next data point + const index = ctx.flatData.findIndex( + (d2) => Number(ctx.y(d2)) === Number(ctx.y(d)) + ); + const isLastPoint = index + 1 === ctx.flatData.length; + const nextDataPoint = isLastPoint + ? max(ctx.yDomain) + : ctx.y(ctx.flatData[index + 1]); + + return { + x: min(ctx.xRange), + y: y - yOffset, + width: fullWidth, + height: (ctx.yScale(nextDataPoint) ?? 0) - (yValue ?? 0), + data: d, + }; + } else { + console.warn( + '[layerchart] TooltipContext band mode requires at least one scale to be band or time.' + ); + return undefined; + } } else if (mode === 'bounds') { return { x: isScaleBand(ctx.xScale) || Array.isArray(xValue) ? x - xOffset : min(ctx.xRange), diff --git a/packages/layerchart/src/lib/utils/quadtree.ts b/packages/layerchart/src/lib/utils/quadtree.ts index 352f9fa51..32e94239d 100644 --- a/packages/layerchart/src/lib/utils/quadtree.ts +++ b/packages/layerchart/src/lib/utils/quadtree.ts @@ -13,5 +13,6 @@ export function quadtreeRects(quadtree: Quadtree, showLeaves = true) { rects.push({ x: x0, y: y0, width: x1 - x0, height: y1 - y0 }); } }); + return rects; } diff --git a/packages/layerchart/src/lib/utils/rect.svelte.ts b/packages/layerchart/src/lib/utils/rect.svelte.ts index 916bfbb18..b106838b5 100644 --- a/packages/layerchart/src/lib/utils/rect.svelte.ts +++ b/packages/layerchart/src/lib/utils/rect.svelte.ts @@ -116,7 +116,7 @@ export function createDimensionGetter( const width = Math.max(0, ctx.xScale(right) - ctx.xScale(left) - insets.left - insets.right); return { x, y, width, height }; - } else { + } else if (isScaleBand(ctx.xScale)) { // Vertical band or linear const x = firstValue(ctx.xScale(_x(item))) + (ctx.x1Scale ? ctx.x1Scale(_x1(item)) : 0) + insets.left; @@ -155,6 +155,74 @@ export function createDimensionGetter( const y = ctx.yScale(top) + insets.top; const height = ctx.yScale(bottom) - ctx.yScale(top) - insets.bottom - insets.top; + return { x, y, width, height }; + } else if (ctx.xInterval) { + // x-axis time scale with interval + const xValue = _x(item); + const start = ctx.xInterval.floor(xValue); + const end = ctx.xInterval.offset(start); + const x = ctx.xScale(start) + insets.left; + const width = ctx.xScale(end) - x - insets.right; + + const yValue = _y(item); + + let top = 0; + let bottom = 0; + if (Array.isArray(yValue)) { + // Array contains both top and bottom values (stack, etc); + top = max(yValue); + bottom = min(yValue); + } else if (yValue == null) { + // null/undefined value + top = 0; + bottom = 0; + } else if (yValue > 0) { + // Positive value + top = yValue; + bottom = max([0, yDomainMinMax[0]]); + } else { + // Negative value + top = min([0, yDomainMinMax[1]]); + bottom = yValue; + } + + const y = ctx.yScale(top) + insets.top; + const height = ctx.yScale(bottom) - ctx.yScale(top) - insets.bottom - insets.top; + + return { x, y, width, height }; + } else if (ctx.yInterval) { + // y-axis time scale with interval + const yValue = _y(item); + const start = ctx.yInterval.floor(yValue); + const end = ctx.yInterval.offset(start); + const y = ctx.yScale(start) + insets.top; + const height = ctx.yScale(end) - y - insets.bottom; + + const xValue = _x(item); + + let left = 0; + let right = 0; + if (Array.isArray(xValue)) { + // Array contains both top and bottom values (stack, etc); + left = min(xValue); + right = max(xValue); + } else if (xValue == null) { + // null/undefined value + left = 0; + right = 0; + } else if (xValue > 0) { + // Positive value + left = max([0, xDomainMinMax[0]]); + right = xValue; + } else { + // Negative value + left = xValue; + right = min([0, xDomainMinMax[1]]); + } + + const x = ctx.xScale(left) + insets.left; + const width = ctx.xScale(right) - x - insets.right; + return { x, y, width, height }; } }; @@ -164,6 +232,6 @@ export function createDimensionGetter( * If value is an array, returns first item, else returns original value * Useful when x/y getters for band scale are an array (such as for histograms) */ -export function firstValue(value: number | number[]) { +export function firstValue(value: number | number[] | undefined) { return Array.isArray(value) ? value[0] : value; } diff --git a/packages/layerchart/src/lib/utils/ticks.test.ts b/packages/layerchart/src/lib/utils/ticks.test.ts index ec9512896..1c72c349f 100644 --- a/packages/layerchart/src/lib/utils/ticks.test.ts +++ b/packages/layerchart/src/lib/utils/ticks.test.ts @@ -66,4 +66,10 @@ describe('resolveTickVals', () => { expect(resolveTickVals(scale, null, undefined)).toEqual([1, 2, 3]); expect(scale.ticks).toHaveBeenCalledWith(undefined); }); + + it('removes last tick when interval is provided', () => { + const interval = { every: vi.fn() } as unknown as TimeInterval; + const scale = { ticks: vi.fn(() => [1, 2, 3, 4]) } as any; + expect(resolveTickVals(scale, undefined, undefined, interval)).toEqual([1, 2, 3]); + }); }); diff --git a/packages/layerchart/src/lib/utils/ticks.ts b/packages/layerchart/src/lib/utils/ticks.ts index b0dc44284..c55987ad7 100644 --- a/packages/layerchart/src/lib/utils/ticks.ts +++ b/packages/layerchart/src/lib/utils/ticks.ts @@ -122,7 +122,12 @@ export type TicksConfig = | { interval: TimeInterval | null } | null; -export function resolveTickVals(scale: AnyScale, ticks?: TicksConfig, count?: number): any[] { +export function resolveTickVals( + scale: AnyScale, + ticks?: TicksConfig, + count?: number, + interval?: TimeInterval | null +): any[] { // Explicit ticks if (Array.isArray(ticks)) return ticks; @@ -146,7 +151,14 @@ export function resolveTickVals(scale: AnyScale, ticks?: TicksConfig, count?: nu // Ticks from scale if (scale.ticks && typeof scale.ticks === 'function') { - return scale.ticks(count ?? (typeof ticks === 'number' ? ticks : undefined)); + const tickVals = scale.ticks(count ?? (typeof ticks === 'number' ? ticks : undefined)); + + if (interval) { + // Remove last tick when interval is provided (such as for bar charts with center aligned (offset) ticks) + tickVals.pop(); + } + + return tickVals; } return []; diff --git a/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte b/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte index b88e1612c..f03599a7d 100644 --- a/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte @@ -20,7 +20,7 @@ import Preview from '$lib/docs/Preview.svelte'; import Blockquote from '$lib/docs/Blockquote.svelte'; import { createDateSeries, wideData, longData } from '$lib/utils/genData.js'; - import { timeMonth } from 'd3-time'; + import { timeDay, timeMonth } from 'd3-time'; import { interpolate, quantize } from 'd3-interpolate'; import { interpolateSpectral } from 'd3-scale-chromatic'; import { shared } from '../../shared.svelte.js'; @@ -132,6 +132,53 @@
+

Time scale / interval

+ + +
+ +
+
+ +

Time scale / interval (horizontal)

+ + +
+ +
+
+ +

Time scale / interval with inset

+ + +
+ +
+
+

Color (Bars class)

@@ -1337,14 +1384,27 @@
-

Brushing (WIP)

+

Brushing

- +
- +
+
+ Brushing is a work in progress and only supports time/interval scales and does not support band + scales yet. +
+

Radial (vertical)

diff --git a/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte b/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte index 827fc7ea8..437f8814d 100644 --- a/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte @@ -3,6 +3,7 @@ import { scaleBand, scaleOrdinal, scaleTime } from 'd3-scale'; import { mean, sum } from 'd3-array'; import { stackOffsetExpand } from 'd3-shape'; + import { timeDay } from 'd3-time'; import { Field, ToggleGroup, ToggleOption, Toggle, Switch } from 'svelte-ux'; @@ -662,6 +663,75 @@
+

Time scale (with interval)

+ + +
+ + + + + + + +
+
+ +

Time scale with missing data

+ + +
+ (Math.random() > 0.5 ? true : false))} + x="value" + xDomain={[0, null]} + xNice={4} + y="date" + yScale={scaleTime()} + yInterval={timeDay} + padding={{ left: 20, bottom: 20 }} + > + + + + + + +
+
+ +

Time scale with inset

+ + +
+ + + + + + + +
+
+

Tween on mount

diff --git a/packages/layerchart/src/routes/docs/examples/Candlestick/+page.svelte b/packages/layerchart/src/routes/docs/examples/Candlestick/+page.svelte index 0f934a668..cd5c7a266 100644 --- a/packages/layerchart/src/routes/docs/examples/Candlestick/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/Candlestick/+page.svelte @@ -1,5 +1,6 @@ {#if children} {@render children({ points })} {:else} - {#if links} - {#each _links as link} - - {/each} - {/if} - {#each points as point} (ctx.xRange)); - const yRangeMinMax = $derived(extent(ctx.yRange)); - - function showRule(value: typeof x | typeof y, axis: 'x' | 'y') { - switch (typeof value) { - case 'boolean': - return value; - case 'string': - return true; - default: - if (axis === 'x') { - return ctx.xScale(value) >= xRangeMinMax[0]! && ctx.xScale(value) <= xRangeMinMax[1]!; - } else { - return ctx.yScale(value) >= yRangeMinMax[0]! && ctx.yScale(value) <= yRangeMinMax[1]!; - } + const data = $derived(chartDataArray(dataProp ?? ctx.data)); + + const singleX = $derived( + typeof x === 'number' || + x instanceof Date || + x === true || + x === '$left' || + x === '$right' || + (isScaleBand(ctx.xScale) && ctx.xDomain.includes(x as any)) + ); + const singleY = $derived( + typeof y === 'number' || + y instanceof Date || + y === true || + y === '$bottom' || + y === '$top' || + (isScaleBand(ctx.yScale) && ctx.yDomain.includes(y as any)) + ); + + const xRangeMinMax = $derived(extent(ctx.xRange)); + const yRangeMinMax = $derived(extent(ctx.yRange)); + + const lines = $derived.by(() => { + const result: { + x1: number; + y1: number; + x2: number; + y2: number; + axis: 'x' | 'y'; + stroke?: string; + }[] = []; + + // Single x line + if (singleX) { + const _x = + x === true || x === '$left' + ? xRangeMinMax[0]! + : x === '$right' + ? xRangeMinMax[1]! + : ctx.xScale(x) + xOffset; + + result.push({ + x1: _x, + y1: ctx.yRange[0] || 0, + x2: _x, + y2: ctx.yRange[1] || 0, + axis: 'x', + }); + } + + // Single y line + if (singleY) { + const _y = + y === true || y === '$bottom' + ? yRangeMinMax[1]! + : y === '$top' + ? yRangeMinMax[0]! + : ctx.yScale(y) + yOffset; + + result.push({ + x1: ctx.xRange[0] || 0, + y1: _y, + x2: ctx.xRange[1] || 0, + y2: _y, + axis: 'y', + }); } - } + + // Data driven lines + if (!singleX && !singleY) { + const xAccessor = x !== false ? accessor(x as Accessor) : ctx.x; + const yAccessor = y !== false ? accessor(y as Accessor) : ctx.y; + + const xBandOffset = isScaleBand(ctx.xScale) ? ctx.xScale.bandwidth() / 2 : 0; + const yBandOffset = isScaleBand(ctx.yScale) ? ctx.yScale.bandwidth() / 2 : 0; + + for (const d of data) { + const xValue = xAccessor(d); + const yValue = yAccessor(d); + + const x1Value = Array.isArray(xValue) ? xValue[0] : isScaleNumeric(ctx.xScale) ? 0 : xValue; + const x2Value = Array.isArray(xValue) ? xValue[1] : xValue; + const y1Value = Array.isArray(yValue) ? yValue[0] : isScaleNumeric(ctx.yScale) ? 0 : yValue; + const y2Value = Array.isArray(yValue) ? yValue[1] : yValue; + + result.push({ + x1: ctx.xScale(x1Value) + xBandOffset + xOffset, + y1: ctx.yScale(y1Value) + yBandOffset + yOffset, + x2: ctx.xScale(x2Value) + xBandOffset + xOffset, + y2: ctx.yScale(y2Value) + yBandOffset + yOffset, + axis: Array.isArray(yValue) || isScaleBand(ctx.xScale) ? 'x' : 'y', // TODO: what about single prop like lollipop? + stroke: (strokeProp ?? ctx.config.c) ? ctx.cGet(d) : null, // use color scale, if available + }); + } + } + + // Remove lines if out of range of chart (non-0 baseline, brushing, etc) + return result.filter((line) => { + return ( + line.x1 >= xRangeMinMax[0]! && + line.x2 <= xRangeMinMax[1]! && + line.y1 >= yRangeMinMax[0]! && + line.y2 <= yRangeMinMax[1]! + ); + }); + }); + + // $inspect({ lines }); - {#if showRule(x, 'x')} - {@const xCoord = - x === true || x === 'left' - ? xRangeMinMax[0] - : x === 'right' - ? xRangeMinMax[1] - : ctx.xScale(x) + xOffset} + {#each lines as line} + {@const stroke = line.stroke} {#if ctx.radial} - {@const [x1, y1] = pointRadial(xCoord, Number(yRangeMinMax[0]))} - {@const [x2, y2] = pointRadial(xCoord, Number(yRangeMinMax[1]))} - - + {#if line.axis === 'x'} + {@const [x1, y1] = pointRadial(line.x1, line.y1)} + {@const [x2, y2] = pointRadial(line.x2, line.y2)} + + {:else if line.axis === 'y'} + + {/if} {:else} - {/if} - {/if} - - {#if showRule(y, 'y')} - {#if ctx.radial} - - {:else} - {/if} - {/if} + {/each} diff --git a/packages/layerchart/src/lib/utils/genData.ts b/packages/layerchart/src/lib/utils/genData.ts index 769818881..87f0177a2 100644 --- a/packages/layerchart/src/lib/utils/genData.ts +++ b/packages/layerchart/src/lib/utils/genData.ts @@ -58,19 +58,22 @@ export function createSeries(options: { }); } -export function createDateSeries(options: { - count?: number; - min: number; - max: number; - keys?: TKey[]; - value?: 'number' | 'integer'; -}) { +export function createDateSeries( + options: { + count?: number; + min?: number; + max?: number; + keys?: TKey[]; + value?: 'number' | 'integer'; + } = {} +) { const now = timeDay.floor(new Date()); const count = options.count ?? 10; - const min = options.min; - const max = options.max; + const min = options.min ?? 0; + const max = options.max ?? 100; const keys = options.keys ?? ['value']; + const valueType = options.value ?? 'number'; return Array.from({ length: count }).map((_, i) => { return { @@ -79,7 +82,7 @@ export function createDateSeries(options: { keys.map((key) => { return [ key, - options.value === 'integer' ? getRandomInteger(min, max) : getRandomNumber(min, max), + valueType === 'integer' ? getRandomInteger(min, max) : getRandomNumber(min, max), ]; }) ), @@ -87,17 +90,20 @@ export function createDateSeries(options: { }); } -export function createTimeSeries(options: { - count?: number; - min: number; - max: number; - keys: TKey[]; - value: 'number' | 'integer'; -}) { +export function createTimeSeries( + options: { + count?: number; + min?: number; + max?: number; + keys?: TKey[]; + value?: 'number' | 'integer'; + } = {} +) { const count = options.count ?? 10; - const min = options.min; - const max = options.max; + const min = options.min ?? 0; + const max = options.max ?? 100; const keys = options.keys ?? ['value']; + const valueType = options.value ?? 'number'; let lastStartDate = timeDay.floor(new Date()); @@ -113,7 +119,7 @@ export function createTimeSeries(options: { keys.map((key) => { return [ key, - options.value === 'integer' ? getRandomInteger(min, max) : getRandomNumber(min, max), + valueType === 'integer' ? getRandomInteger(min, max) : getRandomNumber(min, max), ]; }) ), diff --git a/packages/layerchart/src/lib/utils/scales.svelte.ts b/packages/layerchart/src/lib/utils/scales.svelte.ts index 89e80711f..5672989a4 100644 --- a/packages/layerchart/src/lib/utils/scales.svelte.ts +++ b/packages/layerchart/src/lib/utils/scales.svelte.ts @@ -53,6 +53,11 @@ export function isScaleTime(scale: AnyScale): scale is ScaleTime): scale is ScaleTime { + const domain = scale.domain(); + return typeof domain[0] === 'number' || typeof domain[1] === 'number'; +} + export function getRange(scale: any) { if (isAnyScale(scale)) { return scale.range(); diff --git a/packages/layerchart/src/routes/_NavMenu.svelte b/packages/layerchart/src/routes/_NavMenu.svelte index 104471cad..f3a68f9b8 100644 --- a/packages/layerchart/src/routes/_NavMenu.svelte +++ b/packages/layerchart/src/routes/_NavMenu.svelte @@ -22,6 +22,7 @@ 'Duration', 'Histogram', 'Line', + 'Lollipop', 'Oscilloscope', 'PunchCard', 'RadialLine', diff --git a/packages/layerchart/src/routes/docs/components/Axis/+page.svelte b/packages/layerchart/src/routes/docs/components/Axis/+page.svelte index e20bd73a5..d35b36f39 100644 --- a/packages/layerchart/src/routes/docs/components/Axis/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Axis/+page.svelte @@ -271,7 +271,7 @@ - +
diff --git a/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte b/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte index 7b45db9a1..8c4c7599b 100644 --- a/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte @@ -643,7 +643,7 @@ yNice={false} yPadding={[0, 20]} radial - rule={{ y: 'top', class: 'stroke-surface-content/20' }} + rule={{ y: '$top', class: 'stroke-surface-content/20' }} props={{ spline: { class: 'stroke' }, xAxis: { format: 'month', tickMarks: false }, diff --git a/packages/layerchart/src/routes/docs/components/Rule/+page.svelte b/packages/layerchart/src/routes/docs/components/Rule/+page.svelte index 44c8055d3..6155be3a8 100644 --- a/packages/layerchart/src/routes/docs/components/Rule/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Rule/+page.svelte @@ -1,10 +1,17 @@

Examples

@@ -39,7 +46,7 @@ - +
@@ -86,7 +93,6 @@
+ +

data driven (x time / y value)

+ + +
+ + + + + + + +
+
+ +

data driven (x band / y value)

+ + +
+ + + + + + + +
+
+ +

data driven (x range)

+ + +
+ + + + + + + +
+
+ +

data driven (y range)

+ + +
+ + + + + + + +
+
diff --git a/packages/layerchart/src/routes/docs/components/Rule/+page.ts b/packages/layerchart/src/routes/docs/components/Rule/+page.ts index 1730f9ea5..e58e8af90 100644 --- a/packages/layerchart/src/routes/docs/components/Rule/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Rule/+page.ts @@ -1,15 +1,21 @@ +import { autoType, csvParse } from 'd3-dsv'; +import type { AlphabetData } from '$static/data/examples/alphabet.js'; + import api from '$lib/components/Rule.svelte?raw&sveld'; import source from '$lib/components/Rule.svelte?raw'; import pageSource from './+page.svelte?raw'; export async function load() { return { + alphabet: (await fetch('/data/examples/alphabet.csv').then(async (r) => + csvParse(await r.text(), autoType) + )) as AlphabetData[], meta: { api, source, pageSource, supportedContexts: ['svg', 'canvas'], - related: ['components/Axis', 'components/Line'], + related: ['components/Axis', 'components/Line', 'examples/Candlestick', 'examples/Duration'], }, }; } diff --git a/packages/layerchart/src/routes/docs/components/Tooltip/+page.svelte b/packages/layerchart/src/routes/docs/components/Tooltip/+page.svelte index 5d7506e02..45aeb484f 100644 --- a/packages/layerchart/src/routes/docs/components/Tooltip/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Tooltip/+page.svelte @@ -12,6 +12,7 @@ Layer, Highlight, Points, + Rule, Tooltip, type ChartContextValue, } from 'layerchart'; @@ -723,7 +724,7 @@ - + - + + - + + - import { scaleOrdinal, scaleTime, scaleUtc } from 'd3-scale'; + import { scaleUtc } from 'd3-scale'; import { utcDay } from 'd3-time'; - import { Axis, Bars, Chart, Highlight, Layer, Points, Tooltip } from 'layerchart'; + import { Axis, Bars, Chart, Highlight, Layer, Rule, Tooltip } from 'layerchart'; import Preview from '$lib/docs/Preview.svelte'; import { shared } from '../../shared.svelte.js'; + import type { DomainType } from '$lib/utils/scales.svelte.js'; let { data } = $props(); + + let xDomain = $state([null, null]);

Examples

@@ -20,26 +23,68 @@ data={data.appleTicker} x="date" xScale={scaleUtc()} - xInterval={utcDay} y={['high', 'low']} yNice c={(d) => (d.close < d.open ? 'desc' : 'asc')} - cScale={scaleOrdinal()} cDomain={['desc', 'asc']} - cRange={['#e41a1c', '#4daf4a']} - padding={{ left: 16, bottom: 24 }} + cRange={['var(--color-danger)', 'var(--color-success)']} + padding={{ left: 20, bottom: 32 }} tooltip={{ mode: 'quadtree-x' }} > - {#snippet children({ context })} + + + + + + + + + + {#snippet children({ data })} + + + + + + + + {/snippet} + +
+
+ + +

with brushing

+ + +
+
+ + (xDomain?.[0] == null || d.date >= xDomain?.[0]) && + (xDomain?.[1] == null || d.date <= xDomain?.[1]) + )} + x="date" + xScale={scaleUtc()} + {xDomain} + y={['high', 'low']} + yNice + c={(d) => (d.close < d.open ? 'desc' : 'asc')} + cDomain={['desc', 'asc']} + cRange={['var(--color-danger)', 'var(--color-success)']} + padding={{ left: 20, bottom: 32 }} + tooltip={{ mode: 'quadtree-x' }} + > - - [d.open, d.close]} insets={{ x: 0.5 }} /> - [d.high, d.low]} insets={{ x: 1.5 }} /> - + + + - + + {#snippet children({ data })} @@ -50,7 +95,106 @@ {/snippet} - {/snippet} + +
+ +
+ { + xDomain = e.xDomain; + }, + }} + > + + + + +
+
+
+ +

Open/close line color

+ + +
+ (d.close < d.open ? 'desc' : 'asc')} + cDomain={['desc', 'asc']} + cRange={['var(--color-danger)', 'var(--color-success)']} + padding={{ left: 20, bottom: 32 }} + tooltip={{ mode: 'quadtree-x' }} + > + + + + + + + + + + {#snippet children({ data })} + + + + + + + + {/snippet} + + +
+
+ +

Bars

+ + +
+ (d.close < d.open ? 'desc' : 'asc')} + cDomain={['desc', 'asc']} + cRange={['var(--color-danger)', 'var(--color-success)']} + padding={{ left: 20, bottom: 32 }} + tooltip={{ mode: 'quadtree-x' }} + > + + + + + + + + + + {#snippet children({ data })} + + + + + + + + {/snippet} +
diff --git a/packages/layerchart/src/routes/docs/examples/Candlestick/+page.ts b/packages/layerchart/src/routes/docs/examples/Candlestick/+page.ts index ec9188a54..4dde51d0b 100644 --- a/packages/layerchart/src/routes/docs/examples/Candlestick/+page.ts +++ b/packages/layerchart/src/routes/docs/examples/Candlestick/+page.ts @@ -11,13 +11,7 @@ export async function load({ fetch }) { meta: { pageSource, supportedContexts: ['svg', 'canvas'], - related: [ - 'components/Bars', - 'components/Points', - 'examples/Bars', - 'examples/Histogram', - 'examples/Sparkbar', - ], + related: ['components/Rule', 'components/Bars'], }, }; } diff --git a/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte b/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte index 0150a5393..24da8d308 100644 --- a/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/Duration/+page.svelte @@ -3,7 +3,7 @@ import { timeMinute, timeDay } from 'd3-time'; import { Duration } from 'svelte-ux'; - import { BarChart, Points, Tooltip } from 'layerchart'; + import { BarChart, Points, Rule, Tooltip } from 'layerchart'; import Preview from '$lib/docs/Preview.svelte'; import { getRandomInteger } from '$lib/utils/genData.js'; @@ -261,7 +261,8 @@ {renderContext} > {#snippet marks()} - + + {/snippet} {#snippet tooltip({ context })} @@ -320,7 +321,8 @@ {renderContext} > {#snippet marks()} - + + {/snippet} {#snippet tooltip({ context })} diff --git a/packages/layerchart/src/routes/docs/examples/Lollipop/+page.svelte b/packages/layerchart/src/routes/docs/examples/Lollipop/+page.svelte new file mode 100644 index 000000000..70bc78d53 --- /dev/null +++ b/packages/layerchart/src/routes/docs/examples/Lollipop/+page.svelte @@ -0,0 +1,48 @@ + + +

Examples

+ +

Basic

+ + +
+ + + + + + + + + + + {#snippet children({ data })} + + + + + {/snippet} + + +
+
diff --git a/packages/layerchart/src/routes/docs/examples/Lollipop/+page.ts b/packages/layerchart/src/routes/docs/examples/Lollipop/+page.ts new file mode 100644 index 000000000..50f9e2f8b --- /dev/null +++ b/packages/layerchart/src/routes/docs/examples/Lollipop/+page.ts @@ -0,0 +1,17 @@ +import { autoType, csvParse } from 'd3-dsv'; +import type { AlphabetData } from '$static/data/examples/alphabet.js'; + +import pageSource from './+page.svelte?raw'; + +export async function load({ fetch }) { + return { + alphabet: (await fetch('/data/examples/alphabet.csv').then(async (r) => + csvParse(await r.text(), autoType) + )) as AlphabetData[], + meta: { + pageSource, + supportedContexts: ['svg', 'canvas'], + related: ['components/Rule'], + }, + }; +} diff --git a/packages/layerchart/src/routes/docs/examples/RadialLine/+page.svelte b/packages/layerchart/src/routes/docs/examples/RadialLine/+page.svelte index 99a20cb39..4455b24ec 100644 --- a/packages/layerchart/src/routes/docs/examples/RadialLine/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/RadialLine/+page.svelte @@ -95,7 +95,7 @@ v + '° F'} /> @@ -140,7 +140,7 @@ v + '° F'} /> diff --git a/packages/layerchart/static/data/examples/alphabet.csv b/packages/layerchart/static/data/examples/alphabet.csv new file mode 100644 index 000000000..67b9434ac --- /dev/null +++ b/packages/layerchart/static/data/examples/alphabet.csv @@ -0,0 +1,27 @@ +letter,frequency +E,0.12702 +T,0.09056 +A,0.08167 +O,0.07507 +I,0.06966 +N,0.06749 +S,0.06327 +H,0.06094 +R,0.05987 +D,0.04253 +L,0.04025 +C,0.02782 +U,0.02758 +M,0.02406 +W,0.0236 +F,0.02288 +G,0.02015 +Y,0.01974 +P,0.01929 +B,0.01492 +V,0.00978 +K,0.00772 +J,0.00153 +X,0.0015 +Q,0.00095 +Z,0.00074 diff --git a/packages/layerchart/static/data/examples/alphabet.d.ts b/packages/layerchart/static/data/examples/alphabet.d.ts new file mode 100644 index 000000000..67050d7e5 --- /dev/null +++ b/packages/layerchart/static/data/examples/alphabet.d.ts @@ -0,0 +1,4 @@ +export type AlphabetData = { + letter: string; + frequency: number; +}; From 541b230d9db2a5cf16200bf81e599f666a6dae93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 12:46:52 -0400 Subject: [PATCH 24/54] Version Packages (next) (#621) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 3 +++ packages/layerchart/CHANGELOG.md | 12 ++++++++++++ packages/layerchart/package.json | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 72fd65ed5..4ac28647e 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -35,6 +35,7 @@ "eleven-trains-make", "empty-bats-stop", "evil-flowers-float", + "evil-hoops-return", "four-taxes-beam", "free-teeth-live", "fruity-pillows-agree", @@ -48,6 +49,7 @@ "huge-rocks-sip", "khaki-pugs-hammer", "kind-shirts-sniff", + "large-spiders-stay", "legal-parrots-beam", "lemon-bats-change", "loud-lies-film", @@ -71,6 +73,7 @@ "pink-showers-hunt", "polite-parts-learn", "proud-llamas-fold", + "proud-melons-warn", "public-queens-invite", "puny-clocks-admire", "quiet-insects-share", diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index 31992a263..b186f022f 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,17 @@ # LayerChart +## 2.0.0-next.34 + +### Minor Changes + +- feat(Rule): Support using as data-driven mark (ex. candlestick, lollipop) by default (`` using Chart accessors) or passing explicit `x`/`y` accessors (ex. ``). Resolves #64 ([#622](https://github.com/techniq/layerchart/pull/622)) + +- breaking(Points): Remove `` prop. Use `` with x/y accessor instead ([#622](https://github.com/techniq/layerchart/pull/622)) + +### Patch Changes + +- breaking(Axis): Rename `x="left|right"` and `y="top|bottom"` props with `# LayerChart prefix (ex. ``) ([#622](https://github.com/techniq/layerchart/pull/622)) + ## 2.0.0-next.33 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 5a85befbb..0283718d1 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "2.0.0-next.33", + "version": "2.0.0-next.34", "scripts": { "dev": "vite dev --port 3002", "build": "vite build", From 43945cafb5d4114b5f11c6ff71605f26e546f3b7 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Wed, 30 Jul 2025 12:19:48 -0400 Subject: [PATCH 25/54] Update Svelte UX to latest (removing need for Vite `optimizeDeps.exclude: ['~icons']`, docs only) --- packages/layerchart/package.json | 2 +- packages/layerchart/vite.config.js | 3 - pnpm-lock.yaml | 98 +++++++++++++++--------------- 3 files changed, 50 insertions(+), 53 deletions(-) diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 0283718d1..39f142a72 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -68,7 +68,7 @@ "svelte": "5.34.1", "svelte-check": "^4.2.1", "svelte-json-tree": "^2.2.0", - "svelte-ux": "2.0.0-next.14", + "svelte-ux": "2.0.0-next.16", "svelte2tsx": "^0.7.39", "tailwindcss": "^4.1.10", "topojson-client": "^3.1.0", diff --git a/packages/layerchart/vite.config.js b/packages/layerchart/vite.config.js index d882fff6c..2ba1857a1 100644 --- a/packages/layerchart/vite.config.js +++ b/packages/layerchart/vite.config.js @@ -33,9 +33,6 @@ const config = { gzipSize: true, }), ], - optimizeDeps: { - exclude: ['~icons'], - }, resolve: { noExternal: true, // https://github.com/AdrianGonz97/refined-cf-pages-action/issues/26#issuecomment-2878397440 }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40fdfe9d7..65a096a3c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -253,8 +253,8 @@ importers: specifier: ^2.2.0 version: 2.2.0(svelte@5.34.1) svelte-ux: - specifier: 2.0.0-next.14 - version: 2.0.0-next.14(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1) + specifier: 2.0.0-next.16 + version: 2.0.0-next.16(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1) svelte2tsx: specifier: ^0.7.39 version: 0.7.39(svelte@5.34.1)(typescript@5.8.3) @@ -583,9 +583,18 @@ packages: '@floating-ui/core@1.7.1': resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@floating-ui/dom@1.7.1': resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} + '@floating-ui/dom@1.7.3': + resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} @@ -732,33 +741,29 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@layerstack/svelte-actions@1.0.1-next.12': - resolution: {integrity: sha512-dndWTlYu8b1u6vw2nrO7NssccoACArGG75WoNlyVC13KuENZlWdKE9Q79/wlnbq00NeQMNKMjJwRMsrKQj2ULA==} - '@layerstack/svelte-actions@1.0.1-next.14': resolution: {integrity: sha512-MPBmVaB+GfNHvBkg5nJkPG18smoXKvsvJRpsdWnrUBfca+TieZLoaEzNxDH+9LG11dIXP9gghsXt1mUqbbyAsA==} '@layerstack/svelte-state@0.1.0-next.19': resolution: {integrity: sha512-yCYoQAIbeP8y1xmOB/r0+UundgP4JFnpNURgMki+26TotzoqrZ5oLpHvhPSVm60ks+buR3ebDBTeUFdHzxwzQQ==} - '@layerstack/svelte-stores@1.0.2-next.12': - resolution: {integrity: sha512-XwKyGCXl3+NHQzB3LsPSo6Rb0TjoY3LZzb1Snw09VnOUxvA9skMmVnM8EO3eKFti/8tyOLReddEUA1ygUaT4Lg==} + '@layerstack/svelte-stores@1.0.2-next.14': + resolution: {integrity: sha512-UI8VO35hgoG0XOenPgJlieUv6f/1nomFuXnHpFwXj0+OkqIwFoJxdsA8OjbE/gS0lImqv2KKsSCqDpXsKrGi9g==} - '@layerstack/svelte-table@1.0.1-next.12': - resolution: {integrity: sha512-u5zFdXQWlEJTGXNf52ku6hjyxmjp6ge6GwkW+oecqknY8v0b9d1MfrEw3dGJ4Ap88I0aBIdufmOkd0TTEwiCkQ==} - - '@layerstack/tailwind@2.0.0-next.15': - resolution: {integrity: sha512-7tqKE3OV7/ybeDOORX++USYYCBJa7IgTya2czFpzbgXGo7CQDVyuv+0J1DggjRcEqhhXQA4MUhgnhcRaZvHxWg==} + '@layerstack/svelte-table@1.0.1-next.14': + resolution: {integrity: sha512-PZG3l7iylA3Fazff4L/dviI47vwML1gjuk8awTh/yKFGhKcy4Zk7TkDKnM49cdip3+6077p6acwyKysdQ6wxSg==} '@layerstack/tailwind@2.0.0-next.17': resolution: {integrity: sha512-ZSn6ouqpnzB6DKzSKLVwrUBOQsrzpDA/By2/ba9ApxgTGnaD1nyqNwrvmZ+kswdAwB4YnrGEAE4VZkKrB2+DaQ==} - '@layerstack/utils@2.0.0-next.12': - resolution: {integrity: sha512-fhGZUlSr3N+D44BYm37WKMGSEFyZBW+dwIqtGU8Cl54mR4TLQ/UwyGhdpgIHyH/x/8q1abE0fP0Dn6ZsrDE3BA==} - '@layerstack/utils@2.0.0-next.14': resolution: {integrity: sha512-1I2CS0Cwgs53W35qVg1eBdYhB/CiPvL3s0XE61b8jWkTHxgjBF65yYNgXjW74kv7WI7GsJcWMNBufPd0rnu9kA==} + '@lucide/svelte@0.534.0': + resolution: {integrity: sha512-XqlT0ibiEEoEGcmZLdk0RNtq1OW77OjqxXZjJE/23Wabl+2d9Pxg9AAx7+6WFv8BSf8K6im73vz3cZKYEgY9Mw==} + peerDependencies: + svelte: ^5 + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -2487,8 +2492,8 @@ packages: typescript: optional: true - svelte-ux@2.0.0-next.14: - resolution: {integrity: sha512-dm1UBMG5gV/SubAt8oXJkeSPaNkxnaoTWaF7SY+DkZLeIe7nBPL7QH9jZATMBgwePlqTtBmcnbjzdwViGJG/wg==} + svelte-ux@2.0.0-next.16: + resolution: {integrity: sha512-3ilgsf0Evx05to5WplngFgHW6VCYfqZ5YFmZLSDBsQrXN4zVBRNTQhZn080RCAbqVSlihxRZrlWpSVIzHnpSCg==} peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0 @@ -3125,11 +3130,22 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.9 + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + '@floating-ui/dom@1.7.1': dependencies: '@floating-ui/core': 1.7.1 '@floating-ui/utils': 0.2.9 + '@floating-ui/dom@1.7.3': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.9': {} '@iconify-json/lucide@1.2.48': @@ -3261,12 +3277,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@layerstack/svelte-actions@1.0.1-next.12': - dependencies: - '@floating-ui/dom': 1.7.1 - '@layerstack/utils': 2.0.0-next.12 - d3-scale: 4.0.2 - '@layerstack/svelte-actions@1.0.1-next.14': dependencies: '@floating-ui/dom': 1.7.1 @@ -3277,27 +3287,19 @@ snapshots: dependencies: '@layerstack/utils': 2.0.0-next.14 - '@layerstack/svelte-stores@1.0.2-next.12': + '@layerstack/svelte-stores@1.0.2-next.14': dependencies: - '@layerstack/utils': 2.0.0-next.12 + '@layerstack/utils': 2.0.0-next.14 immer: 10.1.1 lodash-es: 4.17.21 zod: 3.25.64 - '@layerstack/svelte-table@1.0.1-next.12': - dependencies: - '@layerstack/svelte-actions': 1.0.1-next.12 - '@layerstack/utils': 2.0.0-next.12 - d3-array: 3.2.4 - lodash-es: 4.17.21 - - '@layerstack/tailwind@2.0.0-next.15': + '@layerstack/svelte-table@1.0.1-next.14': dependencies: - '@layerstack/utils': 2.0.0-next.12 - clsx: 2.1.1 + '@layerstack/svelte-actions': 1.0.1-next.14 + '@layerstack/utils': 2.0.0-next.14 d3-array: 3.2.4 lodash-es: 4.17.21 - tailwind-merge: 3.3.0 '@layerstack/tailwind@2.0.0-next.17': dependencies: @@ -3307,19 +3309,16 @@ snapshots: lodash-es: 4.17.21 tailwind-merge: 3.3.0 - '@layerstack/utils@2.0.0-next.12': + '@layerstack/utils@2.0.0-next.14': dependencies: d3-array: 3.2.4 d3-time: 3.1.0 d3-time-format: 4.1.0 lodash-es: 4.17.21 - '@layerstack/utils@2.0.0-next.14': + '@lucide/svelte@0.534.0(svelte@5.34.1)': dependencies: - d3-array: 3.2.4 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - lodash-es: 4.17.21 + svelte: 5.34.1 '@manypkg/find-root@1.1.0': dependencies: @@ -4952,14 +4951,15 @@ snapshots: postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0) typescript: 5.8.3 - svelte-ux@2.0.0-next.14(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1): + svelte-ux@2.0.0-next.16(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1): dependencies: - '@floating-ui/dom': 1.7.1 - '@layerstack/svelte-actions': 1.0.1-next.12 - '@layerstack/svelte-stores': 1.0.2-next.12 - '@layerstack/svelte-table': 1.0.1-next.12 - '@layerstack/tailwind': 2.0.0-next.15 - '@layerstack/utils': 2.0.0-next.12 + '@floating-ui/dom': 1.7.3 + '@layerstack/svelte-actions': 1.0.1-next.14 + '@layerstack/svelte-stores': 1.0.2-next.14 + '@layerstack/svelte-table': 1.0.1-next.14 + '@layerstack/tailwind': 2.0.0-next.17 + '@layerstack/utils': 2.0.0-next.14 + '@lucide/svelte': 0.534.0(svelte@5.34.1) d3-array: 3.2.4 d3-scale: 4.0.2 esm-env: 1.2.2 From e8d235e15b20f2250f76087cc6ae636cb3c5eef6 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Wed, 30 Jul 2025 12:58:57 -0400 Subject: [PATCH 26/54] Update Svelte UX (fix breadcrumb layout regression) --- packages/layerchart/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 39f142a72..21fcbdd04 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -68,7 +68,7 @@ "svelte": "5.34.1", "svelte-check": "^4.2.1", "svelte-json-tree": "^2.2.0", - "svelte-ux": "2.0.0-next.16", + "svelte-ux": "2.0.0-next.17", "svelte2tsx": "^0.7.39", "tailwindcss": "^4.1.10", "topojson-client": "^3.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65a096a3c..0529baaa9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -253,8 +253,8 @@ importers: specifier: ^2.2.0 version: 2.2.0(svelte@5.34.1) svelte-ux: - specifier: 2.0.0-next.16 - version: 2.0.0-next.16(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1) + specifier: 2.0.0-next.17 + version: 2.0.0-next.17(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1) svelte2tsx: specifier: ^0.7.39 version: 0.7.39(svelte@5.34.1)(typescript@5.8.3) @@ -2492,8 +2492,8 @@ packages: typescript: optional: true - svelte-ux@2.0.0-next.16: - resolution: {integrity: sha512-3ilgsf0Evx05to5WplngFgHW6VCYfqZ5YFmZLSDBsQrXN4zVBRNTQhZn080RCAbqVSlihxRZrlWpSVIzHnpSCg==} + svelte-ux@2.0.0-next.17: + resolution: {integrity: sha512-jKE/4baK3Q0SsdlHIH7o2kZDIPtktIdddlzFiqumME7hSafzGHW61HU/x2FhfaQoMBC5yyvtA6DcEh5UOylwhw==} peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0 @@ -4951,7 +4951,7 @@ snapshots: postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0) typescript: 5.8.3 - svelte-ux@2.0.0-next.16(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1): + svelte-ux@2.0.0-next.17(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1): dependencies: '@floating-ui/dom': 1.7.3 '@layerstack/svelte-actions': 1.0.1-next.14 From 40ebca19d2dd4ca9d27eb1a8b45266ac15ca1bd3 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Fri, 1 Aug 2025 09:33:31 -0400 Subject: [PATCH 27/54] feat: AutoScale (#624) * feat(Chart): Automatically determine scale based on data and domain values (instead of defaulting to scaleLinear) * Remove `cScale={scaleOrdinal()}` usage (already default) * Cleanup yNice={#} (since axis ticks now support `tickSpacing`) * Setup autoScale for x1Scale and y1Scale * docs: Improve bar padding examples --- .changeset/shaky-dots-go.md | 5 + .../src/lib/components/Chart.svelte | 58 ++++++----- .../lib/components/charts/AreaChart.svelte | 7 -- .../lib/components/charts/LineChart.svelte | 8 -- .../lib/components/charts/ScatterChart.svelte | 17 ---- .../layerchart/src/lib/utils/scales.svelte.ts | 42 +++++++- .../routes/docs/components/Axis/+page.svelte | 96 +++---------------- .../docs/components/BrushContext/+page.svelte | 54 ++++------- .../routes/docs/components/Grid/+page.svelte | 17 +--- .../docs/components/LineChart/+page.svelte | 5 +- .../routes/docs/components/Rule/+page.svelte | 6 -- .../docs/components/Tooltip/+page.svelte | 21 +--- .../routes/docs/examples/Area/+page.svelte | 28 +----- .../routes/docs/examples/Bars/+page.svelte | 18 +--- .../routes/docs/examples/Columns/+page.svelte | 87 ++++++++--------- .../docs/examples/Compound/+page.svelte | 5 +- .../routes/docs/examples/Line/+page.svelte | 29 +----- .../docs/examples/Lollipop/+page.svelte | 3 - .../docs/examples/RadialLine/+page.svelte | 3 +- .../routes/docs/examples/Scatter/+page.svelte | 24 +---- 20 files changed, 168 insertions(+), 365 deletions(-) create mode 100644 .changeset/shaky-dots-go.md diff --git a/.changeset/shaky-dots-go.md b/.changeset/shaky-dots-go.md new file mode 100644 index 000000000..343bc0d6c --- /dev/null +++ b/.changeset/shaky-dots-go.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +feat(Chart): Automatically determine scale based on data and domain values (instead of defaulting to scaleLinear) diff --git a/packages/layerchart/src/lib/components/Chart.svelte b/packages/layerchart/src/lib/components/Chart.svelte index 102540067..d781f81f4 100644 --- a/packages/layerchart/src/lib/components/Chart.svelte +++ b/packages/layerchart/src/lib/components/Chart.svelte @@ -1,9 +1,10 @@ + -
+
{#if source} -
-
-          {@html highlightedSource}
-      
- -
- -
+
+      
+        {#await highlighter}
+          
Loading...
+ {:then h} + {@html h.codeToHtml(source, { + lang: language, + themes: { + light: 'github-light-default', + dark: 'github-dark-default', + }, + })} + {:catch error} +
Error loading code highlighting: {error.message}
+ {/await} + +
+
+ +
+
{/if}
+ + diff --git a/packages/layerchart/src/lib/docs/Preview.svelte b/packages/layerchart/src/lib/docs/Preview.svelte index 6f1ac198a..cb361d925 100644 --- a/packages/layerchart/src/lib/docs/Preview.svelte +++ b/packages/layerchart/src/lib/docs/Preview.svelte @@ -1,9 +1,5 @@ -
+
- {@render children?.()} + {@render children()}
{#if code && showCode} -
- +
+
{/if}
diff --git a/packages/layerchart/src/lib/docs/ViewSourceButton.svelte b/packages/layerchart/src/lib/docs/ViewSourceButton.svelte index cd4afb211..7b51b7a7c 100644 --- a/packages/layerchart/src/lib/docs/ViewSourceButton.svelte +++ b/packages/layerchart/src/lib/docs/ViewSourceButton.svelte @@ -35,7 +35,7 @@ {/if}
-
+
diff --git a/packages/layerchart/src/routes/+layout.svelte b/packages/layerchart/src/routes/+layout.svelte index 71f616e28..00f302d38 100644 --- a/packages/layerchart/src/routes/+layout.svelte +++ b/packages/layerchart/src/routes/+layout.svelte @@ -3,7 +3,6 @@ import posthog from 'posthog-js'; import { watch } from 'runed'; - import 'prism-themes/themes/prism-vsc-dark-plus.css'; import { AppBar, AppLayout, @@ -159,7 +158,7 @@ classes={{ button: 'max-sm:-mr-3' }} /> -
+
diff --git a/packages/layerchart/src/routes/docs/+layout.svelte b/packages/layerchart/src/routes/docs/+layout.svelte index 6ae8cc003..00077f22d 100644 --- a/packages/layerchart/src/routes/docs/+layout.svelte +++ b/packages/layerchart/src/routes/docs/+layout.svelte @@ -245,7 +245,11 @@ {#if type === 'components' && !hideUsage} {#key page.route.id}

Usage

- + {/key} {/if} diff --git a/packages/layerchart/src/routes/getting-started/+page.svelte b/packages/layerchart/src/routes/getting-started/+page.svelte index cf10fec06..b7b50d81d 100644 --- a/packages/layerchart/src/routes/getting-started/+page.svelte +++ b/packages/layerchart/src/routes/getting-started/+page.svelte @@ -175,3 +175,10 @@ Svelte UX for a large collection of Svelte components, actions, stores, and utilities to build highly interactive applications.
+ + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0529baaa9..d31f51ee4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -192,9 +192,6 @@ importers: '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 - '@types/prismjs': - specifier: ^1.26.5 - version: 1.26.5 '@types/shapefile': specifier: ^0.6.4 version: 0.6.4 @@ -222,15 +219,6 @@ importers: prettier-plugin-svelte: specifier: ^3.4.0 version: 3.4.0(prettier@3.5.3)(svelte@5.34.1) - prism-svelte: - specifier: ^0.5.0 - version: 0.5.0 - prism-themes: - specifier: ^1.9.0 - version: 1.9.0 - prismjs: - specifier: ^1.30.0 - version: 1.30.0 rehype-slug: specifier: ^6.0.0 version: 6.0.0 @@ -240,6 +228,9 @@ importers: shapefile: specifier: ^0.6.6 version: 0.6.6 + shiki: + specifier: ^3.9.2 + version: 3.9.2 solar-calculator: specifier: ^0.3.0 version: 0.3.0 @@ -922,6 +913,27 @@ packages: cpu: [x64] os: [win32] + '@shikijs/core@3.9.2': + resolution: {integrity: sha512-3q/mzmw09B2B6PgFNeiaN8pkNOixWS726IHmJEpjDAcneDPMQmUg2cweT9cWXY4XcyQS3i6mOOUgQz9RRUP6HA==} + + '@shikijs/engine-javascript@3.9.2': + resolution: {integrity: sha512-kUTRVKPsB/28H5Ko6qEsyudBiWEDLst+Sfi+hwr59E0GLHV0h8RfgbQU7fdN5Lt9A8R1ulRiZyTvAizkROjwDA==} + + '@shikijs/engine-oniguruma@3.9.2': + resolution: {integrity: sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA==} + + '@shikijs/langs@3.9.2': + resolution: {integrity: sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w==} + + '@shikijs/themes@3.9.2': + resolution: {integrity: sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA==} + + '@shikijs/types@3.9.2': + resolution: {integrity: sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sveltejs/acorn-typescript@1.0.5': resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: @@ -1198,15 +1210,15 @@ packages: '@types/lodash@4.17.4': resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} '@types/node@24.0.1': resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} - '@types/prismjs@1.26.5': - resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -1228,6 +1240,9 @@ packages: '@types/unist@3.0.2': resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@vitest/expect@3.2.3': resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} @@ -1341,10 +1356,19 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -1389,6 +1413,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1573,6 +1600,10 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1584,6 +1615,9 @@ packages: devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1748,9 +1782,18 @@ packages: hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + human-id@4.1.1: resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} hasBin: true @@ -1967,6 +2010,9 @@ packages: engines: {node: '>= 18'} hasBin: true + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} @@ -1983,6 +2029,21 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2056,6 +2117,12 @@ packages: ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -2227,6 +2294,9 @@ packages: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} @@ -2241,6 +2311,15 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regexparam@3.0.0: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} @@ -2349,6 +2428,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@3.9.2: + resolution: {integrity: sha512-t6NKl5e/zGTvw/IyftLcumolgOczhuroqwXngDeMqJ3h3EQiTY/7wmfgPlsmloD8oYfqkEDqxiaH37Pjm1zUhQ==} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2385,6 +2467,9 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -2415,6 +2500,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2585,6 +2673,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2609,9 +2700,15 @@ packages: unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} @@ -2662,6 +2759,12 @@ packages: vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.3: resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2842,6 +2945,9 @@ packages: zod@3.25.64: resolution: {integrity: sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@ampproject/remapping@2.3.0': @@ -3453,6 +3559,39 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true + '@shikijs/core@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + + '@shikijs/themes@3.9.2': + dependencies: + '@shikijs/types': 3.9.2 + + '@shikijs/types@3.9.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: acorn: 8.15.0 @@ -3757,14 +3896,16 @@ snapshots: '@types/lodash@4.17.4': {} + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.2 + '@types/node@12.20.55': {} '@types/node@24.0.1': dependencies: undici-types: 7.8.0 - '@types/prismjs@1.26.5': {} - '@types/resolve@1.17.1': dependencies: '@types/node': 24.0.1 @@ -3792,6 +3933,8 @@ snapshots: '@types/unist@3.0.2': {} + '@ungap/structured-clone@1.3.0': {} + '@vitest/expect@3.2.3': dependencies: '@types/chai': 5.2.2 @@ -3890,6 +4033,8 @@ snapshots: cac@6.7.14: {} + ccount@2.0.1: {} + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -3898,6 +4043,10 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + chardet@0.7.0: {} check-error@2.1.1: {} @@ -3942,6 +4091,8 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 + comma-separated-tokens@2.0.3: {} + commander@2.20.3: {} commander@7.2.0: {} @@ -4099,12 +4250,18 @@ snapshots: dependencies: robust-predicates: 3.0.2 + dequal@2.0.3: {} + detect-indent@6.1.0: {} detect-libc@2.0.4: {} devalue@5.1.1: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4287,10 +4444,30 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + html-void-elements@3.0.0: {} + human-id@4.1.1: {} iconv-lite@0.4.24: @@ -4456,6 +4633,18 @@ snapshots: marked@15.0.12: {} + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + mdn-data@2.0.30: {} mdsvex@0.12.3(svelte@5.34.1): @@ -4472,6 +4661,23 @@ snapshots: merge2@1.4.1: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -4539,6 +4745,14 @@ snapshots: ohash@2.0.11: {} + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -4676,6 +4890,8 @@ snapshots: prismjs@1.30.0: {} + property-information@7.1.0: {} + quansync@0.2.10: {} queue-microtask@1.2.3: {} @@ -4689,6 +4905,16 @@ snapshots: readdirp@4.1.2: {} + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + regexparam@3.0.0: {} rehype-slug@6.0.0: @@ -4828,6 +5054,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@3.9.2: + dependencies: + '@shikijs/core': 3.9.2 + '@shikijs/engine-javascript': 3.9.2 + '@shikijs/engine-oniguruma': 3.9.2 + '@shikijs/langs': 3.9.2 + '@shikijs/themes': 3.9.2 + '@shikijs/types': 3.9.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -4854,6 +5091,8 @@ snapshots: source-map@0.7.4: {} + space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -4886,6 +5125,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -5082,6 +5326,8 @@ snapshots: tr46@0.0.3: {} + trim-lines@3.0.1: {} + tslib@2.8.1: {} typescript@5.8.3: {} @@ -5106,10 +5352,18 @@ snapshots: dependencies: '@types/unist': 3.0.2 + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position@2.0.3: dependencies: '@types/unist': 2.0.11 + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 @@ -5152,6 +5406,16 @@ snapshots: '@types/unist': 2.0.11 unist-util-stringify-position: 2.0.3 + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile-message: 4.0.3 + vite-node@3.2.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): dependencies: cac: 6.7.14 @@ -5332,3 +5596,5 @@ snapshots: zod@3.22.3: {} zod@3.25.64: {} + + zwitch@2.0.4: {} From 8d6b4f9516e93e410505fd93b8c25688ac2d6474 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Sat, 16 Aug 2025 20:51:07 -0400 Subject: [PATCH 34/54] fix(ArcChart): Do not pass y accessor to use linear scale fallback --- .changeset/proud-camels-cut.md | 5 +++++ .../layerchart/src/lib/components/charts/ArcChart.svelte | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .changeset/proud-camels-cut.md diff --git a/.changeset/proud-camels-cut.md b/.changeset/proud-camels-cut.md new file mode 100644 index 000000000..5419a536c --- /dev/null +++ b/.changeset/proud-camels-cut.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(ArcChart): Do not pass y accessor to use linear scale fallback diff --git a/packages/layerchart/src/lib/components/charts/ArcChart.svelte b/packages/layerchart/src/lib/components/charts/ArcChart.svelte index d6d3ca755..06e11d2b1 100644 --- a/packages/layerchart/src/lib/components/charts/ArcChart.svelte +++ b/packages/layerchart/src/lib/components/charts/ArcChart.svelte @@ -367,7 +367,6 @@ bind:context data={visibleData} x={value} - y={key} {c} cDomain={chartData.map(keyAccessor)} cRange={seriesColors.length From 79c9e3b809b88115bde98559446d7d5e10a33b53 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 16 Aug 2025 20:52:37 -0400 Subject: [PATCH 35/54] Version Packages (next) (#637) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 1 + packages/layerchart/CHANGELOG.md | 6 ++++++ packages/layerchart/package.json | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 4e9ad6477..aefa77c13 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -73,6 +73,7 @@ "pink-hornets-rest", "pink-showers-hunt", "polite-parts-learn", + "proud-camels-cut", "proud-llamas-fold", "proud-melons-warn", "public-queens-invite", diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index 81bb692b4..2abcb84e7 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,11 @@ # LayerChart +## 2.0.0-next.37 + +### Patch Changes + +- fix(ArcChart): Do not pass y accessor to use linear scale fallback ([#449](https://github.com/techniq/layerchart/pull/449)) + ## 2.0.0-next.36 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 1fcf3bc8b..8ecafa05c 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "2.0.0-next.36", + "version": "2.0.0-next.37", "scripts": { "dev": "vite dev --port 3002", "build": "vite build", From 696c3c2bff741d9eb8e88c3e89fd88864017f45f Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Sun, 17 Aug 2025 09:57:05 -0400 Subject: [PATCH 36/54] Cleanup imports --- packages/layerchart/src/lib/components/Points.svelte | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/layerchart/src/lib/components/Points.svelte b/packages/layerchart/src/lib/components/Points.svelte index 3b64cb360..819c1c22f 100644 --- a/packages/layerchart/src/lib/components/Points.svelte +++ b/packages/layerchart/src/lib/components/Points.svelte @@ -45,11 +45,9 @@ - -
-
- {@html marked.parse(sanitize(data.changelog))} -
- - -
diff --git a/packages/layerchart/src/routes/changelog/+page.ts b/packages/layerchart/src/routes/changelog/+page.ts deleted file mode 100644 index 15ac15228..000000000 --- a/packages/layerchart/src/routes/changelog/+page.ts +++ /dev/null @@ -1,7 +0,0 @@ -export async function load({ fetch }) { - return { - changelog: await fetch( - 'https://raw.githubusercontent.com/techniq/layerchart/main/packages/layerchart/CHANGELOG.md' - ).then(async (r) => await r.text()), - }; -} diff --git a/packages/layerchart/vite.config.js b/packages/layerchart/vite.config.js index 2ba1857a1..45b3d62c9 100644 --- a/packages/layerchart/vite.config.js +++ b/packages/layerchart/vite.config.js @@ -24,7 +24,6 @@ const config = { }, }, }), - // @ts-expect-error devtoolsJson(), // Needs to be last visualizer({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d31f51ee4..740b0e04d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@changesets/cli': - specifier: 2.29.4 - version: 2.29.4 + specifier: 2.29.6 + version: 2.29.6(@types/node@24.3.0) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 @@ -18,14 +18,14 @@ importers: specifier: 6.0.1 version: 6.0.1 wrangler: - specifier: ^4.20.0 - version: 4.20.0(@cloudflare/workers-types@4.20250613.0) + specifier: ^4.30.0 + version: 4.30.0(@cloudflare/workers-types@4.20250816.0) packages/layerchart: dependencies: '@dagrejs/dagre': - specifier: ^1.1.4 - version: 1.1.4 + specifier: ^1.1.5 + version: 1.1.5 '@layerstack/svelte-actions': specifier: 1.0.1-next.14 version: 1.0.1-next.14 @@ -102,39 +102,39 @@ importers: specifier: ^10.1.0 version: 10.1.0 runed: - specifier: ^0.28.0 - version: 0.28.0(svelte@5.34.1) + specifier: ^0.31.1 + version: 0.31.1(svelte@5.38.2) devDependencies: '@changesets/cli': - specifier: ^2.29.4 - version: 2.29.4 + specifier: ^2.29.6 + version: 2.29.6(@types/node@24.3.0) '@iconify-json/lucide': - specifier: ^1.2.48 - version: 1.2.48 + specifier: ^1.2.62 + version: 1.2.62 '@rollup/plugin-dsv': specifier: ^3.0.5 version: 3.0.5(rollup@2.79.2) '@sveltejs/adapter-cloudflare': - specifier: ^7.0.4 - version: 7.0.4(@sveltejs/kit@2.21.5(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(wrangler@4.20.0(@cloudflare/workers-types@4.20250613.0)) + specifier: ^7.2.1 + version: 7.2.1(@sveltejs/kit@2.31.1(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(wrangler@4.30.0(@cloudflare/workers-types@4.20250816.0)) '@sveltejs/kit': - specifier: ^2.21.5 - version: 2.21.5(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + specifier: ^2.31.1 + version: 2.31.1(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) '@sveltejs/package': - specifier: ^2.3.11 - version: 2.3.11(svelte@5.34.1)(typescript@5.8.3) + specifier: ^2.4.1 + version: 2.4.1(svelte@5.38.2)(typescript@5.9.2) '@sveltejs/vite-plugin-svelte': - specifier: ^5.1.0 - version: 5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + specifier: ^6.1.2 + version: 6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 '@tailwindcss/typography': specifier: ^0.5.16 - version: 0.5.16(tailwindcss@4.1.10) + version: 0.5.16(tailwindcss@4.1.12) '@tailwindcss/vite': - specifier: ^4.1.10 - version: 4.1.10(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + specifier: ^4.1.12 + version: 4.1.12(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) '@types/d3': specifier: ^7.4.3 version: 7.4.3 @@ -204,21 +204,18 @@ importers: '@types/topojson-specification': specifier: ^1.0.5 version: 1.0.5 - marked: - specifier: ^15.0.12 - version: 15.0.12 mdsvex: specifier: ^0.12.3 - version: 0.12.3(svelte@5.34.1) + version: 0.12.3(svelte@5.38.2) posthog-js: - specifier: ^1.252.0 - version: 1.252.0 + specifier: ^1.260.1 + version: 1.260.1 prettier: - specifier: ^3.5.3 - version: 3.5.3 + specifier: ^3.6.2 + version: 3.6.2 prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.4.0(prettier@3.5.3)(svelte@5.34.1) + version: 3.4.0(prettier@3.6.2)(svelte@5.38.2) rehype-slug: specifier: ^6.0.0 version: 6.0.0 @@ -235,23 +232,23 @@ importers: specifier: ^0.3.0 version: 0.3.0 svelte: - specifier: 5.34.1 - version: 5.34.1 + specifier: ^5.38.2 + version: 5.38.2 svelte-check: - specifier: ^4.2.1 - version: 4.2.1(picomatch@4.0.2)(svelte@5.34.1)(typescript@5.8.3) + specifier: ^4.3.1 + version: 4.3.1(picomatch@4.0.3)(svelte@5.38.2)(typescript@5.9.2) svelte-json-tree: specifier: ^2.2.0 - version: 2.2.0(svelte@5.34.1) + version: 2.2.0(svelte@5.38.2) svelte-ux: specifier: 2.0.0-next.17 - version: 2.0.0-next.17(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1) + version: 2.0.0-next.17(postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6)(svelte@5.38.2) svelte2tsx: - specifier: ^0.7.39 - version: 0.7.39(svelte@5.34.1)(typescript@5.8.3) + specifier: ^0.7.42 + version: 0.7.42(svelte@5.38.2)(typescript@5.9.2) tailwindcss: - specifier: ^4.1.10 - version: 4.1.10 + specifier: ^4.1.12 + version: 4.1.12 topojson-client: specifier: ^3.1.0 version: 3.1.0 @@ -262,26 +259,26 @@ importers: specifier: ^2.8.1 version: 2.8.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.2 + version: 5.9.2 unist-util-visit: specifier: ^5.0.0 version: 5.0.0 unplugin-icons: - specifier: ^22.1.0 - version: 22.1.0(svelte@5.34.1) + specifier: ^22.2.0 + version: 22.2.0(svelte@5.38.2) us-atlas: specifier: ^3.0.1 version: 3.0.1 vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + specifier: ^7.1.2 + version: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) vite-plugin-devtools-json: - specifier: ^0.2.0 - version: 0.2.0(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + specifier: ^1.0.0 + version: 1.0.0(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) vitest: - specifier: ^3.2.3 - version: 3.2.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + specifier: ^3.2.4 + version: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) packages: @@ -295,21 +292,21 @@ packages: '@antfu/utils@8.1.1': resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} engines: {node: '>=6.9.0'} '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.8': - resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.4': - resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + '@changesets/cli@2.29.6': + resolution: {integrity: sha512-6qCcVsIG1KQLhpQ5zE8N0PckIx4+9QlHK3z6/lwKnw7Tir71Bjw8BeOZaxA/4Jt00pcgCnCSWZnyuZf5Il05QQ==} hasBin: true '@changesets/config@3.1.1': @@ -324,8 +321,8 @@ packages: '@changesets/get-github-info@0.6.0': resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - '@changesets/get-release-plan@4.0.12': - resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -361,61 +358,61 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.3.2': - resolution: {integrity: sha512-MtUgNl+QkQyhQvv5bbWP+BpBC1N0me4CHHuP2H4ktmOMKdB/6kkz/lo+zqiA4mEazb4y+1cwyNjVrQ2DWeE4mg==} + '@cloudflare/unenv-preset@2.6.1': + resolution: {integrity: sha512-48rC6jo9CkSRkImfu5KU4zKyoPJx7b9GTUpZn0Emr6J+jkmrLhwCY3BI10QS+fhOt1NkJNlxIcYrBgvWeCpKOw==} peerDependencies: - unenv: 2.0.0-rc.17 - workerd: ^1.20250508.0 + unenv: 2.0.0-rc.19 + workerd: ^1.20250802.0 peerDependenciesMeta: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20250604.0': - resolution: {integrity: sha512-PI6AWAzhHg75KVhYkSWFBf3HKCHstpaKg4nrx6LYZaEvz0TaTz+JQpYU2fNAgGFmVsK5xEzwFTGh3DAVAKONPw==} + '@cloudflare/workerd-darwin-64@1.20250813.0': + resolution: {integrity: sha512-Pka37/jqLy7ZaQlwpBy79A/BLH+qpRPSEX2h/zWND+qRfoCVCCaZQPdknHZO0pcvHPzK8E2Z4j5QI1IafPA5UA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250604.0': - resolution: {integrity: sha512-hOiZZSop7QRQgGERtTIy9eU5GvPpIsgE2/BDsUdHMl7OBZ7QLniqvgDzLNDzj0aTkCldm9Yl/Z+C7aUgRdOccw==} + '@cloudflare/workerd-darwin-arm64@1.20250813.0': + resolution: {integrity: sha512-QnaJbmhcA32+4uZ+or1hXZjdxGqrFUuh6Ye+skEGu3iB/xzq9CmyVyoKoshiUOcWGKndQb7KRo56dq0bVvVLFw==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250604.0': - resolution: {integrity: sha512-S0R9r7U4nv9qejYygQj01hArC4KUbQQ4u29rvegR0MGoXZY8AHIEuJxon0kE7r7aWFJxvl4W3tOH+5hwW51LYw==} + '@cloudflare/workerd-linux-64@1.20250813.0': + resolution: {integrity: sha512-6pokgBQmujJsAuqOme2wBX5ol/1YW3d7kV7wp0Y1/tFi46TnmWcEy08B4FD5t2AARQJ68a7XMxIJKWChcaJ9Cg==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250604.0': - resolution: {integrity: sha512-BTFU/rXpNy03wpeueI2P7q1vVjbg2V6mCyyFGqDqMn2gSVYXH1G0zFNolV13PQXa0HgaqM6oYnqtAxluqbA+kQ==} + '@cloudflare/workerd-linux-arm64@1.20250813.0': + resolution: {integrity: sha512-lFwqohi8fkR98OwjHT69sbThx4BJem7vu6N8kqrge7wuKJWrMDNbzOTdyBA8adV9DmE07ELuN2vcbbu8ZjaL2Q==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250604.0': - resolution: {integrity: sha512-tW/U9/qDmDZBeoEVcK5skb2uouVAMXMzt7o/uGvaIFLeZsQkOp4NBmvoQQd+nbOc7nVCJIwFoSMokd89AhzCkA==} + '@cloudflare/workerd-windows-64@1.20250813.0': + resolution: {integrity: sha512-Fs62NvUajtoXb+4W8jaRXzw64Nbmb8X+PbRLZbxUFv68sGhxKPw1nB1YEmNNZ215ma47hTlSdF3UQh4FOmz7NA==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20250613.0': - resolution: {integrity: sha512-upH6pxh43ph9293aXVgEp/0ODhyT3deRdlL0NEe4eJJdgoSAJxWj0c2ASZHs3awOaItRTxTxo7GZk1d6wolPKQ==} + '@cloudflare/workers-types@4.20250816.0': + resolution: {integrity: sha512-R9ADrrINo1CqTwCddH39Tjlsc3grim6KeO7l8yddNbldH3uTkaAXYCzO0WiyLG7irLzLDrZVc4tLhN6BO3tdFw==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dagrejs/dagre@1.1.4': - resolution: {integrity: sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg==} + '@dagrejs/dagre@1.1.5': + resolution: {integrity: sha512-Ghgrh08s12DCL5SeiR6AoyE80mQELTWhJBRmXfFoqDiFkR458vPEdgTbbjA0T+9ETNxUblnD0QW55tfdvi5pjQ==} '@dagrejs/graphlib@2.2.4': resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} engines: {node: '>17.0.0'} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} @@ -423,153 +420,305 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.4': resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.4': resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.4': resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.4': resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.4': resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.4': resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.4': resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.4': resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.4': resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.4': resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.4': resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.4': resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.4': resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.4': resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.4': resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.4': resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.4': resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.4': resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.4': resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.4': resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.4': resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.4': resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.4': resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] '@floating-ui/core@1.7.1': resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} @@ -589,8 +738,8 @@ packages: '@floating-ui/utils@0.2.9': resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@iconify-json/lucide@1.2.48': - resolution: {integrity: sha512-jDVqOHEF7XUwHJzx7fhwVXnx638lL89wOfmBob5UJofSGGIYV544zktmHr4CzKePslDBgl3MPKEpmFU/RfzppQ==} + '@iconify-json/lucide@1.2.62': + resolution: {integrity: sha512-K0KfhvP5YQZ2KraOgCm6jJbwwzQCVocvXcdMpDou5uLa48QnLBRW/dQ8VDGmxHTGpwF9EqLlvnUSinH2i6xs3Q==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -703,6 +852,15 @@ packages: cpu: [x64] os: [win32] + '@inquirer/external-editor@1.0.1': + resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -711,10 +869,16 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -726,8 +890,17 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -780,6 +953,15 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@poppinss/colors@4.1.5': + resolution: {integrity: sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==} + + '@poppinss/dumper@0.6.4': + resolution: {integrity: sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==} + + '@poppinss/exception@1.2.2': + resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@rollup/plugin-dsv@3.0.5': resolution: {integrity: sha512-q1U4vu7voJkgeltujKya7ByxuWaHg9lYqCFQfWkqcgvIeOlUh52VrQSlgEe1JhN4wIaw5FOflRX3Jv0nqrw9uQ==} peerDependencies: @@ -813,103 +995,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.2': - resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.2': - resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.2': - resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.2': - resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.2': - resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.2': - resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': - resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.2': - resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.2': - resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.2': - resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': - resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': - resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.2': - resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.2': - resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.2': - resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.2': - resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.2': - resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.2': - resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.2': - resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.2': - resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} cpu: [x64] os: [win32] @@ -934,111 +1116,125 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + engines: {node: '>=18'} + + '@speed-highlight/core@1.2.7': + resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@sveltejs/acorn-typescript@1.0.5': resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} peerDependencies: acorn: ^8.9.0 - '@sveltejs/adapter-cloudflare@7.0.4': - resolution: {integrity: sha512-pYJDICmhatM9lofkjLR+nhAJ4prEPjmwmx+J7hBuMSfrrNEVk+THfAahuWNizcxae4mO1MQKjIRMLpVnKyNE5g==} + '@sveltejs/adapter-cloudflare@7.2.1': + resolution: {integrity: sha512-LV7ZzzhLnEHqQopgcZXOSG//ZGV1rcwRxBup6NxpwRvmke8GVj7+eoWp3fipYyM7VuE9bI/B6Y8NFAve4PHOlQ==} peerDependencies: '@sveltejs/kit': ^2.0.0 wrangler: ^4.0.0 - '@sveltejs/kit@2.21.5': - resolution: {integrity: sha512-P5m7yZtvD1Kx/Z6JcjgJtdMqef/tCGMDrd9B9S2q8j+FMnkeKTMxW1nidnjVzk4HEDRGf4IlBI94/niy6t3hLA==} + '@sveltejs/kit@2.31.1': + resolution: {integrity: sha512-Iv98PKh81amOjIWZ6Flqr6E7xYcrrYZ4mY9XwYUvaCDiQ4hYt5+jXR9CivcgLOTK+RcJ3K4guEYF4lFYQfTxaA==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 || ^6.0.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true - '@sveltejs/package@2.3.11': - resolution: {integrity: sha512-DSMt2U0XNAdoQBYksrmgQi5dKy7jUTVDJLiagS/iXF7AShjAmTbGJQKruBuT/FfYAWvNxfQTSjkXU8eAIjVeNg==} + '@sveltejs/package@2.4.1': + resolution: {integrity: sha512-dFj78EMy8Vgqsj5Tv2rPuPmtpyqYiJDL1QGhWjK4xW3g77ffF26ovoNBHNg/NZG9ZdTUUDb4rov6We3gW1pamg==} engines: {node: ^16.14 || >=18} hasBin: true peerDependencies: svelte: ^3.44.0 || ^4.0.0 || ^5.0.0-next.1 - '@sveltejs/vite-plugin-svelte-inspector@4.0.1': - resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22} + '@sveltejs/vite-plugin-svelte-inspector@5.0.0': + resolution: {integrity: sha512-iwQ8Z4ET6ZFSt/gC+tVfcsSBHwsqc6RumSaiLUkAurW3BCpJam65cmHw0oOlDMTO0u+PZi9hilBRYN+LZNHTUQ==} + engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 svelte: ^5.0.0 - vite: ^6.0.0 + vite: ^6.3.0 || ^7.0.0 - '@sveltejs/vite-plugin-svelte@5.1.0': - resolution: {integrity: sha512-wojIS/7GYnJDYIg1higWj2ROA6sSRWvcR1PO/bqEyFr/5UZah26c8Cz4u0NaqjPeVltzsVpt2Tm8d2io0V+4Tw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22} + '@sveltejs/vite-plugin-svelte@6.1.2': + resolution: {integrity: sha512-7v+7OkUYelC2dhhYDAgX1qO2LcGscZ18Hi5kKzJQq7tQeXpH215dd0+J/HnX2zM5B3QKcIrTVqCGkZXAy5awYw==} + engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: svelte: ^5.0.0 - vite: ^6.0.0 + vite: ^6.3.0 || ^7.0.0 '@svitejs/changesets-changelog-github-compact@1.2.0': resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} - '@tailwindcss/node@4.1.10': - resolution: {integrity: sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==} + '@tailwindcss/node@4.1.12': + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} - '@tailwindcss/oxide-android-arm64@4.1.10': - resolution: {integrity: sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==} + '@tailwindcss/oxide-android-arm64@4.1.12': + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.10': - resolution: {integrity: sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==} + '@tailwindcss/oxide-darwin-arm64@4.1.12': + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.10': - resolution: {integrity: sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==} + '@tailwindcss/oxide-darwin-x64@4.1.12': + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.10': - resolution: {integrity: sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==} + '@tailwindcss/oxide-freebsd-x64@4.1.12': + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10': - resolution: {integrity: sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.10': - resolution: {integrity: sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.10': - resolution: {integrity: sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.10': - resolution: {integrity: sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.10': - resolution: {integrity: sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==} + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.10': - resolution: {integrity: sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==} + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1049,20 +1245,20 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.10': - resolution: {integrity: sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.10': - resolution: {integrity: sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.10': - resolution: {integrity: sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==} + '@tailwindcss/oxide@4.1.12': + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} engines: {node: '>= 10'} '@tailwindcss/typography@0.5.16': @@ -1070,10 +1266,10 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tailwindcss/vite@4.1.10': - resolution: {integrity: sha512-QWnD5HDY2IADv+vYR82lOhqOlS1jSCUUAmfem52cXAhRTKxpDh3ARX8TTXJTCCO7Rv7cD2Nlekabv02bwP3a2A==} + '@tailwindcss/vite@4.1.12': + resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} peerDependencies: - vite: ^5.2.0 || ^6 + vite: ^5.2.0 || ^6 || ^7 '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -1192,9 +1388,6 @@ packages: '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1219,6 +1412,9 @@ packages: '@types/node@24.0.1': resolution: {integrity: sha512-MX4Zioh39chHlDJbKmEgydJDS3tspMP/lnQC67G3SWsTnb9NeYVWOjkxpOSy4oMfPs4StcWHwBrvUb4ybfnuaw==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -1243,11 +1439,11 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.2.3': - resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.2.3': - resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 @@ -1257,20 +1453,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.2.3': - resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.2.3': - resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.2.3': - resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.2.3': - resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@3.2.3': - resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} @@ -1320,9 +1516,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - as-table@1.0.55: - resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1359,9 +1552,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1369,8 +1562,8 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} @@ -1437,12 +1630,12 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} + engines: {node: '>=18'} - core-js@3.43.0: - resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} + core-js@3.45.0: + resolution: {integrity: sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -1564,9 +1757,6 @@ packages: resolution: {integrity: sha512-HIRxHzHagPtUPNabjOlfcyismJYIsc+Xlq4mlsts4e8eAcwyq9Tgk/sYdyhlBpQ0MHwVquc/8j+e29YjXnmxeA==} engines: {node: '>=12'} - data-uri-to-buffer@2.0.2: - resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} - dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -1635,14 +1825,17 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + error-stack-parser-es@1.0.5: + resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -1651,6 +1844,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1663,8 +1861,8 @@ packages: engines: {node: '>=4'} hasBin: true - esrap@1.4.9: - resolution: {integrity: sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g==} + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} @@ -1679,26 +1877,22 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} - exsolve@1.0.5: - resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fdir@6.4.6: resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} @@ -1746,9 +1940,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-source@2.0.12: - resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1877,8 +2068,8 @@ packages: resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} engines: {node: 20 || >=22} - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true js-tokens@9.0.1: @@ -1992,8 +2183,8 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -2005,11 +2196,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} - engines: {node: '>= 18'} - hasBin: true - mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} @@ -2057,8 +2243,8 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - miniflare@4.20250604.1: - resolution: {integrity: sha512-HJQ9YhH0F0fI73Vsdy3PNVau+PfHZYK7trI5WJEcbfl5HzqhMU0DRNtA/G5EXQgiumkjrmbW4Zh1DVTtsqICPg==} + miniflare@4.20250813.1: + resolution: {integrity: sha512-6PyXwR4pZmH9ukO0jR5LmhlFVMktsVVGVcUjD9Lpev5QwnqjTRPEv73cnXCe0+oTbIm5TYnvXsAklaWxQuxstA==} engines: {node: '>=18.0.0'} hasBin: true @@ -2093,10 +2279,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2127,10 +2309,6 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -2194,8 +2372,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} periscopic@3.1.0: @@ -2212,6 +2390,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -2219,8 +2401,8 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.1.0: - resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + pkg-types@2.2.0: + resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==} postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} @@ -2244,12 +2426,12 @@ packages: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} - postcss@8.5.5: - resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.252.0: - resolution: {integrity: sha512-Mm72gKYYYaQGilxLPPH+KXF8TcveloOvsMemEz0jna0tV0O++n9SJ/dko+U2ePb+FajZ4vqVvfmkHSIILXdgKg==} + posthog-js@1.260.1: + resolution: {integrity: sha512-DD8ZSRpdScacMqtqUIvMFme8lmOWkOvExG8VvjONE7Cm3xpRH5xXpfrwMJE4bayTGWKMx4ij6SfphK6dm/o2ug==} peerDependencies: '@rrweb/types': 2.0.0-alpha.17 rrweb-snapshot: 2.0.0-alpha.17 @@ -2259,8 +2441,8 @@ packages: rrweb-snapshot: optional: true - preact@10.26.9: - resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} + preact@10.27.0: + resolution: {integrity: sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==} prettier-plugin-svelte@3.4.0: resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} @@ -2273,14 +2455,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - printable-characters@1.0.42: - resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - prism-svelte@0.4.7: resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} @@ -2300,6 +2479,9 @@ packages: quansync@0.2.10: resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2344,8 +2526,8 @@ packages: engines: {node: '>= 0.4'} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@6.0.1: @@ -2381,16 +2563,16 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - rollup@4.40.2: - resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - runed@0.28.0: - resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==} + runed@0.31.1: + resolution: {integrity: sha512-v3czcTnO+EJjiPvD4dwIqfTdHLZ8oH0zJheKqAHh9QMViY7Qb29UlAMRpX7ZtHh7AFqV60KmfxaJ9QMy+L1igQ==} peerDependencies: svelte: ^5.7.0 @@ -2459,10 +2641,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} @@ -2479,9 +2657,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - stacktracey@2.1.8: - resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -2522,6 +2697,10 @@ packages: strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + supports-color@10.2.0: + resolution: {integrity: sha512-5eG9FQjEjDbAlI5+kdpdyPIBMRH4GfTVDGREVupaZHmVoppknhM29b/S9BkQz7cathp85BVgRi/As3Siln7e0Q==} + engines: {node: '>=18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2530,8 +2709,8 @@ packages: resolution: {integrity: sha512-81zODtru1jsOujk+RUgj4RT3fXaG2nFZIWkeVkm0ZyqsrHxTNUfGJEQgkj6jcvwiEEVbYLUHvehnkfCbKDnarQ==} hasBin: true - svelte-check@4.2.1: - resolution: {integrity: sha512-e49SU1RStvQhoipkQ/aonDhHnG3qxHSBtNfBRb9pxVXoa+N7qybAo32KgA9wEb2PCYFNaDg7bZCdhLD1vHpdYA==} + svelte-check@4.3.1: + resolution: {integrity: sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -2585,8 +2764,8 @@ packages: peerDependencies: svelte: ^3.56.0 || ^4.0.0 || ^5.0.0 - svelte2tsx@0.7.39: - resolution: {integrity: sha512-NX8a7eSqF1hr6WKArvXr7TV7DeE+y0kDFD7L5JP7TWqlwFidzGKaG415p992MHREiiEWOv2xIWXJ+mlONofs0A==} + svelte2tsx@0.7.42: + resolution: {integrity: sha512-PSNrKS16aVdAajoFjpF5M0t6TA7ha7GcKbBajD9RG3M+vooAuvLnWAGUSC6eJL4zEOVbOWKtcS2BuY4rxPljoA==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 @@ -2595,15 +2774,15 @@ packages: resolution: {integrity: sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==} engines: {node: '>=16'} - svelte@5.34.1: - resolution: {integrity: sha512-jWNnN2hZFNtnzKPptCcJHBWrD9CtbHPDwIRIODufOYaWkR0kLmAIlM384lMt4ucwuIRX4hCJwD2D8ZtEcGJQ0Q==} + svelte@5.38.2: + resolution: {integrity: sha512-iAcp/oFAWauVSGILdD67n7DiwgLHXZzWZIdzl7araRxu72jUr7PFAo2Iie7gXt0IbnlYvhxCb9GT3ZJUquO3PA==} engines: {node: '>=18'} tailwind-merge@3.3.0: resolution: {integrity: sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==} - tailwindcss@4.1.10: - resolution: {integrity: sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==} + tailwindcss@4.1.12: + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} tapable@2.2.2: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} @@ -2634,8 +2813,8 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.0: - resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: @@ -2646,10 +2825,6 @@ packages: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2679,23 +2854,26 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} + undici@7.14.0: + resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.17: - resolution: {integrity: sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==} + unenv@2.0.0-rc.19: + resolution: {integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -2719,8 +2897,8 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - unplugin-icons@22.1.0: - resolution: {integrity: sha512-ect2ZNtk1Zgwb0NVHd0C1IDW/MV+Jk/xaq4t8o6rYdVS3+L660ZdD5kTSQZvsgdwCvquRw+/wYn75hsweRjoIA==} + unplugin-icons@22.2.0: + resolution: {integrity: sha512-OdrXCiXexC1rFd0QpliAgcd4cMEEEQtoCf2WIrRIGu4iW6auBPpQKMCBeWxoe55phYdRyZLUWNOtzyTX+HOFSA==} peerDependencies: '@svgr/core': '>=7.0.0' '@svgx/core': ^1.0.1 @@ -2742,8 +2920,8 @@ packages: vue-template-es2015-compiler: optional: true - unplugin@2.3.4: - resolution: {integrity: sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg==} + unplugin@2.3.5: + resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} engines: {node: '>=18.12.0'} us-atlas@3.0.1: @@ -2765,29 +2943,29 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.2.3: - resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite-plugin-devtools-json@0.2.0: - resolution: {integrity: sha512-K7PoaWOEJECZ1n3VbhJXsUAX2PsO0xY7KFMM/Leh7tUev0M5zi+lz+vnVVdCK17IOK9Jp9rdzHXc08cnQirGbg==} + vite-plugin-devtools-json@1.0.0: + resolution: {integrity: sha512-MobvwqX76Vqt/O4AbnNMNWoXWGrKUqZbphCUle/J2KXH82yKQiunOeKnz/nqEPosPsoWWPP9FtNuPBSYpiiwkw==} peerDependencies: - vite: ^2.7.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.1.2: + resolution: {integrity: sha512-J0SQBPlQiEXAF7tajiH+rUooJPo0l8KQgyg4/aMunNtrOa7bwuZJsJbDWzeljqQpgftxuq5yNJxQ91O9ts29UQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -2815,24 +2993,24 @@ packages: yaml: optional: true - vitefu@1.0.6: - resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: vite: optional: true - vitest@3.2.3: - resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.3 - '@vitest/ui': 3.2.3 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2873,8 +3051,8 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20250604.0: - resolution: {integrity: sha512-sHz9R1sxPpnyq3ptrI/5I96sYTMA2+Ljm75oJDbmEcZQwNyezpu9Emerzt3kzzjCJQqtdscGOidWv4RKGZXzAA==} + workerd@1.20250813.0: + resolution: {integrity: sha512-bDlPGSnb/KESpGFE57cDjgP8mEKDM4WBTd/uGJBsQYCB6Aokk1eK3ivtHoxFx3MfJNo3v6/hJy6KK1b6rw1gvg==} engines: {node: '>=16'} hasBin: true @@ -2882,12 +3060,12 @@ packages: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} - wrangler@4.20.0: - resolution: {integrity: sha512-gxMLaSnYp3VLdGPZu4fc/9UlB7PnSVwni25v32NM9szG2yTt+gx5RunWzmoLplplIfEMkBuV3wA47vccNu7zcA==} + wrangler@4.30.0: + resolution: {integrity: sha512-NXJUObuXxgG8/ChQ4yXkWLmDQ5ZcO98gyq1yFKYVntJ884C0IpDQrVnAv2RA0ZEz5eB8zal+4OKnr26P3N7ItA==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250604.0 + '@cloudflare/workers-types': ^4.20250813.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -2920,8 +3098,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -2933,8 +3111,11 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - youch@3.3.4: - resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} + youch-core@0.3.3: + resolution: {integrity: sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==} + + youch@4.1.0-beta.10: + resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} @@ -2953,7 +3134,7 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 '@antfu/install-pkg@1.1.0': dependencies: @@ -2962,7 +3143,7 @@ snapshots: '@antfu/utils@8.1.1': {} - '@babel/runtime@7.27.1': {} + '@babel/runtime@7.28.3': {} '@changesets/apply-release-plan@7.0.12': dependencies: @@ -2980,7 +3161,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.2 - '@changesets/assemble-release-plan@6.0.8': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -2993,15 +3174,15 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.4': + '@changesets/cli@2.29.6(@types/node@24.3.0)': dependencies: '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.12 + '@changesets/get-release-plan': 4.0.13 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 @@ -3009,11 +3190,11 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.1(@types/node@24.3.0) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 @@ -3023,6 +3204,8 @@ snapshots: semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' '@changesets/config@3.1.1': dependencies: @@ -3052,9 +3235,9 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.12': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/config': 3.1.1 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.5 @@ -3117,40 +3300,40 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.3.2(unenv@2.0.0-rc.17)(workerd@1.20250604.0)': + '@cloudflare/unenv-preset@2.6.1(unenv@2.0.0-rc.19)(workerd@1.20250813.0)': dependencies: - unenv: 2.0.0-rc.17 + unenv: 2.0.0-rc.19 optionalDependencies: - workerd: 1.20250604.0 + workerd: 1.20250813.0 - '@cloudflare/workerd-darwin-64@1.20250604.0': + '@cloudflare/workerd-darwin-64@1.20250813.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250604.0': + '@cloudflare/workerd-darwin-arm64@1.20250813.0': optional: true - '@cloudflare/workerd-linux-64@1.20250604.0': + '@cloudflare/workerd-linux-64@1.20250813.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250604.0': + '@cloudflare/workerd-linux-arm64@1.20250813.0': optional: true - '@cloudflare/workerd-windows-64@1.20250604.0': + '@cloudflare/workerd-windows-64@1.20250813.0': optional: true - '@cloudflare/workers-types@4.20250613.0': {} + '@cloudflare/workers-types@4.20250816.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dagrejs/dagre@1.1.4': + '@dagrejs/dagre@1.1.5': dependencies: '@dagrejs/graphlib': 2.2.4 '@dagrejs/graphlib@2.2.4': {} - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true @@ -3158,79 +3341,155 @@ snapshots: '@esbuild/aix-ppc64@0.25.4': optional: true + '@esbuild/aix-ppc64@0.25.8': + optional: true + '@esbuild/android-arm64@0.25.4': optional: true + '@esbuild/android-arm64@0.25.8': + optional: true + '@esbuild/android-arm@0.25.4': optional: true + '@esbuild/android-arm@0.25.8': + optional: true + '@esbuild/android-x64@0.25.4': optional: true + '@esbuild/android-x64@0.25.8': + optional: true + '@esbuild/darwin-arm64@0.25.4': optional: true + '@esbuild/darwin-arm64@0.25.8': + optional: true + '@esbuild/darwin-x64@0.25.4': optional: true + '@esbuild/darwin-x64@0.25.8': + optional: true + '@esbuild/freebsd-arm64@0.25.4': optional: true + '@esbuild/freebsd-arm64@0.25.8': + optional: true + '@esbuild/freebsd-x64@0.25.4': optional: true + '@esbuild/freebsd-x64@0.25.8': + optional: true + '@esbuild/linux-arm64@0.25.4': optional: true + '@esbuild/linux-arm64@0.25.8': + optional: true + '@esbuild/linux-arm@0.25.4': optional: true + '@esbuild/linux-arm@0.25.8': + optional: true + '@esbuild/linux-ia32@0.25.4': optional: true + '@esbuild/linux-ia32@0.25.8': + optional: true + '@esbuild/linux-loong64@0.25.4': optional: true + '@esbuild/linux-loong64@0.25.8': + optional: true + '@esbuild/linux-mips64el@0.25.4': optional: true + '@esbuild/linux-mips64el@0.25.8': + optional: true + '@esbuild/linux-ppc64@0.25.4': optional: true + '@esbuild/linux-ppc64@0.25.8': + optional: true + '@esbuild/linux-riscv64@0.25.4': optional: true + '@esbuild/linux-riscv64@0.25.8': + optional: true + '@esbuild/linux-s390x@0.25.4': optional: true + '@esbuild/linux-s390x@0.25.8': + optional: true + '@esbuild/linux-x64@0.25.4': optional: true + '@esbuild/linux-x64@0.25.8': + optional: true + '@esbuild/netbsd-arm64@0.25.4': optional: true + '@esbuild/netbsd-arm64@0.25.8': + optional: true + '@esbuild/netbsd-x64@0.25.4': optional: true + '@esbuild/netbsd-x64@0.25.8': + optional: true + '@esbuild/openbsd-arm64@0.25.4': optional: true + '@esbuild/openbsd-arm64@0.25.8': + optional: true + '@esbuild/openbsd-x64@0.25.4': optional: true + '@esbuild/openbsd-x64@0.25.8': + optional: true + + '@esbuild/openharmony-arm64@0.25.8': + optional: true + '@esbuild/sunos-x64@0.25.4': optional: true + '@esbuild/sunos-x64@0.25.8': + optional: true + '@esbuild/win32-arm64@0.25.4': optional: true + '@esbuild/win32-arm64@0.25.8': + optional: true + '@esbuild/win32-ia32@0.25.4': optional: true + '@esbuild/win32-ia32@0.25.8': + optional: true + '@esbuild/win32-x64@0.25.4': optional: true - '@fastify/busboy@2.1.1': {} + '@esbuild/win32-x64@0.25.8': + optional: true '@floating-ui/core@1.7.1': dependencies: @@ -3254,7 +3513,7 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@iconify-json/lucide@1.2.48': + '@iconify-json/lucide@1.2.62': dependencies: '@iconify/types': 2.0.0 @@ -3339,7 +3598,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.4.5 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -3348,6 +3607,13 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inquirer/external-editor@1.0.1(@types/node@24.3.0)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.6.3 + optionalDependencies: + '@types/node': 24.3.0 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3361,11 +3627,21 @@ snapshots: dependencies: minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 '@jridgewell/resolve-uri@3.1.2': {} @@ -3373,15 +3649,24 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@jridgewell/trace-mapping@0.3.30': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@layerstack/svelte-actions@1.0.1-next.14': dependencies: @@ -3422,20 +3707,20 @@ snapshots: d3-time-format: 4.1.0 lodash-es: 4.17.21 - '@lucide/svelte@0.534.0(svelte@5.34.1)': + '@lucide/svelte@0.534.0(svelte@5.38.2)': dependencies: - svelte: 5.34.1 + svelte: 5.38.2 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.3 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.3 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -3452,13 +3737,25 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@pkgjs/parseargs@0.11.0': optional: true '@polka/url@1.0.0-next.29': {} + '@poppinss/colors@4.1.5': + dependencies: + kleur: 4.1.5 + + '@poppinss/dumper@0.6.4': + dependencies: + '@poppinss/colors': 4.1.5 + '@sindresorhus/is': 7.0.2 + supports-color: 10.2.0 + + '@poppinss/exception@1.2.2': {} + '@rollup/plugin-dsv@3.0.5(rollup@2.79.2)': dependencies: '@rollup/pluginutils': 5.1.2(rollup@2.79.2) @@ -3499,64 +3796,64 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/rollup-android-arm-eabi@4.40.2': + '@rollup/rollup-android-arm-eabi@4.46.2': optional: true - '@rollup/rollup-android-arm64@4.40.2': + '@rollup/rollup-android-arm64@4.46.2': optional: true - '@rollup/rollup-darwin-arm64@4.40.2': + '@rollup/rollup-darwin-arm64@4.46.2': optional: true - '@rollup/rollup-darwin-x64@4.40.2': + '@rollup/rollup-darwin-x64@4.46.2': optional: true - '@rollup/rollup-freebsd-arm64@4.40.2': + '@rollup/rollup-freebsd-arm64@4.46.2': optional: true - '@rollup/rollup-freebsd-x64@4.40.2': + '@rollup/rollup-freebsd-x64@4.46.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.2': + '@rollup/rollup-linux-arm-musleabihf@4.46.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.2': + '@rollup/rollup-linux-arm64-gnu@4.46.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.2': + '@rollup/rollup-linux-arm64-musl@4.46.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + '@rollup/rollup-linux-ppc64-gnu@4.46.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.2': + '@rollup/rollup-linux-riscv64-gnu@4.46.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.2': + '@rollup/rollup-linux-riscv64-musl@4.46.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.2': + '@rollup/rollup-linux-s390x-gnu@4.46.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.2': + '@rollup/rollup-linux-x64-gnu@4.46.2': optional: true - '@rollup/rollup-linux-x64-musl@4.40.2': + '@rollup/rollup-linux-x64-musl@4.46.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.2': + '@rollup/rollup-win32-arm64-msvc@4.46.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.2': + '@rollup/rollup-win32-ia32-msvc@4.46.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.2': + '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true '@shikijs/core@3.9.2': @@ -3592,21 +3889,28 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/is@7.0.2': {} + + '@speed-highlight/core@1.2.7': {} + + '@standard-schema/spec@1.0.0': {} + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: acorn: 8.15.0 - '@sveltejs/adapter-cloudflare@7.0.4(@sveltejs/kit@2.21.5(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(wrangler@4.20.0(@cloudflare/workers-types@4.20250613.0))': + '@sveltejs/adapter-cloudflare@7.2.1(@sveltejs/kit@2.31.1(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(wrangler@4.30.0(@cloudflare/workers-types@4.20250816.0))': dependencies: - '@cloudflare/workers-types': 4.20250613.0 - '@sveltejs/kit': 2.21.5(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@cloudflare/workers-types': 4.20250816.0 + '@sveltejs/kit': 2.31.1(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) worktop: 0.8.0-next.18 - wrangler: 4.20.0(@cloudflare/workers-types@4.20250613.0) + wrangler: 4.30.0(@cloudflare/workers-types@4.20250816.0) - '@sveltejs/kit@2.21.5(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@sveltejs/kit@2.31.1(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: + '@standard-schema/spec': 1.0.0 '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': 6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 @@ -3618,40 +3922,39 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.1 - svelte: 5.34.1 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) - vitefu: 1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + svelte: 5.38.2 + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) - '@sveltejs/package@2.3.11(svelte@5.34.1)(typescript@5.8.3)': + '@sveltejs/package@2.4.1(svelte@5.38.2)(typescript@5.9.2)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 semver: 7.7.2 - svelte: 5.34.1 - svelte2tsx: 0.7.39(svelte@5.34.1)(typescript@5.8.3) + svelte: 5.38.2 + svelte2tsx: 0.7.42(svelte@5.38.2)(typescript@5.9.2) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.0(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte': 6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) debug: 4.4.1 - svelte: 5.34.1 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + svelte: 5.38.2 + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)))(svelte@5.34.1)(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.0(@sveltejs/vite-plugin-svelte@6.1.2(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.34.1 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) - vitefu: 1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + svelte: 5.38.2 + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) transitivePeerDependencies: - supports-color @@ -3662,84 +3965,84 @@ snapshots: transitivePeerDependencies: - encoding - '@tailwindcss/node@4.1.10': + '@tailwindcss/node@4.1.12': dependencies: - '@ampproject/remapping': 2.3.0 - enhanced-resolve: 5.18.1 - jiti: 2.4.2 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 lightningcss: 1.30.1 magic-string: 0.30.17 source-map-js: 1.2.1 - tailwindcss: 4.1.10 + tailwindcss: 4.1.12 - '@tailwindcss/oxide-android-arm64@4.1.10': + '@tailwindcss/oxide-android-arm64@4.1.12': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.10': + '@tailwindcss/oxide-darwin-arm64@4.1.12': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.10': + '@tailwindcss/oxide-darwin-x64@4.1.12': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.10': + '@tailwindcss/oxide-freebsd-x64@4.1.12': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.10': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.10': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.10': + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.10': + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.10': + '@tailwindcss/oxide-linux-x64-musl@4.1.12': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.10': + '@tailwindcss/oxide-wasm32-wasi@4.1.12': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.10': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.10': + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': optional: true - '@tailwindcss/oxide@4.1.10': + '@tailwindcss/oxide@4.1.12': dependencies: detect-libc: 2.0.4 tar: 7.4.3 optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.10 - '@tailwindcss/oxide-darwin-arm64': 4.1.10 - '@tailwindcss/oxide-darwin-x64': 4.1.10 - '@tailwindcss/oxide-freebsd-x64': 4.1.10 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.10 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.10 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.10 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.10 - '@tailwindcss/oxide-linux-x64-musl': 4.1.10 - '@tailwindcss/oxide-wasm32-wasi': 4.1.10 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.10 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.10 - - '@tailwindcss/typography@0.5.16(tailwindcss@4.1.10)': + '@tailwindcss/oxide-android-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-x64': 4.1.12 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 + + '@tailwindcss/typography@0.5.16(tailwindcss@4.1.12)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.10 + tailwindcss: 4.1.12 - '@tailwindcss/vite@4.1.10(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@tailwindcss/vite@4.1.12(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: - '@tailwindcss/node': 4.1.10 - '@tailwindcss/oxide': 4.1.10 - tailwindcss: 4.1.10 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + tailwindcss: 4.1.12 + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) '@types/chai@5.2.2': dependencies: @@ -3880,8 +4183,6 @@ snapshots: '@types/estree@0.0.39': {} - '@types/estree@1.0.7': {} - '@types/estree@1.0.8': {} '@types/geojson@7946.0.14': {} @@ -3906,6 +4207,11 @@ snapshots: dependencies: undici-types: 7.8.0 + '@types/node@24.3.0': + dependencies: + undici-types: 7.10.0 + optional: true + '@types/resolve@1.17.1': dependencies: '@types/node': 24.0.1 @@ -3935,46 +4241,46 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.2.3': + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.2 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 - chai: 5.2.0 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1))': dependencies: - '@vitest/spy': 3.2.3 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) - '@vitest/pretty-format@3.2.3': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.3': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.2.3 + '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/snapshot@3.2.3': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.2.3 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.2.3': + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 - '@vitest/utils@3.2.3': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.2.3 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.0 tinyrainbow: 2.0.0 acorn-walk@8.3.2: {} @@ -4005,10 +4311,6 @@ snapshots: array-union@2.1.0: {} - as-table@1.0.55: - dependencies: - printable-characters: 1.0.42 - assertion-error@2.0.1: {} axobject-query@4.1.0: {} @@ -4035,19 +4337,19 @@ snapshots: ccount@2.0.1: {} - chai@5.2.0: + chai@5.2.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + loupe: 3.2.0 + pathval: 2.0.1 character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} - chardet@0.7.0: {} + chardet@2.1.0: {} check-error@2.1.1: {} @@ -4069,7 +4371,7 @@ snapshots: code-red@1.0.4: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@types/estree': 1.0.8 acorn: 8.15.0 estree-walker: 3.0.3 @@ -4105,9 +4407,9 @@ snapshots: cookie@0.6.0: {} - cookie@0.7.2: {} + cookie@1.0.2: {} - core-js@3.43.0: {} + core-js@3.45.0: {} cross-spawn@7.0.6: dependencies: @@ -4228,8 +4530,6 @@ snapshots: d3-delaunay: 6.0.4 d3-scale: 4.0.2 - data-uri-to-buffer@2.0.2: {} - dataloader@1.4.0: {} debug@4.4.1: @@ -4274,7 +4574,7 @@ snapshots: emoji-regex@9.2.2: {} - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.2.2 @@ -4284,6 +4584,8 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + error-stack-parser-es@1.0.5: {} + es-module-lexer@1.7.0: {} esbuild@0.25.4: @@ -4314,15 +4616,44 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 + esbuild@0.25.8: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 + escalade@3.2.0: {} esm-env@1.2.2: {} esprima@4.0.1: {} - esrap@1.4.9: + esrap@2.1.0: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 estree-walker@1.0.1: {} @@ -4334,18 +4665,12 @@ snapshots: exit-hook@2.2.1: {} - expect-type@1.2.1: {} + expect-type@1.2.2: {} - exsolve@1.0.5: {} + exsolve@1.0.7: {} extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4354,14 +4679,18 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 + fdir@6.4.6(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fflate@0.4.8: {} file-source@0.6.1: @@ -4401,11 +4730,6 @@ snapshots: get-caller-file@2.0.5: {} - get-source@2.0.12: - dependencies: - data-uri-to-buffer: 2.0.2 - source-map: 0.6.1 - github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -4532,7 +4856,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@2.4.2: {} + jiti@2.5.1: {} js-tokens@9.0.1: {} @@ -4600,7 +4924,7 @@ snapshots: local-pkg@1.1.1: dependencies: mlly: 1.7.4 - pkg-types: 2.1.0 + pkg-types: 2.2.0 quansync: 0.2.10 locate-character@3.0.0: {} @@ -4619,7 +4943,7 @@ snapshots: lodash.startcase@4.4.0: {} - loupe@3.1.3: {} + loupe@3.2.0: {} lower-case@2.0.2: dependencies: @@ -4631,8 +4955,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - marked@15.0.12: {} - mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -4647,12 +4969,12 @@ snapshots: mdn-data@2.0.30: {} - mdsvex@0.12.3(svelte@5.34.1): + mdsvex@0.12.3(svelte@5.38.2): dependencies: '@types/unist': 2.0.11 prism-svelte: 0.4.7 prismjs: 1.30.0 - svelte: 5.34.1 + svelte: 5.38.2 vfile-message: 2.0.4 memoize@10.1.0: @@ -4687,7 +5009,7 @@ snapshots: mimic-function@5.0.1: {} - miniflare@4.20250604.1: + miniflare@4.20250813.1: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -4696,10 +5018,10 @@ snapshots: glob-to-regexp: 0.4.1 sharp: 0.33.5 stoppable: 1.1.0 - undici: 5.29.0 - workerd: 1.20250604.0 + undici: 7.14.0 + workerd: 1.20250813.0 ws: 8.18.0 - youch: 3.3.4 + youch: 4.1.0-beta.10 zod: 3.22.3 transitivePeerDependencies: - bufferutil @@ -4730,8 +5052,6 @@ snapshots: ms@2.1.3: {} - mustache@4.2.0: {} - nanoid@3.3.11: {} no-case@3.0.4: @@ -4759,8 +5079,6 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - os-tmpdir@1.0.2: {} - outdent@0.5.0: {} p-filter@2.1.0: @@ -4783,7 +5101,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.10 + quansync: 0.2.11 package-manager-detector@1.3.0: {} @@ -4814,7 +5132,7 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} periscopic@3.1.0: dependencies: @@ -4828,6 +5146,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@4.0.1: {} pkg-types@1.3.1: @@ -4836,19 +5156,19 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - pkg-types@2.1.0: + pkg-types@2.2.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.5 + exsolve: 1.0.7 pathe: 2.0.3 - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0): + postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 optionalDependencies: - jiti: 2.4.2 - postcss: 8.5.5 - yaml: 2.8.0 + jiti: 2.5.1 + postcss: 8.5.6 + yaml: 2.8.1 optional: true postcss-selector-parser@6.0.10: @@ -4856,31 +5176,29 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.5.5: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.252.0: + posthog-js@1.260.1: dependencies: - core-js: 3.43.0 + core-js: 3.45.0 fflate: 0.4.8 - preact: 10.26.9 + preact: 10.27.0 web-vitals: 4.2.4 - preact@10.26.9: {} + preact@10.27.0: {} - prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.34.1): + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.2): dependencies: - prettier: 3.5.3 - svelte: 5.34.1 + prettier: 3.6.2 + svelte: 5.38.2 prettier@2.8.8: {} - prettier@3.5.3: {} - - printable-characters@1.0.42: {} + prettier@3.6.2: {} prism-svelte@0.4.7: {} @@ -4894,6 +5212,8 @@ snapshots: quansync@0.2.10: {} + quansync@0.2.11: {} + queue-microtask@1.2.3: {} read-yaml-file@1.1.0: @@ -4937,7 +5257,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rimraf@6.0.1: dependencies: @@ -4966,40 +5286,40 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.40.2: + rollup@4.46.2: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.2 - '@rollup/rollup-android-arm64': 4.40.2 - '@rollup/rollup-darwin-arm64': 4.40.2 - '@rollup/rollup-darwin-x64': 4.40.2 - '@rollup/rollup-freebsd-arm64': 4.40.2 - '@rollup/rollup-freebsd-x64': 4.40.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 - '@rollup/rollup-linux-arm-musleabihf': 4.40.2 - '@rollup/rollup-linux-arm64-gnu': 4.40.2 - '@rollup/rollup-linux-arm64-musl': 4.40.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-musl': 4.40.2 - '@rollup/rollup-linux-s390x-gnu': 4.40.2 - '@rollup/rollup-linux-x64-gnu': 4.40.2 - '@rollup/rollup-linux-x64-musl': 4.40.2 - '@rollup/rollup-win32-arm64-msvc': 4.40.2 - '@rollup/rollup-win32-ia32-msvc': 4.40.2 - '@rollup/rollup-win32-x64-msvc': 4.40.2 + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - runed@0.28.0(svelte@5.34.1): + runed@0.31.1(svelte@5.38.2): dependencies: esm-env: 1.2.2 - svelte: 5.34.1 + svelte: 5.38.2 rw@1.3.3: {} @@ -5087,8 +5407,6 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.6.1: {} - source-map@0.7.4: {} space-separated-tokens@2.0.2: {} @@ -5102,11 +5420,6 @@ snapshots: stackback@0.0.2: {} - stacktracey@2.1.8: - dependencies: - as-table: 1.0.55 - get-source: 2.0.12 - std-env@3.9.0: {} stoppable@1.1.0: {} @@ -5146,20 +5459,22 @@ snapshots: dependencies: js-tokens: 9.0.1 + supports-color@10.2.0: {} + supports-preserve-symlinks-flag@1.0.0: {} - sveld@0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5): + sveld@0.22.1(postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6): dependencies: '@rollup/plugin-node-resolve': 13.3.0(rollup@2.79.2) acorn: 8.15.0 comment-parser: 1.4.1 - prettier: 3.5.3 + prettier: 3.6.2 rollup: 2.79.2 rollup-plugin-svelte: 7.2.2(rollup@2.79.2)(svelte@4.2.20) svelte: 4.2.20 - svelte-preprocess: 6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@4.2.20)(typescript@5.8.3) + svelte-preprocess: 6.0.3(postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6)(svelte@4.2.20)(typescript@5.9.2) tinyglobby: 0.2.14 - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -5171,31 +5486,31 @@ snapshots: - stylus - sugarss - svelte-check@4.2.1(picomatch@4.0.2)(svelte@5.34.1)(typescript@5.8.3): + svelte-check@4.3.1(picomatch@4.0.3)(svelte@5.38.2)(typescript@5.9.2): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 chokidar: 4.0.3 - fdir: 6.4.6(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.34.1 - typescript: 5.8.3 + svelte: 5.38.2 + typescript: 5.9.2 transitivePeerDependencies: - picomatch - svelte-json-tree@2.2.0(svelte@5.34.1): + svelte-json-tree@2.2.0(svelte@5.38.2): dependencies: - svelte: 5.34.1 + svelte: 5.38.2 - svelte-preprocess@6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@4.2.20)(typescript@5.8.3): + svelte-preprocess@6.0.3(postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6)(svelte@4.2.20)(typescript@5.9.2): dependencies: svelte: 4.2.20 optionalDependencies: - postcss: 8.5.5 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0) - typescript: 5.8.3 + postcss: 8.5.6 + postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1) + typescript: 5.9.2 - svelte-ux@2.0.0-next.17(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5)(svelte@5.34.1): + svelte-ux@2.0.0-next.17(postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6)(svelte@5.38.2): dependencies: '@floating-ui/dom': 1.7.3 '@layerstack/svelte-actions': 1.0.1-next.14 @@ -5203,7 +5518,7 @@ snapshots: '@layerstack/svelte-table': 1.0.1-next.14 '@layerstack/tailwind': 2.0.0-next.17 '@layerstack/utils': 2.0.0-next.14 - '@lucide/svelte': 0.534.0(svelte@5.34.1) + '@lucide/svelte': 0.534.0(svelte@5.38.2) d3-array: 3.2.4 d3-scale: 4.0.2 esm-env: 1.2.2 @@ -5212,8 +5527,8 @@ snapshots: prism-svelte: 0.5.0 prism-themes: 1.9.0 prismjs: 1.30.0 - sveld: 0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.5)(yaml@2.8.0))(postcss@8.5.5) - svelte: 5.34.1 + sveld: 0.22.1(postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6) + svelte: 5.38.2 zod: 3.25.64 transitivePeerDependencies: - '@babel/core' @@ -5226,18 +5541,18 @@ snapshots: - stylus - sugarss - svelte2tsx@0.7.39(svelte@5.34.1)(typescript@5.8.3): + svelte2tsx@0.7.42(svelte@5.38.2)(typescript@5.9.2): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.34.1 - typescript: 5.8.3 + svelte: 5.38.2 + typescript: 5.9.2 svelte@4.2.20: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 '@types/estree': 1.0.8 acorn: 8.15.0 aria-query: 5.3.2 @@ -5250,10 +5565,10 @@ snapshots: magic-string: 0.30.17 periscopic: 3.1.0 - svelte@5.34.1: + svelte@5.38.2: dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) '@types/estree': 1.0.8 acorn: 8.15.0 @@ -5261,7 +5576,7 @@ snapshots: axobject-query: 4.1.0 clsx: 2.1.1 esm-env: 1.2.2 - esrap: 1.4.9 + esrap: 2.1.0 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 @@ -5269,7 +5584,7 @@ snapshots: tailwind-merge@3.3.0: {} - tailwindcss@4.1.10: {} + tailwindcss@4.1.12: {} tapable@2.2.2: {} @@ -5297,16 +5612,12 @@ snapshots: fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.1.0: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} tinyspy@4.0.3: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -5330,20 +5641,21 @@ snapshots: tslib@2.8.1: {} - typescript@5.8.3: {} + typescript@5.9.2: {} ufo@1.6.1: {} + undici-types@7.10.0: + optional: true + undici-types@7.8.0: {} - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 + undici@7.14.0: {} - unenv@2.0.0-rc.17: + unenv@2.0.0-rc.19: dependencies: defu: 6.1.4 - exsolve: 1.0.5 + exsolve: 1.0.7 ohash: 2.0.11 pathe: 2.0.3 ufo: 1.6.1 @@ -5377,22 +5689,22 @@ snapshots: universalify@0.1.2: {} - unplugin-icons@22.1.0(svelte@5.34.1): + unplugin-icons@22.2.0(svelte@5.38.2): dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/utils': 2.3.0 debug: 4.4.1 local-pkg: 1.1.1 - unplugin: 2.3.4 + unplugin: 2.3.5 optionalDependencies: - svelte: 5.34.1 + svelte: 5.38.2 transitivePeerDependencies: - supports-color - unplugin@2.3.4: + unplugin@2.3.5: dependencies: acorn: 8.15.0 - picomatch: 4.0.2 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 us-atlas@3.0.1: {} @@ -5416,13 +5728,13 @@ snapshots: '@types/unist': 3.0.2 vfile-message: 4.0.3 - vite-node@3.2.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -5437,57 +5749,57 @@ snapshots: - tsx - yaml - vite-plugin-devtools-json@0.2.0(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)): + vite-plugin-devtools-json@1.0.0(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)): dependencies: uuid: 11.1.0 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) - vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): + vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: - esbuild: 0.25.4 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.5 - rollup: 4.40.2 + esbuild: 0.25.8 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.2 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.1 + '@types/node': 24.3.0 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.5.1 lightningcss: 1.30.1 - yaml: 2.8.0 + yaml: 2.8.1 - vitefu@1.0.6(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)): + vitefu@1.1.1(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) - vitest@3.2.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): + vitest@3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 - '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(vite@6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.3 - '@vitest/runner': 3.2.3 - '@vitest/snapshot': 3.2.3 - '@vitest/spy': 3.2.3 - '@vitest/utils': 3.2.3 - chai: 5.2.0 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 debug: 4.4.1 - expect-type: 1.2.1 + expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 - tinypool: 1.1.0 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) - vite-node: 3.2.3(@types/node@24.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite: 7.1.2(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.0.1 + '@types/node': 24.3.0 transitivePeerDependencies: - jiti - less @@ -5522,31 +5834,31 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20250604.0: + workerd@1.20250813.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250604.0 - '@cloudflare/workerd-darwin-arm64': 1.20250604.0 - '@cloudflare/workerd-linux-64': 1.20250604.0 - '@cloudflare/workerd-linux-arm64': 1.20250604.0 - '@cloudflare/workerd-windows-64': 1.20250604.0 + '@cloudflare/workerd-darwin-64': 1.20250813.0 + '@cloudflare/workerd-darwin-arm64': 1.20250813.0 + '@cloudflare/workerd-linux-64': 1.20250813.0 + '@cloudflare/workerd-linux-arm64': 1.20250813.0 + '@cloudflare/workerd-windows-64': 1.20250813.0 worktop@0.8.0-next.18: dependencies: mrmime: 2.0.1 regexparam: 3.0.0 - wrangler@4.20.0(@cloudflare/workers-types@4.20250613.0): + wrangler@4.30.0(@cloudflare/workers-types@4.20250816.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.3.2(unenv@2.0.0-rc.17)(workerd@1.20250604.0) + '@cloudflare/unenv-preset': 2.6.1(unenv@2.0.0-rc.19)(workerd@1.20250813.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20250604.1 + miniflare: 4.20250813.1 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.17 - workerd: 1.20250604.0 + unenv: 2.0.0-rc.19 + workerd: 1.20250813.0 optionalDependencies: - '@cloudflare/workers-types': 4.20250613.0 + '@cloudflare/workers-types': 4.20250816.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil @@ -5570,7 +5882,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.8.0: + yaml@2.8.1: optional: true yargs-parser@21.1.1: {} @@ -5585,11 +5897,18 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - youch@3.3.4: + youch-core@0.3.3: + dependencies: + '@poppinss/exception': 1.2.2 + error-stack-parser-es: 1.0.5 + + youch@4.1.0-beta.10: dependencies: - cookie: 0.7.2 - mustache: 4.2.0 - stacktracey: 2.1.8 + '@poppinss/colors': 4.1.5 + '@poppinss/dumper': 0.6.4 + '@speed-highlight/core': 1.2.7 + cookie: 1.0.2 + youch-core: 0.3.3 zimmerframe@1.1.2: {} From ac74712eab33906da4f75e7bad1f3ff02477a276 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Mon, 8 Sep 2025 20:42:27 -0400 Subject: [PATCH 38/54] docs(BarChart): Add "Group series (labels)" example --- .../docs/components/BarChart/+page.svelte | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte b/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte index f03599a7d..657ac9e92 100644 --- a/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/BarChart/+page.svelte @@ -589,6 +589,61 @@
+

Group series (labels)

+ + +
+ + + {#snippet aboveMarks({ context, visibleSeries })} + {#each visibleSeries as s} + {#each wideData as d} + {@const valueAccessor = accessor(s.key)} + {@const value = valueAccessor(d)} + + {/each} + {/each} + {/snippet} + +
+
+

Group series (horizontal)

From 657f3a60221b5998c9683071da19b984cdb69138 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 11 Sep 2025 07:45:35 -0400 Subject: [PATCH 39/54] fix(autoScale): Ignore `null` domain values, fixing some brush examples --- .changeset/evil-bags-dance.md | 5 +++++ packages/layerchart/src/lib/utils/scales.svelte.ts | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/evil-bags-dance.md diff --git a/.changeset/evil-bags-dance.md b/.changeset/evil-bags-dance.md new file mode 100644 index 000000000..9f170d31d --- /dev/null +++ b/.changeset/evil-bags-dance.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(autoScale): Ignore `null` domain values, fixing some brush examples diff --git a/packages/layerchart/src/lib/utils/scales.svelte.ts b/packages/layerchart/src/lib/utils/scales.svelte.ts index 3601ace8a..598e7eef9 100644 --- a/packages/layerchart/src/lib/utils/scales.svelte.ts +++ b/packages/layerchart/src/lib/utils/scales.svelte.ts @@ -171,9 +171,9 @@ export function autoScale( propAccessor?: Accessor ): AnyScale { let values = null; - if (domain && domain.length > 0) { - // Determine based on domain values - values = domain; + if (domain && domain.length > 0 && domain.some((d) => d != null)) { + // Determine based on non-null domain values + values = domain.filter((d) => d != null); } else if (data && data.length > 0 && propAccessor) { // Determine based on data values const value = accessor(propAccessor)(data[0]); From 6e8ea7fffdf1642f41ad9e348af966db97a60291 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 12:45:11 -0400 Subject: [PATCH 40/54] Version Packages (next) (#638) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/pre.json | 3 +++ packages/layerchart/CHANGELOG.md | 10 ++++++++++ packages/layerchart/package.json | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index aefa77c13..9dc9b9e3a 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -35,6 +35,8 @@ "eleven-crabs-switch", "eleven-trains-make", "empty-bats-stop", + "every-sheep-rush", + "evil-bags-dance", "evil-flowers-float", "evil-hoops-return", "four-taxes-beam", @@ -96,6 +98,7 @@ "smart-dots-rule", "smart-paths-jog", "social-masks-teach", + "soft-pens-invite", "solid-badgers-tan", "some-frogs-camp", "sour-hounds-repeat", diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index c630d2905..d753c3743 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,15 @@ # LayerChart +## 2.0.0-next.38 + +### Patch Changes + +- Update dependencies ([#629](https://github.com/techniq/layerchart/pull/629)) + +- fix(autoScale): Ignore `null` domain values, fixing some brush examples ([#449](https://github.com/techniq/layerchart/pull/449)) + +- fix: Update `dagreAncestors()` and `dagreDescendants()` util types ([#629](https://github.com/techniq/layerchart/pull/629)) + ## 2.0.0-next.37 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index d9b9b5235..1f5d96c1c 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "2.0.0-next.37", + "version": "2.0.0-next.38", "scripts": { "dev": "vite dev --port 3002", "build": "vite build", From 4ed03923ed888b2668fd6cda8fdd5c7db038b1fe Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Wed, 17 Sep 2025 10:43:33 -0400 Subject: [PATCH 41/54] Fix Axis reactivity with LayerChart 1.x and Svelte 5.34+ (#643) * Update Svelte to 5.38.2 to reproduce issue #641 and update LayerCake * Add simle reproduction * fix(Axis): Fix reactivity issue with xRange/yRange in Svelte 5.34+. Fixes #641 * Remove issue example * Downgrade LayerCake back to 8.4.3 (fix svelte-check errors and update not needed at this time) --- .changeset/rude-gifts-type.md | 5 + packages/layerchart/package.json | 4 +- .../layerchart/src/lib/components/Axis.svelte | 10 +- pnpm-lock.yaml | 108 ++++++++++-------- 4 files changed, 70 insertions(+), 57 deletions(-) create mode 100644 .changeset/rude-gifts-type.md diff --git a/.changeset/rude-gifts-type.md b/.changeset/rude-gifts-type.md new file mode 100644 index 000000000..fff133483 --- /dev/null +++ b/.changeset/rude-gifts-type.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Axis): Fix reactivity issue with xRange/yRange in Svelte 5.34+. Fixes #641 diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 19453562e..4aaa18dc0 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -63,7 +63,7 @@ "rehype-slug": "^6.0.0", "shapefile": "^0.6.6", "solar-calculator": "^0.3.0", - "svelte": "5.29.0", + "svelte": "5.38.2", "svelte-check": "^4.2.0", "svelte-json-tree": "^2.2.0", "svelte-ux": "^1.0.5", @@ -105,7 +105,7 @@ "d3-tile": "^1.0.0", "d3-time": "^3.1.0", "date-fns": "^4.1.0", - "layercake": "^8.4.3", + "layercake": "8.4.3", "lodash-es": "^4.17.21" }, "peerDependencies": { diff --git a/packages/layerchart/src/lib/components/Axis.svelte b/packages/layerchart/src/lib/components/Axis.svelte index ff690bb65..74d7f8522 100644 --- a/packages/layerchart/src/lib/components/Axis.svelte +++ b/packages/layerchart/src/lib/components/Axis.svelte @@ -87,9 +87,6 @@ tickLabel?: string; } = {}; - $: [xRangeMin, xRangeMax] = extent($xRange) as [number, number]; - $: [yRangeMin, yRangeMax] = extent($yRange) as [number, number]; - $: tickVals = Array.isArray(ticks) ? ticks : typeof ticks === 'function' @@ -102,7 +99,10 @@ : _scale.domain() : _scale.ticks(ticks ?? (placement === 'left' || placement === 'right' ? 4 : undefined)); - function getCoords(tick: any) { + function getCoords(tick: any, xRange: [number, number], yRange: [number, number]) { + const [xRangeMin, xRangeMax] = extent(xRange) as [number, number]; + const [yRangeMin, yRangeMax] = extent(yRange) as [number, number]; + switch (placement) { case 'top': return { @@ -257,7 +257,7 @@ {/if} {#each tickVals as tick, index (tick)} - {@const tickCoords = getCoords(tick)} + {@const tickCoords = getCoords(tick, $xRange, $yRange)} {@const [radialTickCoordsX, radialTickCoordsY] = pointRadial(tickCoords.x, tickCoords.y)} {@const [radialTickMarkCoordsX, radialTickMarkCoordsY] = pointRadial( tickCoords.x, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e04fed67..e11824c2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,8 +99,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 layercake: - specifier: ^8.4.3 - version: 8.4.3(svelte@5.29.0)(typescript@5.8.3) + specifier: 8.4.3 + version: 8.4.3(svelte@5.38.2)(typescript@5.8.3) lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -116,16 +116,16 @@ importers: version: 3.0.5(rollup@2.79.2) '@sveltejs/adapter-cloudflare': specifier: ^7.0.3 - version: 7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0)) + version: 7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0)) '@sveltejs/kit': specifier: ^2.21.0 - version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) + version: 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) '@sveltejs/package': specifier: ^2.3.11 - version: 2.3.11(svelte@5.29.0)(typescript@5.8.3) + version: 2.3.11(svelte@5.38.2)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) + version: 5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0 @@ -209,7 +209,7 @@ importers: version: 15.0.7 mdsvex: specifier: ^0.12.3 - version: 0.12.3(svelte@5.29.0) + version: 0.12.3(svelte@5.38.2) posthog-js: specifier: ^1.242.1 version: 1.242.1 @@ -218,7 +218,7 @@ importers: version: 3.5.3 prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.4.0(prettier@3.5.3)(svelte@5.29.0) + version: 3.4.0(prettier@3.5.3)(svelte@5.38.2) prism-svelte: specifier: ^0.5.0 version: 0.5.0 @@ -238,20 +238,20 @@ importers: specifier: ^0.3.0 version: 0.3.0 svelte: - specifier: 5.29.0 - version: 5.29.0 + specifier: 5.38.2 + version: 5.38.2 svelte-check: specifier: ^4.2.0 - version: 4.2.0(picomatch@4.0.2)(svelte@5.29.0)(typescript@5.8.3) + version: 4.2.0(picomatch@4.0.2)(svelte@5.38.2)(typescript@5.8.3) svelte-json-tree: specifier: ^2.2.0 - version: 2.2.0(svelte@5.29.0) + version: 2.2.0(svelte@5.38.2) svelte-ux: specifier: ^1.0.5 - version: 1.0.5(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1))(postcss@8.4.49)(svelte@5.29.0) + version: 1.0.5(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1))(postcss@8.4.49)(svelte@5.38.2) svelte2tsx: specifier: ^0.7.38 - version: 0.7.38(svelte@5.29.0)(typescript@5.8.3) + version: 0.7.38(svelte@5.38.2)(typescript@5.8.3) tailwindcss: specifier: ^3.4.16 version: 3.4.16 @@ -692,6 +692,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1499,8 +1502,8 @@ packages: engines: {node: '>=4'} hasBin: true - esrap@1.4.6: - resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} @@ -2369,8 +2372,8 @@ packages: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} - svelte@5.29.0: - resolution: {integrity: sha512-ZF1FXoTsDbTlHShZs0kTznahQhU8drBXF2Vx1dt635MW/OHpy+iWvAHsIRp+ia25L1Vrczq9EsuMdLXM+cjknw==} + svelte@5.38.2: + resolution: {integrity: sha512-iAcp/oFAWauVSGILdD67n7DiwgLHXZzWZIdzl7araRxu72jUr7PFAo2Iie7gXt0IbnlYvhxCb9GT3ZJUquO3PA==} engines: {node: '>=18'} tailwind-merge@2.6.0: @@ -3046,6 +3049,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -3246,17 +3254,17 @@ snapshots: dependencies: acorn: 8.14.1 - '@sveltejs/adapter-cloudflare@7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0))': + '@sveltejs/adapter-cloudflare@7.0.3(@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(wrangler@4.14.4(@cloudflare/workers-types@4.20250514.0))': dependencies: '@cloudflare/workers-types': 4.20250514.0 - '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) worktop: 0.8.0-next.18 wrangler: 4.14.4(@cloudflare/workers-types@4.20250514.0) - '@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1))': + '@sveltejs/kit@2.21.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1))': dependencies: '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) '@types/cookie': 0.6.0 acorn: 8.14.1 cookie: 0.6.0 @@ -3268,37 +3276,37 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.1 - svelte: 5.29.0 + svelte: 5.38.2 vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1) - '@sveltejs/package@2.3.11(svelte@5.29.0)(typescript@5.8.3)': + '@sveltejs/package@2.3.11(svelte@5.38.2)(typescript@5.8.3)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 semver: 7.7.2 - svelte: 5.29.0 - svelte2tsx: 0.7.38(svelte@5.29.0)(typescript@5.8.3) + svelte: 5.38.2 + svelte2tsx: 0.7.38(svelte@5.38.2)(typescript@5.8.3) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) debug: 4.4.0 - svelte: 5.29.0 + svelte: 5.38.2 vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.29.0)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)))(svelte@5.38.2)(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.29.0 + svelte: 5.38.2 vite: 6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1) vitefu: 1.0.5(vite@6.3.5(@types/node@22.15.18)(jiti@2.4.2)(yaml@2.7.1)) transitivePeerDependencies: @@ -3847,7 +3855,7 @@ snapshots: esprima@4.0.1: {} - esrap@1.4.6: + esrap@2.1.0: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -4083,13 +4091,13 @@ snapshots: kleur@4.1.5: {} - layercake@8.4.3(svelte@5.29.0)(typescript@5.8.3): + layercake@8.4.3(svelte@5.38.2)(typescript@5.8.3): dependencies: d3-array: 3.2.4 d3-color: 3.1.0 d3-scale: 4.0.2 d3-shape: 3.2.0 - svelte: 5.29.0 + svelte: 5.38.2 typescript: 5.8.3 lilconfig@3.1.3: {} @@ -4130,12 +4138,12 @@ snapshots: mdn-data@2.0.30: {} - mdsvex@0.12.3(svelte@5.29.0): + mdsvex@0.12.3(svelte@5.38.2): dependencies: '@types/unist': 2.0.11 prism-svelte: 0.4.7 prismjs: 1.30.0 - svelte: 5.29.0 + svelte: 5.38.2 vfile-message: 2.0.4 merge2@1.4.1: {} @@ -4359,10 +4367,10 @@ snapshots: preact@10.26.6: {} - prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.29.0): + prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.38.2): dependencies: prettier: 3.5.3 - svelte: 5.29.0 + svelte: 5.38.2 prettier@2.8.8: {} @@ -4633,21 +4641,21 @@ snapshots: - stylus - sugarss - svelte-check@4.2.0(picomatch@4.0.2)(svelte@5.29.0)(typescript@5.8.3): + svelte-check@4.2.0(picomatch@4.0.2)(svelte@5.38.2)(typescript@5.8.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.4(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.29.0 + svelte: 5.38.2 typescript: 5.8.3 transitivePeerDependencies: - picomatch - svelte-json-tree@2.2.0(svelte@5.29.0): + svelte-json-tree@2.2.0(svelte@5.38.2): dependencies: - svelte: 5.29.0 + svelte: 5.38.2 svelte-preprocess@6.0.3(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1))(postcss@8.4.49)(svelte@4.2.19)(typescript@5.8.3): dependencies: @@ -4657,7 +4665,7 @@ snapshots: postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1) typescript: 5.8.3 - svelte-ux@1.0.5(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1))(postcss@8.4.49)(svelte@5.29.0): + svelte-ux@1.0.5(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1))(postcss@8.4.49)(svelte@5.38.2): dependencies: '@floating-ui/dom': 1.7.0 '@fortawesome/fontawesome-common-types': 6.7.2 @@ -4678,7 +4686,7 @@ snapshots: prism-themes: 1.9.0 prismjs: 1.30.0 sveld: 0.22.1(postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.7.1))(postcss@8.4.49) - svelte: 5.29.0 + svelte: 5.38.2 zod: 3.24.4 transitivePeerDependencies: - '@babel/core' @@ -4692,11 +4700,11 @@ snapshots: - sugarss - ts-node - svelte2tsx@0.7.38(svelte@5.29.0)(typescript@5.8.3): + svelte2tsx@0.7.38(svelte@5.38.2)(typescript@5.8.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.29.0 + svelte: 5.38.2 typescript: 5.8.3 svelte@4.2.19: @@ -4716,9 +4724,9 @@ snapshots: magic-string: 0.30.17 periscopic: 3.1.0 - svelte@5.29.0: + svelte@5.38.2: dependencies: - '@ampproject/remapping': 2.3.0 + '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.0 '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) '@types/estree': 1.0.7 @@ -4727,7 +4735,7 @@ snapshots: axobject-query: 4.1.0 clsx: 2.1.1 esm-env: 1.2.2 - esrap: 1.4.6 + esrap: 2.1.0 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 From ffe22ca83438b7c708ecd714501acde8705d1bcb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:44:34 -0400 Subject: [PATCH 42/54] Version Packages (#644) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/rude-gifts-type.md | 5 ----- packages/layerchart/CHANGELOG.md | 6 ++++++ packages/layerchart/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/rude-gifts-type.md diff --git a/.changeset/rude-gifts-type.md b/.changeset/rude-gifts-type.md deleted file mode 100644 index fff133483..000000000 --- a/.changeset/rude-gifts-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'layerchart': patch ---- - -fix(Axis): Fix reactivity issue with xRange/yRange in Svelte 5.34+. Fixes #641 diff --git a/packages/layerchart/CHANGELOG.md b/packages/layerchart/CHANGELOG.md index 73972cc36..9989cef5b 100644 --- a/packages/layerchart/CHANGELOG.md +++ b/packages/layerchart/CHANGELOG.md @@ -1,5 +1,11 @@ # LayerChart +## 1.0.12 + +### Patch Changes + +- fix(Axis): Fix reactivity issue with xRange/yRange in Svelte 5.34+. Fixes #641 ([#643](https://github.com/techniq/layerchart/pull/643)) + ## 1.0.11 ### Patch Changes diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 4aaa18dc0..5494b5986 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -4,7 +4,7 @@ "author": "Sean Lynch ", "license": "MIT", "repository": "techniq/layerchart", - "version": "1.0.11", + "version": "1.0.12", "scripts": { "dev": "vite dev", "build": "vite build", From 24e71b47705d07d20dc663e6ed25ac24722514b0 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Fri, 19 Sep 2025 13:24:32 -0400 Subject: [PATCH 43/54] Fix radial area chart example's tooltip by using `bisect-x` mode instead of `quadtree` --- .../src/routes/docs/components/AreaChart/+page.svelte | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte b/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte index 98dbed674..b726efe71 100644 --- a/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/AreaChart/+page.svelte @@ -634,6 +634,9 @@ xAxis: { format: 'month', tickMarks: false }, yAxis: { ticks: 4, format: (v) => v + '° F' }, highlight: { points: false }, + tooltip: { + context: { mode: 'bisect-x' }, + }, }} series={[ { From 1678de5d0d26d33042039d359acf30dd64f58055 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Wed, 24 Sep 2025 12:41:48 -0400 Subject: [PATCH 44/54] feat: CSS-only usage, HTML components, and more (#557) * Experiment supporting `` as html `
` (need to fix types and further validate) * feat: Add `pointsToAngleAndLength()` math util * fix(Rect): Support border radius for html * feat(Text): Initial support for Html context * feat(Line): Initial support for Html context * More html context experimenting * docs(Calendar): Fix canvas clipping * feat(Circle): Add html support * Document more examples with html support (at least partial) * fix(Text): Support rotate with html context * fix(Text): Coalesce rotate to `0` deg * fix(Calendar): Align label Text when using Html with other contexts * Add `CommonEvents` type to support Svg/Html contexts and make svelte-check happy * feat(Ellipse): Support html context * fix(Primatives): Apply default classes when using Canvas context (like Svg) * Update changeset * docs: Fix radial grid example * fix(Line): Correctly center and respect strokeWidth * docs: Improve some primitive examples * fix(Text): Apply `fill: currentColor` to support more straightforward way of changing color (ex. `class="text-red-500"` or `style="color:red"`) * Remove use of `layerClass` and apply `lc-{name}` class directly to allow easy component diff --git a/examples/standalone/static/robots.txt b/examples/standalone/static/robots.txt new file mode 100644 index 000000000..b6dd6670c --- /dev/null +++ b/examples/standalone/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/examples/standalone/svelte.config.js b/examples/standalone/svelte.config.js new file mode 100644 index 000000000..612cde971 --- /dev/null +++ b/examples/standalone/svelte.config.js @@ -0,0 +1,12 @@ +import adapter from '@sveltejs/adapter-cloudflare'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + kit: { adapter: adapter() } +}; + +export default config; diff --git a/examples/standalone/tsconfig.json b/examples/standalone/tsconfig.json new file mode 100644 index 000000000..a5567ee6b --- /dev/null +++ b/examples/standalone/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/examples/standalone/vite.config.ts b/examples/standalone/vite.config.ts new file mode 100644 index 000000000..a5c0236d3 --- /dev/null +++ b/examples/standalone/vite.config.ts @@ -0,0 +1,7 @@ +import devtoolsJson from 'vite-plugin-devtools-json'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit(), devtoolsJson()] +}); diff --git a/examples/svelte-ux-2/.gitignore b/examples/svelte-ux-2/.gitignore new file mode 100644 index 000000000..3b462cb0c --- /dev/null +++ b/examples/svelte-ux-2/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/examples/svelte-ux-2/.npmrc b/examples/svelte-ux-2/.npmrc new file mode 100644 index 000000000..b6f27f135 --- /dev/null +++ b/examples/svelte-ux-2/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/examples/svelte-ux-2/.prettierignore b/examples/svelte-ux-2/.prettierignore new file mode 100644 index 000000000..7d74fe246 --- /dev/null +++ b/examples/svelte-ux-2/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/examples/svelte-ux-2/.prettierrc b/examples/svelte-ux-2/.prettierrc new file mode 100644 index 000000000..8103a0b5d --- /dev/null +++ b/examples/svelte-ux-2/.prettierrc @@ -0,0 +1,16 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ], + "tailwindStylesheet": "./src/app.css" +} diff --git a/examples/svelte-ux-2/README.md b/examples/svelte-ux-2/README.md new file mode 100644 index 000000000..75842c404 --- /dev/null +++ b/examples/svelte-ux-2/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/examples/svelte-ux-2/package.json b/examples/svelte-ux-2/package.json new file mode 100644 index 000000000..22922152b --- /dev/null +++ b/examples/svelte-ux-2/package.json @@ -0,0 +1,34 @@ +{ + "name": "svelteux-2", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check ." + }, + "devDependencies": { + "@layerstack/tailwind": "2.0.0-next.18", + "@sveltejs/adapter-cloudflare": "^7.0.0", + "@sveltejs/kit": "^2.22.0", + "@sveltejs/vite-plugin-svelte": "^6.0.0", + "@tailwindcss/vite": "^4.0.0", + "layerchart": "workspace:*", + "prettier": "^3.4.2", + "prettier-plugin-svelte": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.11", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "svelte-ux": "2.0.0-next.19", + "tailwindcss": "^4.0.0", + "typescript": "^5.0.0", + "vite": "^7.0.4", + "vite-plugin-devtools-json": "^1.0.0" + } +} diff --git a/examples/svelte-ux-2/src/app.css b/examples/svelte-ux-2/src/app.css new file mode 100644 index 000000000..cc998d863 --- /dev/null +++ b/examples/svelte-ux-2/src/app.css @@ -0,0 +1,6 @@ +@import 'tailwindcss'; +@import '@layerstack/tailwind/core.css'; +@import '@layerstack/tailwind/utils.css'; +@import '@layerstack/tailwind/themes/basic.css'; + +@source '../node_modules/svelte-ux/dist'; diff --git a/examples/svelte-ux-2/src/app.d.ts b/examples/svelte-ux-2/src/app.d.ts new file mode 100644 index 000000000..da08e6da5 --- /dev/null +++ b/examples/svelte-ux-2/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/examples/svelte-ux-2/src/app.html b/examples/svelte-ux-2/src/app.html new file mode 100644 index 000000000..f273cc58f --- /dev/null +++ b/examples/svelte-ux-2/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/examples/svelte-ux-2/src/lib/assets/favicon.svg b/examples/svelte-ux-2/src/lib/assets/favicon.svg new file mode 100644 index 000000000..cc5dc66a3 --- /dev/null +++ b/examples/svelte-ux-2/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/examples/svelte-ux-2/src/lib/index.ts b/examples/svelte-ux-2/src/lib/index.ts new file mode 100644 index 000000000..856f2b6c3 --- /dev/null +++ b/examples/svelte-ux-2/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/examples/svelte-ux-2/src/routes/+layout.svelte b/examples/svelte-ux-2/src/routes/+layout.svelte new file mode 100644 index 000000000..61be2d59a --- /dev/null +++ b/examples/svelte-ux-2/src/routes/+layout.svelte @@ -0,0 +1,24 @@ + + + + + + + + +
+
+ +
+ + {@render children?.()} +
diff --git a/examples/svelte-ux-2/src/routes/+page.svelte b/examples/svelte-ux-2/src/routes/+page.svelte new file mode 100644 index 000000000..c40c98626 --- /dev/null +++ b/examples/svelte-ux-2/src/routes/+page.svelte @@ -0,0 +1,62 @@ + + +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
diff --git a/examples/svelte-ux-2/static/robots.txt b/examples/svelte-ux-2/static/robots.txt new file mode 100644 index 000000000..b6dd6670c --- /dev/null +++ b/examples/svelte-ux-2/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/examples/svelte-ux-2/svelte.config.js b/examples/svelte-ux-2/svelte.config.js new file mode 100644 index 000000000..612cde971 --- /dev/null +++ b/examples/svelte-ux-2/svelte.config.js @@ -0,0 +1,12 @@ +import adapter from '@sveltejs/adapter-cloudflare'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + kit: { adapter: adapter() } +}; + +export default config; diff --git a/examples/svelte-ux-2/tsconfig.json b/examples/svelte-ux-2/tsconfig.json new file mode 100644 index 000000000..a5567ee6b --- /dev/null +++ b/examples/svelte-ux-2/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/examples/svelte-ux-2/vite.config.ts b/examples/svelte-ux-2/vite.config.ts new file mode 100644 index 000000000..7be426bb5 --- /dev/null +++ b/examples/svelte-ux-2/vite.config.ts @@ -0,0 +1,8 @@ +import devtoolsJson from 'vite-plugin-devtools-json'; +import tailwindcss from '@tailwindcss/vite'; +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit(), devtoolsJson()] +}); diff --git a/package.json b/package.json index a0e7a5d58..60059423c 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,17 @@ "author": "Sean Lynch ", "license": "MIT", "type": "module", + "homepage": "https://layerchart.com", "scripts": { "dev": "pnpm -r dev", "test:unit": "pnpm -r test:unit", - "build": "rimraf packages/*/dist && pnpm -r build", - "package": "pnpm -r package", - "check": "pnpm -r check", - "lint": "pnpm -r lint", + "build:packages": "rimraf packages/*/dist && pnpm --filter './packages/*' build", + "build:examples": "rimraf packages/*/dist && pnpm --filter './packages/*' package && pnpm --filter './examples/*' build", + "package": "pnpm --filter './packages/*' package", + "check:packages": "pnpm --filter './packages/*' check", + "check:examples": "pnpm --filter './examples/*' check", + "lint:packages": "pnpm --filter './packages/*' lint", + "lint:examples": "pnpm --filter './examples/*' lint", "format": "pnpm -r format", "changeset": "changeset", "changeset:version": "changeset version", @@ -23,5 +27,10 @@ "rimraf": "6.0.1", "wrangler": "^4.30.0" }, - "packageManager": "pnpm@9.1.1" + "packageManager": "pnpm@9.1.1", + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild" + ] + } } diff --git a/packages/layerchart/package.json b/packages/layerchart/package.json index 1f5d96c1c..4c5918455 100644 --- a/packages/layerchart/package.json +++ b/packages/layerchart/package.json @@ -122,6 +122,10 @@ "types": "./dist/utils/*.d.ts", "svelte": "./dist/utils/*.js", "default": "./dist/utils/*.js" + }, + "./*.css": { + "style": "./dist/styles/*.css", + "default": "./dist/styles/*.css" } }, "files": [ diff --git a/packages/layerchart/src/lib/components/AnnotationLine.svelte b/packages/layerchart/src/lib/components/AnnotationLine.svelte index e2d35c73c..f2d8f7e93 100644 --- a/packages/layerchart/src/lib/components/AnnotationLine.svelte +++ b/packages/layerchart/src/lib/components/AnnotationLine.svelte @@ -130,7 +130,7 @@ x2={line.x2} y2={line.y2} {...props?.line} - class={cls('stroke-surface-content', props?.line?.class)} + class={cls('lc-annotation-line', props?.line?.class)} /> {#if label} @@ -138,6 +138,19 @@ value={label} {...labelProps} {...props?.label} - class={cls('text-xs pointer-events-none', props?.label?.class)} + class={cls('lc-annotation-line-label', props?.label?.class)} /> {/if} + + diff --git a/packages/layerchart/src/lib/components/AnnotationPoint.svelte b/packages/layerchart/src/lib/components/AnnotationPoint.svelte index d5198915e..ca6140a72 100644 --- a/packages/layerchart/src/lib/components/AnnotationPoint.svelte +++ b/packages/layerchart/src/lib/components/AnnotationPoint.svelte @@ -108,12 +108,14 @@ cx={point.x} cy={point.y} {r} + onpointermove={onPointerMove} onmousemove={onPointerMove} ontouchmove={onPointerMove} + onpointerleave={onPointerLeave} onmouseleave={onPointerLeave} ontouchend={onPointerLeave} {...props?.circle} - class={cls('stroke-surface-100', props?.circle?.class)} + class={cls('lc-annotation-point', props?.circle?.class)} /> {#if label} @@ -121,6 +123,15 @@ value={label} {...labelProps} {...props?.label} - class={cls('text-xs pointer-events-none', props?.label?.class)} + class={cls('lc-annotation-point-label', props?.label?.class)} /> {/if} + + diff --git a/packages/layerchart/src/lib/components/AnnotationRange.svelte b/packages/layerchart/src/lib/components/AnnotationRange.svelte index f1ba599e6..af2aeba8b 100644 --- a/packages/layerchart/src/lib/components/AnnotationRange.svelte +++ b/packages/layerchart/src/lib/components/AnnotationRange.svelte @@ -118,7 +118,12 @@ {#if fill || className} - + {/if} {#if gradient} @@ -142,6 +147,15 @@ value={label} {...labelProps} {...props?.label} - class={cls('text-xs pointer-events-none', props?.label?.class)} + class={cls('lc-annotation-range-label', props?.label?.class)} /> {/if} + + diff --git a/packages/layerchart/src/lib/components/Arc.svelte b/packages/layerchart/src/lib/components/Arc.svelte index 4c285e649..aec9b0754 100644 --- a/packages/layerchart/src/lib/components/Arc.svelte +++ b/packages/layerchart/src/lib/components/Arc.svelte @@ -189,7 +189,7 @@ import { degreesToRadians } from '$lib/utils/math.js'; import { getChartContext } from './Chart.svelte'; - import { extractLayerProps, layerClass } from '$lib/utils/attributes.js'; + import { extractLayerProps } from '$lib/utils/attributes.js'; import { cls } from '@layerstack/tailwind'; import { max } from 'd3-array'; import { @@ -402,7 +402,7 @@ pathData={trackArc()} stroke="none" bind:pathRef={trackRef} - {...extractLayerProps(track, 'arc-track')} + {...extractLayerProps(track, 'lc-arc-track')} /> {/if} @@ -416,7 +416,7 @@ stroke-width={strokeWidth} {opacity} {...restProps} - class={cls(layerClass('arc-line'), className)} + class={cls('lc-arc-line', className)} onpointerenter={onPointerEnter} onpointermove={onPointerMove} onpointerleave={onPointerLeave} diff --git a/packages/layerchart/src/lib/components/Area.svelte b/packages/layerchart/src/lib/components/Area.svelte index 4826b799e..456ead7ab 100644 --- a/packages/layerchart/src/lib/components/Area.svelte +++ b/packages/layerchart/src/lib/components/Area.svelte @@ -239,7 +239,15 @@ {#if line} - + {/if} {#if renderCtx === 'svg'} @@ -251,6 +259,6 @@ {stroke} stroke-width={strokeWidth} {opacity} - {...extractLayerProps(restProps, 'area-path')} + {...extractLayerProps(restProps, 'lc-area-path')} /> {/if} diff --git a/packages/layerchart/src/lib/components/Axis.svelte b/packages/layerchart/src/lib/components/Axis.svelte index 39c822124..d31bd5257 100644 --- a/packages/layerchart/src/lib/components/Axis.svelte +++ b/packages/layerchart/src/lib/components/Axis.svelte @@ -145,7 +145,7 @@ import { isScaleBand } from '$lib/utils/scales.svelte.js'; import { getChartContext } from './Chart.svelte'; - import { extractLayerProps, layerClass } from '$lib/utils/attributes.js'; + import { extractLayerProps } from '$lib/utils/attributes.js'; import { type MotionProp } from '$lib/utils/motion.svelte.js'; import { autoTickVals, autoTickFormat, type TicksConfig } from '$lib/utils/ticks.js'; @@ -422,28 +422,21 @@ capHeight: '7px', lineHeight: '11px', ...labelProps, - class: cls( - layerClass('axis-label'), - 'text-[10px] stroke-surface-100 [stroke-width:2px] font-light', - classes.label, - labelProps?.class - ), + class: cls('lc-axis-label', classes.label, labelProps?.class), }) satisfies ComponentProps; {#if rule !== false} - {@const ruleProps = extractLayerProps(rule, 'axis-rule')} {/if} @@ -470,32 +463,21 @@ capHeight: '7px', lineHeight: '11px', ...tickLabelProps, - class: cls( - layerClass('axis-tick-label'), - 'text-[10px] stroke-surface-100 [stroke-width:2px] font-light', - classes.tickLabel, - tickLabelProps?.class - ), + class: cls('lc-axis-tick-label', classes.tickLabel, tickLabelProps?.class), }} - + {#if grid !== false} - {@const ruleProps = extractLayerProps(grid, 'axis-grid')} {/if} {#if tickMarks} - {@const tickClasses = cls( - layerClass('axis-tick'), - 'stroke-surface-content/50', - classes.tick - )} + {@const tickClasses = cls('lc-axis-tick', classes.tick)} {#if orientation === 'horizontal'} {/each} + + diff --git a/packages/layerchart/src/lib/components/Bar.svelte b/packages/layerchart/src/lib/components/Bar.svelte index 1462d328c..f9cb0f318 100644 --- a/packages/layerchart/src/lib/components/Bar.svelte +++ b/packages/layerchart/src/lib/components/Bar.svelte @@ -71,7 +71,8 @@ Without< Omit, 'width' | 'height' | 'x' | 'y' | 'offset'>, BarPropsWithoutHTML - >; + > & + CommonEvents; - + {#if children} {@render children()} {:else} @@ -64,7 +64,7 @@ {stroke} fill={fill ?? (ctx.config.c ? ctx.cGet(d) : null)} onclick={(e) => onBarClick(e, { data: d })} - {...extractLayerProps(restProps, 'bars-bar')} + {...extractLayerProps(restProps, 'lc-bars-bar')} /> {/each} {/if} diff --git a/packages/layerchart/src/lib/components/Blur.svelte b/packages/layerchart/src/lib/components/Blur.svelte index fd76b7f31..d7485adb4 100644 --- a/packages/layerchart/src/lib/components/Blur.svelte +++ b/packages/layerchart/src/lib/components/Blur.svelte @@ -24,7 +24,6 @@ import type { Snippet } from 'svelte'; import { getRenderContext } from './Chart.svelte'; import { createId } from '$lib/utils/createId.js'; - import { layerClass } from '$lib/utils/attributes.js'; const uid = $props.id(); @@ -35,13 +34,13 @@ {#if renderContext === 'svg'} - + {#if children} - + {@render children()} {/if} diff --git a/packages/layerchart/src/lib/components/BrushContext.svelte b/packages/layerchart/src/lib/components/BrushContext.svelte index b31e2404c..1eaee348e 100644 --- a/packages/layerchart/src/lib/components/BrushContext.svelte +++ b/packages/layerchart/src/lib/components/BrushContext.svelte @@ -148,7 +148,6 @@ import type { HTMLAttributes } from 'svelte/elements'; import { getChartContext } from './Chart.svelte'; import type { Snippet } from 'svelte'; - import { layerClass } from '$lib/utils/attributes.js'; const ctx = getChartContext(); @@ -463,7 +462,6 @@ {#if disabled} {@render children?.({ brushContext })} {:else} - {@const handleClass = layerClass('brush-handle')}
selectAll()} >
reset()} >
@@ -511,14 +503,7 @@ style:width="{_range.width}px" style:height="{handleSize}px" data-position="top" - class={cls( - handleClass, - 'cursor-ns-resize select-none', - 'range absolute', - 'z-10', - classes.handle, - handle?.class - )} + class={cls('lc-brush-handle', classes.handle, handle?.class)} onpointerdown={adjustTop} ondblclick={(e) => { e.stopPropagation(); @@ -536,15 +521,7 @@ style:width="{_range.width}px" style:height="{handleSize}px" data-position="bottom" - class={cls( - handleClass, - 'handle bottom', - 'cursor-ns-resize select-none', - 'range absolute', - 'z-10', - classes.handle, - handle?.class - )} + class={cls('lc-brush-handle', classes.handle, handle?.class)} onpointerdown={adjustBottom} ondblclick={(e) => { e.stopPropagation(); @@ -564,14 +541,7 @@ style:width="{handleSize}px" style:height="{_range.height}px" data-position="left" - class={cls( - handleClass, - 'cursor-ew-resize select-none', - 'range absolute', - 'z-10', - classes.handle, - handle?.class - )} + class={cls('lc-brush-handle', classes.handle, handle?.class)} onpointerdown={adjustLeft} ondblclick={(e) => { e.stopPropagation(); @@ -589,14 +559,7 @@ style:width="{handleSize}px" style:height="{_range.height}px" data-position="right" - class={cls( - handleClass, - 'cursor-ew-resize select-none', - 'range absolute', - 'z-10', - classes.handle, - handle?.class - )} + class={cls('lc-brush-handle', classes.handle, handle?.class)} onpointerdown={adjustRight} ondblclick={(e) => { e.stopPropagation(); @@ -610,3 +573,40 @@ {/if}
{/if} + + diff --git a/packages/layerchart/src/lib/components/Calendar.svelte b/packages/layerchart/src/lib/components/Calendar.svelte index f67e127f2..c7bab0db8 100644 --- a/packages/layerchart/src/lib/components/Calendar.svelte +++ b/packages/layerchart/src/lib/components/Calendar.svelte @@ -128,14 +128,15 @@ fill={cell.color} onpointermove={(e) => tooltip?.show(e, cell.data)} onpointerleave={(e) => tooltip?.hide()} - {...extractLayerProps(restProps, 'calendar-cell', 'stroke-surface-content/5')} + strokeWidth={1} + {...extractLayerProps(restProps, 'lc-calendar-cell')} /> {/each} {/if} {#if monthPath} {#each yearMonths as date} - + {/each} {/if} @@ -143,9 +144,25 @@ {#each yearMonths as date} {/each} {/if} + + diff --git a/packages/layerchart/src/lib/components/Chart.svelte b/packages/layerchart/src/lib/components/Chart.svelte index d781f81f4..cce083856 100644 --- a/packages/layerchart/src/lib/components/Chart.svelte +++ b/packages/layerchart/src/lib/components/Chart.svelte @@ -41,7 +41,6 @@ import { geoFitObjectTransform } from '$lib/utils/geo.js'; import TransformContext, { type TransformContextValue } from './TransformContext.svelte'; import BrushContext, { type BrushContextValue } from './BrushContext.svelte'; - import { layerClass } from '$lib/utils/attributes.js'; import type { TimeInterval } from 'd3-time'; const defaultPadding = { top: 0, right: 0, bottom: 0, left: 0 }; @@ -1394,7 +1393,7 @@ style:pointer-events={pointerEvents === false ? 'none' : null} bind:clientWidth={containerWidth} bind:clientHeight={containerHeight} - class={layerClass('root-container')} + class="lc-root-container" > {#key isMounted} diff --git a/packages/layerchart/src/lib/components/ChartClipPath.svelte b/packages/layerchart/src/lib/components/ChartClipPath.svelte index 0f3799018..e888e7d1f 100644 --- a/packages/layerchart/src/lib/components/ChartClipPath.svelte +++ b/packages/layerchart/src/lib/components/ChartClipPath.svelte @@ -41,5 +41,5 @@ {disabled} height={ctx.height + (full ? (ctx.padding?.top ?? 0) + (ctx.padding?.bottom ?? 0) : 0)} width={ctx.width + (full ? (ctx.padding?.left ?? 0) + (ctx.padding?.right ?? 0) : 0)} - {...extractLayerProps(restProps, 'chart-clip-path')} + {...extractLayerProps(restProps, 'lc-chart-clip-path')} /> diff --git a/packages/layerchart/src/lib/components/Circle.svelte b/packages/layerchart/src/lib/components/Circle.svelte index 6955c549e..eab4c0542 100644 --- a/packages/layerchart/src/lib/components/Circle.svelte +++ b/packages/layerchart/src/lib/components/Circle.svelte @@ -68,7 +68,6 @@ import { renderCircle, type ComputedStylesOptions } from '$lib/utils/canvas.js'; import type { SVGAttributes } from 'svelte/elements'; import { createKey } from '$lib/utils/key.svelte.js'; - import { layerClass } from '$lib/utils/attributes.js'; let { cx = 0, @@ -115,7 +114,7 @@ ? merge({ styles: { strokeWidth } }, styleOverrides) : { styles: { fill, fillOpacity, stroke, strokeWidth, opacity }, - classes: className, + classes: cls('lc-circle', className), } ); } @@ -161,7 +160,49 @@ {stroke} stroke-width={strokeWidth} {opacity} - class={cls(layerClass('circle'), fill == null && 'fill-surface-content', className)} + class={cls('lc-circle', className)} {...restProps} /> +{:else if renderCtx === 'html'} +
{/if} + + diff --git a/packages/layerchart/src/lib/components/CircleClipPath.svelte b/packages/layerchart/src/lib/components/CircleClipPath.svelte index 0b1a52007..144a2627f 100644 --- a/packages/layerchart/src/lib/components/CircleClipPath.svelte +++ b/packages/layerchart/src/lib/components/CircleClipPath.svelte @@ -80,6 +80,13 @@ {#snippet clip()} - + {/snippet} diff --git a/packages/layerchart/src/lib/components/ClipPath.svelte b/packages/layerchart/src/lib/components/ClipPath.svelte index 64dc9e026..bd19a6891 100644 --- a/packages/layerchart/src/lib/components/ClipPath.svelte +++ b/packages/layerchart/src/lib/components/ClipPath.svelte @@ -1,7 +1,6 @@
(styles = _styles)} >
{@render children?.({ styles })} + + diff --git a/packages/layerchart/src/lib/components/Connector.svelte b/packages/layerchart/src/lib/components/Connector.svelte index 9d47fc1b5..8c3dc2b2a 100644 --- a/packages/layerchart/src/lib/components/Connector.svelte +++ b/packages/layerchart/src/lib/components/Connector.svelte @@ -141,7 +141,7 @@ marker-start={markerStartId ? `url(#${markerStartId})` : undefined} marker-mid={markerMidId ? `url(#${markerMidId})` : undefined} marker-end={markerEndId ? `url(#${markerEndId})` : undefined} - {...extractLayerProps(restProps, 'connector')} + {...extractLayerProps(restProps, 'lc-connector')} {...restProps} /> diff --git a/packages/layerchart/src/lib/components/Ellipse.svelte b/packages/layerchart/src/lib/components/Ellipse.svelte index 3bde17ec2..e3947e2ea 100644 --- a/packages/layerchart/src/lib/components/Ellipse.svelte +++ b/packages/layerchart/src/lib/components/Ellipse.svelte @@ -82,7 +82,6 @@ import { renderEllipse, type ComputedStylesOptions } from '$lib/utils/canvas.js'; import type { SVGAttributes } from 'svelte/elements'; import { createKey } from '$lib/utils/key.svelte.js'; - import { layerClass } from '$lib/utils/attributes.js'; let { cx = 0, @@ -133,7 +132,7 @@ ? merge({ styles: { strokeWidth } }, styleOverrides) : { styles: { fill, fillOpacity, stroke, strokeWidth, opacity }, - classes: className, + classes: cls('lc-ellipse', className), } ); } @@ -181,7 +180,49 @@ {stroke} stroke-width={strokeWidth} {opacity} - class={cls(layerClass('ellipse'), fill == null && 'fill-surface-content', className)} + class={cls('lc-ellipse', className)} {...restProps} /> +{:else if renderCtx === 'html'} +
{/if} + + diff --git a/packages/layerchart/src/lib/components/Frame.svelte b/packages/layerchart/src/lib/components/Frame.svelte index 01cc160f4..112ffa0ce 100644 --- a/packages/layerchart/src/lib/components/Frame.svelte +++ b/packages/layerchart/src/lib/components/Frame.svelte @@ -37,5 +37,5 @@ width={ctx.width + (full ? (ctx.padding?.left ?? 0) + (ctx.padding?.right ?? 0) : 0)} height={ctx.height + (full ? (ctx.padding?.top ?? 0) + (ctx.padding?.bottom ?? 0) : 0)} bind:ref - {...extractLayerProps(restProps, 'frame')} + {...extractLayerProps(restProps, 'lc-frame')} /> diff --git a/packages/layerchart/src/lib/components/GeoCircle.svelte b/packages/layerchart/src/lib/components/GeoCircle.svelte index 42a8afe7f..6b4cf7b5a 100644 --- a/packages/layerchart/src/lib/components/GeoCircle.svelte +++ b/packages/layerchart/src/lib/components/GeoCircle.svelte @@ -34,4 +34,4 @@ const geojson = $derived(geoCircle().radius(radius).center(center).precision(precision)()); - + diff --git a/packages/layerchart/src/lib/components/GeoEdgeFade.svelte b/packages/layerchart/src/lib/components/GeoEdgeFade.svelte index 8a5e049ff..ea1c848ab 100644 --- a/packages/layerchart/src/lib/components/GeoEdgeFade.svelte +++ b/packages/layerchart/src/lib/components/GeoEdgeFade.svelte @@ -56,6 +56,6 @@ const opacity = $derived(opacityProp ?? clamper(fade(distance))); - + {@render children?.()} diff --git a/packages/layerchart/src/lib/components/GeoPath.svelte b/packages/layerchart/src/lib/components/GeoPath.svelte index 11003b66f..9df491200 100644 --- a/packages/layerchart/src/lib/components/GeoPath.svelte +++ b/packages/layerchart/src/lib/components/GeoPath.svelte @@ -66,7 +66,6 @@ - + {#if !lines && !outline} - + {/if} {#if lines} {#each graticule.lines() as line} - + {/each} {/if} {#if outline} {/if} diff --git a/packages/layerchart/src/lib/components/Grid.svelte b/packages/layerchart/src/lib/components/Grid.svelte index 5445d8e17..eec7034be 100644 --- a/packages/layerchart/src/lib/components/Grid.svelte +++ b/packages/layerchart/src/lib/components/Grid.svelte @@ -98,7 +98,7 @@ import Rule from './Rule.svelte'; import Spline from './Spline.svelte'; import { getChartContext } from './Chart.svelte'; - import { extractLayerProps, layerClass } from '$lib/utils/attributes.js'; + import { extractLayerProps } from '$lib/utils/attributes.js'; import { autoTickVals, type TicksConfig } from '$lib/utils/ticks.js'; const ctx = getChartContext(); @@ -151,11 +151,11 @@ ); - + {#if x} - {@const splineProps = extractLayerProps(x, 'grid-x-line')} + {@const splineProps = extractLayerProps(x, 'lc-grid-x-line')} - + {#each xTickVals as x (x)} {#if ctx.radial} {@const [x1, y1] = pointRadial(ctx.xScale(x), ctx.yRange[0])} @@ -167,12 +167,7 @@ {y2} motion={tweenConfig} {...splineProps} - class={cls( - layerClass('grid-x-radial-line'), - 'stroke-surface-content/10', - classes.line, - splineProps?.class - )} + class={cls('lc-grid-x-radial-line', classes.line, splineProps?.class)} /> {:else} {/if} {/each} {#if isScaleBand(ctx.xScale) && bandAlign === 'between' && !ctx.radial && xTickVals.length} + {@const x = ctx.xScale(xTickVals[xTickVals.length - 1])! + ctx.xScale.step() + xBandOffset} {/if} {/if} {#if y} - {@const splineProps = extractLayerProps(y, 'grid-y-line')} - + {@const splineProps = extractLayerProps(y, 'lc-grid-y-line')} + {#each yTickVals as y (y)} {#if ctx.radial} {#if radialY === 'circle'} @@ -218,12 +204,7 @@ r={ctx.yScale(y) + yBandOffset} {motion} {...splineProps} - class={cls( - layerClass('grid-y-radial-circle'), - 'fill-none stroke-surface-content/10', - classes.line, - splineProps?.class - )} + class={cls('lc-grid-y-radial-circle', classes.line, splineProps?.class)} /> {:else} {/if} {:else} - {/if} {/each} @@ -264,28 +237,52 @@ r={ctx.yScale(yTickVals[yTickVals.length - 1])! + ctx.yScale.step() + yBandOffset} {motion} {...splineProps} - class={cls( - layerClass('grid-y-radial-circle'), - 'fill-none stroke-surface-content/10', - classes.line, - splineProps?.class - )} + class={cls('lc-grid-y-radial-circle', classes.line, splineProps?.class)} /> {:else} - {/if} {/if} {/if} + + diff --git a/packages/layerchart/src/lib/components/Group.svelte b/packages/layerchart/src/lib/components/Group.svelte index 8d756fd7f..cbfbdaaa8 100644 --- a/packages/layerchart/src/lib/components/Group.svelte +++ b/packages/layerchart/src/lib/components/Group.svelte @@ -83,13 +83,10 @@ import { fade } from 'svelte/transition'; import { cubicIn } from 'svelte/easing'; - import { cls } from '@layerstack/tailwind'; - import { getRenderContext } from './Chart.svelte'; import { registerCanvasComponent } from './layout/Canvas.svelte'; import { getChartContext } from './Chart.svelte'; - import { layerClass } from '$lib/utils/attributes.js'; const ctx = getChartContext(); @@ -178,7 +175,7 @@ {:else if renderCtx === 'svg'} {@render children?.()} -{:else} +{:else if renderCtx === 'html'}
{@render children?.()}
{/if} + + diff --git a/packages/layerchart/src/lib/components/Highlight.svelte b/packages/layerchart/src/lib/components/Highlight.svelte index c8fa85f74..00551c312 100644 --- a/packages/layerchart/src/lib/components/Highlight.svelte +++ b/packages/layerchart/src/lib/components/Highlight.svelte @@ -101,6 +101,11 @@ */ motion?: MotionProp; + /** + * The opacity of the element. (0 to 1) + */ + opacity?: number; + onAreaClick?: (e: MouseEvent, detail: { data: any }) => void; onBarClick?: (e: MouseEvent, detail: { data: any }) => void; @@ -114,7 +119,6 @@ import { max, min } from 'd3-array'; import { pointRadial, type Series, type SeriesPoint } from 'd3-shape'; import { notNull } from '@layerstack/utils'; - import { cls } from '@layerstack/tailwind'; import { isScaleBand, isScaleTime } from '$lib/utils/scales.svelte.js'; import { asAny } from '$lib/utils/types.js'; @@ -136,6 +140,7 @@ lines: linesProp = false, area = false, bar = false, + opacity, motion = 'spring', onAreaClick, onBarClick, @@ -435,11 +440,6 @@ return tmpPoints; } ); - - const areaProps = $derived(extractLayerProps(area, 'highlight-area')); - const barProps = $derived(extractLayerProps(bar, 'highlight-bar')); - const linesProps = $derived(extractLayerProps(linesProp, 'highlight-line')); - const pointsProps = $derived(extractLayerProps(points, 'highlight-point')); {#if highlightData} @@ -454,15 +454,16 @@ endAngle={_area.x + _area.width} innerRadius={_area.y} outerRadius={_area.y + _area.height} - class={cls(!areaProps.fill && 'fill-surface-content/5', areaProps.class)} + {opacity} + class="lc-highlight-area" onclick={onAreaClick && ((e) => onAreaClick(e, { data: highlightData }))} /> {:else} onAreaClick(e, { data: highlightData }))} /> {/if} @@ -475,8 +476,8 @@ onBarClick(e, { data: highlightData }))} /> {/if} @@ -493,11 +494,8 @@ y1={line.y1} x2={line.x2} y2={line.y2} - {...linesProps} - class={cls( - 'stroke-surface-content/20 stroke-2 [stroke-dasharray:2,2] pointer-events-none', - linesProps.class - )} + {opacity} + {...extractLayerProps(linesProp, 'lc-highlight-line')} /> {/each} {/if} @@ -515,12 +513,8 @@ fill={point.fill} r={4} strokeWidth={6} - {...pointsProps} - class={cls( - 'stroke-white [paint-order:stroke] drop-shadow-sm', - !point.fill && (typeof points === 'boolean' || !points.fill) && 'fill-primary', - pointsProps.class - )} + {opacity} + {...extractLayerProps(points, 'lc-highlight-point')} onpointerdown={onPointClick && ((e) => { // Do not propagate `pointerdown` event to `BrushContext` if `onclick` is provided @@ -546,3 +540,33 @@ {/if} {/if} {/if} + + diff --git a/packages/layerchart/src/lib/components/Hull.svelte b/packages/layerchart/src/lib/components/Hull.svelte index 48166604d..516a21247 100644 --- a/packages/layerchart/src/lib/components/Hull.svelte +++ b/packages/layerchart/src/lib/components/Hull.svelte @@ -65,7 +65,6 @@ import Spline from './Spline.svelte'; import { getChartContext } from './Chart.svelte'; import { getGeoContext } from './GeoContext.svelte'; - import { layerClass } from '$lib/utils/attributes.js'; let { data, @@ -104,13 +103,13 @@ ); - + {#if geoCtx.projection} {@const polygon = geoVoronoi().hull(points)} onclick?.(e, { points, polygon })} onpointermove={(e) => onpointermove?.(e, { points, polygon })} {onpointerleave} @@ -123,10 +122,18 @@ x={(d) => d[0]} y={(d) => d[1]} {curve} - class={cls(layerClass('hull-class'), 'fill-transparent', classes.path)} + class={['lc-hull-class', classes.path]} onclick={(e) => onclick?.(e, { points, polygon })} onpointermove={(e) => onpointermove?.(e, { points, polygon })} {onpointerleave} /> {/if} + + diff --git a/packages/layerchart/src/lib/components/Labels.svelte b/packages/layerchart/src/lib/components/Labels.svelte index 3f31ca58f..404ae1b44 100644 --- a/packages/layerchart/src/lib/components/Labels.svelte +++ b/packages/layerchart/src/lib/components/Labels.svelte @@ -74,7 +74,7 @@ import { isScaleBand } from '$lib/utils/scales.svelte.js'; import { getChartContext } from './Chart.svelte'; import Group from './Group.svelte'; - import { extractLayerProps, layerClass } from '$lib/utils/attributes.js'; + import { extractLayerProps } from '$lib/utils/attributes.js'; const ctx = getChartContext(); @@ -174,28 +174,38 @@ } - + {#snippet children({ points })} {#each points as point, i (key(point.data, i))} - {@const textProps = extractLayerProps(getTextProps(point), 'labels-text')} + {@const textProps = extractLayerProps(getTextProps(point), 'lc-labels-text')} {#if childrenProp} {@render childrenProp({ data: point, textProps })} {:else} {/if} {/each} {/snippet} + + diff --git a/packages/layerchart/src/lib/components/Legend.svelte b/packages/layerchart/src/lib/components/Legend.svelte index 35fcd1883..998b78360 100644 --- a/packages/layerchart/src/lib/components/Legend.svelte +++ b/packages/layerchart/src/lib/components/Legend.svelte @@ -65,10 +65,6 @@ */ orientation?: 'horizontal' | 'vertical'; - onclick?: (e: MouseEvent, detail: LegendItem) => any; - onpointerenter?: (e: MouseEvent, detail: LegendItem) => any; - onpointerleave?: (e: MouseEvent, detail: LegendItem) => any; - /** * Determine display ramp (individual color swatches or continuous ramp) * @@ -76,6 +72,11 @@ */ variant?: 'ramp' | 'swatches'; + /** + * An array of selected items. If provided, the legend fades unselected items. + */ + selected?: string[]; + /** * Classes to apply to the elements. * @@ -91,6 +92,10 @@ item?: string | ((item: LegendItem) => string); }; + onclick?: (e: MouseEvent, detail: LegendItem) => any; + onpointerenter?: (e: MouseEvent, detail: LegendItem) => any; + onpointerleave?: (e: MouseEvent, detail: LegendItem) => any; + /** * A bindable reference to the wrapping `
` element. * @@ -116,7 +121,8 @@ import { cls } from '@layerstack/tailwind'; import type { AnyScale } from '$lib/utils/scales.svelte.js'; import { getChartContext } from './Chart.svelte'; - import { extractLayerProps, layerClass } from '$lib/utils/attributes.js'; + import { extractLayerProps } from '$lib/utils/attributes.js'; + import { resolveMaybeFn } from '$lib/utils/common.js'; let { scale: scaleProp, @@ -134,6 +140,7 @@ onpointerenter, onpointerleave, variant = 'ramp', + selected = [], classes = {}, ref: refProp = $bindable(), class: className, @@ -296,29 +303,9 @@ bind:this={ref} {...restProps} data-placement={placement} - class={cls( - layerClass('legend-container'), - 'inline-block', - 'z-1', // stack above tooltip context layers (band rects, voronoi, ...) - placement && [ - 'absolute', - { - 'top-left': 'top-0 left-0', - top: 'top-0 left-1/2 -translate-x-1/2', - 'top-right': 'top-0 right-0', - left: 'top-1/2 left-0 -translate-y-1/2', - center: 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2', - right: 'top-1/2 right-0 -translate-y-1/2', - 'bottom-left': 'bottom-0 left-0', - bottom: 'bottom-0 left-1/2 -translate-x-1/2', - 'bottom-right': 'bottom-0 right-0', - }[placement], - ], - className, - classes.root - )} + class={cls('lc-legend-container', className, classes.root)} > -
+
{title}
{#if children} @@ -331,35 +318,31 @@ {width} height={height + tickLengthProp + tickFontSize} viewBox="0 0 {width} {height + tickLengthProp + tickFontSize}" - class={cls(layerClass('legend-ramp-svg'), 'overflow-visible')} + class={cls('lc-legend-ramp-svg')} > - + {#if scaleConfig.interpolator} {:else if scaleConfig.swatches} {#each scaleConfig.swatches as swatch, i} - + {/each} {/if} - + {#each tickValuesProp ?? scaleConfig.xScale?.ticks?.(ticks) ?? [] as tick, i} {tickFormatProp ? format(tick, asAny(tickFormatProp)) : tick} @@ -371,50 +354,26 @@ y1={0} x2={scaleConfig.xScale?.(tick)} y2={height + tickLengthProp} - class={cls(layerClass('legend-tick-line'), 'stroke-surface-content', classes.tick)} + class={cls('lc-legend-tick-line', classes.tick)} /> {/if} {/each} {:else if variant === 'swatches'} -
+
{#each scaleConfig.tickValues ?? scaleConfig.xScale?.ticks?.(ticks) ?? [] as tick} {@const color = scale?.(tick) ?? ''} {@const item = { value: tick, color }}
+ + diff --git a/packages/layerchart/src/lib/components/Line.svelte b/packages/layerchart/src/lib/components/Line.svelte index 57bf344b2..66c185915 100644 --- a/packages/layerchart/src/lib/components/Line.svelte +++ b/packages/layerchart/src/lib/components/Line.svelte @@ -4,6 +4,7 @@ import { renderPathData, type ComputedStylesOptions } from '$lib/utils/canvas.js'; import MarkerWrapper, { type MarkerOptions } from './MarkerWrapper.svelte'; import type { CommonStyleProps, Without } from '$lib/utils/types.js'; + import { pointsToAngleAndLength } from '$lib/utils/math.js'; export type LinePropsWithoutHTML = { /** @@ -98,7 +99,6 @@ import { createKey } from '$lib/utils/key.svelte.js'; import { createId } from '$lib/utils/createId.js'; - import { layerClass } from '$lib/utils/attributes.js'; const uid = $props.id(); @@ -148,7 +148,7 @@ ? merge({ styles: { strokeWidth } }, styleOverrides) : { styles: { fill, stroke, strokeWidth, opacity }, - classes: className, + classes: cls('lc-line', className), } ); } @@ -195,10 +195,47 @@ marker-start={markerStartId ? `url(#${markerStartId})` : undefined} marker-mid={markerMidId ? `url(#${markerMidId})` : undefined} marker-end={markerEndId ? `url(#${markerEndId})` : undefined} - class={cls(layerClass('line'), stroke === undefined && 'stroke-surface-content', className)} + class={cls('lc-line', className)} {...restProps} /> +{:else if renderCtx === 'html'} + {@const { angle, length } = pointsToAngleAndLength( + { x: motionX1.current, y: motionY1.current }, + { x: motionX2.current, y: motionY2.current } + )} + +
{/if} + + diff --git a/packages/layerchart/src/lib/components/LinearGradient.svelte b/packages/layerchart/src/lib/components/LinearGradient.svelte index f3b9f2fba..1e1068a05 100644 --- a/packages/layerchart/src/lib/components/LinearGradient.svelte +++ b/packages/layerchart/src/lib/components/LinearGradient.svelte @@ -81,7 +81,7 @@ import { createLinearGradient, getComputedStyles } from '../utils/canvas.js'; import { parsePercent } from '../utils/math.js'; import { createId } from '$lib/utils/createId.js'; - import { extractLayerProps, layerClass } from '$lib/utils/attributes.js'; + import { extractLayerProps } from '$lib/utils/attributes.js'; import { cls } from '@layerstack/tailwind'; const uid = $props.id(); @@ -113,6 +113,35 @@ let canvasGradient = $state(); + function createCSSGradient(): string { + if (!stops?.length) return ''; + + let direction: string; + if (rotate !== undefined) { + // Convert SVG rotation to CSS linear-gradient angle + // SVG: rotate(0) on horizontal gradient = left-to-right = CSS 90deg + // SVG: rotate(0) on vertical gradient = top-to-bottom = CSS 180deg + const baseAngle = vertical ? 180 : 90; + const cssAngle = baseAngle + rotate; + direction = `${cssAngle}deg`; + } else { + // Use direction keywords when no rotation is specified + direction = vertical ? 'to bottom' : 'to right'; + } + + const cssStops = stops + .map((stop, i) => { + if (Array.isArray(stop)) { + return `${stop[1]} ${stop[0]}`; + } else { + return `${stop} ${i * (100 / (stops.length - 1))}%`; + } + }) + .join(', '); + + return `linear-gradient(${direction}, ${cssStops})`; + } + function render(_ctx: CanvasRenderingContext2D) { // Use `getComputedStyles()` to convert each stop (if using CSS variables and/or classes) to color values const _stops = stops.map((stop, i) => { @@ -170,7 +199,7 @@ {y2} gradientTransform={rotate ? `rotate(${rotate})` : ''} gradientUnits={units} - {...extractLayerProps(restProps, 'linear-gradient')} + {...extractLayerProps(restProps, 'lc-linear-gradient')} > {#if stopsContent} {@render stopsContent?.()} @@ -180,13 +209,13 @@ {:else} {/if} {/each} @@ -195,4 +224,6 @@ {@render children?.({ id, gradient: `url(#${id})` })} +{:else if renderCtx === 'html'} + {@render children?.({ id, gradient: createCSSGradient() })} {/if} diff --git a/packages/layerchart/src/lib/components/Link.svelte b/packages/layerchart/src/lib/components/Link.svelte index 7ce96773d..3b88987d0 100644 --- a/packages/layerchart/src/lib/components/Link.svelte +++ b/packages/layerchart/src/lib/components/Link.svelte @@ -173,5 +173,5 @@ TODO: {type} {curve} {sweep} - {...extractLayerProps(restProps, 'link')} + {...extractLayerProps(restProps, 'lc-link')} /> diff --git a/packages/layerchart/src/lib/components/Marker.svelte b/packages/layerchart/src/lib/components/Marker.svelte index d3f356eef..2efb45266 100644 --- a/packages/layerchart/src/lib/components/Marker.svelte +++ b/packages/layerchart/src/lib/components/Marker.svelte @@ -73,7 +73,6 @@ - + {#each lines as line} - {@const stroke = line.stroke} + {@const stroke = line.stroke ?? strokeProp} {#if ctx.radial} {#if line.axis === 'x'} @@ -203,23 +202,10 @@ {x2} {y2} {stroke} - class={cls( - layerClass('rule-x-radial-line'), - !stroke && 'stroke-surface-content/10', - className - )} + class={cls('lc-rule-x-radial-line', className)} /> {:else if line.axis === 'y'} - + {/if} {:else} {/if} {/each} + + diff --git a/packages/layerchart/src/lib/components/Spline.svelte b/packages/layerchart/src/lib/components/Spline.svelte index 33953342b..c5fb4cf0e 100644 --- a/packages/layerchart/src/lib/components/Spline.svelte +++ b/packages/layerchart/src/lib/components/Spline.svelte @@ -132,7 +132,6 @@ import { getChartContext } from './Chart.svelte'; import { createKey } from '$lib/utils/key.svelte.js'; import { createId } from '$lib/utils/createId.js'; - import { layerClass } from '$lib/utils/attributes.js'; const ctx = getChartContext(); @@ -274,7 +273,7 @@ ? merge({ styles: { strokeWidth } }, styleOverrides) : { styles: { fill, fillOpacity, stroke, strokeWidth, opacity }, - classes: className, + classes: cls('lc-spline-path', className), } ); } @@ -362,12 +361,7 @@ {#if startContent && startPoint} - + {@render startContent({ point: startPoint, value: { @@ -396,7 +390,7 @@ {/if} {#if endContent && endPoint.current} - + {@render endContent({ point: endPoint.current, value: { @@ -408,3 +402,28 @@ {/if} {/key} {/if} + + diff --git a/packages/layerchart/src/lib/components/Text.svelte b/packages/layerchart/src/lib/components/Text.svelte index b993cc910..fb09924db 100644 --- a/packages/layerchart/src/lib/components/Text.svelte +++ b/packages/layerchart/src/lib/components/Text.svelte @@ -188,7 +188,6 @@ import { getComputedStyles, renderText, type ComputedStylesOptions } from '../utils/canvas.js'; import { createKey } from '$lib/utils/key.svelte.js'; - import { layerClass } from '$lib/utils/attributes.js'; import { degreesToRadians } from '$lib/utils/math.js'; import { createId } from '$lib/utils/createId.js'; @@ -411,7 +410,7 @@ paintOrder: 'stroke', textAnchor, }, - classes: cls(fill === undefined && 'fill-surface-content', className), + classes: cls('lc-text', className), }; const computedStyles = getComputedStyles(ctx.canvas, styles); @@ -473,13 +472,7 @@ {#if renderCtx === 'svg'} - + {#if path} {#key path} @@ -496,14 +489,14 @@ stroke-width={strokeWidth} {opacity} transform={transformProp} - class={cls(layerClass('text'), fill === undefined && 'fill-surface-content', className)} + class={['lc-text', className]} > {wordsByLines.map((line) => line.words.join(' ')).join()} @@ -522,13 +515,13 @@ {stroke} stroke-width={strokeWidth} {opacity} - class={cls(layerClass('text'), fill === undefined && 'fill-surface-content', className)} + class={['lc-text', className]} > {#each wordsByLines as line, index} {line.words.join(' ')} @@ -536,4 +529,57 @@ {/if} +{:else if renderCtx === 'html'} + {@const translateX = textAnchor === 'middle' ? '-50%' : textAnchor === 'end' ? '-100%' : '0%'} + {@const translateY = + verticalAnchor === 'middle' ? '-50%' : verticalAnchor === 'end' ? '-100%' : '0%'} + + + +
+ {textValue} +
{/if} + + diff --git a/packages/layerchart/src/lib/components/TileImage.svelte b/packages/layerchart/src/lib/components/TileImage.svelte index 90d2ab822..62899cdcb 100644 --- a/packages/layerchart/src/lib/components/TileImage.svelte +++ b/packages/layerchart/src/lib/components/TileImage.svelte @@ -135,7 +135,7 @@ y={(y + ty) * scale - 0.5} width={scale + 1} height={scale + 1} - {...extractLayerProps(restProps, 'tile-image-lower')} + {...extractLayerProps(restProps, 'lc-tile-image-lower')} /> {/key} {#if debug} @@ -152,7 +152,7 @@ y={(y + ty) * scale} width={scale} height={scale} - class="stroke-danger/50 fill-none" + class="lc-tile-image-debug-rect" /> {/if} + + diff --git a/packages/layerchart/src/lib/components/TransformContext.svelte b/packages/layerchart/src/lib/components/TransformContext.svelte index fdba70095..d5502c8f2 100644 --- a/packages/layerchart/src/lib/components/TransformContext.svelte +++ b/packages/layerchart/src/lib/components/TransformContext.svelte @@ -216,8 +216,6 @@ import type { Without } from '$lib/utils/types.js'; import { getChartContext } from './Chart.svelte'; import type { Snippet } from 'svelte'; - import { cls } from '@layerstack/tailwind'; - import { layerClass } from '$lib/utils/attributes.js'; import { createControlledMotion, createMotionTracker, @@ -519,9 +517,17 @@ onpointerup={onPointerUp} ondblclick={onDoubleClick} onclickcapture={onClick} - class={cls(layerClass('transform-context'), 'h-full', className)} + class={['lc-transform-context', className]} bind:this={ref} {...restProps} > {@render children?.({ transformContext: transformContext })}
+ + diff --git a/packages/layerchart/src/lib/components/TransformControls.svelte b/packages/layerchart/src/lib/components/TransformControls.svelte index f5c740c09..74dba7937 100644 --- a/packages/layerchart/src/lib/components/TransformControls.svelte +++ b/packages/layerchart/src/lib/components/TransformControls.svelte @@ -32,7 +32,6 @@ - + {#if geo.projection} {@const polygons = geoVoronoi().polygons(points)} {#each polygons.features as feature} @@ -131,11 +129,7 @@ > onclick?.(e, { data: feature.properties.site.data, feature })} onpointerenter={(e) => onpointerenter?.(e, { data: feature.properties.site.data, feature })} @@ -158,11 +152,7 @@ onclick?.(e, { data: point.data, point })} onpointerenter={(e) => onpointerenter?.(e, { data: point.data, point })} onpointermove={(e) => onpointermove?.(e, { data: point.data, point })} @@ -178,3 +168,12 @@ {/each} {/if} + + diff --git a/packages/layerchart/src/lib/components/charts/ArcChart.svelte b/packages/layerchart/src/lib/components/charts/ArcChart.svelte index 06e11d2b1..a23b2b55f 100644 --- a/packages/layerchart/src/lib/components/charts/ArcChart.svelte +++ b/packages/layerchart/src/lib/components/charts/ArcChart.svelte @@ -124,7 +124,6 @@ import { sum } from 'd3-array'; import { format } from '@layerstack/utils'; import { cls } from '@layerstack/tailwind'; - import { SelectionState } from '@layerstack/svelte-state'; import Arc, { type ArcPropsWithoutHTML } from '../Arc.svelte'; import Chart from '../Chart.svelte'; @@ -133,7 +132,13 @@ import Legend from '../Legend.svelte'; import * as Tooltip from '../tooltip/index.js'; - import { accessor, chartDataArray, type Accessor } from '../../utils/common.js'; + import { + accessor, + chartDataArray, + getObjectOrNull, + resolveMaybeFn, + type Accessor, + } from '../../utils/common.js'; import { asAny } from '../../utils/types.js'; import type { SeriesData, @@ -141,7 +146,8 @@ SimplifiedChartPropsObject, SimplifiedChartSnippet, } from './types.js'; - import { HighlightKey } from './utils.svelte.js'; + import { SeriesState } from '$lib/states/series.svelte.js'; + import { createLegendProps } from './utils.svelte.js'; import { setTooltipMetaContext } from '../tooltip/tooltipMetaContext.js'; import { getColorIfDefined } from '$lib/utils/color.js'; @@ -223,63 +229,32 @@ }); }); - const selectedSeries = new SelectionState(); - - const visibleSeries = $derived( - series.filter((s) => selectedSeries.isEmpty() || selectedSeries.isSelected(s.key)) - ); - - const allSeriesData = $derived( - visibleSeries - .flatMap((s) => - s.data?.map((d) => { - return { seriesKey: s.key, ...d }; - }) - ) - .filter((d) => d) as Array - ); + const seriesState = new SeriesState(() => series); const chartData = $derived( - allSeriesData.length ? allSeriesData : chartDataArray(data) + seriesState.allSeriesData.length ? seriesState.allSeriesData : chartDataArray(data) ) as Array; - const seriesColors = $derived(series.map((s) => s.color).filter((d) => d != null)); - - const highlightKey = new HighlightKey(); - const selectedKeys = new SelectionState(); - const visibleData = $derived( chartData.filter((d) => { const dataKey = keyAccessor(d); - return selectedKeys.isEmpty() || selectedKeys.isSelected(dataKey); + return seriesState.selectedKeys.isEmpty() || seriesState.selectedKeys.isSelected(dataKey); }) ); function getLegendProps(): ComponentProps { - return { - tickFormat: (tick) => { - const item = chartData.find((d) => keyAccessor(d) === tick); - return item ? (labelAccessor(item) ?? tick) : tick; - }, - placement: 'bottom', - variant: 'swatches', - onclick: (e, item) => { - selectedKeys.toggle(item.value); - selectedSeries.toggle(item.value); - }, - onpointerenter: (e, item) => (highlightKey.current = item.value), - onpointerleave: (e) => (highlightKey.current = null), - ...props.legend, - ...(typeof legend === 'object' ? legend : null), - classes: { - item: (item) => - visibleData.length && !visibleData.some((d) => keyAccessor(d) === item.value) - ? 'opacity-50' - : '', - ...props.legend?.classes, - ...(typeof legend === 'object' ? legend.classes : null), + return createLegendProps({ + seriesState, + props: { + tickFormat: (tick) => { + // Use data label instead of series label + const item = chartData.find((d) => keyAccessor(d) === tick); + return item ? (labelAccessor(item) ?? tick) : tick; + }, + ...props.legend, + ...getObjectOrNull(legend), }, - }; + }); } function getGroupProps(): ComponentProps { @@ -317,6 +292,7 @@ multiSeries && (trackOuterRadius ?? 0) < 0 ? i * (trackOuterRadius ?? 0) : trackOuterRadius, fill: s.color ?? context.cScale?.(context.c(d)), track: { fill: s.color ?? context.cScale?.(context.c(d)), fillOpacity: 0.1 }, + opacity: seriesState.isHighlighted(keyAccessor(d), true) ? 1 : 0.1, tooltipContext: context.tooltip, data: d, onclick: (e) => { @@ -326,12 +302,7 @@ }, ...props.arc, ...s.props, - class: cls( - 'transition-opacity', - highlightKey.current && highlightKey.current !== keyAccessor(d) && 'opacity-50', - props.arc?.class, - s.props?.class - ), + class: cls(props.arc?.class, s.props?.class), }; } @@ -357,7 +328,7 @@ return key; }, get visibleSeries() { - return visibleSeries; + return seriesState.visibleSeries; }, }); @@ -369,19 +340,19 @@ x={value} {c} cDomain={chartData.map(keyAccessor)} - cRange={seriesColors.length - ? seriesColors + cRange={seriesState.allSeriesColors.length + ? seriesState.allSeriesColors : c !== key ? chartData.map((d) => cAccessor(d)) : [ - 'var(--color-primary)', - 'var(--color-secondary)', - 'var(--color-info)', - 'var(--color-success)', - 'var(--color-warning)', - 'var(--color-danger)', + 'var(--color-primary, currentColor)', + 'var(--color-secondary, currentColor)', + 'var(--color-info, currentColor)', + 'var(--color-success, currentColor)', + 'var(--color-warning, currentColor)', + 'var(--color-danger, currentColor)', ]} - padding={{ bottom: legend === true ? 32 : 0 }} + padding={{ bottom: legend ? 32 : 0 }} {...restProps} tooltip={tooltip === false ? false @@ -395,10 +366,10 @@ color: cAccessor, context, series, - visibleSeries, + visibleSeries: seriesState.visibleSeries, visibleData, - highlightKey: highlightKey.current, - setHighlightKey: highlightKey.set, + highlightKey: seriesState.highlightKey.current, + setHighlightKey: seriesState.highlightKey.set, getLegendProps, getGroupProps, getArcProps, @@ -452,8 +423,8 @@ value={valueAccessor(data)} color={context.cScale?.(context.c(data))} {format} - onpointerenter={() => (highlightKey.current = keyAccessor(data))} - onpointerleave={() => (highlightKey.current = null)} + onpointerenter={() => (seriesState.highlightKey.current = keyAccessor(data))} + onpointerleave={() => (seriesState.highlightKey.current = null)} {...props.tooltip?.item} /> diff --git a/packages/layerchart/src/lib/components/charts/AreaChart.svelte b/packages/layerchart/src/lib/components/charts/AreaChart.svelte index db1b50b9c..61d1e4c9c 100644 --- a/packages/layerchart/src/lib/components/charts/AreaChart.svelte +++ b/packages/layerchart/src/lib/components/charts/AreaChart.svelte @@ -67,7 +67,6 @@ @@ -83,12 +90,7 @@ import Rule from '../Rule.svelte'; import Spline from '../Spline.svelte'; - import { - accessor, - chartDataArray, - defaultChartPadding, - findRelatedData, - } from '../../utils/common.js'; + import { chartDataArray, defaultChartPadding, findRelatedData } from '../../utils/common.js'; import { asAny } from '../../utils/types.js'; import type { SeriesData, @@ -96,18 +98,22 @@ SimplifiedChartPropsObject, SimplifiedChartSnippet, } from './types.js'; - import { createLegendProps, SeriesState } from './utils.svelte.js'; + import { SeriesState } from '$lib/states/series.svelte.js'; + import { createLegendProps } from './utils.svelte.js'; import { setTooltipMetaContext } from '../tooltip/tooltipMetaContext.js'; - import { layerClass } from '$lib/utils/attributes.js'; import DefaultTooltip from './DefaultTooltip.svelte'; import ChartAnnotations from './ChartAnnotations.svelte'; + import { isScaleTime } from '../../utils/scales.svelte.js'; let { data = [], x: xProp, - y: yProp, + xScale, xDomain, + y: yProp, + yScale, radial = false, + orientation = 'horizontal', series: seriesProp, seriesLayout = 'overlap', axis = true, @@ -137,14 +143,23 @@ ...restProps }: LineChartProps = $props(); + const isVertical = $derived(orientation === 'vertical'); + const series = $derived( seriesProp === undefined ? [ { key: 'default', - label: typeof yProp === 'string' ? yProp : 'value', - value: yProp, - color: 'var(--color-primary)', + + label: isVertical + ? typeof xProp === 'string' + ? xProp + : 'value' + : typeof yProp === 'string' + ? yProp + : 'value', + value: isVertical ? xProp : yProp, + color: 'var(--color-primary, currentColor)', }, ] : seriesProp @@ -160,21 +175,15 @@ function getSplineProps(s: SeriesData, i: number) { const splineProps: ComponentProps = { data: s.data, - y: s.value ?? (s.data ? undefined : s.key), + x: isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, + y: !isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, stroke: s.color, + opacity: + // Checking `visibleSeries.length <= 1` fixes re-animated tweened areas on hover + seriesState.visibleSeries.length <= 1 || seriesState.isHighlighted(s.key, true) ? 1 : 0.1, ...props.spline, ...s.props, - class: cls( - layerClass('line-chart-line'), - 'transition-opacity', - // Checking `visibleSeries.length > 1` fixes re-animated tweened areas on hover - seriesState.visibleSeries.length > 1 && - seriesState.highlightKey.current && - seriesState.highlightKey.current !== s.key && - 'opacity-10', - props.spline?.class, - s.props?.class - ), + class: cls(props.spline?.class, s.props?.class), }; return splineProps; @@ -183,18 +192,14 @@ function getPointsProps(s: SeriesData, i: number) { const pointsProps: ComponentProps = { data: s.data, - y: s.value ?? (s.data ? undefined : s.key), + x: isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, + y: !isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, fill: s.color, + stroke: 'var(--color-surface-100, light-dark(white, black))', + opacity: seriesState.isHighlighted(s.key, true) ? 1 : 0.1, ...props.points, ...(typeof points === 'object' ? points : null), - class: cls( - 'stroke-surface-200 transition-opacity', - seriesState.highlightKey.current && - seriesState.highlightKey.current !== s.key && - 'opacity-10', - props.points?.class, - typeof points === 'object' && points.class - ), + class: cls(props.points?.class, typeof points === 'object' && points.class), }; return pointsProps; @@ -203,26 +208,17 @@ function getLabelsProps(s: SeriesData, i: number) { const labelsProps: ComponentProps> = { data: s.data, - y: s.value ?? (s.data ? undefined : s.key), + x: isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, + y: !isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, + opacity: seriesState.isHighlighted(s.key, true) ? 1 : 0.1, ...props.labels, ...(typeof labels === 'object' ? labels : null), - class: cls( - 'stroke-surface-200 transition-opacity', - seriesState.highlightKey.current && - seriesState.highlightKey.current !== s.key && - 'opacity-10', - props.labels?.class, - typeof labels === 'object' && labels.class - ), + class: cls(props.labels?.class, typeof labels === 'object' && labels.class), }; return labelsProps; } - const highlightPointsProps = $derived( - typeof props.highlight?.points === 'object' ? props.highlight.points : null - ); - function getHighlightProps( s: SeriesData, i: number @@ -230,18 +226,22 @@ if (!context || !context.tooltip.data) return {}; const seriesTooltipData = s.data && context.tooltip.data - ? findRelatedData(s.data, context.tooltip.data, context.x) + ? (findRelatedData(s.data, context.tooltip.data, context.x) ?? {}) : null; + const highlightPointsProps = + typeof props.highlight?.points === 'object' ? props.highlight.points : null; return { data: seriesTooltipData, - y: s.value ?? (s.data ? undefined : s.key), + x: isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, + y: !isVertical ? (s.value ?? (s.data ? undefined : s.key)) : undefined, lines: i === 0, onPointClick: onPointClick ? (e, detail) => onPointClick(e, { ...detail, series: s }) : undefined, onPointEnter: () => (seriesState.highlightKey.current = s.key), onPointLeave: () => (seriesState.highlightKey.current = null), + opacity: seriesState.isHighlighted(s.key, true) ? 1 : 0.1, ...props.highlight, points: props.highlight?.points == false @@ -249,13 +249,6 @@ : { ...highlightPointsProps, fill: s.color, - class: cls( - 'transition-opacity', - seriesState.highlightKey.current && - seriesState.highlightKey.current !== s.key && - 'opacity-10', - highlightPointsProps?.class - ), }, }; } @@ -264,8 +257,8 @@ return createLegendProps({ seriesState, props: { - ...props.legend, ...(typeof legend === 'object' ? legend : null), + ...props.legend, }, }); } @@ -324,18 +317,20 @@ s.value ?? s.key) : undefined)} {xDomain} - y={yProp ?? series.map((s) => s.value ?? s.key)} - yBaseline={0} - yNice + xBaseline={!isVertical || (xScale && isScaleTime(xScale)) ? undefined : 0} + xNice={orientation === 'vertical'} + y={yProp ?? (isVertical ? undefined : series.map((s) => s.value ?? s.key))} + yBaseline={isVertical || (yScale && isScaleTime(yScale)) ? undefined : 0} + yNice={orientation === 'horizontal'} {radial} padding={radial ? undefined : defaultChartPadding(axis, legend)} {...restProps} tooltip={tooltip === false ? false : { - mode: 'quadtree-x', + mode: isVertical ? 'quadtree-y' : 'quadtree-x', onclick: onTooltipClick, debug, ...props.tooltip?.context, diff --git a/packages/layerchart/src/lib/components/charts/PieChart.svelte b/packages/layerchart/src/lib/components/charts/PieChart.svelte index e96549fad..201647a37 100644 --- a/packages/layerchart/src/lib/components/charts/PieChart.svelte +++ b/packages/layerchart/src/lib/components/charts/PieChart.svelte @@ -172,11 +172,11 @@ @@ -394,19 +363,21 @@ x={value} c={key} cDomain={chartData.map(keyAccessor)} - cRange={seriesColors.length - ? seriesColors + cRange={seriesState.allSeriesColors.length + ? seriesState.allSeriesColors : c !== key ? chartData.map((d) => cAccessor(d)) : [ - 'var(--color-primary)', - 'var(--color-secondary)', - 'var(--color-info)', - 'var(--color-success)', - 'var(--color-warning)', - 'var(--color-danger)', + `var(--color-primary, ${schemeObservable10[0]})`, + `var(--color-secondary, ${schemeObservable10[1]})`, + `var(--color-info, ${schemeObservable10[2]})`, + `var(--color-success, ${schemeObservable10[3]})`, + `var(--color-warning, ${schemeObservable10[4]})`, + `var(--color-danger, ${schemeObservable10[5]})`, ]} - padding={{ bottom: legend === true ? 32 : 0 }} + padding={{ + bottom: legend === true || getObjectOrNull(legend)?.placement?.includes('bottom') ? 32 : 0, + }} {...restProps} tooltip={tooltip === false ? false @@ -420,10 +391,10 @@ color: cAccessor, context, series, - visibleSeries, + visibleSeries: seriesState.visibleSeries, visibleData, - highlightKey: highlightKey.current, - setHighlightKey: highlightKey.set, + highlightKey: seriesState.highlightKey.current, + setHighlightKey: seriesState.highlightKey.set, getLegendProps, getGroupProps, }} @@ -444,7 +415,8 @@ {@render marks(snippetProps)} {:else} - {#each visibleSeries as s, seriesIdx (s.key)} + + {#each series as s, seriesIdx (s.key)} {#if typeof pie === 'function'} {@render pie({ ...snippetProps, @@ -496,8 +468,8 @@ value={valueAccessor(data)} color={context.cScale?.(context.c(data))} {format} - onpointerenter={() => (highlightKey.current = keyAccessor(data))} - onpointerleave={() => (highlightKey.current = null)} + onpointerenter={() => (seriesState.highlightKey.current = keyAccessor(data))} + onpointerleave={() => (seriesState.highlightKey.current = null)} {...props.tooltip?.item} /> diff --git a/packages/layerchart/src/lib/components/charts/ScatterChart.svelte b/packages/layerchart/src/lib/components/charts/ScatterChart.svelte index 2fa9c516a..c15a46ed9 100644 --- a/packages/layerchart/src/lib/components/charts/ScatterChart.svelte +++ b/packages/layerchart/src/lib/components/charts/ScatterChart.svelte @@ -61,9 +61,10 @@ import Rule from '../Rule.svelte'; import * as Tooltip from '../tooltip/index.js'; - import { accessor, chartDataArray, defaultChartPadding } from '../../utils/common.js'; + import { chartDataArray, defaultChartPadding } from '../../utils/common.js'; import { asAny } from '../../utils/types.js'; - import { createLegendProps, SeriesState } from './utils.svelte.js'; + import { SeriesState } from '$lib/states/series.svelte.js'; + import { createLegendProps } from './utils.svelte.js'; let { data = [], @@ -117,16 +118,10 @@ return { data: s.data, fill: s.color, + opacity: seriesState.isHighlighted(s.key, true) ? 1 : 0.1, ...props.points, ...s.props, - class: cls( - 'transition-opacity', - seriesState.highlightKey.current && - seriesState.highlightKey.current !== s.key && - 'opacity-10', - props.points?.class, - s.props?.class - ), + class: cls(props.points?.class, s.props?.class), }; } @@ -136,16 +131,10 @@ ): ComponentProps> { return { data: s.data, + opacity: seriesState.isHighlighted(s.key, true) ? 1 : 0.1, ...props.labels, ...(typeof labels === 'object' ? labels : null), - class: cls( - 'stroke-surface-200 transition-opacity', - seriesState.highlightKey.current && - seriesState.highlightKey.current !== s.key && - 'opacity-10', - props.labels?.class, - typeof labels === 'object' && labels.class - ), + class: cls(props.labels?.class, typeof labels === 'object' && labels.class), }; } @@ -230,7 +219,7 @@ {yDomain} yNice c={yProp} - cRange={['var(--color-primary)']} + cRange={['var(--color-primary, currentColor)']} padding={defaultChartPadding(axis, legend)} {...restProps} tooltip={tooltip === false diff --git a/packages/layerchart/src/lib/components/charts/utils.svelte.ts b/packages/layerchart/src/lib/components/charts/utils.svelte.ts index 544d2986d..c97c97c50 100644 --- a/packages/layerchart/src/lib/components/charts/utils.svelte.ts +++ b/packages/layerchart/src/lib/components/charts/utils.svelte.ts @@ -1,53 +1,11 @@ import type { Component, ComponentProps } from 'svelte'; -import { SelectionState } from '@layerstack/svelte-state'; + import { scaleOrdinal } from 'd3-scale'; +import { cls } from '@layerstack/tailwind'; -import type { SeriesData } from './types.js'; import type Legend from '../Legend.svelte'; - -export class HighlightKey { - current = $state['key'] | null>(null); - - set = (seriesKey: typeof this.current) => { - this.current = seriesKey; - }; -} - -export class SeriesState { - #series = $state.raw[]>([]); - selectedSeries = new SelectionState(); - selectedKeys = new SelectionState(); - highlightKey = new HighlightKey(); - - constructor(getSeries: () => SeriesData[]) { - this.#series = getSeries(); - - $effect.pre(() => { - // keep series state in sync with the prop - this.#series = getSeries(); - }); - } - - get series() { - return this.#series; - } - - get isDefaultSeries() { - return this.#series.length === 1 && this.#series[0].key === 'default'; - } - - get allSeriesData() { - return this.#series - .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d }))) - .filter((d) => d) as Array; - } - - get visibleSeries() { - return this.#series.filter( - (s) => this.selectedSeries.isEmpty() || this.selectedSeries.isSelected(s.key) - ); - } -} +import { resolveMaybeFn } from '$lib/utils/common.js'; +import type { SeriesState } from '$lib/states/series.svelte.js'; type CreateLegendPropsOptions = { seriesState: SeriesState; @@ -70,16 +28,15 @@ export function createLegendProps( tickFormat: (key) => opts.seriesState.series.find((s) => s.key === key)?.label ?? key, placement: 'bottom', variant: 'swatches', - onclick: (_, item) => opts.seriesState.selectedSeries.toggle(item.value), + selected: opts.seriesState.selectedKeys.current, + onclick: (_, item) => opts.seriesState.selectedKeys.toggle(item.value), onpointerenter: (_, item) => (opts.seriesState.highlightKey.current = item.value), onpointerleave: () => (opts.seriesState.highlightKey.current = null), ...opts.props, classes: { - item: (item) => - opts.seriesState.visibleSeries.length && - !opts.seriesState.visibleSeries.some((s) => s.key === item.value) - ? 'opacity-50' - : '', + item: (item) => { + return cls(resolveMaybeFn(opts.props?.classes?.item, item)); + }, ...opts.props?.classes, }, }; diff --git a/packages/layerchart/src/lib/components/layout/Canvas.svelte b/packages/layerchart/src/lib/components/layout/Canvas.svelte index 36852ea15..85d06efa1 100644 --- a/packages/layerchart/src/lib/components/layout/Canvas.svelte +++ b/packages/layerchart/src/lib/components/layout/Canvas.svelte @@ -149,7 +149,6 @@
{#if color}
{/if} @@ -118,3 +106,28 @@ {format ? formatUtil(value, asAny(format)) : value} {/if}
+ + diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipItem.svelte b/packages/layerchart/src/lib/components/tooltip/TooltipItem.svelte index 4466ff77d..b67a3ca2a 100644 --- a/packages/layerchart/src/lib/components/tooltip/TooltipItem.svelte +++ b/packages/layerchart/src/lib/components/tooltip/TooltipItem.svelte @@ -78,7 +78,6 @@ import { format as formatUtil, type FormatType, type FormatConfig } from '@layerstack/utils'; import { cls } from '@layerstack/tailwind'; import type { Snippet } from 'svelte'; - import { layerClass } from '$lib/utils/attributes.js'; let { ref: refProp = $bindable(), @@ -129,37 +128,19 @@
{#if color}
@@ -174,17 +155,8 @@
{#if children} {@render children()} @@ -194,3 +166,39 @@ {/if}
+ + diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipList.svelte b/packages/layerchart/src/lib/components/tooltip/TooltipList.svelte index 2f6223ac2..c0fdf818d 100644 --- a/packages/layerchart/src/lib/components/tooltip/TooltipList.svelte +++ b/packages/layerchart/src/lib/components/tooltip/TooltipList.svelte @@ -1,6 +1,5 @@ -
+
{@render children?.()}
+ + diff --git a/packages/layerchart/src/lib/components/tooltip/TooltipSeparator.svelte b/packages/layerchart/src/lib/components/tooltip/TooltipSeparator.svelte index 3ebe5e38a..ce78ebb65 100644 --- a/packages/layerchart/src/lib/components/tooltip/TooltipSeparator.svelte +++ b/packages/layerchart/src/lib/components/tooltip/TooltipSeparator.svelte @@ -1,6 +1,5 @@ -
+
{@render children?.()}
+ + diff --git a/packages/layerchart/src/lib/states/series.svelte.ts b/packages/layerchart/src/lib/states/series.svelte.ts new file mode 100644 index 000000000..8cbe491be --- /dev/null +++ b/packages/layerchart/src/lib/states/series.svelte.ts @@ -0,0 +1,70 @@ +import type { Component } from 'svelte'; +import type { SeriesData } from '../components/charts/types.js'; + +import { SelectionState } from '@layerstack/svelte-state'; + +class HighlightKey { + current = $state['key'] | null>(null); + + set = (seriesKey: typeof this.current) => { + this.current = seriesKey; + }; +} + +export class SeriesState { + #series = $state.raw[]>([]); + selectedKeys = new SelectionState(); + highlightKey = new HighlightKey(); + + constructor(getSeries: () => SeriesData[]) { + this.#series = getSeries(); + + $effect.pre(() => { + // keep series state in sync with the prop + this.#series = getSeries(); + }); + } + + get series() { + return this.#series; + } + + get isDefaultSeries() { + return this.#series.length === 1 && this.#series[0].key === 'default'; + } + + get visibleSeries() { + return this.#series.filter((s) => this.isVisible(s.key)); + } + + /** + * Check if series is visible + */ + isVisible(seriesKey: SeriesData['key']) { + return this.selectedKeys.isEmpty() || this.selectedKeys.isSelected(seriesKey); + } + + /** + * Check if series is highlighted + * Changing default to `true` is useful to determine if series should be faded + */ + isHighlighted(seriesKey: SeriesData['key'], defaultValue = false) { + if (this.highlightKey.current === null) { + return defaultValue; + } else { + return this.highlightKey.current === seriesKey; + } + } + + get allSeriesData() { + return this.#series + .flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d }))) + .filter((d) => d) as Array; + } + + get allSeriesColors() { + return this.#series.map((s) => s.color).filter((c) => c != null) as Array< + NonNullable['color']> + >; + } +} diff --git a/packages/layerchart/src/lib/styles/daisyui-5.css b/packages/layerchart/src/lib/styles/daisyui-5.css new file mode 100644 index 000000000..fc917f070 --- /dev/null +++ b/packages/layerchart/src/lib/styles/daisyui-5.css @@ -0,0 +1,6 @@ +.lc-root-container { + --color-surface-100: var(--color-base-100); + --color-surface-200: var(--color-base-200); + --color-surface-300: var(--color-base-300); + --color-surface-content: var(--color-base-content); +} diff --git a/packages/layerchart/src/lib/styles/shadcn-svelte.css b/packages/layerchart/src/lib/styles/shadcn-svelte.css new file mode 100644 index 000000000..1f9f94a80 --- /dev/null +++ b/packages/layerchart/src/lib/styles/shadcn-svelte.css @@ -0,0 +1,11 @@ +/* + When NOT using shadcn-svelte Chart component. + Not typically needed even when using built-in Chart, as defaults typically are sufficient +*/ +.lc-root-container { + --color-primary: var(--primary); + --color-surface-100: var(--card-background); + --color-surface-200: var(--card-muted); + /* No direct mapping, should add explicit color (light and dark mode) */ + --color-surface-content: var(--card-foreground); +} diff --git a/packages/layerchart/src/lib/styles/skeleton-3.css b/packages/layerchart/src/lib/styles/skeleton-3.css new file mode 100644 index 000000000..4b2fadac4 --- /dev/null +++ b/packages/layerchart/src/lib/styles/skeleton-3.css @@ -0,0 +1,15 @@ +.lc-root-container { + --color-primary: var(--color-primary-500); + + --color-surface-100: var(--color-surface-50); + --color-surface-200: var(--color-surface-100); + --color-surface-300: var(--color-surface-200); + --color-surface-content: var(--base-font-color); + + html.dark & { + --color-surface-100: var(--color-surface-700); + --color-surface-200: var(--color-surface-800); + --color-surface-300: var(--color-surface-900); + --color-surface-content: var(--base-font-color-dark); + } +} diff --git a/packages/layerchart/src/lib/utils/attributes.ts b/packages/layerchart/src/lib/utils/attributes.ts index 14cfc49a7..b0f696cc4 100644 --- a/packages/layerchart/src/lib/utils/attributes.ts +++ b/packages/layerchart/src/lib/utils/attributes.ts @@ -1,18 +1,5 @@ import { cls } from '@layerstack/tailwind'; - -/** - * Creates a string containing a class name that can be used by - * developers to target a specific layer/element within a LayerChart. - * - * This is a function so that the class names remain consistent and the - * prefix/structure can be changed in the future if needed - * - * @param layerName - the name of the layer to be appended to the generated class name - * @returns a string to be used as a class on an element - */ -export function layerClass(layerName: string) { - return `lc-${layerName}`; -} +import type { ClassValue } from 'svelte/elements'; type ExtractObjectType = T extends object ? (T extends Function ? never : T) : never; type WithClass = T & { class?: string }; @@ -29,25 +16,23 @@ function isObjectWithClass(val: any): val is { class?: string } { * a class name to its class property to identify the layer for CSS targeting. * * @param props The props to be extracted, can be an object, function or any other type - * @param layerName The name of the layer used to apply a layer classname for targeting styling + * @param className The class name to be applied to the layer for targeting styling (e.g. 'lc-layer') * @param extraClasses Additional classes to be applied to the layer if they don't exist in the props already * @returns a typed spreadable object with props for the layer */ export function extractLayerProps( props: T, - layerName: string, - extraClasses?: string + className: string, + ...extraClasses: ClassValue[] ): WithClass extends never ? DefaultProps : ExtractObjectType> { - const className = layerClass(layerName); - if (isObjectWithClass(props)) { return { ...props, - class: cls(className, props.class ?? '', extraClasses), + class: cls(className, ...extraClasses, props.class), } as WithClass>; } return { - class: cls(className, extraClasses), + class: cls(className, ...extraClasses), } as WithClass extends never ? DefaultProps : ExtractObjectType>; } diff --git a/packages/layerchart/src/lib/utils/common.test.ts b/packages/layerchart/src/lib/utils/common.test.ts index 7f5dad0e6..4f2c3e3e0 100644 --- a/packages/layerchart/src/lib/utils/common.test.ts +++ b/packages/layerchart/src/lib/utils/common.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; -import { accessor } from './common.js'; +import { accessor, resolveMaybeFn, getObjectOrNull } from './common.js'; export const testData = { one: 1, @@ -45,3 +45,33 @@ describe('accessor', () => { expect(actual).toEqual(testData); }); }); + +describe('getObjectOrNull', () => { + it('returns null for non-object values', () => { + expect(getObjectOrNull(5)).toBeNull(); + expect(getObjectOrNull('string')).toBeNull(); + expect(getObjectOrNull(null)).toBeNull(); + expect(getObjectOrNull(undefined)).toBeUndefined(); + }); + + it('returns null for functions', () => { + const fn = () => {}; + expect(getObjectOrNull(fn)).toBeNull(); + }); + + it('returns the object if value is an object', () => { + const obj = { a: 1 }; + expect(getObjectOrNull(obj)).toBe(obj); + }); +}); + +describe('resolveMaybeFn', () => { + it('returns value if not a function', () => { + expect(resolveMaybeFn(5)).toBe(5); + }); + + it('calls function with args', () => { + const fn = (a: number, b: number) => a + b; + expect(resolveMaybeFn(fn, 2, 3)).toBe(5); + }); +}); diff --git a/packages/layerchart/src/lib/utils/common.ts b/packages/layerchart/src/lib/utils/common.ts index 8b26a2ce3..6983fd93e 100644 --- a/packages/layerchart/src/lib/utils/common.ts +++ b/packages/layerchart/src/lib/utils/common.ts @@ -51,7 +51,7 @@ export function defaultChartPadding( + value: T +): T extends object + ? T extends Function + ? null + : T + : T extends null + ? null + : T extends undefined + ? undefined + : null { + if (typeof value === 'object') return value as any; + if (value === undefined) return undefined as any; + return null as any; +} + +/** + * Call with args if function, otherwise return the value. + */ +export function resolveMaybeFn(value: T | ((...args: any[]) => T), ...args: any[]) { + return typeof value === 'function' ? (value as Function)(...args) : value; +} diff --git a/packages/layerchart/src/lib/utils/math.ts b/packages/layerchart/src/lib/utils/math.ts index 6babcac62..9e48effac 100644 --- a/packages/layerchart/src/lib/utils/math.ts +++ b/packages/layerchart/src/lib/utils/math.ts @@ -44,6 +44,29 @@ export function cartesianToPolar(x: number, y: number) { }; } +/** + * Calculate the angle and length between two points + * @param point1 - First point + * @param point2 - Second point + * @returns Angle in degrees and length + */ +export function pointsToAngleAndLength( + point1: { x: number; y: number }, + point2: { x: number; y: number } +) { + const dx = point2.x - point1.x; + const dy = point2.y - point1.y; + + const radians = Math.atan2(dy, dx); + const length = Math.sqrt(dx * dx + dy * dy); + + return { + radians, + angle: radiansToDegrees(radians), + length, + }; +} + /** Convert celsius temperature to fahrenheit */ export function celsiusToFahrenheit(temperature: number) { return temperature * (9 / 5) + 32; diff --git a/packages/layerchart/src/lib/utils/types.ts b/packages/layerchart/src/lib/utils/types.ts index 69b0e83ea..dfb41385d 100644 --- a/packages/layerchart/src/lib/utils/types.ts +++ b/packages/layerchart/src/lib/utils/types.ts @@ -1,7 +1,9 @@ +import type { MouseEventHandler, PointerEventHandler } from 'svelte/elements'; +import type { TransitionConfig } from 'svelte/transition'; import type { HierarchyNode } from 'd3-hierarchy'; -import type { AnyScale } from './scales.svelte.js'; import type { SankeyGraph } from 'd3-sankey'; -import type { TransitionConfig } from 'svelte/transition'; + +import type { AnyScale } from './scales.svelte.js'; /** * Useful to workaround Svelte 3/4 markup type issues @@ -98,6 +100,19 @@ export type CommonStyleProps = { opacity?: number; }; +/** + * Events for primatives which support `SVGRectElement` and `HTMLDivElement` elements based on render context + */ +export type CommonEvents = { + onclick?: MouseEventHandler | null; + ondblclick?: MouseEventHandler | null; + onpointerenter?: PointerEventHandler | null; + onpointermove?: PointerEventHandler | null; + onpointerleave?: PointerEventHandler | null; + onpointerover?: PointerEventHandler | null; + onpointerout?: PointerEventHandler | null; +}; + export type OnlyObjects = T extends object ? T : never; export type Getter = () => T; diff --git a/packages/layerchart/src/routes/_NavMenu.svelte b/packages/layerchart/src/routes/_NavMenu.svelte index f3a68f9b8..5faa8e2ac 100644 --- a/packages/layerchart/src/routes/_NavMenu.svelte +++ b/packages/layerchart/src/routes/_NavMenu.svelte @@ -117,7 +117,7 @@ 'Graticule', 'TileImage', ], - Layout: ['ForceSimulation', 'Pack', 'Partition', 'Sankey', 'Tree', 'Treemap'], + Layout: ['Dagre', 'ForceSimulation', 'Pack', 'Partition', 'Sankey', 'Tree', 'Treemap'], Fill: ['LinearGradient', 'RadialGradient', 'Pattern'], Clipping: ['ClipPath', 'ChartClipPath', 'CircleClipPath', 'RectClipPath'], Other: ['Blur', 'Bounds', 'ColorRamp', 'MotionPath'], diff --git a/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.ts b/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.ts index f365ac6b7..2f58fc972 100644 --- a/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.ts +++ b/packages/layerchart/src/routes/docs/components/AnnotationLine/+page.ts @@ -15,7 +15,7 @@ export async function load({ fetch }) { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/AnnotationPoint', 'components/AnnotationRange'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/AnnotationPoint/+page.ts b/packages/layerchart/src/routes/docs/components/AnnotationPoint/+page.ts index 61e8def41..40e902423 100644 --- a/packages/layerchart/src/routes/docs/components/AnnotationPoint/+page.ts +++ b/packages/layerchart/src/routes/docs/components/AnnotationPoint/+page.ts @@ -15,7 +15,7 @@ export async function load({ fetch }) { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/AnnotationLine', 'components/AnnotationRange'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/AnnotationRange/+page.ts b/packages/layerchart/src/routes/docs/components/AnnotationRange/+page.ts index ceeceb0df..3ba45b059 100644 --- a/packages/layerchart/src/routes/docs/components/AnnotationRange/+page.ts +++ b/packages/layerchart/src/routes/docs/components/AnnotationRange/+page.ts @@ -15,7 +15,7 @@ export async function load({ fetch }) { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/AnnotationLine', 'components/AnnotationPoint'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/Axis/+page.ts b/packages/layerchart/src/routes/docs/components/Axis/+page.ts index 8fd71a8d7..fd09df389 100644 --- a/packages/layerchart/src/routes/docs/components/Axis/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Axis/+page.ts @@ -8,7 +8,7 @@ export async function load() { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/Grid', 'components/Rule'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/Calendar/+page.svelte b/packages/layerchart/src/routes/docs/components/Calendar/+page.svelte index 1a2d3b665..04762b56e 100644 --- a/packages/layerchart/src/routes/docs/components/Calendar/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Calendar/+page.svelte @@ -42,7 +42,7 @@ 'var(--color-primary-500)', 'var(--color-primary-700)', ]} - padding={{ top: 13 }} + padding={{ top: 20 }} > {#snippet children({ context })} @@ -91,7 +91,7 @@ 'var(--color-primary-500)', 'var(--color-primary-700)', ]} - padding={{ top: 13 }} + padding={{ top: 20 }} > {#snippet children({ context })} @@ -141,7 +141,7 @@ 'var(--color-primary-500)', 'var(--color-primary-700)', ]} - padding={{ left: 20, top: 13 }} + padding={{ top: 20, left: 20 }} > {#snippet children({ context })} @@ -200,7 +200,7 @@ 'var(--color-primary-500)', 'var(--color-primary-700)', ]} - padding={{ top: 13 }} + padding={{ top: 20 }} > {#snippet children({ context })} @@ -244,7 +244,7 @@
-

Html

+

Html with padding

@@ -260,7 +260,7 @@ 'var(--color-primary-500)', 'var(--color-primary-700)', ]} - padding={{ top: 13 }} + padding={{ top: 20 }} > {#snippet children({ context })} diff --git a/packages/layerchart/src/routes/docs/components/Calendar/+page.ts b/packages/layerchart/src/routes/docs/components/Calendar/+page.ts index 01ed3d2b5..9e9acd485 100644 --- a/packages/layerchart/src/routes/docs/components/Calendar/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Calendar/+page.ts @@ -8,7 +8,7 @@ export async function load() { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], }, }; } diff --git a/packages/layerchart/src/routes/docs/components/Circle/+page.svelte b/packages/layerchart/src/routes/docs/components/Circle/+page.svelte index 1f8a6bb85..35e4ecd31 100644 --- a/packages/layerchart/src/routes/docs/components/Circle/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Circle/+page.svelte @@ -6,15 +6,84 @@

Examples

+

Styling using classes

+ + +
+ + + + + + + + + + +
+
+ +

Styling using attributes

+ + +
+ + + + + + + + + + +
+
+ +

Styling using CSS variables

+
- + - - + + +
diff --git a/packages/layerchart/src/routes/docs/components/Circle/+page.ts b/packages/layerchart/src/routes/docs/components/Circle/+page.ts index 962be1ab9..fb388cf28 100644 --- a/packages/layerchart/src/routes/docs/components/Circle/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Circle/+page.ts @@ -9,7 +9,7 @@ export async function load() { source, pageSource, description: '`` element with tweened properties using `motionStore`', - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/Points', 'examples/Pack', 'examples/PunchCard'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/Dagre/+page.svelte b/packages/layerchart/src/routes/docs/components/Dagre/+page.svelte new file mode 100644 index 000000000..1f3a40471 --- /dev/null +++ b/packages/layerchart/src/routes/docs/components/Dagre/+page.svelte @@ -0,0 +1,4 @@ + diff --git a/packages/layerchart/src/routes/docs/components/Dagre/+page.ts b/packages/layerchart/src/routes/docs/components/Dagre/+page.ts new file mode 100644 index 000000000..16d7e77e8 --- /dev/null +++ b/packages/layerchart/src/routes/docs/components/Dagre/+page.ts @@ -0,0 +1,15 @@ +import api from '$lib/components/Dagre.svelte?raw&sveld'; +import source from '$lib/components/Dagre.svelte?raw'; +import pageSource from './+page.svelte?raw'; + +export async function load() { + return { + meta: { + api, + source, + pageSource, + supportedContexts: ['svg', 'canvas'], + related: ['examples/Dagre'], + }, + }; +} diff --git a/packages/layerchart/src/routes/docs/components/Ellipse/+page.svelte b/packages/layerchart/src/routes/docs/components/Ellipse/+page.svelte index 0ae4cd316..845a912e3 100644 --- a/packages/layerchart/src/routes/docs/components/Ellipse/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Ellipse/+page.svelte @@ -6,20 +6,98 @@

Examples

+

Styling using classes

+ + +
+ + + + + + + + + + +
+
+ +

Styling using attributes

+ + +
+ + + + + + + + + + +
+
+ +

Styling using CSS variables

+
- + - + + diff --git a/packages/layerchart/src/routes/docs/components/Ellipse/+page.ts b/packages/layerchart/src/routes/docs/components/Ellipse/+page.ts index aaa350556..bc49fffce 100644 --- a/packages/layerchart/src/routes/docs/components/Ellipse/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Ellipse/+page.ts @@ -9,7 +9,7 @@ export async function load() { source, pageSource, description: '`` element with tweened properties using `motionStore`', - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], }, }; } diff --git a/packages/layerchart/src/routes/docs/components/Grid/+page.svelte b/packages/layerchart/src/routes/docs/components/Grid/+page.svelte index c7e987ea0..5380cb447 100644 --- a/packages/layerchart/src/routes/docs/components/Grid/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Grid/+page.svelte @@ -128,7 +128,7 @@
- + scale.ticks?.().splice(1)} y /> diff --git a/packages/layerchart/src/routes/docs/components/Grid/+page.ts b/packages/layerchart/src/routes/docs/components/Grid/+page.ts index e53cc6063..77c540900 100644 --- a/packages/layerchart/src/routes/docs/components/Grid/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Grid/+page.ts @@ -8,7 +8,7 @@ export async function load() { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/Axis', 'components/Rule'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/Group/+page.ts b/packages/layerchart/src/routes/docs/components/Group/+page.ts index 7a9a7c36f..8d92f4904 100644 --- a/packages/layerchart/src/routes/docs/components/Group/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Group/+page.ts @@ -13,6 +13,7 @@ export async function load() { supportedContexts: [ 'svg', // 'canvas' // TODO: Supported, but limited use cases + 'html', ], related: [ 'examples/Pack', diff --git a/packages/layerchart/src/routes/docs/components/Line/+page.svelte b/packages/layerchart/src/routes/docs/components/Line/+page.svelte index 8b1cf2ab0..b2dc952a3 100644 --- a/packages/layerchart/src/routes/docs/components/Line/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Line/+page.svelte @@ -7,20 +7,105 @@

Examples

+

Styling using classes

+ + +
+ + + + + + + + + +
+
+ +

Styling using attributes

+
- + - - + + + + + +
+
+ +

Styling using CSS variables

+ + +
+ + + + + + diff --git a/packages/layerchart/src/routes/docs/components/Line/+page.ts b/packages/layerchart/src/routes/docs/components/Line/+page.ts index 3df4dca88..61c7b05a6 100644 --- a/packages/layerchart/src/routes/docs/components/Line/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Line/+page.ts @@ -9,7 +9,7 @@ export async function load() { source, pageSource, description: '`` element with tweened properties using `motionStore`', - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/Rule', 'components/Spline'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte b/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte index 7f6b83996..0921218f8 100644 --- a/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/LineChart/+page.svelte @@ -45,6 +45,16 @@ value: 'integer', keys, }); + const multiSeriesDataWithNulls = $derived( + multiSeriesData.map((d) => { + const newItem = { ...d }; + keys.forEach((key) => { + // @ts-expect-error shh + newItem[key] = Math.random() < 0.2 ? null : newItem[key]; + }); + return newItem; + }) + ); const multiSeriesFlatData = pivotLonger(multiSeriesData, keys, 'fruit', 'value'); const multiSeriesDataByFruit = group(multiSeriesFlatData, (d) => d.fruit); @@ -89,6 +99,79 @@ let renderContext = $derived(shared.renderContext as 'svg' | 'canvas'); let debug = $derived(shared.debug); + + const monitorSeries = [ + { + key: 'RespondActivityTaskCompleted', + data: [ + { + date: new Date('2025-09-14T00:00:00.000Z'), + value: 0.05875000000000004, + }, + { + date: new Date('2025-09-14T00:05:00.000Z'), + value: 0.0195, + }, + { + date: new Date('2025-09-14T12:00:00.000Z'), + value: 0.0195, + }, + { + date: new Date('2025-09-15T00:00:00.000Z'), + value: 0.08083333333333337, + }, + { + date: new Date('2025-09-15T00:05:00.000Z'), + value: 0.04592857142857144, + }, + ], + color: 'var(--color-blue-500)', + }, + { + key: 'RespondWorkflowTaskCompleted', + data: [ + { + date: new Date('2025-09-14T00:00:00.000Z'), + value: 0.08999999999999998, + }, + { + date: new Date('2025-09-14T00:05:00.000Z'), + value: 0.03275000000000002, + }, + { + date: new Date('2025-09-14T12:00:00.000Z'), + value: 0.047, + }, + { + date: new Date('2025-09-15T00:00:00.000Z'), + value: 0.08666666666666673, + }, + { + date: new Date('2025-09-15T00:05:00.000Z'), + value: 0.04625, + }, + { + date: new Date('2025-09-15T12:00:00.000Z'), + value: 0.0485, + }, + ], + color: 'var(--color-purple-500)', + }, + { + key: 'StartWorkflowExecution', + data: [ + { + date: new Date('2025-09-14T00:00:00.000Z'), + value: 0.16666666666666669, + }, + { + date: new Date('2025-09-15T00:00:00.000Z'), + value: 0.1300000000000001, + }, + ], + color: 'var(--color-green-500)', + }, + ];

Examples

@@ -130,6 +213,21 @@
+

Vertical

+ + +
+ +
+
+

Series

@@ -148,6 +246,38 @@
+

Series (with nulls)

+ + +
+ + {#snippet belowMarks({ visibleSeries, highlightKey })} + {#each visibleSeries as s} + d[s.key] !== null)} + y={s.key} + stroke={s.color} + class={cls( + '[stroke-dasharray:3,3] transition-opacity', + highlightKey && highlightKey !== s.key && 'opacity-10' + )} + /> + {/each} + {/snippet} + +
+
+

Series (separate data)

@@ -178,6 +308,68 @@
+

Series (separate data with different length)

+ + +
+ Math.random() > 0.3), + color: 'var(--color-danger)', + }, + { + key: 'bananas', + data: multiSeriesDataByFruit.get('bananas')?.filter((d, i) => Math.random() > 0.3), + color: 'var(--color-success)', + }, + { + key: 'oranges', + data: multiSeriesDataByFruit.get('oranges')?.filter((d, i) => Math.random() > 0.3), + color: 'var(--color-warning)', + }, + ]} + {renderContext} + {debug} + /> +
+
+ + + +

Series (vertical)

+ + +
+ +
+
+

Series (individual tooltip with highlight)

diff --git a/packages/layerchart/src/routes/docs/components/LinearGradient/+page.ts b/packages/layerchart/src/routes/docs/components/LinearGradient/+page.ts index 171c0cfc4..509d4e126 100644 --- a/packages/layerchart/src/routes/docs/components/LinearGradient/+page.ts +++ b/packages/layerchart/src/routes/docs/components/LinearGradient/+page.ts @@ -8,7 +8,7 @@ export async function load() { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['components/RadialGradient', 'components/Pattern'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/PieChart/+page.svelte b/packages/layerchart/src/routes/docs/components/PieChart/+page.svelte index a899c6273..96e20ef52 100644 --- a/packages/layerchart/src/routes/docs/components/PieChart/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/PieChart/+page.svelte @@ -180,6 +180,7 @@ innerRadius={-20} cornerRadius={4} padAngle={0.02} + tooltip={false} {renderContext} {debug} > diff --git a/packages/layerchart/src/routes/docs/components/Point/+page.svelte b/packages/layerchart/src/routes/docs/components/Point/+page.svelte index 663f1fd20..f9bafc5e1 100644 --- a/packages/layerchart/src/routes/docs/components/Point/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Point/+page.svelte @@ -16,19 +16,21 @@ y={(d) => d.y} xDomain={[0, 100]} yDomain={[0, 100]} - padding={{ bottom: 20, left: 20 }} + padding={{ top: 10, bottom: 20, left: 24, right: 10 }} > + {#snippet children({ x, y })} - + {/snippet} + {#snippet children({ x, y })} - + {/snippet} diff --git a/packages/layerchart/src/routes/docs/components/Point/+page.ts b/packages/layerchart/src/routes/docs/components/Point/+page.ts index 88b528d40..c99343062 100644 --- a/packages/layerchart/src/routes/docs/components/Point/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Point/+page.ts @@ -9,7 +9,7 @@ export async function load() { source, pageSource, description: 'Convenient way to translate a data item to SVG x/y coordinates', - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: ['examples/Area'], }, }; diff --git a/packages/layerchart/src/routes/docs/components/Rect/+page.svelte b/packages/layerchart/src/routes/docs/components/Rect/+page.svelte index ac1cf99bf..2ed03e59d 100644 --- a/packages/layerchart/src/routes/docs/components/Rect/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Rect/+page.svelte @@ -6,15 +6,82 @@

Examples

+

Styling using classes

+ + +
+ + + + + + + + + +
+
+ +

Styling using attributes

+ + +
+ + + + + + + + + +
+
+ +

Styling using CSS variables

+
- + - - + +
diff --git a/packages/layerchart/src/routes/docs/components/Rect/+page.ts b/packages/layerchart/src/routes/docs/components/Rect/+page.ts index 48fe70a36..643927949 100644 --- a/packages/layerchart/src/routes/docs/components/Rect/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Rect/+page.ts @@ -9,7 +9,7 @@ export async function load() { source, pageSource, description: '`` element with tweened properties using `motionStore`', - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], related: [ 'components/Bars', 'components/Highlight', diff --git a/packages/layerchart/src/routes/docs/components/Text/+page.svelte b/packages/layerchart/src/routes/docs/components/Text/+page.svelte index 811600335..98152daef 100644 --- a/packages/layerchart/src/routes/docs/components/Text/+page.svelte +++ b/packages/layerchart/src/routes/docs/components/Text/+page.svelte @@ -5,6 +5,7 @@ import { Field, RangeField, Switch, TextField, ToggleGroup, ToggleOption } from 'svelte-ux'; import Preview from 'layerchart/docs/Preview.svelte'; import { shared } from '../../shared.svelte.js'; + import { toTitleCase } from '@layerstack/utils'; const config = $state({ x: 0, @@ -105,44 +106,27 @@
-
-
-

SVG

-
-
- - - - {#if config.showAnchor} - - {/if} - - -
-
-
- -
-

Canvas

-
-
- - - - {#if config.showAnchor} - - {/if} - - +
+ {#each ['svg', 'canvas', 'html'] as const as type} +
+

{toTitleCase(type)}

+
+
+ + + + {#if config.showAnchor} + + {/if} + + +
-
+ {/each}

Examples

diff --git a/packages/layerchart/src/routes/docs/components/Text/+page.ts b/packages/layerchart/src/routes/docs/components/Text/+page.ts index 4a31bc978..875f03bb0 100644 --- a/packages/layerchart/src/routes/docs/components/Text/+page.ts +++ b/packages/layerchart/src/routes/docs/components/Text/+page.ts @@ -8,7 +8,7 @@ export async function load() { api, source, pageSource, - supportedContexts: ['svg', 'canvas'], + supportedContexts: ['svg', 'canvas', 'html'], features: [ 'Adjustable anchor/origin point (center horizontally and vertically)', 'Rotate (based on origin)', diff --git a/packages/layerchart/src/routes/docs/examples/AnimatedGlobe/+page.svelte b/packages/layerchart/src/routes/docs/examples/AnimatedGlobe/+page.svelte index 1bc23085c..7e6635542 100644 --- a/packages/layerchart/src/routes/docs/examples/AnimatedGlobe/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/AnimatedGlobe/+page.svelte @@ -145,6 +145,7 @@ transform={{ motion: { type: 'spring', stiffness: 0.04 }, }} + tooltip={{ touchEvents: 'none' }} bind:context > {#snippet children()} diff --git a/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte b/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte index 6031943b9..cd551d31d 100644 --- a/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte +++ b/packages/layerchart/src/routes/docs/examples/Bars/+page.svelte @@ -1,6 +1,6 @@