commit edea37a8565d128b0c6bc2fe02e98aa57a9147e4 Author: Juergen Kunz Date: Tue Jan 6 02:24:12 2026 +0000 initial diff --git a/.gitea/workflows/default_nottags.yaml b/.gitea/workflows/default_nottags.yaml new file mode 100644 index 0000000..9f4e743 --- /dev/null +++ b/.gitea/workflows/default_nottags.yaml @@ -0,0 +1,66 @@ +name: Default (not tags) + +on: + push: + tags-ignore: + - '**' + +env: + IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci + NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git + NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} + NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} + NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} + NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}} + +jobs: + security: + runs-on: ubuntu-latest + continue-on-error: true + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm and npmci + run: | + pnpm install -g pnpm + pnpm install -g @shipzone/npmci + + - name: Run npm prepare + run: npmci npm prepare + + - name: Audit production dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --prod + continue-on-error: true + + - name: Audit development dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --dev + continue-on-error: true + + test: + if: ${{ always() }} + needs: security + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Test stable + run: | + npmci node install stable + npmci npm install + npmci npm test + + - name: Test build + run: | + npmci node install stable + npmci npm install + npmci npm build diff --git a/.gitea/workflows/default_tags.yaml b/.gitea/workflows/default_tags.yaml new file mode 100644 index 0000000..e27ad69 --- /dev/null +++ b/.gitea/workflows/default_tags.yaml @@ -0,0 +1,124 @@ +name: Default (tags) + +on: + push: + tags: + - '*' + +env: + IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci + NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@gitea.lossless.digital/${{gitea.repository}}.git + NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}} + NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}} + NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}} + NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}} + +jobs: + security: + runs-on: ubuntu-latest + continue-on-error: true + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @shipzone/npmci + npmci npm prepare + + - name: Audit production dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --prod + continue-on-error: true + + - name: Audit development dependencies + run: | + npmci command npm config set registry https://registry.npmjs.org + npmci command pnpm audit --audit-level=high --dev + continue-on-error: true + + test: + if: ${{ always() }} + needs: security + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @shipzone/npmci + npmci npm prepare + + - name: Test stable + run: | + npmci node install stable + npmci npm install + npmci npm test + + - name: Test build + run: | + npmci node install stable + npmci npm install + npmci npm build + + release: + needs: test + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @shipzone/npmci + npmci npm prepare + + - name: Release + run: | + npmci node install stable + npmci npm publish + + metadata: + needs: test + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + container: + image: ${{ env.IMAGE }} + continue-on-error: true + + steps: + - uses: actions/checkout@v3 + + - name: Prepare + run: | + pnpm install -g pnpm + pnpm install -g @shipzone/npmci + npmci npm prepare + + - name: Code quality + run: | + npmci command npm install -g typescript + npmci npm install + + - name: Trigger + run: npmci trigger + + - name: Build docs and upload artifacts + run: | + npmci node install stable + npmci npm install + pnpm install -g @git.zone/tsdoc + npmci command tsdoc + continue-on-error: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..352c177 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +.nogit/ + +# artifacts +coverage/ +public/ + +# installs +node_modules/ + +# caches +.yarn/ +.cache/ +.rpt2_cache + +# builds +dist/ +dist_*/ + +# custom \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..26e9f92 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "npm test", + "name": "Run npm test", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3648eaa --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "json.schemas": [ + { + "fileMatch": ["/npmextra.json"], + "schema": { + "type": "object", + "properties": { + "npmci": { + "type": "object", + "description": "settings for npmci" + }, + "gitzone": { + "type": "object", + "description": "settings for gitzone", + "properties": { + "projectType": { + "type": "string", + "enum": ["website", "element", "service", "npm", "wcc"] + } + } + } + } + } + } + ] +} diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..4ae65c1 --- /dev/null +++ b/changelog.md @@ -0,0 +1,1352 @@ +# Changelog + +## 2026-01-06 - 3.33.0 - feat(dees-statsgrid) +add multiPercentage tile type to stats grid + +- Add new 'multiPercentage' type to IStatsTile (percentages: [{label, value, color?}]) +- Implement renderMultiPercentage() to render up to 3 percentage items with label, value and colored progress bars +- Add CSS styles for multi-percentage layout, bars, labels and values +- Update demo to replace 'Error Rate' tile with a 'Resource Usage' multiPercentage example (CPU, Memory, Disk) +- Change is additive and backward-compatible with existing tile types + +## 2026-01-04 - 3.32.0 - feat(demo) +add demoGroup metadata to components and update related dependencies + +- Add public static demoGroup properties to many components to categorize demos (groups added: App UI, Button, Chart, Data View, Form, Input, PDF, Simple, Workspace). +- Bump package deps/devDeps: @design.estate/dees-domtools -> ^2.3.7, @design.estate/dees-element -> ^2.1.5, @design.estate/dees-wcctools -> ^3.7.1. +- Clean up package.json deps (removed duplicate entries and removed 'lit' dependency). +- Refactor dees-pdf-viewer to use consolidated directives import (directives.keyed and directives.repeat) instead of separate keyed/repeat imports. + +## 2026-01-04 - 3.31.0 - feat(dees-input-list) +enhance drag-and-drop reordering for dees-input-list and migrate tests to chromium runner + +- Add rich drag state to dees-input-list: dragStartY, dragCurrentY, targetIndex, itemHeight and originalItemRects for accurate hit detection. +- Introduce bound global drag handlers and centralized global drag end/cleanup logic (handleGlobalDragOver / handleGlobalDragEnd). +- Improve drag visuals and animations: 'dragging', 'move-up', 'move-down' transforms, box-shadow, and smoother transitions; prevent hover styling while dragging. +- Move reorder logic away from per-item drop to global drag end to avoid race/positioning issues and ensure consistent reflow and cleanup. +- Migrate many browser test files to chromium-specific variants (added *.chromium.ts) and remove duplicate browser test counterparts. + +## 2026-01-04 - 3.30.1 - fix(dees-statsgrid) +refine spacing, sizing, and colors in dees-statsgrid for a tighter, more compact appearance + +- Reduce global spacing and sizing variables (grid-gap 16→12, tile-padding 24→16, header-spacing 16→12, content-min-height 48→40, description-spacing 12→8, border-radius 8→6). +- Adjust typographic scale (value-font-size 30→26, unit-font-size 16→14, label-font-size 13→12, title-font-size 14→13). +- Switch color tokens to neutral hex values and tighten hover/box-shadow (tile border and backgrounds updated from HSL to hex, hover bg to #fafafa/#0d0d0d, border-color and shadow reduced). +- Downsize graphical elements: gauge and SVG dimensions (width 140→120, height 80→70), stroke-widths 8→6, radius 48→40. +- Slim down percentage bar and trend visuals (percentage bar height 8→6, border-radius 4→3, trend stroke-width 2→1.5, trend fill moved to RGBA). +- No functional or API changes — purely visual/CSS and SVG adjustments. + +## 2026-01-03 - 3.30.0 - feat(appui) +add dees-appui-bottombar component with config, programmatic API, demo and docs + +- Adds a new dees-appui-bottombar web component (ts_web/elements/00group-appui/dees-appui-bottombar/) implementing widget and action management (add/update/remove/get/clear). +- Introduces bottom bar types and API in ts_web/elements/interfaces/appconfig.ts (IBottomBarWidget, IBottomBarAction, IBottomBarConfig, IBottomBarAPI) and extends the app config/type to include bottomBar and bottomBar APIs. +- Integrates the bottom bar into dees-appui: imports and registers component, renders conditionally, exposes bottomBar proxy API, visibility controls (set/getBottomBarVisible), and wires initial config to populate widgets/actions. +- Updates layout/styles (reduces main grid height to account for 24px fixed bottom bar and adds bottombar-hidden attribute handling) and exports component from the appui index. +- Adds interactive demos (dees-appui-bottombar.demo.ts and integration demo) and documents usage and API in readme.hints.md. + +## 2026-01-03 - 3.29.3 - fix(elements/appui) +prevent scroll chaining on app UI components by adding overscroll-behavior: contain + +- Added CSS overscroll-behavior: contain to activity log, main menu, secondary menu, profile dropdown, and tabs components to prevent scroll chaining and unintended body scrolling on touch/trackpad. +- Styling-only change; no public API or behavioral changes beyond scroll handling. +- Bump patch version from 3.29.2 to 3.29.3. + +## 2026-01-03 - 3.29.2 - fix(dees-appui) +set min-height: 0 on .maingrid > dees-appui-maincontent to prevent layout overflow in flex container + +- Added min-height: 0 to .maingrid > dees-appui-maincontent in ts_web/elements/00group-appui/dees-appui/dees-appui.ts to prevent unwanted growth/overflow when used inside a flex container. +- Pure CSS/layout fix — no API or behavior changes to components. + +## 2026-01-03 - 3.29.1 - fix(dees-appui) +prevent main grid overflow by adding overflow:hidden; and add Playwright scroll containment screenshots + +- Add overflow: hidden to .maingrid in ts_web/elements/00group-appui/dees-appui/dees-appui.ts to prevent content from escaping during grid-template-columns transitions. +- Add Playwright artifacts: .playwright-mcp/after-scroll.png and .playwright-mcp/scroll-containment-check.png (screenshots for scroll containment testing). + +## 2026-01-03 - 3.29.0 - feat(docs) +add documentation for new input components, activity log features, theming, and expand DeesAppui docs + +- Updated top-level README to reflect component count increase (75+ → 80+) and added many new component docs +- Added documentation and examples for DeesInputList (sortable list input) and DeesInputProfilepicture (cropping, upload, processing) +- Introduced DeesTheme documentation with usage examples and CSS custom property overrides +- Expanded DeesAppui readme with architecture overview, activity log panel docs, activity entry types, and navigation/secondary menu guidance +- Documented activity log APIs and controls (activityLog.add, addMany, clear, getEntries, filter, search) and new control API helpers (setActivityLogVisible, toggleActivityLog, getActivityLogVisible) +- Updated Appbar examples to include activity log toggle properties (.showActivityLogToggle, .activityLogCount, .activityLogActive) and @activity-toggle event +- Added interface docs (IViewDefinition, IActivityEntry) and updated menu/secondary menu type references +- Changes are documentation-focused (README/element readmes); no source code logic changes shown in this diff + +## 2026-01-03 - 3.28.1 - fix(appui) +adjust layout and spacing in app UI components: fix activity log overflow, contain main content overscroll, and refine secondary menu padding/transition + +- ts_web/elements/00group-appui/dees-appui-activitylog: removed host max-width, added overflow:hidden and set .maincontainer width to 280px to prevent horizontal overflow +- ts_web/elements/00group-appui/dees-appui-maincontent: added overscroll-behavior: contain to .content-area to prevent scroll chaining/overscroll +- ts_web/elements/00group-appui/dees-appui-secondarymenu: updated .groupHeader padding and hover border behavior, increased group icon size from 14px to 16px, and added margin + transition tweaks to .groupItems for smoother collapse/expand + +## 2026-01-02 - 3.28.0 - feat(dees-appui) +Rename DeesAppuiBase to DeesAppui and migrate related API, exports, demos and docs + +- Renamed public component/tag and TypeScript types: DeesAppuiBase -> DeesAppui and TDeesAppuiBase -> TDeesAppui; updated IViewActivationContext.appui type accordingly +- Moved/rewired view registry implementation from dees-appui-base to dees-appui and updated module exports +- Updated README and demo files to reference DeesAppui and new readme paths (removed dees-appui-base docs/demo) +- Replaced dependency/imports of '@webcontainer/api' with '@tempfix/webcontainer__api' (package.json and source imports) +- Changed tsconfig.json: skipLibCheck set from true to false + +## 2026-01-01 - 3.27.1 - fix(dees-actionbar) +always render actionbar wrapper and delay adding visible class to ensure grid/opacity animations run reliably + +- Always render the actionbar wrapper (.actionbar-item and .actionbar-content) instead of returning early so grid-template-rows and opacity transitions can animate. +- Use optional chaining for current bar access (bar?.type, bar?.timeout) to avoid runtime errors when no bar is present. +- Adjust styles and structure: set :host display:block; move background/border to .actionbar-item; add .actionbar-content with min-height/opacity and transitions. +- Make processQueue asynchronous and await updateComplete, then add the 'visible' class inside requestAnimationFrame so the CSS transition is triggered after render. + +## 2026-01-01 - 3.27.0 - feat(services) +introduce DeesServiceLibLoader to lazy-load heavy client libraries from CDN and update components to use it + +- Add DeesServiceLibLoader singleton (ts_web/services/DeesServiceLibLoader.ts) to lazily load and cache libraries via jsDelivr ESM: xterm, xterm-addon-fit, highlight.js, ApexCharts, and Tiptap. +- Inject xterm CSS dynamically to avoid shipping xterm styles in the initial bundle. +- Expose helper methods preloadAll() and isLoaded(), and typed bundle interfaces (IXtermBundle, IXtermFitAddonBundle, ITiptapBundle). +- Update components to use runtime-loaded modules: dees-chart-area, dees-dataview-codebox, dees-input-richtext, wysiwyg code block, dees-workspace-terminal, terminal-tab-manager, dees-workspace-terminal-preview. +- TerminalTabManager now requires setXtermModules(...) before creating tabs and will throw if not initialized; workspace terminal now initializes and passes the loaded modules. +- Replace direct runtime imports of heavy libs with typed imports and runtime-loaded bundles to reduce initial bundle size and improve load performance. + +## 2026-01-01 - 3.26.1 - fix(dees-actionbar) +animate actionbar hide using grid-template-rows and wait for animation before clearing state + +- Switch host layout from block/max-height to grid using grid-template-rows for open/close transitions +- Add min-height: 0 to .actionbar-item to prevent flex children overflow and collapsing +- Introduce async hideCurrentBar() that removes 'visible', sets isVisible=false, waits 220ms then clears currentBar and currentResolve +- processQueue() now calls hideCurrentBar() asynchronously instead of clearing state immediately + +## 2026-01-01 - 3.26.0 - feat(workspace) +add external file change detection, conflict resolution UI, and diff editor + +- Watch open files for external changes with debounced file watchers (startWatchingFile/stopWatchingFile/stopAllFileWatchers). +- Prompt the user when disk changes conflict with unsaved local edits via dees-actionbar (actions: Load from Disk, Save Local, Compare). +- Introduce dees-workspace-diff-editor component and export it; support comparing and resolving diffs (diff-resolved / diff-closed events). +- Add setContentExternal in dees-workspace-monaco to update editor content from external sources while optionally preserving cursor, selections and scroll position. +- Start/stop file watchers when files are opened/closed and integrate diff view and actionbar into the workspace UI for seamless conflict handling. + +## 2026-01-01 - 3.25.0 - feat(dees-actionbar) +add action bar component and improve workspace package update handling + +- Introduce dees-actionbar component (dees-actionbar.ts) with interfaces, queueing, timed auto-trigger and demo usage +- Add actionbar.interfaces.ts and index export; export dees-actionbar from elements index +- Enhance workspace bottombar: add pendingPackageUpdate flag, process-complete handler, and connected/disconnected listeners to auto-refresh package status after updates +- Make pnpm outdated checking robust by streaming output via a reader and adding a 10s timeout to avoid hanging; handle timeout and stream cancellation +- Update package update commands to include '--latest' for updatePackage and updateAllPackages, and show 'Checking...' label during checks +- Add '@types/node' (^22.0.0) to devDependencies in the workspace package config + +## 2026-01-01 - 3.24.0 - feat(workspace) +add workspace bottom bar, terminal tab manager, and run-process integration + +- Add dees-workspace-bottombar component and export; bottom bar emits run-process events to launch processes. +- Introduce terminal interfaces (IRunProcessEventDetail, ITerminalTab, ICreateTerminalTabOptions, etc.) and a TerminalTabManager to manage multiple terminal tabs and lifecycle. +- Integrate bottombar into dees-workspace: layout refactor (workspace-outer), move/adjust resize handles and panels, and handle @run-process to create terminal tabs and focus terminal panel. +- Enhance dees-workspace-terminal: tabbed terminal UI, new public APIs (createProcessTab, writeToTab, sendInputToTab), theme updates, and improved disposal/cleanup behavior. +- Update module exports to include bottombar and additional terminal sub-exports (interfaces, terminal-tab-manager). + +## 2025-12-31 - 3.23.0 - feat(workspace) +add resizable file tree and terminal panes with draggable handles and public layout APIs + +- Introduce reactive state for currentFileTreeWidth, currentTerminalHeight, isDraggingFileTree and isDraggingTerminal +- Add mouse event handlers (mousedown/move/up) to drag-resize the file tree and terminal with min/max clamping +- Dispatch window resize event after resizing to notify Monaco/editor of layout changes +- Clean up resize event listeners in disconnectedCallback +- Initialize current sizes from component properties in firstUpdated +- Expose public layout methods: setFileTreeWidth, setTerminalHeight, resetLayout + +## 2025-12-31 - 3.22.0 - feat(workspace) +add resizable markdown editor/preview split with draggable handle and markdown outlet styling/demo + +- Introduce a flexible split layout for the workspace markdown editor with a draggable resize handle (splitRatio, minPanelSize, dragging state, mouse handlers and cleanup). +- Enhance dees-workspace-markdown: switch from grid to flex, add resize handle UI, prevent pointer selection while dragging, notify Monaco on resize. +- Add comprehensive styling and demo content for dees-workspace-markdownoutlet (dark/light themed markdown styles, syntax highlighting classes, and demo scenarios). +- Fix typescript-intellisense monaco model update: only set model value when content actually changed to avoid cursor resets. +- Add markdown outlet demo helper and numerous screenshot/image assets (.playwright-mcp) for demos/documentation. + +## 2025-12-31 - 3.21.0 - feat(terminal) +add dynamic bright/dark theming for terminal components and terminal preview + +- Add bright/dark theme PNG assets under .playwright-mcp for previews. +- Replace hardcoded terminal background/colors with cssManager.bdTheme in workspace terminal and preview styles. +- Introduce getTerminalTheme helper to compute xterm theme for bright/dark modes. +- Subscribe to themeManager.themeObservable and apply updates to xterm (terminal.options.theme) so terminals update live on theme change. +- Remove hardcoded background property/CSS var and unused background accessor from workspace terminal. +- Ensure proper cleanup: unsubscribe theme subscriptions and dispose terminals in disconnectedCallback. + +## 2025-12-31 - 3.20.1 - fix(dees-workspace) +fix demo wrapper and workspace layout; always render terminal preview + +- Import @design.estate/dees-wcctools/demotools and wrap demo content in +- Create an absolute-positioned container so the dees-workspace fills 100% height/width +- Always render dees-workspace-terminal-preview (use empty command when none) to avoid conditional rendering issues +- Set a fixed height (200px) for the terminal preview in the initializing state +- Add Playwright demo asset .playwright-mcp/dees-workspace-demo-4k.png + +## 2025-12-31 - 3.20.0 - feat(workspace) +rename editor components to workspace group and move terminal & TypeScript intellisense into workspace + +- Renamed components and modules from 00group-editor/dees-editor-* to 00group-workspace/dees-workspace-* (e.g. dees-editor-monaco -> dees-workspace-monaco). +- Moved terminal implementation from dees-terminal to dees-workspace-terminal and updated related imports/usages. +- Moved TypeScript intellisense manager into 00group-workspace and updated paths. +- Updated ts_web elements index to export 00group-workspace instead of 00group-editor and adjusted internal imports accordingly. +- Updated scripts/update-monaco-version.cjs to write MONACO_VERSION into the new workspace path and updated log tags. + +## 2025-12-31 - 3.19.1 - fix(intellisense) +Debounce TypeScript/JavaScript IntelliSense processing and cache missing packages to reduce work and noisy logs + +- Add 500ms debounce in editor workspace to avoid parsing on every keystroke +- Introduce notFoundPackages cache to skip repeated filesystem checks for packages without types +- Clear not-found cache when scanning node_modules so newly installed packages are re-detected +- Remove noisy console logs and make file/directory read errors non-fatal (ignored) +- Simplify processContentChange signature (removed optional filePath) and remove manual diagnostic refresh logic + +## 2025-12-31 - 3.19.0 - feat(dees-editor-workspace) +improve TypeScript IntelliSense, auto-run workspace init commands, and watch node_modules for new packages + +- Execute an onInit command from /npmextra.json on workspace initialization (e.g., run pnpm install). +- Add npmextra.json and an import test file (importtest.ts) plus a sample dependency in the scaffold to test package imports. +- Add node_modules watcher with debounce to auto-scan and load package types after installs. +- Enhance TypeScript IntelliSense: recursively load all .d.ts files from packages and @types packages, add package.json as extra lib, and log progress/errors for debugging. +- Change processContentChange signature to accept optional filePath and trigger a diagnostic refresh when new types are loaded. +- Expose scanAndLoadNewPackageTypes to scan top-level and scoped packages and load their types. +- Add start/stop logic for the node_modules watcher in workspace lifecycle to avoid leaks and handle cleanup. + +## 2025-12-31 - 3.18.0 - feat(filetree) +add filesystem watch support to WebContainer environment and auto-refresh file tree; improve icon handling and context menu behavior + +- Add IFileWatcher interface and watch(...) signature to IExecutionEnvironment. +- Implement watch(...) in WebContainerEnvironment using WebContainer's fs.watch and return a stop() handle. +- dees-editor-filetree: start/stop file watcher, debounce auto-refresh on FS changes, cleanup on disconnect, and track last execution environment. +- Add clipboard state (copy/cut) and related UI/menu enhancements for file operations (new file/folder, rename, delete, copy/paste). +- dees-icon: default to Lucide icons when no prefix is provided. +- dees-contextmenu: remove 'lucide:' prefix usage in templates and avoid awaiting windowLayer.destroy() to provide instant visual feedback. +- Menu item shape adjusted (use { divider: true } for dividers) and various menu icon name updates. + +## 2025-12-31 - 3.17.0 - feat(editor) +add file explorer toolbar, empty-space context menu, editor auto-save, save-all, and keyboard save shortcuts + +- Added filetree toolbar with New File / New Folder actions and toolbar styling +- Added right-click context menu for empty filetree space to create files/folders +- Implemented editor menu button with context menu (Auto Save toggle, Save, Save All) +- Added auto-save toggle with 2s interval and cleanup on disconnect +- Implemented Save and Save All APIs that persist files and update IntelliSense manager +- Added keyboard shortcuts: Cmd/Ctrl+S to save active file and Cmd/Ctrl+Shift+S to save all +- Made tabs scrollable with a tabs container and added an editor menu button + +## 2025-12-30 - 3.16.0 - feat(editor) +improve TypeScript IntelliSense and module resolution for Monaco editor + +- Add file cache (fileCache) and getFileContent() for synchronous access to project files +- Track and dispose Monaco extra libs (addedExtraLibs) and register project files via addExtraLib to enable TypeScript module resolution +- Add addFileAsExtraLib logic to register .ts/.tsx files also under .js/.jsx paths so ESM imports resolve to TypeScript sources +- Use ModuleResolutionKind.Bundler fallback to NodeJs and set compilerOptions (baseUrl '/', allowImportingTsExtensions, resolveJsonModule) to improve resolution +- Adapt executionEnvironment API usage to readDir/readFile and check entry.type ('directory'|'file') instead of isDirectory/isFile +- Add a debugging/screenshot asset: .playwright-mcp/module-resolution-fixed.png + +## 2025-12-30 - 3.15.0 - feat(editor) +enable file-backed Monaco models and add Problems panel; lazy-init project TypeScript IntelliSense + +- dees-editor-monaco: add `filePath` property and create/get Monaco models with file:// URIs so editors are backed by real models; sync content into models and handle model switching when filePath changes; enable hover config and improved lifecycle handling. +- dees-editor-workspace: add bottom 'Problems' panel and panel tabs (terminal/problems), diagnosticMarkers state, marker listener, UI for problem list, and navigation to file/position when a problem is clicked; initialize IntelliSense lazily when a file is opened. +- typescript-intellisense: index project .ts/.js files from the virtual filesystem into Monaco models for cross-file resolution, enable allowNonTsExtensions and set eager model sync so TypeScript processes models eagerly. +- General: improved handling for language changes, model language switching, and deferred initialization of the IntelliSense manager. +- Add Playwright test images (workspace screenshots) used by CI/tests. + +## 2025-12-30 - 3.14.2 - fix(editor) +bump monaco-editor to 0.55.1 and adapt TypeScript intellisense integration to the updated Monaco API + +- Bumped dependency monaco-editor from 0.52.2 to 0.55.1 in package.json. +- Generated MONACO_VERSION module updated to 0.55.1 and moved target to ts_web/elements/00group-editor/dees-editor-monaco/version.ts. +- Refactored TypeScript IntelliSense code to use a typed Monaco TS API (added IMonacoTypeScriptAPI, tsApi getter, and replaced direct monaco.languages.typescript.* calls). +- Added test/workspace screenshot .playwright-mcp/workspace-test.png (binary asset). + +## 2025-12-30 - 3.14.1 - fix(build) +bump @webcontainer/api and enable skipLibCheck to avoid type-check conflicts + +- Updated @webcontainer/api from 1.2.0 to 1.6.1 +- Added "skipLibCheck": true to tsconfig.json compilerOptions to suppress external library type errors +- No breaking changes expected; this is a build/dev fix + +## 2025-12-30 - 3.14.0 - feat(editor) +add modal prompts for file/folder creation, improve Monaco editor reactivity and add TypeScript IntelliSense support + +- Replace window.prompt for new file/folder with DeesModal + DeesInputText (showInputModal) to provide a focused modal input UX. +- Monaco editor: add language property, handle external content updates without emitting change events (isUpdatingFromExternal), dispatch 'content-change' events, and apply language changes at runtime. +- Add TypeScriptIntelliSenseManager to load .d.ts/type packages from the virtual filesystem (/node_modules), parse imports, load @types fallbacks, and add file models to Monaco for cross-file IntelliSense. +- Workspace demo now mounts an initial TypeScript project and exposes initializationPromise to wait for external setup; workspace initializes IntelliSense and processes content changes to keep types up to date. +- Export typescript-intellisense from workspace index so the manager is available to consumers. + +## 2025-12-30 - 3.13.1 - fix(webcontainer) +prevent double initialization and race conditions when booting WebContainer and loading editor workspace/file tree + +- Add loadTreeStarted flag in dees-editor-filetree to avoid double-loading the file tree and reset it on refresh or on error to allow retries. +- Add initializationStarted flag in dees-editor-workspace to prevent duplicate workspace initialization and reset it on initialization failure to allow retry. +- Make WebContainerEnvironment use a shared singleton container and a bootPromise so only one WebContainer boot runs per page; instances wait for an ongoing boot instead of booting again. +- Reset bootPromise/sharedContainer on boot failure and clear them on teardown so subsequent attempts can retry cleanly. + +## 2025-12-30 - 3.13.0 - feat(editor/runtime) +Replace bare editor with Monaco-based editor and add runtime + workspace/filetree integration + +- Removed dees-editor-bare and replaced usages with dees-editor-monaco (includes MONACO_VERSION file). +- Added IExecutionEnvironment interface and WebContainerEnvironment implementation (uses @webcontainer/api) to provide a browser Node/runtime API. +- Added new components: dees-editor-filetree and dees-editor-workspace to support file tree, multiple open files, and workspace actions wired to the execution environment. +- dees-terminal updated to accept an executionEnvironment (IExecutionEnvironment), renamed environment -> environmentVariables, provides environmentPromise (deprecated note), and now initializes/uses the provided environment to spawn shell processes and write /source.env. +- Updated imports/usages across components (dees-input-code, dees-editor-markdown, group index exports) to use the new Monaco editor and runtime modules. +- Behavioral breaking changes: consumers must supply an IExecutionEnvironment to components that now depend on it (e.g. dees-terminal, workspace, filetree); dees-editor-bare removal is a breaking API change. + +## 2025-12-30 - 3.12.2 - fix(dees-editor-bare) +make Monaco editor follow domtools theme and clean up theme subscription on disconnect + +- Set initial Monaco theme from domtools.themeManager.goBrightBoolean instead of hardcoded 'vs-dark' +- Subscribe to domtools.themeManager.themeObservable to update editor theme dynamically +- Add monacoThemeSubscription property and unsubscribe in disconnectedCallback to avoid memory leaks + +## 2025-12-30 - 3.12.1 - fix(modal) +fix modal editor layout to prevent overlap by adding relative positioning and reducing height + +- Added Playwright screenshots: .playwright-mcp/dees-input-code-demo.png and .playwright-mcp/modal-overlap-issue.png +- Updated ts_web/elements/00group-input/dees-input-code/dees-input-code.ts: modal-editor-wrapper set position: relative and changed height from calc(100vh - 160px) to calc(100vh - 175px) to avoid overlap + +## 2025-12-30 - 3.12.0 - feat(editor) +add code input component and editor-bare, replace dees-editor usage, and add modal contentPadding + +- Add new dees-input-code component (full-featured code editor input with modal, toolbar, language selector, copy and wrap toggles). +- Introduce dees-editor-bare component and remove the legacy dees-editor implementation; update editor markdown component to use dees-editor-bare. +- Export and include DeesInputCode in input index and include it in the unified form input types and dees-form usage. +- Add contentPadding property to DeesModal and apply it to the modal content area (configurable modal inner padding). +- Update element exports to point to dees-editor-bare and adjust related imports/usages. +- Bump devDependency @design.estate/dees-wcctools from ^3.3.0 to ^3.4.0 in package.json + +## 2025-12-30 - 3.11.2 - fix(tests) +make WYSIWYG tests more robust and deterministic by initializing and attaching elements consistently, awaiting customElements/firstUpdated, adjusting selectors and assertions, and cleaning up DOM after tests + +- Create WYSIWYG elements with document.createElement and set properties before attaching to DOM to ensure firstUpdated sees data +- Await customElements.whenDefined and add small delays (setTimeout) so nested components finish rendering in test environments +- Replace outdated selectors (.block.code) with .code-editor and update expectations for code block selection and language controls +- Adjust divider expectations to check for
and data-block-id instead of a divider icon; change toBeDefined -> toBeTruthy for assertions where appropriate +- Add cleanup (document.body.removeChild) after tests to avoid leaking elements between tests +- Relax computed font-family assertion to be platform-agnostic and verify that a fontFamily exists rather than matching 'monospace' +- Add notes/guards around synthetic DragEvent/KeyboardEvent behavior: verify handlers/state existence and dispatch events but avoid relying on native focus/drag internals in CI +- Update BlockRegistry render tests to assert template structure (data-block-id, data-block-type, class names) rather than final content which is populated later + +## 2025-12-30 - 3.11.1 - fix(tests) +migrate tests to @git.zone/tstest tapbundle and export tap.start() in browser tests + +- Replaced imports from @push.rocks/tapbundle to @git.zone/tstest/tapbundle across test files +- Replaced bare tap.start() calls with export default tap.start() in browser test files so the runner can be imported +- Bumped devDependency @git.zone/tstest from ^3.1.3 to ^3.1.4 and removed @push.rocks/tapbundle from devDependencies +- Changes include package.json and updates to multiple test files (11 test files) + +## 2025-12-30 - 3.11.0 - feat(dees-appui-tabs) +improve horizontal tabs UX with scroll fades, hover scrollbar, and smooth scroll-to-selected + +- Add reactive scroll state (canScrollLeft / canScrollRight) and updateScrollState to track horizontal overflow. +- Introduce scroll-fade gradient elements and CSS to indicate overflow on left/right edges. +- Show a thin, styled scrollbar on hover (webkit + Firefox styling) instead of hiding it completely. +- Auto-scroll selected tab into view using scrollTabIntoView and smooth scroll when selecting a tab. +- Set up a ResizeObserver to recompute scroll state on container size changes and clean it up on disconnect. +- Ensure lifecycle hooks call updateScrollState (firstUpdated/updated) so indicators stay in sync after render/fonts ready. + +## 2025-12-29 - 3.10.0 - feat(appui-tabs) +add closeable tabs and auto-hide behavior for content tabs, plus API and events to control them + +- Add closeable tab support: IMenuItem.closeable & IMenuItem.onClose; dees-appui-tabs renders a close button, invokes onClose, and emits a 'tab-close' event. +- Add auto-hide feature: dees-appui-tabs (autoHide, autoHideThreshold) and corresponding properties in dees-appui-maincontent/dees-appui-base to hide tabs when count ≤ threshold. +- Expose new API: dees-appui-base.setContentTabsAutoHide(enabled, threshold) and update appconfig interface to include setContentTabsAutoHide. +- Re-emit 'tab-close' events from dees-appui-maincontent and dees-appui-base so parent components can react to tab closures. +- Add interactive demos (demo-closeable-tabs, demo-autohide-tabs) demonstrating the new closeable and auto-hide behaviors and controls. + +## 2025-12-29 - 3.9.0 - feat(dees-appui-mainmenu) +add status badges to main menu items with theme-aware styling + +- Introduce .badge element and layout (min-width, height, padding, font-size, weight, border-radius) to display counts/status on menu items. +- Add four badge variants: default, success, warning, error, using cssManager.bdTheme for light/dark color pairs. +- Render the badge element conditionally in the menu item template when tabArg.badge is provided; hide badges when host has [collapsed] attribute. + +## 2025-12-29 - 3.8.0 - feat(dees-appui-base) +add interactive demo controls to manipulate appui via view activation context + +- Store IViewActivationContext on the demo element (this.ctx) during onActivate +- Add a new "Context Actions" UI section with buttons that call ctx.appui methods (toggle main/secondary menus, content tabs, collapse/expand main menu, set breadcrumbs, navigate to views, add activity entry, set/clear menu badges) +- Include styles for ctx-actions and button variants (success, danger, hover states) +- Change is limited to the demo file (dees-appui-base.demo.ts) and is non-breaking + +## 2025-12-29 - 3.7.1 - fix(dees-appui-maincontent) +migrate main content layout to CSS Grid and enable topbar collapse transitions + +- Replace absolute positioning with CSS Grid on :host and .maincontainer to enable natural document flow +- Make .topbar a grid and animate collapse via grid-template-rows; switch :host([notabs]) to grid-template-rows: 0fr instead of display:none to allow transitions +- Set .maincontainer to display:contents and add min-height:0 on content areas and topbar children to fix overflow/scrolling and flex/grid height issues +- Remove positional styles (position:absolute/top/left/right/bottom) so content scrolls correctly and layout is more robust + +## 2025-12-29 - 3.7.0 - feat(dees-contextmenu,dees-appui-tabs,test) +Prevent double-destruction of context menus, await window layer teardown, update destroyAll behavior, remove tabs content slot, and adjust tests + +- Add isDestroying guard in DeesContextmenu.destroy to avoid double-destruction. +- Await windowLayer.destroy() to ensure the window layer is fully torn down before continuing. +- Ensure submenu timeouts are cleared and submenu.destroy() is awaited during teardown. +- Change destroyAll to locate the root/top-level menu and destroy from the root to cascade teardown reliably. +- Remove the .content wrapper and the output from dees-appui-tabs (demo updated to render content outside the component) — this is a breaking change to the tabs API (slotted content no longer rendered). +- Increase test timeout in test.contextmenu-nested-close.browser.ts to 600ms to account for ~300ms windowLayer destruction + ~100ms context menu delay. + +## 2025-12-29 - 3.6.1 - fix(readme) +document new App UI APIs to control main/secondary menu and content tabs visibility + +- Added docs for setMainMenuCollapsed(), setMainMenuVisible(), setSecondaryMenuCollapsed(), setSecondaryMenuVisible(), and setContentTabsVisible() programmatic APIs. +- Included a TypeScript example showing how to hide secondary menu, hide content tabs, and collapse the main menu in a view's onActivate hook. + +## 2025-12-29 - 3.6.0 - feat(dees-appui) +add visibility toggles for main/secondary menus and ability to show/hide content tabs; expose corresponding setters and appconfig entries + +- ts_web/elements/00group-appui/dees-appui-base: added boolean properties mainmenuVisible, secondarymenuVisible, maincontentTabsVisible; render main and secondary menus conditionally; pass showTabs to dees-appui-maincontent; added setter methods: setMainMenuVisible, setSecondaryMenuCollapsed, setSecondaryMenuVisible, setContentTabsVisible. +- ts_web/elements/00group-appui/dees-appui-maincontent: added showTabs property, support for a notabs attribute via styles, updated() and firstUpdated() to apply notabs state so tabs can be hidden/shown dynamically. +- ts_web/elements/interfaces/appconfig.ts: expanded appconfig interface to include setMainMenuVisible, setSecondaryMenuCollapsed, setSecondaryMenuVisible, setContentTabsVisible so host app can control visibility programmatically. +- No breaking changes: defaults preserve existing behavior (menus and tabs remain visible by default). + +## 2025-12-29 - 3.5.1 - fix(dees-appui-view) +remove DeesAppuiView component, its demo, documentation snippet, and related exports + +- Deleted component implementation: ts_web/elements/00group-appui/dees-appui-view/dees-appui-view.ts +- Deleted demo file: ts_web/elements/00group-appui/dees-appui-view/dees-appui-view.demo.ts +- Removed index re-export: ts_web/elements/00group-appui/dees-appui-view/index.ts (deleted) and removed export from ts_web/elements/00group-appui/index.ts +- Removed documentation section for DeesAppuiView from readme.md +- Breaking change: any consumers using the component or its public API (selectTab, getMenuItems, getTabs) must be migrated to alternate components/approach + +## 2025-12-29 - 3.5.0 - feat(theme,interfaces) +Introduce a global theming system and unify menu/tab interfaces; migrate components to use themeDefaultStyles and update APIs accordingly + +- Add a new theme module and component (00theme.ts + dees-theme) that provides CSS tokens and themeDefaultStyles to import into components +- Migrate many components to include themeDefaultStyles in their static styles and add TODOs to replace hardcoded values with CSS variables +- Rename ITab -> IMenuItem and replace group.tabs with group.items across interfaces and components (IMenuGroup shape changed) — this is a breaking API change +- Remove legacy interfaces (ISecondaryMenuGroup, ISelectionOption) and update method and property types in DeesAppui* components and app config to use IMenuItem/IMenuGroup +- Move @design.estate/dees-wcctools from dependencies to devDependencies and bump its version to ^3.3.0 +- Add numerous demo files and expand README with usage, examples and theme documentation + +## 2025-12-19 - 3.4.0 - feat(dees-appui-base) +overhaul AppUI core: replace simple view rendering with a full-featured ViewRegistry (caching, hide/show lifecycle, async lazy-loading), introduce view lifecycle hooks and activation context, add activity log API/component, remove built-in router and state manager, and update configuration interfaces and demos + +- Removed files: app.router.ts and state.manager.ts — routing and state-persistence internals were removed (breaking). +- ViewRegistry rewritten: supports cached instances, activate/deactivate lifecycle, canDeactivate checks, async content loading, parameterized routes, and legacy renderView kept as deprecated compatibility. +- New interfaces added/changed: IViewActivationContext, IViewLifecycle, IActivityEntry, IActivityLogAPI, IViewLifecycleEvent; IViewDefinition.content now accepts async loaders and a cache flag; IMainMenuConfig and ITab expanded (logo, groups, badges). +- Activity log: dees-appui-activitylog now implements IActivityLogAPI and exposes reactive entries; demo and readme updated with usage and examples. +- App config changed: routing and statePersistence config entries removed/adjusted; defaultView moved into IAppConfig; view change and lifecycle event shapes changed (breaking). +- Demos and documentation: dees-appui-base demo and readme added/updated to showcase new lifecycle hooks, secondary menu behavior, activity log and new APIs. + +## 2025-12-19 - 3.3.3 - fix(tests) +update test imports to new dees-input-wysiwyg paths + +- Updated imports in test/test.wysiwyg-registry.both.ts to point to ts_web/elements/00group-input/dees-input-wysiwyg/* +- Aligns test references with relocated WYSIWYG block handlers and block registration module; no behavior changes to implementation + +## 2025-12-19 - 3.3.2 - fix(build) +update build config, bump dependencies, and adjust test import paths after element reorganization + +- npmextra.json: renamed gitzone entry to @git.zone/cli, moved tsdoc key to @git.zone/tsdoc, added @ship.zone/szci entry and added release registries + accessLevel +- package.json: bumped @design.estate/dees-wcctools ^2.0.1 -> ^3.1.0, lucide ^0.560.0 -> ^0.562.0, @git.zone/tsbuild ^3.1.2 -> ^4.0.2, @types/node ^25.0.0 -> ^25.0.3 +- tests: updated import paths to follow reorganized source layout (wysiwyg files moved under elements/00group-input/dees-input-wysiwyg and dees-contextmenu moved to elements/dees-contextmenu/dees-contextmenu.js); updated BlockRegistry and blockregistration import paths +- Purpose: align tests and build metadata with refactored element file locations and updated tool/dependency versions + +## 2025-12-11 - 3.3.1 - fix(dees-pdf-viewer) +Scroll active PDF thumbnail into view after rendering and on page changes; update dependency versions + +- Ensure the active thumbnail is scrolled into view after thumbnails are rendered (improves sidebar navigation for dees-pdf-viewer). +- Scroll the thumbnail into view when navigating pages if the sidebar is visible (prevents the active page from being off-screen). +- Retain re-setup of the intersection observer for lazy-loading pages after thumbnail re-render. +- Bumped dependencies in package.json: @design.estate/dees-wcctools -> ^2.0.1, lucide -> ^0.560.0, @git.zone/tswatch -> ^2.3.13, @types/node -> ^25.0.0. + +## 2025-12-09 - 3.3.0 - feat(dees-appui-base) +Add unified App UI API to dees-appui-base with ViewRegistry, AppRouter and StateManager + +- Introduce ViewRegistry for declarative view registration and rendering (supports tag names, element classes and template functions). +- Add AppRouter with hash/history/external/none modes, URL synchronization, navigate/back/forward and onRouteChange listener support. +- Add StateManager to persist UI state (localStorage, sessionStorage or in-memory) with save/load/update/clear APIs. +- Extend interfaces (interfaces/appconfig.ts) with IAppConfig, IViewDefinition, IRoutingConfig, IStatePersistenceConfig and IAppUIState. +- Expose new public DeesAppuiBase methods: configure, navigateToView, getCurrentView, getUIState, restoreUIState, saveState, loadState, getViewRegistry, getRouter. +- Maintain backward compatibility with existing property-based API and slot usage. +- Export new modules (view.registry, app.router, state.manager) from dees-appui-base index and update element exports. + +## 2025-12-08 - 3.2.0 - feat(dees-simple-appdash,dees-simple-login,dees-terminal) +Revamp UI: dashboard & login styling, standardize icons to Lucide, and add terminal background/config + +- Standardize icon usage to Lucide prefixes in dees-simple-appdash; add fallback handling for legacy icon names +- Revamped dees-simple-appdash sidebar: updated spacing, typography, header icon wrapper, scrollbar styling, section labels, hover/selected states, and visual indicators +- Change 'Logout' label to 'Sign out' in dees-simple-appdash and add explicit status classes for controlbar (connected, terminal) +- Improve terminal UX: smoother launch/close animations, updated shadow and sizing logic in dees-simple-appdash +- Add background property to dees-terminal, sync it to a CSS variable and apply it to xterm theme for configurable terminal background +- Redesign dees-simple-login: new header/subheader, card layout, spacing, and updated submit text to 'Sign in' +- Bump devDependency @git.zone/tswatch to ^2.3.5 + +## 2025-12-08 - 3.1.2 - fix(DeesAppuiMainmenu, DeesAppuiSecondarymenu) +Add position: relative to main and secondary app UI menus to fix positioning of overlays and tooltips + +- ts_web/elements/00group-appui/dees-appui-mainmenu/dees-appui-mainmenu.ts: add `position: relative` to host styles +- ts_web/elements/00group-appui/dees-appui-secondarymenu/dees-appui-secondarymenu.ts: add `position: relative` to host styles +- Fixes incorrect positioning for absolutely positioned children (tooltips, overlays, badges) inside the main and secondary menus + +## 2025-12-08 - 3.1.1 - fix(dees-appui) +Extract demos for main and secondary app menus, adjust collapsed styles and toggle placement, bump devDependency + +- Extracted inline demo markup into separate demo files: ts_web/elements/00group-appui/dees-appui-mainmenu/dees-appui-mainmenu.demo.ts and ts_web/elements/00group-appui/dees-appui-secondarymenu/dees-appui-secondarymenu.demo.ts and wired them up via imported demoFunc to reduce component size. +- Moved collapse toggle button markup in both dees-appui-mainmenu and dees-appui-secondarymenu templates to after the main container to improve layout/stacking and focus behavior. +- Adjusted collapsed logo/heading styles: removed extra padding/gap and hide logo text using display:none for a cleaner collapsed state. +- Bumped devDependency @git.zone/tswatch from ^2.3.1 to ^2.3.2 in package.json. + +## 2025-12-08 - 3.1.0 - feat(dees-appui) +Add collapsible/compact mode to AppUI sidebars (mainmenu & secondarymenu) with toggles, tooltips and improved z-index stacking + +- Add collapsed property to dees-appui-mainmenu and dees-appui-secondarymenu (reflect: true) to enable compact horizontal mode. +- Add floating collapse toggle buttons and public toggleCollapse() methods on mainmenu and secondarymenu; these dispatch 'collapse-change' events (bubbles & composed). +- Expose and track collapse state in dees-appui-base via mainmenuCollapsed and secondarymenuCollapsed properties; bind states to child components and re-emit collapse-change events as mainmenu-collapse-change and secondarymenu-collapse-change. +- Implement collapsed styles and animations: reduced sidebar widths, hide/compact labels and headers, center icons, hide badges, and add smooth width/opacity transitions. +- Add tooltips that appear for tabs/items when sidebars are collapsed to preserve discoverability. +- Adjust layout grid in DeesAppuiBase (use auto columns) and add explicit z-index layering to ensure proper stacking order of mainmenu, secondarymenu, maincontent and activitylog. + +## 2025-12-08 - 3.0.1 - fix(dees-appui) +Normalize header heights and box-sizing for App UI components + +- Set topbar/header heights to 48px (was 40px) and adjusted dependent offsets (activity container top, topShadow position) in dees-appui-activitylog. +- Make logo and secondary menu headers fixed 48px tall and replace vertical padding with horizontal padding for consistent vertical alignment (dees-appui-mainmenu, dees-appui-secondarymenu). +- Ensure tabs wrapper uses explicit 48px height and tabsContainer fills height (height:100%) to keep tab items vertically centered (dees-appui-tabs). +- Add box-sizing: border-box to affected header/logo containers to prevent overflow and ensure correct sizing. +- Minor CSS alignment and overflow fixes to improve consistent layout and scrolling behavior across the app UI components. + +## 2025-12-08 - 3.0.0 - BREAKING CHANGE(dees-appui-secondarymenu) +Add SecondaryMenu component and replace Mainselector with new SecondaryMenu in AppUI + +- Add dees-appui-secondarymenu component: collapsible groups, badges, dynamic heading, context menu and legacy flat-options support +- Introduce interfaces ISecondaryMenuItem and ISecondaryMenuGroup under elements/interfaces +- Replace dees-appui-mainselector usage with dees-appui-secondarymenu in DeesAppuiBase (props/events updated: secondarymenuGroups, secondarymenuHeading, secondarymenuOptions, item-select / secondarymenu-item-select) +- Remove dees-appui-mainselector implementation and its index export; update group exports and imports to expose secondarymenu +- Update demos and pages to showcase the new SecondaryMenu and adjust import paths for grouped components +- Bump devDependency @git.zone/tswatch to ^2.3.1 + +## 2025-12-08 - 2.0.7 - fix(structure) +Add many new UI components, input controls, charts, editors, and demos + +- Introduce App UI components: dees-appui-appbar, dees-appui-mainmenu, dees-appui-mainselector, dees-appui-maincontent, dees-appui-activitylog, dees-appui-profiledropdown, dees-appui-tabs, dees-appui-base, dees-appui-view (templates, styles and demos included). +- Add a comprehensive set of input components: dees-input-text, dees-input-checkbox, dees-input-dropdown, dees-input-fileupload, dees-input-datepicker, dees-input-phone, dees-input-iban, dees-input-quantityselector, dees-input-list, dees-input-typelist, dees-input-tags, dees-input-multitoggle, dees-input-radiogroup, dees-input-richtext and supporting demos/styles/templates. +- Add form primitives and integration: dees-form and dees-form-submit with validation, collection and demo pages showcasing usage. +- Add button family and utilities: dees-button (with updated variants, sizes, status handling and demo), dees-button-group and dees-button-exit. +- Add charting components: dees-chart-area (ApexCharts integration) and dees-chart-log (log viewer) plus rich demo scenarios and realtime features. +- Add data display components: dees-dataview-codebox (highlight.js integration) and dees-dataview-statusobject with copy/context behaviours and demos. +- Add editor tooling: dees-editor (Monaco loader/version management), dees-editor-markdown and dees-editor-markdownoutlet; also TipTap-based richtext input with toolbar and link handling. +- Add global utilities and infra: dees-toast (programmatic toast API and containers), z-index registry and theme/font helpers (fonts, color tokens), plus many styles and accessibility/keyboard improvements across components. +- Export and index updates: new group exports added to ts_web/elements index and many index.ts files to expose the new components and demos. +- Extensive demos and showcase pages added (input-showcase, component demos) to illustrate integration, keyboard navigation, theming and form flows. + +## 2025-12-06 - 2.0.6 - fix(dees-input-richtext) +Initialize editor and link input element references in firstUpdated to ensure they exist before editor initialization. + +- Assign editorElement from shadowRoot.querySelector('.editor-content') in firstUpdated. +- Assign linkInputElement from shadowRoot.querySelector('.link-input input') in firstUpdated. +- Call initializeEditor() after DOM references are set to avoid undefined-element runtime errors. + +## 2025-12-06 - 2.0.5 - fix(build) +Bump devDependencies: update @git.zone/tsbundle and @git.zone/tswatch to patched versions + +- Update @git.zone/tsbundle from ^2.6.2 to ^2.6.3 +- Update @git.zone/tswatch from ^2.2.2 to ^2.2.3 + +## 2025-12-06 - 2.0.4 - fix(imports) +Normalize and fix relative import paths for web components to ensure correct module resolution + +- Replaced numerous './.js' imports with explicit '..//.js' paths across many elements and demos to fix module resolution. +- Updated imports for core shared components such as dees-icon, dees-panel, dees-contextmenu, dees-windowlayer, dees-windowcontrols and several app-ui components (appbar, maincontent, mainselector, activitylog, mobilenavigation, modal, pdf, profilepicture, statsgrid, etc.). +- No runtime behavior changes — this is a refactor to import paths to address build/bundling and resolution issues. + +## 2025-12-03 - 2.0.3 - fix(dependencies) +Bump dependencies and developer tooling versions + +- Upgrade lucide from ^0.553.0 to ^0.555.0 +- Bump @git.zone/tsbuild from ^3.1.0 to ^3.1.2 +- Bump @git.zone/tsbundle from ^2.5.2 to ^2.6.2 +- Bump @git.zone/tstest from ^2.8.1 to ^3.1.3 +- Bump @git.zone/tswatch from ^2.2.1 to ^2.2.2 +- Upgrade @types/node from ^22.0.0 to ^24.10.1 +- Patch release: increment package version to 2.0.3 + +## 2025-11-30 - 2.0.2 - fix(dees-stepper) +Make step validation abortable and cancel active step listeners when navigating + +- Extend IStep.validationFunc signature to accept an optional AbortSignal so validation handlers can be cancelled. +- Store an AbortController on the selected step and pass its signal into validationFunc when invoked. +- Abort the step's AbortController when navigating to the previous or next step to cancel any active listeners or async operations. + +## 2025-11-30 - 2.0.1 - fix(dees-stepper) +Improve dees-stepper visual style and transitions + +- Smooth animation: extend .step transition duration and use a cubic-bezier curve for smoother motion. +- Add .step.entrance class with a shorter easing for entrance animations to keep entrance timing distinct. +- Visual tweaks: reduce border-radius from 18px to 12px and increase inner content padding to 32px. +- Color and border updates: adjust background and border colors for light/dark themes to more consistent values. +- Shadow simplification: replace theme-dependent heavy shadows with a single subtle shadow (0 8px 32px rgba(0,0,0,0.4)). +- Remove selected-state border/box-shadow overrides (selection visuals simplified). +- Remove background-clip: padding-box to simplify rendering. + +## 2025-11-17 - 2.0.0 - BREAKING CHANGE(decorators) +Migrate to TC39 standard decorators (accessor) across components, update tsconfig and bump dependencies + +- Replaced experimental decorator-backed class fields with the TC39-compatible "accessor" form across ~69 web component files (properties and state fields) to follow Lit 3.x recommendations. +- Updated tsconfig.json to remove experimentalDecorators and useDefineForClassFields, aligning compiler settings with the standard decorators migration. +- Fixed optional/nullable fields to explicit `Type | undefined = undefined` where necessary to preserve runtime behavior and typing. +- Adjusted/remove usages of some non-reactive decorators/@query patterns to be compatible with the new decorator model (notable changes in a few components). +- Bumped several dependencies and devDependencies (examples: @design.estate/dees-domtools, @design.estate/dees-element, @design.estate/dees-wcctools, @git.zone/tsbuild, @git.zone/tstest, apexcharts, lucide). +- Added migration notes and testing summary to readme.hints.md documenting the TC39 decorators migration and verification steps. + +## 2025-10-23 - 1.12.6 - fix(dependencies) +Bump FontAwesome to ^7.1.0 and add local claude settings + +- Updated @fortawesome packages (@fortawesome/fontawesome-svg-core, @fortawesome/free-brands-svg-icons, @fortawesome/free-regular-svg-icons, @fortawesome/free-solid-svg-icons) to ^7.1.0 in package.json +- Added .claude/settings.local.json to configure local Claude/tooling permissions for repository operations + +## 2025-09-23 - 1.12.5 - fix(ci) +Add local permissions settings for development + +- Adds a new local settings file: .claude/settings.local.json +- Provides explicit permission entries for development tasks (allow running pnpm scripts, reading files, searching/replacing patterns, activating project, and helper tooling) +- Intended for local dev environment to enable tool automation without changing repository code + +## 2025-09-20 - 1.12.4 - fix(ci) +Add local assistant settings to enable permitted dev tooling commands + +- Add a local assistant settings file to configure allowed development tooling commands. +- Allows running pnpm scripts, file read/search/replace operations and other local project helper actions. +- Local configuration only — does not change library code or public API. + +## 2025-09-19 - 1.12.3 - fix(dees-input-fileupload) +Show selected files inside dropzone and improve file upload UX + +- Render the selected file list inside the dropzone container so files are displayed inline with the drop area +- Add dropzone--has-files class and styles to visually indicate when files are present +- Avoid opening the file selector when clicking on the browse button or inside the file list (prevents accidental re-opening) +- Refine file list and file-row styles (sizes, paddings, border radius, hover/background behavior and thumbnail/icon sizes) for a more compact and consistent appearance +- Simplify empty-state handling by returning an empty template when no files are present (file list is only rendered when files exist) + +## 2025-09-18 - 1.12.2 - fix(dees-input-wysiwyg) +Integrate output format preview into WYSIWYG demo; update plan and add local dev settings + +- Wire output format preview into the WYSIWYG demo (ts_web/elements/dees-input-wysiwyg.demo.ts) by calling setupOutputFormatDemo(editors.meeting, editors.recipe) so HTML/Markdown preview controls are initialized. +- Update readme.plan.md: mark the Output Formats review tasks as completed and document that preview controls were added. +- Add a local settings file to allow running local tooling tasks (grants permission for pnpm run scripts and related local commands). +- No library API or runtime component behavior changed — this is a demo/documentation and local-settings update. + +## 2025-09-18 - 1.12.1 - fix(ci) +Add local settings to allow running pnpm scripts and enable dev chat permission + +- Add a repository-local settings file granting permission to run pnpm scripts (Bash(pnpm run:*)) for development tooling. +- Enable the mcp__zen__chat permission for local dev workflows. + +## 2025-09-18 - 1.12.0 - feat(dees-stepper) +Revamp dees-stepper: modern styling, new steps and improved navigation/validation + +- Visual refresh for dees-stepper: updated card shapes, shadows, refined borders and stronger selected-state visuals for a modern shadcn-inspired look +- Improved transitions and animations (transform, box-shadow, filter) for smoother step selection and show/hide behavior +- Expanded default/demo steps: replaced small sample with a richer multi-step flow (Account Setup, Profile Details, Contact Information, Team Size, Goals, Brand Preferences, Integrations, Review & Launch) +- Enhanced step interactions: safer goNext/goBack handling with boundary checks and reset of validation flags to avoid stale validation state +- Better toolbar/controls placement for stepper demo (spacing, counters, accessible back control) and improved keyboard/UX affordances +- Minor documentation and meta updates: readme.plan.md extended with dees-stepper plan items and added .claude/settings.local.json + +## 2025-09-18 - 1.11.8 - fix(ci) +Add local tool permissions config to allow running pnpm scripts and enable mcp__zen__chat + +- Add local settings file to grant permission to run pnpm scripts (Bash(pnpm run:*)) +- Enable mcp__zen__chat permission in local tool settings + +## 2025-09-16 - 1.11.7 - fix(readme) +Expand README with comprehensive component documentation, examples and developer guide; add local Claude settings + +- Expanded README substantially: installation, component overview, detailed component docs, usage examples, demos and developer guidance +- Updated many example snippets and API usage examples (icons, inputs, editor, forms, overlays, charts, etc.) to be more explicit and consistent +- Added .claude/settings.local.json to configure local Claude permissions for repository tooling +- No runtime or library code changes — documentation and demo content only + +## 2025-09-16 - 1.11.6 - fix(dees-table) +Improve Lucene range comparisons, pin monaco-editor to 0.52.2, and add local dev metadata + +- Fix lucene inRange behavior to correctly compare homogeneous types (strings, numbers, dates) and fall back to string comparison when needed (ts_web/elements/dees-table/lucene.ts). +- Pin monaco-editor to 0.52.2 in package.json to avoid a breaking upgrade regression observed with ^0.53.0. +- Add local development/tooling metadata and conveniences: .claude/settings.local.json (tool permissions) and .serena/ memory files (done_checklist, project_overview, style_and_conventions, suggested_commands). +- Minor housekeeping: update project dev docs / memories to capture build/test/checklist guidance. + +## 2025-09-16 - 1.11.5 - fix(ci) +Add local Claude agent settings for CI tooling + +- Add .claude/settings.local.json to configure local Claude agent permissions +- Allow Bash commands matching pnpm run:* and the mcp__zen__chat permission for development tooling + +## 2025-09-10 - 1.11.4 - fix(readme) +Rewrite and expand README with Quick Start, feature highlights, demos and usage examples; add local Claude settings file + +- Completely rewritten and reorganized README: added Quick Start, component highlights, usage examples, demos, development workflow, troubleshooting and links. +- Added .claude/settings.local.json with local Claude permission configuration. + +## 2025-09-08 - 1.11.3 - fix(dees-input-list) +Prevent list animations from affecting scroll bounds and fix content-visibility issues in dees-input-list; add local developer settings + +- dees-input-list: add overflow:hidden to list items to prevent animations from altering scroll bounds and causing visual/scroll glitches +- dees-input-list: force content-visibility/contain to visible/none to avoid unexpected scrolling/layout issues when items animate +- Add .claude/settings.local.json with local developer permissions (allows running pnpm scripts via Claude-local tooling) + +## 2025-09-07 - 1.11.2 - fix(DeesFormSubmit) +Make form submit robust by locating nearest dees-form via closest(); add local CLAUDE settings + +- Fix: DeesFormSubmit.submit now walks up the DOM with closest('dees-form') to find and call gatherAndDispatch on the parent form. This fixes cases where the submit button is slotted or not a direct child of the form. +- Chore: Add .claude/settings.local.json to permit running pnpm scripts in the local CLAUDE environment (allows Bash(pnpm run:*)). + +## 2025-09-06 - 1.11.1 - fix(dees-input-text) +Normalize Lucide icon names for password toggle + +- Updated password visibility toggle icons in dees-input-text from 'lucide:eye'/'lucide:eye-off' to 'lucide:Eye'/'lucide:EyeOff' to match Lucide exports and avoid missing icon rendering. + +## 2025-09-05 - 1.11.0 - feat(dees-icon) +Add full icon list and improve dees-icon demo with copy-all functionality and UI tweaks + +- Added readme.icons.md containing 1900+ icon identifiers (FontAwesome + Lucide) for easy reference and tooling +- Enhanced ts_web/elements/dees-icon.demo.ts: added a 'Copy All Icon Names' button that copies prefixed icon names (fa:..., lucide:...) to the clipboard and shows temporary feedback +- Updated demo presentation: prefixed displayed icon names (fa: / lucide:), improved search-container spacing and added button styling for better UX +- Changes are documentation/demo only — no production runtime component logic changed + +## 2025-09-05 - 1.10.12 - fix(dees-simple-appdash) +Fix icon rendering in dees-simple-appdash to respect provided icon strings + +- dees-simple-appdash: stop forcing a 'lucide:' prefix when rendering view icons — use the icon string as provided. +- Prevents incorrect/missing icons when the iconName already includes a library prefix (e.g. 'fa:' or 'lucide:'). + +## 2025-09-05 - 1.10.11 - fix(dees-simple-appdash) +Bump deps and fix dees-simple-appdash icon binding and terminal sizing + +- Updated runtime dependencies: @design.estate/dees-element -> ^2.1.2, @design.estate/dees-wcctools -> ^1.1.1, @fortawesome/* -> ^7.0.1, apexcharts -> ^5.3.4, lucide -> ^0.542.0 (compatibility/security/stability updates) +- Updated dev tooling: @git.zone/tsbuild -> ^2.6.8, @git.zone/tstest -> ^2.3.6, @git.zone/tswatch -> ^2.2.1 +- Fix: dees-simple-appdash — use proper string interpolation for lucide icon properties (prevents incorrect icon rendering) +- Fix: dees-simple-appdash — enforce terminal maxWidth/maxHeight to avoid overflow and improve layout stability +- Cosmetic: small style/behavior tweaks to dees-simple-appdash (logout/terminal/wifi icon bindings corrected) + +## 2025-06-29 - 1.10.10 - improve(dees-dashboardgrid, dees-input-wysiwyg) +Enhanced dashboard grid component with advanced spacing and layout features inspired by gridstack.js + +Dashboard Grid improvements: +- Improved margin system supporting uniform or individual margins (top, right, bottom, left) +- Added collision detection to prevent widget overlap during drag operations +- Implemented auto-positioning for new widgets to find first available space +- Added compact() method to eliminate gaps and compress layout vertically or horizontally +- Enhanced resize constraints with minW, maxW, minH, maxH support +- Added optional grid lines visualization for better layout understanding +- Improved resize handles with better visibility and hover states +- Added RTL (right-to-left) layout support +- Implemented cellHeightUnit option supporting 'px', 'em', 'rem', or 'auto' (square cells) +- Added configurable animation with enableAnimation property +- Enhanced demo with interactive controls for testing all features +- Better calculation of widget positions accounting for margins between cells +- Added findAvailablePosition() for intelligent widget placement +- Improved drag and resize calculations for pixel-perfect positioning + +WYSIWYG editor drag and drop fixes: +- Fixed drop indicator positioning to properly account for block margins +- Added defensive checks in drag event handlers to prevent potential crashes +- Improved updateBlockPositions with null checks and error handling +- Updated drop indicator calculation to use simplified margin approach +- Fixed drop indicator height to match the exact space occupied by dragged blocks +- Improved drop indicator positioning algorithm to accurately show where blocks will land +- Simplified visual block position calculations accounting for CSS transforms +- Enhanced margin calculation to use correct values based on block type (16px for paragraphs, 24px for headings, 20px for code/quotes) +- Fixed index calculation issue when dragging blocks downward by adjusting target index for excluded dragged block + +## 2025-06-28 - 1.10.9 - feat(dees-dashboardgrid) +Add new dashboard grid component with drag-and-drop and resize capabilities + +- Created dees-dashboardgrid component for building flexible dashboard layouts +- Features drag-and-drop functionality for rearranging widgets +- Includes resize handles for adjusting widget dimensions +- Supports configurable grid properties (columns, cell height, gap) +- Provides widget locking and editable mode controls +- Styled with shadcn design principles +- No external dependencies - built with native browser APIs +- Emits events for widget movements and resizes +- Includes comprehensive demo with sample dashboard widgets + +## 2025-06-27 - 1.10.8 - feat(ui-components) +Update multiple components with shadcn-aligned styling and improved animations + +- Updated dees-modal with shadcn colors, borders, and subtle shadows +- Updated dees-chips with shadcn styling and fixed selection logic bug +- Updated dees-dataview-codebox with shadcn syntax highlighting colors and responsive label layout +- Updated dees-input-multitoggle with transparent blue indicator and smooth animations +- Updated dees-appui-tabs with animated sliding indicator for both horizontal and vertical layouts +- Fixed indicator positioning to be perfectly centered on tab content +- Indicator width is content width + 8px for minimal visual padding +- Fixed tab content centering by using consistent padding (12px → 16px on all sides) +- Fixed icon rendering by correcting property name from .iconName to .icon +- Added visual separators between tabs for better distinction +- Added subtle hover backgrounds for improved interactivity +- Refactored tabs component code for better maintainability and elegance +- Updated dees-appui-activitylog with shadcn-aligned styling: + - Updated background and text colors to match shadcn palette + - Enhanced topbar with better spacing and typography + - Improved activity entries with subtle hover states and better spacing + - Added activity type icons with color-coded backgrounds (login, logout, view, create, update) + - Added date separators ("Today", "Yesterday") for better temporal organization + - Enhanced streaming indicators with animated pulse effect + - Redesigned searchbox with modern input styling, search icon, and focus states + - Added custom scrollbar styling for consistency + - Updated timestamps to be more subtle with tabular number formatting + - Refined shadow effects for better visual hierarchy + - Added subtle box shadow to component for depth + - Added fade-in animation for new activity entries + - Improved user name highlighting with better typography + - Updated context menu with more relevant actions +- Improved overall spacing and visual consistency across components + +## 2025-06-27 - 1.10.1 - fix(modal) +Improve modal overscroll behavior by adding 'overscroll-behavior: contain' to content container + +- Added 'overscroll-behavior: contain' to .modal .content to ensure proper scroll containment +- Applied overscroll-behavior in modal container for enhanced responsiveness on mobile and desktop + +## 2025-06-26 - 1.10.0 - feat(dees-modal) +Add mobileFullscreen option to modals for full-screen mobile support + +- Introduced a new boolean property 'mobileFullscreen' in ts_web/elements/dees-modal.ts +- Updated modal CSS under the media query to apply 'mobile-fullscreen' class, allowing full viewport modals on mobile devices +- Extended modal style rules to include adjustments for margin, border-radius, and maximum heights on smaller screens + +## 2025-06-26 - 1.9.9 - fix(dees-input-multitoggle, dees-input-typelist) +Replace dynamic import with static import for demo functions in dees-input-multitoggle and dees-input-typelist + +- Converted `await import('./dees-input-multitoggle.demo.js')` to a direct static import. +- Converted `await import('./dees-input-typelist.demo.js')` to a direct static import to improve build performance and clarity. + +## 2025-06-26 - 1.9.8 - fix(deps, windowlayer) +Update dependency versions and adjust dees-windowlayer CSS to add pointer-events fix + +- Bump @design.estate/dees-wcctools from ^1.0.98 to ^1.0.101 +- Bump @tiptap packages from 2.22.3 to 2.23.0 +- Bump lucide from ^0.522.0 to ^0.523.0 +- Bump @git.zone/tsbundle from ^2.4.0 to ^2.5.1 and tswatch from ^2.0.37 to ^2.1.2 +- Add 'pointer-events: none' to dees-windowlayer CSS to improve overlay behavior + +## 2025-06-22 - 1.9.0 - feat(form-inputs) +Improve form input consistency and auto spacing across inputs and buttons + +- Add an 'insideForm' property to dees-button for auto-detection and proper margin adjustment in forms. +- Update dees-input-radio to include a 'name' property so that radio buttons in the same group are mutually exclusive. +- Enhance dees-form to group radio inputs properly when collecting form data. +- Revise readme.hints.md and readme.plan.md to document changes and provide guidance for dees-input-radio. +- Update demos for dees-button and dees-form to showcase correct spacing in vertical and horizontal layouts. + +## 2025-06-20 - 1.8.20 - fix(deps) +Update dependency versions: bump @design.estate/dees-domtools from ^2.1.1 to ^2.3.3, @design.estate/dees-element from ^2.0.42 to ^2.0.44, lucide from ^0.515.0 to ^0.518.0, and @git.zone/tsbundle from ^2.0.15 to ^2.4.0 + +- Upgrade @design.estate/dees-domtools from ^2.1.1 to ^2.3.3 +- Upgrade @design.estate/dees-element from ^2.0.42 to ^2.0.44 +- Upgrade lucide from ^0.515.0 to ^0.518.0 +- Upgrade @git.zone/tsbundle from ^2.0.15 to ^2.4.0 + +## 2025-06-10 - 1.8.1 - fix(dees-statsgrid) +Adjust stats grid styling for better alignment and improved visualizations in gauge and trend tiles. + +- Center-align tile header elements by setting align-items to center and ensuring full width. +- Increase tile content height to 90px and center its content. +- Update gauge visualization: reduce circle radius from 40 to 30, adjust stroke dasharray (from 251.2 to 188.5), and decrease gauge text font size. +- Refine trend chart layout: set trend-svg height to 40px, center trend value and adjust typography to larger, bolder text. +- Ensure overall grid responsiveness with adjusted gap and column sizing. + +## 2025-04-25 - 1.8.0 - feat(dees-pagination) +Add new pagination component to the library along with its demo and integration in the main export. + +- Introduced dees-pagination component with support for various page range scenarios. +- Created demo file to showcase pagination with both small and large sets of pages. +- Updated the module's index to export the new pagination component. + +## 2025-04-22 - 1.7.0 - feat(dees-searchbar) +Add dees-searchbar component with live search and filter demo + +- Introduces a new dees-searchbar element with an input field, a search button, and filters +- Wires up events for 'search-changed' and 'search-submit' to provide real‐time feedback +- Adds a demo file to showcase usage and logging of search events + +## 2025-04-22 - 1.6.0 - feat(documentation/dees-heading) +Add codex documentation overview and dees-heading component demo + +- Introduce contributor overview doc (`codex.md`, now consolidated into `readme.info.md`) to provide a high-level overview of project layout, component patterns, and build workflow +- Add and update dees-heading component with demo to support multiple heading levels and horizontal rule styles +- Update component export index to include dees-heading + +## 2025-04-18 - 1.5.6 - fix(dependencies) +Bump dependency versions and update demo code references + +- Upgrade @design.estate/dees-element from ^2.0.39 to ^2.0.41 +- Upgrade @tsclass/tsclass from ^4.4.0 to ^9.0.0 +- Upgrade lucide from ^0.488.0 to ^0.501.0 +- Update @types/node from ^22.10.7 to ^22.14.1 +- Update dees-icon demo: scope search to demo container and adjust hover scaling +- Replace resolveExec with directives.resolveExec in dees-table for proper rendering + +## 2025-04-12 - 1.5.5 - fix(catalog) +No code or documentation changes were detected. This commit records an empty update in commit information and confirms that the current state remains stable. + +- Verified that there are no modifications in source, documentation, or demos +- Commit metadata and build configuration remain unchanged + +## 2025-04-11 - 1.5.4 - fix(readme) +Update readme with company and trademark guidelines, clarifying legal usage without exposing licensing details. + +- Added sections detailing company information and trademark guidelines. +- Outlined legal disclaimers for trademark usage. + +## 2025-04-11 - 1.5.3 - fix(readme) +Update readme.md: remove redundant usage section and refine component documentation with improved examples. + +- Removed the standalone manual import and usage example for components. +- Added refined examples demonstrating both basic and option-based usage (e.g. for DeesButton). +- Improved markdown formatting and consistency across component documentation. + +## 2025-04-11 - 1.5.3 - fix(readme) +Update readme.md for clearer documentation: removed redundant 'Usage' section and refined component examples (e.g., DeesButton's basic and options usage) for improved clarity and consistency. + +- Removed standalone usage example showing manual import and creation of components +- Added refined examples demonstrating both basic and option-based usage of components +- Improved overall readme formatting and consistency across component documentation + +## 2025-04-11 - 1.5.2 - fix(ci) +Remove obsolete GitLab CI configuration file + +- Deleted .gitlab-ci.yml as the CI pipeline configuration is now managed elsewhere. +- Cleaned up CI stages for security, testing, release, and metadata. + +## 2025-04-11 - 1.5.1 - fix(readme) +Update readme with comprehensive reference documentation: add a usage snippet for components like DeesButton, introduce a detailed overview table of all component categories, and enhance documentation sections for each component group. + +- Added a code example showing how to import and use DeesButton. +- Introduced a components overview table that categorizes Core UI, Forms, Layout, Data Display, Visualization, Dialogs & Overlays, Navigation, and Development components. +- Expanded detailed documentation with usage examples for each component type. +- Reorganized content to improve clarity and ease of navigation for developers. + +## 2025-04-11 - 1.5.0 - feat(badge) +Add dees-badge component with demo file and update packageManager field in package.json + +- Introduce a new badge component allowing different types (default, primary, success, warning, error) with an optional rounded style +- Provide a demo for the badge component +- Export the badge component in the main elements index +- Update package.json to include an explicit packageManager field + +## 2025-01-20 - 1.4.1 - fix(dependencies) +Update dependency versions for smartpromise, webcontainer/api, tapbundle, and @types/node + +- Update @push.rocks/smartpromise to version ^4.2.0 +- Downgrade @webcontainer/api to version 1.2.0 +- Update @push.rocks/tapbundle to version ^5.5.6 +- Update @types/node to version ^22.10.7 + +## 2025-01-20 - 1.4.0 - feat(dees-terminal) +Enhanced the dees-terminal component to support environment variable settings and improved setup command execution. + +- Added environment property to pass custom environment variables. +- Introduced webcontainerDeferred to handle the promise for web container creation. +- Enhanced demo to illustrate environment variable usage. +- Improved async interaction with the terminal for setting environment variables and executing setup commands. + +## 2025-01-15 - 1.3.4 - fix(chart) +Fix chart rendering and appearance issues in the DeesChartArea component. + +- Resolved issues with chart dimensions calculation based on padding. +- Adjusted grid and axis lines appearance for better visibility. +- Updated tooltip and grid line styling for better accessibility. +- Improved series data representation as time-series for more accurate display. + +## 2024-12-17 - 1.3.3 - fix(dees-input-multitoggle) +Add missing TypeScript declaration for dees-input-multitoggle + +- Added a missing declaration to the HTMLElementTagNameMap for 'dees-input-multitoggle' element. + +## 2024-12-09 - 1.3.2 - fix(metadata) +Updated package metadata and readme for better project description and structure. + +- Updated package.json and npmextra.json with a detailed project description and list of keywords. +- Enhanced readme.md with installation instructions, component usage examples, and detailed component descriptions for clarity. + +## 2024-11-07 - 1.3.1 - fix(DeesSimpleAppDash) +Fix: add border to controlbar in DeesSimpleAppDash + +- Fixed the missing border at the top of the controlbar in DeesSimpleAppDash. + +## 2024-11-07 - 1.3.0 - feat(dees-simple-appdash) +Enhance responsive styling and terminal setup command + +- Added a new property `terminalSetupCommand` for configuring terminal setup commands. +- Improved responsive styling and positioning for components to achieve a fluid layout. +- Fixed layout shifts by switching positions to `absolute` for `appbar` and `appcontent`. + +## 2024-10-07 - 1.2.0 - feat(index.ts) +Add export for colors module in index.ts + +- The index.ts file now exports the colors module, making color utilities available for external use. + +## 2024-10-06 - 1.1.13 - fix(dees-button) +Fix styling issue in button component. + +- Moved the .button.disabled styling block to its correct position after the .button.highlighted block. + +## 2024-10-06 - 1.1.12 - fix(dees-button) +Fix reflect attribute for disabled property on dees-button component + +- Added reflect: true to the 'disabled' property ensuring changes reflect in the DOM attribute. + +## 2024-10-05 - 1.1.11 - fix(DeesStepper) +Adjusted CSS properties in DeesStepper component + +- Increased border-radius from 8px to 16px for step container elements +- Adjusted font-size and font-weight for the title in the step container to improve readability + +## 2024-10-04 - 1.1.10 - fix(dependencies) +Reverted @webcontainer/api version + +- Changed @webcontainer/api version from ^1.3.0 to 1.2.0 in package.json + +## 2024-10-04 - 1.1.9 - fix(dependencies) +Update various dependencies for compatibility and stability. + +- Update @design.estate/dees-domtools to version ^2.0.61 +- Update @design.estate/dees-element to version ^2.0.39 +- Update @webcontainer/api to version ^1.3.0 +- Update apexcharts to version ^3.54.0 +- Update monaco-editor to version ^0.52.0 +- Update pdfjs-dist to version ^4.6.82 +- Update @push.rocks/tapbundle to version ^5.3.0 +- Update @types/node to version ^22.7.4 + +## 2024-09-02 - 1.1.8 - fix(dees-simple-appdash) +Corrected viewTab active background color + +- Corrected the background color of the viewTab in active state for better visual consistency. + +## 2024-09-02 - 1.1.7 - fix(dependencies) +Update dependencies to their latest versions + +- Update dependency versions in package.json: +- - @design.estate/dees-element from ^2.0.34 to ^2.0.36 +- - @fortawesome/fontawesome-svg-core from ^6.5.2 to ^6.6.0 +- - @fortawesome/free-brands-svg-icons from ^6.5.2 to ^6.6.0 +- - @fortawesome/free-regular-svg-icons from ^6.5.2 to ^6.6.0 +- - @fortawesome/free-solid-svg-icons from ^6.5.2 to ^6.6.0 +- - @tsclass/tsclass from ^4.0.63 to ^4.1.2 +- - apexcharts from ^3.49.2 to ^3.53.0 +- - highlight.js from 11.9.0 to 11.10.0 +- - monaco-editor from ^0.50.0 to ^0.51.0 +- - pdfjs-dist from ^4.3.136 to ^4.5.136 +- - @git.zone/tsbuild from ^2.1.82 to ^2.1.84 +- - @push.rocks/tapbundle from ^5.0.23 to ^5.0.24 +- - @types/node from ^20.14.9 to ^22.5.2 + +## 2024-07-01 - 1.1.6 - fix(dees-dataview-codebox) +Corrected the font-family order for better font rendering. + +- Corrected the font-family order in dees-dataview-codebox.ts to ensure 'Intel One Mono' is prioritized over 'Geist Mono'. + +## 2024-07-01 - 1.1.5 - fix(dees-dataview-codebox) +Adjusted line number font weight in codebox + +- Changed the line number font weight from 400 to 200 in the codebox for better visual alignment. + +## 2024-07-01 - 1.1.4 - fix(UI) +Fixed font-family order for code and value elements + +- Updated font-family order in dees-dataview-codebox.ts +- Updated font-family order in dees-dataview-statusobject.ts + +## 2024-07-01 - 1.1.3 - fix(dees-dataview-codebox) +Adjusted codebox font weight and font family. + +- Changed font weight from 200 to 400 for better readability. +- Updated font-family to include 'Geist Mono' for uniform appearance. + +## 2024-06-30 - 1.1.2 - fix(elements) +Fix various UI components and improve styles + +- Updated styles for multiple components for better appearance in dark mode. +- Added missing event handling in `dees-input-fileupload` component. +- Implemented tooltip support in `dees-label` component. +- Fixed alignment issues in `dees-appui-*` components. +- Resolved various accessibility issues in form elements. + +## 2024-06-30 - 1.1.1 - fix(build) +Fix build script by updating source folders. + +- Updated build script to correctly reference 'tsfolders' folder. + +## 2024-06-30 - 1.1.0 - feat(project dependencies) +Updated various dependencies and internal fonts + +- Updated dependencies in package.json with the latest versions. +- Updated font-family references from 'Roboto' and 'Inter' to 'Geist Sans' across multiple components. + +## 2024-04-20 - 1.0.289 - Documentation Update +Updated the project documentation. + +## 2024-02-05 to 2024-02-13 - 1.0.277 to 1.0.288 - Core Fixes +Series of core updates and patches. + +## 2024-01-22 to 2024-02-05 - 1.0.257 to 1.0.276 - Core Fixes +More core updates and patches. + +## 2024-01-21 - 1.0.256 to 1.0.257 - Core Fixes +Minor bugfixes for core functionalities. + +## 2024-01-18 - 1.0.246 - Core Fixes +Bugfixes for core functionalities. + +## 2024-01-15 - 1.0.242 to 1.0.245 - Core Fixes +Various core bugfixes. + +## 2024-01-11 - 1.0.241 to 1.0.242 - Core Fixes +Bugfixes for core functionalities. + +## 2024-01-10 - 1.0.240 to 1.0.241 - Core Fixes +Minor core fixes and improvements. + +## 2024-01-09 - 1.0.239 to 1.0.240 - Core Fixes +Core updates and patches. + +## 2023-12-26 - 1.0.238 to 1.0.239 - Core Fixes +Updates to core functionalities. + +## 2023-12-20 - 1.0.236 to 1.0.238 - Core Fixes +Bugfixes and updates for core functionalities. + +## 2023-12-08 - 1.0.233 to 1.0.236 - Core Fixes +Multiple updates to core functionalities. + +## 2023-11-29 - 1.0.231 to 1.0.232 - Core Fixes +Minor core patches. + +## 2023-10-31 - 1.0.229 to 1.0.230 - Core Fixes +Various updates and fixes for core. + +## 2023-10-24 - 1.0.228 to 1.0.229 - Core Fixes +More core updates and patches. + +## 2023-10-23 - 1.0.226 to 1.0.228 - Core Fixes +Series of updates and fixes for core functionalities. + +## 2023-10-20 - 1.0.223 to 1.0.225 - Core Fixes +Minor updates and fixes for core. + +## 2023-10-18 - 1.0.222 to 1.0.223 - Core Fixes +Core patches and bugfixes. + +## 2023-10-17 - 1.0.221 to 1.0.222 - Core Fixes +Further updates to core functionalities. + +## 2023-10-12 - 1.0.220 to 1.0.221 - Core Fixes +Minor core updates. + +## 2023-10-11 - 1.0.219 to 1.0.220 - Core Fixes +Bugfixes and updates for core. + +## 2023-10-07 - 1.0.217 to 1.0.219 - Core Fixes +Series of core updates and patches. + +## 2023-10-05 - 1.0.216 to 1.0.217 - Core Fixes +Minor updates for core functionalities. + +## 2023-09-22 - 1.0.212 to 1.0.215 - Core Fixes +Various updates and fixes for core. + +## 2023-09-20 - 1.0.210 to 1.0.211 - Core Fixes +Series of core patches. + +## 2023-09-18 - 1.0.209 to 1.0.210 - Core Fixes +Bugfixes and improvements to core. + +## 2023-09-17 - 1.0.207 to 1.0.209 - Core Fixes +Minor updates and fixes. + +## 2023-09-15 - 1.0.203 to 1.0.206 - Core Fixes +Series of core improvements and fixes. + +## 2023-09-14 - 1.0.199 to 1.0.202 - Core Fixes +Patches for core functionalities. + +## 2023-09-13 - 1.0.194 to 1.0.198 - Core Fixes +Various bugfixes and updates for core. + +## 2023-09-12 - 1.0.190 to 1.0.193 - Core Fixes +Minor core patches. + +## 2023-09-09 - 1.0.188 to 1.0.189 - Core Fixes +Updates and bugfixes for core. + +## 2023-09-07 - 1.0.186 to 1.0.187 - Core Fixes +Core patches and improvements. + +## 2023-09-04 - 1.0.184 to 1.0.185 - Core Fixes +Series of updates and bugfixes for core. + +## 2023-09-01 - 1.0.180 to 1.0.183 - Core Fixes +Various core updates and fixes. + +## 2023-08-28 - 1.0.177 to 1.0.179 - Core Fixes +Minor bugfixes and updates. + +## 2023-08-26 - 1.0.176 to 1.0.177 - Core Fixes +Bugfixes for core functionalities. + +## 2023-08-20 - 1.0.173 to 1.0.175 - Core Fixes +Series of updates and fixes for core. + +## 2023-08-08 - 1.0.172 to 1.0.173 - Core Fixes +Minor core updates. + +## 2023-08-07 - 1.0.171 to 1.0.172 - Core Fixes +Various updates to core. + +## 2023-04-12 - 1.0.169 to 1.0.170 - Core Fixes +Bugfixes for core functionalities. + +## 2023-04-10 - 1.0.163 to 1.0.168 - Core Fixes +Series of core updates and patches. + +## 2023-04-07 - 1.0.160 to 1.0.162 - Core Fixes +Various updates for core functionalities. + +## 2023-04-06 - 1.0.155 to 1.0.159 - Core Fixes +Bugfixes and improvements to core. + +## 2023-03-27 - 1.0.150 to 1.0.154 - Core Fixes +Minor updates and patches for core functionalities. + +## 2023-03-09 - 1.0.149 to 1.0.150 - Core Fixes +Bugfixes for core functionalities. + +## 2023-01-17 - 1.0.146 to 1.0.148 - Core Fixes +Updates and fixes for core. + +## 2023-01-16 - 1.0.144 to 1.0.145 - Core Fixes +Series of updates and bugfixes for core. + +## 2023-01-13 - 1.0.134 to 1.0.143 - Core Fixes +Various core patches and improvements. + +## 2023-01-12 - 1.0.132 to 1.0.133 - Core Fixes +Minor fixes for core functionalities. + +## 2023-01-11 - 1.0.126 to 1.0.131 - Core Fixes +Series of updates and fixes for core. + +## 2023-01-09 - 1.0.122 to 1.0.123 - Core Fixes +Minor core patches and updates. + +## 2023-01-07 - 1.0.113 to 1.0.121 - Core Fixes +Updates and bugfixes for core functionalities. + +## 2023-01-03 - 1.0.107 to 1.0.110 - Core Fixes +Series of core updates and fixes. + +## 2022-12-12 - 1.0.105 to 1.0.106 - Core Fixes +Various core patches. + +## 2022-12-07 - 1.0.104 to 1.0.105 - Core Fixes +Bugfixes and improvements to core functionalities. + +## 2022-12-06 - 1.0.103 to 1.0.104 - Core Fixes +Series of updates and patches for core. + +## 2022-08-18 - 1.0.98 to 1.0.102 - Core Fixes +Updates and bugfixes for core functionalities. + +## 2022-07-14 - 1.0.93 to 1.0.94 - Core Fixes +Minor core updates. + +## 2022-06-26 - 1.0.92 to 1.0.93 - Core Fixes +Bugfixes for core functionalities. + +## 2022-06-10 - 1.0.91 to 1.0.92 - Core Fixes +Updates and patches for core. + +## 2022-05-30 - 1.0.90 to 1.0.91 - Core Fixes +Minor updates and bugfixes. + +## 2022-05-26 - 1.0.87 to 1.0.89 - Core Fixes +Series of core updates and patches. + +## 2022-05-24 to 2022-05-20 - 1.0.83 to 1.0.86 - Core Fixes +Various updates and bugfixes for core functionalities. + +## 2022-05-03 - 1.0.79 to 1.0.80 - Core Fixes +Updates and patches for core functionalities. + +## 2022-03-18 - 1.0.74 to 1.0.77 - Core Fixes +Bugfixes and updates for core functionalities. + +## 2022-01-24 - 1.0.73 to 1.0.74 - Core Fixes +Minor core patches. + +## 2021-12-10 - 1.0.71 to 1.0.72 - Core Fixes +Series of updates and fixes for core functionalities. + +## 2021-11-27 - 1.0.70 to 1.0.71 - Core Fixes +Bugfixes and improvements to core. + +## 2021-10-08 - 1.0.68 to 1.0.69 - Core Fixes +Various core updates and patches. + +## 2021-10-07 - 1.0.67 to 1.0.68 - Core Fixes +Minor updates and improvements for core. + +## 2021-09-15 - 1.0.64 to 1.0.66 - Core Fixes +Bugfixes and improvements to core functionalities. + +## 2021-09-14 - 1.0.61 to 1.0.62 - Core Fixes +Minor patches and updates for core. + +## 2021-09-10 - 1.0.57 to 1.0.60 - Core Fixes +Series of updates and fixes for core functionalities. + +## 2021-09-09 - 1.0.54 to 1.0.56 - Core Fixes +Various core updates and patches. + +## 2021-09-01 - 1.0.51 to 1.0.53 - Core Fixes +Minor updates for core functionalities. + +## 2021-08-29 - 1.0.49 to 1.0.50 - Core Fixes +Bugfixes and patches for core. + +## 2021-08-27 - 1.0.44 to 1.0.48 - Core Fixes +Series of updates and improvements for core functionalities. + +## 2021-08-26 - 1.0.42 to 1.0.43 - Core Fixes +Minor updates and bugfixes for core. + +## 2021-08-25 - 1.0.38 to 1.0.41 - Core Fixes +Extracted series of core updates and patches. + +## 2021-08-24 - 1.0.37 - Core Fix +Bugfixes for core functionalities. + +## 2021-08-20 - 1.0.34 to 1.0.36 - Core Fixes +Core functionalities updates and patches. + +## 2021-05-05 - 1.0.32 to 1.0.33 - Core Fixes +Series of core bugfixes. + +## 2021-03-06 - 1.0.29 to 1.0.31 - Core Fixes +Updates and improvements for core functionalities. + +## 2021-02-13 - 1.0.27 to 1.0.28 - Core Fixes +Bugfixes and patches for core functionalities. + +## 2020-12-10 - 1.0.25 to 1.0.26 - Core Fixes +Various core updates and improvements. + +## 2020-12-02 - 1.0.23 to 1.0.24 - Core Fixes +Minor updates for core functionalities. + +## 2020-12-01 - 1.0.21 to 1.0.22 - Core Fixes +Bugfixes and patches for core. + +## 2020-09-13 - 1.0.19 to 1.0.20 - Core Fixes +Updates and bugfixes for core functionalities. + +## 2020-05-11 - 1.0.17 to 1.0.18 - Core Fixes +Core functionalities updates. diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..5d13c30 --- /dev/null +++ b/html/index.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/html/index.ts b/html/index.ts new file mode 100644 index 0000000..7b1101a --- /dev/null +++ b/html/index.ts @@ -0,0 +1,10 @@ +// dees tools +import * as deesWccTools from '@design.estate/dees-wcctools'; +import * as deesDomTools from '@design.estate/dees-domtools'; + +// elements and pages +import * as elements from '../ts_web/elements/index.js'; +import * as pages from '../ts_web/pages/index.js'; + +deesWccTools.setupWccTools(elements as any, pages); +deesDomTools.elementBasic.setup(); diff --git a/license b/license new file mode 100644 index 0000000..81d7643 --- /dev/null +++ b/license @@ -0,0 +1,22 @@ +Copyright (c) 2020 Lossless GmbH (hello@lossless.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. You agree to being mentioned +as reference by Lossless GmbH. This includes the use of your entity logos +or profile picture by Lossless GmbH on websites and readme's, also on third party +pages like gitlab.com or github.com. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/npmextra.json b/npmextra.json new file mode 100644 index 0000000..fb69d1b --- /dev/null +++ b/npmextra.json @@ -0,0 +1,53 @@ +{ + "@git.zone/cli": { + "projectType": "wcc", + "module": { + "githost": "code.foss.global", + "gitscope": "design.estate", + "gitrepo": "dees-catalog", + "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.", + "npmPackagename": "@design.estate/dees-catalog", + "license": "MIT", + "projectDomain": "design.estate", + "keywords": [ + "Web Components", + "User Interface", + "UI Library", + "Component Library", + "JavaScript", + "TypeScript", + "Dynamic Components", + "Modular Architecture", + "Reusable Components", + "Web Development", + "Application UI", + "Custom Elements", + "Shadow DOM", + "UI Elements", + "Dashboard Interfaces", + "Form Handling", + "Data Display", + "Visualization", + "Charting", + "Interactive Components", + "Responsive Design", + "Web Applications", + "Modern Web", + "Frontend Development" + ] + }, + "release": { + "registries": [ + "https://verdaccio.lossless.digital", + "https://registry.npmjs.org" + ], + "accessLevel": "public" + } + }, + "@git.zone/tsdoc": { + "legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n" + }, + "@ship.zone/szci": { + "npmGlobalTools": [] + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..d240209 --- /dev/null +++ b/package.json @@ -0,0 +1,75 @@ +{ + "name": "@ecobridge.xyz/catalog", + "version": "3.33.0", + "private": false, + "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.", + "main": "dist_ts_web/index.js", + "typings": "dist_ts_web/index.d.ts", + "type": "module", + "scripts": { + "test": "tstest test/ --web --verbose --timeout 30 --logfile", + "build": "tsbuild tsfolders --allowimplicitany && tsbundle element --production --bundler esbuild", + "watch": "tswatch element", + "buildDocs": "tsdoc" + }, + "author": "Lossless GmbH", + "license": "MIT", + "dependencies": { + "@design.estate/dees-catalog": "^3.33.0", + "@design.estate/dees-domtools": "^2.3.7", + "@design.estate/dees-element": "^2.1.5", + "@push.rocks/smartpromise": "^4.2.3", + "@tsclass/tsclass": "^9.3.0" + }, + "devDependencies": { + "@design.estate/dees-wcctools": "^3.7.1", + "@git.zone/tsbuild": "^4.0.2", + "@git.zone/tsbundle": "^2.6.3", + "@git.zone/tstest": "^3.1.4", + "@git.zone/tswatch": "^2.3.13", + "@push.rocks/projectinfo": "^5.0.2", + "@types/node": "^25.0.3" + }, + "files": [ + "ts/**/*", + "ts_web/**/*", + "dist/**/*", + "dist_*/**/*", + "dist_ts/**/*", + "dist_ts_web/**/*", + "assets/**/*", + "cli.js", + "npmextra.json", + "readme.md" + ], + "browserslist": [ + "last 1 chrome versions" + ], + "keywords": [ + "Web Components", + "User Interface", + "UI Library", + "Component Library", + "JavaScript", + "TypeScript", + "Dynamic Components", + "Modular Architecture", + "Reusable Components", + "Web Development", + "Application UI", + "Custom Elements", + "Shadow DOM", + "UI Elements", + "Dashboard Interfaces", + "Form Handling", + "Data Display", + "Visualization", + "Charting", + "Interactive Components", + "Responsive Design", + "Web Applications", + "Modern Web", + "Frontend Development" + ], + "packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..0b6bf74 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,9241 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@design.estate/dees-catalog': + specifier: ^3.33.0 + version: 3.33.0(@tiptap/pm@2.27.1) + '@design.estate/dees-domtools': + specifier: ^2.3.7 + version: 2.3.7 + '@design.estate/dees-element': + specifier: ^2.1.5 + version: 2.1.5 + '@push.rocks/smartpromise': + specifier: ^4.2.3 + version: 4.2.3 + '@tsclass/tsclass': + specifier: ^9.3.0 + version: 9.3.0 + devDependencies: + '@design.estate/dees-wcctools': + specifier: ^3.7.1 + version: 3.7.1 + '@git.zone/tsbuild': + specifier: ^4.0.2 + version: 4.0.2 + '@git.zone/tsbundle': + specifier: ^2.6.3 + version: 2.6.3 + '@git.zone/tstest': + specifier: ^3.1.4 + version: 3.1.4(@push.rocks/smartserve@1.4.0)(socks@2.8.7)(typescript@5.9.3) + '@git.zone/tswatch': + specifier: ^2.3.13 + version: 2.3.13(@tiptap/pm@2.27.1) + '@push.rocks/projectinfo': + specifier: ^5.0.2 + version: 5.0.2 + '@types/node': + specifier: ^25.0.3 + version: 25.0.3 + +packages: + + '@api.global/typedrequest-interfaces@2.0.2': + resolution: {integrity: sha512-D+mkr4IiUZ/eUgrdp5jXjBKOW/iuMcl0z2ZLQsLLypKX/psFGD3viZJ58FNRa+/1OSM38JS5wFyoWl8oPEFLrw==} + + '@api.global/typedrequest-interfaces@3.0.19': + resolution: {integrity: sha512-uuHUXJeOy/inWSDrwD0Cwax2rovpxYllDhM2RWh+6mVpQuNmZ3uw6IVg6dA2G1rOe24Ebs+Y9SzEogo+jYN7vw==} + + '@api.global/typedrequest@3.2.5': + resolution: {integrity: sha512-LM/sUTuYnU5xY4gNZrN6ERMiKr+SpDZuSxJkAZz1YazC7ymGfo6uQ8sCnN8eNNQNFqIOkC+BtfYRayfbGwYLLg==} + + '@api.global/typedserver@3.0.80': + resolution: {integrity: sha512-dcp0oXsjBL+XdFg1wUUP08uJQid5bQ0Yv3V3Y3lnI2QCbat0FU+Tsb0TZRnZ4+P150Vj/ITBqJUgDzFsF34grA==} + + '@api.global/typedserver@7.11.1': + resolution: {integrity: sha512-1vQUJ2/DszDFHVkCmqqBy/qNiIP/jltFN3KxHtoNLxjbdBZYfw1Zd1Odjs6YSPalAD0p8wQ/alJblJEAewNQVg==} + + '@api.global/typedsocket@3.1.1': + resolution: {integrity: sha512-Wkz3NlhmfdZMKqXXI2c2dMtGGmSmhdOegZiziL+9b2mqPYdc7Gd8AZRdEOKvbSoIvc9G22/5BEadIWHrfq66TA==} + peerDependencies: + '@push.rocks/smartserve': '>=1.0.0' + peerDependenciesMeta: + '@push.rocks/smartserve': + optional: true + + '@api.global/typedsocket@4.1.0': + resolution: {integrity: sha512-ttmoU5BNHmLAkAF/o+Ta8F5O4F7CUmkFo6LK7NKHQvuYJvodPMYWdhJ6yCINTF4pfCgljkMDUqoVKobm6ea4mQ==} + peerDependencies: + '@push.rocks/smartserve': '>=1.1.0' + + '@aws-crypto/crc32@5.2.0': + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/crc32c@5.2.0': + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + + '@aws-crypto/sha1-browser@5.2.0': + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-s3@3.946.0': + resolution: {integrity: sha512-Y3ww3yd1wzmS2r3qgH3jg4MxCTdeNrae2J1BmdV+IW/2R2gFWJva5U5GbS6KUSUxanJBRG7gd8uOIi1b0EMOng==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.946.0': + resolution: {integrity: sha512-kGAs5iIVyUz4p6TX3pzG5q3cNxXnVpC4pwRC6DCSaSv9ozyPjc2d74FsK4fZ+J+ejtvCdJk72uiuQtWJc86Wuw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.946.0': + resolution: {integrity: sha512-u2BkbLLVbMFrEiXrko2+S6ih5sUZPlbVyRPtXOqMHlCyzr70sE8kIiD6ba223rQeIFPcYfW/wHc6k4ihW2xxVg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.946.0': + resolution: {integrity: sha512-P4l+K6wX1tf8LmWUvZofdQ+BgCNyk6Tb9u1H10npvqpuCD+dCM4pXIBq3PQcv/juUBOvLGGREo+Govuh3lfD0Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.946.0': + resolution: {integrity: sha512-/zeOJ6E7dGZQ/l2k7KytEoPJX0APIhwt0A79hPf/bUpMF4dDs2P6JmchDrotk0a0Y/MIdNF8sBQ/MEOPnBiYoQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.946.0': + resolution: {integrity: sha512-Pdgcra3RivWj/TuZmfFaHbqsvvgnSKO0CxlRUMMr0PgBiCnUhyl+zBktdNOeGsOPH2fUzQpYhcUjYUgVSdcSDQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-login@3.946.0': + resolution: {integrity: sha512-5iqLNc15u2Zx+7jOdQkIbP62N7n2031tw5hkmIG0DLnozhnk64osOh2CliiOE9x3c4P9Pf4frAwgyy9GzNTk2g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.946.0': + resolution: {integrity: sha512-I7URUqnBPng1a5y81OImxrwERysZqMBREG6svhhGeZgxmqcpAZ8z5ywILeQXdEOCuuES8phUp/ojzxFjPXp/eA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.946.0': + resolution: {integrity: sha512-GtGHX7OGqIeVQ3DlVm5RRF43Qmf3S1+PLJv9svrdvAhAdy2bUb044FdXXqrtSsIfpzTKlHgQUiRo5MWLd35Ntw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.946.0': + resolution: {integrity: sha512-LeGSSt2V5iwYey1ENGY75RmoDP3bA2iE/py8QBKW8EDA8hn74XBLkprhrK5iccOvU3UGWY8WrEKFAFGNjJOL9g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.946.0': + resolution: {integrity: sha512-ocBCvjWfkbjxElBI1QUxOnHldsNhoU0uOICFvuRDAZAoxvypJHN3m5BJkqb7gqorBbcv3LRgmBdEnWXOAvq+7Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-bucket-endpoint@3.936.0': + resolution: {integrity: sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-expect-continue@3.936.0': + resolution: {integrity: sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-flexible-checksums@3.946.0': + resolution: {integrity: sha512-HJA7RIWsnxcChyZ1hNF/3JICkYCqDonxoeG8FkrmLRBknZ8WVdJiPD420/UwrWaa5F2MuTDA92jxk77rI09h1w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.936.0': + resolution: {integrity: sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-location-constraint@3.936.0': + resolution: {integrity: sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.936.0': + resolution: {integrity: sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.936.0': + resolution: {integrity: sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.946.0': + resolution: {integrity: sha512-0UTFmFd8PX2k/jLu/DBmR+mmLQWAtUGHYps9Rjx3dcXNwaMLaa/39NoV3qn7Dwzfpqc6JZlZzBk+NDOCJIHW9g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-ssec@3.936.0': + resolution: {integrity: sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.946.0': + resolution: {integrity: sha512-7QcljCraeaWQNuqmOoAyZs8KpZcuhPiqdeeKoRd397jVGNRehLFsZbIMOvwaluUDFY11oMyXOkQEERe1Zo2fCw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.946.0': + resolution: {integrity: sha512-rjAtEguukeW8mlyEQMQI56vxFoyWlaNwowmz1p1rav948SUjtrzjHAp4TOQWhibb7AR7BUTHBCgIcyCRjBEf4g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.936.0': + resolution: {integrity: sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.946.0': + resolution: {integrity: sha512-61FZ685lKiJuQ06g6U7K3PL9EwKCxNm51wNlxyKV57nnl1GrLD0NC8O3/hDNkCQLNBArT9y3IXl2H7TtIxP8Jg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.946.0': + resolution: {integrity: sha512-a5c+rM6CUPX2ExmUZ3DlbLlS5rQr4tbdoGcgBsjnAHiYx8MuMNAI+8M7wfjF13i2yvUQj5WEIddvLpayfEZj9g==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.936.0': + resolution: {integrity: sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.936.0': + resolution: {integrity: sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.936.0': + resolution: {integrity: sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==} + + '@aws-sdk/util-user-agent-node@3.946.0': + resolution: {integrity: sha512-a2UwwvzbK5AxHKUBupfg4s7VnkqRAHjYsuezHnKCniczmT4HZfP1NnfwwvLKEH8qaTrwenxjKSfq4UWmWkvG+Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.930.0': + resolution: {integrity: sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.2.2': + resolution: {integrity: sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@borewit/text-codec@0.1.1': + resolution: {integrity: sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==} + + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + + '@cloudflare/workers-types@4.20251211.0': + resolution: {integrity: sha512-e87o6KbelCz7dnI5ngrGT2ca15vJZ+COb2eqJ52iDHmOaujyC6aYZ71e2vor8X6V9T6tcDElC5sAqPR93j09EA==} + + '@configvault.io/interfaces@1.0.17': + resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} + + '@design.estate/dees-catalog@3.33.0': + resolution: {integrity: sha512-dDtlJ/2IdUWRLqyCADCzFjDvptklQd5/2MskjqNSVfXjFm96qzyMIuMWCL+wLieIzgIB5xzXyTtaSBUZNCfd5g==} + + '@design.estate/dees-comms@1.0.30': + resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} + + '@design.estate/dees-domtools@2.3.7': + resolution: {integrity: sha512-MXoDBrP7JTOpni8b12aFXHJKnKBoQppM8cYBuL9cesRmCVGdB7p39XMRQ7dRyMhmmyr66L3cOczhiCV6febCwg==} + + '@design.estate/dees-element@2.1.5': + resolution: {integrity: sha512-czUOFvBiUKi34I+/keDRDc71fuORZS0NfbSuD2jJ4D1ODiTPjaZ6A6SkdQ2QqCEzVsx73XF99Pu8pxPnaOLnHg==} + + '@design.estate/dees-wcctools@3.7.1': + resolution: {integrity: sha512-BiNWghUoC05RTQOGVCTK+wis6d18LyLY+2p8vHC0q2OBw9hrPoY8k9EplpQgY40MvP0sTXWUwaa7VPXra8ASjA==} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.27.1': + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.1': + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.1': + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.1': + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.1': + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.1': + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.1': + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.1': + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.1': + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.1': + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.1': + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.1': + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.1': + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.1': + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fortawesome/fontawesome-common-types@7.1.0': + resolution: {integrity: sha512-l/BQM7fYntsCI//du+6sEnHOP6a74UixFyOYUyz2DLMXKx+6DEhfR3F2NYGE45XH1JJuIamacb4IZs9S0ZOWLA==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@7.1.0': + resolution: {integrity: sha512-fNxRUk1KhjSbnbuBxlWSnBLKLBNun52ZBTcs22H/xEEzM6Ap81ZFTQ4bZBxVQGQgVY0xugKGoRcCbaKjLQ3XZA==} + engines: {node: '>=6'} + + '@fortawesome/free-brands-svg-icons@7.1.0': + resolution: {integrity: sha512-9byUd9bgNfthsZAjBl6GxOu1VPHgBuRUP9juI7ZoM98h8xNPTCTagfwUFyYscdZq4Hr7gD1azMfM9s5tIWKZZA==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@7.1.0': + resolution: {integrity: sha512-0e2fdEyB4AR+e6kU4yxwA/MonnYcw/CsMEP9lH82ORFi9svA6/RhDyhxIv5mlJaldmaHLLYVTb+3iEr+PDSZuQ==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@7.1.0': + resolution: {integrity: sha512-Udu3K7SzAo9N013qt7qmm22/wo2hADdheXtBfxFTecp+ogsc0caQNRKEb7pkvvagUGOpG9wJC1ViH6WXs8oXIA==} + engines: {node: '>=6'} + + '@git.zone/tsbuild@4.0.2': + resolution: {integrity: sha512-LcRlFnDbcUe53Pdoob585iXq9TAT90TyEaYl/wml/etFoPeBX+oQLm6GryejUPXrUP7i1opyTonadkQN1OyXOA==} + hasBin: true + + '@git.zone/tsbundle@2.6.3': + resolution: {integrity: sha512-YD1qMYA/4eOuF57V0ccR+xo6ww1+QOYFA2K5gBPFBDNh9VdfvWxxDhOUybja8lT9PVMoli8PHG5WA5tKJkdXIQ==} + hasBin: true + + '@git.zone/tspublish@1.11.0': + resolution: {integrity: sha512-dkgaDBTzZJ53lAV72r7OW/W7l/KqpkncFuPojr11JO35OKAbjjDhZbAwPv4oGX9NplyXrhC5VJRPNX/orqNTHA==} + hasBin: true + + '@git.zone/tsrun@2.0.0': + resolution: {integrity: sha512-yA6zCjL+kn7xfZe6sL/m4K+zYqgkznG/pF6++i/E17iwzpG6dHmW+VZmYldHe86sW4DcLMvqM6CxM+KlgaEpKw==} + hasBin: true + + '@git.zone/tstest@3.1.4': + resolution: {integrity: sha512-S7kubbb0yLYOh/QAzFsjG6a20lZiyNKo4pt0yK1yvd9I7X8Rw6/mCT/BicLkan7G7Nk7scUfxaK9+aFsHmdQdw==} + hasBin: true + + '@git.zone/tswatch@2.3.13': + resolution: {integrity: sha512-43995OlWl8UzCA+cX3ehYba/ksm6CqHbMljHKjosrDRpx8EU+LY4bWTc8JT/Ldgwsw3iW9vur2bBqpgMmdeJJw==} + hasBin: true + + '@happy-dom/global-registrator@15.11.7': + resolution: {integrity: sha512-mfOoUlIw8VBiJYPrl5RZfMzkXC/z7gbSpi2ecycrj/gRWLq2CMV+Q+0G+JPjeOmuNFgg0skEIzkVFzVYFP6URw==} + engines: {node: '>=18.0.0'} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@lit-labs/ssr-dom-shim@1.5.0': + resolution: {integrity: sha512-HLomZXMmrCFHSRKESF5vklAKsDY7/fsT/ZhqCu3V0UoW/Qbv8wxmO4W9bx4KnCCF2Zak4yuk+AGraK/bPmI4kA==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + + '@mixmark-io/domino@2.2.0': + resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} + + '@module-federation/error-codes@0.21.6': + resolution: {integrity: sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==} + + '@module-federation/runtime-core@0.21.6': + resolution: {integrity: sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==} + + '@module-federation/runtime-tools@0.21.6': + resolution: {integrity: sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==} + + '@module-federation/runtime@0.21.6': + resolution: {integrity: sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==} + + '@module-federation/sdk@0.21.6': + resolution: {integrity: sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==} + + '@module-federation/webpack-bundler-runtime@0.21.6': + resolution: {integrity: sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ==} + + '@mongodb-js/saslprep@1.3.2': + resolution: {integrity: sha512-QgA5AySqB27cGTXBFmnpifAi7HxoGUeezwo6p9dI03MuDB6Pp33zgclqVb6oVK3j6I9Vesg0+oojW2XxB59SGg==} + + '@napi-rs/canvas-android-arm64@0.1.84': + resolution: {integrity: sha512-pdvuqvj3qtwVryqgpAGornJLV6Ezpk39V6wT4JCnRVGy8I3Tk1au8qOalFGrx/r0Ig87hWslysPpHBxVpBMIww==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.84': + resolution: {integrity: sha512-A8IND3Hnv0R6abc6qCcCaOCujTLMmGxtucMTZ5vbQUrEN/scxi378MyTLtyWg+MRr6bwQJ6v/orqMS9datIcww==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.84': + resolution: {integrity: sha512-AUW45lJhYWwnA74LaNeqhvqYKK/2hNnBBBl03KRdqeCD4tKneUSrxUqIv8d22CBweOvrAASyKN3W87WO2zEr/A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.84': + resolution: {integrity: sha512-8zs5ZqOrdgs4FioTxSBrkl/wHZB56bJNBqaIsfPL4ZkEQCinOkrFF7xIcXiHiKp93J3wUtbIzeVrhTIaWwqk+A==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.84': + resolution: {integrity: sha512-i204vtowOglJUpbAFWU5mqsJgH0lVpNk/Ml4mQtB4Lndd86oF+Otr6Mr5KQnZHqYGhlSIKiU2SYnUbhO28zGQA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.84': + resolution: {integrity: sha512-VyZq0EEw+OILnWk7G3ZgLLPaz1ERaPP++jLjeyLMbFOF+Tr4zHzWKiKDsEV/cT7btLPZbVoR3VX+T9/QubnURQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.84': + resolution: {integrity: sha512-PSMTh8DiThvLRsbtc/a065I/ceZk17EXAATv9uNvHgkgo7wdEfTh2C3aveNkBMGByVO3tvnvD5v/YFtZL07cIg==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.84': + resolution: {integrity: sha512-N1GY3noO1oqgEo3rYQIwY44kfM11vA0lDbN0orTOHfCSUZTUyiYCY0nZ197QMahZBm1aR/vYgsWpV74MMMDuNA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.84': + resolution: {integrity: sha512-vUZmua6ADqTWyHyei81aXIt9wp0yjeNwTH0KdhdeoBb6azHmFR8uKTukZMXfLCC3bnsW0t4lW7K78KNMknmtjg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-x64-msvc@0.1.84': + resolution: {integrity: sha512-YSs8ncurc1xzegUMNnQUTYrdrAuaXdPMOa+iYYyAxydOtg0ppV386hyYMsy00Yip1NlTgLCseRG4sHSnjQx6og==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.84': + resolution: {integrity: sha512-88FTNFs4uuiFKP0tUrPsEXhpe9dg7za9ILZJE08pGdUveMIDeana1zwfVkqRHJDPJFAmGY3dXmJ99dzsy57YnA==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@napi-rs/wasm-runtime@1.1.0': + resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} + + '@oxc-project/types@0.99.0': + resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} + + '@pdf-lib/standard-fonts@1.0.0': + resolution: {integrity: sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==} + + '@pdf-lib/upng@1.0.1': + resolution: {integrity: sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==} + + '@peculiar/asn1-cms@2.6.0': + resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==} + + '@peculiar/asn1-csr@2.6.0': + resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==} + + '@peculiar/asn1-ecc@2.6.0': + resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==} + + '@peculiar/asn1-pfx@2.6.0': + resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==} + + '@peculiar/asn1-pkcs8@2.6.0': + resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==} + + '@peculiar/asn1-pkcs9@2.6.0': + resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==} + + '@peculiar/asn1-rsa@2.6.0': + resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==} + + '@peculiar/asn1-schema@2.6.0': + resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + + '@peculiar/asn1-x509-attr@2.6.0': + resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==} + + '@peculiar/asn1-x509@2.6.0': + resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==} + + '@peculiar/x509@1.14.2': + resolution: {integrity: sha512-r2w1Hg6pODDs0zfAKHkSS5HLkOLSeburtcgwvlLLWWCixw+MmW3U6kD5ddyvc2Y2YdbGuVwCF2S2ASoU1cFAag==} + engines: {node: '>=22.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + + '@puppeteer/browsers@2.11.0': + resolution: {integrity: sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==} + engines: {node: '>=18'} + hasBin: true + + '@push.rocks/consolecolor@2.0.3': + resolution: {integrity: sha512-hA+m0BMqEwZNSAS7c2aQFfoPkpX/dNdsHzkdLdeERUOy7BLacb9ItTUofGtjtginP0yDj4NSpqSjNYyX3Y8Y/w==} + + '@push.rocks/early@4.0.4': + resolution: {integrity: sha512-ak6/vqZ1PlFV08fSFQ6UwiBrr+K6IsfieZWWzT7eex1Ls6GvWEi8wZ3REFDPJq/qckNLWSgEy0EsqzRtltkaCA==} + + '@push.rocks/isohash@2.0.1': + resolution: {integrity: sha512-UulhEui8O9Ei9fSqTldsB73TUmAFNqEBk82tHsJSLLpNK9gJZQE82iaSNsQUakoUQ2c9KueueMfwC3IoDaYRrQ==} + + '@push.rocks/isounique@1.0.5': + resolution: {integrity: sha512-Z0BVqZZOCif1THTbIKWMgg0wxCzt9CyBtBBqQJiZ+jJ0KlQFrQHNHrPt81/LXe/L4x0cxWsn0bpL6W5DNSvNLw==} + + '@push.rocks/levelcache@3.2.0': + resolution: {integrity: sha512-Ch0Oguta2I0SVi704kHghhBcgfyfS92ua1elRu9d8X1/9LMRYuqvvBAnyXyFxQzI3S8q8QC6EkRdd8CAAYSzRg==} + + '@push.rocks/lik@6.2.2': + resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} + + '@push.rocks/mongodump@1.1.0': + resolution: {integrity: sha512-kW0ZUGyf1e4nwloVwBQjNId+MzgTcNS834C+RxH21i1NqyOubbpWZtJtPP+K+s35nSJRyCTy3ICfBMdDBTAm2w==} + + '@push.rocks/npmextra@5.3.3': + resolution: {integrity: sha512-snLpSHwaQ5OXlZzF1KX/FY71W5LwajjBzor82Vue0smjEPnSeUPY5/JcVdMwtdprdJe13pc/EQQuIiL/zw4/yg==} + + '@push.rocks/projectinfo@5.0.2': + resolution: {integrity: sha512-zzieCal6jwR++o+fDl8gMpWkNV2cGEsbT96vCNZu/H9kr0iqRmapOiA4DFadkhOnhlDqvRr6TPaXESu2YUbI8Q==} + + '@push.rocks/qenv@6.1.3': + resolution: {integrity: sha512-+z2hsAU/7CIgpYLFqvda8cn9rUBMHqLdQLjsFfRn5jPoD7dJ5rFlpkbhfM4Ws8mHMniwWaxGKo+q/YBhtzRBLg==} + + '@push.rocks/smartarchive@4.2.4': + resolution: {integrity: sha512-uiqVAXPxmr8G5rv3uZvZFMOCt8l7cZC3nzvsy4YQqKf/VkPhKIEX+b7LkAeNlxPSYUiBQUkNRoawg9+5BaMcHg==} + + '@push.rocks/smartbrowser@2.0.8': + resolution: {integrity: sha512-0KWRZj3TuKo/sNwgPbiSE6WL+TMeR19t1JmXBZWh9n8iA2mpc4HhMrQAndEUdRCkx5ofSaHWojIRVFzGChj0Dg==} + + '@push.rocks/smartbucket@3.3.10': + resolution: {integrity: sha512-0H2MioALspC8Aj0Q1FPCs2w4k2u9oJg7Q5yM8+1TZo7aRfrdxgM5HQ7z3apUaqC3ZEDewW6vSlttjHFHhMEC3A==} + + '@push.rocks/smartbucket@4.3.0': + resolution: {integrity: sha512-4nstzEduCKou4R5ekKH6kUjDZXWfrtjA1hIQ4MJmTbtncmm2+4+ixjaFThS2nS8Aa+fHcBgOtKkBv8wTsgvK/Q==} + + '@push.rocks/smartbuffer@3.0.5': + resolution: {integrity: sha512-pWYF08Mn8s/KF/9nHRk7pZPzuMjmYVQay2c5gGexdayxn1W4eCSYYhWH73vR2JBfGeGq/izbRNuUuEaIEeTIKA==} + + '@push.rocks/smartcache@1.0.18': + resolution: {integrity: sha512-3+cmLu9chbnmi4yD4kjlFP/Tn4NReaZIoicEcGTtwbcokTrSDMs3YPdJzIpDZkAs83PW7OcVSHa3Ak5KU5OWzA==} + + '@push.rocks/smartchok@1.2.0': + resolution: {integrity: sha512-I5fR++k6nR1wiMQUwcTYzO0g8FwD6gN+3HwfIzpQlolrM91i6Q5TaoMlt3aysbvKCSNvkL3FlJLOfUHNGWoWkA==} + deprecated: This package has been renamed. Please use @push.rocks/smartwatch instead. + + '@push.rocks/smartcli@4.0.19': + resolution: {integrity: sha512-s1jZSgDZWi/az26AY4TJ2HPuG1qZzGC5R9fKWaECLmwnSpk6y9JXL5dnJAUohcdu50kdXCWEcRmLfYxOt81vEA==} + + '@push.rocks/smartclickhouse@2.0.17': + resolution: {integrity: sha512-IYO8Obor/Ruam2KQ2B/+5uQ+rL0exU5KZoSgOc3jkkrfjn+zZenN2xoV8lVqavAtxZVfG7MfxFrcv6I7I9ZMmA==} + + '@push.rocks/smartcrypto@2.0.4': + resolution: {integrity: sha512-1+/5bsjyataf5uUkUNnnVXGRAt+gHVk1KDzozjTqgqJxHvQk1d9fVDohL6CxUhUucTPtu5VR5xNBiV8YCDuGyw==} + + '@push.rocks/smartdata@5.16.7': + resolution: {integrity: sha512-bu/YSIjQcwxWXkAsuhqE6zs7eT+bTIKV8+/H7TbbjpzeioLCyB3dZ/41cLZk37c/EYt4d4GHgZ0ww80OiKOUMg==} + + '@push.rocks/smartdelay@3.0.5': + resolution: {integrity: sha512-mUuI7kj2f7ztjpic96FvRIlf2RsKBa5arw81AHNsndbxO6asRcxuWL8dTVxouEIK8YsBUlj0AsrCkHhMbLQdHw==} + + '@push.rocks/smartdns@7.6.1': + resolution: {integrity: sha512-nnP5+A2GOt0WsHrYhtKERmjdEHUchc+QbCCBEqlyeQTn+mNfx2WZvKVI1DFRJt8lamvzxP6Hr/BSe3WHdh4Snw==} + + '@push.rocks/smartenv@5.0.13': + resolution: {integrity: sha512-ACXmUcHZHl2CF2jnVuRw9saRRrZvJblCRs2d+K5aLR1DfkYFX3eA21kcMlKeLisI3aGNbIj9vz/rowN5qkRkfA==} + + '@push.rocks/smartenv@6.0.0': + resolution: {integrity: sha512-ktW5MqOFs0492sB4vrvl4lgRFQ/sQ4AyREgB+sCIzGqszHWGVvGXR95Y2a3z66jkLPYML2CUWHzmMlfv8fkG+A==} + + '@push.rocks/smarterror@2.0.1': + resolution: {integrity: sha512-iCcH1D8tlDJgMFsaJ6lhdOTKhbU0KoprNv9MRP9o7691QOx4JEDXiHtr/lNtxVo8BUtdb9CF6kazaknO9KuORA==} + + '@push.rocks/smartexit@1.0.23': + resolution: {integrity: sha512-WmwKYcwbHBByoABhHHB+PAjr5475AtD/xBh1mDcqPrFsOOUOZq3BBUdpq25wI3ccu/SZB5IwaimiVzadls6HkA==} + + '@push.rocks/smartexit@1.1.0': + resolution: {integrity: sha512-GD8VLIbxQuwvhPXwK4eH162XAYSj+M3wGKWGNO3i1iY4bj8P3BARcgsWx6/ntN3aCo5ygWtrevrfD5iecYY2Ng==} + + '@push.rocks/smartexpect@2.5.0': + resolution: {integrity: sha512-yoyuCoQ3tTiAriuvF+/09fNbVfFnacudL2SwHSzPhX/ugaE7VTSWXQ9A34eKOWvil0MPyDcOY36fVZDxvrPd8A==} + + '@push.rocks/smartfeed@1.4.0': + resolution: {integrity: sha512-bvj/3cGQI6TbbjbqrgC1uufcqprd/VthefuIsS8KHiHyCqYD5Z6RTjrbQY9WOCsmub/dcuMavfXQZqe9g2+OrQ==} + + '@push.rocks/smartfile-interfaces@1.0.7': + resolution: {integrity: sha512-MeOl/200UOvSO4Pgq/DVFiBVZpL9gjOBQM+4XYNjSxda8c6VBvchHAntaFLQUlO8U1ckNaP9i+nMO4O4/0ymyw==} + + '@push.rocks/smartfile@10.0.41': + resolution: {integrity: sha512-xOOy0duI34M2qrJZggpk51EHGXmg9+mBL1Q55tNiQKXzfx89P3coY1EAZG8tvmep3qB712QEKe7T+u04t42Kjg==} + + '@push.rocks/smartfile@11.2.7': + resolution: {integrity: sha512-8Yp7/sAgPpWJBHohV92ogHWKzRomI5MEbSG6b5W2n18tqwfAmjMed0rQvsvGrSBlnEWCKgoOrYIIZbLO61+J0Q==} + + '@push.rocks/smartfile@13.1.0': + resolution: {integrity: sha512-bSjH9vHl6l1nbe/gcSi4PcutFcTHUCVkMuQGGTVtn1cOgCuOXIHV04uhOXrZoKvlcSxxoiq8THolFt65lqn7cg==} + + '@push.rocks/smartfile@13.1.2': + resolution: {integrity: sha512-DaEhwmnGEpX4coeeToaw4cZe3pNBhH7CY1iGr+d3pIXihozREvzzAR9/0i2r7bUXXL5+Lgy8YYIk5ZS+fwxMKA==} + + '@push.rocks/smartfs@1.2.0': + resolution: {integrity: sha512-1R47jJZwX869z7DYgKeAZKTU1SbGnM7W/ZmgsI7AkQQhiascNqY3/gF4V5kIprmuf1WhpRbCbZyum8s7J1LDdg==} + + '@push.rocks/smartfs@1.3.1': + resolution: {integrity: sha512-ZSduVS8tM+/erbyCTvRRvc9gLWwbpqN5xdIIkMr+gub7fowSeJb7tR2rnGwySa63DyimU0q2KTp79VV9YqGLeg==} + + '@push.rocks/smartguard@3.1.0': + resolution: {integrity: sha512-J23q84f1O+TwFGmd4lrO9XLHUh2DaLXo9PN/9VmTWYzTkQDv5JehmifXVI0esophXcCIfbdIu6hbt7/aHlDF4A==} + + '@push.rocks/smarthash@3.2.6': + resolution: {integrity: sha512-Mq/WNX0Tjjes3X1gHd/ZBwOOKSrAG/Z3Xoc0OcCm3P20WKpniihkMpsnlE7wGjvpHLi/ZRe/XkB3KC3d5r9X4g==} + + '@push.rocks/smarti18n@1.0.4': + resolution: {integrity: sha512-bHIi9Iuzp2cbux9q79ZK5jOQYPsYJ9zDDS4p/xEPQH31gr0mcFRosLSQb1kvDQDVmUhI0ADlQMqr2ui9zEXQHA==} + + '@push.rocks/smartjson@5.2.0': + resolution: {integrity: sha512-710e8UwovRfPgUtaBHcd6unaODUjV5fjxtGcGCqtaTcmvOV6VpasdVfT66xMDzQmWH2E9ZfHDJeso9HdDQzNQA==} + + '@push.rocks/smartlog-destination-devtools@1.0.12': + resolution: {integrity: sha512-zvsIkrqByc0JRaBgIyhh+PSz2SY/e/bmhZdUcr/OW6pudgAcqe2sso68EzrKux0w9OMl1P9ZnzF3FpCZPFWD/A==} + + '@push.rocks/smartlog-destination-local@9.0.2': + resolution: {integrity: sha512-htzIY+4+hU61Z2J4Oz+IHnAB3RGe+fpS0VKCKnAoppZqzMWnJ3UOgYIyr4djDBy2WtgpXV/16KdisKrOmwuuvw==} + + '@push.rocks/smartlog-interfaces@3.0.2': + resolution: {integrity: sha512-8hGRTJehbsFSJxLhCQkA018mZtXVPxPTblbg9VaE/EqISRzUw+eosJ2EJV7M4Qu0eiTJZjnWnNLn8CkD77ziWw==} + + '@push.rocks/smartlog@3.1.10': + resolution: {integrity: sha512-5pf5JyzOE2WTCUislNIW4EHePo1a7hiXB+jbil38+N5hW71AEwcPFe6oGxbp5w9ALlz66hV2+E+25R0SsxN+fQ==} + + '@push.rocks/smartmanifest@2.0.2': + resolution: {integrity: sha512-QGc5C9vunjfUbYsPGz5bynV/mVmPHkrQDkWp8ZO8VJtK1GZe+njgbrNyxn2SUHR0IhSAbSXl1j4JvBqYf5eTVg==} + + '@push.rocks/smartmarkdown@3.0.3': + resolution: {integrity: sha512-9KhKZxDQKPk4P/2CYdVqJa5dpGfTA8w1cxqoVZL3e8RPA7EGxbdYEqMp0n2d9mth0btk/m0KHHV+G09LfCVeBw==} + + '@push.rocks/smartmatch@2.0.0': + resolution: {integrity: sha512-MBzP++1yNIBeox71X6VxpIgZ8m4bXnJpZJ4nWVH6IWpmO38MXTu4X0QF8tQnyT4LFcwvc9iiWaD15cstHa7Mmw==} + + '@push.rocks/smartmime@1.0.6': + resolution: {integrity: sha512-PHd+I4UcsnOATNg8wjDsSAmmJ4CwQFrQCNzd0HSJMs4ZpiK3Ya91almd6GLpDPU370U4HFh4FaPF4eEAI6vkJQ==} + + '@push.rocks/smartmime@2.0.4': + resolution: {integrity: sha512-mG6lRBLr5nF+GLZmgCcdjhdDsmTtJWBFZDCa1eJ8Au9TvUzbPW0fY5aqJBb3UwfyZzH6St8Th9cJSXjagOQkYA==} + + '@push.rocks/smartmongo@2.0.14': + resolution: {integrity: sha512-fvfPeCDDy5JaDBpVnsMKednsOoRzuYC0OszO8OoLOX/RaR755zIbRppCCK8Cez0hqd6eNkJGQeWdX/vXlJOPBA==} + + '@push.rocks/smartnetwork@4.4.0': + resolution: {integrity: sha512-OvFtz41cvQ7lcXwaIOhghNUUlNoMxvwKDctbDvMyuZyEH08SpLjhyv2FuKbKL/mgwA/WxakTbohoC8SW7t+kiw==} + + '@push.rocks/smartnpm@2.0.6': + resolution: {integrity: sha512-7anKDOjX6gXWs1IAc+YWz9ZZ8gDsTwaLh+CxRnGHjAawOmK788NrrgVCg2Fb3qojrPnoxecc46F8Ivp1BT7Izw==} + + '@push.rocks/smartntml@2.0.8': + resolution: {integrity: sha512-LIYeOQbmav2m2kZQz4pGS74xvWAm4YAGQnbPkofA2oas4RW9SGR1JTRpFd9pxGCOXd6djYdNGsZZ/xz+k/vRPQ==} + + '@push.rocks/smartobject@1.0.12': + resolution: {integrity: sha512-xSMiqXiZXXUOixT3QIPsOUKOWjL3YA/1h9/YTiCzqs5C0D3tyfTbojnfcp6YbKZoBzans2I5LghaDHsGid2DKQ==} + + '@push.rocks/smartopen@2.0.0': + resolution: {integrity: sha512-eVT0GhtQ2drb95j/kktYst/Toh1zCwCqjTJFYtaYFUnnBnBUajPtBZDFnPQo01DN8JxoeCTo8jggq+PCvzcfww==} + + '@push.rocks/smartpath@5.1.0': + resolution: {integrity: sha512-pJ4UGATHV/C6Dw5DU0D3MJaPMASlKAgeS+Hl9dkhD2ceYArn86Ky3Z/g7LNj40Oz6cUe77/AP1chztmJZISrpw==} + + '@push.rocks/smartpath@6.0.0': + resolution: {integrity: sha512-r94u1MbBaIOSy+517PZp2P7SuZPSe9LkwJ8l3dXQKHeIOri/zDxk/RQPiFM+j4N9301ztkRyhvRj7xgUDroOsg==} + + '@push.rocks/smartpdf@3.3.0': + resolution: {integrity: sha512-k4mBZAIl/TVBHDYQXaBZAgC8DdmHXsIZ3hRrLY3ysLr143YJ1VkwqQ2poqWh3A2SZQDrVfpKRYliUtjFRFrYVw==} + + '@push.rocks/smartping@1.0.8': + resolution: {integrity: sha512-Fvx1Db6hSsDOI6pdiCuS9GjtOX8ugx865YQrPg5vK2iw6Qj/srwyXcWLFYt+19WVKtvtWDJIAKbW+q3bXFsCeA==} + + '@push.rocks/smartpromise@4.2.3': + resolution: {integrity: sha512-Ycg/TJR+tMt+S3wSFurOpEoW6nXv12QBtKXgBcjMZ4RsdO28geN46U09osPn9N9WuwQy1PkmTV5J/V4F9U8qEw==} + + '@push.rocks/smartpuppeteer@2.0.5': + resolution: {integrity: sha512-yK/qSeWVHIGWRp3c8S5tfdGP6WCKllZC4DR8d8CQlEjszOSBmHtlTdyyqOMBZ/BA4kd+eU5f3A1r4K2tGYty1g==} + + '@push.rocks/smartrequest@2.1.0': + resolution: {integrity: sha512-3eHLTRInHA+u+W98TqJwgTES7rRimBAsJC4JxVNQC3UUezmblAhM5/TIQsEBQTsbjAY8SeQKy6NHzW6iTiaD8w==} + + '@push.rocks/smartrequest@4.4.2': + resolution: {integrity: sha512-Om4y1Ce4YdSu8VoXREz2SgFz9pDxcFEm0+SC1YYa3RXd0AH2Mknaj/1XfvfMqojnK9L7N2z1fY4xX8tO1IwqFQ==} + + '@push.rocks/smartrequest@5.0.1': + resolution: {integrity: sha512-gZQQF6HVt3LwTBxaPh6hHObd4VF76PUYQcs5pHD7f0VXaEewmrNAQSnccoinOY7fi45+0dOf04PJOXu9MibPzQ==} + + '@push.rocks/smartrouter@1.3.3': + resolution: {integrity: sha512-1+xZEnWlhzqLWAaJ1zFNhQ0zgbfCWQl1DBT72LygLxTs+P0K8AwJKgqo/IX6CT55kGCFnPAZIYSbVJlGsgrB0w==} + + '@push.rocks/smartrx@3.0.10': + resolution: {integrity: sha512-USjIYcsSfzn14cwOsxgq/bBmWDTTzy3ouWAnW5NdMyRRzEbmeNrvmy6TRqNeDlJ2PsYNTt1rr/zGUqvIy72ITg==} + + '@push.rocks/smarts3@3.0.3': + resolution: {integrity: sha512-Y9nXMwurthJ9Z7yi0RwjhPFUC58aY8Mhia8kFo6Xj1tBM4LE8Oxg/ydejF7otHqQGr3QyqV5C4YrDEG17rUuzg==} + + '@push.rocks/smartserve@1.4.0': + resolution: {integrity: sha512-cEoXZQSBX3pOv9AyhxRPkrMAWzs2XQhTBmW95BFtTSNzZdji0XgqUu92p7iuF+NVuTFX1QZ8+dbCClLCoRRW7g==} + + '@push.rocks/smartshell@3.3.0': + resolution: {integrity: sha512-m0w618H6YBs+vXGz1CgS4nPi5CUAnqRtckcS9/koGwfcIx1IpjqmiP47BoCTbdgcv0IPUxQVBG1IXTHPuZ8Z5g==} + + '@push.rocks/smartsitemap@2.0.4': + resolution: {integrity: sha512-76dYWG/o/EjV4vYCK7ZKM35T9xgrI+oHEiiIE6E2MDaFIU6QnSfciTfbscH5nc0vxx8Ah+I0HPEJO94BM2S39w==} + + '@push.rocks/smartsocket@2.1.0': + resolution: {integrity: sha512-etOGyfiDFQz/1WJnD3jFL2N7ykujTjiudAz6qZTz82xE5oabKuKX+Cn8SdM9dOwzyWmBUKbUdll8QhovAXjn+g==} + + '@push.rocks/smartspawn@3.0.3': + resolution: {integrity: sha512-DyrGPV69wwOiJgKkyruk5hS3UEGZ99xFAqBE9O2nM8VXCRLbbty3xt1Ug5Z092ZZmJYaaGMSnMw3ijyZJFCT0Q==} + + '@push.rocks/smartstate@2.0.27': + resolution: {integrity: sha512-q4UKir7GV3hakJWXQR4DoA4tUVwT5GRkJ/MtanHYF0wZLHfS19+nGmyO9y974zk3eT9hmy3+Lq5cKtU2W6+Y3w==} + + '@push.rocks/smartstream@2.0.8': + resolution: {integrity: sha512-GlF/9cCkvBHwKa3DK4DO5wjfSgqkj6gAS4TrY9uD5NMHu9RQv4WiNrElTYj7iCEpnZgUnLO3tzw1JA3NRIMnnA==} + + '@push.rocks/smartstream@3.2.5': + resolution: {integrity: sha512-PLGGIFDy8JLNVUnnntMSIYN4W081YSbNC7Y/sWpvUT8PAXtbEXXUiDFgK5o3gcI0ptpKQxHAwxhzNlPj0sbFVg==} + + '@push.rocks/smartstring@4.1.0': + resolution: {integrity: sha512-Q4py/Nm3KTDhQ9EiC75yBtSTLR0KLMwhKM+8gGcutgKotZT6wJ3gncjmtD8LKFfNhb4lSaFMgPJgLrCHTOH6Iw==} + + '@push.rocks/smarttime@4.1.1': + resolution: {integrity: sha512-Ha/3J/G+zfTl4ahpZgF6oUOZnUjpLhrBja0OQ2cloFxF9sKT8I1COaSqIfBGDtoK2Nly4UD4aTJ3JcJNOg/kgA==} + + '@push.rocks/smartunique@3.0.9': + resolution: {integrity: sha512-q6DYQgT7/dqdWi9HusvtWCjdsFzLFXY9LTtaZV6IYNJt6teZOonoygxTdNt9XLn6niBSbLYrHSKvJNTRH/uK+g==} + + '@push.rocks/smarturl@3.1.0': + resolution: {integrity: sha512-ij73Q4GERojdPSHxAvYKvspimcpAJC6GGQCWsC4b+1sAiOSByjfmkUHK8yiEEOPRU9AeGuyaIVqK6ZzKLEZ3vA==} + + '@push.rocks/smartversion@3.0.5': + resolution: {integrity: sha512-8MZSo1yqyaKxKq0Q5N188l4un++9GFWVbhCAX5mXJwewZHn97ujffTeL+eOQYpWFTEpUhaq1QhL4NhqObBCt1Q==} + + '@push.rocks/smartwatch@6.3.0': + resolution: {integrity: sha512-TeZ1PGBoBMpC4/CK8StIj5InEiFfKp7xWJSm3aYMjB/uaoeRP0vXqv1ORIC/TKYGJuEDuAXUsit8tZVjn0qT1Q==} + engines: {node: '>=20.0.0'} + + '@push.rocks/smartxml@2.0.0': + resolution: {integrity: sha512-1d06zYJX4Zt8s5w5qFOUg2LAEz9ykrh9d6CQPK4WAgOBIefb1xzVEWHc7yoxicc2OkzNgC3IBCEg3s6BncZKWw==} + + '@push.rocks/smartyaml@2.0.5': + resolution: {integrity: sha512-tBcf+HaOIfeEsTMwgUZDtZERCxXQyRsWO8Ar5DjBdiSRchbhVGZQEBzXswMS0W5ZoRenjgPK+4tPW3JQGRTfbg==} + + '@push.rocks/smartyaml@3.0.4': + resolution: {integrity: sha512-1JRt+hnoc2zHw3AW+vXKlCdSVwqOmY/01fu+2HBviS0UDjoZCa+/rp6E3GaQb5lEEafKi8ENbffAfjXXp3N2xQ==} + + '@push.rocks/taskbuffer@3.5.0': + resolution: {integrity: sha512-Y9WwIEIyp6oVFdj06j84tfrZIvjhbMb3DF52rYxlTeYLk3W7RPhSg1bGPCbtkXWeKdBrSe37V90BkOG7Qq8Pqg==} + + '@push.rocks/webrequest@3.0.37': + resolution: {integrity: sha512-fLN7kP6GeHFxE4UH4r9C9pjcQb0QkJxHeAMwXvbOqB9hh0MFNKhtGU7GoaTn8SVRGRMPc9UqZVNwo6u5l8Wn0A==} + + '@push.rocks/webrequest@4.0.1': + resolution: {integrity: sha512-I60XZZLVf8W5I7YdmUVVu4G92teE3rg3/aKaV00BRg8vJ3VXx3wc59Qj4em7zxQ5o0HvL8m1Aezw3RFMDPyVgA==} + + '@push.rocks/websetup@3.0.19': + resolution: {integrity: sha512-iKJDwXdMmQdu5siOIgziPRxM51lN1AU9HOr+yMteu1YMDkZT7HKCyisDAr4gC9WZ9a7FzsG8zgthm4dMeA8NTw==} + + '@push.rocks/webstore@2.0.20': + resolution: {integrity: sha512-Z3L4OHGcw/Gs9aXpMUwebEPTh0nK/C7R6YwPfCLcGVu9yd/ZShaQ8QZEYE243Cu9J1Mn+CEtz4jpPLnHiizHQA==} + + '@push.rocks/webstream@1.0.10': + resolution: {integrity: sha512-45CcR0I4/9v0qSjLvz2dYTGMkR0YP3x66ItpStdad5hidJm86t1lfHF06d0oiEvJTpvQkeyIX/8YKAumf21d/Q==} + + '@pushrocks/isounique@1.0.5': + resolution: {integrity: sha512-XYeoKGkmIdsWX64NlPA1fuA41n/1bQ7LdYXytlU/QqYeW7ojgA0ARRhBSh/2phL6o0Jpw6K/7gJ8jc7ab/Tc+w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/isounique + + '@pushrocks/smartdelay@3.0.1': + resolution: {integrity: sha512-I+i/QhC6kLsXsWyW19UgD1vH2r1YWVxK19VMxt2CEuvxMyC6tuCd0vqud9vv5JxaxsJwxWlOsrURkgL4tXeILQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartdelay + + '@pushrocks/smartenv@5.0.5': + resolution: {integrity: sha512-VWON1OJ4qV2/9hzJbgRquRekaO9am3b8W82tgCwgO6LBg23ea2tanfd+gESVMbRFduxHVoFLvlhSBcDGM5zsLA==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartenv + + '@pushrocks/smarthash@3.0.2': + resolution: {integrity: sha512-jXW4f8k6iqOQRvkCmXMID1C+qXyNvUMKm7apPETxnO+L172VlzxP1dml0Ey1+vjfpU2luKCteJWX7W95sOdLDg==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smarthash + + '@pushrocks/smartjson@5.0.6': + resolution: {integrity: sha512-9OJbnRgLTaCRQz+pqu5tB3ZCqRs5Zh0hnBe7t7URE+TgwIZ8aiELUIbWRkgn4mSGVzHyL6pqTyIowP6AjUCG3w==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartjson + + '@pushrocks/smartpromise@3.1.10': + resolution: {integrity: sha512-VeTurbZ1+ZMxBDJk1Y1LV8SN9xLI+oDXKVeCFw41FAGEKOUEqordqFpi6t+7Vhe/TXUZzCVpZ5bXxAxrGf8yTQ==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpromise + + '@pushrocks/smartpromise@4.0.2': + resolution: {integrity: sha512-bqorOaGXPOuiOSV81luTKrTghg4O4NBRD0zyv7TIqmrMGf4a0uoozaUMp1X8vQdZW+y0gTzUJP9wkzAE6Cci0g==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartpromise + + '@pushrocks/smartstring@4.0.7': + resolution: {integrity: sha512-TxHSar7Cj29E+GOcIj4DeZKWCNVzHKdqnrBRqcBqLqmeYZvzFosLXpFKoaCJDq7MSxuPoCvu5woSdp9YmPXyog==} + deprecated: This package has been deprecated in favour of the new package at @push.rocks/smartstring + + '@remirror/core-constants@3.0.0': + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MBGIgysimZPqTDcLXI+i9VveijkP5C3EAncEogXhqfax6YXj1Tr2LY3DVuEOMIjWfMPMhtQSPup4fSTAmgjqIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-MmKeoLnKu1d9j6r19K8B+prJnIZ7u+zQ+zGQ3YHXGnr41rzE3eqQLovlkvoZnRoxDGPA4ps0pGiwXy6YE3lJyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + resolution: {integrity: sha512-qpHedvQBmIjT8zdnjN3nWPR2qjQyJttbXniCEKKdHeAbZG9HyNPBUzQF7AZZGwmS9coQKL+hWg9FhWzh2dZ2IA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + resolution: {integrity: sha512-dDp7WbPapj/NVW0LSiH/CLwMhmLwwKb3R7mh2kWX+QW85X1DGVnIEyKh9PmNJjB/+suG1dJygdtdNPVXK1hylg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + resolution: {integrity: sha512-9e4l6vy5qNSliDPqNfR6CkBOAx6PH7iDV4OJiEJzajajGrVy8gc/IKKJUsoE52G8ud8MX6r3PMl97NfwgOzB7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-V48oDR84feRU2KRuzpALp594Uqlx27+zFsT6+BgTcXOtu7dWy350J1G28ydoCwKB+oxwsRPx2e7aeQnmd3YJbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-ENLmSQCWqSA/+YN45V2FqTIemg7QspaiTjlm327eUAMeOLdqmSOVVyrQexJGNTQ5M8sDYCgVAig2Kk01Ggmqaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + resolution: {integrity: sha512-klahlb2EIFltSUubn/VLjuc3qxp1E7th8ukayPfdkcKvvYcQ5rJztgx8JsJSuAKVzKtNTqUGOhy4On71BuyV8g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + resolution: {integrity: sha512-UuA+JqQIgqtkgGN2c/AQ5wi8M6mJHrahz/wciENPTeI6zEIbbLGoth5XN+sQe2pJDejEVofN9aOAp0kaazwnVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + resolution: {integrity: sha512-1BNQW8u4ro8bsN1+tgKENJiqmvc+WfuaUhXzMImOVSMw28pkBKdfZtX2qJPADV3terx+vNJtlsgSGeb3+W6Jiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + resolution: {integrity: sha512-K/p7clhCqJOQpXGykrFaBX2Dp9AUVIDHGc+PtFGBwg7V+mvBTv/tsm3LC3aUmH02H2y3gz4y+nUTQ0MLpofEEg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-a4EkXBtnYYsKipjS7QOhEBM4bU5IlR9N1hU+JcVEVeuTiaslIyhWVKsvf7K2YkQHyVAJ+7/A9BtrGqORFcTgng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + resolution: {integrity: sha512-tzpnRQXJrSzb8Z9sm97UD3cY0toKOImx+xRKsDLX4zHaAlRXWh7jbaKBePJXEN7gNw7Nm03PBNwphdtA8KSUYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.52': + resolution: {integrity: sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==} + + '@rspack/binding-darwin-arm64@1.6.6': + resolution: {integrity: sha512-vGVDP0rlWa2w/gLba/sncVfkCah0HmhdmK5vGj/7sSX0iViwQneA2xjxDHyCNSQrvfq9GJmj4Kmdq/9tGh0KuA==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.6.6': + resolution: {integrity: sha512-IcdEG2kOmbPPO70Zl7gDnowDjK7d7C1hWew2vU7dPltr2t1JalRIMnS051lhiur0ULkSxV3cW1zXqv0Oi8AnOg==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.6.6': + resolution: {integrity: sha512-rIguCCtlTcwoFlwheDiUgdImk27spuCRn43zGJogARpM/ZYRFKIuSwFDGUtJT2g0TSLUAHUhWAUqC36NwvrbMQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.6.6': + resolution: {integrity: sha512-x6X6Gr0fUw6qrJGxZt3Rb6oIX+jd9pdcyp0VbtofcLaqGVQbzustYsYnuLATPOys0q4J/4kWnmEhkjLJHwkhpQ==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.6.6': + resolution: {integrity: sha512-gSlVdASszWHosQKn+nzYOInBijdQboUnmNMGgW9/PijVg3433IvQjzviUuJFno8CMGgrACV9yw+ZFDuK0J57VA==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.6.6': + resolution: {integrity: sha512-TZaqVkh7memsTK/hxkOBrbpdzbmBUMea1YnYt++7QjMgco1kWFvAQ+YhAWtIaOaEg8s6C07Lt0Zp8izM2Dja0g==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.6.6': + resolution: {integrity: sha512-W4mWdlLnYrbUaktyHOGNfATblxMTbgF7CBfDw8PhbDtjd2l8e/TnaHgIDkwITHXAOMEF/QEKfo9FtusbcQJNKw==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@1.6.6': + resolution: {integrity: sha512-cw5OgxqoDwjoZlk0L3vGEwcjPZsOVFYLwr2ssiC05rsTbhBwxj8coLpAJdvUvbf6C2TTmCB7iPe2sPq1KWD37g==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.6.6': + resolution: {integrity: sha512-M4ruR+VZ59iy+mPjy6FQPT27cOgeytf3wFBrt7e0suKeNLYGxrNyI9YhgpCTY++SMJsAMgRLGDHoI3ZgWulw1Q==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.6.6': + resolution: {integrity: sha512-q5QTvdhPUh+CA93cQG5zWKRIHMIWPzw+ftFDEwBw52zYdvNAoLniqD8o5Mi8CT0pndhulXgR5aw0Sjd3eMah+A==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.6.6': + resolution: {integrity: sha512-noiV+qhyBTVpvG2M4bnOwKk2Ynl6G47Wf7wpCjPCFr87qr3txNwTTnhkEJEU59yj+VvIhbRD2rf5+9TLoT0Wxg==} + + '@rspack/core@1.6.6': + resolution: {integrity: sha512-2mR+2YBydlgZ7Q0Rpd6bCC3MBnV9TS0x857K0zIhbDj4BQOqaWVy1n7fx/B3MrS8TR0QCuzKfyDAjNz+XTyJVQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.1.0': + resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@smithy/abort-controller@4.2.5': + resolution: {integrity: sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader-native@4.2.1': + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} + + '@smithy/chunked-blob-reader@5.2.0': + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.3': + resolution: {integrity: sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.18.7': + resolution: {integrity: sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.5': + resolution: {integrity: sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-codec@4.2.5': + resolution: {integrity: sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-browser@4.2.5': + resolution: {integrity: sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-config-resolver@4.3.5': + resolution: {integrity: sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-node@4.2.5': + resolution: {integrity: sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==} + engines: {node: '>=18.0.0'} + + '@smithy/eventstream-serde-universal@4.2.5': + resolution: {integrity: sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.6': + resolution: {integrity: sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-blob-browser@4.2.6': + resolution: {integrity: sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.5': + resolution: {integrity: sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-stream-node@4.2.5': + resolution: {integrity: sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.5': + resolution: {integrity: sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/md5-js@4.2.5': + resolution: {integrity: sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.5': + resolution: {integrity: sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.3.14': + resolution: {integrity: sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.14': + resolution: {integrity: sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.6': + resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.5': + resolution: {integrity: sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.5': + resolution: {integrity: sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.5': + resolution: {integrity: sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.5': + resolution: {integrity: sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.5': + resolution: {integrity: sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.5': + resolution: {integrity: sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.5': + resolution: {integrity: sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.5': + resolution: {integrity: sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.0': + resolution: {integrity: sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.5': + resolution: {integrity: sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.9.10': + resolution: {integrity: sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.9.0': + resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.5': + resolution: {integrity: sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.13': + resolution: {integrity: sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.16': + resolution: {integrity: sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.5': + resolution: {integrity: sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.5': + resolution: {integrity: sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.5': + resolution: {integrity: sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.6': + resolution: {integrity: sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-waiter@4.2.5': + resolution: {integrity: sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@svgdotjs/svg.draggable.js@3.0.6': + resolution: {integrity: sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + + '@svgdotjs/svg.filter.js@3.0.9': + resolution: {integrity: sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==} + engines: {node: '>= 0.8.0'} + + '@svgdotjs/svg.js@3.2.5': + resolution: {integrity: sha512-/VNHWYhNu+BS7ktbYoVGrCmsXDh+chFMaONMwGNdIBcFHrWqk2jY8fNyr3DLdtQUIalvkPfM554ZSFa3dm3nxQ==} + + '@svgdotjs/svg.resize.js@2.0.5': + resolution: {integrity: sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + '@svgdotjs/svg.select.js': ^4.0.1 + + '@svgdotjs/svg.select.js@4.0.3': + resolution: {integrity: sha512-qkMgso1sd2hXKd1FZ1weO7ANq12sNmQJeGDjs46QwDVsxSRcHmvWKL2NDF7Yimpwf3sl5esOLkPqtV2bQ3v/Jg==} + engines: {node: '>= 14.18'} + peerDependencies: + '@svgdotjs/svg.js': ^3.2.4 + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tempfix/idb@8.0.3': + resolution: {integrity: sha512-hPJQKO7+oAIY+pDNImrZ9QAINbz9KmwT+yO4iRVwdPanok2YKpaUxdJzIvCUwY0YgAawlvYdffbLvRLV5hbs2g==} + + '@tempfix/lenis@1.3.17': + resolution: {integrity: sha512-IqbEB2jLGd0CZrr6TQgjPlhIJJwjDD/53e60KmEr2MEMxwRFUn6pg/H2EvxtoeS7ItmQdhWkJwPgtvVRUCctNw==} + peerDependencies: + '@nuxt/kit': '>=3.0.0' + react: '>=17.0.0' + vue: '>=3.0.0' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + react: + optional: true + vue: + optional: true + + '@tempfix/webcontainer__api@1.6.1': + resolution: {integrity: sha512-Hgn3cwy0vPzjrVBqeVnY0jNZLaOCW7d+dxBe7Jv9YGHAjJ8udUMS+KbTywSv5paAfld3A/RN/iolmMzOwZxLTA==} + + '@tiptap/core@2.27.1': + resolution: {integrity: sha512-nkerkl8syHj44ZzAB7oA2GPmmZINKBKCa79FuNvmGJrJ4qyZwlkDzszud23YteFZEytbc87kVd/fP76ROS6sLg==} + peerDependencies: + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-blockquote@2.27.1': + resolution: {integrity: sha512-QrUX3muElDrNjKM3nqCSAtm3H3pT33c6ON8kwRiQboOAjT/9D57Cs7XEVY7r6rMaJPeKztrRUrNVF9w/w/6B0A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bold@2.27.1': + resolution: {integrity: sha512-g4l4p892x/r7mhea8syp3fNYODxsDrimgouQ+q4DKXIgQmm5+uNhyuEPexP3I8TFNXqQ4DlMNFoM9yCqk97etQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-bullet-list@2.27.1': + resolution: {integrity: sha512-5FmnfXkJ76wN4EbJNzBhAlmQxho8yEMIJLchTGmXdsD/n/tsyVVtewnQYaIOj/Z7naaGySTGDmjVtLgTuQ+Sxw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-code-block@2.27.1': + resolution: {integrity: sha512-wCI5VIOfSAdkenCWFvh4m8FFCJ51EOK+CUmOC/PWUjyo2Dgn8QC8HMi015q8XF7886T0KvYVVoqxmxJSUDAYNg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-code@2.27.1': + resolution: {integrity: sha512-i65wUGJevzBTIIUBHBc1ggVa27bgemvGl/tY1/89fEuS/0Xmre+OQjw8rCtSLevoHSiYYLgLRlvjtUSUhE4kgg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-document@2.27.1': + resolution: {integrity: sha512-NtJzJY7Q/6XWjpOm5OXKrnEaofrcc1XOTYlo/SaTwl8k2bZo918Vl0IDBWhPVDsUN7kx767uHwbtuQZ+9I82hA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-dropcursor@2.27.1': + resolution: {integrity: sha512-3MBQRGHHZ0by3OT0CWbLKS7J3PH9PpobrXjmIR7kr0nde7+bHqxXiVNuuIf501oKU9rnEUSedipSHkLYGkmfsA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-gapcursor@2.27.1': + resolution: {integrity: sha512-A9e1jr+jGhDWzNSXtIO6PYVYhf5j/udjbZwMja+wCE/3KvZU9V3IrnGKz1xNW+2Q2BDOe1QO7j5uVL9ElR6nTA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-hard-break@2.27.1': + resolution: {integrity: sha512-W4hHa4Io6QCTwpyTlN6UAvqMIQ7t56kIUByZhyY9EWrg/+JpbfpxE1kXFLPB4ZGgwBknFOw+e4bJ1j3oAbTJFw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-heading@2.27.1': + resolution: {integrity: sha512-6xoC7igZlW1EmnQ5WVH9IL7P1nCQb3bBUaIDLvk7LbweEogcTUECI4Xg1vxMOVmj9tlDe1I4BsgfcKpB5KEsZw==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-history@2.27.1': + resolution: {integrity: sha512-K8PHC9gegSAt0wzSlsd4aUpoEyIJYOmVVeyniHr1P1mIblW1KYEDbRGbDlrLALTyUEfMcBhdIm8zrB9X2Nihvg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-horizontal-rule@2.27.1': + resolution: {integrity: sha512-WxXWGEEsqDmGIF2o9av+3r9Qje4CKrqrpeQY6aRO5bxvWX9AabQCfasepayBok6uwtvNzh3Xpsn9zbbSk09dNA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-italic@2.27.1': + resolution: {integrity: sha512-rcm0GyniWW0UhcNI9+1eIK64GqWQLyIIrWGINslvqSUoBc+WkfocLvv4CMpRkzKlfsAxwVIBuH2eLxHKDtAREA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-link@2.27.1': + resolution: {integrity: sha512-cCwWPZsnVh9MXnGOqSIRXPPuUixRDK8eMN2TvqwbxUBb1TU7b/HtNvfMU4tAOqAuMRJ0aJkFuf3eB0Gi8LVb1g==} + peerDependencies: + '@tiptap/core': ^2.7.0 + '@tiptap/pm': ^2.7.0 + + '@tiptap/extension-list-item@2.27.1': + resolution: {integrity: sha512-dtsxvtzxfwOJP6dKGf0vb2MJAoDF2NxoiWzpq0XTvo7NGGYUHfuHjX07Zp0dYqb4seaDXjwsi5BIQUOp3+WMFQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-ordered-list@2.27.1': + resolution: {integrity: sha512-U1/sWxc2TciozQsZjH35temyidYUjvroHj3PUPzPyh19w2fwKh1NSbFybWuoYs6jS3XnMSwnM2vF52tOwvfEmA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-paragraph@2.27.1': + resolution: {integrity: sha512-R3QdrHcUdFAsdsn2UAIvhY0yWyHjqGyP/Rv8RRdN0OyFiTKtwTPqreKMHKJOflgX4sMJl/OpHTpNG1Kaf7Lo2A==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-strike@2.27.1': + resolution: {integrity: sha512-S9I//K8KPgfFTC5I5lorClzXk0g4lrAv9y5qHzHO5EOWt7AFl0YTg2oN8NKSIBK4bHRnPIrjJJKv+dDFnUp5jQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-align@2.27.1': + resolution: {integrity: sha512-D7dLPk7y5mDn9ZNANQ4K2gCq4vy+Emm5AdeWOGzNeqJsYrBotiQYXd9rb1QYjdup2kzAoKduMTUXV92ujo5cEg==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text-style@2.27.1': + resolution: {integrity: sha512-NagQ9qLk0Ril83gfrk+C65SvTqPjL3WVnLF2arsEVnCrxcx3uDOvdJW67f/K5HEwEHsoqJ4Zq9Irco/koXrOXA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-text@2.27.1': + resolution: {integrity: sha512-a4GCT+GZ9tUwl82F4CEum9/+WsuW0/De9Be/NqrMmi7eNfAwbUTbLCTFU0gEvv25WMHCoUzaeNk/qGmzeVPJ1Q==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-typography@2.27.1': + resolution: {integrity: sha512-jAZU5IuWH9CtZlolQ1gRhV+bT75s19SXjadQwkk18gMMiapcaIVVTxUDWY6ycv9ge4cjRoaP3lqBviW3cGqhOA==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/extension-underline@2.27.1': + resolution: {integrity: sha512-fPTmfJFAQWg1O/os1pYSPVdtvly6eW/w5sDofG7pre+bdQUN+8s1cZYelSuj/ltNVioRaB2Ws7tvNgnHL0aAJQ==} + peerDependencies: + '@tiptap/core': ^2.7.0 + + '@tiptap/pm@2.27.1': + resolution: {integrity: sha512-ijKo3+kIjALthYsnBmkRXAuw2Tswd9gd7BUR5OMfIcjGp8v576vKxOxrRfuYiUM78GPt//P0sVc1WV82H5N0PQ==} + + '@tiptap/starter-kit@2.27.1': + resolution: {integrity: sha512-uQQlP0Nmn9eq19qm8YoOeloEfmcGbPpB1cujq54Q6nPgxaBozR7rE7tXbFTinxRW2+Hr7XyNWhpjB7DMNkdU2Q==} + + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@tsclass/tsclass@4.4.4': + resolution: {integrity: sha512-YZOAF+u+r4u5rCev2uUd1KBTBdfyFdtDmcv4wuN+864lMccbdfRICR3SlJwCfYS1lbeV3QNLYGD30wjRXgvCJA==} + + '@tsclass/tsclass@9.3.0': + resolution: {integrity: sha512-KD3oTUN3RGu67tgjNHgWWZGsdYipr1RUDxQ9MMKSgIJ6oNZ4q5m2rg0ibrgyHWkAjTPlHVa6kHP3uVOY+8bnHw==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/buffer-json@2.0.3': + resolution: {integrity: sha512-ItD4UfF3Q5jA+PEV6ZUWEHvlWaXJbd0rpuBKOIrEebM053FHaJddKsgUf0vy7nLSTs44nqFj3Mh8J3TiT0xv4g==} + + '@types/clean-css@4.2.11': + resolution: {integrity: sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/dns-packet@5.6.5': + resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} + + '@types/elliptic@6.4.18': + resolution: {integrity: sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw==} + + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/from2@2.3.6': + resolution: {integrity: sha512-pO5qFhZ85+M4znizw6ihwU2nW+EarU/TuWbYzSEt6YSCis+vET8WJMUlg6/b2HLBzzT9cfKhtEoIciazgv9UXQ==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/html-minifier@4.0.6': + resolution: {integrity: sha512-1Dcf38DkVMYo8SIOkUka7GxI+0BztCVsnfiG2Sxb6G8ShHDQTWQb1WKps/eb3O074HNDCn8wU7LMl5N99nNG+Q==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/js-yaml@3.12.10': + resolution: {integrity: sha512-/Mtaq/wf+HxXpvhzFYzrzCqNRcA958sW++7JOFC8nPrZcvfi/TrzOaaGbvt27ltJB2NQbHVAg5a1wUCsyMH7NA==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/mime-types@2.1.4': + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + '@types/ping@0.4.4': + resolution: {integrity: sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/randomatic@3.1.5': + resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/relateurl@0.2.33': + resolution: {integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==} + + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@types/symbol-tree@3.2.5': + resolution: {integrity: sha512-zXnnyENt1TYQcS21MkPaJCVjfcPq7p7yc5mo5JACuumXp6sly5jnlS0IokHd+xmmuCbx6V7JqkMBpswR+nZAcw==} + + '@types/tar-stream@3.1.4': + resolution: {integrity: sha512-921gW0+g29mCJX0fRvqeHzBlE/XclDaAG0Ousy1LCghsOhvaKacDeRGEVzQP9IPfKn8Vysy7FEXAIxycpc/CMg==} + + '@types/through2@2.0.41': + resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/turndown@5.0.6': + resolution: {integrity: sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==} + + '@types/uglify-js@3.17.5': + resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@11.0.5': + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} + + '@types/which@3.0.4': + resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@yr/monotone-cubic-spline@1.0.3': + resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acme-client@5.4.0: + resolution: {integrity: sha512-mORqg60S8iML6XSmVjqjGHJkINrCGLMj2QvDmFzI9vIlv1RGlyjmw3nrzaINJjkNsYXC41XhhD5pfy7CtuGcbA==} + engines: {node: '>= 16'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ansi-256-colors@1.1.0: + resolution: {integrity: sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + apexcharts@5.3.6: + resolution: {integrity: sha512-sVEPw+J0Gp0IHQabKu8cfdsxlfME0e36Wid7RIaPclGM2OUt+O7O4+6mfAmTUYhy5bDk8cNHzEhPfVtLCIXEJA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + asynckit@0.4.0: + resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} + + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.8.2: + resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.5.2: + resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.2: + resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.3.2: + resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + body-parser@2.2.1: + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + engines: {node: '>=18'} + + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + broadcast-channel@7.2.0: + resolution: {integrity: sha512-JgraikEriG/TxBUi2W/w2O0jhHjXZUtXAvCZH0Yr3whjxYVgAg0hSe6r/teM+I5H5Q/q6RhyuKdC2pHNlFyepQ==} + + brorand@1.1.0: + resolution: {integrity: sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=} + + bson@6.10.4: + resolution: {integrity: sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==} + engines: {node: '>=16.20.1'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} + + buffer-json@2.0.0: + resolution: {integrity: sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@3.0.0: + resolution: {integrity: sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chromium-bidi@11.0.0: + resolution: {integrity: sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==} + peerDependencies: + devtools-protocol: '*' + + clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + + clean-stack@1.3.0: + resolution: {integrity: sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=} + engines: {node: '>=4'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commondir@1.0.1: + resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + croner@9.1.0: + resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} + engines: {node: '>=18.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crypto-random-string@5.0.0: + resolution: {integrity: sha512-KWjTXWwxFd6a94m5CdRGW/t82Tr8DoBc9dNnPCAbFI1EBweN6v1tv8y4Y1m7ndkp/nkIBRxUxAzpaBnR2k3bcQ==} + engines: {node: '>=14.16'} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + devtools-protocol@0.0.1534754: + resolution: {integrity: sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + express-force-ssl@0.3.2: + resolution: {integrity: sha1-AbK0mK5v0uQRUrIrV6Phc3c69n4=} + engines: {node: '>=0.2.2'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fake-indexeddb@5.0.2: + resolution: {integrity: sha512-cB507r5T3D55DfclY01GLkninZLfU7HXV/mhVRTnTRm5k2u+fY7Fof2dBkr80p5t7G7dlA/G5dI87QiMdPpMCQ==} + engines: {node: '>=18'} + + fake-indexeddb@6.2.5: + resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} + engines: {node: '>=18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + + fast-xml-parser@5.3.2: + resolution: {integrity: sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==} + hasBin: true + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fd-slicer@1.1.0: + resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-type@19.6.0: + resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} + engines: {node: '>=18'} + + file-type@21.1.1: + resolution: {integrity: sha512-ifJXo8zUqbQ/bLbl9sFoqHNTNWbnPY1COImFfM6CCy7z+E+jC1eY9YfOKkx0fckIg+VljAy2/87T61fp0+eEkg==} + engines: {node: '>=20'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + from2@2.3.0: + resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} + + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} + + fs.realpath@1.0.0: + resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + happy-dom@15.11.7: + resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} + engines: {node: '>=18.0.0'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hmac-drbg@1.0.1: + resolution: {integrity: sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=} + + html-minifier@4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + humanize-ms@1.2.1: + resolution: {integrity: sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=} + + ibantools@4.5.1: + resolution: {integrity: sha512-DfKQpLlFq9yEUIEnFuCJzss3XavD7iHZTU5PyqXiAJ+rmaMp+NFP3hboumHKuK8nZjuOJg93WemTzcQ5b9jOZA==} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inflight@1.0.6: + resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-observable@2.1.0: + resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} + + isexe@2.0.0: + resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isopen@1.3.0: + resolution: {integrity: sha512-AN6Q9J0UlqHFl1fN/2xJCHCBLCBCFDjZhpGBO1gh3wzgRPsFSFBUL36I2Lbfd9qkuoj58axmE7j83iejTQsk8Q==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.3.2: + resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.2: + resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash._baseassign@3.2.0: + resolution: {integrity: sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=} + + lodash._basecopy@3.0.1: + resolution: {integrity: sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=} + + lodash._bindcallback@3.0.1: + resolution: {integrity: sha1-5THCdkTPi1epnhftlbNcdIeJOS4=} + + lodash._createassigner@3.1.1: + resolution: {integrity: sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=} + + lodash._getnative@3.9.1: + resolution: {integrity: sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=} + + lodash._isiterateecall@3.0.9: + resolution: {integrity: sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=} + + lodash.assign@3.2.0: + resolution: {integrity: sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=} + + lodash.isarray@3.0.4: + resolution: {integrity: sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=} + + lodash.keys@3.1.2: + resolution: {integrity: sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=} + + lodash.restparam@3.6.1: + resolution: {integrity: sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lower-case@1.1.4: + resolution: {integrity: sha1-miyr0bno4K6ZOkv31YdcOcQujqw=} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lucide@0.562.0: + resolution: {integrity: sha512-k1Fb8ZMnRQovWRlea7Jr0b9UKA29IM7/cu79+mJrhVohvA2YC/Ti3Sk+G+h/SIu3IlrKT4RAbWMHUBBQd1O6XA==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-error-cause@2.3.0: + resolution: {integrity: sha512-etgt+n4LlOkGSJbBTV9VROHA5R7ekIPS4vfh+bCAoJgRrJWdqJCBbpS3osRJ/HrT7R68MzMiY3L3sDJ/Fd8aBg==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + + matcher@5.0.0: + resolution: {integrity: sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + monaco-editor@0.55.1: + resolution: {integrity: sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==} + + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} + + mongodb-memory-server-core@10.4.1: + resolution: {integrity: sha512-YJdrEyF9hk64nfeoVDMP6IfTzK+gLZhrQqYyP6JJMsqo2LK5eF7JRZ4YPQDmt1re/JhItpiU+ypiZbIG1OsW5Q==} + engines: {node: '>=16.20.1'} + + mongodb-memory-server@10.4.1: + resolution: {integrity: sha512-XpCyV1e7QQ1lW28rgtXP4ZlX8ZfD/8z1ZGNxz2y3JrosLgDrNnYWvPjlgFj3JjboYUtlh1jF2Ez/rwsQA6cl0w==} + engines: {node: '>=16.20.1'} + + mongodb@6.21.0: + resolution: {integrity: sha512-URyb/VXMjJ4da46OeSXg+puO39XH9DeQpWCslifrRn9JWugy0D+DvvBvkm2WxmHe61O/H19JM66p1z7RHVkZ6A==} + engines: {node: '>=16.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 + gcp-metadata: ^5.2.0 + kerberos: ^2.0.1 + mongodb-client-encryption: '>=6.0.0 <7' + snappy: ^7.3.2 + socks: ^2.7.1 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} + engines: {node: '>= 6.13.0'} + + normalize-newline@4.1.0: + resolution: {integrity: sha512-ff4jKqMI8Xl50/4Mms/9jPobzAV/UK+kXG2XJ/7AqOmxIx8mqfqTIHYxuAnEgJ2AQeBbLnlbmZ5+38Y9A0w/YA==} + engines: {node: '>=12'} + + normalize-url@8.1.0: + resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} + engines: {node: '>=14.16'} + + object-assign@4.1.1: + resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + oblivious-set@2.0.0: + resolution: {integrity: sha512-QOUH5Xrsced9fKXaQTjWoDGKeS/Or7E2jB0FN63N4mkAO4qJdB7WR7e6qWAOHM5nk25FJ8TGjhP7DH4l6vFVLg==} + engines: {node: '>=16'} + + observable-fns@0.6.1: + resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-finally@1.0.0: + resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@2.1.1: + resolution: {integrity: sha1-35T9jPZTHs915r75oIWPvHK+Ikc=} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + pdf-lib@1.17.1: + resolution: {integrity: sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==} + + pdf2json@3.2.0: + resolution: {integrity: sha512-5RJYU5zWFXTQ5iRXAo75vlhK5ybZOyqEyg/szw2VtHc6ZOPcC7ruX4nnXk1OqqlY56Z7XT+WCFhV+/XPj4QwtQ==} + engines: {node: '>=20.18.0'} + hasBin: true + bundledDependencies: [] + + pdfjs-dist@4.10.38: + resolution: {integrity: sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==} + engines: {node: '>=20'} + + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} + engines: {node: '>=14.16'} + + pend@1.2.0: + resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + ping@0.4.4: + resolution: {integrity: sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==} + engines: {node: '>=4.0.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + prosemirror-changeset@2.3.1: + resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.7.1: + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + + prosemirror-dropcursor@1.8.2: + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + + prosemirror-gapcursor@1.4.0: + resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} + + prosemirror-history@1.5.0: + resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + + prosemirror-inputrules@1.5.1: + resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} + + prosemirror-keymap@1.2.3: + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} + + prosemirror-markdown@1.13.2: + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + + prosemirror-menu@1.2.5: + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} + + prosemirror-model@1.25.4: + resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} + + prosemirror-schema-basic@1.2.4: + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} + + prosemirror-state@1.4.4: + resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} + + prosemirror-tables@1.8.3: + resolution: {integrity: sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==} + + prosemirror-trailing-node@3.0.0: + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + + prosemirror-view@1.41.4: + resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} + + proto-list@1.2.4: + resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@1.4.1: + resolution: {integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4=} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + puppeteer-core@24.32.0: + resolution: {integrity: sha512-MqzLLeJjqjtHK9J44+KE3kjtXXhFpPvg+AvXl/oy/jB8MeeNH66/4MNotOTqGZ6MPaxWi51YJ1ASga6OIff6xw==} + engines: {node: '>=18'} + + puppeteer@24.32.0: + resolution: {integrity: sha512-exyxHPV5DSsigIhM/pzLcyzl5XU4Dp5lNP+APwIeStDxAdYqpMnJ1qN0QHXghjJx+cQJczby+ySH5rgv/5GQLw==} + engines: {node: '>=18'} + hasBin: true + + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + relateurl@0.2.7: + resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=} + engines: {node: '>= 0.10'} + + remark-frontmatter@5.0.0: + resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-html@16.0.1: + resolution: {integrity: sha512-B9JqA5i0qZe0Nsf49q3OXyGvyXuZFDzAP2iOFLEumymuYJITVpiH1IgsTEwTpdptDmZlMDMWeDmSawdaJIGCXQ==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + replace-buffer@1.2.1: + resolution: {integrity: sha512-ly3OKwKu+3T55DjP5PjIMzxgz9lFx6dQnBmAIxryZyRKl8f22juy12ShOyuq8WrQE5UlFOseZgQZDua0iF9DHw==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} + engines: {node: '>=0.10.0'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rolldown@1.0.0-beta.52: + resolution: {integrity: sha512-Hbnpljue+JhMJrlOjQ1ixp9me7sUec7OjFvS+A1Qm8k8Xyxmw3ZhxFu7LlSXW1s9AX3POE9W9o2oqCEeR5uDmg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE=} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + sprintf-js@1.0.3: + resolution: {integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} + engines: {node: '>=0.10.0'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + + strtok3@10.3.4: + resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} + engines: {node: '>=18'} + + strtok3@9.1.1: + resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} + engines: {node: '>=16'} + + sweet-scroll@4.0.0: + resolution: {integrity: sha512-mR6fRsAQANtm3zpzhUE73KAOt2aT4ZsWzNSggiEsSqdO6Zh4gM7ioJG81EngrZEl0XAc3ZvzEfhxggOoEBc8jA==} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + systeminformation@5.27.11: + resolution: {integrity: sha512-K3Lto/2m3K2twmKHdgx5B+0in9qhXK4YnoT9rIlgwN/4v7OV5c8IjbeAUkuky/6VzCQC7iKCAqi8rZathCdjHg==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + + threads@1.7.0: + resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + tiny-worker@2.3.0: + resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@6.1.1: + resolution: {integrity: sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==} + engines: {node: '>=14.16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + + turndown-plugin-gfm@1.0.2: + resolution: {integrity: sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==} + + turndown@7.2.2: + resolution: {integrity: sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typed-query-selector@2.12.0: + resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unload@2.4.1: + resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} + + unpipe@1.0.0: + resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} + engines: {node: '>= 0.8'} + + upper-case@1.1.3: + resolution: {integrity: sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=} + + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + + util-deprecate@1.0.2: + resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + engines: {node: '>= 0.8'} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + webdriver-bidi-protocol@0.3.9: + resolution: {integrity: sha512-uIYvlRQ0PwtZR1EzHlTMol1G0lAlmOe6wPykF9a77AK3bkpvZHzIVxRE2ThOx5vjy2zISe0zhwf5rzuUfbo1PQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xterm-addon-fit@0.8.0: + resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} + peerDependencies: + xterm: ^5.0.0 + + xterm@5.3.0: + resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} + + yauzl@3.2.0: + resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} + engines: {node: '>=12'} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@api.global/typedrequest-interfaces@2.0.2': {} + + '@api.global/typedrequest-interfaces@3.0.19': {} + + '@api.global/typedrequest@3.2.5': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbuffer': 3.0.5 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartguard': 3.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstream': 1.0.10 + + '@api.global/typedserver@3.0.80(@push.rocks/smartserve@1.4.0)': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 3.1.1(@push.rocks/smartserve@1.4.0) + '@cloudflare/workers-types': 4.20251211.0 + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartchok': 1.2.0 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog-destination-devtools': 1.0.12 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartmanifest': 2.0.2 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartntml': 2.0.8 + '@push.rocks/smartopen': 2.0.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartsitemap': 2.0.4 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/taskbuffer': 3.5.0 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/webstore': 2.0.20 + '@tsclass/tsclass': 9.3.0 + '@types/express': 5.0.6 + body-parser: 2.2.1 + cors: 2.8.5 + express: 5.2.1 + express-force-ssl: 0.3.2 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - '@push.rocks/smartserve' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@api.global/typedserver@7.11.1(@tiptap/pm@2.27.1)': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedsocket': 4.1.0(@push.rocks/smartserve@1.4.0) + '@cloudflare/workers-types': 4.20251211.0 + '@design.estate/dees-catalog': 3.33.0(@tiptap/pm@2.27.1) + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartfile': 13.1.0 + '@push.rocks/smartfs': 1.2.0 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog-destination-devtools': 1.0.12 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartmanifest': 2.0.2 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartntml': 2.0.8 + '@push.rocks/smartopen': 2.0.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 1.4.0 + '@push.rocks/smartsitemap': 2.0.4 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartwatch': 6.3.0 + '@push.rocks/taskbuffer': 3.5.0 + '@push.rocks/webrequest': 4.0.1 + '@push.rocks/webstore': 2.0.20 + '@tsclass/tsclass': 9.3.0 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@api.global/typedsocket@3.1.1(@push.rocks/smartserve@1.4.0)': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartsocket': 2.1.0 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smarturl': 3.1.0 + optionalDependencies: + '@push.rocks/smartserve': 1.4.0 + transitivePeerDependencies: + - '@nuxt/kit' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@api.global/typedsocket@4.1.0(@push.rocks/smartserve@1.4.0)': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/isohash': 2.0.1 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartserve': 1.4.0 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smarturl': 3.1.0 + + '@aws-crypto/crc32@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + tslib: 2.8.1 + + '@aws-crypto/crc32c@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + tslib: 2.8.1 + + '@aws-crypto/sha1-browser@5.2.0': + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + tslib: 2.8.1 + + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-s3@3.946.0': + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.946.0 + '@aws-sdk/credential-provider-node': 3.946.0 + '@aws-sdk/middleware-bucket-endpoint': 3.936.0 + '@aws-sdk/middleware-expect-continue': 3.936.0 + '@aws-sdk/middleware-flexible-checksums': 3.946.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-location-constraint': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-sdk-s3': 3.946.0 + '@aws-sdk/middleware-ssec': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.946.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/signature-v4-multi-region': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.946.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.7 + '@smithy/eventstream-serde-browser': 4.2.5 + '@smithy/eventstream-serde-config-resolver': 4.3.5 + '@smithy/eventstream-serde-node': 4.2.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-blob-browser': 4.2.6 + '@smithy/hash-node': 4.2.5 + '@smithy/hash-stream-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/md5-js': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.14 + '@smithy/middleware-retry': 4.4.14 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.13 + '@smithy/util-defaults-mode-node': 4.2.16 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.5 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.946.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.946.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.946.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.946.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.7 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.14 + '@smithy/middleware-retry': 4.4.14 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.13 + '@smithy/util-defaults-mode-node': 4.2.16 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.946.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws-sdk/xml-builder': 3.930.0 + '@smithy/core': 3.18.7 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/credential-provider-env': 3.946.0 + '@aws-sdk/credential-provider-http': 3.946.0 + '@aws-sdk/credential-provider-login': 3.946.0 + '@aws-sdk/credential-provider-process': 3.946.0 + '@aws-sdk/credential-provider-sso': 3.946.0 + '@aws-sdk/credential-provider-web-identity': 3.946.0 + '@aws-sdk/nested-clients': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-login@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/nested-clients': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.946.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.946.0 + '@aws-sdk/credential-provider-http': 3.946.0 + '@aws-sdk/credential-provider-ini': 3.946.0 + '@aws-sdk/credential-provider-process': 3.946.0 + '@aws-sdk/credential-provider-sso': 3.946.0 + '@aws-sdk/credential-provider-web-identity': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.946.0': + dependencies: + '@aws-sdk/client-sso': 3.946.0 + '@aws-sdk/core': 3.946.0 + '@aws-sdk/token-providers': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/nested-clients': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-bucket-endpoint@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-expect-continue@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-flexible-checksums@3.946.0': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-host-header@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-location-constraint@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws/lambda-invoke-store': 0.2.2 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.18.7 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-ssec@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@smithy/core': 3.18.7 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.946.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.946.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.946.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.946.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.7 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.14 + '@smithy/middleware-retry': 4.4.14 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.13 + '@smithy/util-defaults-mode-node': 4.2.16 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.946.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.946.0': + dependencies: + '@aws-sdk/core': 3.946.0 + '@aws-sdk/nested-clients': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.936.0': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.893.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-endpoints': 3.2.5 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.893.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.936.0': + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + bowser: 2.13.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.946.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.946.0 + '@aws-sdk/types': 3.936.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.930.0': + dependencies: + '@smithy/types': 4.9.0 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.2.2': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/runtime@7.28.4': {} + + '@borewit/text-codec@0.1.1': {} + + '@cfworker/json-schema@4.1.1': {} + + '@cloudflare/workers-types@4.20251211.0': {} + + '@configvault.io/interfaces@1.0.17': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + + '@design.estate/dees-catalog@3.33.0(@tiptap/pm@2.27.1)': + dependencies: + '@design.estate/dees-domtools': 2.3.7 + '@design.estate/dees-element': 2.1.5 + '@fortawesome/fontawesome-svg-core': 7.1.0 + '@fortawesome/free-brands-svg-icons': 7.1.0 + '@fortawesome/free-regular-svg-icons': 7.1.0 + '@fortawesome/free-solid-svg-icons': 7.1.0 + '@push.rocks/smarti18n': 1.0.4 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + '@tempfix/webcontainer__api': 1.6.1 + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/extension-link': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-text-align': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-typography': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-underline': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/starter-kit': 2.27.1 + '@tsclass/tsclass': 9.3.0 + apexcharts: 5.3.6 + highlight.js: 11.11.1 + ibantools: 4.5.1 + lucide: 0.562.0 + monaco-editor: 0.55.1 + pdfjs-dist: 4.10.38 + xterm: 5.3.0 + xterm-addon-fit: 0.8.0(xterm@5.3.0) + transitivePeerDependencies: + - '@nuxt/kit' + - '@tiptap/pm' + - react + - supports-color + - vue + + '@design.estate/dees-comms@1.0.30': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/smartdelay': 3.0.5 + broadcast-channel: 7.2.0 + + '@design.estate/dees-domtools@2.3.7': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@design.estate/dees-comms': 1.0.30 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmarkdown': 3.0.3 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrouter': 1.3.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstate': 2.0.27 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + '@push.rocks/websetup': 3.0.19 + '@push.rocks/webstore': 2.0.20 + '@tempfix/lenis': 1.3.17 + lit: 3.3.2 + sweet-scroll: 4.0.0 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@design.estate/dees-element@2.1.5': + dependencies: + '@design.estate/dees-domtools': 2.3.7 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartrx': 3.0.10 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@design.estate/dees-wcctools@3.7.1': + dependencies: + '@design.estate/dees-domtools': 2.3.7 + '@design.estate/dees-element': 2.1.5 + '@push.rocks/smartdelay': 3.0.5 + lit: 3.3.2 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.1': + optional: true + + '@esbuild/android-arm64@0.27.1': + optional: true + + '@esbuild/android-arm@0.27.1': + optional: true + + '@esbuild/android-x64@0.27.1': + optional: true + + '@esbuild/darwin-arm64@0.27.1': + optional: true + + '@esbuild/darwin-x64@0.27.1': + optional: true + + '@esbuild/freebsd-arm64@0.27.1': + optional: true + + '@esbuild/freebsd-x64@0.27.1': + optional: true + + '@esbuild/linux-arm64@0.27.1': + optional: true + + '@esbuild/linux-arm@0.27.1': + optional: true + + '@esbuild/linux-ia32@0.27.1': + optional: true + + '@esbuild/linux-loong64@0.27.1': + optional: true + + '@esbuild/linux-mips64el@0.27.1': + optional: true + + '@esbuild/linux-ppc64@0.27.1': + optional: true + + '@esbuild/linux-riscv64@0.27.1': + optional: true + + '@esbuild/linux-s390x@0.27.1': + optional: true + + '@esbuild/linux-x64@0.27.1': + optional: true + + '@esbuild/netbsd-arm64@0.27.1': + optional: true + + '@esbuild/netbsd-x64@0.27.1': + optional: true + + '@esbuild/openbsd-arm64@0.27.1': + optional: true + + '@esbuild/openbsd-x64@0.27.1': + optional: true + + '@esbuild/openharmony-arm64@0.27.1': + optional: true + + '@esbuild/sunos-x64@0.27.1': + optional: true + + '@esbuild/win32-arm64@0.27.1': + optional: true + + '@esbuild/win32-ia32@0.27.1': + optional: true + + '@esbuild/win32-x64@0.27.1': + optional: true + + '@fortawesome/fontawesome-common-types@7.1.0': {} + + '@fortawesome/fontawesome-svg-core@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@fortawesome/free-brands-svg-icons@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@fortawesome/free-regular-svg-icons@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@fortawesome/free-solid-svg-icons@7.1.0': + dependencies: + '@fortawesome/fontawesome-common-types': 7.1.0 + + '@git.zone/tsbuild@4.0.2': + dependencies: + '@git.zone/tspublish': 1.11.0 + '@push.rocks/early': 4.0.4 + '@push.rocks/smartcli': 4.0.19 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + typescript: 5.9.3 + transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt + - bare-abort-controller + - react + - react-native-b4a + - supports-color + - vue + + '@git.zone/tsbundle@2.6.3': + dependencies: + '@push.rocks/early': 4.0.4 + '@push.rocks/smartcli': 4.0.19 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfs': 1.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartspawn': 3.0.3 + '@rspack/core': 1.6.6 + '@types/html-minifier': 4.0.6 + esbuild: 0.27.1 + html-minifier: 4.0.0 + rolldown: 1.0.0-beta.52 + typescript: 5.9.3 + transitivePeerDependencies: + - '@swc/helpers' + - supports-color + + '@git.zone/tspublish@1.11.0': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/npmextra': 5.3.3 + '@push.rocks/smartcli': 4.0.19 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartnpm': 2.0.6 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smartshell': 3.3.0 + transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt + - bare-abort-controller + - react + - react-native-b4a + - supports-color + - vue + + '@git.zone/tsrun@2.0.0': + dependencies: + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartshell': 3.3.0 + tsx: 4.21.0 + + '@git.zone/tstest@3.1.4(@push.rocks/smartserve@1.4.0)(socks@2.8.7)(typescript@5.9.3)': + dependencies: + '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@1.4.0) + '@git.zone/tsbundle': 2.6.3 + '@git.zone/tsrun': 2.0.0 + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/qenv': 6.1.3 + '@push.rocks/smartbrowser': 2.0.8(typescript@5.9.3) + '@push.rocks/smartchok': 1.2.0 + '@push.rocks/smartcrypto': 2.0.4 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartexpect': 2.5.0 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartmongo': 2.0.14(socks@2.8.7) + '@push.rocks/smartnetwork': 4.4.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 5.0.1 + '@push.rocks/smarts3': 3.0.3 + '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smarttime': 4.1.1 + '@types/ws': 8.18.1 + figures: 6.1.0 + ws: 8.18.3 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - '@push.rocks/smartserve' + - '@swc/helpers' + - aws-crt + - bare-abort-controller + - bare-buffer + - bufferutil + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - react-native-b4a + - snappy + - socks + - supports-color + - typescript + - utf-8-validate + - vue + + '@git.zone/tswatch@2.3.13(@tiptap/pm@2.27.1)': + dependencies: + '@api.global/typedserver': 7.11.1(@tiptap/pm@2.27.1) + '@git.zone/tsbundle': 2.6.3 + '@git.zone/tsrun': 2.0.0 + '@push.rocks/early': 4.0.4 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartcli': 4.0.19 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfs': 1.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartlog-destination-local': 9.0.2 + '@push.rocks/smartshell': 3.3.0 + '@push.rocks/smartwatch': 6.3.0 + '@push.rocks/taskbuffer': 3.5.0 + transitivePeerDependencies: + - '@nuxt/kit' + - '@swc/helpers' + - '@tiptap/pm' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@happy-dom/global-registrator@15.11.7': + dependencies: + happy-dom: 15.11.7 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@lit-labs/ssr-dom-shim@1.5.0': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.0 + + '@mixmark-io/domino@2.2.0': {} + + '@module-federation/error-codes@0.21.6': {} + + '@module-federation/runtime-core@0.21.6': + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/sdk': 0.21.6 + + '@module-federation/runtime-tools@0.21.6': + dependencies: + '@module-federation/runtime': 0.21.6 + '@module-federation/webpack-bundler-runtime': 0.21.6 + + '@module-federation/runtime@0.21.6': + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/runtime-core': 0.21.6 + '@module-federation/sdk': 0.21.6 + + '@module-federation/sdk@0.21.6': {} + + '@module-federation/webpack-bundler-runtime@0.21.6': + dependencies: + '@module-federation/runtime': 0.21.6 + '@module-federation/sdk': 0.21.6 + + '@mongodb-js/saslprep@1.3.2': + dependencies: + sparse-bitfield: 3.0.3 + + '@napi-rs/canvas-android-arm64@0.1.84': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.84': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.84': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.84': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.84': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.84': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.84': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.84': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.84': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.84': + optional: true + + '@napi-rs/canvas@0.1.84': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.84 + '@napi-rs/canvas-darwin-arm64': 0.1.84 + '@napi-rs/canvas-darwin-x64': 0.1.84 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.84 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.84 + '@napi-rs/canvas-linux-arm64-musl': 0.1.84 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.84 + '@napi-rs/canvas-linux-x64-gnu': 0.1.84 + '@napi-rs/canvas-linux-x64-musl': 0.1.84 + '@napi-rs/canvas-win32-x64-msvc': 0.1.84 + optional: true + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.0': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-project/types@0.99.0': {} + + '@pdf-lib/standard-fonts@1.0.0': + dependencies: + pako: 1.0.11 + + '@pdf-lib/upng@1.0.1': + dependencies: + pako: 1.0.11 + + '@peculiar/asn1-cms@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pfx': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.6.0': + dependencies: + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509-attr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.6 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/x509@1.14.2': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-csr': 2.6.0 + '@peculiar/asn1-ecc': 2.6.0 + '@peculiar/asn1-pkcs9': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@puppeteer/browsers@2.11.0': + dependencies: + debug: 4.4.3 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.7.3 + tar-fs: 3.1.1 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@push.rocks/consolecolor@2.0.3': + dependencies: + ansi-256-colors: 1.1.0 + + '@push.rocks/early@4.0.4': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/isohash@2.0.1': + dependencies: + '@pushrocks/smartenv': 5.0.5 + '@pushrocks/smarthash': 3.0.2 + + '@push.rocks/isounique@1.0.5': {} + + '@push.rocks/levelcache@3.2.0': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartbucket': 3.3.10 + '@push.rocks/smartcache': 1.0.18 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartexit': 1.1.0 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer': 3.5.0 + '@tsclass/tsclass': 9.3.0 + transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt + - react + - supports-color + - vue + + '@push.rocks/lik@6.2.2': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartmatch': 2.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + '@types/minimatch': 5.1.2 + '@types/symbol-tree': 3.2.5 + symbol-tree: 3.2.4 + + '@push.rocks/mongodump@1.1.0(socks@2.8.7)': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@tsclass/tsclass': 9.3.0 + mongodb: 6.21.0(socks@2.8.7) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + + '@push.rocks/npmextra@5.3.3': + dependencies: + '@push.rocks/qenv': 6.1.3 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/taskbuffer': 3.5.0 + '@tsclass/tsclass': 9.3.0 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@push.rocks/projectinfo@5.0.2': + dependencies: + '@push.rocks/smartfile': 10.0.41 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + + '@push.rocks/qenv@6.1.3': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@configvault.io/interfaces': 1.0.17 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + + '@push.rocks/smartarchive@4.2.4': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 13.1.2 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/smarturl': 3.1.0 + '@types/tar-stream': 3.1.4 + fflate: 0.8.2 + file-type: 21.1.1 + tar-stream: 3.1.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@push.rocks/smartbrowser@2.0.8(typescript@5.9.3)': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpdf': 3.3.0(typescript@5.9.3) + '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) + '@push.rocks/smartunique': 3.0.9 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + + '@push.rocks/smartbucket@3.3.10': + dependencies: + '@aws-sdk/client-s3': 3.946.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smartunique': 3.0.9 + '@tsclass/tsclass': 9.3.0 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/smartbucket@4.3.0': + dependencies: + '@aws-sdk/client-s3': 3.946.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstream': 3.2.5 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smartunique': 3.0.9 + '@tsclass/tsclass': 9.3.0 + minimatch: 10.1.1 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/smartbuffer@3.0.5': + dependencies: + uint8array-extras: 1.5.0 + + '@push.rocks/smartcache@1.0.18': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smarterror': 2.0.1 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.1.1 + + '@push.rocks/smartchok@1.2.0': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 5.0.0 + picomatch: 4.0.3 + + '@push.rocks/smartcli@4.0.19': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + yargs-parser: 22.0.0 + + '@push.rocks/smartclickhouse@2.0.17': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartobject': 1.0.12 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarturl': 3.1.0 + '@push.rocks/webrequest': 3.0.37 + + '@push.rocks/smartcrypto@2.0.4': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@types/node-forge': 1.3.14 + node-forge: 1.3.3 + + '@push.rocks/smartdata@5.16.7(socks@2.8.7)': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartmongo': 2.0.14(socks@2.8.7) + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smartstring': 4.1.0 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartunique': 3.0.9 + '@push.rocks/taskbuffer': 3.5.0 + '@tsclass/tsclass': 9.3.0 + mongodb: 6.21.0(socks@2.8.7) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - bare-abort-controller + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - react-native-b4a + - snappy + - socks + - supports-color + - vue + + '@push.rocks/smartdelay@3.0.5': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartdns@7.6.1': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@tsclass/tsclass': 9.3.0 + '@types/dns-packet': 5.6.5 + '@types/elliptic': 6.4.18 + acme-client: 5.4.0 + dns-packet: 5.6.1 + elliptic: 6.6.1 + minimatch: 10.1.1 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartenv@5.0.13': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartenv@6.0.0': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smarterror@2.0.1': + dependencies: + clean-stack: 1.3.0 + make-error-cause: 2.3.0 + + '@push.rocks/smartexit@1.0.23': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + tree-kill: 1.2.2 + + '@push.rocks/smartexit@1.1.0': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + tree-kill: 1.2.2 + + '@push.rocks/smartexpect@2.5.0': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + fast-deep-equal: 3.1.3 + + '@push.rocks/smartfeed@1.4.0': + dependencies: + '@tsclass/tsclass': 9.3.0 + fast-xml-parser: 4.5.3 + + '@push.rocks/smartfile-interfaces@1.0.7': {} + + '@push.rocks/smartfile@10.0.41': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmime': 1.0.6 + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + '@push.rocks/smartstream': 2.0.8 + '@types/fs-extra': 11.0.4 + '@types/glob': 8.1.0 + '@types/js-yaml': 4.0.9 + fs-extra: 11.3.2 + glob: 10.5.0 + js-yaml: 4.1.1 + + '@push.rocks/smartfile@11.2.7': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smartstream': 3.2.5 + '@types/fs-extra': 11.0.4 + '@types/js-yaml': 4.0.9 + fs-extra: 11.3.2 + glob: 11.1.0 + js-yaml: 4.1.1 + + '@push.rocks/smartfile@13.1.0': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smartfs': 1.2.0 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smartstream': 3.2.5 + '@types/js-yaml': 4.0.9 + glob: 11.1.0 + js-yaml: 4.1.1 + + '@push.rocks/smartfile@13.1.2': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile-interfaces': 1.0.7 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartmime': 2.0.4 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smartstream': 3.2.5 + '@types/js-yaml': 4.0.9 + glob: 11.1.0 + js-yaml: 4.1.1 + + '@push.rocks/smartfs@1.2.0': + dependencies: + '@push.rocks/smartpath': 6.0.0 + + '@push.rocks/smartfs@1.3.1': + dependencies: + '@push.rocks/smartpath': 6.0.0 + + '@push.rocks/smartguard@3.1.0': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 2.1.0 + + '@push.rocks/smarthash@3.2.6': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@push.rocks/smarti18n@1.0.4': {} + + '@push.rocks/smartjson@5.2.0': + dependencies: + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartstring': 4.1.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@push.rocks/smartlog-destination-devtools@1.0.12': + dependencies: + '@push.rocks/smartlog-interfaces': 3.0.2 + + '@push.rocks/smartlog-destination-local@9.0.2': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/smartlog-interfaces': 3.0.2 + '@push.rocks/smartpromise': 4.2.3 + + '@push.rocks/smartlog-interfaces@3.0.2': + dependencies: + '@api.global/typedrequest-interfaces': 2.0.2 + '@tsclass/tsclass': 4.4.4 + + '@push.rocks/smartlog@3.1.10': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/smartclickhouse': 2.0.17 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/webrequest': 3.0.37 + '@tsclass/tsclass': 9.3.0 + + '@push.rocks/smartmanifest@2.0.2': {} + + '@push.rocks/smartmarkdown@3.0.3': + dependencies: + '@push.rocks/smartyaml': 2.0.5 + '@types/turndown': 5.0.6 + remark-frontmatter: 5.0.0 + remark-gfm: 4.0.1 + remark-html: 16.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + turndown: 7.2.2 + turndown-plugin-gfm: 1.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartmatch@2.0.0': + dependencies: + matcher: 5.0.0 + + '@push.rocks/smartmime@1.0.6': + dependencies: + '@types/mime-types': 2.1.4 + mime-types: 2.1.35 + + '@push.rocks/smartmime@2.0.4': + dependencies: + '@types/mime-types': 2.1.4 + file-type: 19.6.0 + mime: 4.1.0 + + '@push.rocks/smartmongo@2.0.14(socks@2.8.7)': + dependencies: + '@push.rocks/mongodump': 1.1.0(socks@2.8.7) + '@push.rocks/smartdata': 5.16.7(socks@2.8.7) + '@push.rocks/smartpath': 5.1.0 + '@push.rocks/smartpromise': 4.2.3 + mongodb-memory-server: 10.4.1(socks@2.8.7) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - '@nuxt/kit' + - bare-abort-controller + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react + - react-native-b4a + - snappy + - socks + - supports-color + - vue + + '@push.rocks/smartnetwork@4.4.0': + dependencies: + '@push.rocks/smartdns': 7.6.1 + '@push.rocks/smartping': 1.0.8 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartstring': 4.1.0 + isopen: 1.3.0 + systeminformation: 5.27.11 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartnpm@2.0.6': + dependencies: + '@push.rocks/consolecolor': 2.0.3 + '@push.rocks/levelcache': 3.2.0 + '@push.rocks/smartarchive': 4.2.4 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrequest': 4.4.2 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartversion': 3.0.5 + package-json: 8.1.1 + transitivePeerDependencies: + - '@nuxt/kit' + - aws-crt + - bare-abort-controller + - react + - react-native-b4a + - supports-color + - vue + + '@push.rocks/smartntml@2.0.8': + dependencies: + '@design.estate/dees-element': 2.1.5 + '@happy-dom/global-registrator': 15.11.7 + '@push.rocks/smartpromise': 4.2.3 + fake-indexeddb: 6.2.5 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@push.rocks/smartobject@1.0.12': + dependencies: + fast-deep-equal: 3.1.3 + minimatch: 9.0.5 + + '@push.rocks/smartopen@2.0.0': + dependencies: + open: 8.4.2 + + '@push.rocks/smartpath@5.1.0': {} + + '@push.rocks/smartpath@6.0.0': {} + + '@push.rocks/smartpdf@3.3.0(typescript@5.9.3)': + dependencies: + '@push.rocks/smartbuffer': 3.0.5 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartfile': 11.2.7 + '@push.rocks/smartnetwork': 4.4.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartpuppeteer': 2.0.5(typescript@5.9.3) + '@push.rocks/smartunique': 3.0.9 + '@tsclass/tsclass': 9.3.0 + '@types/express': 5.0.6 + express: 5.2.1 + pdf-lib: 1.17.1 + pdf2json: 3.2.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + + '@push.rocks/smartping@1.0.8': + dependencies: + '@types/ping': 0.4.4 + ping: 0.4.4 + + '@push.rocks/smartpromise@4.2.3': {} + + '@push.rocks/smartpuppeteer@2.0.5(typescript@5.9.3)': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartshell': 3.3.0 + puppeteer: 24.32.0(typescript@5.9.3) + tree-kill: 1.2.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + + '@push.rocks/smartrequest@2.1.0': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.5 + + '@push.rocks/smartrequest@4.4.2': + dependencies: + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.5 + + '@push.rocks/smartrequest@5.0.1': + dependencies: + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smarturl': 3.1.0 + agentkeepalive: 4.6.0 + form-data: 4.0.5 + + '@push.rocks/smartrouter@1.3.3': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartrx': 3.0.10 + path-to-regexp: 8.3.0 + + '@push.rocks/smartrx@3.0.10': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + rxjs: 7.8.2 + + '@push.rocks/smarts3@3.0.3': + dependencies: + '@push.rocks/smartbucket': 4.3.0 + '@push.rocks/smartfs': 1.3.1 + '@push.rocks/smartpath': 6.0.0 + '@push.rocks/smartxml': 2.0.0 + '@tsclass/tsclass': 9.3.0 + transitivePeerDependencies: + - aws-crt + + '@push.rocks/smartserve@1.4.0': + dependencies: + '@api.global/typedrequest': 3.2.5 + '@cfworker/json-schema': 4.1.1 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpath': 6.0.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@push.rocks/smartshell@3.3.0': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartexit': 1.0.23 + '@push.rocks/smartpromise': 4.2.3 + '@types/which': 3.0.4 + tree-kill: 1.2.2 + which: 5.0.0 + + '@push.rocks/smartsitemap@2.0.4': + dependencies: + '@push.rocks/smartcache': 1.0.18 + '@push.rocks/smartfeed': 1.4.0 + '@push.rocks/smartxml': 2.0.0 + '@push.rocks/smartyaml': 3.0.4 + '@push.rocks/webrequest': 4.0.1 + '@tsclass/tsclass': 9.3.0 + + '@push.rocks/smartsocket@2.1.0': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@api.global/typedserver': 3.0.80(@push.rocks/smartserve@1.4.0) + '@push.rocks/isohash': 2.0.1 + '@push.rocks/isounique': 1.0.5 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + engine.io: 6.6.4 + socket.io: 4.8.1 + socket.io-client: 4.8.1 + transitivePeerDependencies: + - '@nuxt/kit' + - bufferutil + - react + - supports-color + - utf-8-validate + - vue + + '@push.rocks/smartspawn@3.0.3': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + spawn-wrap: 2.0.0 + threads: 1.7.0 + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + '@push.rocks/smartstate@2.0.27': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smarthash': 3.2.6 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/smartstream@2.0.8': + dependencies: + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@types/from2': 2.3.6 + '@types/through2': 2.0.41 + from2: 2.3.0 + through2: 4.0.2 + + '@push.rocks/smartstream@3.2.5': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + + '@push.rocks/smartstring@4.1.0': + dependencies: + '@push.rocks/isounique': 1.0.5 + + '@push.rocks/smarttime@4.1.1': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartpromise': 4.2.3 + croner: 9.1.0 + date-fns: 4.1.0 + dayjs: 1.11.19 + is-nan: 1.3.2 + pretty-ms: 9.3.0 + + '@push.rocks/smartunique@3.0.9': + dependencies: + '@types/uuid': 9.0.8 + nanoid: 4.0.2 + uuid: 9.0.1 + + '@push.rocks/smarturl@3.1.0': {} + + '@push.rocks/smartversion@3.0.5': + dependencies: + '@types/semver': 7.7.1 + semver: 7.7.3 + + '@push.rocks/smartwatch@6.3.0': + dependencies: + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 6.0.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + chokidar: 5.0.0 + picomatch: 4.0.3 + + '@push.rocks/smartxml@2.0.0': + dependencies: + fast-xml-parser: 5.3.2 + + '@push.rocks/smartyaml@2.0.5': + dependencies: + '@types/js-yaml': 3.12.10 + js-yaml: 3.14.2 + + '@push.rocks/smartyaml@3.0.4': + dependencies: + yaml: 2.8.2 + + '@push.rocks/taskbuffer@3.5.0': + dependencies: + '@design.estate/dees-element': 2.1.5 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartlog': 3.1.10 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@push.rocks/smarttime': 4.1.1 + '@push.rocks/smartunique': 3.0.9 + transitivePeerDependencies: + - '@nuxt/kit' + - react + - supports-color + - vue + + '@push.rocks/webrequest@3.0.37': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/webrequest@4.0.1': + dependencies: + '@push.rocks/smartdelay': 3.0.5 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/webstore': 2.0.20 + + '@push.rocks/websetup@3.0.19': + dependencies: + '@pushrocks/smartdelay': 3.0.1 + '@pushrocks/smartpromise': 4.0.2 + '@tsclass/tsclass': 4.4.4 + + '@push.rocks/webstore@2.0.20': + dependencies: + '@api.global/typedrequest-interfaces': 3.0.19 + '@push.rocks/lik': 6.2.2 + '@push.rocks/smartenv': 5.0.13 + '@push.rocks/smartjson': 5.2.0 + '@push.rocks/smartpromise': 4.2.3 + '@push.rocks/smartrx': 3.0.10 + '@tempfix/idb': 8.0.3 + fake-indexeddb: 5.0.2 + + '@push.rocks/webstream@1.0.10': + dependencies: + '@push.rocks/smartenv': 5.0.13 + + '@pushrocks/isounique@1.0.5': {} + + '@pushrocks/smartdelay@3.0.1': + dependencies: + '@pushrocks/smartpromise': 4.0.2 + + '@pushrocks/smartenv@5.0.5': + dependencies: + '@pushrocks/smartpromise': 3.1.10 + + '@pushrocks/smarthash@3.0.2': + dependencies: + '@pushrocks/smartjson': 5.0.6 + '@pushrocks/smartpromise': 3.1.10 + '@types/through2': 2.0.41 + through2: 4.0.2 + + '@pushrocks/smartjson@5.0.6': + dependencies: + '@pushrocks/smartstring': 4.0.7 + '@types/buffer-json': 2.0.3 + buffer-json: 2.0.0 + fast-json-stable-stringify: 2.1.0 + lodash.clonedeep: 4.5.0 + + '@pushrocks/smartpromise@3.1.10': {} + + '@pushrocks/smartpromise@4.0.2': {} + + '@pushrocks/smartstring@4.0.7': + dependencies: + '@pushrocks/isounique': 1.0.5 + '@pushrocks/smartenv': 5.0.5 + '@types/randomatic': 3.1.5 + buffer: 6.0.3 + crypto-random-string: 5.0.0 + js-base64: 3.7.8 + normalize-newline: 4.1.0 + randomatic: 3.1.1 + strip-indent: 4.1.1 + url: 0.11.4 + + '@remirror/core-constants@3.0.0': {} + + '@rolldown/binding-android-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.52': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.52': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.52': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.52': + dependencies: + '@napi-rs/wasm-runtime': 1.1.0 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.52': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.52': {} + + '@rspack/binding-darwin-arm64@1.6.6': + optional: true + + '@rspack/binding-darwin-x64@1.6.6': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.6.6': + optional: true + + '@rspack/binding-linux-arm64-musl@1.6.6': + optional: true + + '@rspack/binding-linux-x64-gnu@1.6.6': + optional: true + + '@rspack/binding-linux-x64-musl@1.6.6': + optional: true + + '@rspack/binding-wasm32-wasi@1.6.6': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.6.6': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.6.6': + optional: true + + '@rspack/binding-win32-x64-msvc@1.6.6': + optional: true + + '@rspack/binding@1.6.6': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.6.6 + '@rspack/binding-darwin-x64': 1.6.6 + '@rspack/binding-linux-arm64-gnu': 1.6.6 + '@rspack/binding-linux-arm64-musl': 1.6.6 + '@rspack/binding-linux-x64-gnu': 1.6.6 + '@rspack/binding-linux-x64-musl': 1.6.6 + '@rspack/binding-wasm32-wasi': 1.6.6 + '@rspack/binding-win32-arm64-msvc': 1.6.6 + '@rspack/binding-win32-ia32-msvc': 1.6.6 + '@rspack/binding-win32-x64-msvc': 1.6.6 + + '@rspack/core@1.6.6': + dependencies: + '@module-federation/runtime-tools': 0.21.6 + '@rspack/binding': 1.6.6 + '@rspack/lite-tapable': 1.1.0 + + '@rspack/lite-tapable@1.1.0': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/is@5.6.0': {} + + '@smithy/abort-controller@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader-native@4.2.1': + dependencies: + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/chunked-blob-reader@5.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.3': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + + '@smithy/core@3.18.7': + dependencies: + '@smithy/middleware-serde': 4.2.6 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.5': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + tslib: 2.8.1 + + '@smithy/eventstream-codec@4.2.5': + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-browser@4.2.5': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-config-resolver@4.3.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-node@4.2.5': + dependencies: + '@smithy/eventstream-serde-universal': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/eventstream-serde-universal@4.2.5': + dependencies: + '@smithy/eventstream-codec': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.6': + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-blob-browser@4.2.6': + dependencies: + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/hash-stream-node@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/md5-js@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.5': + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.3.14': + dependencies: + '@smithy/core': 3.18.7 + '@smithy/middleware-serde': 4.2.6 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.14': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/service-error-classification': 4.2.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.6': + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.5': + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.5': + dependencies: + '@smithy/abort-controller': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + + '@smithy/shared-ini-file-loader@4.4.0': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.5': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.9.10': + dependencies: + '@smithy/core': 3.18.7 + '@smithy/middleware-endpoint': 4.3.14 + '@smithy/middleware-stack': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + + '@smithy/types@4.9.0': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.5': + dependencies: + '@smithy/querystring-parser': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.13': + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.16': + dependencies: + '@smithy/config-resolver': 4.4.3 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.10 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.5': + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.5': + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.5': + dependencies: + '@smithy/service-error-classification': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.6': + dependencies: + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-waiter@4.2.5': + dependencies: + '@smithy/abort-controller': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + + '@socket.io/component-emitter@3.1.2': {} + + '@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.5)': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@svgdotjs/svg.filter.js@3.0.9': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@svgdotjs/svg.js@3.2.5': {} + + '@svgdotjs/svg.resize.js@2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5))': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + + '@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)': + dependencies: + '@svgdotjs/svg.js': 3.2.5 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@tempfix/idb@8.0.3': {} + + '@tempfix/lenis@1.3.17': {} + + '@tempfix/webcontainer__api@1.6.1': {} + + '@tiptap/core@2.27.1(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-blockquote@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-bold@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-bullet-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-code-block@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-code@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-document@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-dropcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-gapcursor@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-hard-break@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-heading@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-history@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-horizontal-rule@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + + '@tiptap/extension-italic@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-link@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1)': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/pm': 2.27.1 + linkifyjs: 4.3.2 + + '@tiptap/extension-list-item@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-ordered-list@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-paragraph@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-strike@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-text-align@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-text-style@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-text@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-typography@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/extension-underline@2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + + '@tiptap/pm@2.27.1': + dependencies: + prosemirror-changeset: 2.3.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.0 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.2 + prosemirror-menu: 1.2.5 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.3 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4) + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + '@tiptap/starter-kit@2.27.1': + dependencies: + '@tiptap/core': 2.27.1(@tiptap/pm@2.27.1) + '@tiptap/extension-blockquote': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-bold': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-bullet-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-code': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-code-block': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-document': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-dropcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-gapcursor': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-hard-break': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-heading': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-history': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-horizontal-rule': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1))(@tiptap/pm@2.27.1) + '@tiptap/extension-italic': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-list-item': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-ordered-list': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-paragraph': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-strike': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-text': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/extension-text-style': 2.27.1(@tiptap/core@2.27.1(@tiptap/pm@2.27.1)) + '@tiptap/pm': 2.27.1 + + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.1 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@tsclass/tsclass@4.4.4': + dependencies: + type-fest: 4.41.0 + + '@tsclass/tsclass@9.3.0': + dependencies: + type-fest: 4.41.0 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 25.0.3 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 25.0.3 + + '@types/buffer-json@2.0.3': {} + + '@types/clean-css@4.2.11': + dependencies: + '@types/node': 25.0.3 + source-map: 0.6.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 25.0.3 + + '@types/cors@2.8.19': + dependencies: + '@types/node': 25.0.3 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/dns-packet@5.6.5': + dependencies: + '@types/node': 25.0.3 + + '@types/elliptic@6.4.18': + dependencies: + '@types/bn.js': 5.2.0 + + '@types/express-serve-static-core@5.1.0': + dependencies: + '@types/node': 25.0.3 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 2.2.0 + + '@types/from2@2.3.6': + dependencies: + '@types/node': 25.0.3 + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 25.0.3 + + '@types/glob@8.1.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 25.0.3 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/html-minifier@4.0.6': + dependencies: + '@types/clean-css': 4.2.11 + '@types/relateurl': 0.2.33 + '@types/uglify-js': 3.17.5 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/http-errors@2.0.5': {} + + '@types/js-yaml@3.12.10': {} + + '@types/js-yaml@4.0.9': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 25.0.3 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/mime-types@2.1.4': {} + + '@types/minimatch@5.1.2': {} + + '@types/ms@2.1.0': {} + + '@types/node-forge@1.3.14': + dependencies: + '@types/node': 25.0.3 + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + + '@types/ping@0.4.4': {} + + '@types/qs@6.14.0': {} + + '@types/randomatic@3.1.5': {} + + '@types/range-parser@1.2.7': {} + + '@types/relateurl@0.2.33': {} + + '@types/semver@7.7.1': {} + + '@types/send@1.2.1': + dependencies: + '@types/node': 25.0.3 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 25.0.3 + + '@types/symbol-tree@3.2.5': {} + + '@types/tar-stream@3.1.4': + dependencies: + '@types/node': 25.0.3 + + '@types/through2@2.0.41': + dependencies: + '@types/node': 25.0.3 + + '@types/trusted-types@2.0.7': {} + + '@types/turndown@5.0.6': {} + + '@types/uglify-js@3.17.5': + dependencies: + source-map: 0.6.1 + + '@types/unist@3.0.3': {} + + '@types/uuid@9.0.8': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@11.0.5': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@types/which@3.0.4': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.0.3 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 25.0.3 + optional: true + + '@ungap/structured-clone@1.3.0': {} + + '@yr/monotone-cubic-spline@1.0.3': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acme-client@5.4.0: + dependencies: + '@peculiar/x509': 1.14.2 + asn1js: 3.0.6 + axios: 1.13.2(debug@4.4.3) + debug: 4.4.3 + node-forge: 1.3.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-256-colors@1.1.0: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + apexcharts@5.3.6: + dependencies: + '@svgdotjs/svg.draggable.js': 3.0.6(@svgdotjs/svg.js@3.2.5) + '@svgdotjs/svg.filter.js': 3.0.9 + '@svgdotjs/svg.js': 3.2.5 + '@svgdotjs/svg.resize.js': 2.0.5(@svgdotjs/svg.js@3.2.5)(@svgdotjs/svg.select.js@4.0.3(@svgdotjs/svg.js@3.2.5)) + '@svgdotjs/svg.select.js': 4.0.3(@svgdotjs/svg.js@3.2.5) + '@yr/monotone-cubic-spline': 1.0.3 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + asn1js@3.0.6: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + asynckit@0.4.0: {} + + axios@1.13.2(debug@4.4.3): + dependencies: + follow-redirects: 1.15.11(debug@4.4.3) + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + b4a@1.7.3: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + bare-events@2.8.2: {} + + bare-fs@4.5.2: + dependencies: + bare-events: 2.8.2 + bare-path: 3.0.0 + bare-stream: 2.7.0(bare-events@2.8.2) + bare-url: 2.3.2 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-os@3.6.2: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.2 + optional: true + + bare-stream@2.7.0(bare-events@2.8.2): + dependencies: + streamx: 2.23.0 + optionalDependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + optional: true + + bare-url@2.3.2: + dependencies: + bare-path: 3.0.0 + optional: true + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + basic-ftp@5.0.5: {} + + bn.js@4.12.2: {} + + body-parser@2.2.1: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.0 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.2 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + bowser@2.13.1: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + broadcast-channel@7.2.0: + dependencies: + '@babel/runtime': 7.28.4 + oblivious-set: 2.0.0 + p-queue: 6.6.2 + unload: 2.4.1 + + brorand@1.1.0: {} + + bson@6.10.4: {} + + buffer-crc32@0.2.13: {} + + buffer-json@2.0.0: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.1.0 + responselike: 3.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camel-case@3.0.0: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + camelcase@6.3.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chromium-bidi@11.0.0(devtools-protocol@0.0.1534754): + dependencies: + devtools-protocol: 0.0.1534754 + mitt: 3.0.1 + zod: 3.25.76 + + clean-css@4.2.4: + dependencies: + source-map: 0.6.1 + + clean-stack@1.3.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@2.20.3: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + content-disposition@1.0.1: {} + + content-type@1.0.5: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + + crelt@1.0.6: {} + + croner@9.1.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@5.0.0: + dependencies: + type-fest: 2.19.0 + + data-uri-to-buffer@6.0.2: {} + + date-fns@4.1.0: {} + + dayjs@1.11.19: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + devtools-protocol@0.0.1534754: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 25.0.3 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.27.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.1 + '@esbuild/android-arm': 0.27.1 + '@esbuild/android-arm64': 0.27.1 + '@esbuild/android-x64': 0.27.1 + '@esbuild/darwin-arm64': 0.27.1 + '@esbuild/darwin-x64': 0.27.1 + '@esbuild/freebsd-arm64': 0.27.1 + '@esbuild/freebsd-x64': 0.27.1 + '@esbuild/linux-arm': 0.27.1 + '@esbuild/linux-arm64': 0.27.1 + '@esbuild/linux-ia32': 0.27.1 + '@esbuild/linux-loong64': 0.27.1 + '@esbuild/linux-mips64el': 0.27.1 + '@esbuild/linux-ppc64': 0.27.1 + '@esbuild/linux-riscv64': 0.27.1 + '@esbuild/linux-s390x': 0.27.1 + '@esbuild/linux-x64': 0.27.1 + '@esbuild/netbsd-arm64': 0.27.1 + '@esbuild/netbsd-x64': 0.27.1 + '@esbuild/openbsd-arm64': 0.27.1 + '@esbuild/openbsd-x64': 0.27.1 + '@esbuild/openharmony-arm64': 0.27.1 + '@esbuild/sunos-x64': 0.27.1 + '@esbuild/win32-arm64': 0.27.1 + '@esbuild/win32-ia32': 0.27.1 + '@esbuild/win32-x64': 0.27.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esm@3.2.25: {} + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.8.2 + transitivePeerDependencies: + - bare-abort-controller + + express-force-ssl@0.3.2: + dependencies: + lodash.assign: 3.2.0 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.1 + content-disposition: 1.0.1 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fake-indexeddb@5.0.2: {} + + fake-indexeddb@6.2.5: {} + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + + fast-xml-parser@5.3.2: + dependencies: + strnum: 2.1.1 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fflate@0.8.2: {} + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-type@19.6.0: + dependencies: + get-stream: 9.0.1 + strtok3: 9.1.1 + token-types: 6.1.1 + uint8array-extras: 1.5.0 + + file-type@21.1.1: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.4 + token-types: 6.1.1 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 3.0.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@2.1.4: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fs-extra@11.3.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@5.2.0: + dependencies: + pump: 3.0.3 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-uri@6.0.5: + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.1.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + happy-dom@15.11.7: + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + html-minifier@4.0.0: + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.20.3 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.19.3 + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.2.0: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ibantools@4.5.1: {} + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ip-address@10.1.0: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-docker@2.2.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-number@4.0.0: {} + + is-observable@2.1.0: {} + + is-plain-obj@4.1.0: {} + + is-promise@4.0.0: {} + + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isopen@1.3.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + js-base64@3.7.8: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.3.2: {} + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.0 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + + lit-html@3.3.2: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.2: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash._baseassign@3.2.0: + dependencies: + lodash._basecopy: 3.0.1 + lodash.keys: 3.1.2 + + lodash._basecopy@3.0.1: {} + + lodash._bindcallback@3.0.1: {} + + lodash._createassigner@3.1.1: + dependencies: + lodash._bindcallback: 3.0.1 + lodash._isiterateecall: 3.0.9 + lodash.restparam: 3.6.1 + + lodash._getnative@3.9.1: {} + + lodash._isiterateecall@3.0.9: {} + + lodash.assign@3.2.0: + dependencies: + lodash._baseassign: 3.2.0 + lodash._createassigner: 3.1.1 + lodash.keys: 3.1.2 + + lodash.clonedeep@4.5.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.isarray@3.0.4: {} + + lodash.keys@3.1.2: + dependencies: + lodash._getnative: 3.9.1 + lodash.isarguments: 3.1.0 + lodash.isarray: 3.0.4 + + lodash.restparam@3.6.1: {} + + longest-streak@3.1.0: {} + + lower-case@1.1.4: {} + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.4: {} + + lru-cache@7.18.3: {} + + lucide@0.562.0: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-error-cause@2.3.0: + dependencies: + make-error: 1.3.6 + + make-error@1.3.6: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdown-table@3.0.4: {} + + marked@14.0.0: {} + + matcher@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + + math-intrinsics@1.1.0: {} + + math-random@1.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.2 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdurl@2.0.0: {} + + media-typer@1.1.0: {} + + memory-pager@1.5.0: {} + + merge-descriptors@2.0.0: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@4.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mitt@3.0.1: {} + + monaco-editor@0.55.1: + dependencies: + dompurify: 3.2.7 + marked: 14.0.0 + + mongodb-connection-string-url@3.0.2: + dependencies: + '@types/whatwg-url': 11.0.5 + whatwg-url: 14.2.0 + + mongodb-memory-server-core@10.4.1(socks@2.8.7): + dependencies: + async-mutex: 0.5.0 + camelcase: 6.3.0 + debug: 4.4.3 + find-cache-dir: 3.3.2 + follow-redirects: 1.15.11(debug@4.4.3) + https-proxy-agent: 7.0.6 + mongodb: 6.21.0(socks@2.8.7) + new-find-package-json: 2.0.0 + semver: 7.7.3 + tar-stream: 3.1.7 + tslib: 2.8.1 + yauzl: 3.2.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bare-abort-controller + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react-native-b4a + - snappy + - socks + - supports-color + + mongodb-memory-server@10.4.1(socks@2.8.7): + dependencies: + mongodb-memory-server-core: 10.4.1(socks@2.8.7) + tslib: 2.8.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bare-abort-controller + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react-native-b4a + - snappy + - socks + - supports-color + + mongodb@6.21.0(socks@2.8.7): + dependencies: + '@mongodb-js/saslprep': 1.3.2 + bson: 6.10.4 + mongodb-connection-string-url: 3.0.2 + optionalDependencies: + socks: 2.8.7 + + ms@2.1.3: {} + + nanoid@4.0.2: {} + + negotiator@0.6.3: {} + + negotiator@1.0.0: {} + + netmask@2.0.2: {} + + new-find-package-json@2.0.0: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + + node-forge@1.3.3: {} + + normalize-newline@4.1.0: + dependencies: + replace-buffer: 1.2.1 + + normalize-url@8.1.0: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + oblivious-set@2.0.0: {} + + observable-fns@0.6.1: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + orderedmap@2.1.1: {} + + p-cancelable@3.0.0: {} + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-queue@6.6.2: + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-try@2.2.0: {} + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + package-json-from-dist@1.0.1: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.1.0 + registry-url: 6.0.1 + semver: 7.7.3 + + pako@1.0.11: {} + + param-case@2.1.1: + dependencies: + no-case: 2.3.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + + path-to-regexp@8.3.0: {} + + pdf-lib@1.17.1: + dependencies: + '@pdf-lib/standard-fonts': 1.0.0 + '@pdf-lib/upng': 1.0.1 + pako: 1.0.11 + tslib: 1.14.1 + + pdf2json@3.2.0: {} + + pdfjs-dist@4.10.38: + optionalDependencies: + '@napi-rs/canvas': 0.1.84 + + peek-readable@5.4.2: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + ping@0.4.4: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + process-nextick-args@2.0.1: {} + + progress@2.0.3: {} + + property-information@7.1.0: {} + + prosemirror-changeset@2.3.1: + dependencies: + prosemirror-transform: 1.10.5 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.4 + + prosemirror-commands@1.7.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-dropcursor@1.8.2: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-gapcursor@1.4.0: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + + prosemirror-history@1.5.0: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.5.1: + dependencies: + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-keymap@1.2.3: + dependencies: + prosemirror-state: 1.4.4 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.2: + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + prosemirror-model: 1.25.4 + + prosemirror-menu@1.2.5: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.7.1 + prosemirror-history: 1.5.0 + prosemirror-state: 1.4.4 + + prosemirror-model@1.25.4: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.4: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-schema-list@1.5.1: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + prosemirror-state@1.4.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-tables@1.8.3: + dependencies: + prosemirror-keymap: 1.2.3 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + prosemirror-view: 1.41.4 + + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4): + dependencies: + '@remirror/core-constants': 3.0.0 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-view: 1.41.4 + + prosemirror-transform@1.10.5: + dependencies: + prosemirror-model: 1.25.4 + + prosemirror-view@1.41.4: + dependencies: + prosemirror-model: 1.25.4 + prosemirror-state: 1.4.4 + prosemirror-transform: 1.10.5 + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode.js@2.3.1: {} + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + puppeteer-core@24.32.0: + dependencies: + '@puppeteer/browsers': 2.11.0 + chromium-bidi: 11.0.0(devtools-protocol@0.0.1534754) + debug: 4.4.3 + devtools-protocol: 0.0.1534754 + typed-query-selector: 2.12.0 + webdriver-bidi-protocol: 0.3.9 + ws: 8.18.3 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + puppeteer@24.32.0(typescript@5.9.3): + dependencies: + '@puppeteer/browsers': 2.11.0 + chromium-bidi: 11.0.0(devtools-protocol@0.0.1534754) + cosmiconfig: 9.0.0(typescript@5.9.3) + devtools-protocol: 0.0.1534754 + puppeteer-core: 24.32.0 + typed-query-selector: 2.12.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - typescript + - utf-8-validate + + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quick-lru@5.1.1: {} + + randomatic@3.1.1: + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + + range-parser@1.2.1: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@5.0.0: {} + + reflect-metadata@0.2.2: {} + + registry-auth-token@5.1.0: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + relateurl@0.2.7: {} + + remark-frontmatter@5.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-frontmatter: 2.0.1 + micromark-extension-frontmatter: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-html@16.0.1: + dependencies: + '@types/mdast': 4.0.4 + hast-util-sanitize: 5.0.2 + hast-util-to-html: 9.0.5 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + replace-buffer@1.2.1: {} + + require-directory@2.1.1: {} + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rolldown@1.0.0-beta.52: + dependencies: + '@oxc-project/types': 0.99.0 + '@rolldown/pluginutils': 1.0.0-beta.52 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.52 + '@rolldown/binding-darwin-x64': 1.0.0-beta.52 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.52 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.52 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.52 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.52 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.52 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.52 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.52 + + rope-sequence@1.3.4: {} + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + send@1.2.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-client@4.8.1: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + + source-map@0.6.1: {} + + space-separated-tokens@2.0.2: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + sprintf-js@1.0.3: {} + + statuses@2.0.2: {} + + streamx@2.23.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-indent@4.1.1: {} + + strip-json-comments@2.0.1: {} + + strnum@1.1.2: {} + + strnum@2.1.1: {} + + strtok3@10.3.4: + dependencies: + '@tokenizer/token': 0.3.0 + + strtok3@9.1.1: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.4.2 + + sweet-scroll@4.0.0: {} + + symbol-tree@3.2.4: {} + + systeminformation@5.27.11: {} + + tar-fs@3.1.1: + dependencies: + pump: 3.0.3 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 4.5.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar-stream@3.1.7: + dependencies: + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + text-decoder@1.2.3: + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + + threads@1.7.0: + dependencies: + callsites: 3.1.0 + debug: 4.4.3 + is-observable: 2.1.0 + observable-fns: 0.6.1 + optionalDependencies: + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + tiny-worker@2.3.0: + dependencies: + esm: 3.2.25 + + toidentifier@1.0.1: {} + + token-types@6.1.1: + dependencies: + '@borewit/text-codec': 0.1.1 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@1.14.1: {} + + tslib@2.8.1: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.1 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + + turndown-plugin-gfm@1.0.2: {} + + turndown@7.2.2: + dependencies: + '@mixmark-io/domino': 2.2.0 + + type-fest@2.19.0: {} + + type-fest@4.41.0: {} + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typed-query-selector@2.12.0: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + uglify-js@3.19.3: {} + + uint8array-extras@1.5.0: {} + + undici-types@7.16.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + unload@2.4.1: {} + + unpipe@1.0.0: {} + + upper-case@1.1.3: {} + + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + + util-deprecate@1.0.2: {} + + uuid@9.0.1: {} + + vary@1.1.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + w3c-keyname@2.2.8: {} + + webdriver-bidi-protocol@0.3.9: {} + + webidl-conversions@7.0.0: {} + + whatwg-mimetype@3.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@5.0.0: + dependencies: + isexe: 3.1.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + ws@8.18.3: {} + + xmlhttprequest-ssl@2.1.2: {} + + xterm-addon-fit@0.8.0(xterm@5.3.0): + dependencies: + xterm: 5.3.0 + + xterm@5.3.0: {} + + y18n@5.0.8: {} + + yaml@2.8.2: {} + + yargs-parser@21.1.1: {} + + yargs-parser@22.0.0: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yauzl@3.2.0: + dependencies: + buffer-crc32: 0.2.13 + pend: 1.2.0 + + zod@3.25.76: {} + + zwitch@2.0.4: {} diff --git a/readme.hints.md b/readme.hints.md new file mode 100644 index 0000000..e69de29 diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..aa575d7 --- /dev/null +++ b/readme.md @@ -0,0 +1,1418 @@ +# @design.estate/dees-catalog + +A comprehensive web components library built with TypeScript and LitElement, providing **80+ production-ready UI components** for building modern web applications with consistent design and behavior. 🚀 + +[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/) +[![LitElement](https://img.shields.io/badge/LitElement-4.0+-orange.svg)](https://lit.dev/) + +## Issue Reporting and Security + +For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly. + +## ✨ Features + +- 🎨 **Consistent Design System** - Beautiful, cohesive components following modern UI/UX principles +- 🌙 **Dark/Light Theme Support** - All components automatically adapt to your theme +- ⌨️ **Keyboard Accessible** - Full keyboard navigation and ARIA support +- 📱 **Responsive** - Mobile-first design that works across all screen sizes +- 🔧 **TypeScript-First** - Fully typed APIs with excellent IDE support +- 🧩 **Modular** - Use only what you need, tree-shakeable architecture + +## 📦 Installation + +```bash +npm install @design.estate/dees-catalog +# or +pnpm add @design.estate/dees-catalog +``` + +## 🚀 Quick Start + +```typescript +import { html, DeesElement, customElement } from '@design.estate/dees-element'; +import '@design.estate/dees-catalog'; + +@customElement('my-app') +class MyApp extends DeesElement { + render() { + return html` + alert('Hello!')}> + Click me! + + `; + } +} +``` + +## 📖 Development Guide + +For developers working on this library, please refer to the [UI Components Playbook](readme.playbook.md) for comprehensive patterns, best practices, and architectural guidelines. + +## 📚 Components Overview + +| Category | Components | +|----------|------------| +| **Core UI** | [`DeesButton`](#deesbutton), [`DeesButtonExit`](#deesbuttonexit), [`DeesButtonGroup`](#deesbuttongroup), [`DeesBadge`](#deesbadge), [`DeesChips`](#deeschips), [`DeesHeading`](#deesheading), [`DeesHint`](#deeshint), [`DeesIcon`](#deesicon), [`DeesLabel`](#deeslabel), [`DeesPanel`](#deespanel), [`DeesSearchbar`](#deessearchbar), [`DeesSpinner`](#deesspinner), [`DeesToast`](#deestoast), [`DeesWindowcontrols`](#deeswindowcontrols) | +| **Forms** | [`DeesForm`](#deesform), [`DeesInputText`](#deesinputtext), [`DeesInputCheckbox`](#deesinputcheckbox), [`DeesInputDropdown`](#deesinputdropdown), [`DeesInputRadiogroup`](#deesinputradiogroup), [`DeesInputFileupload`](#deesinputfileupload), [`DeesInputIban`](#deesinputiban), [`DeesInputPhone`](#deesinputphone), [`DeesInputQuantitySelector`](#deesinputquantityselector), [`DeesInputMultitoggle`](#deesinputmultitoggle), [`DeesInputTags`](#deesinputtags), [`DeesInputTypelist`](#deesinputtypelist), [`DeesInputList`](#deesinputlist), [`DeesInputProfilepicture`](#deesinputprofilepicture), [`DeesInputRichtext`](#deesinputrichtext), [`DeesInputWysiwyg`](#deesinputwysiwyg), [`DeesInputDatepicker`](#deesinputdatepicker), [`DeesInputSearchselect`](#deesinputsearchselect), [`DeesFormSubmit`](#deesformsubmit) | +| **Layout** | [`DeesAppui`](#deesappui), [`DeesAppuiMainmenu`](#deesappuimainmenu), [`DeesAppuiSecondarymenu`](#deesappuisecondarymenu), [`DeesAppuiMaincontent`](#deesappuimaincontent), [`DeesAppuiAppbar`](#deesappuiappbar), [`DeesAppuiActivitylog`](#deesappuiactivitylog), [`DeesAppuiProfiledropdown`](#deesappuiprofiledropdown), [`DeesAppuiTabs`](#deesappuitabs), [`DeesMobileNavigation`](#deesmobilenavigation), [`DeesDashboardGrid`](#deesdashboardgrid) | +| **Data Display** | [`DeesTable`](#deestable), [`DeesDataviewCodebox`](#deesdataviewcodebox), [`DeesDataviewStatusobject`](#deesdataviewstatusobject), [`DeesPdf`](#deespdf), [`DeesStatsGrid`](#deesstatsgrid), [`DeesPagination`](#deespagination) | +| **Visualization** | [`DeesChartArea`](#deeschartarea), [`DeesChartLog`](#deeschartlog) | +| **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) | +| **Navigation** | [`DeesStepper`](#deesstepper), [`DeesProgressbar`](#deesprogressbar) | +| **Development** | [`DeesEditor`](#deeseditor), [`DeesEditorMarkdown`](#deeseditormarkdown), [`DeesEditorMarkdownoutlet`](#deeseditormarkdownoutlet), [`DeesTerminal`](#deesterminal), [`DeesUpdater`](#deesupdater) | +| **Theming** | [`DeesTheme`](#deestheme) | +| **Auth & Utilities** | [`DeesSimpleAppdash`](#deessimpleappdash), [`DeesSimpleLogin`](#deessimplelogin) | +| **Shopping** | [`DeesShoppingProductcard`](#deesshoppingproductcard) | + +--- + +## 🎯 Detailed Component Documentation + +### Core UI Components + +#### `DeesButton` +A versatile button component supporting multiple styles and states. + +```typescript +// Basic usage +const button = document.createElement('dees-button'); +button.text = 'Click me'; + +// With options +Click me +``` + +#### `DeesBadge` +Display status indicators or counts with customizable styles. + +```typescript + +``` + +#### `DeesChips` +Interactive chips/tags with selection capabilities. + +```typescript + +``` + +#### `DeesIcon` +Display icons from FontAwesome and Lucide icon libraries with library prefixes. + +```typescript +// FontAwesome icons - use 'fa:' prefix + + +// Lucide icons - use 'lucide:' prefix + + +// Legacy API (deprecated but still supported) + +``` + +#### `DeesLabel` +Text label component with optional icon and status indicators. + +```typescript + +``` + +#### `DeesSpinner` +Loading indicator with customizable appearance. + +```typescript + +``` + +#### `DeesToast` +Notification toast messages with various styles, positions, and auto-dismiss functionality. + +```typescript +// Programmatic usage +DeesToast.show({ + message: 'Operation successful', + type: 'success', // Options: info, success, warning, error + duration: 3000, // Time in milliseconds before auto-dismiss + position: 'top-right' // Options: top-right, top-left, bottom-right, bottom-left, top-center, bottom-center +}); + +// Convenience methods +DeesToast.info('Information message'); +DeesToast.success('Success message'); +DeesToast.warning('Warning message'); +DeesToast.error('Error message'); + +// Advanced control +const toast = await DeesToast.show({ + message: 'Processing...', + type: 'info', + duration: 0 // No auto-dismiss +}); + +// Later dismiss programmatically +toast.dismiss(); +``` + +**Key Features:** +- Multiple toast types with distinct icons and colors +- 6 position options for flexible placement +- Auto-dismiss with visual progress indicator +- Manual dismiss by clicking +- Smooth animations and transitions +- Automatic stacking of multiple toasts +- Theme-aware styling +- Programmatic control + +#### `DeesButtonExit` +Exit/close button component with consistent styling. + +```typescript + +``` + +#### `DeesButtonGroup` +Container for grouping related buttons together. + +```typescript + +``` + +#### `DeesHeading` +Consistent heading component with level and styling options. + +```typescript + +``` + +#### `DeesHint` +Hint/tooltip component for providing contextual help. + +```typescript + +``` + +#### `DeesPanel` +Container component for grouping related content with optional title and actions. + +```typescript + + + +``` + +#### `DeesSearchbar` +Search input component with suggestions and search handling. + +```typescript + +``` + +#### `DeesWindowcontrols` +Window control buttons (minimize, maximize, close) for desktop-like applications. + +```typescript + +``` + +--- + +### Form Components + +#### `DeesForm` +Container component for form elements with built-in validation and data handling. + +```typescript + handleFormData(e.detail)} // Emitted when form is submitted + @formValidation=${(e) => handleValidation(e.detail)} // Emitted during validation +> + + Submit + +``` + +#### `DeesInputText` +Text input field with validation and formatting options. + +```typescript + +``` + +#### `DeesInputCheckbox` +Checkbox input component for boolean values. + +```typescript + +``` + +#### `DeesInputDropdown` +Dropdown selection component with search and filtering capabilities. + +```typescript + +``` + +#### `DeesInputFileupload` +File upload component with drag-and-drop support. + +```typescript + +``` + +#### `DeesInputIban` +Specialized input for IBAN (International Bank Account Number) with validation. + +```typescript + +``` + +#### `DeesInputPhone` +Phone number input with country code selection and formatting. + +```typescript + +``` + +#### `DeesInputQuantitySelector` +Numeric input with increment/decrement controls. + +```typescript + +``` + +#### `DeesInputMultitoggle` +Multi-state toggle button group. + +```typescript + +``` + +#### `DeesInputRadiogroup` +Radio button group for single-choice selections with internal state management. + +```typescript + + +// With custom option objects + +``` + +#### `DeesInputTags` +Tag input component for managing lists of tags with auto-complete and validation. + +```typescript + +``` + +**Key Features:** +- Add tags by pressing Enter or typing comma/semicolon +- Remove tags with click or backspace +- Auto-complete suggestions with keyboard navigation +- Maximum tag limit support +- Full theme support +- Form validation integration + +#### `DeesInputTypelist` +Dynamic list input for managing arrays of typed values. + +```typescript + +``` + +#### `DeesInputList` +Advanced list input with drag-and-drop reordering, inline editing, and validation. + +```typescript + +``` + +**Key Features:** +- Add, edit, and remove items inline +- Drag-and-drop reordering with visual feedback +- Optional duplicate prevention +- Min/max item constraints +- Delete confirmation dialog +- Full keyboard support +- Form validation integration + +#### `DeesInputProfilepicture` +Profile picture input with cropping, zoom, and image processing. + +```typescript + +``` + +**Key Features:** +- Interactive cropping modal with zoom and pan +- Drag-and-drop file upload +- Round or square output shapes +- Configurable output size and quality +- File size and format validation +- Delete functionality +- Preview on hover + +#### `DeesInputDatepicker` +Date and time picker component with calendar interface and manual typing support. + +```typescript + +``` + +**Key Features:** +- Interactive calendar popup +- Manual date typing with multiple formats +- Optional time selection +- Configurable date format +- Min/max date constraints +- Disable specific dates +- Keyboard navigation +- Today button +- Clear functionality +- 12/24 hour time formats +- Theme-aware styling +- Live parsing and validation + +**Manual Input Formats:** +```typescript +// Date formats supported +"2023-12-20" // ISO format (YYYY-MM-DD) +"20.12.2023" // European format (DD.MM.YYYY) +"12/20/2023" // US format (MM/DD/YYYY) + +// Date with time (add space and time after any date format) +"2023-12-20 14:30" +"20.12.2023 9:45" +"12/20/2023 16:00" +``` + +#### `DeesInputSearchselect` +Search-enabled dropdown selection component. + +```typescript + +``` + +#### `DeesInputRichtext` +Rich text editor with formatting toolbar powered by TipTap. + +```typescript + +``` + +**Key Features:** +- Full formatting toolbar (bold, italic, underline, strike, etc.) +- Heading levels (H1-H6) +- Lists (bullet, ordered) +- Links with URL editing +- Code blocks and inline code +- Blockquotes +- Horizontal rules +- Undo/redo support +- Word and character count +- HTML output + +#### `DeesInputWysiwyg` +Advanced block-based editor with slash commands and rich content blocks. + +```typescript + +``` + +**Key Features:** +- Slash commands for quick formatting +- Block-based editing (paragraphs, headings, lists, etc.) +- Drag and drop block reordering +- Multiple output formats +- Keyboard shortcuts +- Collaborative editing ready +- Extensible block types + +#### `DeesFormSubmit` +Submit button component specifically designed for `DeesForm`. + +```typescript +Submit Form +``` + +--- + +### Layout Components + +#### `DeesAppui` +A comprehensive application shell component providing a complete UI framework with navigation, menus, activity logging, and view management. + +> **Full API Documentation**: See [ts_web/elements/00group-appui/dees-appui/readme.md](./ts_web/elements/00group-appui/dees-appui/readme.md) for complete documentation including all programmatic APIs, view lifecycle hooks, and TypeScript interfaces. + +**Quick Start:** + +```typescript +import { html, DeesElement, customElement } from '@design.estate/dees-element'; +import { DeesAppui } from '@design.estate/dees-catalog'; + +@customElement('my-app') +class MyApp extends DeesElement { + private appui: DeesAppui; + + async firstUpdated() { + this.appui = this.shadowRoot.querySelector('dees-appui'); + + // Configure with views and menu + this.appui.configure({ + branding: { logoIcon: 'lucide:box', logoText: 'My App' }, + views: [ + { id: 'dashboard', name: 'Dashboard', iconName: 'lucide:home', content: 'my-dashboard' }, + { id: 'settings', name: 'Settings', iconName: 'lucide:settings', content: 'my-settings' }, + ], + mainMenu: { + sections: [{ name: 'Main', views: ['dashboard', 'settings'] }] + }, + defaultView: 'dashboard' + }); + } + + render() { + return html``; + } +} +``` + +**Key Features:** +- **Configure API**: Single `configure()` method for complete app setup +- **View Management**: Automatic view caching, lazy loading, and lifecycle hooks +- **Programmatic APIs**: Full control over AppBar, Main Menu, Secondary Menu, Content Tabs, and Activity Log +- **View Lifecycle Hooks**: `onActivate()`, `onDeactivate()`, and `canDeactivate()` for view components +- **Hash-based Routing**: Automatic URL synchronization with view navigation +- **RxJS Observables**: `viewChanged$` and `viewLifecycle$` for reactive programming +- **TypeScript-first**: Typed `IViewActivationContext` passed to views on activation +- **Activity Log Toggle**: Built-in appbar button to show/hide activity panel with entry count badge + +**Programmatic APIs include:** +- `navigateToView(viewId, params?)` - Navigate between views +- `setAppBarMenus()`, `setBreadcrumbs()`, `setUser()` - Control the app bar +- `setMainMenu()`, `setMainMenuSelection()`, `setMainMenuBadge()` - Control main navigation +- `setMainMenuCollapsed()`, `setMainMenuVisible()` - Control main menu visibility +- `setSecondaryMenu()`, `setSecondaryMenuCollapsed()`, `setSecondaryMenuVisible()` - Control secondary menu +- `setContentTabs()`, `setContentTabsVisible()` - Control view-specific UI +- `activityLog.add()`, `activityLog.addMany()`, `activityLog.clear()` - Manage activity entries +- `setActivityLogVisible()`, `toggleActivityLog()`, `getActivityLogVisible()` - Control activity panel + +**View Visibility Control:** +```typescript +// In your view's onActivate hook +onActivate(context: IViewActivationContext) { + // Hide secondary menu for a fullscreen view + context.appui.setSecondaryMenuVisible(false); + + // Hide content tabs + context.appui.setContentTabsVisible(false); + + // Collapse main menu to give more space + context.appui.setMainMenuCollapsed(true); +} +``` + +#### `DeesAppuiMainmenu` +Main navigation menu component for application-wide navigation. + +```typescript + navigate('dashboard') }, + { key: 'settings', iconName: 'lucide:settings', action: () => navigate('settings') } + ] + } + ]} + collapsed // Optional: show collapsed version +> +``` + +#### `DeesAppuiSecondarymenu` +Secondary navigation component for sub-section selection with collapsible groups and badges. + +```typescript + select('frontend'), badge: 3, badgeVariant: 'warning' }, + { key: 'API Server', iconName: 'lucide:server', action: () => select('api') } + ] + } + ]} + @item-select=${handleSectionChange} +> +``` + +#### `DeesAppuiMaincontent` +Main content area with tab management support. + +```typescript + selectTab('overview') }, + { key: 'Details', iconName: 'lucide:info', action: () => selectTab('details') } + ]} + @tab-select=${handleTabChange} +> + + +``` + +#### `DeesAppuiAppbar` +Professional application bar component with hierarchical menus, breadcrumb navigation, user account management, and activity log toggle. + +```typescript + {}, // No-op for parent menu items + submenu: [ + { + name: 'New File', + shortcut: 'Cmd+N', + iconName: 'file-plus', + action: async () => handleNewFile() + }, + { + name: 'Open...', + shortcut: 'Cmd+O', + iconName: 'folder-open', + action: async () => handleOpen() + }, + { divider: true }, // Menu separator + { + name: 'Save', + shortcut: 'Cmd+S', + iconName: 'save', + action: async () => handleSave(), + disabled: true // Disabled state + } + ] + } + ]} + .breadcrumbs=${'Project > src > components'} + .showWindowControls=${true} + .showSearch=${true} + .showActivityLogToggle=${true} + .activityLogCount=${5} + .activityLogActive=${false} + .user=${{ + name: 'John Doe', + avatar: '/path/to/avatar.jpg', + status: 'online' // Options: 'online' | 'offline' | 'busy' | 'away' + }} + @menu-select=${(e) => handleMenuSelect(e.detail.item)} + @breadcrumb-navigate=${(e) => handleBreadcrumbClick(e.detail)} + @activity-toggle=${() => handleActivityToggle()} +> +``` + +**Key Features:** +- **Hierarchical Menu System** - Top-level menus with dropdown submenus, icons, and keyboard shortcuts +- **Keyboard Navigation** - Full keyboard support (Tab, Arrow keys, Enter, Escape) +- **Breadcrumb Navigation** - Customizable breadcrumb trail with click events +- **User Account Section** - Avatar with status indicator and profile dropdown +- **Activity Log Toggle** - Button with badge count to show/hide activity panel +- **Accessibility** - Full ARIA support with menubar roles + +#### `DeesAppuiActivitylog` +Real-time activity log panel for displaying user actions and system events. + +```typescript + + +// Programmatic API +activityLog.add({ + type: 'update', // Options: login, logout, view, create, update, delete, custom + user: 'John Doe', + message: 'Updated project settings', + iconName: 'lucide:settings' // Optional: custom icon +}); + +activityLog.addMany(entries); // Add multiple entries +activityLog.clear(); // Clear all entries +activityLog.getEntries(); // Get all entries +activityLog.filter({ user: 'John' }); // Filter by user/type +activityLog.search('settings'); // Search by message +``` + +**Key Features:** +- Stacked entry layout with icon, user, timestamp, and message +- Date grouping (Today, Yesterday, etc.) +- Search and filter functionality +- Context menu for entry actions +- Live streaming indicator +- Animated slide-in/out panel +- Theme-aware styling + +#### `DeesAppuiTabs` +Reusable tab component with horizontal/vertical layout support. + +```typescript + console.log('Home') }, + { key: 'Settings', iconName: 'lucide:settings', action: () => console.log('Settings') } + ]} + tabStyle="horizontal" // Options: horizontal, vertical + showTabIndicator={true} + @tab-select=${handleTabSelect} +> +``` + +--- + +### Data Display Components + +#### `DeesTable` +Advanced table component with sorting, filtering, and action support. + +```typescript + ({ + name: item.name, + date: item.date, + amount: item.amount, + description: item.description + })} + .dataActions=${[ + { + name: 'Edit', + icon: 'edit', + action: (item) => handleEdit(item) + }, + { + name: 'Delete', + icon: 'trash', + action: (item) => handleDelete(item) + } + ]} + heading1="Transactions" + heading2="Recent Activity" + searchable // Enable search functionality + dataName="transaction" // Name for single data item + @selection-change=${handleSelectionChange} +> +``` + +**Advanced Features:** +- Schema-first columns or `displayFunction` rendering +- Sorting via header clicks with `aria-sort` + `sortChange` +- Global search with Lucene-like syntax; modes: `table`, `data`, `server` +- Per-column quick filters row; `showColumnFilters` and `column.filterable=false` +- Selection: `none` | `single` | `multi`, with select-all and `selectionChange` +- Sticky header + internal scroll (`stickyHeader`, `--table-max-height`) +- Rich actions: header/in-row/contextmenu/footer/doubleClick; pinned Actions column +- Editable cells via `editableFields` +- Drag & drop files onto rows + +#### `DeesDataviewCodebox` +Code display component with syntax highlighting and line numbers. + +```typescript + { + return html\`
Hello World
\`; + }; + `} +>
+``` + +#### `DeesDataviewStatusobject` +Status display component for complex objects with nested status indicators. + +```typescript + +``` + +#### `DeesPdf` +PDF viewer component with navigation and zoom controls. + +```typescript + +``` + +#### `DeesStatsGrid` +A responsive grid component for displaying statistical data with various visualization types. + +```typescript + +``` + +#### `DeesPagination` +Pagination component for navigating through large datasets. + +```typescript + +``` + +--- + +### Visualization Components + +#### `DeesChartArea` +Area chart component built on ApexCharts for visualizing time-series data. + +```typescript + +``` + +#### `DeesChartLog` +Specialized chart component for visualizing log data and events. + +```typescript + +``` + +--- + +### Dialogs & Overlays Components + +#### `DeesModal` +Modal dialog component with customizable content and actions. + +```typescript +// Programmatic usage +DeesModal.createAndShow({ + heading: 'Confirm Action', + content: html` + + + + `, + menuOptions: [ + { name: 'Cancel', action: async (modal) => { modal.destroy(); return null; } }, + { name: 'Confirm', action: async (modal) => { /* handle */ modal.destroy(); return null; } } + ] +}); +``` + +#### `DeesContextmenu` +Context menu component for right-click actions. + +```typescript + handleEdit() }, + { label: 'Delete', icon: 'trash', action: () => handleDelete() } + ]} + position="right" +> +``` + +#### `DeesSpeechbubble` +Tooltip-style speech bubble component for contextual information. + +```typescript +// Programmatic usage +const bubble = await DeesSpeechbubble.createAndShow( + referenceElement, + 'Helpful information about this feature' +); +``` + +#### `DeesWindowlayer` +Base overlay component used by modal dialogs and other overlay components. + +```typescript +const layer = await DeesWindowLayer.createAndShow({ + blur: true, +}); +``` + +--- + +### Navigation Components + +#### `DeesStepper` +Multi-step navigation component for guided user flows. + +```typescript +Form 1` }, + { key: 'address', label: 'Address', content: html`
Form 2
` }, + { key: 'confirm', label: 'Confirmation', content: html`
Review
` } + ]} + currentStep="personal" + @step-change=${handleStepChange} + @complete=${handleComplete} +>
+``` + +#### `DeesProgressbar` +Progress indicator component for tracking completion status. + +```typescript + +``` + +--- + +### Theming Components + +#### `DeesTheme` +Theme provider component that wraps children and provides CSS custom properties for consistent theming. + +```typescript +// Basic usage - wrap your app + + + + +// With custom overrides + + + +``` + +**Key Features:** +- Provides CSS custom properties for colors, spacing, radius, shadows, and transitions +- Can be nested for section-specific theming +- Works with dark/light mode +- Overrides cascade to all child components + +--- + +### Development Components + +#### `DeesEditor` +Code editor component with syntax highlighting and code completion, powered by Monaco Editor. + +```typescript + +``` + +#### `DeesEditorMarkdown` +Markdown editor component with live preview. + +```typescript + +``` + +#### `DeesEditorMarkdownoutlet` +Markdown preview component for rendering markdown content. + +```typescript + +``` + +#### `DeesTerminal` +Terminal emulator component for command-line interface. + +```typescript + `Echo: ${args.join(' ')}`, + 'help': () => 'Available commands: echo, help' + }} + .prompt=${'$'} + .welcomeMessage=${'Welcome! Type "help" for available commands.'} +> +``` + +#### `DeesUpdater` +Component for managing application updates and version control. + +```typescript + +``` + +--- + +### Auth & Utilities Components + +#### `DeesSimpleAppdash` +Simple application dashboard component for quick prototyping. + +```typescript + + + +``` + +#### `DeesSimpleLogin` +Simple login form component with validation and customization. + +```typescript + +``` + +--- + +### Shopping Components + +#### `DeesShoppingProductcard` +Product card component for e-commerce applications. + +```typescript + +``` + +--- + +## 🔧 TypeScript Interfaces + +The library exports unified interfaces for consistent API patterns: + +```typescript +// Base menu item interface (used by tabs, menus, etc.) +interface IMenuItem { + key: string; + iconName?: string; + action: () => void; + badge?: string | number; + badgeVariant?: 'default' | 'success' | 'warning' | 'error'; +} + +// Menu group interface for organized menus +interface IMenuGroup { + name: string; + items: IMenuItem[]; + collapsed?: boolean; + iconName?: string; +} + +// View definition for app navigation +interface IViewDefinition { + id: string; + name: string; + iconName?: string; + content: string | HTMLElement | (() => TemplateResult); + secondaryMenu?: ISecondaryMenuGroup[]; + contentTabs?: IMenuItem[]; + route?: string; + badge?: string | number; +} + +// Activity log entry +interface IActivityEntry { + id?: string; + timestamp?: Date; + type: 'login' | 'logout' | 'view' | 'create' | 'update' | 'delete' | 'custom'; + user: string; + message: string; + iconName?: string; + data?: Record; +} +``` + +--- + +## License and Legal Information + +This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./LICENSE) file. + +**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file. + +### Trademarks + +This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein. + +Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar. + +### Company Information + +Task Venture Capital GmbH +Registered at District Court Bremen HRB 35230 HB, Germany + +For any legal inquiries or further information, please contact us via email at hello@task.vc. + +By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works. diff --git a/readme.playbook.md b/readme.playbook.md new file mode 100644 index 0000000..0d4cd47 --- /dev/null +++ b/readme.playbook.md @@ -0,0 +1,784 @@ +# UI Components Playbook + +This playbook provides comprehensive guidance for creating and maintaining UI components in the @design.estate/dees-catalog library. Follow these patterns and best practices to ensure consistency, maintainability, and quality. + +## Table of Contents + +1. [Component Creation Checklist](#component-creation-checklist) +2. [Architectural Patterns](#architectural-patterns) +3. [Component Types and Base Classes](#component-types-and-base-classes) +4. [Theming System](#theming-system) +5. [Event Handling](#event-handling) +6. [State Management](#state-management) +7. [Form Components](#form-components) +8. [Overlay Components](#overlay-components) +9. [Complex Components](#complex-components) +10. [Performance Optimization](#performance-optimization) +11. [Focus Management](#focus-management) +12. [Demo System](#demo-system) +13. [Common Pitfalls and Anti-patterns](#common-pitfalls-and-anti-patterns) +14. [Code Examples](#code-examples) + +## Component Creation Checklist + +When creating a new component, follow this checklist: + +- [ ] Choose the appropriate base class (`DeesElement` or `DeesInputBase`) +- [ ] Use `@customElement('dees-componentname')` decorator +- [ ] Implement consistent theming with `cssManager.bdTheme()` +- [ ] Create demo function in separate `.demo.ts` file +- [ ] Export component from `ts_web/elements/index.ts` +- [ ] Use proper TypeScript types and interfaces (prefix with `I` for interfaces, `T` for types) +- [ ] Implement proper event handling with bubbling and composition +- [ ] Consider mobile responsiveness +- [ ] Add focus states for accessibility +- [ ] Clean up resources in `destroy()` method +- [ ] Follow lowercase naming convention for files +- [ ] Add z-index registry support if it's an overlay component + +## Architectural Patterns + +### Base Component Structure + +```typescript +import { customElement, property, state, css, TemplateResult, html } from '@design.estate/dees-element'; +import { DeesElement } from '@design.estate/dees-element'; +import * as cssManager from './00colors.js'; +import * as demoFunc from './dees-componentname.demo.js'; + +@customElement('dees-componentname') +export class DeesComponentName extends DeesElement { + // Static demo reference + public static demo = demoFunc.demoFunc; + + // Public properties (reactive, can be set via attributes) + @property({ type: String }) + public label: string = ''; + + @property({ type: Boolean, reflect: true }) + public disabled: boolean = false; + + // Internal state (reactive, but not exposed as attributes) + @state() + private internalState: string = ''; + + // Static styles with theme support + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + background: ${cssManager.bdTheme('#ffffff', '#09090b')}; + } + ` + ]; + + // Render method + public render(): TemplateResult { + return html` +
+ +
+ `; + } + + // Lifecycle methods + public connectedCallback() { + super.connectedCallback(); + // Setup that needs DOM access + } + + public async firstUpdated() { + // One-time initialization after first render + } + + // Cleanup + public destroy() { + // Clean up listeners, observers, registrations + super.destroy(); + } +} +``` + +### Advanced Patterns + +#### 1. Separation of Concerns (Complex Components) + +For complex components like WYSIWYG editors, separate concerns into handler classes: + +```typescript +export class DeesComplexComponent extends DeesElement { + // Orchestrator pattern - main component coordinates handlers + private inputHandler: InputHandler; + private stateHandler: StateHandler; + private renderHandler: RenderHandler; + + constructor() { + super(); + this.inputHandler = new InputHandler(this); + this.stateHandler = new StateHandler(this); + this.renderHandler = new RenderHandler(this); + } +} +``` + +#### 2. Singleton Pattern (Global Components) + +For global UI elements like menus: + +```typescript +export class DeesGlobalMenu extends DeesElement { + private static instance: DeesGlobalMenu; + + public static getInstance(): DeesGlobalMenu { + if (!DeesGlobalMenu.instance) { + DeesGlobalMenu.instance = new DeesGlobalMenu(); + document.body.appendChild(DeesGlobalMenu.instance); + } + return DeesGlobalMenu.instance; + } +} +``` + +#### 3. Registry Pattern (Z-Index Management) + +Use centralized registries for global state: + +```typescript +class ComponentRegistry { + private static instance: ComponentRegistry; + private registry = new WeakMap(); + + public register(element: HTMLElement, value: number) { + this.registry.set(element, value); + } + + public unregister(element: HTMLElement) { + this.registry.delete(element); + } +} +``` + +## Component Types and Base Classes + +### Standard Component (extends DeesElement) + +Use for most UI components: +- Buttons, badges, icons +- Layout components +- Data display components +- Overlay components + +### Form Input Component (extends DeesInputBase) + +Use for all form inputs: +- Text inputs, dropdowns, checkboxes +- Date pickers, file uploads +- Rich text editors + +**Required implementations:** +```typescript +export class DeesInputCustom extends DeesInputBase { + // Required: Get current value + public getValue(): ValueType { + return this.value; + } + + // Required: Set value programmatically + public setValue(value: ValueType): void { + this.value = value; + this.changeSubject.next(this); // Notify form + } + + // Optional: Custom validation + public async validate(): Promise { + // Custom validation logic + return true; + } +} +``` + +## Theming System + +### DO: Use Theme Functions + +Always use `cssManager.bdTheme()` for colors that change between themes: + +```typescript +// ✅ CORRECT +background: ${cssManager.bdTheme('#ffffff', '#09090b')}; +color: ${cssManager.bdTheme('#000000', '#ffffff')}; +border: 1px solid ${cssManager.bdTheme('#e5e5e5', '#333333')}; + +// ❌ INCORRECT +background: #ffffff; // Hard-coded color +color: var(--custom-color); // Custom CSS variable +``` + +### DO: Use Consistent Color Values + +Reference shared color constants when possible: + +```typescript +// From 00colors.ts +background: ${cssManager.bdTheme(colors.bright.background, colors.dark.background)}; +``` + +## Event Handling + +### DO: Dispatch Custom Events Properly + +```typescript +// ✅ CORRECT - Events bubble and cross shadow DOM +this.dispatchEvent(new CustomEvent('dees-componentname-change', { + detail: { value: this.value }, + bubbles: true, + composed: true +})); + +// ❌ INCORRECT - Event won't propagate properly +this.dispatchEvent(new CustomEvent('change', { + detail: { value: this.value } + // Missing bubbles and composed +})); +``` + +### DO: Use Event Delegation + +For dynamic content, use event delegation: + +```typescript +// ✅ CORRECT - Single listener for all items +this.addEventListener('click', (e: MouseEvent) => { + const item = (e.target as HTMLElement).closest('.item'); + if (item) { + this.handleItemClick(item); + } +}); + +// ❌ INCORRECT - Multiple listeners +this.items.forEach(item => { + item.addEventListener('click', () => this.handleItemClick(item)); +}); +``` + +## State Management + +### DO: Use Appropriate Property Decorators + +```typescript +// Public API - use @property +@property({ type: String }) +public label: string; + +// Internal state - use @state +@state() +private isLoading: boolean = false; + +// Reflect to attribute when needed +@property({ type: Boolean, reflect: true }) +public disabled: boolean = false; +``` + +### DON'T: Manipulate State in Render + +```typescript +// ❌ INCORRECT - Side effects in render +public render() { + this.counter++; // Don't modify state + return html`
${this.counter}
`; +} + +// ✅ CORRECT - Pure render function +public render() { + return html`
${this.counter}
`; +} +``` + +## Form Components + +### DO: Extend DeesInputBase + +All form inputs must extend the base class: + +```typescript +export class DeesInputNew extends DeesInputBase { + // Inherits: key, label, value, required, disabled, validationState +} +``` + +### DO: Emit Changes Consistently + +```typescript +private handleInput(e: Event) { + this.value = (e.target as HTMLInputElement).value; + this.changeSubject.next(this); // Notify form system +} +``` + +### DO: Support Standard Form Properties + +```typescript +// All form inputs should support: +@property() public key: string; +@property() public label: string; +@property() public required: boolean = false; +@property() public disabled: boolean = false; +@property() public validationState: 'valid' | 'warn' | 'invalid'; +``` + +## Overlay Components + +### DO: Use Z-Index Registry + +Never hardcode z-index values: + +```typescript +// ✅ CORRECT +import { zIndexRegistry } from './00zindex.js'; + +public async show() { + this.modalZIndex = zIndexRegistry.getNextZIndex(); + zIndexRegistry.register(this, this.modalZIndex); + this.style.zIndex = `${this.modalZIndex}`; +} + +public async hide() { + zIndexRegistry.unregister(this); +} + +// ❌ INCORRECT +public async show() { + this.style.zIndex = '9999'; // Hardcoded z-index +} +``` + +### DO: Use Window Layers + +For modal backdrops: + +```typescript +import { DeesWindowLayer } from './dees-windowlayer.js'; + +private windowLayer: DeesWindowLayer; + +public async show() { + this.windowLayer = new DeesWindowLayer(); + this.windowLayer.zIndex = zIndexRegistry.getNextZIndex(); + document.body.append(this.windowLayer); +} +``` + +## Complex Components + +### DO: Use Handler Classes + +For complex logic, separate into specialized handlers: + +```typescript +// wysiwyg/handlers/input.handler.ts +export class InputHandler { + constructor(private component: DeesInputWysiwyg) {} + + public handleInput(event: InputEvent) { + // Specialized input handling + } +} + +// Main component orchestrates +export class DeesInputWysiwyg extends DeesInputBase { + private inputHandler = new InputHandler(this); +} +``` + +### DO: Use Programmatic Rendering + +For performance-critical updates that shouldn't trigger re-renders: + +```typescript +// ✅ CORRECT - Direct DOM manipulation when needed +private updateBlockContent(blockId: string, content: string) { + const blockElement = this.shadowRoot.querySelector(`#${blockId}`); + if (blockElement) { + blockElement.textContent = content; // Direct update + } +} + +// ❌ INCORRECT - Triggering full re-render +private updateBlockContent(blockId: string, content: string) { + this.blocks.find(b => b.id === blockId).content = content; + this.requestUpdate(); // Unnecessary re-render +} +``` + +## Performance Optimization + +### DO: Debounce Expensive Operations + +```typescript +private resizeTimeout: number; + +private handleResize = () => { + clearTimeout(this.resizeTimeout); + this.resizeTimeout = window.setTimeout(() => { + this.updateLayout(); + }, 250); +}; +``` + +### DO: Use Observers Efficiently + +```typescript +// Clean up observers +public disconnectedCallback() { + super.disconnectedCallback(); + this.resizeObserver?.disconnect(); + this.mutationObserver?.disconnect(); +} +``` + +### DO: Implement Virtual Scrolling + +For large lists: + +```typescript +// Only render visible items +private getVisibleItems() { + const scrollTop = this.scrollContainer.scrollTop; + const containerHeight = this.scrollContainer.clientHeight; + const itemHeight = 50; + + const startIndex = Math.floor(scrollTop / itemHeight); + const endIndex = Math.ceil((scrollTop + containerHeight) / itemHeight); + + return this.items.slice(startIndex, endIndex); +} +``` + +## Focus Management + +### DO: Handle Focus Timing + +```typescript +// ✅ CORRECT - Wait for render +async focusInput() { + await this.updateComplete; + await new Promise(resolve => requestAnimationFrame(resolve)); + this.inputElement?.focus(); +} + +// ❌ INCORRECT - Focus too early +focusInput() { + this.inputElement?.focus(); // Element might not exist +} +``` + +### DO: Prevent Focus Loss + +```typescript +// For global menus +constructor() { + super(); + // Prevent focus loss when clicking menu + this.addEventListener('mousedown', (e) => { + e.preventDefault(); + }); +} +``` + +### DO: Implement Blur Debouncing + +```typescript +private blurTimeout: number; + +private handleBlur = () => { + clearTimeout(this.blurTimeout); + this.blurTimeout = window.setTimeout(() => { + // Check if truly blurred + if (!this.contains(document.activeElement)) { + this.handleTrueBlur(); + } + }, 100); +}; +``` + +## Demo System + +### DO: Create Comprehensive Demos + +Every component needs a demo: + +```typescript +// dees-button.demo.ts +import { html } from '@design.estate/dees-element'; + +export const demoFunc = () => html` + Default Button + Primary Button + Disabled Danger +`; + +// In component file +import * as demoFunc from './dees-button.demo.js'; + +export class DeesButton extends DeesElement { + public static demo = demoFunc.demoFunc; +} +``` + +### DO: Include All Variants + +Show all component states and variations in demos: +- Default state +- Different types/variants +- Disabled state +- Loading state +- Error states +- Edge cases (long text, empty content) + +## Common Pitfalls and Anti-patterns + +### ❌ DON'T: Hardcode Z-Index Values + +```typescript +// ❌ WRONG +this.style.zIndex = '9999'; + +// ✅ CORRECT +this.style.zIndex = `${zIndexRegistry.getNextZIndex()}`; +``` + +### ❌ DON'T: Skip Base Classes + +```typescript +// ❌ WRONG - Form input without base class +export class DeesInputCustom extends DeesElement { + // Missing standard form functionality +} + +// ✅ CORRECT +export class DeesInputCustom extends DeesInputBase { + // Inherits all form functionality +} +``` + +### ❌ DON'T: Forget Theme Support + +```typescript +// ❌ WRONG +background-color: #ffffff; +color: #000000; + +// ✅ CORRECT +background-color: ${cssManager.bdTheme('#ffffff', '#09090b')}; +color: ${cssManager.bdTheme('#000000', '#ffffff')}; +``` + +### ❌ DON'T: Create Components Without Demos + +```typescript +// ❌ WRONG +export class DeesComponent extends DeesElement { + // No demo property +} + +// ✅ CORRECT +export class DeesComponent extends DeesElement { + public static demo = demoFunc.demoFunc; +} +``` + +### ❌ DON'T: Emit Non-Bubbling Events + +```typescript +// ❌ WRONG +this.dispatchEvent(new CustomEvent('change', { + detail: this.value +})); + +// ✅ CORRECT +this.dispatchEvent(new CustomEvent('change', { + detail: this.value, + bubbles: true, + composed: true +})); +``` + +### ❌ DON'T: Skip Cleanup + +```typescript +// ❌ WRONG +public connectedCallback() { + window.addEventListener('resize', this.handleResize); +} + +// ✅ CORRECT +public connectedCallback() { + super.connectedCallback(); + window.addEventListener('resize', this.handleResize); +} + +public disconnectedCallback() { + super.disconnectedCallback(); + window.removeEventListener('resize', this.handleResize); +} +``` + +### ❌ DON'T: Use Inline Styles for Theming + +```typescript +// ❌ WRONG +
+ +// ✅ CORRECT +
+// In styles: +.themed-container { + background-color: ${cssManager.bdTheme('#ffffff', '#000000')}; +} +``` + +### ❌ DON'T: Forget Mobile Responsiveness + +```typescript +// ❌ WRONG +:host { + width: 800px; // Fixed width +} + +// ✅ CORRECT +:host { + width: 100%; + max-width: 800px; +} + +@media (max-width: 768px) { + :host { + /* Mobile adjustments */ + } +} +``` + +## Code Examples + +### Example: Creating a New Button Variant + +```typescript +// dees-special-button.ts +import { customElement, property, css, html } from '@design.estate/dees-element'; +import { DeesElement } from '@design.estate/dees-element'; +import * as cssManager from './00colors.js'; +import * as demoFunc from './dees-special-button.demo.js'; + +@customElement('dees-special-button') +export class DeesSpecialButton extends DeesElement { + public static demo = demoFunc.demoFunc; + + @property({ type: String }) + public text: string = 'Click me'; + + @property({ type: Boolean, reflect: true }) + public loading: boolean = false; + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: inline-block; + } + + .button { + padding: 8px 16px; + background: ${cssManager.bdTheme('#0066ff', '#0044cc')}; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s; + } + + .button:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px ${cssManager.bdTheme('rgba(0,0,0,0.1)', 'rgba(0,0,0,0.3)')}; + } + + :host([loading]) .button { + opacity: 0.7; + cursor: not-allowed; + } + ` + ]; + + public render() { + return html` + + `; + } + + private handleClick() { + this.dispatchEvent(new CustomEvent('special-click', { + bubbles: true, + composed: true + })); + } +} +``` + +### Example: Creating a Form Input + +```typescript +// dees-input-special.ts +export class DeesInputSpecial extends DeesInputBase { + public static demo = demoFunc.demoFunc; + + public render() { + return html` + + + + `; + } + + private handleInput(e: Event) { + this.value = (e.target as HTMLInputElement).value; + this.changeSubject.next(this); + } + + private handleBlur() { + this.dispatchEvent(new CustomEvent('blur', { + bubbles: true, + composed: true + })); + } + + public getValue(): string { + return this.value; + } + + public setValue(value: string): void { + this.value = value; + this.changeSubject.next(this); + } +} +``` + +## Summary + +This playbook represents the collective wisdom and patterns found in the @design.estate/dees-catalog component library. Following these guidelines will help you create components that are: + +- **Consistent**: Following established patterns +- **Maintainable**: Easy to understand and modify +- **Performant**: Optimized for real-world use +- **Accessible**: Usable by everyone +- **Theme-aware**: Supporting light and dark modes +- **Well-integrated**: Working seamlessly with the component ecosystem + +Remember: When in doubt, look at existing components for examples. The codebase itself is the best documentation of these patterns in action. \ No newline at end of file diff --git a/scripts/update-monaco-version.cjs b/scripts/update-monaco-version.cjs new file mode 100755 index 0000000..6c67c8c --- /dev/null +++ b/scripts/update-monaco-version.cjs @@ -0,0 +1,44 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const projectRoot = path.resolve(__dirname, '..'); + +function resolveMonacoPackageJson() { + try { + const resolvedPath = require.resolve('monaco-editor/package.json', { + paths: [projectRoot], + }); + return resolvedPath; + } catch (error) { + console.error('[dees-workspace] Unable to resolve monaco-editor/package.json'); + throw error; + } +} + +function getMonacoVersion() { + const monacoPackagePath = resolveMonacoPackageJson(); + const monacoPackage = require(monacoPackagePath); + if (!monacoPackage.version) { + throw new Error('[dees-workspace] monaco-editor/package.json does not expose a version field'); + } + return monacoPackage.version; +} + +function writeVersionModule(version) { + const targetDir = path.join(projectRoot, 'ts_web', 'elements', '00group-workspace', 'dees-workspace-monaco'); + fs.mkdirSync(targetDir, { recursive: true }); + const targetFile = path.join(targetDir, 'version.ts'); + const fileContent = `// Auto-generated by scripts/update-monaco-version.cjs\nexport const MONACO_VERSION = '${version}';\n`; + fs.writeFileSync(targetFile, fileContent, 'utf8'); + console.log(`[dees-workspace] Wrote ${path.relative(projectRoot, targetFile)} with monaco-editor@${version}`); +} + +try { + const version = getMonacoVersion(); + writeVersionModule(version); +} catch (error) { + console.error('[dees-workspace] Failed to update Monaco version module.'); + console.error(error instanceof Error ? error.message : error); + process.exitCode = 1; +} diff --git a/test/test.chromium.ts b/test/test.chromium.ts new file mode 100644 index 0000000..082cf4d --- /dev/null +++ b/test/test.chromium.ts @@ -0,0 +1,12 @@ +import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; + +import * as deesCatalog from '../ts_web/index.js'; + +tap.test('should create a working button', async () => { + const button: deesCatalog.DeesButton = await webhelpers.fixture( + webhelpers.html`` + ); + expect(button).toBeInstanceOf(deesCatalog.DeesButton); +}); + +export default tap.start(); diff --git a/test/test.contextmenu-demo.chromium.ts b/test/test.contextmenu-demo.chromium.ts new file mode 100644 index 0000000..7a362aa --- /dev/null +++ b/test/test.contextmenu-demo.chromium.ts @@ -0,0 +1,35 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; +import { demoFunc } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.demo.js'; + +tap.test('should render context menu demo', async () => { + // Create demo container + const demoContainer = document.createElement('div'); + document.body.appendChild(demoContainer); + + // Render the demo + const demoContent = demoFunc(); + + // Create a temporary element to hold the rendered template + const tempDiv = document.createElement('div'); + tempDiv.innerHTML = demoContent.strings.join(''); + + // Check that panels are rendered + const panels = tempDiv.querySelectorAll('dees-panel'); + expect(panels.length).toEqual(4); + + // Check panel headings + expect(panels[0].getAttribute('heading')).toEqual('Basic Context Menu with Nested Submenus'); + expect(panels[1].getAttribute('heading')).toEqual('Component-Specific Context Menu'); + expect(panels[2].getAttribute('heading')).toEqual('Advanced Context Menu Example'); + expect(panels[3].getAttribute('heading')).toEqual('Static Context Menu (Always Visible)'); + + // Check that static context menu exists + const staticMenu = tempDiv.querySelector('dees-contextmenu'); + expect(staticMenu).toBeTruthy(); + + // Clean up + demoContainer.remove(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.contextmenu-nested-close.chromium.ts b/test/test.contextmenu-nested-close.chromium.ts new file mode 100644 index 0000000..d93ab6c --- /dev/null +++ b/test/test.contextmenu-nested-close.chromium.ts @@ -0,0 +1,93 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; + +tap.test('should close all parent menus when clicking action in nested submenu', async () => { + let actionCalled = false; + + // Create a test element + const testDiv = document.createElement('div'); + testDiv.style.width = '300px'; + testDiv.style.height = '300px'; + testDiv.style.background = '#f0f0f0'; + testDiv.innerHTML = 'Right-click for nested menu test'; + document.body.appendChild(testDiv); + + // Simulate right-click to open context menu + const contextMenuEvent = new MouseEvent('contextmenu', { + clientX: 150, + clientY: 150, + bubbles: true, + cancelable: true + }); + + // Open context menu with nested structure + DeesContextmenu.openContextMenuWithOptions(contextMenuEvent, [ + { + name: 'Parent Item', + iconName: 'folder', + action: async () => {}, // Parent items with submenus need an action + submenu: [ + { + name: 'Child Item', + iconName: 'file', + action: async () => { + actionCalled = true; + console.log('Child action called'); + } + }, + { + name: 'Another Child', + iconName: 'fileText', + action: async () => console.log('Another child') + } + ] + }, + { + name: 'Regular Item', + iconName: 'box', + action: async () => console.log('Regular item') + } + ]); + + // Wait for main menu to appear + await new Promise(resolve => setTimeout(resolve, 150)); + + // Check main menu exists + const mainMenu = document.querySelector('dees-contextmenu'); + expect(mainMenu).toBeInstanceOf(DeesContextmenu); + + // Hover over "Parent Item" to trigger submenu + const parentItem = mainMenu!.shadowRoot!.querySelector('.menuitem'); + expect(parentItem).toBeTruthy(); + parentItem!.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); + + // Wait for submenu to appear + await new Promise(resolve => setTimeout(resolve, 300)); + + // Check submenu exists + const allMenus = document.querySelectorAll('dees-contextmenu'); + expect(allMenus.length).toEqual(2); // Main menu and submenu + + const submenu = allMenus[1]; + expect(submenu).toBeTruthy(); + + // Click on "Child Item" in submenu + const childItem = submenu.shadowRoot!.querySelector('.menuitem'); + expect(childItem).toBeTruthy(); + childItem!.click(); + + // Wait for menus to close (windowLayer destruction takes 300ms + context menu 100ms) + await new Promise(resolve => setTimeout(resolve, 600)); + + // Verify action was called + expect(actionCalled).toEqual(true); + + // Verify all menus are closed + const remainingMenus = document.querySelectorAll('dees-contextmenu'); + expect(remainingMenus.length).toEqual(0); + + // Clean up + testDiv.remove(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.contextmenu-shadowdom.chromium.ts b/test/test.contextmenu-shadowdom.chromium.ts new file mode 100644 index 0000000..0c18630 --- /dev/null +++ b/test/test.contextmenu-shadowdom.chromium.ts @@ -0,0 +1,71 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; +import { DeesElement, customElement, html } from '@design.estate/dees-element'; + +// Create a test element with shadow DOM +@customElement('test-shadow-element') +class TestShadowElement extends DeesElement { + public getContextMenuItems() { + return [ + { name: 'Shadow Item 1', iconName: 'box', action: async () => console.log('Shadow 1') }, + { name: 'Shadow Item 2', iconName: 'package', action: async () => console.log('Shadow 2') } + ]; + } + + render() { + return html` +
+

Shadow DOM Content

+

Right-click anywhere inside this shadow DOM

+
+ `; + } +} + +tap.test('should show context menu when right-clicking inside shadow DOM', async () => { + // Create the shadow DOM element + const shadowElement = document.createElement('test-shadow-element'); + document.body.appendChild(shadowElement); + + // Wait for element to be ready + await shadowElement.updateComplete; + + // Get the content inside shadow DOM + const shadowContent = shadowElement.shadowRoot!.querySelector('div'); + expect(shadowContent).toBeTruthy(); + + // Simulate right-click on content inside shadow DOM + const contextMenuEvent = new MouseEvent('contextmenu', { + clientX: 100, + clientY: 100, + bubbles: true, + cancelable: true, + composed: true // Important for shadow DOM + }); + + shadowContent!.dispatchEvent(contextMenuEvent); + + // Wait for context menu to appear + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if context menu is created + const contextMenu = document.querySelector('dees-contextmenu'); + expect(contextMenu).toBeInstanceOf(DeesContextmenu); + + // Check if menu items from shadow element are rendered + const menuItems = contextMenu!.shadowRoot!.querySelectorAll('.menuitem'); + expect(menuItems.length).toBeGreaterThanOrEqual(2); + + // Check menu item text + const menuTexts = Array.from(menuItems).map(item => + item.querySelector('.menuitem-text')?.textContent + ); + expect(menuTexts).toContain('Shadow Item 1'); + expect(menuTexts).toContain('Shadow Item 2'); + + // Clean up + contextMenu!.remove(); + shadowElement.remove(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.contextmenu.chromium.ts b/test/test.contextmenu.chromium.ts new file mode 100644 index 0000000..0e4e151 --- /dev/null +++ b/test/test.contextmenu.chromium.ts @@ -0,0 +1,77 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; + +tap.test('should show context menu with nested submenu', async () => { + // Create a test element with context menu items + const testDiv = document.createElement('div'); + testDiv.style.width = '200px'; + testDiv.style.height = '200px'; + testDiv.style.background = '#eee'; + testDiv.innerHTML = 'Right-click me'; + + // Add getContextMenuItems method + (testDiv as any).getContextMenuItems = () => { + return [ + { + name: 'Change Type', + iconName: 'type', + submenu: [ + { name: 'Paragraph', iconName: 'text', action: () => console.log('Paragraph') }, + { name: 'Heading 1', iconName: 'heading1', action: () => console.log('Heading 1') }, + { name: 'Heading 2', iconName: 'heading2', action: () => console.log('Heading 2') }, + { divider: true }, + { name: 'Code Block', iconName: 'fileCode', action: () => console.log('Code') }, + { name: 'Quote', iconName: 'quote', action: () => console.log('Quote') } + ] + }, + { divider: true }, + { + name: 'Delete', + iconName: 'trash2', + action: () => console.log('Delete') + } + ]; + }; + + document.body.appendChild(testDiv); + + // Simulate right-click + const contextMenuEvent = new MouseEvent('contextmenu', { + clientX: 100, + clientY: 100, + bubbles: true, + cancelable: true + }); + + testDiv.dispatchEvent(contextMenuEvent); + + // Wait for context menu to appear + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if context menu is created + const contextMenu = document.querySelector('dees-contextmenu'); + expect(contextMenu).toBeInstanceOf(DeesContextmenu); + + // Check if menu items are rendered + const menuItems = contextMenu!.shadowRoot!.querySelectorAll('.menuitem'); + expect(menuItems.length).toEqual(2); // "Change Type" and "Delete" + + // Hover over "Change Type" to trigger submenu + const changeTypeItem = menuItems[0] as HTMLElement; + changeTypeItem.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); + + // Wait for submenu to appear + await new Promise(resolve => setTimeout(resolve, 300)); + + // Check if submenu is created + const submenus = document.querySelectorAll('dees-contextmenu'); + expect(submenus.length).toEqual(2); // Main menu and submenu + + // Clean up + contextMenu!.remove(); + const submenu = submenus[1]; + if (submenu) submenu.remove(); + testDiv.remove(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.dashboardgrid-layout.node.ts b/test/test.dashboardgrid-layout.node.ts new file mode 100644 index 0000000..fe4ac5a --- /dev/null +++ b/test/test.dashboardgrid-layout.node.ts @@ -0,0 +1,28 @@ +import { tap, expect } from '@git.zone/tstest/tapbundle'; + +import { + resolveWidgetPlacement, + collectCollisions, +} from '../ts_web/elements/dees-dashboardgrid/layout.ts'; +import type { DashboardWidget } from '../ts_web/elements/dees-dashboardgrid/types.ts'; + +tap.test('dashboardgrid does not overlap widgets after swap attempt', async () => { + const widgets: DashboardWidget[] = [ + { id: 'w0', x: 6, y: 5, w: 1, h: 3 }, + { id: 'w1', x: 6, y: 1, w: 1, h: 3 }, + { id: 'w2', x: 3, y: 0, w: 2, h: 2 }, + { id: 'w3', x: 9, y: 0, w: 1, h: 2 }, + { id: 'w4', x: 4, y: 3, w: 1, h: 2 }, + ]; + + const placement = resolveWidgetPlacement(widgets, 'w0', { x: 6, y: 3 }, 12); + expect(placement).toBeTruthy(); + + const layout = placement!.widgets; + for (const widget of layout) { + const collisions = collectCollisions(layout, widget, widget.x, widget.y, widget.w, widget.h); + expect(collisions).toBeEmptyArray(); + } +}); + +export default tap.start(); diff --git a/test/test.shadow-dom-containment.chromium.ts b/test/test.shadow-dom-containment.chromium.ts new file mode 100644 index 0000000..5c4904d --- /dev/null +++ b/test/test.shadow-dom-containment.chromium.ts @@ -0,0 +1,183 @@ +import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; +import { WysiwygSelection } from '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.selection.js'; + +tap.test('Shadow DOM containment should work correctly', async () => { + console.log('=== Testing Shadow DOM Containment ==='); + + // Wait for custom element to be defined + await customElements.whenDefined('dees-wysiwyg-block'); + + // Create a WYSIWYG block component - set properties BEFORE attaching to DOM + const block = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + + // Set the block data before attaching to DOM so firstUpdated() sees them + block.block = { + id: 'test-1', + type: 'paragraph', + content: 'Hello world test content' + }; + + block.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {} + }; + + // Now attach to DOM and wait for render + document.body.appendChild(block); + await block.updateComplete; + // Wait for firstUpdated to populate the container + await new Promise(resolve => setTimeout(resolve, 50)); + + // Get the paragraph element inside Shadow DOM + const container = block.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const paragraphBlock = container?.querySelector('.block.paragraph') as HTMLElement; + + expect(paragraphBlock).toBeTruthy(); + console.log('Found paragraph block:', paragraphBlock); + console.log('Paragraph text content:', paragraphBlock.textContent); + + // Focus the paragraph + paragraphBlock.focus(); + + // Manually set cursor position + const textNode = paragraphBlock.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + const selection = window.getSelection(); + + // Set cursor at position 11 (after "Hello world") + range.setStart(textNode, 11); + range.setEnd(textNode, 11); + + selection?.removeAllRanges(); + selection?.addRange(range); + + console.log('Set cursor at position 11'); + + // Test the containment check + console.log('\n--- Testing containment ---'); + const currentSelection = window.getSelection(); + if (currentSelection && currentSelection.rangeCount > 0) { + const selRange = currentSelection.getRangeAt(0); + console.log('Selection range:', { + startContainer: selRange.startContainer, + startOffset: selRange.startOffset, + containerText: selRange.startContainer.textContent + }); + + // Test regular contains (should fail across Shadow DOM) + const regularContains = paragraphBlock.contains(selRange.startContainer); + console.log('Regular contains:', regularContains); + + // Test Shadow DOM-aware contains + const shadowDOMContains = WysiwygSelection.containsAcrossShadowDOM(paragraphBlock, selRange.startContainer); + console.log('Shadow DOM contains:', shadowDOMContains); + + // Since we're setting selection within the same shadow DOM, both should be true + expect(regularContains).toBeTrue(); + expect(shadowDOMContains).toBeTrue(); + } + + // Test getSplitContent + console.log('\n--- Testing getSplitContent ---'); + const splitResult = block.getSplitContent(); + console.log('Split result:', splitResult); + + expect(splitResult).toBeTruthy(); + if (splitResult) { + console.log('Before:', JSON.stringify(splitResult.before)); + console.log('After:', JSON.stringify(splitResult.after)); + + // Expected split at position 11 + expect(splitResult.before).toEqual('Hello world'); + expect(splitResult.after).toEqual(' test content'); + } + } + + // Clean up + document.body.removeChild(block); +}); + +tap.test('Shadow DOM containment across different shadow roots', async () => { + console.log('=== Testing Cross Shadow Root Containment ==='); + + // Create parent component with WYSIWYG editor + const parentDiv = document.createElement('div'); + parentDiv.innerHTML = ` + + + + `; + document.body.appendChild(parentDiv); + + // Wait for components to be ready + await new Promise(resolve => setTimeout(resolve, 100)); + + const wysiwygInput = parentDiv.querySelector('dees-input-wysiwyg') as any; + const blockElement = wysiwygInput?.shadowRoot?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + + if (blockElement) { + // Set block data + blockElement.block = { + id: 'test-2', + type: 'paragraph', + content: 'Cross shadow DOM test' + }; + + blockElement.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {} + }; + + await blockElement.updateComplete; + + // Get the paragraph inside the nested shadow DOM + const container = blockElement.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const paragraphBlock = container?.querySelector('.block.paragraph') as HTMLElement; + + if (paragraphBlock) { + console.log('Found nested paragraph block'); + + // Focus and set selection + paragraphBlock.focus(); + const textNode = paragraphBlock.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + range.setStart(textNode, 5); + range.setEnd(textNode, 5); + + const selection = window.getSelection(); + selection?.removeAllRanges(); + selection?.addRange(range); + + // Test containment from parent's perspective + const selRange = selection?.getRangeAt(0); + if (selRange) { + // This should fail because it crosses shadow DOM boundary + const regularContains = wysiwygInput.contains(selRange.startContainer); + console.log('Parent regular contains:', regularContains); + expect(regularContains).toBeFalse(); + + // This should work with our Shadow DOM-aware method + const shadowDOMContains = WysiwygSelection.containsAcrossShadowDOM(wysiwygInput, selRange.startContainer); + console.log('Parent shadow DOM contains:', shadowDOMContains); + expect(shadowDOMContains).toBeTrue(); + } + } + } + } + + // Clean up + document.body.removeChild(parentDiv); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.tabs-indicator.chromium.ts b/test/test.tabs-indicator.chromium.ts new file mode 100644 index 0000000..f9d1251 --- /dev/null +++ b/test/test.tabs-indicator.chromium.ts @@ -0,0 +1,146 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import * as deesCatalog from '../ts_web/index.js'; + +tap.test('tabs indicator positioning - detailed measurements', async () => { + // Create tabs element with different length labels + const tabsElement = new deesCatalog.DeesAppuiTabs(); + tabsElement.tabs = [ + { key: 'Home', iconName: 'lucide:home', action: () => {} }, + { key: 'Analytics Dashboard', iconName: 'lucide:lineChart', action: () => {} }, + { key: 'User Settings', iconName: 'lucide:settings', action: () => {} }, + ]; + + document.body.appendChild(tabsElement); + await tabsElement.updateComplete; + + // Wait for fonts and indicator initialization + await new Promise(resolve => setTimeout(resolve, 200)); + + // Get all elements + const shadowRoot = tabsElement.shadowRoot; + const wrapper = shadowRoot.querySelector('.tabs-wrapper') as HTMLElement; + const container = shadowRoot.querySelector('.tabsContainer') as HTMLElement; + const tabs = shadowRoot.querySelectorAll('.tab'); + const firstTab = tabs[0] as HTMLElement; + const firstContent = firstTab.querySelector('.tab-content') as HTMLElement; + const indicator = shadowRoot.querySelector('.tabIndicator') as HTMLElement; + + // Verify all elements exist + expect(wrapper).toBeInstanceOf(HTMLElement); + expect(container).toBeInstanceOf(HTMLElement); + expect(firstTab).toBeInstanceOf(HTMLElement); + expect(firstContent).toBeInstanceOf(HTMLElement); + expect(indicator).toBeInstanceOf(HTMLElement); + + // Get all measurements + const wrapperRect = wrapper.getBoundingClientRect(); + const containerRect = container.getBoundingClientRect(); + const tabRect = firstTab.getBoundingClientRect(); + const contentRect = firstContent.getBoundingClientRect(); + const indicatorRect = indicator.getBoundingClientRect(); + + console.log('\n=== DETAILED MEASUREMENTS ==='); + console.log('Document body left:', document.body.getBoundingClientRect().left); + console.log('Wrapper left:', wrapperRect.left); + console.log('Container left:', containerRect.left); + console.log('Tab left:', tabRect.left); + console.log('Content left:', contentRect.left); + console.log('Indicator left (actual):', indicatorRect.left); + + console.log('\n=== RELATIVE POSITIONS ==='); + console.log('Container padding (container - wrapper):', containerRect.left - wrapperRect.left); + console.log('Tab position in container:', tabRect.left - containerRect.left); + console.log('Content position in tab:', contentRect.left - tabRect.left); + console.log('Content relative to wrapper:', contentRect.left - wrapperRect.left); + console.log('Indicator relative to wrapper (actual):', indicatorRect.left - wrapperRect.left); + + console.log('\n=== WIDTHS ==='); + console.log('Tab width:', tabRect.width); + console.log('Content width:', contentRect.width); + console.log('Indicator width:', indicatorRect.width); + + console.log('\n=== STYLES (what we set) ==='); + console.log('Indicator style.left:', indicator.style.left); + console.log('Indicator style.width:', indicator.style.width); + + console.log('\n=== CALCULATIONS ==='); + const expectedIndicatorLeft = contentRect.left - wrapperRect.left - 4; // We subtract 4 to center + const expectedIndicatorWidth = contentRect.width + 8; // We add 8 in the code + console.log('Expected indicator left:', expectedIndicatorLeft); + console.log('Expected indicator width:', expectedIndicatorWidth); + console.log('Actual indicator left (from style):', parseFloat(indicator.style.left)); + console.log('Actual indicator width (from style):', parseFloat(indicator.style.width)); + + console.log('\n=== VISUAL ALIGNMENT CHECK ==='); + const tabCenter = tabRect.left + (tabRect.width / 2); + const contentCenter = contentRect.left + (contentRect.width / 2); + const indicatorCenter = indicatorRect.left + (indicatorRect.width / 2); + + console.log('Tab center:', tabCenter); + console.log('Content center:', contentCenter); + console.log('Indicator center:', indicatorCenter); + console.log('Content offset from tab center:', contentCenter - tabCenter); + console.log('Indicator offset from content center:', indicatorCenter - contentCenter); + console.log('Indicator offset from tab center:', indicatorCenter - tabCenter); + console.log('---'); + console.log('Indicator extends left of content by:', contentRect.left - indicatorRect.left); + console.log('Indicator extends right of content by:', (indicatorRect.left + indicatorRect.width) - (contentRect.left + contentRect.width)); + + // Check if icons are rendering + const icon = firstContent.querySelector('dees-icon'); + console.log('\n=== ICON CHECK ==='); + console.log('Icon element found:', icon ? 'YES' : 'NO'); + if (icon) { + const iconRect = icon.getBoundingClientRect(); + console.log('Icon width:', iconRect.width); + console.log('Icon height:', iconRect.height); + console.log('Icon visible:', iconRect.width > 0 && iconRect.height > 0 ? 'YES' : 'NO'); + } + + // Verify indicator is visible + expect(indicator.style.opacity).toEqual('1'); + + // Verify positioning calculations + expect(parseFloat(indicator.style.left)).toBeCloseTo(expectedIndicatorLeft, 1); + expect(parseFloat(indicator.style.width)).toBeCloseTo(expectedIndicatorWidth, 1); + + // Verify visual centering on content (should be perfectly centered) + expect(Math.abs(indicatorCenter - contentCenter)).toBeLessThan(1); + + document.body.removeChild(tabsElement); +}); + +tap.test('tabs indicator should move when tab is clicked', async () => { + // Create tabs element + const tabsElement = new deesCatalog.DeesAppuiTabs(); + tabsElement.tabs = [ + { key: 'Home', iconName: 'lucide:home', action: () => {} }, + { key: 'Analytics', iconName: 'lucide:barChart', action: () => {} }, + { key: 'Settings', iconName: 'lucide:settings', action: () => {} }, + ]; + + document.body.appendChild(tabsElement); + await tabsElement.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + const shadowRoot = tabsElement.shadowRoot; + const tabs = shadowRoot.querySelectorAll('.tab'); + const indicator = shadowRoot.querySelector('.tabIndicator') as HTMLElement; + + // Get initial position + const initialLeft = parseFloat(indicator.style.left); + + // Click second tab + (tabs[1] as HTMLElement).click(); + await tabsElement.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Position should have changed + const newLeft = parseFloat(indicator.style.left); + expect(newLeft).not.toEqual(initialLeft); + expect(newLeft).toBeGreaterThan(initialLeft); + + document.body.removeChild(tabsElement); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-basic.chromium.ts b/test/test.wysiwyg-basic.chromium.ts new file mode 100644 index 0000000..4df522c --- /dev/null +++ b/test/test.wysiwyg-basic.chromium.ts @@ -0,0 +1,9 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +tap.test('should create wysiwyg editor', async () => { + const editor = new DeesInputWysiwyg(); + expect(editor).toBeInstanceOf(DeesInputWysiwyg); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blockmovement.chromium.ts b/test/test.wysiwyg-blockmovement.chromium.ts new file mode 100644 index 0000000..b2a552a --- /dev/null +++ b/test/test.wysiwyg-blockmovement.chromium.ts @@ -0,0 +1,85 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg block movement during drag', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Block 1' }, + { id: 'block2', type: 'paragraph', content: 'Block 2' }, + { id: 'block3', type: 'paragraph', content: 'Block 3' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; + + // Start dragging block 1 + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: () => {}, + setDragImage: () => {} + }, + clientY: 50, + preventDefault: () => {}, + } as any; + + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + + // Wait for dragging class + await new Promise(resolve => setTimeout(resolve, 20)); + + // Verify drag state + expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); + + // Check that drag height was calculated + console.log('Checking drag height...'); + const dragHandler = element.dragDropHandler as any; + console.log('draggedBlockHeight:', dragHandler.draggedBlockHeight); + console.log('draggedBlockContentHeight:', dragHandler.draggedBlockContentHeight); + + // Manually call updateBlockPositions to simulate drag movement + console.log('Simulating drag movement...'); + const updateBlockPositions = dragHandler.updateBlockPositions.bind(dragHandler); + + // Simulate dragging down past block 2 + const block2 = editorContent.querySelector('[data-block-id="block2"]') as HTMLElement; + const block2Rect = block2.getBoundingClientRect(); + const dragToY = block2Rect.bottom + 10; + + console.log('Dragging to Y position:', dragToY); + updateBlockPositions(dragToY); + + // Check if blocks have moved + await new Promise(resolve => setTimeout(resolve, 50)); + + const blocks = Array.from(editorContent.querySelectorAll('.block-wrapper')); + console.log('Block states after drag:'); + blocks.forEach((block, i) => { + const classes = block.className; + const offset = (block as HTMLElement).style.getPropertyValue('--drag-offset'); + console.log(`Block ${i}: classes="${classes}", offset="${offset}"`); + }); + + // Check that at least one block has move class + const movedUpBlocks = editorContent.querySelectorAll('.block-wrapper.move-up'); + const movedDownBlocks = editorContent.querySelectorAll('.block-wrapper.move-down'); + console.log('Moved up blocks:', movedUpBlocks.length); + console.log('Moved down blocks:', movedDownBlocks.length); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blocks-debug.chromium.ts b/test/test.wysiwyg-blocks-debug.chromium.ts new file mode 100644 index 0000000..5cdd083 --- /dev/null +++ b/test/test.wysiwyg-blocks-debug.chromium.ts @@ -0,0 +1,69 @@ +import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; + +import * as deesCatalog from '../ts_web/index.js'; +import { BlockRegistry } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/block.registry.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +// Import block registration to ensure handlers are registered +import '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.blockregistration.js'; + +tap.test('Debug: should create empty wysiwyg block component', async () => { + try { + console.log('Creating DeesWysiwygBlock...'); + const block: DeesWysiwygBlock = await webhelpers.fixture( + webhelpers.html`` + ); + console.log('Block created:', block); + expect(block).toBeDefined(); + expect(block).toBeInstanceOf(DeesWysiwygBlock); + console.log('Initial block property:', block.block); + console.log('Initial handlers property:', block.handlers); + } catch (error) { + console.error('Error creating block:', error); + throw error; + } +}); + +tap.test('Debug: should set properties step by step', async () => { + try { + console.log('Step 1: Creating component...'); + const block: DeesWysiwygBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + expect(block).toBeDefined(); + + console.log('Step 2: Setting handlers...'); + block.handlers = { + onInput: () => console.log('onInput'), + onKeyDown: () => console.log('onKeyDown'), + onFocus: () => console.log('onFocus'), + onBlur: () => console.log('onBlur'), + onCompositionStart: () => console.log('onCompositionStart'), + onCompositionEnd: () => console.log('onCompositionEnd') + }; + console.log('Handlers set:', block.handlers); + + console.log('Step 3: Setting block data...'); + block.block = { + id: 'test-block', + type: 'divider', + content: ' ' + }; + console.log('Block set:', block.block); + + console.log('Step 4: Appending to body...'); + document.body.appendChild(block); + + console.log('Step 5: Waiting for update...'); + await block.updateComplete; + console.log('Update complete'); + + console.log('Step 6: Checking shadowRoot...'); + expect(block.shadowRoot).toBeDefined(); + console.log('ShadowRoot exists'); + + } catch (error) { + console.error('Error in step-by-step test:', error); + throw error; + } +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blocks.chromium.ts b/test/test.wysiwyg-blocks.chromium.ts new file mode 100644 index 0000000..0a38f62 --- /dev/null +++ b/test/test.wysiwyg-blocks.chromium.ts @@ -0,0 +1,240 @@ +import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; + +import * as deesCatalog from '../ts_web/index.js'; +import { BlockRegistry } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/block.registry.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +// Import block registration to ensure handlers are registered +import '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.blockregistration.js'; + +tap.test('BlockRegistry should have registered handlers', async () => { + // Test divider handler + const dividerHandler = BlockRegistry.getHandler('divider'); + expect(dividerHandler).toBeDefined(); + expect(dividerHandler?.type).toEqual('divider'); + + // Test paragraph handler + const paragraphHandler = BlockRegistry.getHandler('paragraph'); + expect(paragraphHandler).toBeDefined(); + expect(paragraphHandler?.type).toEqual('paragraph'); + + // Test heading handlers + const heading1Handler = BlockRegistry.getHandler('heading-1'); + expect(heading1Handler).toBeDefined(); + expect(heading1Handler?.type).toEqual('heading-1'); + + const heading2Handler = BlockRegistry.getHandler('heading-2'); + expect(heading2Handler).toBeDefined(); + expect(heading2Handler?.type).toEqual('heading-2'); + + const heading3Handler = BlockRegistry.getHandler('heading-3'); + expect(heading3Handler).toBeDefined(); + expect(heading3Handler?.type).toEqual('heading-3'); + + // Test that getAllTypes returns all registered types + const allTypes = BlockRegistry.getAllTypes(); + expect(allTypes).toContain('divider'); + expect(allTypes).toContain('paragraph'); + expect(allTypes).toContain('heading-1'); + expect(allTypes).toContain('heading-2'); + expect(allTypes).toContain('heading-3'); +}); + +tap.test('should render divider block using handler', async () => { + // Wait for custom element to be defined + await customElements.whenDefined('dees-wysiwyg-block'); + + // Create element and set properties BEFORE attaching to DOM + const dividerBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + + // Set required handlers + dividerBlock.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {} + }; + + // Set a divider block + dividerBlock.block = { + id: 'test-divider', + type: 'divider', + content: ' ' + }; + + // Attach to DOM and wait for render + document.body.appendChild(dividerBlock); + await dividerBlock.updateComplete; + // Wait for firstUpdated to populate the container + await new Promise(resolve => setTimeout(resolve, 50)); + + // Check that the divider is rendered + const dividerElement = dividerBlock.shadowRoot?.querySelector('.block.divider'); + expect(dividerElement).toBeTruthy(); + expect(dividerElement?.getAttribute('tabindex')).toEqual('0'); + + // Check for the hr element (divider uses
not .divider-icon) + const hr = dividerBlock.shadowRoot?.querySelector('hr'); + expect(hr).toBeTruthy(); + + // Clean up + document.body.removeChild(dividerBlock); +}); + +tap.test('should render paragraph block using handler', async () => { + // Wait for custom element to be defined + await customElements.whenDefined('dees-wysiwyg-block'); + + // Create element and set properties BEFORE attaching to DOM + const paragraphBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + + // Set required handlers + paragraphBlock.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {}, + onMouseUp: () => {} + }; + + // Set a paragraph block + paragraphBlock.block = { + id: 'test-paragraph', + type: 'paragraph', + content: 'Test paragraph content' + }; + + // Attach to DOM and wait for render + document.body.appendChild(paragraphBlock); + await paragraphBlock.updateComplete; + // Wait for firstUpdated to populate the container + await new Promise(resolve => setTimeout(resolve, 50)); + + // Check that the paragraph is rendered + const paragraphElement = paragraphBlock.shadowRoot?.querySelector('.block.paragraph'); + expect(paragraphElement).toBeTruthy(); + expect(paragraphElement?.getAttribute('contenteditable')).toEqual('true'); + expect(paragraphElement?.textContent).toEqual('Test paragraph content'); + + // Clean up + document.body.removeChild(paragraphBlock); +}); + +tap.test('should render heading blocks using handler', async () => { + // Wait for custom element to be defined + await customElements.whenDefined('dees-wysiwyg-block'); + + // Test heading-1 - set properties BEFORE attaching to DOM + const heading1Block = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + + heading1Block.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {}, + onMouseUp: () => {} + }; + + heading1Block.block = { + id: 'test-h1', + type: 'heading-1', + content: 'Heading 1 Test' + }; + + document.body.appendChild(heading1Block); + await heading1Block.updateComplete; + // Wait for firstUpdated to populate the container + await new Promise(resolve => setTimeout(resolve, 50)); + + const h1Element = heading1Block.shadowRoot?.querySelector('.block.heading-1'); + expect(h1Element).toBeTruthy(); + expect(h1Element?.textContent).toEqual('Heading 1 Test'); + + // Clean up heading-1 + document.body.removeChild(heading1Block); + + // Test heading-2 - set properties BEFORE attaching to DOM + const heading2Block = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + + heading2Block.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {}, + onMouseUp: () => {} + }; + + heading2Block.block = { + id: 'test-h2', + type: 'heading-2', + content: 'Heading 2 Test' + }; + + document.body.appendChild(heading2Block); + await heading2Block.updateComplete; + // Wait for firstUpdated to populate the container + await new Promise(resolve => setTimeout(resolve, 50)); + + const h2Element = heading2Block.shadowRoot?.querySelector('.block.heading-2'); + expect(h2Element).toBeTruthy(); + expect(h2Element?.textContent).toEqual('Heading 2 Test'); + + // Clean up heading-2 + document.body.removeChild(heading2Block); +}); + +tap.test('paragraph block handler methods should work', async () => { + // Wait for custom element to be defined + await customElements.whenDefined('dees-wysiwyg-block'); + + // Create element and set properties BEFORE attaching to DOM + const paragraphBlock = document.createElement('dees-wysiwyg-block') as DeesWysiwygBlock; + + // Set required handlers + paragraphBlock.handlers = { + onInput: () => {}, + onKeyDown: () => {}, + onFocus: () => {}, + onBlur: () => {}, + onCompositionStart: () => {}, + onCompositionEnd: () => {}, + onMouseUp: () => {} + }; + + paragraphBlock.block = { + id: 'test-methods', + type: 'paragraph', + content: 'Initial content' + }; + + document.body.appendChild(paragraphBlock); + await paragraphBlock.updateComplete; + // Wait for firstUpdated to populate the container + await new Promise(resolve => setTimeout(resolve, 50)); + + // Test getContent + const content = paragraphBlock.getContent(); + expect(content).toEqual('Initial content'); + + // Test setContent + paragraphBlock.setContent('Updated content'); + await paragraphBlock.updateComplete; + expect(paragraphBlock.getContent()).toEqual('Updated content'); + + // Test that the DOM is updated + const paragraphElement = paragraphBlock.shadowRoot?.querySelector('.block.paragraph'); + expect(paragraphElement?.textContent).toEqual('Updated content'); + + // Clean up + document.body.removeChild(paragraphBlock); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-blocktype-change.chromium.ts b/test/test.wysiwyg-blocktype-change.chromium.ts new file mode 100644 index 0000000..b5f4a5d --- /dev/null +++ b/test/test.wysiwyg-blocktype-change.chromium.ts @@ -0,0 +1,98 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; + +tap.test('should change block type via context menu', async () => { + // Create WYSIWYG editor with a paragraph + const wysiwygEditor = new DeesInputWysiwyg(); + wysiwygEditor.value = '

This is a test paragraph

'; + document.body.appendChild(wysiwygEditor); + + // Wait for editor to be ready + await wysiwygEditor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Get the first block + const firstBlock = wysiwygEditor.blocks[0]; + expect(firstBlock.type).toEqual('paragraph'); + + // Get the block element + const firstBlockWrapper = wysiwygEditor.shadowRoot!.querySelector('.block-wrapper'); + expect(firstBlockWrapper).toBeTruthy(); + + const blockComponent = firstBlockWrapper!.querySelector('dees-wysiwyg-block') as any; + expect(blockComponent).toBeTruthy(); + await blockComponent.updateComplete; + + // Get the editable content inside the block's shadow DOM + const editableBlock = blockComponent.shadowRoot!.querySelector('.block'); + expect(editableBlock).toBeTruthy(); + + // Simulate right-click on the editable block + const contextMenuEvent = new MouseEvent('contextmenu', { + clientX: 200, + clientY: 200, + bubbles: true, + cancelable: true, + composed: true + }); + + editableBlock!.dispatchEvent(contextMenuEvent); + + // Wait for context menu to appear + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if context menu is created + const contextMenu = document.querySelector('dees-contextmenu'); + expect(contextMenu).toBeInstanceOf(DeesContextmenu); + + // Find "Change Type" menu item + const menuItems = Array.from(contextMenu!.shadowRoot!.querySelectorAll('.menuitem')); + const changeTypeItem = menuItems.find(item => + item.querySelector('.menuitem-text')?.textContent?.trim() === 'Change Type' + ); + expect(changeTypeItem).toBeTruthy(); + + // Hover over "Change Type" to trigger submenu + changeTypeItem!.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); + + // Wait for submenu to appear + await new Promise(resolve => setTimeout(resolve, 300)); + + // Check if submenu is created + const allMenus = document.querySelectorAll('dees-contextmenu'); + expect(allMenus.length).toEqual(2); + + const submenu = allMenus[1]; + const submenuItems = Array.from(submenu.shadowRoot!.querySelectorAll('.menuitem')); + + // Find "Heading 1" option + const heading1Item = submenuItems.find(item => + item.querySelector('.menuitem-text')?.textContent?.trim() === 'Heading 1' + ); + expect(heading1Item).toBeTruthy(); + + // Click on "Heading 1" + (heading1Item as HTMLElement).click(); + + // Wait for menu to close and block to update + await new Promise(resolve => setTimeout(resolve, 300)); + + // Verify block type has changed + expect(wysiwygEditor.blocks[0].type).toEqual('heading-1'); + + // Verify DOM has been updated + const updatedBlockComponent = wysiwygEditor.shadowRoot! + .querySelector('.block-wrapper')! + .querySelector('dees-wysiwyg-block') as any; + + await updatedBlockComponent.updateComplete; + + const updatedBlock = updatedBlockComponent.shadowRoot!.querySelector('.block'); + expect(updatedBlock?.classList.contains('heading-1')).toEqual(true); + + // Clean up + wysiwygEditor.remove(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-contextmenu.chromium.ts b/test/test.wysiwyg-contextmenu.chromium.ts new file mode 100644 index 0000000..5a71a5a --- /dev/null +++ b/test/test.wysiwyg-contextmenu.chromium.ts @@ -0,0 +1,68 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu/dees-contextmenu.js'; + +tap.test('should show context menu on WYSIWYG blocks', async () => { + // Create WYSIWYG editor + const wysiwygEditor = new DeesInputWysiwyg(); + wysiwygEditor.value = '

Test paragraph

Test heading

'; + document.body.appendChild(wysiwygEditor); + + // Wait for editor to be ready + await wysiwygEditor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Get the first block element + const firstBlockWrapper = wysiwygEditor.shadowRoot!.querySelector('.block-wrapper'); + expect(firstBlockWrapper).toBeTruthy(); + + const blockComponent = firstBlockWrapper!.querySelector('dees-wysiwyg-block') as any; + expect(blockComponent).toBeTruthy(); + + // Wait for block to be ready + await blockComponent.updateComplete; + + // Get the editable content inside the block's shadow DOM + const editableBlock = blockComponent.shadowRoot!.querySelector('.block'); + expect(editableBlock).toBeTruthy(); + + // Simulate right-click on the editable block + const contextMenuEvent = new MouseEvent('contextmenu', { + clientX: 200, + clientY: 200, + bubbles: true, + cancelable: true, + composed: true // Important for shadow DOM + }); + + editableBlock!.dispatchEvent(contextMenuEvent); + + // Wait for context menu to appear + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if context menu is created + const contextMenu = document.querySelector('dees-contextmenu'); + expect(contextMenu).toBeInstanceOf(DeesContextmenu); + + // Check if menu items from WYSIWYG block are rendered + const menuItems = contextMenu!.shadowRoot!.querySelectorAll('.menuitem'); + const menuTexts = Array.from(menuItems).map(item => + item.querySelector('.menuitem-text')?.textContent?.trim() + ); + + // Should have "Change Type" and "Delete Block" items + expect(menuTexts).toContain('Change Type'); + expect(menuTexts).toContain('Delete Block'); + + // Check if "Change Type" has submenu indicator + const changeTypeItem = Array.from(menuItems).find(item => + item.querySelector('.menuitem-text')?.textContent?.trim() === 'Change Type' + ); + expect(changeTypeItem?.classList.contains('has-submenu')).toEqual(true); + + // Clean up + contextMenu!.remove(); + wysiwygEditor.remove(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragdrop-simple.chromium.ts b/test/test.wysiwyg-dragdrop-simple.chromium.ts new file mode 100644 index 0000000..89e7dc7 --- /dev/null +++ b/test/test.wysiwyg-dragdrop-simple.chromium.ts @@ -0,0 +1,95 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg drag handler initialization', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + // Wait for element to be ready + await element.updateComplete; + + // Check that drag handler is initialized + expect(element.dragDropHandler).toBeTruthy(); + + // Set initial content with multiple blocks + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'First paragraph' }, + { id: 'block2', type: 'paragraph', content: 'Second paragraph' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + // Check that editor content ref exists + console.log('editorContentRef:', element.editorContentRef); + expect(element.editorContentRef).toBeTruthy(); + + // Check that blocks are rendered + const blockWrappers = element.shadowRoot!.querySelectorAll('.block-wrapper'); + console.log('Number of block wrappers:', blockWrappers.length); + expect(blockWrappers.length).toEqual(2); + + // Check drag handles + const dragHandles = element.shadowRoot!.querySelectorAll('.drag-handle'); + console.log('Number of drag handles:', dragHandles.length); + expect(dragHandles.length).toEqual(2); + + // Clean up + document.body.removeChild(element); +}); + +tap.test('wysiwyg drag start behavior', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Test block' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + const dragHandle = element.shadowRoot!.querySelector('.drag-handle') as HTMLElement; + expect(dragHandle).toBeTruthy(); + + // Check that drag handle has draggable attribute + console.log('Drag handle draggable:', dragHandle.draggable); + expect(dragHandle.draggable).toBeTrue(); + + // Test drag handler state before drag + console.log('Initial drag state:', element.dragDropHandler.dragState); + expect(element.dragDropHandler.dragState.draggedBlockId).toBeNull(); + + // Try to manually call handleDragStart + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: (type: string, data: string) => { + console.log('setData called with:', type, data); + }, + setDragImage: (img: any, x: number, y: number) => { + console.log('setDragImage called'); + } + }, + clientY: 100, + preventDefault: () => {}, + } as any; + + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + + // Check drag state after drag start + console.log('Drag state after start:', element.dragDropHandler.dragState); + expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragdrop-visual.chromium.ts b/test/test.wysiwyg-dragdrop-visual.chromium.ts new file mode 100644 index 0000000..b8bfcc5 --- /dev/null +++ b/test/test.wysiwyg-dragdrop-visual.chromium.ts @@ -0,0 +1,133 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg drag visual feedback - block movement', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Block 1' }, + { id: 'block2', type: 'paragraph', content: 'Block 2' }, + { id: 'block3', type: 'paragraph', content: 'Block 3' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; + + // Manually start drag + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: (type: string, data: string) => {}, + setDragImage: (img: any, x: number, y: number) => {} + }, + clientY: 50, + preventDefault: () => {}, + } as any; + + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + + // Wait for dragging class + await new Promise(resolve => setTimeout(resolve, 20)); + + // Check dragging state + console.log('Block 1 classes:', block1.className); + console.log('Editor content classes:', editorContent.className); + expect(block1.classList.contains('dragging')).toBeTrue(); + expect(editorContent.classList.contains('dragging')).toBeTrue(); + + // Check drop indicator exists + const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement; + console.log('Drop indicator:', dropIndicator); + expect(dropIndicator).toBeTruthy(); + + // Test block movement calculation + console.log('Testing updateBlockPositions...'); + + // Access private method for testing + const updateBlockPositions = element.dragDropHandler['updateBlockPositions'].bind(element.dragDropHandler); + + // Simulate dragging to different position + updateBlockPositions(150); // Move down + + // Check if blocks have move classes + const blocks = Array.from(editorContent.querySelectorAll('.block-wrapper')); + console.log('Block classes after move:'); + blocks.forEach((block, i) => { + console.log(`Block ${i}:`, block.className, 'transform:', (block as HTMLElement).style.getPropertyValue('--drag-offset')); + }); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); +}); + +tap.test('wysiwyg drop indicator positioning', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Paragraph 1' }, + { id: 'block2', type: 'heading-2', content: 'Heading 2' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + + // Start dragging first block + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: (type: string, data: string) => {}, + setDragImage: (img: any, x: number, y: number) => {} + }, + clientY: 50, + preventDefault: () => {}, + } as any; + + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + + // Wait for initialization + await new Promise(resolve => setTimeout(resolve, 20)); + + // Get drop indicator + const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement; + expect(dropIndicator).toBeTruthy(); + + // Check initial display state + console.log('Drop indicator initial display:', dropIndicator.style.display); + + // Trigger updateBlockPositions to see drop indicator + const updateBlockPositions = element.dragDropHandler['updateBlockPositions'].bind(element.dragDropHandler); + updateBlockPositions(100); + + // Check drop indicator position + console.log('Drop indicator after update:'); + console.log('- display:', dropIndicator.style.display); + console.log('- top:', dropIndicator.style.top); + console.log('- height:', dropIndicator.style.height); + + expect(dropIndicator.style.display).toEqual('block'); + expect(dropIndicator.style.top).toBeTruthy(); + expect(dropIndicator.style.height).toBeTruthy(); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragdrop.chromium.ts b/test/test.wysiwyg-dragdrop.chromium.ts new file mode 100644 index 0000000..9c29375 --- /dev/null +++ b/test/test.wysiwyg-dragdrop.chromium.ts @@ -0,0 +1,145 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg drag and drop should work correctly', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + // Wait for element to be ready + await element.updateComplete; + + // Set initial content with multiple blocks + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'First paragraph' }, + { id: 'block2', type: 'heading-2', content: 'Test Heading' }, + { id: 'block3', type: 'paragraph', content: 'Second paragraph' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + // Wait for nested block components to also complete their updates + await new Promise(resolve => setTimeout(resolve, 50)); + + // Check that blocks are rendered + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + expect(editorContent).toBeTruthy(); + + const blockWrappers = editorContent.querySelectorAll('.block-wrapper'); + expect(blockWrappers.length).toEqual(3); + + // Test drag handles exist for non-divider blocks + const dragHandles = editorContent.querySelectorAll('.drag-handle'); + expect(dragHandles.length).toEqual(3); + + // Get references to specific blocks + const firstBlock = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; + const secondBlock = editorContent.querySelector('[data-block-id="block2"]') as HTMLElement; + const firstDragHandle = firstBlock.querySelector('.drag-handle') as HTMLElement; + + expect(firstBlock).toBeTruthy(); + expect(secondBlock).toBeTruthy(); + expect(firstDragHandle).toBeTruthy(); + + // Verify drag drop handler exists + expect(element.dragDropHandler).toBeTruthy(); + expect(element.dragDropHandler.dragState).toBeTruthy(); + + // Test drag initialization - synthetic DragEvents may not fully work in all browsers + console.log('Testing drag initialization...'); + + // Create drag event + const dragStartEvent = new DragEvent('dragstart', { + dataTransfer: new DataTransfer(), + clientY: 100, + bubbles: true + }); + + // Simulate drag start + firstDragHandle.dispatchEvent(dragStartEvent); + + // Wait for setTimeout in drag start + await new Promise(resolve => setTimeout(resolve, 50)); + + // Note: Synthetic DragEvents may not fully initialize drag state in all test environments + // The test verifies the structure and that events can be dispatched + console.log('Drag state after start:', element.dragDropHandler.dragState.draggedBlockId); + + // Test drag end cleanup + const dragEndEvent = new DragEvent('dragend', { + bubbles: true + }); + + document.dispatchEvent(dragEndEvent); + + // Wait for cleanup + await new Promise(resolve => setTimeout(resolve, 150)); + + // Clean up + document.body.removeChild(element); +}); + +tap.test('wysiwyg drag and drop visual feedback', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Block 1' }, + { id: 'block2', type: 'paragraph', content: 'Block 2' }, + { id: 'block3', type: 'paragraph', content: 'Block 3' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + // Wait for nested block components to also complete their updates + await new Promise(resolve => setTimeout(resolve, 50)); + + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement; + const dragHandle1 = block1.querySelector('.drag-handle') as HTMLElement; + + // Start dragging block 1 + const dragStartEvent = new DragEvent('dragstart', { + dataTransfer: new DataTransfer(), + clientY: 50, + bubbles: true + }); + + dragHandle1.dispatchEvent(dragStartEvent); + + // Wait for dragging class + await new Promise(resolve => setTimeout(resolve, 20)); + + // Simulate dragging down + const dragOverEvent = new DragEvent('dragover', { + dataTransfer: new DataTransfer(), + clientY: 150, // Move down past block 2 + bubbles: true, + cancelable: true + }); + + // Trigger the global drag over handler + element.dragDropHandler['handleGlobalDragOver'](dragOverEvent); + + // Check that transform is applied to dragged block + const transform = block1.style.transform; + console.log('Dragged block transform:', transform); + expect(transform).toContain('translateY'); + + // Check drop indicator position + const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement; + if (dropIndicator) { + const indicatorStyle = dropIndicator.style; + console.log('Drop indicator position:', indicatorStyle.top, 'display:', indicatorStyle.display); + } + + // Clean up + document.body.removeChild(element); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dragissue.chromium.ts b/test/test.wysiwyg-dragissue.chromium.ts new file mode 100644 index 0000000..6c4cff4 --- /dev/null +++ b/test/test.wysiwyg-dragissue.chromium.ts @@ -0,0 +1,124 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg drag full flow without await', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Test block' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + // Mock drag event + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: (type: string, data: string) => { + console.log('setData:', type, data); + }, + setDragImage: (img: any, x: number, y: number) => { + console.log('setDragImage'); + } + }, + clientY: 100, + preventDefault: () => {}, + } as any; + + console.log('Starting drag...'); + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + console.log('Drag started'); + + // Check immediate state + expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); + + // Instead of await with setTimeout, use a done callback + return new Promise((resolve) => { + console.log('Setting up delayed check...'); + + // Use regular setTimeout + setTimeout(() => { + console.log('In setTimeout callback'); + + try { + const block1 = element.shadowRoot!.querySelector('[data-block-id="block1"]') as HTMLElement; + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + + console.log('Block has dragging class:', block1?.classList.contains('dragging')); + console.log('Editor has dragging class:', editorContent?.classList.contains('dragging')); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); + + resolve(); + } catch (error) { + console.error('Error in setTimeout:', error); + throw error; + } + }, 50); + }); +}); + +tap.test('identify the crash point', async () => { + console.log('Test started'); + + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + console.log('Element created'); + await element.updateComplete; + + console.log('Setting blocks'); + element.blocks = [{ id: 'block1', type: 'paragraph', content: 'Test' }]; + element.renderBlocksProgrammatically(); + + console.log('Waiting for update'); + await element.updateComplete; + + console.log('Creating mock event'); + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: () => {}, + setDragImage: () => {} + }, + clientY: 100, + preventDefault: () => {}, + } as any; + + console.log('Calling handleDragStart'); + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + + console.log('handleDragStart completed'); + + // Try different wait methods + console.log('About to wait...'); + + // Method 1: Direct promise + await Promise.resolve(); + console.log('Promise.resolve completed'); + + // Method 2: setTimeout 0 + await new Promise(resolve => setTimeout(resolve, 0)); + console.log('setTimeout 0 completed'); + + // Method 3: requestAnimationFrame + await new Promise(resolve => requestAnimationFrame(() => resolve(undefined))); + console.log('requestAnimationFrame completed'); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); + console.log('Cleanup completed'); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-dropindicator.chromium.ts b/test/test.wysiwyg-dropindicator.chromium.ts new file mode 100644 index 0000000..9ad6715 --- /dev/null +++ b/test/test.wysiwyg-dropindicator.chromium.ts @@ -0,0 +1,108 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg drop indicator creation', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Test block' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + // Check editorContentRef + console.log('editorContentRef exists:', !!element.editorContentRef); + console.log('editorContentRef tagName:', element.editorContentRef?.tagName); + expect(element.editorContentRef).toBeTruthy(); + + // Check initial state - no drop indicator + let dropIndicator = element.shadowRoot!.querySelector('.drop-indicator'); + console.log('Drop indicator before drag:', dropIndicator); + expect(dropIndicator).toBeFalsy(); + + // Manually call createDropIndicator + try { + console.log('Calling createDropIndicator...'); + element.dragDropHandler['createDropIndicator'](); + console.log('createDropIndicator succeeded'); + } catch (error) { + console.error('Error creating drop indicator:', error); + throw error; + } + + // Check drop indicator was created + dropIndicator = element.shadowRoot!.querySelector('.drop-indicator'); + console.log('Drop indicator after creation:', dropIndicator); + console.log('Drop indicator parent:', dropIndicator?.parentElement?.className); + expect(dropIndicator).toBeTruthy(); + expect(dropIndicator!.style.display).toEqual('none'); + + // Clean up + document.body.removeChild(element); +}); + +tap.test('wysiwyg drag initialization with drop indicator', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Test block' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + // Mock drag event + const mockDragEvent = { + dataTransfer: { + effectAllowed: '', + setData: (type: string, data: string) => { + console.log('setData:', type, data); + }, + setDragImage: (img: any, x: number, y: number) => { + console.log('setDragImage'); + } + }, + clientY: 100, + preventDefault: () => {}, + } as any; + + console.log('Starting drag...'); + + try { + element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]); + console.log('Drag start succeeded'); + } catch (error) { + console.error('Error during drag start:', error); + throw error; + } + + // Wait for async operations + await new Promise(resolve => setTimeout(resolve, 20)); + + // Check drop indicator exists + const dropIndicator = element.shadowRoot!.querySelector('.drop-indicator'); + console.log('Drop indicator after drag start:', dropIndicator); + expect(dropIndicator).toBeTruthy(); + + // Check drag state + console.log('Drag state:', element.dragDropHandler.dragState); + expect(element.dragDropHandler.dragState.draggedBlockId).toEqual('block1'); + + // Clean up + element.dragDropHandler.handleDragEnd(); + document.body.removeChild(element); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-eventlisteners.chromium.ts b/test/test.wysiwyg-eventlisteners.chromium.ts new file mode 100644 index 0000000..4657968 --- /dev/null +++ b/test/test.wysiwyg-eventlisteners.chromium.ts @@ -0,0 +1,114 @@ +import { expect, tap } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; + +// Initialize the element +DeesInputWysiwyg; + +tap.test('wysiwyg global event listeners', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Test block' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + const block1 = element.shadowRoot!.querySelector('[data-block-id="block1"]') as HTMLElement; + console.log('Block 1 found:', !!block1); + + // Set up drag state manually without using handleDragStart + element.dragDropHandler['draggedBlockId'] = 'block1'; + element.dragDropHandler['draggedBlockElement'] = block1; + element.dragDropHandler['initialMouseY'] = 100; + + // Create drop indicator manually + element.dragDropHandler['createDropIndicator'](); + + // Test adding global event listeners + console.log('Adding event listeners...'); + const handleGlobalDragOver = element.dragDropHandler['handleGlobalDragOver']; + const handleGlobalDragEnd = element.dragDropHandler['handleGlobalDragEnd']; + + try { + document.addEventListener('dragover', handleGlobalDragOver); + console.log('dragover listener added'); + + document.addEventListener('dragend', handleGlobalDragEnd); + console.log('dragend listener added'); + } catch (error) { + console.error('Error adding event listeners:', error); + throw error; + } + + // Test firing a dragover event + console.log('Creating dragover event...'); + const dragOverEvent = new Event('dragover', { + bubbles: true, + cancelable: true + }); + Object.defineProperty(dragOverEvent, 'clientY', { value: 150 }); + + console.log('Dispatching dragover event...'); + document.dispatchEvent(dragOverEvent); + console.log('dragover event dispatched'); + + // Clean up + document.removeEventListener('dragover', handleGlobalDragOver); + document.removeEventListener('dragend', handleGlobalDragEnd); + + document.body.removeChild(element); +}); + +tap.test('wysiwyg setTimeout in drag start', async () => { + const element = document.createElement('dees-input-wysiwyg'); + document.body.appendChild(element); + + await element.updateComplete; + + // Set initial content + element.blocks = [ + { id: 'block1', type: 'paragraph', content: 'Test block' }, + ]; + element.renderBlocksProgrammatically(); + + await element.updateComplete; + + const block1 = element.shadowRoot!.querySelector('[data-block-id="block1"]') as HTMLElement; + const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement; + + // Set drag state + element.dragDropHandler['draggedBlockId'] = 'block1'; + element.dragDropHandler['draggedBlockElement'] = block1; + + console.log('Testing setTimeout callback...'); + + // Test the setTimeout callback directly + try { + if (block1) { + console.log('Adding dragging class to block...'); + block1.classList.add('dragging'); + console.log('Block classes:', block1.className); + } + if (editorContent) { + console.log('Adding dragging class to editor...'); + editorContent.classList.add('dragging'); + console.log('Editor classes:', editorContent.className); + } + } catch (error) { + console.error('Error in setTimeout callback:', error); + throw error; + } + + expect(block1.classList.contains('dragging')).toBeTrue(); + expect(editorContent.classList.contains('dragging')).toBeTrue(); + + // Clean up + document.body.removeChild(element); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-keyboard.chromium.ts b/test/test.wysiwyg-keyboard.chromium.ts new file mode 100644 index 0000000..ec8181b --- /dev/null +++ b/test/test.wysiwyg-keyboard.chromium.ts @@ -0,0 +1,329 @@ +import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +tap.test('Keyboard: Arrow navigation between blocks', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import multiple blocks + editor.importBlocks([ + { id: 'block-1', type: 'paragraph', content: 'First paragraph' }, + { id: 'block-2', type: 'paragraph', content: 'Second paragraph' }, + { id: 'block-3', type: 'paragraph', content: 'Third paragraph' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Focus first block at end + const firstBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="block-1"]'); + const firstBlockComponent = firstBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const firstBlockContainer = firstBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const firstParagraph = firstBlockContainer?.querySelector('.block.paragraph') as HTMLElement; + + // Focus and set cursor at end of first block + firstParagraph.focus(); + const textNode = firstParagraph.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + const selection = window.getSelection(); + range.setStart(textNode, textNode.textContent?.length || 0); + range.setEnd(textNode, textNode.textContent?.length || 0); + selection?.removeAllRanges(); + selection?.addRange(range); + } + + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press ArrowRight to move to second block + const arrowRightEvent = new KeyboardEvent('keydown', { + key: 'ArrowRight', + code: 'ArrowRight', + bubbles: true, + cancelable: true, + composed: true + }); + + firstParagraph.dispatchEvent(arrowRightEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if second block is focused + const secondBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="block-2"]'); + const secondBlockComponent = secondBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const secondBlockContainer = secondBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const secondParagraph = secondBlockContainer?.querySelector('.block.paragraph') as HTMLElement; + + // Check if the second paragraph has focus + const activeElement = secondBlockComponent.shadowRoot?.activeElement; + expect(activeElement).toEqual(secondParagraph); + + console.log('Arrow navigation test complete'); +}); + +tap.test('Keyboard: Backspace merges blocks', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import two blocks + editor.importBlocks([ + { id: 'merge-1', type: 'paragraph', content: 'First' }, + { id: 'merge-2', type: 'paragraph', content: 'Second' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Focus second block at beginning + const secondBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="merge-2"]'); + const secondBlockComponent = secondBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const secondBlockContainer = secondBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const secondParagraph = secondBlockContainer?.querySelector('.block.paragraph') as HTMLElement; + + // Focus and set cursor at beginning + secondParagraph.focus(); + const textNode = secondParagraph.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + const selection = window.getSelection(); + range.setStart(textNode, 0); + range.setEnd(textNode, 0); + selection?.removeAllRanges(); + selection?.addRange(range); + } + + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Backspace to merge with previous block + const backspaceEvent = new KeyboardEvent('keydown', { + key: 'Backspace', + code: 'Backspace', + bubbles: true, + cancelable: true, + composed: true + }); + + secondParagraph.dispatchEvent(backspaceEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if blocks were merged + expect(editor.blocks.length).toEqual(1); + expect(editor.blocks[0].content).toContain('First'); + expect(editor.blocks[0].content).toContain('Second'); + + console.log('Backspace merge test complete'); +}); + +tap.test('Keyboard: Delete key on non-editable blocks', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import blocks including a divider + editor.importBlocks([ + { id: 'para-1', type: 'paragraph', content: 'Before divider' }, + { id: 'div-1', type: 'divider', content: '' }, + { id: 'para-2', type: 'paragraph', content: 'After divider' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Focus the divider block + const dividerBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="div-1"]'); + const dividerBlockComponent = dividerBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const dividerBlockContainer = dividerBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const dividerElement = dividerBlockContainer?.querySelector('.block.divider') as HTMLElement; + + // Non-editable blocks need to be focused differently + dividerElement?.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Delete to remove the divider + const deleteEvent = new KeyboardEvent('keydown', { + key: 'Delete', + code: 'Delete', + bubbles: true, + cancelable: true, + composed: true + }); + + dividerElement.dispatchEvent(deleteEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if divider was removed + expect(editor.blocks.length).toEqual(2); + expect(editor.blocks.find(b => b.type === 'divider')).toBeUndefined(); + + console.log('Delete key on non-editable block test complete'); +}); + +tap.test('Keyboard: Tab key in code block', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a code block + editor.importBlocks([ + { id: 'code-1', type: 'code', content: 'function test() {', metadata: { language: 'javascript' } } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Focus code block - code blocks use .code-editor instead of .block.code + const codeBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]'); + const codeBlockComponent = codeBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const codeBlockContainer = codeBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const codeElement = codeBlockContainer?.querySelector('.code-editor') as HTMLElement; + + expect(codeElement).toBeTruthy(); + + // Focus and set cursor at end + codeElement.focus(); + const textNode = codeElement.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + const selection = window.getSelection(); + range.setStart(textNode, textNode.textContent?.length || 0); + range.setEnd(textNode, textNode.textContent?.length || 0); + selection?.removeAllRanges(); + selection?.addRange(range); + } + + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Tab to insert spaces + const tabEvent = new KeyboardEvent('keydown', { + key: 'Tab', + code: 'Tab', + bubbles: true, + cancelable: true, + composed: true + }); + + codeElement.dispatchEvent(tabEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if spaces were inserted + const updatedContent = codeElement.textContent || ''; + expect(updatedContent).toContain(' '); // Tab should insert 2 spaces + + console.log('Tab in code block test complete'); +}); + +tap.test('Keyboard: ArrowUp/Down navigation', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import multiple blocks + editor.importBlocks([ + { id: 'nav-1', type: 'paragraph', content: 'First line' }, + { id: 'nav-2', type: 'paragraph', content: 'Second line' }, + { id: 'nav-3', type: 'paragraph', content: 'Third line' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify blocks were created + expect(editor.blocks.length).toEqual(3); + + // Focus second block + const secondBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="nav-2"]'); + const secondBlockComponent = secondBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const secondBlockContainer = secondBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const secondParagraph = secondBlockContainer?.querySelector('.block.paragraph') as HTMLElement; + + expect(secondParagraph).toBeTruthy(); + secondParagraph.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Verify keyboard handler exists + expect(editor.keyboardHandler).toBeTruthy(); + + // Press ArrowUp - event is dispatched (focus change may not occur in synthetic events) + const arrowUpEvent = new KeyboardEvent('keydown', { + key: 'ArrowUp', + code: 'ArrowUp', + bubbles: true, + cancelable: true, + composed: true + }); + + secondParagraph.dispatchEvent(arrowUpEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Get first block references + const firstBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="nav-1"]'); + const firstBlockComponent = firstBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const firstBlockContainer = firstBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const firstParagraph = firstBlockContainer?.querySelector('.block.paragraph') as HTMLElement; + + expect(firstParagraph).toBeTruthy(); + + // Note: Synthetic keyboard events don't reliably trigger native browser focus changes + // in automated tests. The handler is invoked but focus may not actually move. + // This test verifies the structure exists and events can be dispatched. + + console.log('ArrowUp/Down navigation test complete'); +}); + +tap.test('Keyboard: Formatting shortcuts', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a paragraph + editor.importBlocks([ + { id: 'format-1', type: 'paragraph', content: 'Test formatting' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Focus and select text + const blockWrapper = editor.shadowRoot?.querySelector('[data-block-id="format-1"]'); + const blockComponent = blockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const blockContainer = blockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const paragraph = blockContainer?.querySelector('.block.paragraph') as HTMLElement; + + paragraph.focus(); + + // Select "formatting" + const textNode = paragraph.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + const selection = window.getSelection(); + range.setStart(textNode, 5); // After "Test " + range.setEnd(textNode, 15); // After "formatting" + selection?.removeAllRanges(); + selection?.addRange(range); + } + + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Cmd/Ctrl+B for bold + const boldEvent = new KeyboardEvent('keydown', { + key: 'b', + code: 'KeyB', + metaKey: true, // Use metaKey for Mac, ctrlKey for Windows/Linux + bubbles: true, + cancelable: true, + composed: true + }); + + paragraph.dispatchEvent(boldEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if bold was applied + const content = paragraph.innerHTML; + expect(content).toContain('') || expect(content).toContain(''); + + console.log('Formatting shortcuts test complete'); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-phase3.chromium.ts b/test/test.wysiwyg-phase3.chromium.ts new file mode 100644 index 0000000..3d6303d --- /dev/null +++ b/test/test.wysiwyg-phase3.chromium.ts @@ -0,0 +1,152 @@ +import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +tap.test('Phase 3: Quote block should render and work correctly', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a quote block + editor.importBlocks([ + { id: 'quote-1', type: 'quote', content: 'This is a famous quote' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if quote block was rendered + const quoteBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-1"]'); + const quoteBlockComponent = quoteBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + expect(quoteBlockComponent).toBeTruthy(); + + const quoteContainer = quoteBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement; + expect(quoteElement).toBeTruthy(); + expect(quoteElement?.textContent).toEqual('This is a famous quote'); + + // Check if styles are applied (border-left for quote) + const computedStyle = window.getComputedStyle(quoteElement); + expect(computedStyle.borderLeftStyle).toEqual('solid'); + expect(computedStyle.fontStyle).toEqual('italic'); +}); + +tap.test('Phase 3: Code block should render and handle tab correctly', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a code block + editor.importBlocks([ + { id: 'code-1', type: 'code', content: 'const x = 42;', metadata: { language: 'javascript' } } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if code block was rendered - code blocks use .code-editor instead of .block.code + const codeBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]'); + const codeBlockComponent = codeBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const codeContainer = codeBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const codeElement = codeContainer?.querySelector('.code-editor') as HTMLElement; + + expect(codeElement).toBeTruthy(); + expect(codeElement?.textContent).toEqual('const x = 42;'); + + // Check if language selector is shown + const languageSelector = codeContainer?.querySelector('.language-selector') as HTMLSelectElement; + expect(languageSelector).toBeTruthy(); + expect(languageSelector?.value).toEqual('javascript'); + + // Check if monospace font is applied - code-editor is a element + const computedStyle = window.getComputedStyle(codeElement); + // Font family may vary by platform, so just check it contains something + expect(computedStyle.fontFamily).toBeTruthy(); +}); + +tap.test('Phase 3: List block should render correctly', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a list block + editor.importBlocks([ + { id: 'list-1', type: 'list', content: 'First item\nSecond item\nThird item' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if list block was rendered + const listBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="list-1"]'); + const listBlockComponent = listBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const listContainer = listBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const listElement = listContainer?.querySelector('.block.list') as HTMLElement; + + expect(listElement).toBeTruthy(); + + // Check if list items were created + const listItems = listElement?.querySelectorAll('li'); + expect(listItems?.length).toEqual(3); + expect(listItems?.[0].textContent).toEqual('First item'); + expect(listItems?.[1].textContent).toEqual('Second item'); + expect(listItems?.[2].textContent).toEqual('Third item'); + + // Check if it's an unordered list by default + const ulElement = listElement?.querySelector('ul'); + expect(ulElement).toBeTruthy(); +}); + +tap.test('Phase 3: Quote block split should work', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a quote block + editor.importBlocks([ + { id: 'quote-split', type: 'quote', content: 'To be or not to be' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Get the quote block + const quoteBlockWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-split"]'); + const quoteBlockComponent = quoteBlockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const quoteContainer = quoteBlockComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement; + + // Focus and set cursor after "To be" + quoteElement.focus(); + const textNode = quoteElement.firstChild; + if (textNode && textNode.nodeType === Node.TEXT_NODE) { + const range = document.createRange(); + const selection = window.getSelection(); + range.setStart(textNode, 5); // After "To be" + range.setEnd(textNode, 5); + selection?.removeAllRanges(); + selection?.addRange(range); + + await new Promise(resolve => setTimeout(resolve, 100)); + + // Press Enter to split + const enterEvent = new KeyboardEvent('keydown', { + key: 'Enter', + code: 'Enter', + bubbles: true, + cancelable: true, + composed: true + }); + + quoteElement.dispatchEvent(enterEvent); + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if split happened correctly + expect(editor.blocks.length).toEqual(2); + expect(editor.blocks[0].content).toEqual('To be'); + expect(editor.blocks[1].content).toEqual(' or not to be'); + expect(editor.blocks[1].type).toEqual('paragraph'); // New block should be paragraph + } +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-registry.both.ts b/test/test.wysiwyg-registry.both.ts new file mode 100644 index 0000000..8937f8f --- /dev/null +++ b/test/test.wysiwyg-registry.both.ts @@ -0,0 +1,112 @@ +import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; + +import { BlockRegistry } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/block.registry.js'; +import { DividerBlockHandler } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/content/divider.block.js'; +import { ParagraphBlockHandler } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/paragraph.block.js'; +import { HeadingBlockHandler } from '../ts_web/elements/00group-input/dees-input-wysiwyg/blocks/text/heading.block.js'; + +// Import block registration to ensure handlers are registered +import '../ts_web/elements/00group-input/dees-input-wysiwyg/wysiwyg.blockregistration.js'; + +tap.test('BlockRegistry should register and retrieve handlers', async () => { + // Test divider handler + const dividerHandler = BlockRegistry.getHandler('divider'); + expect(dividerHandler).toBeDefined(); + expect(dividerHandler).toBeInstanceOf(DividerBlockHandler); + expect(dividerHandler?.type).toEqual('divider'); + + // Test paragraph handler + const paragraphHandler = BlockRegistry.getHandler('paragraph'); + expect(paragraphHandler).toBeDefined(); + expect(paragraphHandler).toBeInstanceOf(ParagraphBlockHandler); + expect(paragraphHandler?.type).toEqual('paragraph'); + + // Test heading handlers + const heading1Handler = BlockRegistry.getHandler('heading-1'); + expect(heading1Handler).toBeDefined(); + expect(heading1Handler).toBeInstanceOf(HeadingBlockHandler); + expect(heading1Handler?.type).toEqual('heading-1'); + + const heading2Handler = BlockRegistry.getHandler('heading-2'); + expect(heading2Handler).toBeDefined(); + expect(heading2Handler).toBeInstanceOf(HeadingBlockHandler); + expect(heading2Handler?.type).toEqual('heading-2'); + + const heading3Handler = BlockRegistry.getHandler('heading-3'); + expect(heading3Handler).toBeDefined(); + expect(heading3Handler).toBeInstanceOf(HeadingBlockHandler); + expect(heading3Handler?.type).toEqual('heading-3'); +}); + +tap.test('Block handlers should render content correctly', async () => { + const testBlock = { + id: 'test-1', + type: 'paragraph' as const, + content: 'Test paragraph content' + }; + + const handler = BlockRegistry.getHandler('paragraph'); + expect(handler).toBeDefined(); + + if (handler) { + const rendered = handler.render(testBlock, false); + // The render() method returns the HTML template structure + // Content is set later in setup() + expect(rendered).toContain('contenteditable="true"'); + expect(rendered).toContain('data-block-type="paragraph"'); + expect(rendered).toContain('data-block-id="test-1"'); + expect(rendered).toContain('class="block paragraph"'); + } +}); + +tap.test('Divider handler should render correctly', async () => { + const dividerBlock = { + id: 'test-divider', + type: 'divider' as const, + content: ' ' + }; + + const handler = BlockRegistry.getHandler('divider'); + expect(handler).toBeDefined(); + + if (handler) { + const rendered = handler.render(dividerBlock, false); + expect(rendered).toContain('class="block divider"'); + expect(rendered).toContain('tabindex="0"'); + expect(rendered).toContain('
'); + expect(rendered).toContain('data-block-id="test-divider"'); + } +}); + +tap.test('Heading handlers should render with correct levels', async () => { + const headingBlock = { + id: 'test-h1', + type: 'heading-1' as const, + content: 'Test Heading' + }; + + const handler = BlockRegistry.getHandler('heading-1'); + expect(handler).toBeDefined(); + + if (handler) { + const rendered = handler.render(headingBlock, false); + // The render() method returns the HTML template structure + // Content is set later in setup() + expect(rendered).toContain('class="block heading-1"'); + expect(rendered).toContain('contenteditable="true"'); + expect(rendered).toContain('data-block-id="test-h1"'); + expect(rendered).toContain('data-block-type="heading-1"'); + } +}); + +tap.test('getAllTypes should return all registered types', async () => { + const allTypes = BlockRegistry.getAllTypes(); + expect(allTypes).toContain('divider'); + expect(allTypes).toContain('paragraph'); + expect(allTypes).toContain('heading-1'); + expect(allTypes).toContain('heading-2'); + expect(allTypes).toContain('heading-3'); + expect(allTypes.length).toBeGreaterThanOrEqual(5); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-selection-highlight.chromium.ts b/test/test.wysiwyg-selection-highlight.chromium.ts new file mode 100644 index 0000000..f212251 --- /dev/null +++ b/test/test.wysiwyg-selection-highlight.chromium.ts @@ -0,0 +1,158 @@ +import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +tap.test('Selection highlighting should work consistently for all block types', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import various block types + editor.importBlocks([ + { id: 'para-1', type: 'paragraph', content: 'This is a paragraph' }, + { id: 'heading-1', type: 'heading-1', content: 'This is a heading' }, + { id: 'quote-1', type: 'quote', content: 'This is a quote' }, + { id: 'code-1', type: 'code', content: 'const x = 42;' }, + { id: 'list-1', type: 'list', content: 'Item 1\nItem 2' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Test paragraph highlighting + console.log('Testing paragraph highlighting...'); + const paraWrapper = editor.shadowRoot?.querySelector('[data-block-id="para-1"]'); + const paraComponent = paraWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const paraContainer = paraComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const paraElement = paraContainer?.querySelector('.block.paragraph') as HTMLElement; + + // Focus paragraph to select it + paraElement.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if paragraph has selected class + const paraHasSelected = paraElement.classList.contains('selected'); + console.log('Paragraph has selected class:', paraHasSelected); + + // Check computed styles + const paraStyle = window.getComputedStyle(paraElement); + console.log('Paragraph background:', paraStyle.background); + console.log('Paragraph box-shadow:', paraStyle.boxShadow); + + // Test heading highlighting + console.log('\nTesting heading highlighting...'); + const headingWrapper = editor.shadowRoot?.querySelector('[data-block-id="heading-1"]'); + const headingComponent = headingWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const headingContainer = headingComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const headingElement = headingContainer?.querySelector('.block.heading-1') as HTMLElement; + + // Focus heading to select it + headingElement.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if heading has selected class + const headingHasSelected = headingElement.classList.contains('selected'); + console.log('Heading has selected class:', headingHasSelected); + + // Check computed styles + const headingStyle = window.getComputedStyle(headingElement); + console.log('Heading background:', headingStyle.background); + console.log('Heading box-shadow:', headingStyle.boxShadow); + + // Test quote highlighting + console.log('\nTesting quote highlighting...'); + const quoteWrapper = editor.shadowRoot?.querySelector('[data-block-id="quote-1"]'); + const quoteComponent = quoteWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const quoteContainer = quoteComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const quoteElement = quoteContainer?.querySelector('.block.quote') as HTMLElement; + + // Focus quote to select it + quoteElement.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check if quote has selected class + const quoteHasSelected = quoteElement.classList.contains('selected'); + console.log('Quote has selected class:', quoteHasSelected); + + // Test code highlighting - code blocks use .code-editor instead of .block.code + console.log('\nTesting code highlighting...'); + const codeWrapper = editor.shadowRoot?.querySelector('[data-block-id="code-1"]'); + const codeComponent = codeWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const codeContainer = codeComponent?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const codeElement = codeContainer?.querySelector('.code-editor') as HTMLElement; + const codeBlockContainer = codeContainer?.querySelector('.code-block-container') as HTMLElement; + + // Focus code to select it + codeElement.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // For code blocks, the selection is on the container, not the editor + const codeHasSelected = codeBlockContainer?.classList.contains('selected'); + console.log('Code container has selected class:', codeHasSelected); + + // Focus back on paragraph and check if others are deselected + console.log('\nFocusing back on paragraph...'); + paraElement.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check that only paragraph is selected + expect(paraElement.classList.contains('selected')).toBeTrue(); + expect(headingElement.classList.contains('selected')).toBeFalse(); + expect(quoteElement.classList.contains('selected')).toBeFalse(); + // Code blocks use different selection structure + expect(codeBlockContainer?.classList.contains('selected') || false).toBeFalse(); + + console.log('Selection highlighting test complete'); +}); + +tap.test('Selected class should toggle correctly when clicking between blocks', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import two blocks + editor.importBlocks([ + { id: 'block-1', type: 'paragraph', content: 'First block' }, + { id: 'block-2', type: 'paragraph', content: 'Second block' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Get both blocks + const block1Wrapper = editor.shadowRoot?.querySelector('[data-block-id="block-1"]'); + const block1Component = block1Wrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const block1Container = block1Component?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const block1Element = block1Container?.querySelector('.block.paragraph') as HTMLElement; + + const block2Wrapper = editor.shadowRoot?.querySelector('[data-block-id="block-2"]'); + const block2Component = block2Wrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const block2Container = block2Component?.shadowRoot?.querySelector('.wysiwyg-block-container') as HTMLElement; + const block2Element = block2Container?.querySelector('.block.paragraph') as HTMLElement; + + // Initially neither should be selected + expect(block1Element.classList.contains('selected')).toBeFalse(); + expect(block2Element.classList.contains('selected')).toBeFalse(); + + // Click on first block + block1Element.click(); + block1Element.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // First block should be selected + expect(block1Element.classList.contains('selected')).toBeTrue(); + expect(block2Element.classList.contains('selected')).toBeFalse(); + + // Click on second block + block2Element.click(); + block2Element.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Second block should be selected, first should not + expect(block1Element.classList.contains('selected')).toBeFalse(); + expect(block2Element.classList.contains('selected')).toBeTrue(); + + console.log('Toggle test complete'); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-selection-simple.chromium.ts b/test/test.wysiwyg-selection-simple.chromium.ts new file mode 100644 index 0000000..84dcfe3 --- /dev/null +++ b/test/test.wysiwyg-selection-simple.chromium.ts @@ -0,0 +1,62 @@ +import { expect, tap, webhelpers } from '@git.zone/tstest/tapbundle'; +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +tap.test('Selection highlighting basic test', async () => { + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import two blocks + editor.importBlocks([ + { id: 'para-1', type: 'paragraph', content: 'First paragraph' }, + { id: 'head-1', type: 'heading-1', content: 'First heading' } + ]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 500)); + + // Get paragraph element + const paraWrapper = editor.shadowRoot?.querySelector('[data-block-id="para-1"]'); + const paraComponent = paraWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const paraBlock = paraComponent?.shadowRoot?.querySelector('.block.paragraph') as HTMLElement; + + // Get heading element + const headWrapper = editor.shadowRoot?.querySelector('[data-block-id="head-1"]'); + const headComponent = headWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const headBlock = headComponent?.shadowRoot?.querySelector('.block.heading-1') as HTMLElement; + + console.log('Found elements:', { + paraBlock: !!paraBlock, + headBlock: !!headBlock + }); + + // Focus paragraph + paraBlock.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check classes + console.log('Paragraph classes:', paraBlock.className); + console.log('Heading classes:', headBlock.className); + + // Check isSelected property + console.log('Paragraph component isSelected:', paraComponent.isSelected); + console.log('Heading component isSelected:', headComponent.isSelected); + + // Focus heading + headBlock.focus(); + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check classes again + console.log('\nAfter focusing heading:'); + console.log('Paragraph classes:', paraBlock.className); + console.log('Heading classes:', headBlock.className); + console.log('Paragraph component isSelected:', paraComponent.isSelected); + console.log('Heading component isSelected:', headComponent.isSelected); + + // Check that heading is selected + expect(headBlock.classList.contains('selected')).toBeTrue(); + expect(paraBlock.classList.contains('selected')).toBeFalse(); +}); + +export default tap.start(); \ No newline at end of file diff --git a/test/test.wysiwyg-split.chromium.ts b/test/test.wysiwyg-split.chromium.ts new file mode 100644 index 0000000..2247347 --- /dev/null +++ b/test/test.wysiwyg-split.chromium.ts @@ -0,0 +1,98 @@ +import { tap, expect, webhelpers } from '@git.zone/tstest/tapbundle'; + +import { DeesInputWysiwyg } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-input-wysiwyg.js'; +import { DeesWysiwygBlock } from '../ts_web/elements/00group-input/dees-input-wysiwyg/dees-wysiwyg-block.js'; + +tap.test('should split paragraph content on Enter key', async () => { + // Create the wysiwyg editor + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a test paragraph + editor.importBlocks([{ + id: 'test-para-1', + type: 'paragraph', + content: 'Hello World' + }]); + + await editor.updateComplete; + + // Wait for blocks to render + await new Promise(resolve => setTimeout(resolve, 100)); + + // Get the block wrapper and component + const blockWrapper = editor.shadowRoot?.querySelector('[data-block-id="test-para-1"]'); + expect(blockWrapper).toBeDefined(); + + const blockComponent = blockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + expect(blockComponent).toBeDefined(); + expect(blockComponent.block.type).toEqual('paragraph'); + + // Wait for block to render + await blockComponent.updateComplete; + + // Test getSplitContent + console.log('Testing getSplitContent...'); + const splitResult = blockComponent.getSplitContent(); + console.log('Split result:', splitResult); + + // Since we haven't set cursor position, it might return null or split at start + // This is just to test if the method is callable + expect(typeof blockComponent.getSplitContent).toEqual('function'); +}); + +tap.test('should handle Enter key press in paragraph', async () => { + // Create the wysiwyg editor + const editor: DeesInputWysiwyg = await webhelpers.fixture( + webhelpers.html`` + ); + + // Import a test paragraph + editor.importBlocks([{ + id: 'test-enter-1', + type: 'paragraph', + content: 'First part|Second part' // | marks where we'll simulate cursor + }]); + + await editor.updateComplete; + await new Promise(resolve => setTimeout(resolve, 100)); + + // Check initial state + expect(editor.blocks.length).toEqual(1); + expect(editor.blocks[0].content).toEqual('First part|Second part'); + + // Get the block element + const blockWrapper = editor.shadowRoot?.querySelector('[data-block-id="test-enter-1"]'); + const blockComponent = blockWrapper?.querySelector('dees-wysiwyg-block') as DeesWysiwygBlock; + const blockElement = blockComponent.shadowRoot?.querySelector('.block.paragraph') as HTMLDivElement; + + expect(blockElement).toBeDefined(); + + // Set content without the | marker + blockElement.textContent = 'First partSecond part'; + + // Focus the block + blockElement.focus(); + + // Create and dispatch Enter key event + const enterEvent = new KeyboardEvent('keydown', { + key: 'Enter', + code: 'Enter', + bubbles: true, + cancelable: true, + composed: true + }); + + // Dispatch the event + blockElement.dispatchEvent(enterEvent); + + // Wait for processing + await new Promise(resolve => setTimeout(resolve, 200)); + + // Check if block was split (this might not work perfectly in test environment) + console.log('Blocks after Enter:', editor.blocks.length); + console.log('Block contents:', editor.blocks.map(b => b.content)); +}); + +export default tap.start(); \ No newline at end of file diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts new file mode 100644 index 0000000..cf844ac --- /dev/null +++ b/ts_web/00_commitinfo_data.ts @@ -0,0 +1,8 @@ +/** + * autocreated commitinfo by @push.rocks/commitinfo + */ +export const commitinfo = { + name: '@design.estate/dees-catalog', + version: '3.33.0', + description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.' +} diff --git a/ts_web/elements/00colors.ts b/ts_web/elements/00colors.ts new file mode 100644 index 0000000..7774c1e --- /dev/null +++ b/ts_web/elements/00colors.ts @@ -0,0 +1,13 @@ +export const dark = { + blue: '#0050b9', + blueActive: '#0069f2', + blueMuted: '#012452', + text: '#ffffff', +} + +export const bright = { + blue: '#0050b9', + blueActive: '#0069f2', + blueMuted: '#0069f2', + text: '#333333', +} \ No newline at end of file diff --git a/ts_web/elements/00fonts.ts b/ts_web/elements/00fonts.ts new file mode 100644 index 0000000..7ce3c13 --- /dev/null +++ b/ts_web/elements/00fonts.ts @@ -0,0 +1,53 @@ +import { unsafeCSS } from '@design.estate/dees-element'; + +/** + * Geist Sans font family - Main font for the design system + * Already available in the environment, no need to load + */ +export const geistSansFont = 'Geist Sans'; + +/** + * Intel One Mono font family - Monospace font for code and technical content + * Already available in the environment, no need to load + */ +export const intelOneMonoFont = 'Intel One Mono'; + +/** + * Complete font family stacks with fallbacks + */ +export const geistFontFamily = `'${geistSansFont}', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif`; + +export const monoFontFamily = `'${intelOneMonoFont}', 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace`; + +/** + * CSS-ready font family values using unsafeCSS + * Use these in component styles + */ +export const cssGeistFontFamily = unsafeCSS(geistFontFamily); +export const cssMonoFontFamily = unsafeCSS(monoFontFamily); + +/** + * Cal Sans font for headings - Display font + * May need to be loaded separately + */ +export const calSansFont = 'Cal Sans'; +export const calSansFontFamily = `'${calSansFont}', ${geistFontFamily}`; +export const cssCalSansFontFamily = unsafeCSS(calSansFontFamily); + +/** + * Roboto Slab font for special content - Serif font + * May need to be loaded separately + */ +export const robotoSlabFont = 'Roboto Slab'; +export const robotoSlabFontFamily = `'${robotoSlabFont}', Georgia, serif`; +export const cssRobotoSlabFontFamily = unsafeCSS(robotoSlabFontFamily); + +/** + * Base font styles that can be applied to components + */ +export const baseFontStyles = unsafeCSS(` + font-family: ${geistFontFamily}; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-feature-settings: 'cv11', 'tnum', 'cv05' 1; +`); \ No newline at end of file diff --git a/ts_web/elements/00plugins.ts b/ts_web/elements/00plugins.ts new file mode 100644 index 0000000..81a5506 --- /dev/null +++ b/ts_web/elements/00plugins.ts @@ -0,0 +1,13 @@ +// @push.rocks scope +import * as smartpromise from '@push.rocks/smartpromise'; + +export { + smartpromise, +} + +// @tsclass scope +import * as tsclass from '@tsclass/tsclass'; + +export { + tsclass +} diff --git a/ts_web/elements/00theme.ts b/ts_web/elements/00theme.ts new file mode 100644 index 0000000..3c7625d --- /dev/null +++ b/ts_web/elements/00theme.ts @@ -0,0 +1,218 @@ +import { css, type CSSResult } from '@design.estate/dees-element'; + +// ============================================ +// Theme Token Type Definitions +// ============================================ + +export interface IThemeColors { + bgPrimary: string; + bgSecondary: string; + bgTertiary: string; + textPrimary: string; + textSecondary: string; + textMuted: string; + borderDefault: string; + borderSubtle: string; + borderStrong: string; + accentPrimary: string; + accentSuccess: string; + accentWarning: string; + accentError: string; +} + +export interface IThemeSpacing { + xs: string; + sm: string; + md: string; + lg: string; + xl: string; + '2xl': string; + '3xl': string; +} + +export interface IThemeRadius { + xs: string; + sm: string; + md: string; + lg: string; + xl: string; + full: string; +} + +export interface IThemeShadows { + xs: string; + sm: string; + md: string; + lg: string; +} + +export interface IThemeTransitions { + fast: string; + default: string; + slow: string; + slower: string; +} + +export interface IThemeControlHeights { + sm: string; + md: string; + lg: string; + xl: string; +} + +export interface ITheme { + colors: { + light: IThemeColors; + dark: IThemeColors; + }; + spacing: IThemeSpacing; + radius: IThemeRadius; + shadows: IThemeShadows; + transitions: IThemeTransitions; + controlHeights: IThemeControlHeights; +} + +// ============================================ +// Default Theme Values (TypeScript Object) +// ============================================ + +export const themeDefaults: ITheme = { + colors: { + light: { + bgPrimary: '#ffffff', + bgSecondary: '#fafafa', + bgTertiary: '#f4f4f5', + textPrimary: '#09090b', + textSecondary: '#374151', + textMuted: '#71717a', + borderDefault: '#e5e7eb', + borderSubtle: '#f4f4f5', + borderStrong: '#d1d5db', + accentPrimary: '#3b82f6', + accentSuccess: '#22c55e', + accentWarning: '#f59e0b', + accentError: '#ef4444', + }, + dark: { + bgPrimary: '#09090b', + bgSecondary: '#0a0a0a', + bgTertiary: '#18181b', + textPrimary: '#fafafa', + textSecondary: '#d4d4d8', + textMuted: '#a1a1aa', + borderDefault: '#27272a', + borderSubtle: '#1a1a1a', + borderStrong: '#3f3f46', + accentPrimary: '#3b82f6', + accentSuccess: '#22c55e', + accentWarning: '#f59e0b', + accentError: '#ef4444', + }, + }, + spacing: { + xs: '4px', + sm: '8px', + md: '12px', + lg: '16px', + xl: '24px', + '2xl': '32px', + '3xl': '48px', + }, + radius: { + xs: '2px', + sm: '4px', + md: '6px', + lg: '8px', + xl: '12px', + full: '999px', + }, + shadows: { + xs: '0 1px 2px 0 rgb(0 0 0 / 0.05)', + sm: '0 1px 3px rgba(0, 0, 0, 0.1)', + md: '0 2px 8px rgba(0, 0, 0, 0.15)', + lg: '0 4px 12px rgba(0, 0, 0, 0.15)', + }, + transitions: { + fast: '0.1s', + default: '0.15s', + slow: '0.2s', + slower: '0.3s', + }, + controlHeights: { + sm: '32px', + md: '36px', + lg: '40px', + xl: '48px', + }, +}; + +// ============================================ +// CSS Block for Component Import +// ============================================ + +/** + * Default theme styles to be imported into every component's static styles array. + * Provides CSS custom properties for spacing, radius, shadows, transitions, and control heights. + * + * Usage: + * ```typescript + * import { themeDefaultStyles } from '../00theme.js'; + * + * @customElement('my-component') + * export class MyComponent extends DeesElement { + * public static styles = [ + * themeDefaultStyles, + * cssManager.defaultStyles, + * css`...` + * ]; + * } + * ``` + */ +export const themeDefaultStyles: CSSResult = css` + :host { + /* ======================================== + * Spacing Scale + * ======================================== */ + --dees-spacing-xs: 4px; + --dees-spacing-sm: 8px; + --dees-spacing-md: 12px; + --dees-spacing-lg: 16px; + --dees-spacing-xl: 24px; + --dees-spacing-2xl: 32px; + --dees-spacing-3xl: 48px; + + /* ======================================== + * Border Radius Scale + * ======================================== */ + --dees-radius-xs: 2px; + --dees-radius-sm: 4px; + --dees-radius-md: 6px; + --dees-radius-lg: 8px; + --dees-radius-xl: 12px; + --dees-radius-full: 999px; + + /* ======================================== + * Shadow Elevation Scale + * ======================================== */ + --dees-shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --dees-shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1); + --dees-shadow-md: 0 2px 8px rgba(0, 0, 0, 0.15); + --dees-shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.15); + + /* ======================================== + * Transition Duration Scale + * ======================================== */ + --dees-transition-fast: 0.1s; + --dees-transition-default: 0.15s; + --dees-transition-slow: 0.2s; + --dees-transition-slower: 0.3s; + + /* ======================================== + * Control Height Scale + * ======================================== */ + --dees-control-height-sm: 32px; + --dees-control-height-md: 36px; + --dees-control-height-lg: 40px; + --dees-control-height-xl: 48px; + } +`; diff --git a/ts_web/elements/00zindex.ts b/ts_web/elements/00zindex.ts new file mode 100644 index 0000000..9344e49 --- /dev/null +++ b/ts_web/elements/00zindex.ts @@ -0,0 +1,50 @@ +/** + * Central z-index management for consistent stacking order + * Higher numbers appear on top of lower numbers + */ + +export const zIndexLayers = { + // Base layer: Regular content + base: { + content: 'auto', + inputElements: 1, + }, + + // Fixed UI elements + fixed: { + appBar: 10, + sideMenu: 10, + mobileNav: 250, + }, + + // Overlay backdrops (semi-transparent backgrounds) + backdrop: { + dropdown: 1999, + modal: 2999, + contextMenu: 3999, + screensaver: 9998, + }, + + // Interactive overlays + overlay: { + dropdown: 2000, + modal: 3000, + contextMenu: 4000, + toast: 5000, + screensaver: 9999, // Screensaver on top of everything + }, +} as const; + +// Helper function to get z-index value +export function getZIndex(category: keyof typeof zIndexLayers, subcategory?: string): number | string { + const categoryObj = zIndexLayers[category]; + if (typeof categoryObj === 'object' && subcategory) { + return categoryObj[subcategory as keyof typeof categoryObj] || 'auto'; + } + return typeof categoryObj === 'number' ? categoryObj : 'auto'; +} + +// Z-index assignments for components +export const componentZIndex = { + 'dees-screensaver': zIndexLayers.overlay.screensaver, +} as const; diff --git a/ts_web/elements/dees-screensaver/dees-screensaver.ts b/ts_web/elements/dees-screensaver/dees-screensaver.ts new file mode 100644 index 0000000..0444741 --- /dev/null +++ b/ts_web/elements/dees-screensaver/dees-screensaver.ts @@ -0,0 +1,319 @@ +import { + customElement, + DeesElement, + type TemplateResult, + html, + property, + css, + cssManager, + state, +} from '@design.estate/dees-element'; +import { zIndexLayers } from '../00zindex.js'; + +declare global { + interface HTMLElementTagNameMap { + 'dees-screensaver': DeesScreensaver; + } +} + +// Subtle shadcn-inspired color palette +const colors = [ + 'hsl(0 0% 98%)', // zinc-50 + 'hsl(240 5% 65%)', // zinc-400 + 'hsl(240 4% 46%)', // zinc-500 + 'hsl(240 5% 34%)', // zinc-600 + 'hsl(217 91% 60%)', // blue-500 + 'hsl(142 71% 45%)', // green-500 +]; + +@customElement('dees-screensaver') +export class DeesScreensaver extends DeesElement { + public static demo = () => html``; + + // Instance management + private static instance: DeesScreensaver | null = null; + + public static async show(): Promise { + if (DeesScreensaver.instance) { + DeesScreensaver.instance.active = true; + return DeesScreensaver.instance; + } + + const screensaver = new DeesScreensaver(); + screensaver.active = true; + document.body.appendChild(screensaver); + DeesScreensaver.instance = screensaver; + return screensaver; + } + + public static hide(): void { + if (DeesScreensaver.instance) { + DeesScreensaver.instance.active = false; + } + } + + public static destroy(): void { + if (DeesScreensaver.instance) { + DeesScreensaver.instance.remove(); + DeesScreensaver.instance = null; + } + } + + // Styles + public static styles = [ + cssManager.defaultStyles, + css` + :host { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + z-index: ${zIndexLayers.overlay.screensaver}; + pointer-events: none; + opacity: 0; + transition: opacity 0.8s ease; + } + + :host([active]) { + pointer-events: all; + opacity: 1; + } + + .backdrop { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: hsl(240 10% 4%); + } + + .time-container { + position: absolute; + top: 0; + left: 0; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + user-select: none; + white-space: nowrap; + will-change: transform; + } + + .time { + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 96px; + font-weight: 200; + letter-spacing: -2px; + line-height: 1; + transition: color 1.5s ease; + } + + .date { + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + font-size: 18px; + font-weight: 400; + letter-spacing: 0.5px; + opacity: 0.5; + text-transform: uppercase; + transition: color 1.5s ease; + } + + @media (max-width: 600px) { + .time { + font-size: 48px; + letter-spacing: -1px; + } + + .date { + font-size: 14px; + } + } + `, + ]; + + @property({ type: Boolean, reflect: true }) + accessor active = false; + + @state() + accessor currentTime = ''; + + @state() + accessor currentDate = ''; + + @state() + accessor currentColor = colors[0]; + + // Animation state - non-reactive for smooth animation + private posX = 100; + private posY = 100; + private velocityX = 0.3; + private velocityY = 0.2; + private animationId: number | null = null; + private timeUpdateInterval: ReturnType | null = null; + private colorIndex = 0; + private elementWidth = 280; + private elementHeight = 140; + private hasBounced = false; + private timeContainerEl: HTMLElement | null = null; + + constructor() { + super(); + this.updateTime(); + } + + public render(): TemplateResult { + return html` +
+
+ ${this.currentTime} + ${this.currentDate} +
+ `; + } + + public firstUpdated(): void { + this.timeContainerEl = this.shadowRoot?.querySelector('.time-container') as HTMLElement; + } + + async connectedCallback(): Promise { + await super.connectedCallback(); + this.startAnimation(); + this.startTimeUpdate(); + } + + async disconnectedCallback(): Promise { + await super.disconnectedCallback(); + this.stopAnimation(); + this.stopTimeUpdate(); + } + + updated(changedProperties: Map): void { + super.updated(changedProperties); + if (changedProperties.has('active')) { + if (this.active) { + this.startAnimation(); + this.startTimeUpdate(); + } else { + this.stopAnimation(); + this.stopTimeUpdate(); + } + } + } + + private updateTime(): void { + const now = new Date(); + const hours = String(now.getHours()).padStart(2, '0'); + const minutes = String(now.getMinutes()).padStart(2, '0'); + this.currentTime = `${hours}:${minutes}`; + + // Format date like "Monday, January 6" + const options: Intl.DateTimeFormatOptions = { + weekday: 'long', + month: 'long', + day: 'numeric', + }; + this.currentDate = now.toLocaleDateString('en-US', options); + } + + private startTimeUpdate(): void { + if (this.timeUpdateInterval) return; + this.updateTime(); + this.timeUpdateInterval = setInterval(() => this.updateTime(), 1000); + } + + private stopTimeUpdate(): void { + if (this.timeUpdateInterval) { + clearInterval(this.timeUpdateInterval); + this.timeUpdateInterval = null; + } + } + + private startAnimation(): void { + if (this.animationId) return; + + // Initialize position randomly + const maxX = window.innerWidth - this.elementWidth; + const maxY = window.innerHeight - this.elementHeight; + this.posX = Math.random() * Math.max(0, maxX); + this.posY = Math.random() * Math.max(0, maxY); + + // Randomize initial direction - very slow, elegant movement + this.velocityX = (Math.random() > 0.5 ? 1 : -1) * (0.2 + Math.random() * 0.15); + this.velocityY = (Math.random() > 0.5 ? 1 : -1) * (0.15 + Math.random() * 0.1); + + // Reset bounce state + this.hasBounced = false; + + const animate = () => { + if (!this.active) { + this.animationId = null; + return; + } + + const maxX = window.innerWidth - this.elementWidth; + const maxY = window.innerHeight - this.elementHeight; + + // Update position + this.posX += this.velocityX; + this.posY += this.velocityY; + + // Track if we're currently at a boundary + let atBoundary = false; + + // Bounce off walls + if (this.posX <= 0) { + this.posX = 0; + this.velocityX = Math.abs(this.velocityX); + atBoundary = true; + } else if (this.posX >= maxX) { + this.posX = maxX; + this.velocityX = -Math.abs(this.velocityX); + atBoundary = true; + } + + if (this.posY <= 0) { + this.posY = 0; + this.velocityY = Math.abs(this.velocityY); + atBoundary = true; + } else if (this.posY >= maxY) { + this.posY = maxY; + this.velocityY = -Math.abs(this.velocityY); + atBoundary = true; + } + + // Change color only once per bounce (when entering boundary, not while at it) + if (atBoundary && !this.hasBounced) { + this.hasBounced = true; + this.colorIndex = (this.colorIndex + 1) % colors.length; + this.currentColor = colors[this.colorIndex]; + } else if (!atBoundary) { + this.hasBounced = false; + } + + // Direct DOM manipulation for smooth position updates (no re-render) + if (this.timeContainerEl) { + this.timeContainerEl.style.transform = `translate(${this.posX}px, ${this.posY}px)`; + } + + this.animationId = requestAnimationFrame(animate); + }; + + this.animationId = requestAnimationFrame(animate); + } + + private stopAnimation(): void { + if (this.animationId) { + cancelAnimationFrame(this.animationId); + this.animationId = null; + } + } + + private handleClick(): void { + this.dispatchEvent(new CustomEvent('screensaver-click')); + // Optionally hide on click + this.active = false; + } +} diff --git a/ts_web/elements/dees-screensaver/index.ts b/ts_web/elements/dees-screensaver/index.ts new file mode 100644 index 0000000..9ff042f --- /dev/null +++ b/ts_web/elements/dees-screensaver/index.ts @@ -0,0 +1 @@ +export * from './dees-screensaver.js'; diff --git a/ts_web/elements/helperclasses/formcontroller.ts b/ts_web/elements/helperclasses/formcontroller.ts new file mode 100644 index 0000000..382c647 --- /dev/null +++ b/ts_web/elements/helperclasses/formcontroller.ts @@ -0,0 +1,3 @@ +export class FormController { + +} \ No newline at end of file diff --git a/ts_web/elements/helperclasses/index.ts b/ts_web/elements/helperclasses/index.ts new file mode 100644 index 0000000..a731fe3 --- /dev/null +++ b/ts_web/elements/helperclasses/index.ts @@ -0,0 +1 @@ +export * from './formcontroller.js'; diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts new file mode 100644 index 0000000..32092ff --- /dev/null +++ b/ts_web/elements/index.ts @@ -0,0 +1,5 @@ +export * from './00zindex.js'; +export * from './00theme.js'; + +// Standalone Components +export * from './dees-screensaver/index.js'; diff --git a/ts_web/elements/interfaces/appbarmenuitem.ts b/ts_web/elements/interfaces/appbarmenuitem.ts new file mode 100644 index 0000000..37dfcb4 --- /dev/null +++ b/ts_web/elements/interfaces/appbarmenuitem.ts @@ -0,0 +1,34 @@ +import * as plugins from '../00plugins.js'; + +/** + * Divider menu item + */ +export interface IAppBarMenuDivider { + divider: true; +} + +/** + * Regular menu item + */ +export interface IAppBarMenuItemRegular extends plugins.tsclass.website.IMenuItem { + id?: string; + shortcut?: string; // e.g., "Cmd+S" or "Ctrl+S" + submenu?: IAppBarMenuItem[]; + disabled?: boolean; + checked?: boolean; // For checkbox menu items + radioGroup?: string; // For radio button menu items +} + +/** + * Extended menu item interface for app bar menus + * Can be either a regular menu item or a divider + */ +export type IAppBarMenuItem = IAppBarMenuItemRegular | IAppBarMenuDivider; + +/** + * Interface for the menu bar configuration + */ +export interface IMenuBar { + menuItems: IAppBarMenuItem[]; + onMenuSelect?: (item: IAppBarMenuItem) => void; +} \ No newline at end of file diff --git a/ts_web/elements/interfaces/appconfig.ts b/ts_web/elements/interfaces/appconfig.ts new file mode 100644 index 0000000..94ee00e --- /dev/null +++ b/ts_web/elements/interfaces/appconfig.ts @@ -0,0 +1,365 @@ +import type { TemplateResult } from '@design.estate/dees-element'; +import type { IAppBarMenuItem } from './appbarmenuitem.js'; +import type { IMenuItem } from './tab.js'; +import type { IMenuGroup } from './menugroup.js'; +import type { ISecondaryMenuGroup, ISecondaryMenuItem } from './secondarymenu.js'; + +// ========================================== +// BOTTOM BAR INTERFACES +// ========================================== + +/** + * Bottom bar widget status for styling + */ +export type TBottomBarWidgetStatus = 'idle' | 'active' | 'success' | 'warning' | 'error'; + +/** + * Generic status widget for the bottom bar + */ +export interface IBottomBarWidget { + /** Unique identifier for the widget */ + id: string; + /** Icon to display (lucide icon name) */ + iconName?: string; + /** Text label to display */ + label?: string; + /** Status affects styling (colors) */ + status?: TBottomBarWidgetStatus; + /** Tooltip text */ + tooltip?: string; + /** Whether the widget shows a loading spinner */ + loading?: boolean; + /** Click handler for the widget */ + onClick?: () => void; + /** Optional context menu items on right-click */ + contextMenuItems?: IBottomBarContextMenuItem[]; + /** Position: 'left' (default) or 'right' */ + position?: 'left' | 'right'; + /** Order within position group (lower = earlier) */ + order?: number; +} + +/** + * Context menu item for bottom bar widgets + */ +export interface IBottomBarContextMenuItem { + name: string; + iconName?: string; + action: () => void | Promise; + disabled?: boolean; + divider?: boolean; +} + +/** + * Bottom bar action (quick action button) + */ +export interface IBottomBarAction { + /** Unique identifier */ + id: string; + /** Icon to display */ + iconName: string; + /** Tooltip */ + tooltip?: string; + /** Click handler */ + onClick: () => void | Promise; + /** Whether action is disabled */ + disabled?: boolean; + /** Position: 'left' or 'right' (default) */ + position?: 'left' | 'right'; +} + +/** + * Bottom bar configuration + */ +export interface IBottomBarConfig { + /** Whether bottom bar is visible */ + visible?: boolean; + /** Initial widgets */ + widgets?: IBottomBarWidget[]; + /** Initial actions */ + actions?: IBottomBarAction[]; +} + +/** + * Bottom bar programmatic API + */ +export interface IBottomBarAPI { + /** Add a widget */ + addWidget: (widget: IBottomBarWidget) => void; + /** Update an existing widget by ID */ + updateWidget: (id: string, update: Partial) => void; + /** Remove a widget by ID */ + removeWidget: (id: string) => void; + /** Get a widget by ID */ + getWidget: (id: string) => IBottomBarWidget | undefined; + /** Clear all widgets */ + clearWidgets: () => void; + /** Add an action button */ + addAction: (action: IBottomBarAction) => void; + /** Remove an action by ID */ + removeAction: (id: string) => void; + /** Clear all actions */ + clearActions: () => void; +} + +// Forward declaration for circular reference +export type TDeesAppui = HTMLElement & { + setAppBarMenus: (menus: IAppBarMenuItem[]) => void; + updateAppBarMenu: (name: string, update: Partial) => void; + setBreadcrumbs: (breadcrumbs: string | string[]) => void; + setUser: (user: IAppUser | undefined) => void; + setProfileMenuItems: (items: IAppBarMenuItem[]) => void; + setSearchVisible: (visible: boolean) => void; + setWindowControlsVisible: (visible: boolean) => void; + setMainMenu: (config: IMainMenuConfig) => void; + updateMainMenuGroup: (groupName: string, update: Partial) => void; + addMainMenuItem: (groupName: string, tab: IMenuItem) => void; + removeMainMenuItem: (groupName: string, tabKey: string) => void; + setMainMenuSelection: (tabKey: string) => void; + setMainMenuCollapsed: (collapsed: boolean) => void; + setMainMenuVisible: (visible: boolean) => void; + setSecondaryMenuCollapsed: (collapsed: boolean) => void; + setSecondaryMenuVisible: (visible: boolean) => void; + setContentTabsVisible: (visible: boolean) => void; + setContentTabsAutoHide: (enabled: boolean, threshold?: number) => void; + setMainMenuBadge: (tabKey: string, badge: string | number) => void; + clearMainMenuBadge: (tabKey: string) => void; + setSecondaryMenu: (config: { heading?: string; groups: ISecondaryMenuGroup[] }) => void; + updateSecondaryMenuGroup: (groupName: string, update: Partial) => void; + addSecondaryMenuItem: (groupName: string, item: ISecondaryMenuItem) => void; + setSecondaryMenuSelection: (itemKey: string) => void; + clearSecondaryMenu: () => void; + setContentTabs: (tabs: IMenuItem[]) => void; + addContentTab: (tab: IMenuItem) => void; + removeContentTab: (tabKey: string) => void; + selectContentTab: (tabKey: string) => void; + getSelectedContentTab: () => IMenuItem | undefined; + activityLog: IActivityLogAPI; + setActivityLogVisible: (visible: boolean) => void; + toggleActivityLog: () => void; + getActivityLogVisible: () => boolean; + navigateToView: (viewId: string, params?: Record) => Promise; + getCurrentView: () => IViewDefinition | undefined; + // Bottom bar + bottomBar: IBottomBarAPI; + setBottomBarVisible: (visible: boolean) => void; + getBottomBarVisible: () => boolean; +}; + +/** + * User configuration for the app bar + */ +export interface IAppUser { + name: string; + email?: string; + avatar?: string; + status?: 'online' | 'offline' | 'busy' | 'away'; +} + +/** + * Activity entry for the activity log + */ +export interface IActivityEntry { + /** Unique identifier (auto-generated if not provided) */ + id?: string; + /** Timestamp (auto-set to now if not provided) */ + timestamp?: Date; + /** Activity type for icon styling */ + type: 'login' | 'logout' | 'view' | 'create' | 'update' | 'delete' | 'custom'; + /** User who performed the action */ + user: string; + /** Activity message */ + message: string; + /** Optional custom icon (overrides type-based icon) */ + iconName?: string; + /** Optional additional data */ + data?: Record; +} + +/** + * Activity log programmatic API + */ +export interface IActivityLogAPI { + /** Add a single activity entry */ + add: (entry: IActivityEntry) => void; + /** Add multiple activity entries */ + addMany: (entries: IActivityEntry[]) => void; + /** Clear all entries */ + clear: () => void; + /** Get all entries */ + getEntries: () => IActivityEntry[]; + /** Filter entries */ + filter: (criteria: { user?: string; type?: IActivityEntry['type'] }) => IActivityEntry[]; + /** Search entries by message */ + search: (query: string) => IActivityEntry[]; +} + +/** + * View activation context passed to onActivate lifecycle hook + */ +export interface IViewActivationContext { + /** Reference to the DeesAppui instance */ + appui: TDeesAppui; + /** The view ID being activated */ + viewId: string; + /** Route parameters if any */ + params?: Record; +} + +/** + * View lifecycle hooks interface + * Views can implement these methods to receive lifecycle notifications + */ +export interface IViewLifecycle { + /** Called when view is activated (displayed) */ + onActivate?: (context: IViewActivationContext) => void | Promise; + /** Called when view is deactivated (hidden) */ + onDeactivate?: () => void | Promise; + /** Called before navigation away - return false or message to block */ + canDeactivate?: () => boolean | string | Promise; +} + +/** + * View definition for the view registry + */ +export interface IViewDefinition { + /** Unique identifier for routing */ + id: string; + /** Display name */ + name: string; + /** Optional icon */ + iconName?: string; + /** + * The view content - can be: + * - Tag name string (e.g., 'my-dashboard') + * - Element class constructor + * - Template function returning TemplateResult + * - Async function returning any of the above (for lazy loading) + */ + content: + | string + | (new () => HTMLElement) + | (() => TemplateResult) + | (() => Promise HTMLElement) | (() => TemplateResult)>); + /** Secondary menu items specific to this view */ + secondaryMenu?: ISecondaryMenuGroup[]; + /** Content tabs specific to this view */ + contentTabs?: IMenuItem[]; + /** Optional route path (defaults to id). Supports params like 'settings/:section' */ + route?: string; + /** Badge to show on menu item */ + badge?: string | number; + badgeVariant?: 'default' | 'success' | 'warning' | 'error'; + /** Whether to cache this view instance (default: true) */ + cache?: boolean; +} + +/** + * Main menu section with view references + */ +export interface IMainMenuSection { + /** Section name (optional for ungrouped) */ + name?: string; + /** Views in this section (by ID reference) */ + views: string[]; +} + +/** + * Main menu configuration + */ +export interface IMainMenuConfig { + /** Logo icon */ + logoIcon?: string; + /** Logo text */ + logoText?: string; + /** Menu groups with tabs */ + groups?: IMenuGroup[]; + /** Menu sections with view references (alternative to groups) */ + sections?: IMainMenuSection[]; + /** Bottom pinned items (view IDs or tabs) */ + bottomItems?: string[]; + /** Bottom tabs */ + bottomTabs?: IMenuItem[]; +} + +/** + * App bar configuration + */ +export interface IAppBarConfig { + menuItems?: IAppBarMenuItem[]; + breadcrumbs?: string; + breadcrumbSeparator?: string; + showWindowControls?: boolean; + showSearch?: boolean; + user?: IAppUser; + profileMenuItems?: IAppBarMenuItem[]; +} + +/** + * Branding configuration + */ +export interface IBrandingConfig { + logoIcon?: string; + logoText?: string; +} + +/** + * Activity log configuration + */ +export interface IActivityLogConfig { + /** Whether activity log is visible */ + visible?: boolean; + /** Width of activity log panel */ + width?: number; +} + +/** + * Main unified configuration interface for dees-appui + */ +export interface IAppConfig { + /** Application branding */ + branding?: IBrandingConfig; + + /** App bar configuration */ + appBar?: IAppBarConfig; + + /** View definitions (the registry) */ + views: IViewDefinition[]; + + /** Main menu structure */ + mainMenu?: IMainMenuConfig; + + /** Default view ID to show on startup */ + defaultView?: string; + + /** Activity log configuration */ + activityLog?: IActivityLogConfig; + + /** Bottom bar configuration */ + bottomBar?: IBottomBarConfig; + + /** Event callbacks */ + onViewChange?: (viewId: string, view: IViewDefinition) => void; + onSearch?: (query: string) => void; +} + +/** + * View change event detail + */ +export interface IViewChangeEvent { + viewId: string; + view: IViewDefinition; + previousView?: IViewDefinition; + params?: Record; +} + +/** + * View lifecycle event (for rxjs Subject) + */ +export interface IViewLifecycleEvent { + type: 'activated' | 'deactivated' | 'loading' | 'loaded' | 'loadError'; + viewId: string; + element?: HTMLElement; + params?: Record; + error?: unknown; +} diff --git a/ts_web/elements/interfaces/index.ts b/ts_web/elements/interfaces/index.ts new file mode 100644 index 0000000..f857640 --- /dev/null +++ b/ts_web/elements/interfaces/index.ts @@ -0,0 +1,5 @@ +export * from './tab.js'; +export * from './appbarmenuitem.js'; +export * from './menugroup.js'; +export * from './appconfig.js'; +export * from './secondarymenu.js'; diff --git a/ts_web/elements/interfaces/menugroup.ts b/ts_web/elements/interfaces/menugroup.ts new file mode 100644 index 0000000..a2a30e9 --- /dev/null +++ b/ts_web/elements/interfaces/menugroup.ts @@ -0,0 +1,8 @@ +import type { IMenuItem } from './tab.js'; + +export interface IMenuGroup { + name: string; + items: IMenuItem[]; + collapsed?: boolean; + iconName?: string; +} diff --git a/ts_web/elements/interfaces/secondarymenu.ts b/ts_web/elements/interfaces/secondarymenu.ts new file mode 100644 index 0000000..7b57d21 --- /dev/null +++ b/ts_web/elements/interfaces/secondarymenu.ts @@ -0,0 +1,93 @@ +/** + * Secondary Menu Item Types + * + * Supports 8 item types: + * 1. Tab - selectable, stays highlighted (existing behavior) + * 2. Action - executes without selection (primary = blue) + * 3. Danger Action - red styling with optional confirmation + * 4. Filter - checkbox toggle, emits immediately + * 5. Multi-Filter - collapsible box with multiple checkboxes + * 6. Divider - visual separator + * 7. Header - non-interactive label + * 8. Link - opens URL + */ + +// Base properties shared by interactive items +export interface ISecondaryMenuItemBase { + key: string; + iconName?: string; + disabled?: boolean; + hidden?: boolean; +} + +// 1. Tab - existing behavior (selectable, stays highlighted) +export interface ISecondaryMenuItemTab extends ISecondaryMenuItemBase { + type?: 'tab'; // default if omitted for backward compatibility + action: () => void; + badge?: string | number; + badgeVariant?: 'default' | 'success' | 'warning' | 'error'; +} + +// 2 & 3. Action - executes without selection +export interface ISecondaryMenuItemAction extends ISecondaryMenuItemBase { + type: 'action'; + action: () => void | Promise; + variant?: 'primary' | 'danger'; // primary = blue (default), danger = red + confirmMessage?: string; // Shows confirmation dialog before executing +} + +// 4. Single filter toggle +export interface ISecondaryMenuItemFilter extends ISecondaryMenuItemBase { + type: 'filter'; + active: boolean; + onToggle: (active: boolean) => void; +} + +// 5. Multi-select filter group (collapsible) +export interface ISecondaryMenuItemMultiFilter extends ISecondaryMenuItemBase { + type: 'multiFilter'; + collapsed?: boolean; // Accordion state + options: Array<{ + key: string; + label: string; + checked: boolean; + iconName?: string; + }>; + onChange: (selectedKeys: string[]) => void; +} + +// 6. Divider +export interface ISecondaryMenuItemDivider { + type: 'divider'; +} + +// 7. Header/Label +export interface ISecondaryMenuItemHeader { + type: 'header'; + label: string; +} + +// 8. External link +export interface ISecondaryMenuItemLink extends ISecondaryMenuItemBase { + type: 'link'; + href: string; + external?: boolean; // Opens in new tab (default: true if href starts with http) +} + +// Union type for all secondary menu items +export type ISecondaryMenuItem = + | ISecondaryMenuItemTab + | ISecondaryMenuItemAction + | ISecondaryMenuItemFilter + | ISecondaryMenuItemMultiFilter + | ISecondaryMenuItemDivider + | ISecondaryMenuItemHeader + | ISecondaryMenuItemLink; + +// Group interface for secondary menu +export interface ISecondaryMenuGroup { + name: string; + iconName?: string; + collapsed?: boolean; + items: ISecondaryMenuItem[]; +} diff --git a/ts_web/elements/interfaces/tab.ts b/ts_web/elements/interfaces/tab.ts new file mode 100644 index 0000000..717b84b --- /dev/null +++ b/ts_web/elements/interfaces/tab.ts @@ -0,0 +1,9 @@ +export interface IMenuItem { + key: string; + iconName?: string; + action: () => void; + badge?: string | number; + badgeVariant?: 'default' | 'success' | 'warning' | 'error'; + closeable?: boolean; + onClose?: () => void; +} diff --git a/ts_web/index.ts b/ts_web/index.ts new file mode 100644 index 0000000..326f309 --- /dev/null +++ b/ts_web/index.ts @@ -0,0 +1,4 @@ +export * from './elements/index.js'; +import * as colors from './elements/00colors.js'; +export { colors }; +export { commitinfo } from './00_commitinfo_data.js'; diff --git a/ts_web/pages/index.ts b/ts_web/pages/index.ts new file mode 100644 index 0000000..081febb --- /dev/null +++ b/ts_web/pages/index.ts @@ -0,0 +1,2 @@ +export * from './mainpage.js'; +export * from './input-showcase.js'; \ No newline at end of file diff --git a/ts_web/pages/input-showcase.ts b/ts_web/pages/input-showcase.ts new file mode 100644 index 0000000..afc8298 --- /dev/null +++ b/ts_web/pages/input-showcase.ts @@ -0,0 +1,668 @@ +import { html, css, cssManager } from '@design.estate/dees-element'; +import '../elements/index.js'; + +export const inputShowcase = () => html` +
+ + +
+ + + +
+

Input Components Showcase

+

+ A comprehensive collection of input components for building modern web forms and interfaces. +
All components support dark mode, validation, and integrate seamlessly with dees-form. +

+
+ + +
+
+
📝
+

Text Inputs

+
+

+ Standard text input components for collecting various types of textual data. + Includes password fields, validation, and specialized formatting. +

+ + +
+ + + + + + + +
+
+ + + + +
+// Search with custom suggestions +<dees-searchbar + .placeholder="Search products..." + .suggestions=${['Laptop', 'Phone', 'Tablet']} +></dees-searchbar> +
+
+
+ + +
+
+
☑️
+

Selection Inputs

+
+

+ Components for selecting from predefined options. Includes checkboxes, radio buttons, + dropdowns, and multi-select controls. +

+ + +
+
+ + + + + +
+ +
+ +
+
+
+ + +
+ + + +
+
+ + + + + + + + + + + + +
+ + + +
+
+
+ + +
+
+
🔢
+

Numeric Inputs

+
+

+ Specialized inputs for numeric values, including quantity selectors and formatted inputs. +

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

Special Inputs

+
+

+ Specialized input components for specific data types like phone numbers, IBAN, and file uploads. +

+ + +
+ + + + + +
+
+ + +
+ + + +
+
+ + + + + + + + +
+ + + + + +
+
+
+ + +
+
+
📄
+

Rich Text Editors

+ New! +
+

+ Advanced text editors for creating rich content with formatting, images, and structured blocks. +

+ + + + + + + + +
+ + +
+
+
📋
+

Form Integration

+
+

+ All input components integrate seamlessly with dees-form for validation, + submission handling, and data management. +

+ + + +

User Registration

+ +
+ + + +
+ + + + + + + + + + + + + + + + +
+
+ + +
+
+ ✅ Validation +

Built-in validation for all input types

+
+
+ 🔄 Two-way Binding +

Automatic data synchronization

+
+
+ 📊 Data Collection +

Easy form data extraction

+
+
+ 🎨 Theming +

Consistent styling across all inputs

+
+
+
+
+
+
+`; \ No newline at end of file diff --git a/ts_web/pages/mainpage.ts b/ts_web/pages/mainpage.ts new file mode 100644 index 0000000..91b9d78 --- /dev/null +++ b/ts_web/pages/mainpage.ts @@ -0,0 +1,5 @@ +import { html } from '@design.estate/dees-element'; + +export const mainPage = () => html` +
hello
+`; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5e7e079 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "skipLibCheck": false + }, + "exclude": [ + "dist_*/**/*.d.ts" + ] +}