From 85f2eb4056f62b89a98b32df724c35c6ea000d6c Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Sat, 4 Oct 2025 15:39:20 +0200 Subject: [PATCH 01/20] added a directory for notes and ideas --- notes/inventory.md | 304 +++++++++++++++++++++++++++++++++ notes/notes.txt | 111 ++++++++++++ notes/svelte.md | 408 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 823 insertions(+) create mode 100644 notes/inventory.md create mode 100644 notes/notes.txt create mode 100644 notes/svelte.md diff --git a/notes/inventory.md b/notes/inventory.md new file mode 100644 index 000000000..dcb19572e --- /dev/null +++ b/notes/inventory.md @@ -0,0 +1,304 @@ +## Kando repository inventory and deep dive (pie menu + macOS) + +This document is a guided tour of the Kando codebase, with a strong focus on the JavaScript/HTML/CSS pie menu engine, its APIs, extension points, and theming; an enumeration of platform drivers; and an in-depth look at the macOS backend and native bridge. Use it as a map for navigating and extending the project. + +### Top-level layout (what lives where) + +- **src/**: Application code. + - **main/**: Electron host (main) process + - Creates windows, binds shortcuts, chooses and drives the platform backend, houses item actions, exposes IPC to renderers. + - Key files: + - `index.ts`: process bootstrap, CLI/deeplink parsing, backend selection, settings/theme directories, i18n init, app lifecycle. + - `app.ts` (exported as `KandoApp`): application core; owns `MenuWindow`, `SettingsWindow`, tray UI, settings and menu settings objects, update checker, and IPC wiring to both renderers. + - `menu-window.ts`: full-screen transparent window hosting the pie menu renderer; moves/zooms window, passes `ShowMenuOptions` to the renderer, manages inhibit/restore of shortcuts, macOS/Linux/Windows visibility/focus quirks. + - `settings-window.ts`: window for the React settings UI; flavor-dependent transparency (Acrylic on Windows, vibrancy on macOS). + - `backends/`: platform drivers (see “Platform backends” below). + - `item-actions/`: executable behaviors for menu items (`command`, `file`, `hotkey`, `macro`, `text`, `uri`, `redirect`, `settings`), registered via `ItemActionRegistry`. + - `settings/`: general + menu settings shape and persistence. + - `utils/`: notifications, shell helpers, version checking. + - `example-menus/`: OS-specific starter menus in JSON. + - **menu-renderer/**: Pie menu UI (DOM + CSS + behaviors) running in a sandboxed/isolated renderer process. + - Entry `index.ts` wires theme, sound, icon registry, settings button, and menu event handlers. + - `menu.ts`: the core pie menu state machine and renderer (selection chain, wedges, connectors, input integration, geometry). + - `menu-theme.ts`: theming engine for layered DOM + CSS custom properties. + - `sound-theme.ts`: sound theming via Howler. + - `rendered-menu-item.ts`: runtime item properties appended to `MenuItem` (angles, wedges, DOM nodes, etc.). + - `input-methods/`: `pointer-input` (mouse/touch with gestures; Marking/Turbo/Hover), `gamepad-input` (+ polling helper `gamepad`), plus base `input-method` types. + - `selection-wedges.ts` and `wedge-separators.ts`: optional background visuals driven by theme flags. + - `menu-window-api.ts`: renderer-side IPC surface (paired with `menu-window.ts`). + - `index.html` + `index.scss`: host page and default renderer styles (also pulls font icon CSS). + - **settings-renderer/**: React settings app (component library, dialogs, preview, pickers, state via Zustand, preload + IPC API). Useful when editing themes/menus and testing backends, but not required to understand menu runtime. + - **common/**: Shared types and utilities. + - `index.ts`: Type exports and core shared types: `Vec2`, `MenuThemeDescription`, `SoundThemeDescription`, `ShowMenuOptions`, `SoundType`, `BackendInfo`, `VersionInfo`, `WMInfo`, `SystemInfo`, `AppDescription`, etc. + - `math/`: geometry and wedge algorithms (angles, wedges, clamping to monitor, etc.). + - `icon-themes/`: icon theme registry implementations: system icons, file-based themes, Material Symbols, Simple Icons (colored + monochrome), emoji, fallback compositing, etc. + - `item-types/`: item type registry and per-type metadata (distinct from item actions in `main`). + - `settings-schemata/`: versioned settings schemas. + +- **assets/**: Built-in content packaged with the app. + - `menu-themes/`: first-class menu themes (each dir: `theme.json5` + `theme.css` + assets). + - `icon-themes/`, `sound-themes/`, `images/`, `installer/`, `videos/`, `icons/`. + - Tray icons: includes platform-specific variants; macOS uses `trayTemplate.png`. + +- **locales/**: i18n strings for all supported languages (loaded by i18next in main; both renderers query via IPC). + +- **build/**, **out/**: build artifacts (CMake for native add-ons; packaged apps). + +- **Configuration**: `package.json` (scripts, versions), `webpack.*.ts` (bundling and asset relocation), `forge.config.ts` (makers: dmg/rpm/deb/zip/squirrel), `eslint.config.mjs`, `tsconfig.json`. + +- **test/**: mocha-based tests. + +## Pie menu engine: concepts, APIs, extensibility + +### Data model and event flow + +- **Menu items**: Tree structured `MenuItem` objects (via `common`). Items can be executable (leaf) or submenu (non-leaf). + - Runtime rendering uses `RenderedMenuItem` (menu-renderer) which augments items with: + - `path` (like `/0/2/1`), computed by `Menu.setupPaths()` on show. + - Angular `wedge` and optional `parentWedge` (start/end angles in degrees), computed by `Menu.setupAngles()` using `common/math`. + - DOM associations: `nodeDiv`, optional `connectorDiv`, and last-known angle caches for smooth CSS transitions. + +- **Renderer lifecycle** (`menu-renderer/index.ts`): + 1. Requests theme, color overrides, sound theme, and general settings via `window.commonAPI` (preload IPC surface). + 2. Instantiates `MenuTheme`, `SoundTheme`, `SettingsButton`, then `Menu` with these dependencies and settings. + 3. Hooks IPC subscriptions: + - Show/hide menu (`menuAPI.onShowMenu`, `onHideMenu`). + - Theme reload (`onReloadMenuTheme`) and sound reload (`onReloadSoundTheme`). + - Dark mode updates via `commonAPI.darkModeChanged`. + 4. Forwards menu events back to main: selection, cancel, hover/unhover, pointer warp request. + 5. Updates settings-driven behaviors live (e.g., sound volume, turbo/marking/hover modes, thresholds, fade durations, etc.). + +- **Host lifecycle** (`main/index.ts` → `KandoApp`): + - Parses CLI and deep links (e.g., `kando://menu?name=`), enforces single instance, sets protocol handler. + - Chooses backend (see “Backends”), loads settings, optionally disables hardware acceleration, ensures theme directories exist. + - Initializes i18n and the chosen backend, then constructs `KandoApp` and windows. + - Binds/unbinds shortcuts per menus, wires tray menu for quick access, applies update checks. + - When a shortcut/deeplink arrives: gathers `WMInfo` from backend, calculates `ShowMenuOptions` and sends it plus menu root over IPC to the renderer via `MenuWindow.showMenu()`. + +### Menu class and rendering loop (`menu-renderer/menu.ts`) + +- **Selection chain**: The central model is a stack from root to current item (`selectionChain`). The last element is the active center. Parents and children are styled and transformed relative to that center. + +- **Show/hide**: + - `show(root, showMenuOptions)`: clears DOM, applies input modes from settings (Marking/Turbo/Hover), computes paths and angles, constructs DOM tree, selects initial item (usually the root), optionally warps pointer to center, fades in. + - `hide()`: toggles `.hidden`, schedules DOM clear after fade-out. + - `cancel()`: emits `cancel` and plays close sound. + +- **Angles and wedges** (via `common/math`): + - `computeItemAngles(items, parentAngle?)`: distributes child directions; respects any given fixed angles and reserves parent gap when present. Fixed angle rules: monotonic increase; 0° at top; 90° right. + - `computeItemWedges(angles, parentAngle?)`: converts center angles to [start,end] wedge arcs around each child; scales wedges (default 50%) and optionally yields a `parentWedge`. + - `clampToMonitor(center, maxRadius, windowSize)`: clamps submenu positions to current monitor to keep the full structure visible (root moves; can trigger pointer warp on non-anchored with warp enabled). + +- **DOM, transforms, CSS**: + - Each item is a `.menu-node` containing one `connector` div and a per-theme set of layered divs (see theming). + - Items get classes at runtime: `level-{n}`, `type-{item.type}`, plus direction hints `left|right|top|bottom` to assist CSS. + - State classes: `active`, `parent`, `child`, `grandchild`, `hovered`, `clicked`, `dragged`. CSS selectors (see `index.scss`) use these to display connectors and other effects. + - Transform loop updates: + - For center: compute pointer/hover angles and call `theme.setCenterProperties()` to push CSS custom properties. + - For children: call `theme.setChildProperties()` and let CSS drive transform/scale; inline transforms used only for dragged or clicked items. + - Connectors: runtime width/rotation from child position or angle; stores accumulated rotations to avoid 360° jumps. + +- **Inputs and gestures** (`input-methods/`): + - `PointerInput`: + - Modes: Marking (mouse drag), Turbo (keyboard modifier drag), Hover (no click if `hoverModeNeedsConfirmation` is false). + - Thresholds: `dragThreshold`, `gestureMinStrokeLength`, `gestureMinStrokeAngle`, `gestureJitterThreshold`, `gesturePauseTimeout`, `fixedStrokeLength`, `centerDeadZone` (all driven from General Settings). + - Gesture-based submenu selection via `GestureDetector`: detects corners (sharp turns) or pauses; also supports distance-based instant selections with `fixedStrokeLength`. + - Right click closes (or goes to parent per setting), aux back button selects parent. + - `GamepadInput`: + - Polls the web Gamepad API (normalized wrapper), maps stick tilt to `InputState`, button indices for close/back configurable. + - Selections are anchored at the initial center position; distance scaled by `parentDistance`. + +### Theming and skinnability + +- **MenuThemeDescription JSON (per theme)** (`common/index.ts`): + - `id`, `directory` (auto-filled), `name`, `author`, `themeVersion`, `engineVersion`, `license`. + - Layout flags: `maxMenuRadius`, `centerTextWrapWidth`, `drawChildrenBelow`, `drawCenterText`, `drawSelectionWedges`, `drawWedgeSeparators`. + - `colors`: name→CSS color map; becomes CSS custom properties `--` (user overrideable per theme, with dark-mode variant if configured). + - `layers`: array of `{ class, content }` drawn back-to-front per item; `content` is `none | name | icon`. + +- **How themes render** (`menu-renderer/menu-theme.ts`): + - Registers CSS custom properties once globally: + - `--angle-diff` per child (absolute angular distance from pointer) → drive zoom/scale rings. + - For center layers: `--pointer-angle`, `--hover-angle`, `--hovered-child-angle` (degrees), set each frame; values eased by `getClosestEquivalentAngle` to avoid discontinuities. + - `loadDescription(desc)`: injects `` and registers/updates color properties as CSS custom properties. + - `createItem(item)`: builds `.menu-node`, sets `data-name`, appends each layer div with `class` and optional icon/name. + - `setChildProperties(item, pointerAngle)`: updates `--angle-diff`. + - `setCenterProperties(item, pointerAngle, hoverAngle, parentHovered)`: updates angle properties on each center layer. + +- **Optional global visuals** (`drawSelectionWedges`, `drawWedgeSeparators`): + - `SelectionWedges`: full-viewport container whose CSS can use conic gradients; exposes `--center-x`, `--center-y`, `--start-angle`, `--end-angle` when hovered. + - `WedgeSeparators`: injects absolute `div.separator` lines rotated to angles; theme defines style (width, colors, blend modes). + +- **Icons** (`common/icon-themes` + `IconThemeRegistry`): + - System icon theme comes from the backend (`common.get-system-icons()` → name → CSS image source, often base64 data URL), merged with user file/icon themes and built-ins (Material Symbols, Simple Icons, Emoji, fallback composition). + - Items declare `iconTheme` + `icon` and `IconThemeRegistry.createIcon()` returns the element to append to layer divs. + +- **Sounds** (`SoundThemeDescription` + `sound-theme.ts`): + - `SoundType` enum covers open/close/select/hover variants (submenu/parent/leaf). Theme maps types to files and optional `volume`, `minPitch`, `maxPitch`. + - Renderer uses Howler to play by building a `file://` URL and randomizing pitch; central volume from settings. + +- **Theme development workflow**: + - Place a theme under `/menu-themes//theme.json5` and `theme.css`, or use built-in `assets/menu-themes/`. + - Switch theme in settings; modify color overrides (persisted per theme and per dark/light if enabled). + - Hot reload themes via CLI `--reload-menu-theme` or UI button (invokes IPC to renderer to reload without restart). + +### IPC surface and security + +- **Context isolation and sandboxing** are enabled for renderers. Preloads expose whitelisted APIs only. + - `common/common-window-api.ts`: shared IPC for both renderers (log, general/menu settings get/set + change streams, locales, theme descriptions/colors, isDarkMode, system icons, createItemForDroppedFile, devtools). + - `menu-renderer/menu-window-api.ts`: menu-specific events (show/hide menu, selection/hover events, pointer warping, show settings, reload callbacks). + - `main/menu-window.ts` listens to these channels and bridges to `KandoApp` and backends. + +## Platform backends (enumeration and contract) + +### Backend contract (`main/backends/backend.ts`) + +- Responsibilities: + - Expose `BackendInfo` (name, `menuWindowType`, `supportsShortcuts`, `shouldUseTransparentSettingsWindow`, optional hints for OS-level shortcut setup). + - `init()` / `deinit()` lifecycle for native hooks. + - Global shortcuts: `bindShortcuts(shortcuts)`, `inhibitShortcuts(shortcuts)`, `inhibitAllShortcuts()`, and emit `'shortcutPressed'` events. Base class default uses Electron `globalShortcut` but backends can override for OS integration/limitations. + - Pointer: `movePointer(dx, dy)` relative movement in screen coordinates. + - Key simulation: `simulateKeys(keySequence)` for macros/hotkeys. + - Window manager info: `getWMInfo()` → `{ appName, windowName, pointerX, pointerY, workArea }`. + - Installed apps: `getInstalledApps()` array for settings UI (id, name, command, icon, iconTheme). + - System icons: `getSystemIcons()` map and `systemIconsChanged()` (hint for regenerating icon theme in renderer). + - Drag-and-drop helper: `createItemForDroppedFile(name, path)` (override for platform semantics; defaults to `file` item with MIME-derived icon hint). + +### Available backends (overview) + +- **macOS** (`main/backends/macos/...`): see next section for a deep dive. + +- **Windows** (`main/backends/windows/...`): Win32-native add-on; binds global shortcuts; simulates keys; moves pointer; lists apps and system icons. Window chrome configured to get reliable always-on-top overlay behavior (uses `type: 'toolbar'` for menu window in many cases, adjusted per-platform in `BackendInfo`). Includes native C++ (.cpp) with `stb_image_write` for icon handling. + +- **Linux** (`main/backends/linux/...`): multiple flavors by desktop/sessions: + - X11 generic (`x11/`), KDE X11 (`kde/x11/`), Cinnamon X11; use Xlib/XTest or native add-ons for input and WM info. + - Wayland flavors (GNOME, KDE/Plasma, wlroots compositors, Niri); rely on portals or compositor-specific protocols (`wlr-layer-shell`, `wlr-virtual-pointer`, `virtual-keyboard`, `xdg-shell`), with a native shim where necessary. + - Portals helpers (`portals/desktop-portal.ts`, `global-shortcuts.ts`, `remote-desktop.ts`). + +## macOS backend and native bridge (deep dive) + +### High-level architecture + +- **Backend class**: `MacosBackend` extends `Backend`. + - `getBackendInfo()` returns `{ name: 'macOS', menuWindowType: 'normal', supportsShortcuts: true, shouldUseTransparentSettingsWindow: true }`. + - `init()` hides the app’s Dock icon (`app.dock.hide()`), enumerates installed apps+native icons, and fills `installedApps` and `systemIcons` for the renderer icon theme. + - `getWMInfo()` returns active app/window (via native bridge) and pointer position (Electron `screen.getCursorScreenPoint()`); computes `workArea` for the display nearest to pointer. + - `getInstalledApps()` returns cached list; `getSystemIcons()` returns cached base64 data URLs keyed by app name; `systemIconsChanged()` returns false (no dynamic changes). + - `createItemForDroppedFile(name, path)` special-cases: + - Executables (`isexe`) → `command` item with quoted absolute path. + - App bundles (by matching `CFBundleExecutable` id against installed list) → `command` item with `open -a ""` and system icon. + - Falls back to default `file` item otherwise. + - Pointer and keys: + - `movePointer(dx, dy)` delegates to native; errors logged if bridge fails. + - `simulateKeys(keys)` maps DOM key names to Apple key codes using `common/key-codes` mapping (`mapKeys(keys, 'macos')`) and calls native per stroke, honoring per-keystroke delays. + +### Native add-on (Node-API, Objective‑C++) + +- **Module binding** (`main/backends/macos/native/index.ts`): requires `build/Release/NativeMacOS.node` and defines TypeScript interface `Native` exposing: + - `movePointer(dx: number, dy: number)` + - `simulateKey(keycode: number, down: boolean)` + - `getActiveWindow(): { app: string; name: string }` + - `listInstalledApplications(): Array<{ name: string; id: string; base64Icon: string }>` + +- **Build** (`CMakeLists.txt`): + - `enable_language(OBJCXX)`; builds `NativeMacOS` shared library with `.mm` sources and Node-API glue (`CMAKE_JS_*`), produces `.node` binary with no prefix/suffix tweaks. + +- **Implementation** (`Native.mm`): + - `movePointer(dx, dy)`: reads current pointer with Core Graphics and `CGWarpMouseCursorPosition` to warp cursor by delta. Used by renderer to gently nudge pointer when clamped near edges (see `menu.ts` + `menu-window.ts` scaling rules). + - `simulateKey(keycode, down)`: ensures Accessibility permission via `CGRequestPostEventAccess()`; updates internal left/right modifier masks for Command/Shift/Control/Option; posts a keyboard event with combined modifier flags. + - `getActiveWindow()`: uses AppKit to get `frontmostApplication`. Chooses ID via `bundleIdentifier` (preferred) or `localizedName`; scans on‑screen windows via `CGWindowListCopyWindowInfo` to find first window with same PID; returns title if available. If window title missing, returns a sentinel “Missing Screen Recording Permissions” and prints a console hint. This reflects macOS 10.15+ Screen Recording privacy requirement for enumerating window names. + - `listInstalledApplications()`: enumerates `/Applications`, `/System/Applications`, `~/Applications`, and `~/Library/Applications` for `.app` bundles; reads `CFBundleName` and `CFBundleExecutable`; renders the Finder icon at 64×64 to a PNG and returns base64 data URL. The backend caches these for the system icon theme and the App picker in settings. + +### macOS-specific windowing behaviors in main process + +- **Menu window** (`main/menu-window.ts`): + - `show()`: on macOS, toggles visibility on all workspaces briefly (`setVisibleOnAllWorkspaces(true)` → delay → `false`) to ensure the window is on the current desktop (#461 fix); always-on-top `screen-saver` level. + - `hideWindow()`: on macOS, calls `super.hide()` and then `app.hide()` to properly return focus to the previous app, except when settings are visible. + - **Pointer movement scaling**: Only non-macOS platforms scale deltas by monitor DPI; on macOS the native bridge is “pixel accurate”, so scaling is left at 1. The renderer deltas are additionally scaled by `webContents.getZoomFactor()` before sending to backend. + +- **App policy & tray** (`main/app.ts` constructor of `KandoApp`): + - On macOS, sets activation policy to `accessory` so the app doesn’t appear in Dock or Cmd‑Tab. + - Tray icon uses a template PNG for automatic tinting. Context menu includes menus, settings, inhibit/uninhibit shortcuts, and Quit. + +- **Settings window** (`main/settings-window.ts`): + - Transparent flavors use macOS vibrancy `menu` (Electron `vibrancy`), with hidden titlebar overlay. + +### macOS permissions and UX implications + +- **Accessibility**: required for simulated key events (macros/hotkeys). If unavailable, native throws and the backend reports errors. +- **Screen Recording**: needed to retrieve window titles in `getActiveWindow()`; without it, Kando will still work but UI condition matching by `windowName` is impaired and a hint is logged. + +## How it all fits together (runtime flow) + +- A menu is shown when: + - The user presses a globally bound shortcut; or + - Kando is launched with `--menu ` or via `kando://menu?name=` deep link; or + - Tray context menu selection. + +- Host-side (`KandoApp.showMenu`): + - Ensures `MenuWindow` is created and loaded; asks backend for `WMInfo` and `systemIconsChanged`. + - Uses `chooseMenu(request, info)` to pick the best-matching menu by trigger and optional conditions (`appName`, `windowName`, `screenArea` regex/substring checks). Supports cycling behavior when the same shortcut is pressed repeatedly. + - Adjusts window bounds to the monitor `workArea`, shows the window, and computes `ShowMenuOptions` (mouse position relative to window, scaled by zoom; centered/anchored/hover mode flags; system icon theme change hint). + - Sends root `MenuItem` and `ShowMenuOptions` to renderer. + +- Renderer-side (`menu-renderer/index.ts` + `menu.ts`): + - Creates themed DOM and inputs, positions root and children, and begins selection loop. + - Emits `select`/`cancel` which `MenuWindow` converts to actions via `ItemActionRegistry`. + - Hides with fade; host delays executing “delayedExecution” actions until fade-out completes so keystrokes go to the target app, not Kando’s window. + +## Extending Kando: key seams + +- **Add a new menu theme**: + - Create `/menu-themes//theme.json5` + `theme.css` (or add to `assets/menu-themes` to ship with app). + - Define `layers` and `colors`. Use CSS custom properties set by the engine: `--angle-diff` (children), `--pointer-angle`/`--hover-angle`/`--hovered-child-angle` (center layers), and item-level properties like `--dir-x`, `--dir-y`, `--angle`, `--parent-angle`, `--sibling-count`. + - Turn on `drawSelectionWedges` / `drawWedgeSeparators` for global background effects. + +- **Add/modify an item type**: + - Define metadata in `common/item-types` (icon defaults, validation, etc.). + - Implement behavior in `main/item-actions` and register in `ItemActionRegistry`. + - Add a settings editor in `settings-renderer/components/menu-properties/item-configs` if user-editable. + +- **Add a platform capability on macOS**: + - Extend native add-on (`Native.hpp`/`.mm`) with a new method; export via `index.ts` and call from `MacosBackend`. + - Watch for additional entitlements/permissions (e.g., accessibility, screen recording) and error surfaces. + +- **Support a new backend**: + - Create a `Backend` subclass with the required methods; consider session/DE detection in `backends/index.ts`; add native shim if needed. + +## Settings overview (selected fields that affect the menu) + +- Visuals & timing: `fadeInDuration`, `fadeOutDuration`, `zoomFactor`, `enableDarkModeForMenuThemes`. +- Input behavior: `warpMouse`, `enableMarkingMode`, `enableTurboMode`, `hoverModeNeedsConfirmation`, `dragThreshold`, gesture thresholds, `centerDeadZone`, `keepInputFocus`. +- Selection policies: `sameShortcutBehavior` (`nothing|close|cycle-from-first|cycle-from-recent`), `anchored`, `centered`, `hoverMode` (per menu). +- Sounds: `soundTheme`, `soundVolume`. +- Backend-specific UI hints: `trayIconFlavor`, `settingsWindowFlavor` (auto→system default per backend preference), `enableVersionCheck`. + +## Build and run + +- Toolchain: Node 20.x, Electron 38, TypeScript 5.9, Webpack forge plugin, cmake-js for native modules. +- Scripts (see `package.json`): + - `postinstall`: `cmake-js compile` (builds native add-ons across platforms). + - `start`: dev with electron-forge (webpack dev server for renderers; webSecurity disabled in dev only). + - `make`: package with forge makers (DMG/RPM/DEB/Squirrel/ZIP as configured). + - `test`: mocha specs. + - `i18n`: extract strings. + +## Quick reference: important types + +- `ShowMenuOptions`: `{ mousePosition, windowSize, zoomFactor, centeredMode, anchoredMode, hoverMode, systemIconsChanged }`. +- `MenuThemeDescription`: identity metadata, layout flags, `colors`, `layers`. +- `SoundThemeDescription`: identity metadata + `sounds: Record`. +- `WMInfo`: `{ windowName, appName, pointerX, pointerY, workArea }`. +- `BackendInfo`: `{ name, menuWindowType, supportsShortcuts, shouldUseTransparentSettingsWindow, shortcutHint? }`. + +## Troubleshooting: macOS + +- No window titles in conditions: grant Screen Recording permission to Kando (System Settings → Privacy & Security → Screen Recording). +- Macros/hotkeys not working: grant Accessibility permission (Privacy & Security → Accessibility). +- Menu not appearing on current desktop: the app sets `setVisibleOnAllWorkspaces(true) → false` on show as a workaround; verify Mission Control/Stage Manager settings. + +--- + +If you’re extending the pie menu visuals, start with a copy of a built-in theme under `assets/menu-themes/default` and experiment with `--angle-diff`, conic gradients for `SelectionWedges`, and layer-specific transitions keyed off `--pointer-angle`/`--hover-angle`. For platform features on macOS, add minimally-scoped native methods and surface them through the `MacosBackend` while preserving renderer sandboxing and IPC boundaries. + + diff --git a/notes/notes.txt b/notes/notes.txt new file mode 100644 index 000000000..dbbf6e0f5 --- /dev/null +++ b/notes/notes.txt @@ -0,0 +1,111 @@ +Trying with latest versions of: + +node: 20.10.0 +npm: 10.2.3 + +nvm install 20.10.0 + +Kando for Snap AR Spectacles / Lens Studio! +https://ar.snap.com/lens-studio + +submenus with links back to the parent menu +kando/src/renderer/math/math.ts + +/** + * This method receives an array of objects, each representing an item in a menu level. + * For each item it computes an angle defining the direction in which the item should be + * rendered. The angles are returned in an array (of the same length as the input array). + * If an item in the input array already has an 'angle' property, this is considered a + * fixed angle and all others are distributed more ore less evenly around. This method + * also reserves the required angular space for the back navigation link to the parent + * item (if given). Angles in items are always in degrees, 0° is on the top, 90° on the + * right, 180° on the bottom and so on. Fixed input angles must be monotonically + * increasing. If this is not the case, the smaller angle is ignored. + * + * @param items The Items for which the angles should be computed. They may already have + * an angle property. If so, this is considered a fixed angle. + * @param parentAngle The angle of the parent item. If given, there will be some reserved + * space. + * @returns An array of angles in degrees. + */ + +How about the back links only occupy the "inner radius" of the pie +menu, so you can still put a normal item in the same direction as +"back", but you just have to move out further to select it, because +the "back" button has a max radius (i.e. inside the menu label radius). + +Or the back link could be the outer radius segment instead of the +inner radius segment. + +This could be a general purpose way of "stacking" multipl pie menu +items in the same direction, each occupying a radius interval arc. And +outer arcs can double and further increase the number of directional +items. + +Think of them like segments of orbitals for electrons. + +Slices / Petals? Multiple petals per slice. + +ChatGPT suggests: + +For naming the radial segments in a pie menu, especially when +considering stacking multiple items in the same direction with +different radii, you could use terms like "Orbital Layers" or "Radial +Tiers." Each tier or layer can represent a different level of menu +items, with the innermost being the back links or primary options, and +the outer layers for additional or secondary options. The outermost +layer that extends to the edge of the screen could be called the +"Peripheral Tier" or "Boundary Layer." These terms can effectively +convey the idea of multiple, concentric segments within a single +directional slice of the pie menu. + +Each slice has a tierSlices property, an array of integers, defining +the number of directional slices each layer has. The top level pie +menu typically has a subtend of 360 degrees (although it could be cut +in half or quarter at the screen edge or corner). The first layer is +usually 1 (if there is only one item), 2, 4, 8, or even 12. + +tierSlices = [8, 1, 2, 4, 8] + +That is an 8 slice pie menu that can hold 8 * (1 + 2 + 4 + 8) = 120 +items. + +The narrowest subtend outer layers extend to the screen edge, making +them easier to select than if their outer radius was limited. + +The layout algorithm could normalize the area by adjusting the inner +and outer radius of each layer, so all but the big outer items had the +same area. + +---- + +pie menu layout and editor + +the layout algorithms should be in the editor, and you should be able +to plug new ones in, and select different layout and tracking and +rendering policies per pie, slice, and item. You can select a high +level style in the editor, and it can apply it recursively to the +whole menu tree, stashing default values in the objects. Then you can +edit each pie, slice and item to override and customize those +parameters. Each policy might have its own parameters, but there is a +set of standard shared parameters too. + +Layout, tracking, and redering policies can declare their parameters +in a way that the editor can automatically generate editing dialogs +and direct manipulation interfaces for them. + +Use pie menus to edit pie menus! + +the MenuNode Path is like /1/2/3, which is a numeric path through the user interface. + +It might also be nice to support paths with identifiers instead of (or addition to) +paths with numbers, since the user could change the numbers by editing the menus. + +So each node would have its own id, which did not have to be globally +unique, just local to the menu. (what happens when items have the same +id? barf? stack them together? give them each a unique index?) + +You might also want to arrange items in their own semantic hierarchy, +and give items an id like blender.file.open, to reflect the command +structure instead of the user interface structure. Those names would +be unique by definition. diff --git a/notes/svelte.md b/notes/svelte.md new file mode 100644 index 000000000..b617742e6 --- /dev/null +++ b/notes/svelte.md @@ -0,0 +1,408 @@ +## Svelte 5 pie menu implementation aligned with Kando (code-compatible) + +Goal: Build a Svelte 5/SvelteKit implementation of Kando’s pie menu that reuses (and where practical, copies verbatim) Kando’s code, APIs, schemas, algorithms, and contracts, while preserving attribution and licenses. Keep naming and structure aligned so both projects stay in sync; use Svelte 5 only as the packaging/rendering layer. No editor in Svelte initially—design menus/themes in Kando and import them into Svelte apps (e.g., Micropolis) seamlessly. Eventually add a SvelteKit editor. + +### High-level requirements + +- Load and render Kando menu JSONs and Kando menu themes (theme.json5 + theme.css) as-is. +- Reproduce Kando’s geometry and interaction (angles, wedges, connectors, selection chain, hover/drag/click semantics) so the same data yields the same UX. +- Keep engine concerns (geometry, input, state) separate from skinning (theme layers + CSS custom properties) and from app wiring (SvelteKit-specific loading and routes). +- Svelte 5 features: use runes ($state/$derived/$effect) for local state/derivations, pass snippets for theme layer templating, and provide small, composable components. + +--- + +## Compatibility surface (what must match Kando) + +### Menu JSON shape (reader contract) + +Kando example (`src/main/example-menus/*.json`) shows top-level fields and item tree. Svelte must accept: + +- Top-level menu object properties (as produced by Kando editor): + - `shortcut`: string (unused by Svelte at runtime, but preserved) + - `shortcutID`: string (unused in Svelte) + - `centered`: boolean + - `anchored?`: boolean + - `hoverMode?`: boolean + - `conditions?`: { appName?, windowName?, screenArea? } (ignored unless consumer app wants ambient conditions) + - `root`: `MenuItem` + +- `MenuItem` (union by `type`): + - Common: + - `type`: 'submenu' | 'command' | 'file' | 'hotkey' | 'macro' | 'text' | 'uri' | 'redirect' | 'settings' + - `name`: string + - `icon?`: string + - `iconTheme?`: string (e.g., 'material-symbols-rounded', 'simple-icons', 'system', etc.) + - `angle?`: number (fixed angle in degrees; obey Kando’s fixed angles policy) + - `children?`: `MenuItem[]` (for 'submenu') + - Type-specific `data` payloads (pass-through): + - 'command': `{ command: string }` + - 'file': `{ path: string }` + - 'hotkey': `{ hotkey: string; delayed?: boolean }` + - 'macro': `{ keys: KeySequence }` + - 'text': `{ text: string }` + - 'uri': `{ uri: string }` + - 'redirect': `{ path: string }` + - 'settings': `{ dialog?: string }` + +Svelte renderer should treat items as opaque actions and emit `select(path, item)`; host app decides execution. + +### Theme JSON5 + CSS shape (reader contract) + +Theme JSON5 fields (see `assets/menu-themes/*/theme.json5`): + +- Identity: `name`, `author`, `license`, `themeVersion`, `engineVersion` (Svelte should accept engineVersion >= 1) +- Layout flags: + - `maxMenuRadius`: pixels used to clamp away from edges + - `centerTextWrapWidth`: px width for text wrap in center + - `drawChildrenBelow`: boolean (z-order) + - `drawCenterText`: boolean + - `drawSelectionWedges`: boolean + - `drawWedgeSeparators`: boolean +- `colors`: Record (becomes CSS custom properties `--`) +- `layers`: array of `{ class: string; content: 'none' | 'name' | 'icon' }` + +Theme CSS assumptions: + +- CSS operates on DOM structure created by the engine: + - Container `div.menu-node` per item, plus a `.connector` under nodes with children. + - Theme engine creates one div per `layer.class` inside each `.menu-node` and may inject an `.icon-container` or name text depending on `content`. +- Engine sets CSS custom props every frame: + - For children: `--angle-diff` + - For center layers: `--pointer-angle`, `--hover-angle`, `--hovered-child-angle` +- Engine sets static per-item CSS variables on `.menu-node` elements: + - `--dir-x`, `--dir-y`, `--angle`, `--parent-angle?`, `--sibling-count` + +Svelte must adhere to the same DOM/CSS contract to make Kando themes work without changes. + +### Icons and icon themes + +- Kando uses an `IconThemeRegistry` to materialize icons from different sources: + - Material Symbols font (rounded), Simple Icons font, Emoji, system icon data URLs, file icon themes. +- In Svelte, provide an injectable icon resolver that mirrors Kando semantics: + - 'material-symbols-rounded': render `glyph`; include package/font CSS. + - 'simple-icons'/'simple-icons-colored': render `` or SVG fallback. + - 'file-icon-theme': map to URL space; allow mounting a theme directory. + - 'system': host app provides name→data URL mapping (optional). + +--- + +## Geometry, interaction, and rendering rules (compat) + +Re-implement Kando math in Svelte (1:1 behavior): + +- Angles and wedges: + - Compute child angles with `computeItemAngles(children, parentAngle?)`, honoring fixed angles (monotonic increasing, clamp to [0, 360) for first, remove duplicates and overflow beyond first+360). + - Compute wedges with `computeItemWedges(angles, parentAngle?)` and scale wedges inward by 50% toward center (see Kando’s `scaleWedge`). Optionally produce `parentWedge`. + - Angle conventions: 0° = top, 90° = right, 180° = bottom; `getAngle(vec)` uses atan2(y, x) transformed accordingly. + +- Selection chain: + - Maintain a stack `[root, ..., current]`. Selecting a parent pops; selecting a child pushes. + - Center position is root position plus relative offsets of chain items; children positions are derived from angle and current distance. + - Clamp center for submenus to keep `maxMenuRadius` fully visible; optionally emit “move-pointer” if you implement pointer warp (desktop). + +- Input methods (initial scope): + - Pointer/touch: hover detection based on current angle vs wedge arcs, `centerDeadZone` for parent hover logic, clicked and dragged states. + - Gestures (optional in v1): marking/turbo modes; reproduce Kando’s `GestureDetector` thresholds and behaviors (min stroke length, jitter, pause, fixedStrokeLength). + - Keyboard (optional): numeric/alpha selections; Backspace selects parent; Escape cancels. + - Gamepad (later): normalized axes and button mapping; keep semantics if needed. + +- DOM + classes: + - Use exactly the class names Kando expects: `.menu-node`, `.connector`, and state classes (`active`, `parent`, `child`, `grandchild`, `hovered`, `clicked`, `dragged`, `level-N`, `type-`). + - For direction-based styling, set `.left/.right/.top/.bottom` heuristic classes as Kando does. + +--- + +## Svelte 5 architecture + +### Packages and layers + +- `@kando-svelte/core` (Svelte library folder inside your app): + - Pure TS math (angles, wedges, clamp) + - Types (mirroring Kando’s `common/index.ts` subset) + - Renderer store/state (selection chain, input state) + - Icon resolver interface + default resolvers +- `@kando-svelte/svelte-components`: + - `PieMenu.svelte`: orchestrates rendering; accepts `root`, `theme`, `options` and emits `select`, `cancel`, `hover`, `unhover`, `movePointer?` events + - `PieItem.svelte`: renders a single `.menu-node` (recursive) + - `SelectionWedges.svelte` and `WedgeSeparators.svelte` + - `CenterText.svelte` (optional) + - Theme layer rendering helpers/snippets +- `@kando-svelte/sveltekit`: + - SvelteKit loaders/adapters for reading theme.json5 and injecting theme.css links + - Vite plugin config for fonts/icons (Material Symbols, Simple Icons) + +### Types (compat subset) + +```ts +export type Vec2 = { x: number; y: number }; + +export type ShowMenuOptions = { + mousePosition: Vec2; + windowSize: Vec2; + zoomFactor: number; + centeredMode: boolean; + anchoredMode: boolean; + hoverMode: boolean; + systemIconsChanged?: boolean; +}; + +export type MenuItem = { + type: 'submenu' | 'command' | 'file' | 'hotkey' | 'macro' | 'text' | 'uri' | 'redirect' | 'settings'; + name: string; + icon?: string; + iconTheme?: string; + angle?: number; + children?: MenuItem[]; + data?: unknown; // preserved opaque payload +}; + +export type MenuThemeDescription = { + id: string; // filled by loader based on directory name + directory: string; // absolute dir path; used to resolve CSS + name: string; + author: string; + themeVersion: string; + engineVersion: number; // expect >= 1 + license: string; + maxMenuRadius: number; + centerTextWrapWidth: number; + drawChildrenBelow: boolean; + drawCenterText: boolean; + drawSelectionWedges: boolean; + drawWedgeSeparators: boolean; + colors: Record; + layers: { class: string; content: 'none' | 'name' | 'icon' }[]; +}; +``` + +### State and reactivity with Svelte 5 runes + +- `$state` to hold local mutable state: + - `selectionChain`, `hoveredItem`, `clickedItem`, `draggedItem` + - `latestInput` (angle, distance, absolute/relative position, button state) + - `rootPosition`, `showMenuOptions`, `hideTimeout?` +- `$derived` for computed geometry: + - `currentCenterPosition`, `childDirections`, `clampedCenter`, `separatorAngles` + - CSS-friendly properties per item (dir vectors, angle diff) +- `$effect` to: + - Inject and update theme link element and color CSS props when theme changes + - Register/unregister event listeners (pointer/move/up, keydown/up) + +### Component design + +- `PieMenu.svelte` + - Props: `{ root: MenuItem; theme: MenuThemeDescription; options?: Partial; iconResolver?: IconResolver }` + - Emits: `select(path: string, item: MenuItem)`, `cancel()`, `hover(path)`, `unhover(path)` + - Responsibilities: + - Initialize theme (inject theme.css via ``; set CSS registerProperty if available) + - Build `RenderedMenuItem` tree: assign paths `/`, `/0`, …; compute angles & wedges recursively + - Manage selection chain and transforms; set CSS variables and classes on nodes + - Mount optional `SelectionWedges` and `WedgeSeparators` if theme flags are true + - Handle input modes (hover/marking/turbo as configured); expose hooks to plug gesture detector when needed + +- `PieItem.svelte` + - Renders one `.menu-node` with per-theme layers + - Sets static CSS variables (`--dir-x`, `--dir-y`, `--angle`, `--sibling-count`, `--parent-angle?`) + - Updates layer angle props on center (`--pointer-angle`, `--hover-angle`, `--hovered-child-angle`) + - Emits hover/click/drag events up to `PieMenu` + +- `SelectionWedges.svelte` + - Full-screen container setting `--center-x/--center-y`, `--start-angle/--end-angle` on hover + +- `WedgeSeparators.svelte` + - Renders absolute `div.separator` lines rotated to `--angle`, positioned from the center + +### Theme compatibility layer + +At mount or theme change: + +1. Inject `` (or serve via SvelteKit static assets). Remove previous link if present. +2. Register CSS properties if supported: + - `--angle-diff` as `` + - `--pointer-angle`, `--hover-angle`, `--hovered-child-angle` as `` +3. Apply `theme.colors` to `document.documentElement.style.setProperty('--'+name, color)`; on color change, update directly. +4. Build per-item layers according to `theme.layers`: + - If `content === 'icon'`, create an `.icon-container` and append icon element from the icon resolver. + - If `content === 'name'`, set innerText to item name. + +### SvelteKit integration + +- Theme and menu loading strategies: + - Static bundle: copy Kando-exported themes under `static/menu-themes//` and import theme JSON5 via a small loader that resolves `directory` and `id` based on file path. + - User-provided themes at runtime: expose an origin or file-system adapter; compute `file://` or `base`-relative URLs to CSS. +- Fonts and icon CSS: include Material Symbols and Simple Icons CSS in `app.html` or via layout to ensure theme CSS selectors resolve. +- SSR beware: DOM APIs (registerProperty, document.head) only in browser; gate via `onMount` or `$effect` with `browser` guard. + +--- + +## Settings compatibility (Kando → Svelte) + +Adopt Kando’s schemas for plug‑and‑play, but only enforce the subset that affects web rendering/input; keep the rest for round‑trip with Kando’s editor. + +- Must support (renderer behavior) + - Per menu (MENU_SCHEMA_V1): `root`, `centered`, `anchored`, `hoverMode`, `tags`, `conditions` (optional to use), `shortcut`, `shortcutID` (store, usually ignore in web). + - Per item (MENU_ITEM_SCHEMA_V1): `type`, `name`, `icon`, `iconTheme`, `children`, `angle`, `data` (opaque to renderer; host app executes). + - General (GENERAL_SETTINGS_SCHEMA_V1): + - Visuals/timing: `zoomFactor`, `fadeInDuration`, `fadeOutDuration`. + - Input/interaction: `centerDeadZone`, `minParentDistance`, `dragThreshold`, `enableMarkingMode`, `enableTurboMode`, `hoverModeNeedsConfirmation`, `gestureMinStrokeLength`, `gestureMinStrokeAngle`, `gestureJitterThreshold`, `gesturePauseTimeout`, `fixedStrokeLength`, `rmbSelectsParent`, `enableGamepad`, `gamepadBackButton`, `gamepadCloseButton`, `sameShortcutBehavior`. + - Theming/sounds: `menuTheme`, `darkMenuTheme`, `enableDarkModeForMenuThemes`, `menuThemeColors`, `darkMenuThemeColors`, `soundTheme` (optional in web), `soundVolume`. + +- Optional (web nice‑to‑have) + - Sound themes with Howler honoring `soundTheme` and `soundVolume`. + - Dark‑mode switch honoring `enableDarkModeForMenuThemes` + system theme. + +- Store but ignore in Svelte (Electron/OS chrome) + - `locale`, `showIntroductionDialog`, `settingsWindowColorScheme`, `settingsWindowFlavor`, `trayIconFlavor`, `hardwareAcceleration`, `lazyInitialization`, `hideSettingsButton`, `settingsButtonPosition`, `keepInputFocus`, `warpMouse`, `enableVersionCheck`, `useDefaultOsShowSettingsHotkey`. + - `conditions` may be evaluated only if the host app provides a mapping (e.g., Micropolis in‑game context) – otherwise ignore in the browser. + +- Svelte/web extensions + - Namespaced under `svelte`, e.g.: + - `svelte: { actionDispatcher?: (item) => void; mountSelector?: string; pointerLock?: boolean }` + - Keep extensions additive; never mutate Kando’s fields. + +- Loader responsibilities + - Accept Kando settings and menus unmodified. + - Pick a menu by name/tag; optionally match `conditions` via host‑provided predicates. + - Resolve theme JSON5 → `{ id, directory }` and inject theme CSS; apply `menuThemeColors` with dark‑mode variant when enabled. + +- Decision + - Import entire Kando schemas; use the renderer/input/theming subset; ignore OS/Electron chrome; add namespaced Svelte extensions. This keeps you interoperable with Kando’s editor and future schema updates. + +--- + +## Porting Kando math to TS (sketch) + +Implement the following in `@kando-svelte/core/math` mirroring Kando’s behavior: + +```ts +export function toDegrees(rad: number): number; export function toRadians(deg: number): number; +export function getLength(v: Vec2): number; export function add(a: Vec2, b: Vec2): Vec2; +export function subtract(a: Vec2, b: Vec2): Vec2; export function getAngle(v: Vec2): number; // 0° top +export function getDirection(angle: number, len: number): Vec2; // 0° top +export function getAngularDifference(a: number, b: number): number; // [0,180] +export function getClosestEquivalentAngle(angle: number, to?: number): number; +export function getEquivalentAngleSmallerThan(angle: number, than?: number): number; +export function getEquivalentAngleLargerThan(angle: number, than?: number): number; +export function normalizeConsequtiveAngles(a: number, b: number, c: number): [number, number, number]; +export function isAngleBetween(angle: number, start: number, end: number): boolean; +export function clampToMonitor(center: Vec2, radius: number, size: Vec2): Vec2; + +export function fixFixedAngles(items: { angle?: number }[]): void; +export function computeItemAngles(items: { angle?: number }[], parentAngle?: number): number[]; +export function computeItemWedges(itemAngles: number[], parentAngle?: number): { + itemWedges: { start: number; end: number }[]; + parentWedge?: { start: number; end: number }; +}; +``` + +These must be behaviorally identical to Kando’s to preserve layout, hover, and connector visuals across themes. + +--- + +## Input model (pointer first) + +Define an `InputState` compatible with Kando: + +```ts +export enum ButtonState { Released, Clicked, Dragged } +export type InputState = { + button: ButtonState; + absolutePosition: Vec2; + relativePosition: Vec2; + distance: number; + angle: number; +}; +``` + +Pointer/touch handlers should: + +- Maintain `clickPosition`, `keydownPosition` (for turbo/hover modes later) and `centerPosition` (current submenu center) to compute `relativePosition` and `angle`. +- Switch to `Dragged` when `dragThreshold` exceeded (Marking mode), or when modifiers pressed (Turbo) beyond threshold. +- Emit selection on pointer up (Click) or when gesture detector fires (Marking/Turbo), with `SelectionType` hint: ActiveItem/SubmenuOnly/Parent. + +Gesture detector (optional v1) mirrors Kando’s: min stroke length, jitter threshold, pause timeout, and distance-based selection via `fixedStrokeLength`. + +--- + +## Events and host API + +`` emits: + +- `select(path: string, item: MenuItem)` – host executes action (open URI, run command, etc.) +- `cancel()` +- `hover(path: string)` / `unhover(path: string)` (optional) +- `movePointer(dist: Vec2)` (desktop only; no-op in browsers) + +Props/control: + +- `root: MenuItem` +- `theme: MenuThemeDescription` +- `options?: Partial` (centered/anchored/hoverMode) +- `settings?: Partial & { svelte?: Record }` (dragThreshold, fade durations, gesture thresholds, etc.) + +--- + +## Example usage (SvelteKit) + +```svelte + + + +{#if menu && theme} + onSelect(e.detail.path, e.detail.item)} /> +{/if} +``` + +Theme loader should parse JSON5, set `id` from parent dir, and `directory` to that dir path for resolving `theme.css` as `file:////theme.css` or app-relative URL. + +--- + +## Micropolis integration notes + +- Micropolis can author menus with Kando’s editor and export: + - Menus: place JSON under `static/menus/` or fetch from a CMS + - Themes: place under `static/menu-themes//` with unmodified `theme.json5` + `theme.css` +- Use Micropolis-specific action dispatchers for 'command'/'uri'/'hotkey' etc., or translate to game engine events. +- Consider turning on `centered` and `anchored` for console/controller UX. + +--- + +## Edge cases and risks + +- Fixed angles must be monotonically increasing after normalization; if not, ignore later duplicates—match Kando’s `fixFixedAngles`. +- Theme engineVersion mismatch: warn and attempt best-effort (engine v1 expected). +- SSR pitfalls: only inject theme CSS in browser; guard API usage. +- Icons: Material/Simple Icons versions and CSS class names must match the theme’s expectations; include appropriate CSS. +- System icons: not available in the browser; provide stub icon theme or map names to app-provided assets. + +--- + +## Roadmap (post-v1) + +- Full gesture support (Marking/Turbo) with configurable thresholds +- Gamepad input with stick hover and button mapping +- Sound themes (Howler) with `SoundThemeDescription` +- Theme editor preview inside Svelte (read-only) +- Menu editor (longer-term; keep Kando as the primary authoring tool for now) + +--- + +## License and provenance + +This project intentionally reuses—and where practical, copies—Kando’s source code, APIs, schemas, algorithms, and contracts to maximize compatibility and ease of synchronization. Preserve original copyright headers and SPDX identifiers, retain license notices, and attribute the Kando project and its author. Kando is licensed under MIT; theme assets and fonts carry their own licenses (e.g., CC0-1.0 for the default theme, Material Symbols, Simple Icons). Ensure all copied files keep their original licenses and attributions. From 5c17d5105a4a937a6cc107bd77073136f78ab1c1 Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Sat, 4 Oct 2025 16:18:34 +0200 Subject: [PATCH 02/20] made skeleton sveltekit kandu-svelte library and demo, wrote up design --- kando-svelte-demo/.gitignore | 23 + kando-svelte-demo/.npmrc | 1 + kando-svelte-demo/.prettierignore | 9 + kando-svelte-demo/.prettierrc | 15 + kando-svelte-demo/README.md | 38 + kando-svelte-demo/eslint.config.js | 4 + kando-svelte-demo/package-lock.json | 3459 +++++++++++++++++ kando-svelte-demo/package.json | 35 + kando-svelte-demo/src/app.d.ts | 13 + kando-svelte-demo/src/app.html | 11 + kando-svelte-demo/src/lib/assets/favicon.svg | 1 + kando-svelte-demo/src/lib/index.ts | 1 + kando-svelte-demo/src/routes/+layout.svelte | 11 + kando-svelte-demo/src/routes/+page.svelte | 2 + kando-svelte-demo/static/robots.txt | 3 + kando-svelte-demo/svelte.config.js | 17 + kando-svelte-demo/tsconfig.json | 19 + kando-svelte-demo/vite.config.ts | 6 + kando-svelte/.gitignore | 24 + kando-svelte/.npmrc | 1 + kando-svelte/.prettierignore | 9 + kando-svelte/.prettierrc | 15 + kando-svelte/README.md | 58 + kando-svelte/eslint.config.js | 4 + kando-svelte/package-lock.json | 3558 ++++++++++++++++++ kando-svelte/package.json | 59 + kando-svelte/src/app.d.ts | 13 + kando-svelte/src/app.html | 12 + kando-svelte/src/lib/index.ts | 1 + kando-svelte/src/routes/+page.svelte | 3 + kando-svelte/static/favicon.svg | 1 + kando-svelte/svelte.config.js | 18 + kando-svelte/tsconfig.json | 15 + kando-svelte/vite.config.ts | 6 + notes/{notes.txt => don-notes.txt} | 0 notes/{svelte.md => kando-svelte.md} | 129 +- 36 files changed, 7566 insertions(+), 28 deletions(-) create mode 100644 kando-svelte-demo/.gitignore create mode 100644 kando-svelte-demo/.npmrc create mode 100644 kando-svelte-demo/.prettierignore create mode 100644 kando-svelte-demo/.prettierrc create mode 100644 kando-svelte-demo/README.md create mode 100644 kando-svelte-demo/eslint.config.js create mode 100644 kando-svelte-demo/package-lock.json create mode 100644 kando-svelte-demo/package.json create mode 100644 kando-svelte-demo/src/app.d.ts create mode 100644 kando-svelte-demo/src/app.html create mode 100644 kando-svelte-demo/src/lib/assets/favicon.svg create mode 100644 kando-svelte-demo/src/lib/index.ts create mode 100644 kando-svelte-demo/src/routes/+layout.svelte create mode 100644 kando-svelte-demo/src/routes/+page.svelte create mode 100644 kando-svelte-demo/static/robots.txt create mode 100644 kando-svelte-demo/svelte.config.js create mode 100644 kando-svelte-demo/tsconfig.json create mode 100644 kando-svelte-demo/vite.config.ts create mode 100644 kando-svelte/.gitignore create mode 100644 kando-svelte/.npmrc create mode 100644 kando-svelte/.prettierignore create mode 100644 kando-svelte/.prettierrc create mode 100644 kando-svelte/README.md create mode 100644 kando-svelte/eslint.config.js create mode 100644 kando-svelte/package-lock.json create mode 100644 kando-svelte/package.json create mode 100644 kando-svelte/src/app.d.ts create mode 100644 kando-svelte/src/app.html create mode 100644 kando-svelte/src/lib/index.ts create mode 100644 kando-svelte/src/routes/+page.svelte create mode 100644 kando-svelte/static/favicon.svg create mode 100644 kando-svelte/svelte.config.js create mode 100644 kando-svelte/tsconfig.json create mode 100644 kando-svelte/vite.config.ts rename notes/{notes.txt => don-notes.txt} (100%) rename notes/{svelte.md => kando-svelte.md} (77%) diff --git a/kando-svelte-demo/.gitignore b/kando-svelte-demo/.gitignore new file mode 100644 index 000000000..3b462cb0c --- /dev/null +++ b/kando-svelte-demo/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/kando-svelte-demo/.npmrc b/kando-svelte-demo/.npmrc new file mode 100644 index 000000000..b6f27f135 --- /dev/null +++ b/kando-svelte-demo/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/kando-svelte-demo/.prettierignore b/kando-svelte-demo/.prettierignore new file mode 100644 index 000000000..7d74fe246 --- /dev/null +++ b/kando-svelte-demo/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/kando-svelte-demo/.prettierrc b/kando-svelte-demo/.prettierrc new file mode 100644 index 000000000..3f7802c37 --- /dev/null +++ b/kando-svelte-demo/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/kando-svelte-demo/README.md b/kando-svelte-demo/README.md new file mode 100644 index 000000000..75842c404 --- /dev/null +++ b/kando-svelte-demo/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/kando-svelte-demo/eslint.config.js b/kando-svelte-demo/eslint.config.js new file mode 100644 index 000000000..e02473646 --- /dev/null +++ b/kando-svelte-demo/eslint.config.js @@ -0,0 +1,4 @@ +import prettier from 'eslint-config-prettier'; +import svelte from 'eslint-plugin-svelte'; + +export default [prettier, ...svelte.configs.prettier]; diff --git a/kando-svelte-demo/package-lock.json b/kando-svelte-demo/package-lock.json new file mode 100644 index 000000000..297fdc450 --- /dev/null +++ b/kando-svelte-demo/package-lock.json @@ -0,0 +1,3459 @@ +{ + "name": "kando-svelte-demo", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "kando-svelte-demo", + "version": "0.0.1", + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", + "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz", + "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-6.1.1.tgz", + "integrity": "sha512-cBNt4jgH4KuaNO5gRSB2CZKkGtz+OCZ8lPjRQGjhvVUD4akotnj2weUia6imLl2v07K3IgsQRyM36909miSwoQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.43.8", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.43.8.tgz", + "integrity": "sha512-z21dG8W4g6XtAnK8bMpaSahtPOV6JVhghhco1+GR4H39XEgIxrjIpRoT1Js84c7TmhBzbTkVpZVVPFNNPFsXkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.3.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.17", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", + "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", + "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.4.tgz", + "integrity": "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.6.1", + "@jridgewell/sourcemap-codec": "^1.5.0", + "esutils": "^2.0.3", + "globals": "^16.0.0", + "known-css-properties": "^0.37.0", + "postcss": "^8.4.49", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^7.0.0", + "semver": "^7.6.3", + "svelte-eslint-parser": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^8.57.1 || ^9.0.0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", + "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.0.tgz", + "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "5.39.8", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.39.8.tgz", + "integrity": "sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^2.1.0", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.2.tgz", + "integrity": "sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.3.tgz", + "integrity": "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.0", + "postcss": "^8.4.49", + "postcss-scss": "^4.0.9", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", + "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.45.0", + "@typescript-eslint/parser": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/kando-svelte-demo/package.json b/kando-svelte-demo/package.json new file mode 100644 index 000000000..6037295a2 --- /dev/null +++ b/kando-svelte-demo/package.json @@ -0,0 +1,35 @@ +{ + "name": "kando-svelte-demo", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint ." + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + } +} diff --git a/kando-svelte-demo/src/app.d.ts b/kando-svelte-demo/src/app.d.ts new file mode 100644 index 000000000..da08e6da5 --- /dev/null +++ b/kando-svelte-demo/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/kando-svelte-demo/src/app.html b/kando-svelte-demo/src/app.html new file mode 100644 index 000000000..f273cc58f --- /dev/null +++ b/kando-svelte-demo/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/kando-svelte-demo/src/lib/assets/favicon.svg b/kando-svelte-demo/src/lib/assets/favicon.svg new file mode 100644 index 000000000..cc5dc66a3 --- /dev/null +++ b/kando-svelte-demo/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/kando-svelte-demo/src/lib/index.ts b/kando-svelte-demo/src/lib/index.ts new file mode 100644 index 000000000..856f2b6c3 --- /dev/null +++ b/kando-svelte-demo/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/kando-svelte-demo/src/routes/+layout.svelte b/kando-svelte-demo/src/routes/+layout.svelte new file mode 100644 index 000000000..20f8d044f --- /dev/null +++ b/kando-svelte-demo/src/routes/+layout.svelte @@ -0,0 +1,11 @@ + + + + + + +{@render children?.()} diff --git a/kando-svelte-demo/src/routes/+page.svelte b/kando-svelte-demo/src/routes/+page.svelte new file mode 100644 index 000000000..cc88df0ea --- /dev/null +++ b/kando-svelte-demo/src/routes/+page.svelte @@ -0,0 +1,2 @@ +

Welcome to SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/kando-svelte-demo/static/robots.txt b/kando-svelte-demo/static/robots.txt new file mode 100644 index 000000000..b6dd6670c --- /dev/null +++ b/kando-svelte-demo/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/kando-svelte-demo/svelte.config.js b/kando-svelte-demo/svelte.config.js new file mode 100644 index 000000000..a0133e6e9 --- /dev/null +++ b/kando-svelte-demo/svelte.config.js @@ -0,0 +1,17 @@ +import adapter from '@sveltejs/adapter-auto'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } +}; + +export default config; diff --git a/kando-svelte-demo/tsconfig.json b/kando-svelte-demo/tsconfig.json new file mode 100644 index 000000000..a5567ee6b --- /dev/null +++ b/kando-svelte-demo/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/kando-svelte-demo/vite.config.ts b/kando-svelte-demo/vite.config.ts new file mode 100644 index 000000000..bbf8c7da4 --- /dev/null +++ b/kando-svelte-demo/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); diff --git a/kando-svelte/.gitignore b/kando-svelte/.gitignore new file mode 100644 index 000000000..294b38578 --- /dev/null +++ b/kando-svelte/.gitignore @@ -0,0 +1,24 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build +/dist + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/kando-svelte/.npmrc b/kando-svelte/.npmrc new file mode 100644 index 000000000..b6f27f135 --- /dev/null +++ b/kando-svelte/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/kando-svelte/.prettierignore b/kando-svelte/.prettierignore new file mode 100644 index 000000000..7d74fe246 --- /dev/null +++ b/kando-svelte/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/kando-svelte/.prettierrc b/kando-svelte/.prettierrc new file mode 100644 index 000000000..3f7802c37 --- /dev/null +++ b/kando-svelte/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/kando-svelte/README.md b/kando-svelte/README.md new file mode 100644 index 000000000..196ce870a --- /dev/null +++ b/kando-svelte/README.md @@ -0,0 +1,58 @@ +# Svelte library + +Everything you need to build a Svelte library, powered by [`sv`](https://npmjs.com/package/sv). + +Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app. + +## Building + +To build your library: + +```sh +npm pack +``` + +To create a production version of your showcase app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. + +## Publishing + +Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)). + +To publish your library to [npm](https://www.npmjs.com): + +```sh +npm publish +``` diff --git a/kando-svelte/eslint.config.js b/kando-svelte/eslint.config.js new file mode 100644 index 000000000..e02473646 --- /dev/null +++ b/kando-svelte/eslint.config.js @@ -0,0 +1,4 @@ +import prettier from 'eslint-config-prettier'; +import svelte from 'eslint-plugin-svelte'; + +export default [prettier, ...svelte.configs.prettier]; diff --git a/kando-svelte/package-lock.json b/kando-svelte/package-lock.json new file mode 100644 index 000000000..b613498da --- /dev/null +++ b/kando-svelte/package-lock.json @@ -0,0 +1,3558 @@ +{ + "name": "kando-svelte", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "kando-svelte", + "version": "0.0.1", + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/package": "^2.5.4", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "publint": "^0.3.13", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + }, + "peerDependencies": { + "svelte": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", + "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@publint/pack": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.2.tgz", + "integrity": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz", + "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-6.1.1.tgz", + "integrity": "sha512-cBNt4jgH4KuaNO5gRSB2CZKkGtz+OCZ8lPjRQGjhvVUD4akotnj2weUia6imLl2v07K3IgsQRyM36909miSwoQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.43.8", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.43.8.tgz", + "integrity": "sha512-z21dG8W4g6XtAnK8bMpaSahtPOV6JVhghhco1+GR4H39XEgIxrjIpRoT1Js84c7TmhBzbTkVpZVVPFNNPFsXkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.3.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@sveltejs/package": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.5.4.tgz", + "integrity": "sha512-8+1hccAt0M3PPkHVPKH54Wc+cc1PNxRqCrICZiv/hEEto8KwbQVRghxNgTB4htIPyle+4CIB8RayTQH5zRQh9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "kleur": "^4.1.5", + "sade": "^1.8.1", + "semver": "^7.5.4", + "svelte2tsx": "~0.7.33" + }, + "bin": { + "svelte-package": "svelte-package.js" + }, + "engines": { + "node": "^16.14 || >=18" + }, + "peerDependencies": { + "svelte": "^3.44.0 || ^4.0.0 || ^5.0.0-next.1" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.17", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", + "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", + "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.4.tgz", + "integrity": "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.6.1", + "@jridgewell/sourcemap-codec": "^1.5.0", + "esutils": "^2.0.3", + "globals": "^16.0.0", + "known-css-properties": "^0.37.0", + "postcss": "^8.4.49", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^7.0.0", + "semver": "^7.6.3", + "svelte-eslint-parser": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^8.57.1 || ^9.0.0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", + "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.0.tgz", + "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/publint": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.13.tgz", + "integrity": "sha512-NC+lph09+BRO9LJgKlIy3WQXyu6/6WDQ0dCA60KALUwdKVf3PfGuC6fY8I+oKB/5kEPh50aOSUz+6yWy1n4EfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@publint/pack": "^0.1.2", + "package-manager-detector": "^1.3.0", + "picocolors": "^1.1.1", + "sade": "^1.8.1" + }, + "bin": { + "publint": "src/cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "5.39.8", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.39.8.tgz", + "integrity": "sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^2.1.0", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.2.tgz", + "integrity": "sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.3.tgz", + "integrity": "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.0", + "postcss": "^8.4.49", + "postcss-scss": "^4.0.9", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte2tsx": { + "version": "0.7.44", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.44.tgz", + "integrity": "sha512-opuH+bCboss0/ncxnfAO+qt0IAprxc8OqwuC7otafWeO5CHjJ6UAAwvQmu/+xjpCSarX8pQKydXQuoJmbCDcTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dedent-js": "^1.0.1", + "scule": "^1.3.0" + }, + "peerDependencies": { + "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", + "typescript": "^4.9.4 || ^5.0.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", + "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.45.0", + "@typescript-eslint/parser": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/kando-svelte/package.json b/kando-svelte/package.json new file mode 100644 index 000000000..c814dc3ac --- /dev/null +++ b/kando-svelte/package.json @@ -0,0 +1,59 @@ +{ + "name": "kando-svelte", + "version": "0.0.1", + "scripts": { + "dev": "vite dev", + "build": "vite build && npm run prepack", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "prepack": "svelte-kit sync && svelte-package && publint", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint ." + }, + "files": [ + "dist", + "!dist/**/*.test.*", + "!dist/**/*.spec.*" + ], + "sideEffects": [ + "**/*.css" + ], + "svelte": "./dist/index.js", + "types": "./dist/index.d.ts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js" + } + }, + "peerDependencies": { + "svelte": "^5.0.0" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/package": "^2.5.4", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "publint": "^0.3.13", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + }, + "keywords": [ + "svelte" + ] +} diff --git a/kando-svelte/src/app.d.ts b/kando-svelte/src/app.d.ts new file mode 100644 index 000000000..da08e6da5 --- /dev/null +++ b/kando-svelte/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/kando-svelte/src/app.html b/kando-svelte/src/app.html new file mode 100644 index 000000000..ed39a5af8 --- /dev/null +++ b/kando-svelte/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/kando-svelte/src/lib/index.ts b/kando-svelte/src/lib/index.ts new file mode 100644 index 000000000..47d3c46fb --- /dev/null +++ b/kando-svelte/src/lib/index.ts @@ -0,0 +1 @@ +// Reexport your entry components here diff --git a/kando-svelte/src/routes/+page.svelte b/kando-svelte/src/routes/+page.svelte new file mode 100644 index 000000000..9c42926fc --- /dev/null +++ b/kando-svelte/src/routes/+page.svelte @@ -0,0 +1,3 @@ +

Welcome to your library project

+

Create your package using @sveltejs/package and preview/showcase your work with SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/kando-svelte/static/favicon.svg b/kando-svelte/static/favicon.svg new file mode 100644 index 000000000..cc5dc66a3 --- /dev/null +++ b/kando-svelte/static/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/kando-svelte/svelte.config.js b/kando-svelte/svelte.config.js new file mode 100644 index 000000000..1295460d1 --- /dev/null +++ b/kando-svelte/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-auto'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } +}; + +export default config; diff --git a/kando-svelte/tsconfig.json b/kando-svelte/tsconfig.json new file mode 100644 index 000000000..6f788f160 --- /dev/null +++ b/kando-svelte/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "module": "NodeNext", + "moduleResolution": "NodeNext" + } +} diff --git a/kando-svelte/vite.config.ts b/kando-svelte/vite.config.ts new file mode 100644 index 000000000..bbf8c7da4 --- /dev/null +++ b/kando-svelte/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +}); diff --git a/notes/notes.txt b/notes/don-notes.txt similarity index 100% rename from notes/notes.txt rename to notes/don-notes.txt diff --git a/notes/svelte.md b/notes/kando-svelte.md similarity index 77% rename from notes/svelte.md rename to notes/kando-svelte.md index b617742e6..6ea9ebbe2 100644 --- a/notes/svelte.md +++ b/notes/kando-svelte.md @@ -1,4 +1,4 @@ -## Svelte 5 pie menu implementation aligned with Kando (code-compatible) +## Svelte 5 pie menu implementation aligned with Kando (data, theme, and code compatible) Goal: Build a Svelte 5/SvelteKit implementation of Kando’s pie menu that reuses (and where practical, copies verbatim) Kando’s code, APIs, schemas, algorithms, and contracts, while preserving attribution and licenses. Keep naming and structure aligned so both projects stay in sync; use Svelte 5 only as the packaging/rendering layer. No editor in Svelte initially—design menus/themes in Kando and import them into Svelte apps (e.g., Micropolis) seamlessly. Eventually add a SvelteKit editor. @@ -270,33 +270,45 @@ Adopt Kando’s schemas for plug‑and‑play, but only enforce the subset that --- -## Porting Kando math to TS (sketch) - -Implement the following in `@kando-svelte/core/math` mirroring Kando’s behavior: - -```ts -export function toDegrees(rad: number): number; export function toRadians(deg: number): number; -export function getLength(v: Vec2): number; export function add(a: Vec2, b: Vec2): Vec2; -export function subtract(a: Vec2, b: Vec2): Vec2; export function getAngle(v: Vec2): number; // 0° top -export function getDirection(angle: number, len: number): Vec2; // 0° top -export function getAngularDifference(a: number, b: number): number; // [0,180] -export function getClosestEquivalentAngle(angle: number, to?: number): number; -export function getEquivalentAngleSmallerThan(angle: number, than?: number): number; -export function getEquivalentAngleLargerThan(angle: number, than?: number): number; -export function normalizeConsequtiveAngles(a: number, b: number, c: number): [number, number, number]; -export function isAngleBetween(angle: number, start: number, end: number): boolean; -export function clampToMonitor(center: Vec2, radius: number, size: Vec2): Vec2; - -export function fixFixedAngles(items: { angle?: number }[]): void; -export function computeItemAngles(items: { angle?: number }[], parentAngle?: number): number[]; -export function computeItemWedges(itemAngles: number[], parentAngle?: number): { - itemWedges: { start: number; end: number }[]; - parentWedge?: { start: number; end: number }; -}; -``` - -These must be behaviorally identical to Kando’s to preserve layout, hover, and connector visuals across themes. - +## Code re‑use inventory (what to import vs rewrite) + +Maximize reuse by importing Kando source where it’s renderer/platform‑agnostic; rewrite only DOM/Svelte bits. + +- Directly reusable (portable TS) + - `src/common/math/index.ts`: vectors, angles, wedges, clamping. + - `src/common/index.ts` (renderer‑safe types): `Vec2`, `ShowMenuOptions`, `MenuThemeDescription`, `SoundType`, `SoundThemeDescription`, `KeyStroke/KeySequence`. + - `src/common/settings-schemata/*.ts`: zod schemas for menus and general settings. + - `src/menu-renderer/input-methods/input-method.ts`: base input contracts (callbacks only). + - `src/menu-renderer/input-methods/gesture-detector.ts`: geometry + timers; replace Node `EventEmitter` with a tiny dispatcher. + - `src/menu-renderer/input-methods/gamepad.ts`: Web Gamepad API; same emitter note. + - `src/menu-renderer/sound-theme.ts`: Howler wrapper (guard in client‑only lifecycle). + +- Reuse with small shims + - `src/menu-renderer/menu-theme.ts`: + - Keep: CSS property registration, `loadDescription`, `setColors`, child/center angle property setters. + - Adapt: layer DOM creation (`createItem`) to Svelte components/refs; set CSS vars via bindings, not `querySelector`. + - `src/menu-renderer/selection-wedges.ts`, `wedge-separators.ts`: re‑express as Svelte components emitting the same DOM/CSS variables. + +- Rewrite in Svelte + - `src/menu-renderer/menu.ts`: imperative DOM, transforms, classes, connectors. Rebuild as component state + derived props: + - Keep algorithms (selection chain, connectors smoothing) but compute in `$derived` and bind to style/class. + - Icon registry (`src/common/icon-themes/*`): implement a web resolver (Material Symbols, Simple Icons, user URLs/data URIs). System/file themes via backends are not available in browser. + - IPC (`menu-window-api.ts`, `common-window-api.ts`): replace with Svelte events/props. + +- Not applicable (skip) + - `src/main/**` (Electron host, backends, actions, tray, notifications, settings window). + +- Portability highlights + - Gesture recognizer: portable with an emitter shim; thresholds map 1:1 from settings. + - Layout algorithms: fully portable (in `common/math`). + - Connectors: reuse `getClosestEquivalentAngle` and accumulate last angles; bind width/rotation via style. + - Theme engine: reuse angle/child property logic and color application; wire to Svelte refs. + - Sounds: Howler works in browser/Electron; init only on client. + +- Optional refactor upstream (improves reuse) + - Extract a `kando-core` workspace package exporting: `common/math`, renderer‑safe `common` types, zod schemas, theme helpers (angle smoothing). + - Split `menu-theme.ts` into DOM‑free helpers and DOM‑bound layer builders. + - Replace `EventEmitter` in renderer utilities with a minimal event interface usable in browsers. --- ## Input model (pointer first) @@ -406,3 +418,64 @@ Theme loader should parse JSON5, set `id` from parent dir, and `directory` to th ## License and provenance This project intentionally reuses—and where practical, copies—Kando’s source code, APIs, schemas, algorithms, and contracts to maximize compatibility and ease of synchronization. Preserve original copyright headers and SPDX identifiers, retain license notices, and attribute the Kando project and its author. Kando is licensed under MIT; theme assets and fonts carry their own licenses (e.g., CC0-1.0 for the default theme, Material Symbols, Simple Icons). Ensure all copied files keep their original licenses and attributions. + +--- +### Addendum: direct import strategy (preferred) + +Where possible, import Kando source directly instead of reimplementing: + +- Import as‑is + - `@kando/common/math/*` → `../src/common/math/*` + - `@kando/common/*` (renderer‑safe types only) → `../src/common/*` + - `@kando/schemata/*` → `../src/common/settings-schemata/*` + - `@kando/gesture` → `../src/menu-renderer/input-methods/gesture-detector` + - `@kando/gamepad` → `../src/menu-renderer/input-methods/gamepad` + - `@kando/sound-theme` → `../src/menu-renderer/sound-theme` + +- Minimal shims + - `events` (Node EventEmitter) used by gesture/gamepad: alias to a tiny emitter or bundle a small emitter polyfill so imports work unchanged. + - `menu-theme.ts`: import and use `loadDescription`, `setColors`, `setChildProperties`, `setCenterProperties`; avoid `createItem` (Svelte builds layers in markup). + +- Path aliases (dev in monorepo) + - kando-svelte/tsconfig.json: + ```json + { + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@kando/common/*": ["../src/common/*"], + "@kando/schemata/*": ["../src/common/settings-schemata/*"], + "@kando/gesture": ["../src/menu-renderer/input-methods/gesture-detector.ts"], + "@kando/gamepad": ["../src/menu-renderer/input-methods/gamepad.ts"], + "@kando/sound-theme": ["../src/menu-renderer/sound-theme.ts"] + } + } + } + ``` + - kando-svelte/vite.config.ts: + ```ts + import { defineConfig } from 'vite'; + import { fileURLToPath } from 'node:url'; + + const r = (p: string) => fileURLToPath(new URL(p, import.meta.url)); + + export default defineConfig({ + resolve: { + alias: { + '@kando/common': r('../src/common'), + '@kando/schemata': r('../src/common/settings-schemata'), + '@kando/gesture': r('../src/menu-renderer/input-methods/gesture-detector.ts'), + '@kando/gamepad': r('../src/menu-renderer/input-methods/gamepad.ts'), + '@kando/sound-theme': r('../src/menu-renderer/sound-theme.ts'), + // optional: alias 'events' to a tiny emitter polyfill if needed + } + } + }); + ``` + +- Publishing strategy + - For npm publishing, either extract a shared `kando-core` workspace package that re‑exports these files and depend on it, or bundle the imported sources into the kando‑svelte build so consumers don’t need the monorepo. + +- Math: import directly (preferred) + - Use `import * as math from '@kando/common/math';` rather than reimplementing. The earlier “Porting Kando math” sketch is only a fallback if decoupling is required. +--- From 307fb753bb207d23d7c13214f008c599984617ba Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Sat, 4 Oct 2025 17:49:17 +0200 Subject: [PATCH 03/20] kando-svelte implementation plan --- notes/kando-svelte.md | 165 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/notes/kando-svelte.md b/notes/kando-svelte.md index 6ea9ebbe2..6273622d6 100644 --- a/notes/kando-svelte.md +++ b/notes/kando-svelte.md @@ -479,3 +479,168 @@ Where possible, import Kando source directly instead of reimplementing: - Math: import directly (preferred) - Use `import * as math from '@kando/common/math';` rather than reimplementing. The earlier “Porting Kando math” sketch is only a fallback if decoupling is required. --- + +--- +## Configuration parity with Kando (config.json, menus.json) + +Kando stores settings in two JSON files: `config.json` (general) and `menus.json` (menus/collections). The Svelte integration should accept the same shapes and semantics, with web‑appropriate loading and validation. + +- Where to load from + - Web/SvelteKit: serve these files from `static/` (public) or fetch from your own backend. Keep the exact file names so exports from Kando can be dropped in. + - Electron (optional): you can also point at the OS config directory, but for Micropolis/SvelteKit, prefer app‑local assets. + +- Hot reload and validation + - Use the existing zod schemas from Kando (`GENERAL_SETTINGS_SCHEMA_V1`, `MENU_SETTINGS_SCHEMA_V1`) to validate on load. + - On save/HMR, re‑validate; if invalid, log and ignore the change (don’t update state), mirroring Kando’s behavior. + - Optional: show a non‑blocking banner if the last change failed validation. + +- General settings (config.json) + - Import and honor all renderer/input/theming fields (see Settings compatibility above). Defaults match Kando’s docs (e.g., `zoomFactor: 1`, `centerDeadZone: 50`, `dragThreshold: 15`, fade timings, gesture thresholds, etc.). + - Ignored in web (but preserved): Electron window chrome settings, tray icon flavor, OS hotkey handling. + - Dark mode: if `enableDarkModeForMenuThemes` is true, switch theme and color overrides when `window.matchMedia('(prefers-color-scheme: dark)')` changes. + +- Menus (menus.json) + - Accept the full structure: `{ version, menus: Menu[], collections: MenuCollection[] }`. + - Per‑menu properties: `root`, `shortcut`, `shortcutID`, `centered`, `anchored`, `hoverMode`, `conditions`, `tags`. + - `shortcut/shortcutID`: store for round‑trip, usually ignore in the web demo. + - `conditions`: allow app‑provided predicates (Micropolis can map in‑game state to “appName/windowName/screenArea” analogs). Otherwise ignore. + - Collections: accept and surface as tags/filters in the demo UI if desired. + +- Menu items (types and data) + - Supported types map as follows in Svelte: + - `submenu`: structure only. + - `uri`: open via `window.open` (respect `rel=noopener` and user gesture policies). + - `text`: copy/paste or in‑app paste actions (browser clipboard API). + - `redirect`: navigate to a different menu path. + - `command`/`file`/`hotkey`/`macro`/`settings`: require host integration (Electron/Kando backends) or Micropolis‑specific adapters. In the Svelte demo, stub with no‑ops or console messages; document how Micropolis implements these. + - `angle` field follows Kando’s monotonic fixed‑angle rules; reuse `fixFixedAngles` and `computeItemAngles`. + - `delayed` semantics (execute after fade‑out) remain; in the browser demo, simulate by deferring handlers until the close animation ends. + +--- +## Themes, sounds, and icons (concrete handling) + +- Menu themes + - Directory layout: `/{ theme.json[5], theme.css, preview.jpg? }`. + - Load `theme.json` (JSON/JSON5), set `id` from folder name and `directory` to parent path; inject `theme.css` via ``. + - Color overrides: apply `menuThemeColors[theme.id]` from `config.json` as CSS custom properties; support dark‑mode variant when enabled. + - Theme selection UI in demo: list subfolders in `static/menu-themes/` (or from an index file) and allow switching at runtime. + +- Sound themes (Howler) + - Directory layout: `/theme.json[5] + audio files`. + - Use Howler to play `SoundType` → file mappings; support per‑sound `volume`, `minPitch`, `maxPitch`, and global `soundVolume`. + - Safari/iOS unlock: call a muted play() on first user gesture to resume the audio context. + - Optional preloading: warm up key sounds on app load. + +- Icon themes + - Built‑ins: Material Symbols Rounded, Simple Icons (plain/colored), Emoji, Base64/URL. Load needed CSS/fonts in `app.html`. + - System/file icon themes require platform backends; in web demo, provide a “user theme” bucket (URLs or project assets). Keep the same `iconTheme` names for drop‑in compatibility. + - Adaptive colors: use `currentColor` in SVGs to let theme CSS recolor icons, as per Kando docs. + +--- +## Practical defaults for the demo + +- Place Kando exports in: + - `static/menus/` (menus.json or multiple named menus) + - `static/menu-themes//` (theme.json5 + theme.css) + - `static/sound-themes//` (theme.json5 + wav/ogg) +- Demo page shows: + - Active theme selector (reads folders and switches ``) + - Active menu selector (reads menus list) + - Sound theme toggle + volume slider + - Live JSON validator result (valid/invalid) +- Execution adapters: + - Implement `uri`, `text`, `redirect` in browser. + - Expose an interface for Micropolis to provide adapters for `command`, `file`, `hotkey`, `macro`, `settings`. + +--- +## Recommendations extracted from Kando docs (TL;DR) + +- Keep zod validation in the load path and block state updates on invalid JSON. +- Mirror defaults exactly; users expect the same feel (dead zone 50px, thresholds, fades). +- Treat dark‑mode as a theme switch, not a stylesheet filter; support separate color overrides. +- Preload sounds and use small pitch randomization for UI polish (as in Kando). +- Prefer SVG icons with `currentColor` for theme‑driven recoloring; fall back to PNG for external packs. +- For conditions and OS integrations, make them host‑provided so the same menus can run in Micropolis or Electron without Svelte changes. +--- + +## Implementation plan: kando-svelte library and static kando-svelte-demo + +1) Monorepo and workspaces +- Root package.json: add workspaces for "kando-svelte" and "kando-svelte-demo". +- Use npm workspaces; keep library and demo independent (lib has no adapter, demo uses adapter-auto). + +2) kando-svelte (library) +- Goal: publishable Svelte lib exposing PieMenu and helpers, reusing Kando code directly. +- Imports (direct): add TS/Vite aliases to reference Kando’s sources: + - @kando/common/* -> ../src/common/* (types + math) + - @kando/schemata/* -> ../src/common/settings-schemata/* (zod) + - @kando/gesture -> ../src/menu-renderer/input-methods/gesture-detector.ts + - @kando/gamepad -> ../src/menu-renderer/input-methods/gamepad.ts + - @kando/sound-theme -> ../src/menu-renderer/sound-theme.ts +- Minimal emitter shim: if needed, alias Node EventEmitter to a tiny emitter so gesture/gamepad can import unchanged. +- Components: + - src/lib/PieMenu.svelte: orchestrates theme inject, selection chain, input, events; emits select/cancel/hover. + - src/lib/PieItem.svelte: renders a single node; binds CSS vars (--dir-x/--dir-y/--angle/--sibling-count/--parent-angle). + - src/lib/SelectionWedges.svelte & src/lib/WedgeSeparators.svelte: global visuals driven by CSS vars. +- Theme engine: + - Reuse menu-theme.ts functions: loadDescription, setColors, setChildProperties, setCenterProperties; set vars via bind:this refs. + - Inject theme.css and apply color overrides. +- Math & geometry: + - Use @kando/common/math directly: computeItemAngles, computeItemWedges, clampToMonitor, etc. +- Sounds: + - Wrap Howler usage from @kando/sound-theme; guard in onMount. +- Types & settings: + - Export renderer-safe types mirroring Kando (Vec2, MenuItem, MenuThemeDescription, ShowMenuOptions). + - Accept settings subset via props; provide defaults matching Kando. +- Packaging: + - Configure svelte-package output (dist), proper exports map; exclude dev-only aliases from published build or bundle imported TS. + +3) kando-svelte-demo (SvelteKit app) +- Static snapshot layout under static/: + - static/kando-snapshot/ + - config.json (Kando general settings) + - menus.json (Kando menus/collections) + - menu-themes//{ theme.json5, theme.css, preview.jpg? } + - sound-themes//{ theme.json5, *.wav/ogg } +- Loaders/utilities: + - Fetch and validate config.json / menus.json using zod schemas (@kando/schemata/*). + - Discover themes (list subfolders) and inject selected theme.css; apply color overrides + dark-mode variants. + - Load sound theme (Howler) and set master volume. +- Demo UI: + - Theme selector (dropdown), sound theme + volume, menu selector (from menus.json), validity indicator. + - Render +- Execution adapters: + - Implement browser-safe handlers for uri/text/redirect. + - Surface optional hooks for Micropolis to provide command/file/hotkey/macro/settings behaviors. +- SPA behavior: + - SSR guards for DOM/Howler; prerender true is fine if data is static. + +4) Direct-import configuration +- kando-svelte/tsconfig.json: add paths for @kando/common, @kando/schemata, @kando/gesture, @kando/gamepad, @kando/sound-theme. +- kando-svelte/vite.config.ts: add matching resolve.alias; optionally alias 'events' to a tiny emitter. +- For publishing: either bundle imported Kando sources into the lib build or extract a shared workspace package (kando-core) exporting common/math/schemata. + +5) Selection & input details (parity) +- Build selection chain; compute child angles/wedges; clamp center; accumulate last connector angles (closest-equivalent) to avoid 360° flips. +- Pointer/touch: hover hit-testing vs wedges; Dragged threshold; Hover/Marking/Turbo modes and gesture detector thresholds. +- Keyboard shortcuts (optional): numeric/alpha to select children; Backspace selects parent; Escape cancels. +- Gamepad: stick → relative position; back/close buttons; center anchored placement. + +6) Validation & hot reload in demo +- On each snapshot file change (dev), refetch and validate; if valid, update state; if invalid, show error and keep prior state. +- Include a compact error viewer to mirror Kando’s console output. + +7) Testing +- Reuse Kando’s math tests (test/math.spec.ts) to verify ported/aliased math; adapt harness to Vitest in the demo if desired. +- Add a few component tests (rendering classes/vars) later. + +8) Build & run +- Lib: npm run -w kando-svelte package (svelte-package) +- Demo: npm run -w kando-svelte-demo dev -- --open +- Workspaces: root npm install to link workspace deps; demo depends on "kando-svelte": "workspace:*". + +9) Future steps +- Icon resolver for user-provided icon packs; optional system icon bridge in Electron. +- Theme editor preview (read-only) and ultimately a Svelte menu editor. +- Micropolis adapter package implementing command/file/hotkey/macro. +--- From a128187f15b4ff2485d716debf08e3cbb6fb32b6 Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Sat, 4 Oct 2025 19:08:27 +0200 Subject: [PATCH 04/20] flesh out skeleton a bit --- kando-svelte-demo/README.md | 67 +- kando-svelte-demo/package-lock.json | 6948 +++++++++-------- kando-svelte-demo/package.json | 70 +- kando-svelte-demo/src/lib/MenuOutline.svelte | 15 + kando-svelte-demo/src/routes/+page.svelte | 104 +- .../menu-themes/default/REUSE.toml | 10 + .../menu-themes/default/preview.jpg | Bin 0 -> 80764 bytes .../menu-themes/default/theme.css | 196 + .../menu-themes/default/theme.json5 | 47 + .../kando-vendor/sound-themes/none/theme.json | 10 + kando-svelte-demo/static/kando/config.json | 36 + kando-svelte-demo/static/kando/icon-themes | 1 + kando-svelte-demo/static/kando/menu-themes | 1 + kando-svelte-demo/static/kando/menus.json | 337 + kando-svelte-demo/static/kando/sound-themes | 1 + kando-svelte/README.md | 112 +- kando-svelte/package-lock.json | 62 +- kando-svelte/package.json | 5 +- kando-svelte/src/lib/PieItem.svelte | 15 + kando-svelte/src/lib/PieMenu.svelte | 53 + kando-svelte/src/lib/SelectionWedges.svelte | 9 + kando-svelte/src/lib/index.ts | 12 +- kando-svelte/src/lib/theme-loader.ts | 31 + kando-svelte/src/lib/types.ts | 2 + kando-svelte/src/lib/validation.ts | 19 + kando-svelte/src/lib/vendor/default-theme.css | 196 + .../src/lib/vendor/default-theme.json5 | 47 + .../src/lib/vendor/sounds/none/theme.json | 10 + kando-svelte/svelte.config.js | 9 +- kando-svelte/vite.config.ts | 14 +- package.json | 3 +- src/common/index.d.ts | 331 + .../general-settings-v1.d.ts | 7 + src/common/settings-schemata/index.d.ts | 4 + .../settings-schemata/menu-settings-v1.d.ts | 29 + 35 files changed, 5214 insertions(+), 3599 deletions(-) create mode 100644 kando-svelte-demo/src/lib/MenuOutline.svelte create mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml create mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/preview.jpg create mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.css create mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 create mode 100644 kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json create mode 100644 kando-svelte-demo/static/kando/config.json create mode 120000 kando-svelte-demo/static/kando/icon-themes create mode 120000 kando-svelte-demo/static/kando/menu-themes create mode 100644 kando-svelte-demo/static/kando/menus.json create mode 120000 kando-svelte-demo/static/kando/sound-themes create mode 100644 kando-svelte/src/lib/PieItem.svelte create mode 100644 kando-svelte/src/lib/PieMenu.svelte create mode 100644 kando-svelte/src/lib/SelectionWedges.svelte create mode 100644 kando-svelte/src/lib/theme-loader.ts create mode 100644 kando-svelte/src/lib/types.ts create mode 100644 kando-svelte/src/lib/validation.ts create mode 100644 kando-svelte/src/lib/vendor/default-theme.css create mode 100644 kando-svelte/src/lib/vendor/default-theme.json5 create mode 100644 kando-svelte/src/lib/vendor/sounds/none/theme.json create mode 100644 src/common/index.d.ts create mode 100644 src/common/settings-schemata/general-settings-v1.d.ts create mode 100644 src/common/settings-schemata/index.d.ts create mode 100644 src/common/settings-schemata/menu-settings-v1.d.ts diff --git a/kando-svelte-demo/README.md b/kando-svelte-demo/README.md index 75842c404..5d86b0571 100644 --- a/kando-svelte-demo/README.md +++ b/kando-svelte-demo/README.md @@ -1,38 +1,55 @@ -# sv +# kando-svelte-demo (SvelteKit app) -Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). +Single-page demo that loads a static Kando snapshot (config.json, menus.json, themes/sounds) and renders: +- A summary of config and theme metadata +- A recursive outline of all menus and items +- (future) The `PieMenu` component from `kando-svelte` for interactive previews -## Creating a project +What it is +- A minimal SvelteKit app to validate data loading and rendering using the kando-svelte library. +- Uses JSON5 to parse theme.json5 and Kando’s zod schemata (optional) to validate inputs. -If you're seeing this, you've probably already done this step. Congrats! +What it is not +- It does not implement OS-specific item actions (command/file/hotkey/macro/settings). +- It does not ship platform backends. -```sh -# create a new project in the current directory -npx sv create - -# create a new project in my-app -npx sv create my-app +Snapshot layout (under `static/`) +``` +static/ + kando/ + config.json + menus.json + menu-themes/ + sound-themes/ + icon-themes/ + kando-vendor/ + menu-themes/default/{ theme.json5, theme.css } + sound-themes/none/theme.json ``` -## Developing - -Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: - -```sh -npm run dev - -# or start the server and open the app in a new browser tab +Install & run +```bash +cd kando-svelte-demo +npm install npm run dev -- --open +# or build/preview +npm run build +npm run preview ``` -## Building - -To create a production version of your app: - -```sh +Using the library +- The demo depends on the local library via `file:../kando-svelte`. +- Build the library first if you change it: +```bash +cd ../kando-svelte npm run build ``` -You can preview the production build with `npm run preview`. +Icon CSS +- If themes expect icon fonts, include them (e.g., in `src/app.html`): + - Material Symbols Rounded CSS (Google Fonts) or `material-symbols` npm package. + - `simple-icons-font` for Simple Icons. -> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. +Notes +- The demo logs key load steps to the console to aid debugging. +- For production, copy assets into `static/` (symlinks may not survive packaging). diff --git a/kando-svelte-demo/package-lock.json b/kando-svelte-demo/package-lock.json index 297fdc450..0b8554f72 100644 --- a/kando-svelte-demo/package-lock.json +++ b/kando-svelte-demo/package-lock.json @@ -1,3459 +1,3493 @@ { - "name": "kando-svelte-demo", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "kando-svelte-demo", - "version": "0.0.1", - "devDependencies": { - "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.36.0", - "@sveltejs/adapter-auto": "^6.1.0", - "@sveltejs/kit": "^2.43.2", - "@sveltejs/vite-plugin-svelte": "^6.2.0", - "@types/node": "^20", - "eslint": "^9.36.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.12.4", - "globals": "^16.4.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.39.5", - "svelte-check": "^4.3.2", - "typescript": "^5.9.2", - "typescript-eslint": "^8.44.1", - "vite": "^7.1.7" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/compat": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", - "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^8.40 || 9" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz", - "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-6.1.1.tgz", - "integrity": "sha512-cBNt4jgH4KuaNO5gRSB2CZKkGtz+OCZ8lPjRQGjhvVUD4akotnj2weUia6imLl2v07K3IgsQRyM36909miSwoQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.43.8", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.43.8.tgz", - "integrity": "sha512-z21dG8W4g6XtAnK8bMpaSahtPOV6JVhghhco1+GR4H39XEgIxrjIpRoT1Js84c7TmhBzbTkVpZVVPFNNPFsXkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/cookie": "^0.6.0", - "acorn": "^8.14.1", - "cookie": "^0.6.0", - "devalue": "^5.3.2", - "esm-env": "^1.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - } - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", - "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", - "debug": "^4.4.1", - "deepmerge": "^4.3.1", - "magic-string": "^0.30.17", - "vitefu": "^1.1.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", - "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", - "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.45.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/devalue": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", - "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", - "@eslint/plugin-kit": "^0.4.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.4.tgz", - "integrity": "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.6.1", - "@jridgewell/sourcemap-codec": "^1.5.0", - "esutils": "^2.0.3", - "globals": "^16.0.0", - "known-css-properties": "^0.37.0", - "postcss": "^8.4.49", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^7.0.0", - "semver": "^7.6.3", - "svelte-eslint-parser": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^8.57.1 || ^9.0.0", - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", - "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.0.tgz", - "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svelte": { - "version": "5.39.8", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.39.8.tgz", - "integrity": "sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "esm-env": "^1.2.1", - "esrap": "^2.1.0", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.2.tgz", - "integrity": "sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.3.tgz", - "integrity": "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.0", - "postcss": "^8.4.49", - "postcss-scss": "^4.0.9", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", - "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.45.0", - "@typescript-eslint/parser": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "dev": true, - "license": "MIT" - } - } + "name": "kando-svelte-demo", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "kando-svelte-demo", + "version": "0.0.1", + "dependencies": { + "json5": "^2.2.3", + "kando-svelte": "file:../kando-svelte" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + } + }, + "../kando-svelte": { + "version": "0.0.1", + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/package": "^2.5.4", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "publint": "^0.3.13", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + }, + "peerDependencies": { + "svelte": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", + "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz", + "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-6.1.1.tgz", + "integrity": "sha512-cBNt4jgH4KuaNO5gRSB2CZKkGtz+OCZ8lPjRQGjhvVUD4akotnj2weUia6imLl2v07K3IgsQRyM36909miSwoQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.43.8", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.43.8.tgz", + "integrity": "sha512-z21dG8W4g6XtAnK8bMpaSahtPOV6JVhghhco1+GR4H39XEgIxrjIpRoT1Js84c7TmhBzbTkVpZVVPFNNPFsXkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.3.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.17", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", + "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", + "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", + "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.4.tgz", + "integrity": "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.6.1", + "@jridgewell/sourcemap-codec": "^1.5.0", + "esutils": "^2.0.3", + "globals": "^16.0.0", + "known-css-properties": "^0.37.0", + "postcss": "^8.4.49", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^7.0.0", + "semver": "^7.6.3", + "svelte-eslint-parser": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^8.57.1 || ^9.0.0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", + "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kando-svelte": { + "resolved": "../kando-svelte", + "link": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.0.tgz", + "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svelte": { + "version": "5.39.8", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.39.8.tgz", + "integrity": "sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^2.1.0", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.2.tgz", + "integrity": "sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.3.tgz", + "integrity": "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.0", + "postcss": "^8.4.49", + "postcss-scss": "^4.0.9", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", + "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.45.0", + "@typescript-eslint/parser": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", + "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } } diff --git a/kando-svelte-demo/package.json b/kando-svelte-demo/package.json index 6037295a2..a8db0103f 100644 --- a/kando-svelte-demo/package.json +++ b/kando-svelte-demo/package.json @@ -1,35 +1,39 @@ { - "name": "kando-svelte-demo", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "format": "prettier --write .", - "lint": "prettier --check . && eslint ." - }, - "devDependencies": { - "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.36.0", - "@sveltejs/adapter-auto": "^6.1.0", - "@sveltejs/kit": "^2.43.2", - "@sveltejs/vite-plugin-svelte": "^6.2.0", - "@types/node": "^20", - "eslint": "^9.36.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.12.4", - "globals": "^16.4.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.39.5", - "svelte-check": "^4.3.2", - "typescript": "^5.9.2", - "typescript-eslint": "^8.44.1", - "vite": "^7.1.7" - } + "name": "kando-svelte-demo", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint ." + }, + "dependencies": { + "json5": "^2.2.3", + "kando-svelte": "file:../kando-svelte" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.36.0", + "@sveltejs/adapter-auto": "^6.1.0", + "@sveltejs/kit": "^2.43.2", + "@sveltejs/vite-plugin-svelte": "^6.2.0", + "@types/node": "^20", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.4", + "globals": "^16.4.0", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^5.39.5", + "svelte-check": "^4.3.2", + "typescript": "^5.9.2", + "typescript-eslint": "^8.44.1", + "vite": "^7.1.7" + } } diff --git a/kando-svelte-demo/src/lib/MenuOutline.svelte b/kando-svelte-demo/src/lib/MenuOutline.svelte new file mode 100644 index 000000000..ad9aaed09 --- /dev/null +++ b/kando-svelte-demo/src/lib/MenuOutline.svelte @@ -0,0 +1,15 @@ + + +
  • + {item.name} ({item.type}{item.angle != null ? ` @ ${item.angle}°` : ''}) + {#if item.children?.length} +
      + {#each item.children as c} + + {/each} +
    + {/if} +
  • diff --git a/kando-svelte-demo/src/routes/+page.svelte b/kando-svelte-demo/src/routes/+page.svelte index cc88df0ea..d22dc38e0 100644 --- a/kando-svelte-demo/src/routes/+page.svelte +++ b/kando-svelte-demo/src/routes/+page.svelte @@ -1,2 +1,102 @@ -

    Welcome to SvelteKit

    -

    Visit svelte.dev/docs/kit to read the documentation

    + + +{#if error} +

    {error}

    +{/if} + +{#if config} +

    Config

    +
    {JSON.stringify(config, null, 2)}
    +{/if} + +{#if theme} +

    Theme

    +
      +
    • id: {theme.id}
    • +
    • name: {theme.name}
    • +
    • engineVersion: {theme.engineVersion}
    • +
    • layers: {theme.layers.length}
    • +
    +{/if} + +{#if menuSettings} +

    Menus (version {menuSettings.version})

    +
      + {#each menuSettings.menus as m: MenuV1, i} +
    • + {m.root?.name ?? `Menu ${i+1}`} +
        + {#if m.shortcut}
      • shortcut: {m.shortcut}
      • {/if} + {#if m.shortcutID}
      • shortcutID: {m.shortcutID}
      • {/if} +
      • centered: {String(m.centered ?? false)}
      • +
      • anchored: {String(m.anchored ?? false)}
      • +
      • hoverMode: {String(m.hoverMode ?? false)}
      • + {#if m.tags?.length} +
      • tags: {m.tags.join(', ')}
      • + {/if} +
      • outline: + {#if m.root} +
          + +
        + {:else} + no root + {/if} +
      • +
      +
    • + {/each} +
    +{:else} +

    Loading menus…

    +{/if} diff --git a/kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml b/kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml new file mode 100644 index 000000000..d5a6373ff --- /dev/null +++ b/kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: Simon Schneegans +# SPDX-License-Identifier: CC0-1.0 + +version = 1 + +[[annotations]] +path = "preview.jpg" +precedence = "aggregate" +SPDX-FileCopyrightText = "Simon Schneegans " +SPDX-License-Identifier = "CC0-1.0" \ No newline at end of file diff --git a/kando-svelte-demo/static/kando-vendor/menu-themes/default/preview.jpg b/kando-svelte-demo/static/kando-vendor/menu-themes/default/preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ce3ce68c10e954a35bcc08c6d5e3349b21686ca GIT binary patch literal 80764 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 */ +/* SPDX-License-Identifier: CC0-1.0 */ + +.menu-node { + --child-distance: 100px; + --grandchild-distance: 25px; + + --center-size: 100px; + --child-size: 50px; + --grandchild-size: 15px; + --connector-width: 10px; + + --menu-transition: all 250ms cubic-bezier(0.775, 1.325, 0.535, 1); + --opacity-transition: opacity 250ms ease; + + transition: var(--menu-transition); + + /* Positioning ---------------------------------------------------------------------- */ + + /* Child items are positioned around the active node. */ + &.child { + transform: translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), + calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); + } + + /* Grandchild items are positioned around the child items. */ + &.grandchild { + transform: translate(calc(var(--grandchild-distance) * var(--dir-x)), + calc(var(--grandchild-distance) * var(--dir-y))); + } + + /* If there is a hovered child node, we scale all children up a bit to create a cool + zoom effect. The hovered child itself is scaled up even more. */ + &.active:has(.hovered)>.child { + transform: scale(calc(1.15 - pow(var(--angle-diff) / 180, 0.25) * 0.15)) translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), + calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); + + &.hovered { + transform: scale(1.15) translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), + calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); + } + } + + + /* Theme Layers --------------------------------------------------------------------- */ + + /* This theme comes with only one layer. This contains the icon of the menu item. */ + + /* We hide all icons by default. They will be shown further down in this file for the + center item and the child items. */ + .icon-container { + opacity: 0; + color: var(--text-color); + transition: var(--opacity-transition); + margin: 5%; + width: 90% !important; + height: 90% !important; + border-radius: 50%; + overflow: hidden; + } + + /* All menu items have a border and are circles in this theme. */ + .icon-layer { + position: absolute; + border-radius: 50%; + border: 1px solid var(--border-color); + transition: var(--menu-transition); + } + + /* The active menu item is the center of the menu. */ + &.active>.icon-layer { + top: calc(-1 * var(--center-size) / 2); + left: calc(-1 * var(--center-size) / 2); + width: var(--center-size); + height: var(--center-size); + background-color: var(--background-color); + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); + } + + /* If the center item has a hovered child node, we scale it up and hide its icon. */ + &.active:has(>.hovered)>.icon-layer { + transform: scale(1.1); + + &>.icon-container { + opacity: 0; + } + } + + /* If the center node is hovered, we want to highlight it. */ + &.active.hovered>.icon-layer { + background-color: var(--hover-color); + } + + /* If the parent or a child node is clicked, we scale it down to normal size. */ + &.parent.hovered.clicked>.icon-layer, + &.child.hovered.clicked>.icon-layer { + transform: scale(0.95); + } + + /* If the center node is clicked, we scale it down a bit. */ + &.active.hovered.clicked>.icon-layer { + transform: scale(0.95); + } + + /* Show the icons of the center, parent and child items. */ + &.parent>.icon-layer>.icon-container, + &.child>.icon-layer>.icon-container, + &.active>.icon-layer>.icon-container { + opacity: 1; + } + + /* Child items are displayed around the active node. The parent node of the active + node is displayed in a similar style. */ + &.parent>.icon-layer, + &.child>.icon-layer { + top: calc(-1 * var(--child-size) / 2); + left: calc(-1 * var(--child-size) / 2); + width: var(--child-size); + height: var(--child-size); + background-color: var(--background-color); + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); + + } + + /* Hovered child or parent items are highlighted. */ + &.parent.hovered>.icon-layer, + &.child.hovered>.icon-layer { + background-color: var(--hover-color); + } + + /* Grandchild items are very small and drawn below the child items. */ + &.grandchild>.icon-layer { + top: calc(-1 * var(--grandchild-size) / 2); + left: calc(-1 * var(--grandchild-size) / 2); + width: var(--grandchild-size); + height: var(--grandchild-size); + background-color: var(--border-color); + } + + /* We disable any transition for dragged items. */ + &.dragged { + transition: none; + } + + /* Connectors ----------------------------------------------------------------------- */ + + .connector { + transition: var(--menu-transition); + height: var(--connector-width); + background-color: var(--border-color); + top: calc(-1 * var(--connector-width) / 2); + } + + &:has(.dragged)>.connector { + transition: none; + } + + &.hovered>.connector { + background-color: color-mix(in srgb, var(--hover-color) 50%, var(--border-color)); + } + + &.active>.connector { + background-color: var(--hover-color); + } +} + +/* Center Text ------------------------------------------------------------------------ */ + +.center-text { + color: var(--text-color); + transition: var(--opacity-transition); + font-size: 16px; + line-height: 22px; +} + +/* Selection Wedges ------------------------------------------------------------------- */ + +.selection-wedges { + mask: radial-gradient(circle at var(--center-x) var(--center-y), black 100px, transparent 50%); + + &.hovered { + --width: calc(var(--end-angle) - var(--start-angle)); + background: conic-gradient(from calc(var(--start-angle)) at var(--center-x) var(--center-y), + var(--wedge-highlight-color) var(--width), + var(--wedge-color) var(--width)); + } + + background: var(--wedge-color); +} \ No newline at end of file diff --git a/kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 b/kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 new file mode 100644 index 000000000..66a41a681 --- /dev/null +++ b/kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// _ _ ____ _ _ ___ ____ // +// |_/ |__| |\ | | \ | | This file belongs to Kando, the cross-platform // +// | \_ | | | \| |__/ |__| pie menu. Read more on github.com/kando-menu/kando // +// // +////////////////////////////////////////////////////////////////////////////////////////// + +// SPDX-FileCopyrightText: Simon Schneegans +// SPDX-License-Identifier: CC0-1.0 + +{ + name: 'Default', + author: 'Simon Schneegans', + license: 'CC0-1.0', + themeVersion: '1.0', + + // This theme was created for Kando's theme engine version 1. Kando will use this to + // check if the theme is compatible with the current version of Kando. + engineVersion: 1, + + // When a menu is opened too close to a screen's edge, it is moved away from the edge + // by this amount of pixels. + maxMenuRadius: 160, + + // The width at which the center text is wrapped. + centerTextWrapWidth: 95, + + // This theme draws child items below their parent items. + drawChildrenBelow: true, + + // Draw the thin lines between adjacent menu items. + drawSelectionWedges: true, + + // These colors can be configured by the user and are vailable in the CSS file as CSS + // variables. The default values are used if the user does not provide any values. + colors: { + 'background-color': 'rgb(255, 255, 255)', + 'text-color': 'rgb(60, 60, 60)', + 'border-color': 'rgb(109, 109, 109)', + 'hover-color': 'rgb(255, 200, 200)', + 'wedge-highlight-color': 'rgba(0, 0, 0, 0.1)', + 'wedge-color': 'rgba(0, 0, 0, 0.2)', + }, + + // This theme is very simple and only uses one layer for the menu items. + layers: [{ class: 'icon-layer', content: 'icon' }], +} diff --git a/kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json b/kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json new file mode 100644 index 000000000..420ae4b25 --- /dev/null +++ b/kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json @@ -0,0 +1,10 @@ +{ + "id": "none", + "name": "None", + "directory": "/kando-vendor/sound-themes", + "engineVersion": 1, + "themeVersion": "1.0.0", + "author": "Kando", + "license": "CC0-1.0", + "sounds": {} +} diff --git a/kando-svelte-demo/static/kando/config.json b/kando-svelte-demo/static/kando/config.json new file mode 100644 index 000000000..d85e6029b --- /dev/null +++ b/kando-svelte-demo/static/kando/config.json @@ -0,0 +1,36 @@ +{ + "locale": "auto", + "menuTheme": "default", + "darkMenuTheme": "default", + "menuThemeColors": {}, + "darkMenuThemeColors": {}, + "enableDarkModeForMenuThemes": false, + "soundTheme": "none", + "soundVolume": 0.5, + "sidebarVisible": true, + "ignoreWriteProtectedConfigFiles": false, + "trayIconFlavor": "color", + "enableVersionCheck": true, + "zoomFactor": 1, + "menuOptions": { + "centerDeadZone": 50, + "minParentDistance": 150, + "dragThreshold": 15, + "fadeInDuration": 150, + "fadeOutDuration": 200, + "enableMarkingMode": true, + "enableTurboMode": true, + "gestureMinStrokeLength": 150, + "gestureMinStrokeAngle": 20, + "gestureJitterThreshold": 10, + "gesturePauseTimeout": 100, + "fixedStrokeLength": 0, + "rmbSelectsParent": false, + "gamepadBackButton": 1, + "gamepadCloseButton": 2 + }, + "editorOptions": { + "showSidebarButtonVisible": true, + "showEditorButtonVisible": true + } +} diff --git a/kando-svelte-demo/static/kando/icon-themes b/kando-svelte-demo/static/kando/icon-themes new file mode 120000 index 000000000..79e2cf64a --- /dev/null +++ b/kando-svelte-demo/static/kando/icon-themes @@ -0,0 +1 @@ +../../../assets/icon-themes \ No newline at end of file diff --git a/kando-svelte-demo/static/kando/menu-themes b/kando-svelte-demo/static/kando/menu-themes new file mode 120000 index 000000000..10a131717 --- /dev/null +++ b/kando-svelte-demo/static/kando/menu-themes @@ -0,0 +1 @@ +../../../assets/menu-themes \ No newline at end of file diff --git a/kando-svelte-demo/static/kando/menus.json b/kando-svelte-demo/static/kando/menus.json new file mode 100644 index 000000000..dc1ab1ee5 --- /dev/null +++ b/kando-svelte-demo/static/kando/menus.json @@ -0,0 +1,337 @@ +{ + "menus": [ + { + "shortcut": "Control+Space", + "shortcutID": "example-menu", + "centered": false, + "root": { + "type": "submenu", + "name": "Example Menu", + "icon": "award_star", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "submenu", + "name": "Apps", + "icon": "apps", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "data": { + "command": "open -a Safari" + }, + "name": "Safari", + "icon": "safari", + "iconTheme": "simple-icons" + }, + { + "type": "command", + "data": { + "command": "open -a Mail" + }, + "name": "E-Mail", + "icon": "mail", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "open -a Music" + }, + "name": "Music", + "icon": "itunes", + "iconTheme": "simple-icons" + }, + { + "type": "command", + "data": { + "command": "open -a Finder" + }, + "name": "Finder", + "icon": "folder_shared", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "open -a Terminal" + }, + "name": "Terminal", + "icon": "terminal", + "iconTheme": "material-symbols-rounded" + } + ] + }, + { + "type": "submenu", + "name": "Web Links", + "icon": "public", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "uri", + "data": { + "uri": "https://www.google.com" + }, + "name": "Google", + "icon": "google", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://github.com/kando-menu/kando" + }, + "name": "Kando on GitHub", + "icon": "github", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://ko-fi.com/schneegans" + }, + "name": "Kando on Ko-fi", + "icon": "kofi", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://www.youtube.com/@simonschneegans" + }, + "name": "Kando on YouTube", + "icon": "youtube", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://discord.gg/hZwbVSDkhy" + }, + "name": "Kando on Discord", + "icon": "discord", + "iconTheme": "simple-icons" + } + ] + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"System Events\" to key code 124 using control down'" + }, + "name": "Next Workspace", + "icon": "arrow_forward", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "submenu", + "name": "Clipboard", + "icon": "assignment", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "hotkey", + "data": { + "hotkey": "MetaLeft+KeyV", + "delayed": true + }, + "name": "Paste", + "icon": "content_paste_go", + "iconTheme": "material-symbols-rounded", + "angle": 90 + }, + { + "type": "hotkey", + "data": { + "hotkey": "MetaLeft+KeyC", + "delayed": true + }, + "name": "Copy", + "icon": "content_copy", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "hotkey", + "data": { + "hotkey": "MetaLeft+KeyX", + "delayed": true + }, + "name": "Cut", + "icon": "cut", + "iconTheme": "material-symbols-rounded" + } + ] + }, + { + "type": "submenu", + "name": "Audio", + "icon": "play_circle", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Music\" to next track'" + }, + "name": "Next Track", + "icon": "skip_next", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Music\" to playpause'" + }, + "name": "Play / Pause", + "icon": "play_pause", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Music\" to previous track'" + }, + "name": "Previous Track", + "icon": "skip_previous", + "iconTheme": "material-symbols-rounded" + } + ] + }, + { + "type": "submenu", + "name": "Windows", + "icon": "select_window", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"System Events\" to key code 126 using control down'" + }, + "name": "Mission Control", + "icon": "select_window", + "iconTheme": "material-symbols-rounded", + "angle": 0 + }, + { + "type": "hotkey", + "data": { + "hotkey": "ControlLeft+AltLeft+ArrowRight", + "delayed": true + }, + "name": "Tile Right", + "icon": "text_select_jump_to_end", + "iconTheme": "material-symbols-rounded", + "angle": 90 + }, + { + "type": "hotkey", + "data": { + "hotkey": "MetaLeft+KeyW", + "delayed": true + }, + "name": "Close Window", + "icon": "cancel_presentation", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "hotkey", + "data": { + "hotkey": "ControlLeft+AltLeft+ArrowLeft", + "delayed": true + }, + "name": "Tile Left", + "icon": "text_select_jump_to_beginning", + "iconTheme": "material-symbols-rounded", + "angle": 270 + } + ] + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"System Events\" to key code 123 using control down'" + }, + "name": "Previous Workspace", + "icon": "arrow_back", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "submenu", + "name": "Bookmarks", + "icon": "folder_special", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Finder\" to open (path to downloads folder as text)'" + }, + "name": "Downloads", + "icon": "download", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Finder\" to open (path to movies folder as text)'" + }, + "name": "Videos", + "icon": "video_camera_front", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Finder\" to open (path to pictures folder as text)'" + }, + "name": "Pictures", + "icon": "imagesmode", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Finder\" to open (path to documents folder as text)'" + }, + "name": "Docuexample-menu.bookmarks.documentsments", + "icon": "text_ad", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Finder\" to open (path to desktop folder as text)'" + }, + "name": "Desktop", + "icon": "desktop_windows", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "open $HOME" + }, + "name": "Home", + "icon": "home", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "data": { + "command": "osascript -e 'tell application \"Finder\" to open (path to music folder as text)'" + }, + "name": "Music", + "icon": "music_note", + "iconTheme": "material-symbols-rounded" + } + ] + } + ] + } + } + ], + "templates": [] +} diff --git a/kando-svelte-demo/static/kando/sound-themes b/kando-svelte-demo/static/kando/sound-themes new file mode 120000 index 000000000..398cb4f72 --- /dev/null +++ b/kando-svelte-demo/static/kando/sound-themes @@ -0,0 +1 @@ +../../../assets/sound-themes \ No newline at end of file diff --git a/kando-svelte/README.md b/kando-svelte/README.md index 196ce870a..fcf7336f8 100644 --- a/kando-svelte/README.md +++ b/kando-svelte/README.md @@ -1,58 +1,78 @@ -# Svelte library - -Everything you need to build a Svelte library, powered by [`sv`](https://npmjs.com/package/sv). - -Read more about creating a library [in the docs](https://svelte.dev/docs/kit/packaging). - -## Creating a project - -If you're seeing this, you've probably already done this step. Congrats! - -```sh -# create a new project in the current directory -npx sv create - -# create a new project in my-app -npx sv create my-app +# kando-svelte (library) + +Svelte 5 library that renders Kando pie menus in web/SvelteKit apps. + +Goals +- Be compatible with Kando data, themes and algorithms. +- Reuse Kando source directly (math, types, schemata) where practical. +- Keep rendering and event wiring idiomatic Svelte 5. + +What it is +- A Svelte 5 library exporting components and helpers: + - `PieMenu.svelte`: render a Kando menu tree; emits `select`, `cancel`, `hover`, `unhover` events. + - `PieItem.svelte`, `SelectionWedges.svelte`, `WedgeSeparators.svelte`: building blocks. + - `Vendor`: convenient URLs for a bundled default theme and a minimal "none" sound theme. + - `theme-loader`: utilities to load JSON5 theme metadata, inject theme.css, and apply color overrides. + - `validation`: re-exports Kando zod schemata and simple parse helpers (optional to use). + +What it is not +- It does not perform file system discovery, snapshot management, or OS integrations. +- It does not implement execution of platform-specific item actions (command/file/hotkey/macro/settings). +- It does not bundle icon fonts/CSS; the host app should include Material Symbols / Simple Icons if used by the chosen theme. + +Compatibility +- Types: re-exported from Kando (`@kando/common`, `@kando/schemata/*`). +- Math: imported from Kando (`src/common/math`). +- Themes: accepts a `MenuThemeDescription` object or can load from a theme directory via `themeDirUrl` + `themeId`. + +Install & build (library) +```bash +# from the library folder +npm install +npm run build # builds .svelte-kit and dist via svelte-package ``` -## Developing +Usage (consumer app) +```svelte + -# or start the server and open the app in a new browser tab -npm run dev -- --open + console.log('select', e.detail)} /> ``` -Everything inside `src/lib` is part of your library, everything inside `src/routes` can be used as a showcase or preview app. +Theme loading +- `PieMenu` props: + - `theme` (object) OR `themeDirUrl` + `themeId` (string). + - When loading by URL, `theme-loader` fetches `theme.json5`, injects `theme.css`, and applies colors. +- You can also use the exported `Vendor.defaultThemeCss` and `Vendor.defaultThemeJson` URLs for a built-in default theme. -## Building +Sound themes +- The library bundles a minimal "none" sound theme JSON (`Vendor.noneSoundThemeJson`). +- For real sound themes, load them in your app and use Howler in client-only lifecycle hooks. -To build your library: +Icons +- Include the icon CSS your themes expect in the app (e.g. in `app.html`): + - Material Symbols Rounded CSS (Google Fonts) or the `material-symbols` npm package. + - `simple-icons-font` if you use Simple Icons. -```sh -npm pack -``` +Svelte 5 +- Internals use Svelte 5 runes for state/derived/effect where appropriate. +- Public API remains plain props/events for maximum compatibility. -To create a production version of your showcase app: +Notes on path aliases +- This repo uses `kit.alias` in `svelte.config.js` to reference Kando sources during development. +- If you publish this library to npm, either bundle those sources or depend on a separate `kando-core` package. -```sh -npm run build -``` - -You can preview the production build with `npm run preview`. - -> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. - -## Publishing - -Go into the `package.json` and give your package the desired name through the `"name"` option. Also consider adding a `"license"` field and point it to a `LICENSE` file which you can create from a template (one popular option is the [MIT license](https://opensource.org/license/mit/)). - -To publish your library to [npm](https://www.npmjs.com): - -```sh -npm publish -``` +License & attribution +- Kando is MIT; themes and font assets have their own licenses (e.g., CC0-1.0 for the default theme). +- Preserve SPDX headers and attributions when copying code. diff --git a/kando-svelte/package-lock.json b/kando-svelte/package-lock.json index b613498da..2deeff4d0 100644 --- a/kando-svelte/package-lock.json +++ b/kando-svelte/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "kando-svelte", "version": "0.0.1", + "dependencies": { + "json5": "^2.2.3" + }, "devDependencies": { "@eslint/compat": "^1.4.0", "@eslint/js": "^9.36.0", @@ -2417,6 +2420,18 @@ "dev": true, "license": "MIT" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2532,6 +2547,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2696,13 +2724,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -3261,19 +3289,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3460,19 +3475,6 @@ } } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vitefu": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", diff --git a/kando-svelte/package.json b/kando-svelte/package.json index c814dc3ac..a4f4582c5 100644 --- a/kando-svelte/package.json +++ b/kando-svelte/package.json @@ -55,5 +55,8 @@ }, "keywords": [ "svelte" - ] + ], + "dependencies": { + "json5": "^2.2.3" + } } diff --git a/kando-svelte/src/lib/PieItem.svelte b/kando-svelte/src/lib/PieItem.svelte new file mode 100644 index 000000000..6b2f3e87f --- /dev/null +++ b/kando-svelte/src/lib/PieItem.svelte @@ -0,0 +1,15 @@ + + +
    + +
    diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte new file mode 100644 index 000000000..608cbafd1 --- /dev/null +++ b/kando-svelte/src/lib/PieMenu.svelte @@ -0,0 +1,53 @@ + + +
    + +
    PieMenu placeholder
    +
    + + diff --git a/kando-svelte/src/lib/SelectionWedges.svelte b/kando-svelte/src/lib/SelectionWedges.svelte new file mode 100644 index 000000000..4f645e120 --- /dev/null +++ b/kando-svelte/src/lib/SelectionWedges.svelte @@ -0,0 +1,9 @@ + + +
    diff --git a/kando-svelte/src/lib/index.ts b/kando-svelte/src/lib/index.ts index 47d3c46fb..5e61cb9f7 100644 --- a/kando-svelte/src/lib/index.ts +++ b/kando-svelte/src/lib/index.ts @@ -1 +1,11 @@ -// Reexport your entry components here +export { default as PieMenu } from './PieMenu.svelte'; +export { default as PieItem } from './PieItem.svelte'; +export { default as SelectionWedges } from './SelectionWedges.svelte'; +export { default as WedgeSeparators } from './WedgeSeparators.svelte'; +export * from './types'; + +export const Vendor = { + defaultThemeCss: new URL('./vendor/default-theme.css', import.meta.url).toString(), + defaultThemeJson: new URL('./vendor/default-theme.json5', import.meta.url).toString(), + noneSoundThemeJson: new URL('./vendor/sounds/none/theme.json', import.meta.url).toString() +}; diff --git a/kando-svelte/src/lib/theme-loader.ts b/kando-svelte/src/lib/theme-loader.ts new file mode 100644 index 000000000..fabff42ef --- /dev/null +++ b/kando-svelte/src/lib/theme-loader.ts @@ -0,0 +1,31 @@ +import JSON5 from 'json5'; +import type { MenuThemeDescription } from './types'; + +export async function fetchThemeJson(themeDirUrl: string, themeId: string): Promise { + const url = `${themeDirUrl.replace(/\/$/, '')}/${themeId}/theme.json5`; + const res = await fetch(url); + if (!res.ok) throw new Error(`Failed to load theme: ${url}`); + const text = await res.text(); + const parsed = JSON5.parse(text); + return { + ...parsed, + id: themeId, + directory: themeDirUrl.replace(/\/$/, '') + } as MenuThemeDescription; +} + +export function injectThemeCss(theme: MenuThemeDescription): HTMLLinkElement { + const href = `file://${theme.directory}/${theme.id}/theme.css`.replace('file:///', '/'); + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = href; + link.id = `kando-theme-${theme.id}`; + document.head.appendChild(link); + return link; +} + +export function applyThemeColors(colors: Record) { + Object.entries(colors).forEach(([name, value]) => { + document.documentElement.style.setProperty(`--${name}`, value); + }); +} diff --git a/kando-svelte/src/lib/types.ts b/kando-svelte/src/lib/types.ts new file mode 100644 index 000000000..1eefe7555 --- /dev/null +++ b/kando-svelte/src/lib/types.ts @@ -0,0 +1,2 @@ +export type { Vec2, ShowMenuOptions, MenuThemeDescription } from '@kando/common'; +export type { MenuItemV1 as MenuItem, MenuV1, MenuCollectionV1 } from '@kando/schemata/menu-settings-v1'; diff --git a/kando-svelte/src/lib/validation.ts b/kando-svelte/src/lib/validation.ts new file mode 100644 index 000000000..bcc965c19 --- /dev/null +++ b/kando-svelte/src/lib/validation.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; +import { GENERAL_SETTINGS_SCHEMA_V1 } from '@kando/schemata/general-settings-v1'; +import { MENU_SETTINGS_SCHEMA_V1 } from '@kando/schemata/menu-settings-v1'; +import type { GeneralSettingsV1 } from '@kando/schemata/general-settings-v1'; +import type { MenuSettingsV1 } from '@kando/schemata/menu-settings-v1'; + +export { GENERAL_SETTINGS_SCHEMA_V1, MENU_SETTINGS_SCHEMA_V1 }; + +export type ValidationResult = { ok: true; data: T } | { ok: false; errors: z.ZodIssue[] }; + +export function parseConfig(input: unknown): ValidationResult { + const res = GENERAL_SETTINGS_SCHEMA_V1.safeParse(input); + return res.success ? { ok: true, data: res.data } : { ok: false, errors: res.error.issues }; +} + +export function parseMenus(input: unknown): ValidationResult { + const res = MENU_SETTINGS_SCHEMA_V1.safeParse(input); + return res.success ? { ok: true, data: res.data } : { ok: false, errors: res.error.issues }; +} diff --git a/kando-svelte/src/lib/vendor/default-theme.css b/kando-svelte/src/lib/vendor/default-theme.css new file mode 100644 index 000000000..83ca25b43 --- /dev/null +++ b/kando-svelte/src/lib/vendor/default-theme.css @@ -0,0 +1,196 @@ +/*//////////////////////////////////////////////////////////////////////////////////////*/ +/* _ _ ____ _ _ ___ ____ */ +/* |_/ |__| |\ | | \ | | This file belongs to Kando, the cross-platform */ +/* | \_ | | | \| |__/ |__| pie menu. Read more on github.com/kando-menu/kando */ +/* */ +/*//////////////////////////////////////////////////////////////////////////////////////*/ + +/* SPDX-FileCopyrightText: Simon Schneegans */ +/* SPDX-License-Identifier: CC0-1.0 */ + +.menu-node { + --child-distance: 100px; + --grandchild-distance: 25px; + + --center-size: 100px; + --child-size: 50px; + --grandchild-size: 15px; + --connector-width: 10px; + + --menu-transition: all 250ms cubic-bezier(0.775, 1.325, 0.535, 1); + --opacity-transition: opacity 250ms ease; + + transition: var(--menu-transition); + + /* Positioning ---------------------------------------------------------------------- */ + + /* Child items are positioned around the active node. */ + &.child { + transform: translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), + calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); + } + + /* Grandchild items are positioned around the child items. */ + &.grandchild { + transform: translate(calc(var(--grandchild-distance) * var(--dir-x)), + calc(var(--grandchild-distance) * var(--dir-y))); + } + + /* If there is a hovered child node, we scale all children up a bit to create a cool + zoom effect. The hovered child itself is scaled up even more. */ + &.active:has(.hovered)>.child { + transform: scale(calc(1.15 - pow(var(--angle-diff) / 180, 0.25) * 0.15)) translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), + calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); + + &.hovered { + transform: scale(1.15) translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), + calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); + } + } + + + /* Theme Layers --------------------------------------------------------------------- */ + + /* This theme comes with only one layer. This contains the icon of the menu item. */ + + /* We hide all icons by default. They will be shown further down in this file for the + center item and the child items. */ + .icon-container { + opacity: 0; + color: var(--text-color); + transition: var(--opacity-transition); + margin: 5%; + width: 90% !important; + height: 90% !important; + border-radius: 50%; + overflow: hidden; + } + + /* All menu items have a border and are circles in this theme. */ + .icon-layer { + position: absolute; + border-radius: 50%; + border: 1px solid var(--border-color); + transition: var(--menu-transition); + } + + /* The active menu item is the center of the menu. */ + &.active>.icon-layer { + top: calc(-1 * var(--center-size) / 2); + left: calc(-1 * var(--center-size) / 2); + width: var(--center-size); + height: var(--center-size); + background-color: var(--background-color); + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); + } + + /* If the center item has a hovered child node, we scale it up and hide its icon. */ + &.active:has(>.hovered)>.icon-layer { + transform: scale(1.1); + + &>.icon-container { + opacity: 0; + } + } + + /* If the center node is hovered, we want to highlight it. */ + &.active.hovered>.icon-layer { + background-color: var(--hover-color); + } + + /* If the parent or a child node is clicked, we scale it down to normal size. */ + &.parent.hovered.clicked>.icon-layer, + &.child.hovered.clicked>.icon-layer { + transform: scale(0.95); + } + + /* If the center node is clicked, we scale it down a bit. */ + &.active.hovered.clicked>.icon-layer { + transform: scale(0.95); + } + + /* Show the icons of the center, parent and child items. */ + &.parent>.icon-layer>.icon-container, + &.child>.icon-layer>.icon-container, + &.active>.icon-layer>.icon-container { + opacity: 1; + } + + /* Child items are displayed around the active node. The parent node of the active + node is displayed in a similar style. */ + &.parent>.icon-layer, + &.child>.icon-layer { + top: calc(-1 * var(--child-size) / 2); + left: calc(-1 * var(--child-size) / 2); + width: var(--child-size); + height: var(--child-size); + background-color: var(--background-color); + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); + + } + + /* Hovered child or parent items are highlighted. */ + &.parent.hovered>.icon-layer, + &.child.hovered>.icon-layer { + background-color: var(--hover-color); + } + + /* Grandchild items are very small and drawn below the child items. */ + &.grandchild>.icon-layer { + top: calc(-1 * var(--grandchild-size) / 2); + left: calc(-1 * var(--grandchild-size) / 2); + width: var(--grandchild-size); + height: var(--grandchild-size); + background-color: var(--border-color); + } + + /* We disable any transition for dragged items. */ + &.dragged { + transition: none; + } + + /* Connectors ----------------------------------------------------------------------- */ + + .connector { + transition: var(--menu-transition); + height: var(--connector-width); + background-color: var(--border-color); + top: calc(-1 * var(--connector-width) / 2); + } + + &:has(.dragged)>.connector { + transition: none; + } + + &.hovered>.connector { + background-color: color-mix(in srgb, var(--hover-color) 50%, var(--border-color)); + } + + &.active>.connector { + background-color: var(--hover-color); + } +} + +/* Center Text ------------------------------------------------------------------------ */ + +.center-text { + color: var(--text-color); + transition: var(--opacity-transition); + font-size: 16px; + line-height: 22px; +} + +/* Selection Wedges ------------------------------------------------------------------- */ + +.selection-wedges { + mask: radial-gradient(circle at var(--center-x) var(--center-y), black 100px, transparent 50%); + + &.hovered { + --width: calc(var(--end-angle) - var(--start-angle)); + background: conic-gradient(from calc(var(--start-angle)) at var(--center-x) var(--center-y), + var(--wedge-highlight-color) var(--width), + var(--wedge-color) var(--width)); + } + + background: var(--wedge-color); +} \ No newline at end of file diff --git a/kando-svelte/src/lib/vendor/default-theme.json5 b/kando-svelte/src/lib/vendor/default-theme.json5 new file mode 100644 index 000000000..66a41a681 --- /dev/null +++ b/kando-svelte/src/lib/vendor/default-theme.json5 @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////////////////////// +// _ _ ____ _ _ ___ ____ // +// |_/ |__| |\ | | \ | | This file belongs to Kando, the cross-platform // +// | \_ | | | \| |__/ |__| pie menu. Read more on github.com/kando-menu/kando // +// // +////////////////////////////////////////////////////////////////////////////////////////// + +// SPDX-FileCopyrightText: Simon Schneegans +// SPDX-License-Identifier: CC0-1.0 + +{ + name: 'Default', + author: 'Simon Schneegans', + license: 'CC0-1.0', + themeVersion: '1.0', + + // This theme was created for Kando's theme engine version 1. Kando will use this to + // check if the theme is compatible with the current version of Kando. + engineVersion: 1, + + // When a menu is opened too close to a screen's edge, it is moved away from the edge + // by this amount of pixels. + maxMenuRadius: 160, + + // The width at which the center text is wrapped. + centerTextWrapWidth: 95, + + // This theme draws child items below their parent items. + drawChildrenBelow: true, + + // Draw the thin lines between adjacent menu items. + drawSelectionWedges: true, + + // These colors can be configured by the user and are vailable in the CSS file as CSS + // variables. The default values are used if the user does not provide any values. + colors: { + 'background-color': 'rgb(255, 255, 255)', + 'text-color': 'rgb(60, 60, 60)', + 'border-color': 'rgb(109, 109, 109)', + 'hover-color': 'rgb(255, 200, 200)', + 'wedge-highlight-color': 'rgba(0, 0, 0, 0.1)', + 'wedge-color': 'rgba(0, 0, 0, 0.2)', + }, + + // This theme is very simple and only uses one layer for the menu items. + layers: [{ class: 'icon-layer', content: 'icon' }], +} diff --git a/kando-svelte/src/lib/vendor/sounds/none/theme.json b/kando-svelte/src/lib/vendor/sounds/none/theme.json new file mode 100644 index 000000000..b0d228abb --- /dev/null +++ b/kando-svelte/src/lib/vendor/sounds/none/theme.json @@ -0,0 +1,10 @@ +{ + "id": "none", + "name": "None", + "directory": "internal", + "engineVersion": 1, + "themeVersion": "1.0.0", + "author": "Kando", + "license": "CC0-1.0", + "sounds": {} +} diff --git a/kando-svelte/svelte.config.js b/kando-svelte/svelte.config.js index 1295460d1..ddadb8528 100644 --- a/kando-svelte/svelte.config.js +++ b/kando-svelte/svelte.config.js @@ -11,7 +11,14 @@ const config = { // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. // If your environment is not supported, or you settled on a specific environment, switch out the adapter. // See https://svelte.dev/docs/kit/adapters for more information about adapters. - adapter: adapter() + adapter: adapter(), + alias: { + '@kando/common': '../src/common', + '@kando/schemata': '../src/common/settings-schemata', + '@kando/gesture': '../src/menu-renderer/input-methods/gesture-detector.ts', + '@kando/gamepad': '../src/menu-renderer/input-methods/gamepad.ts', + '@kando/sound-theme': '../src/menu-renderer/sound-theme.ts' + } } }; diff --git a/kando-svelte/vite.config.ts b/kando-svelte/vite.config.ts index bbf8c7da4..d8beabce1 100644 --- a/kando-svelte/vite.config.ts +++ b/kando-svelte/vite.config.ts @@ -1,6 +1,18 @@ import { sveltekit } from '@sveltejs/kit/vite'; import { defineConfig } from 'vite'; +import { fileURLToPath } from 'node:url'; + +const r = (p: string) => fileURLToPath(new URL(p, import.meta.url)); export default defineConfig({ - plugins: [sveltekit()] + plugins: [sveltekit()], + resolve: { + alias: { + '@kando/common': r('../src/common'), + '@kando/schemata': r('../src/common/settings-schemata'), + '@kando/gesture': r('../src/menu-renderer/input-methods/gesture-detector.ts'), + '@kando/gamepad': r('../src/menu-renderer/input-methods/gamepad.ts'), + '@kando/sound-theme': r('../src/menu-renderer/sound-theme.ts') + } + } }); diff --git a/package.json b/package.json index c48483faf..e1ebff6d7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "@electron-forge/maker-dmg": "^7.9.0", "@electron-forge/maker-rpm": "^7.9.0", "@electron-forge/maker-squirrel": "^7.9.0", - "@electron-forge/maker-zip": "^7.9.0", "@electron-forge/plugin-webpack": "^7.9.0", "@eslint/compat": "^1.4.0", "@eslint/js": "^9.36.0", @@ -111,4 +110,4 @@ "zundo": "^2.1.0", "zustand": "^5.0.8" } -} +} \ No newline at end of file diff --git a/src/common/index.d.ts b/src/common/index.d.ts new file mode 100644 index 000000000..60baa4525 --- /dev/null +++ b/src/common/index.d.ts @@ -0,0 +1,331 @@ +export * from './settings-schemata/menu-settings-v1'; +export * from './settings-schemata'; +/** This type is used to pass command line arguments to the app. */ +export type CommandlineOptions = { + readonly menu?: string; + readonly settings?: boolean; + readonly reloadMenuTheme?: boolean; + readonly reloadSoundTheme?: boolean; +}; +/** + * A simple 2D vector. + * + * You can find some vector math in the `src/renderer/math` directory. + */ +export type Vec2 = { + x: number; + y: number; +}; +/** This type describes some information about the currently used backend. */ +export type BackendInfo = { + /** + * The name of the backend. This is shown in the user interface so that users can see + * which backend is currently active. + */ + readonly name: string; + /** + * Each backend should return a suitable window type here. The window type determines + * how Kando's menu window is drawn. The most suitable type is dependent on the + * operating system and the window manager. For example, on GNOME, the window type + * "dock" seems to work best, on KDE "toolbar" provides a better experience. On Windows, + * "toolbar" is the only type that works. + * https://www.electronjs.org/docs/latest/api/browser-window#new-browserwindowoptions + * + * @returns The window type to use for the pie menu window. + */ + readonly menuWindowType: string; + /** + * There are some backends which do not support custom shortcuts. In this case, the user + * will not be able to change the shortcuts in the settings. Instead, the user will set + * a shortcut ID and then assign a shortcut in the operating system. + */ + readonly supportsShortcuts: boolean; + /** + * This hint is shown in the settings next to the shortcut-id input field if + * supportsShortcuts is false. It should very briefly explain how to change the + * shortcuts in the operating system. If supportsShortcuts is true, this is not + * required. + */ + readonly shortcutHint?: string; + /** This determines whether the settings window should use transparency per default. */ + readonly shouldUseTransparentSettingsWindow: boolean; +}; +/** This type describes some information about the current version of Kando. */ +export type VersionInfo = { + readonly kandoVersion: string; + readonly electronVersion: string; + readonly chromeVersion: string; + readonly nodeVersion: string; +}; +/** + * This type is used to transfer information required from the window manager when opening + * the pie menu. It contains the name of the currently focused app / window, the current + * pointer position, and the screen area where a maximized window can be placed. That is + * the screen resolution minus the taskbar and other panels. + */ +export type WMInfo = { + readonly windowName: string; + readonly appName: string; + readonly pointerX: number; + readonly pointerY: number; + readonly workArea: Electron.Rectangle; +}; +/** + * This type is used to transfer information about the system to the renderer process. It + * will determine the visibility of some UI elements and the availability of some + * features. + */ +export type SystemInfo = { + /** Whether the system supports launching isolated processes. */ + readonly supportsIsolatedProcesses: boolean; +}; +/** This type describes a icon theme consisting of a collection of icon files. */ +export type FileIconThemeDescription = { + /** + * The ID of the theme. This is used to identify the theme in the settings file. It is + * also the directory name of the icon theme. + */ + readonly name: string; + /** + * The absolute path to the directory where the theme is stored, including the name as + * the last part of the path. + */ + readonly directory: string; + /** + * A list of all available icons in this theme. These are the filenames of the icons + * relative to the theme directory. In case of nested directories, the filenames can + * actually be paths. + */ + readonly icons: string[]; +}; +/** + * This type is used to pass information about all available icon themes to the renderer + * process. + */ +export type IconThemesInfo = { + /** The absolute path to the directory where the user may store custom icon themes. */ + readonly userIconDirectory: string; + /** All available file icon themes. */ + readonly fileIconThemes: FileIconThemeDescription[]; +}; +/** + * This type is used to describe an element of a key sequence. It contains the DOM name of + * the key, a boolean indicating whether the key is pressed or released and a delay in + * milliseconds. + */ +export type KeyStroke = { + name: string; + down: boolean; + delay: number; +}; +/** + * This type is used to describe a sequence of key strokes. It is used to simulate + * keyboard shortcuts. + */ +export type KeySequence = Array; +/** + * There are different reasons why a menu should be shown. This type is used to describe + * the request to show a menu. A menu can be shown because a shortcut was pressed (in this + * case `trigger` will be the shortcut or the shortcut ID) or because a menu was requested + * by name. + */ +export type ShowMenuRequest = { + readonly trigger: string; + readonly name: string; +}; +/** + * This type is used to describe the additional information that is passed to the Menu's + * `show()` method from the main to the renderer process. + */ +export type ShowMenuOptions = { + /** + * The position of the mouse cursor when the menu was opened. Relative to the top left + * corner of the window. + */ + readonly mousePosition: Vec2; + /** + * The size of the window. Usually, this is the same as window.innerWidth and + * window.innerHeight. However, when the window was just resized, this can be different. + * Therefore, we need to pass it from the main process. + */ + readonly windowSize: Vec2; + /** + * The scale factor of the menu. This is required to compute the correct position of the + * menu. + */ + readonly zoomFactor: number; + /** + * If this is set, the menu will be opened in the screen's center. Else it will be + * opened at the mouse pointer. + */ + readonly centeredMode: boolean; + /** + * If this is set, the menu will be "anchored". This means that any submenus will be + * opened at the same position as the parent menu. + */ + readonly anchoredMode: boolean; + /** + * If this is set, the menu will be in "hover mode". This means that the menu items can + * be selected by only hovering over them. + */ + readonly hoverMode: boolean; + /** + * If this is set, the system-icon theme has changed since the last time the menu was + * opened. This is used to determine if the menu needs to be reloaded. + */ + readonly systemIconsChanged: boolean; +}; +/** + * The description of a menu theme. These are the properties which can be defined in the + * JSON file of a menu theme. + */ +export type MenuThemeDescription = { + /** + * The ID of the theme. This is used to identify the theme in the settings file. It is + * also the directory name of the theme and is set by Kando when loading the theme.json + * file. So the path to the theme.json file is this.directory/this.id/theme.json. + */ + id: string; + /** + * The absolute path to the directory where the theme is stored. This is set by Kando + * when loading the theme.json file. + */ + directory: string; + /** A human readable name of the theme. */ + readonly name: string; + /** The author of the theme. */ + readonly author: string; + /** The version of the theme. Should be a semantic version string like "1.0.0". */ + readonly themeVersion: string; + /** The version of the Kando theme engine this theme is compatible with. */ + readonly engineVersion: number; + /** The license of the theme. For instance "CC-BY-4.0". */ + readonly license: string; + /** + * The maximum radius in pixels of a menu when using this theme. This is used to move + * the menu away from the screen edges when it's opened too close to them. Default is + * 150px. + */ + readonly maxMenuRadius: number; + /** The width of the text wrap in the center of the menu in pixels. Default is 90px. */ + readonly centerTextWrapWidth: number; + /** + * If this is true, children of a menu item will be drawn below the parent. Otherwise + * they will be drawn above. Default is true. + */ + readonly drawChildrenBelow: boolean; + /** + * If this is set to true, the center text of the menu will be drawn. This is the text + * that is displayed in the center of the menu when it is opened. Default is true. + */ + readonly drawCenterText: boolean; + /** + * If this is set to true, a full-screen div will be drawn below the menu with the CSS + * class "selection-wedges". If any menu item is hovered, it will also receive the class + * "hovered" and the "--start-angle" and "--end-angle" CSS properties will indicate + * where the selected child is. Default is false. + */ + readonly drawSelectionWedges: boolean; + /** + * If this is set to true, a full-screen div will be drawn below the menu with the CSS + * class "wedge-separators". It will contain a div for each separator line between + * adjacent wedges. They will have the "separator" class. Default is false. + */ + readonly drawWedgeSeparators: boolean; + /** + * These colors will be available as var(--name) in the CSS file and can be adjusted by + * the user in the settings. The map assigns a default CSS color to each name. + */ + readonly colors: Record; + /** + * The layers which are drawn on top of each other for each menu item. Each layer will + * be a html div element with a class defined in the theme file. Also, each layer can + * have a `content` property which can be used to make the layer contain the item's icon + * or name. + */ + readonly layers: { + readonly class: string; + readonly content: 'none' | 'name' | 'icon'; + }[]; +}; +/** + * Sound themes can define different sounds for different actions. This enum is used to + * identify the different sounds. + */ +export declare enum SoundType { + eOpenMenu = "openMenu", + eCloseMenu = "closeMenu", + eSelectItem = "selectItem", + eSelectSubmenu = "selectSubmenu", + eSelectParent = "selectParent", + eHoverItem = "hoverItem", + eHoverSubmenu = "hoverSubmenu", + eHoverParent = "hoverParent" +} +/** + * This type is used to describe a sound effect. It contains the path to the sound file + * and some optional properties like the volume and pitch shift. + */ +export type SoundEffect = { + /** The path to the sound file. */ + readonly file: string; + /** The volume of the sound. */ + readonly volume?: number; + /** The maximum pitch shift. */ + readonly maxPitch?: number; + /** The minimum pitch shift. */ + readonly minPitch?: number; +}; +/** + * This type is used to describe a sound theme. It contains the properties which can be + * defined in the JSON file of a sound theme. All paths are relative to the theme + * directory. + */ +export type SoundThemeDescription = { + /** + * The ID of the theme. This is used to identify the theme in the settings file. It is + * also the directory name of the theme and is set by Kando when loading the theme.json + * file. So the path to the theme.json file is this.directory/this.id/theme.json. + */ + id: string; + /** + * The absolute path to the directory where the theme is stored. This is set by Kando + * when loading the theme.json file. + */ + directory: string; + /** A human readable name of the theme. */ + readonly name: string; + /** The author of the theme. */ + readonly author: string; + /** The version of the theme. Should be a semantic version string like "1.0.0". */ + readonly themeVersion: string; + /** The version of the Kando sound theme engine this theme is compatible with. */ + readonly engineVersion: number; + /** The license of the theme. For instance "CC-BY-4.0". */ + readonly license: string; + /** + * All available sound effects. If a given sound is not defined here, no sound will be + * played for the corresponding action. + */ + readonly sounds: Record; +}; +/** + * This type is used to describe an installed application. When the settings window is + * opened, it will query the host process for a list of all installed applications. + */ +export type AppDescription = { + /** + * Some unique identifier for the application. What that is depends on the backend. + * Could be for instance the UWP app ID. If the backend is not able to provide a unique + * ID, it may fall back to using the application command. + */ + readonly id: string; + /** The name of the application. */ + readonly name: string; + /** The command to launch the application. */ + readonly command: string; + /** The icon used for the application. */ + readonly icon: string; + /** The icon theme used for the above icon. */ + readonly iconTheme: string; +}; diff --git a/src/common/settings-schemata/general-settings-v1.d.ts b/src/common/settings-schemata/general-settings-v1.d.ts new file mode 100644 index 000000000..65c11adc0 --- /dev/null +++ b/src/common/settings-schemata/general-settings-v1.d.ts @@ -0,0 +1,7 @@ +import * as z from 'zod'; +/** + * Starting with Kando 2.1.0, we use zod to define the schema of the general settings. + * This allows us to better validate the settings file. + */ +export declare const GENERAL_SETTINGS_SCHEMA_V1: any; +export type GeneralSettingsV1 = z.infer; diff --git a/src/common/settings-schemata/index.d.ts b/src/common/settings-schemata/index.d.ts new file mode 100644 index 000000000..3a4bdaac9 --- /dev/null +++ b/src/common/settings-schemata/index.d.ts @@ -0,0 +1,4 @@ +export type { GeneralSettingsV1 as GeneralSettings } from './general-settings-v1'; +export { GENERAL_SETTINGS_SCHEMA_V1 as GENERAL_SETTINGS_SCHEMA } from './general-settings-v1'; +export type { MenuConditionsV1 as MenuConditions, MenuItemV1 as MenuItem, MenuV1 as Menu, MenuCollectionV1 as MenuCollection, MenuSettingsV1 as MenuSettings, } from './menu-settings-v1'; +export { MENU_SETTINGS_SCHEMA_V1 as MENU_SETTINGS_SCHEMA } from './menu-settings-v1'; diff --git a/src/common/settings-schemata/menu-settings-v1.d.ts b/src/common/settings-schemata/menu-settings-v1.d.ts new file mode 100644 index 000000000..6701dbd90 --- /dev/null +++ b/src/common/settings-schemata/menu-settings-v1.d.ts @@ -0,0 +1,29 @@ +import * as z from 'zod'; +/** + * This type is used to describe the conditions under which a menu should be shown. When a + * menu shall be shown, the conditions of all menus are checked. The menu with the most + * conditions that are met is selected. + */ +export declare const MENU_CONDITIONS_SCHEMA_V1: any; +/** The menu consists of a tree of menu items. */ +export declare const MENU_ITEM_SCHEMA_V1: any; +/** + * This type describes a menu. It contains the root item of the menu, the shortcut to open + * the menu and a flag indicating whether the menu should be opened in the center of the + * screen or at the mouse pointer. + * + * This type is used to describe one of the configured menus in the settings file. + */ +export declare const MENU_SCHEMA_V1: any; +/** The user can create menu collections to group menus according to their tags. */ +export declare const MENU_COLLECTION_SCHEMA_V1: any; +/** + * This type describes the content of the settings file. It contains the configured menus + * as well as the templates. + */ +export declare const MENU_SETTINGS_SCHEMA_V1: any; +export type MenuConditionsV1 = z.infer; +export type MenuItemV1 = z.infer; +export type MenuV1 = z.infer; +export type MenuCollectionV1 = z.infer; +export type MenuSettingsV1 = z.infer; From 2287705e9f946e0b5d29a8183edb378bc04044e9 Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Sun, 5 Oct 2025 17:57:29 +0200 Subject: [PATCH 05/20] code reuse and adaptation analysis --- notes/kando-svelte.md | 123 ++++++++++++++++++++++++++++-------------- 1 file changed, 82 insertions(+), 41 deletions(-) diff --git a/notes/kando-svelte.md b/notes/kando-svelte.md index 6273622d6..63d90ae26 100644 --- a/notes/kando-svelte.md +++ b/notes/kando-svelte.md @@ -11,6 +11,30 @@ Goal: Build a Svelte 5/SvelteKit implementation of Kando’s pie menu that reuse --- +### Reuse policy (import-first) and header-note requirement + +- Primary rule: Prefer direct imports of Kando source whenever technically possible (renderer-safe TS, math, schemas, theme helpers). Keep names and signatures identical. +- If direct import is not possible, first consider a minimal upstream-friendly refactor in Kando (layering/abstraction, DOM-free helper extraction, EventEmitter → tiny emitter interface, parameterizing environment). +- Only re-implement when import/refactor is impractical for now. In that case: + - Add a short header comment at the top of the file titled “Reuse Note” that explains: + 1) Which Kando file(s) this mirrors (paths/commit if relevant) + 2) Why it cannot be imported as-is today + 3) Suggested refactor to make it importable later (scope and feasibility) + 4) Any deliberate deviations from Kando behavior + - Keep type/function names and behavior 1:1 where feasible to simplify diffing and future convergence. +- Track identified refactor opportunities in this doc (Code re‑use inventory) so we can upstream PRs. + +Header comment template to use in re-implemented files: + +``` +/* Reuse Note + - Mirrors: + - Blocker to import-as-is: + - Proposed upstream refactor: + - Behavior notes: +*/ +``` + ## Compatibility surface (what must match Kando) ### Menu JSON shape (reader contract) @@ -88,7 +112,7 @@ Svelte must adhere to the same DOM/CSS contract to make Kando themes work withou ## Geometry, interaction, and rendering rules (compat) -Re-implement Kando math in Svelte (1:1 behavior): +Import Kando math as‑is (1:1 behavior) from `@kando/common/math`: - Angles and wedges: - Compute child angles with `computeItemAngles(children, parentAngle?)`, honoring fixed angles (monotonic increasing, clamp to [0, 360) for first, remove duplicates and overflow beyond first+360). @@ -131,49 +155,20 @@ Re-implement Kando math in Svelte (1:1 behavior): - SvelteKit loaders/adapters for reading theme.json5 and injecting theme.css links - Vite plugin config for fonts/icons (Material Symbols, Simple Icons) -### Types (compat subset) +### Types and schemata (imported, single source of truth) -```ts -export type Vec2 = { x: number; y: number }; - -export type ShowMenuOptions = { - mousePosition: Vec2; - windowSize: Vec2; - zoomFactor: number; - centeredMode: boolean; - anchoredMode: boolean; - hoverMode: boolean; - systemIconsChanged?: boolean; -}; +- From `src/common/settings-schemata/` (zod): + - `general-settings-v1.ts`: `GENERAL_SETTINGS_SCHEMA_V1`, type `GeneralSettingsV1` + - `menu-settings-v1.ts`: `MENU_SETTINGS_SCHEMA_V1`, unions for `MenuItemV1`, plus `MenuV1`, `MenuSettingsV1`, and collection schemas -export type MenuItem = { - type: 'submenu' | 'command' | 'file' | 'hotkey' | 'macro' | 'text' | 'uri' | 'redirect' | 'settings'; - name: string; - icon?: string; - iconTheme?: string; - angle?: number; - children?: MenuItem[]; - data?: unknown; // preserved opaque payload -}; +- From `src/common/index.ts` (renderer-safe types): + - `Vec2`, `ShowMenuOptions`, `MenuThemeDescription`, `SoundType`, `SoundThemeDescription`, `KeyStroke`, `KeySequence` -export type MenuThemeDescription = { - id: string; // filled by loader based on directory name - directory: string; // absolute dir path; used to resolve CSS - name: string; - author: string; - themeVersion: string; - engineVersion: number; // expect >= 1 - license: string; - maxMenuRadius: number; - centerTextWrapWidth: number; - drawChildrenBelow: boolean; - drawCenterText: boolean; - drawSelectionWedges: boolean; - drawWedgeSeparators: boolean; - colors: Record; - layers: { class: string; content: 'none' | 'name' | 'icon' }[]; -}; -``` +- How we use them + - Validation: parse `config.json` and `menus.json` with `GENERAL_SETTINGS_SCHEMA_V1` and `MENU_SETTINGS_SCHEMA_V1`. + - Types: consume `GeneralSettingsV1`, `MenuSettingsV1`, `MenuV1`, `MenuItemV1` exported by those modules (no local copies). + - Extensions: add optional Svelte-only configuration under a namespaced `svelte` object in app code; keep zod schemas unchanged to preserve 1:1 compatibility. + - Imports during dev via aliases: `@kando/schemata/general-settings-v1`, `@kando/schemata/menu-settings-v1`, and `@kando/common`. ### State and reactivity with Svelte 5 runes @@ -479,6 +474,52 @@ Where possible, import Kando source directly instead of reimplementing: - Math: import directly (preferred) - Use `import * as math from '@kando/common/math';` rather than reimplementing. The earlier “Porting Kando math” sketch is only a fallback if decoupling is required. --- +## Implementation TODOs (tracker) + +Current status: Engine scaffolding is in progress; other items pending. + +- [ ] Create engine scaffolding: state store, interfaces, event contracts +- [ ] Implement wedge geometry using Kando math (angles, rings, gaps) +- [ ] Add pointer input: track origin, angle, radius; compute hovered wedge +- [ ] Render root ring with hover highlight and center zone +- [ ] Dispatch select/cancel events on release; keyboard escape +- [ ] Implement selection chain and child rings navigation +- [ ] Map theme layers/colors to CSS variables; inject theme.css +- [ ] Hook sounds (Howler) for open/hover/select/cancel +- [ ] Wire demo to show interactive menu, theme switcher, logs + +These align 1:1 with the library/demo plan above and should remain in sync with commit messages. + +--- + +## Code reuse summary and shims (concise) + +Import as-is (no changes required) +- `src/common/math/index.ts`: `computeItemAngles`, `computeItemWedges`, `normalizeConsequtiveAngles`, `scaleWedge`, `isAngleBetween`, `getClosestEquivalentAngle`, `getAngle`, `getDistance`, clamps, etc. +- `src/common/index.ts`: `Vec2`, `ShowMenuOptions`, `MenuThemeDescription`, `SoundType`, `SoundThemeDescription`, `KeyStroke`, `KeySequence`. +- `src/common/settings-schemata/general-settings-v1.ts` and `menu-settings-v1.ts`: `GENERAL_SETTINGS_SCHEMA_V1`, `MENU_SETTINGS_SCHEMA_V1` and inferred types `GeneralSettingsV1`, `MenuSettingsV1`, `MenuV1`, `MenuItemV1` (used for validation and types; no local copies). + +Import with tiny shim (browser-friendly) +- `src/menu-renderer/input-methods/gesture-detector.ts` (`GestureDetector`) and `gamepad.ts` (`Gamepad`) depend on Node `events`. + - Shim: provide an `events` alias to a minimal emitter (or `eventemitter3`) so imports resolve unchanged. + - Justification: keeps the original classes intact and importable; avoids touching upstream code; bundler-only change. + - Where used: `PointerInput` and `GamepadInput` directly import these; Svelte code wires DOM events to `PointerInput` and subscribes to `GestureDetector`/`Gamepad` events. + +Adapt/wrap in Svelte (DOM-bound in Kando) +- `src/menu-renderer/menu.ts` (`Menu`): selection chain, DOM building, and event wiring are tightly coupled. We mirror behavior in `PieMenu.svelte` + child components, preserving semantics (push/pop chain, `selectItem` logic, hover/click/drag states). +- `src/menu-renderer/rendered-menu-item.ts` (`RenderedMenuItem`): contains DOM fields (`nodeDiv`, `connectorDiv`). We use a DOM-free state type in Svelte and bind styles/classes via props. +- `src/menu-renderer/menu-theme.ts`: keep semantics of `loadDescription`, `setColors`, `setChildProperties`, `setCenterProperties` but perform them through Svelte refs and our `theme-loader` instead of imperative DOM creation. +- `src/menu-renderer/selection-wedges.ts`, `wedge-separators.ts`: implemented as `SelectionWedges.svelte` and `WedgeSeparators.svelte`. +- `src/common/icon-themes/*`, `icon-theme-registry.ts`: relies on `window.commonAPI` and system/file icon packs. We expose a web `IconResolver` that supports Material Symbols and Simple Icons; host apps can add resolvers. + +Environment-specific adjustments +- `src/menu-renderer/sound-theme.ts` (`SoundTheme`): original builds `file://` URLs and logs via `window.commonAPI`. In the browser we construct app-relative URLs and guard Howler usage to client-only lifecycle. +- CSS property registration: we keep `CSS.registerProperty` where available and fall back to `document.documentElement.style.setProperty`. + +Why this approach +- Preserves Kando as single source of truth for algorithms and schemas. +- Minimizes drift by importing core logic and only re-expressing DOM and reactivity in Svelte 5. +- Shims are bundler-level and upstream-friendly (no invasive edits to Kando source). --- ## Configuration parity with Kando (config.json, menus.json) From beec41a45d6dc02624b7d0c9a3eac9446f76330b Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Sun, 5 Oct 2025 19:38:05 +0200 Subject: [PATCH 06/20] integrated kando-svelte-demo with kando-svelte, made hover demo --- kando-svelte-demo/.gitignore | 23 - kando-svelte-demo/.npmrc | 1 - kando-svelte-demo/.prettierignore | 9 - kando-svelte-demo/.prettierrc | 15 - kando-svelte-demo/README.md | 55 - kando-svelte-demo/eslint.config.js | 4 - kando-svelte-demo/package-lock.json | 3493 ----------------- kando-svelte-demo/package.json | 39 - kando-svelte-demo/src/app.d.ts | 13 - kando-svelte-demo/src/app.html | 11 - kando-svelte-demo/src/lib/assets/favicon.svg | 1 - kando-svelte-demo/src/lib/index.ts | 1 - kando-svelte-demo/src/routes/+layout.svelte | 11 - kando-svelte-demo/src/routes/+page.svelte | 102 - .../menu-themes/default/REUSE.toml | 10 - .../menu-themes/default/preview.jpg | Bin 80764 -> 0 bytes .../menu-themes/default/theme.css | 196 - .../menu-themes/default/theme.json5 | 47 - .../kando-vendor/sound-themes/none/theme.json | 10 - kando-svelte-demo/static/robots.txt | 3 - kando-svelte-demo/svelte.config.js | 17 - kando-svelte-demo/tsconfig.json | 19 - kando-svelte-demo/vite.config.ts | 6 - kando-svelte/package-lock.json | 12 +- kando-svelte/package.json | 8 +- kando-svelte/src/app.html | 3 + .../src/lib/MenuOutline.svelte | 0 kando-svelte/src/lib/PieMenu.svelte | 93 +- kando-svelte/src/lib/WedgeSeparators.svelte | 14 + kando-svelte/src/lib/index.ts | 1 + kando-svelte/src/routes/+layout.svelte | 7 + kando-svelte/src/routes/+page.svelte | 149 +- .../static/kando/config.json | 0 .../static/kando/icon-themes | 0 .../static/kando/menu-themes | 0 .../static/kando/menus.json | 0 .../static/kando/sound-themes | 0 kando-svelte/svelte.config.js | 5 +- notes/kando-svelte.md | 14 +- package-lock.json | 50 +- package.json | 4 +- src/common/math/index.d.ts | 152 + 42 files changed, 442 insertions(+), 4156 deletions(-) delete mode 100644 kando-svelte-demo/.gitignore delete mode 100644 kando-svelte-demo/.npmrc delete mode 100644 kando-svelte-demo/.prettierignore delete mode 100644 kando-svelte-demo/.prettierrc delete mode 100644 kando-svelte-demo/README.md delete mode 100644 kando-svelte-demo/eslint.config.js delete mode 100644 kando-svelte-demo/package-lock.json delete mode 100644 kando-svelte-demo/package.json delete mode 100644 kando-svelte-demo/src/app.d.ts delete mode 100644 kando-svelte-demo/src/app.html delete mode 100644 kando-svelte-demo/src/lib/assets/favicon.svg delete mode 100644 kando-svelte-demo/src/lib/index.ts delete mode 100644 kando-svelte-demo/src/routes/+layout.svelte delete mode 100644 kando-svelte-demo/src/routes/+page.svelte delete mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml delete mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/preview.jpg delete mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.css delete mode 100644 kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 delete mode 100644 kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json delete mode 100644 kando-svelte-demo/static/robots.txt delete mode 100644 kando-svelte-demo/svelte.config.js delete mode 100644 kando-svelte-demo/tsconfig.json delete mode 100644 kando-svelte-demo/vite.config.ts rename {kando-svelte-demo => kando-svelte}/src/lib/MenuOutline.svelte (100%) create mode 100644 kando-svelte/src/lib/WedgeSeparators.svelte create mode 100644 kando-svelte/src/routes/+layout.svelte rename {kando-svelte-demo => kando-svelte}/static/kando/config.json (100%) rename {kando-svelte-demo => kando-svelte}/static/kando/icon-themes (100%) rename {kando-svelte-demo => kando-svelte}/static/kando/menu-themes (100%) rename {kando-svelte-demo => kando-svelte}/static/kando/menus.json (100%) rename {kando-svelte-demo => kando-svelte}/static/kando/sound-themes (100%) create mode 100644 src/common/math/index.d.ts diff --git a/kando-svelte-demo/.gitignore b/kando-svelte-demo/.gitignore deleted file mode 100644 index 3b462cb0c..000000000 --- a/kando-svelte-demo/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -node_modules - -# Output -.output -.vercel -.netlify -.wrangler -/.svelte-kit -/build - -# OS -.DS_Store -Thumbs.db - -# Env -.env -.env.* -!.env.example -!.env.test - -# Vite -vite.config.js.timestamp-* -vite.config.ts.timestamp-* diff --git a/kando-svelte-demo/.npmrc b/kando-svelte-demo/.npmrc deleted file mode 100644 index b6f27f135..000000000 --- a/kando-svelte-demo/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/kando-svelte-demo/.prettierignore b/kando-svelte-demo/.prettierignore deleted file mode 100644 index 7d74fe246..000000000 --- a/kando-svelte-demo/.prettierignore +++ /dev/null @@ -1,9 +0,0 @@ -# Package Managers -package-lock.json -pnpm-lock.yaml -yarn.lock -bun.lock -bun.lockb - -# Miscellaneous -/static/ diff --git a/kando-svelte-demo/.prettierrc b/kando-svelte-demo/.prettierrc deleted file mode 100644 index 3f7802c37..000000000 --- a/kando-svelte-demo/.prettierrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] -} diff --git a/kando-svelte-demo/README.md b/kando-svelte-demo/README.md deleted file mode 100644 index 5d86b0571..000000000 --- a/kando-svelte-demo/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# kando-svelte-demo (SvelteKit app) - -Single-page demo that loads a static Kando snapshot (config.json, menus.json, themes/sounds) and renders: -- A summary of config and theme metadata -- A recursive outline of all menus and items -- (future) The `PieMenu` component from `kando-svelte` for interactive previews - -What it is -- A minimal SvelteKit app to validate data loading and rendering using the kando-svelte library. -- Uses JSON5 to parse theme.json5 and Kando’s zod schemata (optional) to validate inputs. - -What it is not -- It does not implement OS-specific item actions (command/file/hotkey/macro/settings). -- It does not ship platform backends. - -Snapshot layout (under `static/`) -``` -static/ - kando/ - config.json - menus.json - menu-themes/ - sound-themes/ - icon-themes/ - kando-vendor/ - menu-themes/default/{ theme.json5, theme.css } - sound-themes/none/theme.json -``` - -Install & run -```bash -cd kando-svelte-demo -npm install -npm run dev -- --open -# or build/preview -npm run build -npm run preview -``` - -Using the library -- The demo depends on the local library via `file:../kando-svelte`. -- Build the library first if you change it: -```bash -cd ../kando-svelte -npm run build -``` - -Icon CSS -- If themes expect icon fonts, include them (e.g., in `src/app.html`): - - Material Symbols Rounded CSS (Google Fonts) or `material-symbols` npm package. - - `simple-icons-font` for Simple Icons. - -Notes -- The demo logs key load steps to the console to aid debugging. -- For production, copy assets into `static/` (symlinks may not survive packaging). diff --git a/kando-svelte-demo/eslint.config.js b/kando-svelte-demo/eslint.config.js deleted file mode 100644 index e02473646..000000000 --- a/kando-svelte-demo/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import prettier from 'eslint-config-prettier'; -import svelte from 'eslint-plugin-svelte'; - -export default [prettier, ...svelte.configs.prettier]; diff --git a/kando-svelte-demo/package-lock.json b/kando-svelte-demo/package-lock.json deleted file mode 100644 index 0b8554f72..000000000 --- a/kando-svelte-demo/package-lock.json +++ /dev/null @@ -1,3493 +0,0 @@ -{ - "name": "kando-svelte-demo", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "kando-svelte-demo", - "version": "0.0.1", - "dependencies": { - "json5": "^2.2.3", - "kando-svelte": "file:../kando-svelte" - }, - "devDependencies": { - "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.36.0", - "@sveltejs/adapter-auto": "^6.1.0", - "@sveltejs/kit": "^2.43.2", - "@sveltejs/vite-plugin-svelte": "^6.2.0", - "@types/node": "^20", - "eslint": "^9.36.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.12.4", - "globals": "^16.4.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.39.5", - "svelte-check": "^4.3.2", - "typescript": "^5.9.2", - "typescript-eslint": "^8.44.1", - "vite": "^7.1.7" - } - }, - "../kando-svelte": { - "version": "0.0.1", - "devDependencies": { - "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.36.0", - "@sveltejs/adapter-auto": "^6.1.0", - "@sveltejs/kit": "^2.43.2", - "@sveltejs/package": "^2.5.4", - "@sveltejs/vite-plugin-svelte": "^6.2.0", - "@types/node": "^20", - "eslint": "^9.36.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.12.4", - "globals": "^16.4.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "publint": "^0.3.13", - "svelte": "^5.39.5", - "svelte-check": "^4.3.2", - "typescript": "^5.9.2", - "typescript-eslint": "^8.44.1", - "vite": "^7.1.7" - }, - "peerDependencies": { - "svelte": "^5.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", - "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", - "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", - "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", - "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", - "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", - "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", - "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", - "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", - "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", - "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", - "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", - "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", - "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", - "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", - "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", - "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", - "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", - "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", - "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", - "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", - "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", - "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", - "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", - "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", - "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/compat": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.0.tgz", - "integrity": "sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^8.40 || 9" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz", - "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-6.1.1.tgz", - "integrity": "sha512-cBNt4jgH4KuaNO5gRSB2CZKkGtz+OCZ8lPjRQGjhvVUD4akotnj2weUia6imLl2v07K3IgsQRyM36909miSwoQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.43.8", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.43.8.tgz", - "integrity": "sha512-z21dG8W4g6XtAnK8bMpaSahtPOV6JVhghhco1+GR4H39XEgIxrjIpRoT1Js84c7TmhBzbTkVpZVVPFNNPFsXkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/cookie": "^0.6.0", - "acorn": "^8.14.1", - "cookie": "^0.6.0", - "devalue": "^5.3.2", - "esm-env": "^1.2.2", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "mrmime": "^2.0.0", - "sade": "^1.8.1", - "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0" - }, - "bin": { - "svelte-kit": "svelte-kit.js" - }, - "engines": { - "node": ">=18.13" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - } - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", - "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", - "debug": "^4.4.1", - "deepmerge": "^4.3.1", - "magic-string": "^0.30.17", - "vitefu": "^1.1.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz", - "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.1" - }, - "engines": { - "node": "^20.19 || ^22.12 || >=24" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", - "svelte": "^5.0.0", - "vite": "^6.3.0 || ^7.0.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.19.tgz", - "integrity": "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", - "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/type-utils": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.45.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", - "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.45.0.tgz", - "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.45.0", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/devalue": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", - "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", - "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.10", - "@esbuild/android-arm": "0.25.10", - "@esbuild/android-arm64": "0.25.10", - "@esbuild/android-x64": "0.25.10", - "@esbuild/darwin-arm64": "0.25.10", - "@esbuild/darwin-x64": "0.25.10", - "@esbuild/freebsd-arm64": "0.25.10", - "@esbuild/freebsd-x64": "0.25.10", - "@esbuild/linux-arm": "0.25.10", - "@esbuild/linux-arm64": "0.25.10", - "@esbuild/linux-ia32": "0.25.10", - "@esbuild/linux-loong64": "0.25.10", - "@esbuild/linux-mips64el": "0.25.10", - "@esbuild/linux-ppc64": "0.25.10", - "@esbuild/linux-riscv64": "0.25.10", - "@esbuild/linux-s390x": "0.25.10", - "@esbuild/linux-x64": "0.25.10", - "@esbuild/netbsd-arm64": "0.25.10", - "@esbuild/netbsd-x64": "0.25.10", - "@esbuild/openbsd-arm64": "0.25.10", - "@esbuild/openbsd-x64": "0.25.10", - "@esbuild/openharmony-arm64": "0.25.10", - "@esbuild/sunos-x64": "0.25.10", - "@esbuild/win32-arm64": "0.25.10", - "@esbuild/win32-ia32": "0.25.10", - "@esbuild/win32-x64": "0.25.10" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", - "@eslint/plugin-kit": "^0.4.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-svelte": { - "version": "3.12.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.12.4.tgz", - "integrity": "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.6.1", - "@jridgewell/sourcemap-codec": "^1.5.0", - "esutils": "^2.0.3", - "globals": "^16.0.0", - "known-css-properties": "^0.37.0", - "postcss": "^8.4.49", - "postcss-load-config": "^3.1.4", - "postcss-safe-parser": "^7.0.0", - "semver": "^7.6.3", - "svelte-eslint-parser": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": "^8.57.1 || ^9.0.0", - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.0.tgz", - "integrity": "sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kando-svelte": { - "resolved": "../kando-svelte", - "link": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-svelte": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.0.tgz", - "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "prettier": "^3.0.0", - "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sirv": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", - "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svelte": { - "version": "5.39.8", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.39.8.tgz", - "integrity": "sha512-KfZ3hCITdxIXTOvrea4nFZX2o+47HPTChKeocgj9BwJQYqWrviVCcPj4boXHF5yf8+eBKqhHY8xii//XaakKXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "esm-env": "^1.2.1", - "esrap": "^2.1.0", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/svelte-check": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.2.tgz", - "integrity": "sha512-71udP5w2kaSTcX8iV0hn3o2FWlabQHhJTJLIQrCqMsrcOeDUO2VhCQKKCA8AMVHSPwdxLEWkUWh9OKxns5PD9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "chokidar": "^4.0.1", - "fdir": "^6.2.0", - "picocolors": "^1.0.0", - "sade": "^1.7.4" - }, - "bin": { - "svelte-check": "bin/svelte-check" - }, - "engines": { - "node": ">= 18.0.0" - }, - "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", - "typescript": ">=5.0.0" - } - }, - "node_modules/svelte-eslint-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.3.3.tgz", - "integrity": "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.0", - "postcss": "^8.4.49", - "postcss-scss": "^4.0.9", - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "svelte": { - "optional": true - } - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.45.0.tgz", - "integrity": "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.45.0", - "@typescript-eslint/parser": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/utils": "8.45.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.9.tgz", - "integrity": "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitefu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "tests/deps/*", - "tests/projects/*", - "tests/projects/workspace/packages/*" - ], - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "dev": true, - "license": "MIT" - } - } -} diff --git a/kando-svelte-demo/package.json b/kando-svelte-demo/package.json deleted file mode 100644 index a8db0103f..000000000 --- a/kando-svelte-demo/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "kando-svelte-demo", - "private": true, - "version": "0.0.1", - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "format": "prettier --write .", - "lint": "prettier --check . && eslint ." - }, - "dependencies": { - "json5": "^2.2.3", - "kando-svelte": "file:../kando-svelte" - }, - "devDependencies": { - "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.36.0", - "@sveltejs/adapter-auto": "^6.1.0", - "@sveltejs/kit": "^2.43.2", - "@sveltejs/vite-plugin-svelte": "^6.2.0", - "@types/node": "^20", - "eslint": "^9.36.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.12.4", - "globals": "^16.4.0", - "prettier": "^3.6.2", - "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.39.5", - "svelte-check": "^4.3.2", - "typescript": "^5.9.2", - "typescript-eslint": "^8.44.1", - "vite": "^7.1.7" - } -} diff --git a/kando-svelte-demo/src/app.d.ts b/kando-svelte-demo/src/app.d.ts deleted file mode 100644 index da08e6da5..000000000 --- a/kando-svelte-demo/src/app.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -// See https://svelte.dev/docs/kit/types#app.d.ts -// for information about these interfaces -declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface PageState {} - // interface Platform {} - } -} - -export {}; diff --git a/kando-svelte-demo/src/app.html b/kando-svelte-demo/src/app.html deleted file mode 100644 index f273cc58f..000000000 --- a/kando-svelte-demo/src/app.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - %sveltekit.head% - - -
    %sveltekit.body%
    - - diff --git a/kando-svelte-demo/src/lib/assets/favicon.svg b/kando-svelte-demo/src/lib/assets/favicon.svg deleted file mode 100644 index cc5dc66a3..000000000 --- a/kando-svelte-demo/src/lib/assets/favicon.svg +++ /dev/null @@ -1 +0,0 @@ -svelte-logo \ No newline at end of file diff --git a/kando-svelte-demo/src/lib/index.ts b/kando-svelte-demo/src/lib/index.ts deleted file mode 100644 index 856f2b6c3..000000000 --- a/kando-svelte-demo/src/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -// place files you want to import through the `$lib` alias in this folder. diff --git a/kando-svelte-demo/src/routes/+layout.svelte b/kando-svelte-demo/src/routes/+layout.svelte deleted file mode 100644 index 20f8d044f..000000000 --- a/kando-svelte-demo/src/routes/+layout.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -{@render children?.()} diff --git a/kando-svelte-demo/src/routes/+page.svelte b/kando-svelte-demo/src/routes/+page.svelte deleted file mode 100644 index d22dc38e0..000000000 --- a/kando-svelte-demo/src/routes/+page.svelte +++ /dev/null @@ -1,102 +0,0 @@ - - -{#if error} -

    {error}

    -{/if} - -{#if config} -

    Config

    -
    {JSON.stringify(config, null, 2)}
    -{/if} - -{#if theme} -

    Theme

    -
      -
    • id: {theme.id}
    • -
    • name: {theme.name}
    • -
    • engineVersion: {theme.engineVersion}
    • -
    • layers: {theme.layers.length}
    • -
    -{/if} - -{#if menuSettings} -

    Menus (version {menuSettings.version})

    -
      - {#each menuSettings.menus as m: MenuV1, i} -
    • - {m.root?.name ?? `Menu ${i+1}`} -
        - {#if m.shortcut}
      • shortcut: {m.shortcut}
      • {/if} - {#if m.shortcutID}
      • shortcutID: {m.shortcutID}
      • {/if} -
      • centered: {String(m.centered ?? false)}
      • -
      • anchored: {String(m.anchored ?? false)}
      • -
      • hoverMode: {String(m.hoverMode ?? false)}
      • - {#if m.tags?.length} -
      • tags: {m.tags.join(', ')}
      • - {/if} -
      • outline: - {#if m.root} -
          - -
        - {:else} - no root - {/if} -
      • -
      -
    • - {/each} -
    -{:else} -

    Loading menus…

    -{/if} diff --git a/kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml b/kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml deleted file mode 100644 index d5a6373ff..000000000 --- a/kando-svelte-demo/static/kando-vendor/menu-themes/default/REUSE.toml +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-FileCopyrightText: Simon Schneegans -# SPDX-License-Identifier: CC0-1.0 - -version = 1 - -[[annotations]] -path = "preview.jpg" -precedence = "aggregate" -SPDX-FileCopyrightText = "Simon Schneegans " -SPDX-License-Identifier = "CC0-1.0" \ No newline at end of file diff --git a/kando-svelte-demo/static/kando-vendor/menu-themes/default/preview.jpg b/kando-svelte-demo/static/kando-vendor/menu-themes/default/preview.jpg deleted file mode 100644 index 7ce3ce68c10e954a35bcc08c6d5e3349b21686ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80764 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 */ -/* SPDX-License-Identifier: CC0-1.0 */ - -.menu-node { - --child-distance: 100px; - --grandchild-distance: 25px; - - --center-size: 100px; - --child-size: 50px; - --grandchild-size: 15px; - --connector-width: 10px; - - --menu-transition: all 250ms cubic-bezier(0.775, 1.325, 0.535, 1); - --opacity-transition: opacity 250ms ease; - - transition: var(--menu-transition); - - /* Positioning ---------------------------------------------------------------------- */ - - /* Child items are positioned around the active node. */ - &.child { - transform: translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), - calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); - } - - /* Grandchild items are positioned around the child items. */ - &.grandchild { - transform: translate(calc(var(--grandchild-distance) * var(--dir-x)), - calc(var(--grandchild-distance) * var(--dir-y))); - } - - /* If there is a hovered child node, we scale all children up a bit to create a cool - zoom effect. The hovered child itself is scaled up even more. */ - &.active:has(.hovered)>.child { - transform: scale(calc(1.15 - pow(var(--angle-diff) / 180, 0.25) * 0.15)) translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), - calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); - - &.hovered { - transform: scale(1.15) translate(calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-x)), - calc(max(var(--child-distance), 10px * var(--sibling-count)) * var(--dir-y))); - } - } - - - /* Theme Layers --------------------------------------------------------------------- */ - - /* This theme comes with only one layer. This contains the icon of the menu item. */ - - /* We hide all icons by default. They will be shown further down in this file for the - center item and the child items. */ - .icon-container { - opacity: 0; - color: var(--text-color); - transition: var(--opacity-transition); - margin: 5%; - width: 90% !important; - height: 90% !important; - border-radius: 50%; - overflow: hidden; - } - - /* All menu items have a border and are circles in this theme. */ - .icon-layer { - position: absolute; - border-radius: 50%; - border: 1px solid var(--border-color); - transition: var(--menu-transition); - } - - /* The active menu item is the center of the menu. */ - &.active>.icon-layer { - top: calc(-1 * var(--center-size) / 2); - left: calc(-1 * var(--center-size) / 2); - width: var(--center-size); - height: var(--center-size); - background-color: var(--background-color); - box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); - } - - /* If the center item has a hovered child node, we scale it up and hide its icon. */ - &.active:has(>.hovered)>.icon-layer { - transform: scale(1.1); - - &>.icon-container { - opacity: 0; - } - } - - /* If the center node is hovered, we want to highlight it. */ - &.active.hovered>.icon-layer { - background-color: var(--hover-color); - } - - /* If the parent or a child node is clicked, we scale it down to normal size. */ - &.parent.hovered.clicked>.icon-layer, - &.child.hovered.clicked>.icon-layer { - transform: scale(0.95); - } - - /* If the center node is clicked, we scale it down a bit. */ - &.active.hovered.clicked>.icon-layer { - transform: scale(0.95); - } - - /* Show the icons of the center, parent and child items. */ - &.parent>.icon-layer>.icon-container, - &.child>.icon-layer>.icon-container, - &.active>.icon-layer>.icon-container { - opacity: 1; - } - - /* Child items are displayed around the active node. The parent node of the active - node is displayed in a similar style. */ - &.parent>.icon-layer, - &.child>.icon-layer { - top: calc(-1 * var(--child-size) / 2); - left: calc(-1 * var(--child-size) / 2); - width: var(--child-size); - height: var(--child-size); - background-color: var(--background-color); - box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); - - } - - /* Hovered child or parent items are highlighted. */ - &.parent.hovered>.icon-layer, - &.child.hovered>.icon-layer { - background-color: var(--hover-color); - } - - /* Grandchild items are very small and drawn below the child items. */ - &.grandchild>.icon-layer { - top: calc(-1 * var(--grandchild-size) / 2); - left: calc(-1 * var(--grandchild-size) / 2); - width: var(--grandchild-size); - height: var(--grandchild-size); - background-color: var(--border-color); - } - - /* We disable any transition for dragged items. */ - &.dragged { - transition: none; - } - - /* Connectors ----------------------------------------------------------------------- */ - - .connector { - transition: var(--menu-transition); - height: var(--connector-width); - background-color: var(--border-color); - top: calc(-1 * var(--connector-width) / 2); - } - - &:has(.dragged)>.connector { - transition: none; - } - - &.hovered>.connector { - background-color: color-mix(in srgb, var(--hover-color) 50%, var(--border-color)); - } - - &.active>.connector { - background-color: var(--hover-color); - } -} - -/* Center Text ------------------------------------------------------------------------ */ - -.center-text { - color: var(--text-color); - transition: var(--opacity-transition); - font-size: 16px; - line-height: 22px; -} - -/* Selection Wedges ------------------------------------------------------------------- */ - -.selection-wedges { - mask: radial-gradient(circle at var(--center-x) var(--center-y), black 100px, transparent 50%); - - &.hovered { - --width: calc(var(--end-angle) - var(--start-angle)); - background: conic-gradient(from calc(var(--start-angle)) at var(--center-x) var(--center-y), - var(--wedge-highlight-color) var(--width), - var(--wedge-color) var(--width)); - } - - background: var(--wedge-color); -} \ No newline at end of file diff --git a/kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 b/kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 deleted file mode 100644 index 66a41a681..000000000 --- a/kando-svelte-demo/static/kando-vendor/menu-themes/default/theme.json5 +++ /dev/null @@ -1,47 +0,0 @@ -////////////////////////////////////////////////////////////////////////////////////////// -// _ _ ____ _ _ ___ ____ // -// |_/ |__| |\ | | \ | | This file belongs to Kando, the cross-platform // -// | \_ | | | \| |__/ |__| pie menu. Read more on github.com/kando-menu/kando // -// // -////////////////////////////////////////////////////////////////////////////////////////// - -// SPDX-FileCopyrightText: Simon Schneegans -// SPDX-License-Identifier: CC0-1.0 - -{ - name: 'Default', - author: 'Simon Schneegans', - license: 'CC0-1.0', - themeVersion: '1.0', - - // This theme was created for Kando's theme engine version 1. Kando will use this to - // check if the theme is compatible with the current version of Kando. - engineVersion: 1, - - // When a menu is opened too close to a screen's edge, it is moved away from the edge - // by this amount of pixels. - maxMenuRadius: 160, - - // The width at which the center text is wrapped. - centerTextWrapWidth: 95, - - // This theme draws child items below their parent items. - drawChildrenBelow: true, - - // Draw the thin lines between adjacent menu items. - drawSelectionWedges: true, - - // These colors can be configured by the user and are vailable in the CSS file as CSS - // variables. The default values are used if the user does not provide any values. - colors: { - 'background-color': 'rgb(255, 255, 255)', - 'text-color': 'rgb(60, 60, 60)', - 'border-color': 'rgb(109, 109, 109)', - 'hover-color': 'rgb(255, 200, 200)', - 'wedge-highlight-color': 'rgba(0, 0, 0, 0.1)', - 'wedge-color': 'rgba(0, 0, 0, 0.2)', - }, - - // This theme is very simple and only uses one layer for the menu items. - layers: [{ class: 'icon-layer', content: 'icon' }], -} diff --git a/kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json b/kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json deleted file mode 100644 index 420ae4b25..000000000 --- a/kando-svelte-demo/static/kando-vendor/sound-themes/none/theme.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "none", - "name": "None", - "directory": "/kando-vendor/sound-themes", - "engineVersion": 1, - "themeVersion": "1.0.0", - "author": "Kando", - "license": "CC0-1.0", - "sounds": {} -} diff --git a/kando-svelte-demo/static/robots.txt b/kando-svelte-demo/static/robots.txt deleted file mode 100644 index b6dd6670c..000000000 --- a/kando-svelte-demo/static/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# allow crawling everything by default -User-agent: * -Disallow: diff --git a/kando-svelte-demo/svelte.config.js b/kando-svelte-demo/svelte.config.js deleted file mode 100644 index a0133e6e9..000000000 --- a/kando-svelte-demo/svelte.config.js +++ /dev/null @@ -1,17 +0,0 @@ -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - // Consult https://svelte.dev/docs/kit/integrations - // for more information about preprocessors - preprocess: vitePreprocess(), - kit: { - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://svelte.dev/docs/kit/adapters for more information about adapters. - adapter: adapter() - } -}; - -export default config; diff --git a/kando-svelte-demo/tsconfig.json b/kando-svelte-demo/tsconfig.json deleted file mode 100644 index a5567ee6b..000000000 --- a/kando-svelte-demo/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "moduleResolution": "bundler" - } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // To make changes to top-level options such as include and exclude, we recommend extending - // the generated config; see https://svelte.dev/docs/kit/configuration#typescript -} diff --git a/kando-svelte-demo/vite.config.ts b/kando-svelte-demo/vite.config.ts deleted file mode 100644 index bbf8c7da4..000000000 --- a/kando-svelte-demo/vite.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; - -export default defineConfig({ - plugins: [sveltekit()] -}); diff --git a/kando-svelte/package-lock.json b/kando-svelte/package-lock.json index 2deeff4d0..00217a509 100644 --- a/kando-svelte/package-lock.json +++ b/kando-svelte/package-lock.json @@ -8,7 +8,8 @@ "name": "kando-svelte", "version": "0.0.1", "dependencies": { - "json5": "^2.2.3" + "json5": "^2.2.3", + "zod": "^3.25.76" }, "devDependencies": { "@eslint/compat": "^1.4.0", @@ -3555,6 +3556,15 @@ "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", "dev": true, "license": "MIT" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/kando-svelte/package.json b/kando-svelte/package.json index a4f4582c5..b8fc7b90e 100644 --- a/kando-svelte/package.json +++ b/kando-svelte/package.json @@ -2,8 +2,9 @@ "name": "kando-svelte", "version": "0.0.1", "scripts": { - "dev": "vite dev", - "build": "vite build && npm run prepack", + "dev": "vite dev", + "build": "npm run prepack", + "build:demo": "vite build", "preview": "vite preview", "prepare": "svelte-kit sync || echo ''", "prepack": "svelte-kit sync && svelte-package && publint", @@ -57,6 +58,7 @@ "svelte" ], "dependencies": { - "json5": "^2.2.3" + "json5": "^2.2.3", + "zod": "^3.25.76" } } diff --git a/kando-svelte/src/app.html b/kando-svelte/src/app.html index ed39a5af8..d982b8e94 100644 --- a/kando-svelte/src/app.html +++ b/kando-svelte/src/app.html @@ -4,6 +4,9 @@ + + + %sveltekit.head% diff --git a/kando-svelte-demo/src/lib/MenuOutline.svelte b/kando-svelte/src/lib/MenuOutline.svelte similarity index 100% rename from kando-svelte-demo/src/lib/MenuOutline.svelte rename to kando-svelte/src/lib/MenuOutline.svelte diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte index 608cbafd1..05d3615de 100644 --- a/kando-svelte/src/lib/PieMenu.svelte +++ b/kando-svelte/src/lib/PieMenu.svelte @@ -1,7 +1,8 @@ -
    - -
    PieMenu placeholder
    +
    + +
    + {#if root?.children?.length} + Hovered: {hoveredIndex >= 0 ? root.children[hoveredIndex]?.name : 'center'} + {:else} + PieMenu placeholder + {/if} +
    diff --git a/kando-svelte/src/routes/+page.svelte b/kando-svelte/src/routes/+page.svelte index 13f2315b5..0d9904adb 100644 --- a/kando-svelte/src/routes/+page.svelte +++ b/kando-svelte/src/routes/+page.svelte @@ -82,26 +82,6 @@

    {error}

    {/if} -{#if config} -

    Config

    -
    {JSON.stringify(config, null, 2)}
    -{/if} - -{#if theme} -

    Theme

    -
      -
    • id: {theme.id}
    • -
    • name: {theme.name}
    • -
    • engineVersion: {theme.engineVersion}
    • -
    • layers: {theme.layers.length}
    • -
    - {#if mathPreview.angles} -

    Math quick test

    -

    First menu child angles: {mathPreview.angles?.map((a) => a.toFixed(1)).join(', ')}

    -

    Wedges: {mathPreview.wedges?.map((w) => `${w.start.toFixed(1)}–${w.end.toFixed(1)}`).join(' | ')}

    - {/if} -{/if} - {#if theme && firstRoot}

    Interactive PieMenu preview

    @@ -141,6 +121,26 @@ {/each} + {#if config} +

    Config

    +
    {JSON.stringify(config, null, 2)}
    +{/if} + +{#if theme} +

    Theme

    +
      +
    • id: {theme.id}
    • +
    • name: {theme.name}
    • +
    • engineVersion: {theme.engineVersion}
    • +
    • layers: {theme.layers.length}
    • +
    + {#if mathPreview.angles} +

    Math quick test

    +

    First menu child angles: {mathPreview.angles?.map((a) => a.toFixed(1)).join(', ')}

    +

    Wedges: {mathPreview.wedges?.map((w) => `${w.start.toFixed(1)}–${w.end.toFixed(1)}`).join(' | ')}

    + {/if} +{/if} + {:else}

    Loading menus…

    {/if} From 03deb4adfd0d927cf278a42694f8c8156c8314be Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Tue, 7 Oct 2025 22:58:30 +0200 Subject: [PATCH 08/20] added interactive pie menu layout and tracking test to the demo --- kando-svelte/src/lib/PieMenu.svelte | 69 ++++++++++++++++------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte index ed083bf1d..9a847011c 100644 --- a/kando-svelte/src/lib/PieMenu.svelte +++ b/kando-svelte/src/lib/PieMenu.svelte @@ -1,7 +1,9 @@ -
    + From f4619e1fa9df57ce346d92c1f664ca4f77ca2c9e Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Tue, 7 Oct 2025 23:16:27 +0200 Subject: [PATCH 09/20] demo clean up --- kando-svelte/src/lib/MenuOutline.svelte | 4 +- kando-svelte/src/lib/PieMenu.svelte | 55 ++++++++++++++----------- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/kando-svelte/src/lib/MenuOutline.svelte b/kando-svelte/src/lib/MenuOutline.svelte index ad9aaed09..efb4ae755 100644 --- a/kando-svelte/src/lib/MenuOutline.svelte +++ b/kando-svelte/src/lib/MenuOutline.svelte @@ -4,7 +4,9 @@
  • - {item.name} ({item.type}{item.angle != null ? ` @ ${item.angle}°` : ''}) + {item.name} ({item.type}{item.angle != null ? ` @ ${item.angle}°` : ''} + {item.icon ? `, icon: ${item.icon}` : ''} + {item.iconTheme ? `, theme: ${item.iconTheme}` : ''}) {#if item.children?.length}
      {#each item.children as c} diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte index 9a847011c..dee36956e 100644 --- a/kando-svelte/src/lib/PieMenu.svelte +++ b/kando-svelte/src/lib/PieMenu.svelte @@ -34,6 +34,9 @@ let nodeStyles: string[] = []; let separatorAngles: number[] = []; let parentCenterAngle: number | null = null; + $: centerLabel = hoveredIndex >= 0 + ? (currentItem?.children?.[hoveredIndex] as any)?.name + : (hoveredIndex === -2 ? 'parent' : 'center'); let currentItem: MenuItem | null = null; let chain: Array<{ item: MenuItem; angle?: number; index?: number }> = []; let lastHoveredPath: string | null = null; @@ -298,9 +301,8 @@ return `left:${xi}px; top:${yi}px; transform: translate(-50%, -50%);`; } - function parentTriangleStyle() { - if (parentCenterAngle == null) return ''; - return `transform: rotate(${-parentCenterAngle}deg);`; + function parentNodeStyle() { + return parentMarkerStyle(); } function logDomPositions(tag: string) { @@ -320,6 +322,16 @@ console.log(`[pie] dom-positions ${tag} -> ${rows.join(' | ')}`); } + // Best-effort icon URL guesser for non-font themes (e.g., file or system); in Electron + // Kando resolves via icon themes. For the demo, try a few common locations by convention. + function guessIconUrl(theme: string | undefined, icon: string | undefined): string { + if (!theme || !icon) return ''; + // Simple heuristic: look in static assets shipped with the demo + // e.g., /kando/icon-themes//.svg + const base = '/kando/icon-themes'; + return `${base}/${theme}/${icon}.svg`; + } + // Labels: upright, no rotation function onKeydown(e: KeyboardEvent) { @@ -330,13 +342,12 @@ +{/snippet} + +{#snippet RenderChildren()} + {#each item?.children ?? [] as c, i} + + {/each} +{/snippet} + +{#snippet CenterContent()} + {#if !drawChildrenBelow} + {@render RenderChildren()} + {/if} + +{/snippet} + +
      + + = 0 ? childAngles[hoveredIndex] : (parentAngle != null ? (parentAngle + 180) % 360 : null)} + parentHovered={hoverIndex === -2} + transformStyle={`translate(${center.x}px, ${center.y}px)`} + childDistancePx={radiusPx} + dataPath={'/'} + dataLevel={0} + layers={layers ?? [{ class: 'icon-layer' }]} + connectorStyle={connectorStyle} + below={drawChildrenBelow ? RenderChildren : null} + content={CenterContent} + > + + + +
      diff --git a/kando-svelte/src/lib/PieMenuDemo.svelte b/kando-svelte/src/lib/PieMenuDemo.svelte new file mode 100644 index 000000000..39c8baab0 --- /dev/null +++ b/kando-svelte/src/lib/PieMenuDemo.svelte @@ -0,0 +1,390 @@ + + + + + diff --git a/kando-svelte/src/lib/PieTree.svelte b/kando-svelte/src/lib/PieTree.svelte new file mode 100644 index 000000000..41b094556 --- /dev/null +++ b/kando-svelte/src/lib/PieTree.svelte @@ -0,0 +1,221 @@ + + +
      + + {#if chain.length} + + {/if} + + + {#key chain.join(',')} + + {/key} +
      + + + + + + diff --git a/kando-svelte/src/lib/WedgeSeparators.svelte b/kando-svelte/src/lib/WedgeSeparators.svelte index 4d15999aa..47c1e62d0 100644 --- a/kando-svelte/src/lib/WedgeSeparators.svelte +++ b/kando-svelte/src/lib/WedgeSeparators.svelte @@ -1,14 +1,35 @@ - - + + + diff --git a/kando-svelte/src/lib/context.ts b/kando-svelte/src/lib/context.ts new file mode 100644 index 000000000..1117a1477 --- /dev/null +++ b/kando-svelte/src/lib/context.ts @@ -0,0 +1,29 @@ +import type { Vec2 } from './types'; +import type { MenuItem } from './types'; + +export type IndexPath = number[]; + +export type PointerInfo = { dx: number; dy: number; angle: number; distance: number } | null; + +export type PieTreeContext = { + getChain(): IndexPath; + getCenter(): Vec2; + getRadius(): number; + getPointer(): PointerInfo; + hoverIndex(): number; + select(index: number): void; + back(): void; + resolve(path: IndexPath): MenuItem | null; +}; + +export const PIE_TREE_CTX: unique symbol = Symbol('pie-tree'); + +export type PieMenuContext = { + item: MenuItem; + indexPath: IndexPath; + parentItem: MenuItem | null; +}; + +export const PIE_MENU_CTX: unique symbol = Symbol('pie-menu'); + + diff --git a/kando-svelte/src/lib/index.ts b/kando-svelte/src/lib/index.ts index 2baaf89f0..caada67e4 100644 --- a/kando-svelte/src/lib/index.ts +++ b/kando-svelte/src/lib/index.ts @@ -1,4 +1,8 @@ +export { default as PieMenuDemo } from './PieMenuDemo.svelte'; export { default as PieMenu } from './PieMenu.svelte'; +export { default as PieTree } from './PieTree.svelte'; +export { default as CenterText } from './CenterText.svelte'; +// WedgeSeparators and SelectionWedges are internal debug tools; not exported by default export { default as PieItem } from './PieItem.svelte'; export { default as SelectionWedges } from './SelectionWedges.svelte'; export { default as WedgeSeparators } from './WedgeSeparators.svelte'; diff --git a/kando-svelte/src/lib/theme-loader.ts b/kando-svelte/src/lib/theme-loader.ts index fabff42ef..57327c20f 100644 --- a/kando-svelte/src/lib/theme-loader.ts +++ b/kando-svelte/src/lib/theme-loader.ts @@ -2,28 +2,44 @@ import JSON5 from 'json5'; import type { MenuThemeDescription } from './types'; export async function fetchThemeJson(themeDirUrl: string, themeId: string): Promise { - const url = `${themeDirUrl.replace(/\/$/, '')}/${themeId}/theme.json5`; + const base = themeDirUrl.replace(/\/$/, ''); + const url = `${base}/${themeId}/theme.json5`; + return fetchThemeJsonFromUrl(url, { id: themeId, directory: base }); +} + +export async function fetchThemeJsonFromUrl(url: string, overrides?: Partial): Promise { const res = await fetch(url); if (!res.ok) throw new Error(`Failed to load theme: ${url}`); const text = await res.text(); const parsed = JSON5.parse(text); return { ...parsed, - id: themeId, - directory: themeDirUrl.replace(/\/$/, '') + ...overrides, } as MenuThemeDescription; } export function injectThemeCss(theme: MenuThemeDescription): HTMLLinkElement { - const href = `file://${theme.directory}/${theme.id}/theme.css`.replace('file:///', '/'); + const href = `${theme.directory.replace(/\/$/, '')}/${theme.id}/theme.css`; + return injectThemeCssHref(href); +} + +export function injectThemeCssHref(href: string): HTMLLinkElement { + // Remove any previously injected theme link (single active theme) + const old = document.getElementById('kando-theme-current'); + if (old) old.remove(); const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = href; - link.id = `kando-theme-${theme.id}`; + link.id = 'kando-theme-current'; document.head.appendChild(link); return link; } +export function unloadThemeCss() { + const old = document.getElementById('kando-theme-current'); + if (old) old.remove(); +} + export function applyThemeColors(colors: Record) { Object.entries(colors).forEach(([name, value]) => { document.documentElement.style.setProperty(`--${name}`, value); diff --git a/kando-svelte/src/routes/+page.svelte b/kando-svelte/src/routes/+page.svelte index 0d9904adb..d88f311fd 100644 --- a/kando-svelte/src/routes/+page.svelte +++ b/kando-svelte/src/routes/+page.svelte @@ -9,14 +9,29 @@ import { MENU_SETTINGS_SCHEMA_V1 } from '../../../src/common/settings-schemata/menu-settings-v1'; import { z } from 'zod'; import MenuOutline from '$lib/MenuOutline.svelte'; + import PieMenuDemo from '$lib/PieMenuDemo.svelte'; import PieMenu from '$lib/PieMenu.svelte'; + import PieTree from '$lib/PieTree.svelte'; let config: Record | null = null; let menuSettings: MenuSettingsV1 | null = null; let theme: MenuThemeDescription | null = null; + let availableThemes: Array<{ id: string; name?: string }> = []; + let selectedThemeId: string = 'default'; + let availableMenus: Array<{ index: number; name: string; shortcutID: string }> = []; + let selectedMenuIndex = 0; let error: string | null = null; let firstRoot: any = null; let mathPreview: { angles?: number[]; wedges?: { start: number; end: number }[] } = {}; + let popupOpen = false; + let popupCenter = { x: 0, y: 0 }; + let popupRadius = 140; + let popupStartPressed = false; + let popupInitialPointer: { x: number; y: number } | null = null; + let currentItem: any = null; // browsing cursor + let chain: Array<{ item: any; index?: number; angle?: number }> = []; + let mouseeCanvas: HTMLCanvasElement | null = null; + let mouseeCtx: CanvasRenderingContext2D | null = null; async function getJSON(path: string): Promise { console.log('[demo] fetch JSON', path); @@ -47,15 +62,23 @@ const parsedMenus = MENU_SETTINGS_SCHEMA_V1.safeParse(rawMenus); if (parsedMenus.success) { menuSettings = parsedMenus.data; - firstRoot = menuSettings.menus?.[0]?.root ?? null; + } else { + console.warn('[demo] menus invalid', (parsedMenus as any).error?.issues); + menuSettings = rawMenus as any; // fall back to raw for demo flexibility } - else { console.warn('[demo] menus invalid', parsedMenus.error.issues); } - const themeJson = await getJSON5('/kando/menu-themes/default/theme.json5'); - theme = { - ...themeJson, - id: 'default', - directory: '/kando/menu-themes' - }; + availableMenus = (menuSettings?.menus ?? []).map((m: any, i: number) => ({ index: i, name: m.root?.name ?? `Menu ${i+1}`, shortcutID: m.shortcutID ?? '' })); + selectedMenuIndex = 0; + firstRoot = menuSettings?.menus?.[selectedMenuIndex]?.root ?? null; + currentItem = firstRoot; + // load theme list (demo only) + try { + const list = await getJSON<{ themes: Array<{ id: string; name?: string }> }>('api/themes'); + availableThemes = list.themes; + } catch {} + + const themeId = selectedThemeId || 'default'; + const themeJson = await getJSON5(`/kando/menu-themes/${themeId}/theme.json5`); + theme = { ...themeJson, id: themeId, directory: '/kando/menu-themes' }; console.log('[demo] theme loaded', theme?.id, theme?.name, 'layers', theme?.layers.length); // inject theme for demo page if (theme) { @@ -76,6 +99,68 @@ console.log('[demo] onMount end'); } }); + + function initCanvas() { + if (!mouseeCanvas) return; + const dpr = window.devicePixelRatio || 1; + const widthCss = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + const heightCss = 1000; + mouseeCanvas.style.width = `${widthCss}px`; + mouseeCanvas.style.height = `${heightCss}px`; + mouseeCanvas.width = Math.floor(widthCss * dpr); + mouseeCanvas.height = Math.floor(heightCss * dpr); + mouseeCtx = mouseeCanvas.getContext('2d'); + if (mouseeCtx) { + mouseeCtx.setTransform(dpr, 0, 0, dpr, 0, 0); + mouseeCtx.fillStyle = '#f3f3f3'; + mouseeCtx.fillRect(0, 0, widthCss, heightCss); + } + } + + function toCanvasPos(e: PointerEvent) { + const rect = mouseeCanvas!.getBoundingClientRect(); + return { x: e.clientX - rect.left, y: e.clientY - rect.top }; + } + + function openPopupAt(x: number, y: number) { + popupCenter = { x: Math.round(x) + 0.5, y: Math.round(y) + 0.5 }; + popupOpen = true; + popupStartPressed = true; + popupInitialPointer = { x, y }; + currentItem = chain.length ? chain[chain.length-1].item : firstRoot; + } + + function onCanvasDown(e: PointerEvent) { + if (!mouseeCanvas) return; + const p = toCanvasPos(e); + openPopupAt(p.x, p.y); + } + + $: mouseeCanvas && initCanvas(); + + function onKey(e: KeyboardEvent) { + if (!popupOpen) return; + if (e.key === 'Escape') { popupOpen = false; chain = []; } + } + + function onChildHover(path: string) { + // path is like '/i' from PieMenuDemo; for single-level use, we only need the index + } + + function onChildSelect({ detail }: CustomEvent<{ path: string; item: any }>) { + const parts = detail.path.split('/').filter(Boolean); + const idx = Number(parts[parts.length-1]); + const item = currentItem?.children?.[idx]; + if (!item) return; + if (item.children?.length) { + chain.push({ item, index: idx }); + currentItem = item; + } else { + console.log('[demo-popup] select leaf', item?.name); + popupOpen = false; + chain = []; + } + } {#if error} @@ -83,10 +168,38 @@ {/if} {#if theme && firstRoot} +
      + + +
      +

      Popup target

      +
      + + {#if popupOpen && firstRoot} +
      + +
      + {/if} +

      Interactive PieMenu preview

      - console.log('[pie] hover', e.detail.path)} on:select={(e) => console.log('[pie] select', e.detail)} />
      diff --git a/kando-svelte/src/routes/api/themes/+server.ts b/kando-svelte/src/routes/api/themes/+server.ts new file mode 100644 index 000000000..00746c1e1 --- /dev/null +++ b/kando-svelte/src/routes/api/themes/+server.ts @@ -0,0 +1,99 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import { readdir, readFile, stat } from 'fs/promises'; +import path from 'path'; +import JSON5 from 'json5'; + +async function listMenuThemes(): Promise> { + const base = path.resolve('static/kando/menu-themes'); + let entries: any[] = []; + try { entries = await readdir(base, { withFileTypes: true }); } catch {} + const themes: Array<{ id: string; name?: string }> = []; + for (const ent of entries) { + if (!(ent.isDirectory() || ent.isSymbolicLink())) continue; + const id = ent.name; + const file = path.join(base, id, 'theme.json5'); + try { + const st = await stat(file); if (!st.isFile()) continue; + const txt = await readFile(file, 'utf8'); + const parsed: any = JSON5.parse(txt); + themes.push({ id, name: parsed?.name }); + } catch {} + } + // inject vendor default at head + try { + const vendorPath = path.resolve('src/lib/vendor/default-theme.json5'); + const txt = await readFile(vendorPath, 'utf8'); + const parsed: any = JSON5.parse(txt); + if (!themes.find((t) => t.id === 'default')) { + themes.unshift({ id: 'default', name: parsed?.name ?? 'Default' }); + } + } catch { + if (!themes.find((t) => t.id === 'default')) themes.unshift({ id: 'default', name: 'Default' }); + } + return themes; +} + +async function listSoundThemes(): Promise> { + const base = path.resolve('static/kando/sound-themes'); + let entries: any[] = []; + try { entries = await readdir(base, { withFileTypes: true }); } catch {} + const sounds: Array<{ id: string; name?: string }> = []; + for (const ent of entries) { + if (!(ent.isDirectory() || ent.isSymbolicLink())) continue; + const id = ent.name; + const fileJson5 = path.join(base, id, 'theme.json5'); + const fileJson = path.join(base, id, 'theme.json'); + let name: string | undefined; + try { const txt = await readFile(fileJson5, 'utf8'); const parsed: any = JSON5.parse(txt); name = parsed?.name; } + catch { + try { const txt = await readFile(fileJson, 'utf8'); const parsed: any = JSON.parse(txt); name = parsed?.name; } catch {} + } + sounds.push({ id, name }); + } + // vendor none + try { + const txt = await readFile(path.resolve('src/lib/vendor/sounds/none/theme.json'), 'utf8'); + const parsed: any = JSON.parse(txt); + sounds.unshift({ id: 'none', name: parsed?.name ?? 'None' }); + } catch { + sounds.unshift({ id: 'none', name: 'None' }); + } + return sounds; +} + +async function listIconThemes(): Promise> { + const icons: Array<{ id: string; name?: string }> = [] as any; + // Known built-ins + icons.push({ id: 'material-symbols-rounded', name: 'Material Symbols Rounded' }); + icons.push({ id: 'simple-icons', name: 'Simple Icons' }); + // Discover local static icon sets (e.g., kando) + const base = path.resolve('static/kando/icon-themes'); + let entries: any[] = []; + try { entries = await readdir(base, { withFileTypes: true }); } catch {} + for (const ent of entries) { + if (!(ent.isDirectory() || ent.isSymbolicLink())) continue; + const id = ent.name; + if (!icons.find((t) => t.id === id)) icons.push({ id, name: id }); + } + return icons; +} + +export const GET: RequestHandler = async () => { + try { + const [menu, sound, icon] = await Promise.all([ + listMenuThemes(), + listSoundThemes(), + listIconThemes(), + ]); + return new Response(JSON.stringify({ themes: { menu, sound, icon } }), { + headers: { 'content-type': 'application/json' }, + }); + } catch (e) { + return new Response(JSON.stringify({ themes: { menu: [], sound: [], icon: [] }, error: (e as Error).message }), { + status: 500, + headers: { 'content-type': 'application/json' }, + }); + } +}; + + diff --git a/kando-svelte/static/kando/menu-themes b/kando-svelte/static/kando/menu-themes deleted file mode 120000 index 10a131717..000000000 --- a/kando-svelte/static/kando/menu-themes +++ /dev/null @@ -1 +0,0 @@ -../../../assets/menu-themes \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/clean-circle b/kando-svelte/static/kando/menu-themes/clean-circle new file mode 120000 index 000000000..06ad50718 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/clean-circle @@ -0,0 +1 @@ +../../../../assets/menu-themes/clean-circle \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/default b/kando-svelte/static/kando/menu-themes/default new file mode 120000 index 000000000..74699cfc8 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/default @@ -0,0 +1 @@ +../../../../assets/menu-themes/default \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/evntech-vache b/kando-svelte/static/kando/menu-themes/evntech-vache new file mode 120000 index 000000000..c8fd89830 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/evntech-vache @@ -0,0 +1 @@ +../../../../../menu-themes/themes/evntech-vache \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/hexperiment b/kando-svelte/static/kando/menu-themes/hexperiment new file mode 120000 index 000000000..3b8725b87 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/hexperiment @@ -0,0 +1 @@ +../../../../../menu-themes/themes/hexperiment \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/knight-forge b/kando-svelte/static/kando/menu-themes/knight-forge new file mode 120000 index 000000000..73afc67de --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/knight-forge @@ -0,0 +1 @@ +../../../../../menu-themes/themes/knight-forge \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/minecraft b/kando-svelte/static/kando/menu-themes/minecraft new file mode 120000 index 000000000..266cd8515 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/minecraft @@ -0,0 +1 @@ +../../../../../menu-themes/themes/minecraft \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/modified-bent-photon b/kando-svelte/static/kando/menu-themes/modified-bent-photon new file mode 120000 index 000000000..d7fa19fce --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/modified-bent-photon @@ -0,0 +1 @@ +../../../../../menu-themes/themes/modified-bent-photon \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/navigation b/kando-svelte/static/kando/menu-themes/navigation new file mode 120000 index 000000000..ef2077ad4 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/navigation @@ -0,0 +1 @@ +../../../../../menu-themes/themes/navigation \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/neo-ring b/kando-svelte/static/kando/menu-themes/neo-ring new file mode 120000 index 000000000..5b53a092c --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/neo-ring @@ -0,0 +1 @@ +../../../../../menu-themes/themes/neo-ring \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/neon-lights b/kando-svelte/static/kando/menu-themes/neon-lights new file mode 120000 index 000000000..5ae7eba06 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/neon-lights @@ -0,0 +1 @@ +../../../../assets/menu-themes/neon-lights \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/neon-lights-color b/kando-svelte/static/kando/menu-themes/neon-lights-color new file mode 120000 index 000000000..3203f30e8 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/neon-lights-color @@ -0,0 +1 @@ +../../../../../menu-themes/themes/neon-lights-color \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/nether-labels b/kando-svelte/static/kando/menu-themes/nether-labels new file mode 120000 index 000000000..6fa0036c0 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/nether-labels @@ -0,0 +1 @@ +../../../../../menu-themes/themes/nether-labels \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/nord b/kando-svelte/static/kando/menu-themes/nord new file mode 120000 index 000000000..094d05452 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/nord @@ -0,0 +1 @@ +../../../../../menu-themes/themes/nord \ No newline at end of file diff --git a/kando-svelte/static/kando/menu-themes/rainbow-labels b/kando-svelte/static/kando/menu-themes/rainbow-labels new file mode 120000 index 000000000..1836af8b8 --- /dev/null +++ b/kando-svelte/static/kando/menu-themes/rainbow-labels @@ -0,0 +1 @@ +../../../../assets/menu-themes/rainbow-labels \ No newline at end of file diff --git a/kando-svelte/static/kando/menus.json b/kando-svelte/static/kando/menus.json index dc1ab1ee5..5d9cfe98c 100644 --- a/kando-svelte/static/kando/menus.json +++ b/kando-svelte/static/kando/menus.json @@ -331,7 +331,457 @@ } ] } + }, + { + "shortcut": "", + "shortcutID": "compass", + "centered": false, + "root": { + "type": "submenu", + "name": "Compass", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "North", + "icon": "north", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "North-East", + "icon": "north_east", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "East", + "icon": "east", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "South-East", + "icon": "south_east", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "South", + "icon": "south", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "South-West", + "icon": "south_west", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "West", + "icon": "west", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "North-West", + "icon": "north_west", + "iconTheme": "material-symbols-rounded" + } + ] + } + }, + { + "shortcut": "", + "shortcutID": "boolean", + "centered": false, + "root": { + "type": "submenu", + "name": "Boolean", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "True", + "icon": "north", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "False", + "icon": "south", + "iconTheme": "material-symbols-rounded" + } + ] + } + }, + { + "shortcut": "", + "shortcutID": "quad", + "centered": false, + "root": { + "type": "submenu", + "name": "Quad", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "0", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "1", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "2", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "3", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + } + ] + } + }, + { + "shortcut": "", + "shortcutID": "octal", + "centered": false, + "root": { + "type": "submenu", + "name": "Octal", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "0", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "1", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "2", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "3", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "4", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "5", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "6", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "7", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + } + ] + } + }, + { + "shortcut": "", + "shortcutID": "digital", + "centered": false, + "root": { + "type": "submenu", + "name": "Digital", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "0", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "1", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "2", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "3", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "4", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "5", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "6", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "7", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "8", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "9", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + } + ] + } + }, + { + "shortcut": "", + "shortcutID": "clock", + "centered": false, + "root": { + "type": "submenu", + "name": "Clock", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "12", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "1", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "2", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "3", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "4", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "5", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "6", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "7", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "8", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "9", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "10", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "11", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + } + ] + } + }, + { + "shortcut": "", + "shortcutID": "hex", + "centered": false, + "root": { + "type": "submenu", + "name": "Hex", + "icon": "menu", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "command", + "name": "0", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "1", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "2", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "3", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "4", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "5", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "6", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "7", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "8", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "9", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "10", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "11", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "12", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "13", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "14", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + }, + { + "type": "command", + "name": "15", + "icon": "radio_button_unchecked", + "iconTheme": "material-symbols-rounded" + } + ] + } } - ], - "templates": [] -} + ] +} \ No newline at end of file diff --git a/src/common/settings-schemata/general-settings-v1.d.ts b/src/common/settings-schemata/general-settings-v1.d.ts index 65c11adc0..999b07f11 100644 --- a/src/common/settings-schemata/general-settings-v1.d.ts +++ b/src/common/settings-schemata/general-settings-v1.d.ts @@ -3,5 +3,226 @@ import * as z from 'zod'; * Starting with Kando 2.1.0, we use zod to define the schema of the general settings. * This allows us to better validate the settings file. */ -export declare const GENERAL_SETTINGS_SCHEMA_V1: any; +export declare const GENERAL_SETTINGS_SCHEMA_V1: z.ZodObject<{ + /** + * The last version of Kando. This is used to determine whether the settings file needs + * to be backed up and potentially migrated to a newer version. + */ + version: z.ZodDefault; + /** + * The locale to use. If set to 'auto', the system's locale will be used. If the locale + * is not available, english will be used. + */ + locale: z.ZodDefault; + /** If true, the introduction dialog will be shown when the settings window is opened. */ + showIntroductionDialog: z.ZodDefault; + /** The name of the theme to use for the menu. */ + menuTheme: z.ZodDefault; + /** The name of the theme which should be used for the dark mode. */ + darkMenuTheme: z.ZodDefault; + /** + * The accent color overrides to use for menu themes. The outer key is the theme's ID, + * the inner key is the color's name. The final value is the CSS color. + */ + menuThemeColors: z.ZodDefault>>; + /** + * The accent color overrides to use for the dark mode. The outer key is the theme's ID, + * the inner key is the color's name. The final value is the CSS color. + */ + darkMenuThemeColors: z.ZodDefault>>; + /** + * If enabled, the dark menu theme and dark color variants will be used if the system is + * in dark mode. + */ + enableDarkModeForMenuThemes: z.ZodDefault; + /** The name of the current sound theme. */ + soundTheme: z.ZodDefault; + /** The overall volume of the sound effects. */ + soundVolume: z.ZodDefault; + /** Set this to false to disable the check for new versions. */ + enableVersionCheck: z.ZodDefault; + /** Whether to silently handle read-only config files. */ + ignoreWriteProtectedConfigFiles: z.ZodDefault; + /** The color scheme of the settings window. */ + settingsWindowColorScheme: z.ZodDefault>; + /** + * If set to a transparent style, the settings window will attempt to use some sort of + * transparency. What that means exactly depends on the OS. + */ + settingsWindowFlavor: z.ZodDefault>; + /** The tray icon flavor. */ + trayIconFlavor: z.ZodDefault>; + /** Enable GPU acceleration. */ + hardwareAcceleration: z.ZodDefault; + /** Whether to initialize the menu window when it is opened for the first time. */ + lazyInitialization: z.ZodDefault; + /** A scale factor for the menu. */ + zoomFactor: z.ZodDefault; + /** If true, the settings button will be hidden if not hovered. */ + hideSettingsButton: z.ZodDefault; + /** The position of the settings button. */ + settingsButtonPosition: z.ZodDefault>; + /** Clicking inside this radius will select the parent element. */ + centerDeadZone: z.ZodDefault; + /** + * The distance in pixels at which the parent menu item is placed if a submenu is + * selected close to the parent. + */ + minParentDistance: z.ZodDefault; + /** + * This is the threshold in pixels which is used to differentiate between a click and a + * drag. If the mouse is moved more than this threshold before the mouse button is + * released, an item is dragged. + */ + dragThreshold: z.ZodDefault; + /** The time in milliseconds it takes to fade in the menu. */ + fadeInDuration: z.ZodDefault; + /** The time in milliseconds it takes to fade out the menu. */ + fadeOutDuration: z.ZodDefault; + /** + * If enabled, the menu will not take the input focus when opened. This will disable + * turbo mode. + */ + keepInputFocus: z.ZodDefault; + /** If enabled, items can be selected by dragging the mouse over them. */ + enableMarkingMode: z.ZodDefault; + /** + * If enabled, items can be selected by hovering over them while holding down a keyboard + * key. + */ + enableTurboMode: z.ZodDefault; + /** If true, the mouse pointer will be warped to the center of the menu when necessary. */ + warpMouse: z.ZodDefault; + /** If enabled, menus using the hover mode require a final click for selecting items. */ + hoverModeNeedsConfirmation: z.ZodDefault; + /** Shorter gestures will not lead to selections. */ + gestureMinStrokeLength: z.ZodDefault; + /** Smaller turns will not lead to selections. */ + gestureMinStrokeAngle: z.ZodDefault; + /** Smaller movements will not be considered. */ + gestureJitterThreshold: z.ZodDefault; + /** + * If the pointer is stationary for this many milliseconds, the current item will be + * selected. + */ + gesturePauseTimeout: z.ZodDefault; + /** + * If set to a value greater than 0, items will be instantly selected if the mouse + * travelled more than centerDeadZone + fixedStrokeLength pixels in marking or turbo + * mode. Any other gesture detection based on angles or motion speed will be disabled in + * this case. + */ + fixedStrokeLength: z.ZodDefault; + /** + * If enabled, the parent of a selected item will be selected on a right mouse button + * click. Else the menu will be closed directly. + */ + rmbSelectsParent: z.ZodDefault; + /** + * If disabled, gamepad input will be ignored. This can be useful if the gamepad is not + * connected or if the user prefers to use the mouse. + */ + enableGamepad: z.ZodDefault; + /** + * This button will select the parent item when using a gamepad. Set to -1 to disable. + * See https://w3c.github.io/gamepad/#remapping for the mapping of numbers to buttons. + */ + gamepadBackButton: z.ZodDefault; + /** + * This button will close the menu when using a gamepad. Set to -1 to disable. See + * https://w3c.github.io/gamepad/#remapping for the mapping of numbers to buttons. + */ + gamepadCloseButton: z.ZodDefault; + /** Determines the behavior of pressing the trigger shortcut once the menu is open. */ + sameShortcutBehavior: z.ZodDefault>; + /** + * If enabled, pressing 'cmd + ,' on macOS or 'ctrl + ,' on Linux or Windows will open + * the settings window. If disabled, the default hotkey will be ignored. + */ + useDefaultOsShowSettingsHotkey: z.ZodDefault; +}, "strip", z.ZodTypeAny, { + version: string; + locale: string; + showIntroductionDialog: boolean; + menuTheme: string; + darkMenuTheme: string; + menuThemeColors: Record>; + darkMenuThemeColors: Record>; + enableDarkModeForMenuThemes: boolean; + soundTheme: string; + soundVolume: number; + enableVersionCheck: boolean; + ignoreWriteProtectedConfigFiles: boolean; + settingsWindowColorScheme: "light" | "dark" | "system"; + settingsWindowFlavor: "auto" | "sakura-light" | "sakura-dark" | "sakura-system" | "transparent-light" | "transparent-dark" | "transparent-system"; + trayIconFlavor: "none" | "light" | "dark" | "color" | "black" | "white"; + hardwareAcceleration: boolean; + lazyInitialization: boolean; + zoomFactor: number; + hideSettingsButton: boolean; + settingsButtonPosition: "top-left" | "top-right" | "bottom-left" | "bottom-right"; + centerDeadZone: number; + minParentDistance: number; + dragThreshold: number; + fadeInDuration: number; + fadeOutDuration: number; + keepInputFocus: boolean; + enableMarkingMode: boolean; + enableTurboMode: boolean; + warpMouse: boolean; + hoverModeNeedsConfirmation: boolean; + gestureMinStrokeLength: number; + gestureMinStrokeAngle: number; + gestureJitterThreshold: number; + gesturePauseTimeout: number; + fixedStrokeLength: number; + rmbSelectsParent: boolean; + enableGamepad: boolean; + gamepadBackButton: number; + gamepadCloseButton: number; + sameShortcutBehavior: "cycle-from-first" | "cycle-from-recent" | "close" | "nothing"; + useDefaultOsShowSettingsHotkey: boolean; +}, { + version?: string | undefined; + locale?: string | undefined; + showIntroductionDialog?: boolean | undefined; + menuTheme?: string | undefined; + darkMenuTheme?: string | undefined; + menuThemeColors?: Record> | undefined; + darkMenuThemeColors?: Record> | undefined; + enableDarkModeForMenuThemes?: boolean | undefined; + soundTheme?: string | undefined; + soundVolume?: number | undefined; + enableVersionCheck?: boolean | undefined; + ignoreWriteProtectedConfigFiles?: boolean | undefined; + settingsWindowColorScheme?: "light" | "dark" | "system" | undefined; + settingsWindowFlavor?: "auto" | "sakura-light" | "sakura-dark" | "sakura-system" | "transparent-light" | "transparent-dark" | "transparent-system" | undefined; + trayIconFlavor?: "none" | "light" | "dark" | "color" | "black" | "white" | undefined; + hardwareAcceleration?: boolean | undefined; + lazyInitialization?: boolean | undefined; + zoomFactor?: number | undefined; + hideSettingsButton?: boolean | undefined; + settingsButtonPosition?: "top-left" | "top-right" | "bottom-left" | "bottom-right" | undefined; + centerDeadZone?: number | undefined; + minParentDistance?: number | undefined; + dragThreshold?: number | undefined; + fadeInDuration?: number | undefined; + fadeOutDuration?: number | undefined; + keepInputFocus?: boolean | undefined; + enableMarkingMode?: boolean | undefined; + enableTurboMode?: boolean | undefined; + warpMouse?: boolean | undefined; + hoverModeNeedsConfirmation?: boolean | undefined; + gestureMinStrokeLength?: number | undefined; + gestureMinStrokeAngle?: number | undefined; + gestureJitterThreshold?: number | undefined; + gesturePauseTimeout?: number | undefined; + fixedStrokeLength?: number | undefined; + rmbSelectsParent?: boolean | undefined; + enableGamepad?: boolean | undefined; + gamepadBackButton?: number | undefined; + gamepadCloseButton?: number | undefined; + sameShortcutBehavior?: "cycle-from-first" | "cycle-from-recent" | "close" | "nothing" | undefined; + useDefaultOsShowSettingsHotkey?: boolean | undefined; +}>; export type GeneralSettingsV1 = z.infer; diff --git a/src/common/settings-schemata/menu-settings-v1.d.ts b/src/common/settings-schemata/menu-settings-v1.d.ts index 6701dbd90..de9f28f30 100644 --- a/src/common/settings-schemata/menu-settings-v1.d.ts +++ b/src/common/settings-schemata/menu-settings-v1.d.ts @@ -4,7 +4,50 @@ import * as z from 'zod'; * menu shall be shown, the conditions of all menus are checked. The menu with the most * conditions that are met is selected. */ -export declare const MENU_CONDITIONS_SCHEMA_V1: any; +export declare const MENU_CONDITIONS_SCHEMA_V1: z.ZodObject<{ + /** Regex to match for a window name */ + windowName: z.ZodOptional>; + /** Regex to match for an application name. */ + appName: z.ZodOptional>; + /** + * Cursor position to match. In pixels relative to the top-left corner of the primary + * display. + */ + screenArea: z.ZodOptional>; + xMax: z.ZodOptional>; + yMin: z.ZodOptional>; + yMax: z.ZodOptional>; + }, "strip", z.ZodTypeAny, { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + }, { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + }>>>; +}, "strip", z.ZodTypeAny, { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; +}, { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; +}>; /** The menu consists of a tree of menu items. */ export declare const MENU_ITEM_SCHEMA_V1: any; /** @@ -14,14 +57,348 @@ export declare const MENU_ITEM_SCHEMA_V1: any; * * This type is used to describe one of the configured menus in the settings file. */ -export declare const MENU_SCHEMA_V1: any; +export declare const MENU_SCHEMA_V1: z.ZodObject<{ + /** The root item of the menu. */ + root: any; + /** + * The shortcut to open the menu. Something like 'Control+Space'. + * + * @todo: Add description of the format of the shortcut string. + */ + shortcut: z.ZodDefault; + /** + * Some backends do not support direct binding of shortcuts. In this case, the user will + * not be able to change the shortcut in the settings. Instead, the user provides an ID + * for the shortcut and can then assign a key binding in the operating system. + */ + shortcutID: z.ZodDefault; + /** + * If true, the menu will open in the screen's center. Else it will open at the mouse + * pointer. + */ + centered: z.ZodDefault; + /** + * If true, the menu will be "anchored". This means that any submenus will be opened at + * the same position as the parent menu. + */ + anchored: z.ZodDefault; + /** + * If true, the menu will be in "hover mode". This means that the menu items can be + * selected by only hovering over them. + */ + hoverMode: z.ZodDefault; + /** + * Conditions are matched before showing a menu. The one that has more conditions and + * met them all is selected. + */ + conditions: z.ZodOptional>; + /** Regex to match for an application name. */ + appName: z.ZodOptional>; + /** + * Cursor position to match. In pixels relative to the top-left corner of the primary + * display. + */ + screenArea: z.ZodOptional>; + xMax: z.ZodOptional>; + yMin: z.ZodOptional>; + yMax: z.ZodOptional>; + }, "strip", z.ZodTypeAny, { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + }, { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + }>>>; + }, "strip", z.ZodTypeAny, { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + }, { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + }>>>; + /** Tags can be used to group and filter menus. */ + tags: z.ZodDefault>; +}, "strip", z.ZodTypeAny, { + shortcut: string; + shortcutID: string; + centered: boolean; + anchored: boolean; + hoverMode: boolean; + tags: string[]; + root?: any; + conditions?: { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + } | null | undefined; +}, { + root?: any; + shortcut?: string | undefined; + shortcutID?: string | undefined; + centered?: boolean | undefined; + anchored?: boolean | undefined; + hoverMode?: boolean | undefined; + conditions?: { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + } | null | undefined; + tags?: string[] | undefined; +}>; /** The user can create menu collections to group menus according to their tags. */ -export declare const MENU_COLLECTION_SCHEMA_V1: any; +export declare const MENU_COLLECTION_SCHEMA_V1: z.ZodObject<{ + /** The name of the collection. */ + name: z.ZodString; + /** The icon of the collection. */ + icon: z.ZodString; + /** The theme from which the above icon should be used. */ + iconTheme: z.ZodString; + /** The tags which should be included in this collection. */ + tags: z.ZodDefault>; +}, "strip", z.ZodTypeAny, { + name: string; + icon: string; + iconTheme: string; + tags: string[]; +}, { + name: string; + icon: string; + iconTheme: string; + tags?: string[] | undefined; +}>; /** * This type describes the content of the settings file. It contains the configured menus * as well as the templates. */ -export declare const MENU_SETTINGS_SCHEMA_V1: any; +export declare const MENU_SETTINGS_SCHEMA_V1: z.ZodObject<{ + /** + * The last version of Kando. This is used to determine whether the settings file needs + * to be backed up and potentially migrated to a newer version. + */ + version: z.ZodDefault; + /** The currently configured menus. */ + menus: z.ZodDefault; + /** + * Some backends do not support direct binding of shortcuts. In this case, the user will + * not be able to change the shortcut in the settings. Instead, the user provides an ID + * for the shortcut and can then assign a key binding in the operating system. + */ + shortcutID: z.ZodDefault; + /** + * If true, the menu will open in the screen's center. Else it will open at the mouse + * pointer. + */ + centered: z.ZodDefault; + /** + * If true, the menu will be "anchored". This means that any submenus will be opened at + * the same position as the parent menu. + */ + anchored: z.ZodDefault; + /** + * If true, the menu will be in "hover mode". This means that the menu items can be + * selected by only hovering over them. + */ + hoverMode: z.ZodDefault; + /** + * Conditions are matched before showing a menu. The one that has more conditions and + * met them all is selected. + */ + conditions: z.ZodOptional>; + /** Regex to match for an application name. */ + appName: z.ZodOptional>; + /** + * Cursor position to match. In pixels relative to the top-left corner of the primary + * display. + */ + screenArea: z.ZodOptional>; + xMax: z.ZodOptional>; + yMin: z.ZodOptional>; + yMax: z.ZodOptional>; + }, "strip", z.ZodTypeAny, { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + }, { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + }>>>; + }, "strip", z.ZodTypeAny, { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + }, { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + }>>>; + /** Tags can be used to group and filter menus. */ + tags: z.ZodDefault>; + }, "strip", z.ZodTypeAny, { + shortcut: string; + shortcutID: string; + centered: boolean; + anchored: boolean; + hoverMode: boolean; + tags: string[]; + root?: any; + conditions?: { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + } | null | undefined; + }, { + root?: any; + shortcut?: string | undefined; + shortcutID?: string | undefined; + centered?: boolean | undefined; + anchored?: boolean | undefined; + hoverMode?: boolean | undefined; + conditions?: { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + } | null | undefined; + tags?: string[] | undefined; + }>, "many">>; + /** The currently configured menu collections. */ + collections: z.ZodDefault>; + }, "strip", z.ZodTypeAny, { + name: string; + icon: string; + iconTheme: string; + tags: string[]; + }, { + name: string; + icon: string; + iconTheme: string; + tags?: string[] | undefined; + }>, "many">>; +}, "strip", z.ZodTypeAny, { + version: string; + menus: { + shortcut: string; + shortcutID: string; + centered: boolean; + anchored: boolean; + hoverMode: boolean; + tags: string[]; + root?: any; + conditions?: { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + } | null | undefined; + }[]; + collections: { + name: string; + icon: string; + iconTheme: string; + tags: string[]; + }[]; +}, { + version?: string | undefined; + menus?: { + root?: any; + shortcut?: string | undefined; + shortcutID?: string | undefined; + centered?: boolean | undefined; + anchored?: boolean | undefined; + hoverMode?: boolean | undefined; + conditions?: { + windowName?: string | null | undefined; + appName?: string | null | undefined; + screenArea?: { + xMin?: number | null | undefined; + xMax?: number | null | undefined; + yMin?: number | null | undefined; + yMax?: number | null | undefined; + } | null | undefined; + } | null | undefined; + tags?: string[] | undefined; + }[] | undefined; + collections?: { + name: string; + icon: string; + iconTheme: string; + tags?: string[] | undefined; + }[] | undefined; +}>; export type MenuConditionsV1 = z.infer; export type MenuItemV1 = z.infer; export type MenuV1 = z.infer; From 13f2bba72857690d08b8293f36f82f91c45c1cbb Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Fri, 10 Oct 2025 01:39:43 +0200 Subject: [PATCH 11/20] write ideas down --- kando-svelte/notes/aquery.md | 199 ++++++++++++++ kando-svelte/notes/button-trigger-support.md | 264 +++++++++++++++++++ kando-svelte/notes/jquery-pie-menus.md | 225 ++++++++++++++++ 3 files changed, 688 insertions(+) create mode 100644 kando-svelte/notes/aquery.md create mode 100644 kando-svelte/notes/button-trigger-support.md create mode 100644 kando-svelte/notes/jquery-pie-menus.md diff --git a/kando-svelte/notes/aquery.md b/kando-svelte/notes/aquery.md new file mode 100644 index 000000000..bff2ee5e3 --- /dev/null +++ b/kando-svelte/notes/aquery.md @@ -0,0 +1,199 @@ +## aQuery: A Cross‑Platform Accessibility and Window API atop Kando + +This proposal defines “aQuery” — a high‑level, cross‑platform TypeScript API (à la jQuery/Cordova) that abstracts platform accessibility (a11y), window management, and input simulation behind one contract. Kando provides the execution substrate (Electron main/renderer, native backends) and the permission UX; aQuery provides a stable JS interface and selector semantics. + +### Rationale +- Fragmented OS capabilities (AX on macOS, UIA on Windows, AT‑SPI on Linux; Wayland vs X11) complicate app automations and accessibility tooling. +- Kando already ships native backends and a robust input pipeline; aQuery extends this into a reusable, documented API for first‑party features (triggers, editor helpers) and third‑party integrations. + +### Design Principles +- Cross‑platform contract first; graceful capability detection (`supports.*`) and fallbacks. +- Explicit, per‑feature permission prompts (and persistent user consent) with clear failure modes. +- Asynchronous, promise‑first API; event‑driven subscriptions. +- Strong typing; no platform enums leaked through public surface. +- No busy loops; everything cancellable; observable streams where appropriate. + +--- + +## Top‑Level API Surface (TypeScript) + +```ts +namespace aquery { + // Core & permissions + function supports(): Promise<{ + a11y: boolean; window: boolean; input: boolean; screen: boolean; + triggers: boolean; clipboard: boolean; app: boolean; gamepad: boolean; + }>; + function requestPermissions(opts: { + a11y?: boolean; input?: boolean; screen?: boolean; + }): Promise<{ granted: string[]; denied: string[] }>; + + // App / Window + namespace app { + function getForeground(): Promise<{ id: string; name: string }>; + function listInstalled(): Promise>; + } + namespace window { + type Win = { id: string; appId: string; title: string; bounds: { x:number; y:number; w:number; h:number } }; + function getActive(): Promise; + function list(opts?: { appId?: string }): Promise; + function activate(id: string): Promise; + function moveResize(id: string, bounds: Partial): Promise; + } + + // Input (synthetic) + namespace input { + type Button = 'left'|'middle'|'right'|'x1'|'x2'; + function mouse(event: { + type: 'move'|'down'|'up'|'click'|'dblclick'|'scroll'; + button?: Button; x?: number; y?: number; dx?: number; dy?: number; + scrollX?: number; scrollY?: number; + modifiers?: { ctrl?: boolean; alt?: boolean; shift?: boolean; meta?: boolean }; + }): Promise; + function key(event: { code: string; down: boolean }): Promise; + } + + // Accessibility queries + namespace a11y { + type Node = { role: string; name?: string; enabled?: boolean; focused?: boolean; rect?: { x:number;y:number;w:number;h:number } }; + function query(selector: string, opts?: { root?: 'system'|string; timeoutMs?: number }): Promise; + function action(selector: string, act: 'press'|'expand'|'collapse'|'focus'|'setValue', value?: unknown): Promise; + } + + // Screen / clipboard + namespace screen { + function displays(): Promise>; + // High‑performance capture primitives (prefer GPU/zero‑copy where available) + function captureRegion(rect: { x:number;y:number;w:number;h:number }, opts?: { format?: 'png'|'jpeg'|'raw'; displayId?: string }): Promise; + function captureWindow(id: string, opts?: { format?: 'png'|'jpeg'|'raw' }): Promise; + function captureDisplay(displayId: string, opts?: { format?: 'png'|'jpeg'|'raw' }): Promise; + // Tracking utilities (pixel‑level, optional ML backends) + function trackRegion(init: { rect: { x:number;y:number;w:number;h:number }, strategy?: 'template'|'feature'|'ocr' }): AsyncGenerator<{ rect: { x:number;y:number;w:number;h:number }, confidence: number }>; + } + namespace clipboard { + function read(): Promise; + function write(text: string): Promise; + } + + // Vision/LLM (pluggable providers: local VLMs or cloud) + namespace llm { + type Provider = 'auto'|'openai'|'ollama'|'local'; + function describe(image: ImageBitmap | ArrayBuffer, prompt?: string, opts?: { provider?: Provider }): Promise; + function locate(image: ImageBitmap | ArrayBuffer, query: string, opts?: { provider?: Provider }): Promise>; + function plan(image: ImageBitmap | ArrayBuffer, goal: string, opts?: { provider?: Provider }): Promise>; + } + + // Triggers (ties into Kando’s unified triggers[] model) + namespace triggers { + type MouseTrigger = { button: 'left'|'middle'|'right'|'x1'|'x2', mods?: string[] }; + type GamepadTrigger = { button: number; stick?: 'left'|'right'; tiltThreshold?: number }; + function register(menuName: string, trigger: { kind: 'mouse'; value: MouseTrigger } | { kind: 'gamepad'; value: GamepadTrigger }): Promise; + function unregister(menuName: string): Promise; + } +} +``` + +### Selector Grammar (a11y) +- CSS‑inspired for accessibility trees across AX/UIA/AT‑SPI: + - Role: `button`, `menuitem`, `textbox` + - Name: `[name="OK"]`, regex: `[name~/^Save/]` + - State: `:enabled`, `:focused`, `:visible` + - Hierarchy: `app[name="Safari"] > window > button[name="OK"]` + - Short alias: `a$(selector)` returns first match; `a$All(selector)` returns all. + +--- + +## Platform Adapters + +- macOS: AX API (AXUIElement), CGEventTap (global hooks), CGEvent post (synthetic), NSWorkspace notifications (active app), Quartz Display Services (screens). Existing Kando native code already provides: pointer warp, simulateKey, active window, app listing — extend with: simulateMouse, event tap, AX queries/actions. +- Windows: UI Automation (COM), WH_MOUSE_LL / Raw Input, SendInput, GetForegroundWindow/EnumWindows, Graphics Capture API (DXGI Desktop Duplication / Windows.Graphics.Capture). +- Linux X11: AT‑SPI2 (D‑Bus), XTest/XI2, EWMH for windows. Wayland: portals (GlobalShortcuts keyboard only, RemoteDesktop/VirtualPointer/VirtualKeyboard with permissions), AT‑SPI via accessibility stack; many features are compositor‑dependent — expose via `supports()`. + +IPC and isolation: +- Electron main performs privileged calls; renderer uses `contextBridge` APIs. +- All methods return Promises; cancellation via AbortSignal for long queries. + +Permissions UX: +- `aquery.requestPermissions({ a11y: true, input: true })` triggers per‑OS guidance (e.g., macOS Accessibility & Input Monitoring; Screen Recording when capturing) +- Store consent in settings; re‑prompt on denial; surface clear error codes. + +--- + +## Integration with Kando + +- Triggers: the `triggers` registry is a thin facade over Kando’s unified `triggers[]` model (see button‑trigger‑support.md). Mouse/gamepad opener logic flows through Kando’s existing conditions matcher and `MenuWindow.showMenu`. +- Gesture pipeline: after open, existing `PointerInput`/`GamepadInput` continue to produce `InputState` (angle/distance), so selection/marking/turbo remain unchanged. +- Editor: add pickers for MouseTrigger and GamepadTrigger; reuse conditions UI. + +--- + +## Svelte / Browser Variant + +In `kando-svelte`, implement the same TS surface using browser capabilities: +- Mouse triggers: DOM pointer events and `contextmenu` suppression. +- Gamepad triggers: Web Gamepad API. +- a11y/window: limited; expose `supports().a11y = false` and provide no‑op or portal‑based fallbacks; the contract remains the same so apps can feature‑detect. +- Screen capture: `html2canvas`/`OffscreenCanvas` for demo purposes only; do not rely on for privacy‑sensitive features. In Electron renderer, prefer native capture bridges. + +--- + +## Roadmap +1) Spec + types + `supports()`; Svelte demo polyfill for triggers +2) macOS adapter: simulateMouse + event tap + basic AX queries (role/name) and window list/activate +3) Windows adapter: hooks + SendInput + UIA minimal + Graphics Capture +4) Linux X11 adapter; Wayland: document limitations and portals where feasible +5) Editor pickers and unified `triggers[]` schema migration +6) Expanded AX/UIA actions and robust query engine (performance + timeouts) + +Testing: +- Contract tests per method with platform‑specific expected capability matrices +- Golden tests for selector resolution on synthetic accessibility trees + +Security: +- Only elevate when requested; never run hidden; log every privileged action origin (menu/editor) for audit when dev tools enabled. + +License & contribution: +- MIT (inherit from Kando); adapters reside under platform folders; contributors can add new backends behind the same TS interface. + +--- + +## Background, Prior Art, and References (aQuery vision) + +The aQuery idea ("like jQuery for accessibility") predates Kando and draws on decades of HCI and accessibility research. Key motivations and inspirations include: + +- Combine accessibility APIs with pixel‑based screen analysis to overcome each method’s limitations; use both to robustly select, recognize, and control UI elements. +- Treat desktop UIs as augmentable spaces: overlay guidance, implement target‑aware pointing (e.g., Bubble Cursor), sideviews, previews, and task‑specific controllers without modifying apps. +- Build a community library of high‑level, cross‑app widgets (e.g., a generic “video player” control) that adapt to VLC, QuickTime, browsers, etc., akin to jQuery UI widgets spanning browser differences. + +Selected sources and quotes (lightly edited for clarity): + +> "Screen scraping techniques are very powerful, but have limitations. Accessibility APIs are very powerful, but have different limitations. Using both approaches together, and tightly integrating with JavaScript, enables a much wider range of possibilities." — HN post by Don Hopkins (2016) + +> "Prefab realizes this vision using only the pixels of everyday interfaces… add functionality to applications like Photoshop, iTunes, and WMP… first step toward a future where anybody can modify any interface." — Morgan Dixon & James Fogarty, CHI 2010–2012 + +Core references: +- Morgan Dixon et al., Prefab and target‑aware pointing (CHI ’10–’12) + - Video: Prefab: What if We Could Modify Any Interface? + - Video: Content and Hierarchy in Prefab + - Paper: Prefab; Bubble Cursor; Target‑Aware Pointing +- Potter, Shneiderman, Bederson: Pixel Data Access & Triggers (1999) +- Speech control ecosystems (e.g., Dragonfly Python modules) for command repositories + +How it maps to aQuery: +- a11y: selector engine over AX/UIA/AT‑SPI nodes (role/name/state), event binding, actions +- screen: capture/track (template/feature/OCR), compositing overlays +- input: synthetic mouse/keyboard; timing control for “press‑tilt‑release” and gesture playback +- llm: describe/locate/plan actions from snapshots; drive `input.*` with verifiable, sandboxed plans + +--- + +## Snapshotting & LLM Scenarios + +1) Visual targeting fallback: if `a11y.query('button[name="Play"]')` returns empty, use `screen.captureWindow()` + `llm.locate(…, 'play button')` to get a bounding box; click center via `input.mouse({ type:'click', button:'left', x, y })`. +2) Robust selectors: combine `a11y` and `screen` features: match role/name, verify icon pixels via `trackRegion` or LLM scoring. +3) Task agents: capture screen, `llm.plan('increase playback speed to 1.5x')`, vet and execute the plan with safety checks (bounds, foreground window) and reversible steps. + +Privacy & safety: +- Favor on‑device VLMs where possible; redact PII regions; require explicit user consent for cloud processing; log actions when dev mode is on. + + diff --git a/kando-svelte/notes/button-trigger-support.md b/kando-svelte/notes/button-trigger-support.md new file mode 100644 index 000000000..5bb9ef153 --- /dev/null +++ b/kando-svelte/notes/button-trigger-support.md @@ -0,0 +1,264 @@ +## Button and Gamepad Trigger Support — Design and Rationale + +This document specifies how to add “open menu on button” triggers to Kando, covering mouse buttons and gamepads, with per‑app/window/region conditions, double‑click passthrough for RMB, and tight integration with the existing gesture pipeline (marking, turbo, hover, fixed‑stroke). + +Although authored inside `kando-svelte`, the primary scope is the main Kando application (Electron + native backends). The Svelte variant can implement the same TypeScript surface using browser APIs (Gamepad API, DOM pointer events) without native hooks. + +### Goals +- Support opening a menu via: + - Keyboard (existing) + - Mouse buttons (RMB, MMB, X1/X2, optionally LMB) + - Gamepad buttons and optional “press‑tilt‑release” selection flow +- Reuse existing per‑menu `conditions` (app/window/region) for scoping +- Offer double‑right‑click passthrough to forward a native RMB click if user cancels quickly +- Integrate with the gesture pipeline so state machines remain consistent (jitter, dead‑zone, marking/turbo/hover) +- Cross‑platform shape with platform‑specific implementations + +### Non‑Goals +- Provide global mouse hooks on Wayland (not feasible without compositor/portal support) +- Replace the existing keyboard shortcut flow (we remain backward‑compatible) + +--- + +## Configuration Model + +We keep `shortcut`/`shortcutID` for backwards compatibility and add a unified `triggers` array. Each entry is one of `keyboard | mouse | gamepad`. + +Example (JSON excerpt from `menus.json`): + +```json +{ + "root": { "type": "submenu", "name": "Apps", "icon": "apps", "iconTheme": "material-symbols-rounded" }, + "shortcut": "Control+Space", + "triggers": [ + { "kind": "keyboard", "shortcut": "Control+Space" }, + { "kind": "mouse", "button": "right", "mods": [], "when": "matching-conditions", "doubleClickPassthrough": "on-cancel" }, + { "kind": "gamepad", "button": 0, "stick": "left", "tiltThreshold": 0.35 } + ], + "conditions": { "appName": "^com.apple.Safari$" } +} +``` + +Schema sketch (TypeScript/Zod intent): + +```ts +type KeyboardTrigger = { + kind: 'keyboard'; + shortcut?: string; // Electron accelerator + id?: string; // fallback ID for DE/portal bindings +}; + +type MouseTrigger = { + kind: 'mouse'; + button: 'left'|'middle'|'right'|'x1'|'x2'; + mods?: Array<'ctrl'|'alt'|'shift'|'meta'>; + when?: 'matching-conditions'|'always'; + doubleClickPassthrough?: 'on-cancel'|'never'|'always'; +}; + +type GamepadTrigger = { + kind: 'gamepad'; + button: number; // W3C remapped indices + stick?: 'left'|'right'; + tiltThreshold?: number; // 0..1, default 0.3 +}; +``` + +Backward compatibility: if `triggers` is absent, existing `shortcut`/`shortcutID` is treated as a single keyboard trigger. + +### Why not piggyback on `shortcut`? +- Electron’s accelerators are keyboard‑only; mouse buttons are not supported and would require native hooks anyway. Keeping distinct trigger kinds avoids fragile overloading and keeps the editor UX clear. + +--- + +## Integration with Conditions and Menu Selection + +We reuse the existing `conditions` matcher (app name, window title, screen region). On any trigger event, Kando computes the “best matching” menu exactly as today. If the selected menu contains a trigger matching the event (kind + details), we open it. + +This supports per‑app RMB bindings naturally: put `mouse` triggers on menus and scope them with `conditions`. + +--- + +## Event Flow and State Machines + +### Mouse (open flow) +1) Global hook sees mouse event (e.g., RightDown + modifiers) +2) Resolve `WMInfo` (app/window/region), pick best menu by `conditions` +3) If a matching `mouse` trigger exists: swallow the OS event and `showMenu({ centered/anchored/hover })` +4) Pointer input continues as today (dead‑zone, jitter, marking/turbo/hover) + +### Double‑RMB Passthrough +- Policy `doubleClickPassthrough`: + - `on-cancel` (default): if the menu closes “quickly” (≤ system double‑click interval) without a selection, synthesize RMB (Down+Up) and close + - `always`: synthesize RMB on quick close regardless of selection + - `never`: never synthesize + +### Gamepad (open + browse) +1) Renderer polls Gamepad API (already implemented for in‑menu browsing) +2) If a configured `gamepad` trigger button becomes down (and optional `tiltThreshold` satisfied), notify main to `showMenu` using current WM info and menu selection rules +3) In‑menu browsing uses existing GamepadInput: analog stick → hover; buttons → select/back/close +4) Optional mode: “press‑tilt‑release” — arm on button down, commit selection on button up (setting `gamepadSelectOnButtonUp`) + +--- + +## Native Backends (platform support) + +### macOS (first target) +- Global capture: CGEventTap (kCGHIDEventTap) for Right/Other buttons, with Accessibility permission +- Swallowing: return `nullptr` to prevent OS delivery when opening Kando +- Synthetic events: `CGEventCreateMouseEvent` + `CGEventPost`, support: move, down, up, click, dblclick (set click state), scroll, with modifiers +- Permissions: reuse current accessibility prompt; show guidance if access denied + +### Windows (next) +- Global capture: `SetWindowsHookEx(WH_MOUSE_LL)` +- Synthetic events: `SendInput` for mouse + +### Linux +- X11: XI2 + XTest (best effort) +- Wayland: no global mouse hooks; disable mouse triggers and recommend DE/portal bindings (keyboard only) + +--- + +## Public Native API (cross‑platform shape) + +- `startMouseHook({ buttons: string[], intercept: boolean }): void` +- `stopMouseHook(): void` +- `simulateMouse(event: { + type: 'move'|'down'|'up'|'click'|'dblclick'|'scroll', + button?: 'left'|'middle'|'right'|'x1'|'x2', + x?: number, y?: number, dx?: number, dy?: number, + scrollX?: number, scrollY?: number, + modifiers?: { shift?: boolean, ctrl?: boolean, alt?: boolean, meta?: boolean } + }): void` +- Emits events: `{ button, phase: 'down'|'up', x, y, mods, timestamp }` + +These APIs are implemented natively per OS but identically shaped in Node. + +--- + +## Active‑Window‑Aware Filtering (tap/untap strategy) + +We minimize overhead and avoid “spying” on clicks in non‑target apps by enabling the intercepting hook only when necessary: + +- Maintain a precomputed index of triggers per app/window pattern (compiled regex), plus any `when: 'always'` triggers. +- Track foreground window changes and pointer screen transitions; when the active app/window does not match any mouse triggers, disable the intercepting hook (or switch to a listen‑only tap where available). When a match appears, enable the intercepting hook. +- On platforms where toggling hooks is cheap, fully stop/start; otherwise `enable/disable` the same handle. + +Platform specifics: +- macOS: subscribe to `NSWorkspaceDidActivateApplicationNotification` to detect app changes; `CGEventTapEnable(tap, true|false)` to toggle; use `kCGEventTapOptionListenOnly` when you want metrics without the ability to swallow. On match, keep the tap enabled in intercept mode; otherwise disable or switch to listen‑only. +- Windows: use `SetWinEventHook(EVENT_SYSTEM_FOREGROUND, ...)` to detect focus changes; toggle `WH_MOUSE_LL` hook accordingly. +- X11: watch `_NET_ACTIVE_WINDOW` via `XSelectInput` and PropertyNotify; toggle XI2 hook. +- Wayland: no reliable foreground app events; default to disabled hooks (mouse triggers unsupported) or to a per‑DE integration if available. + +Race considerations: +- For RMB interception you must already be in intercept mode before the actual `RightDown` is dispatched by the OS. Therefore we only disable interception in apps without matching triggers; in apps with matches, interception remains enabled and the event is swallowed conditionally (constant‑time checks). +- Region conditions: decision is per‑event (we read pointer position from the event); interception remains enabled in candidate apps. + +Behavior summary: +- Not a candidate app/window → hook disabled (zero overhead). +- Candidate app/window → hook enabled, events checked against triggers; if not matched, immediately pass through; if matched, swallow and open menu. + +--- + +## LLM‑Driven Context‑Sensitive Menus (window snapshot → pie) + +We can dynamically propose a menu when a trigger fires by analyzing the active window snapshot or accessibility tree. This augments (not replaces) authored menus. + +High‑level pipeline: +1) Capture: use `aquery.screen.captureWindow(activeWindowId)` (prefer GPU/zero‑copy). Optionally include `aquery.a11y.query('window > *')` summaries. +2) Prompt: send snapshot (and AX summary) to `aquery.llm.describe/plan` with an instruction to emit a Kando `menus.json` fragment limited to 8–12 directions, names/icons, and safe actions only. +3) Validate: parse with Kando Zod schemas; reject if invalid or if contains disallowed actions. +4) Render: open the generated pie (ephemeral) or merge into a temporary overlay group; show a small “AI” badge and a “pin/save” affordance. +5) Learn/cache: key by app/window signature (bundle id + canonicalized title + UI hash). Cache top suggestions; allow feedback (👍/👎) and corrections; respect per‑app opt‑in. + +Output schema (LLM target): +```json +{ + "version": "1", + "menus": [ + { + "name": "AI Context", + "centered": false, + "anchored": false, + "root": { + "type": "submenu", + "name": "Context", + "icon": "lightbulb", + "iconTheme": "material-symbols-rounded", + "children": [ + { "type": "hotkey", "name": "Copy", "icon": "content_copy", "iconTheme": "material-symbols-rounded", "data": { "hotkey": "Command+C" } }, + { "type": "hotkey", "name": "Paste", "icon": "content_paste", "iconTheme": "material-symbols-rounded", "data": { "hotkey": "Command+V" } } + ] + } + } + ] +} +``` + +Safety & UX guardrails: +- Privacy: default to on‑device VLM; if cloud is used, require explicit per‑app consent and allow redaction regions. +- Safety: only emit Kando‑supported safe actions (`hotkey`, `command`, `uri`, etc.); require confirmation for destructive actions. +- Determinism: clamp to ≤12 slices; prefer well‑known icons; avoid ambiguous labels; show confidence tooltips. +- Latency: if the LLM response exceeds a threshold, show the default authored menu first and add AI suggestions as a sibling pie when ready. + +Refresh policy: +- Recompute when window identity or major layout hash changes. +- Cache per app/title signature; decay over time; respect user feedback. + +Integration points: +- Triggers: `MouseTrigger`/`GamepadTrigger` can select an AI pie variant when `conditions` match and AI is enabled for the app. +- Editor: provide a “Generate with AI” button that seeds a baseline menu the user can edit and save. + +--- + +## Editor UI Changes + +- Keyboard: keep `ShortcutPicker` (existing) +- Mouse: add `MouseTriggerPicker` + - Record button captures `mousedown` inside the dialog (button + current modifiers) + - Options: When (`matching-conditions|always`), Passthrough (`on-cancel|never|always`) +- Gamepad: add `GamepadTriggerPicker` + - Record listens via Gamepad API; captures button index; optional tilt threshold slider; stick selector + +All pickers edit a `triggers[]` list on the menu. + +--- + +## Gesture Pipeline Integration + +The menu opens in the same state machine as keyboard triggers; thereafter pointer/gamepad input is handled by the existing InputMethods. + +- PointerInput: unchanged for motion/jitter/marking/turbo/hover. Only the open event origin differs. +- GestureDetector: remains authoritative for corner/pause detection and fixed‑stroke; nothing changes here. +- GamepadInput: continues to publish an `InputState` with `distance/angle` based on stick tilt; optional “select on button up” adds a small arm/disarm flag in the input method. + +Fast gesture modes (e.g., `fixedStrokeLength`) continue to apply; if configured, a gamepad tilt beyond threshold may immediately select upon button release if distance crosses the fixed stroke. + +--- + +## Svelte Variant (browser) + +Svelte apps can mirror the same TypeScript model without native code: +- Mouse triggers: use `pointerdown`/`contextmenu` on a global overlay to detect RMB/MMB; browsers allow canceling the default context menu +- Gamepad triggers: use the browser Gamepad API (as in Kando renderer) for both opening and browsing + +The Svelte implementation should parse the same `triggers` array and apply identical selection/gesture logic, differing only in the capture layer. + +--- + +## Telemetry, Testing, and Migration + +- Logging: emit concise lines when a trigger matches or is ignored (kind, button/index, app/window, chosen menu) +- Unit tests: Zod schema for `triggers`; condition matcher remains as is +- Manual tests: per‑app RMB, double‑RMB passthrough, gamepad open/tilt/select, fixed‑stroke interactions +- Migration: if `triggers` missing, build a single `keyboard` trigger from `shortcut`/`shortcutID` at load time; editor writes the new schema going forward + +--- + +## Rationale Summary + +- Distinct trigger kinds keep platform realities clear (keyboard via Electron/portals; mouse via native hooks; gamepad via web API) while sharing the same conditions and open/gesture pipeline. +- Double‑RMB passthrough preserves native app context menus without spending a slice. +- The unified `triggers[]` is backward‑compatible and future‑proof (room for touch/pen or OS‑level gestures later). + + diff --git a/kando-svelte/notes/jquery-pie-menus.md b/kando-svelte/notes/jquery-pie-menus.md new file mode 100644 index 000000000..97f2988f5 --- /dev/null +++ b/kando-svelte/notes/jquery-pie-menus.md @@ -0,0 +1,225 @@ +## jQuery Pie Menus — Clean Reference (from the MediaWiki page) + +This document is a structured, markdown version of the historical jQuery Pie Menus write‑up. It captures the model, API, configuration formats, callbacks, and selection rules of that system. It intentionally differs from Kando, but we document it precisely so we can learn from its design (what to adopt, adapt, or avoid) and mine its ideas for Svelte/Kando integration. + +Key links (source/history): +- Project: `https://github.com/SimHacker/jquery-pie` +- Clone: `git clone --recursive https://github.com/SimHacker/jquery-pie.git` + +Notes: +- The original system de‑emphasizes “menus,” calling them “pies,” to encourage a gestural, direct‑manipulation framing (graph/map vs strict tree). +- The model introduces an explicit “slice” layer between pies and items to stabilize layout while freely adding/removing items. + +--- + +## Model + +### Target +- A DOM element enhanced by the jQuery pie component. +- Holds a set of named pies, each defined by a DOM node or by JavaScript data. +- Clicking the target activates a pie: either a default or one chosen dynamically by a handler. +- Multiple pies per target support context sensitivity and navigation (submenus and sibling interlinks). + +### Pie +- A pie contains an ordered list of slices; each slice has a direction. +- Pies have a background and an overlay that may contain arbitrary HTML. +- Explicit slices provide a stable directional scaffold; items then populate slices without perturbing directions. +- Enforces good practice (e.g., 8 or 12 slices, even counts) without dummy items. +- Allows per‑slice layout and interaction policies (mix/match across a pie). + +### Slice +- Slice is defined by a unique direction; slices need not be evenly spaced. +- Slices have background and overlay HTML layers. +- Selection rule: compute the dot product between cursor direction and slice direction; the closest wins. +- Edges are implicit mid‑angles between adjacent directions (no explicit subtend needed): every possible direction maps to exactly one slice; no gaps/overlaps. +- Cursor distance is available as a continuous parameter or for discrete item selection. +- Slices contain ordered items and support per‑slice layout/selection policies. +- Slices can emulate classic controls: + - Linear slider (“slideout”) + - Pull‑down (“pullout”) + - Drop‑down (“dropout”) + +### Item +- Items live inside slices; item position/selection is driven by the slice’s policy. +- Items provide an optional label plus background and overlay HTML. + +Item layout/selection policies (examples): +- Equidistant: place compact icons at even distances along the slice vector; select nearest center. +- Justified: arrange text labels so they touch but don’t overlap; select by containment (or nearest if none contain the cursor). +- Pull‑out: show only the currently selected item centered at a fixed distance; switch by cursor distance. + +--- + +## Defining and Editing + +Multiple authoring channels are supported: + +### API +- Programmatic definition in JavaScript (client/server). +- Supports embedded “onshow” handlers that build/modify pies/slices/items dynamically. +- Utility helpers and templates envisioned for common styles. + +### JSON +- Pure data definitions suitable for static authoring or dynamic server‑side generation. +- Functions are not JSON, but you may reference handler names which resolve to functions. + +### HTML DOM +- Pies, slices, items defined by nested DOM; backgrounds/overlays can include arbitrary HTML/CSS/JS. +- Good for designers comfortable in HTML. + +### Tools +- UI builders: lists, property sheets, or direct manipulation (drag/drop) editors. +- Goal: empower both designers and end users (task‑specific pies). + +--- + +## Notification and Tracking + +Integration requires events and feedback during live tracking for previews, documentation, and emphasis of relevant choices. Three ways to attach handlers: + +### HTML Attributes +Inline event attributes (traditional): + +```html +
      +``` + +### jQuery Handlers +Programmatic binding: + +```js +$('#target').on('pieitemselect', function (e, pie, slice, item) { + // ... +}); +``` + +### JavaScript Data +Handlers embedded directly in pie definitions (as functions) or referenced by name: + +```js +const pieDefinition = { + slices: [ /* ... */ ], + onpieitemselect: function (event, pie, slice, item) { + // ... + } +}; +``` + +Event bubbling/capturing rules let you attach specific handlers at the item level or generalized handlers at the slice/pie/target levels. + +--- + +## Customization + +### CSS Classes and Styles +- Assign static or dynamic classes/styles to pies, slices, and items—during tracking as well. + +### HTML Content +- Backgrounds and overlays may contain arbitrary HTML/CSS/JS: SVG, Canvas, WebGL, video, CSS 3D, filters, etc. + +### Dynamic Feedback +- Rich, real‑time preview via callbacks and layered presentation. + +### Rich Application Integration +- The host app may provide in‑world previews responding live to tracking. +- Pie selection is purely directional; once learned, users can “mouse ahead,” keeping attention on objects while menus provide peripheral/contextual feedback. + +--- + +## Documentation (Behavioral Spec) + +### Creating a Target + +```js +const gTarget = $('#target').pie({ + // options +}); +``` + +### Options Dictionary +- Configures the target and defines pies. +- Contains optional event handler functions. +- Pies/slices/items may inherit properties from options via delegation and events bubble up to the target. + +Two main forms of pie definitions: dictionaries or DOM elements. Several ways to reference them (see below). + +--- + +## DOM Pie Definitions + +- Pies can be declared as DOM elements and referred to by jQuery selectors, provided via `options.defaultPie`, returned by `options.findPie`, or listed in `options.pies`. +- DOM attributes encode properties: `data--=""` (supports inheritance). +- Inline event attributes `on="..."` are used (since events do not dispatch directly to definition nodes). + +--- + +## Pie/Slice/Item Dictionaries + +### Pie Dictionary +- Keys configure appearance/behavior. +- Usually contains `slices: []`. +- May define `onshowpie` to create/modify slices/items before show. +- A pie may have zero slices for continuous angle/distance tracking use‑cases. + +### Slice Dictionary +- Keys configure appearance/behavior. +- Usually contains `items: []`. +- May define `onshowslice` to create/modify items before show. +- A slice may have zero items (continuous distance parameter). + +### Item Dictionary +- Keys configure appearance/behavior. +- Usually contains `label` (optional if using icons/HTML instead). +- May define `onshowitem` for dynamic label/content. + +--- + +## Deciding Which Pie to Pop Up (Resolution Algorithm) + +1) `options.defaultPie` + - When the user clicks the target, `findDefaultPie(event)` reads `options.defaultPie`. + - It may be: a pie dictionary, a `pieRef` string, or `null` (no pie). + +2) `pieRef` string + - A reference to a pie definition. Possible forms: + - Key into `options.pies` + - jQuery selector string + - Any identifier interpretable by `options.findPie` + +3) `options.findPie(event, pieRef)` (optional) + - First stage resolver; enables context sensitivity (location, state machine for submenus/sibmenus). + - Return `null` → no pie; a dictionary → use it; a string → further resolve; absent → skip. + +4) `options.pies` + - If still a string, look it up in `options.pies`. + - Value may be a dictionary or a jQuery selector string pointing to a single DOM element. + +5) jQuery selector to DOM + - If still unresolved, treat as a jQuery selector; call `makePieFromDOM(selector)`. + - On success, cache the resulting dictionary in `options.pies` and use it; else no pie. + +--- + +## Callback Surface (summary) + +Event names typically bubbled to target (illustrative; actual names in the original code): +- `onshowpie(event, pie)` +- `onshowslice(event, pie, slice)` +- `onshowitem(event, pie, slice, item)` +- `onpieitemhover(event, pie, slice, item, trackingState)` +- `onpieitemselect(event, pie, slice, item)` +- `onpiecancel(event, pie)` + +The Svelte/Kando port can map these to component events and/or Svelte 5 snippets to allow parameterized layers and dynamic feedback. + +--- + +## Porting Notes (to Svelte/Kando) + +- Keep the explicit slice layer to stabilize directions while editing. +- Support multiple item policies per slice (equidistant/justified/pull‑out) via themeable CSS variables and per‑slice props. +- Provide a rich callback/event surface equivalent to the jQuery version and connect it to Svelte runes/snippets for dynamic content, previews, and instrumentation. +- Align selection math (angle → slice by nearest direction; edges as mid‑angles) to avoid gaps/overlaps and to guarantee a unique match. +- Encourage app‑level integration for real‑time in‑world previews during tracking. + + From 4c9be74a92ed29e0261b419b5fd8ec20a6da80ce Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Fri, 10 Oct 2025 02:31:17 +0200 Subject: [PATCH 12/20] more designs --- kando-svelte/.gitignore | 1 + kando-svelte/notes/aquery.md | 187 +++++++++++++++++++++++++ kando-svelte/notes/jquery-pie-menus.md | 126 +++++++++++++++-- 3 files changed, 303 insertions(+), 11 deletions(-) diff --git a/kando-svelte/.gitignore b/kando-svelte/.gitignore index 294b38578..47c6be13e 100644 --- a/kando-svelte/.gitignore +++ b/kando-svelte/.gitignore @@ -8,6 +8,7 @@ node_modules /.svelte-kit /build /dist +temp # OS .DS_Store diff --git a/kando-svelte/notes/aquery.md b/kando-svelte/notes/aquery.md index bff2ee5e3..52f8b8fc5 100644 --- a/kando-svelte/notes/aquery.md +++ b/kando-svelte/notes/aquery.md @@ -197,3 +197,190 @@ Privacy & safety: - Favor on‑device VLMs where possible; redact PII regions; require explicit user consent for cloud processing; log actions when dev mode is on. + + +## Quick Start + +### Check capabilities and request permissions + +```ts +// Feature-detect what the current platform supports +const caps = await aquery.supports(); + +// Ask only for what you need right now +await aquery.requestPermissions({ + a11y: caps.a11y, + input: caps.input, + screen: false +}); +``` + +### Focus an app window and press a button by accessible name + +```ts +// Bring the target app window forward +const active = await aquery.window.getActive(); +if (!active) { + const safari = (await aquery.app.listInstalled()).find(a => a.name === 'Safari'); + if (safari) { + const wins = await aquery.window.list({ appId: safari.id }); + if (wins[0]) await aquery.window.activate(wins[0].id); + } +} + +// Press a visible OK button +const ok = await aquery.a11y.query('window > button[name="OK"]:enabled:visible', { timeoutMs: 1000 }); +if (ok[0]) { + await aquery.a11y.action('window > button[name="OK"]', 'press'); +} +``` + +### Fallback to vision when accessibility lookup fails + +```ts +const match = await aquery.a11y.query('button[name~=/Play|▶/]:enabled', { timeoutMs: 500 }); +if (!match[0] && (await aquery.supports()).screen) { + const win = await aquery.window.getActive(); + if (win) { + const img = await aquery.screen.captureWindow(win.id, { format: 'png' }); + const boxes = await aquery.llm.locate(img, 'play button'); + const best = boxes.sort((a, b) => b.score - a.score)[0]; + if (best) { + const cx = best.rect.x + Math.floor(best.rect.w / 2); + const cy = best.rect.y + Math.floor(best.rect.h / 2); + await aquery.input.mouse({ type: 'move', x: cx, y: cy }); + await aquery.input.mouse({ type: 'click', button: 'left' }); + } + } +} +``` + +--- + +## Selector Cookbook + +- **By role**: `menuitem`, `button`, `textbox`, `checkbox` +- **By name (exact)**: `button[name="Save"]` +- **By name (regex)**: `button[name~/^Save (As|All)/]` +- **By state**: `:enabled`, `:focused`, `:visible` +- **By ancestry**: `app[name="Safari"] > window > toolbar > button[name="Reload"]` +- **Any of names**: `button[name~/^(OK|Yes|Continue)$/]` +- **First match helper**: `a$("button[name='OK']")` +- **All matches helper**: `a$All("menuitem:visible")` + +Tips: +- Prefer stable identifiers (role + name) first; use vision as a verifier. +- Scope queries by app/window when possible for performance. +- Use `timeoutMs` conservatively to avoid long hangs; prefer retries with backoff. + +--- + +## Capability Matrix (indicative) + +| Feature | macOS (AX) | Windows (UIA) | Linux X11 (AT‑SPI) | Wayland | +| ------------- | ---------- | ------------- | ------------------ | ------- | +| a11y query | Yes | Yes | Yes | Varies | +| a11y actions | Yes | Yes | Yes | Varies | +| window list | Yes | Yes | Yes | Yes | +| window focus | Yes | Yes | Yes | Varies | +| input synth | Yes | Yes | Yes (XTest/XI2) | Portals | +| screen capture| Yes | Yes | Yes | Portals | + +Notes: +- Wayland features depend on compositor and portals; expose via `supports()`. +- Some features require explicit OS permissions; see next section. + +--- + +## Permissions Guide + +### macOS +- **Accessibility**: required for a11y queries/actions and some input simulation. +- **Input Monitoring**: required for global input hooks. +- **Screen Recording**: required for display/window capture. +- Use `aquery.requestPermissions({ a11y: true, input: true })` to guide users. + +### Windows +- UIA and SendInput generally work without special prompts; ensure the app has appropriate privileges when interacting with elevated windows. +- Graphics Capture may require enabling OS features on older builds. + +### Linux +- **X11**: broad access via AT‑SPI and XTest/XI2; no prompts. +- **Wayland**: use portals for virtual keyboard/mouse and remote‑desktop capture; availability varies by desktop environment. + +--- + +## Svelte / Browser Polyfill Notes + +In `kando-svelte`, mirror the TS surface where possible so code can feature‑detect and degrade gracefully. + +```ts +// Example: simple mouse trigger polyfill in the browser +const supports = await aquery.supports(); +if (!supports.triggers) { + // Fallback: listen to DOM events to open a demo menu + window.addEventListener('contextmenu', (e) => { + e.preventDefault(); + // show demo menu component at e.clientX/Y + }); +} +``` + +Prefer native bridges when running under Electron for capture and input. + +--- + +## Prefab, HyperLook/HyperCard, and Design Inspiration + +### Prefab (Dixon & Fogarty) +- Use pixel‑level recognition to identify widgets and verify targets. +- Combine with a11y selectors for robust, cross‑app interactions. + +### HyperLook / HyperCard‑style Augmentation +- Treat desktop UIs as canvases you can annotate, overlay, and script. +- Compose higher‑level widgets (e.g., a generic media controller) that adapt to many apps. + +### Window Management +- Expose predictable operations: focus, move/resize, enumerate, tile/snap. +- Build user scripts that arrange workspaces and then bind them to triggers. + +### Pie Menus +- Integrate with Kando’s triggers and gesture pipeline. +- Use aQuery to query context (focused app/window/element) and tailor menu entries. + +### Tabbed / Panel Workflows +- Script workflows that switch tabs, raise panels, and confirm dialogs by role/name. + +--- + +## Eventing, Timeouts, and Cancellation + +- Long queries should accept `timeoutMs` and `AbortSignal` to stay responsive. +- Emit progress or discovery events where supported (future roadmap) to enable live UIs. + +```ts +const controller = new AbortController(); +const timer = setTimeout(() => controller.abort(), 800); +try { + const nodes = await aquery.a11y.query('textbox:focused', { timeoutMs: 750 /*, signal: controller.signal */ }); + // ... +} finally { + clearTimeout(timer); +} +``` + +--- + +## Error Handling Patterns + +- Always check `supports()` before calling feature APIs. +- Prefer idempotent scripts; verify window focus and bounds before input. +- Layer fallbacks: a11y → vision verify → pure vision; fail fast with clear messages. + +--- + +## Contributing Adapters + +- Keep platform specifics inside adapter folders; conform to the TS interface. +- Add contract tests per method and capability matrices per OS. +- Document any limitations behind `supports()` feature flags. diff --git a/kando-svelte/notes/jquery-pie-menus.md b/kando-svelte/notes/jquery-pie-menus.md index 97f2988f5..051fde930 100644 --- a/kando-svelte/notes/jquery-pie-menus.md +++ b/kando-svelte/notes/jquery-pie-menus.md @@ -200,17 +200,80 @@ Two main forms of pie definitions: dictionaries or DOM elements. Several ways to --- -## Callback Surface (summary) - -Event names typically bubbled to target (illustrative; actual names in the original code): -- `onshowpie(event, pie)` -- `onshowslice(event, pie, slice)` -- `onshowitem(event, pie, slice, item)` -- `onpieitemhover(event, pie, slice, item, trackingState)` -- `onpieitemselect(event, pie, slice, item)` -- `onpiecancel(event, pie)` - -The Svelte/Kando port can map these to component events and/or Svelte 5 snippets to allow parameterized layers and dynamic feedback. +## Callbacks and Events (exhaustive per source) + +Three notification mechanisms are supported simultaneously (and events bubble from Item → Slice → Pie → Target): +- DOM attributes: `on="..."` evaluated with `this = widget` and local bindings `{ event, pie, slice, item }` when available +- jQuery events: `$(el).on('', (event, targetWidget, pie, slice, item) => { ... })` +- Dictionary handlers: `on(event, pie, slice, item)` functions placed on item/slice/pie/options dictionaries + +Where an event fires first (leaf) and bubbles upward is indicated below. For jQuery handlers, the extra arg order is always `(targetWidget, pie, slice, item)`. + +### Pie‑level lifecycle and input +- `pieshow` – leaf: Pie → Target + - DOM/jQuery element: `pie.$pie` + - Args: `(event, pie)` (plus `slice=null,item=null` in generic plumbing) + - Dictionary handler keys: `onpieshow` +- `piestart` / `piestop` – Pie shown/hidden during a tracking session + - Leaf: Pie → Target; Args: `(event, pie)` + - Keys: `onpiestart`, `onpiestop` +- `piepin` / `pieunpin` – pin/unpin transitions (click‑up to stick; click‑down to unstick) + - Leaf: Pie → Target; Args: `(event, pie)` + - Keys: `onpiepin`, `onpieunpin` +- `piecancel` – cancel (e.g., pinned and user clicks without selecting) + - Leaf: Pie → Target; Args: `(event, pie)` + - Key: `onpiecancel` +- `pieupdate` – per‑motion update (after slice/item updates) + - Leaf: Pie → Target; Args: `(event, pie)` + - Key: `onpieupdate` +- `pieselect` – a selection occurred in the current pie (may be with/without item) + - Leaf: Pie → Target; Args: `(event, pie)` + - Key: `onpieselect` +- Low‑level input passthrough for diagnostics or tooling: + - `piedown` / `piemove` / `pieup` – Leaf: Pie → Target; Args: `(event, pie)` + +### Slice‑level lifecycle and tracking +- `piesliceshow` – before slice is shown (within `pieshow`) + - Leaf: Slice → Pie → Target; Args: `(event, pie, slice)` + - Key: `onpiesliceshow` +- `pieslicestart` / `pieslicestop` – enter/leave slice (null slice marks center dead‑zone) + - Leaf: Slice → Pie → Target; Args: `(event, pie, slice)` + - Keys: `onpieslicestart`, `onpieslicestop` +- `piesliceupdate` – per‑motion while in current slice + - Leaf: Slice → Pie → Target; Args: `(event, pie, slice)` + - Key: `onpiesliceupdate` +- `piesliceselect` – slice commit (also raised when an item within slice is selected) + - Leaf: Slice → Pie → Target; Args: `(event, pie, slice)` + - Key: `onpiesliceselect` + +### Item‑level lifecycle and tracking +- `pieitemshow` – before item is shown (within `piesliceshow`) + - Leaf: Item → Slice → Pie → Target; Args: `(event, pie, slice, item)` + - Key: `onpieitemshow` +- `pieitemstart` / `pieitemstop` – enter/leave item + - Leaf: Item → Slice → Pie → Target; Args: `(event, pie, slice, item)` + - Keys: `onpieitemstart`, `onpieitemstop` +- `pieitemupdate` – per‑motion while over item + - Leaf: Item → Slice → Pie → Target; Args: `(event, pie, slice, item)` + - Key: `onpieitemupdate` +- `pieitemselect` – item commit + - Leaf: Item → Slice → Pie → Target; Args: `(event, pie, slice, item)` + - Key: `onpieitemselect` +- `pietimer` – periodic timer tick during tracking (event is `null` by design) + - Leaf: Item → Slice → Pie → Target; Args: `(null, pie, slice, item)` + - Key: `onpietimer` + +### Handler signatures recap +- DOM attribute: `on="..."` evaluated with `this === target widget`; locals: `event`, `pie`, `slice`, `item` +- jQuery: `$(el).on('', (event, targetWidget, pie, slice, item) => { ... })` +- Dictionary: `dict.on = function(event, pie, slice, item) { ... }` + +### Selection, pinning, and navigation nuances +- Dead‑zone: `inactiveDistance` px gate; inside it, no slice selected. +- Select item under cursor: `selectItemUnderCursor` (pie/slice/item level) uses `elementFromPoint` to promote direct‑hit items regardless of slice. +- Slice item tracking: `sliceItemTracking` policies include `'closestItem'` (distance‑based) and `'target'` (defer to app logic; no auto item). +- Pinning: first click pins (`piepin`); next click either cancels (`piecancel`) or selects; sticky and draggy pin behaviors via `stickyPin`/`draggyPin`/`dragThreshold`. +- Submenus: set `nextPie` on an item; after `pieitemselect`, the widget resolves `nextPie` (string ref or DOM selector) and continues tracking with the next pie already pinned. --- @@ -223,3 +286,44 @@ The Svelte/Kando port can map these to component events and/or Svelte 5 snippets - Encourage app‑level integration for real‑time in‑world previews during tracking. +--- + +## Options, Attributes, and CSS (from source) + +### Core options (selected) +- `pies`: dictionary of pie definitions; values can be dictionaries or jQuery selector strings to DOM pies +- `defaultPie`: dictionary or pieRef string; used by `findDefaultPie(event)` +- `findPie(event, pieRef)`: optional resolver; may return dictionary or new `pieRef` +- `root`: element/selector for overlay root (defaults to `document.body`) +- `triggerEvents`, `triggerSelector`, `triggerData`: configure activation binding (default `'mousedown.pieTrigger'` on target) +- Notifier switches: `notifyDOM` (default true), `notifyjQuery` (true), `notifyDictionaries` (true) +- Timer: `timer` (bool), `timerDelay` (ms) + +### Per‑pie/slice/item parameters (examples) +- Direction scaffold and placement: + - `initialSliceDirection` (default `'North'`), `clockwise` (bool), `turn` (deg step or auto), `pieSliced` (0..1 proportion of circle) +- Selection & layout: + - `sliceItemLayout`: `'spacedDistance' | 'minDistance' | 'nonOverlapping' | 'layered'` (prototype) + - `sliceItemTracking`: `'closestItem' | 'target'` + - `selectItemUnderCursor`: bool + - Distance/spacing: `inactiveDistance`, `itemDistanceMin`, `itemDistanceSpacing`, `itemGap`, `itemShear`, `itemOffsetX`, `itemOffsetY` + - Rotation: `rotateItems` (bool), `itemRotation` (deg) +- Navigation: `nextPie` (string ref) on slice/item + +All parameters may be specified at item, slice, or pie level; lower levels override higher ones. Defaults can be injected via `pieDefaults`, `sliceDefaults`, `itemDefaults`. + +### DOM data‑attributes +Attributes are read from DOM declarations for pies/slices/items and coerced by type. Prefixes: +- Pie: `data-pie-`; keys include those in `pieAttributes` (string/number/boolean/eval) +- Slice: `data-pieslice-`; keys include `sliceItemLayout`, `sliceItemTracking`, `sliceDirection`, etc. +- Item: `data-pieitem-`; keys include per‑item overrides and `nextPie` + +### CSS class map (used by the widget) +``` +Pie, PieBackground, PieTitle, PieOverlay, +PieSlices, PieSlice, PieSliceHighlight, PieSliceBackground, PieSliceOverlay, PieSliceItems, +PieItem, PieItemHighlight, PieItemLink, PieItemBackground, PieItemLabel, PieItemOverlay, +PieCaptureOverlay +``` + + From bf773991ce885665b454c16f351a2ecdc271fe50 Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Fri, 10 Oct 2025 03:52:54 +0200 Subject: [PATCH 13/20] gesture tracking --- kando-svelte/src/lib/PieItem.svelte | 12 +-- kando-svelte/src/lib/PieMenu.svelte | 10 +-- kando-svelte/src/lib/PieTree.svelte | 49 +++++++++++- .../src/lib/gesture/gesture-detector.ts | 3 + kando-svelte/src/lib/theme-loader.ts | 2 +- kando-svelte/src/lib/types.ts | 14 +++- kando-svelte/src/routes/+page.svelte | 53 +++++++++---- kando-svelte/svelte.config.js | 3 +- kando-svelte/tsconfig.json | 15 +++- .../input-methods/gesture-detector.d.ts | 74 +++++++++++++++++++ 10 files changed, 204 insertions(+), 31 deletions(-) create mode 100644 kando-svelte/src/lib/gesture/gesture-detector.ts create mode 100644 src/menu-renderer/input-methods/gesture-detector.d.ts diff --git a/kando-svelte/src/lib/PieItem.svelte b/kando-svelte/src/lib/PieItem.svelte index f668e2a93..65015698e 100644 --- a/kando-svelte/src/lib/PieItem.svelte +++ b/kando-svelte/src/lib/PieItem.svelte @@ -1,5 +1,5 @@ @@ -48,8 +48,8 @@
      {/if} - {#if below} - {@render below(belowIndex != null ? { index: belowIndex } : {})} + {#if below && belowIndex != null} + {@render below({ index: belowIndex })} {/if} {#if layers && layers.length} {#each [...layers].reverse() as layer} diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte index 963f97de4..87eb430c9 100644 --- a/kando-svelte/src/lib/PieMenu.svelte +++ b/kando-svelte/src/lib/PieMenu.svelte @@ -26,7 +26,7 @@ export let centerStateClasses: string = 'active'; export let childClassBase: string = 'child'; // Theme-driven layers (Kando MenuThemeDescription.layers) - export let layers: Array<{ class: string; content?: 'icon'|'name' }>|null = null; + export let layers: { class: string; content?: 'icon'|'name'|'none' }[] | null = null; export let centerTextWrapWidth: number | null = null; export let drawChildrenBelow: boolean = false; @@ -93,7 +93,7 @@ -{#snippet RenderGrandchildren({ index })} +{#snippet RenderGrandchildren({ index }: { index: number })} {#if (item?.children?.[index] as any)?.children?.length} {#each grandAnglesByChild[index] as gAng, j} + layers={(layers as any) ?? [{ class: 'icon-layer' }]} /> {/each} {/if} {/snippet} @@ -127,7 +127,7 @@ angleDiff={pointerAngle != null ? Math.min(Math.abs((childAngles[i] - pointerAngle) % 360), 360 - Math.abs((childAngles[i] - pointerAngle) % 360)) : null} dataPath={`/${i}`} dataLevel={1} - layers={layers ?? [{ class: 'icon-layer' }]} + layers={(layers as any) ?? [{ class: 'icon-layer' }]} below={RenderGrandchildren} belowIndex={i} /> @@ -157,7 +157,7 @@ childDistancePx={radiusPx} dataPath={'/'} dataLevel={0} - layers={layers ?? [{ class: 'icon-layer' }]} + layers={(layers as any) ?? [{ class: 'icon-layer' }]} connectorStyle={connectorStyle} below={drawChildrenBelow ? RenderChildren : null} content={CenterContent} diff --git a/kando-svelte/src/lib/PieTree.svelte b/kando-svelte/src/lib/PieTree.svelte index 41b094556..033bac2d1 100644 --- a/kando-svelte/src/lib/PieTree.svelte +++ b/kando-svelte/src/lib/PieTree.svelte @@ -4,13 +4,15 @@ // @ts-ignore import * as math from '@kando/common/math'; import { setContext } from 'svelte'; - import { PIE_TREE_CTX, type PieTreeContext } from './context'; + import { PIE_TREE_CTX, type PieTreeContext } from './context.js'; + // Use our local shim that re-exports the Kando GestureDetector + import { GestureDetector } from './gesture/gesture-detector.js'; export let root: MenuItem; export let center: Vec2 = { x: 200, y: 200 }; export let radiusPx = 140; export let settings: any = null; // pass Kando general settings (centerDeadZone, etc.) - export let layers: Array<{ class: string; content?: 'icon' | 'name' }>|null = null; + export let layers: ReadonlyArray<{ class: string; content?: 'icon' | 'name' | 'none' }>|null = null; export let centerTextWrapWidth: number | null = null; export let drawChildrenBelow: boolean = false; export let startPressed: boolean = false; // begin in pressed-static mode @@ -28,6 +30,7 @@ let pointerAbs: Vec2 | null = null; let pointerRel = { dx: 0, dy: 0, angle: 0, distance: 0 }; let childStates: string[] = []; + let detector: GestureDetector | null = null; function distance(a: Vec2, b: Vec2): number { const dx = a.x - b.x, dy = a.y - b.y; return Math.hypot(dx, dy); @@ -79,9 +82,20 @@ const pos = { x: client.x - rect.left, y: client.y - rect.top }; const rel = { x: pos.x - center.x, y: pos.y - center.y }; pointerRel = { dx: rel.x, dy: rel.y, angle: math.getAngle(rel), distance: Math.hypot(rel.x, rel.y) }; + + // Feed gesture detector when dragging; use relative coords from center + if (mode === 'pressed-dragging' && detector) { + const coords = { x: rel.x, y: rel.y } as Vec2; + console.log('[svelte-gesture] motion', coords); + detector.onMotionEvent(coords); + } } function onWindowPointerUp(e: PointerEvent) { + if (detector) { + console.log('[svelte-gesture] reset on pointerup'); + detector.reset(); + } if (mode === 'pressed-static') { // Decide click-up vs drag by jitter distance const releasePos = { x: e.clientX, y: e.clientY }; @@ -129,6 +143,22 @@ hoverIndex = -1; const count = levelItem()?.children?.length ?? 0; childStates = Array.from({ length: count }, () => 'child'); + // Initialize or reconfigure gesture detector + if (!detector) { + detector = new GestureDetector(); + detector.on('selection', () => { + console.log('[svelte-gesture] selection event'); + if (hoverIndex >= 0) triggerSelect(hoverIndex); + }); + } + if (settings) { + detector.minStrokeLength = Number(settings.gestureMinStrokeLength ?? 150); + detector.minStrokeAngle = Number(settings.gestureMinStrokeAngle ?? 20); + detector.jitterThreshold = Number(settings.gestureJitterThreshold ?? 10); + detector.pauseTimeout = Number(settings.gesturePauseTimeout ?? 100); + detector.centerDeadZone = Number(settings.centerDeadZone ?? 50); + detector.fixedStrokeLength = Number(settings.fixedStrokeLength ?? 0); + } } // If the popup opens from an external pointerdown (on the canvas), start tracking @@ -148,6 +178,21 @@ const rel = { x: pos.x - center.x, y: pos.y - center.y }; pointerRel = { dx: rel.x, dy: rel.y, angle: math.getAngle(rel), distance: Math.hypot(rel.x, rel.y) }; pointerAbs = { ...initialPointer }; + if (!detector) { + detector = new GestureDetector(); + detector.on('selection', () => { + console.log('[svelte-gesture] selection event (startPressed)'); + if (hoverIndex >= 0) triggerSelect(hoverIndex); + }); + } + if (settings) { + detector.minStrokeLength = Number(settings.gestureMinStrokeLength ?? 150); + detector.minStrokeAngle = Number(settings.gestureMinStrokeAngle ?? 20); + detector.jitterThreshold = Number(settings.gestureJitterThreshold ?? 10); + detector.pauseTimeout = Number(settings.gesturePauseTimeout ?? 100); + detector.centerDeadZone = Number(settings.centerDeadZone ?? 50); + detector.fixedStrokeLength = Number(settings.fixedStrokeLength ?? 0); + } } } diff --git a/kando-svelte/src/lib/gesture/gesture-detector.ts b/kando-svelte/src/lib/gesture/gesture-detector.ts new file mode 100644 index 000000000..f5ed7e8bc --- /dev/null +++ b/kando-svelte/src/lib/gesture/gesture-detector.ts @@ -0,0 +1,3 @@ +// Deprecated local shim; kept to avoid import breakages. Prefer @kando/gesture. +export { GestureDetector } from '@kando/gesture'; + diff --git a/kando-svelte/src/lib/theme-loader.ts b/kando-svelte/src/lib/theme-loader.ts index 57327c20f..b4f95a53c 100644 --- a/kando-svelte/src/lib/theme-loader.ts +++ b/kando-svelte/src/lib/theme-loader.ts @@ -1,5 +1,5 @@ import JSON5 from 'json5'; -import type { MenuThemeDescription } from './types'; +import type { MenuThemeDescription } from './types.js'; export async function fetchThemeJson(themeDirUrl: string, themeId: string): Promise { const base = themeDirUrl.replace(/\/$/, ''); diff --git a/kando-svelte/src/lib/types.ts b/kando-svelte/src/lib/types.ts index 1eefe7555..7c0fc5232 100644 --- a/kando-svelte/src/lib/types.ts +++ b/kando-svelte/src/lib/types.ts @@ -1,2 +1,14 @@ export type { Vec2, ShowMenuOptions, MenuThemeDescription } from '@kando/common'; -export type { MenuItemV1 as MenuItem, MenuV1, MenuCollectionV1 } from '@kando/schemata/menu-settings-v1'; +export type { MenuItemV1 as MenuItem, MenuV1, MenuCollectionV1 } from '@kando/common'; + +// Svelte-side trigger types (browser polyfill variant) +export type MouseButton = 'left' | 'middle' | 'right' | 'x1' | 'x2'; +export type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'; + +export type MouseTrigger = { + kind: 'mouse'; + button: MouseButton; + mods?: ModifierKey[]; +}; + +export type Trigger = MouseTrigger; // Extend with gamepad/keyboard variants as needed diff --git a/kando-svelte/src/routes/+page.svelte b/kando-svelte/src/routes/+page.svelte index d88f311fd..d5fda249f 100644 --- a/kando-svelte/src/routes/+page.svelte +++ b/kando-svelte/src/routes/+page.svelte @@ -1,17 +1,18 @@ {#if menu && theme} - onSelect(e.detail.path, e.detail.item)} /> + {/if} ``` @@ -410,6 +461,179 @@ Theme loader should parse JSON5, set `id` from parent dir, and `directory` to th --- +## PieTree callbacks and context (Svelte) + +This section defines the Svelte-friendly, function-based callback API for interactive pie menus. It complements Kando’s behavior while avoiding DOM event complexity. + +### Lifecycle and roles + +- PieTree: one interactive popup instance representing a menu tree. Created on demand; closes itself after select or cancel. +- Multiple previews: use a non-interactive preview component (future) for theme/menu browsers and editors; keep PieTree for tracking. + +### Transport: plain function callbacks + +- No DOM CustomEvents; the host app passes functions as props to `PieTree`. +- Every callback receives a single, strongly typed context object describing pointer, pie, menu, target, and (if applicable) item. + +### Context types (discriminated union) + +```ts +type Mods = { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean }; + +type Pointer = { + clientX: number; clientY: number; + dx: number; dy: number; + distance: number; angle: number; + button: 0|1|2|3|4; + mods: Mods; + // Input origin and keyboard details (when opened via keyboard) + source: 'mouse' | 'touch' | 'keyboard' | 'gamepad'; + key?: string; // e.g., 'K', 'Enter', 'ArrowRight' + code?: string; // e.g., 'KeyK', 'Enter', 'ArrowRight' + repeat?: boolean; // repeated keydown + location?: number;// KeyboardEvent.location (0: standard, 1: left, 2: right, 3: numpad) +}; + +type PieCtx = { + center: { x: number; y: number }; + radius: number; + chain: number[]; // current selection chain + hoverIndex: number; // -1 center, -2 parent, >=0 child index +}; + +type MenuCtx = { + item: MenuItem; // current (owning) menu item + indexPath: number[]; // path to current menu +}; + +type ItemCtx = { + item: MenuItem; index: number; path: string; + name?: string; data?: unknown; id?: string; +}; + +type BaseCtx = { + kind: + | 'open' | 'close' | 'cancel' + | 'hover' | 'path-change' + | 'mark-start' | 'mark-update' | 'mark-select' + | 'turbo-start' | 'turbo-end' + | 'select'; + time: number; + pointer: Pointer; + pie: PieCtx; + menu: MenuCtx; + target: unknown; // current context target + targetRoot?: unknown; // initial target + // Optional advanced: + targetStack?: unknown[]; +}; + +type HoverCtx = BaseCtx & { kind: 'hover'; item?: ItemCtx }; +type PathCtx = BaseCtx & { kind: 'path-change'; op: 'push'|'pop'; item?: ItemCtx }; +type MarkCtx = BaseCtx & { kind: 'mark-start'|'mark-update'|'mark-select' }; +type TurboCtx = BaseCtx & { kind: 'turbo-start'|'turbo-end' }; +type SelectCtx = BaseCtx & { kind: 'select'; item: ItemCtx }; +type OpenClose = BaseCtx & { kind: 'open'|'close'|'cancel' }; +``` + +### Callback contracts + +- onOpen(ctx: OpenClose) + - Fired when PieTree becomes interactive. +- onClose(ctx: OpenClose) + - Fired after select/cancel; the popup is already hidden. +- onCancel(ctx: OpenClose) + - RMB cancel (when not selecting parent), back/escape, or app-requested cancel. +- onHover(ctx: HoverCtx) + - Fired when hovered target changes (child/back/center), not on every move. +- onPathChange(ctx: PathCtx) + - Fired after selection chain changes: + - op='push' when entering a submenu (selected child had children) + - op='pop' when going back (parent) + - Use for submenu “select/deselect” side-effects (e.g., mutate target). +- onMark(ctx: MarkCtx) + - mark-start: entering drag (or turbo drag) + - mark-update: throttled gesture progress + - mark-select: corner/pause caused submenu selection (GestureDetector) +- onTurbo(ctx: TurboCtx) + - Modifier-based drag toggles +- onSelect(ctx: SelectCtx) + - Leaf selected. Library will close immediately after returning from this handler. + +### Target inheritance/override + +- PieTree accepts `initialTarget?: unknown` and optional `resolveTarget?: (current: unknown, item: MenuItem) => unknown`. +- Maintains a `targetStack` aligned to `pie.chain`: + - push on submenu entry: resolver can return a new target or keep existing + - pop on back: restore parent target +- `ctx.target` reflects the active target for every callback. + +### Triggers and opening + +- Browser/Svelte: host app detects triggers (e.g., RMB) and mounts one PieTree at the pointer with `{ startPressed, initialPointer }`. +- Native/Electron (later): native layer opens the overlay; the same props drive PieTree. + +### Design rationale + +- Single, typed context object keeps the API stable and expressive. +- No DOM events/bubbling: simpler, testable, and app-controlled. +- Symbolic actions in `item.data` drive application behavior; no functions in JSON. + +--- + +## Keyboard, focus, and accessibility (plan) + +Goal: first‑class keyboard navigation and screen‑reader support without global key capture. Leverage ARIA and focus semantics so assistive tech can follow state changes. + +### Scope and event model + +- Scope keyboard to the PieTree overlay (focused container). Do not attach global handlers, except letting Escape bubble if desired. +- Keep all other input on the focused menu container or items (no window‑level listeners). Pointer/gamepad continue to work in parallel. + +### Roles and structure + +- Container (interactive): + - role="menu" (context menu), aria‑label + - Focus trap on open; restore previous focus on close + - Focus model (choose one): + - Roving tabindex: tabindex=0 on the active item; −1 on others; container handles keys + - Or aria‑activedescendant: focus stays on container; set aria‑activedescendant to active item id +- Items: + - role="menuitem" (or menuitemcheckbox/menuitemradio) + - Submenu parents: aria‑haspopup="menu"; aria‑expanded=true when open + - aria‑disabled for unavailable entries; ensure readable names + +### Key bindings (overlay focused) + +- ArrowLeft/ArrowRight: move active item clockwise/counterclockwise +- ArrowUp/ArrowDown: optional vertical variants +- Enter/Space: select active item +- ArrowRight/Enter on submenu parent: open submenu (push chain) +- ArrowLeft/Backspace/Delete: go to parent (pop chain) +- Escape: close entire tree immediately +- Tab: either preventDefault (arrow‑driven) or confine to container + +### Submenus and chain updates + +- Push: set aria‑expanded on parent; choose initial active in new level; optionally announce +- Pop: clear aria‑expanded on previous parent; recompute active in restored level + +### Screen readers + +- Stable readable names; reflect current item via roving tabindex or aria‑activedescendant +- Keep announcements terse; avoid frequent updates on pointer hover + +### Implementation notes + +- PieTree: focus container on open; trap focus; restore on close; maintain activeIndex per level; harmonize pointer and keyboard +- PieItem: stable ids if activedescendant used; roles and aria attributes for submenu parents +- Pointer + keyboard: pointer hover sets activeIndex; keys move it; selection logic identical + +### Why not global capture + +- Global handlers bypass AT and can collide with app shortcuts. Scoped handlers on a focused container yield predictable behavior and better a11y. + + ## License and provenance This project intentionally reuses—and where practical, copies—Kando’s source code, APIs, schemas, algorithms, and contracts to maximize compatibility and ease of synchronization. Preserve original copyright headers and SPDX identifiers, retain license notices, and attribute the Kando project and its author. Kando is licensed under MIT; theme assets and fonts carry their own licenses (e.g., CC0-1.0 for the default theme, Material Symbols, Simple Icons). Ensure all copied files keep their original licenses and attributions. @@ -685,3 +909,36 @@ Kando stores settings in two JSON files: `config.json` (general) and `menus.json - Theme editor preview (read-only) and ultimately a Svelte menu editor. - Micropolis adapter package implementing command/file/hotkey/macro. --- + +## Terminology and callback model + +The model is: + +- Components: `PieTree`, `PieMenu`, `PieItem`. +- Callbacks: plain function props on `PieTree` only. No DOM `CustomEvent`s, no component instances passed out. +- Context: a single "kitchen-sink" discriminated union object with shared fields and a `kind` discriminator. + +Shared context shapes used across all callbacks: + +```startLine:endLine:kando-svelte/src/lib/PieTree.svelte +// PointerCtx, PieCtx, MenuCtx, ItemCtx, BaseCtx (see source for full types) +``` + +Concrete callback variants (subset): `open | close | cancel | hover | path-change | mark-start | mark-update | mark-select | turbo-start | turbo-end | select`. + +Example signatures implemented in `PieTree.svelte`: + +```startLine:endLine:kando-svelte/src/lib/PieTree.svelte +export let onOpenCtx: ((ctx: OpenCloseCtx) => void) | null = null; +export let onCloseCtx: ((ctx: OpenCloseCtx) => void) | null = null; +export let onCancelCtx: ((ctx: OpenCloseCtx) => void) | null = null; +export let onHoverCtx: ((ctx: HoverCtx) => void) | null = null; +export let onPathChangeCtx: ((ctx: PathCtx) => void) | null = null; +export let onMarkCtx: ((ctx: MarkCtx) => void) | null = null; +export let onSelectCtx: ((ctx: SelectCtx) => void) | null = null; +``` + +Notes: +- We never pass Svelte components or DOM nodes to clients; `ItemCtx/MenuCtx/PieCtx` expose the necessary state in a type-safe way. +- Keyboard/gamepad integration extends `PointerCtx` with keys/locations while keeping the same callback surface. + diff --git a/kando-svelte/src/app.html b/kando-svelte/src/app.html index bbc7186c4..ab3fae541 100644 --- a/kando-svelte/src/app.html +++ b/kando-svelte/src/app.html @@ -5,6 +5,8 @@ + + diff --git a/kando-svelte/src/lib/PieItem.svelte b/kando-svelte/src/lib/PieItem.svelte index 65015698e..39dccded3 100644 --- a/kando-svelte/src/lib/PieItem.svelte +++ b/kando-svelte/src/lib/PieItem.svelte @@ -30,6 +30,11 @@ export let dataLevel: number | null = null; // Theme layers (back-to-front iterate reversed) like Kando's MenuThemeDescription.layers export let layers: Array<{ class: string; content?: 'icon' | 'name' | 'none' }>|null = null; + export let labelsEnabled: boolean = false; + // Accessibility + export let ariaRole: string = 'menuitem'; + export let idAttr: string | null = null; + $: hasNameLayer = !!(layers && layers.some((l) => l.content === 'name')); // Snippet insertion points to replace slots export let below: Snippet<[ { index: number } ]>|null = null; export let belowIndex: number | null = null; @@ -43,6 +48,9 @@ data-type={item.type} data-path={dataPath} data-level={dataLevel} + role={ariaRole} + aria-label={hasNameLayer ? undefined : item.name} + id={idAttr ?? undefined} style="--dir-x: {dirX}; --dir-y: {dirY}; --angle: {angle}deg; --sibling-count: {siblingCount}; {parentAngle != null ? `--parent-angle: ${parentAngle}deg;` : ''}{angleDiff != null ? ` --angle-diff: ${angleDiff};` : ''}{childDistancePx != null ? ` --child-distance: ${childDistancePx}px;` : ''}{forceAbsolute && absLeft != null && absTop != null ? ` left: ${absLeft}px; top: ${absTop}px; transform: translate(-50%, -50%) !important;` : ''}{transformStyle ? ` transform: ${transformStyle};` : ''}"> {#if (item as any)?.children?.length}
      @@ -54,15 +62,18 @@ {#if layers && layers.length} {#each [...layers].reverse() as layer}
      {#if layer.content === 'name'} - {item.name} + {#if labelsEnabled} + {item.name} + {/if} {:else if layer.content === 'icon'} -
      + {/each} {:else} -
      -
      + + {/if} @@ -94,5 +105,10 @@ .menu-node, .menu-node *, .menu-node *::before, .menu-node *::after { user-select: none; -webkit-user-select: none; -webkit-user-drag: none; -khtml-user-drag: none; -moz-user-select: none; -ms-user-select: none; } + /* Prevent any text label layer from flashing before icons are ready or unless explicitly requested by theme */ + :global(html:not(.kando-icons-ready) .menu-node .label-layer), + :global(html:not(.kando-icons-ready) .menu-node [data-content="name"]) { opacity: 0 !important; visibility: hidden !important; } + :global(html:not(.kando-icons-ready) .material-symbols-rounded) { opacity: 0 !important; visibility: hidden !important; } + :global(html:not(.kando-icons-ready) .si) { opacity: 0 !important; visibility: hidden !important; } diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte index 87eb430c9..916b35015 100644 --- a/kando-svelte/src/lib/PieMenu.svelte +++ b/kando-svelte/src/lib/PieMenu.svelte @@ -27,8 +27,10 @@ export let childClassBase: string = 'child'; // Theme-driven layers (Kando MenuThemeDescription.layers) export let layers: { class: string; content?: 'icon'|'name'|'none' }[] | null = null; + export let labelsEnabled: boolean = false; export let centerTextWrapWidth: number | null = null; export let drawChildrenBelow: boolean = false; + export let renderGrandchildren: boolean = true; // allow parent preview to suppress nubs let childAngles: number[] = []; let childPositions: { x: number; y: number }[] = []; @@ -96,7 +98,7 @@ {#snippet RenderGrandchildren({ index }: { index: number })} {#if (item?.children?.[index] as any)?.children?.length} {#each grandAnglesByChild[index] as gAng, j} - + layers={(layers as any) ?? [{ class: 'icon-layer' }]} + labelsEnabled={labelsEnabled} /> {/each} {/if} {/snippet} @@ -127,8 +130,9 @@ angleDiff={pointerAngle != null ? Math.min(Math.abs((childAngles[i] - pointerAngle) % 360), 360 - Math.abs((childAngles[i] - pointerAngle) % 360)) : null} dataPath={`/${i}`} dataLevel={1} - layers={(layers as any) ?? [{ class: 'icon-layer' }]} - below={RenderGrandchildren} + layers={(layers as any) ?? [{ class: 'icon-layer' }]} + labelsEnabled={labelsEnabled} + below={renderGrandchildren ? RenderGrandchildren : null} belowIndex={i} /> {/each} @@ -139,6 +143,9 @@ {@render RenderChildren()} {/if} + + {centerLabel} + {/snippet}
      @@ -158,6 +165,7 @@ dataPath={'/'} dataLevel={0} layers={(layers as any) ?? [{ class: 'icon-layer' }]} + labelsEnabled={labelsEnabled} connectorStyle={connectorStyle} below={drawChildrenBelow ? RenderChildren : null} content={CenterContent} @@ -168,7 +176,7 @@
      diff --git a/kando-svelte/src/lib/PieTree.svelte b/kando-svelte/src/lib/PieTree.svelte index 033bac2d1..f605fcbab 100644 --- a/kando-svelte/src/lib/PieTree.svelte +++ b/kando-svelte/src/lib/PieTree.svelte @@ -15,8 +15,13 @@ export let layers: ReadonlyArray<{ class: string; content?: 'icon' | 'name' | 'none' }>|null = null; export let centerTextWrapWidth: number | null = null; export let drawChildrenBelow: boolean = false; + // Control whether label layers (name text) are rendered at all. Defaults off to avoid any flash. + export let labelsEnabled: boolean = false; export let startPressed: boolean = false; // begin in pressed-static mode export let initialPointer: Vec2 | null = null; // client coordinates where press happened + // Optional: targeting for context-sensitive menus + export let initialTarget: unknown = undefined; + export let resolveTarget: ((currentTarget: unknown, item: any) => unknown) | null = null; // selectionChain of indices from root (Kando-compatible concept) let chain: number[] = []; @@ -25,12 +30,41 @@ type Mode = 'idle' | 'pressed-static' | 'pressed-dragging' | 'hovering'; let mode: Mode = 'idle'; let pressPos: Vec2 | null = null; + let pressedButton: number | null = null; // 0=left, 1=middle, 2=right, 3=x1, 4=x2 let hoverIndex: number = -1; - const jitterThresholdPx = 2; // per user request + const jitterThresholdPx = 2; // micro jitter filter only; click-vs-drag uses settings.dragThreshold let pointerAbs: Vec2 | null = null; let pointerRel = { dx: 0, dy: 0, angle: 0, distance: 0 }; let childStates: string[] = []; let detector: GestureDetector | null = null; + let tipMenu: any = null; + // Track modifiers and target stack for context callbacks + let lastMods = { ctrl: false, alt: false, shift: false, meta: false }; + const targetStack: unknown[] = []; + + // Function-based callbacks (no DOM events) + export let onSelect: ((ev: { kind: 'select' }, pieTree: PieTreeContext, pieMenu: { getItem(): any; getIndexPath(): number[]; getCenter(): Vec2; getRadius(): number }, pieItem: { getItem(): any; getIndex(): number; getPath(): string; getData(): unknown } | null) => void) | null = null; + export let onCancel: ((ev: { kind: 'cancel' }, pieTree: PieTreeContext) => void) | null = null; + + // Unified context-based callbacks (optional) + type Mods = { ctrl: boolean; alt: boolean; shift: boolean; meta: boolean }; + type PointerCtx = { clientX: number; clientY: number; dx: number; dy: number; distance: number; angle: number; button: 0|1|2|3|4; mods: Mods; source: 'mouse'|'touch'|'keyboard'|'gamepad'; key?: string; code?: string; repeat?: boolean; location?: number }; + type PieCtx = { center: { x:number;y:number }; radius: number; chain: number[]; hoverIndex: number }; + type MenuCtx = { item: any; indexPath: number[] }; + type ItemCtx = { item: any; index: number; path: string; name?: string; data?: unknown; id?: string }; + type BaseCtx = { kind: 'open'|'close'|'cancel'|'hover'|'path-change'|'mark-start'|'mark-update'|'mark-select'|'turbo-start'|'turbo-end'|'select'; time: number; pointer: PointerCtx; pie: PieCtx; menu: MenuCtx; target: unknown; targetRoot?: unknown; targetStack?: unknown[] }; + type SelectCtx = BaseCtx & { kind: 'select'; item: ItemCtx }; + type HoverCtx = BaseCtx & { kind: 'hover'; item?: ItemCtx }; + type PathCtx = BaseCtx & { kind: 'path-change'; op: 'push'|'pop'; item?: ItemCtx }; + type MarkCtx = BaseCtx & { kind: 'mark-start'|'mark-update'|'mark-select' }; + type OpenCloseCtx = BaseCtx & { kind: 'open'|'close'|'cancel' }; + export let onOpenCtx: ((ctx: OpenCloseCtx) => void) | null = null; + export let onCloseCtx: ((ctx: OpenCloseCtx) => void) | null = null; + export let onCancelCtx: ((ctx: OpenCloseCtx) => void) | null = null; + export let onHoverCtx: ((ctx: HoverCtx) => void) | null = null; + export let onPathChangeCtx: ((ctx: PathCtx) => void) | null = null; + export let onMarkCtx: ((ctx: MarkCtx) => void) | null = null; + export let onSelectCtx: ((ctx: SelectCtx) => void) | null = null; function distance(a: Vec2, b: Vec2): number { const dx = a.x - b.x, dy = a.y - b.y; return Math.hypot(dx, dy); @@ -38,6 +72,17 @@ function levelItem(): any { return currentItem(); } + function getChainItemNames(path: number[] = chain): string[] { + const names: string[] = []; + let it: any = root; + for (const idx of path) { + const child = it?.children?.[idx]; + names.push(child?.name ?? `#${idx}`); + it = child; + } + return names; + } + function computeHoverIndex(client: Vec2, host: HTMLElement): number { const rect = host.getBoundingClientRect(); const pos = { x: client.x - rect.left, y: client.y - rect.top }; @@ -50,7 +95,10 @@ const wedgeInfo = math.computeItemWedges(angles); for (let i = 0; i < wedgeInfo.itemWedges.length; i++) { const w = wedgeInfo.itemWedges[i]; - if (math.isAngleBetween(angle, w.start, w.end)) return i; + if (math.isAngleBetween(angle, w.start, w.end)) { + console.log('[pie-tree:hover-hit]', { angle: Number(angle.toFixed(1)), index: i, wedge: { start: Number(w.start.toFixed(1)), end: Number(w.end.toFixed(1)) }, chain, chainNames: getChainItemNames() }); + return i; + } } if (wedgeInfo.parentWedge && math.isAngleBetween(angle, wedgeInfo.parentWedge.start, wedgeInfo.parentWedge.end)) { return -2; // parent @@ -61,14 +109,27 @@ function onWindowPointerMove(e: PointerEvent) { if (mode === 'idle') return; const host = container as HTMLElement | null; if (!host) return; - if (mode === 'pressed-static' && pressPos) { - if (distance(pressPos, { x: e.clientX, y: e.clientY }) > jitterThresholdPx) { + const dragThreshold = Number(settings?.dragThreshold ?? 15); + if (mode === 'pressed-static' && pressPos && pressedButton === 0) { + const dFromPress = distance(pressPos, { x: e.clientX, y: e.clientY }); + if (dFromPress > dragThreshold) { mode = 'pressed-dragging'; + console.log('[pie-tree:state] enter dragging (dist=%d > %d)', dFromPress, dragThreshold); } } const client = { x: e.clientX, y: e.clientY }; + lastMods = { ctrl: e.ctrlKey, alt: e.altKey, shift: e.shiftKey, meta: e.metaKey }; + const rect = host.getBoundingClientRect(); + const pos = { x: client.x - rect.left, y: client.y - rect.top }; + const rel = { x: pos.x - center.x, y: pos.y - center.y }; + const dead = Number(settings?.centerDeadZone ?? 50); + const distCenter = Math.hypot(rel.x, rel.y); const idx = computeHoverIndex(client, host); - if (idx !== hoverIndex) hoverIndex = idx; + if (idx !== hoverIndex) { + hoverIndex = idx; console.log('[pie-tree:move] mode=%s idx=%d distCenter=%d dead=%d chain=%s', mode, idx, Math.round(distCenter), dead, getChainItemNames().join(' > ')); + const itemCtx = idx >= 0 ? buildItemCtx(idx) : undefined; + onHoverCtx?.(buildBaseCtx('hover', itemCtx)); + } // update child state classes like Kando const count = levelItem()?.children?.length ?? 0; childStates = Array.from({ length: count }, (_, i) => { @@ -78,42 +139,49 @@ return `child${hovered}${clicked}${dragged}`.trim(); }); pointerAbs = client; - const rect = host.getBoundingClientRect(); - const pos = { x: client.x - rect.left, y: client.y - rect.top }; - const rel = { x: pos.x - center.x, y: pos.y - center.y }; pointerRel = { dx: rel.x, dy: rel.y, angle: math.getAngle(rel), distance: Math.hypot(rel.x, rel.y) }; // Feed gesture detector when dragging; use relative coords from center - if (mode === 'pressed-dragging' && detector) { + if (mode === 'pressed-dragging' && detector && pressedButton === 0) { const coords = { x: rel.x, y: rel.y } as Vec2; console.log('[svelte-gesture] motion', coords); detector.onMotionEvent(coords); + onMarkCtx?.(buildBaseCtx('mark-update')); } } function onWindowPointerUp(e: PointerEvent) { - if (detector) { + console.log('[pie-tree:up] mode=%s button=%s', mode, String(pressedButton)); + if (detector && pressedButton === 0) { console.log('[svelte-gesture] reset on pointerup'); detector.reset(); } + if (pressedButton !== 0) { + pressedButton = null; mode = 'idle'; return; + } if (mode === 'pressed-static') { // Decide click-up vs drag by jitter distance const releasePos = { x: e.clientX, y: e.clientY }; const dist = pressPos ? distance(pressPos, releasePos) : 0; - if (dist <= jitterThresholdPx) { + const dragThreshold = Number(settings?.dragThreshold ?? 15); + if (dist <= dragThreshold) { // Click-up: enter hovering mode, keep current tracking mode = 'hovering'; + console.log('[pie-tree:click] click-up -> hovering (dist=%d <= %d)', dist, dragThreshold); } else { // Treated as drag-selection on release + console.log('[pie-tree:drag] release (dist=%d > %d)', dist, dragThreshold); if (hoverIndex >= 0) triggerSelect(hoverIndex); mode = 'idle'; } } else if (mode === 'pressed-dragging') { // Release selects if over an item + console.log('[pie-tree:drag] release in dragging'); if (hoverIndex >= 0) triggerSelect(hoverIndex); mode = 'idle'; } else if (mode === 'hovering') { // Second release triggers selection + console.log('[pie-tree:hover] release selects'); if (hoverIndex >= 0) triggerSelect(hoverIndex); mode = 'idle'; } @@ -126,30 +194,86 @@ const item = levelItem()?.children?.[index]; if (!item) return; if (item.children?.length) { + // Enter submenu: notify path-change and update target stack + console.log('[pie-tree:select] submenu index=%d name=%s', index, item?.name); + onPathChangeCtx?.(buildBaseCtx('path-change', buildItemCtx(index), 'push')); + const currentTarget = targetStack.length ? targetStack[targetStack.length - 1] : initialTarget; + const newTarget = resolveTarget ? resolveTarget(currentTarget, item) : undefined; + targetStack.push(newTarget !== undefined ? newTarget : currentTarget); chain = [...chain, index]; + console.log('[pie-tree:chain-push]', { chain, chainNames: getChainItemNames(), current: currentItem()?.name, children: currentItem()?.children?.length ?? 0 }); + // Immediately recompute hover/child state for the new level so tracking continues + if (container && pointerAbs) { + const idxNew = computeHoverIndex({ x: pointerAbs.x, y: pointerAbs.y }, container); + hoverIndex = idxNew; + const count = levelItem()?.children?.length ?? 0; + childStates = Array.from({ length: count }, (_, i) => { + const hovered = i === hoverIndex ? ' hovered' : ''; + const clicked = mode === 'pressed-static' && i === hoverIndex ? ' clicked' : ''; + const dragged = mode === 'pressed-dragging' && i === hoverIndex ? ' dragged' : ''; + return `child${hovered}${clicked}${dragged}`.trim(); + }); + // Refresh pointerRel for connectors relative to same center + const rect = container.getBoundingClientRect(); + const pos = { x: pointerAbs.x - rect.left, y: pointerAbs.y - rect.top }; + const rel = { x: pos.x - center.x, y: pos.y - center.y }; + pointerRel = { dx: rel.x, dy: rel.y, angle: math.getAngle(rel), distance: Math.hypot(rel.x, rel.y) }; + console.log('[pie-tree:submenu-ready]', { hoverIndex, count, pointerRel }); + } } else { - const path = '/' + chain.concat(index).join('/'); - const name = item?.name; - dispatchEvent(new CustomEvent('select', { detail: { path, item, name } })); + // Leaf select: call both legacy and ctx-based callbacks + console.log('[pie-tree:select] leaf index=%d name=%s', index, item?.name); + onSelect?.({ kind: 'select' }, ({} as any), tipMenu, null); + onSelectCtx?.(buildBaseCtx('select', buildItemCtx(index)) as any); + mode = 'idle'; + pressedButton = null; + if (detector) detector.reset(); + onCloseCtx?.(buildBaseCtx('close')); } } let container: HTMLElement | null = null; let startedFromProp = false; function onPointerDown(e: PointerEvent) { + console.log('[pie-tree] pointerdown', { button: e.button }); + pressedButton = e.button; + // RMB closes or selects parent like Kando + if (pressedButton === 2) { + if (settings?.rmbSelectsParent && chain.length) { + console.log('[pie-tree] RMB -> back'); + handleBack(); + } else { + console.log('[pie-tree] RMB -> cancel'); + onCancel?.({ kind: 'cancel' }, ctx); + onCancelCtx?.(buildBaseCtx('cancel')); + onCloseCtx?.(buildBaseCtx('close')); + } + return; + } + // Mouse back button selects parent + if (pressedButton === 3) { + console.log('[pie-tree] X1/back -> back'); + handleBack(); + return; + } + if (pressedButton !== 0) return; // only left button starts selection pressPos = { x: e.clientX, y: e.clientY }; - mode = 'pressed-static'; - // start with nothing selected while inside dead zone - hoverIndex = -1; - const count = levelItem()?.children?.length ?? 0; - childStates = Array.from({ length: count }, () => 'child'); + if (mode === 'idle') { + mode = 'pressed-static'; + lastMods = { ctrl: e.ctrlKey, alt: e.altKey, shift: e.shiftKey, meta: e.metaKey }; + if (targetStack.length === 0) targetStack.push(initialTarget); + // start with nothing selected while inside dead zone + hoverIndex = -1; + const count = levelItem()?.children?.length ?? 0; + childStates = Array.from({ length: count }, () => 'child'); + onOpenCtx?.(buildBaseCtx('open')); + } else { + // keep current mode (hovering/dragging) + lastMods = { ctrl: e.ctrlKey, alt: e.altKey, shift: e.shiftKey, meta: e.metaKey }; + } // Initialize or reconfigure gesture detector if (!detector) { detector = new GestureDetector(); - detector.on('selection', () => { - console.log('[svelte-gesture] selection event'); - if (hoverIndex >= 0) triggerSelect(hoverIndex); - }); } if (settings) { detector.minStrokeLength = Number(settings.gestureMinStrokeLength ?? 150); @@ -166,8 +290,10 @@ $: if (startPressed && !startedFromProp && container) { startedFromProp = true; if (initialPointer) { + console.log('[pie-tree:start] startPressed with initialPointer', initialPointer); pressPos = { x: initialPointer.x, y: initialPointer.y }; mode = 'pressed-static'; + pressedButton = 0; // initialize with no selection hoverIndex = -1; const count = levelItem()?.children?.length ?? 0; @@ -178,6 +304,7 @@ const rel = { x: pos.x - center.x, y: pos.y - center.y }; pointerRel = { dx: rel.x, dy: rel.y, angle: math.getAngle(rel), distance: Math.hypot(rel.x, rel.y) }; pointerAbs = { ...initialPointer }; + if (targetStack.length === 0) targetStack.push(initialTarget); if (!detector) { detector = new GestureDetector(); detector.on('selection', () => { @@ -193,9 +320,16 @@ detector.centerDeadZone = Number(settings.centerDeadZone ?? 50); detector.fixedStrokeLength = Number(settings.fixedStrokeLength ?? 0); } + onOpenCtx?.(buildBaseCtx('open')); } } + // Log when chain changes for easier tracing of submenu push/pop + $: (function(){ + const name = currentItem()?.name; + console.log('[pie-tree:chain]', { chain, chainNames: getChainItemNames(), current: name, children: currentItem()?.children?.length ?? 0 }); + })(); + // Provide PieTree context to descendants const ctx: PieTreeContext = { getChain: () => [...chain], @@ -217,50 +351,115 @@ for (const idx of chain) it = it?.children?.[idx]; return it; } + function parentItem(): any { + if (!chain.length) return null; + let it: any = root; + for (let i = 0; i < chain.length - 1; i++) it = it?.children?.[chain[i]]; + return it; + } - function handleSelectLevel(e: CustomEvent<{ index: number; item: any }>) { - const { index, item } = e.detail; - if (item?.children?.length) { - chain = [...chain, index]; - } else { - // Leaf selection - emit out for host app - const path = '/' + chain.concat(index).join('/'); - const name = item?.name; - dispatchEvent(new CustomEvent('select', { detail: { path, item, name } })); - } + // Angle (direction) from parent to the selected child in the previous level + function selectedChildAngleFromParent(): number | null { + if (!chain.length) return null; + const parent = parentItem(); + const sel = chain[chain.length - 1]; + const kids = parent?.children ?? []; + const fixed = kids.map((c: any) => (c && c.angle != null ? { angle: c.angle } : {})); + const angs = math.computeItemAngles(fixed as any); + const ang = angs?.[sel]; + return typeof ang === 'number' ? ang : null; } function handleBack() { - if (chain.length) chain = chain.slice(0, -1); + if (chain.length) { + const lastIndex = chain[chain.length - 1]; + console.log('[pie-tree:back] pop level from index', lastIndex); + onPathChangeCtx?.(buildBaseCtx('path-change', buildItemCtx(lastIndex), 'pop')); + chain = chain.slice(0, -1); + targetStack.pop(); + } + } + + function onWindowKeyDown(e: KeyboardEvent) { + if (e.key === 'Escape') { + console.log('[pie-tree:key] Escape -> cancel'); + onCancel?.({ kind: 'cancel' }, ctx); + onCancelCtx?.(buildBaseCtx('cancel')); + onCloseCtx?.(buildBaseCtx('close')); + return; + } + if (e.key === 'Backspace' || e.key === 'Delete') { + console.log('[pie-tree:key] %s -> back', e.key); + handleBack(); + return; + } + } + + // Context builders + function now(): number { return Date.now(); } + function buildPointerCtx(): any { + return { + clientX: pointerAbs?.x ?? 0, + clientY: pointerAbs?.y ?? 0, + dx: pointerRel.dx, dy: pointerRel.dy, + distance: pointerRel.distance, + angle: pointerRel.angle, + button: (pressedButton ?? 0), + mods: { ...lastMods }, + source: 'mouse' + }; + } + function buildPieCtx(): any { return { center, radius: radiusPx, chain: [...chain], hoverIndex }; } + function buildMenuCtx(): any { return { item: currentItem(), indexPath: [...chain] }; } + function buildItemCtx(index: number): any { + const it = levelItem()?.children?.[index]; + const idxPath = chain.concat(index); + return { item: it, index, path: '/' + idxPath.join('/'), name: it?.name, data: (it as any)?.data, id: (it as any)?.data?.id }; + } + function buildBaseCtx(kind: any, item?: any, op?: 'push'|'pop'): any { + const base: any = { + kind, time: now(), pointer: buildPointerCtx(), pie: buildPieCtx(), menu: buildMenuCtx(), + target: targetStack.length ? targetStack[targetStack.length - 1] : initialTarget, + targetRoot: initialTarget, + targetStack: [...targetStack] + }; + if (kind === 'select' && item) return { ...base, item }; + if (kind === 'hover') return { ...base, item }; + if (kind === 'path-change') return { ...base, op, item }; + return base; } -
      {#if chain.length} - + {/if} {#key chain.join(',')} - + centerTextWrapWidth={centerTextWrapWidth} /> {/key}
      - + diff --git a/kando-svelte/src/lib/context.ts b/kando-svelte/src/lib/context.ts index 1117a1477..67a8998e2 100644 --- a/kando-svelte/src/lib/context.ts +++ b/kando-svelte/src/lib/context.ts @@ -26,4 +26,8 @@ export type PieMenuContext = { export const PIE_MENU_CTX: unique symbol = Symbol('pie-menu'); +// Optional: internal registry mapping item path -> PieItem component instance +export type ItemRegistry = Map; +export const ITEM_REGISTRY_CTX: unique symbol = Symbol('item-registry'); + diff --git a/kando-svelte/src/routes/+page.svelte b/kando-svelte/src/routes/+page.svelte index d5fda249f..94fb83e9f 100644 --- a/kando-svelte/src/routes/+page.svelte +++ b/kando-svelte/src/routes/+page.svelte @@ -1,5 +1,5 @@ - -{#if visible} - -{/if} - - diff --git a/kando-svelte/src/lib/MenuOutline.svelte b/kando-svelte/src/lib/MenuOutline.svelte deleted file mode 100644 index efb4ae755..000000000 --- a/kando-svelte/src/lib/MenuOutline.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -
    • - {item.name} ({item.type}{item.angle != null ? ` @ ${item.angle}°` : ''} - {item.icon ? `, icon: ${item.icon}` : ''} - {item.iconTheme ? `, theme: ${item.iconTheme}` : ''}) - {#if item.children?.length} -
        - {#each item.children as c} - - {/each} -
      - {/if} -
    • diff --git a/kando-svelte/src/lib/PieItem.svelte b/kando-svelte/src/lib/PieItem.svelte deleted file mode 100644 index 39dccded3..000000000 --- a/kando-svelte/src/lib/PieItem.svelte +++ /dev/null @@ -1,114 +0,0 @@ - - -
      - {#if (item as any)?.children?.length} -
      - {/if} - - {#if below && belowIndex != null} - {@render below({ index: belowIndex })} - {/if} - {#if layers && layers.length} - {#each [...layers].reverse() as layer} -
      - {#if layer.content === 'name'} - {#if labelsEnabled} - {item.name} - {/if} - {:else if layer.content === 'icon'} - - {/if} -
      - {/each} - {:else} - - - {/if} - {#if content} - {@render content({})} - {/if} -
      - - diff --git a/kando-svelte/src/lib/PieMenu.svelte b/kando-svelte/src/lib/PieMenu.svelte deleted file mode 100644 index 916b35015..000000000 --- a/kando-svelte/src/lib/PieMenu.svelte +++ /dev/null @@ -1,182 +0,0 @@ - - - -{#snippet RenderGrandchildren({ index }: { index: number })} - {#if (item?.children?.[index] as any)?.children?.length} - {#each grandAnglesByChild[index] as gAng, j} - - {/each} - {/if} -{/snippet} - -{#snippet RenderChildren()} - {#each item?.children ?? [] as c, i} - - {/each} -{/snippet} - -{#snippet CenterContent()} - {#if !drawChildrenBelow} - {@render RenderChildren()} - {/if} - - - {centerLabel} - -{/snippet} - -
      - - = 0 ? childAngles[hoveredIndex] : (parentAngle != null ? (parentAngle + 180) % 360 : null)} - parentHovered={hoverIndex === -2} - transformStyle={`translate(${center.x}px, ${center.y}px)`} - childDistancePx={radiusPx} - dataPath={'/'} - dataLevel={0} - layers={(layers as any) ?? [{ class: 'icon-layer' }]} - labelsEnabled={labelsEnabled} - connectorStyle={connectorStyle} - below={drawChildrenBelow ? RenderChildren : null} - content={CenterContent} - > - - - -
      - - diff --git a/kando-svelte/src/lib/SelectionWedges.svelte b/kando-svelte/src/lib/SelectionWedges.svelte deleted file mode 100644 index 4f645e120..000000000 --- a/kando-svelte/src/lib/SelectionWedges.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -
      diff --git a/kando-svelte/src/lib/WedgeSeparators.svelte b/kando-svelte/src/lib/WedgeSeparators.svelte deleted file mode 100644 index 47c1e62d0..000000000 --- a/kando-svelte/src/lib/WedgeSeparators.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/kando-svelte/src/lib/components/CenterText.svelte b/kando-svelte/src/lib/components/CenterText.svelte new file mode 100644 index 000000000..5d2a453a4 --- /dev/null +++ b/kando-svelte/src/lib/components/CenterText.svelte @@ -0,0 +1,24 @@ + + +{#if visible} + + + +{/if} + + diff --git a/kando-svelte/src/lib/components/MenuOutline.svelte b/kando-svelte/src/lib/components/MenuOutline.svelte new file mode 100644 index 000000000..b221c0d86 --- /dev/null +++ b/kando-svelte/src/lib/components/MenuOutline.svelte @@ -0,0 +1,28 @@ + + +
    • + + + {item.name} ({item.type}{item.angle != null ? ` @ ${item.angle}°` : ''} + {item.icon ? `, icon: ${item.icon}` : ''} + {item.iconTheme ? `, theme: ${item.iconTheme}` : ''}) + + + {#if item.children?.length} + +
        + {#each item.children as c} + + {/each} +
      + + {/if} + +
    • diff --git a/kando-svelte/src/lib/components/PieItem.svelte b/kando-svelte/src/lib/components/PieItem.svelte new file mode 100644 index 000000000..ed3651e2d --- /dev/null +++ b/kando-svelte/src/lib/components/PieItem.svelte @@ -0,0 +1,158 @@ + + +
      + + +
      + + + {#if below} + + {@render below({ index: belowIndex ?? 0 })} + + {/if} + + {#if layers && layers.length} + + {#each [...layers].reverse() as layer} + +
      + + {#if layer.content === 'name'} + + {item.name} + + {:else if layer.content === 'icon'} + + + + {/if} + +
      + + {/each} + + {:else} + + + + + + {/if} + + {#if content} + + {@render content({})} + + {/if} + +
      + + diff --git a/kando-svelte/src/lib/components/PieMenu.svelte b/kando-svelte/src/lib/components/PieMenu.svelte new file mode 100644 index 000000000..beee98084 --- /dev/null +++ b/kando-svelte/src/lib/components/PieMenu.svelte @@ -0,0 +1,448 @@ + + +{#snippet RenderGrandchildren({ index }: { index: number })} + + {#if (item?.children?.[index] as any)?.children?.length} + + {#if centerStateClasses === 'parent'} + + + + + {:else} + + {#each grandAnglesPreviewByChild[index] as gAng, j} + + + + {/each} + + {/if} + + {/if} + +{/snippet} + +{#snippet RenderChildren()} + + {#each item?.children ?? [] as c, i} + + {#if !(centerStateClasses === 'parent' && i === hoveredIndex)} + + + + {/if} + + {/each} + +{/snippet} + +{#snippet RenderActiveCenter()} + + {#if hoveredIndex >= 0 && (item?.children?.[hoveredIndex] as any)?.children?.length} + + + + {/if} + +{/snippet} + +{#snippet RenderActiveGrandchildren({ index }: { index: number })} + + {#each (item as any).children[index].children ?? [] as gc, j} + + + + {/each} + +{/snippet} + +{#snippet RenderParentBelow()} + + {@render RenderChildren()} + {@render RenderActiveCenter()} + +{/snippet} + +{#snippet CenterContent()} + + {#if renderChildren && !drawChildrenBelow} + {@render RenderChildren()} + {/if} + + {#if centerStateClasses === 'parent' && !drawChildrenBelow} + {@render RenderActiveCenter()} + {/if} + + {#if drawCenterText && centerStateClasses === 'active'} + + + + {/if} + + + {centerLabel} + + +{/snippet} + +{#snippet ParentNubsContent()}{/snippet} + +{#if centerReady} + +
      + + {#if drawWedgeSeparators} + + {/if} + + = 0 ? childAngles[hoveredIndex] : (parentAngle != null ? (parentAngle + 180) % 360 : null)} + parentHovered={hoverIndex === -2} + transformStyle={`translate(${center.x}px, ${center.y}px)`} + childDistancePx={radiusPx} + dataPath={'/'} + dataLevel={0} + layers={(layers as any) ?? [{ class: 'icon-layer' }]} + connectorStyle={connectorStyle} + below={drawChildrenBelow && renderChildren ? (centerStateClasses === 'parent' ? RenderParentBelow : RenderChildren) : null} + content={CenterContent} + /> + + {#if drawSelectionWedges && hoveredIndex >= 0} + + {/if} + +
      + +{:else} + + + +{/if} + + diff --git a/kando-svelte/src/lib/PieMenuDemo.svelte b/kando-svelte/src/lib/components/PieMenuDemo.svelte similarity index 88% rename from kando-svelte/src/lib/PieMenuDemo.svelte rename to kando-svelte/src/lib/components/PieMenuDemo.svelte index 39c8baab0..f48e11790 100644 --- a/kando-svelte/src/lib/PieMenuDemo.svelte +++ b/kando-svelte/src/lib/components/PieMenuDemo.svelte @@ -1,17 +1,29 @@ - diff --git a/kando-svelte/src/lib/PieTree.svelte b/kando-svelte/src/lib/components/PieTree.svelte similarity index 52% rename from kando-svelte/src/lib/PieTree.svelte rename to kando-svelte/src/lib/components/PieTree.svelte index f605fcbab..f6e6a7166 100644 --- a/kando-svelte/src/lib/PieTree.svelte +++ b/kando-svelte/src/lib/components/PieTree.svelte @@ -1,50 +1,13 @@ -
      - - {#if chain.length} - - {/if} - - +
      { e.stopPropagation(); onPointerDown(e); }} oncontextmenu={(e)=>{ e.preventDefault(); }} role="application" + style={`--fade-in-duration:${settings?.fadeInDuration ?? 150}ms; --fade-out-duration:${settings?.fadeOutDuration ?? 200}ms;`}> + {#key chain.join(',')} - + + + + {/key} +
      - + - + diff --git a/kando-svelte/src/lib/components/SelectionWedges.svelte b/kando-svelte/src/lib/components/SelectionWedges.svelte new file mode 100644 index 000000000..1d0b6e51c --- /dev/null +++ b/kando-svelte/src/lib/components/SelectionWedges.svelte @@ -0,0 +1,13 @@ + + +
      + + diff --git a/kando-svelte/src/lib/components/WedgeSeparators.svelte b/kando-svelte/src/lib/components/WedgeSeparators.svelte new file mode 100644 index 000000000..9282b1ad0 --- /dev/null +++ b/kando-svelte/src/lib/components/WedgeSeparators.svelte @@ -0,0 +1,22 @@ + + +
      + + {#each angles as ang} + +
      + + {/each} + +
      + + diff --git a/kando-svelte/src/lib/context.ts b/kando-svelte/src/lib/context.ts index 67a8998e2..d2a4767b6 100644 --- a/kando-svelte/src/lib/context.ts +++ b/kando-svelte/src/lib/context.ts @@ -1,5 +1,5 @@ -import type { Vec2 } from './types'; -import type { MenuItem } from './types'; +import type { Vec2 } from './types.js'; +import type { MenuItem } from './types.js'; export type IndexPath = number[]; @@ -29,5 +29,3 @@ export const PIE_MENU_CTX: unique symbol = Symbol('pie-menu'); // Optional: internal registry mapping item path -> PieItem component instance export type ItemRegistry = Map; export const ITEM_REGISTRY_CTX: unique symbol = Symbol('item-registry'); - - diff --git a/kando-svelte/src/lib/gesture-detector.ts b/kando-svelte/src/lib/gesture-detector.ts new file mode 100644 index 000000000..96863c253 --- /dev/null +++ b/kando-svelte/src/lib/gesture-detector.ts @@ -0,0 +1,2 @@ +export { GestureDetector } from '@kando/gesture'; + diff --git a/kando-svelte/src/lib/gesture/gesture-detector.ts b/kando-svelte/src/lib/gesture/gesture-detector.ts deleted file mode 100644 index f5ed7e8bc..000000000 --- a/kando-svelte/src/lib/gesture/gesture-detector.ts +++ /dev/null @@ -1,3 +0,0 @@ -// Deprecated local shim; kept to avoid import breakages. Prefer @kando/gesture. -export { GestureDetector } from '@kando/gesture'; - diff --git a/kando-svelte/src/lib/index.ts b/kando-svelte/src/lib/index.ts index caada67e4..26ebc7ec6 100644 --- a/kando-svelte/src/lib/index.ts +++ b/kando-svelte/src/lib/index.ts @@ -1,13 +1,10 @@ -export { default as PieMenuDemo } from './PieMenuDemo.svelte'; -export { default as PieMenu } from './PieMenu.svelte'; -export { default as PieTree } from './PieTree.svelte'; -export { default as CenterText } from './CenterText.svelte'; -// WedgeSeparators and SelectionWedges are internal debug tools; not exported by default -export { default as PieItem } from './PieItem.svelte'; -export { default as SelectionWedges } from './SelectionWedges.svelte'; -export { default as WedgeSeparators } from './WedgeSeparators.svelte'; -export * from './types'; -export * from './theme-loader'; +export { default as PieMenuDemo } from './components/PieMenuDemo.svelte'; +export { default as PieMenu } from './components/PieMenu.svelte'; +export { default as PieTree } from './components/PieTree.svelte'; +export { default as CenterText } from './components/CenterText.svelte'; +// Internal debug components not exported +export * from './types.js'; +export * from './theme-loader.js'; export const Vendor = { defaultThemeCss: new URL('./vendor/default-theme.css', import.meta.url).toString(), diff --git a/kando-svelte/src/routes/+page.svelte b/kando-svelte/src/routes/+page.svelte index 94fb83e9f..4ef59ef18 100644 --- a/kando-svelte/src/routes/+page.svelte +++ b/kando-svelte/src/routes/+page.svelte @@ -1,4 +1,5 @@ {#if error}

      {error}

      {/if} +{#if firstRoot} + +

      Kando Svelte Pie Menu Demo

      + + + +
      { e.preventDefault(); }} role="application" onpointerdown={onCanvasDown} tabindex="0" aria-label="Pie menu target"> + + {#if popupOpen} + + + {/if} + +
      + +{/if} + {#if theme && firstRoot} + +

      Menus and Themes

      +
      -

      Popup target

      - - -
      - {#if popupOpen && firstRoot} -
      - -
      - {/if} -
      -

      Notifier log

      -
      +
      +  

      Notifier log

      + +
       {#each logLines as line}
       {line}
       {/each}
      -  
      +
      +

      Interactive PieMenu preview

      +
      +
      console.log('[pie] hover', e.detail.path)} on:select={(e) => console.log('[pie] select', e.detail)} />
      +
      + {/if} {#if menuSettings} +

      Menus (version {menuSettings.version})

      +
        + {#each menuSettings.menus as m: MenuV1, i}
      • + {m.root?.name ?? `Menu ${i+1}`} +
          + {#if m.shortcut}
        • shortcut: {m.shortcut}
        • {/if} {#if m.shortcutID}
        • shortcutID: {m.shortcutID}
        • {/if}
        • centered: {String(m.centered ?? false)}
        • @@ -314,7 +317,9 @@ {#if m.tags?.length}
        • tags: {m.tags.join(', ')}
        • {/if} +
        • outline: + {#if m.root}
            @@ -322,31 +327,46 @@ {:else} no root {/if} + +
          +
        • + {/each} +
        - {#if config} + +{/if} + +{#if config} +

        Config

        +
        {JSON.stringify(config, null, 2)}
        + {/if} {#if theme} +

        Theme

        +
        • id: {theme.id}
        • name: {theme.name}
        • engineVersion: {theme.engineVersion}
        • layers: {theme.layers.length}
        + {#if mathPreview.angles} +

        Math quick test

        +

        First menu child angles: {mathPreview.angles?.map((a) => a.toFixed(1)).join(', ')}

        +

        Wedges: {mathPreview.wedges?.map((w) => `${w.start.toFixed(1)}–${w.end.toFixed(1)}`).join(' | ')}

        + {/if} -{/if} -{:else} -

        Loading menus…

        {/if} diff --git a/kando-svelte/static/kando/menus.json b/kando-svelte/static/kando/menus.json index 5d9cfe98c..98a094403 100644 --- a/kando-svelte/static/kando/menus.json +++ b/kando-svelte/static/kando/menus.json @@ -1,9 +1,7 @@ { + "version": "2.1.0", "menus": [ { - "shortcut": "Control+Space", - "shortcutID": "example-menu", - "centered": false, "root": { "type": "submenu", "name": "Example Menu", @@ -16,6 +14,77 @@ "icon": "apps", "iconTheme": "material-symbols-rounded", "children": [ + { + "type": "redirect", + "name": "Redirect", + "icon": "redirect-item.svg", + "iconTheme": "kando", + "data": { + "menu": "" + } + }, + { + "type": "submenu", + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "data": {}, + "children": [ + { + "type": "submenu", + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "data": {}, + "children": [ + { + "type": "submenu", + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "data": {}, + "children": [] + }, + { + "type": "text", + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando", + "data": { + "text": "" + } + }, + { + "type": "text", + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando", + "data": { + "text": "" + } + } + ] + }, + { + "type": "text", + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando", + "data": { + "text": "" + } + }, + { + "type": "text", + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando", + "data": { + "text": "" + } + } + ] + }, { "type": "command", "data": { @@ -64,57 +133,13 @@ ] }, { - "type": "submenu", - "name": "Web Links", - "icon": "public", - "iconTheme": "material-symbols-rounded", - "children": [ - { - "type": "uri", - "data": { - "uri": "https://www.google.com" - }, - "name": "Google", - "icon": "google", - "iconTheme": "simple-icons" - }, - { - "type": "uri", - "data": { - "uri": "https://github.com/kando-menu/kando" - }, - "name": "Kando on GitHub", - "icon": "github", - "iconTheme": "simple-icons" - }, - { - "type": "uri", - "data": { - "uri": "https://ko-fi.com/schneegans" - }, - "name": "Kando on Ko-fi", - "icon": "kofi", - "iconTheme": "simple-icons" - }, - { - "type": "uri", - "data": { - "uri": "https://www.youtube.com/@simonschneegans" - }, - "name": "Kando on YouTube", - "icon": "youtube", - "iconTheme": "simple-icons" - }, - { - "type": "uri", - "data": { - "uri": "https://discord.gg/hZwbVSDkhy" - }, - "name": "Kando on Discord", - "icon": "discord", - "iconTheme": "simple-icons" - } - ] + "type": "redirect", + "data": { + "menu": "Compass" + }, + "name": "Compass", + "icon": "menu", + "iconTheme": "material-symbols-rounded" }, { "type": "command", @@ -330,12 +355,387 @@ ] } ] - } + }, + "shortcut": "Control+Alt+Space", + "shortcutID": "example-menu", + "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] }, { + "root": { + "type": "submenu", + "name": "Deep", + "icon": "apps", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [ + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [ + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [ + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [ + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [] + } + ] + } + ] + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + } + ] + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + } + ] + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [ + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [ + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + }, + { + "type": "submenu", + "data": {}, + "name": "Submenu", + "icon": "submenu-item.svg", + "iconTheme": "kando", + "children": [] + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + } + ] + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + } + ] + }, + { + "type": "text", + "data": { + "text": "" + }, + "name": "Paste Text", + "icon": "text-item.svg", + "iconTheme": "kando" + } + ] + }, + "shortcut": "Control+Space", + "shortcutID": "", + "centered": false, + "anchored": false, + "hoverMode": false, + "conditions": { + "appName": "Cursor" + }, + "tags": [] + }, + { + "root": { + "type": "submenu", + "name": "Holding Menu", + "icon": "award_star", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "submenu", + "name": "Web Links", + "icon": "public", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "uri", + "data": { + "uri": "https://www.google.com" + }, + "name": "Google", + "icon": "google", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://github.com/kando-menu/kando" + }, + "name": "Kando on GitHub", + "icon": "github", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://ko-fi.com/schneegans" + }, + "name": "Kando on Ko-fi", + "icon": "kofi", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://www.youtube.com/@simonschneegans" + }, + "name": "Kando on YouTube", + "icon": "youtube", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://discord.gg/hZwbVSDkhy" + }, + "name": "Kando on Discord", + "icon": "discord", + "iconTheme": "simple-icons" + } + ] + }, + { + "type": "submenu", + "name": "Web Links", + "icon": "public", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "uri", + "data": { + "uri": "https://www.google.com" + }, + "name": "Google", + "icon": "google", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://github.com/kando-menu/kando" + }, + "name": "Kando on GitHub", + "icon": "github", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://ko-fi.com/schneegans" + }, + "name": "Kando on Ko-fi", + "icon": "kofi", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://www.youtube.com/@simonschneegans" + }, + "name": "Kando on YouTube", + "icon": "youtube", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://discord.gg/hZwbVSDkhy" + }, + "name": "Kando on Discord", + "icon": "discord", + "iconTheme": "simple-icons" + } + ] + }, + { + "type": "submenu", + "name": "Web Links", + "icon": "public", + "iconTheme": "material-symbols-rounded", + "children": [ + { + "type": "uri", + "data": { + "uri": "https://www.google.com" + }, + "name": "Google", + "icon": "google", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://github.com/kando-menu/kando" + }, + "name": "Kando on GitHub", + "icon": "github", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://ko-fi.com/schneegans" + }, + "name": "Kando on Ko-fi", + "icon": "kofi", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://www.youtube.com/@simonschneegans" + }, + "name": "Kando on YouTube", + "icon": "youtube", + "iconTheme": "simple-icons" + }, + { + "type": "uri", + "data": { + "uri": "https://discord.gg/hZwbVSDkhy" + }, + "name": "Kando on Discord", + "icon": "discord", + "iconTheme": "simple-icons" + } + ] + } + ] + }, "shortcut": "", - "shortcutID": "compass", + "shortcutID": "example-menu", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Compass", @@ -391,12 +791,15 @@ "iconTheme": "material-symbols-rounded" } ] - } - }, - { + }, "shortcut": "", - "shortcutID": "boolean", + "shortcutID": "compass", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Boolean", @@ -416,12 +819,15 @@ "iconTheme": "material-symbols-rounded" } ] - } - }, - { + }, "shortcut": "", - "shortcutID": "quad", + "shortcutID": "boolean", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Quad", @@ -453,12 +859,15 @@ "iconTheme": "material-symbols-rounded" } ] - } - }, - { + }, "shortcut": "", - "shortcutID": "octal", + "shortcutID": "quad", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Octal", @@ -514,12 +923,15 @@ "iconTheme": "material-symbols-rounded" } ] - } - }, - { + }, "shortcut": "", - "shortcutID": "digital", + "shortcutID": "octal", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Digital", @@ -587,12 +999,15 @@ "iconTheme": "material-symbols-rounded" } ] - } - }, - { + }, "shortcut": "", - "shortcutID": "clock", + "shortcutID": "digital", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Clock", @@ -672,12 +1087,15 @@ "iconTheme": "material-symbols-rounded" } ] - } - }, - { + }, "shortcut": "", - "shortcutID": "hex", + "shortcutID": "clock", "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + }, + { "root": { "type": "submenu", "name": "Hex", @@ -781,7 +1199,23 @@ "iconTheme": "material-symbols-rounded" } ] - } + }, + "shortcut": "", + "shortcutID": "hex", + "centered": false, + "anchored": false, + "hoverMode": false, + "tags": [] + } + ], + "collections": [ + { + "name": "Favorites", + "icon": "favorite", + "iconTheme": "material-symbols-rounded", + "tags": [ + "favs" + ] } ] -} \ No newline at end of file +} diff --git a/macros_data_1_file.cleaned.json b/macros_data_1_file.cleaned.json new file mode 100644 index 000000000..663492a2b --- /dev/null +++ b/macros_data_1_file.cleaned.json @@ -0,0 +1 @@ +"(.macro_infos.macroInfos) |= map(select(.id != $id))" diff --git a/macros_data_1_file.json b/macros_data_1_file.json new file mode 100644 index 000000000..30e42ab8a --- /dev/null +++ b/macros_data_1_file.json @@ -0,0 +1,317 @@ +{ + "macro_infos": { + "macroInfos": [ + { + "cards": [ + { + "applicationId": "420fd454-0c36-499d-bde4-146823b16147", + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "OpenApp.png", + "OpenApp.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_open_ai_overlay", + "macro": { + "artificialIntelligence": {}, + "type": "ARTIFICIAL_INTELLIGENCE" + }, + "name": "ASSIGNMENT_NAME_OPEN_AI_OVERLAY", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON", + "AI_PROMPT_BUILDER_TAG" + ], + "taskId": 65653 + }, + { + "applicationId": "91f29e15-d87c-4f3f-8512-11df765a9e8f", + "attribute": "MACRO_PLAYBACK", + "id": "macro_presets_show_application_osx", + "macro": { + "appWindowsManagement": { + "action": "SHOW", + "appName": "Cursor", + "path": "/Applications/Cursor.app" + }, + "type": "APP_WINDOWS_MANAGEMENT" + }, + "name": "ASSIGNMENT_NAME_SHOW_APPLICATION", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "macro": { + "inputSequence": { + "componentLists": [ + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "mouse": { + "button": { + "hidUsage": 1, + "isDown": true + } + } + }, + { + "mouse": { + "button": { + "hidUsage": 1 + } + } + } + ] + }, + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "keyboard": { + "displayName": "F", + "hidUsage": 9, + "isDown": true, + "virtualKeyId": "VK_F" + } + }, + { + "keyboard": { + "displayName": "F", + "hidUsage": 9, + "virtualKeyId": "VK_F" + } + } + ] + }, + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "isDown": true, + "virtualKeyId": "VK_O" + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "virtualKeyId": "VK_O" + } + } + ] + }, + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "isDown": true, + "virtualKeyId": "VK_O" + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "virtualKeyId": "VK_O" + } + } + ] + } + ], + "defaultDelay": 21, + "useDefaultDelay": true + }, + "type": "INPUT_SEQUENCE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "text_block_card", + "macro": { + "textBlock": { + "text": "foo" + }, + "type": "TEXT_BLOCK" + }, + "name": "text_block_card", + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "applicationId": "420fd454-0c36-499d-bde4-146823b16147", + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "ScreenCapture.png", + "ScreenCapture.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_screen_capture", + "macro": { + "actionName": "screencapture_default", + "screenCapture": { + "areatocapture": "CAPTURE_SCREEN", + "destinationfolder": "CAPTURE_FILE" + }, + "type": "SCREEN_CAPTURE" + }, + "name": "ASSIGNMENT_NAME_SCREEN_CAPTURE", + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ], + "taskId": 155 + }, + { + "attribute": "MACRO_PLAYBACK", + "macro": { + "delay": { + "durationMs": 1000 + }, + "type": "DELAY" + } + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + } + ], + "customCategories": {}, + "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", + "lastEditTimestamp": "1760794176638", + "name": "deleteme", + "platform": "OSX", + "usageCount": 4 + } + ] + }, + "macros_settings_transferred": true +} diff --git a/settings_data_1_file.cleaned.json b/settings_data_1_file.cleaned.json new file mode 100644 index 000000000..e69de29bb diff --git a/settings_data_1_file.json b/settings_data_1_file.json new file mode 100644 index 000000000..91f5cd0e8 --- /dev/null +++ b/settings_data_1_file.json @@ -0,0 +1,1316 @@ +{ + "accounts_refresh_token_expiration": 1763422389, + "ai_prompt_builder": true, + "ai_prompt_builder_device_ever_connected": false, + "ai_prompt_builder_enabled_since": 1760833422663, + "analytics": { + "config": { + "eventRequest": { + "maximumEventsPerRequest": 100, + "maximumRequestSizeBytes": 100000, + "submissionIntervalMinutes": 2880 + }, + "serverConfigType": "PROD", + "testing": {} + }, + "userPrompted": true, + "versionNumber": "2019.12" + }, + "analytics_app_version": "1.96.781095", + "analytics_seen_devices_v2": [ + "2b042-1" + ], + "app_permissions_previous": { + "backlight": { + "value": true + }, + "update": { + "value": true + } + }, + "applications": { + "applications": [ + { + "applicationId": "application_id_spotifymusic", + "applicationPath": "/Applications/Spotify.app", + "applicationPathsList": [ + "/Applications/Spotify.app" + ], + "databaseId": "application_id_spotifymusic", + "installTime": "2023-06-19T14:32:46.000Z", + "isInstalled": true, + "lastRunTime": "2025-10-08T12:08:55.654Z", + "name": "Spotify", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/spotifymusic_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/spotifymusic_profile.png" + }, + { + "applicationId": "application_id_zoom", + "applicationPath": "/Applications/zoom.us.app", + "applicationPathsList": [ + "/Applications/zoom.us.app" + ], + "databaseId": "application_id_zoom", + "installTime": "2025-08-30T15:55:09.000Z", + "isInstalled": true, + "lastRunTime": "2025-10-17T19:38:45.392Z", + "name": "Zoom", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/zoom_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/zoom_profile.png" + }, + { + "applicationId": "application_id_adobe_photoshop", + "applicationPath": "/Applications/Adobe Photoshop 2025/Adobe Photoshop 2025.app", + "applicationPathsList": [ + "/Applications/Adobe Photoshop 2025/Adobe Photoshop 2025.app" + ], + "databaseId": "application_id_adobe_photoshop", + "installTime": "2024-12-18T06:52:52.615Z", + "isInstalled": true, + "lastRunTime": "2025-01-30T13:44:02.309Z", + "name": "Adobe Photoshop", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/photoshop_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/photoshop_profile.png" + }, + { + "applicationId": "application_id_apple_safari", + "applicationPath": "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app", + "applicationPathsList": [ + "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app" + ], + "databaseId": "application_id_apple_safari", + "installTime": "2025-01-12T02:44:59.000Z", + "isInstalled": true, + "lastRunTime": "2025-01-12T02:44:59.000Z", + "name": "Safari", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/safari_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/safari_profile.png" + }, + { + "applicationId": "application_id_google_chrome", + "applicationPath": "/Applications/Google Chrome.app", + "applicationPathsList": [ + "/Applications/Google Chrome.app" + ], + "bundleId": "com.google.Chrome", + "databaseId": "application_id_google_chrome", + "installTime": "2025-01-27T21:29:16.000Z", + "isInstalled": true, + "lastRunTime": "2025-03-17T23:59:17.283Z", + "name": "Google Chrome", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/chrome_poster.png", + "processId": 576, + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/chrome_profile.png" + }, + { + "applicationId": "application_id_adobe_premierepro", + "applicationPath": "/Applications/Adobe Premiere Pro 2025/Adobe Premiere Pro 2025.app", + "applicationPathsList": [ + "/Applications/Adobe Premiere Pro 2025/Adobe Premiere Pro 2025.app" + ], + "databaseId": "application_id_adobe_premierepro", + "installTime": "2025-04-28T09:33:24.579Z", + "isInstalled": true, + "lastRunTime": "2025-04-28T09:34:00.371Z", + "name": "Adobe Premiere Pro", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/premiere_pro_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/premiere_pro_profile.png" + }, + { + "applicationId": "application_id_adobe_lightroom_classic", + "applicationPath": "/Applications/Adobe Lightroom Classic/Adobe Lightroom Classic.app", + "applicationPathsList": [ + "/Applications/Adobe Lightroom Classic/Adobe Lightroom Classic.app" + ], + "databaseId": "application_id_adobe_lightroom_classic", + "installTime": "2024-12-17T06:53:26.143Z", + "isInstalled": true, + "lastRunTime": "2025-01-30T13:43:38.358Z", + "name": "Adobe Lightroom Classic", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/lightroom_classic_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/lightroom_classic_profile.png" + }, + { + "applicationId": "application_id_microsoft_teams", + "applicationPath": "/Applications/Microsoft Teams.app", + "applicationPathsList": [ + "/Applications/Microsoft Teams.app" + ], + "databaseId": "application_id_microsoft_teams", + "installTime": "2025-10-11T00:40:45.000Z", + "isInstalled": true, + "lastRunTime": "2025-10-15T12:43:43.733Z", + "name": "Microsoft Teams", + "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/teams_poster.png", + "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/teams_profile.png" + }, + { + "applicationId": "420fd454-0c36-499d-bde4-146823b16147", + "databaseId": "420fd454-0c36-499d-bde4-146823b16147", + "lastRunTime": "2025-10-19T02:23:41+02:00", + "name": "APPLICATION_NAME_DESKTOP", + "version": 3 + } + ] + }, + "battery/mx-master-4-2b042/warning_notification": { + "batteryLevel": 95, + "deviceId": "dev00000000", + "time": "1760833715" + }, + "battery_notify": { + "count": 3, + "interval": 86400, + "keep": 2419200, + "level": "CRITICAL" + }, + "brand": "Logitech", + "crash_reporting": { + "userPrompted": true, + "versionNumber": "2020.03" + }, + "dfu/2532ZATASM98/last_dfu_helper": { + "lastSupportedDfuFeature": "DeviceFeatureD1" + }, + "dfu/2532ZATASM98/last_dfu_info": {}, + "dfu/2532ZATASM98/last_update_check": { + "fwVersion": "27.0.15", + "time": "1760800794" + }, + "disable_backlight_on_load_settings": false, + "easy_switch": { + "devices": [ + { + "device": { + "capabilities": { + "canGetName": true, + "canSetName": true, + "canSetOs": true + }, + "deviceId": "dev00000000", + "hosts": [ + { + "busType": "BLE", + "connected": true, + "name": "DonBook", + "os": { + "type": "MACOS", + "version": { + "major": 15, + "minor": 3 + } + }, + "paired": true + }, + { + "index": 1 + }, + { + "index": 2 + } + ], + "maxNameLength": 24, + "serialNumber": "2552651623\u0000" + }, + "paths": [ + "062231C4-2F42-1609-FEF4-5C92A70B9E24" + ] + } + ] + }, + "ever_connected_devices": { + "devices": [ + { + "connectionType": "BLE", + "deviceModel": "2b042_ext1", + "deviceType": "MOUSE", + "extendedModelId": 1, + "firstConnectedTimestamp": "1760792288", + "serialNumber": "2532ZATASM98", + "slotPrefix": "mx-master-4-2b042", + "udid": "2532ZATASM98" + } + ] + }, + "first_time_run": false, + "iconsLocalPathCache": { + "/Applications/1Password.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6a8e34eead036cf81e968b53881d964152cbbdcc0ace7ddfce708662cbdc0634.png", + "/Applications/Amazon Kindle.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/829af60a273c36954174269553d8b73b580be9ddd9b21e932915e95a9b776022.png", + "/Applications/Audacity.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3d589bbc86216094c6459c1521596120e605cfea5a18517b02ef034fdaafb3f8.png", + "/Applications/BambuStudio.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/4311b10f26a92348a2b5ae50df961ccb188bef1187d1760495fd4e93427ff4ad.png", + "/Applications/Blackmagic Disk Speed Test.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6804c490b2f5855f9351520d452c5635748443f7a7e4789ae63e113b9db8c49f.png", + "/Applications/Blender.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d07346ed9e6125737996f7fd29e9bcec326f91a89aa1bf190985ca862671ee17.png", + "/Applications/Charles.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d578da8a22df8c912597c049a639b9ef921b4d727e81427d62c47cce36be261a.png", + "/Applications/ChatGPT.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/404f3389062b069e869efbd3c6284f1d049efbefd636c002cd509abd2bc25300.png", + "/Applications/Claude.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/70e95a27f734865ed126bc163cd414416e4d7dc26997dbf30d4d166bd45a5c04.png", + "/Applications/CrealityScan.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d7e1327579266910abe819f84c1cba3cf662d9d8701db4ae59c0091bddc90daa.png", + "/Applications/Cursor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/68615b0344708911b1b6aa6dfe5f27282f8e4f33d9e84f31bc7308c32f615777.png", + "/Applications/Docker.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7ed043c2f7a9d7cd525f81b8c5fe809ba2db4c8fd8c54703cd6ee6268ab8af8a.png", + "/Applications/Electric Sheep.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e210b63ec3deb729db15443bb8565606c84897032a3c291cc408c6db05afaeac.png", + "/Applications/Emacs.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/5aad2a1813fe908e7f0e16c542907ee112912a93a62ab5270459c70caca418f2.png", + "/Applications/ExpressVPN.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9d3780a6381754423734ec5118dc9655e887eeeacad6a0db29d1f749d147d101.png", + "/Applications/Firefox.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/afdda2736a5479f67622a24ce08c0d3d1135f191825a005ecc8de3a4e1f8bd6d.png", + "/Applications/GarageBand.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/aefc1fcb0fdedc7ceaa583c6346b03aae20da18e65b57974d95bb677a6de6ed3.png", + "/Applications/GitHub Desktop.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/c37d2c80604b83c4291bfac3f1a6b36f4d39520f104adc216f30433a5dc89f16.png", + "/Applications/Google Chrome.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/bfa04b72c56ab94bdb32b9d5189a7039fcec630cbc247d59b53d562b1f51b298.png", + "/Applications/Google Docs.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/871200391aca7dd51d7ab4f2243750ea27332569129aee6fd59e5f2b986c21ab.png", + "/Applications/Google Drive.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/4a54a751f3f782316e18ca45e18385c99cdac437bb92d3424ed65f945b1e90f7.png", + "/Applications/Google Sheets.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/1990ea661e3188944aeac6c55b8e251ec1f7bc74fe37a69b19c0bd98927550fe.png", + "/Applications/Google Slides.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/610eb6f6a8b95cddedf8a6d6814bd8d9e181187d9c8a6d2beb773bd120444670.png", + "/Applications/HandBrake.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b50fc1642f461c83f0e2542dacd7ec3eba2fa4c1247fee976b3983e30aacc49a.png", + "/Applications/IINA.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/19baa15a307fa88b5ac7ecc1cb530ca54c5929ce89f5192716384034f7a7361b.png", + "/Applications/Kando.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7b2fa59f84c133c570c63a6030bc85bc5d6c06b9427373bb6e60585b3f058c57.png", + "/Applications/Keynote.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/ce221df45c4dd1056f90b78924298785ebc0137b2fc1df97d7ef43367a4f1964.png", + "/Applications/Linphone.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f9c657ffbe0b4d25ae02c26593e8d63571ad3cd5257f5628da8c915387b50a6a.png", + "/Applications/Mastodon.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/1db49d21580a740727be0a800dbdac50fb925ef8f93971623aaa710b674e24d2.png", + "/Applications/Microsoft Teams.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d6b1519b4ef1d6b6518d05b93dc7e23236591745144b17f15a0ff6959d5d3571.png", + "/Applications/Minecraft.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/91847d9ee4c9852999f76a27caabc30f36e482db4955ca04cd5e106a81b6fff1.png", + "/Applications/MySQLWorkbench.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7a922158682fe4f601929c918049360d4c3b509d09fe3b9c04ba3cf5dec6bcaa.png", + "/Applications/Numbers.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/95bec7547e5242547386eea14621d2f3f835fd1799e168276dafb45337ed7e4f.png", + "/Applications/Origin.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/924922338346f79d527abd7a20265c890e355f58309a7b50b68b4d6f41ef6877.png", + "/Applications/Pages.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d5238fa9c81b4ac8dbe635a94ace658beef8a7443a4b63a2f1807a25f3ffb997.png", + "/Applications/Parallels Desktop.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f99679b206262a5e281e0ae6893011128a42861f7aaffff798013ade83b9b3bf.png", + "/Applications/Parallels Toolbox.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/112b13bb020a90d03354cc5e5e5c5c1e3612e7e085bf253ffc1f9fa447457a65.png", + "/Applications/Pie Menu.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/cb294383fa500b5a38d958fcaf4bffd10b319978bc3be33292422596087e95f2.png", + "/Applications/Postgres.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/4c1024ed7b33e56b6ce66dd77eadb0c78546a352f673aa132cedc0362740153c.png", + "/Applications/Raycast Companion.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3c61aa4c564ae464feec3eb9d8c5ac66953ff68f5f27a942fd3b668ea5f22af1.png", + "/Applications/RectLabel.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/81bdcefca48322f44ed35f71089fec2dd40f2dd187b9e0ef1ab53c542d557abe.png", + "/Applications/RemotePlay.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/008207dede04138840ebb4f1463278d4276bcd380b52127a90ed18898b9086a4.png", + "/Applications/Signal.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7e5a4427df7892b9d1e38756581bd0061e496c6f7c6d0b85144f2282cd9d827b.png", + "/Applications/Skype.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a7a5086cd6a00c42453c5f6792048d8c5d0b186efda825c74fef1f5b4644ebbb.png", + "/Applications/Slack.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6c2891281b304b42912d15bf6932281dfa075c11472e014c731869030d7ad0e4.png", + "/Applications/Spotify.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8cb2262fceee999bff349476d6411c99acc3a835496ff8fdd2e715b4bbb87126.png", + "/Applications/Steam.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9c0c157236ecc22c4d681ed54830d0751c166ab295a91c23f82e2cbddf663bb7.png", + "/Applications/Synergy.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/29018b609f7ed56e5633d215714d1107744fa4af42583653ce7f252b4fcf0dc8.png", + "/Applications/Tailscale.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/0ebcc9a41e39e1396603b52cefc38c38ef1ab1b022c63d0e064535e0a7f1753d.png", + "/Applications/Telegram.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9983517c38e14979e70685ff9a7a42805ccb08d59c42b853f823c9622ba55607.png", + "/Applications/The Unarchiver.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/03146da8aad36b197e72efb1fe8df2a3ee5c7053e19ba468bd6e81081e21bfd9.png", + "/Applications/TigerVNC Viewer 1.13.1.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/886735ceb0896b759ac8dbbab57236645173d17bd0b9ebc2983a262afedceeb8.png", + "/Applications/Tor Browser.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b14f55bcc93fcd4d657afd175080f6755fcd15ccc07f8e8309b0ebba3a93497f.png", + "/Applications/Transmission.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/10ad6057bb2cc681f5324f4e541fb404897aed767bc7d086c4598647e47dc141.png", + "/Applications/Unity Hub.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/56356d817a6dcfa690c00717e0b91cbd30a3c35ae369e7640606ac0555a5a178.png", + "/Applications/Utilities/LogiPluginService.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/805ef3d181a36549bcf5572db4d4455e11e7c4f5db98558e4e1786a6590f1c29.png", + "/Applications/VLC copy 2.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8aaf760b6594145aaf82502f8a6da183688edb1f7969411538e589d2480181ac.png", + "/Applications/VLC copy 3.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/baf0a3e915fc4223946dfffdcd3c7ce9922010edae8717af632c7d455717b9c1.png", + "/Applications/VLC copy.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/50e1357ab57a8a56605ec1c355222cdf9513fb5f2557cc5fba5c0641d1f42b02.png", + "/Applications/VLC.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/63d7b9ba7115acc9091e98b6adcd90a2a72b3e61980213a68a846a441cdd8343.png", + "/Applications/VOCALOID6 Editor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e6bbcb5f0be3ac12800f5bbb2b5914f9be592c20aba378ca80aeb167d382bd59.png", + "/Applications/Visual Studio Code.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/09fd43d9b3e1180a565e062f8f6e64211969e883639cced9f44deb56508c73ed.png", + "/Applications/Whisky.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fac27ad00eaa64d5a7147ec73ade5c77bd073427d105e026650389c71ea25370.png", + "/Applications/Xcode.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8906e9be5db3fca2c43987139fd6f7e094ff1064b569faea7d89c81bbb832231.png", + "/Applications/XnViewMP.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/873df51580e94579d06e5df0c47f7ac993620e509b9d8df0b81c2b159093b0ed.png", + "/Applications/iMovie.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/849ba66ad25c454fa79d5f6735fa4b11f36e3a58bacad7a36e7ce602a62398bc.png", + "/Applications/lghub.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a7b1deff7203925671d1b68ed395955a2de8fbf5abdd91304dc30a7ee287e0d6.png", + "/Applications/pgAdmin 4.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d55ab60b65d45a63b2e414b20811c8f5bea478013a37fc4a790a6b588fc8da31.png", + "/Applications/zoom.us.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/23492da04e930bf6dc1dd86728cb5450546129d4a481c34ee049da2b70753e09.png", + "/System/Applications/App Store.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/82b585ff858fb2caaca963e4631fc6c2b520633f4048fb81142b56bac92707c7.png", + "/System/Applications/Automator.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/2b6a7bdebbc1b7eca944ee441d275adb02f5c81dceee68d76b8938ac4566b763.png", + "/System/Applications/Books.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fd961ed64c08e7529a8a987a4539efd8d8d46a691fcb9967d0fd68e0a89ddfa2.png", + "/System/Applications/Calculator.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a58c3dcaf497f5c03da2a9e35d400c7c73c31a1c7e6ffd5df476d7671be1987d.png", + "/System/Applications/Calendar.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/199acae1270eee58cb75d338f61614f850ee319d287c75498d8d3e0968583868.png", + "/System/Applications/Chess.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3d56918d27bc2dc627412ce1f4ddde1e4f932abade7b2540e6e4b5ddf39e8655.png", + "/System/Applications/Clock.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/91d2a6cf14cbc737144c46a8f120b53d4eb260e6402892f74f8197e15534d906.png", + "/System/Applications/Contacts.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6c70a74c39928f47b712a7d93a46b6c5b98f5ab479d5fddc0dae1dbe847529b6.png", + "/System/Applications/Dictionary.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/990ac083d595927f16c3335d22a4312f8464c592c67561b0befab64ab915878f.png", + "/System/Applications/FaceTime.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/95673965bb37d7ee4c76a6411d0446fb4be5cf5afd506c6351b70d2428d859d8.png", + "/System/Applications/FindMy.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/19401611aa908b072c43eb1f1682233ac36fd1e73bab4027077a15ef180afbc2.png", + "/System/Applications/Font Book.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6705e1dc3da09cdc5fa6c826e62db620e9bdabb04533eb04048d944104e2d565.png", + "/System/Applications/Freeform.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7cecbe98f4a6504f10e8b5acbccec0cf720a96a46ca11752e272173a95aa8fe7.png", + "/System/Applications/Home.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/bb056c6ffd383a640ed1710dca708f2d1d91ac88995a6f3ab0723cf98ba10731.png", + "/System/Applications/Image Capture.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/41a855a3f7eab550c235d4fd424ce00aa737eecfe534feb91d1c380fc0fc3cf2.png", + "/System/Applications/Image Playground.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/55a883abfd2bc29288b51c8e3962ab0e2f8dcfed2d8fe24e80faf18cf7bc0483.png", + "/System/Applications/Launchpad.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d7931fe587bf2b37cf4d820a7c894fb7a8c675982e460958d84a0d1cc229b3f2.png", + "/System/Applications/Mail.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/66f54eee03d3997cc3b41dc5e0b87600c1123f33f7eb78604c4601e734976e14.png", + "/System/Applications/Maps.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/33917b1b13d0c52e25f9ff199921b065a454701a42cabd65baecbd475e9bd3e2.png", + "/System/Applications/Messages.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/0bf026f923d8f6b214fad92329b8107cbb69619967b4d6f6f8186bbab2a9b544.png", + "/System/Applications/Mission Control.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/89771884ee8ffc3116b8ccfd7c25c26be29f9aa99b70a459d296e8a455017334.png", + "/System/Applications/Music.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b3815efba956022d8be0aff9eded9c278b45ebfdd9d5ef7b3255d59def7d5bd6.png", + "/System/Applications/News.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/14dd389da7cf4c600b65f877686cb3f0e74ae2b1b62034a5858ccd5605bd7e70.png", + "/System/Applications/Notes.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a3f7ea9541b37707e7c7efaa2cdec03780980c1d0b7f40b8e7a2aaeb6f8aa3fe.png", + "/System/Applications/Passwords.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/45055aa7ea38f14e2eb0e5c453fad341d63a58604ee1297358ceb25284ab4422.png", + "/System/Applications/Photo Booth.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/2ba5c8053105aefe737d9e260ef0e4cf2821da5fccc1394c239c1ff974a983b0.png", + "/System/Applications/Photos.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f15510eda766ca10d6197b7564e7f77bb9a14ba72f04b50703b5eaaf29a893bf.png", + "/System/Applications/Podcasts.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/32d347e0ad0e8dadcc9538b9eec663130b278ebbd3bdf1a281a32882141f69cd.png", + "/System/Applications/Preview.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/de94d9d4c799e03092e16c70ad38ff63450575453048feafec600bac03b24663.png", + "/System/Applications/QuickTime Player.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/80975fb5692e88bd9192be56210d95709ed231e80c09d2a8f36c25d4c2222aa8.png", + "/System/Applications/Reminders.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/768f7a5f92fc9dc9891d6f0c97f3ec8c67b1e06afecb8314e7e3fba3f60c1f2e.png", + "/System/Applications/Shortcuts.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/031d4a7b65b54d7a58cc5a2d5bc34c5068d319d65663480e2165be9aa0316074.png", + "/System/Applications/Siri.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f6cb3e03729f245b0014ba573821e8b7c795704b799d273e370ed1650ab08d33.png", + "/System/Applications/Stickies.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e5bc0d8f501dda3689a770beec483fa3aa76bda1166a9710e248dbfcf7bbced8.png", + "/System/Applications/Stocks.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/1fdd06f36d2dbafbe4b2cf72333005fc60bba8fff3baff9550233b88f8f3fd4b.png", + "/System/Applications/System Settings.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e8da624c5287bdd5497fff9bdb77808de19da7cdb5ba1570cad9f6991a466ebe.png", + "/System/Applications/TV.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/957aa381851427f4f172281a6bdfe6588f0db99e466be2bfc3fa03ee9a94250d.png", + "/System/Applications/TextEdit.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3450a38b95e1d9a593d21c449a0a7b1429c0aa724db22cacdba9a64d019c7f70.png", + "/System/Applications/Time Machine.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/0e7fb45745a46daab5edb45124670de255893eca224fe27a5d60dd1568e20a1c.png", + "/System/Applications/Tips.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3987fd0fa294915fb993d2cc0cd15e2973694fb4d3c02c1491638b6be72be5cb.png", + "/System/Applications/Utilities/Activity Monitor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b88997847a4e2a62a3597c19e7aba16e2c396d3cb5285fc8348df05ac7a78282.png", + "/System/Applications/Utilities/AirPort Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/bc428cc60fb3af76e6dcbe77107238ce51a9a7dada5f0e786db348d5f4389c3e.png", + "/System/Applications/Utilities/Audio MIDI Setup.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/04c5462360c9b3e8033779e885f32b606256d45ad859dd0b0cfc8655eb2d2352.png", + "/System/Applications/Utilities/Bluetooth File Exchange.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fbd7162940680f6e086eee502b2c372c68b2dd77049a0a5cfcd9c83d064b0cd1.png", + "/System/Applications/Utilities/Boot Camp Assistant.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b3cfa440b9e1c5864ff8768dd6aadf346b73a0b9f953c0619cc4a5d10074ae2f.png", + "/System/Applications/Utilities/ColorSync Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/cfcbdd06ceb07db8ecca138fee896c85e399de4cb7bd60b6faebb41f9c07aba4.png", + "/System/Applications/Utilities/Console.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/22310a2028ed0a018ad7e06ae82381bccd1dfad32480f118886a8ff688b2ad6c.png", + "/System/Applications/Utilities/Digital Color Meter.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/c1fda7c7b1fb353ff69db39081b13bd5f0a6baf083734d3e73a600ade6186da9.png", + "/System/Applications/Utilities/Disk Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d5f63c5bf9d14ee4f947fef43800dc1959deb60549bae68708ccf387ab99d7b8.png", + "/System/Applications/Utilities/Grapher.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b8aa013d506768fb397baf74661dd937af0fea21a0e60567faec7bd57cc6e7b3.png", + "/System/Applications/Utilities/Migration Assistant.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7968d79ae3312a6acc75b6b6176002b448741357bdf05de42439dd615e1e6f76.png", + "/System/Applications/Utilities/Print Center.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b4a3956e11c93d691e6a16c28cf3d484a4016f5fa058cd4070494cbf744852e5.png", + "/System/Applications/Utilities/Screen Sharing.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7b11d8dcef82285f883c8d7bd04bd5116f33b5dacfa40c870451a34bd5a55d5e.png", + "/System/Applications/Utilities/Screenshot.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/42eb769f113c3238fc8fb208708fcef6bd4ed29d4e43f1603f8dbb30ba421a40.png", + "/System/Applications/Utilities/Script Editor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d374761ec00073326d7fb2dd4754695a5fe62d49f0d1b7a1508754730877d93f.png", + "/System/Applications/Utilities/System Information.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/c19ea83df742a3341c78122d46082ee9a11a9bd6d88c05ef9b1a99d219bb445c.png", + "/System/Applications/Utilities/Terminal.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b5513d0f8ab1beb730d9e67c9188614a81bd76600facbff68801e4b14b1eae33.png", + "/System/Applications/Utilities/VoiceOver Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8f202fcc5585115cbeac9ca8df1346818672f91be3680a3eac39a5bdfd882c0b.png", + "/System/Applications/VoiceMemos.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9f0da278b541410b80aaf2da831c1bac94f9881b2902e53b940c2aafc578d29f.png", + "/System/Applications/Weather.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7e67227cc1ab71dc5983e5cebf4d23188ab546c21fe27678f09ef380a932f9c3.png", + "/System/Applications/iPhone Mirroring.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/34eb3b25ea382caa79efe5dada8195cefe45538d757a15399766c64027891687.png", + "/Users/a2deh/Applications/Factorio.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/57c1c02bb9478b7084f49641c043f20cf125d8323cd6465f0b8df17553145ac6.png", + "/Users/a2deh/Applications/HandBrake.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3942ab73cfe43941dbd8eb827583ea9b10c924d4d33c2f686f87acdcb6014a76.png", + "/Users/a2deh/Applications/Oxygen Not Included.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/2abbb02cb1c08390af6dc6c3e98cb5bffcb2d67c9a7d6fc7178a235801c1afe9.png", + "/Users/a2deh/Applications/RimWorld.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fdf6be122c08d5412058f36045e328397521c31d11de4421b554d4d331377084.png", + "/Users/a2deh/Applications/Sid Meier's Civilization VII.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/ef91feed43c0b54ecac9da897f4c40e40b2c6401980f5067f9ba84ead807c9e9.png", + "/Users/a2deh/Applications/Two Point Museum.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/ff7087b0841c9f166cee30c43ef02c3769fdf194f9333afd6bb378090f5c5cd6.png", + "/Users/a2deh/Applications/shapez 2.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fb9a9dafa8798dbe85e2ecd64fb6d3a0a902f2ea056ce21fa19858835f51c621.png" + }, + "integration_manager_settings": { + "allowLedSdk": true + }, + "is-global-migrated": true, + "low_battery_notifications_enabled": true, + "macro_usage": { + "macroUsageCounters": [ + { + "count": "3", + "macroInfo": { + "cards": [ + { + "applicationId": "420fd454-0c36-499d-bde4-146823b16147", + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "OpenApp.png", + "OpenApp.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_open_ai_overlay", + "macro": { + "artificialIntelligence": {}, + "type": "ARTIFICIAL_INTELLIGENCE" + }, + "name": "ASSIGNMENT_NAME_OPEN_AI_OVERLAY", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON", + "AI_PROMPT_BUILDER_TAG" + ], + "taskId": 65653 + }, + { + "applicationId": "91f29e15-d87c-4f3f-8512-11df765a9e8f", + "attribute": "MACRO_PLAYBACK", + "id": "macro_presets_show_application_osx", + "macro": { + "appWindowsManagement": { + "action": "SHOW", + "appName": "Cursor", + "path": "/Applications/Cursor.app" + }, + "type": "APP_WINDOWS_MANAGEMENT" + }, + "name": "ASSIGNMENT_NAME_SHOW_APPLICATION", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "macro": { + "inputSequence": { + "componentLists": [ + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "mouse": { + "button": { + "hidUsage": 1, + "isDown": true + } + } + }, + { + "mouse": { + "button": { + "hidUsage": 1 + } + } + } + ] + }, + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "keyboard": { + "displayName": "F", + "hidUsage": 9, + "isDown": true, + "virtualKeyId": "VK_F" + } + }, + { + "keyboard": { + "displayName": "F", + "hidUsage": 9, + "virtualKeyId": "VK_F" + } + } + ] + }, + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "isDown": true, + "virtualKeyId": "VK_O" + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "virtualKeyId": "VK_O" + } + } + ] + }, + { + "components": [ + { + "delay": { + "durationMs": 21 + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "isDown": true, + "virtualKeyId": "VK_O" + } + }, + { + "keyboard": { + "displayName": "O", + "hidUsage": 18, + "virtualKeyId": "VK_O" + } + } + ] + } + ], + "defaultDelay": 21, + "useDefaultDelay": true + }, + "type": "INPUT_SEQUENCE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "text_block_card", + "macro": { + "textBlock": { + "text": "foo" + }, + "type": "TEXT_BLOCK" + }, + "name": "text_block_card", + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "applicationId": "420fd454-0c36-499d-bde4-146823b16147", + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "ScreenCapture.png", + "ScreenCapture.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_screen_capture", + "macro": { + "actionName": "screencapture_default", + "screenCapture": { + "areatocapture": "CAPTURE_SCREEN", + "destinationfolder": "CAPTURE_FILE" + }, + "type": "SCREEN_CAPTURE" + }, + "name": "ASSIGNMENT_NAME_SCREEN_CAPTURE", + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ], + "taskId": 155 + }, + { + "attribute": "MACRO_PLAYBACK", + "macro": { + "delay": { + "durationMs": 1000 + }, + "type": "DELAY" + } + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + }, + { + "attribute": "MACRO_PLAYBACK", + "id": "device_alert_card", + "macro": { + "device": { + "action": "HAPTICS", + "hapticWaveformRequest": {}, + "info": { + "id": "dev00000000", + "model": "2b042_ext1", + "name": "MX Master 4", + "slotPrefix": "mx-master-4-2b042" + } + }, + "type": "DEVICE" + }, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ] + } + ], + "customCategories": {}, + "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", + "lastEditTimestamp": "1760794176638", + "name": "deleteme", + "platform": "OSX", + "usageCount": 1 + }, + "triggerInfo": { + "deviceModel": "2b042_ext1", + "slotId": "mx-master-4-2b042_c416" + } + } + ] + }, + "macro_usage_last_log_time": 1760830388, + "macros_add_triggers_allowed": true, + "macros_execution_stop_hint_shown": true, + "macros_onboarding_shown": true, + "macros_onboarding_start_time": 1760792250693, + "macros_restore_backup_shown": true, + "migration_report": { + "devices": [ + { + "deviceName": "Software events", + "migrationStatus": "MIGRATION_SKIPPED", + "modelId": "10000001" + }, + { + "deviceName": "Actions Ring", + "migrationStatus": "MIGRATION_SKIPPED", + "modelId": "10000000" + }, + { + "deviceName": "MX Master 4", + "migrationStatus": "MIGRATION_SKIPPED", + "modelId": "2b042" + } + ] + }, + "mode_shift_reset_info": { + "isModeShiftReset": { + "mx-master-4-2b042": true + } + }, + "next_star_rating_check": "20260116T125731", + "options_swap_state_snapshot": false, + "optionsplus_mouse_swap_setting_applied": true, + "profile-420fd454-0c36-499d-bde4-146823b16147": { + "activeForApplication": true, + "applicationId": "420fd454-0c36-499d-bde4-146823b16147", + "assignments": [ + { + "card": { + "attribute": "MACRO_REF", + "executeOnProfileChange": true, + "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", + "name": "deleteme", + "readOnly": true + }, + "cardId": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", + "slotId": "mx-master-4-2b042_c195", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "ShiftWheelMode.png", + "ShiftWheelMode.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_mode_shift", + "macro": {}, + "name": "ASSIGNMENT_NAME_MODE_SHIFT", + "readOnly": true, + "tags": [ + "PRESET_TAG_MOUSE_SMARTSHIFT", + "PRESET_TAG_NO_GESTURE" + ], + "taskId": 157 + }, + "cardId": "card_global_presets_mode_shift", + "slotId": "mx-master-4-2b042_c196", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_REF", + "executeOnProfileChange": true, + "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", + "name": "deleteme", + "readOnly": true + }, + "cardId": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", + "slotId": "mx-master-4-2b042_c416", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "MiddleClick.png", + "MiddleClick.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_middle_button", + "macro": { + "actionName": "MB3", + "mouse": { + "action": "BUTTON", + "hidUsage": 3 + }, + "type": "MOUSE" + }, + "name": "ASSIGNMENT_NAME_MIDDLE_BUTTON", + "readOnly": true, + "tags": [ + "PRESET_TAG_MOUSE" + ], + "taskId": 58 + }, + "cardId": "card_global_presets_middle_button", + "slotId": "mx-master-4-2b042_c82", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Back.png", + "Back.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_back", + "macro": { + "mouse": { + "action": "OSX_GESTURE_BACK" + }, + "type": "MOUSE" + }, + "name": "ASSIGNMENT_NAME_BACK", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON", + "PRESET_TAG_LPS_SUPPORTED" + ], + "taskId": 59 + }, + "cardId": "card_global_presets_osx_back", + "slotId": "mx-master-4-2b042_c83", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Forward.png", + "Forward.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_forward", + "macro": { + "mouse": { + "action": "OSX_GESTURE_FORWARD" + }, + "type": "MOUSE" + }, + "name": "ASSIGNMENT_NAME_FORWARD", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON", + "PRESET_TAG_LPS_SUPPORTED" + ], + "taskId": 61 + }, + "cardId": "card_global_presets_osx_forward", + "slotId": "mx-master-4-2b042_c86", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "FORCE_SENSING_SETTINGS", + "forceSensingSettings": { + "buttonsForceSensingSettings": [ + { + "currentForce": 50 + } + ] + }, + "id": "9b85425b-8c71-4b15-808c-123600000000", + "name": "ForceSensingSettings", + "readOnly": true + }, + "cardId": "9b85425b-8c71-4b15-808c-123600000000", + "slotId": "mx-master-4-2b042_force_sensing_settings", + "tags": [ + "UI_PAGE_POINTER" + ] + }, + { + "card": { + "attribute": "HAPTIC_SETTINGS", + "hapticSettings": { + "eventSourceSettings": { + "LightroomDesktop___Default": { + "isHapticsEnabled": true + }, + "Photoshop___Default": { + "isHapticsEnabled": true + }, + "ZoomMeeting___Default": { + "isHapticsEnabled": true + }, + "actions_ring": { + "isHapticsEnabled": true + }, + "gestures": { + "isHapticsEnabled": true + }, + "switch_screens": {} + }, + "hapticFeedbackLevel": 60, + "isGlobalHapticsEnabled": true + }, + "id": "9b85425b-8c71-4b15-808c-123500000000", + "name": "HapticSettings", + "readOnly": true + }, + "cardId": "9b85425b-8c71-4b15-808c-123500000000", + "slotId": "mx-master-4-2b042_haptic_settings", + "tags": [ + "UI_HAPTIC_SETTINGS" + ] + }, + { + "card": { + "attribute": "MOUSE_SCROLL_WHEEL_SETTINGS", + "id": "9b85425b-8c71-4b15-808c-121100000000", + "mouseScrollWheelSettings": { + "dir": "NATURAL", + "smartshift": { + "isEnabled": true, + "isScrollForceEnabled": true, + "mode": "RATCHET", + "scrollForce": 75, + "sensitivity": 83 + } + }, + "name": "Mouse", + "readOnly": true + }, + "cardId": "9b85425b-8c71-4b15-808c-121100000000", + "slotId": "mx-master-4-2b042_mouse_scroll_wheel_settings", + "tags": [ + "UI_PAGE_POINTER" + ] + }, + { + "card": { + "attribute": "MOUSE_SETTINGS", + "id": "9b85425b-8c71-4b15-808c-120400000000", + "mouseSettings": { + "pointerSpeed": { + "active": { + "dpiLevel": 1, + "highResolutionSensorActive": true, + "value": -0.08 + } + } + }, + "name": "Mouse", + "readOnly": true + }, + "cardId": "9b85425b-8c71-4b15-808c-120400000000", + "slotId": "mx-master-4-2b042_mouse_settings", + "tags": [ + "UI_PAGE_POINTER" + ] + }, + { + "card": { + "attribute": "MOUSE_THUMB_WHEEL_SETTINGS", + "id": "9b85425b-8c71-4b15-808c-121000000000", + "mouseThumbWheelSettings": { + "dir": "STANDARD", + "isSmooth": true + }, + "name": "Mouse", + "readOnly": true + }, + "cardId": "9b85425b-8c71-4b15-808c-121000000000", + "slotId": "mx-master-4-2b042_mouse_thumb_wheel_settings", + "tags": [ + "UI_PAGE_POINTER" + ] + }, + { + "card": { + "attribute": "ADAPTER_2WAYS", + "continuous": true, + "gestureInfo": { + "implementation": "CUSTOM_HORIZONTAL_SCROLL", + "preventDelayedTermination": true + }, + "icons": { + "icons": [ + "HorizontalScroll.png", + "HorizontalScroll.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_horizontal_scroll", + "name": "ASSIGNMENT_NAME_HORIZONTAL_SCROLL", + "readOnly": true, + "tags": [ + "PRESET_TAG_THUMBWHEEL", + "PRESET_TAG_ANALOG_CONTROL" + ], + "taskId": 405 + }, + "cardId": "card_global_presets_osx_horizontal_scroll", + "slotId": "mx-master-4-2b042_thumb_wheel_adapter", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Cut.png", + "Cut.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_cut", + "macro": { + "actionName": "⌘X", + "keystroke": { + "code": 27, + "modifiers": [ + 227 + ] + }, + "type": "KEYSTROKE" + }, + "name": "ASSIGNMENT_NAME_CUT", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ], + "taskId": 802 + }, + "cardId": "card_global_presets_osx_cut", + "slotId": "radial-menu-virtual-device-10000000_c408", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Copy.png", + "Copy.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_copy", + "macro": { + "actionName": "⌘C", + "keystroke": { + "code": 6, + "modifiers": [ + 227 + ] + }, + "type": "KEYSTROKE" + }, + "name": "ASSIGNMENT_NAME_COPY", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ], + "taskId": 801 + }, + "cardId": "card_global_presets_osx_copy", + "slotId": "radial-menu-virtual-device-10000000_c409", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Paste.png", + "Paste.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_paste", + "macro": { + "actionName": "⌘V", + "keystroke": { + "code": 25, + "modifiers": [ + 227 + ] + }, + "type": "KEYSTROKE" + }, + "name": "ASSIGNMENT_NAME_PASTE", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON" + ], + "taskId": 803 + }, + "cardId": "card_global_presets_osx_paste", + "slotId": "radial-menu-virtual-device-10000000_c410", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Forward.png", + "Forward.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_forward", + "macro": { + "mouse": { + "action": "OSX_GESTURE_FORWARD" + }, + "type": "MOUSE" + }, + "name": "ASSIGNMENT_NAME_FORWARD", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON", + "PRESET_TAG_LPS_SUPPORTED" + ], + "taskId": 61 + }, + "cardId": "card_global_presets_osx_forward", + "slotId": "radial-menu-virtual-device-10000000_c411", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Back.png", + "Back.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_back", + "macro": { + "mouse": { + "action": "OSX_GESTURE_BACK" + }, + "type": "MOUSE" + }, + "name": "ASSIGNMENT_NAME_BACK", + "readOnly": true, + "tags": [ + "PRESET_TAG_KEY_OR_BUTTON", + "PRESET_TAG_LPS_SUPPORTED" + ], + "taskId": 59 + }, + "cardId": "card_global_presets_osx_back", + "slotId": "radial-menu-virtual-device-10000000_c412", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Undo.png", + "Undo.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_undo", + "macro": { + "actionName": "Cmd + Z", + "keystroke": { + "code": 29, + "modifiers": [ + 227 + ], + "virtualKeyId": "VK_Z" + }, + "type": "KEYSTROKE" + }, + "name": "ASSIGNMENT_NAME_UNDO", + "readOnly": true, + "tags": [ + "PRESET_TAG_BUTTON" + ], + "taskId": 804 + }, + "cardId": "card_global_presets_osx_undo", + "slotId": "radial-menu-virtual-device-10000000_c413", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "MACRO_PLAYBACK", + "icons": { + "icons": [ + "Redo.png", + "Redo.svg" + ], + "uri": "pipeline://system_actions/" + }, + "id": "card_global_presets_osx_redo", + "macro": { + "actionName": "Shift + Cmd + Z", + "keystroke": { + "code": 29, + "modifiers": [ + 225, + 227 + ], + "virtualKeyId": "VK_Z" + }, + "type": "KEYSTROKE" + }, + "name": "ASSIGNMENT_NAME_REDO", + "readOnly": true, + "tags": [ + "PRESET_TAG_BUTTON" + ], + "taskId": 805 + }, + "cardId": "card_global_presets_osx_redo", + "slotId": "radial-menu-virtual-device-10000000_c414", + "tags": [ + "UI_PAGE_BUTTONS" + ] + }, + { + "card": { + "attribute": "FOLDER", + "icons": { + "icons": [ + "Folder.png", + "Folder.svg" + ], + "uri": "pipeline://88b73d28-24d8-47bd-84a2-c45cad5640d3/actions.bundle/" + }, + "id": "card_global_presets_folder", + "name": "ASSIGNMENT_NAME_FOLDER", + "readOnly": true, + "tags": [ + "PRESET_TAG_FOLDER" + ] + }, + "cardId": "card_global_presets_folder", + "slotId": "radial-menu-virtual-device-10000000_c415", + "tags": [ + "UI_PAGE_BUTTONS" + ] + } + ], + "id": "420fd454-0c36-499d-bde4-146823b16147", + "name": "PROFILE_NAME_DEFAULT" + }, + "profile_keys": [ + "profile-420fd454-0c36-499d-bde4-146823b16147" + ], + "release_notes_build_id": "594152", + "schema_version": 21, + "settings_backup_state_v2": { + "knownDevices": { + "10000000": false, + "10000001": false, + "2b042_ext1": false, + "model_id_macros": false + } + }, + "settings_transferred": true, + "slot_prefixes_ever_seen": [ + "mx-master-4-2b042", + "radial-menu-virtual-device-10000000", + "software-events-virtual-device-10000001" + ], + "system_notification_click_view": "", + "use_system_theme": true +} From ee6fa6265a9d35328797504f5038b1823ef07be1 Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Mon, 20 Oct 2025 21:31:56 +0200 Subject: [PATCH 16/20] cleaned up junk --- macros_data_1_file.cleaned.json | 1 - macros_data_1_file.json | 317 ------- settings_data_1_file.cleaned.json | 0 settings_data_1_file.json | 1316 ----------------------------- 4 files changed, 1634 deletions(-) delete mode 100644 macros_data_1_file.cleaned.json delete mode 100644 macros_data_1_file.json delete mode 100644 settings_data_1_file.cleaned.json delete mode 100644 settings_data_1_file.json diff --git a/macros_data_1_file.cleaned.json b/macros_data_1_file.cleaned.json deleted file mode 100644 index 663492a2b..000000000 --- a/macros_data_1_file.cleaned.json +++ /dev/null @@ -1 +0,0 @@ -"(.macro_infos.macroInfos) |= map(select(.id != $id))" diff --git a/macros_data_1_file.json b/macros_data_1_file.json deleted file mode 100644 index 30e42ab8a..000000000 --- a/macros_data_1_file.json +++ /dev/null @@ -1,317 +0,0 @@ -{ - "macro_infos": { - "macroInfos": [ - { - "cards": [ - { - "applicationId": "420fd454-0c36-499d-bde4-146823b16147", - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "OpenApp.png", - "OpenApp.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_open_ai_overlay", - "macro": { - "artificialIntelligence": {}, - "type": "ARTIFICIAL_INTELLIGENCE" - }, - "name": "ASSIGNMENT_NAME_OPEN_AI_OVERLAY", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON", - "AI_PROMPT_BUILDER_TAG" - ], - "taskId": 65653 - }, - { - "applicationId": "91f29e15-d87c-4f3f-8512-11df765a9e8f", - "attribute": "MACRO_PLAYBACK", - "id": "macro_presets_show_application_osx", - "macro": { - "appWindowsManagement": { - "action": "SHOW", - "appName": "Cursor", - "path": "/Applications/Cursor.app" - }, - "type": "APP_WINDOWS_MANAGEMENT" - }, - "name": "ASSIGNMENT_NAME_SHOW_APPLICATION", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "macro": { - "inputSequence": { - "componentLists": [ - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "mouse": { - "button": { - "hidUsage": 1, - "isDown": true - } - } - }, - { - "mouse": { - "button": { - "hidUsage": 1 - } - } - } - ] - }, - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "keyboard": { - "displayName": "F", - "hidUsage": 9, - "isDown": true, - "virtualKeyId": "VK_F" - } - }, - { - "keyboard": { - "displayName": "F", - "hidUsage": 9, - "virtualKeyId": "VK_F" - } - } - ] - }, - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "isDown": true, - "virtualKeyId": "VK_O" - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "virtualKeyId": "VK_O" - } - } - ] - }, - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "isDown": true, - "virtualKeyId": "VK_O" - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "virtualKeyId": "VK_O" - } - } - ] - } - ], - "defaultDelay": 21, - "useDefaultDelay": true - }, - "type": "INPUT_SEQUENCE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "text_block_card", - "macro": { - "textBlock": { - "text": "foo" - }, - "type": "TEXT_BLOCK" - }, - "name": "text_block_card", - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "applicationId": "420fd454-0c36-499d-bde4-146823b16147", - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "ScreenCapture.png", - "ScreenCapture.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_screen_capture", - "macro": { - "actionName": "screencapture_default", - "screenCapture": { - "areatocapture": "CAPTURE_SCREEN", - "destinationfolder": "CAPTURE_FILE" - }, - "type": "SCREEN_CAPTURE" - }, - "name": "ASSIGNMENT_NAME_SCREEN_CAPTURE", - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ], - "taskId": 155 - }, - { - "attribute": "MACRO_PLAYBACK", - "macro": { - "delay": { - "durationMs": 1000 - }, - "type": "DELAY" - } - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - } - ], - "customCategories": {}, - "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", - "lastEditTimestamp": "1760794176638", - "name": "deleteme", - "platform": "OSX", - "usageCount": 4 - } - ] - }, - "macros_settings_transferred": true -} diff --git a/settings_data_1_file.cleaned.json b/settings_data_1_file.cleaned.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/settings_data_1_file.json b/settings_data_1_file.json deleted file mode 100644 index 91f5cd0e8..000000000 --- a/settings_data_1_file.json +++ /dev/null @@ -1,1316 +0,0 @@ -{ - "accounts_refresh_token_expiration": 1763422389, - "ai_prompt_builder": true, - "ai_prompt_builder_device_ever_connected": false, - "ai_prompt_builder_enabled_since": 1760833422663, - "analytics": { - "config": { - "eventRequest": { - "maximumEventsPerRequest": 100, - "maximumRequestSizeBytes": 100000, - "submissionIntervalMinutes": 2880 - }, - "serverConfigType": "PROD", - "testing": {} - }, - "userPrompted": true, - "versionNumber": "2019.12" - }, - "analytics_app_version": "1.96.781095", - "analytics_seen_devices_v2": [ - "2b042-1" - ], - "app_permissions_previous": { - "backlight": { - "value": true - }, - "update": { - "value": true - } - }, - "applications": { - "applications": [ - { - "applicationId": "application_id_spotifymusic", - "applicationPath": "/Applications/Spotify.app", - "applicationPathsList": [ - "/Applications/Spotify.app" - ], - "databaseId": "application_id_spotifymusic", - "installTime": "2023-06-19T14:32:46.000Z", - "isInstalled": true, - "lastRunTime": "2025-10-08T12:08:55.654Z", - "name": "Spotify", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/spotifymusic_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/spotifymusic_profile.png" - }, - { - "applicationId": "application_id_zoom", - "applicationPath": "/Applications/zoom.us.app", - "applicationPathsList": [ - "/Applications/zoom.us.app" - ], - "databaseId": "application_id_zoom", - "installTime": "2025-08-30T15:55:09.000Z", - "isInstalled": true, - "lastRunTime": "2025-10-17T19:38:45.392Z", - "name": "Zoom", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/zoom_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/zoom_profile.png" - }, - { - "applicationId": "application_id_adobe_photoshop", - "applicationPath": "/Applications/Adobe Photoshop 2025/Adobe Photoshop 2025.app", - "applicationPathsList": [ - "/Applications/Adobe Photoshop 2025/Adobe Photoshop 2025.app" - ], - "databaseId": "application_id_adobe_photoshop", - "installTime": "2024-12-18T06:52:52.615Z", - "isInstalled": true, - "lastRunTime": "2025-01-30T13:44:02.309Z", - "name": "Adobe Photoshop", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/photoshop_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/photoshop_profile.png" - }, - { - "applicationId": "application_id_apple_safari", - "applicationPath": "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app", - "applicationPathsList": [ - "/System/Volumes/Preboot/Cryptexes/App/System/Applications/Safari.app" - ], - "databaseId": "application_id_apple_safari", - "installTime": "2025-01-12T02:44:59.000Z", - "isInstalled": true, - "lastRunTime": "2025-01-12T02:44:59.000Z", - "name": "Safari", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/safari_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/safari_profile.png" - }, - { - "applicationId": "application_id_google_chrome", - "applicationPath": "/Applications/Google Chrome.app", - "applicationPathsList": [ - "/Applications/Google Chrome.app" - ], - "bundleId": "com.google.Chrome", - "databaseId": "application_id_google_chrome", - "installTime": "2025-01-27T21:29:16.000Z", - "isInstalled": true, - "lastRunTime": "2025-03-17T23:59:17.283Z", - "name": "Google Chrome", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/chrome_poster.png", - "processId": 576, - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/chrome_profile.png" - }, - { - "applicationId": "application_id_adobe_premierepro", - "applicationPath": "/Applications/Adobe Premiere Pro 2025/Adobe Premiere Pro 2025.app", - "applicationPathsList": [ - "/Applications/Adobe Premiere Pro 2025/Adobe Premiere Pro 2025.app" - ], - "databaseId": "application_id_adobe_premierepro", - "installTime": "2025-04-28T09:33:24.579Z", - "isInstalled": true, - "lastRunTime": "2025-04-28T09:34:00.371Z", - "name": "Adobe Premiere Pro", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/premiere_pro_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/premiere_pro_profile.png" - }, - { - "applicationId": "application_id_adobe_lightroom_classic", - "applicationPath": "/Applications/Adobe Lightroom Classic/Adobe Lightroom Classic.app", - "applicationPathsList": [ - "/Applications/Adobe Lightroom Classic/Adobe Lightroom Classic.app" - ], - "databaseId": "application_id_adobe_lightroom_classic", - "installTime": "2024-12-17T06:53:26.143Z", - "isInstalled": true, - "lastRunTime": "2025-01-30T13:43:38.358Z", - "name": "Adobe Lightroom Classic", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/lightroom_classic_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/lightroom_classic_profile.png" - }, - { - "applicationId": "application_id_microsoft_teams", - "applicationPath": "/Applications/Microsoft Teams.app", - "applicationPathsList": [ - "/Applications/Microsoft Teams.app" - ], - "databaseId": "application_id_microsoft_teams", - "installTime": "2025-10-11T00:40:45.000Z", - "isInstalled": true, - "lastRunTime": "2025-10-15T12:43:43.733Z", - "name": "Microsoft Teams", - "posterUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/teams_poster.png", - "profileUrl": "poster:///Library/Application Support/Logi/LogiOptionsPlus/depots/594152/logioptionsplus/applications/teams_profile.png" - }, - { - "applicationId": "420fd454-0c36-499d-bde4-146823b16147", - "databaseId": "420fd454-0c36-499d-bde4-146823b16147", - "lastRunTime": "2025-10-19T02:23:41+02:00", - "name": "APPLICATION_NAME_DESKTOP", - "version": 3 - } - ] - }, - "battery/mx-master-4-2b042/warning_notification": { - "batteryLevel": 95, - "deviceId": "dev00000000", - "time": "1760833715" - }, - "battery_notify": { - "count": 3, - "interval": 86400, - "keep": 2419200, - "level": "CRITICAL" - }, - "brand": "Logitech", - "crash_reporting": { - "userPrompted": true, - "versionNumber": "2020.03" - }, - "dfu/2532ZATASM98/last_dfu_helper": { - "lastSupportedDfuFeature": "DeviceFeatureD1" - }, - "dfu/2532ZATASM98/last_dfu_info": {}, - "dfu/2532ZATASM98/last_update_check": { - "fwVersion": "27.0.15", - "time": "1760800794" - }, - "disable_backlight_on_load_settings": false, - "easy_switch": { - "devices": [ - { - "device": { - "capabilities": { - "canGetName": true, - "canSetName": true, - "canSetOs": true - }, - "deviceId": "dev00000000", - "hosts": [ - { - "busType": "BLE", - "connected": true, - "name": "DonBook", - "os": { - "type": "MACOS", - "version": { - "major": 15, - "minor": 3 - } - }, - "paired": true - }, - { - "index": 1 - }, - { - "index": 2 - } - ], - "maxNameLength": 24, - "serialNumber": "2552651623\u0000" - }, - "paths": [ - "062231C4-2F42-1609-FEF4-5C92A70B9E24" - ] - } - ] - }, - "ever_connected_devices": { - "devices": [ - { - "connectionType": "BLE", - "deviceModel": "2b042_ext1", - "deviceType": "MOUSE", - "extendedModelId": 1, - "firstConnectedTimestamp": "1760792288", - "serialNumber": "2532ZATASM98", - "slotPrefix": "mx-master-4-2b042", - "udid": "2532ZATASM98" - } - ] - }, - "first_time_run": false, - "iconsLocalPathCache": { - "/Applications/1Password.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6a8e34eead036cf81e968b53881d964152cbbdcc0ace7ddfce708662cbdc0634.png", - "/Applications/Amazon Kindle.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/829af60a273c36954174269553d8b73b580be9ddd9b21e932915e95a9b776022.png", - "/Applications/Audacity.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3d589bbc86216094c6459c1521596120e605cfea5a18517b02ef034fdaafb3f8.png", - "/Applications/BambuStudio.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/4311b10f26a92348a2b5ae50df961ccb188bef1187d1760495fd4e93427ff4ad.png", - "/Applications/Blackmagic Disk Speed Test.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6804c490b2f5855f9351520d452c5635748443f7a7e4789ae63e113b9db8c49f.png", - "/Applications/Blender.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d07346ed9e6125737996f7fd29e9bcec326f91a89aa1bf190985ca862671ee17.png", - "/Applications/Charles.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d578da8a22df8c912597c049a639b9ef921b4d727e81427d62c47cce36be261a.png", - "/Applications/ChatGPT.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/404f3389062b069e869efbd3c6284f1d049efbefd636c002cd509abd2bc25300.png", - "/Applications/Claude.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/70e95a27f734865ed126bc163cd414416e4d7dc26997dbf30d4d166bd45a5c04.png", - "/Applications/CrealityScan.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d7e1327579266910abe819f84c1cba3cf662d9d8701db4ae59c0091bddc90daa.png", - "/Applications/Cursor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/68615b0344708911b1b6aa6dfe5f27282f8e4f33d9e84f31bc7308c32f615777.png", - "/Applications/Docker.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7ed043c2f7a9d7cd525f81b8c5fe809ba2db4c8fd8c54703cd6ee6268ab8af8a.png", - "/Applications/Electric Sheep.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e210b63ec3deb729db15443bb8565606c84897032a3c291cc408c6db05afaeac.png", - "/Applications/Emacs.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/5aad2a1813fe908e7f0e16c542907ee112912a93a62ab5270459c70caca418f2.png", - "/Applications/ExpressVPN.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9d3780a6381754423734ec5118dc9655e887eeeacad6a0db29d1f749d147d101.png", - "/Applications/Firefox.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/afdda2736a5479f67622a24ce08c0d3d1135f191825a005ecc8de3a4e1f8bd6d.png", - "/Applications/GarageBand.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/aefc1fcb0fdedc7ceaa583c6346b03aae20da18e65b57974d95bb677a6de6ed3.png", - "/Applications/GitHub Desktop.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/c37d2c80604b83c4291bfac3f1a6b36f4d39520f104adc216f30433a5dc89f16.png", - "/Applications/Google Chrome.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/bfa04b72c56ab94bdb32b9d5189a7039fcec630cbc247d59b53d562b1f51b298.png", - "/Applications/Google Docs.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/871200391aca7dd51d7ab4f2243750ea27332569129aee6fd59e5f2b986c21ab.png", - "/Applications/Google Drive.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/4a54a751f3f782316e18ca45e18385c99cdac437bb92d3424ed65f945b1e90f7.png", - "/Applications/Google Sheets.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/1990ea661e3188944aeac6c55b8e251ec1f7bc74fe37a69b19c0bd98927550fe.png", - "/Applications/Google Slides.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/610eb6f6a8b95cddedf8a6d6814bd8d9e181187d9c8a6d2beb773bd120444670.png", - "/Applications/HandBrake.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b50fc1642f461c83f0e2542dacd7ec3eba2fa4c1247fee976b3983e30aacc49a.png", - "/Applications/IINA.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/19baa15a307fa88b5ac7ecc1cb530ca54c5929ce89f5192716384034f7a7361b.png", - "/Applications/Kando.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7b2fa59f84c133c570c63a6030bc85bc5d6c06b9427373bb6e60585b3f058c57.png", - "/Applications/Keynote.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/ce221df45c4dd1056f90b78924298785ebc0137b2fc1df97d7ef43367a4f1964.png", - "/Applications/Linphone.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f9c657ffbe0b4d25ae02c26593e8d63571ad3cd5257f5628da8c915387b50a6a.png", - "/Applications/Mastodon.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/1db49d21580a740727be0a800dbdac50fb925ef8f93971623aaa710b674e24d2.png", - "/Applications/Microsoft Teams.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d6b1519b4ef1d6b6518d05b93dc7e23236591745144b17f15a0ff6959d5d3571.png", - "/Applications/Minecraft.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/91847d9ee4c9852999f76a27caabc30f36e482db4955ca04cd5e106a81b6fff1.png", - "/Applications/MySQLWorkbench.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7a922158682fe4f601929c918049360d4c3b509d09fe3b9c04ba3cf5dec6bcaa.png", - "/Applications/Numbers.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/95bec7547e5242547386eea14621d2f3f835fd1799e168276dafb45337ed7e4f.png", - "/Applications/Origin.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/924922338346f79d527abd7a20265c890e355f58309a7b50b68b4d6f41ef6877.png", - "/Applications/Pages.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d5238fa9c81b4ac8dbe635a94ace658beef8a7443a4b63a2f1807a25f3ffb997.png", - "/Applications/Parallels Desktop.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f99679b206262a5e281e0ae6893011128a42861f7aaffff798013ade83b9b3bf.png", - "/Applications/Parallels Toolbox.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/112b13bb020a90d03354cc5e5e5c5c1e3612e7e085bf253ffc1f9fa447457a65.png", - "/Applications/Pie Menu.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/cb294383fa500b5a38d958fcaf4bffd10b319978bc3be33292422596087e95f2.png", - "/Applications/Postgres.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/4c1024ed7b33e56b6ce66dd77eadb0c78546a352f673aa132cedc0362740153c.png", - "/Applications/Raycast Companion.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3c61aa4c564ae464feec3eb9d8c5ac66953ff68f5f27a942fd3b668ea5f22af1.png", - "/Applications/RectLabel.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/81bdcefca48322f44ed35f71089fec2dd40f2dd187b9e0ef1ab53c542d557abe.png", - "/Applications/RemotePlay.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/008207dede04138840ebb4f1463278d4276bcd380b52127a90ed18898b9086a4.png", - "/Applications/Signal.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7e5a4427df7892b9d1e38756581bd0061e496c6f7c6d0b85144f2282cd9d827b.png", - "/Applications/Skype.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a7a5086cd6a00c42453c5f6792048d8c5d0b186efda825c74fef1f5b4644ebbb.png", - "/Applications/Slack.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6c2891281b304b42912d15bf6932281dfa075c11472e014c731869030d7ad0e4.png", - "/Applications/Spotify.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8cb2262fceee999bff349476d6411c99acc3a835496ff8fdd2e715b4bbb87126.png", - "/Applications/Steam.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9c0c157236ecc22c4d681ed54830d0751c166ab295a91c23f82e2cbddf663bb7.png", - "/Applications/Synergy.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/29018b609f7ed56e5633d215714d1107744fa4af42583653ce7f252b4fcf0dc8.png", - "/Applications/Tailscale.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/0ebcc9a41e39e1396603b52cefc38c38ef1ab1b022c63d0e064535e0a7f1753d.png", - "/Applications/Telegram.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9983517c38e14979e70685ff9a7a42805ccb08d59c42b853f823c9622ba55607.png", - "/Applications/The Unarchiver.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/03146da8aad36b197e72efb1fe8df2a3ee5c7053e19ba468bd6e81081e21bfd9.png", - "/Applications/TigerVNC Viewer 1.13.1.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/886735ceb0896b759ac8dbbab57236645173d17bd0b9ebc2983a262afedceeb8.png", - "/Applications/Tor Browser.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b14f55bcc93fcd4d657afd175080f6755fcd15ccc07f8e8309b0ebba3a93497f.png", - "/Applications/Transmission.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/10ad6057bb2cc681f5324f4e541fb404897aed767bc7d086c4598647e47dc141.png", - "/Applications/Unity Hub.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/56356d817a6dcfa690c00717e0b91cbd30a3c35ae369e7640606ac0555a5a178.png", - "/Applications/Utilities/LogiPluginService.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/805ef3d181a36549bcf5572db4d4455e11e7c4f5db98558e4e1786a6590f1c29.png", - "/Applications/VLC copy 2.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8aaf760b6594145aaf82502f8a6da183688edb1f7969411538e589d2480181ac.png", - "/Applications/VLC copy 3.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/baf0a3e915fc4223946dfffdcd3c7ce9922010edae8717af632c7d455717b9c1.png", - "/Applications/VLC copy.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/50e1357ab57a8a56605ec1c355222cdf9513fb5f2557cc5fba5c0641d1f42b02.png", - "/Applications/VLC.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/63d7b9ba7115acc9091e98b6adcd90a2a72b3e61980213a68a846a441cdd8343.png", - "/Applications/VOCALOID6 Editor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e6bbcb5f0be3ac12800f5bbb2b5914f9be592c20aba378ca80aeb167d382bd59.png", - "/Applications/Visual Studio Code.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/09fd43d9b3e1180a565e062f8f6e64211969e883639cced9f44deb56508c73ed.png", - "/Applications/Whisky.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fac27ad00eaa64d5a7147ec73ade5c77bd073427d105e026650389c71ea25370.png", - "/Applications/Xcode.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8906e9be5db3fca2c43987139fd6f7e094ff1064b569faea7d89c81bbb832231.png", - "/Applications/XnViewMP.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/873df51580e94579d06e5df0c47f7ac993620e509b9d8df0b81c2b159093b0ed.png", - "/Applications/iMovie.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/849ba66ad25c454fa79d5f6735fa4b11f36e3a58bacad7a36e7ce602a62398bc.png", - "/Applications/lghub.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a7b1deff7203925671d1b68ed395955a2de8fbf5abdd91304dc30a7ee287e0d6.png", - "/Applications/pgAdmin 4.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d55ab60b65d45a63b2e414b20811c8f5bea478013a37fc4a790a6b588fc8da31.png", - "/Applications/zoom.us.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/23492da04e930bf6dc1dd86728cb5450546129d4a481c34ee049da2b70753e09.png", - "/System/Applications/App Store.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/82b585ff858fb2caaca963e4631fc6c2b520633f4048fb81142b56bac92707c7.png", - "/System/Applications/Automator.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/2b6a7bdebbc1b7eca944ee441d275adb02f5c81dceee68d76b8938ac4566b763.png", - "/System/Applications/Books.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fd961ed64c08e7529a8a987a4539efd8d8d46a691fcb9967d0fd68e0a89ddfa2.png", - "/System/Applications/Calculator.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a58c3dcaf497f5c03da2a9e35d400c7c73c31a1c7e6ffd5df476d7671be1987d.png", - "/System/Applications/Calendar.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/199acae1270eee58cb75d338f61614f850ee319d287c75498d8d3e0968583868.png", - "/System/Applications/Chess.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3d56918d27bc2dc627412ce1f4ddde1e4f932abade7b2540e6e4b5ddf39e8655.png", - "/System/Applications/Clock.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/91d2a6cf14cbc737144c46a8f120b53d4eb260e6402892f74f8197e15534d906.png", - "/System/Applications/Contacts.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6c70a74c39928f47b712a7d93a46b6c5b98f5ab479d5fddc0dae1dbe847529b6.png", - "/System/Applications/Dictionary.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/990ac083d595927f16c3335d22a4312f8464c592c67561b0befab64ab915878f.png", - "/System/Applications/FaceTime.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/95673965bb37d7ee4c76a6411d0446fb4be5cf5afd506c6351b70d2428d859d8.png", - "/System/Applications/FindMy.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/19401611aa908b072c43eb1f1682233ac36fd1e73bab4027077a15ef180afbc2.png", - "/System/Applications/Font Book.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/6705e1dc3da09cdc5fa6c826e62db620e9bdabb04533eb04048d944104e2d565.png", - "/System/Applications/Freeform.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7cecbe98f4a6504f10e8b5acbccec0cf720a96a46ca11752e272173a95aa8fe7.png", - "/System/Applications/Home.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/bb056c6ffd383a640ed1710dca708f2d1d91ac88995a6f3ab0723cf98ba10731.png", - "/System/Applications/Image Capture.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/41a855a3f7eab550c235d4fd424ce00aa737eecfe534feb91d1c380fc0fc3cf2.png", - "/System/Applications/Image Playground.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/55a883abfd2bc29288b51c8e3962ab0e2f8dcfed2d8fe24e80faf18cf7bc0483.png", - "/System/Applications/Launchpad.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d7931fe587bf2b37cf4d820a7c894fb7a8c675982e460958d84a0d1cc229b3f2.png", - "/System/Applications/Mail.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/66f54eee03d3997cc3b41dc5e0b87600c1123f33f7eb78604c4601e734976e14.png", - "/System/Applications/Maps.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/33917b1b13d0c52e25f9ff199921b065a454701a42cabd65baecbd475e9bd3e2.png", - "/System/Applications/Messages.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/0bf026f923d8f6b214fad92329b8107cbb69619967b4d6f6f8186bbab2a9b544.png", - "/System/Applications/Mission Control.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/89771884ee8ffc3116b8ccfd7c25c26be29f9aa99b70a459d296e8a455017334.png", - "/System/Applications/Music.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b3815efba956022d8be0aff9eded9c278b45ebfdd9d5ef7b3255d59def7d5bd6.png", - "/System/Applications/News.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/14dd389da7cf4c600b65f877686cb3f0e74ae2b1b62034a5858ccd5605bd7e70.png", - "/System/Applications/Notes.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/a3f7ea9541b37707e7c7efaa2cdec03780980c1d0b7f40b8e7a2aaeb6f8aa3fe.png", - "/System/Applications/Passwords.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/45055aa7ea38f14e2eb0e5c453fad341d63a58604ee1297358ceb25284ab4422.png", - "/System/Applications/Photo Booth.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/2ba5c8053105aefe737d9e260ef0e4cf2821da5fccc1394c239c1ff974a983b0.png", - "/System/Applications/Photos.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f15510eda766ca10d6197b7564e7f77bb9a14ba72f04b50703b5eaaf29a893bf.png", - "/System/Applications/Podcasts.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/32d347e0ad0e8dadcc9538b9eec663130b278ebbd3bdf1a281a32882141f69cd.png", - "/System/Applications/Preview.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/de94d9d4c799e03092e16c70ad38ff63450575453048feafec600bac03b24663.png", - "/System/Applications/QuickTime Player.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/80975fb5692e88bd9192be56210d95709ed231e80c09d2a8f36c25d4c2222aa8.png", - "/System/Applications/Reminders.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/768f7a5f92fc9dc9891d6f0c97f3ec8c67b1e06afecb8314e7e3fba3f60c1f2e.png", - "/System/Applications/Shortcuts.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/031d4a7b65b54d7a58cc5a2d5bc34c5068d319d65663480e2165be9aa0316074.png", - "/System/Applications/Siri.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/f6cb3e03729f245b0014ba573821e8b7c795704b799d273e370ed1650ab08d33.png", - "/System/Applications/Stickies.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e5bc0d8f501dda3689a770beec483fa3aa76bda1166a9710e248dbfcf7bbced8.png", - "/System/Applications/Stocks.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/1fdd06f36d2dbafbe4b2cf72333005fc60bba8fff3baff9550233b88f8f3fd4b.png", - "/System/Applications/System Settings.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/e8da624c5287bdd5497fff9bdb77808de19da7cdb5ba1570cad9f6991a466ebe.png", - "/System/Applications/TV.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/957aa381851427f4f172281a6bdfe6588f0db99e466be2bfc3fa03ee9a94250d.png", - "/System/Applications/TextEdit.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3450a38b95e1d9a593d21c449a0a7b1429c0aa724db22cacdba9a64d019c7f70.png", - "/System/Applications/Time Machine.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/0e7fb45745a46daab5edb45124670de255893eca224fe27a5d60dd1568e20a1c.png", - "/System/Applications/Tips.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3987fd0fa294915fb993d2cc0cd15e2973694fb4d3c02c1491638b6be72be5cb.png", - "/System/Applications/Utilities/Activity Monitor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b88997847a4e2a62a3597c19e7aba16e2c396d3cb5285fc8348df05ac7a78282.png", - "/System/Applications/Utilities/AirPort Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/bc428cc60fb3af76e6dcbe77107238ce51a9a7dada5f0e786db348d5f4389c3e.png", - "/System/Applications/Utilities/Audio MIDI Setup.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/04c5462360c9b3e8033779e885f32b606256d45ad859dd0b0cfc8655eb2d2352.png", - "/System/Applications/Utilities/Bluetooth File Exchange.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fbd7162940680f6e086eee502b2c372c68b2dd77049a0a5cfcd9c83d064b0cd1.png", - "/System/Applications/Utilities/Boot Camp Assistant.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b3cfa440b9e1c5864ff8768dd6aadf346b73a0b9f953c0619cc4a5d10074ae2f.png", - "/System/Applications/Utilities/ColorSync Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/cfcbdd06ceb07db8ecca138fee896c85e399de4cb7bd60b6faebb41f9c07aba4.png", - "/System/Applications/Utilities/Console.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/22310a2028ed0a018ad7e06ae82381bccd1dfad32480f118886a8ff688b2ad6c.png", - "/System/Applications/Utilities/Digital Color Meter.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/c1fda7c7b1fb353ff69db39081b13bd5f0a6baf083734d3e73a600ade6186da9.png", - "/System/Applications/Utilities/Disk Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d5f63c5bf9d14ee4f947fef43800dc1959deb60549bae68708ccf387ab99d7b8.png", - "/System/Applications/Utilities/Grapher.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b8aa013d506768fb397baf74661dd937af0fea21a0e60567faec7bd57cc6e7b3.png", - "/System/Applications/Utilities/Migration Assistant.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7968d79ae3312a6acc75b6b6176002b448741357bdf05de42439dd615e1e6f76.png", - "/System/Applications/Utilities/Print Center.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b4a3956e11c93d691e6a16c28cf3d484a4016f5fa058cd4070494cbf744852e5.png", - "/System/Applications/Utilities/Screen Sharing.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7b11d8dcef82285f883c8d7bd04bd5116f33b5dacfa40c870451a34bd5a55d5e.png", - "/System/Applications/Utilities/Screenshot.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/42eb769f113c3238fc8fb208708fcef6bd4ed29d4e43f1603f8dbb30ba421a40.png", - "/System/Applications/Utilities/Script Editor.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/d374761ec00073326d7fb2dd4754695a5fe62d49f0d1b7a1508754730877d93f.png", - "/System/Applications/Utilities/System Information.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/c19ea83df742a3341c78122d46082ee9a11a9bd6d88c05ef9b1a99d219bb445c.png", - "/System/Applications/Utilities/Terminal.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/b5513d0f8ab1beb730d9e67c9188614a81bd76600facbff68801e4b14b1eae33.png", - "/System/Applications/Utilities/VoiceOver Utility.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/8f202fcc5585115cbeac9ca8df1346818672f91be3680a3eac39a5bdfd882c0b.png", - "/System/Applications/VoiceMemos.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/9f0da278b541410b80aaf2da831c1bac94f9881b2902e53b940c2aafc578d29f.png", - "/System/Applications/Weather.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/7e67227cc1ab71dc5983e5cebf4d23188ab546c21fe27678f09ef380a932f9c3.png", - "/System/Applications/iPhone Mirroring.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/34eb3b25ea382caa79efe5dada8195cefe45538d757a15399766c64027891687.png", - "/Users/a2deh/Applications/Factorio.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/57c1c02bb9478b7084f49641c043f20cf125d8323cd6465f0b8df17553145ac6.png", - "/Users/a2deh/Applications/HandBrake.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/3942ab73cfe43941dbd8eb827583ea9b10c924d4d33c2f686f87acdcb6014a76.png", - "/Users/a2deh/Applications/Oxygen Not Included.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/2abbb02cb1c08390af6dc6c3e98cb5bffcb2d67c9a7d6fc7178a235801c1afe9.png", - "/Users/a2deh/Applications/RimWorld.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fdf6be122c08d5412058f36045e328397521c31d11de4421b554d4d331377084.png", - "/Users/a2deh/Applications/Sid Meier's Civilization VII.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/ef91feed43c0b54ecac9da897f4c40e40b2c6401980f5067f9ba84ead807c9e9.png", - "/Users/a2deh/Applications/Two Point Museum.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/ff7087b0841c9f166cee30c43ef02c3769fdf194f9333afd6bb378090f5c5cd6.png", - "/Users/a2deh/Applications/shapez 2.app": "/Users/a2deh/Library/Application Support/LogiOptionsPlus/icon_cache/fb9a9dafa8798dbe85e2ecd64fb6d3a0a902f2ea056ce21fa19858835f51c621.png" - }, - "integration_manager_settings": { - "allowLedSdk": true - }, - "is-global-migrated": true, - "low_battery_notifications_enabled": true, - "macro_usage": { - "macroUsageCounters": [ - { - "count": "3", - "macroInfo": { - "cards": [ - { - "applicationId": "420fd454-0c36-499d-bde4-146823b16147", - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "OpenApp.png", - "OpenApp.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_open_ai_overlay", - "macro": { - "artificialIntelligence": {}, - "type": "ARTIFICIAL_INTELLIGENCE" - }, - "name": "ASSIGNMENT_NAME_OPEN_AI_OVERLAY", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON", - "AI_PROMPT_BUILDER_TAG" - ], - "taskId": 65653 - }, - { - "applicationId": "91f29e15-d87c-4f3f-8512-11df765a9e8f", - "attribute": "MACRO_PLAYBACK", - "id": "macro_presets_show_application_osx", - "macro": { - "appWindowsManagement": { - "action": "SHOW", - "appName": "Cursor", - "path": "/Applications/Cursor.app" - }, - "type": "APP_WINDOWS_MANAGEMENT" - }, - "name": "ASSIGNMENT_NAME_SHOW_APPLICATION", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "macro": { - "inputSequence": { - "componentLists": [ - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "mouse": { - "button": { - "hidUsage": 1, - "isDown": true - } - } - }, - { - "mouse": { - "button": { - "hidUsage": 1 - } - } - } - ] - }, - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "keyboard": { - "displayName": "F", - "hidUsage": 9, - "isDown": true, - "virtualKeyId": "VK_F" - } - }, - { - "keyboard": { - "displayName": "F", - "hidUsage": 9, - "virtualKeyId": "VK_F" - } - } - ] - }, - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "isDown": true, - "virtualKeyId": "VK_O" - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "virtualKeyId": "VK_O" - } - } - ] - }, - { - "components": [ - { - "delay": { - "durationMs": 21 - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "isDown": true, - "virtualKeyId": "VK_O" - } - }, - { - "keyboard": { - "displayName": "O", - "hidUsage": 18, - "virtualKeyId": "VK_O" - } - } - ] - } - ], - "defaultDelay": 21, - "useDefaultDelay": true - }, - "type": "INPUT_SEQUENCE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "text_block_card", - "macro": { - "textBlock": { - "text": "foo" - }, - "type": "TEXT_BLOCK" - }, - "name": "text_block_card", - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "applicationId": "420fd454-0c36-499d-bde4-146823b16147", - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "ScreenCapture.png", - "ScreenCapture.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_screen_capture", - "macro": { - "actionName": "screencapture_default", - "screenCapture": { - "areatocapture": "CAPTURE_SCREEN", - "destinationfolder": "CAPTURE_FILE" - }, - "type": "SCREEN_CAPTURE" - }, - "name": "ASSIGNMENT_NAME_SCREEN_CAPTURE", - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ], - "taskId": 155 - }, - { - "attribute": "MACRO_PLAYBACK", - "macro": { - "delay": { - "durationMs": 1000 - }, - "type": "DELAY" - } - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - }, - { - "attribute": "MACRO_PLAYBACK", - "id": "device_alert_card", - "macro": { - "device": { - "action": "HAPTICS", - "hapticWaveformRequest": {}, - "info": { - "id": "dev00000000", - "model": "2b042_ext1", - "name": "MX Master 4", - "slotPrefix": "mx-master-4-2b042" - } - }, - "type": "DEVICE" - }, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ] - } - ], - "customCategories": {}, - "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", - "lastEditTimestamp": "1760794176638", - "name": "deleteme", - "platform": "OSX", - "usageCount": 1 - }, - "triggerInfo": { - "deviceModel": "2b042_ext1", - "slotId": "mx-master-4-2b042_c416" - } - } - ] - }, - "macro_usage_last_log_time": 1760830388, - "macros_add_triggers_allowed": true, - "macros_execution_stop_hint_shown": true, - "macros_onboarding_shown": true, - "macros_onboarding_start_time": 1760792250693, - "macros_restore_backup_shown": true, - "migration_report": { - "devices": [ - { - "deviceName": "Software events", - "migrationStatus": "MIGRATION_SKIPPED", - "modelId": "10000001" - }, - { - "deviceName": "Actions Ring", - "migrationStatus": "MIGRATION_SKIPPED", - "modelId": "10000000" - }, - { - "deviceName": "MX Master 4", - "migrationStatus": "MIGRATION_SKIPPED", - "modelId": "2b042" - } - ] - }, - "mode_shift_reset_info": { - "isModeShiftReset": { - "mx-master-4-2b042": true - } - }, - "next_star_rating_check": "20260116T125731", - "options_swap_state_snapshot": false, - "optionsplus_mouse_swap_setting_applied": true, - "profile-420fd454-0c36-499d-bde4-146823b16147": { - "activeForApplication": true, - "applicationId": "420fd454-0c36-499d-bde4-146823b16147", - "assignments": [ - { - "card": { - "attribute": "MACRO_REF", - "executeOnProfileChange": true, - "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", - "name": "deleteme", - "readOnly": true - }, - "cardId": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", - "slotId": "mx-master-4-2b042_c195", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "ShiftWheelMode.png", - "ShiftWheelMode.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_mode_shift", - "macro": {}, - "name": "ASSIGNMENT_NAME_MODE_SHIFT", - "readOnly": true, - "tags": [ - "PRESET_TAG_MOUSE_SMARTSHIFT", - "PRESET_TAG_NO_GESTURE" - ], - "taskId": 157 - }, - "cardId": "card_global_presets_mode_shift", - "slotId": "mx-master-4-2b042_c196", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_REF", - "executeOnProfileChange": true, - "id": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", - "name": "deleteme", - "readOnly": true - }, - "cardId": "b3d72afa-fefb-4b88-860a-5b84cd5231dc", - "slotId": "mx-master-4-2b042_c416", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "MiddleClick.png", - "MiddleClick.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_middle_button", - "macro": { - "actionName": "MB3", - "mouse": { - "action": "BUTTON", - "hidUsage": 3 - }, - "type": "MOUSE" - }, - "name": "ASSIGNMENT_NAME_MIDDLE_BUTTON", - "readOnly": true, - "tags": [ - "PRESET_TAG_MOUSE" - ], - "taskId": 58 - }, - "cardId": "card_global_presets_middle_button", - "slotId": "mx-master-4-2b042_c82", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Back.png", - "Back.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_back", - "macro": { - "mouse": { - "action": "OSX_GESTURE_BACK" - }, - "type": "MOUSE" - }, - "name": "ASSIGNMENT_NAME_BACK", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON", - "PRESET_TAG_LPS_SUPPORTED" - ], - "taskId": 59 - }, - "cardId": "card_global_presets_osx_back", - "slotId": "mx-master-4-2b042_c83", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Forward.png", - "Forward.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_forward", - "macro": { - "mouse": { - "action": "OSX_GESTURE_FORWARD" - }, - "type": "MOUSE" - }, - "name": "ASSIGNMENT_NAME_FORWARD", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON", - "PRESET_TAG_LPS_SUPPORTED" - ], - "taskId": 61 - }, - "cardId": "card_global_presets_osx_forward", - "slotId": "mx-master-4-2b042_c86", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "FORCE_SENSING_SETTINGS", - "forceSensingSettings": { - "buttonsForceSensingSettings": [ - { - "currentForce": 50 - } - ] - }, - "id": "9b85425b-8c71-4b15-808c-123600000000", - "name": "ForceSensingSettings", - "readOnly": true - }, - "cardId": "9b85425b-8c71-4b15-808c-123600000000", - "slotId": "mx-master-4-2b042_force_sensing_settings", - "tags": [ - "UI_PAGE_POINTER" - ] - }, - { - "card": { - "attribute": "HAPTIC_SETTINGS", - "hapticSettings": { - "eventSourceSettings": { - "LightroomDesktop___Default": { - "isHapticsEnabled": true - }, - "Photoshop___Default": { - "isHapticsEnabled": true - }, - "ZoomMeeting___Default": { - "isHapticsEnabled": true - }, - "actions_ring": { - "isHapticsEnabled": true - }, - "gestures": { - "isHapticsEnabled": true - }, - "switch_screens": {} - }, - "hapticFeedbackLevel": 60, - "isGlobalHapticsEnabled": true - }, - "id": "9b85425b-8c71-4b15-808c-123500000000", - "name": "HapticSettings", - "readOnly": true - }, - "cardId": "9b85425b-8c71-4b15-808c-123500000000", - "slotId": "mx-master-4-2b042_haptic_settings", - "tags": [ - "UI_HAPTIC_SETTINGS" - ] - }, - { - "card": { - "attribute": "MOUSE_SCROLL_WHEEL_SETTINGS", - "id": "9b85425b-8c71-4b15-808c-121100000000", - "mouseScrollWheelSettings": { - "dir": "NATURAL", - "smartshift": { - "isEnabled": true, - "isScrollForceEnabled": true, - "mode": "RATCHET", - "scrollForce": 75, - "sensitivity": 83 - } - }, - "name": "Mouse", - "readOnly": true - }, - "cardId": "9b85425b-8c71-4b15-808c-121100000000", - "slotId": "mx-master-4-2b042_mouse_scroll_wheel_settings", - "tags": [ - "UI_PAGE_POINTER" - ] - }, - { - "card": { - "attribute": "MOUSE_SETTINGS", - "id": "9b85425b-8c71-4b15-808c-120400000000", - "mouseSettings": { - "pointerSpeed": { - "active": { - "dpiLevel": 1, - "highResolutionSensorActive": true, - "value": -0.08 - } - } - }, - "name": "Mouse", - "readOnly": true - }, - "cardId": "9b85425b-8c71-4b15-808c-120400000000", - "slotId": "mx-master-4-2b042_mouse_settings", - "tags": [ - "UI_PAGE_POINTER" - ] - }, - { - "card": { - "attribute": "MOUSE_THUMB_WHEEL_SETTINGS", - "id": "9b85425b-8c71-4b15-808c-121000000000", - "mouseThumbWheelSettings": { - "dir": "STANDARD", - "isSmooth": true - }, - "name": "Mouse", - "readOnly": true - }, - "cardId": "9b85425b-8c71-4b15-808c-121000000000", - "slotId": "mx-master-4-2b042_mouse_thumb_wheel_settings", - "tags": [ - "UI_PAGE_POINTER" - ] - }, - { - "card": { - "attribute": "ADAPTER_2WAYS", - "continuous": true, - "gestureInfo": { - "implementation": "CUSTOM_HORIZONTAL_SCROLL", - "preventDelayedTermination": true - }, - "icons": { - "icons": [ - "HorizontalScroll.png", - "HorizontalScroll.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_horizontal_scroll", - "name": "ASSIGNMENT_NAME_HORIZONTAL_SCROLL", - "readOnly": true, - "tags": [ - "PRESET_TAG_THUMBWHEEL", - "PRESET_TAG_ANALOG_CONTROL" - ], - "taskId": 405 - }, - "cardId": "card_global_presets_osx_horizontal_scroll", - "slotId": "mx-master-4-2b042_thumb_wheel_adapter", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Cut.png", - "Cut.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_cut", - "macro": { - "actionName": "⌘X", - "keystroke": { - "code": 27, - "modifiers": [ - 227 - ] - }, - "type": "KEYSTROKE" - }, - "name": "ASSIGNMENT_NAME_CUT", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ], - "taskId": 802 - }, - "cardId": "card_global_presets_osx_cut", - "slotId": "radial-menu-virtual-device-10000000_c408", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Copy.png", - "Copy.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_copy", - "macro": { - "actionName": "⌘C", - "keystroke": { - "code": 6, - "modifiers": [ - 227 - ] - }, - "type": "KEYSTROKE" - }, - "name": "ASSIGNMENT_NAME_COPY", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ], - "taskId": 801 - }, - "cardId": "card_global_presets_osx_copy", - "slotId": "radial-menu-virtual-device-10000000_c409", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Paste.png", - "Paste.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_paste", - "macro": { - "actionName": "⌘V", - "keystroke": { - "code": 25, - "modifiers": [ - 227 - ] - }, - "type": "KEYSTROKE" - }, - "name": "ASSIGNMENT_NAME_PASTE", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON" - ], - "taskId": 803 - }, - "cardId": "card_global_presets_osx_paste", - "slotId": "radial-menu-virtual-device-10000000_c410", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Forward.png", - "Forward.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_forward", - "macro": { - "mouse": { - "action": "OSX_GESTURE_FORWARD" - }, - "type": "MOUSE" - }, - "name": "ASSIGNMENT_NAME_FORWARD", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON", - "PRESET_TAG_LPS_SUPPORTED" - ], - "taskId": 61 - }, - "cardId": "card_global_presets_osx_forward", - "slotId": "radial-menu-virtual-device-10000000_c411", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Back.png", - "Back.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_back", - "macro": { - "mouse": { - "action": "OSX_GESTURE_BACK" - }, - "type": "MOUSE" - }, - "name": "ASSIGNMENT_NAME_BACK", - "readOnly": true, - "tags": [ - "PRESET_TAG_KEY_OR_BUTTON", - "PRESET_TAG_LPS_SUPPORTED" - ], - "taskId": 59 - }, - "cardId": "card_global_presets_osx_back", - "slotId": "radial-menu-virtual-device-10000000_c412", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Undo.png", - "Undo.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_undo", - "macro": { - "actionName": "Cmd + Z", - "keystroke": { - "code": 29, - "modifiers": [ - 227 - ], - "virtualKeyId": "VK_Z" - }, - "type": "KEYSTROKE" - }, - "name": "ASSIGNMENT_NAME_UNDO", - "readOnly": true, - "tags": [ - "PRESET_TAG_BUTTON" - ], - "taskId": 804 - }, - "cardId": "card_global_presets_osx_undo", - "slotId": "radial-menu-virtual-device-10000000_c413", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "MACRO_PLAYBACK", - "icons": { - "icons": [ - "Redo.png", - "Redo.svg" - ], - "uri": "pipeline://system_actions/" - }, - "id": "card_global_presets_osx_redo", - "macro": { - "actionName": "Shift + Cmd + Z", - "keystroke": { - "code": 29, - "modifiers": [ - 225, - 227 - ], - "virtualKeyId": "VK_Z" - }, - "type": "KEYSTROKE" - }, - "name": "ASSIGNMENT_NAME_REDO", - "readOnly": true, - "tags": [ - "PRESET_TAG_BUTTON" - ], - "taskId": 805 - }, - "cardId": "card_global_presets_osx_redo", - "slotId": "radial-menu-virtual-device-10000000_c414", - "tags": [ - "UI_PAGE_BUTTONS" - ] - }, - { - "card": { - "attribute": "FOLDER", - "icons": { - "icons": [ - "Folder.png", - "Folder.svg" - ], - "uri": "pipeline://88b73d28-24d8-47bd-84a2-c45cad5640d3/actions.bundle/" - }, - "id": "card_global_presets_folder", - "name": "ASSIGNMENT_NAME_FOLDER", - "readOnly": true, - "tags": [ - "PRESET_TAG_FOLDER" - ] - }, - "cardId": "card_global_presets_folder", - "slotId": "radial-menu-virtual-device-10000000_c415", - "tags": [ - "UI_PAGE_BUTTONS" - ] - } - ], - "id": "420fd454-0c36-499d-bde4-146823b16147", - "name": "PROFILE_NAME_DEFAULT" - }, - "profile_keys": [ - "profile-420fd454-0c36-499d-bde4-146823b16147" - ], - "release_notes_build_id": "594152", - "schema_version": 21, - "settings_backup_state_v2": { - "knownDevices": { - "10000000": false, - "10000001": false, - "2b042_ext1": false, - "model_id_macros": false - } - }, - "settings_transferred": true, - "slot_prefixes_ever_seen": [ - "mx-master-4-2b042", - "radial-menu-virtual-device-10000000", - "software-events-virtual-device-10000001" - ], - "system_notification_click_view": "", - "use_system_theme": true -} From ab758620036af136f732ad0b676822b47cf9a857 Mon Sep 17 00:00:00 2001 From: Don Hopkins Date: Mon, 3 Nov 2025 02:06:24 +0100 Subject: [PATCH 17/20] mouse tracking works better now --- .gitignore | 6 +- kando-svelte/package.json | 3 +- kando-svelte/src/lib/aliases.d.ts | 34 + .../src/lib/components/KandoWrapper.svelte | 742 ++++++++++++++++++ .../src/lib/components/PieMenuDemo.svelte | 80 +- .../src/lib/components/PieTree.svelte | 26 +- kando-svelte/src/lib/index.ts | 2 + kando-svelte/src/lib/kando-web.ts | 33 + kando-svelte/src/routes/+page.svelte | 205 +++-- kando-svelte/src/routes/api/themes/+server.ts | 3 + .../~material-symbols/[...path]/+server.ts | 50 ++ .../routes/~simple-icons/[...path]/+server.ts | 38 + kando-svelte/static/kando/menus.json | 48 +- kando-svelte/static/kando/sound-themes | 1 - .../static/kando/sound-themes/EVNTech-Vache | 1 + .../static/kando/sound-themes/Synthetic sound | 1 + .../static/kando/sound-themes/example | 1 + .../static/kando/sound-themes/simple-clicks | 1 + kando-svelte/svelte.config.js | 6 + kando-svelte/vite.config.ts | 15 +- src/menu-renderer/center-text.ts | 4 + .../input-methods/gesture-detector.ts | 5 + .../input-methods/pointer-input.ts | 8 + src/menu-renderer/menu.ts | 15 +- 24 files changed, 1200 insertions(+), 128 deletions(-) create mode 100644 kando-svelte/src/lib/aliases.d.ts create mode 100644 kando-svelte/src/lib/components/KandoWrapper.svelte create mode 100644 kando-svelte/src/lib/kando-web.ts create mode 100644 kando-svelte/src/routes/~material-symbols/[...path]/+server.ts create mode 100644 kando-svelte/src/routes/~simple-icons/[...path]/+server.ts delete mode 120000 kando-svelte/static/kando/sound-themes create mode 120000 kando-svelte/static/kando/sound-themes/EVNTech-Vache create mode 120000 kando-svelte/static/kando/sound-themes/Synthetic sound create mode 120000 kando-svelte/static/kando/sound-themes/example create mode 120000 kando-svelte/static/kando/sound-themes/simple-clicks diff --git a/.gitignore b/.gitignore index 6f3f46fe4..d4e1b54bd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,8 @@ build out bin .DS_Store -.codegpt \ No newline at end of file +.codegpt + +# Ignore declaration files accidentally emitted into source when aliasing from kando-svelte +/src/common/**/*.d.ts +/src/menu-renderer/**/*.d.ts \ No newline at end of file diff --git a/kando-svelte/package.json b/kando-svelte/package.json index b8fc7b90e..708b68c8a 100644 --- a/kando-svelte/package.json +++ b/kando-svelte/package.json @@ -59,6 +59,7 @@ ], "dependencies": { "json5": "^2.2.3", - "zod": "^3.25.76" + "zod": "^3.25.76", + "events": "^3.3.0" } } diff --git a/kando-svelte/src/lib/aliases.d.ts b/kando-svelte/src/lib/aliases.d.ts new file mode 100644 index 000000000..66d296bdc --- /dev/null +++ b/kando-svelte/src/lib/aliases.d.ts @@ -0,0 +1,34 @@ +// Ambient module declarations to satisfy TS in editor/lint when using kit.alias +declare module '@kando/common' { + export { + Vec2, + ShowMenuOptions, + MenuThemeDescription, + SoundType, + SoundThemeDescription, + } from '../../src/common'; + // These are used as value-level types in wrapper props + export type GeneralSettings = import('../../src/common/settings-schemata/menu-settings-v1').GeneralSettings; + export type MenuItem = import('../../src/common').MenuItem; +} + +declare module '@kando/schemata' { + export * from '../../src/common/settings-schemata'; +} + +declare module '@kando/menu' { + const Menu: any; export { Menu }; +} + +declare module '@kando/menu-theme' { + const MenuTheme: any; export { MenuTheme }; +} + +declare module '@kando/gesture' { const v: any; export default v; } + +declare module '@kando/gamepad' { const v: any; export default v; } + +declare module '@kando/sound-theme' { const v: any; export default v; } + +declare module '@kando/base-css'; + diff --git a/kando-svelte/src/lib/components/KandoWrapper.svelte b/kando-svelte/src/lib/components/KandoWrapper.svelte new file mode 100644 index 000000000..34e7c5cf6 --- /dev/null +++ b/kando-svelte/src/lib/components/KandoWrapper.svelte @@ -0,0 +1,742 @@ + + +
        + + + diff --git a/kando-svelte/src/lib/components/PieMenuDemo.svelte b/kando-svelte/src/lib/components/PieMenuDemo.svelte index f48e11790..fe6b48ed4 100644 --- a/kando-svelte/src/lib/components/PieMenuDemo.svelte +++ b/kando-svelte/src/lib/components/PieMenuDemo.svelte @@ -1,6 +1,7 @@ + +
        +

        KandoWrapper (native Kando renderer)

        +
        + {#if themeEffective} + dispatch('select', { path, item: root })} + onHover={(path) => dispatch('hover', { path })} + onUnhover={(path) => dispatch('unhover', { path })} + onCancel={() => dispatch('cancel')} + /> + {:else} +
        Load a theme to run the native Kando renderer.
        + {/if} +
        +
        +