diff --git a/.agents/skills/component-migration/SKILL.md b/.agents/skills/component-migration/SKILL.md
new file mode 100644
index 00000000..beb0240a
--- /dev/null
+++ b/.agents/skills/component-migration/SKILL.md
@@ -0,0 +1,58 @@
+---
+name: component-migration
+description: A skill to migrate and colocate component-related files (logic, types, and styles) into a unified directory structure using kebab-case filenames for the main entry file.
+---
+
+# Skill: Component File Colocation Migration
+
+**Goal**: Standardize the `src/components` directory by moving logic, types, and styles into individual component folders using explicit kebab-case naming for the entry file.
+
+## Target Structure
+For a component named `my-element`:
+```
+src/components/group/my-element/
+├── my-element.ts # Main component logic (Kebab-case, NOT index.ts)
+├── my-element.types.ts # Interfaces and types
+└── my-element.styles.ts # Lit styles (extracted)
+```
+This operates on `my-element.*.ts` files that **already exist** — relocate and rename them (creating the per-element directory via `git mv` to preserve history), but do **not** author new code or extract/refactor existing logic. The only edits to file *contents* are `import`/`export` paths and the JSDoc/TSDoc references that point at moved files.
+
+## Implementation Guidelines
+
+1. **Type & style migration — single-consumer rule only**:
+ - Colocate a definition from `src/types` or `src/styles` into a component's folder **only when exactly one `src/components/**` unit imports it** *and* nothing else does.
+ - When assessing "nothing else", **ignore `src/index.ts` and barrel `index.ts` files** — a side-effect import there does not count as a second consumer (but still update those paths afterward, see step 4).
+ - If a definition has **more than one consumer** — e.g. a component *and* a `src/partials/**` view, or two components — **leave it in its shared location**. Do NOT pull a shared definition into one component's folder; that just creates a new cross-unit import into component internals.
+ - Rename relocated files to the colocation convention: `.types.ts` and `.styles.ts`.
+ - Update the owning component to `import` the relocated files.
+
+2. **Import resolution**:
+ - Use **relative** imports for colocated siblings (e.g. `./my-element.types`, `./my-element.styles`).
+ - Use **`@/` aliases** for every non-sibling import. (Siblings are relative; everything else stays aliased — never a `@/` path to a file in the same folder.)
+
+3. **Documentation references (mandatory)**:
+ - When a file is moved or renamed, update **every** JSDoc/TSDoc reference that points at it so links still resolve: `{@link …}`, `{@linkcode …}`, `{@inheritDoc …}`, `@see`, `@module`, and any module-path mentions in prose comments — both in the moved file and in any file referencing it.
+ - A move is not complete until these references resolve to the new location/symbol.
+
+4. **Clean up**:
+ - As directories are emptied, remove any now-unnecessary files and folders (including barrel `index.ts` files).
+ - Update `src/index.ts` (and any barrels) to point at the new paths.
+
+## Spaghetti-`import` detection
+
+While migrating, watch for files whose import graph is a smell. Flag a file when **either**:
+
+- **Fan-out** — it imports from **≥3 distinct, unrelated internal (`@/…`) areas**, or
+- **Fan-in** — it is imported by **≥4 distinct files** spanning **≥2 unrelated areas**.
+
+Exclude from these counts: external packages (`lit`, `@material/web`, …), a component's own children and `@/data` content, `src/index.ts`, and barrel `index.ts` files.
+
+When a file trips either condition:
+
+- Record the finding in a repo-root **`TODOS.md`** (create it if absent) under an `h2` (`##`) section titled exactly:
+ `YYYY-MM-DD @ HH:mm:ss | Component Migration | Spaghetti `import`s`
+ (use a real timestamp; one section per audit run — append findings to the existing run's section).
+- For each finding, name the file, give the fan-out/fan-in counts and areas, and add a **small decoupling suggestion** — **unless this migration already resolves it** (e.g. the coupling disappears once a single-consumer type is colocated), in which case just say so.
+- Distinguish *acceptable* high coupling (e.g. a dependency-free shared leaf like a design-token module) from genuine spaghetti, and mark it as such rather than inventing work.
+
+Record findings in `TODOS.md`, not as inline comments scattered across the source files.
diff --git a/.agents/skills/ensure-code-documentation/SKILL.md b/.agents/skills/ensure-code-documentation/SKILL.md
new file mode 100644
index 00000000..f6c9733e
--- /dev/null
+++ b/.agents/skills/ensure-code-documentation/SKILL.md
@@ -0,0 +1,34 @@
+---
+name: ensure-code-documentation
+description: A skill to ensure that code is properly documented, including docstrings, comments, TypeDoc compliant annotations, proper JSDoc/TSDoc comments, and, where possible, properly formatted and annotated code samples.
+---
+
+# Documentation Enforcement Skill
+
+**Goal**: Ensure that all code is properly documented with clear and comprehensive docstrings, comments, and annotations. This includes adhering to TypeDoc standards, using proper JSDoc/TSDoc comments, and providing well-formatted code samples where applicable.
+
+## Implementation Guidelines
+
+1. **Check What's Already There**:
+ - Review existing code for documentation. Identify areas that lack docstrings, comments, or proper annotations.
+ - Correct any existing documentation that is incomplete, inaccurate, incorrectly formatted, or with invalid linking (external or cross code-base).
+ - Spelling and grammar should be correct, and the writing in the third-person inclusive voice (use `we` instead of `I` or `you`).
+
+2. **Complete Incomplete Documentation**:
+ - For code that is documented *incompletely*, prioritize fleshing out existing documentation and targeting 100% file coverage before adding new documentation to undocumented files.
+ - Review all documentation as an entire file (for single-definition files) as a cohesive document; it should read as cohesively as the code is organized.
+ - Files that contain multiple definitions should read as if each `export`-ed definition is a separate file. For non `export`-ed definitions, documentation can be more brief and should link to the relevant `export`-ed definition(s) for more information.
+
+3. **Add New Documentation**:
+ - For code that is completely undocumented, analyze the intent and use cases of the code and generate comprehensive documentation including:
+ - Proper `JSDoc`/`TSDoc` `@` tags
+ - Accurate type declarations
+ - Code samples and referential links where applicable
+
+4. **Maintain Consistency**:
+ - Ensure that all documentation follows a consistent style and format across the codebase. Tone must be from a single voice (third-person inclusive) and the writing style should be clear, concise, and informative.
+ - Use consistent formatting for code samples, including proper indentation and syntax highlighting, adhering to the `2 space` indentation convention and patterns of the codebase.
+
+5. **README.md Files**:
+ - Add an `index`-like `README.md` file to each `src/components` entry.
+ - Treat each `src/components/` as something that will be published as an **independent** package (with its own `package.json` and the like).
\ No newline at end of file
diff --git a/.codex/config.toml b/.codex/config.toml
new file mode 100644
index 00000000..f581bbdf
--- /dev/null
+++ b/.codex/config.toml
@@ -0,0 +1,7 @@
+[mcp_servers."io.github.wonderwhy-er/desktop-commander"]
+ command = "npx"
+ args = [
+ "--registry",
+ "https://registry.npmjs.org",
+ "@wonderwhy-er/desktop-commander@0.2.43",
+ ]
diff --git a/.config/mise/config.toml b/.config/mise/config.toml
index 615cf686..9932fc1a 100644
--- a/.config/mise/config.toml
+++ b/.config/mise/config.toml
@@ -24,9 +24,9 @@ monorepo_root = true
npm = "12.0.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
[deps]
pnpm = {
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 93ab0cd8..d4e92389 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -17,6 +17,9 @@
"[lit]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
+ "[postcss]": {
+ "editor.defaultFormatter": "stylelint.vscode-stylelint"
+ },
"[python]": {
"diffEditor.ignoreTrimWhitespace": false,
"editor.defaultFormatter": "ms-python.python",
@@ -24,7 +27,7 @@
"editor.wordBasedSuggestions": "off"
},
"[toml]": {
- "editor.defaultFormatter": "tamasfe.even-better-toml",
+ "editor.defaultFormatter": "tombi-toml.tombi",
"editor.detectIndentation": true
},
"[typescript]": {
@@ -48,20 +51,27 @@
]
}
},
+ "css.completion.completePropertyWithSemicolon": true,
"css.customData": [
"${workspaceFolder}/.vscode/custom-elements-manifest/vscode.css-custom-data.json"
],
+ "css.format.enable": true,
+ "css.format.spaceAroundSelectorSeparator": true,
+ "css.hover.documentation": true,
+ "css.hover.references": true,
+ "css.lint.importStatement": "ignore",
+ "css.lint.vendorPrefix": "ignore",
"css.styleSheets": [
"node_modules/material-symbols/material-symbols-outlined.css",
"node_modules/@fnc314/packages.design-tokens/dist/@fnc314.packages.design-tokens.css",
"**/${fileBasenameNoExtension}.styles.ts",
+ "${workspaceFolder}/packages/design-tokens/assets/css/*.css",
],
- "css.format.spaceAroundSelectorSeparator": true,
- "css.lint.importStatement": "ignore",
- "css.lint.vendorPrefix": "ignore",
+ "css.trace.server": "verbose",
+ "css.validate": true,
"cssCustomProperties.files": [
- "${workspaceFolder}/index.css",
- "${workspaceFolder}/packages/design-tokens/**/*.css",
+ "${workspaceFolder}/sites/portfolio/index.css",
+ "${workspaceFolder}/packages/design-tokens/assets/css/*.css",
"${workspaceFolder}/node_modules/@fnc314/packages.design-tokens/@fnc314.packages.design-tokens.css",
],
"debug.javascript.defaultRuntimeExecutable": {
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 00000000..21d82f6e
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,93 @@
+# AGENTS.md
+
+This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
+
+## What this is
+
+The personal portfolio website for Franco N. Colaizzi (fnc314.com), built as a single-page app of **Lit web components** styled with **Material Web (Material Design 3)**, written in TypeScript. It deploys as a static site to GitHub Pages, with a separate Firebase Functions backend in `functions/`.
+
+## Toolchain: pnpm + mise
+
+- Package manager is **pnpm 11.5** (not npm). Node 26, Firebase CLI, and other tools are pinned via **mise** (`mise.toml`). Run `mise install` before first use.
+- Dependency *versions* are not in `package.json` — every dep reads `catalog:` and the actual version is resolved from the catalogs in `pnpm-workspace.yaml`. To change a version, edit the catalog there, not `package.json`.
+- `bin/*` are thin shell wrappers that `exec mise run `. Task definitions live in `.mise/tasks/`.
+
+## Build system: migrating Rollup → Vite
+
+This branch (`feature/vite`) is mid-migration from Rollup to Vite. **Both build systems coexist** and write to separate output dirs:
+
+- **Vite** (`vite.config.ts`) → `dist/vite//`. This is the source of truth for deploys — GitHub Pages publishes `dist/vite/production` (see `.github/workflows/gh-pages.yaml` → `mise run github:deploy` → `vite build -m production`).
+- **Rollup** (`rollup.config.ts`) → `dist/rollup//`. Legacy path, still wired into the `build`/`deploy`/`serve` npm scripts.
+
+When adding build behavior, prefer the Vite config unless explicitly working on the Rollup path.
+
+## Common commands
+
+```bash
+mise run vite-prod-dev # vite build for BOTH dev + prod (local), into dist/vite/*
+mise run github:deploy # production vite build (what CI deploys)
+pnpm serve # @web/dev-server dev server (rollup-era)
+pnpm build:website:watch # rollup watch build for local dev
+pnpm lint # lit-analyzer + eslint over src/**/*.ts
+pnpm lint:eslint:fix # eslint --fix
+pnpm format # prettier --write over src
+pnpm test # web-test-runner, dev + prod modes
+pnpm test:watch # wtr --watch
+pnpm build:tsc # type-check / emit .d.ts only (tsc)
+pnpm cem-analyze # regenerate the Custom Elements Manifest
+```
+
+Run a single test by filtering web-test-runner, e.g. `pnpm wtr --group default --files 'src/**/foo.test.ts'`. (No test files exist yet; `pnpm test` runs the default wtr config.)
+
+## Generated files — do not hand-edit
+
+- **`README.md`** is auto-generated web-component-analyzer markdown (`pnpm dx:wca`). Don't edit it by hand.
+- **`docs/`** holds generated output: TypeDoc HTML (`pnpm typedoc:gen`), CEM JSON, and WCA markdown/JSON. Regenerate via the `dx:*` scripts rather than editing.
+- The **Custom Elements Manifest** drives IDE autocomplete and the docs. After changing a component's public API (props, slots, CSS custom props, events), regenerate with `pnpm cem-analyze`. Manifest tooling config lives in `.cem.yaml` and `.config/`.
+
+## Architecture
+
+### Services — singleton `EventTarget`s wired by constructor DI
+
+`src/services/` holds the app's shared state, each an exported singleton instance of a class extending `EventTarget`. They form a dependency chain via constructor injection (`storage → configs → theme`) and communicate with components by dispatching **`CustomEvent`s that bubble + compose**, with event types augmented onto `GlobalEventHandlersEventMap`:
+
+- `storage-service` — typed `localStorage` wrapper.
+- `configs-service` — persists `AppConfigs` (color scheme, FAB layout); dispatches `app-configs.change`. Also does forward-migration of older stored config shapes on load.
+- `theme-service` — resolves the active `ThemeConfig` + Material scheme name from configs + `prefers-color-scheme`.
+- `router-service` — hash-based routing; dispatches `router.change` / `router.back`.
+
+Components listen for these events rather than holding references to the services where possible.
+
+### Components, partials, and routing
+
+- `src/components/` — reusable Lit elements (`app-shell` is the root; `nav-component`, `fab-menu`, dialogs, `word-cloud`, etc.).
+- `src/partials/` — route-level view containers (`info`, `work`, `code`, `blog`).
+- Routing is **hash-based**, no server routes. The route set is `ROUTES` in `src/types/components/nav/routes.ts` (`info`/`work`/`code`/`blog`). `app-shell` swaps the active partial; `nav-component` syncs tabs to `window.location.hash`.
+- `src/index.ts` is the single entry: it side-effect-imports every component and Material element, instantiates the service singletons, and on `DOMContentLoaded` adopts the Material + typescale stylesheets into `document.adoptedStyleSheets` and applies the resolved theme.
+
+### Theming
+
+Multiple named themes (`chicago`, `inter`, `red`, `sunset`) live in `src/theme//`, each exporting a `ThemeConfig` built from JSON color-scheme data, aggregated into `THEME_CONFIGS`. Colors map to **M3 design tokens** (`--md-sys-color-*`) applied through a shared `MaterialCSSStyleSheet`. The scheme is the cross-product of mode (dark/light/system) × contrast (normal/medium/high). Component-local styling uses scoped CSS custom properties (e.g. `--word-tag-*`) that default to Material tokens.
+
+**Design Token Enforcement:**
+- Use `@fnc314/design-tokens` for all design-related values (colors, spacing, typography).
+- `stylelint` strictly enforces the use of tokens. If you encounter lint errors, replace hardcoded values with appropriate tokens.
+- Run `mise run lint-tokens` to check compliance.
+
+### Data
+
+Site content is data-driven from `src/data/*.json` (`bio`, `work`, `code`, `blog`, `skills`, `education`, `connections`, `photo`). Edit JSON to change content; components render from it.
+
+### Path aliases
+
+Imports use `@/*` → `src/*` (also `@/components/*`, `@/services/*`, `@/theme/*`, `@/types/*`), defined in `tsconfig.json` and mirrored in the build configs. Prefer aliases over deep relative paths.
+
+## Firebase (`functions/`)
+
+`functions/` is an independent package (its own `package.json`, `tsconfig`, eslint config) for Firebase Cloud Functions. `firebase.json` also configures Firestore rules (`firebase/firestore/`) and App Hosting. Build/lint/deploy from within that dir (`pnpm --prefix functions run build|lint|deploy`); its lint+build run as Firebase predeploy hooks.
+
+## Conventions
+
+- Strict TypeScript throughout; Lit decorators (`useDefineForClassFields: false`, `experimentalDecorators`).
+- Linting is **lit-analyzer + eslint** (lit, lit-a11y, wc, tsdoc plugins) for TS, **stylelint** for CSS. The `ts-lit-plugin` and `custom-elements-lsp` give in-editor template type-checking against the CEM.
+- Document component public API with TSDoc/JSDoc tags (`@slot`, `@cssprop`, `@fires`, etc.) — these feed the manifest and generated docs.
diff --git a/configs/@pwrs-cem/.config/mise/config.toml b/configs/@pwrs-cem/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/configs/@pwrs-cem/.config/mise/config.toml
+++ b/configs/@pwrs-cem/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/configs/eslint/.config/mise/config.toml b/configs/eslint/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/configs/eslint/.config/mise/config.toml
+++ b/configs/eslint/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/configs/prettier/.config/mise/config.toml b/configs/prettier/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/configs/prettier/.config/mise/config.toml
+++ b/configs/prettier/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/configs/typedoc/.config/mise/config.toml b/configs/typedoc/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/configs/typedoc/.config/mise/config.toml
+++ b/configs/typedoc/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/configs/typescript/.config/mise/config.toml b/configs/typescript/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/configs/typescript/.config/mise/config.toml
+++ b/configs/typescript/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/firebase/functions/node/.config/mise/config.toml b/firebase/functions/node/.config/mise/config.toml
index 59485b54..583ce34a 100644
--- a/firebase/functions/node/.config/mise/config.toml
+++ b/firebase/functions/node/.config/mise/config.toml
@@ -2,8 +2,8 @@
firebase = "15.24.0"
node = "26.5.0"
tombi = "1.1.5"
- usage = "3.5.5"
- pnpm = "11.15.1"
+ usage = "3.5.6"
+ pnpm = "11.16.0"
"npm:vite" = "8.1.5"
"npm:corepack" = "0.35.0"
npm = "12.0.0"
diff --git a/firebase/functions/node/package.json b/firebase/functions/node/package.json
index 541be605..7ffe22b8 100644
--- a/firebase/functions/node/package.json
+++ b/firebase/functions/node/package.json
@@ -1,6 +1,6 @@
{
"name": "@fnc314/functions.node",
- "version": "2.1.0",
+ "version": "3.0.0",
"private": true,
"description": "Firebase Cloud Functions for www.fnc314.com",
"author": "Franco N. Colaizzi",
@@ -32,14 +32,14 @@
"overrides": {
"uuid": "catalog:overrides"
},
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"engines": {
"node": "26.5.0"
},
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
},
diff --git a/manifest.json b/manifest.json
index 06db197e..3f23375f 100644
--- a/manifest.json
+++ b/manifest.json
@@ -7,7 +7,7 @@
"short_name": "fnc314.com",
"author": "Franco N. Colaizzi",
"description": "Personal Website of Franco N. Colaizzi - fnc314",
- "version": "2.1.0",
+ "version": "3.0.0",
"name": "fnc314.com",
"manifest_version": "3",
"display": "standalone",
diff --git a/package.json b/package.json
index e9d3a3e9..2e8922cb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@fnc314/fnc314.github.io",
- "version": "2.1.0",
+ "version": "3.0.0",
"description": "Website for Franco N. Colaizzi - fnc314.com",
"homepage": "https://fnc314.com",
"license": "ISC",
@@ -14,7 +14,7 @@
"types": "./dist/out",
"main": "./dist/vite/production/assets/index.js",
"web-types": "./.idea/web-types.json",
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"keywords": [
"website",
"homepage",
@@ -206,7 +206,7 @@
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
}
diff --git a/packages/.config/mise/config.toml b/packages/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/packages/.config/mise/config.toml
+++ b/packages/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/packages/components/.config/mise/config.toml b/packages/components/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/packages/components/.config/mise/config.toml
+++ b/packages/components/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/packages/components/package.json b/packages/components/package.json
index 18b89939..79181b05 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -28,7 +28,7 @@
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
},
@@ -47,7 +47,7 @@
"license": "ISC",
"main": "./dist/@fnc314.packages.components.js",
"name": "@fnc314/packages.components",
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"private": true,
"repository": {
"type": "git",
@@ -55,5 +55,5 @@
},
"type": "module",
"types": "./dist/types/index.d.ts",
- "version": "2.1.0"
+ "version": "3.0.0"
}
\ No newline at end of file
diff --git a/packages/components/src/bento-layout/bento-layout.styles.ts b/packages/components/src/bento-layout/bento-layout.styles.ts
index 6bdb3758..dbf031e3 100644
--- a/packages/components/src/bento-layout/bento-layout.styles.ts
+++ b/packages/components/src/bento-layout/bento-layout.styles.ts
@@ -16,6 +16,7 @@ export const BentoLayoutStyles = css`
--bento-layout-card-background: var(--md-sys-color-surface-container-lowest);
--bento-layout-card-color: var(--md-sys-color-on-surface);
--bento-layout-card-shape: var(--md-sys-shape-corner-medium);
+ --bento-layout-card-border-color: var(--md-sys-color-primary);
background-color: var(--globals-color-background);
color: var(--md-sys-color-on-surface);
@@ -23,6 +24,7 @@ export const BentoLayoutStyles = css`
inline-size: 100%;
padding-block-end: var(--spaces-padding-xl);
container-name: bento-layout;
+ container-type: inline-size;
}
main {
@@ -37,7 +39,6 @@ export const BentoLayoutStyles = css`
border: var(--sizes-thickness-hairline) solid var(--md-sys-color-on-primary-container);
border-radius: var(--md-sys-shape-corner-large);
color: var(--md-sys-color-on-primary-container);
- grid-area: span 1 / span var(--bento-layout-column-count);
inline-size: 100%;
margin-inline: auto;
padding-block: var(--spaces-padding-l);
@@ -56,6 +57,7 @@ export const BentoLayoutStyles = css`
p {
text-align: center;
margin-block: var(--spaces-none);
+ font-family: var(--md-ref-typeface-brand);
}
}
}
@@ -66,6 +68,10 @@ export const BentoLayoutStyles = css`
grid-auto-flow: dense;
grid-template-columns: repeat(var(--bento-layout-column-count), 1fr);
}
+
+ header {
+ grid-area: header;
+ }
}
@container style(--breakpoint-label: tablet) {
@@ -77,6 +83,14 @@ export const BentoLayoutStyles = css`
align-items: unset;
gap: var(--spaces-gap-m);
padding: var(--spaces-padding-s);
+ grid-template-areas:
+ "header header header header header header"
+ "profile profile connections connections connections connections"
+ "profile profile experience experience experience experience"
+ "code code code blog blog blog"
+ "skills skills skills skills education education"
+ "settings settings settings settings settings settings"
+ ;
}
}
@@ -87,6 +101,14 @@ export const BentoLayoutStyles = css`
main {
gap: var(--spaces-gap-l);
+ grid-template-areas:
+ "header header header header header header header header header header header header"
+ "profile profile profile profile connections connections connections connections connections connections connections connections"
+ "profile profile profile profile experience experience experience experience experience experience experience experience"
+ "code code code code code code blog blog blog blog blog blog"
+ "skills skills skills skills skills skills skills skills education education education education"
+ "settings settings settings settings settings settings settings settings settings settings settings settings"
+ ;
margin: var(--spaces-none) auto;
padding: var(--spaces-padding-m);
place-items: stretch stretch;
@@ -150,5 +172,9 @@ export const TransitionStyles = css`
> *:nth-child(9) {
animation-delay: var(--motions-delay-xxxl);
}
+
+ > *:nth-child(10) {
+ animation-delay: var(--motions-delay-xxxl);
+ }
}
`;
diff --git a/packages/components/src/bento-layout/bento-layout.ts b/packages/components/src/bento-layout/bento-layout.ts
index 5a33c131..14e22dab 100644
--- a/packages/components/src/bento-layout/bento-layout.ts
+++ b/packages/components/src/bento-layout/bento-layout.ts
@@ -1,10 +1,10 @@
import { BentoLayoutStyles, TransitionStyles } from "@/lib/bento-layout/bento-layout.styles";
import { UIAwareElement } from "@/lib/mixins/ui-aware-element/ui-aware-element";
import { TextStyles } from "@/lib/styles";
-import { BentoBoxConfigsArray, titles } from "@fnc314/packages.data";
-import { type ABentoBoxConfig, BENTO_BOX_TYPES, BreakpointLabels, type GridPosition } from "@fnc314/packages.types";
+import { BENTO_BOX_CONFIG, titles } from "@fnc314/packages.data";
+import { BENTO_BOX_TYPES, type BentoBoxConfig, type BentoBoxType, BreakpointLabels } from "@fnc314/packages.types";
import { type TemplateResult, html, nothing } from "lit";
-import { customElement, state } from "lit/decorators.js";
+import { customElement } from "lit/decorators.js";
import { styleMap } from "lit/directives/style-map.js";
import { unsafeHTML } from "lit/directives/unsafe-html.js";
import { author } from "~build/package";
@@ -21,99 +21,93 @@ export class BentoLayout extends UIAwareElement {
/** {@link @lit/reactive-element!css} */
static override styles = [TextStyles, BentoLayoutStyles, TransitionStyles];
- @state()
- private _bentoBoxConfigs: ABentoBoxConfig[] = BentoBoxConfigsArray(this.breakpoint);
-
- private renderBentoBox(config: ABentoBoxConfig): TemplateResult {
- const position: GridPosition = config.placement[this.breakpoint];
-
- let gridStyles = {};
- if (position.breakpoint !== BreakpointLabels.mobile) {
- const rowOffset = `${position?.offsets?.row ? `${position?.offsets?.row} / ` : ""}`;
- const colOffset = `${position?.offsets?.col ? `${position?.offsets?.col} / ` : ""}`;
- gridStyles = {
- gridColumn: `${colOffset} span ${position.span.colSpan}`,
- gridRow: `${rowOffset} span ${position.span.rowSpan}`,
- };
+ private renderBentoBox(configName: BentoBoxType, config: BentoBoxConfig): TemplateResult {
+ let cardStyles = { };
+ if (this.breakpoint !== BreakpointLabels.mobile) {
+ cardStyles = { gridArea: configName };
}
- let cardContent: TemplateResult;
- switch (config.type) {
+ cardStyles = {
+ ...cardStyles,
+ blockSize: "100%"
+ };
+
+ switch (configName) {
case BENTO_BOX_TYPES.profile:
- cardContent = html`
+ return html`
`;
- break;
+ case BENTO_BOX_TYPES.connections:
+ return html`
+
+
+ `;
case BENTO_BOX_TYPES.education:
- cardContent = html`
+ return html`
`;
- break;
case BENTO_BOX_TYPES.experience:
- cardContent = html`
+ return html`
`;
- break;
case BENTO_BOX_TYPES.blog:
- cardContent = html`
+ return html`
`;
- break;
case BENTO_BOX_TYPES.code:
- cardContent = html`
+ return html`
`;
- break;
case BENTO_BOX_TYPES.skills:
- cardContent = html`
+ return html`
`;
- break;
case BENTO_BOX_TYPES.settings:
- cardContent = html`
+ return html`
`;
- break;
default:
return html`${nothing}`;
}
-
- return cardContent;
}
override render() {
@@ -125,7 +119,16 @@ export class BentoLayout extends UIAwareElement {
`;
- const boxes = this._bentoBoxConfigs.map((boxConfig) => this.renderBentoBox(boxConfig));
+ const boxes = Object
+ .entries(BENTO_BOX_CONFIG)
+ .sort(
+ (configA: [string, BentoBoxConfig], configB: [string, BentoBoxConfig]) =>
+ configA[1].order - configB[1].order
+ )
+ .map(
+ ([configName, boxConfig]: [string, BentoBoxConfig]) =>
+ this.renderBentoBox(configName as BentoBoxType, boxConfig)
+ );
return html`
${header}
diff --git a/packages/components/src/card/bento/bento-card.styles.ts b/packages/components/src/card/bento/bento-card.styles.ts
index 2e47158f..7a370072 100644
--- a/packages/components/src/card/bento/bento-card.styles.ts
+++ b/packages/components/src/card/bento/bento-card.styles.ts
@@ -20,7 +20,7 @@ export const BentoCardStyles = css`
display: block;
inline-size: 100%;
- --md-focus-ring-shape: var(--md-sys-shape-corner-small);
+ --md-focus-ring-shape: var(--bento-layout-card-shape);
}
article {
@@ -28,6 +28,8 @@ export const BentoCardStyles = css`
flex-direction: column;
justify-content: center;
align-items: stretch;
+ border-radius: var(--bento-layout-card-shape);
+ border: solid var(--sizes-thickness-hairline) var(--bento-layout-card-border-color);
&:has(details[open]) {
}
@@ -45,8 +47,8 @@ export const BentoCardStyles = css`
color: var(--bento-layout-card-color);
display: flex;
flex-direction: column;
-
padding: var(--spaces-padding-s);
+ will-change: transform, box-shadow, border-color, background-color;
transition:
transform var(--motions-duration-short) var(--motions-easing-emphasized),
box-shadow var(--motions-duration-short) var(--motions-easing-base),
diff --git a/packages/components/src/card/blog/blog-card.ts b/packages/components/src/card/blog/blog-card.ts
index 40204be1..47b1a404 100644
--- a/packages/components/src/card/blog/blog-card.ts
+++ b/packages/components/src/card/blog/blog-card.ts
@@ -29,7 +29,7 @@ export class BlogCard extends UIAwareElement {
override connectedCallback() {
super.connectedCallback();
- this.id = "blog";
+ this.id = BENTO_BOX_TYPES.blog;
}
override render() {
@@ -44,7 +44,7 @@ export class BlogCard extends UIAwareElement {
.bentoTag=${BENTO_BOX_TYPES.blog}
>
- ${Blogs.map((entry: BlogEntryJson) => html` `)}
+ ${Blogs.map((blogEntry: BlogEntryJson) => html` `)}
`;
diff --git a/packages/components/src/card/code/code-card.ts b/packages/components/src/card/code/code-card.ts
index a034cfd8..21429d84 100644
--- a/packages/components/src/card/code/code-card.ts
+++ b/packages/components/src/card/code/code-card.ts
@@ -9,7 +9,7 @@ import { html } from "lit";
import { customElement, property } from "lit/decorators.js";
/**
- * @summary CodeCard - A card component displaying code projects.
+ * @summary A card component displaying code projects.
*
* @element code-card
*/
@@ -29,7 +29,7 @@ export class CodeCard extends UIAwareElement {
override connectedCallback() {
super.connectedCallback();
- this.id = "code";
+ this.id = BENTO_BOX_TYPES.code;
}
override render() {
@@ -43,7 +43,13 @@ export class CodeCard extends UIAwareElement {
.bentoCardTitle=${"Code"}
.bentoTag=${BENTO_BOX_TYPES.code}
>
- ${Projects.map((p) => html` `)}
+
+ ${
+ Projects.map((codeRepo) => html`
+
+ `)
+ }
+
`;
}
diff --git a/packages/components/src/card/connections/connections-card.styles.ts b/packages/components/src/card/connections/connections-card.styles.ts
new file mode 100644
index 00000000..40c4b84b
--- /dev/null
+++ b/packages/components/src/card/connections/connections-card.styles.ts
@@ -0,0 +1,80 @@
+import { type CSSResult, css } from "lit";
+
+export const DL_DIV_COLUMN_COUNT: number = 6;
+
+export const ConnectionsCardStyles: CSSResult = css`
+ :host {
+ display: block;
+ inline-size: 100%;
+ container-type: inline-size;
+
+ --dl-div-column-count: ${DL_DIV_COLUMN_COUNT};
+
+ --connections-card-filled-icon-button-container-shape: var(--bento-layout-card-shape);
+ --connections-card-filled-icon-button-scale: 2.25;
+ --connections-card-filled-icon-button-container-color: var(--bento-layout-card-background);
+ --connections-card-filled-icon-button-container-size: calc(
+ var(--connections-card-filled-icon-button-scale) * var(--md-icon-size)
+ );
+ --connections-card-filled-icon-button-container-shape: var(--bento-layout-card-shape);
+ --connections-card-filled-icon-button-icon-color: var(--bento-layout-card-color);
+ --connections-card-filled-icon-button-icon-scale: 0.75;
+ --connections-card-filled-icon-button-icon-size: calc(
+ var(--connections-card-filled-icon-button-icon-scale) * var(--connections-card-filled-icon-button-container-size)
+ );
+
+ --md-filled-icon-button-container-color: var(--connections-card-filled-icon-button-container-color);
+ --md-filled-icon-button-container-height: var(--connections-card-filled-icon-button-container-size);
+ --md-filled-icon-button-container-width: var(--connections-card-filled-icon-button-container-size);
+ --md-filled-icon-button-container-shape: var(--connections-card-filled-icon-button-container-shape);
+ --md-filled-icon-button-icon-color: var(--connections-card-filled-icon-button-icon-color);
+ --md-filled-icon-button-icon-size: var(--connections-card-filled-icon-button-icon-size);
+ --md-filled-icon-button-focus-icon-color: var(--connections-card-filled-icon-button-icon-color);
+ --md-filled-icon-button-hover-icon-color: var(--connections-card-filled-icon-button-icon-color);
+ }
+
+ article {
+ dl {
+ display: flex;
+ flex-direction: row;
+ gap: var(--spaces-gap-s);
+ flex-wrap: wrap;
+ justify-content: space-around;
+
+ div {
+ display: grid;
+ grid-template-rows: min-content auto;
+ grid-template-columns: repeat(var(--dl-div-column-count), 1fr);
+ row-gap: var(--spaces-gap-s);
+ column-gap: var(--spaces-gap-xs);
+ place-items: center;
+ border-radius: var(--connections-card-filled-icon-button-container-shape);
+ border: solid var(--sizes-thickness-xxs) var(--connections-card-filled-icon-button-icon-color);
+ background-color: var(--md-sys-color-surface-container-highest);
+ padding-block: var(--spaces-padding-s);
+ flex: 1 0 min-content;
+
+ dt {
+ grid-row: 1 / 2;
+ grid-column: span var(--dl-div-column-count);
+ color: var(--connections-card-filled-icon-button-icon-color);
+ }
+
+ dd {
+ grid-row: 2 / 3;
+ margin: unset;
+ border: solid var(--sizes-thickness-xxs) var(--connections-card-filled-icon-button-icon-color);
+ border-radius: var(--connections-card-filled-icon-button-container-shape);
+ }
+ }
+ }
+ }
+
+ @container (max-width: 600px) {
+ article {
+ dl {
+ flex-direction: column;
+ }
+ }
+ }
+`;
\ No newline at end of file
diff --git a/packages/components/src/card/connections/connections-card.ts b/packages/components/src/card/connections/connections-card.ts
new file mode 100644
index 00000000..a96e3dcc
--- /dev/null
+++ b/packages/components/src/card/connections/connections-card.ts
@@ -0,0 +1,124 @@
+import { ConnectionsCardStyles, DL_DIV_COLUMN_COUNT } from "@/lib/card/connections/connections-card.styles";
+import { UIAwareElement } from "@/lib/mixins/ui-aware-element/ui-aware-element";
+import { TextStyles } from "@/lib/styles";
+import { Connections } from "@fnc314/packages.data";
+import { type ArtifactConnectionData, type ArtifactConnectionType, BENTO_BOX_TYPES, type ConnectionInstance, type ProfessionalConnectionJsonData } from "@fnc314/packages.types";
+import { type TemplateResult, html } from "lit";
+import { customElement, property } from "lit/decorators.js";
+
+/**
+ * @summary The collection of connection components wrapped in a `dl`
+ *
+ * @export
+ * @class ConnectionsCard
+ * @typedef {ConnectionsCard}
+ * @extends {UIAwareElement}
+ */
+@customElement("connections-card")
+export class ConnectionsCard extends UIAwareElement {
+
+ static override styles = [
+ TextStyles,
+ ConnectionsCardStyles
+ ]
+
+ @property({ type: Boolean })
+ expanded = true;
+
+ @property({ type: Boolean })
+ enableHover = false;
+
+ @property({ type: Boolean })
+ enableFocus = false;
+
+ private contactsDefinitionList(): TemplateResult {
+ const directConnectionsCount = Object.entries(Connections.direct).length;
+ const directConnectionsColSpan = Math.floor(DL_DIV_COLUMN_COUNT / directConnectionsCount);
+ const contact = html`
+
+
Contact
+ ${
+ Object.entries(Connections.direct).map(
+ ([_, instance]: [string, ConnectionInstance]) =>
+ html`
+
+
+
+
+ `
+ )
+ }
+
+ `;
+
+ const socialConnectionsCount = Object.entries(Connections.social).length;
+ const socialConnectionsColSpan = Math.floor(DL_DIV_COLUMN_COUNT / socialConnectionsCount);
+ const network = html`
+
+
Network
+ ${Object.entries(Connections.social).map(
+ ([type, data]: [string, ProfessionalConnectionJsonData]) => html`
+
+
+
+
+ `,
+ )}
+
+ `;
+
+ const resumeConnectionsCount = Object.entries(Connections.resume).length;
+ const resumeConnectionsColSpan = Math.floor(DL_DIV_COLUMN_COUNT / resumeConnectionsCount);
+ const resume = html`
+
+
Resume
+ ${Object.entries(Connections.resume).map(
+ ([name, data]: [string, ArtifactConnectionData]) => html`
+
+
+
+
+ `,
+ )}
+
+ `;
+
+ return html`
+
+ ${contact}
+ ${network}
+ ${resume}
+
+ `;
+ }
+
+ override render() {
+ return html`
+
+
+ ${this.contactsDefinitionList()}
+
+
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "connections-card": ConnectionsCard
+ }
+}
\ No newline at end of file
diff --git a/packages/components/src/card/experience/experience-card.ts b/packages/components/src/card/experience/experience-card.ts
index 9f1602e7..a3061c9e 100644
--- a/packages/components/src/card/experience/experience-card.ts
+++ b/packages/components/src/card/experience/experience-card.ts
@@ -9,7 +9,7 @@ import { html } from "lit";
import { customElement, property } from "lit/decorators.js";
/**
- * @summary WorkCard - A card component displaying work experience.
+ * @summary A card component displaying work experience.
*
* @element experience-card
*/
@@ -29,7 +29,7 @@ export class ExperienceCard extends UIAwareElement {
override connectedCallback() {
super.connectedCallback();
- this.id = "experience";
+ this.id = BENTO_BOX_TYPES.experience;
}
override render() {
@@ -43,8 +43,8 @@ export class ExperienceCard extends UIAwareElement {
.bentoCardTitle=${"Experience"}
.bentoTag=${BENTO_BOX_TYPES.experience}
>
- ${Experiences.map(
- (exp) => html`
+ ${
+ Experiences.map((exp) => html`
`,
- )}
+ )
+ }
`;
}
diff --git a/packages/components/src/card/profile/profile-card.styles.ts b/packages/components/src/card/profile/profile-card.styles.ts
index a7f5faba..f6ef8549 100644
--- a/packages/components/src/card/profile/profile-card.styles.ts
+++ b/packages/components/src/card/profile/profile-card.styles.ts
@@ -8,27 +8,6 @@ export const ProfileCardStyles: CSSResult = css`
--profile-card-image-block-size: auto;
--profile-card-image-block-size-max: 500px;
--profile-card-image-inline-size-max: 100%;
-
- --profile-card-filled-icon-button-scale: 2.25;
- --profile-card-filled-icon-button-container-color: var(--bento-layout-card-background);
- --profile-card-filled-icon-button-container-size: calc(
- var(--profile-card-filled-icon-button-scale) * var(--md-icon-size)
- );
- --profile-card-filled-icon-button-container-shape: var(--bento-layout-card-shape);
- --profile-card-filled-icon-button-icon-color: var(--bento-layout-card-color);
- --profile-card-filled-icon-button-icon-scale: 0.75;
- --profile-card-filled-icon-button-icon-size: calc(
- var(--profile-card-filled-icon-button-icon-scale) * var(--profile-card-filled-icon-button-container-size)
- );
-
- --md-filled-icon-button-container-color: var(--profile-card-filled-icon-button-container-color);
- --md-filled-icon-button-container-height: var(--profile-card-filled-icon-button-container-size);
- --md-filled-icon-button-container-width: var(--profile-card-filled-icon-button-container-size);
- --md-filled-icon-button-container-shape: var(--profile-card-filled-icon-button-container-shape);
- --md-filled-icon-button-icon-color: var(--profile-card-filled-icon-button-icon-color);
- --md-filled-icon-button-icon-size: var(--profile-card-filled-icon-button-icon-size);
- --md-filled-icon-button-focus-icon-color: var(--profile-card-filled-icon-button-icon-color);
- --md-filled-icon-button-hover-icon-color: var(--profile-card-filled-icon-button-icon-color);
}
article {
@@ -45,7 +24,7 @@ export const ProfileCardStyles: CSSResult = css`
img {
border: var(--sizes-thickness-xxs) solid var(--md-sys-color-primary-fixed);
- border-radius: var(--md-sys-shape-corner-medium);
+ border-radius: var(--bento-layout-card-shape);
block-size: var(--profile-card-image-block-size);
max-inline-size: var(--profile-card-image-inline-size-max);
object-fit: cover;
@@ -54,7 +33,7 @@ export const ProfileCardStyles: CSSResult = css`
figcaption {
background-color: var(--md-sys-color-primary-fixed);
- border-radius: var(--md-sys-shape-corner-medium);
+ border-radius: var(--bento-layout-card-shape);
border: var(--md-sys-color-on-primary-fixed) solid var(--sizes-thickness-hairline);
color: var(--md-sys-color-on-primary-fixed);
font-size: var(--md-sys-typescale-body-small-size);
@@ -92,36 +71,10 @@ export const ProfileCardStyles: CSSResult = css`
}
}
- dl {
- display: flex;
- flex-direction: column;
- gap: var(--spaces-gap-l);
-
- div {
- display: grid;
- grid-template-rows: min-content auto;
- grid-template-columns: repeat(9, 1fr);
- gap: var(--spaces-gap-s);
- place-items: center;
- border-radius: var(--profile-card-filled-icon-button-container-shape);
- border: solid var(--sizes-thickness-xxs) var(--profile-card-filled-icon-button-icon-color);
- background-color: var(--md-sys-color-surface-container-highest);
- padding-block: var(--spaces-padding-s);
-
- dt {
- grid-row: 1 / 2;
- grid-column: 4 / span 3;
- color: var(--profile-card-filled-icon-button-icon-color);
- }
-
- dd {
- grid-row: 2 / 3;
- margin: unset;
- border: solid var(--sizes-thickness-xxs) var(--profile-card-filled-icon-button-icon-color);
- border-radius: var(--profile-card-filled-icon-button-container-shape);
- }
+ article {
+ h3, h4 {
+ margin-block: unset;
}
-
}
}
`;
diff --git a/packages/components/src/card/profile/profile-card.ts b/packages/components/src/card/profile/profile-card.ts
index dfe5d673..1e3bbfa3 100644
--- a/packages/components/src/card/profile/profile-card.ts
+++ b/packages/components/src/card/profile/profile-card.ts
@@ -1,20 +1,15 @@
import { ProfileCardStyles } from "@/lib/card/profile/profile-card.styles";
import { UIAwareElement } from "@/lib/mixins/ui-aware-element/ui-aware-element";
import { TextStyles } from "@/lib/styles";
-import { Biographies, Connections, Photos } from "@fnc314/packages.data";
+import { Biographies, Photos } from "@fnc314/packages.data";
import { configsService } from "@fnc314/packages.services";
import {
APP_CONFIGS_CHANGE_EVENT_NAME,
- type ArtifactConnectionData,
- type ArtifactConnectionType,
BENTO_BOX_TYPES,
- type BioExtended,
- type ConnectionInstance,
- type ProfessionalConnectionJsonData,
+ type BioExtended
} from "@fnc314/packages.types";
-import { type TemplateResult, html, unsafeCSS } from "lit";
+import { type TemplateResult, html } from "lit";
import { customElement, property } from "lit/decorators.js";
-import { unsafeHTML } from "lit/directives/unsafe-html.js";
/**
* @summary A responsive card component that displays a profile photo and biography.
@@ -30,10 +25,10 @@ export class ProfileCard extends UIAwareElement {
photoData = Photos[configsService.loadConfigs().colorScheme.theme];
@property({ type: Object })
- aboutMe: BioExtended = Biographies.bio.extended;
+ aboutMe: BioExtended = Biographies.extended;
@property({ type: Boolean })
- expanded = false;
+ expanded = true;
@property({ type: Boolean })
enableHover = false;
@@ -43,7 +38,7 @@ export class ProfileCard extends UIAwareElement {
override connectedCallback() {
super.connectedCallback();
- this.id = "bio";
+ this.id = BENTO_BOX_TYPES.profile;
configsService.addEventListener(APP_CONFIGS_CHANGE_EVENT_NAME, this._onConfigChange);
}
@@ -59,128 +54,43 @@ export class ProfileCard extends UIAwareElement {
};
private renderAboutMe(): TemplateResult {
- const summary = this.aboutMe.summary
- .map((sentence) => html`
-
- ${sentence}
-
- `);
const sections = this.aboutMe.sections
.filter((section) =>
- section.title.length > 0 &&
- (
- section.content.length > 0 &&
- section.content.filter((content) => content.trim().length > 0).length > 0
- )
+ section.title.trim().length > 0 &&
+ section.content.trim().length > 0
)
.map((section) => html`
-
- ${
- section.content
- .map((sentence) => html`
- ${unsafeHTML(sentence)}
- `)
- }
-
+
+
+ ${section.content}
+
+
`);
return html`
-
+
- About Me
- ${this.aboutMe.opener}
+ About Me
-
- ${summary}
+
${sections}
-
-
- ${this.aboutMe.closer}
-
`;
}
- private contactsDefinitionList(): TemplateResult {
- const directConnectionsCount = Object.entries(Connections.direct).length;
- const directConnectionsColSpan = Math.floor(9 / directConnectionsCount);
- const contact = html`
-
-
Contact
- ${
- Object.entries(Connections.direct).map(
- ([_, instance]: [string, ConnectionInstance], index: number) =>
- html`
-
-
-
-
- `
- )
- }
-
- `;
-
- const socialConnectionsCount = Object.entries(Connections.social).length;
- const socialConnectionsColSpan = Math.floor(9 / socialConnectionsCount);
- const network = html`
-
-
Network
- ${Object.entries(Connections.social).map(
- ([type, data]: [string, ProfessionalConnectionJsonData], index: number) => html`
-
-
-
-
- `,
- )}
-
- `;
-
- const resumeConnectionsCount = Object.entries(Connections.resume).length;
- const resumeConnectionsColSpan = Math.floor(9 / resumeConnectionsCount);
- const resume = html`
-
-
Resume
- ${Object.entries(Connections.resume).map(
- ([name, data]: [string, ArtifactConnectionData], index: number) => html`
-
-
-
-
- `,
- )}
-
- `;
-
- return html`
-
- ${contact}
- ${network}
- ${resume}
-
- `;
- }
-
private imageSection(): TemplateResult {
const srcSet = `
${this.photoData.srcSet.mobile} 750w,
@@ -207,8 +117,6 @@ export class ProfileCard extends UIAwareElement {
${this.photoData.figcaption}
-
- ${unsafeHTML(Biographies.bio.long)}
`;
}
@@ -216,7 +124,6 @@ export class ProfileCard extends UIAwareElement {
override render() {
return html`
${this.imageSection()}
- ${this.contactsDefinitionList()}
+ ${this.renderAboutMe()}
`;
diff --git a/packages/components/src/card/settings/settings-card.styles.ts b/packages/components/src/card/settings/settings-card.styles.ts
index 8da8f26b..b5027901 100644
--- a/packages/components/src/card/settings/settings-card.styles.ts
+++ b/packages/components/src/card/settings/settings-card.styles.ts
@@ -6,7 +6,7 @@ export const SettingsCardStyles: CSSResult = css`
display: block;
}
- .settings-content {
+ article {
display: flex;
flex: 1;
flex-direction: column;
@@ -57,13 +57,13 @@ export const SettingsCardStyles: CSSResult = css`
}
}
- version-tag {
+ footer {
padding-block-start: var(--spaces-padding-m);
}
}
@media screen and (width >= 1201px) {
- .settings-content {
+ article {
form {
flex-direction: row;
justify-content: space-evenly;
diff --git a/packages/components/src/card/settings/settings-card.ts b/packages/components/src/card/settings/settings-card.ts
index c6f4b1e2..d73dffa8 100644
--- a/packages/components/src/card/settings/settings-card.ts
+++ b/packages/components/src/card/settings/settings-card.ts
@@ -51,7 +51,7 @@ export class SettingsCard extends UIAwareElement {
override connectedCallback() {
super.connectedCallback();
- this.id = "settings";
+ this.id = BENTO_BOX_TYPES.settings;
configsService.addEventListener(APP_CONFIGS_CHANGE_EVENT_NAME, this.onAppConfigsChange);
}
@@ -178,7 +178,7 @@ export class SettingsCard extends UIAwareElement {
.bentoCardTitle=${"Settings"}
.bentoTag=${BENTO_BOX_TYPES.settings}
>
-
`;
diff --git a/packages/components/src/code/repo/code-repo.styles.ts b/packages/components/src/code/repo/code-repo.styles.ts
index cd1ec8b7..faac3b67 100644
--- a/packages/components/src/code/repo/code-repo.styles.ts
+++ b/packages/components/src/code/repo/code-repo.styles.ts
@@ -120,7 +120,6 @@ export const CodeRepoStyles: CSSResult = css`
margin: var(--spaces-none);
padding: var(--spaces-none);
- & word-tag img,
& word-tag [slot="icon"] {
block-size: var(--md-icon-size);
flex-shrink: 0;
diff --git a/packages/components/src/code/repo/code-repo.ts b/packages/components/src/code/repo/code-repo.ts
index 02d2b730..917a4c03 100644
--- a/packages/components/src/code/repo/code-repo.ts
+++ b/packages/components/src/code/repo/code-repo.ts
@@ -5,6 +5,8 @@ import { readCSSProperty } from "@fnc314/packages.design-tokens";
import { BreakpointLabels, type CodeRepoData, type CodeRepoTech } from "@fnc314/packages.types";
import { type TemplateResult, html, nothing, unsafeCSS } from "lit";
import { customElement, property } from "lit/decorators.js";
+import { map } from "lit/directives/map.js";
+import { when } from "lit/directives/when.js";
/**
* An instance of a given `GitHub` repository project documented through
@@ -27,18 +29,9 @@ export class CodeRepo extends UIAwareElement {
private createWordTagLI(tech: CodeRepoTech): TemplateResult {
const techWord = tech.name.replaceAll(" ", "-").toLowerCase();
- const imgSrc =
- typeof tech.designToken === "string"
- ? readCSSProperty(tech.designToken)
- : readCSSProperty(this.darkMode ? tech.designToken.dark : tech.designToken.light);
+ const imgSrc = readCSSProperty(this.whichDesignToken(tech.designToken));
- const tagId: string = `${
- typeof tech.designToken === "string"
- ? tech.designToken
- : this.darkMode
- ? tech.designToken.dark
- : tech.designToken.light
- }-${techWord}-word-tag`;
+ const tagId: string = `${this.whichDesignToken(tech.designToken)}-${techWord}-word-tag`;
const imgTag = imgSrc
? html`
@@ -61,6 +54,18 @@ export class CodeRepo extends UIAwareElement {
? "icon-text"
: "icon-only";
+ const popoverContent = when(
+ Array.isArray(tech.popoverContent),
+ () => html`
+
+ ${map(tech.popoverContent, (content: string) => html`${content} `)}
+
+ `,
+ () => html`
+ ${tech.popoverContent}
+ `
+ );
+
return html`
${imgTag}
+
+ ${popoverContent}
`;
@@ -82,7 +97,6 @@ export class CodeRepo extends UIAwareElement {
const tokenSvg = readCSSProperty(token);
-
const borderStyle = unsafeCSS(`
--dynamic-border-background-image: url('${tokenSvg}');
`);
diff --git a/packages/components/src/connection/professional/professional-connection.styles.ts b/packages/components/src/connection/professional/professional-connection.styles.ts
index 62edf09b..f1e01bb7 100644
--- a/packages/components/src/connection/professional/professional-connection.styles.ts
+++ b/packages/components/src/connection/professional/professional-connection.styles.ts
@@ -10,7 +10,7 @@ export const ProfessionalConnectionStyles: CSSResult = css`
}
span {
- background-color: var(--md-filled-icon-button-icon-color);
+ background-color: var(--connections-card-filled-icon-button-icon-color);
mask: var(--professional-connection-mask) no-repeat center / contain;
}
`;
diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts
index a76f13d5..d2728108 100644
--- a/packages/components/src/index.ts
+++ b/packages/components/src/index.ts
@@ -6,6 +6,8 @@ export { BlogCard } from "@/lib/card/blog/blog-card";
export { BlogCardStyles } from "@/lib/card/blog/blog-card.styles";
export { CodeCard } from "@/lib/card/code/code-card";
export { CodeCardStyles } from "@/lib/card/code/code-card.styles";
+export { ConnectionsCard } from "@/lib/card/connections/connections-card";
+export { ConnectionsCardStyles, DL_DIV_COLUMN_COUNT } from "@/lib/card/connections/connections-card.styles";
export { EducationCard } from "@/lib/card/education/education-card";
export { EducationCardStyles } from "@/lib/card/education/education-card.styles";
export { ExperienceCard } from "@/lib/card/experience/experience-card";
@@ -38,22 +40,10 @@ export { UIModeToggleStyles } from "@/lib/ui-mode-toggle/ui-mode-toggle.styles";
export { VersionTag } from "@/lib/version-tag/version-tag";
export { WordCloud } from "@/lib/word/cloud/word-cloud";
export { WordCloudStyles } from "@/lib/word/cloud/word-cloud.styles";
-export {
- WordCloudAppearances,
- WordCloudGroupings,
- WordCloudSortings,
- makeWordCloudWord,
-} from "@/lib/word/cloud/word-cloud.types";
-export type {
- RenderableWordCloudWord,
- WeightQuartile,
- Weights,
- WordCloudAppearance,
- WordCloudGrouping,
- WordCloudSorting,
- WordCloudWord,
- WordCloudWordCategory,
-} from "@/lib/word/cloud/word-cloud.types";
+export { WordCloudAppearances, WordCloudGroupings, WordCloudSortings, makeWordCloudWord } from "@/lib/word/cloud/word-cloud.types";
+export type { RenderableWordCloudWord, WeightQuartile, Weights, WordCloudAppearance, WordCloudGrouping, WordCloudSorting, WordCloudWord, WordCloudWordCategory } from "@/lib/word/cloud/word-cloud.types";
+export { WordPopover } from "@/lib/word/popover/word-popover";
+export { WordPopoverStyles } from "@/lib/word/popover/word-popover.styles";
export { WordTag } from "@/lib/word/tag/word-tag";
export { WordTagStyles } from "@/lib/word/tag/word-tag.styles";
export { WordTagVariantAttributeConverter } from "@/lib/word/tag/word-tag.types";
diff --git a/packages/components/src/mixins/ui-aware-element/ui-aware-element.ts b/packages/components/src/mixins/ui-aware-element/ui-aware-element.ts
index 9c6617b6..03f1a8a2 100644
--- a/packages/components/src/mixins/ui-aware-element/ui-aware-element.ts
+++ b/packages/components/src/mixins/ui-aware-element/ui-aware-element.ts
@@ -1,11 +1,12 @@
import { readCSSProperty } from "@fnc314/packages.design-tokens";
import { configsService } from "@fnc314/packages.services";
import {
- type AppConfigsChange,
- type BreakpointLabel,
- CONFIG_COLOR_SCHEME_NAMES,
- CSS_VARIABLE_BREAKPOINT_LABEL,
- CSS_VARIABLE_TOUCH_SCREEN,
+ type AppConfigsChange,
+ type BreakpointLabel,
+ CONFIG_COLOR_SCHEME_NAMES,
+ CSS_VARIABLE_BREAKPOINT_LABEL,
+ CSS_VARIABLE_TOUCH_SCREEN,
+ type DesignTokenIcon,
} from "@fnc314/packages.types";
import { type CSSResult, LitElement } from "lit";
import { state } from "lit/decorators.js";
@@ -66,4 +67,15 @@ export abstract class UIAwareElement extends LitElement {
window.removeEventListener("resize", this.onBreakpointChange);
configsService.removeEventListener("app-configs.change", this.onAppConfigChange);
}
+
+ /**
+ * Determines which field of the `designToken` should be rendered based on `darkMode`
+ *
+ * @protected
+ * @param designToken - A {@link DesignTokenIcon} to read
+ * @returns {string} - The actual token
+ */
+ protected whichDesignToken(designToken: DesignTokenIcon): string {
+ return this.darkMode ? designToken.dark : designToken.light;
+ }
}
diff --git a/packages/components/src/version-tag/version-tag.ts b/packages/components/src/version-tag/version-tag.ts
index ba3c94e9..89b1c8f1 100644
--- a/packages/components/src/version-tag/version-tag.ts
+++ b/packages/components/src/version-tag/version-tag.ts
@@ -16,7 +16,7 @@ export class VersionTag extends UIAwareElement {
text-align: center;
}
- div {
+ aside {
align-items: center;
display: flex;
flex-direction: row;
@@ -37,22 +37,25 @@ export class VersionTag extends UIAwareElement {
* @private
* @type {string}
*/
- private formattedDate: string = new Intl.DateTimeFormat(navigator.languages, {
- hour: "2-digit",
- minute: "2-digit",
- second: "2-digit",
- month: "2-digit",
- day: "2-digit",
- year: "numeric",
- hour12: false,
- }).format(time);
+ private formattedDate: string = new Intl.DateTimeFormat(
+ navigator.languages,
+ {
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ month: "2-digit",
+ day: "2-digit",
+ year: "numeric",
+ hour12: false,
+ }
+ ).format(time);
override render() {
return html`
-
+
Version: ${buildVersion} | SHA: ${gitSha}
Built: ${this.formattedDate}
-
+
`;
}
}
diff --git a/packages/components/src/vite-env.d.ts b/packages/components/src/vite-env.d.ts
new file mode 100644
index 00000000..6fdf08c1
--- /dev/null
+++ b/packages/components/src/vite-env.d.ts
@@ -0,0 +1,7 @@
+declare module "vite-env" {
+ declare const __FNC314_FNC314_GITHUB_IO_VERSION__: string;
+}
+declare module '*.css' {
+ const content: CSSStyleSheet;
+ export default content;
+}
\ No newline at end of file
diff --git a/packages/components/src/word/popover/word-popover-animations.styles.ts b/packages/components/src/word/popover/word-popover-animations.styles.ts
new file mode 100644
index 00000000..7850ffeb
--- /dev/null
+++ b/packages/components/src/word/popover/word-popover-animations.styles.ts
@@ -0,0 +1,59 @@
+import { type CSSResult, css } from "lit";
+
+export const WordPopoverAnimations: CSSResult = css`
+ ::backdrop {
+ backdrop-filter: blur(var(--internal-word-tag-backdrop-blur));
+ }
+
+ /* Transition for the popover itself */
+ [popover]:popover-open {
+ opacity: 1;
+ transform: scaleX(1);
+ }
+
+ [popover] {
+ /* Final state of the exit animation */
+ opacity: 0;
+ transform: scaleX(0);
+
+ transition:
+ opacity 0.7s,
+ transform 0.7s,
+ overlay 0.7s allow-discrete,
+ display 0.7s allow-discrete;
+ }
+
+ /* Needs to be after the previous [popover]:popover-open rule
+ to take effect, as the specificity is the same */
+ @starting-style {
+ [popover]:popover-open {
+ opacity: 0;
+ transform: scaleX(0);
+ }
+ }
+
+ /* Transition for the popover's backdrop */
+ [popover]::backdrop {
+ background-color: transparent;
+ transition:
+ display 0.7s allow-discrete,
+ overlay 0.7s allow-discrete,
+ background-color 0.7s,
+ backdrop-filter 0.7s;
+ /* Equivalent to
+ transition: all 0.7s allow-discrete; */
+ }
+
+ [popover]:popover-open::backdrop {
+
+ }
+
+ /* The nesting selector (&) cannot represent pseudo-elements
+ so this starting-style rule cannot be nested */
+
+ @starting-style {
+ [popover]:popover-open::backdrop {
+ background-color: transparent;
+ }
+ }
+`;
\ No newline at end of file
diff --git a/packages/components/src/word/popover/word-popover.styles.ts b/packages/components/src/word/popover/word-popover.styles.ts
new file mode 100644
index 00000000..42cb41d6
--- /dev/null
+++ b/packages/components/src/word/popover/word-popover.styles.ts
@@ -0,0 +1,57 @@
+import { type CSSResult, css } from "lit";
+
+export const WordPopoverStyles: CSSResult = css`
+ :host {
+ --md-icon-size: calc(2 * var(--md-icon-size));
+ }
+
+ article {
+ display: flex;
+ flex-direction: column;
+ block-size: 75%;
+ inline-size: 75%;
+ overflow-y: auto;
+ overscroll-behavior: contain;
+ background-color: var(--md-sys-color-surface);
+ color: var(--md-sys-color-on-surface);
+ border: solid var(--sizes-thickness-hairline) var(--md-sys-color-on-surface-variant);
+ border-radius: var(--bento-layout-card-shape);
+ justify-content: space-around;
+
+ header {
+ display: grid;
+ grid-template-areas: "icon header header";
+ grid-template-columns: minmax(auto, 1fr) 1fr 1fr;
+ place-items: center;
+
+ slot[name="header-icon"] {
+ grid-area: icon;
+
+ &::slotted(img) {
+ aspect-ratio: 1;
+ max-inline-size: 33%;
+ width: 33%;
+ }
+ }
+
+ h3 {
+ grid-area: header;
+ }
+ }
+
+ section {
+ padding-inline: var(--spaces-padding-m);
+ }
+
+ footer {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ a {
+
+ }
+ }
+ }
+`;
\ No newline at end of file
diff --git a/packages/components/src/word/popover/word-popover.ts b/packages/components/src/word/popover/word-popover.ts
new file mode 100644
index 00000000..cdfab9cc
--- /dev/null
+++ b/packages/components/src/word/popover/word-popover.ts
@@ -0,0 +1,66 @@
+import { UIAwareElement } from "@/lib/mixins/ui-aware-element/ui-aware-element";
+import { TextStyles } from "@/lib/styles";
+import { WordPopoverStyles } from "@/lib/word/popover/word-popover.styles";
+import { type TemplateResult, html } from 'lit';
+import { customElement, property } from 'lit/decorators.js';
+
+/**
+ * @summary A `popover` `HTML` element displayed instead of launching clicks
+ * on {@link WordTag}s
+ *
+ * @export
+ * @class WordPopover
+ * @typedef {WordPopover}
+ * @extends {UIAwareElement}
+ */
+@customElement("word-popover")
+export class WordPopover extends UIAwareElement {
+ static override styles = [
+ TextStyles,
+ WordPopoverStyles
+ ]
+
+ @property({ type: String })
+ word = "";
+
+ @property({ type: String })
+ popoverId: string = this.word;
+
+ @property({ type: Object, attribute: false })
+ footerURL: { text: string, url: string } = { text: this.word, url: "" }
+
+ override render(): TemplateResult {
+ return html`
+
+
+
+
+
+
+
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "word-popover": WordPopover;
+ }
+}
\ No newline at end of file
diff --git a/packages/components/src/word/tag/word-tag.styles.ts b/packages/components/src/word/tag/word-tag.styles.ts
index bead487f..87fc3878 100644
--- a/packages/components/src/word/tag/word-tag.styles.ts
+++ b/packages/components/src/word/tag/word-tag.styles.ts
@@ -29,6 +29,9 @@ export const WordTagStyles: CSSResult = css`
/** @ignore */
--internal-word-tag-gap: var(--word-tag-gap, var(--spaces-gap-xs));
+ /** @ignore */
+ --internal-word-tag-backdrop-blur: var(--word-tag-backdrop-blur, 0.25rem);
+
display: contents;
@media (prefers-reduced-motion: reduce) {
@@ -36,7 +39,11 @@ export const WordTagStyles: CSSResult = css`
}
}
- .word-tag-variant-wrapper {
+ ::backdrop {
+ backdrop-filter: blur(var(--internal-word-tag-backdrop-blur));
+ }
+
+ button, div {
align-items: center;
background-color: var(--internal-word-tag-background-color);
border-color: var(--internal-word-tag-color);
diff --git a/packages/components/src/word/tag/word-tag.ts b/packages/components/src/word/tag/word-tag.ts
index ca04558f..aa05256e 100644
--- a/packages/components/src/word/tag/word-tag.ts
+++ b/packages/components/src/word/tag/word-tag.ts
@@ -2,12 +2,14 @@ import { UIAwareElement } from "@/lib/mixins/ui-aware-element/ui-aware-element";
import { TextStyles } from "@/lib/styles";
import { WordTagStyles } from "@/lib/word/tag/word-tag.styles";
import {
- type WordTagHeaviness,
- type WordTagVariant,
- WordTagVariantAttributeConverter,
+ type WordTagHeaviness,
+ type WordTagVariant,
+ WordTagVariantAttributeConverter,
+ WordTagVariants,
} from "@/lib/word/tag/word-tag.types";
-import { type CSSResult, type TemplateResult, css, html, nothing } from "lit";
+import { type CSSResult, type TemplateResult, css, html, nothing, unsafeCSS } from "lit";
import { customElement, property } from "lit/decorators.js";
+import { when } from "lit/directives/when.js";
/**
* @summary Displays a word in a simple padded box in which the text color and border are synchronised
@@ -19,6 +21,8 @@ import { customElement, property } from "lit/decorators.js";
* @property [variant="text-only"] - The version of the layout to render
* @property [hrefUrl=""] - A URL which, when provided, wraps this {@link WordTag} in a
* {@link HTMLAnchorElement}
+ * @property [urlObject={text=this.word,url=this.hrefUrl}] - An object configuring a `url`
+ * and link text
*
* @cssprop [--word-tag-color="--md-sys-color-on-primary-container"] - The text and border color
* @cssprop [--word-tag-background-color="--md-sys-color-primary-container"] - The background color
@@ -29,7 +33,8 @@ import { customElement, property } from "lit/decorators.js";
* @cssprop [--word-tag-border-radius="--md-sys-shape-corner-small"] - The corner radius (for all corners)
* @cssprop [--word-tag-gap="--spaces-gap-xs"] - The `gap` between `word` and any `slot`-ed icon
*
- * @slot icon - The optional space available for, and positioned by, the {@link variant} property
+ * @slot [icon] - The optional space available for, and positioned by, the {@link variant} property
+ * @slot [popover] - The `popover` content
*
* @class WordTag
* @extends {UIAwareElement}
@@ -48,6 +53,12 @@ export class WordTag extends UIAwareElement {
@property({ type: String })
hrefUrl = "";
+ @property({ type: Object, attribute: false })
+ urlObject: { text: string, url: string } = { text: this.word, url: this.hrefUrl }
+
+ @property({ attribute: false })
+ popoverContent: string | string[] = "";
+
/** {@link WordTagVariantAttributeConverter} */
@property({
attribute: "variant",
@@ -58,63 +69,98 @@ export class WordTag extends UIAwareElement {
})
variant: WordTagVariant = "text-only";
- private layoutForVariant(variant: WordTagVariant): TemplateResult {
- const fontStyles: CSSResult = css`
- font-weight: ${this.heaviness === "normal" ? css`var(--md-ref-typeface-weight-regular)` : css`var(--md-ref-typeface-weight-bold)`};
- `;
+ private buildWord(): TemplateResult {
+ const fontWeight = this.heaviness === "normal" ?
+ css`var(--md-ref-typeface-weight-regular)` :
+ css`var(--md-ref-typeface-weight-bold)`;
- const borderStyles: CSSResult = css`
- border-width: ${this.heaviness === "normal" ? css`var(--sizes-thickness-hairline)` : css`var(--sizes-thickness-s)`};
+ const fontStyles: CSSResult = unsafeCSS(`
+ font-weight: ${fontWeight};
+ `);
+
+ return html`
+ ${this.word}
`;
+ }
+
+ private wrapContents(contents: TemplateResult): TemplateResult {
+ const borderWidth = this.heaviness === "normal" ? css`var(--sizes-thickness-hairline)` : css`var(--sizes-thickness-s)`;
+ const borderStyles: CSSResult = unsafeCSS(`
+ border-width: ${borderWidth};
+ `);
+ return when(
+ this.hrefUrl,
+ () => html`
+
+ ${contents}
+
+ `,
+ () => html`
+
+ ${contents}
+
+ `
+ );
+ }
- const defaultWordTag = html` ${this.word} `;
+ private layoutForVariant(): TemplateResult {
+
+ const defaultWordTag = this.buildWord();
let contents: TemplateResult | undefined = undefined;
- switch (variant) {
- case "text-icon":
+ switch (this.variant) {
+ case WordTagVariants["text-icon"]:
contents = html`
${defaultWordTag}
`;
break;
- case "icon-text":
+ case WordTagVariants["icon-text"]:
contents = html`
${defaultWordTag}
`;
break;
- case "icon-only":
- contents = html` `;
+ case WordTagVariants["icon-only"]:
+ contents = html`
+
+ `;
break;
- case "text-only":
- contents = html` ${defaultWordTag} `;
+ case WordTagVariants["text-only"]:
+ contents = html`
+ ${defaultWordTag}
+ `;
break;
default:
break;
}
- return contents
- ? html`
-
- ${contents}
-
- `
- : html`${nothing}`;
+ return when(
+ contents,
+ () => this.wrapContents(contents!),
+ () => html`${nothing}`
+ );
}
override render() {
- return this.hrefUrl === ""
- ? this.layoutForVariant(this.variant)
- : html`${this.layoutForVariant(this.variant)} `;
+ const tag = this.layoutForVariant();
+ return html`
+
+
+
+
+ ${tag}
+ `;
}
}
diff --git a/packages/components/src/word/tag/word-tag.types.ts b/packages/components/src/word/tag/word-tag.types.ts
index 067868cd..b7b363b6 100644
--- a/packages/components/src/word/tag/word-tag.types.ts
+++ b/packages/components/src/word/tag/word-tag.types.ts
@@ -9,13 +9,25 @@ import { type ComplexAttributeConverter } from "lit";
*/
export type WordTagHeaviness = "normal" | "heavy";
+/**
+ * @summary A `const` declaration from which {@link WordTagVariant} is defined
+ *
+ * @type {{ readonly "text-only": "text-only"; readonly "icon-text": "icon-text"; readonly "text-icon": "text-icon"; readonly "icon-only": "icon-only"; }}
+ */
+export const WordTagVariants = {
+ "text-only": "text-only" as const,
+ "icon-text": "icon-text" as const,
+ "text-icon": "text-icon" as const,
+ "icon-only": "icon-only" as const,
+} as const;
+
/**
* The variations of {@link WordTag} representing the possible combinations
* of `text only`, `icon only`, `icon then text`, and `text then icon`
*
* @typedef {WordTagVariant}
*/
-export type WordTagVariant = "text-only" | "icon-text" | "text-icon" | "icon-only";
+export type WordTagVariant = keyof typeof WordTagVariants;
/**
* Implements {@link ComplexAttributeConverter} for {@link WordTagVariant} properties
@@ -24,16 +36,16 @@ export const WordTagVariantAttributeConverter: ComplexAttributeConverter `${value}`,
fromAttribute: (value: string) => {
switch (value) {
- case "icon-text":
- return "icon-text";
- case "text-icon":
- return "text-icon";
- case "text-only":
- return "text-only";
- case "icon-only":
- return "icon-only";
+ case WordTagVariants["icon-text"]:
+ return WordTagVariants["icon-text"];
+ case WordTagVariants["text-icon"]:
+ return WordTagVariants["text-icon"];
+ case WordTagVariants["text-only"]:
+ return WordTagVariants["text-only"];
+ case WordTagVariants["icon-only"]:
+ return WordTagVariants["icon-only"];
default:
- return "text-only";
+ return WordTagVariants["text-only"];
}
},
};
diff --git a/packages/data/.config/mise/config.toml b/packages/data/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/packages/data/.config/mise/config.toml
+++ b/packages/data/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/packages/data/package.json b/packages/data/package.json
index 3066aae4..352af390 100644
--- a/packages/data/package.json
+++ b/packages/data/package.json
@@ -25,7 +25,7 @@
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
},
@@ -44,7 +44,7 @@
"license": "ISC",
"main": "./dist/@fnc314.packages.data.js",
"name": "@fnc314/packages.data",
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"private": true,
"repository": {
"type": "git",
@@ -55,5 +55,5 @@
},
"type": "module",
"types": "./dist/types/index.d.ts",
- "version": "2.1.0"
+ "version": "3.0.0"
}
\ No newline at end of file
diff --git a/packages/data/src/bento-layout/index.ts b/packages/data/src/bento-layout/index.ts
index 4fbae8cb..00dabe4d 100644
--- a/packages/data/src/bento-layout/index.ts
+++ b/packages/data/src/bento-layout/index.ts
@@ -1,106 +1,47 @@
import {
- type ABentoBoxConfig,
type BentoBoxConfigs,
- type BentoBoxType,
type BreakpointLabel,
- BreakpointLabels,
+ BreakpointLabels
} from "@fnc314/packages.types";
/** Titles to grab attention, joined with `|` but in HTML Entity Code (`|`) */
export const titles: string = [
- "Principal Software Engineer",
- "Enterprise Android & System Architecture",
- "Leading High-Performing Teams, Building Modern Platforms, and the Engineering Foundations Behind Great Products",
-].join(" | ");
+ "Principal Software Engineer | Enterprise Android & System Architecture",
+ "Leading High-Performing Teams, Building Modern Platforms, & Engineering Foundations Behind Great Products",
+].join(" ");
/** The final rendered {@link BentoBoxConfigs} */
export const BENTO_BOX_CONFIG: BentoBoxConfigs = {
profile: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 4, rowSpan: 1 }, order: 1 },
- tablet: { breakpoint: "tablet", span: { colSpan: 2, rowSpan: 1 }, order: 1 },
- mobile: { breakpoint: "mobile", order: 1 },
- },
isExpanded: () => true,
+ order: 1,
+ },
+ connections: {
+ isExpanded: () => true,
+ order: 2,
},
experience: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 8, rowSpan: 1 }, order: 2 },
- tablet: { breakpoint: "tablet", span: { colSpan: 4, rowSpan: 1 }, order: 2 },
- mobile: { breakpoint: "mobile", order: 2 },
- },
isExpanded: (breakpoint: BreakpointLabel) => breakpoint !== BreakpointLabels.mobile,
+ order: 3,
},
code: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 6, rowSpan: 1 }, order: 3 },
- tablet: { breakpoint: "tablet", span: { colSpan: 3, rowSpan: 1 }, order: 3 },
- mobile: { breakpoint: "mobile", order: 3 },
- },
isExpanded: (breakpoint: BreakpointLabel) => breakpoint !== BreakpointLabels.mobile,
+ order: 4,
},
blog: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 6, rowSpan: 1 }, order: 4 },
- tablet: { breakpoint: "tablet", span: { colSpan: 3, rowSpan: 1 }, order: 4 },
- mobile: { breakpoint: "mobile", order: 4 },
- },
isExpanded: (breakpoint: BreakpointLabel) => breakpoint !== BreakpointLabels.mobile,
+ order: 5,
},
skills: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 7, rowSpan: 2 }, order: 5 },
- tablet: { breakpoint: "tablet", span: { colSpan: 4, rowSpan: 1 }, order: 5 },
- mobile: { breakpoint: "mobile", order: 5 },
- },
isExpanded: () => false,
+ order: 6,
},
education: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 5, rowSpan: 1 }, order: 6 },
- tablet: { breakpoint: "tablet", span: { colSpan: 2, rowSpan: 1 }, order: 6 },
- mobile: { breakpoint: "mobile", order: 6 },
- },
isExpanded: () => false,
+ order: 7,
},
settings: {
- placement: {
- desktop: { breakpoint: "desktop", span: { colSpan: 12, rowSpan: 1 }, order: 7 },
- tablet: { breakpoint: "tablet", span: { colSpan: 6, rowSpan: 1 }, order: 7 },
- mobile: { breakpoint: "mobile", order: 7 },
- },
isExpanded: () => false,
- },
-};
-
-/**
- * Determines the logical DOM order for bento box types based on grid placement.
- * Reading order follows Top-to-Bottom, then Start-to-End (Leading-to-Trailing).
- *
- * @param breakpoint - The current active breakpoint.
- * @returns An array of {@link BentoBoxType} in the appropriate order for the DOM.
- */
-export function getBentoDOMOrder(breakpoint: BreakpointLabel): BentoBoxType[] {
- // Use desktop as the sequence authority if we are on a non-grid breakpoint (mobile)
- const sortBreakpoint = breakpoint === "mobile" ? "desktop" : breakpoint;
- const types = Object.keys(BENTO_BOX_CONFIG) as BentoBoxType[];
-
- return types.sort((a, b) => {
- const posA = BENTO_BOX_CONFIG[a].placement[sortBreakpoint];
- const posB = BENTO_BOX_CONFIG[b].placement[sortBreakpoint];
-
- if ("order" in posA && "order" in posB) {
- return posA.order - posB.order;
- }
- return 0;
- });
-}
-
-/**
- * Produces an array of {@link ABentoBoxConfig} instances sorted for proper DOM order.
- */
-export const BentoBoxConfigsArray = (breakpoint: BreakpointLabel = "desktop"): ABentoBoxConfig[] =>
- getBentoDOMOrder(breakpoint).map((type) => ({
- type,
- ...BENTO_BOX_CONFIG[type],
- }));
+ order: 8,
+ }
+};
\ No newline at end of file
diff --git a/packages/data/src/bio/index.ts b/packages/data/src/bio/index.ts
index 324a503e..a3cfcbb6 100644
--- a/packages/data/src/bio/index.ts
+++ b/packages/data/src/bio/index.ts
@@ -1,40 +1,34 @@
import { type Bio } from "@fnc314/packages.types";
export const Biographies: Bio = {
- bio: {
- short:
- `Senior Staff Android Architect with 11+ years of experience building mission-critical mobile systems. Expert in Kotlin, Gradle internals, and modular architecture, with a proven track record of scaling Android applications to 3.5M+ active users. Specialized in bridging the gap between complex system design and executive-level strategy to deliver resilient, "day-zero" technical foundations.
`,
- long: `Software Architect with over 11 years of experience specializing in software architecture, software solution architecture, and Android development. Currently focused on creating robust, scalable mobile systems that align with organizational goals. With a proven ability to design resilient, modular technical foundations and lead cross-platform collaboration, supports teams in delivering high-quality applications. Dedicated to harmonizing development workflows and elevating technical standards through governance and mentorship.
`,
- extended: {
- opener: `
- Not only do the best engineers write some of the greatest code, but they leave behind systems, teams, and technical foundations that continuously deliver quality outputs ad infinitum.
- `,
- summary: [
- "Over the past decade, I have had the opportunity to lead large-scale Android and web initiatives, modernize enterprise architectures, and help organizations navigate everything from greenfield development to complex platform transformations.",
- "I am energized by moments when technical complexity feels overwhelming, because that is usually where the greatest opportunities lie.",
- "Breaking down difficult problems, creating elegant architecture, and helping teams move forward with confidence is what motivates me every day.",
- ],
- sections: [
- {
- title: "Impact + Expertise",
- content: [
- "I enjoy building software, but I care just as much about building engineering environments where people can do their best work.",
- "Whether I am mentoring an engineer through their first architecture decision, establishing standards that improve code quality across an organization, or partnering with product and design to find the best path forward, I believe great technology is always the result of great collaboration.",
- ],
- },
- {
- title: "Execution Style",
- content: [""],
- },
- {
- title: "Key Traits",
- content: [
- "I believe the best architecture is measured by how easy it makes life for the engineers who inherit it, not by how impressive it looks on a whiteboard.",
- "I ensure every project I leave behind is better documented, easier to maintain, and built by a team that feels stronger than when we started.",
- ],
- }
- ],
- closer: "",
- },
+ short:
+ `Senior Staff Android Architect with 11+ years of experience building mission-critical mobile systems. Expert in Kotlin, Gradle internals, and modular architecture, with a proven track record of scaling Android applications to 3.5M+ active users. Specialized in bridging the gap between complex system design and executive-level strategy to deliver resilient, "day-zero" technical foundations.
`,
+ long: `Software Architect with over 11 years of experience specializing in software architecture, software solution architecture, and Android development. Currently focused on creating robust, scalable mobile systems that align with organizational goals. With a proven ability to design resilient, modular technical foundations and lead cross-platform collaboration, supports teams in delivering high-quality applications. Dedicated to harmonizing development workflows and elevating technical standards through governance and mentorship.
`,
+ extended: {
+ opener: `
+ I am a Principal Software Engineer and architecture leader who turns complex product ambitions into resilient, scalable systems. I specialize in enterprise Android, modular platforms, developer experience, and the standards that let teams move quickly without sacrificing quality or security. I am seeking the next organization where I can turn technical strategy into durable product and business value.
+ `,
+ sections: [
+ {
+ title: "ARCHITECTURE THAT SCALES",
+ content:
+ `At PNC, I led architecture for the flagship Android app used by more than 3.5 million people each month, including a high-security in-app payment platform. I also led a day-zero mobile redesign, creating a modular foundation built to stay coherent as requirements evolved. By establishing design-token governance across Design, iOS, and Android, I helped teams eliminate hard-coded UI values and launch with responsive layouts, dark mode, and branded themes from day one.`,
+ },
+ {
+ title: "MULTIPLYING ENGINEERING EFFECTIVENESS",
+ content:
+ `I build conventions, automation, and quality standards into the system—not around individual heroics. Through codebase organization, repository standards, pull-request practices, and purpose-built Bash tooling, I reduced onboarding time by 80%, cut build times by 70%, and made dependency auditing 90% faster. I design patterns that are easy to understand, repeat, automate, and hand off. I also document this approach in my seven-part *Taming the Elephant Heard* series on modularization, build infrastructure, and developer-experience automation.`,
+ },
+ {
+ title: "LEADERSHIP BEYOND THE CODEBASE",
+ content:
+ `I was a core contributor to launching CGI's inaugural I.T. Girl Challenge, a program that awards a $20,000 prize to student winners. I onboarded Academy Charter School and Pittsburgh Public Schools as foundational participant sources and authored key documentation that remains in use today. This work reflects my commitment to widening access to technology opportunities for the next generation.`,
+ },
+ {
+ title: "LET'S BUILD WHAT'S NEXT",
+ content:
+ `I am open to Principal Software Engineer, Staff-plus architecture, and technical-leadership opportunities where mobile platforms, engineering excellence, and organizational scale matter. If your organization needs a leader who can establish a modern technical foundation while helping teams do their best work, I would welcome a conversation. Please connect with me here or through my website.`,
+ }
+ ],
},
};
diff --git a/packages/data/src/code/index.ts b/packages/data/src/code/index.ts
index e656f2a3..4beb0672 100644
--- a/packages/data/src/code/index.ts
+++ b/packages/data/src/code/index.ts
@@ -11,6 +11,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-gradle-dark-icon-svg",
light: "--icons-logos-tech-gradle-light-icon-svg",
},
+ popoverContent: "JVM Build Tool for Java, Kotlin, Android, and more"
},
{
name: "Kotlin",
@@ -19,6 +20,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-kotlin-dark-icon-svg",
light: "--icons-logos-tech-kotlin-light-icon-svg",
},
+ popoverContent: "JetBrains' modern JVM languange"
},
],
url: "https://github.com/fnc314/project-collections-gradle-settings-plugin",
@@ -36,6 +38,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-bash-dark-icon-svg",
light: "--icons-logos-tech-bash-light-icon-svg",
},
+ popoverContent: "Shell scripting"
},
{
name: "Oh-My-Zsh",
@@ -44,6 +47,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-zsh-dark-icon-svg",
light: "--icons-logos-tech-zsh-light-icon-svg",
},
+ popoverContent: "Shell scripting"
},
],
url: "https://github.com/fnc314/mac-os-env-scripts",
@@ -61,6 +65,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-android-dark-icon-svg",
light: "--icons-logos-tech-android-light-icon-svg",
},
+ popoverContent: "World's most used, open-source operating system",
},
{
name: "Gradle",
@@ -69,6 +74,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-gradle-dark-icon-svg",
light: "--icons-logos-tech-gradle-light-icon-svg",
},
+ popoverContent: "JVM Build Tool for Java, Kotlin, Android, and more",
},
{
name: "Kotlin",
@@ -77,6 +83,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-kotlin-dark-icon-svg",
light: "--icons-logos-tech-kotlin-light-icon-svg",
},
+ popoverContent: "JetBrains' modern JVM languange",
},
],
url: "https://github.com/fnc314/fnc314-kmp",
@@ -94,6 +101,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-mise-dark-icon-svg",
light: "--icons-logos-tech-mise-light-icon-svg",
},
+ popoverContent: "Development Environment Tool Manager",
},
{
name: "PNPM",
@@ -102,6 +110,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-pnpm-dark-icon-svg",
light: "--icons-logos-tech-pnpm-light-icon-svg",
},
+ popoverContent: "Alternative `Node` package manager",
},
{
name: "Vite",
@@ -110,6 +119,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-vite-dark-icon-svg",
light: "--icons-logos-tech-vite-light-icon-svg",
},
+ popoverContent: "Modern JavaScript toolchain based on Rust",
},
{
name: "Lit",
@@ -118,6 +128,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-lit-dark-icon-svg",
light: "--icons-logos-tech-lit-light-icon-svg",
},
+ popoverContent: "JavaScript library for building Web Components",
},
{
name: "TypeScript",
@@ -126,6 +137,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-typescript-dark-icon-svg",
light: "--icons-logos-tech-typescript-light-icon-svg",
},
+ popoverContent: "Microsoft's modern JavaScript superset language",
},
{
name: "Style Dictionary",
@@ -134,6 +146,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-style-dictionary-dark-icon-svg",
light: "--icons-logos-tech-style-dictionary-light-icon-svg",
},
+ popoverContent: "NPM Package for generating design tokens from `json` files",
},
{
name: "Material Components",
@@ -143,6 +156,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-material-design-dark-icon-svg",
light: "--icons-logos-tech-material-design-light-icon-svg",
},
+ popoverContent: "Web Components library adhering to Material Design principles",
},
{
name: "Node",
@@ -151,6 +165,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-node-dark-icon-svg",
light: "--icons-logos-tech-node-light-icon-svg",
},
+ popoverContent: "JavaScript Runtime"
},
{
name: "Material Theme Builder",
@@ -159,14 +174,25 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-material-design-dark-icon-svg",
light: "--icons-logos-tech-material-design-light-icon-svg",
},
+ popoverContent: "Online tool to generate Material Theme colors from provided images",
},
{
- name: "HTML/CSS/JS",
+ name: "HTML",
url: "https://developer.mozilla.org/",
designToken: {
dark: "--icons-logos-tech-web-html-dark-icon-svg",
light: "--icons-logos-tech-web-html-light-icon-svg",
},
+ popoverContent: "HTML5 for templates"
+ },
+ {
+ name: "CSS",
+ url: "https://developer.mozilla.org/",
+ designToken: {
+ dark: "--icons-logos-tech-web-css-dark-icon-svg",
+ light: "--icons-logos-tech-web-css-light-icon-svg",
+ },
+ popoverContent: "CSS for styles"
},
{
name: "Prettier",
@@ -175,6 +201,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-prettier-dark-icon-svg",
light: "--icons-logos-tech-prettier-light-icon-svg",
},
+ popoverContent: "Formatting library for Node",
},
{
name: "ESLint",
@@ -183,6 +210,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-eslint-dark-icon-svg",
light: "--icons-logos-tech-eslint-light-icon-svg",
},
+ popoverContent: "Linting library for Node",
},
{
name: "Typescript-ESLint",
@@ -191,6 +219,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-typescript-eslint-dark-icon-svg",
light: "--icons-logos-tech-typescript-eslint-light-icon-svg",
},
+ popoverContent: "TypeScript Linting library for Node",
},
{
name: "StyleLint",
@@ -199,6 +228,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-stylelint-dark-icon-svg",
light: "--icons-logos-tech-stylelint-light-icon-svg",
},
+ popoverContent: "Formatting library for Node",
},
{
name: "PostCSS",
@@ -207,6 +237,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-postcss-dark-icon-svg",
light: "--icons-logos-tech-postcss-light-icon-svg",
},
+ popoverContent: "CSS processing library for Node",
},
],
url: "https://github.com/fnc314/fnc314.github.io",
@@ -217,12 +248,31 @@ export const Projects: CodeRepoData[] = [
name: "material-theme-viewer",
tech: [
{
- name: "HTML/CSS/JS",
+ name: "HTML",
url: "https://developer.mozilla.org/",
designToken: {
dark: "--icons-logos-tech-web-html-dark-icon-svg",
light: "--icons-logos-tech-web-html-light-icon-svg",
},
+ popoverContent: "HTML5 for templates"
+ },
+ {
+ name: "CSS",
+ url: "https://developer.mozilla.org/",
+ designToken: {
+ dark: "--icons-logos-tech-web-css-dark-icon-svg",
+ light: "--icons-logos-tech-web-css-light-icon-svg",
+ },
+ popoverContent: "CSS for styles"
+ },
+ {
+ name: "JavaScript",
+ url: "https://developer.mozilla.org/",
+ designToken: {
+ dark: "--icons-logos-tech-web-javascript-dark-icon-svg",
+ light: "--icons-logos-tech-web-javascript-light-icon-svg",
+ },
+ popoverContent: "JavaScript for simple interactivity"
},
{
name: "Material Theme Builder",
@@ -231,6 +281,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-material-design-dark-icon-svg",
light: "--icons-logos-tech-material-design-light-icon-svg",
},
+ popoverContent: "Online tool to generate Material Theme colors from provided images",
},
],
url: "https://github.com/fnc314/material-theme-viewer",
@@ -248,6 +299,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-python-dark-icon-svg",
light: "--icons-logos-tech-python-light-icon-svg",
},
+ popoverContent: "Popular scripting language",
},
{
name: "Ruby",
@@ -256,6 +308,7 @@ export const Projects: CodeRepoData[] = [
dark: "--icons-logos-tech-ruby-dark-icon-svg",
light: "--icons-logos-tech-ruby-light-icon-svg",
},
+ popoverContent: "Formerly popular scripting language",
},
],
url: "https://github.com/fnc314/project_euler",
diff --git a/packages/data/src/vite-env.d.ts b/packages/data/src/vite-env.d.ts
new file mode 100644
index 00000000..6fdf08c1
--- /dev/null
+++ b/packages/data/src/vite-env.d.ts
@@ -0,0 +1,7 @@
+declare module "vite-env" {
+ declare const __FNC314_FNC314_GITHUB_IO_VERSION__: string;
+}
+declare module '*.css' {
+ const content: CSSStyleSheet;
+ export default content;
+}
\ No newline at end of file
diff --git a/packages/design-tokens/.config/mise/config.toml b/packages/design-tokens/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/packages/design-tokens/.config/mise/config.toml
+++ b/packages/design-tokens/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/packages/design-tokens/assets/css/_material-overrides.css b/packages/design-tokens/assets/css/_material-overrides.css
index 38e2f1b8..4bd7d72a 100644
--- a/packages/design-tokens/assets/css/_material-overrides.css
+++ b/packages/design-tokens/assets/css/_material-overrides.css
@@ -1,6 +1,6 @@
/**
* Do not edit directly, this file was auto-generated.
- * Generated on Tue, 21 Jul 2026 04:46:55 GMT
+ * Generated on Thu, 23 Jul 2026 22:21:26 GMT
*/
:root {
diff --git a/packages/design-tokens/assets/css/_variables.css b/packages/design-tokens/assets/css/_variables.css
index e9c73c88..225299b8 100644
--- a/packages/design-tokens/assets/css/_variables.css
+++ b/packages/design-tokens/assets/css/_variables.css
@@ -1,6 +1,6 @@
/**
* Do not edit directly, this file was auto-generated.
- * Generated on Tue, 21 Jul 2026 04:46:55 GMT
+ * Generated on Thu, 23 Jul 2026 22:21:26 GMT
*/
:root {
diff --git a/packages/design-tokens/assets/css/icon-svg.css b/packages/design-tokens/assets/css/icon-svg.css
index 7b74d5d1..733d7017 100644
--- a/packages/design-tokens/assets/css/icon-svg.css
+++ b/packages/design-tokens/assets/css/icon-svg.css
@@ -1,6 +1,6 @@
/**
* Do not edit directly, this file was auto-generated.
- * Generated on Tue, 21 Jul 2026 04:46:55 GMT
+ * Generated on Thu, 23 Jul 2026 22:21:26 GMT
*/
:root {
@@ -81,20 +81,21 @@
--icons-logos-tech-typescript-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22512%22 height=%22512%22 fill=%22none%22 viewBox=%220 0 512 512%22%3E%3Crect width=%22512%22 height=%22512%22 fill=%22%233178c6%22 rx=%2250%22/%3E%3Crect width=%22512%22 height=%22512%22 fill=%22%233178c6%22 rx=%2250%22/%3E%3Cpath fill=%22%23fff%22 fill-rule=%22evenodd%22 d=%22M316.94 407.42v50.06q12.2 6.26 28.87 9.4c16.67 3.13 22.83 3.12 35.14 3.12q18 0 34.2-3.44 16.2-3.45 28.4-11.34 12.2-7.9 19.33-20.65c7.13-12.75 7.12-19.01 7.12-31.53q0-13.6-4.07-23.85c-4.07-10.25-6.62-12.9-11.74-18.23q-7.66-7.98-18.39-14.31c-10.73-6.33-15.2-8.22-24.18-11.97a305 305 0 0 1-17.68-7.9 90 90 0 0 1-13.3-7.82 34 34 0 0 1-8.46-8.45 18 18 0 0 1-2.97-10.1q0-5.15 2.66-9.3c2.66-4.15 4.28-5.13 7.51-7.12a40 40 0 0 1 11.9-4.61 69 69 0 0 1 15.65-1.64q6.26 0 13.22.93 6.97.95 14.01 2.9t13.7 4.93a76 76 0 0 1 12.28 6.88V246.6q-11.43-4.38-24.96-6.49c-13.53-2.1-19.38-2.11-31.07-2.11q-17.85 0-33.8 3.83c-15.95 3.83-20 6.55-28.1 11.97a60 60 0 0 0-19.17 20.73q-7.05 12.6-7.04 30.11 0 22.38 12.91 38.18t39.2 26.75q10.33 4.22 19.26 8.29c8.93 4.07 11.08 5.53 15.41 8.45q6.5 4.38 10.25 9.54a19.4 19.4 0 0 1 3.76 11.73q0 4.84-2.35 9c-2.35 4.16-3.94 5.16-7.12 7.2s-7.15 3.62-11.9 4.76q-7.12 1.72-16.66 1.72-16.28 0-32.24-5.7a96 96 0 0 1-29.58-17.14m-84.16-123.34H297V243H118v41.08h63.9V467h50.88z%22 clip-rule=%22evenodd%22/%3E%3C/svg%3E';
--icons-logos-tech-vite-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22410%22 height=%22404%22 fill=%22none%22 viewBox=%220 0 410 404%22%3E%3Cpath fill=%22url%28%23a%29%22 d=%22m399.64 59.52-184 329.03a10 10 0 0 1-17.41.07L10.58 59.56a10 10 0 0 1 10.45-14.8l184.2 32.92a10 10 0 0 0 3.55 0L389.12 44.8a10 10 0 0 1 10.52 14.71%22/%3E%3Cpath fill=%22url%28%23b%29%22 d=%22M292.96 1.57 156.8 28.26a5 5 0 0 0-4.03 4.6l-8.37 141.47a5 5 0 0 0 6.11 5.17l37.91-8.75a5 5 0 0 1 6.02 5.87l-11.26 55.16a5 5 0 0 0 6.35 5.78l23.42-7.11a5 5 0 0 1 6.35 5.8l-17.9 86.63c-1.12 5.41 6.09 8.37 9.1 3.72l2-3.1 110.95-221.43a5 5 0 0 0-5.41-7.15L279 102.45a5 5 0 0 1-5.75-6.3l25.47-88.28a5 5 0 0 0-5.77-6.3%22/%3E%3Cdefs%3E%3ClinearGradient id=%22a%22 x1=%226%22 x2=%22235%22 y1=%2233%22 y2=%22344%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%2341d1ff%22/%3E%3Cstop offset=%221%22 stop-color=%22%23bd34fe%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22b%22 x1=%22194.65%22 x2=%22236.08%22 y1=%228.82%22 y2=%22292.99%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23ffea83%22/%3E%3Cstop offset=%22.08%22 stop-color=%22%23ffdd35%22/%3E%3Cstop offset=%221%22 stop-color=%22%23ffa800%22/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E';
--icons-logos-tech-vite-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22410%22 height=%22404%22 fill=%22none%22 viewBox=%220 0 410 404%22%3E%3Cpath fill=%22url%28%23a%29%22 d=%22m399.64 59.52-184 329.03a10 10 0 0 1-17.41.07L10.58 59.56a10 10 0 0 1 10.45-14.8l184.2 32.92a10 10 0 0 0 3.55 0L389.12 44.8a10 10 0 0 1 10.52 14.71%22/%3E%3Cpath fill=%22url%28%23b%29%22 d=%22M292.96 1.57 156.8 28.26a5 5 0 0 0-4.03 4.6l-8.37 141.47a5 5 0 0 0 6.11 5.17l37.91-8.75a5 5 0 0 1 6.02 5.87l-11.26 55.16a5 5 0 0 0 6.35 5.78l23.42-7.11a5 5 0 0 1 6.35 5.8l-17.9 86.63c-1.12 5.41 6.09 8.37 9.1 3.72l2-3.1 110.95-221.43a5 5 0 0 0-5.41-7.15L279 102.45a5 5 0 0 1-5.75-6.3l25.47-88.28a5 5 0 0 0-5.77-6.3%22/%3E%3Cdefs%3E%3ClinearGradient id=%22a%22 x1=%226%22 x2=%22235%22 y1=%2233%22 y2=%22344%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%2341d1ff%22/%3E%3Cstop offset=%221%22 stop-color=%22%23bd34fe%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22b%22 x1=%22194.65%22 x2=%22236.08%22 y1=%228.82%22 y2=%22292.99%22 gradientUnits=%22userSpaceOnUse%22%3E%3Cstop stop-color=%22%23ffea83%22/%3E%3Cstop offset=%22.08%22 stop-color=%22%23ffdd35%22/%3E%3Cstop offset=%221%22 stop-color=%22%23ffa800%22/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E';
- --icons-logos-tech-web-css-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L320 544l157.1-52.2L512 96zm313.1 80-4.8 47.3L321 272.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L321.1 226l6.5-2.7H204.7l-5.8-47.3z%22/%3E%3C/svg%3E';
+ --icons-logos-tech-web-css-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath fill=%22%23fff%22 stroke=%22%23000%22 d=%22m128 96 34.9 395.8L320 544l157.1-52.2L512 96zm313.1 80-4.8 47.3L321 272.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L321.1 226l6.5-2.7H204.7l-5.8-47.3z%22/%3E%3C/svg%3E';
--icons-logos-tech-web-css-default-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L320 544l157.1-52.2L512 96zm313.1 80-4.8 47.3L321 272.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L321.1 226l6.5-2.7H204.7l-5.8-47.3z%22/%3E%3C/svg%3E';
- --icons-logos-tech-web-css-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L320 544l157.1-52.2L512 96zm313.1 80-4.8 47.3L321 272.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L321.1 226l6.5-2.7H204.7l-5.8-47.3z%22/%3E%3C/svg%3E';
- --icons-logos-tech-web-html-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L319.5 544l157.6-52.2L512 96zm308.2 127.9H252.4l4.1 49.4h175.6l-13.6 148.4-97.9 27v.3h-1.1l-98.7-27.3-6-75.8h47.7L266 384l53.5 14.5 53.7-14.5 6-62.2H212.3l-12.8-145.6h241.1z%22/%3E%3C/svg%3E';
+ --icons-logos-tech-web-css-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath stroke=%22%23fff%22 d=%22m128 96 34.9 395.8L320 544l157.1-52.2L512 96zm313.1 80-4.8 47.3L321 272.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L321.1 226l6.5-2.7H204.7l-5.8-47.3z%22/%3E%3C/svg%3E';
+ --icons-logos-tech-web-html-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 fill=%22%23fff%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L319.5 544l157.6-52.2L512 96zm308.2 127.9H252.4l4.1 49.4h175.6l-13.6 148.4-97.9 27v.3h-1.1l-98.7-27.3-6-75.8h47.7L266 384l53.5 14.5 53.7-14.5 6-62.2H212.3l-12.8-145.6h241.1z%22/%3E%3C/svg%3E';
--icons-logos-tech-web-html-default-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L319.5 544l157.6-52.2L512 96zm308.2 127.9H252.4l4.1 49.4h175.6l-13.6 148.4-97.9 27v.3h-1.1l-98.7-27.3-6-75.8h47.7L266 384l53.5 14.5 53.7-14.5 6-62.2H212.3l-12.8-145.6h241.1z%22/%3E%3C/svg%3E';
--icons-logos-tech-web-html-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22m128 96 34.9 395.8L319.5 544l157.6-52.2L512 96zm308.2 127.9H252.4l4.1 49.4h175.6l-13.6 148.4-97.9 27v.3h-1.1l-98.7-27.3-6-75.8h47.7L266 384l53.5 14.5 53.7-14.5 6-62.2H212.3l-12.8-145.6h241.1z%22/%3E%3C/svg%3E';
- --icons-logos-tech-web-javascript-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22M96 96v448h448V96zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V301.7h42.1zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L464 354c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6%22/%3E%3C/svg%3E';
+ --icons-logos-tech-web-javascript-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath fill=%22%23fff%22 stroke=%22%23000%22 d=%22M96 96v448h448V96zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V301.7h42.1zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L464 354c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z%22/%3E%3C/svg%3E';
--icons-logos-tech-web-javascript-default-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22M96 96v448h448V96zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V301.7h42.1zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L464 354c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6%22/%3E%3C/svg%3E';
- --icons-logos-tech-web-javascript-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath d=%22M96 96v448h448V96zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V301.7h42.1zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L464 354c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6%22/%3E%3C/svg%3E';
+ --icons-logos-tech-web-javascript-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 640 640%22%3E%3Cpath stroke=%22%23fff%22 d=%22M96 96v448h448V96zm243.8 349.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V301.7h42.1zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L464 354c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z%22/%3E%3C/svg%3E';
--icons-logos-tech-web-web-components-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22161%22 height=%22132%22 viewBox=%220 0 161 132%22%3E%3Cdefs%3E%3ClinearGradient id=%22a%22 x1=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%232a3b8f%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%2329abe2%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22b%22 x1=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%232a3b8f%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%2329abe2%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22c%22 x1=%22100%%22 x2=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%23b4d44e%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%23e7f716%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22d%22 x1=%22100%%22 x2=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%23b4d44e%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%23e7f716%22/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill=%22none%22 fill-rule=%22evenodd%22%3E%3Cpath fill=%22%23166da5%22 d=%22m160.6 65.9-17.4 29.3-24.4-29.7 24.4-28.9z%22/%3E%3Cpath fill=%22%238fdb69%22 d=%22m141.3 100.2-26.5-31.7-15.9 26.6 24.7 36.1z%22/%3E%3Cpath fill=%22%23166da5%22 d=%22m141 31.4-26.2 31.8-15.9-26.6L123.6.9z%22/%3E%3Cpath fill=%22url%28%23a%29%22 d=%22M61.1 31.4H141L123.4.9H78.7z%22 opacity=%22.95%22/%3E%3Cpath fill=%22url%28%23b%29%22 d=%22M114.8 63.3H159l-15.9-26.8H98.8%22 opacity=%22.95%22/%3E%3Cpath fill=%22url%28%23c%29%22 d=%22M141.3 100.3H61l17.6 30.5h45z%22 opacity=%22.95%22/%3E%3Cpath fill=%22%23010101%22 d=%22M78.6 130.8 41 65.8 79.1.8H37.9L.4 65.8l37.5 65z%22/%3E%3Cpath fill=%22url%28%23d%29%22 d=%22M114.8 68.4H159l-15.9 26.8H98.8%22 opacity=%22.95%22/%3E%3C/g%3E%3C/svg%3E';
--icons-logos-tech-web-web-components-default-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22161%22 height=%22132%22 viewBox=%220 0 161 132%22%3E%3Cdefs%3E%3ClinearGradient id=%22a%22 x1=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%232a3b8f%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%2329abe2%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22b%22 x1=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%232a3b8f%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%2329abe2%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22c%22 x1=%22100%%22 x2=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%23b4d44e%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%23e7f716%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22d%22 x1=%22100%%22 x2=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%23b4d44e%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%23e7f716%22/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill=%22none%22 fill-rule=%22evenodd%22%3E%3Cpath fill=%22%23166da5%22 d=%22m160.6 65.9-17.4 29.3-24.4-29.7 24.4-28.9z%22/%3E%3Cpath fill=%22%238fdb69%22 d=%22m141.3 100.2-26.5-31.7-15.9 26.6 24.7 36.1z%22/%3E%3Cpath fill=%22%23166da5%22 d=%22m141 31.4-26.2 31.8-15.9-26.6L123.6.9z%22/%3E%3Cpath fill=%22url%28%23a%29%22 d=%22M61.1 31.4H141L123.4.9H78.7z%22 opacity=%22.95%22/%3E%3Cpath fill=%22url%28%23b%29%22 d=%22M114.8 63.3H159l-15.9-26.8H98.8%22 opacity=%22.95%22/%3E%3Cpath fill=%22url%28%23c%29%22 d=%22M141.3 100.3H61l17.6 30.5h45z%22 opacity=%22.95%22/%3E%3Cpath fill=%22%23010101%22 d=%22M78.6 130.8 41 65.8 79.1.8H37.9L.4 65.8l37.5 65z%22/%3E%3Cpath fill=%22url%28%23d%29%22 d=%22M114.8 68.4H159l-15.9 26.8H98.8%22 opacity=%22.95%22/%3E%3C/g%3E%3C/svg%3E';
--icons-logos-tech-web-web-components-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22161%22 height=%22132%22 viewBox=%220 0 161 132%22%3E%3Cdefs%3E%3ClinearGradient id=%22a%22 x1=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%232a3b8f%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%2329abe2%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22b%22 x1=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%232a3b8f%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%2329abe2%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22c%22 x1=%22100%%22 x2=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%23b4d44e%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%23e7f716%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22d%22 x1=%22100%%22 x2=%220%%22 y1=%2250%%22 y2=%2250%%22%3E%3Cstop offset=%220%%22 stop-color=%22%23b4d44e%22/%3E%3Cstop offset=%22100%%22 stop-color=%22%23e7f716%22/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill=%22none%22 fill-rule=%22evenodd%22%3E%3Cpath fill=%22%23166da5%22 d=%22m160.6 65.9-17.4 29.3-24.4-29.7 24.4-28.9z%22/%3E%3Cpath fill=%22%238fdb69%22 d=%22m141.3 100.2-26.5-31.7-15.9 26.6 24.7 36.1z%22/%3E%3Cpath fill=%22%23166da5%22 d=%22m141 31.4-26.2 31.8-15.9-26.6L123.6.9z%22/%3E%3Cpath fill=%22url%28%23a%29%22 d=%22M61.1 31.4H141L123.4.9H78.7z%22 opacity=%22.95%22/%3E%3Cpath fill=%22url%28%23b%29%22 d=%22M114.8 63.3H159l-15.9-26.8H98.8%22 opacity=%22.95%22/%3E%3Cpath fill=%22url%28%23c%29%22 d=%22M141.3 100.3H61l17.6 30.5h45z%22 opacity=%22.95%22/%3E%3Cpath fill=%22%23010101%22 d=%22M78.6 130.8 41 65.8 79.1.8H37.9L.4 65.8l37.5 65z%22/%3E%3Cpath fill=%22url%28%23d%29%22 d=%22M114.8 68.4H159l-15.9 26.8H98.8%22 opacity=%22.95%22/%3E%3C/g%3E%3C/svg%3E';
- --icons-logos-tech-zsh-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22352.38%22 height=%22331.33%22 fill=%22none%22 viewBox=%220 0 352.38 331.33%22%3E%3Ctitle%3EZ shell vertical black logo%3C/title%3E%3Cdesc%3EUnix shell%3C/desc%3E%3Cg stroke=%22%23000%22 stroke-linecap=%22round%22%3E%3Cg stroke-linejoin=%22round%22 transform=%22translate%28-227.082 -238.082%29%22%3E%3Cpath stroke-width=%226.27%22 d=%22m320.74 337.54-58.2 69.31%22/%3E%3Ccircle cx=%22277.3%22 cy=%22353.08%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Ccircle cx=%22305.78%22 cy=%22391.34%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Cpath stroke-width=%226.27%22 d=%22M386.37 405.12h-41.56%22/%3E%3C/g%3E%3Cpath stroke-width=%2217.84%22 d=%22M174.04 322.26H53.03a44.1 44.1 0 0 1-44.11-44.12V53.03a44.1 44.1 0 0 1 44.1-44.11h246.33a44.1 44.1 0 0 1 44.1 44.1v269.24M13.74 70.3h322.38%22/%3E%3C/g%3E%3Cpath fill=%22%23000%22 d=%22M243.19 322.1a9.2 9.2 0 0 0-9.18-9.19l-.21.01h-20.65a1.06 1.06 0 0 1-.98-1.45l30.19-75.28a8.16 8.16 0 0 0-7.57-11.18h-31.82l-.54-.03a8.96 8.96 0 0 0-8.95 8.95 8.93 8.93 0 0 0 8.95 8.95l.42-.02h16.49a1.1 1.1 0 0 1 .91.49 1.1 1.1 0 0 1 .12 1.03l-26.18 65.38a10 10 0 0 0-.7 3.66v8.02a9.84 9.84 0 0 0 9.83 9.84h30.7a9.2 9.2 0 0 0 9.17-9.18m53.15-74.33q.09-5.27-.98-10.4-.84-4.34-3.36-6.9-2.37-2.7-6.7-3.78-4.2-1.22-10.76-1.22c-4.2 0-9 .4-11.88 1.22-2.61.61-5 1.98-6.85 3.92q-2.5 2.84-3.63 7.7-1.12 4.72-1.12 12.03 0 7.02.14 11.35.19 3.53.84 7.02.53 2.32 1.82 4.33 1.2 1.72 2.8 3.1a29 29 0 0 0 4.74 3.38q2.8 1.62 5.73 3.11 2.94 1.5 5.59 3.1 2.51 1.42 4.61 3.39.83.9 1.54 1.89.51.6.78 1.35.25.67.4 1.35.23 1.07.21 2.16.14 1.63.14 4.46.06 3.87-.41 7.7a11 11 0 0 1-1.12 4.2c-.5.84-1.3 1.47-2.24 1.75-.93.27-4.15.4-5.55.4q-1.7.05-3.35-.4a4.6 4.6 0 0 1-2.1-1.89q-.83-1.96-1.11-4.05-.31-3.37-.28-6.75 0-.37-.04-.75h-.06a7.5 7.5 0 0 0-7.48-6.46 7.6 7.6 0 0 0-7.48 6.46h-.04q-.05.42-.04.83v.34l.05 4.16q0 7.97 1.12 12.98 1.25 4.86 3.9 7.7a13.5 13.5 0 0 0 6.71 3.65 40 40 0 0 0 9.92 1.08c4.48 0 10.26-.4 13.24-1.22 2.82-.7 5.32-2.32 7.12-4.6q2.8-3.36 3.92-9.32 1.25-6.08 1.25-15.54 0-6.89-.42-11.08-.12-3.53-1.25-6.89a11 11 0 0 0-2.66-4.32 22 22 0 0 0-4.05-3.25 40 40 0 0 0-4.2-2.3 65 65 0 0 0-5.02-2.56q-2.66-1.35-5.03-2.7a42 42 0 0 1-4.05-2.84q-.9-.75-1.68-1.62-.6-.93-.84-2.03a21 21 0 0 1-.42-3.1v-5.14a48 48 0 0 1 .28-5.81q.16-1.79.98-3.38a3.4 3.4 0 0 1 2.1-1.49c.83-.27 3.17-.4 4.47-.4q4.47 0 5.59 2.56.89 1.66.97 3.52c.03.98.05 2.26.05 3.6h.05v.06a7.5 7.5 0 0 0 7.57 7.53 7.6 7.6 0 0 0 7.56-7.53v-3.66m55.95-13.92a8.83 8.83 0 1 0-17.52 1.52v31.46a1.97 1.97 0 0 1-1.97 1.97h-10.92a1.97 1.97 0 0 1-1.96-1.97v-32.78l-.01-.1v-.1a8.83 8.83 0 1 0-17.65 0v88.65a8.83 8.83 0 1 0 17.66 0v-35.05a1.97 1.97 0 0 1 1.96-1.97h10.92a1.97 1.97 0 0 1 1.97 1.97v33.5a8.8 8.8 0 0 0 8.69 10.35h.07a8.77 8.77 0 0 0 8.76-8.76z%22/%3E%3C/svg%3E';
- --icons-logos-tech-zsh-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22352.38%22 height=%22331.33%22 fill=%22none%22 viewBox=%220 0 352.38 331.33%22%3E%3Ctitle%3EZ shell vertical black logo%3C/title%3E%3Cdesc%3EUnix shell%3C/desc%3E%3Cg stroke=%22%23000%22 stroke-linecap=%22round%22%3E%3Cg stroke-linejoin=%22round%22 transform=%22translate%28-227.082 -238.082%29%22%3E%3Cpath stroke-width=%226.27%22 d=%22m320.74 337.54-58.2 69.31%22/%3E%3Ccircle cx=%22277.3%22 cy=%22353.08%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Ccircle cx=%22305.78%22 cy=%22391.34%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Cpath stroke-width=%226.27%22 d=%22M386.37 405.12h-41.56%22/%3E%3C/g%3E%3Cpath stroke-width=%2217.84%22 d=%22M174.04 322.26H53.03a44.1 44.1 0 0 1-44.11-44.12V53.03a44.1 44.1 0 0 1 44.1-44.11h246.33a44.1 44.1 0 0 1 44.1 44.1v269.24M13.74 70.3h322.38%22/%3E%3C/g%3E%3Cpath fill=%22%23000%22 d=%22M243.19 322.1a9.2 9.2 0 0 0-9.18-9.19l-.21.01h-20.65a1.06 1.06 0 0 1-.98-1.45l30.19-75.28a8.16 8.16 0 0 0-7.57-11.18h-31.82l-.54-.03a8.96 8.96 0 0 0-8.95 8.95 8.93 8.93 0 0 0 8.95 8.95l.42-.02h16.49a1.1 1.1 0 0 1 .91.49 1.1 1.1 0 0 1 .12 1.03l-26.18 65.38a10 10 0 0 0-.7 3.66v8.02a9.84 9.84 0 0 0 9.83 9.84h30.7a9.2 9.2 0 0 0 9.17-9.18m53.15-74.33q.09-5.27-.98-10.4-.84-4.34-3.36-6.9-2.37-2.7-6.7-3.78-4.2-1.22-10.76-1.22c-4.2 0-9 .4-11.88 1.22-2.61.61-5 1.98-6.85 3.92q-2.5 2.84-3.63 7.7-1.12 4.72-1.12 12.03 0 7.02.14 11.35.19 3.53.84 7.02.53 2.32 1.82 4.33 1.2 1.72 2.8 3.1a29 29 0 0 0 4.74 3.38q2.8 1.62 5.73 3.11 2.94 1.5 5.59 3.1 2.51 1.42 4.61 3.39.83.9 1.54 1.89.51.6.78 1.35.25.67.4 1.35.23 1.07.21 2.16.14 1.63.14 4.46.06 3.87-.41 7.7a11 11 0 0 1-1.12 4.2c-.5.84-1.3 1.47-2.24 1.75-.93.27-4.15.4-5.55.4q-1.7.05-3.35-.4a4.6 4.6 0 0 1-2.1-1.89q-.83-1.96-1.11-4.05-.31-3.37-.28-6.75 0-.37-.04-.75h-.06a7.5 7.5 0 0 0-7.48-6.46 7.6 7.6 0 0 0-7.48 6.46h-.04q-.05.42-.04.83v.34l.05 4.16q0 7.97 1.12 12.98 1.25 4.86 3.9 7.7a13.5 13.5 0 0 0 6.71 3.65 40 40 0 0 0 9.92 1.08c4.48 0 10.26-.4 13.24-1.22 2.82-.7 5.32-2.32 7.12-4.6q2.8-3.36 3.92-9.32 1.25-6.08 1.25-15.54 0-6.89-.42-11.08-.12-3.53-1.25-6.89a11 11 0 0 0-2.66-4.32 22 22 0 0 0-4.05-3.25 40 40 0 0 0-4.2-2.3 65 65 0 0 0-5.02-2.56q-2.66-1.35-5.03-2.7a42 42 0 0 1-4.05-2.84q-.9-.75-1.68-1.62-.6-.93-.84-2.03a21 21 0 0 1-.42-3.1v-5.14a48 48 0 0 1 .28-5.81q.16-1.79.98-3.38a3.4 3.4 0 0 1 2.1-1.49c.83-.27 3.17-.4 4.47-.4q4.47 0 5.59 2.56.89 1.66.97 3.52c.03.98.05 2.26.05 3.6h.05v.06a7.5 7.5 0 0 0 7.57 7.53 7.6 7.6 0 0 0 7.56-7.53v-3.66m55.95-13.92a8.83 8.83 0 1 0-17.52 1.52v31.46a1.97 1.97 0 0 1-1.97 1.97h-10.92a1.97 1.97 0 0 1-1.96-1.97v-32.78l-.01-.1v-.1a8.83 8.83 0 1 0-17.65 0v88.65a8.83 8.83 0 1 0 17.66 0v-35.05a1.97 1.97 0 0 1 1.96-1.97h10.92a1.97 1.97 0 0 1 1.97 1.97v33.5a8.8 8.8 0 0 0 8.69 10.35h.07a8.77 8.77 0 0 0 8.76-8.76z%22/%3E%3C/svg%3E';
+ --icons-logos-tech-zsh-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22352.38%22 height=%22331.33%22 fill=%22none%22 style=%22--fill-color:%23FFFFFF%22 viewBox=%220 0 352.38 331.33%22%3E%3Ctitle%3EZ shell vertical black logo%3C/title%3E%3Cdesc%3EUnix shell%3C/desc%3E%3Cg stroke=%22var%28--fill-color%29%22 stroke-linecap=%22round%22%3E%3Cg stroke-linejoin=%22round%22 transform=%22translate%28-227.082 -238.082%29%22%3E%3Cpath stroke-width=%226.27%22 d=%22m320.74 337.54-58.2 69.31%22/%3E%3Ccircle cx=%22277.3%22 cy=%22353.08%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Ccircle cx=%22305.78%22 cy=%22391.34%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Cpath stroke-width=%226.27%22 d=%22M386.37 405.12h-41.56%22/%3E%3C/g%3E%3Cpath stroke-width=%2217.84%22 d=%22M174.04 322.26H53.03a44.1 44.1 0 0 1-44.11-44.12V53.03a44.1 44.1 0 0 1 44.1-44.11h246.33a44.1 44.1 0 0 1 44.1 44.1v269.24M13.74 70.3h322.38%22/%3E%3C/g%3E%3Cpath fill=%22var%28--fill-color%29%22 d=%22M243.19 322.1a9.2 9.2 0 0 0-9.18-9.19l-.21.01h-20.65a1.06 1.06 0 0 1-.98-1.45l30.19-75.28a8.16 8.16 0 0 0-7.57-11.18h-31.82l-.54-.03a8.96 8.96 0 0 0-8.95 8.95 8.93 8.93 0 0 0 8.95 8.95l.42-.02h16.49a1.1 1.1 0 0 1 .91.49 1.1 1.1 0 0 1 .12 1.03l-26.18 65.38a10 10 0 0 0-.7 3.66v8.02a9.84 9.84 0 0 0 9.83 9.84h30.7a9.2 9.2 0 0 0 9.17-9.18m53.15-74.33q.09-5.27-.98-10.4-.84-4.34-3.36-6.9-2.37-2.7-6.7-3.78-4.2-1.22-10.76-1.22c-4.2 0-9 .4-11.88 1.22-2.61.61-5 1.98-6.85 3.92q-2.5 2.84-3.63 7.7-1.12 4.72-1.12 12.03 0 7.02.14 11.35.19 3.53.84 7.02.53 2.32 1.82 4.33 1.2 1.72 2.8 3.1a29 29 0 0 0 4.74 3.38q2.8 1.62 5.73 3.11 2.94 1.5 5.59 3.1 2.51 1.42 4.61 3.39.83.9 1.54 1.89.51.6.78 1.35.25.67.4 1.35.23 1.07.21 2.16.14 1.63.14 4.46.06 3.87-.41 7.7a11 11 0 0 1-1.12 4.2c-.5.84-1.3 1.47-2.24 1.75-.93.27-4.15.4-5.55.4q-1.7.05-3.35-.4a4.6 4.6 0 0 1-2.1-1.89q-.83-1.96-1.11-4.05-.31-3.37-.28-6.75 0-.37-.04-.75h-.06a7.5 7.5 0 0 0-7.48-6.46 7.6 7.6 0 0 0-7.48 6.46h-.04q-.05.42-.04.83v.34l.05 4.16q0 7.97 1.12 12.98 1.25 4.86 3.9 7.7a13.5 13.5 0 0 0 6.71 3.65 40 40 0 0 0 9.92 1.08c4.48 0 10.26-.4 13.24-1.22 2.82-.7 5.32-2.32 7.12-4.6q2.8-3.36 3.92-9.32 1.25-6.08 1.25-15.54 0-6.89-.42-11.08-.12-3.53-1.25-6.89a11 11 0 0 0-2.66-4.32 22 22 0 0 0-4.05-3.25 40 40 0 0 0-4.2-2.3 65 65 0 0 0-5.02-2.56q-2.66-1.35-5.03-2.7a42 42 0 0 1-4.05-2.84q-.9-.75-1.68-1.62-.6-.93-.84-2.03a21 21 0 0 1-.42-3.1v-5.14a48 48 0 0 1 .28-5.81q.16-1.79.98-3.38a3.4 3.4 0 0 1 2.1-1.49c.83-.27 3.17-.4 4.47-.4q4.47 0 5.59 2.56.89 1.66.97 3.52c.03.98.05 2.26.05 3.6h.05v.06a7.5 7.5 0 0 0 7.57 7.53 7.6 7.6 0 0 0 7.56-7.53v-3.66m55.95-13.92a8.83 8.83 0 1 0-17.52 1.52v31.46a1.97 1.97 0 0 1-1.97 1.97h-10.92a1.97 1.97 0 0 1-1.96-1.97v-32.78l-.01-.1v-.1a8.83 8.83 0 1 0-17.65 0v88.65a8.83 8.83 0 1 0 17.66 0v-35.05a1.97 1.97 0 0 1 1.96-1.97h10.92a1.97 1.97 0 0 1 1.97 1.97v33.5a8.8 8.8 0 0 0 8.69 10.35h.07a8.77 8.77 0 0 0 8.76-8.76z%22/%3E%3C/svg%3E';
+ --icons-logos-tech-zsh-default-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22352.38%22 height=%22331.33%22 fill=%22none%22 style=%22--fill-color:currentColor%22 viewBox=%220 0 352.38 331.33%22%3E%3Ctitle%3EZ shell vertical black logo%3C/title%3E%3Cdesc%3EUnix shell%3C/desc%3E%3Cg stroke=%22var%28--fill-color%29%22 stroke-linecap=%22round%22%3E%3Cg stroke-linejoin=%22round%22 transform=%22translate%28-227.082 -238.082%29%22%3E%3Cpath stroke-width=%226.27%22 d=%22m320.74 337.54-58.2 69.31%22/%3E%3Ccircle cx=%22277.3%22 cy=%22353.08%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Ccircle cx=%22305.78%22 cy=%22391.34%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Cpath stroke-width=%226.27%22 d=%22M386.37 405.12h-41.56%22/%3E%3C/g%3E%3Cpath stroke-width=%2217.84%22 d=%22M174.04 322.26H53.03a44.1 44.1 0 0 1-44.11-44.12V53.03a44.1 44.1 0 0 1 44.1-44.11h246.33a44.1 44.1 0 0 1 44.1 44.1v269.24M13.74 70.3h322.38%22/%3E%3C/g%3E%3Cpath fill=%22var%28--fill-color%29%22 d=%22M243.19 322.1a9.2 9.2 0 0 0-9.18-9.19l-.21.01h-20.65a1.06 1.06 0 0 1-.98-1.45l30.19-75.28a8.16 8.16 0 0 0-7.57-11.18h-31.82l-.54-.03a8.96 8.96 0 0 0-8.95 8.95 8.93 8.93 0 0 0 8.95 8.95l.42-.02h16.49a1.1 1.1 0 0 1 .91.49 1.1 1.1 0 0 1 .12 1.03l-26.18 65.38a10 10 0 0 0-.7 3.66v8.02a9.84 9.84 0 0 0 9.83 9.84h30.7a9.2 9.2 0 0 0 9.17-9.18m53.15-74.33q.09-5.27-.98-10.4-.84-4.34-3.36-6.9-2.37-2.7-6.7-3.78-4.2-1.22-10.76-1.22c-4.2 0-9 .4-11.88 1.22-2.61.61-5 1.98-6.85 3.92q-2.5 2.84-3.63 7.7-1.12 4.72-1.12 12.03 0 7.02.14 11.35.19 3.53.84 7.02.53 2.32 1.82 4.33 1.2 1.72 2.8 3.1a29 29 0 0 0 4.74 3.38q2.8 1.62 5.73 3.11 2.94 1.5 5.59 3.1 2.51 1.42 4.61 3.39.83.9 1.54 1.89.51.6.78 1.35.25.67.4 1.35.23 1.07.21 2.16.14 1.63.14 4.46.06 3.87-.41 7.7a11 11 0 0 1-1.12 4.2c-.5.84-1.3 1.47-2.24 1.75-.93.27-4.15.4-5.55.4q-1.7.05-3.35-.4a4.6 4.6 0 0 1-2.1-1.89q-.83-1.96-1.11-4.05-.31-3.37-.28-6.75 0-.37-.04-.75h-.06a7.5 7.5 0 0 0-7.48-6.46 7.6 7.6 0 0 0-7.48 6.46h-.04q-.05.42-.04.83v.34l.05 4.16q0 7.97 1.12 12.98 1.25 4.86 3.9 7.7a13.5 13.5 0 0 0 6.71 3.65 40 40 0 0 0 9.92 1.08c4.48 0 10.26-.4 13.24-1.22 2.82-.7 5.32-2.32 7.12-4.6q2.8-3.36 3.92-9.32 1.25-6.08 1.25-15.54 0-6.89-.42-11.08-.12-3.53-1.25-6.89a11 11 0 0 0-2.66-4.32 22 22 0 0 0-4.05-3.25 40 40 0 0 0-4.2-2.3 65 65 0 0 0-5.02-2.56q-2.66-1.35-5.03-2.7a42 42 0 0 1-4.05-2.84q-.9-.75-1.68-1.62-.6-.93-.84-2.03a21 21 0 0 1-.42-3.1v-5.14a48 48 0 0 1 .28-5.81q.16-1.79.98-3.38a3.4 3.4 0 0 1 2.1-1.49c.83-.27 3.17-.4 4.47-.4q4.47 0 5.59 2.56.89 1.66.97 3.52c.03.98.05 2.26.05 3.6h.05v.06a7.5 7.5 0 0 0 7.57 7.53 7.6 7.6 0 0 0 7.56-7.53v-3.66m55.95-13.92a8.83 8.83 0 1 0-17.52 1.52v31.46a1.97 1.97 0 0 1-1.97 1.97h-10.92a1.97 1.97 0 0 1-1.96-1.97v-32.78l-.01-.1v-.1a8.83 8.83 0 1 0-17.65 0v88.65a8.83 8.83 0 1 0 17.66 0v-35.05a1.97 1.97 0 0 1 1.96-1.97h10.92a1.97 1.97 0 0 1 1.97 1.97v33.5a8.8 8.8 0 0 0 8.69 10.35h.07a8.77 8.77 0 0 0 8.76-8.76z%22/%3E%3C/svg%3E';
+ --icons-logos-tech-zsh-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22352.38%22 height=%22331.33%22 fill=%22none%22 style=%22--fill-color:%23000000%22 viewBox=%220 0 352.38 331.33%22%3E%3Ctitle%3EZ shell vertical black logo%3C/title%3E%3Cdesc%3EUnix shell%3C/desc%3E%3Cg stroke=%22var%28--fill-color%29%22 stroke-linecap=%22round%22%3E%3Cg stroke-linejoin=%22round%22 transform=%22translate%28-227.082 -238.082%29%22%3E%3Cpath stroke-width=%226.27%22 d=%22m320.74 337.54-58.2 69.31%22/%3E%3Ccircle cx=%22277.3%22 cy=%22353.08%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Ccircle cx=%22305.78%22 cy=%22391.34%22 r=%2212.01%22 stroke-width=%229.79%22/%3E%3Cpath stroke-width=%226.27%22 d=%22M386.37 405.12h-41.56%22/%3E%3C/g%3E%3Cpath stroke-width=%2217.84%22 d=%22M174.04 322.26H53.03a44.1 44.1 0 0 1-44.11-44.12V53.03a44.1 44.1 0 0 1 44.1-44.11h246.33a44.1 44.1 0 0 1 44.1 44.1v269.24M13.74 70.3h322.38%22/%3E%3C/g%3E%3Cpath fill=%22var%28--fill-color%29%22 d=%22M243.19 322.1a9.2 9.2 0 0 0-9.18-9.19l-.21.01h-20.65a1.06 1.06 0 0 1-.98-1.45l30.19-75.28a8.16 8.16 0 0 0-7.57-11.18h-31.82l-.54-.03a8.96 8.96 0 0 0-8.95 8.95 8.93 8.93 0 0 0 8.95 8.95l.42-.02h16.49a1.1 1.1 0 0 1 .91.49 1.1 1.1 0 0 1 .12 1.03l-26.18 65.38a10 10 0 0 0-.7 3.66v8.02a9.84 9.84 0 0 0 9.83 9.84h30.7a9.2 9.2 0 0 0 9.17-9.18m53.15-74.33q.09-5.27-.98-10.4-.84-4.34-3.36-6.9-2.37-2.7-6.7-3.78-4.2-1.22-10.76-1.22c-4.2 0-9 .4-11.88 1.22-2.61.61-5 1.98-6.85 3.92q-2.5 2.84-3.63 7.7-1.12 4.72-1.12 12.03 0 7.02.14 11.35.19 3.53.84 7.02.53 2.32 1.82 4.33 1.2 1.72 2.8 3.1a29 29 0 0 0 4.74 3.38q2.8 1.62 5.73 3.11 2.94 1.5 5.59 3.1 2.51 1.42 4.61 3.39.83.9 1.54 1.89.51.6.78 1.35.25.67.4 1.35.23 1.07.21 2.16.14 1.63.14 4.46.06 3.87-.41 7.7a11 11 0 0 1-1.12 4.2c-.5.84-1.3 1.47-2.24 1.75-.93.27-4.15.4-5.55.4q-1.7.05-3.35-.4a4.6 4.6 0 0 1-2.1-1.89q-.83-1.96-1.11-4.05-.31-3.37-.28-6.75 0-.37-.04-.75h-.06a7.5 7.5 0 0 0-7.48-6.46 7.6 7.6 0 0 0-7.48 6.46h-.04q-.05.42-.04.83v.34l.05 4.16q0 7.97 1.12 12.98 1.25 4.86 3.9 7.7a13.5 13.5 0 0 0 6.71 3.65 40 40 0 0 0 9.92 1.08c4.48 0 10.26-.4 13.24-1.22 2.82-.7 5.32-2.32 7.12-4.6q2.8-3.36 3.92-9.32 1.25-6.08 1.25-15.54 0-6.89-.42-11.08-.12-3.53-1.25-6.89a11 11 0 0 0-2.66-4.32 22 22 0 0 0-4.05-3.25 40 40 0 0 0-4.2-2.3 65 65 0 0 0-5.02-2.56q-2.66-1.35-5.03-2.7a42 42 0 0 1-4.05-2.84q-.9-.75-1.68-1.62-.6-.93-.84-2.03a21 21 0 0 1-.42-3.1v-5.14a48 48 0 0 1 .28-5.81q.16-1.79.98-3.38a3.4 3.4 0 0 1 2.1-1.49c.83-.27 3.17-.4 4.47-.4q4.47 0 5.59 2.56.89 1.66.97 3.52c.03.98.05 2.26.05 3.6h.05v.06a7.5 7.5 0 0 0 7.57 7.53 7.6 7.6 0 0 0 7.56-7.53v-3.66m55.95-13.92a8.83 8.83 0 1 0-17.52 1.52v31.46a1.97 1.97 0 0 1-1.97 1.97h-10.92a1.97 1.97 0 0 1-1.96-1.97v-32.78l-.01-.1v-.1a8.83 8.83 0 1 0-17.65 0v88.65a8.83 8.83 0 1 0 17.66 0v-35.05a1.97 1.97 0 0 1 1.96-1.97h10.92a1.97 1.97 0 0 1 1.97 1.97v33.5a8.8 8.8 0 0 0 8.69 10.35h.07a8.77 8.77 0 0 0 8.76-8.76z%22/%3E%3C/svg%3E';
--icons-material-arrow-drop-down-dark-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2210%22 height=%225%22 class=%22arrow_drop_down%22 viewBox=%220 -960 400 200%22%3E%3Cpath d=%22M200-760 0-960h400z%22 style=%22fill:%23fff%22/%3E%3C/svg%3E';
--icons-material-arrow-drop-down-default-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2224%22 height=%2224%22 class=%22arrow_drop_down%22 viewBox=%220 -960 960 960%22%3E%3Cpath d=%22M480-360 280-560h400z%22/%3E%3C/svg%3E';
--icons-material-arrow-drop-down-light-icon-svg: 'data:image/svg+xml;utf8,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2210%22 height=%225%22 class=%22arrow_drop_down%22 viewBox=%220 -960 400 200%22%3E%3Cpath d=%22M200-760 0-960h400z%22/%3E%3C/svg%3E';
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/css/css-dark.svg b/packages/design-tokens/assets/icons/logos/tech/web/css/css-dark.svg
new file mode 100644
index 00000000..b52d9c8a
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/css/css-dark.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/css/css-default.svg b/packages/design-tokens/assets/icons/logos/tech/web/css/css-default.svg
new file mode 100644
index 00000000..da1fc500
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/css/css-default.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/css/css-light.svg b/packages/design-tokens/assets/icons/logos/tech/web/css/css-light.svg
new file mode 100644
index 00000000..2832ebc0
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/css/css-light.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/html/html-dark.svg b/packages/design-tokens/assets/icons/logos/tech/web/html/html-dark.svg
new file mode 100644
index 00000000..1778bf44
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/html/html-dark.svg
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/html.svg b/packages/design-tokens/assets/icons/logos/tech/web/html/html-default.svg
similarity index 100%
rename from packages/design-tokens/assets/icons/logos/tech/web/html.svg
rename to packages/design-tokens/assets/icons/logos/tech/web/html/html-default.svg
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/html/html-light.svg b/packages/design-tokens/assets/icons/logos/tech/web/html/html-light.svg
new file mode 100644
index 00000000..c6b555f9
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/html/html-light.svg
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-dark.svg b/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-dark.svg
new file mode 100644
index 00000000..20492269
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-dark.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-default.svg b/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-default.svg
new file mode 100644
index 00000000..3034c97a
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-default.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-light.svg b/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-light.svg
new file mode 100644
index 00000000..8677e389
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-light.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/zsh/zsh.svg b/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-dark.svg
similarity index 96%
rename from packages/design-tokens/assets/icons/logos/tech/zsh/zsh.svg
rename to packages/design-tokens/assets/icons/logos/tech/zsh/zsh-dark.svg
index e26b72dc..c38e8e8f 100644
--- a/packages/design-tokens/assets/icons/logos/tech/zsh/zsh.svg
+++ b/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-dark.svg
@@ -9,12 +9,17 @@
>
Z shell vertical black logo
Unix shell
+
-
+
diff --git a/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-default.svg b/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-default.svg
new file mode 100644
index 00000000..b61ca575
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-default.svg
@@ -0,0 +1,68 @@
+
+
+ Z shell vertical black logo
+ Unix shell
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-light.svg b/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-light.svg
new file mode 100644
index 00000000..1747e065
--- /dev/null
+++ b/packages/design-tokens/assets/icons/logos/tech/zsh/zsh-light.svg
@@ -0,0 +1,68 @@
+
+
+ Z shell vertical black logo
+ Unix shell
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/design-tokens/package.json b/packages/design-tokens/package.json
index ac7148cf..f5a54453 100644
--- a/packages/design-tokens/package.json
+++ b/packages/design-tokens/package.json
@@ -23,7 +23,7 @@
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
},
@@ -69,9 +69,9 @@
"main": "./dist/@fnc314.packages.design-tokens.js",
"module": "./dist/@fnc314.packages.design-tokens.js",
"name": "@fnc314/packages.design-tokens",
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"private": true,
"type": "module",
"types": "./dist/types/index.d.ts",
- "version": "2.1.0"
+ "version": "3.0.0"
}
diff --git a/packages/design-tokens/src/vite-env.d.ts b/packages/design-tokens/src/vite-env.d.ts
new file mode 100644
index 00000000..6fdf08c1
--- /dev/null
+++ b/packages/design-tokens/src/vite-env.d.ts
@@ -0,0 +1,7 @@
+declare module "vite-env" {
+ declare const __FNC314_FNC314_GITHUB_IO_VERSION__: string;
+}
+declare module '*.css' {
+ const content: CSSStyleSheet;
+ export default content;
+}
\ No newline at end of file
diff --git a/packages/design-tokens/tokens/icons/logos/tech/web/web.json b/packages/design-tokens/tokens/icons/logos/tech/web/web.json
index 1ada6ea5..eaf7e12e 100644
--- a/packages/design-tokens/tokens/icons/logos/tech/web/web.json
+++ b/packages/design-tokens/tokens/icons/logos/tech/web/web.json
@@ -6,43 +6,43 @@
"css": {
"dark": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/css.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/css/css-dark.svg"
},
"default": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/css.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/css/css-default.svg"
},
"light": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/css.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/css/css-light.svg"
}
},
"html": {
"dark": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/html.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/html/html-dark.svg"
},
"default": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/html.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/html/html-default.svg"
},
"light": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/html.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/html/html-light.svg"
}
},
"javascript": {
"dark": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/javascript.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-dark.svg"
},
"default": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/javascript.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-default.svg"
},
"light": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/web/javascript.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/web/javascript/javascript-light.svg"
}
},
"web-components": {
diff --git a/packages/design-tokens/tokens/icons/logos/tech/zsh/zsh.json b/packages/design-tokens/tokens/icons/logos/tech/zsh/zsh.json
index e693d500..f216d7b4 100644
--- a/packages/design-tokens/tokens/icons/logos/tech/zsh/zsh.json
+++ b/packages/design-tokens/tokens/icons/logos/tech/zsh/zsh.json
@@ -5,11 +5,15 @@
"zsh": {
"dark": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/zsh/zsh.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/zsh/zsh-dark.svg"
+ },
+ "default": {
+ "type": "asset",
+ "value": "packages/design-tokens/assets/icons/logos/tech/zsh/zsh-default.svg"
},
"light": {
"type": "asset",
- "value": "packages/design-tokens/assets/icons/logos/tech/zsh/zsh.svg"
+ "value": "packages/design-tokens/assets/icons/logos/tech/zsh/zsh-light.svg"
}
}
}
diff --git a/packages/services/.config/mise/config.toml b/packages/services/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/packages/services/.config/mise/config.toml
+++ b/packages/services/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/packages/services/package.json b/packages/services/package.json
index a7f18914..7b87abde 100644
--- a/packages/services/package.json
+++ b/packages/services/package.json
@@ -26,7 +26,7 @@
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
},
@@ -45,7 +45,7 @@
"license": "ISC",
"main": "./dist/@fnc314.packages.services.js",
"name": "@fnc314/packages.services",
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"private": true,
"repository": {
"type": "git",
@@ -53,5 +53,5 @@
},
"type": "module",
"types": "./dist/types/index.d.ts",
- "version": "2.1.0"
+ "version": "3.0.0"
}
\ No newline at end of file
diff --git a/packages/services/src/vite-env.d.ts b/packages/services/src/vite-env.d.ts
new file mode 100644
index 00000000..6fdf08c1
--- /dev/null
+++ b/packages/services/src/vite-env.d.ts
@@ -0,0 +1,7 @@
+declare module "vite-env" {
+ declare const __FNC314_FNC314_GITHUB_IO_VERSION__: string;
+}
+declare module '*.css' {
+ const content: CSSStyleSheet;
+ export default content;
+}
\ No newline at end of file
diff --git a/packages/types/.config/mise/config.toml b/packages/types/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/packages/types/.config/mise/config.toml
+++ b/packages/types/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/packages/types/package.json b/packages/types/package.json
index ee6dafea..c632cbcc 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -23,7 +23,7 @@
"devEngines": {
"packageManager": {
"name": "pnpm",
- "version": "11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "version": "11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"onFail": "warn"
}
},
@@ -42,7 +42,7 @@
"license": "ISC",
"main": "./dist/@fnc314.packages.types.js",
"name": "@fnc314/packages.types",
- "packageManager": "pnpm@11.15.1+sha512.81350b07e53c9538a02f1f2303b4290fa2d7be04e56e2a970c4cc4b417dc761de196edabd49d55c7dc9580db81007c44143e4e3d7e462b3000d23c255122d065",
+ "packageManager": "pnpm@11.16.0+sha512.b767e9a98fc87aec0f42daefcd0e84941c2cdb45d73c4e1e68860fb2bdfdbe032ab592105479e5e05c237f740c8a5ffdbbb52385797ddc2296745a1bbb883e8d",
"private": true,
"repository": {
"type": "git",
@@ -50,5 +50,5 @@
},
"type": "module",
"types": "./dist/types/index.d.ts",
- "version": "2.1.0"
+ "version": "3.0.0"
}
\ No newline at end of file
diff --git a/packages/types/src/bento-layout/index.ts b/packages/types/src/bento-layout/index.ts
index 08eb061a..b973cc39 100644
--- a/packages/types/src/bento-layout/index.ts
+++ b/packages/types/src/bento-layout/index.ts
@@ -1,49 +1,12 @@
import { type BreakpointLabel } from "@/lib/design-tokens";
/**
- * Defines the column and row span for dense auto-flow grid
- *
- * @typedef GridSpan
- */
-export interface GridSpan {
- colSpan: number;
- rowSpan: number;
-}
-
-/**
- * The span and order for a given breakpoint
- *
- * @typedef GridPosition
- */
-export type GridPosition =
- | {
- /** The breakpoint for this position */
- breakpoint: Exclude;
- /** The grid span */
- span: GridSpan;
- /** The logical order in the DOM */
- order: number;
- /** Offsets */
- offsets?: {
- row?: number | 0;
- col?: number | 0;
- };
- }
- | {
- /** The breakpoint for this position */
- breakpoint: Extract;
- /** The logical order in the DOM */
- order: number;
- };
-
-/**
- * The finite `bento-box` instances
+ * @summary The finite `bento-box` instances
*
* @typedef {BentoBoxType}
*/
-export type BentoBoxType = "profile" | "experience" | "code" | "blog" | "settings" | "education" | "skills";
+export type BentoBoxType = keyof typeof BENTO_BOX_TYPES;
-// "now-playing"
/** A {@link Record} of {@link BentoBoxType} definitions */
export const BENTO_BOX_TYPES = {
profile: "profile" as const,
@@ -53,19 +16,24 @@ export const BENTO_BOX_TYPES = {
settings: "settings" as const,
education: "education" as const,
skills: "skills" as const,
- // "now-playing": "now-playing" as const,
+ connections: "connections" as const,
} as const;
/**
- * Defines the {@link BentoBoxType} coupled with a {@link GridPosition} used
- * to place a particular `bento-box`.
+ * @summary Defines the {@link BentoBoxType} coupled with a {@link GridPosition}
+ * used to place a particular `bento-box`.
*
* @interface BentoBoxConfig
*/
-export interface ABentoBoxConfig {
- type: BentoBoxType;
- placement: Record;
+export interface BentoBoxConfig {
isExpanded: (breakpoint: BreakpointLabel) => boolean;
+ order: number;
}
-export type BentoBoxConfigs = Record>;
+/**
+ * @summary The complete configuration for `bento-layout`
+ *
+ * @export
+ * @typedef {BentoBoxConfigs}
+ */
+export type BentoBoxConfigs = Record;
diff --git a/packages/types/src/bio/index.ts b/packages/types/src/bio/index.ts
index 596d81f4..c28597a0 100644
--- a/packages/types/src/bio/index.ts
+++ b/packages/types/src/bio/index.ts
@@ -1,14 +1,10 @@
export interface Bio {
- bio: {
- short: string;
- long: string;
- extended: BioExtended;
- };
+ short: string;
+ long: string;
+ extended: BioExtended;
};
export interface BioExtended {
opener: string;
- summary: string[];
- sections: { title: string, content: string[] }[];
- closer: string;
+ sections: { title: string, content: string }[];
}
diff --git a/packages/types/src/code/index.ts b/packages/types/src/code/index.ts
index 9b94fab7..e89ec1b7 100644
--- a/packages/types/src/code/index.ts
+++ b/packages/types/src/code/index.ts
@@ -15,7 +15,7 @@ export const WORD_TAG_SIZES = {
} as const;
/** We give {@link @fnc314/packages.components!WordTag} various treatments within this component */
-export type WordTagSize = (typeof WORD_TAG_SIZES)[keyof typeof WORD_TAG_SIZES];
+export type WordTagSize = keyof typeof WORD_TAG_SIZES;
/**
* Represents a single project entry loaded from `code.json`.
@@ -43,13 +43,24 @@ export interface CodeRepoData {
/**
* Represents a single technology entry used by a project.
*/
-export interface CodeRepoTech {
+export interface CodeRepoTech extends CodeRepoPopover {
/** A generated `CSS Variable` from `@fnc314/packages.types` */
- designToken: string | DesignTokenIcon;
+ designToken: DesignTokenIcon;
/** Display name for the technology (e.g., "TypeScript"). */
name: string;
/** URL with more information about the technology. */
url: string;
-}
+};
+
+/**
+ * @summary The content used to drive the `popover`s in the ``
+ *
+ * @export
+ * @interface CodeRepoPopover
+ * @typedef {CodeRepoPopover}
+ */
+export interface CodeRepoPopover {
+ popoverContent: string | string[];
+};
diff --git a/packages/types/src/vite-env.d.ts b/packages/types/src/vite-env.d.ts
new file mode 100644
index 00000000..6fdf08c1
--- /dev/null
+++ b/packages/types/src/vite-env.d.ts
@@ -0,0 +1,7 @@
+declare module "vite-env" {
+ declare const __FNC314_FNC314_GITHUB_IO_VERSION__: string;
+}
+declare module '*.css' {
+ const content: CSSStyleSheet;
+ export default content;
+}
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e8931f35..7c4f02bd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -10,55 +10,55 @@ importers:
version: 0.1.0
packageManagerDependencies:
'@pnpm/exe':
- specifier: 11.15.1
- version: 11.15.1
+ specifier: 11.16.0
+ version: 11.16.0
pnpm:
- specifier: 11.15.1
- version: 11.15.1
+ specifier: 11.16.0
+ version: 11.16.0
packages:
- '@pnpm/exe@11.15.1':
- resolution: {integrity: sha512-+e+DQrUPtDqH+9blSre23l7od3P3lRy43HN8TOKHNvbtuTNDRQtqQ0seHk/kn7iJl+ZSKBALFrQXPvbItNgRwA==}
+ '@pnpm/exe@11.16.0':
+ resolution: {integrity: sha512-IFYgRjkq7Ifhu0u9CNGm0oQXaLGUUjY1YBEHcxBAJZwe9YVBiaCS+Vgen4nYW9Ps76p5qGdG4z5JUzCgeehDwg==}
hasBin: true
- '@pnpm/linux-arm64@11.15.1':
- resolution: {integrity: sha512-8QOTdBeklXcE/AY4cAR2RJ4809I38kLxtInAYW4sVDfQoWYjmEIoU/ZxpHsk78KM8VU0BehtOB+iZsMxSCyiLQ==}
+ '@pnpm/linux-arm64@11.16.0':
+ resolution: {integrity: sha512-jIMypV7+xakY9X0jWLnoR/3F4uvsyPiD0g29hLX9BZ+FRamluxtsm5QgmGYPBDDqBCn8PB7YAt7uyOTKlc8qtg==}
cpu: [arm64]
os: [linux]
- '@pnpm/linux-x64@11.15.1':
- resolution: {integrity: sha512-hbhuC2Rh5Zw9ERUsQhOSLPnwfWSRTU6phtuFdK2I2raYCXa7v5C4i+XKTH+sKLPG5vJiKPyi4Hd62UECHZoy2w==}
+ '@pnpm/linux-x64@11.16.0':
+ resolution: {integrity: sha512-lvPDytkAcCSwbJ+VkWlCA8EJKS/wjTEyczkrPqiqhF+dzRtbWWCyP9vo8C5bzgBM1TnMA3dUYUA8azgMuvxOpg==}
cpu: [x64]
os: [linux]
- '@pnpm/linuxstatic-arm64@11.15.1':
- resolution: {integrity: sha512-xEL9kDvLXnNYAgQak9tfIhO/BaBf1R/1+/dzzntuquzSqrEaPs0x0P4qMmwq02hVBDfAGA2MAD4n9kmc6Q//tw==}
+ '@pnpm/linuxstatic-arm64@11.16.0':
+ resolution: {integrity: sha512-nKAIW1tx2aA454cAuXfUsfdZqKMm0XOhjf3Zz9upOdSeOGe3WNaMHh+OrlPVnbSlDv3rIktZUxLKqV2F2mrHJQ==}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@pnpm/linuxstatic-x64@11.15.1':
- resolution: {integrity: sha512-SLJ4neJx649ri4qHdseQN6SnAy6nNFnsLGi7g+EH32cVux4aWX7tjMNTPHrUKJ6Oc7C6oPGXUpLmemEvAwCPOg==}
+ '@pnpm/linuxstatic-x64@11.16.0':
+ resolution: {integrity: sha512-/A45Or9CE7EfcDMl0PgrjxKbz2QGIT+px8CAfe7syfyHk4wM0B7A7fhSk7QDQbAf2PM8wQz4VWaTX+T7KpyTAw==}
cpu: [x64]
os: [linux]
libc: [musl]
- '@pnpm/macos-arm64@11.15.1':
- resolution: {integrity: sha512-GbIUQcDZgO/i1Ql38Pk269KNYpEbSCWYcSXBHgT62y8qVTrpEbmi+TKNaLVYuUkK0k/hMibySRa5GUs7/vnNyw==}
+ '@pnpm/macos-arm64@11.16.0':
+ resolution: {integrity: sha512-duS906AljpfS6jNVYDMu1mi/BMw4yOjHyEZ7UJAuByB5g573rL9ZajCE3k6YFoZ2kRwVvgPtoPfSs5UKrNMiJA==}
cpu: [arm64]
os: [darwin]
'@pnpm/plugin-types-fixer@0.1.0':
resolution: {integrity: sha512-bLww63gRHi7siYTqFJb5qNdcXadU0jv20Et6z5AryMZ7FlLolbEJOrXLpg8+amQZNHHNW1dfFUBGVw/9ezQbFg==}
- '@pnpm/win-arm64@11.15.1':
- resolution: {integrity: sha512-pLlcpdtoaHJxVfhWahoQg5U7Mv9b6/X/8og+dY1GX1GvsZU3Wf7Y+LlA1sfxqoPcohtQdo6MdJkWiOZ3nIFMCQ==}
+ '@pnpm/win-arm64@11.16.0':
+ resolution: {integrity: sha512-GdjiS+PLGVJS9NQRuv3Vj4YTLRK0JJKTioD9jlxOC6clMbtbPZuPK0mfFK4k6sMIIRFPjNGVXF1a4G1Eu5IUyg==}
cpu: [arm64]
os: [win32]
- '@pnpm/win-x64@11.15.1':
- resolution: {integrity: sha512-gAvQjBOrNb8zHXRQawBfZRtjDWEFe6p9aSBi8uuMtWB4XAaj0+YuzstsR93llZ/UgP67oTkbkCOITBLayRVGGQ==}
+ '@pnpm/win-x64@11.16.0':
+ resolution: {integrity: sha512-zILD0GQ2W1tSTrkAemphb6QNc9sgHMIQ49Kh9tMMpCtKfgD5bX96YUBj8s32CR31wUJFGXK2dl5fMHaoU2yt1Q==}
cpu: [x64]
os: [win32]
@@ -122,47 +122,47 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- pnpm@11.15.1:
- resolution: {integrity: sha512-gTULB+U8lTigLx8jA7QpD6LXvgTlbiqXDEzEtBfcdh3hlu2r1J1Vx9yVgNuBAHxEFD5OPX5GKzAA0jwlUSLQZQ==}
+ pnpm@11.16.0:
+ resolution: {integrity: sha512-t2fpqY/IeuwPQtrvzQ6ElBws20XXPE4eaIYPsr39vgMqtZIQVHnl4Fwjf3QMil/9u7UjhXl93CKWdFobu4g+jQ==}
engines: {node: '>=22.13'}
hasBin: true
snapshots:
- '@pnpm/exe@11.15.1':
+ '@pnpm/exe@11.16.0':
dependencies:
'@reflink/reflink': 0.1.19
detect-libc: 2.1.2
optionalDependencies:
- '@pnpm/linux-arm64': 11.15.1
- '@pnpm/linux-x64': 11.15.1
- '@pnpm/linuxstatic-arm64': 11.15.1
- '@pnpm/linuxstatic-x64': 11.15.1
- '@pnpm/macos-arm64': 11.15.1
- '@pnpm/win-arm64': 11.15.1
- '@pnpm/win-x64': 11.15.1
+ '@pnpm/linux-arm64': 11.16.0
+ '@pnpm/linux-x64': 11.16.0
+ '@pnpm/linuxstatic-arm64': 11.16.0
+ '@pnpm/linuxstatic-x64': 11.16.0
+ '@pnpm/macos-arm64': 11.16.0
+ '@pnpm/win-arm64': 11.16.0
+ '@pnpm/win-x64': 11.16.0
- '@pnpm/linux-arm64@11.15.1':
+ '@pnpm/linux-arm64@11.16.0':
optional: true
- '@pnpm/linux-x64@11.15.1':
+ '@pnpm/linux-x64@11.16.0':
optional: true
- '@pnpm/linuxstatic-arm64@11.15.1':
+ '@pnpm/linuxstatic-arm64@11.16.0':
optional: true
- '@pnpm/linuxstatic-x64@11.15.1':
+ '@pnpm/linuxstatic-x64@11.16.0':
optional: true
- '@pnpm/macos-arm64@11.15.1':
+ '@pnpm/macos-arm64@11.16.0':
optional: true
'@pnpm/plugin-types-fixer@0.1.0': {}
- '@pnpm/win-arm64@11.15.1':
+ '@pnpm/win-arm64@11.16.0':
optional: true
- '@pnpm/win-x64@11.15.1':
+ '@pnpm/win-x64@11.16.0':
optional: true
'@reflink/reflink-darwin-arm64@0.1.19':
@@ -202,7 +202,7 @@ snapshots:
detect-libc@2.1.2: {}
- pnpm@11.15.1: {}
+ pnpm@11.16.0: {}
---
lockfileVersion: '9.0'
@@ -318,11 +318,11 @@ catalogs:
specifier: 1.2.2
version: 1.2.2
'@typescript-eslint/eslint-plugin':
- specifier: 8.64.0
- version: 8.64.0
+ specifier: 8.65.0
+ version: 8.65.0
'@typescript-eslint/parser':
- specifier: 8.64.0
- version: 8.64.0
+ specifier: 8.65.0
+ version: 8.65.0
'@typescript/typescript6':
specifier: 6.0.2
version: 6.0.2
@@ -330,8 +330,8 @@ catalogs:
specifier: 1.0.2
version: 1.0.2
'@vitejs/devtools':
- specifier: 0.4.1
- version: 0.4.1
+ specifier: 0.4.3
+ version: 0.4.3
'@wc-toolkit/cem-inheritance':
specifier: 1.2.2
version: 1.2.2
@@ -441,14 +441,14 @@ catalogs:
specifier: runtime:26.5.0
version: 26.5.0
postcss:
- specifier: 8.5.20
- version: 8.5.20
+ specifier: 8.5.22
+ version: 8.5.22
postcss-lit:
specifier: 1.4.1
version: 1.4.1
prettier:
- specifier: 3.9.5
- version: 3.9.5
+ specifier: 3.9.6
+ version: 3.9.6
pwa-asset-generator:
specifier: 8.1.5
version: 8.1.5
@@ -549,8 +549,8 @@ catalogs:
specifier: 7.0.2
version: 7.0.2
typescript-eslint:
- specifier: 8.64.0
- version: 8.64.0
+ specifier: 8.65.0
+ version: 8.65.0
unplugin-dts:
specifier: 1.0.3
version: 1.0.3
@@ -722,10 +722,10 @@ importers:
version: 1.2.2
'@typescript-eslint/eslint-plugin':
specifier: catalog:devDependencies
- version: 8.64.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.64.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ version: 8.65.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.65.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
'@typescript-eslint/parser':
specifier: catalog:devDependencies
- version: 8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ version: 8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
'@typescript/typescript6':
specifier: catalog:devDependencies
version: 6.0.2
@@ -734,7 +734,7 @@ importers:
version: 1.0.2
'@vitejs/devtools':
specifier: catalog:devDependencies
- version: 0.4.1(crossws@0.4.10)(srvx@0.11.16)(typescript@7.0.2)(valibot@1.4.2)(vite@8.1.5)
+ version: 0.4.3(crossws@0.4.10)(srvx@0.11.16)(typescript@7.0.2)(valibot@1.4.2)(vite@8.1.5)
'@wc-toolkit/cem-inheritance':
specifier: catalog:devDependencies
version: 1.2.2
@@ -770,7 +770,7 @@ importers:
version: 2.8.0
autoprefixer:
specifier: catalog:devDependencies
- version: 10.5.4(postcss@8.5.20)
+ version: 10.5.4(postcss@8.5.22)
cem-plugin-better-lit-types:
specifier: catalog:devDependencies
version: 0.2.1
@@ -788,10 +788,10 @@ importers:
version: 0.0.4(@custom-elements-manifest/analyzer@0.11.0)
custom-element-jet-brains-integration:
specifier: catalog:devDependencies
- version: 1.7.0(prettier@3.9.5)
+ version: 1.7.0(prettier@3.9.6)
custom-element-vs-code-integration:
specifier: catalog:devDependencies
- version: 1.5.0(prettier@3.9.5)
+ version: 1.5.0(prettier@3.9.6)
custom-elements-manifest:
specifier: catalog:devDependencies
version: 2.1.0
@@ -818,7 +818,7 @@ importers:
version: 5.1.1(@types/eslint@9.6.1)(eslint@10.7.0)
eslint-plugin-prettier:
specifier: catalog:devDependencies
- version: 5.5.6(@types/eslint@9.6.1)(eslint@10.7.0)(prettier@3.9.5)
+ version: 5.5.6(@types/eslint@9.6.1)(eslint@10.7.0)(prettier@3.9.6)
eslint-plugin-tsdoc:
specifier: catalog:devDependencies
version: 0.5.2(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
@@ -839,13 +839,13 @@ importers:
version: runtime:26.5.0
postcss:
specifier: catalog:devDependencies
- version: 8.5.20
+ version: 8.5.22
postcss-lit:
specifier: catalog:devDependencies
- version: 1.4.1(jiti@2.7.0)(postcss@8.5.20)(supports-color@10.2.2)(tsx@4.23.1)(yaml@2.9.0)
+ version: 1.4.1(jiti@2.7.0)(postcss@8.5.22)(supports-color@10.2.2)(tsx@4.23.1)(yaml@2.9.0)
prettier:
specifier: catalog:devDependencies
- version: 3.9.5
+ version: 3.9.6
pwa-asset-generator:
specifier: catalog:devDependencies
version: 8.1.5(supports-color@10.2.2)
@@ -893,7 +893,7 @@ importers:
version: 1.4.4(stylelint@17.14.1)
stylelint-prettier:
specifier: catalog:devDependencies
- version: 5.0.3(prettier@3.9.5)(stylelint@17.14.1)
+ version: 5.0.3(prettier@3.9.6)(stylelint@17.14.1)
stylelint-use-nesting:
specifier: catalog:devDependencies
version: 6.0.2(stylelint@17.14.1)
@@ -947,7 +947,7 @@ importers:
version: 7.0.2
typescript-eslint:
specifier: catalog:devDependencies
- version: 8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ version: 8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
unplugin-dts:
specifier: catalog:devDependencies
version: 1.0.3(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.0)(supports-color@10.2.2)(typescript@7.0.2)(vite@8.1.5)
@@ -956,7 +956,7 @@ importers:
version: 1.3.2(@nuxt/kit@4.4.8)(@nuxt/schema@4.4.8)(esbuild@0.28.1)(rollup@4.62.0)(supports-color@10.2.2)(vite@8.1.5)
vite:
specifier: catalog:devDependencies
- version: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ version: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
vite-plugin-cem:
specifier: catalog:devDependencies
version: 0.8.5(vite@8.1.5)
@@ -1003,10 +1003,10 @@ importers:
devDependencies:
'@typescript-eslint/eslint-plugin':
specifier: catalog:devDependencies
- version: 8.64.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.64.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ version: 8.65.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.65.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
'@typescript-eslint/parser':
specifier: catalog:devDependencies
- version: 8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ version: 8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
eslint:
specifier: catalog:devDependencies
version: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
@@ -1015,7 +1015,7 @@ importers:
version: 0.14.0(eslint@10.7.0)
eslint-plugin-import:
specifier: catalog:devDependencies
- version: 2.32.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.64.0)(eslint@10.7.0)(supports-color@10.2.2)
+ version: 2.32.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.65.0)(eslint@10.7.0)(supports-color@10.2.2)
firebase-functions-test:
specifier: catalog:functionsDevDependencies
version: 3.5.0(firebase-admin@14.0.0)(firebase-functions@7.2.5)(jest@30.4.2)
@@ -2012,37 +2012,46 @@ packages:
peerDependencies:
devframe: 0.5.4
- '@devframes/hub@0.6.0':
- resolution: {integrity: sha512-TIL5uYkrm20+nxmJzl7Z13O9N22nNiwW8EZ8AjcX/iowDzFgDXuridYdsf70OPaaHS2kRk4VeibuGpAERDxxqA==}
+ '@devframes/hub@0.7.9':
+ resolution: {integrity: sha512-+tARSZfwkzez6RKA8ShlntAmfKTn7Z+IM2xwDilNMze5YO+E4n/WmaJBYZL2VvXdDiWB0cJbbwHto+vsrEQB9g==}
peerDependencies:
- devframe: 0.6.0
+ devframe: 0.7.9
- '@devframes/plugin-inspect@0.6.0':
- resolution: {integrity: sha512-FAQu7XAihGevQh1h2yEB7Eb9FeZpbIES9TruskG2uRN0lub3wSiGxUj7YQsXhkecL0m6kFPv52KB4Sg9IGV4Vg==}
+ '@devframes/json-render@0.7.9':
+ resolution: {integrity: sha512-VgUBkxyCG60wTMvihZpGwX9RZwhmhNf+znh/R0Dlwz602E74HtCD2J8jdWqKje4aia4KmmHFLLwWC/itmkfJZg==}
+ peerDependencies:
+ '@devframes/hub': 0.7.9
+ devframe: 0.7.9
+ peerDependenciesMeta:
+ '@devframes/hub':
+ optional: true
+
+ '@devframes/plugin-inspect@0.7.9':
+ resolution: {integrity: sha512-pDt/cjOvc8hF0Qj4WwBo+drnGD9yy1ck/CCFr2wno+d6AlM+00rxTgP1cCecAckVRNPxeVzSmQ7rFo8Ep/zPIw==}
hasBin: true
peerDependencies:
- devframe: 0.6.0
+ devframe: 0.7.9
vite: ^7.0.0 || ^8.0.0
peerDependenciesMeta:
vite:
optional: true
- '@devframes/plugin-messages@0.6.0':
- resolution: {integrity: sha512-ItKt3aSosekhVeCXB5ScOGJExB3g92CFa9GmDmjyeOjDmcIjjug9kASagrkBs5XVwOgY3wAEotuHDiLmeeTUUQ==}
+ '@devframes/plugin-messages@0.7.9':
+ resolution: {integrity: sha512-WcKRQEPw+VAjbubEZx7gHZdaKMkN4FwGkGBHCoAfe/4rbY2Sl2l/KEIW6+og0y8luoxHWxmnmrus1Jkc9mRZow==}
hasBin: true
peerDependencies:
- '@devframes/hub': 0.6.0
- devframe: 0.6.0
+ '@devframes/hub': 0.7.9
+ devframe: 0.7.9
vite: ^7.0.0 || ^8.0.0
peerDependenciesMeta:
vite:
optional: true
- '@devframes/plugin-terminals@0.6.0':
- resolution: {integrity: sha512-XPb/BnQ4dm0LbxqQQvRpNdinli0/+rzWfWs9y5ohyejGWHDe2q+SYbjPARZq26yVxK2V/Dv40xtNWxkETlmuKw==}
+ '@devframes/plugin-terminals@0.7.9':
+ resolution: {integrity: sha512-rvDtNCzZyMRvtd89IV8UHImI0fHGqa88DzP87zHVAUoscL1WSHv9bE8zXW5yKj/tJMpJziVIeGJKTbto07tIrQ==}
hasBin: true
peerDependencies:
- devframe: 0.6.0
+ devframe: 0.7.9
vite: ^8.0.0
peerDependenciesMeta:
vite:
@@ -2809,6 +2818,11 @@ packages:
'@js-sdsl/ordered-map@4.4.2':
resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==}
+ '@json-render/core@0.19.0':
+ resolution: {integrity: sha512-vvcyZ+10EDZKbEyB1J2kXOGfDaiZR2LurZGSqi2r5STHyKr+Te85DWaBxTwRGgM7U1LtIvNx85BzzjElRKoAIg==}
+ peerDependencies:
+ zod: ^4.0.0
+
'@jsonjoy.com/base64@1.1.2':
resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==}
engines: {node: '>=10.0'}
@@ -4546,16 +4560,16 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
- '@typescript-eslint/eslint-plugin@8.64.0':
- resolution: {integrity: sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==}
+ '@typescript-eslint/eslint-plugin@8.65.0':
+ resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.64.0
+ '@typescript-eslint/parser': ^8.65.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.64.0':
- resolution: {integrity: sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==}
+ '@typescript-eslint/parser@8.65.0':
+ resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -4567,8 +4581,8 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.64.0':
- resolution: {integrity: sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==}
+ '@typescript-eslint/project-service@8.65.0':
+ resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
@@ -4577,8 +4591,8 @@ packages:
resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/scope-manager@8.64.0':
- resolution: {integrity: sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==}
+ '@typescript-eslint/scope-manager@8.65.0':
+ resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.56.1':
@@ -4593,8 +4607,14 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.64.0':
- resolution: {integrity: sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==}
+ '@typescript-eslint/tsconfig-utils@8.65.0':
+ resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/type-utils@8.65.0':
+ resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -4608,14 +4628,18 @@ packages:
resolution: {integrity: sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@typescript-eslint/types@8.65.0':
+ resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@typescript-eslint/typescript-estree@8.56.1':
resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/typescript-estree@8.64.0':
- resolution: {integrity: sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==}
+ '@typescript-eslint/typescript-estree@8.65.0':
+ resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
@@ -4627,8 +4651,8 @@ packages:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.64.0':
- resolution: {integrity: sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==}
+ '@typescript-eslint/utils@8.65.0':
+ resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -4638,8 +4662,8 @@ packages:
resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/visitor-keys@8.64.0':
- resolution: {integrity: sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==}
+ '@typescript-eslint/visitor-keys@8.65.0':
+ resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript/typescript-aix-ppc64@7.0.2':
@@ -4904,28 +4928,38 @@ packages:
peerDependencies:
vite: '*'
- '@vitejs/devtools-kit@0.4.1':
- resolution: {integrity: sha512-5SvryUWtnE9F/s3ubJYSsbop35sJuavxadoO/UzPh59y54K4w9l/9wZBdrDKqbGpqD7g2aUwgcjM8nAh1AOnkw==}
+ '@vitejs/devtools-kit@0.4.3':
+ resolution: {integrity: sha512-FjETJwshQQwa9DNeCYtjzfQhvye3e4XMAkDSVmdDicPj8dJM6lJapKTHvNU7SUoxgm8e5tc7OcFyQYaq1xDH3A==}
peerDependencies:
vite: '*'
'@vitejs/devtools-rolldown@0.3.4':
resolution: {integrity: sha512-5MFcRpZIqL50A6Kb31jHaRDt1jg7WkdQUKx53deFZdp8DxRezzzwGBaYH00kK7fWJC1UDvlwROByHgavC/O52A==}
- '@vitejs/devtools-rolldown@0.4.1':
- resolution: {integrity: sha512-51MPmAXZOU0iwkDKpikXo58DBCC0DsZgAC7WkiIbb6TuKf7wAXwjiysZLCkbGv7eGdY5X9sJQKmzlJaoVrRpvg==}
-
'@vitejs/devtools@0.3.4':
resolution: {integrity: sha512-CkIy5lFs4e1D99HD050fbpUYXt2tZsMz2y1OoaRsxEUFQvZsYyhtC9taOM/CVMLOWpAD8A84o+KM6F7pz10wVA==}
hasBin: true
peerDependencies:
vite: '*'
- '@vitejs/devtools@0.4.1':
- resolution: {integrity: sha512-j9/N9YYA/oUcKm2hq/EByEnOugi6tjhMDkeqbHYLRXIJW4PsPmzKz/sSRpkMImQyWGqMmc1HSHfMxDApr7l+Bg==}
+ '@vitejs/devtools@0.4.3':
+ resolution: {integrity: sha512-+CEeUTVsRdCUMiy4YeOBOuuMPaYA9o0cA7O/gVIqBiT+WgkXEHHiMQH5MaqtaEMgoH0ii/8W1nQrtstorlELrQ==}
hasBin: true
peerDependencies:
+ '@vitejs/devtools-oxc': ^0.4.3
+ '@vitejs/devtools-rolldown': ^0.4.3
+ '@vitejs/devtools-vite': ^0.4.3
+ '@vitejs/devtools-vitest': ^0.4.3
vite: '*'
+ peerDependenciesMeta:
+ '@vitejs/devtools-oxc':
+ optional: true
+ '@vitejs/devtools-rolldown':
+ optional: true
+ '@vitejs/devtools-vite':
+ optional: true
+ '@vitejs/devtools-vitest':
+ optional: true
'@volar/language-core@2.4.28':
resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
@@ -4939,34 +4973,32 @@ packages:
'@vscode/web-custom-data@0.4.13':
resolution: {integrity: sha512-2ZUIRfhofZ/npLlf872EBnPmn27Kt4M2UssmQIfnJvgGgMYZJ5fvtHEDnttBBf2hnVtBgNCqZMVHJA+wsFVqTA==}
- '@vue/compiler-core@3.5.39':
- resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==}
+ '@vue/compiler-core@3.5.40':
+ resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==}
- '@vue/compiler-dom@3.5.39':
- resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==}
+ '@vue/compiler-dom@3.5.40':
+ resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==}
- '@vue/compiler-sfc@3.5.39':
- resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==}
+ '@vue/compiler-sfc@3.5.40':
+ resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==}
- '@vue/compiler-ssr@3.5.39':
- resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==}
+ '@vue/compiler-ssr@3.5.40':
+ resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==}
- '@vue/reactivity@3.5.39':
- resolution: {integrity: sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==}
+ '@vue/reactivity@3.5.40':
+ resolution: {integrity: sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==}
- '@vue/runtime-core@3.5.39':
- resolution: {integrity: sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==}
+ '@vue/runtime-core@3.5.40':
+ resolution: {integrity: sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==}
- '@vue/runtime-dom@3.5.39':
- resolution: {integrity: sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==}
+ '@vue/runtime-dom@3.5.40':
+ resolution: {integrity: sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==}
- '@vue/server-renderer@3.5.39':
- resolution: {integrity: sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==}
- peerDependencies:
- vue: 3.5.39
+ '@vue/server-renderer@3.5.40':
+ resolution: {integrity: sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==}
- '@vue/shared@3.5.39':
- resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==}
+ '@vue/shared@3.5.40':
+ resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==}
'@wc-toolkit/cem-inheritance@1.2.2':
resolution: {integrity: sha512-Da7U9Zew9X8DhoITRemKhKOP8AFoZwuQTj164TCFUB50YJ/0LbukOhFunTzo19MHw22ohpnzAahbjofSmrKjBg==}
@@ -5687,6 +5719,9 @@ packages:
citty@0.1.6:
resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==}
+ citty@0.2.2:
+ resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==}
+
cjs-module-lexer@2.2.0:
resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==}
@@ -6129,13 +6164,16 @@ packages:
'@modelcontextprotocol/sdk':
optional: true
- devframe@0.6.0:
- resolution: {integrity: sha512-Pb8qMgoDmKYrVjw8TItmVI3o5PbffTxime5STp8JpWtb9SJiSbIupj96Ejly53/56uuljgyFjaRrV+t3kdA7dA==}
+ devframe@0.7.9:
+ resolution: {integrity: sha512-ZWSHN5uk6KwCsrCXhu373kdBnk5kxkgxmGpD8tvv5DablgUOfWz+JrP4ufufTrns6PtQFP1Nh5S7sffWoLLp8w==}
peerDependencies:
'@modelcontextprotocol/sdk': ^1.0.0
+ cac: ^7.0.0
peerDependenciesMeta:
'@modelcontextprotocol/sdk':
optional: true
+ cac:
+ optional: true
devtools-protocol@0.0.1608973:
resolution: {integrity: sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==}
@@ -8321,11 +8359,6 @@ packages:
nanocolors@0.2.13:
resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==}
- nanoid@3.3.12:
- resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
nanoid@3.3.16:
resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -8524,8 +8557,8 @@ packages:
nostics@0.2.0:
resolution: {integrity: sha512-/WQpI46UMbqvy1okYb+V+9wW3J8/m6GJ33wm691n/tyi6YtJiZ6ssJjENAU7y4evfYrrgYN9HllKDzPvffil1w==}
- nostics@1.1.4:
- resolution: {integrity: sha512-U4FApICSLCQ0dYiN59pxUCEZC053palQXi57yLaNdMaL6TBY4C4q3qZrJKUGcor2dGv8EhEwt8y5KvU2bo2kFg==}
+ nostics@1.2.0:
+ resolution: {integrity: sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg==}
npm-run-path@4.0.1:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
@@ -8537,6 +8570,11 @@ packages:
nwsapi@2.2.24:
resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==}
+ nypm@0.6.8:
+ resolution: {integrity: sha512-Q9K4Diu6l5u6xJQogeFSs/zKtyMSgFKFtRQV+tHP4kL7KPm2grpBU0dFIwFaXwNxN0MtfKWc43VpCugAa+LPsw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -8577,8 +8615,8 @@ packages:
resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
engines: {node: '>= 0.4'}
- obug@2.1.3:
- resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==}
+ obug@2.1.4:
+ resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
ofetch@1.5.1:
@@ -8886,8 +8924,12 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.5.20:
- resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==}
+ postcss@8.5.21:
+ resolution: {integrity: sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.22:
+ resolution: {integrity: sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ==}
engines: {node: ^10 || ^12 || >=14}
powershell-utils@0.1.0:
@@ -8902,8 +8944,8 @@ packages:
resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'}
- prettier@3.9.5:
- resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==}
+ prettier@3.9.6:
+ resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==}
engines: {node: '>=14'}
hasBin: true
@@ -9941,8 +9983,8 @@ packages:
peerDependencies:
typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x
- typescript-eslint@8.64.0:
- resolution: {integrity: sha512-0qg+pDNMnqYzqH9AnNK+39tejHvsShUOUUoRUgtnTGE7QuMZhiFDnozq8nHJVq+Wae6NMLKNWLg5WmkcC/ndyQ==}
+ typescript-eslint@8.65.0:
+ resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -10437,8 +10479,8 @@ packages:
peerDependencies:
vue: ^3.3.0
- vue@3.5.39:
- resolution: {integrity: sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==}
+ vue@3.5.40:
+ resolution: {integrity: sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@@ -10718,6 +10760,9 @@ packages:
zod@3.25.76:
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
+ zod@4.4.3:
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+
zwitch@1.0.5:
resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}
@@ -10730,7 +10775,7 @@ snapshots:
dependencies:
commander: 12.1.0
lit: 3.3.3
- prettier: 3.9.5
+ prettier: 3.9.6
tslib: 2.8.1
'@apideck/better-ajv-errors@0.3.7(ajv@8.20.0)':
@@ -11714,46 +11759,58 @@ snapshots:
tinyexec: 1.2.4
optional: true
- '@devframes/hub@0.6.0(devframe@0.6.0)':
+ '@devframes/hub@0.7.9(devframe@0.7.9)':
dependencies:
birpc: 4.0.0
destr: 2.0.5
- devframe: 0.6.0(srvx@0.11.16)(typescript@7.0.2)
- nostics: 1.1.4
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
+ nostics: 1.2.0
pathe: 2.0.3
perfect-debounce: 2.1.0
tinyexec: 1.2.4
zigpty: 0.2.1
- '@devframes/plugin-inspect@0.6.0(devframe@0.6.0)(valibot@1.4.2)(vite@8.1.5)':
+ '@devframes/json-render@0.7.9(@devframes/hub@0.7.9)(devframe@0.7.9)':
+ dependencies:
+ '@json-render/core': 0.19.0(zod@4.4.3)
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
+ nostics: 1.2.0
+ zod: 4.4.3
+ optionalDependencies:
+ '@devframes/hub': 0.7.9(devframe@0.7.9)
+
+ '@devframes/plugin-inspect@0.7.9(devframe@0.7.9)(valibot@1.4.2)(vite@8.1.5)':
dependencies:
'@valibot/to-json-schema': 1.7.1(valibot@1.4.2)
- devframe: 0.6.0(srvx@0.11.16)(typescript@7.0.2)
- nostics: 1.1.4
+ cac: 7.0.0
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
+ nostics: 1.2.0
optionalDependencies:
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- valibot
- '@devframes/plugin-messages@0.6.0(@devframes/hub@0.6.0)(devframe@0.6.0)(vite@8.1.5)':
+ '@devframes/plugin-messages@0.7.9(@devframes/hub@0.7.9)(devframe@0.7.9)(vite@8.1.5)':
dependencies:
- '@devframes/hub': 0.6.0(devframe@0.6.0)
- devframe: 0.6.0(srvx@0.11.16)(typescript@7.0.2)
- nostics: 1.1.4
+ '@devframes/hub': 0.7.9(devframe@0.7.9)
+ cac: 7.0.0
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
+ nostics: 1.2.0
optionalDependencies:
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
- '@devframes/plugin-terminals@0.6.0(devframe@0.6.0)(typescript@7.0.2)(vite@8.1.5)':
+ '@devframes/plugin-terminals@0.7.9(devframe@0.7.9)(typescript@7.0.2)(vite@8.1.5)':
dependencies:
'@xterm/addon-fit': 0.11.0
'@xterm/xterm': 6.0.0
- devframe: 0.6.0(srvx@0.11.16)(typescript@7.0.2)
- nostics: 1.1.4
+ cac: 7.0.0
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
+ nostics: 1.2.0
pathe: 2.0.3
valibot: 1.4.2(typescript@7.0.2)
zigpty: 0.2.1
optionalDependencies:
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- typescript
@@ -12258,13 +12315,16 @@ snapshots:
'@floating-ui/core@1.7.5':
dependencies:
'@floating-ui/utils': 0.2.11
+ optional: true
'@floating-ui/dom@1.7.6':
dependencies:
'@floating-ui/core': 1.7.5
'@floating-ui/utils': 0.2.11
+ optional: true
- '@floating-ui/utils@0.2.11': {}
+ '@floating-ui/utils@0.2.11':
+ optional: true
'@genesiscommunitysuccess/custom-elements-lsp@5.0.3':
dependencies:
@@ -12711,6 +12771,10 @@ snapshots:
'@js-sdsl/ordered-map@4.4.2':
optional: true
+ '@json-render/core@0.19.0(zod@4.4.3)':
+ dependencies:
+ zod: 4.4.3
+
'@jsonjoy.com/base64@1.1.2(tslib@2.8.1)':
dependencies:
tslib: 2.8.1
@@ -13036,7 +13100,7 @@ snapshots:
'@nuxt/schema@4.4.8':
dependencies:
- '@vue/shared': 3.5.39
+ '@vue/shared': 3.5.40
defu: 6.1.7
pathe: 2.0.3
pkg-types: 2.3.1
@@ -13246,10 +13310,10 @@ snapshots:
style-value-types: 3.2.0
tslib: 1.14.1
- '@prettier/sync@0.5.5(prettier@3.9.5)':
+ '@prettier/sync@0.5.5(prettier@3.9.6)':
dependencies:
make-synchronized: 0.4.2
- prettier: 3.9.5
+ prettier: 3.9.6
'@protobufjs/aspromise@1.1.2': {}
@@ -13449,7 +13513,8 @@ snapshots:
'@rolldown/binding-win32-x64-msvc@1.2.0':
optional: true
- '@rolldown/debug@1.1.5': {}
+ '@rolldown/debug@1.1.5':
+ optional: true
'@rolldown/pluginutils@1.0.1': {}
@@ -14183,7 +14248,7 @@ snapshots:
'@types/postcss-safe-parser@5.0.4':
dependencies:
- postcss: 8.5.20
+ postcss: 8.5.22
'@types/pretty@2.0.3': {}
@@ -14355,15 +14420,15 @@ snapshots:
'@types/node': 26.1.1
optional: true
- '@typescript-eslint/eslint-plugin@8.64.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.64.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
+ '@typescript-eslint/eslint-plugin@8.65.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.65.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
dependencies:
'@eslint-community/regexpp': 4.12.2
'@types/natural-compare': 1.4.3
- '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/scope-manager': 8.64.0
- '@typescript-eslint/type-utils': 8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/utils': 8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/visitor-keys': 8.64.0
+ '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/scope-manager': 8.65.0
+ '@typescript-eslint/type-utils': 8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/utils': 8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/visitor-keys': 8.65.0
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
ignore: 7.0.5
natural-compare: 1.4.0
@@ -14373,12 +14438,12 @@ snapshots:
- '@types/eslint'
- supports-color
- '@typescript-eslint/parser@8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
+ '@typescript-eslint/parser@8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
dependencies:
- '@typescript-eslint/scope-manager': 8.64.0
- '@typescript-eslint/types': 8.64.0
- '@typescript-eslint/typescript-estree': 8.64.0(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/visitor-keys': 8.64.0
+ '@typescript-eslint/scope-manager': 8.65.0
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/typescript-estree': 8.65.0(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3(supports-color@10.2.2)
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
typescript: 7.0.2
@@ -14394,10 +14459,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.64.0(supports-color@10.2.2)(typescript@7.0.2)':
+ '@typescript-eslint/project-service@8.65.0(supports-color@10.2.2)(typescript@7.0.2)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@7.0.2)
- '@typescript-eslint/types': 8.64.0
+ '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@7.0.2)
+ '@typescript-eslint/types': 8.65.0
debug: 4.4.3(supports-color@10.2.2)
typescript: 7.0.2
transitivePeerDependencies:
@@ -14408,10 +14473,10 @@ snapshots:
'@typescript-eslint/types': 8.56.1
'@typescript-eslint/visitor-keys': 8.56.1
- '@typescript-eslint/scope-manager@8.64.0':
+ '@typescript-eslint/scope-manager@8.65.0':
dependencies:
- '@typescript-eslint/types': 8.64.0
- '@typescript-eslint/visitor-keys': 8.64.0
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/visitor-keys': 8.65.0
'@typescript-eslint/tsconfig-utils@8.56.1(typescript@7.0.2)':
dependencies:
@@ -14421,11 +14486,15 @@ snapshots:
dependencies:
typescript: 7.0.2
- '@typescript-eslint/type-utils@8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
+ '@typescript-eslint/tsconfig-utils@8.65.0(typescript@7.0.2)':
dependencies:
- '@typescript-eslint/types': 8.64.0
- '@typescript-eslint/typescript-estree': 8.64.0(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/utils': 8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ typescript: 7.0.2
+
+ '@typescript-eslint/type-utils@8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
+ dependencies:
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/typescript-estree': 8.65.0(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/utils': 8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
debug: 4.4.3(supports-color@10.2.2)
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
ts-api-utils: 2.5.0(typescript@7.0.2)
@@ -14438,6 +14507,8 @@ snapshots:
'@typescript-eslint/types@8.64.0': {}
+ '@typescript-eslint/types@8.65.0': {}
+
'@typescript-eslint/typescript-estree@8.56.1(supports-color@10.2.2)(typescript@7.0.2)':
dependencies:
'@typescript-eslint/project-service': 8.56.1(supports-color@10.2.2)(typescript@7.0.2)
@@ -14453,12 +14524,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.64.0(supports-color@10.2.2)(typescript@7.0.2)':
+ '@typescript-eslint/typescript-estree@8.65.0(supports-color@10.2.2)(typescript@7.0.2)':
dependencies:
- '@typescript-eslint/project-service': 8.64.0(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@7.0.2)
- '@typescript-eslint/types': 8.64.0
- '@typescript-eslint/visitor-keys': 8.64.0
+ '@typescript-eslint/project-service': 8.65.0(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@7.0.2)
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/visitor-keys': 8.65.0
debug: 4.4.3(supports-color@10.2.2)
minimatch: 10.2.5
semver: 7.8.4
@@ -14480,12 +14551,12 @@ snapshots:
- '@types/eslint'
- supports-color
- '@typescript-eslint/utils@8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
+ '@typescript-eslint/utils@8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(@types/eslint@9.6.1)(eslint@10.7.0)
- '@typescript-eslint/scope-manager': 8.64.0
- '@typescript-eslint/types': 8.64.0
- '@typescript-eslint/typescript-estree': 8.64.0(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/scope-manager': 8.65.0
+ '@typescript-eslint/types': 8.65.0
+ '@typescript-eslint/typescript-estree': 8.65.0(supports-color@10.2.2)(typescript@7.0.2)
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
typescript: 7.0.2
transitivePeerDependencies:
@@ -14497,9 +14568,9 @@ snapshots:
'@typescript-eslint/types': 8.56.1
eslint-visitor-keys: 5.0.1
- '@typescript-eslint/visitor-keys@8.64.0':
+ '@typescript-eslint/visitor-keys@8.65.0':
dependencies:
- '@typescript-eslint/types': 8.64.0
+ '@typescript-eslint/types': 8.65.0
eslint-visitor-keys: 5.0.1
'@typescript/typescript-aix-ppc64@7.0.2':
@@ -14657,7 +14728,7 @@ snapshots:
birpc: 4.0.0
devframe: 0.5.4(crossws@0.4.10)(typescript@7.0.2)
mlly: 1.8.2
- nostics: 1.1.4
+ nostics: 1.2.0
pathe: 2.0.3
perfect-debounce: 2.1.0
tinyexec: 1.2.4
@@ -14670,19 +14741,23 @@ snapshots:
- utf-8-validate
optional: true
- '@vitejs/devtools-kit@0.4.1(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)':
+ '@vitejs/devtools-kit@0.4.3(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)':
dependencies:
- '@devframes/hub': 0.6.0(devframe@0.6.0)
- devframe: 0.6.0(srvx@0.11.16)(typescript@7.0.2)
+ '@devframes/hub': 0.7.9(devframe@0.7.9)
+ '@devframes/json-render': 0.7.9(@devframes/hub@0.7.9)(devframe@0.7.9)
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
+ local-pkg: 1.2.1
mlly: 1.8.2
- nostics: 1.1.4
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ nostics: 1.2.0
+ nypm: 0.6.8
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
+ - cac
- srvx
- typescript
- '@vitejs/devtools-rolldown@0.3.4(crossws@0.4.10)(typescript@7.0.2)(vite@8.1.5)(vue@3.5.39)':
+ '@vitejs/devtools-rolldown@0.3.4(crossws@0.4.10)(typescript@7.0.2)(vite@8.1.5)(vue@3.5.40)':
dependencies:
'@floating-ui/dom': 1.7.6
'@rolldown/debug': 1.1.5
@@ -14696,14 +14771,14 @@ snapshots:
h3: 2.0.1-rc.22(crossws@0.4.10)
mlly: 1.8.2
mrmime: 2.0.1
- nostics: 1.1.4
+ nostics: 1.2.0
p-limit: 7.3.0
pathe: 2.0.3
publint: 0.3.21
tinyglobby: 0.2.17
unconfig: 7.5.0
unstorage: 1.17.5
- vue-virtual-scroller: 3.0.4(vue@3.5.39)
+ vue-virtual-scroller: 3.0.4(vue@3.5.40)
ws: 8.21.0
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -14734,40 +14809,23 @@ snapshots:
- vue
optional: true
- '@vitejs/devtools-rolldown@0.4.1(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)(vue@3.5.39)':
- dependencies:
- '@floating-ui/dom': 1.7.6
- '@rolldown/debug': 1.1.5
- '@vitejs/devtools-kit': 0.4.1(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)
- d3-shape: 3.2.0
- diff: 9.0.0
- nostics: 1.1.4
- pathe: 2.0.3
- vue-virtual-scroller: 3.0.4(vue@3.5.39)
- transitivePeerDependencies:
- - '@modelcontextprotocol/sdk'
- - srvx
- - typescript
- - vite
- - vue
-
'@vitejs/devtools@0.3.4(crossws@0.4.10)(typescript@7.0.2)(vite@8.1.5)':
dependencies:
'@devframes/hub': 0.5.4(devframe@0.5.4)
'@vitejs/devtools-kit': 0.3.4(crossws@0.4.10)(typescript@7.0.2)(vite@8.1.5)
- '@vitejs/devtools-rolldown': 0.3.4(crossws@0.4.10)(typescript@7.0.2)(vite@8.1.5)(vue@3.5.39)
+ '@vitejs/devtools-rolldown': 0.3.4(crossws@0.4.10)(typescript@7.0.2)(vite@8.1.5)(vue@3.5.40)
birpc: 4.0.0
cac: 7.0.0
devframe: 0.5.4(crossws@0.4.10)(typescript@7.0.2)
h3: 2.0.1-rc.22(crossws@0.4.10)
mlly: 1.8.2
- nostics: 1.1.4
- obug: 2.1.3
+ nostics: 1.2.0
+ obug: 2.1.4
pathe: 2.0.3
perfect-debounce: 2.1.0
tinyexec: 1.2.4
vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
- vue: 3.5.39(typescript@7.0.2)
+ vue: 3.5.40(typescript@7.0.2)
ws: 8.21.0
transitivePeerDependencies:
- '@azure/app-configuration'
@@ -14796,24 +14854,24 @@ snapshots:
- utf-8-validate
optional: true
- '@vitejs/devtools@0.4.1(crossws@0.4.10)(srvx@0.11.16)(typescript@7.0.2)(valibot@1.4.2)(vite@8.1.5)':
+ '@vitejs/devtools@0.4.3(crossws@0.4.10)(srvx@0.11.16)(typescript@7.0.2)(valibot@1.4.2)(vite@8.1.5)':
dependencies:
- '@devframes/hub': 0.6.0(devframe@0.6.0)
- '@devframes/plugin-inspect': 0.6.0(devframe@0.6.0)(valibot@1.4.2)(vite@8.1.5)
- '@devframes/plugin-messages': 0.6.0(@devframes/hub@0.6.0)(devframe@0.6.0)(vite@8.1.5)
- '@devframes/plugin-terminals': 0.6.0(devframe@0.6.0)(typescript@7.0.2)(vite@8.1.5)
- '@vitejs/devtools-kit': 0.4.1(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)
- '@vitejs/devtools-rolldown': 0.4.1(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)(vue@3.5.39)
+ '@devframes/hub': 0.7.9(devframe@0.7.9)
+ '@devframes/plugin-inspect': 0.7.9(devframe@0.7.9)(valibot@1.4.2)(vite@8.1.5)
+ '@devframes/plugin-messages': 0.7.9(@devframes/hub@0.7.9)(devframe@0.7.9)(vite@8.1.5)
+ '@devframes/plugin-terminals': 0.7.9(devframe@0.7.9)(typescript@7.0.2)(vite@8.1.5)
+ '@vitejs/devtools-kit': 0.4.3(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)(vite@8.1.5)
birpc: 4.0.0
cac: 7.0.0
- devframe: 0.6.0(srvx@0.11.16)(typescript@7.0.2)
+ devframe: 0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2)
h3: 2.0.1-rc.22(crossws@0.4.10)
+ local-pkg: 1.2.1
mlly: 1.8.2
- nostics: 1.1.4
- obug: 2.1.3
+ nostics: 1.2.0
+ obug: 2.1.4
pathe: 2.0.3
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
- vue: 3.5.39(typescript@7.0.2)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vue: 3.5.40(typescript@7.0.2)
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
- crossws
@@ -14836,59 +14894,59 @@ snapshots:
'@vscode/web-custom-data@0.4.13': {}
- '@vue/compiler-core@3.5.39':
+ '@vue/compiler-core@3.5.40':
dependencies:
'@babel/parser': 7.29.7
- '@vue/shared': 3.5.39
+ '@vue/shared': 3.5.40
entities: 7.0.1
estree-walker: 2.0.2
source-map-js: 1.2.1
- '@vue/compiler-dom@3.5.39':
+ '@vue/compiler-dom@3.5.40':
dependencies:
- '@vue/compiler-core': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/compiler-core': 3.5.40
+ '@vue/shared': 3.5.40
- '@vue/compiler-sfc@3.5.39':
+ '@vue/compiler-sfc@3.5.40':
dependencies:
'@babel/parser': 7.29.7
- '@vue/compiler-core': 3.5.39
- '@vue/compiler-dom': 3.5.39
- '@vue/compiler-ssr': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/compiler-core': 3.5.40
+ '@vue/compiler-dom': 3.5.40
+ '@vue/compiler-ssr': 3.5.40
+ '@vue/shared': 3.5.40
estree-walker: 2.0.2
magic-string: 0.30.21
- postcss: 8.5.20
+ postcss: 8.5.21
source-map-js: 1.2.1
- '@vue/compiler-ssr@3.5.39':
+ '@vue/compiler-ssr@3.5.40':
dependencies:
- '@vue/compiler-dom': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/compiler-dom': 3.5.40
+ '@vue/shared': 3.5.40
- '@vue/reactivity@3.5.39':
+ '@vue/reactivity@3.5.40':
dependencies:
- '@vue/shared': 3.5.39
+ '@vue/shared': 3.5.40
- '@vue/runtime-core@3.5.39':
+ '@vue/runtime-core@3.5.40':
dependencies:
- '@vue/reactivity': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/reactivity': 3.5.40
+ '@vue/shared': 3.5.40
- '@vue/runtime-dom@3.5.39':
+ '@vue/runtime-dom@3.5.40':
dependencies:
- '@vue/reactivity': 3.5.39
- '@vue/runtime-core': 3.5.39
- '@vue/shared': 3.5.39
+ '@vue/reactivity': 3.5.40
+ '@vue/runtime-core': 3.5.40
+ '@vue/shared': 3.5.40
csstype: 3.2.3
- '@vue/server-renderer@3.5.39(vue@3.5.39)':
+ '@vue/server-renderer@3.5.40':
dependencies:
- '@vue/compiler-ssr': 3.5.39
- '@vue/shared': 3.5.39
- vue: 3.5.39(typescript@7.0.2)
+ '@vue/compiler-ssr': 3.5.40
+ '@vue/runtime-dom': 3.5.40
+ '@vue/shared': 3.5.40
- '@vue/shared@3.5.39': {}
+ '@vue/shared@3.5.40': {}
'@wc-toolkit/cem-inheritance@1.2.2':
dependencies:
@@ -15036,7 +15094,7 @@ snapshots:
istanbul-reports: 3.2.0
log-update: 4.0.0
nanocolors: 0.2.13
- nanoid: 3.3.12
+ nanoid: 3.3.16
open: 8.4.2
picomatch: 2.3.2
source-map: 0.7.6
@@ -15343,13 +15401,13 @@ snapshots:
at-least-node@1.0.0: {}
- autoprefixer@10.5.4(postcss@8.5.20):
+ autoprefixer@10.5.4(postcss@8.5.22):
dependencies:
browserslist: 4.28.6
caniuse-lite: 1.0.30001806
fraction.js: 5.3.4
picocolors: 1.1.1
- postcss: 8.5.20
+ postcss: 8.5.22
postcss-value-parser: 4.2.0
available-typed-arrays@1.0.7:
@@ -15826,6 +15884,8 @@ snapshots:
dependencies:
consola: 3.4.2
+ citty@0.2.2: {}
+
cjs-module-lexer@2.2.0: {}
clean-css@4.2.4:
@@ -16068,15 +16128,15 @@ snapshots:
csstype@3.2.3: {}
- custom-element-jet-brains-integration@1.7.0(prettier@3.9.5):
+ custom-element-jet-brains-integration@1.7.0(prettier@3.9.6):
dependencies:
- '@prettier/sync': 0.5.5(prettier@3.9.5)
+ '@prettier/sync': 0.5.5(prettier@3.9.6)
transitivePeerDependencies:
- prettier
- custom-element-vs-code-integration@1.5.0(prettier@3.9.5):
+ custom-element-vs-code-integration@1.5.0(prettier@3.9.6):
dependencies:
- '@prettier/sync': 0.5.5(prettier@3.9.5)
+ '@prettier/sync': 0.5.5(prettier@3.9.6)
transitivePeerDependencies:
- prettier
@@ -16084,11 +16144,13 @@ snapshots:
custom-elements-manifest@2.1.0: {}
- d3-path@3.1.0: {}
+ d3-path@3.1.0:
+ optional: true
d3-shape@3.2.0:
dependencies:
d3-path: 3.1.0
+ optional: true
dark-mode-toggle@0.18.0: {}
@@ -16246,19 +16308,20 @@ snapshots:
- utf-8-validate
optional: true
- devframe@0.6.0(srvx@0.11.16)(typescript@7.0.2):
+ devframe@0.7.9(cac@7.0.0)(srvx@0.11.16)(typescript@7.0.2):
dependencies:
'@valibot/to-json-schema': 1.7.1(valibot@1.4.2)
birpc: 4.0.0
- cac: 7.0.0
crossws: 0.4.10(srvx@0.11.16)
destr: 2.0.5
h3: 2.0.1-rc.22(crossws@0.4.10)
mrmime: 2.0.1
- nostics: 1.1.4
+ nostics: 1.2.0
pathe: 2.0.3
ufo: 1.6.4
valibot: 1.4.2(typescript@7.0.2)
+ optionalDependencies:
+ cac: 7.0.0
transitivePeerDependencies:
- srvx
- typescript
@@ -16565,18 +16628,18 @@ snapshots:
esquery: 1.7.0
jsonc-eslint-parser: 3.1.0
- eslint-module-utils@2.13.0(@typescript-eslint/parser@8.64.0)(eslint-import-resolver-node@0.3.10)(eslint@10.7.0)(supports-color@10.2.2):
+ eslint-module-utils@2.13.0(@typescript-eslint/parser@8.65.0)(eslint-import-resolver-node@0.3.10)(eslint@10.7.0)(supports-color@10.2.2):
dependencies:
'@types/debug': 4.1.13
debug: 3.2.7(supports-color@10.2.2)
optionalDependencies:
- '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
eslint-import-resolver-node: 0.3.10(supports-color@10.2.2)
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.32.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.64.0)(eslint@10.7.0)(supports-color@10.2.2):
+ eslint-plugin-import@2.32.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.65.0)(eslint@10.7.0)(supports-color@10.2.2):
dependencies:
'@rtsao/scc': 1.1.0
'@types/eslint': 9.6.1
@@ -16588,7 +16651,7 @@ snapshots:
doctrine: 2.1.0
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
eslint-import-resolver-node: 0.3.10(supports-color@10.2.2)
- eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.64.0)(eslint-import-resolver-node@0.3.10)(eslint@10.7.0)(supports-color@10.2.2)
+ eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.65.0)(eslint-import-resolver-node@0.3.10)(eslint@10.7.0)(supports-color@10.2.2)
hasown: 2.0.4
is-core-module: 2.16.2
is-glob: 4.0.3
@@ -16600,7 +16663,7 @@ snapshots:
string.prototype.trimend: 1.0.10
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -16649,10 +16712,10 @@ snapshots:
parse5: 8.0.1
parse5-htmlparser2-tree-adapter: 8.0.1
- eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint@10.7.0)(prettier@3.9.5):
+ eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint@10.7.0)(prettier@3.9.6):
dependencies:
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
- prettier: 3.9.5
+ prettier: 3.9.6
prettier-linter-helpers: 1.0.1
synckit: 0.11.13
optionalDependencies:
@@ -19226,8 +19289,6 @@ snapshots:
nanocolors@0.2.13: {}
- nanoid@3.3.12: {}
-
nanoid@3.3.16: {}
napi-postinstall@0.3.4: {}
@@ -19301,7 +19362,7 @@ snapshots:
unplugin: 3.0.0
optional: true
- nostics@1.1.4: {}
+ nostics@1.2.0: {}
npm-run-path@4.0.1:
dependencies:
@@ -19314,6 +19375,12 @@ snapshots:
nwsapi@2.2.24: {}
+ nypm@0.6.8:
+ dependencies:
+ citty: 0.2.2
+ pathe: 2.0.3
+ tinyexec: 1.2.4
+
object-assign@4.1.1: {}
object-hash@3.0.0:
@@ -19364,7 +19431,7 @@ snapshots:
define-properties: 1.2.1
es-object-atoms: 1.1.2
- obug@2.1.3: {}
+ obug@2.1.4: {}
ofetch@1.5.1:
dependencies:
@@ -19711,45 +19778,51 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss-lit@1.4.1(jiti@2.7.0)(postcss@8.5.20)(supports-color@10.2.2)(tsx@4.23.1)(yaml@2.9.0):
+ postcss-lit@1.4.1(jiti@2.7.0)(postcss@8.5.22)(supports-color@10.2.2)(tsx@4.23.1)(yaml@2.9.0):
dependencies:
'@babel/generator': 7.29.7
'@babel/parser': 7.29.7
'@babel/traverse': 7.29.7(supports-color@10.2.2)
lilconfig: 3.1.3
- postcss: 8.5.20
- postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.20)(tsx@4.23.1)(yaml@2.9.0)
+ postcss: 8.5.22
+ postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.22)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- jiti
- supports-color
- tsx
- yaml
- postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.20)(tsx@4.23.1)(yaml@2.9.0):
+ postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.22)(tsx@4.23.1)(yaml@2.9.0):
dependencies:
lilconfig: 3.1.3
optionalDependencies:
jiti: 2.7.0
- postcss: 8.5.20
+ postcss: 8.5.22
tsx: 4.23.1
yaml: 2.9.0
- postcss-safe-parser@7.0.1(postcss@8.5.20):
+ postcss-safe-parser@7.0.1(postcss@8.5.22):
dependencies:
- postcss: 8.5.20
+ postcss: 8.5.22
postcss-selector-parser@7.1.4:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss-sorting@9.1.0(postcss@8.5.20):
+ postcss-sorting@9.1.0(postcss@8.5.22):
dependencies:
- postcss: 8.5.20
+ postcss: 8.5.22
postcss-value-parser@4.2.0: {}
- postcss@8.5.20:
+ postcss@8.5.21:
+ dependencies:
+ nanoid: 3.3.16
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.22:
dependencies:
nanoid: 3.3.16
picocolors: 1.1.1
@@ -19763,7 +19836,7 @@ snapshots:
dependencies:
fast-diff: 1.3.0
- prettier@3.9.5: {}
+ prettier@3.9.6: {}
pretty-bytes@5.6.0: {}
@@ -20633,7 +20706,7 @@ snapshots:
is-plain-obj: 4.1.0
json5: 2.2.3
path-unified: 0.2.0
- prettier: 3.9.5
+ prettier: 3.9.6
tinycolor2: 1.6.0
transitivePeerDependencies:
- tslib
@@ -20696,8 +20769,8 @@ snapshots:
stylelint-order@7.0.1(stylelint@17.14.1):
dependencies:
- postcss: 8.5.20
- postcss-sorting: 9.1.0(postcss@8.5.20)
+ postcss: 8.5.22
+ postcss-sorting: 9.1.0(postcss@8.5.22)
stylelint: 17.14.1(supports-color@10.2.2)(typescript@7.0.2)
stylelint-plugin-logical-css@2.1.0(stylelint@17.14.1):
@@ -20717,13 +20790,13 @@ snapshots:
dependencies:
css-tree: 3.2.1
is-plain-object: 5.0.0
- postcss: 8.5.20
+ postcss: 8.5.22
postcss-value-parser: 4.2.0
stylelint: 17.14.1(supports-color@10.2.2)(typescript@7.0.2)
- stylelint-prettier@5.0.3(prettier@3.9.5)(stylelint@17.14.1):
+ stylelint-prettier@5.0.3(prettier@3.9.6)(stylelint@17.14.1):
dependencies:
- prettier: 3.9.5
+ prettier: 3.9.6
prettier-linter-helpers: 1.0.1
stylelint: 17.14.1(supports-color@10.2.2)(typescript@7.0.2)
@@ -20769,8 +20842,8 @@ snapshots:
micromatch: 4.0.8
normalize-path: 3.0.0
picocolors: 1.1.1
- postcss: 8.5.20
- postcss-safe-parser: 7.0.1(postcss@8.5.20)
+ postcss: 8.5.22
+ postcss-safe-parser: 7.0.1(postcss@8.5.22)
postcss-selector-parser: 7.1.4
postcss-value-parser: 4.2.0
string-width: 8.2.1
@@ -21209,12 +21282,12 @@ snapshots:
typescript: 7.0.2
yaml: 2.9.0
- typescript-eslint@8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2):
+ typescript-eslint@8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.64.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.64.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/parser': 8.64.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/typescript-estree': 8.64.0(supports-color@10.2.2)(typescript@7.0.2)
- '@typescript-eslint/utils': 8.64.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/eslint-plugin': 8.65.0(@types/eslint@9.6.1)(@typescript-eslint/parser@8.65.0)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/typescript-estree': 8.65.0(supports-color@10.2.2)(typescript@7.0.2)
+ '@typescript-eslint/utils': 8.65.0(@types/eslint@9.6.1)(eslint@10.7.0)(supports-color@10.2.2)(typescript@7.0.2)
eslint: 10.7.0(@types/eslint@9.6.1)(jiti@2.7.0)(supports-color@10.2.2)
typescript: 7.0.2
transitivePeerDependencies:
@@ -21401,7 +21474,7 @@ snapshots:
esbuild: 0.28.1
rolldown: 1.2.0
rollup: 4.62.0
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- supports-color
@@ -21416,7 +21489,7 @@ snapshots:
'@nuxt/schema': 4.4.8
esbuild: 0.28.1
rollup: 4.62.0
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- supports-color
@@ -21568,7 +21641,7 @@ snapshots:
'@types/glob': 8.1.0
glob: 8.1.0
typescript: 5.7.3
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
vite-plugin-cp@6.0.3(supports-color@10.2.2):
dependencies:
@@ -21585,7 +21658,7 @@ snapshots:
unplugin-dts: 1.0.3(esbuild@0.28.1)(rolldown@1.2.0)(rollup@4.62.0)(supports-color@10.2.2)(typescript@7.0.2)(vite@8.1.5)
optionalDependencies:
rollup: 4.62.0
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
transitivePeerDependencies:
- '@rspack/core'
- '@vue/language-core'
@@ -21598,7 +21671,7 @@ snapshots:
vite-plugin-lit-css@3.0.0(lit@3.3.3)(vite@8.1.5):
dependencies:
lit: 3.3.3
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
vite-plugin-pwa@1.3.0(@vite-pwa/assets-generator@1.0.2)(supports-color@10.2.2)(vite@8.1.5)(workbox-build@7.4.1)(workbox-window@7.4.1):
dependencies:
@@ -21606,7 +21679,7 @@ snapshots:
debug: 4.4.3(supports-color@10.2.2)
pretty-bytes: 6.1.1
tinyglobby: 0.2.17
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
workbox-build: 7.4.1(@types/babel__core@7.20.5)(supports-color@10.2.2)
workbox-window: 7.4.1
optionalDependencies:
@@ -21618,19 +21691,19 @@ snapshots:
dependencies:
svgo: 4.0.1
typescript: 7.0.2
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
vite-plugin-version-mark@0.2.2(@nuxt/kit@4.4.8)(@nuxt/schema@4.4.8)(vite@8.1.5):
dependencies:
'@nuxt/kit': 4.4.8
'@nuxt/schema': 4.4.8
- vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
+ vite: 8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0)
vite@8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.3.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.5
- postcss: 8.5.20
+ postcss: 8.5.22
rolldown: 1.1.5
tinyglobby: 0.2.17
optionalDependencies:
@@ -21643,16 +21716,16 @@ snapshots:
tsx: 4.23.1
yaml: 2.9.0
- vite@8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0):
+ vite@8.1.5(@types/node@26.1.1)(@vitejs/devtools@0.4.3)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.1)(yaml@2.9.0):
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.5
- postcss: 8.5.20
+ postcss: 8.5.22
rolldown: 1.1.5
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 26.1.1
- '@vitejs/devtools': 0.4.1(crossws@0.4.10)(srvx@0.11.16)(typescript@7.0.2)(valibot@1.4.2)(vite@8.1.5)
+ '@vitejs/devtools': 0.4.3(crossws@0.4.10)(srvx@0.11.16)(typescript@7.0.2)(valibot@1.4.2)(vite@8.1.5)
esbuild: 0.28.1
fsevents: 2.3.3
jiti: 2.7.0
@@ -21695,17 +21768,18 @@ snapshots:
vscode-uri@3.1.0: {}
- vue-virtual-scroller@3.0.4(vue@3.5.39):
+ vue-virtual-scroller@3.0.4(vue@3.5.40):
dependencies:
- vue: 3.5.39(typescript@7.0.2)
+ vue: 3.5.40(typescript@7.0.2)
+ optional: true
- vue@3.5.39(typescript@7.0.2):
+ vue@3.5.40(typescript@7.0.2):
dependencies:
- '@vue/compiler-dom': 3.5.39
- '@vue/compiler-sfc': 3.5.39
- '@vue/runtime-dom': 3.5.39
- '@vue/server-renderer': 3.5.39(vue@3.5.39)
- '@vue/shared': 3.5.39
+ '@vue/compiler-dom': 3.5.40
+ '@vue/compiler-sfc': 3.5.40
+ '@vue/runtime-dom': 3.5.40
+ '@vue/server-renderer': 3.5.40
+ '@vue/shared': 3.5.40
optionalDependencies:
typescript: 7.0.2
@@ -22057,6 +22131,8 @@ snapshots:
zod@3.25.76: {}
+ zod@4.4.3: {}
+
zwitch@1.0.5: {}
zwitch@2.0.4: {}
@@ -22088,11 +22164,11 @@ time:
'@types/fs-extra@11.0.4': '2023-11-07T20:15:59.748Z'
'@types/node@26.1.1': '2026-07-08T06:47:46.733Z'
'@types/wordcloud@1.2.2': '2023-11-07T19:21:56.870Z'
- '@typescript-eslint/eslint-plugin@8.64.0': '2026-07-13T17:39:22.423Z'
- '@typescript-eslint/parser@8.64.0': '2026-07-13T17:39:00.545Z'
+ '@typescript-eslint/eslint-plugin@8.65.0': '2026-07-20T17:39:25.625Z'
+ '@typescript-eslint/parser@8.65.0': '2026-07-20T17:39:03.395Z'
'@typescript/typescript6@6.0.2': '2026-07-06T18:06:47.459Z'
'@vite-pwa/assets-generator@1.0.2': '2025-10-14T13:40:10.449Z'
- '@vitejs/devtools@0.4.1': '2026-07-14T04:11:17.577Z'
+ '@vitejs/devtools@0.4.3': '2026-07-22T08:53:53.635Z'
'@wc-toolkit/cem-inheritance@1.2.2': '2025-09-18T18:48:53.268Z'
'@wc-toolkit/cem-sorter@1.0.1': '2025-08-01T17:14:59.030Z'
'@wc-toolkit/cem-utilities@1.5.5': '2026-04-16T12:49:07.154Z'
@@ -22139,8 +22215,8 @@ time:
lit@3.3.3: '2026-05-14T03:55:58.007Z'
material-symbols@0.45.8: '2026-07-14T04:39:43.528Z'
postcss-lit@1.4.1: '2026-02-23T15:19:14.618Z'
- postcss@8.5.20: '2026-07-19T08:44:44.719Z'
- prettier@3.9.5: '2026-07-09T16:17:00.997Z'
+ postcss@8.5.22: '2026-07-22T08:48:15.850Z'
+ prettier@3.9.6: '2026-07-21T05:51:53.987Z'
prop-for-that@0.7.8: '2026-07-01T20:40:26.033Z'
pwa-asset-generator@8.1.5: '2026-06-01T09:36:00.765Z'
rimraf@6.1.3: '2026-02-16T00:59:39.538Z'
@@ -22174,7 +22250,7 @@ time:
typedoc-plugin-skillit@2.0.1: '2026-07-03T04:50:22.123Z'
typedoc-plugin-version-header@1.0.0: '2024-10-05T02:15:15.718Z'
typedoc@0.28.20: '2026-07-05T22:54:07.305Z'
- typescript-eslint@8.64.0: '2026-07-13T17:39:29.371Z'
+ typescript-eslint@8.65.0: '2026-07-20T17:39:32.402Z'
typescript@7.0.2: '2026-07-08T15:55:18.431Z'
unplugin-dts@1.0.3: '2026-06-24T08:15:01.703Z'
unplugin-info@1.3.2: '2026-03-30T11:56:02.951Z'
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 7c89fd28..0fbbc593 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -48,11 +48,11 @@ catalogs:
"@types/fs-extra": 11.0.4
"@types/node": 26.1.1
"@types/wordcloud": 1.2.2
- "@typescript-eslint/eslint-plugin": 8.64.0
- "@typescript-eslint/parser": 8.64.0
+ "@typescript-eslint/eslint-plugin": 8.65.0
+ "@typescript-eslint/parser": 8.65.0
"@typescript/typescript6": 6.0.2
"@vite-pwa/assets-generator": 1.0.2
- "@vitejs/devtools": 0.4.1
+ "@vitejs/devtools": 0.4.3
"@wc-toolkit/cem-inheritance": 1.2.2
"@wc-toolkit/cem-sorter": 1.0.1
"@wc-toolkit/cem-utilities": 1.5.5
@@ -90,9 +90,9 @@ catalogs:
jiti: 2.7.0
lit-analyzer: 2.0.3
node: runtime:26.5.0
- postcss: 8.5.20
+ postcss: 8.5.22
postcss-lit: 1.4.1
- prettier: 3.9.5
+ prettier: 3.9.6
prettier-plugin-toml: 2.0.6
pwa-asset-generator: 8.1.5
rimraf: 6.1.3
@@ -128,7 +128,7 @@ catalogs:
typedoc-plugin-skillit: 2.0.1
typedoc-plugin-version-header: 1.0.0
typescript: 7.0.2
- typescript-eslint: 8.64.0
+ typescript-eslint: 8.65.0
unplugin-dts: 1.0.3
unplugin-info: 1.3.2
vite: 8.1.5
diff --git a/sites/docs/.config/mise/config.toml b/sites/docs/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/sites/docs/.config/mise/config.toml
+++ b/sites/docs/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/sites/portfolio/.config/mise/config.toml b/sites/portfolio/.config/mise/config.toml
index 9185b650..cdfaa03a 100644
--- a/sites/portfolio/.config/mise/config.toml
+++ b/sites/portfolio/.config/mise/config.toml
@@ -3,7 +3,7 @@
node = "26.5.0"
"npm:corepack" = "0.35.0"
"npm:vite" = "8.1.5"
- pnpm = "11.15.1"
+ pnpm = "11.16.0"
tombi = "1.1.5"
- usage = "3.5.5"
+ usage = "3.5.6"
npm = "12.0.0"
diff --git a/sites/portfolio/index.css b/sites/portfolio/index.css
index 695506ca..698b3f40 100644
--- a/sites/portfolio/index.css
+++ b/sites/portfolio/index.css
@@ -77,8 +77,7 @@
stroke var(--color-transition-duration) var(--color-transition-timing),
fill var(--color-transition-duration) var(--color-transition-timing),
border-color var(--color-transition-duration) var(--color-transition-timing),
- background-color var(--color-transition-duration)
- var(--color-transition-timing),
+ background-color var(--color-transition-duration) var(--color-transition-timing),
color var(--color-transition-duration) var(--color-transition-timing);
}
diff --git a/sites/portfolio/manifest.json b/sites/portfolio/manifest.json
index 06db197e..3f23375f 100644
--- a/sites/portfolio/manifest.json
+++ b/sites/portfolio/manifest.json
@@ -7,7 +7,7 @@
"short_name": "fnc314.com",
"author": "Franco N. Colaizzi",
"description": "Personal Website of Franco N. Colaizzi - fnc314",
- "version": "2.1.0",
+ "version": "3.0.0",
"name": "fnc314.com",
"manifest_version": "3",
"display": "standalone",
diff --git a/sites/portfolio/package.json b/sites/portfolio/package.json
index 51ebece6..6eb9f7db 100644
--- a/sites/portfolio/package.json
+++ b/sites/portfolio/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "@fnc314/sites.portfolio",
- "version": "2.1.0",
+ "version": "3.0.0",
"type": "module",
"dependencies": {
"@fnc314/packages.components": "workspace:*",