feat(todo): refactor inline title editing + kanban subtask DnD

- TaskItem: switch title editing to <input>-based pattern (isEditingTitle
  state, single-click to start, blur/Enter saves, Escape cancels)
- KanbanTaskCard: contenteditable span for title editing (blur-to-save),
  add ArrowsOutSimple detail button (hover-only), inline subtask DnD
  with shadow placeholder handling and dropInProgress guard
- SubtaskList: fix DnD reactivity loop — use $state instead of $derived
  for items, add SHADOW_PLACEHOLDER_ITEM_ID filter, dropInProgress flag

fix(guides): remove non-existent allAppsHref prop from PillNavigation
fix(memoro): extend Memory interface with memo_id, timestamps, nullable types

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-31 22:23:31 +02:00
parent 16057964a6
commit 3f0811043e
6 changed files with 522 additions and 612 deletions

View file

@ -158,7 +158,6 @@
showAppSwitcher={true}
{appItems}
{userEmail}
allAppsHref="/apps"
/>
<main class="relative z-0 pb-24" style="padding-top: 0">

View file

@ -19,9 +19,12 @@ export interface QuestionResult {
export interface Memory {
id: string;
memo_id: string;
title: string;
content: string;
metadata?: Record<string, unknown>;
content: string | null;
metadata?: Record<string, unknown> | null;
created_at: string;
updated_at: string;
}
class QuestionService {

View file

@ -1,7 +1,8 @@
<script lang="ts">
import type { Subtask } from '@todo/shared';
import { dndzone } from 'svelte-dnd-action';
import { dndzone, SHADOW_PLACEHOLDER_ITEM_ID } from 'svelte-dnd-action';
import { flip } from 'svelte/animate';
import { untrack } from 'svelte';
import { Check, Plus, X, DotsSixVertical } from '@manacore/shared-icons';
interface Props {
@ -12,24 +13,36 @@
let { subtasks, onChange }: Props = $props();
let newSubtaskTitle = $state('');
let editingId = $state<string | null>(null);
let editingTitle = $state('');
let items = $state<Subtask[]>([]);
let dropInProgress = false;
// Convert subtasks to items with id for dnd
let items = $derived(
subtasks.map((s, index) => ({
...s,
id: s.id,
order: index,
}))
);
$effect(() => {
const current = subtasks;
untrack(() => {
const currentIds = new Set(current.map((s) => s.id));
const itemIds = new Set(items.filter((i) => i.id !== SHADOW_PLACEHOLDER_ITEM_ID).map((i) => i.id));
const idsChanged =
currentIds.size !== itemIds.size || current.some((s) => !itemIds.has(s.id));
if (idsChanged) {
items = current.map((s, i) => ({ ...s, order: i }));
dropInProgress = false;
} else if (!dropInProgress) {
const map = new Map(current.map((s) => [s.id, s]));
items = items.map((item) => map.get(item.id) ?? item);
}
});
});
function handleDndConsider(e: CustomEvent<{ items: Subtask[] }>) {
onChange(e.detail.items.map((item, index) => ({ ...item, order: index })));
items = e.detail.items;
}
function handleDndFinalize(e: CustomEvent<{ items: Subtask[] }>) {
onChange(e.detail.items.map((item, index) => ({ ...item, order: index })));
items = e.detail.items.filter((item) => item.id !== SHADOW_PLACEHOLDER_ITEM_ID);
onChange(items.map((item, index) => ({ ...item, order: index })));
dropInProgress = true;
setTimeout(() => { dropInProgress = false; }, 500);
}
function toggleComplete(id: string) {
@ -49,34 +62,24 @@
onChange(subtasks.filter((s) => s.id !== id));
}
function startEditing(subtask: Subtask) {
editingId = subtask.id;
editingTitle = subtask.title;
}
function saveEdit() {
if (!editingId || !editingTitle.trim()) {
cancelEdit();
return;
function handleTitleBlur(e: FocusEvent, subtask: Subtask) {
const el = e.target as HTMLElement;
const trimmed = (el.textContent || '').trim();
if (trimmed && trimmed !== subtask.title) {
onChange(subtasks.map((s) => (s.id === subtask.id ? { ...s, title: trimmed } : s)));
} else {
el.textContent = subtask.title;
}
const updated = subtasks.map((s) =>
s.id === editingId ? { ...s, title: editingTitle.trim() } : s
);
onChange(updated);
cancelEdit();
}
function cancelEdit() {
editingId = null;
editingTitle = '';
}
function handleEditKeydown(e: KeyboardEvent) {
function handleTitleKeydown(e: KeyboardEvent, subtask: Subtask) {
if (e.key === 'Enter') {
e.preventDefault();
saveEdit();
(e.target as HTMLElement).blur();
} else if (e.key === 'Escape') {
cancelEdit();
const el = e.target as HTMLElement;
el.textContent = subtask.title;
el.blur();
}
}
@ -111,7 +114,13 @@
onfinalize={handleDndFinalize}
>
{#each items as subtask (subtask.id)}
<div class="subtask-item" animate:flip={{ duration: 200 }}>
<div
class="subtask-item"
animate:flip={{ duration: 200 }}
onpointerdown={(e) => {
if (!(e.target as HTMLElement).closest('.drag-handle')) e.stopPropagation();
}}
>
<!-- Drag handle -->
<div class="drag-handle" aria-label="Ziehen zum Sortieren">
<DotsSixVertical size={16} />
@ -129,25 +138,17 @@
{/if}
</button>
<!-- Title (editable) -->
{#if editingId === subtask.id}
<input
type="text"
class="subtask-edit-input"
bind:value={editingTitle}
onkeydown={handleEditKeydown}
onblur={saveEdit}
/>
{:else}
<button
type="button"
class="subtask-title"
class:completed={subtask.isCompleted}
ondblclick={() => startEditing(subtask)}
>
{subtask.title}
</button>
{/if}
<!-- svelte-ignore a11y_no_static_element_interactions -->
<span
class="subtask-title"
class:completed={subtask.isCompleted}
contenteditable="true"
role="textbox"
spellcheck="false"
onclick={(e) => e.stopPropagation()}
onkeydown={(e) => handleTitleKeydown(e, subtask)}
onblur={(e) => handleTitleBlur(e, subtask)}
>{subtask.title}</span>
<!-- Delete button -->
<button
@ -257,13 +258,12 @@
.subtask-title {
flex: 1;
text-align: left;
background: none;
border: none;
padding: 0;
font-size: 0.875rem;
color: var(--color-foreground);
cursor: text;
outline: none;
word-break: break-word;
min-width: 0;
}
.subtask-title.completed {
@ -271,17 +271,6 @@
color: var(--color-muted-foreground);
}
.subtask-edit-input {
flex: 1;
background: var(--color-surface-elevated-3);
border: 1px solid var(--color-primary);
border-radius: 0.375rem;
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
color: var(--color-foreground);
outline: none;
}
.subtask-delete {
opacity: 0;
padding: 0.25rem;

View file

@ -153,43 +153,39 @@
}
// Inline title editing
let titleRef = $state<HTMLSpanElement | null>(null);
let inlineTitleInputRef = $state<HTMLInputElement | null>(null);
let isEditingTitle = $state(false);
let editTitleValue = $state('');
function handleTitleKeydown(e: KeyboardEvent) {
function startTitleEdit(e: MouseEvent) {
e.stopPropagation();
editTitleValue = task.title;
isEditingTitle = true;
}
$effect(() => {
if (isEditingTitle && inlineTitleInputRef) {
inlineTitleInputRef.focus();
inlineTitleInputRef.select();
}
});
function handleInlineTitleKeydown(e: KeyboardEvent) {
if (e.key === 'Enter') {
e.preventDefault();
titleRef?.blur();
inlineTitleInputRef?.blur();
} else if (e.key === 'Escape') {
if (titleRef) titleRef.textContent = task.title;
titleRef?.blur();
} else if (e.key === 'Tab' || e.key === 'ArrowDown' || e.key === 'ArrowUp') {
const direction = e.key === 'ArrowUp' || (e.key === 'Tab' && e.shiftKey) ? -1 : 1;
e.preventDefault();
const allTitles = Array.from(
document.querySelectorAll<HTMLElement>('.task-title[contenteditable]')
);
const currentIndex = allTitles.indexOf(titleRef!);
const nextTitle = allTitles[currentIndex + direction];
titleRef?.blur();
if (nextTitle) {
nextTitle.focus();
} else {
// No next/prev todo — focus QuickInputBar
const input = document.querySelector<HTMLInputElement>('.quick-input-bar input');
input?.focus();
}
editTitleValue = task.title;
isEditingTitle = false;
}
}
function handleTitleBlur() {
if (!titleRef) return;
const trimmed = (titleRef.textContent || '').trim();
function handleInlineTitleBlur() {
const trimmed = editTitleValue.trim();
if (trimmed && trimmed !== task.title) {
onSave?.({ title: trimmed });
} else {
// Revert if empty or unchanged
titleRef.textContent = task.title;
}
isEditingTitle = false;
}
function handleContentClick() {
@ -336,20 +332,25 @@
<!-- Content -->
<div class="task-content">
<!-- svelte-ignore a11y_no_static_element_interactions -->
<span
bind:this={titleRef}
class="task-title"
class:line-through={task.isCompleted}
contenteditable="true"
role="textbox"
spellcheck="true"
onkeydown={handleTitleKeydown}
onblur={handleTitleBlur}
onclick={(e) => e.stopPropagation()}
>
{task.title}
</span>
{#if isEditingTitle}
<input
bind:this={inlineTitleInputRef}
class="task-title-edit"
bind:value={editTitleValue}
onclick={(e) => e.stopPropagation()}
onkeydown={handleInlineTitleKeydown}
onblur={handleInlineTitleBlur}
/>
{:else}
<!-- svelte-ignore a11y_no_static_element_interactions -->
<span
class="task-title"
class:line-through={task.isCompleted}
onclick={startTitleEdit}
>
{task.title}
</span>
{/if}
<!-- Labels below title -->
{#if task.labels && task.labels.length > 0}
@ -746,12 +747,14 @@
cursor: pointer;
border-radius: 0.375rem;
opacity: 0;
pointer-events: none;
transition: all 0.15s;
padding: 0;
}
.task-item:hover .detail-btn {
opacity: 1;
pointer-events: auto;
}
.detail-btn:hover {
@ -888,13 +891,11 @@
border-radius: 0.25rem;
padding: 0.125rem 0.25rem;
margin: -0.125rem -0.25rem;
outline: none;
transition: background 0.1s;
user-select: none;
}
.task-title:focus {
background: color-mix(in srgb, var(--color-primary) 6%, transparent);
outline: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
.task-title:hover {
background: color-mix(in srgb, var(--color-primary) 5%, transparent);
}
.task-title.line-through {
@ -902,6 +903,20 @@
color: var(--color-muted-foreground);
}
.task-title-edit {
font-size: 0.875rem;
font-weight: 500;
color: var(--color-foreground);
background: color-mix(in srgb, var(--color-primary) 6%, transparent);
border: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
border-radius: 0.25rem;
padding: 0.125rem 0.25rem;
margin: -0.125rem -0.25rem;
outline: none;
width: calc(100% + 0.5rem);
word-break: break-word;
}
/* Meta info */
.task-meta {
display: flex;

View file

@ -1,5 +1,5 @@
<script lang="ts">
import type { Task } from '@todo/shared';
import type { Task, Subtask } from '@todo/shared';
import { isToday, isPast } from 'date-fns';
import { formatDueDate } from '$lib/utils/date-display';
import { getSubtaskProgress } from '$lib/utils/task-helpers';
@ -7,13 +7,18 @@
import TaskEditModal from '../TaskEditModal.svelte';
import {
ArrowsClockwise,
ArrowsOutSimple,
CalendarBlank,
Check,
CheckSquare,
DotsSixVertical,
Note,
Trash,
} from '@manacore/shared-icons';
import { PRIORITY_BG_CLASSES } from '$lib/constants/priority';
import { dndzone, SHADOW_PLACEHOLDER_ITEM_ID } from 'svelte-dnd-action';
import { flip } from 'svelte/animate';
import { untrack } from 'svelte';
interface Props {
task: Task;
@ -31,10 +36,7 @@
// Completion animation
let isAnimatingComplete = $state(false);
// Inline edit state
let isEditingTitle = $state(false);
let editTitle = $state('');
let titleInputRef = $state<HTMLInputElement | null>(null);
let titleSpanRef = $state<HTMLElement | null>(null);
// Context menu state
let showContextMenu = $state(false);
@ -61,8 +63,7 @@
// Click to open modal
function handleCardClick(e: MouseEvent) {
// Don't open modal if clicking on checkbox or during inline edit or animation
if (isEditingTitle || isAnimatingComplete) return;
if (isAnimatingComplete) return;
const target = e.target as HTMLElement;
if (target.closest('.task-checkbox')) return;
showModal = true;
@ -82,40 +83,29 @@
}, 500);
}
// Double-click to edit title inline
function handleTitleDoubleClick(e: MouseEvent) {
function handleOpenModal(e: MouseEvent) {
e.stopPropagation();
editTitle = task.title;
isEditingTitle = true;
// Focus input after render
setTimeout(() => {
titleInputRef?.focus();
titleInputRef?.select();
}, 0);
showModal = true;
}
// Save inline title edit
function saveInlineTitle() {
if (editTitle.trim() && editTitle.trim() !== task.title) {
onSave?.({ title: editTitle.trim() });
function handleTitleBlur(e: FocusEvent) {
const el = e.target as HTMLElement;
const trimmed = (el.textContent || '').trim();
if (trimmed && trimmed !== task.title) {
onSave?.({ title: trimmed });
} else {
el.textContent = task.title;
}
isEditingTitle = false;
}
// Cancel inline title edit
function cancelInlineTitle() {
isEditingTitle = false;
editTitle = '';
}
// Handle title input keydown
function handleTitleKeydown(e: KeyboardEvent) {
if (e.key === 'Enter') {
e.preventDefault();
saveInlineTitle();
(e.target as HTMLElement).blur();
} else if (e.key === 'Escape') {
e.preventDefault();
cancelInlineTitle();
const el = e.target as HTMLElement;
el.textContent = task.title;
el.blur();
}
}
@ -168,6 +158,37 @@
showModal = false;
}
// Inline subtask DnD state
let subtaskItems = $state<Subtask[]>([]);
let subtaskDropInProgress = false;
$effect(() => {
const current = task.subtasks ?? [];
untrack(() => {
const newIds = new Set(current.map((s) => s.id));
const oldIds = new Set(subtaskItems.filter((s) => s.id !== SHADOW_PLACEHOLDER_ITEM_ID).map((s) => s.id));
const idsChanged = newIds.size !== oldIds.size || current.some((s) => !oldIds.has(s.id));
if (idsChanged) {
subtaskItems = [...current];
subtaskDropInProgress = false;
} else if (!subtaskDropInProgress) {
const map = new Map(current.map((s) => [s.id, s]));
subtaskItems = subtaskItems.map((item) => map.get(item.id) ?? item);
}
});
});
function handleSubtaskConsider(e: CustomEvent<{ items: Subtask[] }>) {
subtaskItems = e.detail.items;
}
function handleSubtaskFinalize(e: CustomEvent<{ items: Subtask[] }>) {
subtaskItems = e.detail.items.filter((s) => s.id !== SHADOW_PLACEHOLDER_ITEM_ID);
onSave?.({ subtasks: subtaskItems });
subtaskDropInProgress = true;
setTimeout(() => { subtaskDropInProgress = false; }, 500);
}
function toggleSubtask(subtaskId: string) {
if (!onSave) return;
const subtasks = $state.snapshot(task.subtasks) ?? [];
@ -213,24 +234,18 @@
<!-- Content -->
<div class="task-content">
{#if isEditingTitle}
<input
bind:this={titleInputRef}
type="text"
class="title-input"
bind:value={editTitle}
onkeydown={handleTitleKeydown}
onblur={saveInlineTitle}
/>
{:else}
<span
class="task-title"
class:line-through={task.isCompleted || isAnimatingComplete}
ondblclick={handleTitleDoubleClick}
>
{task.title}
</span>
{/if}
<!-- svelte-ignore a11y_no_static_element_interactions -->
<span
bind:this={titleSpanRef}
class="task-title"
class:line-through={task.isCompleted || isAnimatingComplete}
contenteditable={!task.isCompleted && !isAnimatingComplete}
role="textbox"
spellcheck="false"
onclick={(e) => e.stopPropagation()}
onkeydown={handleTitleKeydown}
onblur={handleTitleBlur}
>{task.title}</span>
<!-- Meta info -->
{#if dueDateText() || subtaskProgress() || (task.labels && task.labels.length > 0)}
@ -263,6 +278,17 @@
{/if}
</div>
<!-- Detail modal button -->
<button
type="button"
class="detail-btn"
onclick={handleOpenModal}
title="Details öffnen"
tabindex="-1"
>
<ArrowsOutSimple size={14} />
</button>
<!-- Contacts display -->
{#if task.metadata?.assignee || (task.metadata?.involvedContacts && task.metadata.involvedContacts.length > 0)}
<div class="contacts-display">
@ -292,23 +318,38 @@
</div>
<!-- Inline subtasks — shown while incomplete; during animation all appear as done -->
{#if task.subtasks && task.subtasks.length > 0 && !task.isCompleted}
{#if subtaskItems.length > 0 && !task.isCompleted}
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div class="subtasks-inline" onpointerdown={(e) => e.stopPropagation()}>
{#each task.subtasks as subtask (subtask.id)}
<button
<div
class="subtasks-inline"
use:dndzone={{ items: subtaskItems, flipDurationMs: 150, dropTargetStyle: {}, type: 'subtask-inline' }}
onconsider={handleSubtaskConsider}
onfinalize={handleSubtaskFinalize}
>
{#each subtaskItems.filter((s) => s.id !== SHADOW_PLACEHOLDER_ITEM_ID) as subtask (subtask.id)}
<div
class="subtask-row"
class:done={subtask.isCompleted || isAnimatingComplete}
onclick={(e) => {
e.stopPropagation();
if (!isAnimatingComplete) toggleSubtask(subtask.id);
animate:flip={{ duration: 150 }}
onpointerdown={(e) => {
if (!(e.target as HTMLElement).closest('.subtask-drag-handle')) e.stopPropagation();
}}
>
<span class="subtask-check" class:checked={subtask.isCompleted || isAnimatingComplete}>
{#if subtask.isCompleted || isAnimatingComplete}<Check size={10} />{/if}
</span>
<span class="subtask-drag-handle"><DotsSixVertical size={10} /></span>
<button
class="subtask-check-btn"
class:checked={subtask.isCompleted || isAnimatingComplete}
onclick={(e) => {
e.stopPropagation();
if (!isAnimatingComplete) toggleSubtask(subtask.id);
}}
>
<span class="subtask-check" class:checked={subtask.isCompleted || isAnimatingComplete}>
{#if subtask.isCompleted || isAnimatingComplete}<Check size={10} />{/if}
</span>
</button>
<span class="subtask-title">{subtask.title}</span>
</button>
</div>
{/each}
</div>
{/if}
@ -455,6 +496,37 @@
color: white;
}
/* Detail modal button */
.detail-btn {
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
width: 1.5rem;
height: 1.5rem;
border: none;
background: transparent;
color: var(--color-muted-foreground);
cursor: pointer;
border-radius: 0.375rem;
opacity: 0;
pointer-events: none;
transition: opacity 0.15s;
padding: 0;
margin-top: 0.1rem;
}
.kanban-card:hover .detail-btn {
opacity: 0.6;
pointer-events: auto;
}
.detail-btn:hover {
opacity: 1 !important;
color: var(--color-primary);
background: color-mix(in srgb, var(--color-primary) 10%, transparent);
}
/* Content */
.task-content {
flex: 1;
@ -468,9 +540,22 @@
font-size: 0.9375rem;
font-weight: 400;
color: hsl(var(--color-foreground));
cursor: pointer;
cursor: text;
line-height: 1.4;
word-break: break-word;
border-radius: 0.25rem;
padding: 0.125rem 0.25rem;
margin: -0.125rem -0.25rem;
transition: background 0.1s;
outline: none;
}
.task-title:hover {
background: color-mix(in srgb, var(--color-primary) 5%, transparent);
}
.task-title:focus {
background: color-mix(in srgb, var(--color-primary) 5%, transparent);
}
:global(.dark) .task-title {
@ -482,24 +567,6 @@
opacity: 0.5;
}
/* Inline title input */
.title-input {
width: 100%;
font-size: 0.875rem;
font-weight: 500;
color: #374151;
background: rgba(255, 255, 255, 0.9);
border: 1px solid #8b5cf6;
border-radius: 0.5rem;
padding: 0.25rem 0.5rem;
outline: none;
}
:global(.dark) .title-input {
background: rgba(30, 30, 30, 0.9);
color: #f3f4f6;
border-color: #8b5cf6;
}
/* Meta info */
.task-meta {
@ -670,13 +737,36 @@
.subtask-row {
display: flex;
align-items: flex-start;
gap: 0.625rem;
gap: 0.375rem;
padding: 0.15rem 0;
width: 100%;
}
.subtask-drag-handle {
display: flex;
align-items: center;
color: var(--color-muted-foreground);
opacity: 0;
cursor: grab;
flex-shrink: 0;
margin-top: 0.2rem;
transition: opacity 0.15s;
}
.subtask-row:hover .subtask-drag-handle {
opacity: 0.5;
}
.subtask-drag-handle:hover {
opacity: 1 !important;
}
.subtask-check-btn {
background: transparent;
border: none;
padding: 0;
cursor: pointer;
text-align: left;
width: 100%;
flex-shrink: 0;
}
.subtask-check {
@ -688,7 +778,6 @@
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.15s;
color: white;
margin-top: 0.2rem;
@ -698,7 +787,7 @@
border-color: rgba(255, 255, 255, 0.35);
}
.subtask-check:hover {
.subtask-check-btn:hover .subtask-check {
border-color: #8b5cf6;
}
@ -708,6 +797,7 @@
}
.subtask-title {
flex: 1;
font-size: 0.9375rem;
font-weight: 400;
color: hsl(var(--color-foreground));
@ -715,10 +805,6 @@
word-break: break-word;
}
:global(.dark) .subtask-title {
color: hsl(var(--color-foreground));
}
.subtask-row.done .subtask-title {
text-decoration: line-through;
opacity: 0.45;

628
pnpm-lock.yaml generated
View file

@ -1546,6 +1546,146 @@ importers:
specifier: ^3.4.17
version: 3.4.18(tsx@4.21.0)(yaml@2.8.3)
apps/guides:
devDependencies:
typescript:
specifier: ^5.9.3
version: 5.9.3
apps/guides/apps/server:
dependencies:
'@manacore/shared-hono':
specifier: workspace:*
version: link:../../../../packages/shared-hono
hono:
specifier: ^4.7.0
version: 4.12.9
devDependencies:
'@types/bun':
specifier: ^1.2.0
version: 1.3.11
typescript:
specifier: ^5.9.3
version: 5.9.3
apps/guides/apps/web:
dependencies:
'@manacore/feedback':
specifier: workspace:*
version: link:../../../../packages/feedback
'@manacore/help':
specifier: workspace:*
version: link:../../../../packages/help
'@manacore/local-store':
specifier: workspace:*
version: link:../../../../packages/local-store
'@manacore/shared-api-client':
specifier: workspace:*
version: link:../../../../packages/shared-api-client
'@manacore/shared-app-onboarding':
specifier: workspace:*
version: link:../../../../packages/shared-app-onboarding
'@manacore/shared-auth':
specifier: workspace:*
version: link:../../../../packages/shared-auth
'@manacore/shared-auth-stores':
specifier: workspace:*
version: link:../../../../packages/shared-auth-stores
'@manacore/shared-auth-ui':
specifier: workspace:*
version: link:../../../../packages/shared-auth-ui
'@manacore/shared-branding':
specifier: workspace:*
version: link:../../../../packages/shared-branding
'@manacore/shared-error-tracking':
specifier: workspace:*
version: link:../../../../packages/shared-error-tracking
'@manacore/shared-i18n':
specifier: workspace:*
version: link:../../../../packages/shared-i18n
'@manacore/shared-icons':
specifier: workspace:*
version: link:../../../../packages/shared-icons
'@manacore/shared-profile-ui':
specifier: workspace:*
version: link:../../../../packages/shared-profile-ui
'@manacore/shared-stores':
specifier: workspace:*
version: link:../../../../packages/shared-stores
'@manacore/shared-tailwind':
specifier: workspace:*
version: link:../../../../packages/shared-tailwind
'@manacore/shared-theme':
specifier: workspace:*
version: link:../../../../packages/shared-theme
'@manacore/shared-theme-ui':
specifier: workspace:*
version: link:../../../../packages/shared-theme-ui
'@manacore/shared-types':
specifier: workspace:*
version: link:../../../../packages/shared-types
'@manacore/shared-ui':
specifier: workspace:*
version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
devDependencies:
'@manacore/shared-pwa':
specifier: workspace:*
version: link:../../../../packages/shared-pwa
'@manacore/shared-vite-config':
specifier: workspace:*
version: link:../../../../packages/shared-vite-config
'@sveltejs/adapter-node':
specifier: ^5.0.0
version: 5.4.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))
'@sveltejs/kit':
specifier: ^2.47.1
version: 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
'@sveltejs/vite-plugin-svelte':
specifier: ^5.0.0
version: 5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
'@tailwindcss/vite':
specifier: ^4.1.7
version: 4.1.17(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
'@types/node':
specifier: ^20.0.0
version: 20.19.25
'@vite-pwa/sveltekit':
specifier: ^1.1.0
version: 1.1.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0)
jsdom:
specifier: ^25.0.1
version: 25.0.1
prettier:
specifier: ^3.1.1
version: 3.6.2
prettier-plugin-svelte:
specifier: ^3.1.2
version: 3.4.0(prettier@3.6.2)(svelte@5.44.0)
svelte:
specifier: ^5.41.0
version: 5.44.0
svelte-check:
specifier: ^4.3.3
version: 4.3.4(picomatch@4.0.3)(svelte@5.44.0)(typescript@5.9.3)
tailwindcss:
specifier: ^4.1.7
version: 4.1.17
tslib:
specifier: ^2.4.1
version: 2.8.1
typescript:
specifier: ^5.9.3
version: 5.9.3
vite:
specifier: ^6.0.0
version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
vitest:
specifier: ^4.1.0
version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@25.0.1)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
apps/inventar:
devDependencies:
typescript:
@ -2745,6 +2885,31 @@ importers:
specifier: ^5.1.3
version: 5.9.3
apps/memoro/apps/audio-server:
dependencies:
'@azure/storage-blob':
specifier: ^12.17.0
version: 12.31.0
'@supabase/supabase-js':
specifier: ^2.49.5
version: 2.84.0
fluent-ffmpeg:
specifier: ^2.1.2
version: 2.1.3
hono:
specifier: ^4.7.0
version: 4.12.9
devDependencies:
'@types/fluent-ffmpeg':
specifier: ^2.1.21
version: 2.1.28
'@types/node':
specifier: ^20.0.0
version: 20.19.25
typescript:
specifier: ^5.5.0
version: 5.9.3
apps/memoro/apps/backend:
dependencies:
'@nestjs/axios':
@ -3129,6 +3294,31 @@ importers:
specifier: ~5.9.2
version: 5.9.3
apps/memoro/apps/server:
dependencies:
'@manacore/shared-hono':
specifier: workspace:*
version: link:../../../../packages/shared-hono
'@supabase/supabase-js':
specifier: ^2.49.5
version: 2.84.0
hono:
specifier: ^4.7.0
version: 4.12.9
uuid:
specifier: ^11.0.0
version: 11.1.0
devDependencies:
'@types/node':
specifier: ^20.0.0
version: 20.19.25
'@types/uuid':
specifier: ^10.0.0
version: 10.0.0
typescript:
specifier: ^5.5.0
version: 5.9.3
apps/memoro/apps/web:
dependencies:
'@manacore/feedback':
@ -5374,122 +5564,6 @@ importers:
specifier: ^5.7.3
version: 5.9.3
apps/taktik:
devDependencies:
typescript:
specifier: ^5.9.3
version: 5.9.3
apps/taktik/apps/web:
dependencies:
'@manacore/local-store':
specifier: workspace:*
version: link:../../../../packages/local-store
'@manacore/shared-auth':
specifier: workspace:*
version: link:../../../../packages/shared-auth
'@manacore/shared-auth-stores':
specifier: workspace:*
version: link:../../../../packages/shared-auth-stores
'@manacore/shared-auth-ui':
specifier: workspace:*
version: link:../../../../packages/shared-auth-ui
'@manacore/shared-branding':
specifier: workspace:*
version: link:../../../../packages/shared-branding
'@manacore/shared-error-tracking':
specifier: workspace:*
version: link:../../../../packages/shared-error-tracking
'@manacore/shared-icons':
specifier: workspace:*
version: link:../../../../packages/shared-icons
'@manacore/shared-landing-ui':
specifier: workspace:*
version: link:../../../../packages/shared-landing-ui
'@manacore/shared-profile-ui':
specifier: workspace:*
version: link:../../../../packages/shared-profile-ui
'@manacore/shared-stores':
specifier: workspace:*
version: link:../../../../packages/shared-stores
'@manacore/shared-theme':
specifier: workspace:*
version: link:../../../../packages/shared-theme
'@manacore/shared-types':
specifier: workspace:*
version: link:../../../../packages/shared-types
'@manacore/shared-ui':
specifier: workspace:*
version: link:../../../../packages/shared-ui
'@manacore/shared-utils':
specifier: workspace:*
version: link:../../../../packages/shared-utils
'@manacore/subscriptions':
specifier: workspace:*
version: link:../../../../packages/subscriptions
'@taktik/shared':
specifier: workspace:*
version: link:../../packages/shared
date-fns:
specifier: ^4.1.0
version: 4.1.0
svelte-i18n:
specifier: ^4.0.1
version: 4.0.1(svelte@5.44.0)
devDependencies:
'@manacore/shared-tailwind':
specifier: workspace:*
version: link:../../../../packages/shared-tailwind
'@manacore/shared-vite-config':
specifier: workspace:*
version: link:../../../../packages/shared-vite-config
'@sveltejs/adapter-node':
specifier: ^5.2.12
version: 5.4.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))
'@sveltejs/kit':
specifier: ^2.21.0
version: 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@sveltejs/vite-plugin-svelte':
specifier: ^5.1.0
version: 5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@tailwindcss/vite':
specifier: ^4.1.7
version: 4.1.17(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@types/node':
specifier: ^22.15.29
version: 22.19.1
'@vite-pwa/sveltekit':
specifier: ^1.1.0
version: 1.1.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0)
svelte:
specifier: ^5.41.0
version: 5.44.0
svelte-check:
specifier: ^4.2.1
version: 4.3.4(picomatch@4.0.3)(svelte@5.44.0)(typescript@5.9.3)
tailwindcss:
specifier: ^4.1.7
version: 4.1.17
typescript:
specifier: ^5.9.3
version: 5.9.3
vite:
specifier: ^6.3.5
version: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vitest:
specifier: ^3.2.1
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
apps/taktik/packages/shared:
dependencies:
'@manacore/shared-types':
specifier: workspace:*
version: link:../../../../packages/shared-types
devDependencies:
typescript:
specifier: ^5.9.3
version: 5.9.3
apps/times:
devDependencies:
typescript:
@ -6089,6 +6163,9 @@ importers:
'@tailwindcss/forms':
specifier: ^0.5.10
version: 0.5.10(tailwindcss@4.1.17)
'@tailwindcss/typography':
specifier: ^0.5.15
version: 0.5.19(tailwindcss@4.1.17)
'@tailwindcss/vite':
specifier: ^4.1.11
version: 4.1.17(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
@ -6395,64 +6472,6 @@ importers:
games/arcade: {}
games/arcade/apps/backend:
dependencies:
'@anthropic-ai/sdk':
specifier: ^0.65.0
version: 0.65.0(zod@3.25.76)
'@google/genai':
specifier: ^1.14.0
version: 1.47.0
'@nestjs/common':
specifier: ^10.4.15
version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/config':
specifier: ^3.3.0
version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
'@nestjs/core':
specifier: ^10.4.15
version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/platform-express':
specifier: ^10.4.15
version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20)
class-transformer:
specifier: ^0.5.1
version: 0.5.1
class-validator:
specifier: ^0.14.1
version: 0.14.3
openai:
specifier: ^4.76.0
version: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76)
reflect-metadata:
specifier: ^0.2.2
version: 0.2.2
rxjs:
specifier: ^7.8.1
version: 7.8.2
devDependencies:
'@nestjs/cli':
specifier: ^10.4.9
version: 10.4.9
'@nestjs/schematics':
specifier: ^10.2.3
version: 10.2.3(chokidar@3.6.0)(typescript@5.9.3)
'@types/express':
specifier: ^5.0.0
version: 5.0.6
'@types/node':
specifier: ^22.10.2
version: 22.19.1
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3)
tsconfig-paths:
specifier: ^4.2.0
version: 4.2.0
typescript:
specifier: ^5.7.2
version: 5.9.3
games/arcade/apps/server:
dependencies:
'@anthropic-ai/sdk':
@ -13449,11 +13468,6 @@ packages:
'@surma/rollup-plugin-off-main-thread@2.2.3':
resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
'@sveltejs/acorn-typescript@1.0.7':
resolution: {integrity: sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==}
peerDependencies:
acorn: ^8.9.0
'@sveltejs/acorn-typescript@1.0.9':
resolution: {integrity: sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==}
peerDependencies:
@ -35666,10 +35680,6 @@ snapshots:
magic-string: 0.25.9
string.prototype.matchall: 4.0.12
'@sveltejs/acorn-typescript@1.0.7(acorn@8.15.0)':
dependencies:
acorn: 8.15.0
'@sveltejs/acorn-typescript@1.0.9(acorn@8.15.0)':
dependencies:
acorn: 8.15.0
@ -35691,14 +35701,6 @@ snapshots:
'@sveltejs/kit': 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
rollup: 4.53.3
'@sveltejs/adapter-node@5.4.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))':
dependencies:
'@rollup/plugin-commonjs': 28.0.9(rollup@4.53.3)
'@rollup/plugin-json': 6.1.0(rollup@4.53.3)
'@rollup/plugin-node-resolve': 16.0.3(rollup@4.53.3)
'@sveltejs/kit': 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
rollup: 4.53.3
'@sveltejs/adapter-node@5.4.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))':
dependencies:
'@rollup/plugin-commonjs': 28.0.9(rollup@4.53.3)
@ -35752,27 +35754,6 @@ snapshots:
optionalDependencies:
'@opentelemetry/api': 1.9.0
'@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies:
'@standard-schema/spec': 1.1.0
'@sveltejs/acorn-typescript': 1.0.7(acorn@8.15.0)
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@types/cookie': 0.6.0
acorn: 8.15.0
cookie: 0.6.0
devalue: 5.6.4
esm-env: 1.2.2
kleur: 4.1.5
magic-string: 0.30.21
mrmime: 2.0.1
sade: 1.8.1
set-cookie-parser: 2.7.2
sirv: 3.0.2
svelte: 5.44.0
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
optionalDependencies:
'@opentelemetry/api': 1.9.0
'@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@standard-schema/spec': 1.1.0
@ -35887,15 +35868,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies:
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
debug: 4.4.3
svelte: 5.44.0
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
@ -35954,19 +35926,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
debug: 4.4.3
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.21
svelte: 5.44.0
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vitefu: 1.1.1(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
transitivePeerDependencies:
- supports-color
'@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
@ -36195,13 +36154,6 @@ snapshots:
tailwindcss: 4.1.17
vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
'@tailwindcss/vite@4.1.17(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies:
'@tailwindcss/node': 4.1.17
'@tailwindcss/oxide': 4.1.17
tailwindcss: 4.1.17
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
'@tailwindcss/vite@4.1.17(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@tailwindcss/node': 4.1.17
@ -37755,18 +37707,6 @@ snapshots:
- workbox-build
- workbox-window
'@vite-pwa/sveltekit@1.1.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0)':
dependencies:
'@sveltejs/kit': 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
kolorist: 1.8.0
tinyglobby: 0.2.15
vite-plugin-pwa: 1.2.0(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0)
transitivePeerDependencies:
- supports-color
- vite
- workbox-build
- workbox-window
'@vite-pwa/sveltekit@1.1.0(@sveltejs/kit@2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0)':
dependencies:
'@sveltejs/kit': 2.49.0(@opentelemetry/api@1.9.0)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)))(svelte@5.44.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
@ -37835,26 +37775,6 @@ snapshots:
- vite
optional: true
'@vitest/browser@3.2.4(playwright@1.57.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4)':
dependencies:
'@testing-library/dom': 10.4.1
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
'@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))
'@vitest/utils': 3.2.4
magic-string: 0.30.21
sirv: 3.0.2
tinyrainbow: 2.0.0
vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
ws: 8.18.3
optionalDependencies:
playwright: 1.57.0
transitivePeerDependencies:
- bufferutil
- msw
- utf-8-validate
- vite
optional: true
'@vitest/browser@3.2.4(playwright@1.57.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@3.2.4)':
dependencies:
'@testing-library/dom': 10.4.1
@ -37993,15 +37913,6 @@ snapshots:
optionalDependencies:
vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
'@vitest/mocker@3.2.4(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
optional: true
'@vitest/mocker@3.2.4(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 3.2.4
@ -38018,14 +37929,6 @@ snapshots:
optionalDependencies:
vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
'@vitest/mocker@3.2.4(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
'@vitest/mocker@4.0.14(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 4.0.14
@ -53428,6 +53331,7 @@ snapshots:
typescript: 5.9.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optional: true
ts-node@10.9.2(@types/node@24.10.1)(typescript@5.3.3):
dependencies:
@ -54190,27 +54094,6 @@ snapshots:
- tsx
- yaml
vite-node@3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1):
dependencies:
cac: 6.7.14
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
transitivePeerDependencies:
- '@types/node'
- jiti
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
vite-node@3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3):
dependencies:
cac: 6.7.14
@ -54264,17 +54147,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
vite-plugin-pwa@1.2.0(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0):
dependencies:
debug: 4.4.3
pretty-bytes: 6.1.1
tinyglobby: 0.2.15
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
workbox-build: 7.4.0(@types/babel__core@7.20.5)
workbox-window: 7.4.0
transitivePeerDependencies:
- supports-color
vite-plugin-pwa@1.2.0(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0):
dependencies:
debug: 4.4.3
@ -54384,23 +54256,6 @@ snapshots:
tsx: 4.21.0
yaml: 2.8.3
vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.53.3
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 22.19.1
fsevents: 2.3.3
jiti: 2.6.1
lightningcss: 1.30.2
terser: 5.44.1
tsx: 4.21.0
yaml: 2.8.1
vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3):
dependencies:
esbuild: 0.25.12
@ -54452,23 +54307,6 @@ snapshots:
tsx: 4.21.0
yaml: 2.8.3
vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.53.3
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 22.19.1
fsevents: 2.3.3
jiti: 2.6.1
lightningcss: 1.30.2
terser: 5.44.1
tsx: 4.21.0
yaml: 2.8.1
vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3):
dependencies:
esbuild: 0.25.12
@ -54494,10 +54332,6 @@ snapshots:
optionalDependencies:
vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
vitefu@1.1.1(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)):
optionalDependencies:
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vitefu@1.1.1(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)):
optionalDependencies:
vite: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
@ -54702,51 +54536,6 @@ snapshots:
- tsx
- yaml
vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1):
dependencies:
'@types/chai': 5.2.3
'@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(vite@7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(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.3.3
debug: 4.4.3
expect-type: 1.3.0
magic-string: 0.30.21
pathe: 2.0.3
picomatch: 4.0.3
std-env: 3.10.0
tinybench: 2.9.0
tinyexec: 0.3.2
tinyglobby: 0.2.15
tinypool: 1.1.1
tinyrainbow: 2.0.0
vite: 7.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
vite-node: 3.2.4(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/debug': 4.1.12
'@types/node': 22.19.1
'@vitest/browser': 3.2.4(playwright@1.57.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4)
'@vitest/ui': 3.2.4(vitest@3.2.4)
jsdom: 29.0.1(@noble/hashes@2.0.1)
transitivePeerDependencies:
- jiti
- less
- lightningcss
- msw
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3):
dependencies:
'@types/chai': 5.2.3
@ -55032,6 +54821,35 @@ snapshots:
transitivePeerDependencies:
- msw
vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@25.0.1)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@vitest/expect': 4.1.1
'@vitest/mocker': 4.1.1(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))
'@vitest/pretty-format': 4.1.1
'@vitest/runner': 4.1.1
'@vitest/snapshot': 4.1.1
'@vitest/spy': 4.1.1
'@vitest/utils': 4.1.1
es-module-lexer: 2.0.0
expect-type: 1.3.0
magic-string: 0.30.21
obug: 2.1.1
pathe: 2.0.3
picomatch: 4.0.3
std-env: 4.0.0
tinybench: 2.9.0
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)
why-is-node-running: 2.3.0
optionalDependencies:
'@opentelemetry/api': 1.9.0
'@types/node': 20.19.25
jsdom: 25.0.1
transitivePeerDependencies:
- msw
vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)):
dependencies:
'@vitest/expect': 4.1.1