fix(site): persist icon customizer (#4944)

* fix(docs): persist icon customizer settings

Persist icon color, size, stroke width, and absolute stroke width between page navigations and reloads.

Keep a shared icon style state across the homepage and icons page, clamp the homepage preview size to its supported range, and apply persisted absolute stroke settings after mount.

* fix(docs): avoid icon customizer hydration flicker

Initialize persisted icon settings synchronously and apply absolute stroke width before the first rendered state.

* fix(docs): restore icon styles before first paint

Apply stored icon styles from a head script before hydration, defer customizer visibility until mount, and render persisted switches on the client to avoid stale SSR classes. Keep absolute stroke state synchronized globally and cover prepaint initialization with regression tests.

* fix(site): persist icon customizer

* fix(packages/react): update vulnerable @tanstack packages

* fix(docs): persist icon customizer settings

Persist icon color, size, stroke width, and absolute stroke width between page navigations and reloads.

Keep a shared icon style state across the homepage and icons page, clamp the homepage preview size to its supported range, and apply persisted absolute stroke settings after mount.

* fix(docs): avoid icon customizer hydration flicker

Initialize persisted icon settings synchronously and apply absolute stroke width before the first rendered state.

* fix(docs): restore icon styles before first paint

Apply stored icon styles from a head script before hydration, defer customizer visibility until mount, and render persisted switches on the client to avoid stale SSR classes. Keep absolute stroke state synchronized globally and cover prepaint initialization with regression tests.

* fix(site): persist icon customizer

* fix(packages/react): update vulnerable @tanstack packages

* fix(site): generalize usePersistedIconStyle to reduce code duplication in icon customizers

* fix(site): home size slider now uses max="256", matching the sidebar

* fix(site): fix linting issues in iconStyleHead.js

* fix(site): make Switch.vue hydration safe

* fix(site): fix home icon customizer color input width

* fix(site): make home icon customizer not persistent

* fix(site): fix duplicate ids in sidebar icon customizer as well

* fix(site): various minor fixes to the customizer bl

* fix(site): revert "[default]" placeholder

---------

Co-authored-by: epifaniofrancisco <epifaniofrancisco03@gmail.com>
This commit is contained in:
Karsa
2026-10-02 13:46:27 +02:00
committed by GitHub
co-authored by epifaniofrancisco
parent 9d9418a25d
commit 00300d31bd
12 changed files with 528 additions and 237 deletions
+8 -1
View File
@@ -15,6 +15,10 @@ const defaultSandpackCSS = await readFile(
fileURLToPath(new URL('./theme/sandpack-default.css', import.meta.url)),
'utf-8',
);
const iconStyleHeadScript = await readFile(
fileURLToPath(new URL('./theme/iconStyleHead.js', import.meta.url)),
'utf-8',
);
const title = 'Lucide';
const socialTitle = 'Lucide Icons';
@@ -84,7 +88,10 @@ export default defineConfig({
}) as unknown as UserConfig['vite']['plugins'][0],
],
},
head: getHeadConfig({ title, description, socialTitle }),
head: [
...getHeadConfig({ title, description, socialTitle }),
['script', {}, iconStyleHeadScript],
],
transformPageData,
themeConfig: {
logo: {
@@ -1,5 +1,4 @@
<script setup lang="ts">
import { useData } from 'vitepress';
import { computed } from 'vue';
const props = defineProps<{
@@ -7,8 +6,6 @@ const props = defineProps<{
id: string;
}>();
const { isDark } = useData();
const emit = defineEmits(['update:modelValue']);
function limitHexInput(val: string) {
@@ -22,7 +19,7 @@ function limitHexInput(val: string) {
const value = computed({
get: () => {
if (props.modelValue == null || props.modelValue === 'currentColor') {
return isDark.value ? '#ffffff' : '#000000';
return null;
}
return props.modelValue;
@@ -5,7 +5,7 @@ import Button from './Button.vue';
</script>
<template>
<Button class="reset-button">
<Button class="reset-button" aria-label="Reset style">
<Icon
:size="20"
:iconNode="rotateCw"
@@ -16,6 +16,7 @@ import Button from './Button.vue';
<style scoped>
.reset-button {
transition: ease-in-out 0.1s opacity;
background: none;
padding: 0;
}
@@ -29,6 +30,12 @@ import Button from './Button.vue';
border-color: transparent;
}
.reset-button:disabled {
cursor: default;
pointer-events: none;
opacity: 0.5;
}
/* a rotate css animation keyframes */
@keyframes rotate {
0% {
@@ -1,5 +1,6 @@
<script setup>
import { Switch } from '@headlessui/vue'
import { onMounted, ref } from 'vue'
defineProps({
modelValue: {
@@ -9,14 +10,19 @@
})
const emit = defineEmits(['update:modelValue'])
const isHydrated = ref(false)
onMounted(() => {
isHydrated.value = true
})
</script>
<template>
<Switch
:model-value="modelValue"
:model-value="isHydrated ? modelValue : false"
@update:model-value="emit('update:modelValue', $event)"
class="switch"
:class="{ enabled: modelValue }"
:class="{ enabled: isHydrated && modelValue }"
>
<span class="thumb" />
</Switch>
@@ -1,59 +1,21 @@
<script setup lang="ts">
import { ref, watch } from 'vue'
import { syncRef, useCssVar } from '@vueuse/core'
import HomeContainer from './HomeContainer.vue'
import RangeSlider from '../base/RangeSlider.vue'
import InputField from '../base/InputField.vue'
import ColorPicker from '../base/ColorPicker.vue'
import ResetButton from '../base/ResetButton.vue'
import HomeIconCustomizerIcons from './HomeIconCustomizerIcons.vue'
import Switch from '../base/Switch.vue'
import { computed } from 'vue';
import { useIconStyle } from '../../composables/useIconStyle';
import HomeContainer from './HomeContainer.vue';
import RangeSlider from '../base/RangeSlider.vue';
import InputField from '../base/InputField.vue';
import ColorPicker from '../base/ColorPicker.vue';
import ResetButton from '../base/ResetButton.vue';
import HomeIconCustomizerIcons from './HomeIconCustomizerIcons.vue';
import Switch from '../base/Switch.vue';
const { color, strokeWidth, size, absoluteStrokeWidth, isCustomized, resetStyle } = useIconStyle();
const iconContainer = ref<HTMLElement | null>()
const color = ref('currentColor')
const strokeWidth = ref(2)
const size = ref(24)
const absoluteStrokeWidth = ref(false)
const colorCssVar = useCssVar(
'--customize-color',
iconContainer,
{
initialValue: 'default'
}
)
const strokeWidthCssVar = useCssVar(
'--customize-strokeWidth',
iconContainer,
{
initialValue: '2'
}
)
const sizeCssVar = useCssVar(
'--customize-size',
iconContainer,
{
initialValue: '24'
}
)
syncRef(color, colorCssVar)
syncRef(strokeWidth, strokeWidthCssVar, { transform: { ltr: String, rtl: Number } })
syncRef(size, sizeCssVar, { transform: { ltr: String, rtl: Number } })
function resetStyle () {
color.value = 'currentColor'
strokeWidth.value = 2
size.value = 24
absoluteStrokeWidth.value = false
}
watch(absoluteStrokeWidth, (enabled) => {
iconContainer.value?.classList.toggle('absolute-stroke-width', enabled)
})
const iconStyle = computed(() => ({
'--home-icon-color': color.value,
'--home-icon-stroke-width': String(strokeWidth.value),
'--home-icon-size': String(size.value),
}));
</script>
<template>
@@ -62,7 +24,10 @@ watch(absoluteStrokeWidth, (enabled) => {
<div class="card-column">
<h2 class="title">
Style as you please
<ResetButton @click="resetStyle"></ResetButton>
<ResetButton
:disabled="!isCustomized"
@click="resetStyle"
/>
</h2>
<p class="copy">
Lucide has a lot of customization options to match the icons with your UI.
@@ -78,7 +43,10 @@ watch(absoluteStrokeWidth, (enabled) => {
class="color-picker-field"
>
<template #display>
<ColorPicker v-model="color" id="icon-color" />
<ColorPicker
v-model="color"
id="icon-color-picker"
/>
</template>
</InputField>
@@ -90,7 +58,7 @@ watch(absoluteStrokeWidth, (enabled) => {
<span class="customize-label">{{ strokeWidth }}px</span>
</template>
<RangeSlider
id="stroke-width"
id="stroke-width-slider"
name="stroke-width"
v-model="strokeWidth"
:min="1"
@@ -107,7 +75,7 @@ watch(absoluteStrokeWidth, (enabled) => {
<span class="customize-label">{{ size }}px</span>
</template>
<RangeSlider
id="size"
id="size-slider"
name="size"
v-model="size"
:min="16"
@@ -122,7 +90,7 @@ watch(absoluteStrokeWidth, (enabled) => {
>
<template #display>
<Switch
id="absolute-stroke-width"
id="absolute-stroke-width-switch"
name="absolute-stroke-width"
v-model="absoluteStrokeWidth"
/>
@@ -131,8 +99,11 @@ watch(absoluteStrokeWidth, (enabled) => {
</div>
</div>
<div class="icons-container card-column" ref="iconContainer">
<HomeIconCustomizerIcons />
<div class="icons-container card-column">
<HomeIconCustomizerIcons
:class="{ 'absolute-stroke-width': absoluteStrokeWidth }"
:style="iconStyle"
/>
</div>
</div>
</HomeContainer>
@@ -179,10 +150,6 @@ watch(absoluteStrokeWidth, (enabled) => {
display: grid;
grid-template-columns: 8fr 10fr;
}
/*
.card-column {
flex: 1;
} */
}
@media (min-width: 960px) {
@@ -191,7 +158,7 @@ watch(absoluteStrokeWidth, (enabled) => {
}
}
.color-picker-field:deep(.display-value) {
width: 138px;
.color-picker-field:deep(.icon-color-picker-input) {
width: 116px;
}
</style>
@@ -1,29 +1,35 @@
<script setup lang="ts">
import { ref } from 'vue';
import { data } from './HomeHeroIconsCard.data'
import LucideIcon from '../base/LucideIcon.vue'
import { vIntersectionObserver } from '@vueuse/components'
import { data } from './HomeHeroIconsCard.data';
import LucideIcon from '../base/LucideIcon.vue';
import { vIntersectionObserver } from '@vueuse/components';
const getInitialItems = () => data.icons.slice(0, 64)
const items = ref(getInitialItems())
const showIcons = ref(false)
const getInitialItems = () => data.icons.slice(0, 64);
const items = ref(getInitialItems());
const showIcons = ref(false);
// Added intersection observer to improve performance
const onIntersectionObserver: IntersectionObserverCallback = ([{ isIntersecting }]) => {
if (isIntersecting) {
showIcons.value = true
showIcons.value = true;
}
}
};
</script>
<template>
<div class="icon-grid" v-intersection-observer="onIntersectionObserver">
<div
class="icon-grid"
v-intersection-observer="onIntersectionObserver"
>
<template v-if="showIcons">
<div
v-for="icon in items"
class="icon-grid-item"
>
<LucideIcon v-bind="icon" class="lucide-icon"/>
>
<LucideIcon
v-bind="icon"
class="lucide-icon"
/>
</div>
</template>
</div>
@@ -36,7 +42,7 @@ const onIntersectionObserver: IntersectionObserverCallback = ([{ isIntersecting
grid-template-columns: repeat(auto-fill, minmax(68px, 1fr));
grid-template-rows: repeat(auto-fill, minmax(68px, 1fr));
width: 100%;
height:100%;
height: 100%;
max-height: 360px;
gap: 1px;
overflow: hidden;
@@ -65,13 +71,15 @@ const onIntersectionObserver: IntersectionObserverCallback = ([{ isIntersecting
.lucide-icon {
will-change: width, height, stroke-width, stroke;
color: var(--customize-color, currentColor);
stroke-width: var(--customize-strokeWidth, 2);
width: calc(var(--customize-size, 24) * 1px);
height: calc(var(--customize-size, 24) * 1px);
color: var(--home-icon-color, currentColor);
stroke-width: var(--home-icon-stroke-width, 2);
width: calc(var(--home-icon-size, 24) * 1px);
height: calc(var(--home-icon-size, 24) * 1px);
max-width: 3rem;
max-height: 3rem;
}
.icons-container.absolute-stroke-width .lucide-icon {
stroke-width: calc(var(--customize-strokeWidth, 2) * 24 / var(--customize-size, 24));
.icon-grid.absolute-stroke-width .lucide-icon {
stroke-width: calc(var(--home-icon-stroke-width, 2) * 24 / var(--home-icon-size, 24));
}
</style>
@@ -1,73 +1,26 @@
<script setup lang="ts">
import { shallowRef, type Ref, watch, computed } from 'vue';
import { useCssVar, syncRef } from '@vueuse/core';
import { STYLE_DEFAULTS, useIconStyleContext } from '../../composables/useIconStyle';
import { useIconStyleContext } from '../../composables/useIconStyle';
import RangeSlider from '../base/RangeSlider.vue';
import InputField from '../base/InputField.vue';
import ColorPicker from '../base/ColorPicker.vue';
import ResetButton from '../base/ResetButton.vue';
import Switch from '../base/Switch.vue';
const props = defineProps<{
rootEl?: Ref<HTMLElement>;
}>();
const { color, strokeWidth, size, absoluteStrokeWidth } = useIconStyleContext();
const documentRef = shallowRef<HTMLElement | undefined>(
typeof document !== 'undefined' ? document?.documentElement : undefined,
);
const colorCssVar = useCssVar('--customize-color', props.rootEl?.value ?? documentRef.value, {
initialValue: `${STYLE_DEFAULTS.color}`,
});
const strokeWidthCssVar = useCssVar(
'--customize-strokeWidth',
props.rootEl?.value ?? documentRef.value,
{
initialValue: `${STYLE_DEFAULTS.strokeWidth}`,
},
);
const sizeCssVar = useCssVar('--customize-size', props.rootEl?.value ?? documentRef.value, {
initialValue: `${STYLE_DEFAULTS.size}`,
});
syncRef(color, colorCssVar, { direction: 'ltr' });
syncRef(strokeWidth, strokeWidthCssVar, { direction: 'ltr', transform: { ltr: String } });
syncRef(size, sizeCssVar, { direction: 'ltr', transform: { ltr: String } });
function resetStyle() {
color.value = STYLE_DEFAULTS.color;
strokeWidth.value = STYLE_DEFAULTS.strokeWidth;
size.value = STYLE_DEFAULTS.size;
absoluteStrokeWidth.value = STYLE_DEFAULTS.absoluteStrokeWidth;
}
watch(absoluteStrokeWidth, (enabled) => {
const htmlEl = document.documentElement;
htmlEl.classList.toggle('absolute-stroke-width', enabled);
});
const customizingActive = computed(() => {
return (
color.value !== STYLE_DEFAULTS.color ||
strokeWidth.value !== STYLE_DEFAULTS.strokeWidth ||
size.value !== STYLE_DEFAULTS.size ||
absoluteStrokeWidth.value !== STYLE_DEFAULTS.absoluteStrokeWidth
);
});
const { color, strokeWidth, size, absoluteStrokeWidth, isCustomized, resetStyle } =
useIconStyleContext();
</script>
<template>
<div
class="customizer-card"
:class="{ customized: customizingActive }"
:class="{ customized: isCustomized }"
>
<div class="card-header">
<h2 class="card-title">Customizer</h2>
<ResetButton @click="resetStyle"></ResetButton>
<ResetButton
:disabled="!isCustomized"
@click="resetStyle"
/>
</div>
<InputField
id="icon-color"
@@ -75,7 +28,7 @@ const customizingActive = computed(() => {
>
<ColorPicker
v-model="color"
id="icon-color"
id="icon-color-picker"
class="color-picker"
/>
</InputField>
@@ -88,7 +41,7 @@ const customizingActive = computed(() => {
<span class="customize-label">{{ strokeWidth }}px</span>
</template>
<RangeSlider
id="stroke-width"
id="stroke-width-slider"
name="stroke-width"
v-model="strokeWidth"
:min="0.5"
@@ -105,7 +58,7 @@ const customizingActive = computed(() => {
<span class="customize-label">{{ size }}px</span>
</template>
<RangeSlider
id="size"
id="size-slider"
name="size"
v-model="size"
:min="16"
@@ -119,7 +72,7 @@ const customizingActive = computed(() => {
label="Absolute stroke width"
>
<Switch
id="absolute-stroke-width"
id="absolute-stroke-width-switch"
name="absolute-stroke-width"
v-model="absoluteStrokeWidth"
/>
@@ -140,7 +93,6 @@ const customizingActive = computed(() => {
color: var(--vp-c-text-1);
line-height: 32px;
font-size: 16px;
/* margin-bottom: 12px; */
}
.customizer-card {
@@ -0,0 +1,113 @@
import assert from 'node:assert/strict';
import { test } from 'node:test';
import { nextTick } from 'vue';
const storedValues = new Map<string, string>([
['icon-size', '240'],
['icon-stroke-width', '1.5'],
['icon-color', '#ff0000'],
['icon-absolute-stroke-width', 'true'],
]);
const styleProperties = new Map<string, string>();
const classes = new Set<string>();
class StorageMock {
getItem(key: string) {
return storedValues.get(key) ?? null;
}
setItem(key: string, value: string) {
storedValues.set(key, value);
}
removeItem(key: string) {
storedValues.delete(key);
}
}
class StorageEventMock {
type: string;
options: unknown;
constructor(type: string, options: unknown) {
this.type = type;
this.options = options;
}
}
const localStorage = new StorageMock();
const document = {
documentElement: {
style: { setProperty: (key: string, value: string) => styleProperties.set(key, value) },
classList: {
toggle: (value: string, enabled: boolean) =>
enabled ? classes.add(value) : classes.delete(value),
},
},
};
const window = {
document,
localStorage,
addEventListener() {},
removeEventListener() {},
dispatchEvent() {},
};
Object.assign(globalThis, {
window,
document,
localStorage,
Storage: StorageMock,
StorageEvent: StorageEventMock,
CSS: { supports: () => true },
});
const { useIconStyle, usePersistedIconStyle } = await import('./useIconStyle.ts');
test('creates a non-persisted icon style from the defaults', () => {
const style = useIconStyle();
assert.equal(style.size.value, 24);
assert.equal(style.strokeWidth.value, 2);
assert.equal(style.color.value, 'currentColor');
assert.equal(style.absoluteStrokeWidth.value, false);
style.size.value = 48;
assert.equal(storedValues.get('icon-size'), '240');
assert.equal(styleProperties.get('--customize-size'), '240');
});
test('restores persisted settings and applies the shared CSS variables', () => {
const style = usePersistedIconStyle();
assert.equal(style.size.value, 240);
assert.equal(style.strokeWidth.value, 1.5);
assert.equal(style.color.value, '#ff0000');
assert.equal(style.absoluteStrokeWidth.value, true);
assert.equal(style.isCustomized.value, true);
assert.equal(styleProperties.get('--customize-size'), '240');
assert.equal(styleProperties.get('--customize-strokeWidth'), '1.5');
assert.equal(styleProperties.get('--customize-color'), '#ff0000');
assert.ok(classes.has('absolute-stroke-width'));
});
test('resetting updates refs, CSS variables, and persisted values', async () => {
const style = usePersistedIconStyle();
style.resetStyle();
await nextTick();
assert.equal(style.size.value, 24);
assert.equal(style.strokeWidth.value, 2);
assert.equal(style.color.value, 'currentColor');
assert.equal(style.absoluteStrokeWidth.value, false);
assert.equal(style.isCustomized.value, false);
assert.equal(styleProperties.get('--customize-size'), '24');
assert.equal(styleProperties.get('--customize-strokeWidth'), '2');
assert.equal(styleProperties.get('--customize-color'), 'currentColor');
assert.equal(classes.has('absolute-stroke-width'), false);
assert.equal(storedValues.get('icon-size'), '24');
assert.equal(storedValues.get('icon-stroke-width'), '2');
assert.equal(storedValues.get('icon-color'), 'currentColor');
assert.equal(storedValues.get('icon-absolute-stroke-width'), 'false');
});
@@ -1,14 +1,19 @@
import { ref, inject, Ref } from 'vue';
import { computed, inject, ref, watch, type ComputedRef, type Ref } from 'vue';
import { useLocalStorage } from '@vueuse/core';
export const ICON_STYLE_CONTEXT = Symbol('style');
interface IconSizeContext {
interface IconStyleContext {
size: Ref<number>;
strokeWidth: Ref<number>;
color: Ref<string>;
absoluteStrokeWidth: Ref<boolean>;
isCustomized: ComputedRef<boolean>;
resetStyle: () => void;
}
type IconStyle = Pick<IconStyleContext, 'size' | 'strokeWidth' | 'color' | 'absoluteStrokeWidth'>;
export const STYLE_DEFAULTS = {
size: 24,
strokeWidth: 2,
@@ -16,15 +21,82 @@ export const STYLE_DEFAULTS = {
absoluteStrokeWidth: false,
};
export const iconStyleContext = {
size: ref(24),
strokeWidth: ref(2),
color: ref('currentColor'),
absoluteStrokeWidth: ref(false),
const persistedIconStyle = {
size: useLocalStorage('icon-size', STYLE_DEFAULTS.size, { initOnMounted: false }),
strokeWidth: useLocalStorage('icon-stroke-width', STYLE_DEFAULTS.strokeWidth, {
initOnMounted: false,
}),
color: useLocalStorage('icon-color', STYLE_DEFAULTS.color, { initOnMounted: false }),
absoluteStrokeWidth: useLocalStorage(
'icon-absolute-stroke-width',
STYLE_DEFAULTS.absoluteStrokeWidth,
{ initOnMounted: false },
),
};
export function useIconStyleContext(): IconSizeContext {
const context = inject<IconSizeContext>(ICON_STYLE_CONTEXT);
function createIconStyleContext(style: IconStyle): IconStyleContext {
const isCustomized = computed(() => {
return (
style.color.value !== STYLE_DEFAULTS.color ||
style.strokeWidth.value !== STYLE_DEFAULTS.strokeWidth ||
style.size.value !== STYLE_DEFAULTS.size ||
style.absoluteStrokeWidth.value !== STYLE_DEFAULTS.absoluteStrokeWidth
);
});
function resetStyle() {
style.color.value = STYLE_DEFAULTS.color;
style.strokeWidth.value = STYLE_DEFAULTS.strokeWidth;
style.size.value = STYLE_DEFAULTS.size;
style.absoluteStrokeWidth.value = STYLE_DEFAULTS.absoluteStrokeWidth;
}
return {
...style,
isCustomized,
resetStyle,
};
}
export const iconStyleContext = createIconStyleContext(persistedIconStyle);
export function useIconStyle() {
return createIconStyleContext({
size: ref(STYLE_DEFAULTS.size),
strokeWidth: ref(STYLE_DEFAULTS.strokeWidth),
color: ref(STYLE_DEFAULTS.color),
absoluteStrokeWidth: ref(STYLE_DEFAULTS.absoluteStrokeWidth),
});
}
export function usePersistedIconStyle() {
return iconStyleContext;
}
if (typeof document !== 'undefined') {
watch(
[
persistedIconStyle.size,
persistedIconStyle.strokeWidth,
persistedIconStyle.color,
persistedIconStyle.absoluteStrokeWidth,
],
([size, strokeWidth, color, absoluteStrokeWidth]) => {
const root = document.documentElement;
root.style.setProperty('--customize-size', String(Math.min(256, Math.max(16, size))));
root.style.setProperty(
'--customize-strokeWidth',
String(Math.min(3, Math.max(0.5, strokeWidth))),
);
if (CSS.supports('color', color)) root.style.setProperty('--customize-color', color);
root.classList.toggle('absolute-stroke-width', absoluteStrokeWidth);
},
{ immediate: true, flush: 'sync' },
);
}
export function useIconStyleContext(): IconStyleContext {
const context = inject<IconStyleContext>(ICON_STYLE_CONTEXT);
if (!context) {
throw new Error('useIconStyleContext must be used with useIconStyleProvider');
+24
View File
@@ -0,0 +1,24 @@
// Run before the body is painted: the generated HTML cannot know local preferences.
(() => {
try {
const root = globalThis.document.documentElement;
const size = globalThis.localStorage.getItem('icon-size');
const stroke = globalThis.localStorage.getItem('icon-stroke-width');
const color = globalThis.localStorage.getItem('icon-color');
const absolute = globalThis.localStorage.getItem('icon-absolute-stroke-width');
if ([size, stroke, color, absolute].every((value) => value === null)) return;
if (size !== null && Number.isFinite(Number(size))) {
root.style.setProperty('--customize-size', String(Math.min(256, Math.max(16, Number(size)))));
}
if (stroke !== null && Number.isFinite(Number(stroke)))
root.style.setProperty(
'--customize-strokeWidth',
String(Math.min(3, Math.max(0.5, Number(stroke)))),
);
if (color !== null && globalThis.CSS.supports('color', color))
root.style.setProperty('--customize-color', color);
root.classList.toggle('absolute-stroke-width', absolute === 'true');
} catch {
// Storage can be unavailable, for example in private browsing mode.
}
})();
@@ -10,8 +10,8 @@
"check": "pnpm build && pnpm typecheck && pnpm test:browser"
},
"dependencies": {
"@tanstack/react-router": "1.170.32",
"@tanstack/react-start": "1.168.49",
"@tanstack/react-router": "1.170.41",
"@tanstack/react-start": "1.168.60",
"lucide-react": "workspace:*",
"react": "19.2.8",
"react-dom": "19.2.8"
+212 -74
View File
@@ -394,11 +394,11 @@ importers:
integrations/lucide-react/tanstack-start:
dependencies:
'@tanstack/react-router':
specifier: 1.170.32
version: 1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
specifier: 1.170.41
version: 1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/react-start':
specifier: 1.168.49
version: 1.168.49(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
specifier: 1.168.60
version: 1.168.60(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
lucide-react:
specifier: workspace:*
version: link:../../../packages/lucide-react
@@ -1651,10 +1651,6 @@ packages:
'@astrojs/yaml2ts@0.2.4':
resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==}
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
'@babel/code-frame@7.29.7':
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'}
@@ -5691,6 +5687,10 @@ packages:
resolution: {integrity: sha512-DR9t6lfLVdrjgCwpglrR9DR7Ok8/HlXjcOE+goWXF3zyuLUO/ug7vMbSFxTqrQTtbRghJfyhmIZ0S6LhPIy44w==}
engines: {node: '>=20.19'}
'@tanstack/history@1.162.4':
resolution: {integrity: sha512-utTS5L2OkeYUzXGohL1Z8sefu1GLNOJcxe8Hd6iIdc/Xo1K1nDB2JEp4iSFhvYh33xKC9V91TxrS8qfrpoKobQ==}
engines: {node: '>=20.19'}
'@tanstack/react-router@1.170.32':
resolution: {integrity: sha512-SIpxvaTKco100a5ZR3ePmArbhtm3XOx+w1dpGYY9gxHDta4iXSKDdQuhLonwJbIMkVJsU1rwXf0UDHMrF/1snw==}
engines: {node: '>=20.19'}
@@ -5698,15 +5698,22 @@ packages:
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-start-client@1.168.30':
resolution: {integrity: sha512-qsZuykUl1EF0/rc1bin1RtjFzz07YMOTBzhOstSDzbOVm/WKf1QKFTN+qAZi74xlbXSWNuT2MiFRyg4RKwj8iw==}
'@tanstack/react-router@1.170.41':
resolution: {integrity: sha512-Mpvw8Wm5MGDbTqI8Yc9flLKxbOHwoWocv0H2aGKcgw2a017oK5nZWqa954P+DrUx/8fI98YNywnHP5XcD3tQ9w==}
engines: {node: '>=20.19'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-start-client@1.168.39':
resolution: {integrity: sha512-Uby0uo37JlQgUKHU0snDwH9nYiEeAjm9+7pUOFgycU/UszEILC2SO2DSCoNnCMuHKj9z+4URKzBYIP2exT9+wg==}
engines: {node: '>=22.12.0'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-start-rsc@0.1.48':
resolution: {integrity: sha512-UglRdTMuF3c4dvzL/gh4dMVbMWHsPy8ZgTQdT2qpTlyt1b/3m+R40tBFdsfTgw76VTXivW+qV/ih0PN9000XTw==}
'@tanstack/react-start-rsc@0.1.59':
resolution: {integrity: sha512-M2Lqxkk5C1zQncQs5paqX+/OLdOht51pg6D84YfLMrNsjhU/nzb6wd92MIja0mi5i23+L+fxLLjQYR2DObjBlw==}
engines: {node: '>=22.12.0'}
peerDependencies:
'@rspack/core': '>=2.0.0-0'
@@ -5722,15 +5729,15 @@ packages:
react-server-dom-rspack:
optional: true
'@tanstack/react-start-server@1.167.37':
resolution: {integrity: sha512-cODHpFU8vIm7AdHii9W3NEuwyruNmT5wLDZjRsJLT9Jp+7FACnfJrRbvxnp1ldSv/9mxcHKi/OgwbdHQeMZcAQ==}
'@tanstack/react-start-server@1.167.46':
resolution: {integrity: sha512-K7z8xBOEdp8u5CZCxWrbS0tFtk5XZGMdhssLeZlRZKlLDbX7BKLdMtJ7th5sR6QVt9MTUAg3LcoqvJMPSFF+lg==}
engines: {node: '>=22.12.0'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-start@1.168.49':
resolution: {integrity: sha512-iQb1ZoEHqvZMGLR4G7v3tTtgL06yv/bwxvGP3waVHxVn7bRpyopM44YbOluaGkcJzc13ZTvdLKWYNAN3bxMX/Q==}
'@tanstack/react-start@1.168.60':
resolution: {integrity: sha512-WMOM0Xlh2lPbVlbjYM6uOxOpiaWRPvODm/dwkLsGKq5tjyHOHZmKckJgwlrZl7OQUqFlOZHYj8bKUTgoeg8cUQ==}
engines: {node: '>=22.12.0'}
peerDependencies:
'@rsbuild/core': ^2.0.0
@@ -5746,6 +5753,12 @@ packages:
vite:
optional: true
'@tanstack/react-store@0.11.2':
resolution: {integrity: sha512-oj5O5DmiMWE+ih+SioX2ayC1kbK7d3fpLx0B75fPJr9nY3zU+hoW010yr64qXsY/9fyiLVE2bn5mGNV3owm8RQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@tanstack/react-store@0.9.3':
resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==}
peerDependencies:
@@ -5756,10 +5769,18 @@ packages:
resolution: {integrity: sha512-wDwSLvoLwIaNcnx9UNcN9Mb7Y8QwCYq1U1RQZwyN186gnkIoIYI2SOxy8VqH1vFigbkHkk4FmwMAQlghPgDK2g==}
engines: {node: '>=20.19'}
'@tanstack/router-core@1.171.34':
resolution: {integrity: sha512-X+19pGuuLVPvvAvPYw9v/+ktRk5cCll8AtfpBpOhDRmVgUMrfqze0467xtq8YRVVs/mmo5rVtWn/7Tp32RDBKw==}
engines: {node: '>=20.19'}
'@tanstack/router-generator@1.167.33':
resolution: {integrity: sha512-Z3lCWIPuRUMPmuI8Mm48x/s49TxmHOaFVZ52j1W1QKYrsFHyT6U/h9bqfHJDxfQ8kz7y9q+W1YPKZ15Ee7yuCA==}
engines: {node: '>=20.19'}
'@tanstack/router-generator@1.167.40':
resolution: {integrity: sha512-WkEueqEvsBBudzO0fx1nWfOmRNW8OAvBoVABTGls9bAWzjdC+KDGHvjCNrvn88ofs1F6gqL8aWnzKCbxW3dCyQ==}
engines: {node: '>=20.19'}
'@tanstack/router-plugin@1.168.35':
resolution: {integrity: sha512-foDAZKFqHXae+oFbIgcsSvy2QCVRn7XdS3nhwcRvD+ed6JrKPUP/1lQMsZLJqWycgR1vkZF7gs955KGa0NZQ0w==}
engines: {node: '>=20.19'}
@@ -5781,20 +5802,45 @@ packages:
webpack:
optional: true
'@tanstack/router-plugin@1.168.42':
resolution: {integrity: sha512-vAR5WXJh/ErseEWQftDhsJcr2c++ucRQ6FbqN3ygMO44+ZxxRfW3sIpZmddHROVSmBk8jc6MrwjTPNjVhd62Vw==}
engines: {node: '>=20.19'}
peerDependencies:
'@rsbuild/core': '>=1.0.2 || ^2.0.0'
'@tanstack/react-router': ^1.170.41
vite: ^7.3.6
vite-plugin-solid: ^2.11.10 || ^3.0.0-0
webpack: '>=5.92.0'
peerDependenciesMeta:
'@rsbuild/core':
optional: true
'@tanstack/react-router':
optional: true
vite:
optional: true
vite-plugin-solid:
optional: true
webpack:
optional: true
'@tanstack/router-utils@1.162.2':
resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==}
engines: {node: '>=20.19'}
'@tanstack/start-client-core@1.170.27':
resolution: {integrity: sha512-Ro6ZSM0NgYKDMxM0e8qyU4mBfnld2Zb74BA/9f4i35C0Y3IAA8Zxs/DIPfOo9VRYWp5c5n5Q8dRBn2qn0vtPhQ==}
'@tanstack/router-utils@1.162.3':
resolution: {integrity: sha512-Icb0xGuG1+54IV0WMLRcc3ErTx2HeJWyPG661FkQ8UT6guoBq1FJjFRqlG/JS0xi4mFFkBhvwO7tbLa32f3yxA==}
engines: {node: '>=20.19'}
'@tanstack/start-client-core@1.170.34':
resolution: {integrity: sha512-LfwZSbau2MLLZ/uPAoO+NC9fK3J66c0wLhnNQqIa+Goqw7bXPjkHwlsjY7evlUz1AnyhhQ1Qab95v+VmP0TZ9A==}
engines: {node: '>=22.12.0'}
'@tanstack/start-fn-stubs@1.162.0':
resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==}
engines: {node: '>=22.12.0'}
'@tanstack/start-plugin-core@1.171.39':
resolution: {integrity: sha512-Zyj6G4MDFLXcHYhPavhewCBo8dsxi3qvPk31zl/QtTzYzOY9rJHDDBGarKsJq20ziChmkGn/sttYqb4vGCxJDA==}
'@tanstack/start-plugin-core@1.171.49':
resolution: {integrity: sha512-HPOb7LnMc71k38cd5uvMybPPUU/Q/56KvSqQzSWz7cps1ZDFXaxUM6EFaFHLCdgTWqGexNGDdRE+sUVPVBM4Xg==}
engines: {node: '>=22.12.0'}
peerDependencies:
'@rsbuild/core': ^2.0.0
@@ -5805,14 +5851,17 @@ packages:
vite:
optional: true
'@tanstack/start-server-core@1.169.31':
resolution: {integrity: sha512-56w8l+Fao01YCrmv0hzNxL3b3FRmqLRGdE11izZNQsW+1CcSYuehAM5khWKABuI1DI/UIBLGV7BwL4Dlg0eHCw==}
'@tanstack/start-server-core@1.169.39':
resolution: {integrity: sha512-pqqkxhXY46nuFSYt6TsMGyABiplUzHFHndKAlRRGC0fWDrJCH1koWxVMoxySa51ZETV79f/z73b5UZ1jfIkXwQ==}
engines: {node: '>=22.12.0'}
'@tanstack/start-storage-context@1.167.29':
resolution: {integrity: sha512-8qfprC5774XMRDQlMogkfiGpFLiBf0xDG4bMFUbfkSzpCAQwpLbgGY4Zwft22O9rKYq2vUXusKAdVjvJTUEquQ==}
'@tanstack/start-storage-context@1.167.36':
resolution: {integrity: sha512-x+xCXK2GtFzY6NbXqAg8YpU6cwAjDfMeYSNzxfGzntpjbwBRHHrXeC/kYUnBBQCV7wK4kJ8vBBQGP0OyYTasUg==}
engines: {node: '>=22.12.0'}
'@tanstack/store@0.11.2':
resolution: {integrity: sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==}
'@tanstack/store@0.9.3':
resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==}
@@ -11413,6 +11462,12 @@ packages:
peerDependencies:
seroval: ^1.0
seroval-plugins@1.6.7:
resolution: {integrity: sha512-4Nk35ttD3DTDJW4hgw5StsVAPeU6qnDFnULAouw6tQ7oLTV/ICXrWpsXo2EE52eSP2joUMazbVf52mFEcADqRw==}
engines: {node: '>=10'}
peerDependencies:
seroval: ^1.0
seroval@1.5.6:
resolution: {integrity: sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA==}
engines: {node: '>=10'}
@@ -11421,6 +11476,10 @@ packages:
resolution: {integrity: sha512-LErWMNS2RRFdu2RMA5u/PA59/IWs0XsikyEXGQ2/36iEWFrdG0ABmg17E17cikrv76891kOAMq3TkTFXpwAHXw==}
engines: {node: '>=10'}
seroval@1.6.7:
resolution: {integrity: sha512-AeDcLh0yO2SFm9W71essgnSzLV9DI8ZH0x0knXn2DMnUZj728mpLbxjlbB6IqKCmqh8JA3cEqRyGoNkt584JcQ==}
engines: {node: '>=10'}
serve-placeholder@2.0.2:
resolution: {integrity: sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==}
@@ -13784,12 +13843,6 @@ snapshots:
dependencies:
yaml: 2.9.0
'@babel/code-frame@7.27.1':
dependencies:
'@babel/helper-validator-identifier': 7.29.7
js-tokens: 4.0.0
picocolors: 1.1.1
'@babel/code-frame@7.29.7':
dependencies:
'@babel/helper-validator-identifier': 7.29.7
@@ -17721,6 +17774,8 @@ snapshots:
'@tanstack/history@1.162.1': {}
'@tanstack/history@1.162.4': {}
'@tanstack/react-router@1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@tanstack/history': 1.162.1
@@ -17730,23 +17785,32 @@ snapshots:
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
'@tanstack/react-start-client@1.168.30(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
'@tanstack/react-router@1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@tanstack/react-router': 1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.27
'@tanstack/start-client-core': 1.170.27
'@tanstack/history': 1.162.4
'@tanstack/react-store': 0.11.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.34
isbot: 5.2.2
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
'@tanstack/react-start-rsc@0.1.48(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
'@tanstack/react-start-client@1.168.39(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@tanstack/react-router': 1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.27
'@tanstack/router-utils': 1.162.2(supports-color@10.2.2)
'@tanstack/start-client-core': 1.170.27
'@tanstack/react-router': 1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.34
'@tanstack/start-client-core': 1.170.34
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
'@tanstack/react-start-rsc@0.1.59(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
dependencies:
'@tanstack/react-router': 1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.34
'@tanstack/router-utils': 1.162.3(supports-color@10.2.2)
'@tanstack/start-client-core': 1.170.34
'@tanstack/start-fn-stubs': 1.162.0
'@tanstack/start-plugin-core': 1.171.39(@tanstack/react-router@1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(crossws@0.4.12(srvx@1.0.1))(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/start-storage-context': 1.167.29
'@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/start-storage-context': 1.167.36
pathe: 2.0.3
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
@@ -17764,26 +17828,26 @@ snapshots:
- vite-plugin-solid
- webpack
'@tanstack/react-start-server@1.167.37(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
'@tanstack/react-start-server@1.167.46(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@tanstack/react-router': 1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.27
'@tanstack/start-server-core': 1.169.31(crossws@0.4.12(srvx@1.0.1))
'@tanstack/react-router': 1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-core': 1.171.34
'@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.1))
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
transitivePeerDependencies:
- crossws
'@tanstack/react-start@1.168.49(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
'@tanstack/react-start@1.168.60(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
dependencies:
'@tanstack/react-router': 1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/react-start-client': 1.168.30(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/react-start-rsc': 0.1.48(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/react-start-server': 1.167.37(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-utils': 1.162.2(supports-color@10.2.2)
'@tanstack/start-client-core': 1.170.27
'@tanstack/start-plugin-core': 1.171.39(@tanstack/react-router@1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(crossws@0.4.12(srvx@1.0.1))(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/start-server-core': 1.169.31(crossws@0.4.12(srvx@1.0.1))
'@tanstack/react-router': 1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/react-start-client': 1.168.39(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/react-start-rsc': 0.1.59(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/react-start-server': 1.167.46(crossws@0.4.12(srvx@1.0.1))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
'@tanstack/router-utils': 1.162.3(supports-color@10.2.2)
'@tanstack/start-client-core': 1.170.34
'@tanstack/start-plugin-core': 1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.1))
pathe: 2.0.3
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
@@ -17803,6 +17867,13 @@ snapshots:
- vite-plugin-solid
- webpack
'@tanstack/react-store@0.11.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@tanstack/store': 0.11.2
react: 19.2.8
react-dom: 19.2.8(react@19.2.8)
use-sync-external-store: 1.6.0(react@19.2.8)
'@tanstack/react-store@0.9.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
'@tanstack/store': 0.9.3
@@ -17817,6 +17888,13 @@ snapshots:
seroval: 1.6.4
seroval-plugins: 1.6.4(seroval@1.6.4)
'@tanstack/router-core@1.171.34':
dependencies:
'@tanstack/history': 1.162.4
cookie-es: 3.1.1
seroval: 1.6.7
seroval-plugins: 1.6.7(seroval@1.6.7)
'@tanstack/router-generator@1.167.33(supports-color@10.2.2)':
dependencies:
'@babel/types': 7.29.8
@@ -17830,6 +17908,19 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-generator@1.167.40(supports-color@10.2.2)':
dependencies:
'@babel/types': 7.29.8
'@tanstack/router-core': 1.171.34
'@tanstack/router-utils': 1.162.3(supports-color@10.2.2)
'@tanstack/virtual-file-routes': 1.162.0
jiti: 2.7.0
magic-string: 0.30.21
prettier: 3.9.6
zod: 4.6.5
transitivePeerDependencies:
- supports-color
'@tanstack/router-plugin@1.168.35(@tanstack/react-router@1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
dependencies:
'@babel/core': 7.29.7(supports-color@10.2.2)
@@ -17855,6 +17946,31 @@ snapshots:
- supports-color
- unloader
'@tanstack/router-plugin@1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
dependencies:
'@babel/core': 7.29.7(supports-color@10.2.2)
'@babel/template': 7.29.7
'@babel/types': 7.29.8
'@tanstack/router-core': 1.171.34
'@tanstack/router-generator': 1.167.40(supports-color@10.2.2)
'@tanstack/router-utils': 1.162.3(supports-color@10.2.2)
chokidar: 5.0.0
unplugin: 3.3.0(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
zod: 4.6.5
optionalDependencies:
'@tanstack/react-router': 1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
vite: 7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)
vite-plugin-solid: 2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
transitivePeerDependencies:
- '@farmfe/core'
- '@rspack/core'
- bun-types-no-globals
- esbuild
- rolldown
- rollup
- supports-color
- unloader
'@tanstack/router-utils@1.162.2(supports-color@10.2.2)':
dependencies:
'@babel/generator': 7.29.8
@@ -17868,30 +17984,44 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/start-client-core@1.170.27':
'@tanstack/router-utils@1.162.3(supports-color@10.2.2)':
dependencies:
'@tanstack/router-core': 1.171.27
'@babel/generator': 7.29.8
'@babel/parser': 7.29.8
'@babel/types': 7.29.8
ansis: 4.3.1
babel-dead-code-elimination: 1.0.12(supports-color@10.2.2)
diff: 8.0.4
pathe: 2.0.3
tinyglobby: 0.2.17
transitivePeerDependencies:
- supports-color
'@tanstack/start-client-core@1.170.34':
dependencies:
'@tanstack/router-core': 1.171.34
'@tanstack/start-fn-stubs': 1.162.0
'@tanstack/start-storage-context': 1.167.29
seroval: 1.6.4
'@tanstack/start-storage-context': 1.167.36
seroval: 1.6.7
'@tanstack/start-fn-stubs@1.162.0': {}
'@tanstack/start-plugin-core@1.171.39(@tanstack/react-router@1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(crossws@0.4.12(srvx@1.0.1))(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
'@tanstack/start-plugin-core@1.171.49(@tanstack/react-router@1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(crossws@0.4.12(srvx@1.0.1))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/code-frame': 7.29.7
'@babel/core': 7.29.7(supports-color@10.2.2)
'@babel/types': 7.29.8
'@tanstack/router-core': 1.171.27
'@tanstack/router-generator': 1.167.33(supports-color@10.2.2)
'@tanstack/router-plugin': 1.168.35(@tanstack/react-router@1.170.32(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/router-utils': 1.162.2(supports-color@10.2.2)
'@tanstack/start-server-core': 1.169.31(crossws@0.4.12(srvx@1.0.1))
'@jridgewell/remapping': 2.3.5
'@tanstack/router-core': 1.171.34
'@tanstack/router-generator': 1.167.40(supports-color@10.2.2)
'@tanstack/router-plugin': 1.168.42(@tanstack/react-router@1.170.41(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(esbuild@0.28.2)(rolldown@1.2.7)(rollup@4.63.1)(supports-color@10.2.2)(vite-plugin-solid@2.11.14(@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10))(solid-js@1.9.15)(supports-color@10.2.2)(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0)))(vite@7.3.6(@types/node@26.4.1)(jiti@2.7.0)(less@4.9.1(supports-color@10.2.2))(lightningcss@1.33.0)(sass@1.103.1)(stylus@0.56.0(supports-color@10.2.2))(terser@5.51.2)(yaml@2.9.0))
'@tanstack/router-utils': 1.162.3(supports-color@10.2.2)
'@tanstack/start-server-core': 1.169.39(crossws@0.4.12(srvx@1.0.1))
exsolve: 1.1.1
lightningcss: 1.33.0
pathe: 2.0.3
picomatch: 4.0.7
seroval: 1.6.4
seroval: 1.6.7
source-map: 0.7.6
srvx: 0.11.22
tinyglobby: 0.2.17
@@ -17915,21 +18045,23 @@ snapshots:
- vite-plugin-solid
- webpack
'@tanstack/start-server-core@1.169.31(crossws@0.4.12(srvx@1.0.1))':
'@tanstack/start-server-core@1.169.39(crossws@0.4.12(srvx@1.0.1))':
dependencies:
'@tanstack/history': 1.162.1
'@tanstack/router-core': 1.171.27
'@tanstack/start-client-core': 1.170.27
'@tanstack/start-storage-context': 1.167.29
'@tanstack/history': 1.162.4
'@tanstack/router-core': 1.171.34
'@tanstack/start-client-core': 1.170.34
'@tanstack/start-storage-context': 1.167.36
fetchdts: 0.1.7
h3-v2: h3@2.0.1-rc.20(crossws@0.4.12(srvx@1.0.1))
seroval: 1.6.4
seroval: 1.6.7
transitivePeerDependencies:
- crossws
'@tanstack/start-storage-context@1.167.29':
'@tanstack/start-storage-context@1.167.36':
dependencies:
'@tanstack/router-core': 1.171.27
'@tanstack/router-core': 1.171.34
'@tanstack/store@0.11.2': {}
'@tanstack/store@0.9.3': {}
@@ -24991,10 +25123,16 @@ snapshots:
dependencies:
seroval: 1.6.4
seroval-plugins@1.6.7(seroval@1.6.7):
dependencies:
seroval: 1.6.7
seroval@1.5.6: {}
seroval@1.6.4: {}
seroval@1.6.7: {}
serve-placeholder@2.0.2:
dependencies:
defu: 6.1.7