@noxlovette/material 0.1.35 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { cpSync, existsSync, mkdirSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const source = join(__dirname, '..', 'claude-skill', 'material-design');
8
+ const destDir = join(process.cwd(), '.claude', 'skills');
9
+ const dest = join(destDir, 'material-design');
10
+ const force = process.argv.includes('--force');
11
+
12
+ if (!existsSync(source)) {
13
+ console.error(
14
+ 'Could not find the bundled material-design skill. Reinstall @noxlovette/material and try again.'
15
+ );
16
+ process.exit(1);
17
+ }
18
+
19
+ if (existsSync(dest) && !force) {
20
+ console.error(
21
+ `.claude/skills/material-design already exists. Re-run with --force to overwrite it.`
22
+ );
23
+ process.exit(1);
24
+ }
25
+
26
+ mkdirSync(destDir, { recursive: true });
27
+ cpSync(source, dest, { recursive: true, force: true });
28
+
29
+ console.log(`Installed the material-design Claude Code skill to .claude/skills/material-design`);
@@ -0,0 +1,63 @@
1
+ ---
2
+ background: false
3
+ description: Grounds UI/UX decisions in Material Design 3 (m3.material.io) and this repo's actual token/component system when creating or editing components in src/lib/components/, choosing a color role/variant/emphasis level, adding a transition or animation, laying out a showcase or docs page, or reviewing existing UI for M3 compliance. Does NOT apply to pure logic/state changes with no visual surface. For Cypress test authoring use cypress-author/cypress-explain/cypress-docs instead.
4
+ model: inherit
5
+ name: material-design
6
+ ---
7
+
8
+ # Material Design 3 for @noxlovette/material
9
+
10
+ ## Purpose
11
+
12
+ This repo is a single, already-opinionated M3 component library, not a blank canvas. Every visual decision (color, type, elevation, shape, motion) already has a token or utility class for it. The job here is never "invent a look" — it's "find the right existing primitive and apply it correctly." This skill encodes that mapping so you don't re-derive M3 from general knowledge or, worse, hardcode a hex/px/ms value that already has a token.
13
+
14
+ ## When to use
15
+
16
+ - Creating or editing a component under `src/lib/components/`
17
+ - Deciding which variant (filled/tonal/outlined/text/elevated) or color role (primary/secondary/tertiary/error) fits a given action or emphasis level
18
+ - Adding a transition, page transition, or list/expand animation
19
+ - Building a showcase route or docs page for a component
20
+ - Reviewing UI for M3 correctness (contrast, touch targets, focus, motion)
21
+
22
+ **Skip this skill** for changes with no visual surface (pure logic, data layer, config), and for Cypress test work (use the `cypress-*` skills instead).
23
+
24
+ ## Reasoning flow
25
+
26
+ 1. **Map the ask to a category.** This repo groups components by M3 concept, not by page: `buttons/`, `forms/` (textfield, select, checkbox, switch, slider, radio-group, search, command, pin, tooltip), `containers/` (dialogue, side-sheet, bottom-sheet, popover, menu, list, panes, stack, scroll-area), `nav/` (appbar, navbar, rail, tabs), `cards/`, `badge/`, `pill/`, `snackbar/`, `progress/`, `table/`, `date/`, `time/`, `typography/`. Check the target category's existing `theme.ts` before writing a new one — the pattern you need probably already exists one file over.
27
+
28
+ 2. **Pick emphasis → variant + color role.** See the decision table below and `references/component-patterns.md` for the full reasoning and a worked example (`buttons/theme.ts`).
29
+
30
+ 3. **Only use existing tokens.** Never hardcode a color, shadow, radius, or duration — every one of those has a utility class already. Full inventory in `references/tokens-and-styles.md`.
31
+
32
+ 4. **Pick a motion primitive** from `src/lib/animation/` and a duration/easing pair from `motion.css`. Decision rules in `references/motion-guide.md`.
33
+
34
+ 5. **Run the pre-delivery checklist** in `references/accessibility-checklist.md` before calling the work done.
35
+
36
+ ## Color-role decision table
37
+
38
+ | Emphasis | Variant | Color role | Example use |
39
+ | ----------------------------------------------------------- | ---------- | -------------------------------------- | --------------------------------------------- |
40
+ | Highest — one primary action per screen | `filled` | `primary` (or `error` for destructive) | "Save", "Submit", "Delete account" |
41
+ | High but not _the_ action | `filled` | `secondary` / `tertiary` | secondary CTA next to a filled-primary |
42
+ | Medium, wants to look "chosen"/selected | `tonal` | matches the concept's color | selected chip, toggle-on state, secondary FAB |
43
+ | Medium, needs a visible boundary but low fill | `outlined` | `primary`/matches concept | "Cancel" next to a filled "Confirm" |
44
+ | Low, inline/repeated actions | `text` | `primary` (default) | list-item trailing action, dialog "Cancel" |
45
+ | Needs to visually separate from a colored surface behind it | `elevated` | matches concept | FAB or card floating over a tonal surface |
46
+
47
+ `color: default` in this codebase's `tv()` variants resolves to the same classes as `primary` — pass `primary` explicitly when in doubt.
48
+
49
+ ## Quick reference
50
+
51
+ - Color tokens: `md-sys-color-{primary,secondary,tertiary,error}`, each with a `-container` tonal pair and `on-*` text/icon pair (guarantees AA contrast by construction).
52
+ - Type: `md-sys-typescale-{display,headline,title,body,label}-{large,medium,small}`.
53
+ - Elevation: `shadow-elevation-{0..5}`.
54
+ - Shape: `radius-{none,xs,sm,md,lg,xl,full}` (buttons instead drive shape via the `--btn-shape`/`--btn-pressed-shape` CSS vars in `.md-btn-morph`).
55
+ - Motion durations/easings: `--md-sys-motion-duration{,-fast,-slow}` (standard, non-spatial) and `-fast-spatial/-spatial/-slow-spatial` (expressive, for things that move/resize), plus the M3 emphasized easing curve.
56
+ - Shared primitives: wrap interactive surfaces with `Layer.svelte` (state layer + ripple, already skips itself under `prefers-reduced-motion`), render icons with `Icon.svelte`, use `Divider.svelte` instead of Bits UI's `Separator`.
57
+
58
+ ## References
59
+
60
+ - [`references/tokens-and-styles.md`](references/tokens-and-styles.md) — full token/utility inventory
61
+ - [`references/component-patterns.md`](references/component-patterns.md) — `tv()` slots/variants/compoundVariants pattern + variant decision tree
62
+ - [`references/motion-guide.md`](references/motion-guide.md) — which animation primitive and timing pair to reach for
63
+ - [`references/accessibility-checklist.md`](references/accessibility-checklist.md) — pre-delivery checklist
@@ -0,0 +1,28 @@
1
+ # Pre-delivery checklist
2
+
3
+ Run through this before calling a component/UI change done.
4
+
5
+ ## Contrast
6
+
7
+ - Text/icon color on a colored surface should always be the matching `on-*` token (`on-primary` on `primary`, `on-primary-container` on `primary-container`, etc.), never a manually chosen color — the `on-*` tokens are generated to meet contrast requirements per theme (including the `-hc`/`-mc` high/medium-contrast variants). A manual override bypasses that guarantee.
8
+ - If a design calls for a color combination with no existing `on-*` pair, that's a sign it doesn't map to an M3 role cleanly — reconsider the role choice before improvising a color.
9
+
10
+ ## Touch targets
11
+
12
+ - Interactive elements should hit the M3 minimum 48dp target. The existing `size` scales already encode this (e.g. button `sm`/`md` = `h-10`/`h-14`); when adding a new interactive size below that, either pad the hit area (see `.text-link`'s `min-height: 44px` + padding trick) or confirm it's genuinely dense-UI/desktop-only and document why.
13
+
14
+ ## Focus
15
+
16
+ - Anything focusable needs a visible focus state — use `md-sys-state-focus-indicator`, don't rely on the browser default or remove `outline` without replacing it.
17
+ - Verify keyboard operability, not just click handlers — Bits UI primitives (dialogs, menus, selects) handle this by default; if you're building something interactive from scratch, check it against Bits UI's docs (https://bits-ui.com/llms.txt) for the expected keyboard model first.
18
+
19
+ ## Motion
20
+
21
+ - `prefers-reduced-motion`: decorative-only motion should be gated (see `references/motion-guide.md`); motion that carries meaning (e.g. confirming a drag-drop) can stay.
22
+ - Don't introduce a new hand-tuned duration/easing when an existing token fits — inconsistent timing across components is one of the more noticeable ways an M3 implementation starts to feel "off."
23
+
24
+ ## Consistency
25
+
26
+ - No hardcoded hex/rgb colors, px shadows, px border-radius, or ms durations in new component code — every one of those should trace back to a token or utility from `references/tokens-and-styles.md`.
27
+ - New multi-element components use `tv()` with `slots`, not string concatenation or `clsx` with inline conditionals.
28
+ - Icons via `Icon.svelte`, dividers via `Divider.svelte`, state layers via `Layer.svelte` — grep for a raw `material-symbols-` class, a hand-rolled `<hr>`/border-based divider, or manual hover/press opacity as signs one of these was skipped.
@@ -0,0 +1,37 @@
1
+ # Component patterns
2
+
3
+ ## The `tv()` shape
4
+
5
+ Every component's styles live in the category's `theme.ts`, built with `tv()` from `tailwind-variants`:
6
+
7
+ - `slots` — one key per rendered element (`base`, `icon`, `label`, ...) so multi-element components can vary each part independently
8
+ - `variants` — one axis per meaningful design decision (`variant`, `color`, `size`, `shape`, `selected`, ...); each value maps to either a class string (single-slot components) or an object keyed by slot (multi-slot components)
9
+ - `compoundVariants` — combinations that need a class not expressible as a union of independent axes (almost everything about color composition lives here, since `variant` × `color` isn't a clean cross-product of independent classes)
10
+
11
+ Worked example: `src/lib/components/buttons/theme.ts`. The `button` export has slots `base`/`icon`; variants `variant` (elevated/filled/tonal/outlined/text/bare), `color` (default/primary/secondary/tertiary/error), `usage` (selection/default), `size` (xs/sm/md/lg/xl), `shape` (round/square), `selected` (true/false); and ~25 `compoundVariants` entries, one per `variant`×`color` pair, each pointing at the pre-built `md-component-button-*` class from `component.css`. Match this structure exactly for new component families — don't hand-roll `clsx` strings or inline conditional classes.
12
+
13
+ When adding a `size` axis, follow the existing scale's _shape_, not just its numbers: each size variant sets height, gap, padding, typescale, and (for shape-driving components) the shape CSS vars together, in one slot-scoped string — not spread across multiple variant axes that a consumer could combine incorrectly.
14
+
15
+ ## Variant selection tree
16
+
17
+ Ask, in order:
18
+
19
+ 1. **Is this the single highest-priority action on the screen/section?** → `filled`, `color: primary` (or `error` if destructive).
20
+ 2. **Is it a secondary but still prominent action, or a persistent selected/toggled state?** → `tonal`.
21
+ 3. **Does it need a visible boundary but shouldn't compete visually with a filled sibling?** → `outlined`.
22
+ 4. **Is it a low-emphasis, often-repeated action** (list rows, inline links, dialog dismiss)? → `text`.
23
+ 5. **Does it need to visually float above a surface that's already tonal/colored** (a FAB over a colored app bar, a card menu trigger)? → `elevated`.
24
+
25
+ Only fall back to `bare` (no color/background at all) when the component supplies its own coloring downstream (e.g. an icon button whose color comes from a parent's `selected` state).
26
+
27
+ ## Reuse before you build
28
+
29
+ - **State layer / ripple** — wrap the interactive element with `Layer.svelte` (`src/lib/utils/Layer.svelte`) rather than writing hover/press opacity by hand. It listens for `.m3-layer` on its parent, already respects `prefers-reduced-motion` for the ripple, and its tint intensity (hover 0.08 / pressed·focus 0.12) matches the M3 state-layer spec — don't retune those numbers per component.
30
+ - **Icons** — always `Icon.svelte` (`name`, `fill`, `wght`, `size` props), never a raw `<span class="material-symbols-...">` or an inline SVG for a Material Symbol.
31
+ - **Dividers** — `Divider.svelte`, not Bits UI's `Separator` (per project CLAUDE.md — it already implements the same primitive).
32
+ - **Focus ring** — the `md-sys-state-focus-indicator` utility, not a custom `:focus` style.
33
+ - **Disabled state** — `.md-component-button-base`'s disabled handling (via `disabled:`/`aria-disabled`/`data-disabled` selectors in `component.css`), not a manually-toggled opacity class.
34
+
35
+ ## Before exporting a new component
36
+
37
+ Follow CLAUDE.md's "Adding a New Component" steps as the mechanical checklist (create `.svelte` + `types.ts`, define `theme.ts` with `tv()`, export from the category `index.ts`, run `bun scripts/generate-components-index.ts`, add a showcase route and a docs page) — this skill governs the _design_ decisions (which variant/color/motion) that should be made before or while writing that `theme.ts`, not the export mechanics themselves.
@@ -0,0 +1,25 @@
1
+ # Motion guide
2
+
3
+ Source: `src/lib/animation/` (barrel-exported via `src/lib/animation/index.ts`) + duration/easing tokens in `src/lib/styles/motion.css`. M3 motion principle to apply: motion should be **spatial** (things visibly move/resize/morph) when the UI's structure is changing, and **standard/non-spatial** (opacity/color only) when it's a simple state change — spatial motion on a small state change reads as sluggish; standard easing on a big layout change reads as a jump-cut.
4
+
5
+ ## Picking a primitive
6
+
7
+ | Situation | Primitive | Notes |
8
+ | -------------------------------------------------------------------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | A surface expands into another (card → dialog, thumbnail → detail view, FAB → sheet) | `containerTransform` | Crossfades + morphs bounds/radius/color between the two elements sharing a `key`. Needs two DOM nodes in a Svelte `{#key}`/list-transition context, not a single toggled element. |
10
+ | Stepped/sequential navigation (wizard steps, tabs, paginated content) | `sharedAxisTransition` | Pick `direction: 'X'` for horizontal steps, `'Y'` for vertical, `'Z'` for depth (e.g. modal-like overlays that don't share geometry). Set `rightSeam`/`leaving` per the doc-comment in `sharedAxisTransition.ts` — getting the boolean backwards makes both directions look identical. |
11
+ | Simple show/hide with no structural relationship between what's leaving and entering | `enterExit` | `mode` options: `fade` (default), `scale`, `slide-up`, `dialog`, `dialog-m3`. Use `dialog-m3` for actual M3 dialogs/sheets (scale-only, no vertical translate) — `dialog`/`slide-up` are for non-M3-spec popovers/toasts. |
12
+ | A list item needs a CSS hook while it's animating out (e.g. to suppress hover/press styles during outro) | `outroClass` | Svelte action; adds/removes a `leaving` class on `outrostart`/`outroend`. |
13
+
14
+ All three transition functions default their `easing` to `easeEmphasized` (from `easing.ts`) already — only override `easing`/`duration` when the default doesn't fit, and when you do, pull from the named exports (`easeEmphasized`, `easeEmphasizedAccel`, `easeEmphasizedDecel`, `easeStandard`, `easeStandardAccel`, `easeStandardDecel`), not a raw `cubic-bezier(...)`.
15
+
16
+ ## Picking a duration when hand-rolling CSS transitions
17
+
18
+ For anything not going through the animation module (e.g. a plain CSS `transition` on `theme.ts`-driven classes), use the `--md-sys-motion-easing*` custom properties from `motion.css` directly, chosen by what's animating:
19
+
20
+ - **Standard** (`easing` 200ms / `easing-fast` 150ms / `easing-slow` 300ms) — color, opacity, elevation, focus ring: small/local, non-spatial changes. `.state-layer` and `.text-link` already use these.
21
+ - **Expressive/spatial** (`easing-fast-spatial` 350ms / `easing-spatial` 500ms / `easing-slow-spatial` 650ms) — anything that changes position, size, or shape. Bigger/farther-traveling elements get the slower tier; small in-place morphs (like the button's press-radius morph in `.md-btn-morph`) use a fast, hand-tuned duration instead of these tiers because they're driven by direct user press feedback, not a triggered transition.
22
+
23
+ ## Reduced motion
24
+
25
+ `Layer.svelte`'s ripple already checks `prefers-reduced-motion` and no-ops. The `containerTransform`/`sharedAxisTransition`/`enterExit` functions do **not** self-guard — if you use them for a transition that isn't purely decorative (i.e. skipping it would leave the UI in a confusing state), that's fine as-is, but for a purely decorative flourish, gate it on `prefers-reduced-motion` at the call site rather than assuming the animation module handles it for you.
@@ -0,0 +1,57 @@
1
+ # Tokens and styles inventory
2
+
3
+ Source of truth: `src/lib/styles/*.css`. Rule: **never hardcode a color, shadow, radius, or duration value in a component — every one of these already has a token or utility class.** If you think you need a new value, check these files first; you're almost certainly missing an existing one.
4
+
5
+ ## Color roles (`src/lib/styles/theme/*.css`)
6
+
7
+ Defined per theme variant (`light.css`, `dark.css`, `light-hc.css`, `dark-hc.css`, `light-mc.css`, `dark-mc.css` — high-contrast and medium-contrast accessibility variants) as `--md-sys-color-*` custom properties, consumed via Tailwind utilities of the form `bg-md-sys-color-*` / `text-md-sys-color-*` / `outline-md-sys-color-*`.
8
+
9
+ - Core roles: `primary`, `secondary`, `tertiary`, `error`
10
+ - Each has a low-emphasis tonal pair: `{role}-container`
11
+ - Each (including containers) has a guaranteed-contrast text/icon pair: `on-{role}`, `on-{role}-container`
12
+ - Surface roles: `surface`, `surface-variant`, `surface-container` (`-lowest`, `-low`, `-high`, `-highest`), `on-surface`, `on-surface-variant`
13
+ - Structural: `outline`, `outline-variant`, `shadow`
14
+
15
+ Because `on-*` pairs are generated to meet contrast requirements, **any manual color override that doesn't go through an `on-*`/role pair is a contrast bug waiting to happen** — flag it in review.
16
+
17
+ ## Component color composition (`src/lib/styles/component.css`)
18
+
19
+ Components don't reference `md-sys-color-*` directly for every state — they compose pre-built classes:
20
+
21
+ ```
22
+ md-component-button-filled-{default,primary,secondary,tertiary,error}
23
+ md-component-button-tonal-{default,primary,secondary,tertiary,error}
24
+ md-component-button-outline-{default,primary,secondary,tertiary,error}
25
+ md-component-button-text-{default,primary,secondary,tertiary,error}
26
+ md-component-button-elevated-{default,primary,secondary,tertiary,error}
27
+ ```
28
+
29
+ `filled` = `bg-md-sys-color-{role} text-md-sys-color-on-{role}`. `tonal` = the `-container`/`on-{role}-container` pair. `outlined` = `text-md-sys-color-{role} outline-md-sys-color-{role}` (default outline uses `on-surface-variant`/`outline-variant`). `text` = text color only, transparent background. `elevated` = `bg-md-sys-color-surface-container-low` + role text color + `shadow-elevation-1`. When adding a new component family with the same emphasis levels, follow this exact composition rather than reinventing it.
30
+
31
+ Other reusable utilities in this file:
32
+
33
+ - `.state-layer` — the `::before` overlay hook that `Layer.svelte` and hover/press states build on
34
+ - `md-sys-state-focus-indicator` — the `:focus-visible` outline (3px solid, `on-secondary` color, 2px offset) — apply to anything focusable that doesn't already get it via a shared base class
35
+ - `.md-component-button-base` — disabled-state handling (`on-surface` at reduced opacity) + cursor — reuse for any new interactive component base
36
+
37
+ ## Typescale (`src/lib/styles/typescale.css`)
38
+
39
+ `md-sys-typescale-{display,headline,title,body,label}-{large,medium,small}`, plus a one-off `md-sys-typescale-fab-label`. Each bakes in the correct font size, line height, tracking, and (for title/label) weight — don't set `text-*`/`leading-*`/`tracking-*` manually when one of these fits.
40
+
41
+ ## Elevation (`src/lib/styles/elevation.css`)
42
+
43
+ `shadow-elevation-{0..5}`, each a two-layer (spot + ambient) shadow scaled to the M3 elevation spec, using `color-mix` against the `shadow` color role so it adapts per theme automatically. Elevation communicates depth/priority — reach for a higher level when a surface should read as "above" its neighbors (menus, FABs, dialogs), not as a decorative effect.
44
+
45
+ ## Shape (`src/lib/styles/rounding.css`)
46
+
47
+ `radius-{none,xs,sm,md,lg,xl,full}` = `0 / 4px / 8px / 12px / 16px / 28px / 9999px`, matching the M3 shape scale (extra-small through extra-large, plus full/pill). Buttons don't use these directly — they use CSS custom properties (`--btn-shape`, `--btn-shape-override`, `--btn-pressed-shape` set per `size`/`shape` variant in `theme.ts`) consumed by the `.md-btn-morph` utility, which also animates the radius on press (a deliberate M3 "morph" detail — don't remove it when adding button variants).
48
+
49
+ ## Motion (`src/lib/styles/motion.css`)
50
+
51
+ Two families of duration/easing pairs, exposed as `--md-sys-motion-easing*` custom properties combining a timing function + duration:
52
+
53
+ - **Standard** (color/opacity/simple UI changes): `easing` (200ms), `easing-fast` (150ms), `easing-slow` (300ms)
54
+ - **Expressive/spatial** (things that move, resize, or morph): `easing-fast-spatial` (350ms), `easing-spatial` (500ms), `easing-slow-spatial` (650ms)
55
+ - The M3 "emphasized" curve is also available as three raw timing functions (`emphasized`, `emphasized-accel`, `emphasized-decel`) for hand-rolled transitions — see `references/motion-guide.md` for when to use these vs. the animation module.
56
+
57
+ Full decision guidance for motion lives in `references/motion-guide.md` — don't just guess a duration.
package/package.json CHANGED
@@ -1,23 +1,28 @@
1
1
  {
2
2
  "name": "@noxlovette/material",
3
- "version": "0.1.35",
3
+ "version": "0.1.36",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "url": "git+https://github.com/noxlovette/material.git"
8
8
  },
9
9
  "scripts": {
10
- "build": "svelte-package",
10
+ "build": "svelte-package && bun scripts/copy-skill.ts",
11
11
  "prepublishOnly": "bun run build",
12
12
  "check": "svelte-kit sync && svelte-check",
13
13
  "test": "vitest run",
14
14
  "format": "prettier --write .",
15
15
  "dev": "vite dev"
16
16
  },
17
+ "bin": {
18
+ "material-claude-skill": "./bin/install-skill.js"
19
+ },
17
20
  "files": [
18
21
  "dist",
19
22
  "!dist/**/*.test.*",
20
- "!dist/**/*.spec.*"
23
+ "!dist/**/*.spec.*",
24
+ "claude-skill",
25
+ "bin"
21
26
  ],
22
27
  "sideEffects": false,
23
28
  "svelte": "./dist/index.js",
@@ -42,43 +47,43 @@
42
47
  "@eslint/compat": "^2.1.0",
43
48
  "@eslint/js": "^10.0.1",
44
49
  "@sveltejs/adapter-static": "^3.0.10",
45
- "@sveltejs/kit": "^2.63.0",
50
+ "@sveltejs/kit": "^2.69.3",
46
51
  "@sveltejs/package": "^2.5.8",
47
- "@sveltejs/vite-plugin-svelte": "^7.1.2",
48
- "@tailwindcss/cli": "^4.3.0",
49
- "@tailwindcss/typography": "^0.5.19",
50
- "@tailwindcss/vite": "^4.3.0",
51
- "@types/node": "^25.9.2",
52
- "eslint": "^10.4.1",
52
+ "@sveltejs/vite-plugin-svelte": "^7.2.0",
53
+ "@tailwindcss/cli": "^4.3.2",
54
+ "@tailwindcss/typography": "^0.5.20",
55
+ "@tailwindcss/vite": "^4.3.2",
56
+ "@types/node": "^25.9.5",
57
+ "eslint": "^10.7.0",
53
58
  "eslint-config-prettier": "^10.1.8",
54
- "eslint-plugin-svelte": "^3.19.0",
55
- "globals": "^17.6.0",
56
- "lefthook": "^2.1.9",
57
- "prettier": "^3.8.3",
59
+ "eslint-plugin-svelte": "^3.20.0",
60
+ "globals": "^17.7.0",
61
+ "lefthook": "^2.1.10",
62
+ "prettier": "^3.9.5",
58
63
  "prettier-plugin-organize-imports": "^4.3.0",
59
- "prettier-plugin-svelte": "^4.1.0",
64
+ "prettier-plugin-svelte": "^4.1.1",
60
65
  "prettier-plugin-tailwindcss": "^0.8.0",
61
66
  "publint": "^0.3.21",
62
- "svelte": "^5.56.2",
63
- "svelte-check": "^4.6.0",
64
- "sveltekit-superforms": "^2.30.1",
67
+ "svelte": "^5.56.5",
68
+ "svelte-check": "^4.7.2",
69
+ "sveltekit-superforms": "^2.30.2",
65
70
  "tailwind-scrollbar": "^4.0.2",
66
- "tailwindcss": "^4.3.0",
71
+ "tailwindcss": "^4.3.2",
67
72
  "typescript": "^6.0.3",
68
- "typescript-eslint": "^8.60.1",
69
- "vite": "^8.0.16",
73
+ "typescript-eslint": "^8.64.0",
74
+ "vite": "^8.1.4",
70
75
  "vite-plugin-devtools-json": "^1.0.0",
71
- "vitest": "^4.1.8",
76
+ "vitest": "^4.1.10",
72
77
  "zod": "^4.4.3"
73
78
  },
74
79
  "dependencies": {
75
- "@floating-ui/dom": "^1.7.6",
80
+ "@floating-ui/dom": "^1.8.0",
76
81
  "@internationalized/date": "^3.12.2",
77
82
  "@ktibow/material-color-utilities-nightly": "^0.4.1772748028000",
78
83
  "bits-ui": "^2.18.1",
79
84
  "clsx": "^2.1.1",
80
85
  "mode-watcher": "^1.1.0",
81
- "nanoid": "^5.1.11",
86
+ "nanoid": "^5.1.16",
82
87
  "tailwind-merge": "^3.6.0",
83
88
  "tailwind-variants": "^3.2.2"
84
89
  }