diff --git a/.ai/skills/CHANGELOG.md b/.ai/skills/CHANGELOG.md new file mode 100644 index 0000000000..6e2a692fd0 --- /dev/null +++ b/.ai/skills/CHANGELOG.md @@ -0,0 +1,100 @@ +# igniteui doc-skill set · changelog + +## v3 · 2026-08-14 + +Restructures both skills to the routing-hub + references architecture used by the +`IgniteUI/igniteui-angular` repo skills (SKILL.md = router with a Task → Reference table; all +evolving rules live in `references/`). **No rule content changed** — v2's rules were moved, not +edited; two stale cross-pointers were fixed in the move. Completes D2-03 stage 2 (physical +deduplication) and adds the set-level README. Whole set bumped to v3 (uniform version line, +including content-unchanged files, per the blog-creator convention). + +### Changed + +| Change | File(s) | +|---|---| +| igniteui-topic-frontmatter split: SKILL.md becomes a router (scope, audit-first mode, task table, hard boundaries); the field checks + severity ladder move to `references/audit-rules.md`; report shape + apply procedure move to `references/report-format.md`. `description` unchanged (adapter byte-match preserved). | igniteui-topic-frontmatter/* | +| igniteui-doc-topics slimmed: SKILL.md keeps identity, two modes, compass, composite principle, task table, grounding boundaries. Create steps 1–7 (6a–6e) + the category/index structure move to `references/create-workflow.md`; the 5 audit-workflow steps move into `audit-rubric.md`. `description` unchanged. | igniteui-doc-topics/SKILL.md, references/create-workflow.md, references/audit-rubric.md | +| Dedup (D2-03 stage 2): the section→mode map is no longer restated in SKILL.md — it is the "Diátaxis mode" column of house-style's canonical section table; SKILL.md keeps only the one-section-one-mode rule and the concrete mode-bleed examples. The category blueprint now lives in house-style + create-workflow only. Stale pointers fixed (house-style intro pointed at a SKILL.md map that moved; body-support bullet pointed at "Create workflow step 4" which now lives in create-workflow.md). | igniteui-doc-topics/SKILL.md, references/house-style.md | +| Set-level README.md added: human-readable intent, file map, authority chain, and the five-step update procedure (edit references not routers; uniform version bump; adapter byte-match; changelog entry; resolve ‹VERIFY› by pre-committed outcome). | README.md | +| Set-wide version line: every file now carries `Version: v3 · 2026-08-14 · igniteui doc-skill set`, including content-unchanged house-style and diataxis-cheatsheet (the cheatsheet gains its first version line). | all files | + +### Unchanged + +All v2 rule substance (E1–E9 with D2 amendments, D2-01…11 fixes), all open ‹VERIFY› items and their +owners (see the v2 entry below), and both skill `description` fields. + +--- + +## v2 · 2026-08-14 + +Applies the D5 frontmatter patch v1 (E1–E9) as ratified by D2 (D2 review v1.1, 2026-08-14, transfer +matrix v1 Option A) with D2's amendments, plus the D2 "do now" wave. Three wait-line items were +pulled forward (D2-08, D2-09, D2-11) because the marginal cost inside a full edit pass was zero, +the same precedent as blog-creator v3. Finding IDs reference the D5 review (D5-22…31, patch edits +E1–E9) and the D2 review v1.1 (D2-01…12). + +Files changed: `igniteui-topic-frontmatter/SKILL.md`, `igniteui-doc-topics/SKILL.md`, +`igniteui-doc-topics/references/house-style.md`, `igniteui-doc-topics/references/audit-rubric.md`, +both `.claude/skills/*/SKILL.md` adapters. `diataxis-cheatsheet.md` is unchanged (no findings). + +### Applied + +| Finding | Change | File(s) | +|---|---|---| +| E1 / D5-24 + D2 amendment | Title rule split per doc set: xplat keeps `{ComponentTitle}`; Angular target `"Angular Component"` within ~60 query-relevant chars, no hand-coded suffixes pending `‹VERIFY: Angular layout title suffix behavior›`, with pre-committed outcomes for both branches (`\| Ignite UI` standardized if the layout appends nothing). Blog banned-phrase set merged in. | frontmatter SKILL.md | +| E2 / D5-26 | Description bar raised: definition-first ("X is a … that …"), not imperative CTA; complete sentences; no ellipsis truncation. | frontmatter SKILL.md, house-style | +| E3 / D5-23 + D2 amendment | `llms.description` defines the component, not the page: subject noun names product + component, no pronouns, no list-dumps, no page-referential phrasing; quotability test at accept time. One-definition rule added: llms.description ≈ H1 lead ≈ llms-manifest entry (`‹VERIFY: manifest source field›`). | frontmatter SKILL.md, house-style | +| E4 / D5-22 | New required check: cross-field consistency (title / description / llms.description / keywords / H1 / lead sentence tell one story, same entities, same capability list). | frontmatter SKILL.md, house-style | +| E5 / D5-25 | New required check: entity terminology in metadata, bound to the shared terminology table. | frontmatter SKILL.md | +| E6 / D5-27 | New required check: body support for every metadata claim; frontmatter generated from the finished body. | frontmatter SKILL.md, house-style | +| E7 / D5-28 | `keywords` coherence made testable: every keyword (or token-resolved form) appears in the body. | frontmatter SKILL.md | +| E8 / D5-30 | `mentionedTypes` scoped: Angular occurrences tolerated, not required, pending `‹VERIFY: does the Angular pipeline consume mentionedTypes?›`. | frontmatter SKILL.md | +| E9 / D5-31 | Schema linkage named in Scope: frontmatter bars are schema bars; FAQPage (if emitted) sources visible FAQ content verbatim (`‹VERIFY: schema pipeline nodes/fields›`). | frontmatter SKILL.md | +| E-10 (D2 §2) | Title character budget in Severity: non-query terms pushing query terms past ~60-char truncation = Error; query-relevant portion >~60 = Warning. | frontmatter SKILL.md | +| D2-01 | Contradiction fixed: reconciliation table no longer maps "Known Limitations" to Troubleshooting; drifted variants map to the required **Known Limitations** section, with the conditional Troubleshooting placement noted. | house-style | +| D2-02 | Create step 4 rewritten "Write frontmatter first" → "Scaffold frontmatter": convention-fixed fields before the body; description / llms.description / keywords / mentionedTypes / relatedComponents generated from the finished body, then the frontmatter skill's cross-field and body-support checks run. Resolves the companion-skill contradiction with E6 / matrix row 11. | doc-topics SKILL.md | +| D2-03 stage 1 | Single-sourcing declared: house-style "File format & frontmatter" is the normative field contract; both SKILL.mds reference it. Version lines added to all changed files; adapter `description` byte-match rule stated in both adapters and both canonicals. Shared field bars synced so no copy contradicts another. | all changed files | +| D2-04 / matrix row 5 | FAQ answer shape bound: 2–4 self-contained sentences quotable without the question; fan-out question patterns (licensing, version support, migration, accessibility, "is X right for") added as authoring guidance. Rubric A11 extended. | house-style, audit-rubric | +| D2-05 / matrix row 1 | Section leads name the component (and platform token): write-for-both rule 2 and rubric D3 extended. | house-style, audit-rubric | +| D2-06 / matrix row 10 | Quotability test given a check ID: new D13 (H1 lead, section leads, FAQ answers, llms.description). | audit-rubric | +| D2-07 / matrix row 8 | New E7: descriptive, entity-bearing anchor text on prose links; "click here"/bare URLs flagged. | audit-rubric | +| D2-08 / matrix row 7 (pulled forward) | New house-style section "Entity terminology (canonical names)", a governed copy of the blog terminology table with provenance line "source: blog-creator product-context v4 · 2026-08-14". New rubric B6 for body-side entity drift. | house-style, audit-rubric | +| D2-09 (pulled forward) | Table of contents added to house-style (>300-line reference, loaded on every create/audit). | house-style | +| D2-10 | Routing boundary sentences added to both skill descriptions (frontmatter-only work → frontmatter skill; body/structure work → doc-topics skill). Adapters updated to byte-match. | both SKILL.mds, both adapters | +| D2-11 (pulled forward) | Create step 6 split into passes 6a–6e; no rule content changed. | doc-topics SKILL.md | +| Matrix row 4 (pre-commitment) | Rubric B4 carries the pending `‹VERIFY: layout H1/framework adjacency›` with both pre-committed outcomes, so the answer resolves the rule mechanically. | audit-rubric | + +### Deliberately not applied + +- **D2-03 stage 2** (physical deduplication of the field contract out of the frontmatter skill's + audit rules): batched with the next structural SKILL.md edit; stage 1's authority declaration and + synced wording carry the interim. +- **D2-12** (verification-URL single-sourcing against RESOURCE-LIST): requires the RESOURCE-LIST + canonical-variant decision, which has no owner yet. +- **Canonical-link policy enforcement** (D5-29): the skill still refuses to invent canonicals; the + enforcement text lands only after the policy's two `‹VERIFY›` items are answered (D2 review §5). +- **Em-dash advisory** (matrix row 18): docs team's call; existing file style kept. +- **Matrix rows 4 / E1 branch resolution**: `‹VERIFY›` placeholders ship in the files, as the + convention intends; the pre-committed outcomes are written next to them. + +### Open verification items (owners) + +1. `‹VERIFY: Angular layout title suffix behavior›` — docs team. Resolves E1's branch and the + Severity rule's application to Angular titles. +2. `‹VERIFY: layout H1/framework adjacency, both doc sets›` — docs team. Resolves B4's direction. +3. `‹VERIFY: schema pipeline — node types, source fields, FAQPage presence›` — docs team. +4. `‹VERIFY: does the Angular pipeline consume mentionedTypes?›` — docs team. +5. `‹VERIFY: llms-manifest source field›` — docs team. Resolves the one-definition rule's third leg. +6. `‹VERIFY: what the layout emits when _canonicalLink is absent›` — docs team; if the answer is + "nothing", it preempts every queue (D2 review §5.1). +7. Canonical-link policy pattern — D2 (draft exists in D2 review §5), docs team implements. + +### Deploy + +1. Replace the four `.ai` files and two `.claude` adapters in one commit; `git diff` is the review + surface. +2. The adapter `description` fields must remain byte-identical to their canonicals — check on every + future edit (version lines are the interim control until a CI check exists). +3. Next steps per the D2 cut line: D5 step 2 diffs are superseded by this apply; skill-creator eval + loop (pre-patch snapshots exist in git history) after this wave merges. diff --git a/.ai/skills/README.md b/.ai/skills/README.md new file mode 100644 index 0000000000..72c1703bd7 --- /dev/null +++ b/.ai/skills/README.md @@ -0,0 +1,91 @@ +# Ignite UI doc-skill set — architecture and maintenance guide + +Version: v3 · 2026-08-14 · igniteui doc-skill set. This file is for humans; agents load the +SKILL.md files. Change history: `CHANGELOG.md`. + +## What this is + +Two agent skills that keep Ignite UI documentation topics uniform, verified, and quotable by AI +assistants: + +- **`igniteui-doc-topics`** — author or audit whole topics (component pages, concept overviews, + category indexes) against the Diátaxis-based house templates. +- **`igniteui-topic-frontmatter`** — audit and normalize YAML frontmatter only (SEO titles, meta + descriptions, `llms.description`, keywords, canonical links), audit-first, never touching the body. + +The `.claude/skills/` copies are **thin adapters** for Claude: they carry the same `name` and +`description` (the triggering surface) and redirect to the canonical `.ai/skills/` files. Other +agents can consume the `.ai` skills directly. + +## Design intent (why it is structured this way) + +**SKILL.md is a routing hub; references carry the substance.** This follows the same pattern as the +`IgniteUI/igniteui-angular` repo skills (e.g. `skills/igniteui-angular-components`): the SKILL.md +holds only identity, scope, hard boundaries, and a Task → Reference table; every rule that can +change over time lives in `references/`. Three reasons: + +1. **Progressive disclosure.** Agents always see the name + description; they load the SKILL.md + body when the skill triggers, and read only the reference files the task needs. Small router = + cheap trigger, precise loading. +2. **Future-proofing.** Rules evolve (new checks, answered ‹VERIFY› items, template revisions); + the router does not. Day-to-day maintenance touches only `references/*.md`, so SKILL.md diffs are + rare and reviewable, and the adapters in `.claude/` almost never need to change. +3. **Anti-drift.** Rules stated once, in one file, referenced everywhere else. The set learned this + the hard way (see CHANGELOG v2): the same contract stated in three places will disagree within a + week. + +## File map + +``` +.ai/skills/ +├── README.md ← this file (humans) +├── CHANGELOG.md ← every change, mapped to review finding IDs +├── igniteui-doc-topics/ +│ ├── SKILL.md ← router: modes, compass, composite principle, task table +│ └── references/ +│ ├── house-style.md ← THE normative source: blueprints, frontmatter contract, +│ │ naming, entity terminology, verification workflow, voice +│ ├── create-workflow.md ← authoring steps 1–7 + category/index structure +│ ├── audit-rubric.md ← audit workflow + checks A–F + report format +│ └── diataxis-cheatsheet.md ← the four modes + the compass (reasoning layer) +└── igniteui-topic-frontmatter/ + ├── SKILL.md ← router: scope, audit-first mode, task table, boundaries + └── references/ + ├── audit-rules.md ← field-by-field quality checks + severity ladder + └── report-format.md ← report shape + apply procedure + +.claude/skills/ +├── igniteui-doc-topics/SKILL.md ← adapter (description byte-matches canonical) +└── igniteui-topic-frontmatter/SKILL.md ← adapter (description byte-matches canonical) +``` + +**Authority chain:** where any two files differ, `house-style.md` wins on content rules (it is the +single normative field contract and template source); each skill's own references win on its +operational procedure (severities, report shapes, workflow order). The frontmatter skill reads +across into `igniteui-doc-topics/references/house-style.md` deliberately — one contract, two +consumers. + +## How to update the set + +1. **Edit the reference file**, not the router. New check → `audit-rules.md` or `audit-rubric.md`; + template change → `house-style.md`; workflow change → `create-workflow.md`. Touch a SKILL.md only + when scope, boundaries, or routing genuinely change. +2. **Bump the set version line in every file** (`Version: vN · date · igniteui doc-skill set`) — + all files move together, even content-unchanged ones. A mismatched version line is the drift + alarm; treat it as a stop sign. +3. **Keep adapter descriptions byte-identical** to the canonical `description` fields. If you + change a description, change it in both places in the same commit. +4. **Record the change in `CHANGELOG.md`** with what changed, why, and the finding/decision ID it + traces to. This set is maintained under review discipline; an untraceable edit is how the last + contradiction got in. +5. **Resolve ‹VERIFY› placeholders by editing, never by deleting.** Each open item is listed in the + changelog with an owner. When a verification is answered, apply its pre-committed outcome (they + are written next to the placeholders) and remove the placeholder in the same edit. + +## Provenance + +- The entity-terminology table in `house-style.md` is a governed copy of + `blog-creator product-context v4 · 2026-08-14`. When that table changes upstream, update the copy + in the same change. +- The rule substance was ratified through the D5 review (2026-08-14, findings D5-22…31) and the D2 + review v1.1 (findings D2-01…12, transfer matrix v1). The CHANGELOG maps every edit to those IDs. diff --git a/.ai/skills/igniteui-doc-topics/SKILL.md b/.ai/skills/igniteui-doc-topics/SKILL.md index c667e6e22f..ca902ad9fe 100644 --- a/.ai/skills/igniteui-doc-topics/SKILL.md +++ b/.ai/skills/igniteui-doc-topics/SKILL.md @@ -11,14 +11,25 @@ description: >- UI — even if they just say "write docs for the X component" or "review this topic" without naming Diátaxis or the templates. Also use it when deciding what *kind* of documentation a page should be, or when a topic mixes tutorial / how-to / reference / explanation content that should be separated. + For frontmatter-only audits or metadata normalization, use the companion igniteui-topic-frontmatter + skill instead. --- # Ignite UI doc topics +Version: v3 · 2026-08-14 · igniteui doc-skill set. All set files carry this version line; before +editing any file, confirm the lines match across the set. The `.claude` adapter's `description` must +byte-match this file's `description`. Change log: `.ai/skills/CHANGELOG.md` · human-readable intent: +`.ai/skills/README.md`. + Write and audit Ignite UI documentation topics so every page has the same predictable shape — easy for developers to read and for AI assistants to answer from. The engine is **Diátaxis** (four documentation modes) applied through **Ignite UI's house templates**. +**This file is a routing hub only: no section blueprints, no field rules, no check lists live +here.** The templates and the API surface both change; never author or judge from memory — read the +reference files the task needs, then act. + ## Two modes of operation - **Create** — draft a new topic (component, concept/guide, or category/index) to the standard. @@ -27,18 +38,6 @@ documentation modes) applied through **Ignite UI's house templates**. Detect which from the request ("write/draft/create" → Create; "review/audit/check/fix/standardize" → Audit). If a topic file or content is supplied, default to Audit unless they ask for a rewrite. -## Reference files — load what the task needs - -- `references/diataxis-cheatsheet.md` — the four modes + the compass. Load when classifying a topic - or diagnosing mode-bleed. -- `references/house-style.md` — sections, order, naming, frontmatter, sample/token mechanics, both - doc sets. Load for **every** create or audit. -- `references/audit-rubric.md` — the checkable rules + report format. Load for **every** audit. - -Read `house-style.md` before writing or judging any topic — it carries the mechanical details -(frontmatter fields, ``/`` syntax, Angular-vs-xplat differences) that aren't -in this file. - ## Step 0 — Classify with the compass (always first) Before writing or auditing, decide what *kind* of documentation the page is, using the compass from @@ -47,117 +46,54 @@ the cheat-sheet: > **action or cognition?** × **acquisition (study) or application (work)?** > → tutorial · how-to · reference · explanation -- A **component page** is a *composite* (see below). -- A **concept / guide overview** is **explanation**. -- A **category / index overview** is **reference/navigation** (a map). -- A standalone **"How to …" article** is a **how-to guide** — keep it single-mode. - -If a request is ambiguous ("document X"), state which topic type you're producing and why, in one -line, before proceeding. +A **component page** is a *composite* (below). A **concept / guide overview** is **explanation**. +A **category / index overview** is **reference/navigation** (a map). A standalone **"How to …" +article** is a **how-to guide** — keep it single-mode. If a request is ambiguous ("document X"), +state which topic type you're producing and why, in one line, before proceeding. ## The composite-topic principle (the heart of this skill) -Pure Diátaxis says keep the four modes in **separate** documents. Ignite UI **component topics -deliberately don't** — one page carries a live demo, a how-to (Getting Started/Usage), -decision guidance in Usage's final Do/Don't subsection, and reference tables -(Properties/Methods/Events). That is fine **because each *section* owns exactly one mode.** The rule -that makes it work: +Pure Diátaxis keeps the four modes in separate documents. Ignite UI component topics deliberately +carry all four on one page — a live demo, how-to sections, decision guidance, reference tables. +That works **because each *section* owns exactly one mode**: > **One section, one mode. No mode-bleed.** Each section stays in its assigned Diátaxis mode; when a > second mode wants in, move it to the section that owns it and cross-link. -Section → mode map (full contents in `house-style.md`): - -| Section | Mode | Stays out of | -|---|---|---| -| Live Demo | demonstration (action) | prose/explanation | -| Anatomy: visual + DOM tree / skeleton | orientation (reference) | opinion, install steps | -| Getting Started, Usage | **how-to** | *why* explanations, exhaustive option lists | -| Getting Started → Prerequisites and Version Compatibility | reference / how-to | unverified support claims, migration history | -| Usage → Do/Don't | **explanation** | install steps, code, API detail | -| Properties / Methods / Events | **reference** | instructions, opinion | -| Styling (`### Sass Theming`, `### Tailwind`, …) | how-to (steps) + reference (tables) | conceptual essays | -| Accessibility | reference (keyboard/ARIA/compliance tables) | tutorials, marketing, unverified conformance claims | -| Troubleshooting | how-to (cause → fix) | background theory | -| Known Limitations | **reference** | troubleshooting fixes, tutorials, unverified claims | -| API References / Dependencies / Additional Resources / Related Components / FAQ | reference / navigation | new teaching | - -Concrete mode-bleed to catch: a *why* paragraph inside **Usage** (→ move to Do/Don't or a concept -topic, link back); "how to build X" prose inside **Properties** (→ move to Usage; keep the table -descriptive); an exhaustive option list written out in **Usage** prose (→ move to the table). The -cheat-sheet's "two classic confusions" section explains the reasoning. - -## Create workflow - -1. **Classify** (Step 0). Name the topic type. -2. **Pick the doc set & framework.** Angular set = its own file, plain prose. xplat set = one file - for React/WC/Blazor using `{Platform}`/`{ProductName}` tokens and ``. Load - the relevant details from `house-style.md`. -3. **Follow the verification workflow** in `house-style.md` before writing technical content. - Existing snippets and old prose are clues, not authority. For component topics, also inspect the - matching Indigo.Design component documentation under - `https://www.infragistics.com/products/indigo-design/help/components/` and use its component - structure as input for Usage subsection suggestions. -4. **Write frontmatter first** — `title`, `description` (answer-shaped, ≤~160 chars), `keywords`, - `license`, `llms.description`, `mentionedTypes` (xplat), and `relatedComponents` if the component - has close siblings (this lets **Usage**'s final **Do/Don't** subsection name the specific - sibling instead of speaking generically). -5. **Lay out the canonical sections** in order for that topic type, required ones always present. - Feature-specific content goes as sub-headings under **Usage**, never as new top-level sections. -6. **Fill each section in its mode.** Lead every section with one plain, specific sentence. Put - reference in tables. In **Usage**, add property-focused sub-sections so every public input is - shown with a minimal snippet; group only tightly coupled properties that form one behavior. Keep - existing useful subsections, then compare against Indigo.Design's component sections by meaning, - not by exact heading name, to suggest or add any missing runtime-relevant Usage subsections. - End **Usage** with `### Do/Don't`, using inline **When to use:** - and **When not to use:** labels rather than nested headings, plus the matching guidance image - from the Indigo.Design documentation or a `{/* TODO */}` marker when the asset is not available. - Add a required `## Live Demo` section - with exactly one top ``, then Usage samples only for distinct tasks (soft max 5/page). - Phrase Do/Don't and Troubleshooting as the reader's real questions. Include the required - `### Prerequisites and Version Compatibility` subsection under **Getting Started**, and the - required **Known Limitations**, **Related Components**, and **FAQ** sections in their canonical - positions. - For FAQ content, import and use the shared Astro `Faq` and `FaqItem` components. In slot mode, - set `indicatorPosition="end"` on every `FaqItem`, because the value on `Faq` does not flow into - slotted children. When auditing, flag plain FAQ headings or custom accordion markup and convert - each question/answer pair to an `FaqItem` while keeping the answer concise and component-specific. -7. **Self-check against the rubric** before presenting — especially mode-bleed (C-checks) and - metadata (D-checks). Fix, then deliver the `.mdx`. - -## Audit workflow - -1. **Classify** the topic and identify its doc set (Angular vs xplat) and type. -2. **Follow the verification workflow** in `house-style.md` before judging technical content. - Old snippets/prose are never the source of truth by themselves. For component topics, inspect the - matching Indigo.Design component documentation and compare its structure to the topic's Usage - subsections by semantic content, not heading text, before making Usage-coverage suggestions. -3. **Run every check** in `references/audit-rubric.md` — structure/order (A), naming (B), Diátaxis - mode integrity (C), metadata/AI-readiness and correctness (D), samples/links (E), formatting and - snippet currency (F). For mode integrity, run the compass on each section and flag drift. - For detailed frontmatter-only audits or normalization, use the companion - `igniteui-topic-frontmatter` skill; for full topic audits, apply only the basic metadata checks - here unless the user asks for frontmatter suggestions. -4. **Report** in the rubric's exact format: Verdict → Summary → Findings (each with Where / Issue / - Principle / Fix) → Quick wins. Order findings Error → Warning → Suggestion. -5. Keep every **Fix** concrete and applyable (the corrected heading, the sentence to move, the table - to add). If the topic is already clean, say so and note what it does well — don't invent problems. - -## Grounding notes - -- The live `vnext` repo is **pre-standardization**: expect drifted headings (`## Angular Rating - Example`, `## Configuration`) and a missing `relatedComponents` field. Author to the **target** - standard; audit against it while recognizing current reality. +The section → mode map is the "Diátaxis mode" column of the canonical section table in +`references/house-style.md`. Concrete mode-bleed to catch: a *why* paragraph inside **Usage** +(→ move to Do/Don't or a concept topic, link back); "how to build X" prose inside **Properties** +(→ move to Usage; keep the table descriptive); an exhaustive option list written out in **Usage** +prose (→ move to the table). The cheat-sheet's "two classic confusions" section explains the +reasoning. + +## Task → Reference file + +| Task | Reference file to read | +|---|---| +| Classifying a topic or a section; diagnosing mode-bleed | [`references/diataxis-cheatsheet.md`](./references/diataxis-cheatsheet.md) | +| **Every create or audit:** section order and blueprints (component, concept, category), frontmatter contract, naming reconciliation, entity terminology, sample/token/`` mechanics, verification workflow, voice, formatting | [`references/house-style.md`](./references/house-style.md) | +| **Every create:** the step-by-step authoring workflow (scaffold → sections → self-check), including the category/index structure | [`references/create-workflow.md`](./references/create-workflow.md) | +| **Every audit:** the audit workflow, all checkable rules (A–F), and the report format | [`references/audit-rubric.md`](./references/audit-rubric.md) | +| Detailed frontmatter-only audits or normalization | the companion [`igniteui-topic-frontmatter`](../igniteui-topic-frontmatter/SKILL.md) skill; for full topic audits, apply only the rubric's basic metadata checks unless the user asks for frontmatter suggestions | + +> **When in doubt, read more rather than fewer reference files.** The cost of an unnecessary read is +> negligible; the cost of a hallucinated API name or a drifted section heading is a broken page that +> poisons AI answers. + +## Grounding boundaries (apply in both modes) + - **Invent no verifiable identifier (zero-risk rule).** Never emit a guessed tag, class, package, - property, method, event, CSS part, or theming variable — a plausible-but-wrong name a reader copies is - worse than a visible gap. Use an identifier only when verified (typed API source, an existing topic, - or the user); otherwise write `‹VERIFY: …›`. For Properties/Methods/Events, emit the fixed column - headers plus a build-injection note and leave the rows to the generator. React/Blazor wrapper symbols - resolve to the `igc` core — prefer verified `igc` usage and mark unconfirmed wrapper names `‹VERIFY:…›`. - (Full detail in `house-style.md` → "Never fabricate API identifiers".) -- Prefer paraphrase and the standard section names over copying any existing topic's prose verbatim. -- **Write in one voice and verify every claim** (see house-style → *Voice & tone* and *Verify every - claim against the component*): instruct in the imperative/second person, and check every factual - statement — defaults, behavior, version support, DOM — against the MCP/API-doc source, the official - platform API docs, typed source when needed, or official framework docs before writing it or - recommending it as an edit. Don't "correct" prose into a plausible claim you haven't verified. + property, method, event, CSS part, theming variable, or ``/`` target — a + plausible-but-wrong name a reader copies is worse than a visible gap. Verified sources only; + otherwise write `‹VERIFY: …›`. Full detail: house-style → "Never fabricate API identifiers". +- **Verify every claim against the component** (defaults, behavior, version support, DOM) through + the verification workflow in house-style — MCP source first, then official platform API docs, + typed source, official framework docs. Existing topic prose and snippets are evidence to check, + never a source of truth. Don't "correct" prose into a plausible claim you haven't verified. +- **One voice:** imperative, second person, present tense; no marketing in instructional prose + (house-style → "Voice & tone"). +- The live `vnext` repo is **pre-standardization**: expect drifted headings and missing + `relatedComponents`. Author to the target standard; audit against it while recognizing current + reality. Prefer paraphrase and the standard section names over copying any existing topic's prose + verbatim. diff --git a/.ai/skills/igniteui-doc-topics/references/audit-rubric.md b/.ai/skills/igniteui-doc-topics/references/audit-rubric.md index 3e13348c57..2a1c986d11 100644 --- a/.ai/skills/igniteui-doc-topics/references/audit-rubric.md +++ b/.ai/skills/igniteui-doc-topics/references/audit-rubric.md @@ -1,8 +1,29 @@ # Audit rubric -The checkable rules for **audit mode**, and the report format to produce. Every finding maps to a -concrete rule below (structure, naming, Diátaxis mode, or metadata) and to a fix. Detail lives in -`house-style.md`; the *why* behind mode findings lives in `diataxis-cheatsheet.md`. +Version: v3 · 2026-08-14 · igniteui doc-skill set. Before editing, confirm this version line against +`.ai/skills/CHANGELOG.md`. + +The audit workflow, the checkable rules for **audit mode**, and the report format to produce. Every +finding maps to a concrete rule below (structure, naming, Diátaxis mode, or metadata) and to a fix. +Detail lives in `house-style.md`; the *why* behind mode findings lives in `diataxis-cheatsheet.md`. + +## Audit workflow + +1. **Classify** the topic (SKILL.md Step 0) and identify its doc set (Angular vs xplat) and type. +2. **Follow the verification workflow** in `house-style.md` before judging technical content. + Old snippets/prose are never the source of truth by themselves. For component topics, inspect the + matching Indigo.Design component documentation and compare its structure to the topic's Usage + subsections by semantic content, not heading text, before making Usage-coverage suggestions. +3. **Run every check** below — structure/order (A), naming (B), Diátaxis mode integrity (C), + metadata/AI-readiness and correctness (D), samples/links (E), formatting and snippet currency (F). + For mode integrity, run the compass on each section and flag drift. For detailed frontmatter-only + audits or normalization, use the companion `igniteui-topic-frontmatter` skill; for full topic + audits, apply only the basic metadata checks here unless the user asks for frontmatter + suggestions. +4. **Report** in the exact format at the end of this file: Verdict → Summary → Findings (each with + Where / Issue / Principle / Fix) → Quick wins. Order findings Error → Warning → Suggestion. +5. Keep every **Fix** concrete and applyable (the corrected heading, the sentence to move, the table + to add). If the topic is already clean, say so and note what it does well — don't invent problems. ## Severity @@ -12,10 +33,24 @@ concrete rule below (structure, naming, Diátaxis mode, or metadata) and to a fi ## Checks +### Category/index exception +Classify the topic before applying the checks below. A category/index page is evaluated against the +category blueprint in `house-style.md`, not the component-topic checklist. Do not report missing +component sections such as `Live Demo`, `Getting Started`, or `Usage` +when the page follows a concise introductory block (a definition plus brief scope or purpose context, +when needed) and `Key Features` (with a short intro and a `Feature` / `Description` / +`Benefits` table) → top-level `Types/Members` section with each concrete type as its own +navigable `###` child subsection and a verified sample → `Next Steps` → `Accessibility` → +`API References` → `Additional Resources` → `FAQ`. Report component-topic sections such as `Live Demo`, +`Getting Started`, or `Properties` in the category introduction as information-architecture drift +instead. Do not require optional supporting sections when the category has no verified category-wide +content for them. + ### A. Structure & order - A1 (Error) A required section or subsection is missing (`## Live Demo`, Anatomy, Getting Started with `### Prerequisites and Version Compatibility`, Usage, Properties, Accessibility, - Known Limitations, API References, Dependencies, Additional Resources, Related Components, and + Known Limitations (as a top-level section or a `### Known Limitations` subsection under + `Troubleshooting`), API References, Dependencies, Additional Resources, Related Components, and FAQ on a component topic. **Troubleshooting** is conditional and is required only when the topic contains version-migration, deprecation, or legacy-setup notes.) - A2 (Warning) Sections are present but out of the canonical order. @@ -32,7 +67,8 @@ concrete rule below (structure, naming, Diátaxis mode, or metadata) and to a fi **When to use:** / **When not to use:** are written as nested headings instead of inline labels inside that subsection. - A8 (Warning) **Anatomy** is incomplete: missing its opening screenshot/GIF (or a `{/* TODO */}` - marker for a not-yet-available asset), or missing the verified DOM tree / skeleton. + marker for a not-yet-available asset), missing the shared Astro `` component, or missing + the verified DOM tree / skeleton. - A9 (Warning) **Accessibility** is missing one of its three required `###` sub-sections — **Keyboard Interaction**, **Screen Readers / ARIA**, **Accessibility Compliance** — or has them out of order. @@ -40,10 +76,13 @@ concrete rule below (structure, naming, Diátaxis mode, or metadata) and to a fi reference/how-to content that belongs in Getting Started, another Usage subsection, Properties, or Accessibility instead of do/don't guidance. - A11 (Warning) **FAQ** uses plain question headings or hand-written accordion markup instead of - the shared Astro `` / `` components, or does not keep each answer concise and - component-specific. + the shared Astro `` / `` components, does not keep each answer concise and + component-specific, or an answer is not 2–4 self-contained sentences quotable without its question + (dangling "it"/"this", no subject noun). - A12 (Warning) A slot-mode FAQ does not set `indicatorPosition="end"` on every ``; setting it only on `` does not affect slotted children. +- A13 (Warning) A component topic uses a hand-written anatomy image block instead of the shared + Astro `` component, or uses a hand-written sample iframe instead of ``. ### B. Naming - B1 (Warning) A heading uses a drifted name with a standard equivalent (see reconciliation table). @@ -52,7 +91,17 @@ concrete rule below (structure, naming, Diátaxis mode, or metadata) and to a fi - B3 (Suggestion) Singular/plural or casing mismatch (`API Reference` → `API References`). - B4 (Warning) H1 carries a framework prefix or an "Overview" suffix → standard H1 is `‹Component› Component` (e.g. `# Angular Avatar Component Overview` → `# Avatar Component`). + Pending `‹VERIFY: layout H1/framework adjacency, both doc sets›`: if the layout renders the + framework/product adjacent to the H1 (template heading, breadcrumb, or HTML title), B4 stands as + written; if it does not, B4 reverses for the Angular set and the H1 carries the framework (the + head query is "angular ‹component› component"). Until answered, report B4 findings with this + dependency noted. - B5 (Warning) A **Usage** sub-heading repeats the component name (`### Avatar Shape` → `### Shape`). +- B6 (Warning) Body prose or a heading drifts from canonical entity naming (see house-style → + Entity terminology): "datagrid" as one word outside quoted API symbols, "grid component" as + subject noun, silent "table"/"data table" drift, product-name abbreviation drift ("IgniteUI", + "AppBuilder"), bare "grid" as a standalone entity name, or a sibling compound not fully qualified + (Tree Grid, Hierarchical Grid, Pivot Grid). ### C. Diátaxis mode integrity (mode-bleed) Run the compass on each section; flag content that has drifted out of the section's assigned mode. @@ -83,8 +132,12 @@ Run the compass on each section; flag content that has drifted out of the sectio - D1 (Warning) `relatedComponents` is set but **Usage**'s **Do/Don't** guidance doesn't name the specific sibling(s) by name and link them — or vice-versa, it names a sibling that isn't listed in `relatedComponents`. -- D2 (Warning) Missing/weak `description` or `llms.description` (not answer-shaped, or >~160 chars). -- D3 (Warning) Section opens with no plain lead sentence, or with empty boilerplate. +- D2 (Warning) Missing/weak `description` or `llms.description` (not answer-shaped, not + definition-first, page-referential ("This topic shows…"), or >~160 chars). The full field contract + lives in house-style → "File format & frontmatter"; for a field-by-field audit, hand off to the + companion `igniteui-topic-frontmatter` skill. +- D3 (Warning) Section opens with no plain lead sentence naming the component (or platform token), + or with empty boilerplate. - D4 (Warning) A section relies on "as mentioned above" / isn't self-contained. - D5 (Warning) Properties/Methods/Events appear hand-written rather than from the typed source. - D6 (Suggestion) Styling variables undocumented where the component is themeable. @@ -103,11 +156,8 @@ Run the compass on each section; flag content that has drifted out of the sectio `https://www.infragistics.com/api/blazor`). Use typed source for implementation details not exposed by API docs, and official framework docs for framework/version behavior; if unverifiable, don't assert it. Existing topic snippets/prose are not sufficient proof. -- D10 (Error) A component topic is missing the required `last_updated` metadata, or is missing the - corresponding visible `**Last updated:** Month D, YYYY` line immediately after the lead paragraph, - uses a different placement or format, or duplicates the date elsewhere in the body. The visible - value must be generated from or match the `last_updated` metadata and must not be manually hard-coded - independently in the body. +- D10 (Error) A topic is missing the required `last_updated` metadata. The date must be stored in + frontmatter and rendered by the site layout; do not duplicate it as MDX/Markdown content. - D11 (Warning) **Voice/tone drift** — prose isn't imperative/second-person present tense, mixes first-person-plural narration ("we create") with how-to, or carries filler ("simply", "just") or marketing inside instructional prose. @@ -116,6 +166,10 @@ Run the compass on each section; flag content that has drifted out of the sectio source, a conformance-table row not traceable to behavior verified on the page or in source, an "N/A" filler row for an irrelevant criterion, or an invented testing/AT matrix or VPAT link. Fix: criterion-level rows tied to observable behavior, or `‹VERIFY:…›`. +- D13 (Warning) **Quotability** — run the quotability test on the H1 lead sentence, each section + lead, each FAQ answer, and `llms.description`: if an assistant answered the page's target query + (or the section's sub-query) today, is this the sentence it would quote? A surface where no + sentence passes is a finding; page-referential phrasing ("This topic shows how to…") never passes. ### E. Samples & links - E1 (Warning) `` missing an `alt`. @@ -129,6 +183,9 @@ Run the compass on each section; flag content that has drifted out of the sectio class (e.g. `ButtonBase`): the link renders (e.g. `IgrButtonBase`) but points nowhere. Verify the `type` appears as an `` target elsewhere in the doc set; link base-class members through the concrete component (`type="Button" member="href"`) instead. +- E7 (Warning) A prose link uses non-descriptive anchor text ("here", "click here", "this link", a + bare URL) instead of descriptive, entity-bearing anchor text ("Ignite UI Angular Data Grid + documentation"). `` covers API links; this check covers body links. ### F. Formatting & altitude - F1 (Suggestion) A `ul`/`ol` with a single item that should be a paragraph. diff --git a/.ai/skills/igniteui-doc-topics/references/create-workflow.md b/.ai/skills/igniteui-doc-topics/references/create-workflow.md new file mode 100644 index 0000000000..4d2b677c27 --- /dev/null +++ b/.ai/skills/igniteui-doc-topics/references/create-workflow.md @@ -0,0 +1,98 @@ +# Create workflow + +Version: v3 · 2026-08-14 · igniteui doc-skill set. Content carried from SKILL.md v2 unchanged; +restructured into this reference so the workflow can evolve without touching the router. Blueprints, +mechanics, and the frontmatter contract live in `house-style.md`; run the rubric self-check from +`audit-rubric.md` before delivering. + +## Steps + +1. **Classify** (Step 0 in SKILL.md). Name the topic type. +2. **Pick the doc set & framework.** Angular set = its own file, plain prose. xplat set = one file + for React/WC/Blazor using `{Platform}`/`{ProductName}` tokens and ``. Load + the relevant details from `house-style.md`. +3. **Follow the verification workflow** in `house-style.md` before writing technical content. + Existing snippets and old prose are clues, not authority. For component topics, also inspect the + matching Indigo.Design component documentation under + `https://www.infragistics.com/products/indigo-design/help/components/` and use its component + structure as input for Usage subsection suggestions. +4. **Scaffold frontmatter** — the metadata contract lives in `house-style.md` → "File format & + frontmatter"; this step orders the work, it does not restate the rules. Apply the contract to + every topic type, including category/index topics. + - **Before the body (fixed by convention):** `title` (xplat component topics use the + `{ComponentTitle}` token; xplat category/index topics use a concise, framework-neutral category + name without `{Platform}` or `{ProductName}` tokens, for example `title: "Grids and Tables"`; + Angular topics follow the title rule in the frontmatter skill), `license`, `last_updated` + (maintained by the topic workflow; the site layout renders it), and `tableOfContents` when used. + - **After the body is finished — generated from it, never from imagination:** `description`, + `llms.description`, `keywords`, `mentionedTypes` (xplat), and `relatedComponents` (component + topics with close siblings only). Then run the companion `igniteui-topic-frontmatter` skill's + cross-field consistency and body-support checks before delivery. +5. **Lay out the canonical sections** in order for that topic type, required ones always present. + Feature-specific content goes as sub-headings under **Usage**, never as new top-level sections. +6. **Fill each section in its mode**, in five passes: + - **6a — Leads and modes.** Lead every section with one plain, specific sentence that names the + component (and platform token where the set uses them). Keep each section in its assigned mode; + put reference content in tables. Phrase Do/Don't and Troubleshooting as the reader's real + questions. + - **6b — Usage coverage.** Add property-focused sub-sections so every public input is shown with + a minimal snippet; group only tightly coupled properties that form one behavior. Keep existing + useful subsections, then compare against Indigo.Design's component sections by meaning, not by + exact heading name, to suggest or add any missing runtime-relevant Usage subsections. + - **6c — Do/Don't.** End **Usage** with `### Do/Don't`, using inline **When to use:** + and **When not to use:** labels rather than nested headings, plus the matching guidance image + from the Indigo.Design documentation or a `{/* TODO */}` marker when the asset is not available. + - **6d — Required components.** Add a required `## Live Demo` section with exactly one top + ``, then Usage samples only for distinct tasks (soft max 5/page). For samples, use the + shared Astro `Sample` component and verify its `src`, display props, and descriptive `alt`. For + Anatomy, import and use the shared Astro `Anatomy` component with a verified anatomy image, + name, description, and alt text; keep the verified DOM tree or skeleton below it. For FAQ + content, import and use the shared Astro `Faq` and `FaqItem` components. In slot mode, set + `indicatorPosition="end"` on every `FaqItem`, because the value on `Faq` does not flow into + slotted children. When auditing, flag plain FAQ headings or custom accordion markup and convert + each question/answer pair to an `FaqItem` while keeping the answer concise and + component-specific. + - **6e — Required sections check.** Include the required `### Prerequisites and Version + Compatibility` subsection under **Getting Started**, and the required **Known Limitations**, + **Related Components**, and **FAQ** sections in their canonical positions. A verified + `### Known Limitations` subsection may live inside `## Troubleshooting` when the limitations + are directly related to the troubleshooting guidance; do not duplicate it as a separate + top-level section. +7. **Self-check against the rubric** (`audit-rubric.md`) before presenting — especially mode-bleed + (C-checks) and metadata (D-checks). Fix, then deliver the `.mdx`. + +## Category/index topics use a separate structure + +Do not apply the component-topic blueprint to a category or index page. A category overview is a +reference/navigation map, not a composite component page. Its structure is: + +Apply the common metadata contract to category/index topics as well. Their frontmatter must include +`title`, `description`, `keywords`, `license`, `last_updated`, `llms.description`, and +`mentionedTypes` when the xplat category references generated API types. The category `title` is +the plain category name only, without `{Platform}` or `{ProductName}` tokens; for example, +`title: "Grids and Tables"`. Keep platform and product tokens in the description, keywords, visible +heading, and prose where they are needed. Do not render `last_updated` as visible MDX text. + +1. `#` title followed by a concise introductory block: a clear category definition and, when needed, + brief context about its scope or purpose. +2. `## Key Features` immediately after the title and introductory block. Open with a short sentence, then present + the category's capabilities in a compact table with `Feature`, `Description`, and `Benefits` + columns when the content is naturally scannable. Use `## Types` or `## Members` as a top-level + navigation section when the category maps component types. Make `Types` the parent navigation + section and make each + concrete type, such as `{Platform} Data Grid`, `{Platform} List`, or `{Platform} Tree Grid`, a + separate navigable `###` subsection beneath it. Include a verified `` for every type + entry, together with a concise definition and verified link. Additional + feature groups can follow as subsections inside `Key Features`. +3. `## Next Steps`. +4. `## Accessibility`, with the same three verified subsections used by component topics. +5. `## API References`. +6. `## Additional Resources`. +7. `## FAQ`, using the shared Astro `Faq` and `FaqItem` components. + +Do not add component-only `When to Use`, `When Not to Use`, `Live Demo`, `Getting +Started`, `Usage`, `Properties`, `Accessibility`, or `Troubleshooting` sections +to the category introduction. Put selection guidance in the category definition or the relevant +type/member entry, and put each demo inside the entry it demonstrates. Supporting content such as +browser support, support options, licensing, and FAQ belongs after the navigation sections as +subsections of the page's main structure, not as additional top-level category sections. diff --git a/.ai/skills/igniteui-doc-topics/references/diataxis-cheatsheet.md b/.ai/skills/igniteui-doc-topics/references/diataxis-cheatsheet.md index 2ef9bceeac..17c8f3622e 100644 --- a/.ai/skills/igniteui-doc-topics/references/diataxis-cheatsheet.md +++ b/.ai/skills/igniteui-doc-topics/references/diataxis-cheatsheet.md @@ -1,5 +1,8 @@ # Diátaxis cheat-sheet +Version: v3 · 2026-08-14 · igniteui doc-skill set (content unchanged; version line added for the +set-wide match check). Before editing, confirm this version line against `.ai/skills/CHANGELOG.md`. + Condensed from https://diataxis.fr (tutorials, how-to, reference, explanation, compass). This is the *reasoning layer*. For how the four modes attach to Ignite UI sections, see `house-style.md`. Read this whenever you're unsure what kind of content a topic — or a single diff --git a/.ai/skills/igniteui-doc-topics/references/house-style.md b/.ai/skills/igniteui-doc-topics/references/house-style.md index 1a24d2c308..baaee48eaf 100644 --- a/.ai/skills/igniteui-doc-topics/references/house-style.md +++ b/.ai/skills/igniteui-doc-topics/references/house-style.md @@ -1,7 +1,30 @@ # Ignite UI house style +Version: v3 · 2026-08-14 · igniteui doc-skill set (content unchanged from v2; set-wide version +bump). Before editing, confirm this version line against `.ai/skills/CHANGELOG.md`. The "File format & frontmatter" section below is the **single normative +field contract** for the doc-skill set; the two SKILL.md files reference it rather than restating it. + The Ignite UI documentation conventions an authored or audited topic must follow. Pair this with -`diataxis-cheatsheet.md` (the *why*) and the section→mode map in `SKILL.md`. +`diataxis-cheatsheet.md` (the *why*); the section→mode map is the "Diátaxis mode" column of the +canonical section table below. + +## Contents + +- [Two doc sets](#two-doc-sets) +- [File format & frontmatter](#file-format--frontmatter) — the normative field contract +- [Per-framework mechanics](#per-framework-mechanics) +- [Never fabricate API identifiers (zero-risk rule)](#never-fabricate-api-identifiers-zero-risk-rule) +- [Verification workflow](#verification-workflow) +- [Component topic — canonical section order](#component-topic--canonical-section-order) — incl. FAQ + component, reference-table contract, Usage coverage, Indigo.Design suggestions, Live Demo contract, + `` configuration, Accessibility sub-structure +- [Overview topics](#overview-topics) — concept/guide and category/index blueprints +- [Naming reconciliation (drift → standard)](#naming-reconciliation-drift--standard) +- [Entity terminology (canonical names)](#entity-terminology-canonical-names) +- [Write-for-both-audiences rules](#write-for-both-audiences-rules-people--ai-assistants) +- [Formatting & altitude](#formatting--altitude) +- [Voice & tone](#voice--tone) +- [Verify every claim against the component](#verify-every-claim-against-the-component) > **Current vs target state.** The live `vnext` repo is *pre-standardization* — many topics use > drifted headings (e.g. `## Angular Rating Example`, `## Configuration`). This file describes the @@ -22,34 +45,58 @@ covers modules to import (Angular) or supporting components/themes required to r ## File format & frontmatter +**This section is the single normative field contract for the doc-skill set.** The companion +`igniteui-topic-frontmatter` skill audits against it and carries the audit procedure and severities; +`igniteui-doc-topics` Create step 4 orders the work. Where wording differs anywhere, this section +wins. + Topics are **Astro `.mdx`**. Frontmatter is YAML. Observed + target fields: ```yaml --- title: "{ComponentTitle}" # xplat component title; the layout appends the resolved product name -description: "…" # <=~160 chars, shaped as an answer ("X is a … that …") -keywords: "…" # comma-separated +description: "…" # <=~160 chars, definition-first ("X is a … that …"); complete sentences, never ellipsis-truncated +keywords: "…" # comma-separated; legacy/internal — every keyword appears in the body license: MIT mentionedTypes: ["Rating"] # xplat: API types referenced on the page llms: - description: "…" # AI-facing one-liner; the exact text an assistant uses to summarize + description: "…" # AI-facing one-liner; defines the component, not the page — the exact text an assistant quotes +last_updated: "YYYY-MM-DD" # required for every topic; rendered by the site layout relatedComponents: [Toast, Banner] # TARGET field — drives the Usage Do/Don't trigger (see below) --- ``` - **`llms.description`** already exists in both sets and is high-value — write it as a crisp, - self-contained answer sentence. It is *not* optional filler. + self-contained answer sentence that **defines the component (or concept), never the page**: subject + noun names the product and component, no pronouns, no "This topic shows…". It is *not* optional + filler. The `llms.description`, the H1 lead sentence, and the site's llms-manifest entry should be + the same sentence or trivial variants of it: one definition, emitted everywhere the machine looks. +- **`description`** is definition-first ("The is a … that …"), not imperative task + phrasing ("Use X to …"); complete declarative sentences, written to fit <=~160 characters, never + truncated with an ellipsis. +- **Cross-field consistency:** `title`, `description`, `llms.description`, `keywords`, the H1, and + the lead sentence tell one story with the same entity names and the same capability list; the lead + sentence mirrors `llms.description`. +- **Body support:** every capability named in `description`, `llms.description`, or `keywords` is + supported by the finished body. Content-bearing fields are generated from the finished body, never + from imagination (see `create-workflow.md`, step 4). - **`title`** uses `"{ComponentTitle}"` for xplat topics because the layout appends the resolved product name to the HTML title. Do not add a framework-specific suffix or duplicate the framework in - the component phrase. + the component phrase. Angular-set titles follow the frontmatter skill's title rule + (`"Angular Component"`, query-relevant terms within ~60 characters). - **`relatedComponents`** is the revision-2 trigger and is **not yet in the repo**. When authoring to target, set it. When auditing, treat a missing-but-warranted value as a finding, and a set value with no **Usage** → **Do/Don't** guidance as a hard error. +- **`last_updated`** is required for every topic, including category/index topics. Store the date in + frontmatter and let the site layout render it. For xplat component topics, use the tokenized component title convention. For xplat + category/index topics, use the plain category name only, without `{Platform}` or `{ProductName}` + in `title` (for example, `title: "Grids and Tables"`). ### MDX imports (declare what you use) ```mdx import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; import { Image } from 'astro:assets'; // when embedding repo-owned images import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; @@ -140,9 +187,9 @@ under **Usage**, never a new top-level section. | # | Section (`##`) | Required? | Diátaxis mode | Contents | |---|---|---|---|---| -| 1 | *Title + one-line definition* (`#` + lead ¶) | required | orient / reference | H1 is **`‹Component› Component`** — **no** framework prefix, **no** "Overview" suffix (the framework lives in the SEO `title`). Follow with one plain sentence: what it is, what problem it solves. Mirror `llms.description`. Every topic must render the visible `**Last updated:** Month D, YYYY` line immediately after the lead paragraph; do not place it in the H1 or duplicate it elsewhere in the body. | +| 1 | *Title + one-line definition* (`#` + lead ¶) | required | orient / reference | H1 is **`‹Component› Component`** — **no** framework prefix, **no** "Overview" suffix (the framework lives in the SEO `title`). Follow with one plain sentence: what it is, what problem it solves. Mirror `llms.description`. Every topic, including category/index topics, must contain `last_updated` in frontmatter; the date is rendered by the site layout and must not be added as visible topic text. | | 2 | **Live Demo** | required | demonstration (action) | A `## Live Demo` section containing exactly one `` of the simplest useful state, before **Anatomy**. Keep this section sample-only unless a one-sentence setup is truly needed. | -| 3 | **Anatomy** | required for component topics | orientation (reference) | Opens with a screenshot/GIF of the component's parts or the behavior being shown, then the **DOM tree / skeleton** (rendered elements, parts, slots). If the visual asset doesn't exist yet, leave a `{/* TODO */}` marker rather than a broken image, but still include the section and verified skeleton. | +| 3 | **Anatomy** | required for component topics | orientation (reference) | Use the shared Astro `` component with a verified anatomy image, `name`, `description`, and `alt`; follow it with the verified **DOM tree / skeleton** (rendered elements, parts, slots). If the visual asset doesn't exist yet, leave a `{/* TODO */}` marker rather than a broken image, but still include the section and verified skeleton. | | 4 | **Getting Started** | required | how-to | **Lead with the component-specific import/registration** and include the required `### Prerequisites and Version Compatibility` subsection for verified package, framework, and version guidance. Compress the generic library install to a **single prerequisite line linking the general getting-started topic**; **don't** repeat identical install boilerplate. Show the **current** registration first; put legacy setup after, marked as legacy. | | 5 | **Usage** | required | how-to + explanation | Add property-focused sub-sections that showcase every public input with a minimal snippet and, when a verified demo exists and adds visual value, a ``. Give standalone properties their own sub-section (`Shape`, not `Avatar Shape`); group only tightly coupled properties that form one behavior (for example, content-source priority such as `src`, `alt`, `initials`, and default slot content). The final Usage subsection must be `### Do/Don't`; it uses inline **When to use:** and **When not to use:** labels, not nested headings, and includes the matching guidance image from the Indigo.Design documentation or a `{/* TODO */}` marker when the asset is not available. Styling content belongs in **Styling**, not here. | | 6 | **Properties** | required | reference | Table: name · type · default · description. (Replaces "Configuration".) | @@ -151,7 +198,7 @@ under **Usage**, never a new top-level section. | 9 | **Styling** | required when applicable | how-to + reference | **Open with a `` of the styled result** + one intro line, then the **Styling Variables table** (**one table** — variable · what it changes; **no default-value column, no per-theme tabs**) and styleable-parts table. Subsections cover each approach — **first `### Sass Theming`** (the primary Sass theme workflow), then others (e.g. `### Tailwind`, `### Custom sizing`). All styling content lives here, not under Usage. | | 10 | **Accessibility** | required | reference | Three sub-sections, in order: **Keyboard Interaction** (key→action table), **Screen Readers / ARIA**, **Accessibility Compliance** (conformance evidence — see the sub-structure spec below). | | 11 | **Troubleshooting** | conditional (required when version-migration or legacy-setup notes exist) | how-to | Gotchas phrased as the reader's real question; answer as cause → fix. **Collect version-migration notes, deprecations, and legacy/alternative approaches here** — not buried in code-fence comments or scattered asides. | -| 12 | **Known Limitations** | required | reference | Verified platform-independent limitations and boundaries of the component. Do not use this section for troubleshooting fixes or unsupported claims. | +| 12 | **Known Limitations** | required | reference | Verified platform-independent limitations and boundaries of the component. Use a top-level section when standalone; when the limitations directly support troubleshooting guidance, place them as a `### Known Limitations` subsection inside `## Troubleshooting`. Do not use this content for troubleshooting fixes or unsupported claims. | | 13 | **API References** | required | reference | `` out to the full generated reference; don't duplicate it. | | 14 | **Dependencies** | required | reference | Themes, styles, or supporting components the component relies on to render or function — modules to import (Angular) or supporting components/themes (xplat). | | 15 | **Additional Resources** | required | navigation | Forums, GitHub, related topics. | @@ -168,6 +215,13 @@ headings or hand-written accordion markup. Import `Faq` and `FaqItem` from children. Prefer slot mode so answers can contain normal MDX, links, code blocks, and other components. Keep the FAQ questions component-specific and concise; do not move troubleshooting content into the FAQ merely to populate it. + +Each answer is **2–4 self-contained sentences, quotable without its question**: restate the subject +noun, no dangling "it"/"this". Draw questions from the predictable fan-out for the component: +licensing/pricing, framework and version support, migration, accessibility, and +"is ‹Component› right for ‹use case›". An FAQ whose answers cannot stand alone is markup without +retrieval value — FAQ answers are among the most-quoted chunks on the page. + **When Not to Use trigger:** every component topic ends **Usage** with `### Do/Don't`. This subsection must include the matching guidance image from the Indigo.Design documentation before the guidance text. Use a repo-owned image import with ``; if the visual asset does not exist yet, leave a @@ -293,8 +347,20 @@ Title + intro → **Overview** → **Before You Start** → **Next Steps** → * accordion for FAQ content when a compact question-and-answer block is useful. **5b. Category / index overview** (Diátaxis: *reference/navigation* — a map) — e.g. "Charts overview": -Title + intro → **Key Features** → **Types** (identical micro-structure per entry: one-line def + link + small -``) → **Next Steps** → **API References / Additional Resources**. +The page starts with an H1 and a concise introductory block: a clear category definition and, when +needed, brief context about its scope or purpose. Follow it with **Key Features** (open with a short intro and a compact `Feature` / `Description` / +`Benefits` table) → top-level **Types / Members** section when the category maps component +types. Each concrete type/member, such as `{Platform} Data Grid`, `{Platform} List`, or +`{Platform} Tree Grid`, is its own navigable `###` child subsection with a concise definition, +verified link, and a verified `` for every entry) → additional feature +subsections as needed → **Next Steps** → **Accessibility** → **API References** → **Additional Resources** → **FAQ**. + +The category introduction must not use the component-topic sequence `When to Use`, +`When Not to Use`, `Live Demo`, `Getting Started`, `Usage`, `Properties`, +`Accessibility`, or `Troubleshooting` in the category introduction. Selection guidance belongs in the +category definition or in the relevant type/member entry, and a demo belongs inside the entry it +demonstrates. Supporting sections follow the navigation sections and must contain verified, +category-specific content. Guardrails: cap each section at ~3 short paragraphs (else add sub-sections); isolate marketing copy in a single "Why {ProductName}" section — never thread it through instructional content. @@ -315,18 +381,40 @@ a single "Why {ProductName}" section — never thread it through instructional c | WAI-ARIA Support; Compliance; Section 508; Accessibility Statement | **`### Accessibility Compliance`** (under **Accessibility**) | | Best Practices; Do's and Don'ts; Guidelines; Recommendations | **Do/Don't** (as the final `###` under **Usage**) | | Theming (H2) | **Styling** (H2); the Sass approach becomes `### Sass Theming` under it | -| Known Limitations; Known Issues and Limitations; Limitations | **Troubleshooting** | +| Known Issues and Limitations; Limitations; Known Issues | **Known Limitations** (a required top-level section; it may live as `### Known Limitations` under **Troubleshooting** only when the limitations directly support that troubleshooting guidance — see section 12. Troubleshooting *fixes* found under a limitations heading move to **Troubleshooting**.) | | API; API Reference (singular) | **API References** | | Theming Dependencies | **Dependencies** | +## Entity terminology (canonical names) + +Source: blog-creator product-context v4 · 2026-08-14. This table is a governed copy: when the blog +set's terminology table changes, update this section in the same change and keep both version lines +aligned. Docs are the highest-authority entity signal the site emits — assistants consolidate +entities from repeated identical naming, and drift fragments the association. These names bind body +prose, headings, and frontmatter alike; the frontmatter skill audits the metadata side, rubric B6 +audits the body side. + +- Canonical component term: **"[Framework] Data Grid"** (title case): "Angular Data Grid", "React + Data Grid", "Web Components Data Grid", "Blazor Data Grid". Permitted shorthand after first + mention: "the Data Grid". In the xplat set, write it with the token: "{Platform} Data Grid". +- Sibling components are fixed compounds, always fully qualified: **Tree Grid, Hierarchical Grid, + Pivot Grid**. Bare "grid" only as a common noun inside feature phrases ("grid features", "bind the + grid to data"); never as the standalone entity name, never in titles or headings. +- Banned entity synonyms: "datagrid" (one word, except when quoting an API symbol), "grid component" + as subject noun, silent drift to "table"/"data table". Ecosystem synonyms stated once as an + explicit equivalence are fine ("row pinning (also known as frozen rows)"). +- Product names verbatim: "Ignite UI for Angular", "App Builder"; no abbreviation drift ("IgniteUI", + "AppBuilder") in prose. In the xplat set, prefer `{ProductName}` where the resolved product name is + meant. + ## Write-for-both-audiences rules (people + AI assistants) 1. **One job per section** — self-contained; no "as mentioned above." A section must make sense landed-on cold. -2. **Lead each section with one plain, specific sentence** before any table/code — skip empty boilerplate. +2. **Lead each section with one plain, specific sentence that names the component** (with the platform token where the set uses them) before any table/code — skip empty boilerplate. Sections are the retrieval chunks; a chunk that never names its subject is invisible to the query that should retrieve it. 3. **Use the standard section names everywhere** — "Accessibility" always means the same thing. 4. **Phrase guidance/troubleshooting as real questions** — When-Not-to-Use is the highest-value content for answer accuracy; name the sibling explicitly. 5. **Reference lives in tables**, generated from the typed source. -6. **Strong `description` / `llms.description`** — <~160 chars, answer-shaped. +6. **Strong `description` / `llms.description`** — <~160 chars, answer-shaped, definition-first; `llms.description` defines the component, not the page (full contract in "File format & frontmatter"). 7. **Document theming variables** — variable · what it changes, in **one table for all themes**. No default-value column: defaults are per-theme values that live in the generated API reference, not the topic. ## Formatting & altitude diff --git a/.ai/skills/igniteui-topic-frontmatter/SKILL.md b/.ai/skills/igniteui-topic-frontmatter/SKILL.md index 11ab3566a3..3b326e53d8 100644 --- a/.ai/skills/igniteui-topic-frontmatter/SKILL.md +++ b/.ai/skills/igniteui-topic-frontmatter/SKILL.md @@ -7,154 +7,57 @@ description: >- identity in Ignite UI Angular or xplat documentation topics. This skill is strictly frontmatter-only: audit first and provide suggestions for the user to choose from before changing anything; never edit topic body content, headings, prose, samples, code snippets, links, tables, or - section structure. + section structure. For anything touching body content, structure, headings, prose, or samples, use + the companion igniteui-doc-topics skill instead. --- # Ignite UI topic frontmatter -Audit Ignite UI documentation topic frontmatter so pages have modern, uniform metadata for SEO, -generated schema, and LLM-readable manifests without touching the topic body. - -## Scope - -Only inspect and discuss the YAML frontmatter block between the opening and closing `---`. +Version: v3 · 2026-08-14 · igniteui doc-skill set. All set files carry this version line; before +editing any file, confirm the lines match across the set. The `.claude` adapter's `description` must +byte-match this file's `description`. Change log: `.ai/skills/CHANGELOG.md` · human-readable intent: +`.ai/skills/README.md`. -Do not edit or rewrite: +Audit Ignite UI documentation topic frontmatter so pages have modern, uniform metadata for SEO, +generated schema, and LLM-readable manifests — without touching the topic body. -- H1/H2/H3 headings -- intro paragraphs or body prose -- samples, code snippets, API tables, or links outside frontmatter -- section order or topic structure +**This file is a routing hub only: no audit rules, no field shapes, and no report formats live +here.** The metadata contract is precise and versioned; never audit or normalize from memory — read +the reference files first, then act. -If a metadata issue depends on body content, cite the body content only as evidence and suggest a -frontmatter change. Leave the body unchanged. +## Scope and operating mode -## Operating mode +Only inspect and discuss the YAML frontmatter block between the opening and closing `---`. Never +edit or rewrite headings, body prose, samples, code snippets, API tables, links outside frontmatter, +or section order. If a metadata issue depends on body content, cite the body only as evidence and +suggest a frontmatter change. -This skill is **audit-first**. +This skill is **audit-first**: 1. Read the topic's frontmatter. -2. Audit it against the rules below. -3. Return categorized findings and concrete replacement suggestions. -4. Stop. Do not edit the file until the user explicitly selects what to change. - -When the user later asks to apply selected suggestions, edit only the frontmatter fields involved in -those selected suggestions. - -## Doc sets - -- Angular topics live under `docs/angular/src/content//components/`. -- xplat topics live under `docs/xplat/src/content//components/` and may use tokens such as - `{Platform}`, `{ProductName}`, `{ComponentTitle}`, and `{ComponentKeywords}`. - -Keep valid platform tokens in xplat frontmatter. Do not replace them with a single concrete -framework name unless the topic itself is framework-specific. - -For xplat component metadata, avoid repeating the framework identity in the same field. The xplat -site layout already appends the resolved product name to the HTML title, so use -`title: "{ComponentTitle}"` and do not add `| {ProductName}` in topic frontmatter. Use `{ProductName}` in -`description` and `llms.description` when the resolved product name identifies the platform, and use -`{Platform}` in `keywords` or when the field genuinely needs the shorter platform label. - -## Expected fields - -Common fields: - -```yaml ---- -title: "..." -description: "..." -keywords: "..." -license: MIT -last_updated: "YYYY-MM-DD" -llms: - description: "..." ---- -``` - -Additional fields when relevant: - -```yaml -mentionedTypes: ["ComponentType"] -relatedComponents: [SiblingComponent] -_canonicalLink: "{environment:dvUrl}/components/..." -tableOfContents: - minHeadingLevel: 2 - maxHeadingLevel: 3 -``` - -The xplat component topic standard requires `last_updated`. Other optional fields should be -recommended only when the topic type or existing repo pattern warrants them. - -## Audit rules - -### Required quality checks - -- **Title:** present, concise, and topic-specific. All component topics use - `title: "{ComponentTitle}"` because the xplat site layout appends the resolved product name to the - HTML title. Do not add a framework-specific product suffix or duplicate the framework/platform in - the component phrase. Avoid "complete guide", "ultimate guide", - "try for free", and other marketing phrases. -- **Description:** present, about 140-160 characters when practical, answer-first, and specific - enough to stand alone in search results and generated schema. Avoid marketing calls to action. -- **`llms.description`:** present and more answer-shaped than the meta description. It should be a - single self-contained sentence that says what the topic/component is and what it helps developers - do. Prefer this over keyword stuffing. -- **Framework/package clarity:** frontmatter must not blur Angular, React, Web Components, and - Blazor APIs. Angular topics should identify Ignite UI for Angular when needed. xplat topics should - use `{Platform}` / `{ProductName}` tokens instead of hard-coded single-framework wording. -- **`license`:** present when the topic belongs to a doc set that uses license frontmatter. -- **`mentionedTypes`:** xplat component topics should list the concrete API types linked or - discussed by the page. Do not invent API type names; if unsure, flag as a verification issue. -- **`relatedComponents`:** recommend only for close sibling components that should affect Do/Don't - guidance. Do not add generic category neighbors just to fill the field. -- **`keywords`:** treat as legacy/internal metadata, not an SEO optimization surface. Keep it - coherent if present, but do not spend effort keyword-stuffing. If the repo later drops `keywords`, - remove it only when the user asks or a repo-level policy exists. -- **`_canonicalLink`:** do not invent. Flag inconsistent or suspicious canonical links, but require - an explicit canonical policy or nearby precedent before suggesting a replacement. -- **`last_updated`:** required for component topics. Use the `YYYY-MM-DD` format and keep the value - maintained by the topic workflow or another clear source of truth. - -### Severity - -- **Error:** missing required frontmatter for the doc set, malformed YAML, or metadata that clearly - misidentifies the component/framework. -- **Warning:** weak, inconsistent, misleading, too-long, or marketing-heavy metadata. -- **Suggestion:** polish, consistency improvements, optional fields, or policy-dependent changes. - -## Report format - -Use this shape: - -```md -# Frontmatter Audit: - -**Verdict:** -**Summary:** <1-2 sentences about the highest-value metadata fixes.> - -## Findings -### · -- **Field:** `` -- **Issue:** -- **Suggestion:** - -## Suggested Frontmatter Changes -| Field | Current | Suggested | Reason | -|---|---|---|---| -| `description` | ... | ... | ... | - -No file changes were made. Tell me which suggestions to apply. -``` - -If there are no issues, say that the frontmatter conforms and do not invent changes. - -## Applying selected suggestions - -When the user explicitly asks to apply one or more suggestions: - -1. Re-read the file. -2. Modify only the YAML frontmatter block. -3. Preserve unrelated frontmatter fields and field order where practical. -4. Do not edit body content after the closing `---`. -5. Run a focused diff check when available. +2. Read the reference files below, then audit against them. +3. Return categorized findings and concrete replacement suggestions in the standard report format. +4. Stop. Do not edit the file until the user explicitly selects what to change; then follow the + apply procedure in the report-format reference. + +## Task → Reference file + +| Task | Reference file to read | +|---|---| +| Any audit or normalization: field-by-field quality checks, doc-set/token rules, severity ladder | [`references/audit-rules.md`](./references/audit-rules.md) | +| The normative field contract — which fields exist, their shapes and quality bars (authoritative where wording differs) | [`../igniteui-doc-topics/references/house-style.md`](../igniteui-doc-topics/references/house-style.md) → "File format & frontmatter" | +| Canonical component/product naming for metadata values | [`../igniteui-doc-topics/references/house-style.md`](../igniteui-doc-topics/references/house-style.md) → "Entity terminology" | +| Producing the audit report; applying user-selected suggestions | [`references/report-format.md`](./references/report-format.md) | + +> **When in doubt, read more rather than fewer.** A missed field rule doesn't just weaken one page: +> docs metadata is the strongest entity signal the site emits, and drift fragments it. + +## Hard boundaries + +- **Never invent a canonical link.** Flag inconsistent or suspicious `_canonicalLink` values, but + require an explicit canonical policy or nearby precedent before suggesting a replacement. +- **Never invent API type names** for `mentionedTypes`; if unsure, flag as a verification issue. +- **Unresolved facts stay visible.** Use `‹VERIFY: …›` placeholders; never replace uncertainty with + a plausible value. +- **No edits before explicit user selection.** Findings and suggestions first, changes only on + request, and only to the fields the user selected. diff --git a/.ai/skills/igniteui-topic-frontmatter/references/audit-rules.md b/.ai/skills/igniteui-topic-frontmatter/references/audit-rules.md new file mode 100644 index 0000000000..3c43ab7590 --- /dev/null +++ b/.ai/skills/igniteui-topic-frontmatter/references/audit-rules.md @@ -0,0 +1,140 @@ +# Frontmatter audit rules + +Version: v3 · 2026-08-14 · igniteui doc-skill set. Content carried from SKILL.md v2 unchanged; +restructured into this reference so rules can evolve without touching the router. The normative +field contract lives in `../../igniteui-doc-topics/references/house-style.md` → "File format & +frontmatter"; where wording differs, house-style wins. + +## Doc sets and tokens + +- Angular topics live under `docs/angular/src/content//components/`. +- xplat topics live under `docs/xplat/src/content//components/` and may use tokens such as + `{Platform}`, `{ProductName}`, `{ComponentTitle}`, and `{ComponentKeywords}`. + +Keep valid platform tokens in xplat frontmatter. Do not replace them with a single concrete +framework name unless the topic itself is framework-specific. + +For xplat component metadata, avoid repeating the framework identity in the same field. The xplat +site layout already appends the resolved product name to the HTML title, so use +`title: "{ComponentTitle}"` and do not add `| {ProductName}` in topic frontmatter. Use `{ProductName}` in +`description` and `llms.description` when the resolved product name identifies the platform, and use +`{Platform}` in `keywords` or when the field genuinely needs the shorter platform label. + +## Expected fields + +Common fields: + +```yaml +--- +title: "..." +description: "..." +keywords: "..." +license: MIT +last_updated: "YYYY-MM-DD" +llms: + description: "..." +--- +``` + +Additional fields when relevant: + +```yaml +mentionedTypes: ["ComponentType"] +relatedComponents: [SiblingComponent] +_canonicalLink: "{environment:dvUrl}/components/..." +tableOfContents: + minHeadingLevel: 2 + maxHeadingLevel: 3 +``` + +The xplat component topic standard requires `last_updated`. Other optional fields should be +recommended only when the topic type or existing repo pattern warrants them. + +## Schema linkage + +Frontmatter feeds the generated page schema, so its quality bars are schema quality bars: +`description` should be usable verbatim as the schema description, and any FAQ schema the pipeline +emits must source its question/answer pairs verbatim from the visible FAQ content, never from +synthesized text (``). + +## Required quality checks + +- **Title:** present, concise, topic-specific, and shaped as the query a developer would type. + - **xplat component topics:** `title: "{ComponentTitle}"`; the xplat site layout appends the + resolved product name to the HTML title. Do not add a framework-specific product suffix or + duplicate the framework/platform in the component phrase. + - **Angular topics:** the Angular set has no tokens. Target shape: `"Angular Component"`, + aiming for <=60 characters of query-relevant terms. Do not hand-code category or brand suffixes + (`| Layouts | Infragistics`) in frontmatter unless the layout verifiably appends nothing + (``); suffixes are the layout's job, and hand-coded + ones spend title characters on non-query terms or double-brand the rendered title. Pre-committed + outcomes for that verification: if the layout appends a suffix, hand-coded suffixes are Errors + and titles strip to `"Angular Component"`; if it appends nothing, one short uniform + brand suffix (`| Ignite UI`) is standardized by convention, never improvised per page. + - Avoid "complete guide", "ultimate guide", "try for free", and other marketing phrases; also avoid + the blog-standard banned set ("revolutionary", "seamless", "game-changing", "best-in-class" + without a stated basis). +- **Description:** present, about 140-160 characters when practical, answer-first, and specific + enough to stand alone in search results and generated schema. Declarative and definition-first + ("The is a ... that ..."), not imperative task phrasing ("Use X to ..."), which is a + soft call to action. Complete sentences only: write to fit; never truncate with an ellipsis. Avoid + marketing calls to action. +- **`llms.description`:** present and more answer-shaped than the meta description: a single + self-contained sentence, <=~160 characters, that defines the **component** (or the concept the + topic covers) and what it does. It must survive verbatim extraction: the subject noun names the + product and component ("The Ignite UI for Angular Avatar is a component that ..."); no pronouns, + no capability list-dumps, and never page-referential phrasing ("This topic shows how to ..."): an + assistant answering "what is the {framework} {component}" quotes a definition of the component, + not a description of the page. Quotability test before accepting the value: is this the sentence + an assistant would quote for that query today? Prefer this over keyword stuffing. The + `llms.description`, the H1 lead sentence, and the site's llms-manifest entry for the page should + be the same sentence or trivial variants of it: one definition, emitted everywhere the machine + looks (``). +- **Entity terminology:** metadata uses the canonical component and product names from the shared + terminology table (house-style → "Entity terminology"; source: blog-creator product-context v4): + "[Framework] Data Grid" casing, fixed compounds (Tree Grid, Hierarchical Grid, Pivot Grid), + product names verbatim ("Ignite UI for Angular", not "IgniteUI"), and no banned synonyms + ("datagrid" as one word except when quoting an API symbol, "grid component" as subject noun, + silent drift to "table"/"data table"). Repeated identical entity phrasing across topics is the + point: assistants consolidate entities from it, and drift fragments the association. +- **Framework/package clarity:** frontmatter must not blur Angular, React, Web Components, and + Blazor APIs. Angular topics should identify Ignite UI for Angular when needed. xplat topics should + use `{Platform}` / `{ProductName}` tokens instead of hard-coded single-framework wording. +- **`license`:** present when the topic belongs to a doc set that uses license frontmatter. +- **`mentionedTypes`:** xplat component topics should list the concrete API types linked or + discussed by the page. Do not invent API type names; if unsure, flag as a verification issue. + Angular-set usage is currently unscoped (``): until answered, treat Angular occurrences as tolerated, not required, and do + not recommend adding the field to Angular topics. +- **`relatedComponents`:** recommend only for close sibling components that should affect Do/Don't + guidance. Do not add generic category neighbors just to fill the field. +- **`keywords`:** treat as legacy/internal metadata, not an SEO optimization surface. Coherence + test if present: every keyword (or its token-resolved form) appears in the topic body; flag + aspirational terms that appear nowhere. Do not spend effort keyword-stuffing. If the repo later + drops `keywords`, remove it only when the user asks or a repo-level policy exists. +- **`_canonicalLink`:** do not invent. Flag inconsistent or suspicious canonical links, but require + an explicit canonical policy or nearby precedent before suggesting a replacement. +- **`last_updated`:** required for component topics. Use the `YYYY-MM-DD` format and keep the value + maintained by the topic workflow or another clear source of truth. +- **Cross-field consistency:** `title`, `description`, `llms.description`, and `keywords` must tell + one story with the same entity names and the same capability list, and must agree with the H1 and + the lead sentence (which the house style requires to mirror `llms.description`). Cite the H1/lead + only as evidence; suggest the frontmatter change (or flag the body mismatch for the doc-topics + skill). A capability named in one surface and absent from another (e.g. metadata says + "images, initials, icons" while the lead says "an image, initials, or custom content") is a + finding: Warning by default, Error when the mismatch misidentifies what the component supports. +- **Body support:** every capability, feature, or claim named in `description`, `llms.description`, + or `keywords` must be supported by the topic body (frontmatter is generated from the finished + body, never from imagination). Cite the body as evidence only; when a metadata claim has no body + support, suggest removing or rewording the metadata, or flag the body gap for the doc-topics + skill: do not choose silently which side is wrong. + +## Severity + +- **Error:** missing required frontmatter for the doc set, malformed YAML, metadata that clearly + misidentifies the component/framework, or a title whose non-query terms (brand/category suffixes, + marketing words) push the query terms past the ~60-character truncation point. +- **Warning:** weak, inconsistent, misleading, too-long, or marketing-heavy metadata; a title whose + query-relevant portion exceeds ~60 characters. +- **Suggestion:** polish, consistency improvements, optional fields, or policy-dependent changes. diff --git a/.ai/skills/igniteui-topic-frontmatter/references/report-format.md b/.ai/skills/igniteui-topic-frontmatter/references/report-format.md new file mode 100644 index 0000000000..e1913543de --- /dev/null +++ b/.ai/skills/igniteui-topic-frontmatter/references/report-format.md @@ -0,0 +1,39 @@ +# Audit report format and apply procedure + +Version: v3 · 2026-08-14 · igniteui doc-skill set. Content carried from SKILL.md v2 unchanged. + +## Report format + +Use this shape: + +```md +# Frontmatter Audit: + +**Verdict:** +**Summary:** <1-2 sentences about the highest-value metadata fixes.> + +## Findings +### · +- **Field:** `` +- **Issue:** +- **Suggestion:** + +## Suggested Frontmatter Changes +| Field | Current | Suggested | Reason | +|---|---|---|---| +| `description` | ... | ... | ... | + +No file changes were made. Tell me which suggestions to apply. +``` + +If there are no issues, say that the frontmatter conforms and do not invent changes. + +## Applying selected suggestions + +When the user explicitly asks to apply one or more suggestions: + +1. Re-read the file. +2. Modify only the YAML frontmatter block. +3. Preserve unrelated frontmatter fields and field order where practical. +4. Do not edit body content after the closing `---`. +5. Run a focused diff check when available. diff --git a/.claude/skills/igniteui-doc-topics/SKILL.md b/.claude/skills/igniteui-doc-topics/SKILL.md index 479d47443e..9b576d481e 100644 --- a/.claude/skills/igniteui-doc-topics/SKILL.md +++ b/.claude/skills/igniteui-doc-topics/SKILL.md @@ -1,11 +1,18 @@ --- name: igniteui-doc-topics description: >- - Author or audit Ignite UI documentation topics: component pages, how-to guides, conceptual - overviews, and category indexes for both the Angular doc set and the cross-platform React / Web - Components / Blazor doc set. Use this whenever someone asks to write, draft, create, review, audit, - fix, or standardize a documentation topic, tutorial, guide, reference page, or concept overview for - Ignite UI. + Author or audit Ignite UI documentation topics — component pages, how-to guides, conceptual + overviews, and category indexes — for both the Angular doc set and the cross-platform (React / + Web Components / Blazor) doc set. Applies the Diátaxis framework mapped onto Ignite UI's house + templates: canonical section order, fixed heading names, frontmatter (including `llms.description` + and the `relatedComponents` trigger), `.mdx` sample embeds, and per-framework token/PlatformBlock + mechanics. Use this whenever someone asks to write, draft, create, review, audit, fix, or + standardize a documentation topic, tutorial, guide, reference page, or concept overview for Ignite + UI — even if they just say "write docs for the X component" or "review this topic" without naming + Diátaxis or the templates. Also use it when deciding what *kind* of documentation a page should be, + or when a topic mixes tutorial / how-to / reference / explanation content that should be separated. + For frontmatter-only audits or metadata normalization, use the companion igniteui-topic-frontmatter + skill instead. --- # Ignite UI doc topics adapter diff --git a/.claude/skills/igniteui-topic-frontmatter/SKILL.md b/.claude/skills/igniteui-topic-frontmatter/SKILL.md index cdbdaa626a..6688366685 100644 --- a/.claude/skills/igniteui-topic-frontmatter/SKILL.md +++ b/.claude/skills/igniteui-topic-frontmatter/SKILL.md @@ -7,7 +7,8 @@ description: >- identity in Ignite UI Angular or xplat documentation topics. This skill is strictly frontmatter-only: audit first and provide suggestions for the user to choose from before changing anything; never edit topic body content, headings, prose, samples, code snippets, links, tables, or - section structure. + section structure. For anything touching body content, structure, headings, prose, or samples, use + the companion igniteui-doc-topics skill instead. --- # Ignite UI topic frontmatter adapter diff --git a/.codex/skills/igniteui-doc-topics/SKILL.md b/.codex/skills/igniteui-doc-topics/SKILL.md index f55d37c3fd..7e7bbe9e97 100644 --- a/.codex/skills/igniteui-doc-topics/SKILL.md +++ b/.codex/skills/igniteui-doc-topics/SKILL.md @@ -1,11 +1,18 @@ --- name: igniteui-doc-topics description: >- - Author or audit Ignite UI documentation topics: component pages, how-to guides, conceptual - overviews, and category indexes for both the Angular doc set and the cross-platform React / Web - Components / Blazor doc set. Use this whenever someone asks to write, draft, create, review, audit, - fix, or standardize a documentation topic, tutorial, guide, reference page, or concept overview for - Ignite UI. + Author or audit Ignite UI documentation topics — component pages, how-to guides, conceptual + overviews, and category indexes — for both the Angular doc set and the cross-platform (React / + Web Components / Blazor) doc set. Applies the Diátaxis framework mapped onto Ignite UI's house + templates: canonical section order, fixed heading names, frontmatter (including `llms.description` + and the `relatedComponents` trigger), `.mdx` sample embeds, and per-framework token/PlatformBlock + mechanics. Use this whenever someone asks to write, draft, create, review, audit, fix, or + standardize a documentation topic, tutorial, guide, reference page, or concept overview for Ignite + UI — even if they just say "write docs for the X component" or "review this topic" without naming + Diátaxis or the templates. Also use it when deciding what *kind* of documentation a page should be, + or when a topic mixes tutorial / how-to / reference / explanation content that should be separated. + For frontmatter-only audits or metadata normalization, use the companion igniteui-topic-frontmatter + skill instead. --- # Ignite UI doc topics adapter diff --git a/.codex/skills/igniteui-topic-frontmatter/SKILL.md b/.codex/skills/igniteui-topic-frontmatter/SKILL.md index 1420e738cc..ed0906c3de 100644 --- a/.codex/skills/igniteui-topic-frontmatter/SKILL.md +++ b/.codex/skills/igniteui-topic-frontmatter/SKILL.md @@ -7,7 +7,8 @@ description: >- identity in Ignite UI Angular or xplat documentation topics. This skill is strictly frontmatter-only: audit first and provide suggestions for the user to choose from before changing anything; never edit topic body content, headings, prose, samples, code snippets, links, tables, or - section structure. + section structure. For anything touching body content, structure, headings, prose, or samples, use + the companion igniteui-doc-topics skill instead. --- # Ignite UI topic frontmatter adapter diff --git a/cspell.json b/cspell.json index 1d47e03df7..d4117e45dd 100644 --- a/cspell.json +++ b/cspell.json @@ -396,6 +396,7 @@ "xlsb", "agentic", "wireframes", - "opensource" + "opensource", + "unlayered" ] } diff --git a/docs/angular/package.json b/docs/angular/package.json index ab3ca766cf..c9b3014c82 100644 --- a/docs/angular/package.json +++ b/docs/angular/package.json @@ -35,10 +35,10 @@ "node": ">=22.12.0" }, "dependencies": { - "astro": "^6.1.6", + "astro": "^7.2.2", "docs-template": "file:../../", - "igniteui-astro-components": "0.0.27", - "sharp": "^0.34.2" + "igniteui-astro-components": "1.0.2", + "sharp": "^0.35.3" }, "devDependencies": { "cross-env": "^7.0.3", diff --git a/docs/angular/src/content/en/components/action-strip.mdx b/docs/angular/src/content/en/components/action-strip.mdx index f3a29b369e..531bb3f2b3 100644 --- a/docs/angular/src/content/en/components/action-strip.mdx +++ b/docs/angular/src/content/en/components/action-strip.mdx @@ -214,7 +214,7 @@ Additional components and/or directives that can be used within the Action Strip - - - -- +- diff --git a/docs/angular/src/content/en/components/avatar.mdx b/docs/angular/src/content/en/components/avatar.mdx deleted file mode 100644 index a362e26b4d..0000000000 --- a/docs/angular/src/content/en/components/avatar.mdx +++ /dev/null @@ -1,298 +0,0 @@ ---- -title: Angular Avatar Component – Ignite UI for Angular | Infragistics | MIT license -description: Ignite UI for Angular Avatar control enables users to add images, material icons or initials within any application for instances such as a profile button. -keywords: Angular Avatar component, Angular Avatar control, Ignite UI for Angular, Angular UI components -license: MIT -llms: - description: "Angular Avatar component helps adding initials, images, or material icons to your application." ---- - -import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; -import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; -import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - -# Angular Avatar Component Overview - -
-Angular Avatar component helps adding initials, images, or material icons to your application. -
- - -## Angular Avatar Example - - - -
- -## Getting Started with Ignite UI for Angular Avatar - -To get started with the Ignite UI for Angular Avatar component, first you need to install Ignite UI for Angular. In an existing Angular application, type the following command: - -```cmd -ng add igniteui-angular -``` - -For a complete introduction to the Ignite UI for Angular, read the [_getting started_](/general/getting-started) topic. - -The next step is to import the `IgxAvatarModule` in your **app.module.ts** file. - -```typescript -// app.module.ts - -... -import { IgxAvatarModule } from 'igniteui-angular/avatar'; -// import { IgxAvatarModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxAvatarModule], - ... -}) -export class AppModule {} -``` - -Alternatively, as of `16.0.0` you can import the `IgxAvatarComponent` as a standalone dependency. - -```typescript -// home.component.ts - -... -import { IgxAvatarComponent } from 'igniteui-angular/avatar'; -// import { IgxAvatarComponent } from '@infragistics/igniteui-angular'; for licensed package - -@Component({ - selector: 'app-home', - template: '', - styleUrls: ['home.component.scss'], - standalone: true, - imports: [IgxAvatarComponent] -}) -export class HomeComponent {} -``` - -Now that you have the Ignite UI for Angular Avatar module or component imported, you can start with a basic configuration of the `igx-avatar` component. - -## Using the Angular Avatar Component - -The Ignite UI for Angular Avatar component comes in three shapes (square, rounded, and circle) and three size options (small, medium, and large). It can be used for displaying initials, images or icons. - -### Avatar Shape - -We can change the avatar shape through the attribute setting its value to `square`, `rounded` or `circle`. By default, the shape of the avatar is `square`. - -```html - -``` - -### Avatar displaying initials - -To get a simple avatar with (i.e. JS for 'Jack Sock'), add the following code inside the component template: - -```html - -``` - -Let's enhance our avatar by making it circular and bigger in size. - -```html - -``` - -We can also change the background using the `--ig-avatar-background` CSS variable or set a color on the initials through the `color` property. - -```scss -// avatar.component.scss - -igx-avatar { - --ig-avatar-background: #e41c77; - color: #000000; -} - -``` - - -The `roundShape` property of the `igx-avatar` component have been deprecated. The attribute should be used instead. - - -If all went well, you should see something like the following in the browser: - - - -### Avatar displaying image - -To get an avatar that displays an image, all you have to do is set the image source via the property. - -```html - - -``` - - -If all went well, you should see something like the following in the browser: - - - -### Avatar displaying icon - -Analogically, the avatar can display an icon via the property. Currently all icons from the material icon set are supported. - -```html - - -``` - - -This component uses Material Icons. Add the following link to your `index.html`: `` - - -You should see something like this: - - - -## Styling - -### Avatar Theme Property Map - -Changing the `$background` property automatically updates the following dependent properties: - -| Primary Property | Dependent Property | Description | -| --- | --- | --- | -| **$background** | $color | The text color used for the avatar. | -| | $icon-color | The icon color used for the avatar. | - -To get started with styling the avatar, we need to import the `index` file, where all the theme functions and component mixins live: - -```scss -@use "igniteui-angular/theming" as *; - -// IMPORTANT: Prior to Ignite UI for Angular version 13 use: -// @import '~igniteui-angular/lib/core/styles/themes/index'; -``` - -Following the simplest approach, we create a new theme that extends the providing values for the `$background` and `$border-radius` parameters. The `$color` (or `$icon-color`) is automatically set to either black or white, depending on which offers better contrast with the specified background. Note that the `$border-radius` property only takes effect when the avatar's is set to `rounded`. - -Given the following markup: - -```html -
- - -
-``` - -We create the following avatar theme: - -```scss -$custom-avatar-theme: avatar-theme( - $background: #72da67, - $border-radius: 16px -); -``` - -The last step is to pass the custom avatar theme: - -```scss -.initials { - @include tokens($custom-avatar-theme); -} -``` - -If all went well, you should see something like the following in the browser: - - - -### Styling with Tailwind - -You can style the `avatar` using our custom Tailwind utility classes. Make sure to [set up Tailwind](/themes/misc/tailwind-classes) first. - -Along with the tailwind import in your global stylesheet, you can apply the desired theme utilities as follows: - -```scss -@import "tailwindcss"; -... -@use 'igniteui-theming/tailwind/utilities/material.css'; -``` - -The utility file includes both `light` and `dark` theme variants. - -- Use `light-*` classes for the light theme. -- Use `dark-*` classes for the dark theme. -- Append the component name after the prefix, e.g., `light-avatar`, `dark-avatar`. - -Once applied, these classes enable dynamic theme calculations. From there, you can override the generated CSS variables using `arbitrary properties`. After the colon, provide any valid CSS color format (HEX, CSS variable, RGB, etc.). - -You can find the full list of properties in the . The syntax is as follows: - -```html - - -``` - - -The exclamation mark(`!`) is required to ensure the utility class takes precedence. Tailwind applies styles in layers, and without marking these styles as important, they will get overridden by the component’s default theme. - - -At the end your avatar should look like this: - - - -### Custom sizing - -You can either use the `--size` variable, targeting the `igx-avatar` directly: - -```scss -igx-avatar { - --size: 200px; -} -``` - -Or you can use the universal `--ig-avatar-size` variable to target all instances: - -```html -
- - -
-``` - -```scss -.my-app { - --ig-avatar-size: 200px; -} -``` - -You can also use one of the predefined sizes, assigning it to the `--ig-size` variable, if theres no size attribute applied. The available values for `--ig-size` are `--ig-size-small`, `--ig-size-medium`, and `--ig-size-large`: - -```scss -igx-avatar { - --ig-size: var(--ig-size-small); -} -``` - -Learn more about it in the [Size](/display-density) article. - -
- -## API References -
-- -## Theming Dependencies - -- -- - -## Additional Resources - -
- -Our community is active and always welcoming to new ideas. - -- [Ignite UI for Angular **Forums**](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) -- [Ignite UI for Angular **GitHub**](https://github.com/IgniteUI/igniteui-angular) diff --git a/docs/angular/src/content/en/components/badge.mdx b/docs/angular/src/content/en/components/badge.mdx deleted file mode 100644 index ab21c48d81..0000000000 --- a/docs/angular/src/content/en/components/badge.mdx +++ /dev/null @@ -1,449 +0,0 @@ ---- -title: Angular Badge Component – Ignite UI for Angular | Infragistics | MIT license -description: Display an active count or icon in a predefined style to decorate other components anywhere in an application with Ignite UI for Angular Badge control. -keywords: Angular Badge component, Angular Badge control, Ignite UI for Angular, Angular UI Components -license: MIT -llms: - description: "Angular Badge is a component used in conjunction with avatars, navigation menus, or other components in an application when a visual notification is needed." ---- - -import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; -import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; -import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - -# Angular Badge Component Overview - -
-Angular Badge is a component used in conjunction with avatars, navigation menus, or other components in an application when a visual notification is needed. Badges are usually designed as icons with a predefined style to communicate information, success, warnings, or errors. -
- -## Angular Badge Example - - - -
- -## Getting Started with Ignite UI for Angular Badge - -To get started with the Ignite UI for Angular Badge component, first you need to install Ignite UI for Angular. In an existing Angular application, type the following command: - -```cmd -ng add igniteui-angular -``` - -For a complete introduction to the Ignite UI for Angular, read the [_getting started_](/general/getting-started) topic. - -The next step is to import the `IgxBadgeModule` in your **app.module.ts** file. - -```typescript -// app.module.ts - -... -import { IgxBadgeModule } from 'igniteui-angular/badge'; -// import { IgxBadgeModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxBadgeModule], - ... -}) -export class AppModule {} -``` - -Alternatively, as of `16.0.0` you can import the as a standalone dependency. - -```typescript -// home.component.ts - -... -import { IgxBadgeComponent } from 'igniteui-angular/badge'; -// import { IgxBadgeComponent } from '@infragistics/igniteui-angular'; for licensed package - -@Component({ - selector: 'app-home', - template: '', - styleUrls: ['home.component.scss'], - standalone: true, - imports: [IgxBadgeComponent] -}) -export class HomeComponent {} -``` - - -This component uses Material Icons. Add the following link to your `index.html`: `` - - -Now that you have the Ignite UI for Angular Badge module or component imported, you can start with a basic configuration of the `igx-badge` component. - -## Using the Angular Badge Component - -Let's see how the demo sample is done. It's a simple success badge on an avatar. To build that, we need to import the `IgxAvatarModule`, along with the `IgxBadgeModule`: - -```typescript -// app.module.ts -... -import { IgxBadgeModule } from 'igniteui-angular/badge'; -import { IgxAvatarModule } from 'igniteui-angular/avatar'; -// import { IgxBadgeModule, IgxAvatarModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxBadgeModule, IgxAvatarModule], - ... -}) - -export class AppModule {} -``` - -_Alternatively, as of `16.0.0` you can import the and as standalone dependencies._ - -Next, we will add those components to our template: - -```html -
- - -
-``` - -Using the wrapper, we will position the badge absolutely, covering a little bit of the avatar: - -```scss -.wrapper { - position: relative; - margin-top: 15px; -} - -igx-badge { - position: absolute; - bottom: 0; - left: 28px; -} -``` - -### Badge Shape - -We can change the badge shape through the attribute setting its value to `square`. By default, the shape of the badge is `rounded`. - -```html - -``` - -If everything's done right, you should see the demo sample shown above in your browser. - -### Badge Size - -The size of the badge can be controlled using the `--size` variable. It will make sure that the badge sizes proportionally in both directions. Keep in mind, however, that badges containing text values use the `caption` typography style for its font-size and line-height. For that reason, when setting the `--size` of a badge containing text to values below 16px, you will also need to modify its typography. - -Example: - -```scss -igx-badge { - --size: 12px; - - font-size: calc(var(--size) / 2); - line-height: normal; -} -``` - -### Badge Value and Icon - -Use the `[value]` input to display text or a numeric count inside the badge: - -```html - -``` - -Use the `[icon]` input to display an icon inside the badge: - -```html - -``` - -When both `[icon]` and `[value]` are set, the badge displays both simultaneously: - -```html - - -``` - -Or you can project content directly: - -```html - {{ model.value }} - - - - bluetooth - Bluetooth - -``` - -### Badge Icon - -In addition to material icons, the `igx-badge` component also supports usage of [Material Icons Extended](/material-icons-extended) and any other custom icon set. To add an icon from the material icons extended set inside your badge component, first you have to register it: - -```ts -export class BadgeIconComponent implements OnInit { - constructor (protected _iconService: IgxIconService) {} - - public ngOnInit() { - this._iconService.addSvgIconFromText(heartMonitor.name, heartMonitor.value, 'imx-icons'); - } -} -``` - -Then, just specify the icon name and family as follows: - -```html - -``` - - - -### Outlined Badge - -The `igx-badge` component can also have a subtle border around it when its attribute is set. - -```html - -``` - - - -The color of the border can also be customized with the `$border-color` property from the . - -### Dot Badge - -The `igx-badge` component can also render as a minimal dot indicator for notifications by enabling its property. Dot badges do not support content, but they can be outlined and can use any of the available dot types (e.g., primary, success, info, etc.). - -```html - -``` - - - -### Badge in List - -Let's extend the previous sample and create a list with contacts, similar to those in chat clients. In addition to the contact name, we want to display an avatar and the current state of the contact (online, offline or away). To achieve this, we're using the and components. For a container, is used. - -To continue, include all needed modules and import them in the **app.module.ts** file. - -```typescript -// app.module.ts - -... -import { IgxListModule } from 'igniteui-angular/list'; -import { IgxAvatarModule } from 'igniteui-angular/avatar'; -import { IgxBadgeModule } from 'igniteui-angular/badge'; -// import { IgxListModule, IgxAvatarModule, IgxBadgeModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxListModule, IgxAvatarModule, IgxBadgeModule], -}) -export class AppModule {} -``` - - -The has and inputs to configure the badge look. You can set the icon by providing its name from the official [material icons set](https://material.io/icons/). The badge type can be set to either `Default`, `Info`, `Success`, `Warning`, or `Error`. Each type applies a specific background color, which takes precedence over any custom background color. - - -In our sample, and are bound to model properties named _icon_ and _type_. - -Next, we're adding the contacts in our template: - -```html -{/* contacts.component.html */} - - - - Team Members (4) - - -
-
- - -
-
- {{ member.name }} -
-
-
-
-``` - -We're going to create our members in the typescript file like this: - -```typescript -// contacts.component.ts - -... -public members: Member[] = [ - new Member('Terrance Orta', 'online'), - new Member('Donna Price', 'online'), - new Member('Lisa Landers', 'away'), - new Member('Dorothy H. Spencer', 'offline'), -]; - -``` - -```typescript -... -class Member { - public name: string; - public status: string; - public type: string; - public icon: string; - - constructor(name: string, status: string) { - this.name = name; - this.status = status; - switch (status) { - case 'online': - this.type = 'success'; - this.icon = 'check'; - break; - case 'away': - this.type = 'warning'; - this.icon = 'schedule'; - break; - case 'offline': - this.type = 'error'; - this.icon = 'remove'; - break; - } - } -} -``` - -Position the badge in its parent container: - -```css -/* contacts.component.css */ - -.wrapper { - display: flex; - flex-direction: row; -} - -.contact-name { - font-weight: 600; -} - -.contact-container { - margin-left: 20px; -} - -.badge-style { - position: absolute; - bottom: 2.5px; - left: 40px; -} - -``` - -If the sample is configured properly, a list of members should be displayed and every member has an avatar and a badge, showing its current state. - - - -## Styling - -### Badge Theme Property Map - -Changing the `$background-color` property automatically updates the following dependent properties: - -| Primary Property | Dependent Property | Description | -| --- | --- | --- | -| **$background-color** | $icon-color | The color used for icons in the badge. | -| | $text-color | The color used for text in the badge. | - -To get started with styling the badges, we need to import the `index` file, where all the theme functions and component mixins live: - -```scss -@use "igniteui-angular/theming" as *; - -// IMPORTANT: Prior to Ignite UI for Angular version 13 use: -// @import '~igniteui-angular/lib/core/styles/themes/index'; -``` - -Following the simplest approach, we create a new theme that extends the and accepts some parameters that style the badge's items. When you set the `$background-color`, the `$icon-color` and `$text-color` are automatically assigned based on which offers better contrast—black or white. Note that the `$border-radius` property only takes effect when the badge's is set to `square`. - -```scss -$custom-badge-theme: badge-theme( - $background-color: #57a5cd, - $border-radius: 4px -); -``` - -To include the new theme we use the `tokens` mixin: - -```scss -:host { - @include tokens($custom-badge-theme); -} -``` - -### Demo - - - -### Styling with Tailwind - -You can style the `badge` using our custom Tailwind utility classes. Make sure to [set up Tailwind](/themes/misc/tailwind-classes) first. - -Along with the tailwind import in your global stylesheet, you can apply the desired theme utilities as follows: - -```scss -@import "tailwindcss"; -... -@use 'igniteui-theming/tailwind/utilities/material.css'; -``` - -The utility file includes both `light` and `dark` theme variants. - -- Use `light-*` classes for the light theme. -- Use `dark-*` classes for the dark theme. -- Append the component name after the prefix, e.g., `light-badge`, `dark-badge`. - -Once applied, these classes enable dynamic theme calculations. From there, you can override the generated CSS variables using `arbitrary properties`. After the colon, provide any valid CSS color format (HEX, CSS variable, RGB, etc.). - -You can find the full list of properties in the . The syntax is as follows: - -```html - - -``` - - -The exclamation mark(`!`) is required to ensure the utility class takes precedence. Tailwind applies styles in layers, and without marking these styles as important, they will get overridden by the component’s default theme. - - -At the end your badges should look like this: - - - -
- -## API References - -- -- -- -- -- -- -## Theming Dependencies - -- - -## Additional Resources - -
- -Our community is active and always welcoming to new ideas. - -- [Ignite UI for Angular **Forums**](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) -- [Ignite UI for Angular **GitHub**](https://github.com/IgniteUI/igniteui-angular) diff --git a/docs/angular/src/content/en/components/button-group.mdx b/docs/angular/src/content/en/components/button-group.mdx deleted file mode 100644 index 10e8c3eea4..0000000000 --- a/docs/angular/src/content/en/components/button-group.mdx +++ /dev/null @@ -1,369 +0,0 @@ ---- -title: Angular Button Group Component – Ignite UI for Angular | Infragistics | MIT license -description: Provides button group functionality to developers and also allows horizontal/vertical alignment, single/multiple selection with toggling. -keywords: Ignite UI for Angular, UI controls, Angular widgets, web widgets, UI widgets, Angular, Native Angular Components Suite, Native Angular Controls, Native Angular Components Library, Angular Button Group components, Angular Button Group controls, Angular Buttons components, Angular Buttons controls -license: MIT -llms: - description: "Angular Button Group component is used to organize buttons into styled button groups with horizontal/vertical alignment, single/multiple selection and toggling." ---- - -import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; -import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; -import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - -# Angular Button Group Component Overview - -
-Angular Button Group component is used to organize buttons into styled button groups with horizontal/vertical alignment, single/multiple selection and toggling. -
- -## Angular Button Group Example - - - -
- -## Getting Started with Ignite UI for Angular Button Group - -To get started with the Ignite UI for Angular Button Group component, first you need to install Ignite UI for Angular. In an existing Angular application, type the following command: - -```cmd -ng add igniteui-angular -``` - -For a complete introduction to the Ignite UI for Angular, read the [_getting started_](/general/getting-started) topic. - -The next step is to import the `IgxButtonGroupModule` in your **app.module.ts** file. - -```typescript -// app.module.ts - -... -import { IgxButtonGroupModule } from 'igniteui-angular/button-group'; -// import { IgxButtonGroupModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxButtonGroupModule], - ... -}) -export class AppModule {} -``` - -Alternatively, as of `16.0.0` you can import the `IgxButtonGroupComponent` as a standalone dependency, or use the [`IGX_BUTTON_GROUP_DIRECTIVES`](https://github.com/IgniteUI/igniteui-angular/blob/master/projects/igniteui-angular/button-group/src/button-group/public_api.ts) token to import the component and all of its supporting components and directives. - -```typescript -// home.component.ts - -... -import { IGX_BUTTON_GROUP_DIRECTIVES } from 'igniteui-angular/button-group'; -import { IgxIconComponent } from 'igniteui-angular/icon'; -// import { IGX_BUTTON_GROUP_DIRECTIVES, IgxIconComponent } from '@infragistics/igniteui-angular'; for licensed package - -@Component({ - selector: 'app-home', - template: ` - - - - - - - `, - styleUrls: ['home.component.scss'], - standalone: true, - imports: [IGX_BUTTON_GROUP_DIRECTIVES, IgxIconComponent] - /* or imports: [IgxButtonGroupComponent, IgxButtonDirective, IgxIconComponent] */ -}) -export class HomeComponent {} -``` - - - -This component uses Material Icons. Add the following link to your `index.html`: `` - - -Now that you have the Ignite UI for Angular Button Group module or directives imported, you can start with a basic configuration of the `igx-buttongroup` and its buttons. - -## Using for Angular Button Group Component - -### Add Button Group - -Use the selector to wrap your buttons and display them into a button group. If you want a button to be selected by default, use the `selected` property: - -```html -{/* sample.component.html */} - - - - - - -``` - -## Examples - -### Alignment - -Use the input property to set the orientation of the buttons in the button group. - -```typescript -//sample.component.ts -import { ButtonGroupAlignment } from 'igniteui-angular/button-group'; -// import { ButtonGroupAlignment } from '@infragistics/igniteui-angular'; for licensed package - -... -public alignment = ButtonGroupAlignment.vertical; -... -``` - -```html -{/* sample.component.html */} - - - - - - -``` - - - -
- -### Selection - -In order to configure the `igx-buttongroup` selection, you could use its property. This property accepts the following three modes: - -- **single** - default selection mode of the button group. A single button can be selected/deselected by the user. -- **singleRequired** - mimics a radio group behavior. Only one button can be selected and once initial selection is made, deselection is not possible through user interaction. -- **multi** - multiple buttons in the group can be selected and deselected. - -The sample below demonstrates the exposed `igx-buttongroup` selection modes: - - - -### Size - -The `--ig-size` CSS custom property can be used to control the size of the button group. - -```scss -/* sample.component.scss */ -igx-buttongroup { - --ig-size: var(--ig-size-small); -} -``` - -```html -{/* sample.component.html */} - -``` - - - -### Custom toggle buttons - -Use the input property to set an array of customized buttons in the button group. - -```typescript -// sample.component.ts - -interface IButton { - ripple?: string; - label?: string; - disabled?: boolean; - togglable?: boolean; - selected?: boolean; - color?: string; - icon?: string; -} - -class ToggleButton { - private ripple: string; - private label: string; - private disabled: boolean; - private togglable: boolean; - private selected: boolean; - private color: string; - private icon: string; - - constructor(obj?: IButton) { - this.ripple = obj.ripple || 'gray'; - this.label = obj.label; - this.selected = obj.selected || false; - this.togglable = obj.togglable || true; - this.disabled = obj.disabled || false; - this.color = obj.color; - this.icon = obj.icon; - } -} -... -public bordersButtons: ToggleButton[]; - -public ngOnInit() { - this.bordersButtons = [ - new ToggleButton({ - icon: 'border_top', - selected: true - }), - new ToggleButton({ - icon: 'border_right', - selected: false - }), - new ToggleButton({ - icon: 'border_bottom', - selected: false - }), - new ToggleButton({ - icon: 'border_left', - selected: false - }) - ]; -} -... -``` - -```html -{/* sample.component.html */} - -``` - - - -## Styling - -### Button Group Theme Property Map - -When you set a value for the `$item-background` property, all related dependent properties listed in the table below are automatically updated to maintain visual consistency. The table shows which properties are affected when you customize the primary property. - -| Primary Property | Dependent Property | Description | -| --- | --- | --- | -| **$item-background** | $item-hover-background | The hover background color for items. | -| | $item-selected-background | The selected item background color. | -| | $item-focused-background | The focused item background color. | -| | $disabled-background-color | The disabled item background color. | -| | $item-border-color | The border color for items. | -| | $item-text-color | The text color for items. | -| | $idle-shadow-color | The idle shadow color for items. | -| **$item-hover-background** | $item-selected-hover-background | The selected item hover background color. | -| | $item-focused-hover-background | The focused hover background color. | -| | $item-hover-text-color | The text color for hovered items. | -| | $item-hover-icon-color | The icon color for hovered items. | -| **$item-selected-background** | $item-selected-focus-background | The selected item focus background color. | -| | $disabled-selected-background | The disabled selected background color. | -| | $item-selected-text-color | The text color for selected items. | -| | $item-selected-icon-color | The icon color for selected items. | -| | $item-selected-hover-text-color | The text color for selected hover items. | -| | $item-selected-hover-icon-color | The icon color for selected hover items. | -| **$item-border-color** | $item-hover-border-color | The border color for hovered items. | -| | $item-focused-border-color | The border color for focused items. | -| | $item-selected-border-color | The border color for selected items. | -| | $item-selected-hover-border-color | The border color for selected hover items. | -| | $item-disabled-border | The border color for disabled items. | -| | $disabled-selected-border-color | The border color for disabled selected items. | - -To get started with styling the button group, we need to import the `index` file, where all the theme functions and component mixins live: - -```scss -@use "igniteui-angular/theming" as *; - -// IMPORTANT: Prior to Ignite UI for Angular version 13 use: -// @import '~igniteui-angular/lib/core/styles/themes/index'; -``` - -Following the simplest approach, we create a new theme that extends the and specifying just the `$item-background`. Based on this value, the theme will automatically compute appropriate state colors, contrast foregrounds, and borders for the button group. Of course, you're still free to override any of the theme parameters with custom values if needed. - -```scss -$custom-button-group: button-group-theme( - $item-background: #57a5cd, -); -``` - -As seen, the `button-group-theme` exposes some useful parameters for basic styling of its items. If you want to drill deeper and change some button specific parameters, you can create a new theme that extends the `button-theme` and scope it under the respective button group class. - -The last step is to include the component's theme. - -```scss -:host { - @include tokens($custom-button-group); -} -``` - -### Demo - - - -### Styling with Tailwind - -You can style the `button-group` using our custom Tailwind utility classes. Make sure to [set up Tailwind](/themes/misc/tailwind-classes) first. - -Along with the tailwind import in your global stylesheet, you can apply the desired theme utilities as follows: - -```scss -@import "tailwindcss"; -... -@use 'igniteui-theming/tailwind/utilities/material.css'; -``` - -The utility file includes both `light` and `dark` theme variants. - -- Use `light-*` classes for the light theme. -- Use `dark-*` classes for the dark theme. -- Append the component name after the prefix, e.g., `light-button-group`, `dark-button-group`. - -Once applied, these classes enable dynamic theme calculations. From there, you can override the generated CSS variables using `arbitrary properties`. After the colon, provide any valid CSS color format (HEX, CSS variable, RGB, etc.). - -You can find the full list of properties in the . The syntax is as follows: - -```html - -... - -``` - - -The exclamation mark(`!`) is required to ensure the utility class takes precedence. Tailwind applies styles in layers, and without marking these styles as important, they will get overridden by the component’s default theme. - - -At the end your button group should look like this: - - - -## API References -
-- -- -- -- -## Theming Dependencies - -- -- -- - -## Additional Resources - -
- -Our community is active and always welcoming to new ideas. - -- [Ignite UI for Angular **Forums**](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) -- [Ignite UI for Angular **GitHub**](https://github.com/IgniteUI/igniteui-angular) diff --git a/docs/angular/src/content/en/components/button.mdx b/docs/angular/src/content/en/components/button.mdx index 3e27a70f33..f9dfe1874c 100644 --- a/docs/angular/src/content/en/components/button.mdx +++ b/docs/angular/src/content/en/components/button.mdx @@ -116,7 +116,6 @@ As of version `17.1.0` the IgniteUI for Angular exposes a new `igxIconButton` di ``` - This component uses Material Icons. Add the following link to your `index.html`: `` @@ -604,7 +603,7 @@ To style the button you can use our type-specific theme functions: {/* .theme-switcher-wrapper */} -To get started with styling the calendar, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the calendar, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/card.mdx b/docs/angular/src/content/en/components/card.mdx index 650ff419cc..025297bb21 100644 --- a/docs/angular/src/content/en/components/card.mdx +++ b/docs/angular/src/content/en/components/card.mdx @@ -108,7 +108,6 @@ import { IGX_CARD_DIRECTIVES } from 'igniteui-angular/card'; export class HomeComponent {} ``` - This component uses Material Icons. Add the following link to your `index.html`: `` @@ -350,7 +349,7 @@ Changing the `$background` property automatically updates the following dependen | | $content-text-color | The text color of the card content. | | | $actions-text-color | The text color of the card buttons. | -To get started with styling the card, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the card, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -442,7 +441,7 @@ Additional components and/or directives that were used: - - - -- +- Styles: diff --git a/docs/angular/src/content/en/components/chat.mdx b/docs/angular/src/content/en/components/chat.mdx index a1dd4e0ddd..d19dab5073 100644 --- a/docs/angular/src/content/en/components/chat.mdx +++ b/docs/angular/src/content/en/components/chat.mdx @@ -406,7 +406,7 @@ We highly recommend using the standard Web Component styling approaches before r Apart from the **CSS parts** and **slots**, the Chat component also has a function exposed by our theming engine. -In order to style the Chat component using the theme function, first we need to import the theming module, where all the theme functions and component mixins live: +In order to style the Chat component using the theme function, first we need to import the theming module, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/checkbox.mdx b/docs/angular/src/content/en/components/checkbox.mdx index 2bc834cb0a..db035af6d4 100644 --- a/docs/angular/src/content/en/components/checkbox.mdx +++ b/docs/angular/src/content/en/components/checkbox.mdx @@ -248,7 +248,7 @@ When you modify a primary property, all related dependent properties are updated > **Note:** The actual results may vary depending on the theme variant. -To get started with styling the checkbox, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the checkbox, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/chip.mdx b/docs/angular/src/content/en/components/chip.mdx index c23e2dd8aa..ab55f2d8c7 100644 --- a/docs/angular/src/content/en/components/chip.mdx +++ b/docs/angular/src/content/en/components/chip.mdx @@ -110,6 +110,16 @@ The Angular chip supports several pre-defined stylistic variants. You can change +### Outlined + +The Angular Chip can also be rendered in an outlined style and have a border around it by setting the property. + +```html +Outlined +``` + + + ### Selection Selecting Default @@ -527,7 +537,7 @@ When you modify a primary property, all related dependent properties are updated | | $focus-selected-border-color | The selected chip focus border color. | | | $focus-selected-outline-color (bootstrap & indigo variants only) | The chip focus outline color in selected state. | -To get started with styling the chip, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the chip, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/circular-progress.mdx b/docs/angular/src/content/en/components/circular-progress.mdx index 75d51d96a9..5666979037 100644 --- a/docs/angular/src/content/en/components/circular-progress.mdx +++ b/docs/angular/src/content/en/components/circular-progress.mdx @@ -242,7 +242,7 @@ After reproducing the steps above, you should get this as a result: ## Styling -To get started with styling the circular progress bar, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the circular progress bar, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/combo.mdx b/docs/angular/src/content/en/components/combo.mdx index 9130ceb900..86f9a31c4d 100644 --- a/docs/angular/src/content/en/components/combo.mdx +++ b/docs/angular/src/content/en/components/combo.mdx @@ -373,7 +373,7 @@ The last step is to include the component's theme. ``` -The component uses the [`IgxOverlay`](/overlay) service to hold and display the combobox items list container. To properly scope your styles you might have to use an . For more details check the [`IgxOverlay Styling Guide`](/overlay-styling). Also is necessary to use `::ng-deep` when we are styling the components. +The uses the [`IgxOverlay`](/overlay) service to display its list. Depending on View Encapsulation and where the generated selectors must match, the local theme include may still require `::ng-deep`. A list attached to the default detached outlet also cannot inherit from the combo's host; configure the beneath the themed container or emit the theme from a selector that can match the outlet. See the [`IgxOverlay Styling Guide`](/overlay-styling). [!Note] The default `type` of the `IgxCombo` is `box` unlike the [`IgxSelect`](/select) where it is `line`. diff --git a/docs/angular/src/content/en/components/date-picker.mdx b/docs/angular/src/content/en/components/date-picker.mdx index 6825f07736..9a5cd4dd28 100644 --- a/docs/angular/src/content/en/components/date-picker.mdx +++ b/docs/angular/src/content/en/components/date-picker.mdx @@ -313,7 +313,7 @@ Here is how an Angular Date Picker with Japanese locale definition would look li ## Styling -To get started with styling the date picker, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the date picker, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -338,8 +338,8 @@ The last step is to pass the custom Date Picker theme: } ``` - -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` + +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss diff --git a/docs/angular/src/content/en/components/date-range-picker.mdx b/docs/angular/src/content/en/components/date-range-picker.mdx index 5a736c80df..6a7ddd801e 100644 --- a/docs/angular/src/content/en/components/date-range-picker.mdx +++ b/docs/angular/src/content/en/components/date-range-picker.mdx @@ -132,7 +132,6 @@ The Angular Date Range Picker component also allows configuring two separate inp ``` - In the two-input configuration, place the `input` directly inside `igx-date-range-start` and `igx-date-range-end`. @@ -552,7 +551,7 @@ The header, subheader and title parts of the calendar header can be customized b ## Styling -To get started with styling the `igxDateRangePicker`, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the `igxDateRangePicker`, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -613,19 +612,9 @@ The last step is to pass the custom themes: ``` -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` +Token overrides normally inherit through [`Emulated`](/themes/sass/component-themes#view-encapsulation) View Encapsulation, but generated selectors for nested picker elements may still require `::ng-deep`. If the local theme does not take effect, wrap the affected include in `::ng-deep` or move it to a global stylesheet. A calendar displayed in a detached overlay must be themed from a selector that can match its outlet or moved beneath the themed container. -```scss -:host { - ::ng-deep { - @include date-range-picker($custom-date-range-theme); - @include input-group($custom-input-group-theme); - @include calendar($custom-calendar-theme); - } -} -``` - ### Scoping Styles Regarding style scoping, you should refer to both styling sections [Overlay Scoped Component Styles](/overlay-styling#Scoped Overlay Styles) and [Input Group Scoping Styles](/input-group#styling) as they provide more information. diff --git a/docs/angular/src/content/en/components/dialog.mdx b/docs/angular/src/content/en/components/dialog.mdx index 4ca3c0c1c1..65dbe41167 100644 --- a/docs/angular/src/content/en/components/dialog.mdx +++ b/docs/angular/src/content/en/components/dialog.mdx @@ -80,7 +80,6 @@ import { IgxRippleDirective } from 'igniteui-angular/directives'; export class HomeComponent {} ``` - This component uses Material Icons. Add the following link to your `index.html`: `` @@ -275,7 +274,7 @@ Changing the `$background` property automatically updates the following dependen | | $message-color | The dialog message text color. | | | $border-color | The border color used for dialog component. | -To get started with styling the dialog window, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the dialog window, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -332,7 +331,7 @@ The last step is to **include** the component theme in our application. ``` -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to apply the styles. +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss diff --git a/docs/angular/src/content/en/components/divider.mdx b/docs/angular/src/content/en/components/divider.mdx index b04ffdddf6..20790534ec 100644 --- a/docs/angular/src/content/en/components/divider.mdx +++ b/docs/angular/src/content/en/components/divider.mdx @@ -49,31 +49,31 @@ import { IgxDividerModule } from 'igniteui-angular/directives'; export class AppModule {} ``` -Alternatively, as of `16.0.0` you can import the `IgxDividerDirective` as a standalone dependency. +Alternatively, as of `16.0.0` you can import the `IgxDividerComponent` as a standalone dependency. ```typescript // home.component.ts -import { IgxDividerDirective } from 'igniteui-angular/directives'; -// import { IgxDividerDirective } from '@infragistics/igniteui-angular'; for licensed package +import { IgxDividerComponent } from 'igniteui-angular/directives'; +// import { IgxDividerComponent } from '@infragistics/igniteui-angular'; for licensed package @Component({ selector: 'app-home', template: '', styleUrls: ['home.component.scss'], standalone: true, - imports: [IgxDividerDirective] + imports: [IgxDividerComponent] }) export class HomeComponent {} ``` -Now that you have the Ignite UI for Angular Divider module or directive imported, you can start using the `igx-divider` component. +Now that you have the Ignite UI for Angular Divider module or component imported, you can start using the `igx-divider` component. ## Using the Angular Divider ### Vertical Divider -By adding the attribute and setting its value to `true`, you can change the direction of the divider from horizontal to vertical. +By adding the attribute and setting its value to `true`, you can change the direction of the divider from horizontal to vertical. ```html @@ -84,7 +84,7 @@ By adding the attribute of the divider and set its value to `dashed`. +To change the default look simply use the attribute of the divider and set its value to `dashed`. ```html @@ -95,7 +95,7 @@ To change the default look simply use the attribute of the divider to `true` and provider the desired value, the divider will start shrinking from both ends. +To inset the divider, set the attribute of the divider to `true` and provider the desired value, the divider will start shrinking from both ends. **Keep in mind that you have to add unit(px,rem,%...) at the end of the value otherwise, it will not work.** @@ -110,12 +110,12 @@ To inset the divider, set the -If the value of the attribute is set to a false value, or if the attribute is omitted altogether, the divider will set in only on the left. +If the value of the attribute is set to a false value, or if the attribute is omitted altogether, the divider will set in only on the left. ## API References
-- -- +- +- ## Additional Resources
diff --git a/docs/angular/src/content/en/components/drop-down.mdx b/docs/angular/src/content/en/components/drop-down.mdx index 29146828c9..c17ae9c34b 100644 --- a/docs/angular/src/content/en/components/drop-down.mdx +++ b/docs/angular/src/content/en/components/drop-down.mdx @@ -561,8 +561,8 @@ The last step is to pass the custom drop-down theme: - . - - -- -- +- +- ## Theming Dependencies - diff --git a/docs/angular/src/content/en/components/general/how-to/how-to-customize-theme.mdx b/docs/angular/src/content/en/components/general/how-to/how-to-customize-theme.mdx index 5d78b92f71..83df99cc53 100644 --- a/docs/angular/src/content/en/components/general/how-to/how-to-customize-theme.mdx +++ b/docs/angular/src/content/en/components/general/how-to/how-to-customize-theme.mdx @@ -16,9 +16,6 @@ import gettingStartedDarkApp from '../../../images/general/theming-walkthrough/g import customizingUpdatedToolbar from '../../../images/general/theming-walkthrough/customizing-updated-toolbar.png'; import customizingColorSchemaLight from '../../../images/general/theming-walkthrough/customizing-color-schema-light.png'; import customizingColorSchemaDark from '../../../images/general/theming-walkthrough/customizing-color-schema-dark.png'; -import optimizingInitialBuild from '../../../images/general/theming-walkthrough/optimizing-initial-build.png'; -import optimizingAfterExclude from '../../../images/general/theming-walkthrough/optimizing-after-exclude.png'; -import optimizingAfterModuleLazyload from '../../../images/general/theming-walkthrough/optimizing-after-module-lazyload.png'; # Customizing Ignite UI for Angular Theming @@ -43,10 +40,13 @@ As you can see, the application has applied default theming, which is [material ```scss /* You can add global styles to this file, and also import other style files */ -// Standard CSS normalize, comment out if not required or using a different module -@use "minireset.css/minireset"; @use "@infragistics/igniteui-angular/theming" as *; +// Standard CSS normalize, remove if it is not required. +@layer ig.reset { + @import "minireset.css"; +} + @include core(); @include typography(); @include light-theme($light-material-palette); @@ -124,12 +124,10 @@ $custom-palette: palette( /* Grid Toolbar */ /* All grid toolbars will have custom background and elevations */ $toolbar-theme: grid-toolbar-theme( - $background-color: $primary + $background: $primary ); -:host { - @include tokens($toolbar-theme); -} +@include tokens($toolbar-theme); /* END Grid Toolbar */ ``` @@ -144,9 +142,12 @@ The same process can be applied to override and customize any of the component t Now let's dig even deeper and create two custom versions of the theme, which can be switched between at runtime. We can do this with user control/preference and let them switch it at any time. For the example, however, we will use the OS defined user preference (light or dark) in order to apply a theme, which matches the current OS setting. In order to do this, we will need two color palettes: ```scss -@use "minireset.css/minireset"; @use "@infragistics/igniteui-angular/theming" as *; +@layer ig.reset { + @import "minireset.css"; +} + @include core(); @include typography($font-family: "Poppins"); @@ -181,7 +182,7 @@ Then our theme definition will go in the general scope, which we will use for th @media (prefers-color-scheme: light) { /* Grid Toolbar override for light color scheme */ igx-grid-toolbar { - --background-color: #{$primary-light}; + --background: #{$primary-light}; --title-text-color: #{text-contrast($primary-light)}; } /* END Grid Toolbar */ @@ -197,7 +198,7 @@ Then our theme definition will go in the general scope, which we will use for th /* Grid Toolbar override for dark color scheme */ igx-grid-toolbar { - --background-color: #{$primary-dark}; + --background: #{$primary-dark}; --title-text-color: #{text-contrast($primary-dark)}; } /* END Grid Toolbar */ @@ -239,11 +240,13 @@ We've made this as granular as possible, so modifications can be applied without ## Theme Optimization -After making some customizations, we're going to build the application we generated and modified to see what our application theme looks like in terms of size. + +Starting with Ignite UI for Angular 22.1.0, component structural styles ship inside each component's own bundle instead of a single, all-or-nothing global stylesheet. Your build tool (webpack, esbuild, etc.) includes structural CSS only for the components your application actually imports, automatically, without any additional configuration on your part. + -Optimizing Initial Build +Calling `@include theme()` (together with `core()` and `typography()`) generates the shared design **tokens** — the `--ig-*` CSS custom properties consumed by every component — for your global stylesheet. Since structural styles no longer live here, this output is already much smaller than a stylesheet that used to bundle every component's structural CSS regardless of whether it was used. -As you can see, the application theme is slightly over 400kb, which comes down to ~40kb when compressed and transferred over. This is not large, but can it be more optimal? The answer is yes, unless every single component from the Ignite UI for Angular suite is used. Calling `@include theme()` brings in all of the component themes, but we have a mechanism for telling the function what to exclude. There's an parameter to the theming mixin, which takes component names as an array and excludes those from the theme at build time. Since it's not so easy to find and list all of the components available in the package, it's preferable if you can just list all of the components you use. We expose the full component list as a variable, which you have access to once you +You can trim the token output further with the parameter, which removes a listed component's tokens from the global preset. This is useful when you know your application will never use a given component and don't want to ship tokens for it. Since it's not so easy to find and list all of the components available in the package, it's preferable if you can just list all of the components you use. We expose the full component list as a variable, which you have access to once you ```scss @use "@infragistics/igniteui-angular/theming" as *; @@ -277,11 +280,9 @@ Some component themes depend on other component themes. Even if you exclude certain themes, they will be retained by the build if you use a component theme, which depends on an excluded theme.
-What does our build look like after we've excluded certain themes? - -Optimizing After Exclude +### Scoping a feature's custom theme to its lazy-loaded route -As you can see, our styles size is reduced to almost half it's original size. This looks pretty good at the moment, but can we reduce this even further? In fact, we can. Most of the styles size is taken by the largest components in the suite, in this case the `IgxTreeGridComponent` that we have in one of our views. However, we don't use this component in any other view. We can make the view with the `igx-tree-grid` a lazy-loaded route and we can include the theme for the grids only for that route, hence making our top-level css even smaller. How is this done? +Even with automatic tree-shaking, you'll often still want to keep **custom token overrides** for a component close to the one feature that uses them, instead of adding them to your global stylesheet where every view has to carry them. Say your `IgxTreeGridComponent` and `IgxComboComponent` instances, richly customized to match a specific design, are only used inside one "Employees" view and nowhere else in your app. Rather than defining their custom colors in the app-wide `styles.scss`, you can colocate those overrides with the feature itself by lazy-loading that view as its own route. We will start by creating a new module and a new routing module in the folder with the employees component in our app. @@ -353,15 +354,15 @@ export class AppRoutingModule { } ``` -Now we remove the `IgxTreeGridModule` and `IgxComboModule` imports, as well as the `EmployeesComponent` from our `app.module.ts` because we don't use the imports in any other views and we can have only one component declaration in all modules. +Now we remove the `IgxTreeGridModule` and `IgxComboModule` imports, as well as the `EmployeesComponent` declaration, from our `app.module.ts` because we don't use them in any other views and a component can only be declared in one module. -Then we will proceed by removing the `igx-grid`, `igx-grid-toolbar` and `igx-combo` from our theme includes, and we will include them on the `employees.component.scss` level. +Then we move the custom `igx-grid`, `igx-grid-toolbar`, and `igx-combo` themes out of the global stylesheet and colocate them with the component that uses them, in `employees.component.scss`. We use scoped mode because the components are excluded from the global `theme()` output below. CSS custom properties normally inherit through Emulated View Encapsulation; if a generated selector for a nested component does not match, wrap only that include in `::ng-deep` or move it to a global stylesheet: ```scss /* employees.component.scss */ @use "@infragistics/igniteui-angular/theming" as *; -:host ::ng-deep { +:host { height: 100%; display: flex; justify-content: flex-start; @@ -369,25 +370,46 @@ Then we will proceed by removing the `igx-grid`, `igx-grid-toolbar` and `igx-com align-content: flex-start; $primary: #1028c7; - @include core(); - - @include grid(grid-theme()); - - @include combo(combo-theme()); - @include grid-toolbar( + @include tokens( + grid-theme( + $schema: $dark-material-schema, + $background: #1a1a1a, + $foreground: #fff, + $accent-color: $primary + ), + $mode: 'scoped' + ); + + @include tokens( + combo-theme( + $schema: $dark-material-schema, + $toggle-button-background: $primary + ), + $mode: 'scoped' + ); + + @include tokens( grid-toolbar-theme( - $background-color: $primary, - ); + $schema: $dark-material-schema, + $background: $primary + ), + $mode: 'scoped' + ); } ``` +Because the Employees stylesheet now emits complete scoped themes, the top-level stylesheet can continue excluding `igx-grid`, `igx-combo`, and `igx-grid-toolbar` from its token output. It only emits global tokens for the shared components listed in `$include`: + ```scss /* Updated styles.scss */ @use "sass:map"; -@use "minireset.css/minireset"; @use "@infragistics/igniteui-angular/theming" as *; +@layer ig.reset { + @import "minireset.css"; +} + @include core(); @include typography($font-family: "Poppins"); @@ -411,7 +433,7 @@ $include: ( @include theme( $palette: $custom-palette, $schema: $dark-material-schema, - $exclude: map.keys(map.remove($components, $include...),) + $exclude: map.keys(map.remove($components, $include...)) ); ``` @@ -419,11 +441,7 @@ $include: ( You probably want to put all your variables, like color palette values in a separate `_variables.scss` file, which you can include from multiple components to reuse the variables.
-The result in terms of build is the following: - -Optimizing After Module Lazy Load - -As you can see, our top-level `styles.css` came down to a little over 70kb, which is a little less than 6kb when compressed. We started at ~428kb, ~40kb compressed and managed to bring this down about 7 times in terms of compressed size. The rest is being delivered only when the view containing the `igx-tree-grid` and `igx-combo` components is being loaded. +The result: the global stylesheet no longer carries color overrides that only matter for the Employees view, and since `IgxTreeGridComponent` and `IgxComboComponent` are now only imported by the lazy-loaded `EmployeesModule`, their structural styles are fetched together with that module's chunk — only when a user actually navigates to the Employees view, rather than on every page load. ## Additional Resources diff --git a/docs/angular/src/content/en/components/general/update-guide.mdx b/docs/angular/src/content/en/components/general/update-guide.mdx index ecd656e6af..ccaa6d9315 100644 --- a/docs/angular/src/content/en/components/general/update-guide.mdx +++ b/docs/angular/src/content/en/components/general/update-guide.mdx @@ -63,6 +63,65 @@ Unfortunately not all changes can be automatically updated. Changes below are sp For example: if you are updating from version 6.2.4 to 7.1.0 you'd start from the "From 6.x .." section apply those changes and work your way up: +## From 22.0.x to 22.1.x + +Ignite UI for Angular 22.1.0 finishes the migration to the `tokens()` mixin and moves component structural styles into each component's bundle. The `ng update` migration performs the following syntactic changes automatically: + +- Replaces the removed per-component Sass wrapper mixins (`avatar`, `badge`, `banner`, `card`, `dialog`, `tabs`, the grid and pivot mixins, and the rest of the previously deprecated wrappers) with `tokens()`. +- Removes calls to the deleted per-component `-typography` mixins, such as `badge-typography`, `dialog-typography`, and `checkbox-typography`. Typography is now applied through component tokens. See [Typography](/themes/sass/typography#component-typography) for component-specific overrides. +- Removes deep Sass imports of structural partials, such as `igniteui-angular/lib/core/styles/components/avatar/avatar-component`, and their matching `component()` calls. Structural styles now ship automatically with the component bundle. +- Renames direct imports and usages of `IgxDividerDirective` to `IgxDividerComponent`. `IgxDividerModule` is unaffected. + +Review migrated `tokens()` calls manually. The migration cannot determine whether a wrapper mixin represented an ordinary universal-token override or relied on component-local declarations. Keep the generated default mode unless testing or the theme's structure shows that local declarations are required. In that situational case, add `$mode: 'scoped'`: + +```scss +// Before +.my-avatar { + @include avatar(avatar-theme($background: red)); +} + +// After +.my-avatar { + @include tokens( + avatar-theme($background: red), + $mode: 'scoped' + ); +} +``` + +Start with the default global mode, including when replacing most `css-vars()` calls. If the component remains in the global `theme()` output, its local declarations can consume the universal tokens and no scoped mode is usually needed. + +Use scoped mode only when the default output does not provide the component-local declarations required by the customization. Typical cases include: + +- The removed wrapper established a complete local theme whose behavior is not preserved by universal token overrides alone. +- The component is listed in the global `theme()` mixin's `$exclude` list. In that case, the global theme does not emit the local declarations consumed by the component's structural stylesheet. +- The theme uses component-local sizing expressions. Global mode intentionally omits sizing values that depend on local sizing variables. +- The theme map contains multiple selectors, such as a component host and a ghost or overlay selector. Detached overlays must be themed from a selector that can match the overlay at its outlet, usually in a global stylesheet. +- The local theme changes the design system or light/dark variant. Pass the corresponding `$schema` to the component theme function so scoped mode emits the correct theme metadata. + +Do not add scoped mode indiscriminately. Keep the default global mode for ordinary `--ig--*` overrides, whether application-wide or restricted by a selector. The component must remain included in the global `theme()` output so its local declarations can consume those universal tokens: + +```scss +@include tokens( + avatar-theme( + $schema: $dark-material-schema, + $background: var(--ig-primary-500) + ) +); +``` + +Scoped mode does not universally remove the need for `::ng-deep`. Angular's Emulated View Encapsulation may still prevent selectors generated for nested or internal elements from matching. Preserve `::ng-deep` where testing shows it is required, or move that theme include to a global stylesheet. For a detached overlay, `::ng-deep` alone is insufficient; the theme must match or be inherited at the overlay outlet. + +Ignite UI styles now use the cascade order `ig.reset` → `ig.base` → the active design-system layer (`ig.material`, `ig.bootstrap`, `ig.fluent`, or `ig.indigo`) → `ig.derived`. If your application loads a reset or normalize stylesheet, place it in the lowest-precedence reset layer so it cannot override component styles: + +```scss +@layer ig.reset { + @import "minireset.css"; +} +``` + +For details, see [Component Themes](/themes/sass/component-themes) and [Global Themes](/themes/sass/global-themes#excluding-components). + ## From 21.1.x to 22.0.x Angular no longer ships the `HammerModule` for touch gestures. To keep touch interactions (pan, swipe, tap) working in Ignite UI for Angular components, load HammerJS as a global script via the `scripts` array in your `angular.json`: diff --git a/docs/angular/src/content/en/components/grid/groupby.mdx b/docs/angular/src/content/en/components/grid/groupby.mdx index 9a994871ac..a50375bc84 100644 --- a/docs/angular/src/content/en/components/grid/groupby.mdx +++ b/docs/angular/src/content/en/components/grid/groupby.mdx @@ -455,11 +455,7 @@ In order for the custom theme to affect only specific component, you can move al This way, due to Angular's [ViewEncapsulation](https://angular.io/api/core/Component#encapsulation), your styles will be applied only to your custom component. - - If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to penetrate this encapsulation using `::ng-deep` in order to style the components which are inside the grid. - - -In our example, we need to use `::ng-deep` for our chip theme: +Depending on where the grouped chips are rendered, Emulated View Encapsulation may prevent their token declarations from matching. If the chip theme does not take effect, use `::ng-deep` for that nested theme or move it to a global stylesheet: ```scss :host { diff --git a/docs/angular/src/content/en/components/icon.mdx b/docs/angular/src/content/en/components/icon.mdx index 48d5c73469..a5526ea516 100644 --- a/docs/angular/src/content/en/components/icon.mdx +++ b/docs/angular/src/content/en/components/icon.mdx @@ -206,7 +206,7 @@ On the top of your `server.ts` file, add: ## Styling -To get started with styling the icons, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the icons, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/layouts/avatar.mdx b/docs/angular/src/content/en/components/layouts/avatar.mdx new file mode 100644 index 0000000000..d0e1cd89bb --- /dev/null +++ b/docs/angular/src/content/en/components/layouts/avatar.mdx @@ -0,0 +1,296 @@ +--- +title: "Angular Avatar Component | Layouts | Infragistics" +description: "Use the Angular Avatar component to represent users, entities, or objects with images, initials, icons, or custom content." +keywords: "Angular Avatar, avatar component, profile image, initials, Ignite UI for Angular, Infragistics" +last_updated: "2026-07-29" +license: MIT +mentionedTypes: ["Avatar", "Badge", "Icon"] +relatedComponents: ["Badge"] +llms: + description: "The Ignite UI for Angular Avatar topic shows how to render user, entity, or object identity with images, initials, icons, custom content, shape, size, styling, and accessibility guidance." +--- +import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; +import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import avatarAnatomy from '@xplat-images/anatomy-content-light/avatar-lt-a.png'; +import avatarDo from '@xplat-images/avatar/avatar_do1.png'; +import avatarDo2x from '@xplat-images/avatar/avatar_do1@2x.png'; +import avatarDoNot from '@xplat-images/avatar/avatar_do_not1.png'; +import avatarDoNot2x from '@xplat-images/avatar/avatar_dont1@2x.png'; + +# Avatar Component + +The Ignite UI for Angular Avatar represents a user, entity, or object with an image, initials, or custom content. + +Use the avatar to provide a compact visual identity in lists, cards, profile menus, and activity feeds. + +## Live Demo + + + +## Anatomy + +The avatar is a single host element that applies image semantics and renders one of the supported content patterns. + + + + + +1. Image container: Displays image content type.
+2. Icon container: Displays icon content type.
+3. Initials container: Displays text content type.
+ +```text +igx-avatar[role="img"] // host - exposes the avatar +└─ one of, by priority: + ├─ div.igx-avatar__image // `src` set - image painted as a background + ├─ igx-icon // `icon` set + ├─ span // `initials` set - first two characters + └─ ng-content // custom projected content +``` + +## Getting Started + +Import the Angular avatar component before you render ``. If you have not set up Ignite UI for Angular yet, complete the shared [Getting Started](../general/getting-started.mdx) topic first. + +```ts +import { IgxAvatarComponent } from 'igniteui-angular/avatar'; +``` + +## Usage + +Render an avatar with an image source, initials, or custom content in the default slot. + +### Variants + +Set only the content source you intend to show. The Angular avatar renders `src` first, then `icon`, then `initials`, and falls back to projected custom content when none of those inputs are set. + +```html + + + + + +``` + + + +### Shape + +Set to `square`, `rounded`, or `circle`. + +```html + +``` + + + +### Size + +Set `--ig-size` to one of the shared size tokens when you need a preset avatar size. + +```html + +``` + + + +### Do/Don't + +**When to use:** Use the avatar when a UI needs a small representation of a person, organization, object, or account, such as a profile image, initials, or an icon. Keep a consistent avatar strategy within the same UI region so repeated identities are easy to scan. + +**When not to use:** Use the [Badge](../inputs/badge.mdx) component when you need to show a count, status, or notification indicator instead of representing an entity. Badges can also decorate avatars when both identity and status need to appear together. + +
+ + + + + + + + + + + + + +
DoDon't
Angular Avatar do guidanceAngular Avatar don't guidance
+
+ +## Properties + +The avatar exposes a small set of inputs for its content and shape. + +| Name | Type | Default | Description | +| -- | -- | -- | -- | +| | `string` | n/a | Sets the icon rendered by the avatar. | +| | `string` | n/a | Sets text initials rendered by the avatar. | +| | `"square" \| "rounded" \| "circle"` | `"square"` | Sets the avatar shape. | +| | `"small" \| "medium" \| "large"` | `"small"` | Sets the avatar size. | +| | `string` | n/a | Sets the image source URL. | + +## Styling + + + +The avatar appearance is controlled through theme variables and platform-specific styling hooks. + +Use the avatar CSS variables for token-level changes and Angular host classes when you need to target a specific rendered type or shape. + +| Variable | What it changes | +| -- | -- | +| `--ig-avatar-background` | Avatar background color. | +| `--ig-avatar-color` | Text and initials color. | +| `--ig-avatar-icon-color` | Icon color. | +| `--ig-avatar-border-radius` | Border radius used by rounded avatars. | +| `--ig-avatar-size` | Avatar width and height. | +| `--ig-size` | Shared component size token used to derive preset avatar sizes. | + +| Selector | Description | +| -- | -- | +| `igx-avatar` | The avatar host element. | +| `.igx-avatar--rounded` | Applied when `shape` is `rounded`. | +| `.igx-avatar--circle` | Applied when `shape` is `circle`. | +| `.igx-avatar--image` | Applied when the avatar renders an image. | +| `.igx-avatar--icon` | Applied when the avatar renders an icon. | +| `.igx-avatar--initials` | Applied when the avatar renders initials. | +| `.igx-avatar__image` | The image avatar element. | + +### Sass Theming + +Use the function when your application customizes Ignite UI themes through Sass. + +```scss +@use "igniteui-angular/theming" as *; + +$custom-avatar-theme: avatar-theme( + $background: #72da67, + $border-radius: 16px, + $size: 3rem +); + +:root { + @include tokens($custom-avatar-theme); +} +``` + +### CSS Variables + +Set component CSS variables directly when you need local styling without a Sass build step. + +```css +igx-avatar { + --ig-avatar-background: var(--ig-success-500); + --ig-avatar-color: var(--ig-success-500-contrast); + --ig-avatar-border-radius: 20px; +} +``` + +### Styling with Tailwind + +Use the Angular Tailwind utility syntax when your application styles Ignite UI components through Tailwind classes. + + + +## Accessibility + +The avatar is a non-interactive identity visual with accessible image semantics. + +### Keyboard Interaction + +The avatar does not receive focus and has no keyboard interaction. + +| Key | Action | +| -- | -- | +| n/a | The avatar is not keyboard interactive. | + +### Screen Readers / ARIA + +The avatar initializes with image semantics and a default accessible label of `avatar`. + +- Use surrounding text to identify the represented person, entity, or object when an image avatar conveys identity. +- Treat decorative avatars as redundant when adjacent text already identifies the same entity. + +### Accessibility Compliance + +Infragistics documents Ignite UI for Angular accessibility support for Section 508 and WCAG 2.1 guideline areas in the [Accessibility Compliance](../interactivity/accessibility-compliance.mdx) topic. + +| Criterion | How the component complies | +| -- | -- | +| [1.1.1 Non-text Content](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content) | The avatar has an accessible label and can be paired with surrounding text that identifies the represented entity. | +| [4.1.2 Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value) | The component initializes with `role="img"` and a default accessible label. | + +Your responsibilities: + +- Keep sufficient contrast between the avatar background and text or icon color when overriding styles. +- Avoid duplicating the same identity announcement when adjacent text already names the person or entity. + +- Make sure nearby text identifies the represented entity when the avatar image conveys identity. + +## Troubleshooting + +Use this section to check boundaries and common decisions before treating Avatar as an interactive or status component. + +### Known Limitations + +The avatar is a visual identity primitive and does not add interaction, status, or notification behavior by itself. + +- Use an interactive container, such as a button or list item, when the represented entity must be clickable. +- Use a badge with the avatar when you need to show status, counts, or notification indicators. + +## API References + +Use these API references for the complete avatar API surface. + + + +## Dependencies + +The Sass styling workflow uses the and APIs. + +## Additional Resources + +Use these resources for support and related Ignite UI documentation. + +- [Ignite UI for Angular **Forums**](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) +- [Ignite UI for Angular **GitHub**](https://github.com/IgniteUI/igniteui-angular) + +## Related Components + +Use these related components when identity needs to be combined with status, actions, or richer layout. + +- [Badge](../inputs/badge.mdx) - Use Badge to show counts, status, or notification indicators. Badge can decorate Avatar when the UI needs both identity and status. + +## FAQ + + + + Use Avatar when the UI needs to represent a person, account, organization, or object. Use Badge when the UI needs to show a count, status, or notification indicator. + + + + No. Avatar is non-interactive and does not receive focus by itself. Put it inside an interactive component when the represented entity needs an action. + + + + Provide meaningful alternative text when the avatar image identifies a specific entity. Avoid repeating the same identity when adjacent text already names that entity. + + diff --git a/docs/angular/src/content/en/components/linear-progress.mdx b/docs/angular/src/content/en/components/linear-progress.mdx index 9a6f32fba3..869bde3b89 100644 --- a/docs/angular/src/content/en/components/linear-progress.mdx +++ b/docs/angular/src/content/en/components/linear-progress.mdx @@ -253,7 +253,7 @@ After completing the steps above, our progress bar should look like this: ## Styling -To get started with styling the linear progress bar, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the linear progress bar, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/list.mdx b/docs/angular/src/content/en/components/list.mdx index c8d30218f8..bbc09c7109 100644 --- a/docs/angular/src/content/en/components/list.mdx +++ b/docs/angular/src/content/en/components/list.mdx @@ -17,7 +17,7 @@ The Ignite UI for Angular List component displays rows of items and supports one ## Angular List Example -The following example represents a list populated with contacts with a _name_ and a _phone number_ properties. The component uses [`igx-avatar`](/avatar) and [`igx-icon`](/icon) to enrich the user experience and expose the capabilities of setting avatar picture and different icon for _favorite a contact_. In addition, the List View expose sorting capabilities achieved by using our filtering pipe. +The following example represents a list populated with contacts with a _name_ and a _phone number_ properties. The component uses [`igx-avatar`](layouts/avatar.mdx) and [`igx-icon`](/icon) to enrich the user experience and expose the capabilities of setting avatar picture and different icon for _favorite a contact_. In addition, the List View expose sorting capabilities achieved by using our filtering pipe. @@ -210,7 +210,7 @@ After all that our Angular list should now look like that: ### Adding Avatar and Icons -We can use some of our other components in conjunction with the component to enrich the experience and add some functionality. We can have a nice picture avatar to the left of the name and phone values. Additionally, we can add a star icon to the right of them to allow the user to favorite a contact. To do that let's grab the [**IgxAvatar**](/avatar) and [**IgxIcon**](/icon) modules and import them in our app.module.ts file. +We can use some of our other components in conjunction with the component to enrich the experience and add some functionality. We can have a nice picture avatar to the left of the name and phone values. Additionally, we can add a star icon to the right of them to allow the user to favorite a contact. To do that let's grab the [**IgxAvatar**](layouts/avatar.mdx) and [**IgxIcon**](/icon) modules and import them in our app.module.ts file. ```typescript // app.module.ts @@ -300,7 +300,7 @@ toggleFavorite(item: IgxListItem) { } ``` -Let's also allow the user to choose the size of the list by using the `--ig-size` CSS custom property. We will do this by importing the `IgxButtonGroupModule` and using the [**IgxButtonGroup**](/button-group) to display all size values. This way whenever one gets selected, we will update the **size** of the list. +Let's also allow the user to choose the size of the list by using the `--ig-size` CSS custom property. We will do this by importing the `IgxButtonGroupModule` and using the [**IgxButtonGroup**](/components/inputs/button-group) to display all size values. This way whenever one gets selected, we will update the **size** of the list. ```typescript // app.module.ts diff --git a/docs/angular/src/content/en/components/month-picker.mdx b/docs/angular/src/content/en/components/month-picker.mdx index e4c4470297..14c72af8f5 100644 --- a/docs/angular/src/content/en/components/month-picker.mdx +++ b/docs/angular/src/content/en/components/month-picker.mdx @@ -183,7 +183,7 @@ Here is an example of localizing and formatting the month picker component: ## Styling -To get started with styling the month picker, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the month picker, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/navbar.mdx b/docs/angular/src/content/en/components/navbar.mdx index a842d9d4c6..031c8324ce 100644 --- a/docs/angular/src/content/en/components/navbar.mdx +++ b/docs/angular/src/content/en/components/navbar.mdx @@ -286,7 +286,7 @@ When you modify a primary property, all related dependent properties are automat | | $border-color (changes for indigo variant only) | The navbar border color | | **$idle-icon-color** | $hover-icon-color | The navbar hover icon color | -To get started with styling the navbar, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the navbar, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/navdrawer.mdx b/docs/angular/src/content/en/components/navdrawer.mdx index 4095832577..35d11f14bb 100644 --- a/docs/angular/src/content/en/components/navdrawer.mdx +++ b/docs/angular/src/content/en/components/navdrawer.mdx @@ -455,7 +455,7 @@ The example below presents the capabilities of a hierarchical structure by using ## Styling -To get started with styling the navigation drawer, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the navigation drawer, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -485,7 +485,7 @@ The last step is to **include** the component theme in our application. ``` -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to apply the styles. +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss diff --git a/docs/angular/src/content/en/components/overlay-styling.mdx b/docs/angular/src/content/en/components/overlay-styling.mdx index e598be8079..a418b0766a 100644 --- a/docs/angular/src/content/en/components/overlay-styling.mdx +++ b/docs/angular/src/content/en/components/overlay-styling.mdx @@ -25,7 +25,7 @@ To display the content above other elements, the service moves it into a special ## Styling Overlay Components -In most cases [global](/themes/sass/global-themes) theme styles are not affected by the overlay outlets. For example, let's take a look at a Drop Down, [styled](/drop-down#styling) by the mixin: +A theme emitted from the global stylesheet can affect content in any overlay outlet. For example, the following [Drop Down](/drop-down#styling) theme emits universal token overrides at the Sass root, where they are available to drop-down content attached to the document body: ```html {/* overlay-styling.component.html */} @@ -37,27 +37,23 @@ In most cases [global](/themes/sass/global-themes) theme styles are not affected ``` ```scss +// styles.scss @use "igniteui-angular/theming" as *; -// IMPORTANT: Prior to Ignite UI for Angular version 13 use: -// @import '~igniteui-angular/lib/core/styles/themes/index'; - $my-drop-down-theme: drop-down-theme( $background-color: #efefef ); -:host { - @include tokens($my-drop-down-theme); -} +@include tokens($my-drop-down-theme); ``` -The global styles are not generated under a scoped rule and are not affected by any encapsulation, and thus can match any element on the page, including `igx-drop-down-item` the service moved to the overlay outlet. +Because these universal overrides are global, the drop-down content can consume them after the overlay service moves it to an outlet. ## Scoped Component Styles -When scoping styles for elements that are displayed in the overlay, we need to specify to the position of the overlay `outlet` in the DOM. CSS rules that are scoped require a specific hierarchical structure of the elements - we need to make sure the overlay content is displayed in the correct context of the styles we want to apply. +A local theme can only affect overlay content that inherits from its container or matches its generated selectors. Content attached to the default outlet at the end of `body` is not a descendant of the component that opened it. -For example, let's take the `igx-combo` - its item [styles](/combo#styling) use the `igx-drop-down` theme, because the combo defines its content inside of its own view. +For example, the `igx-combo` item [styles](/combo#styling) use the drop-down theme. This component-local theme takes effect after the combo outlet is moved beneath the host: ```scss // overlay-styling.component.scss @@ -67,20 +63,11 @@ For example, let's take the `igx-combo` - its item [styles](/combo#styling) use } ``` - -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to apply the styles. + +`::ng-deep` does not make tokens inherit into a detached outlet. Either emit the overlay theme globally or move the outlet beneath the themed container. If a special customization uses scoped mode and its generated selectors still cannot match the nested overlay content, `::ng-deep` may also be required after moving the outlet. -```scss -// overlay-styling.component.scss -:host { - ::ng-deep { - @include tokens($my-drop-down-theme); - } -} -``` - -The items in our combo's list **are not** descendants of our component `host` - they are currently being displayed in the default overlay outlet, at the end of the document's body. You can change this by using the property in the `overlaySettings`. The `outlet` controls where the overlay container should be rendered. +Use the property to control where the overlay container is rendered. Here, we can pass a reference to the element where we'd like our container to be: @@ -118,30 +105,14 @@ $my-overlay-theme: overlay-theme( $background-color: rgba(0, 153, 255, 0.3) ); -:host { - @include tokens($my-overlay-theme); -} +@include tokens($my-overlay-theme); ``` -Now **all** modal overlays will have a purple tint to their background. - - -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to apply the styles. - - -```scss -// overlay-styling.component.scss -:host { - ::ng-deep { - @include tokens($my-overlay-theme); - } -} -``` +Now **all** modal overlays will have a purple tint. Because this theme is emitted globally, Angular View Encapsulation and `::ng-deep` are not involved. ### Scoped Overlay Styles -If we want our overlay to have a specific background **only** under a certain component, we can [scope the theme](#scoped-overlay-styles). -When scoping a modal overlay, you need to move the overlay outlet, which has some [limitations](/overlay#assumptions-and-limitations). In order to minimize the risks of overflow clipping, z-index and viewport issues, we recommend using outlets for modal overlays only in higher level components: +To give an overlay a specific background only beneath a certain container, move its outlet under that container and scope the theme there. Custom outlets have some [limitations](/overlay#assumptions-and-limitations); to reduce overflow clipping, stacking, and viewport issues, use them in higher-level components: ```scss // styles.scss diff --git a/docs/angular/src/content/en/components/pivotgrid/pivot-grid.mdx b/docs/angular/src/content/en/components/pivotgrid/pivot-grid.mdx index 5915e36ef2..5a74dd2461 100644 --- a/docs/angular/src/content/en/components/pivotgrid/pivot-grid.mdx +++ b/docs/angular/src/content/en/components/pivotgrid/pivot-grid.mdx @@ -330,7 +330,7 @@ The Pivot Grid can be styled through the [`Ignite UI for Angular Theme Library`] ### Importing global theme -To get started with styling the Pivot Grid, you first need to import the `index` file, where all the theme functions and component mixins are located: +To get started with styling the Pivot Grid, you first need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/query-builder.mdx b/docs/angular/src/content/en/components/query-builder.mdx index ba389e23eb..100b416b31 100644 --- a/docs/angular/src/content/en/components/query-builder.mdx +++ b/docs/angular/src/content/en/components/query-builder.mdx @@ -291,7 +291,7 @@ When you modify a primary property, all related dependent properties are automat | | $separator-color | The separator color of the query block | | | $header-border (Bootstrap only) | The border color of the query builder header | -To get started with styling the Query Builder, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the Query Builder, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -357,7 +357,7 @@ The last step is to **include** the new component themes using the `tokens` mixi ``` -If the component is using an [`Emulated`](./themes/sass/component-themes.mdx#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to style the components inside the query builder component (button, chip, drop-down ...etc). +Token overrides normally inherit through Emulated View Encapsulation, but generated selectors for nested query builder controls may still require `::ng-deep`. If the local theme does not take effect, wrap that include in `::ng-deep` or move it to a global stylesheet. If a drop-down is attached to a detached overlay outlet, emit its theme from a selector that can match the outlet or configure the outlet beneath the themed container. ### Demo diff --git a/docs/angular/src/content/en/components/radio-button.mdx b/docs/angular/src/content/en/components/radio-button.mdx index ec4aea6890..2b65760caa 100644 --- a/docs/angular/src/content/en/components/radio-button.mdx +++ b/docs/angular/src/content/en/components/radio-button.mdx @@ -165,7 +165,7 @@ When you modify a primary property, all related dependent properties are automat | **$error-color** | $error-color-hover | Label, border, and dot color in invalid state on hover | | | $focus-outline-color-error | Focus outline color in invalid state | -To get started with styling the radio buttons, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the radio buttons, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/select.mdx b/docs/angular/src/content/en/components/select.mdx index 26b232926e..e09e56e3a2 100644 --- a/docs/angular/src/content/en/components/select.mdx +++ b/docs/angular/src/content/en/components/select.mdx @@ -92,7 +92,6 @@ Add the `igx-select` along with a list of items to choose from. We use ``` - This component uses Material Icons. Add the following link to your `index.html`: `` @@ -394,7 +393,7 @@ To get the Select component styled, you have to style its containing components. Take a look at the [`Input Group`](/input-group#styling) and the [`Drop Down`](/drop-down#styling) styling sections to get a better understanding of how to style those two components. We also have a function which is used only for styling the button of our Select component.
-To get started with styling the Select component button, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the Select component button, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/simple-combo.mdx b/docs/angular/src/content/en/components/simple-combo.mdx index 7c56763c52..502659acde 100644 --- a/docs/angular/src/content/en/components/simple-combo.mdx +++ b/docs/angular/src/content/en/components/simple-combo.mdx @@ -372,7 +372,7 @@ The last step is to include the component's theme. ``` -The component uses the [`IgxOverlay`](/overlay) service to hold and display the simple combobox items list container. To properly scope your styles you might have to use an . For more details check the [`IgxOverlay Styling Guide`](/overlay-styling). Also is necessary to use `::ng-deep` when we are styling the components. +The uses the [`IgxOverlay`](/overlay) service to display its list. Depending on View Encapsulation and where the generated selectors must match, the local theme include may still require `::ng-deep`. A list attached to the default detached outlet also cannot inherit from the combo's host; configure the beneath the themed container or emit the theme from a selector that can match the outlet. See the [`IgxOverlay Styling Guide`](/overlay-styling). [!Note] The default `type` of the `IgxSimpleCombo` is `box` unlike the [`IgxSelect`](/select) where it is `line`. diff --git a/docs/angular/src/content/en/components/snackbar.mdx b/docs/angular/src/content/en/components/snackbar.mdx index f1503f4655..f2ec4f962b 100644 --- a/docs/angular/src/content/en/components/snackbar.mdx +++ b/docs/angular/src/content/en/components/snackbar.mdx @@ -225,7 +225,6 @@ Let’s create a list with contacts that can be deleted. When an item is deleted ``` - This component uses Material Icons. Add the following link to your `index.html`: `` @@ -315,7 +314,7 @@ When you modify a primary property, all related dependent properties are automat -To get started with styling the snackbar, we need to import the index file, where all the theme functions and component mixins live: +To get started with styling the snackbar, we need to import the index file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/splitter.mdx b/docs/angular/src/content/en/components/splitter.mdx index c1b0dc6210..4f71911252 100644 --- a/docs/angular/src/content/en/components/splitter.mdx +++ b/docs/angular/src/content/en/components/splitter.mdx @@ -238,7 +238,7 @@ When you modify a primary property, all related dependent properties are automat -To get started with styling the **igxSplitter** component, you need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the **igxSplitter** component, you need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/stepper.mdx b/docs/angular/src/content/en/components/stepper.mdx index 55f11b5347..f68d0fa975 100644 --- a/docs/angular/src/content/en/components/stepper.mdx +++ b/docs/angular/src/content/en/components/stepper.mdx @@ -261,7 +261,7 @@ When the orientation is set to vertical layout the title position by default is If you want to display only indicators for the steps, set the option to `indicator`. -The step indicator supports any content, however with the restriction that its size would be always **24 pixels**. Having this in mind, we recommend using [IgxIconComponent](/icon) or [IgxAvatarComponent](/avatar) as step indicators. +The step indicator supports any content, however with the restriction that its size would be always **24 pixels**. Having this in mind, we recommend using [IgxIconComponent](/icon) or [IgxAvatarComponent](layouts/avatar.mdx) as step indicators. **Title** diff --git a/docs/angular/src/content/en/components/style-guide.mdx b/docs/angular/src/content/en/components/style-guide.mdx index c39c5e40fc..3cad637e6c 100644 --- a/docs/angular/src/content/en/components/style-guide.mdx +++ b/docs/angular/src/content/en/components/style-guide.mdx @@ -154,10 +154,8 @@ Structured statements like for `x =1 to 10` loop structures -To get started with styling the switch, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the switch, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/tabbar.mdx b/docs/angular/src/content/en/components/tabbar.mdx index 8f48ce11e2..4d6581ed51 100644 --- a/docs/angular/src/content/en/components/tabbar.mdx +++ b/docs/angular/src/content/en/components/tabbar.mdx @@ -441,7 +441,7 @@ When you modify a primary property, all related dependent properties are automat -To get started with styling the tabs, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the tabs, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/tabs.mdx b/docs/angular/src/content/en/components/tabs.mdx index bd31fb40a7..22cbc9fd6e 100644 --- a/docs/angular/src/content/en/components/tabs.mdx +++ b/docs/angular/src/content/en/components/tabs.mdx @@ -504,7 +504,7 @@ When you modify a primary property, all related dependent properties are automat -To get started with styling the tabs, we need to import the theming module, where all the theme functions and component mixins live: +To get started with styling the tabs, we need to import the theming module, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/texthighlight.mdx b/docs/angular/src/content/en/components/texthighlight.mdx index 97ce58639c..05e1ee885a 100644 --- a/docs/angular/src/content/en/components/texthighlight.mdx +++ b/docs/angular/src/content/en/components/texthighlight.mdx @@ -356,7 +356,7 @@ export class HomeComponent { ## Styles -The directive can be styled in terms of changing the color and the background of all occurrences of the given string. To get started, we need to import the `index` file, where all the theme functions and component mixins live: +The directive can be styled in terms of changing the color and the background of all occurrences of the given string. To get started, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -387,7 +387,7 @@ The last step is to **include** the newly created theme. ``` -If the component is using an [`Emulated`](./themes/sass/component-themes.mdx#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to apply the styles. +Token overrides normally inherit through Emulated View Encapsulation, but generated selectors and the custom CSS selectors in the next example may still require `::ng-deep` when they target highlight elements created outside the component's own template. ### Custom styles diff --git a/docs/angular/src/content/en/components/themes/misc/angular-material-theming.mdx b/docs/angular/src/content/en/components/themes/misc/angular-material-theming.mdx index 048e551909..0ba0614b6a 100644 --- a/docs/angular/src/content/en/components/themes/misc/angular-material-theming.mdx +++ b/docs/angular/src/content/en/components/themes/misc/angular-material-theming.mdx @@ -87,7 +87,7 @@ Clicking on the `More` buttons, you will see the -Next, we have added an showing information about some credit cards. Inside its content, there are [`mat-sliders`](https://material.angular.io/components/slider/overview), an and a [`mat-stepper`](https://material.angular.io/components/stepper/overview) with [`mat-form-fields`](https://material.angular.io/components/form-field/overview). +Next, we have added an showing information about some credit cards. Inside its content, there are [`mat-sliders`](https://material.angular.io/components/slider/overview), an and a [`mat-stepper`](https://material.angular.io/components/stepper/overview) with [`mat-form-fields`](https://material.angular.io/components/form-field/overview). Ignite UI for Angular Expansion Panel @@ -414,7 +414,7 @@ Related topics: - [Palettes](../sass/palettes.mdx) - [Component Themes](../sass/component-themes.mdx) - [Typography](../sass/typography.mdx) -- [Avatar Component](../../avatar.mdx) +- [Avatar Component](../../layouts/avatar.mdx) - [Button Component](../../button.mdx) - [Dialog Component](../../dialog.mdx) - [Icon Component](../../icon.mdx) diff --git a/docs/angular/src/content/en/components/themes/misc/bootstrap-theming.mdx b/docs/angular/src/content/en/components/themes/misc/bootstrap-theming.mdx index 27282e7fd7..8e684acf91 100644 --- a/docs/angular/src/content/en/components/themes/misc/bootstrap-theming.mdx +++ b/docs/angular/src/content/en/components/themes/misc/bootstrap-theming.mdx @@ -104,7 +104,7 @@ Finally, we inserted an Ignite UI for Angular `icon button` in the top right cor ## Styling -To get started with styling components using the Ignite UI theming engine, create an scss file named of your choice that would be the base file for your global theme. We will call this file `_variables.scss`. Next, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling components using the Ignite UI theming engine, create an scss file named of your choice that would be the base file for your global theme. We will call this file `_variables.scss`. Next, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss // _variables.scss @@ -367,7 +367,7 @@ Ignite UI for Angular exposes four default type scales for each of its themes, w - [Palettes](/themes/sass/palettes) - [Component Themes](/themes/sass/component-themes) - [Typography](/themes/sass/typography) -- [Avatar Component](/avatar) +- [Avatar Component](../../layouts/avatar.mdx) - [Button Component](/button) - [Dialog Component](/dialog) - [Icon Component](/icon) diff --git a/docs/angular/src/content/en/components/themes/roundness.mdx b/docs/angular/src/content/en/components/themes/roundness.mdx index b0ef36f9cc..36eb3f72e4 100644 --- a/docs/angular/src/content/en/components/themes/roundness.mdx +++ b/docs/angular/src/content/en/components/themes/roundness.mdx @@ -20,7 +20,7 @@ Many Ignite UI components have predefined minimum and maximum border-radius valu When you set `--ig-radius-factor` to 0, the component uses its minimum border-radius and will appear more block-like with sharp corners. When set to 1, the component uses its maximum predefined border-radius and will appear rounded. Here is a list of the components that have predefined minimum and maximum border-radius values and can be modified using the `--ig-radius-factor` variable:
-• [Action Strip](/action-strip) • [Button](/button) • [Button Group](/button-group) • [Calendar](/calendar) • [Card](/card) • [Carousel](/carousel) • [Checkbox](/checkbox) • [Chip](/chip) • [Combo](/combo) • [Date Picker](/date-picker) • [Date Range Picker](/date-range-picker) • [Grid](/grid/grid) • [Input Group](/input-group) • [Linear Progress](/linear-progress) • [List](/list) • [Month Picker](/month-picker) • [Navigation Drawer](/navdrawer) • [Radio](/radio-button) • [Ripple](/ripple) • [Snackbar](/snackbar) • [Switch](/switch) • [Toast](/toast) +• [Action Strip](/action-strip) • [Button](/button) • [Button Group](/components/inputs/button-group) • [Calendar](/calendar) • [Card](/card) • [Carousel](/carousel) • [Checkbox](/checkbox) • [Chip](/chip) • [Combo](/combo) • [Date Picker](/date-picker) • [Date Range Picker](/date-range-picker) • [Grid](/grid/grid) • [Input Group](/input-group) • [Linear Progress](/linear-progress) • [List](/list) • [Month Picker](/month-picker) • [Navigation Drawer](/navdrawer) • [Radio](/radio-button) • [Ripple](/ripple) • [Snackbar](/snackbar) • [Switch](/switch) • [Toast](/toast) ## Usage diff --git a/docs/angular/src/content/en/components/themes/sass/component-themes.mdx b/docs/angular/src/content/en/components/themes/sass/component-themes.mdx index 7be732493b..96015b4205 100644 --- a/docs/angular/src/content/en/components/themes/sass/component-themes.mdx +++ b/docs/angular/src/content/en/components/themes/sass/component-themes.mdx @@ -6,6 +6,7 @@ llms: description: "Component themes allow you to change the styles of specific component instances by overriding the globally defined theme." --- import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; # Component Themes @@ -17,12 +18,7 @@ Component themes allow you to change the styles of specific component instances
-Before we dig deep into how you can create component-level themes, let's take a few moments to talk about how Ignite UI for Angular approaches component theming. Because we want to be able to support older browsers, like IE11, we have two completely different approaches for theming components. - -- The first approach is to style component instances using [CSS variables](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_variables). By using CSS variables we gain the ability to create component themes without replicating their styles over and over again. Also, this approach allows us to modify the value of the CSS variables at runtime. -- The second approach is to create a new set of CSS rules that overwrite any previously declared CSS rules for a specific component. This approach is pretty straight-forward, and it is the only way we can provide sensible theming support for older browser, albeit it is not ideal as it adds a lot of additional CSS rules to the generated CSS theme. - -We'll take a look at how these approaches work in practice, and how to use one instead of the other when generating component-level themes. +Ignite UI for Angular component themes use CSS custom properties. Each component ships its structural CSS in its own bundle, while Sass theme functions and the `tokens()` mixin generate the design-token values consumed by those styles. This keeps component CSS tree-shakable and lets applications override themes at runtime without regenerating structural rules. @@ -30,16 +26,16 @@ We'll take a look at how these approaches work in practice, and how to use one i
-There are several parts to a component theme: +A component theme has two parts: -- **The component theme function** - A Sass function that normalizes the passed arguments and produces a theme to be consumed by a component mixin. -- **The Tokens mixin** - A Sass mixin that consumes a component theme that generates CSS variable tokens from an Ignite UI component theme. -- **The component mixin** - A Sass mixin that consumes a component theme and produces _CSS rules_ used to style a particular component. +- **The component theme function** — normalizes the supplied values and returns a theme map. +- **The `tokens()` mixin** — consumes that map and emits CSS custom properties in global or scoped mode. +The old per-component wrapper mixins no longer exist as of Ignite UI for Angular 22.1.0. Use `tokens()` for every component theme. ### The tokens mixin -Using the `tokens` mixin is the preferred way to customize your components. It generates CSS custom properties (`design tokens`) from an Ignite UI component theme in either global or scoped mode. +The mode determines whether `tokens()` emits universal overrides or the complete local variables consumed by a component's structural stylesheet. **Global mode (default)** — emits universal `--ig-{component}-{property}` tokens. Local var() references are rewritten to their global equivalents so derived values (e.g., `adaptive-contrast`) resolve correctly at any scope. Sizable expressions are skipped, you have to pass concrete values instead. @@ -54,7 +50,7 @@ Using the `tokens` mixin is the preferred way to customize your components. It g } ``` -**Scoped mode** — emits component-scoped variables `--{property}` with a fallback chain: configured prefix `(--igx-*) -> universal (--ig-*) -> schema default`. When called from the stylesheet root, the theme's selector is used to create the rule. When called inside a selector, both the current selector and the component selector receive the variables. +**Scoped mode** — emits component-local variables (`--{property}`) with a fallback chain from the configured prefix (`--igx-*`) to universal tokens (`--ig-*`) and finally the schema default. When called from the stylesheet root, the theme map's selector is used. When called inside another selector, declarations are emitted for the current selector and the component selector. ```scss // Input (from root): @@ -80,8 +76,7 @@ igx-avatar { } ``` -Say you want to create a new global avatar theme that has a different background color to the one we set in the avatar's default theme. As mentioned in the [**overview section**](#overview) there are 2 general approaches to creating a component theme. -There are even more ways you can organize and scope your component themes. The most straightforward way to do that is in the same file you defined your [**global theme**](/themes/sass/global-themes). +Use the default global mode for universal overrides that should apply application-wide or be inherited by multiple component instances. The component must remain included in the global [`theme()`](/themes/sass/global-themes) output so its local declarations can consume the universal tokens. Defining an avatar theme: @@ -91,36 +86,33 @@ $avatar-purple-theme: avatar-theme( $background: purple, ); -// Pass the theme to the `tokens` mixin -:root { - @include tokens($avatar-purple-theme); -} +// Pass the theme to tokens() in its default global mode. +@include tokens($avatar-purple-theme); ``` -The above code produces CSS variables for the `igx-avatar` component. These new CSS variables overwrite the default avatar rules. -Similarly, if you were to include `tokens` mixin later down in the global `scss` file, the mixin will again overwrite any previously defined themes. +The code emits universal `--ig-avatar-*` overrides at `:root`. If another global `tokens()` call for the avatar appears later, normal cascade order makes the later values win. For instance: ```scss // ... -:root { - @include tokens($avatar-purple-theme); -} +@include tokens($avatar-purple-theme); // Later $avatar-royalblue-theme: avatar-theme( $background: royalblue, ); -:root { - @include tokens($avatar-royalblue-theme); -} +@include tokens($avatar-royalblue-theme); ``` In the above code, the de facto global theme is now the `$avatar-royalblue-theme` as it overwrites any previously included `tokens` mixins. -This brings us to our next point. +Use `$mode: 'scoped'` only when the theme must emit component-local declarations that are not already supplied by the global theme. Typical cases include components excluded from `theme()`, component-local sizing expressions, theme maps whose multiple selectors need local declarations, and themes that establish a different schema or light/dark variant. Pass that variant's `$schema` to the component theme function. + +Do not select scoped mode merely because `tokens()` is nested in a selector or replaces a `css-vars()` call. If the component remains in the global `theme()` output, default global mode usually provides the intended override through the universal-token fallback chain. Use scoped mode only after determining that the customization depends on declarations the default mode does not emit. + +Detached overlays do not inherit token overrides from the component that opened them. Emit the override globally or move the outlet beneath the themed container. Use scoped mode only if the overlay customization also requires component-local declarations that the global theme does not provide. See [Overlay Styling](/overlay-styling). @@ -158,6 +150,24 @@ In a component template: +## Cascade Layers + +
+ +Structural styles, design-system overrides, and derived/contextual tokens are split across component bundles and the global preset. Ignite UI declares them in the following [cascade layer](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) order: `ig.reset` → `ig.base` → `ig.material`/`ig.bootstrap`/`ig.fluent`/`ig.indigo` → `ig.derived`. A later layer wins over an earlier one regardless of bundle load order. + +Wrap a third-party reset or normalize stylesheet in `ig.reset` so it cannot override component or typography styles: + +```scss +@layer ig.reset { + @import "minireset.css"; +} +``` + + +Unlayered application rules take precedence over Ignite UI's layered rules. Keep ordinary application overrides unlayered unless you intentionally want them to participate in the Ignite UI layer order. + + ## View Encapsulation
@@ -205,7 +215,9 @@ $avatar-royalblue-theme: avatar-theme( } ``` -When using CSS variables, we don't have to use the `::ng-deep` pseudo-selector. With the code above we've created CSS variables for the `igx-avatar`, which will always have `royalblue` as its background color. The theme for our custom avatar will not 'leak' into other `igx-avatar` component instances, thus staying encapsulated within our custom `app-avatar` component. +The universal avatar tokens are declared on this host and inherited by its avatar. Angular's generated encapsulation attributes can still prevent selectors emitted by more complex component themes from matching nested or internal elements. If a local theme does not take effect, use `::ng-deep` around that include or move it to a global stylesheet. The theme remains limited to this `app-avatar` subtree unless it is emitted globally. + +Shadow DOM boundaries and detached overlay outlets require the theme to be emitted where the target can inherit from it or where its selectors can match. The above instance could also be achieved without using any Sass. All we need to do is to set the value of `--ig-avatar-background` CSS variable to the desired color: diff --git a/docs/angular/src/content/en/components/themes/sass/global-themes.mdx b/docs/angular/src/content/en/components/themes/sass/global-themes.mdx index 3e7c1faccb..80c034cc4c 100644 --- a/docs/angular/src/content/en/components/themes/sass/global-themes.mdx +++ b/docs/angular/src/content/en/components/themes/sass/global-themes.mdx @@ -72,7 +72,7 @@ $my-color-palette: palette( @include theme($my-color-palette); ``` -Let's explain what the `core` and `theme` mixins do. The `core` mixin takes care of some configurations, like adding enhanced accessibility(e.g. colors suitable for color blind users) and printing styles for all components. The `theme` mixin includes each individual component style (bar the ones listed as excluded) and configures the palette, schema, elevations, and roundness that is not listed in the `$exclude` list of components. +The `core()` mixin configures shared infrastructure such as sizing, spacing, enhanced accessibility, global directive styles, and print styles. The `theme()` mixin emits the palette, elevations, theme metadata, and component token declarations for the selected schema. Component structural styles are not generated by `theme()` as of 22.1.0; they ship in each component bundle and are tree-shaken automatically. Including `core` before `theme` is essential. The `core` mixins provide all base definitions needed for the `theme` mixin to work correctly. @@ -82,7 +82,11 @@ Including `core` before `theme` is essential. The `core` mixins provide all base
-The `theme` mixin allows you to provide a list of component names to be excluded from the global theme styles. For instance, if you want to completely remove all styles we include for the `igx-avatar` and `igx-badge` to reduce the amount of produced CSS or to supply your own custom styles, you can do so by passing the list of components like so: + +Since Ignite UI for Angular 22.1.0, component structural styles ship inside each component's own bundle and are already tree-shaken automatically based on what your application imports — you don't need `$exclude` to keep unused component CSS out of your build. The `theme` mixin's `$exclude` list now only controls the shared design **tokens** (`--ig-*` CSS custom properties) emitted into your global stylesheet, which is a much smaller amount of CSS than the structural styles ever were. + + +The `theme` mixin allows you to provide a list of component names to be excluded from the global theme's token output. For instance, if you want to remove the tokens we generate for `igx-avatar` and `igx-badge` because you know your application will never use them, you can do so by passing the list of components like so: ```scss // ... @@ -91,9 +95,9 @@ $unnecessary: (igx-avatar, igx-badge); @include theme($my-color-palette, $exclude: $unnecessary); ``` -If you know your app will not be using some of our components, we recommend you add them to the `$exclude` list. +If you know your app will not use some components, you can add them to `$exclude` to omit their token declarations. This does not control structural CSS; unused component bundles are already removed by the application build. -You can do the inverse, i.e. include only the component styles you want using the method below: +You can do the inverse and emit tokens only for the components you want using the method below: ```scss @use 'sass:map'; @@ -109,6 +113,18 @@ $allowed: (igx-avatar, igx-badge); ); ``` +## Third-party Resets + +Ignite UI declares its layers in the order `ig.reset` → `ig.base` → the active design-system layer → `ig.derived`. Wrap third-party reset or normalize stylesheets in the lowest-precedence `ig.reset` layer: + +```scss +@layer ig.reset { + @import "minireset.css"; +} +``` + +Unlayered application styles continue to take precedence over Ignite UI's layered styles. + ## Light and Dark Themes We also provide _**light**_ and _**dark**_ versions for our four themes - Material, Fluent, Indigo, Bootstrap. diff --git a/docs/angular/src/content/en/components/themes/sass/schemas.mdx b/docs/angular/src/content/en/components/themes/sass/schemas.mdx index 2dbd5a51e9..f251569ac1 100644 --- a/docs/angular/src/content/en/components/themes/sass/schemas.mdx +++ b/docs/angular/src/content/en/components/themes/sass/schemas.mdx @@ -152,7 +152,8 @@ $indigo-avatar: map.get($light-indigo-schema, avatar); @include tokens( avatar-theme( $schema: $indigo-avatar - ) + ), + $mode: 'scoped' ); } ``` diff --git a/docs/angular/src/content/en/components/themes/sass/typography.mdx b/docs/angular/src/content/en/components/themes/sass/typography.mdx index e1b9ac96a8..1bfd81f2ec 100644 --- a/docs/angular/src/content/en/components/themes/sass/typography.mdx +++ b/docs/angular/src/content/en/components/themes/sass/typography.mdx @@ -171,7 +171,7 @@ $my-type-scale: extend( ``` -The above code will modify the `h6` scale category globally, which will affect the look and feel of all components that use the `h6` scale. This is done for consistency so that all `h6` elements look the same across your app. We understand that you may want to apply the modification for `h6` to specific components only, like the `igx-card` component in our case. This is why every component has its own typography mixin, which accepts a category configuration. +The above code will modify the `h6` scale category globally, which will affect the look and feel of all components that use the `h6` scale. This is done for consistency so that all `h6` elements look the same across your app. We understand that you may want to apply the modification for `h6` to specific components only, like the `igx-card` component in our case. Every component's typography is applied through the same universal `--ig-{category}-*` design tokens (e.g. `--ig-h6-font-size`), so you can scope an override to just the elements you care about by targeting those tokens with the `type-style-vars` mixin instead of changing the global type scale. ```scss @@ -180,26 +180,22 @@ $my-h6: type-style( $font-size: rem(12px), ); -// You can specify which categories from the type sale the card uses -$card-categories: ( - title: 'h6', - title-small: 'subtitle-1', - subtitle: 'subtitle-2', - content: 'body-2', -); - .my-cool-card { - // Overwrite the 'h6' type style for this scope + // Overwrite the 'h6' tokens for this scope only. + // Because CSS custom properties inherit, this affects every + // descendant that reads the '--ig-h6-*' tokens, including the + // card title inside .my-cool-card. @include type-style-vars('h6', $my-h6); - - // Pass the custom card catergories to the card typography mixin - @include card-typography($card-categories); } ``` -We no longer include the `typography` mixin by passing it the `$my-type-scale` scale with our modification to the `h6` category. Now all we do is pass the custom h6 style we created to the `type-style-vars` mixin. +Typography is applied automatically as part of each component's tokens, so every part of a component stays visually consistent with the rest of your app out of the box. When you want to give a specific component instance its own distinct look — say, a smaller title on just one card — scope a `type-style-vars` override for that category to the component instance, as shown above. You can also reach for the underlying `--ig-{category}-*` tokens directly as plain CSS custom properties, no Sass required: -Using the card-typography mixin, we can update the typography styles for all elements in the card component. In the example above, the title-small key in the $card-categories map is assigned the subtitle-1 type style. This change makes the small title in the card slightly larger. By default, the card component uses the subtitle-2 type style for the small title, which has a smaller font size than subtitle-1. The mixin allows us to override this default and apply the new style. +```css +.my-cool-card { + --ig-h6-font-size: 0.75rem; +} +``` ## Converting Units diff --git a/docs/angular/src/content/en/components/time-picker.mdx b/docs/angular/src/content/en/components/time-picker.mdx index 8757d00a47..115711897c 100644 --- a/docs/angular/src/content/en/components/time-picker.mdx +++ b/docs/angular/src/content/en/components/time-picker.mdx @@ -386,7 +386,7 @@ In reactive forms, we can handle the -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` + +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss diff --git a/docs/angular/src/content/en/components/toast.mdx b/docs/angular/src/content/en/components/toast.mdx index b92bb9b3f1..bcd153506a 100644 --- a/docs/angular/src/content/en/components/toast.mdx +++ b/docs/angular/src/content/en/components/toast.mdx @@ -206,7 +206,7 @@ When you modify a primary property, all related dependent properties are automat -To get started with styling the toast, we need to import the index file, where all the theme functions and component mixins live: +To get started with styling the toast, we need to import the index file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/toc.json b/docs/angular/src/content/en/components/toc.json index 70a1e35c37..cee884ad7d 100644 --- a/docs/angular/src/content/en/components/toc.json +++ b/docs/angular/src/content/en/components/toc.json @@ -1954,7 +1954,7 @@ }, { "name": "Button Group", - "href": "button-group.mdx" + "href": "inputs/button-group.mdx" }, { "name": "Icon Button", @@ -2007,7 +2007,7 @@ }, { "name": "Badge", - "href": "badge.mdx", + "href": "inputs/badge.mdx", "updated": false }, { @@ -2193,7 +2193,7 @@ }, { "name": "Avatar", - "href": "avatar.mdx" + "href": "layouts/avatar.mdx" }, { "name": "Expansion Panel", diff --git a/docs/angular/src/content/en/components/tooltip.mdx b/docs/angular/src/content/en/components/tooltip.mdx index 51fdaea73c..88c1e4a8a1 100644 --- a/docs/angular/src/content/en/components/tooltip.mdx +++ b/docs/angular/src/content/en/components/tooltip.mdx @@ -86,7 +86,7 @@ Now that you have the Ignite UI for Angular Tooltip module or directives importe ## Using the Angular Tooltip -Let's say we want to create a simple text tooltip like the one above. In our case, we're using our awesome [`IgxAvatar`](/avatar) as the element, so we start by importing the `IgxAvatarModule` first. +Let's say we want to create a simple text tooltip like the one above. In our case, we're using our awesome [`IgxAvatar`](layouts/avatar.mdx) as the element, so we start by importing the `IgxAvatarModule` first. ```typescript // app.module.ts @@ -162,7 +162,7 @@ If everything went well, you should see the sample shown in the [Tooltip Demo](# The content can be more than just simple text. Since the tooltip itself is a regular element in the markup, you can enhance its content by adding any elements you need and styling them accordingly. -Let's expand on the use of the and use it to provide more details for a specific location on a map! We'll use a simple div to represent our map, the [`IgxAvatar`](/avatar) for a logo in our tooltip and the [`IgxIcon`](/icon) for the location icon on our map. For this purpose, we will get their respective modules. +Let's expand on the use of the and use it to provide more details for a specific location on a map! We'll use a simple div to represent our map, the [`IgxAvatar`](layouts/avatar.mdx) for a logo in our tooltip and the [`IgxIcon`](/icon) for the location icon on our map. For this purpose, we will get their respective modules. ```typescript // app.module.ts @@ -466,7 +466,7 @@ public overlaySettings: OverlaySettings = { ## Styling -To get started with styling the tooltip, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the tooltip, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/components/treegrid/tree-grid.mdx b/docs/angular/src/content/en/components/treegrid/tree-grid.mdx index c48862b3c5..c48d49809b 100644 --- a/docs/angular/src/content/en/components/treegrid/tree-grid.mdx +++ b/docs/angular/src/content/en/components/treegrid/tree-grid.mdx @@ -285,7 +285,7 @@ See the [Grid Sizing](/treegrid/sizing) topic. The Tree Grid allows styling through the [`Ignite UI for Angular Theme Library`](/themes/sass/component-themes). The tree grid's exposes a wide variety of properties, which allows the customization of all the tree grid's features. -To get started with styling the Tree Grid, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the Tree Grid, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/grids_templates/advanced-filtering.mdx b/docs/angular/src/content/en/grids_templates/advanced-filtering.mdx index 5161993da8..6d843664d0 100644 --- a/docs/angular/src/content/en/grids_templates/advanced-filtering.mdx +++ b/docs/angular/src/content/en/grids_templates/advanced-filtering.mdx @@ -242,7 +242,7 @@ You can also see how our [drag and drop App Builder™](https://www.infragistics ## Styling -To get started with styling the Advanced Filtering dialog, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the Advanced Filtering dialog, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -278,7 +278,7 @@ We include the created **query-builder-theme** within `igx-advanced-filtering-di
-If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep`: +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss @@ -309,7 +309,6 @@ If the component is using an [`Emulated`](/themes/sass/component-themes#view-enc - The sample will not be affected by the selected global theme from `Change Theme`. diff --git a/docs/angular/src/content/en/grids_templates/cell-selection.mdx b/docs/angular/src/content/en/grids_templates/cell-selection.mdx index 75bf44fdcf..43b665daf9 100644 --- a/docs/angular/src/content/en/grids_templates/cell-selection.mdx +++ b/docs/angular/src/content/en/grids_templates/cell-selection.mdx @@ -301,7 +301,7 @@ The theme engine exposes properties that allow us to style the **range of select ### Import theme -To get started with styling the selection, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the selection, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/grids_templates/column-hiding.mdx b/docs/angular/src/content/en/grids_templates/column-hiding.mdx index 8e18e9127b..d503175e0d 100644 --- a/docs/angular/src/content/en/grids_templates/column-hiding.mdx +++ b/docs/angular/src/content/en/grids_templates/column-hiding.mdx @@ -487,7 +487,7 @@ If all went well, this is how our column hiding UI component should look like: ## Styling -To get started with styling the column actions component, we need to import the index file, where all the theme functions and component mixins live: +To get started with styling the column actions component, we need to import the index file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -520,7 +520,7 @@ Instead of hardcoding the color values like we just did, we can achieve greater In this example we only changed the text-color of the flat buttons and the button disabled color, but the provides way more parameters to control the button style. -The last step is to **include** the component mixins, each with its respective theme: +The last step is to apply each component theme with `tokens()`: ```scss :host { @@ -537,7 +537,7 @@ We include the created **flat-button-theme** within `.igx-column-actions`, so th
-If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` for the components inside the column action component (buttons, checkboxes ...etc): +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss diff --git a/docs/angular/src/content/en/grids_templates/column-moving.mdx b/docs/angular/src/content/en/grids_templates/column-moving.mdx index 110a43efc1..1463baf98d 100644 --- a/docs/angular/src/content/en/grids_templates/column-moving.mdx +++ b/docs/angular/src/content/en/grids_templates/column-moving.mdx @@ -198,7 +198,7 @@ public onColumnMovingEnd(event) { ## Styling -To get started with styling the {ComponentTitle} column moving headers, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the {ComponentTitle} column moving headers, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -222,7 +222,7 @@ $dark-grid-column-moving-theme: grid-theme( Instead of hardcoding the color values like we just did, we can achieve greater flexibility in terms of colors by using the and functions. Please refer to [`Palettes`](/themes/sass/palettes) topic for detailed guidance on how to use them. -The last step is to **include** the component mixins with its respective theme: +The last step is to apply the component theme with `tokens()`: ```scss :host { @@ -250,7 +250,6 @@ The last step is to **include** the component mixins with its respective theme: - The sample will not be affected by the selected global theme from `Change Theme`. diff --git a/docs/angular/src/content/en/grids_templates/column-resizing.mdx b/docs/angular/src/content/en/grids_templates/column-resizing.mdx index 47a872951d..301e4b78b7 100644 --- a/docs/angular/src/content/en/grids_templates/column-resizing.mdx +++ b/docs/angular/src/content/en/grids_templates/column-resizing.mdx @@ -309,7 +309,7 @@ This approach is more performance optimized than auto-sizing post initialization ## Styling -To get started with the styling of the {ComponentTitle} column resize line, we need to import the index file, where all the theme functions and component mixins live: +To get started with the styling of the {ComponentTitle} column resize line, we need to import the index file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -352,7 +352,7 @@ $custom-grid-theme: grid-theme( Instead of hardcoding the color values like we just did, we can achieve greater flexibility in terms of colors by using the and functions. Please refer to [`Palettes`](/themes/sass/palettes) topic for detailed guidance on how to use them. -The last step is to **include** the component mixins with its respective theme: +The last step is to apply the component theme with `tokens()`: ```scss :host { @@ -378,7 +378,6 @@ The last step is to **include** the component mixins with its respective theme: - The sample will not be affected by the selected global theme from `Change Theme`. diff --git a/docs/angular/src/content/en/grids_templates/column-selection.mdx b/docs/angular/src/content/en/grids_templates/column-selection.mdx index 0380109d92..0c02fc259c 100644 --- a/docs/angular/src/content/en/grids_templates/column-selection.mdx +++ b/docs/angular/src/content/en/grids_templates/column-selection.mdx @@ -117,7 +117,7 @@ More information regarding the API manipulations could be found in the [`API Ref ## Styling -Before diving into the styling options, the core module and all component mixins need to be imported. +Before diving into the styling options, the theming module needs to be imported. ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/grids_templates/excel-style-filtering.mdx b/docs/angular/src/content/en/grids_templates/excel-style-filtering.mdx index bd0f8f1789..a84738f8ce 100644 --- a/docs/angular/src/content/en/grids_templates/excel-style-filtering.mdx +++ b/docs/angular/src/content/en/grids_templates/excel-style-filtering.mdx @@ -507,7 +507,7 @@ However, elements that go outside of the grid (e.g. Excel Style filter) will con ## Styling -To get started with styling the Excel Style Filtering dialog, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the Excel Style Filtering dialog, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -549,7 +549,7 @@ After that, we are ready to include our newly created grid theme. If we want to ``` -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep`: +This sample uses `::ng-deep` because both the generated theme selectors and the direct Excel Filtering selector must reach elements inside the grid's view. Moving the overrides to a global stylesheet is an alternative. ```scss @@ -580,7 +580,6 @@ If the component is using an [`Emulated`](/themes/sass/component-themes#view-enc - The sample will not be affected by the selected global theme from `Change Theme`. diff --git a/docs/angular/src/content/en/grids_templates/filtering.mdx b/docs/angular/src/content/en/grids_templates/filtering.mdx index 834ff2daf4..24c5975b3f 100644 --- a/docs/angular/src/content/en/grids_templates/filtering.mdx +++ b/docs/angular/src/content/en/grids_templates/filtering.mdx @@ -573,7 +573,7 @@ public matchingRecordsOnlyStrategy = new TreeGridMatchingRecordsOnlyFilteringStr ## Styling -To get started with styling the filtering row, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the filtering row, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -617,7 +617,7 @@ Instead of hardcoding the color values like we just did, we can achieve greater In this example we only changed some of the parameters for the input group and the button, but the and the provide way more parameters to control their respective styling. -The last step is to **include** the component mixins, each with its respective theme. We will also set the color property for the input's placeholder. +The last step is to apply each component theme with `tokens()`. We will also set the color property for the input's placeholder. ```scss :host { @@ -639,7 +639,7 @@ We include the created **flat-button-theme** and **input-group-theme** within `. -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep`: +This sample uses `::ng-deep` because the button, input, and placeholder themes are deliberately restricted to the grid's internal filtering-row selector. Moving those overrides to a global stylesheet is an alternative: ```scss diff --git a/docs/angular/src/content/en/grids_templates/multi-column-headers.mdx b/docs/angular/src/content/en/grids_templates/multi-column-headers.mdx index 0a7b48e247..9b1d725e44 100644 --- a/docs/angular/src/content/en/grids_templates/multi-column-headers.mdx +++ b/docs/angular/src/content/en/grids_templates/multi-column-headers.mdx @@ -281,7 +281,7 @@ The following sample demonstrates how to implement collapsible column groups usi ## Styling -To get started with styling the sorting behavior, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the sorting behavior, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -336,7 +336,7 @@ $custom-theme: grid-theme( Instead of hardcoding the color values like we just did, we can achieve greater flexibility in terms of colors by using the and functions. Please refer to [`Palettes`](/themes/sass/palettes) topic for detailed guidance on how to use them. -The last step is to **include** the component mixins: +The last step is to apply the component theme with `tokens()`: ```scss :host { diff --git a/docs/angular/src/content/en/grids_templates/paging.mdx b/docs/angular/src/content/en/grids_templates/paging.mdx index ebff766cf9..dc9b21bd35 100644 --- a/docs/angular/src/content/en/grids_templates/paging.mdx +++ b/docs/angular/src/content/en/grids_templates/paging.mdx @@ -199,7 +199,7 @@ In some cases you may want to define your own paging behavior and this is when w ## Styling -To get started with styling the paginator, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the paginator, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/en/grids_templates/row-actions.mdx b/docs/angular/src/content/en/grids_templates/row-actions.mdx index 44d385e818..cb939d53a0 100644 --- a/docs/angular/src/content/en/grids_templates/row-actions.mdx +++ b/docs/angular/src/content/en/grids_templates/row-actions.mdx @@ -148,4 +148,4 @@ Additional components and/or directives that can be used within the Action Strip - - - -- +- diff --git a/docs/angular/src/content/en/grids_templates/row-editing.mdx b/docs/angular/src/content/en/grids_templates/row-editing.mdx index 459dbf76f3..effadae05b 100644 --- a/docs/angular/src/content/en/grids_templates/row-editing.mdx +++ b/docs/angular/src/content/en/grids_templates/row-editing.mdx @@ -371,7 +371,7 @@ All we have to do now is apply the theme with a Sass `@include` statement. We pa Since the Row Editing overlay makes use of a lot of other components' themes, styling it via the global styles can affect other parts of our application (e.g. banners, buttons, etc.). The best way to prevent that is to scope the banner theme to the style file of the specific component it's applied to. -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to penetrate this encapsulation using `::ng-deep` in order to style the grid Row Editing Overlay. +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss @@ -448,7 +448,6 @@ After styling the banner and buttons, we also define a custom style for [the cel - The sample will not be affected by the selected global theme from `Change Theme`. diff --git a/docs/angular/src/content/en/grids_templates/sorting.mdx b/docs/angular/src/content/en/grids_templates/sorting.mdx index aa2d6c30a9..d597cf376f 100644 --- a/docs/angular/src/content/en/grids_templates/sorting.mdx +++ b/docs/angular/src/content/en/grids_templates/sorting.mdx @@ -270,7 +270,7 @@ The sorting indicator icon in the column header can be customized using a templa ## Styling -To get started with styling the sorting behavior, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the sorting behavior, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -307,7 +307,7 @@ $custom-theme: grid-theme( Instead of hardcoding the color values like we just did, we can achieve greater flexibility in terms of colors by using the and functions. Please refer to [`Palettes`](/themes/sass/palettes) topic for detailed guidance on how to use them. -The last step is to **include** the component mixins: +The last step is to apply the component theme with `tokens()`: ```scss :host { @@ -337,7 +337,6 @@ The last step is to **include** the component mixins: - The sample will not be affected by the selected global theme from `Change Theme`. diff --git a/docs/angular/src/content/en/grids_templates/summaries.mdx b/docs/angular/src/content/en/grids_templates/summaries.mdx index c5a77a6cc5..b17355d034 100644 --- a/docs/angular/src/content/en/grids_templates/summaries.mdx +++ b/docs/angular/src/content/en/grids_templates/summaries.mdx @@ -63,7 +63,6 @@ The Angular UI grid in Ignite UI for Angular has a **summaries** feature that fu - The summary of the column is a **function of all column values**, unless filtering is applied, then the summary of the column will be **function of the filtered result values** @@ -721,7 +720,7 @@ The summary rows can be navigated with the following keyboard interactions: ## Styling -To get started with styling the sorting behavior, we need to import the `index` file, where all the theme functions and component mixins live: +To get started with styling the sorting behavior, we need to import the `index` file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -793,10 +792,10 @@ The last step is to **include** the component custom theme: ``` -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep`: +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. - ```scss +```scss :host { ::ng-deep { @include tokens($custom-theme); diff --git a/docs/angular/src/content/en/grids_templates/toolbar.mdx b/docs/angular/src/content/en/grids_templates/toolbar.mdx index 8d6fa055c0..bcbeddc26f 100644 --- a/docs/angular/src/content/en/grids_templates/toolbar.mdx +++ b/docs/angular/src/content/en/grids_templates/toolbar.mdx @@ -532,7 +532,7 @@ The following sample demonstrates how to add an additional button to the toolbar ## Styling -To get started with styling the toolbar, we need to import the index file, where all the theme functions and component mixins live: +To get started with styling the toolbar, we need to import the index file, where all the theme functions and the `tokens()` mixin are exported: ```scss @use "igniteui-angular/theming" as *; @@ -565,7 +565,7 @@ The last step is to **include** the newly created themes. ``` -If the component is using an [`Emulated`](/themes/sass/component-themes#view-encapsulation) ViewEncapsulation, it is necessary to `penetrate` this encapsulation using `::ng-deep` to style the components inside the grid toolbar component: +In some component templates, Emulated View Encapsulation can still prevent the generated token declarations from reaching nested Ignite UI elements. If the theme does not take effect, use `::ng-deep` as shown below or move the theme to a global stylesheet. ```scss diff --git a/docs/angular/src/content/en/images/anatomy-content-light/avatar-lt-a.png b/docs/angular/src/content/en/images/anatomy-content-light/avatar-lt-a.png new file mode 100644 index 0000000000..628c84a4d5 Binary files /dev/null and b/docs/angular/src/content/en/images/anatomy-content-light/avatar-lt-a.png differ diff --git a/docs/angular/src/content/en/images/anatomy-content-light/badge-lt-a.png b/docs/angular/src/content/en/images/anatomy-content-light/badge-lt-a.png new file mode 100644 index 0000000000..7318080d95 Binary files /dev/null and b/docs/angular/src/content/en/images/anatomy-content-light/badge-lt-a.png differ diff --git a/docs/angular/src/content/en/images/anatomy-content-light/button-group-lt-a.png b/docs/angular/src/content/en/images/anatomy-content-light/button-group-lt-a.png new file mode 100644 index 0000000000..d4990ae354 Binary files /dev/null and b/docs/angular/src/content/en/images/anatomy-content-light/button-group-lt-a.png differ diff --git a/docs/angular/src/content/en/images/avatar/avatar_do1.png b/docs/angular/src/content/en/images/avatar/avatar_do1.png new file mode 100644 index 0000000000..079a6fac58 Binary files /dev/null and b/docs/angular/src/content/en/images/avatar/avatar_do1.png differ diff --git a/docs/angular/src/content/en/images/avatar/avatar_do1@2x.png b/docs/angular/src/content/en/images/avatar/avatar_do1@2x.png new file mode 100644 index 0000000000..a916acd815 Binary files /dev/null and b/docs/angular/src/content/en/images/avatar/avatar_do1@2x.png differ diff --git a/docs/angular/src/content/en/images/avatar/avatar_do_not1.png b/docs/angular/src/content/en/images/avatar/avatar_do_not1.png new file mode 100644 index 0000000000..6d51576c23 Binary files /dev/null and b/docs/angular/src/content/en/images/avatar/avatar_do_not1.png differ diff --git a/docs/angular/src/content/en/images/avatar/avatar_dont1@2x.png b/docs/angular/src/content/en/images/avatar/avatar_dont1@2x.png new file mode 100644 index 0000000000..737a7f0c8a Binary files /dev/null and b/docs/angular/src/content/en/images/avatar/avatar_dont1@2x.png differ diff --git "a/docs/angular/src/content/en/images/badge/badge-do-n\320\276t.png" "b/docs/angular/src/content/en/images/badge/badge-do-n\320\276t.png" new file mode 100644 index 0000000000..6b8bd52121 Binary files /dev/null and "b/docs/angular/src/content/en/images/badge/badge-do-n\320\276t.png" differ diff --git a/docs/angular/src/content/en/images/badge/badge-do.png b/docs/angular/src/content/en/images/badge/badge-do.png new file mode 100644 index 0000000000..b8374e9278 Binary files /dev/null and b/docs/angular/src/content/en/images/badge/badge-do.png differ diff --git a/docs/angular/src/content/en/images/button-group/button-group-do-1.png b/docs/angular/src/content/en/images/button-group/button-group-do-1.png new file mode 100644 index 0000000000..4acaf050a9 Binary files /dev/null and b/docs/angular/src/content/en/images/button-group/button-group-do-1.png differ diff --git a/docs/angular/src/content/en/images/button-group/button-group-do-2.png b/docs/angular/src/content/en/images/button-group/button-group-do-2.png new file mode 100644 index 0000000000..d9c79b1461 Binary files /dev/null and b/docs/angular/src/content/en/images/button-group/button-group-do-2.png differ diff --git a/docs/angular/src/content/en/images/button-group/button-group-do-3.png b/docs/angular/src/content/en/images/button-group/button-group-do-3.png new file mode 100644 index 0000000000..2f016de185 Binary files /dev/null and b/docs/angular/src/content/en/images/button-group/button-group-do-3.png differ diff --git a/docs/angular/src/content/en/images/button-group/button-group-do-not-1.png b/docs/angular/src/content/en/images/button-group/button-group-do-not-1.png new file mode 100644 index 0000000000..4634972692 Binary files /dev/null and b/docs/angular/src/content/en/images/button-group/button-group-do-not-1.png differ diff --git a/docs/angular/src/content/en/images/button-group/button-group-do-not-2.png b/docs/angular/src/content/en/images/button-group/button-group-do-not-2.png new file mode 100644 index 0000000000..585f7ff91c Binary files /dev/null and b/docs/angular/src/content/en/images/button-group/button-group-do-not-2.png differ diff --git a/docs/angular/src/content/en/images/button-group/button-group-do-not-3.png b/docs/angular/src/content/en/images/button-group/button-group-do-not-3.png new file mode 100644 index 0000000000..68d4a04dc5 Binary files /dev/null and b/docs/angular/src/content/en/images/button-group/button-group-do-not-3.png differ diff --git a/docs/angular/src/content/jp/components/avatar.mdx b/docs/angular/src/content/jp/components/avatar.mdx deleted file mode 100644 index dd2ca84643..0000000000 --- a/docs/angular/src/content/jp/components/avatar.mdx +++ /dev/null @@ -1,299 +0,0 @@ ---- -title: Angular Avatar コンポーネント - MITライセンス -description: Ignite UI for Angular の Avatar コントロールは、プロファイル ボタンなどのアプリケーションのインスタンスに画像、マテリアル アイコン、またはイニシャルを追加できます。 -keywords: Angular Avatar コンポーネント, Angular Avatar コントロール, Ignite UI for Angular, Angular UI コンポーネント -license: MIT -_language: ja -llms: - description: "Ignite UI for Angular の Avatar コントロールは、プロファイル ボタンなどのアプリケーションのインスタンスに画像、マテリアル アイコン、またはイニシャルを追加できます。" ---- - -import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; -import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; -import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - -# Angular Avatar (アバター) コンポーネントの概要 - -
-Angular Avatar component helps adding initials, images, or material icons to your application. -
- - -## Angular Avatar の例 - - - -
- -## Ignite UI for Angular Avatar を使用した作業の開始 - -Ignite UI for Angular Avatar コンポーネントを使用した作業を開始するには、Ignite UI for Angular をインストールする必要があります。既存の Angular アプリケーションで、以下のコマンドを入力します。 - -```cmd -ng add igniteui-angular -``` - -Ignite UI for Angular については、「[はじめに](/general/getting-started)」トピックをご覧ください。 - -次に、**app.module.ts** ファイルに `IgxAvatarModule` をインポートします。 - -```typescript -// app.module.ts - -... -import { IgxAvatarModule } from 'igniteui-angular/avatar'; -// import { IgxAvatarModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxAvatarModule], - ... -}) -export class AppModule {} -``` - -あるいは、`16.0.0` 以降、`IgxAvatarComponent` をスタンドアロンの依存関係としてインポートできます。 - -```typescript -// home.component.ts - -... -import { IgxAvatarComponent } from 'igniteui-angular/avatar'; -// import { IgxAvatarComponent } from '@infragistics/igniteui-angular'; for licensed package - -@Component({ - selector: 'app-home', - template: '', - styleUrls: ['home.component.scss'], - standalone: true, - imports: [IgxAvatarComponent] -}) -export class HomeComponent {} -``` - -Ignite UI for Angular Avatar モジュールまたはコンポーネントをインポートしたので、`igx-avatar` コンポーネントの基本構成を開始できます。 - -## Angular Avatar コンポーネントの使用 - -Ignite UI for Angular Avatar コンポーネントには、3 つの形状 (正方形、角丸、円) と 3 つのサイズ オプション (大、中、小) があります。イニシャル、画像、またはアイコンを表示できます。 - -### Avatar の形状 - - 属性の値を `square`、`rounded`、または `circle` に設定することで、アバターの形状を変更できます。デフォルトでは、アバターの形状は `square` です。 - -```html - -``` - -### イニシャルを表示するアバター - - ('John Smith' の場合 'JS') を使用した簡易なアバターを作成するには、以下のコードをコンポーネントのテンプレートに追加します。 - -```html - -``` - -アバターを丸形に設定し、サイズを大きくします。 - -```html - -``` - -`--ig-avatar-background` CSS 変数を使用して背景の色を変更できます。また、`color` プロパティを使用してイニシャルの色を設定します。 - -```scss -// avatar.component.scss - -igx-avatar { - --ig-avatar-background: #e41c77; - color: #000000; -} - -``` - - -`igx-avatar` コンポーネントの `roundShape` プロパティは廃止されました。代わりに 属性を使用する必要があります。 - - -以下は結果です。 - - - -### 画像を表示するアバター - -画像を表示するアバターを作成するには、 プロパティで画像ソースを設定します。 - -```html - - -``` - - -このコンポーネントはマテリアル アイコンを使用します。`index.html` に次のリンクを追加してください: `` - - -ここまでの内容が正しければ、以下のように表示されます。 - - - -### アイコンを表示するアバター - -アバターでアイコンを表示するには、 プロパティを設定します。現在、マテリアル アイコン セットのすべてのアイコンがサポートされます。 - -```html - - -``` - -以下は結果です。 - - - -## スタイル設定 - -### Avatar テーマのプロパティ マップ - -`$background` プロパティを変更すると、次の依存プロパティが自動的に更新されます。 - -| Primary Property | Dependent Property | Description | -| --- | --- | --- | -| **$background** | $color | The text color used for the avatar. | -| | $icon-color | The icon color used for the avatar. | - -Avatar のスタイル設定を始めるには、すべてのテーマ関数とコンポーネント ミックスインが存在する `index` ファイルをインポートする必要があります。 - -```scss -@use "igniteui-angular/theming" as *; - -// 重要: Ignite UI for Angular 13 より前のバージョンは、次を使用してください。 -// @import '~igniteui-angular/lib/core/styles/themes/index'; -``` - -最もシンプルな方法として、 を拡張し、`$background` および `$border-radius` パラメーターを指定して新しいテーマを作成します。`$color` (または `$icon-color`) は、指定された背景に対してよりコントラストの高い色 (黒または白) が自動的に設定されます。なお、`$border-radius` プロパティはアバターの が `rounded` に設定されている場合のみ適用されます。 - -次のマークアップを前提として: - -```html -
- -
-``` - -以下のアバター テーマを作成します。 - -```scss -$custom-avatar-theme: avatar-theme( - $background: #72da67, - $border-radius: 16px -); -``` - -最後にアバターのカスタム テーマを渡します。 - -```scss -.initials { - @include tokens($custom-avatar-theme); -} -``` - -ここまでの内容が正しければ、以下のように表示されます。 - - - -### Tailwind によるスタイル設定 - -カスタム Tailwind ユーティリティ クラスを使用して `avatar` をスタイル設定できます。まず [Tailwind を設定して](/themes/misc/tailwind-classes)ください。 - -グローバル スタイルシートに Tailwind をインポートした上で、以下のように必要なテーマ ユーティリティを適用します: - -```scss -@import "tailwindcss"; -... -@use 'igniteui-theming/tailwind/utilities/material.css'; -``` - -ユーティリティ ファイルには、`light` テーマと `dark` テーマの両方のバリエーションが含まれています。 - -- `light-*` クラスはライト テーマ用です。 -- `dark-*` クラスはダーク テーマ用です。 -- プレフィックスの後にコンポーネント名を追加します (例: `light-avatar`、`dark-avatar`)。 - -これらのクラスを適用すると、動的なテーマの計算が可能になります。そこから、`任意のプロパティ`を使用して、生成された CSS 変数をオーバーライドできます。コロンの後に、有効な CSS カラー形式 (HEX、CSS 変数、RGB など) を指定します。 - -プロパティの完全なリストは、 で確認できます。構文は次のとおりです: - -```html - - -``` - - -ユーティリティ クラスが優先されるようにするには、感嘆符 (`!`) が必要です。Tailwind はスタイルをレイヤーに適用しますが、これらのスタイルを重要としてマークしないと、コンポーネントのデフォルトのテーマによってオーバーライドしてしまいます。 - - -最終的に、avatar は次のようになります: - - - -### カスタム サイズ変更 - -`igx-avatar` を直接ターゲットとして `--size` 変数を使用することができます。 - -```scss -igx-avatar { - --size: 200px; -} -``` - -または、ユニバーサル変数 `--ig-avatar-size` を使用して、すべてのインスタンスをターゲットにすることもできます。 - -```html -
- -
-``` - -```scss -.my-app { - --ig-avatar-size: 200px; -} -``` - -size 属性が適用されていない場合は、事前定義されたサイズの 1 つを使用して、それを `--ig-size` 変数に割り当てることもできます。`--ig-size` に使用可能な値は、`--ig-size-small`、`--ig-size-medium`、`--ig-size-large` です。 - -```scss -igx-avatar { - --ig-size: var(--ig-size-small); -} -``` - -詳細については、[サイズ](/display-density)の記事をご覧ください。 - -
- -## API リファレンス - -
- -- - -## テーマの依存関係 - -- -- - -## その他のリソース - -
- -コミュニティに参加して新しいアイデアをご提案ください。 - -- [Ignite UI for Angular **フォーラム** (英語)](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) -- [Ignite UI for Angular **GitHub** (英語)](https://github.com/IgniteUI/igniteui-angular) diff --git a/docs/angular/src/content/jp/components/badge.mdx b/docs/angular/src/content/jp/components/badge.mdx deleted file mode 100644 index c3cbcb9792..0000000000 --- a/docs/angular/src/content/jp/components/badge.mdx +++ /dev/null @@ -1,451 +0,0 @@ ---- -title: Angular Badge コンポーネント - MITライセンス -description: Ignite UI for Angular の Badge コントロールは、アプリケーションでその他のコンポーネントを装飾するために定義済みスタイルでアクティブ カウントまたはアイコンを表示します。 -keywords: Angular Badge コンポーネント, Angular Badge コントロール, Ignite UI for Angular, Angular UI コンポーネント -license: MIT -_language: ja -llms: - description: "Ignite UI for Angular の Badge コントロールは、アプリケーションでその他のコンポーネントを装飾するために定義済みスタイルでアクティブ カウントまたはアイコンを表示します。" ---- - -import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; -import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; -import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - -# Angular Badge (バッジ) コンポーネントの概要 - -
-Angular Badge は、視覚的な通知が必要な場合に、アバター、ナビゲーション メニュー、またはアプリケーション内の他のコンポーネントと組み合わせて使用されるコンポーネントです。バッジは通常、情報、成功、警告、またはエラーを伝達するために、事前定義されたスタイルのアイコンとしてデザインされています。 -
- -## Angular Badge の例 - - - -
- -## Ignite UI for Angular Badge を使用した作業の開始 - -Ignite UI for Angular Badge コンポーネントを使用した作業を開始するには、Ignite UI for Angular をインストールする必要があります。既存の Angular アプリケーションで、以下のコマンドを入力します。 - -```cmd -ng add igniteui-angular -``` - -Ignite UI for Angular については、「[はじめに](/general/getting-started)」トピックをご覧ください。 - -次に、**app.module.ts** ファイルに `IgxBadgeModule` をインポートします。 - -```typescript -// app.module.ts - -... -import { IgxBadgeModule } from 'igniteui-angular/badge'; -// import { IgxBadgeModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxBadgeModule], - ... -}) -export class AppModule {} -``` - -あるいは、`16.0.0` 以降、 をスタンドアロンの依存関係としてインポートできます。 - -```typescript -// home.component.ts - -... -import { IgxBadgeComponent } from 'igniteui-angular/badge'; -// import { IgxBadgeComponent } from '@infragistics/igniteui-angular'; for licensed package - -@Component({ - selector: 'app-home', - template: '', - styleUrls: ['home.component.scss'], - standalone: true, - imports: [IgxBadgeComponent] -}) -export class HomeComponent {} -``` - - -このコンポーネントは Material アイコンを使用します。`index.html` に次のリンクを追加してください: `` - - -Ignite UI for Angular Badge モジュールまたはコンポーネントをインポートしたので、`igx-badge` コンポーネントの基本構成を開始できます。 - -## Angular Badge コンポーネントの使用 - -デモ サンプルの実行方法を見てみましょう。アバターのシンプルな success スタイルのバッジです。これを構築するためには、`IgxBadgeModule` とともに `IgxAvatarModule` をインポートする必要があります。 - -```typescript -// app.module.ts -... -import { IgxBadgeModule } from 'igniteui-angular/badge'; -import { IgxAvatarModule } from 'igniteui-angular/avatar'; -// import { IgxBadgeModule, IgxAvatarModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxBadgeModule, IgxAvatarModule], - ... -}) - -export class AppModule {} -``` - -_あるいは、`16.0.0` 以降、 をスタンドアロンの依存関係としてインポートできます。_ - -次に、これらのコンポーネントをテンプレートに追加します。 - -```html -
- - -
-``` - -ラッパーを使用して、バッジを絶対的に配置し、アバターの一部をカバーします。 - -```scss -.wrapper { - position: relative; - margin-top: 15px; -} - -igx-badge { - position: absolute; - bottom: 0; - left: 28px; -} -``` - -### バッジの形状 - - 属性の値を `square` に設定することで、バッジの形状を変更できます。デフォルトでは、バッジの形状は `rounded` です。 - -```html - -``` - -すべて適切に設定すると、ブラウザ上で以上のデモ サンプルを確認することができます。 - -### バッジのサイズ - -バッジのサイズは `--size` 変数を使用して制御できます。これにより、バッジのサイズが両方向に比例して調整されます。ただし、テキスト値を含むバッジでは、フォント サイズと行の高さに `caption` タイポグラフィ スタイルが使用されることに注意してください。そのため、テキストを含むバッジの `--size` を 16 px 未満の値に設定する場合は、そのタイポグラフィも変更する必要があります。 - -例: - -```scss -igx-badge { - --size: 12px; - - font-size: calc(var(--size) / 2); - line-height: normal; -} -``` - -### バッジの値とアイコン - -バッジ内にテキストまたは数値カウントを表示するには、`[value]` 入力を使用します。 - -```html - -``` - -バッジ内にアイコンを表示するには、`[icon]` 入力を使用します。 - -```html - -``` - -`[icon]` と `[value]` の両方が設定されている場合、バッジは両方を同時に表示します。 - -```html - - -``` - -または、コンテンツを直接埋め込むこともできます。 - -```html - {{ model.value }} - - - - bluetooth - Bluetooth - -``` - -### バッジのアイコン - -`igx-badge` コンポーネントは、Material アイコンに加えて[Material アイコン拡張](../components/material-icons-extended.mdx)およびその他のカスタム アイコン セットの使用もサポートしています。Material アイコン拡張セットからバッジ コンポーネントにアイコンを追加するには、まずそのアイコンを登録する必要があります。 - -```ts -export class BadgeIconComponent implements OnInit { - constructor (protected _iconService: IgxIconService) {} - - public ngOnInit() { - this._iconService.addSvgIconFromText(heartMonitor.name, heartMonitor.value, 'imx-icons'); - } -} -``` - -そうすると、次のようにアイコン名とファミリを指定すればよいです。 - -```html - -``` - - - -### アウトライン バッジ - -`igx-badge` コンポーネントは、 属性を設定することで、バッジの周囲に微妙な境界線を表示することもできます。 - -```html - -``` - - - -境界線の色は、 の `$border-color` プロパティでカスタマイズすることもできます。 - -### ドット バッジ - -`igx-badge` コンポーネントは、 プロパティを有効にすることで、通知用の最小限のドット インジケーターとして表示することもできます。ドット バッジはコンテンツをサポートしませんが、アウトライン表示が可能で、利用可能なすべてのドット タイプ (例: primary、success、info など) を使用できます。 - -```html - -``` - - - -### リストのバッジ - -チャット クライアントのような連絡先リストを作成します。連絡先の名前を表示し、アバターおよび連絡先の現在状態 (オンライン、オフライン、退席中) を表示します。これを達成するには、 および コンポーネントを使用します。コンテナーの場合、 が使用されます。 - -続行するには、必要なすべてのモジュールを含めて、**app.module.ts** ファイルにインポートします。 - -```typescript -// app.module.ts - -... -import { IgxListModule } from 'igniteui-angular/list'; -import { IgxAvatarModule } from 'igniteui-angular/avatar'; -import { IgxBadgeModule } from 'igniteui-angular/badge'; -// import { IgxListModule, IgxAvatarModule, IgxBadgeModule } from '@infragistics/igniteui-angular'; for licensed package - -@NgModule({ - ... - imports: [..., IgxListModule, IgxAvatarModule, IgxBadgeModule], -}) -export class AppModule {} -``` - - - には、バッジの外観を構成するための および 入力があります。公式の[マテリアル アイコン セット](https://material.io/icons/)から名前を指定して、アイコンを設定できます。バッジタイプは、`Default`、`Info`、`Success`、`Warning`、または `Error` のいずれかに設定できます。各タイプは特定の背景色を適用し、この背景色はカスタムの背景色よりも優先されます。 - - -サンプルでは、 が icon と type という名前のモデルプロパティにバインドされています。 - -次に、テンプレートに連絡先を追加します。 - -```html - - - - - Team Members (4) - - -
-
- - -
-
- {{ member.name }} -
-
-
-
-``` - -以下のように typescript ファイルにメンバーを作成します。 - -```typescript -// contacts.component.ts - -... -public members: Member[] = [ - new Member('Terrance Orta', 'online'), - new Member('Donna Price', 'online'), - new Member('Lisa Landers', 'away'), - new Member('Dorothy H. Spencer', 'offline'), -]; - -``` - -```typescript -... -class Member { - public name: string; - public status: string; - public type: string; - public icon: string; - - constructor(name: string, status: string) { - this.name = name; - this.status = status; - switch (status) { - case 'online': - this.type = 'success'; - this.icon = 'check'; - break; - case 'away': - this.type = 'warning'; - this.icon = 'schedule'; - break; - case 'offline': - this.type = 'error'; - this.icon = 'remove'; - break; - } - } -} -``` - -親コンテナーにバッジを配置します。 - -```css -/* contacts.component.css */ - -.wrapper { - display: flex; - flex-direction: row; -} - -.contact-name { - font-weight: 600; -} - -.contact-container { - margin-left: 20px; -} - -.badge-style { - position: absolute; - bottom: 2.5px; - left: 40px; -} - -``` - -サンプルを正しく構成すると、アバターと、その状態を示すバッジとともにメンバーのリストが表示されます。 - - - -## スタイル設定 - -### Badge テーマのプロパティ マップ - -`$background-color` プロパティを変更すると、次の依存プロパティが自動的に更新されます。 - -| Primary Property | Dependent Property | Description | -| --- | --- | --- | -| **$background-color** | $icon-color | バッジ内のアイコンに使用される色 | -| | $text-color | バッジ内のテキストに使用される色 | - -Badge のスタイル設定は、すべてのテーマ関数とコンポーネントミックスインが存在する `index` ファイルをインポートする必要があります。 - -```scss -@use "igniteui-angular/theming" as *; - -// 重要: Ignite UI for Angular 13 より前のバージョンは、次を使用してください。 -// @import '~igniteui-angular/lib/core/styles/themes/index'; -``` - -最も簡単な方法は、 を拡張する新しいテーマを作成し、バッジの項目をスタイル設定するいくつかのパラメーターを受け取る方法です。`$background-color` を設定すると、`$icon-color` と `$text-color` は、背景の色とのコントラストが高い黒または白に自動的に割り当てられます。なお、`$border-radius` プロパティはバッジの が `square` に設定されている場合のみ適用されます。 - -```scss -$custom-badge-theme: badge-theme( - $background-color: #57a5cd, - $border-radius: 4px -); -``` - -新しいテーマを含めるには、`tokens` ミックスインを使用します。 - -```scss -:host { - @include tokens($custom-badge-theme); -} -``` - -### デモ - - - -### Tailwind によるスタイル設定 - -カスタム Tailwind ユーティリティ クラスを使用して `badge` をスタイル設定できます。まず [Tailwind を設定して](/themes/misc/tailwind-classes)ください。 - -グローバル スタイルシートに Tailwind をインポートした上で、以下のように必要なテーマ ユーティリティを適用します: - -```scss -@import "tailwindcss"; -... -@use 'igniteui-theming/tailwind/utilities/material.css'; -``` - -ユーティリティ ファイルには、`light` テーマと `dark` テーマの両方のバリエーションが含まれています。 - -- `light-*` クラスはライト テーマ用です。 -- `dark-*` クラスはダーク テーマ用です。 -- プレフィックスの後にコンポーネント名を追加します (例: `light-badge`、`dark-badge`)。 - -これらのクラスを適用すると、動的なテーマの計算が可能になります。そこから、`任意のプロパティ`を使用して、生成された CSS 変数をオーバーライドできます。コロンの後に、有効な CSS カラー形式 (HEX、CSS 変数、RGB など) を指定します。 - -プロパティの完全なリストは、 で確認できます。構文は次のとおりです: - -```html - - -``` - - -ユーティリティ クラスが優先されるようにするには、感嘆符 (`!`) が必要です。Tailwind はスタイルをレイヤーに適用しますが、これらのスタイルを重要としてマークしないと、コンポーネントのデフォルトのテーマによってオーバーライドしてしまいます。 - - -最終的に、badge は次のようになります: - - - -
- -## API リファレンス - -- -- -- -- -- -- - -## テーマの依存関係 - -- - -## その他のリソース - -
- -コミュニティに参加して新しいアイデアをご提案ください。 -- [Ignite UI for Angular **フォーラム** (英語)](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) -- [Ignite UI for Angular **GitHub** (英語)](https://github.com/IgniteUI/igniteui-angular) diff --git a/docs/angular/src/content/jp/components/circular-progress.mdx b/docs/angular/src/content/jp/components/circular-progress.mdx index c09ddfd34b..be6dcce866 100644 --- a/docs/angular/src/content/jp/components/circular-progress.mdx +++ b/docs/angular/src/content/jp/components/circular-progress.mdx @@ -1,11 +1,11 @@ --- title: Angular Circular Progress コンポーネント - MITライセンス -description: Ignite UI for Angular Circular Progress インジケーター コンポーネントは、丸形で進行状況を表示し、カスタマイズできるコンポーネントです。 +description: Ignite UI for Angular Circular Progress インジケーター コンポーネントは、円形で進行状況を表示し、カスタマイズできるコンポーネントです。 keywords: Angular Circular Progress コンポーネント, Angular Circular Progress コントロール, Ignite UI for Angular, UI コントロール, Angular ウィジェット, web ウィジェット, UI ウィジェット, Angular, ネイティブ Angular コンポーネント スイート, ネイティブ Angular コントロール, Angular UI コンポーネント license: MIT _language: ja llms: - description: "Ignite UI for Angular Circular Progress インジケーター コンポーネントは、丸形で進行状況を表示し、カスタマイズできるコンポーネントです。" + description: "Ignite UI for Angular Circular Progress インジケーター コンポーネントは、円形で進行状況を表示し、カスタマイズできるコンポーネントです。" --- import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; @@ -15,7 +15,7 @@ import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; # Angular Circular Progress (円形プログレス) コンポーネントの概要
-The Ignite UI for Angular Circular Progress Indicator component provides a visual indicator of an application’s process as it changes. The circular indicator updates its appearance as its state changes. +Ignite UI for Angular Circular Progress Indicator コンポーネントは、変化していくアプリケーションの進行状況を表す視覚的なインジケーターです。円形インジケーターは状態の変更に応じて表示を更新します。
## Angular Circular Progress の例 @@ -86,22 +86,25 @@ Ignite UI for Angular Progress Bar モジュールまたはディレクティブ ``` -その後、ブラウザ上でデモサンプルを確認することができます。 +その後、ブラウザー上でデモ サンプルを確認できます。 **igx-circular-bar** は、各ステップに `{currentValue: 65, previousValue: 64}` のようなオブジェクトを出力する イベントを発生します。 + + 値が定義されていない場合、進行状況は更新サイクルごとにデフォルトで ** 値の 1%** ずつ増加します。更新の間隔を変更するには、 値を定義する必要があります。 + -### 不確定のプログレス +### 不確定状態のプログレス -正確に決定していないプロセスをトラックしたい場合、 プロパティを `true` に設定できます。 +進行状況を正確に把握できない処理を表示する場合、 入力プロパティを `true` に設定できます。 ```html ``` -円形のプログレスバーのテキストを非表示にするには、 プロパティを `false` に設定します。 +円形プログレス バーのテキストを非表示にするには、 プロパティを `false` に設定します。 結果は以下のようになります。 @@ -112,7 +115,7 @@ Ignite UI for Angular Progress Bar モジュールまたはディレクティブ ### ダイナミック プログレス -ボタンなどの外部コントロールを使用して進行の値を動的に変更できます。これを実現するには、値をクラス プロパティにバインドします。 +ボタンなどの外部コントロールを使用して進行状況の値を動的に変更できます。これを実現するには、値をクラス プロパティにバインドします。 ```html
@@ -133,7 +136,7 @@ Ignite UI for Angular Progress Bar モジュールまたはディレクティブ
``` - + このコンポーネントはマテリアル アイコンを使用します。`index.html` に次のリンクを追加してください: `` @@ -182,7 +185,7 @@ export class HomeComponent { ### グラデーション プログレス プログレス バーをカスタマイズする方法の 1 つとして、単色の代わりにカラー グラデーションを使用する方法があります。 -これは、 ディレクティブを使用する、もしくは、カスタム テーマを実装することにより実行できます (カスタム テーマは 2 つまでの色経由点 (color stop) をサポートします)。 +これには 2 つの方法があります。 ディレクティブを使用する方法と、カスタム テーマを実装する方法です (カスタム テーマは 2 つまでの色経由点 (color stop) をサポートします)。 カスタム テーマを使用して 2 つの色経由点のみを含むグラデーションを作成するには、色のリストを作成し、それを `$fill-color-default` テーマ パラメーターに渡す必要があります。 @@ -194,9 +197,9 @@ $custom-theme: progress-circular-theme( ); ``` -円形のプログレス バーのスタイル設定については、[`スタイル設定セクション`](#スタイル設定) を参照してください。 +円形プログレス バーのスタイル設定については、[`スタイル設定セクション`](#スタイル設定) を参照してください。 -3つ以上の色経由点を持つグラデーションを提供するには、`igx-circular-bar` の `ng-template` でディレクティブを使用する必要があります。 +3 つ以上の色経由点を持つグラデーションを提供するには、`igx-circular-bar` の `ng-template` でディレクティブを使用する必要があります。 ```html
@@ -233,7 +236,7 @@ $custom-theme: progress-circular-theme( ## スタイル設定 -円形のプログレスバーのスタイル設定は、すべてのテーマ関数とコンポーネント ミックスインが存在する `index` ファイルをインポートする必要があります。 +円形プログレス バーのスタイル設定を開始するには、すべてのテーマ関数と `tokens()` ミックスインがエクスポートされている `index` ファイルをインポートする必要があります。 ```scss @use "igniteui-angular/theming" as *; diff --git a/docs/angular/src/content/jp/components/layouts/avatar.mdx b/docs/angular/src/content/jp/components/layouts/avatar.mdx new file mode 100644 index 0000000000..86868c15a1 --- /dev/null +++ b/docs/angular/src/content/jp/components/layouts/avatar.mdx @@ -0,0 +1,297 @@ +--- +title: "Angular Avatar コンポーネント | レイアウト | インフラジスティックス" +description: "Angular Avatar コンポーネントを使用して、ユーザー、エンティティ、またはオブジェクトを画像、イニシャル、アイコン、またはカスタム コンテンツで表します。" +keywords: "Angular Avatar, アバター コンポーネント, プロフィール画像, イニシャル, Ignite UI for Angular, Infragistics" +last_updated: "2026-07-29" +license: MIT +mentionedTypes: ["Avatar", "Badge", "Icon"] +relatedComponents: ["Badge"] +_language: ja +llms: + description: "Ignite UI for Angular Avatar トピックでは、画像、イニシャル、アイコン、カスタム コンテンツ、形状、サイズ、スタイル設定、アクセシビリティ ガイダンスを使用してユーザー、エンティティ、またはオブジェクトのアイデンティティをレンダリングする方法を示します。" +--- +import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; +import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import avatarAnatomy from '@xplat-images/anatomy-content-light/avatar-lt-a.png'; +import avatarDo from '@xplat-images/avatar/avatar_do1.png'; +import avatarDo2x from '@xplat-images/avatar/avatar_do1@2x.png'; +import avatarDoNot from '@xplat-images/avatar/avatar_do_not1.png'; +import avatarDoNot2x from '@xplat-images/avatar/avatar_dont1@2x.png'; + +# Avatar (アバター) コンポーネント + +Ignite UI for Angular Avatar は、画像、イニシャル、またはカスタム コンテンツを使用してユーザー、エンティティ、またはオブジェクトを表します。 + +アバターを使用して、リスト、カード、プロフィール メニュー、アクティビティ フィードでコンパクトな視覚的アイデンティティを提供します。 + +## ライブ デモ + + + +## 構造 + +アバターは、画像のセマンティクスを適用し、サポートされているコンテンツ パターンのいずれかをレンダリングする単一のホスト要素です。 + + + + + +1. 画像コンテナー: 画像コンテンツ タイプを表示します。
+2. アイコン コンテナー: アイコン コンテンツ タイプを表示します。
+3. イニシャル コンテナー: テキスト コンテンツ タイプを表示します。
+ +```text +igx-avatar[role="img"] // ホスト - アバターを公開 +└─ 優先順位順に以下のいずれか: + ├─ div.igx-avatar__image // `src` が設定されている場合 - 背景として画像をレンダリング + ├─ igx-icon // `icon` が設定されている場合 + ├─ span // `initials` が設定されている場合 - 最初の 2 文字 + └─ ng-content // カスタム プロジェクション コンテンツ +``` + +## 作業の開始 + +`` をレンダリングする前に Angular アバター コンポーネントをインポートします。Ignite UI for Angular をまだセットアップしていない場合は、最初に共有 [作業の開始](../general/getting-started.mdx) トピックを完了してください。 + +```ts +import { IgxAvatarComponent } from 'igniteui-angular/avatar'; +``` + +## 使用方法 + +デフォルト スロットに画像ソース、イニシャル、またはカスタム コンテンツを使用してアバターをレンダリングします。 + +### バリアント + +表示するコンテンツ ソースのみを設定します。Angular アバターは、最初に `src` をレンダリングし、次に `icon`、次に `initials` をレンダリングし、これらのいずれの入力も設定されていない場合はプロジェクションされたカスタム コンテンツにフォールバックします。 + +```html + + + + + +``` + + + +### 形状 + + を `square`、`rounded`、または `circle` に設定します。 + +```html + +``` + + + +### サイズ + +プリセット アバター サイズが必要な場合は、`--ig-size` を共有サイズ トークンのいずれかに設定します。 + +```html + +``` + + + +### 使用すべき場合と使用すべきでない場合 + +**使用すべき場合:** プロフィール画像、イニシャル、アイコンなど、UI が人物、組織、オブジェクト、またはアカウントの小さな表現を必要とする場合にアバターを使用します。繰り返し表示されるアイデンティティを簡単に識別できるように、同じ UI 領域内で一貫したアバター戦略を維持します。 + +**使用すべきでない場合:** エンティティを表す代わりにカウント、ステータス、または通知インジケーターを表示する必要がある場合は、[Badge](../inputs/badge.mdx) コンポーネントを使用します。アイデンティティとステータスの両方を一緒に表示する必要がある場合、バッジはアバターを装飾することもできます。 + +
+ + + + + + + + + + + + + +
使用すべき使用すべきでない
Angular Avatar の使用ガイダンスAngular Avatar の不使用ガイダンス
+
+ +## プロパティ + +アバターは、コンテンツと形状のための小さな入力セットを公開します。 + +| 名前 | 型 | デフォルト | 説明 | +| -- | -- | -- | -- | +| | `string` | n/a | アバターがレンダリングするアイコンを設定します。 | +| | `string` | n/a | アバターがレンダリングするテキスト イニシャルを設定します。 | +| | `"square" \| "rounded" \| "circle"` | `"square"` | アバターの形状を設定します。 | +| | `"small" \| "medium" \| "large"` | `"small"` | アバターのサイズを設定します。 | +| | `string` | n/a | 画像ソース URL を設定します。 | + +## スタイル設定 + + + +アバターの外観はテーマ変数とプラットフォーム固有のスタイル設定フックを通じて制御されます。 + +トークン レベルの変更にはアバター CSS 変数を使用し、特定のレンダリング タイプや形状をターゲットにする必要がある場合は Angular ホスト クラスを使用します。 + +| 変数 | 変更内容 | +| -- | -- | +| `--ig-avatar-background` | アバターの背景色。 | +| `--ig-avatar-color` | テキストとイニシャルの色。 | +| `--ig-avatar-icon-color` | アイコンの色。 | +| `--ig-avatar-border-radius` | 丸みのあるアバターで使用される境界線の半径。 | +| `--ig-avatar-size` | アバターの幅と高さ。 | +| `--ig-size` | プリセット アバター サイズを導出するために使用する共有コンポーネント サイズ トークン。 | + +| セレクター | 説明 | +| -- | -- | +| `igx-avatar` | アバターのホスト要素。 | +| `.igx-avatar--rounded` | `shape` が `rounded` の場合に適用されます。 | +| `.igx-avatar--circle` | `shape` が `circle` の場合に適用されます。 | +| `.igx-avatar--image` | アバターが画像をレンダリングするときに適用されます。 | +| `.igx-avatar--icon` | アバターがアイコンをレンダリングするときに適用されます。 | +| `.igx-avatar--initials` | アバターがイニシャルをレンダリングするときに適用されます。 | +| `.igx-avatar__image` | 画像アバター要素。 | + +### Sass テーマ + +アプリケーションが Sass を通じて Ignite UI テーマをカスタマイズする場合は、 関数を使用します。 + +```scss +@use "igniteui-theming/sass/themes" as *; + +$custom-avatar-theme: avatar-theme( + $background: #72da67, + $border-radius: 16px, + $size: 3rem +); + +:root { + @include tokens($custom-avatar-theme); +} +``` + +### CSS 変数 + +Sass ビルド ステップなしでローカルでのスタイル設定が必要な場合は、コンポーネント CSS 変数を直接設定します。 + +```css +igx-avatar { + --ig-avatar-background: var(--ig-success-500); + --ig-avatar-color: var(--ig-success-500-contrast); + --ig-avatar-border-radius: 20px; +} +``` + +### Tailwind によるスタイル設定 + +アプリケーションが Tailwind クラスを通じて Ignite UI コンポーネントのスタイルを設定する場合は、Angular Tailwind ユーティリティ構文を使用します。 + + + +## アクセシビリティ + +アバターは、アクセシブルな画像セマンティクスを持つ非インタラクティブなアイデンティティ表示要素です。 + +### キーボード インタラクション + +アバターはフォーカスを受け取らず、キーボード インタラクションはありません。 + +| キー | アクション | +| -- | -- | +| n/a | アバターはキーボードによるインタラクティブ操作に対応していません。 | + +### スクリーン リーダー / ARIA + +アバターは画像のセマンティクスと `avatar` のデフォルトのアクセシブル ラベルで初期化されます。 + +- 画像アバターがアイデンティティを伝える場合、周囲のテキストを使用して表現される人物、エンティティ、またはオブジェクトを識別します。 +- 隣接するテキストがすでに同じエンティティを識別している場合、装飾的なアバターを冗長として扱います。 + +### アクセシビリティ準拠 + +Infragistics は、[アクセシビリティ準拠](../interactivity/accessibility-compliance.mdx) トピックで、Section 508 および WCAG 2.1 ガイドライン領域における Ignite UI for Angular のアクセシビリティ サポートを文書化しています。 + +| 基準 | コンポーネントの準拠方法 | +| -- | -- | +| [1.1.1 非テキスト コンテンツ](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content) | アバターにはアクセシブル ラベルがあり、表現されるエンティティを識別する周囲のテキストと組み合わせることができます。 | +| [4.1.2 名前、役割、値](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value) | コンポーネントは `role="img"` とデフォルトのアクセシブル ラベルで初期化されます。 | + +ユーザー側の責任: + +- スタイルをオーバーライドするときに、アバターの背景とテキストまたはアイコンの色のコントラストを十分に保ちます。 +- 隣接するテキストがすでに人物またはエンティティの名前を示している場合、同じアイデンティティのアナウンスを重複させないようにします。 + +- アバター画像がアイデンティティを伝える場合、近くのテキストが表現されるエンティティを識別していることを確認します。 + +## トラブルシューティング + +Avatar をインタラクティブまたはステータス コンポーネントとして扱う前に、このセクションを使用して境界と一般的な決定を確認してください。 + +### 既知の制限 + +アバターは視覚的なアイデンティティのプリミティブであり、それ自体ではインタラクション、ステータス、または通知動作を追加しません。 + +- 表現されるエンティティがクリック可能でなければならない場合は、ボタンやリスト アイテムなどのインタラクティブなコンテナーを使用します。 +- ステータス、カウント、または通知インジケーターを表示する必要がある場合は、アバターにバッジを使用します。 + +## API リファレンス + +完全なアバター API サーフェスについては、これらの API リファレンスを使用してください。 + + + +## 依存関係 + +Sass スタイル設定ワークフローは、 および API を使用します。 + +## その他のリソース + +サポートおよび関連する Ignite UI ドキュメントについては、これらのリソースを使用してください。 + +- [Ignite UI for Angular **フォーラム** (英語)](https://www.infragistics.com/community/forums/f/ignite-ui-for-angular) +- [Ignite UI for Angular **GitHub** (英語)](https://github.com/IgniteUI/igniteui-angular) + +## 関連コンポーネント + +アイデンティティをステータス、アクション、またはより豊富なレイアウトと組み合わせる必要がある場合は、これらの関連コンポーネントを使用してください。 + +- [Badge](../inputs/badge.mdx) - カウント、ステータス、または通知インジケーターを表示するには Badge を使用します。UI にアイデンティティとステータスの両方が必要な場合、Badge は Avatar を装飾できます。 + +## FAQ + + + + UI が人物、アカウント、組織、またはオブジェクトを表す必要がある場合に Avatar を使用します。UI がカウント、ステータス、または通知インジケーターを表示する必要がある場合は Badge を使用します。 + + + + いいえ。Avatar は非インタラクティブであり、それ自体ではフォーカスを受け取りません。表現されるエンティティがアクションを必要とする場合は、インタラクティブなコンポーネント内に配置してください。 + + + + アバター画像が特定のエンティティを識別する場合は、意味のある代替テキストを提供します。隣接するテキストがすでにそのエンティティの名前を示している場合、同じアイデンティティのアナウンスを繰り返さないようにします。 + + diff --git a/docs/angular/src/content/jp/components/list.mdx b/docs/angular/src/content/jp/components/list.mdx index 2b291240f7..2431442d8f 100644 --- a/docs/angular/src/content/jp/components/list.mdx +++ b/docs/angular/src/content/jp/components/list.mdx @@ -18,7 +18,7 @@ Ignite UI for Angular List コンポーネントは項目の行を表示し、 ## Angular List の例 -次の例は、_name_ プロパティと _phone number_ プロパティを持つ連絡先が入力されたリストを表しています。 コンポーネントは、[`IgxAvatar`](/avatar) と [`IgxIcon`](/icon) を使用して、ユーザー エクスペリエンスを向上させ、**連絡先をお気に入りに追加**にアバター写真とさまざまなアイコンを設定する機能を公開します。さらに、リスト ビューは、フィルタリング パイプを使用して実現されたソート機能を公開します。 +次の例は、_name_ プロパティと _phone number_ プロパティを持つ連絡先が入力されたリストを表しています。 コンポーネントは、[`IgxAvatar`](layouts/avatar.mdx) と [`IgxIcon`](/icon) を使用して、ユーザー エクスペリエンスを向上させ、**連絡先をお気に入りに追加**にアバター写真とさまざまなアイコンを設定する機能を公開します。さらに、リスト ビューは、フィルタリング パイプを使用して実現されたソート機能を公開します。 @@ -205,7 +205,7 @@ public contacts = [{ ### アバターおよびアイコンの追加 -その他のコンポーネントを と共に使用してエクスペリエンスの向上や機能拡張が可能です。名前や電話番号の値の左に画像のアバターを表示できます。また、連絡先をお気に入りに追加するための星アイコンを右側に追加できます。要素を追加するには、[**IgxAvatar**](/avatar) および [**IgxIcon**](/icon) モジュールを app.module.ts ファイルにインポートします。 +その他のコンポーネントを と共に使用してエクスペリエンスの向上や機能拡張が可能です。名前や電話番号の値の左に画像のアバターを表示できます。また、連絡先をお気に入りに追加するための星アイコンを右側に追加できます。要素を追加するには、[**IgxAvatar**](layouts/avatar.mdx) および [**IgxIcon**](/icon) モジュールを app.module.ts ファイルにインポートします。 ```typescript // app.module.ts diff --git a/docs/angular/src/content/jp/components/overlay.mdx b/docs/angular/src/content/jp/components/overlay.mdx index 26cf75cc52..a8ec201725 100644 --- a/docs/angular/src/content/jp/components/overlay.mdx +++ b/docs/angular/src/content/jp/components/overlay.mdx @@ -18,10 +18,11 @@ import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; オーバーレイ サービスはアプリケーションの前景にコンテンツを動的な描画をサポートします。描画するコンテンツおよび描画方法 (配置、アニメーション、スクロールおよびクリック動作など) を構成できます。 このオーバーレイ サービスは Toggle ディレクティブと完全に統合されています。
+
## Angular Overlay の例 - +
@@ -32,7 +33,7 @@ import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; ```typescript import { Inject } from '@angular/core' -import { IgxOverlayService } from `igniteui-angular`; +import { IgxOverlayService } from 'igniteui-angular'; ... @@ -133,19 +134,11 @@ Overlay サービスの メソッドを呼び出すと、ビューが DOM 内の元の場所に再アタッチされます。コンポーネントが メソッドに提供された場合、 を呼び出すと、作成されたインスタンスが破棄されます。 -- Get the reference to the passed view from Angular -- Detach the view from the DOM and leave an anchor in its place -- Re-attach the view to the overlay using the provided or falling back to the default overlay ones - -Calling then will play the open animation, if there is any, and will show the attached content. Calling will play close animation, if there is any, and will hide the attached content. - -Finally calling method will re-attach the view back to its original location in the DOM. If a component was provided to the method calling will destroy the created instance. -
## コンポーネントのアタッチ -閉じた後、ビューを DOM にある元の位置にアタッチします。以下のデモでは、[IgxCard](/card#angular-card-の例) コンポーネントをオーバーレイ サービスの メソッドに渡し、IDを生成します。次に、提供された ID で メソッドを呼び出し、カードをモーダル コンテナーで DOM にアタッチします。 +以下のデモでは、[IgxCard](/card#angular-card-の例) コンポーネントをオーバーレイ サービスの メソッドに渡し、IDを生成します。次に、提供された ID で メソッドを呼び出し、カードをモーダル コンテナーで DOM にアタッチします。 @@ -155,11 +148,11 @@ Finally calling メソッドは 型のオブジェクトを受け取ります。このオブジェクトはコンテンツの表示方法を構成します。このオブジェクトが指定されていない場合、Overlay サービスは渡されたコンテンツを描画するためにデフォルト設定を使用します。 -たとえば、コンテンツを要素に相対的に配置するには、オーバーレイの メソッドに別の ( など) を渡します。コンポーネントの表示方法を構成するには、最初に オブジェクトを作成します。 +たとえば、コンテンツを要素に相対的に配置するには、オーバーレイの メソッドに別の ( など) を渡します。コンポーネントの表示方法を構成するには、最初に オブジェクトを作成します。 ```typescript // my-overlay-component.component.ts -// import the ConnectedPositioningStategy class +// import the ConnectedPositioningStrategy class import { ConnectedPositioningStrategy } from 'igniteui-angular/core'; // import { ConnectedPositioningStrategy } from '@infragistics/igniteui-angular'; for licensed package ... @@ -227,7 +220,7 @@ const connectedOverlaySettings = IgxOverlayService.createRelativeOverlaySettings ```typescript // my-overlay-component.component.ts -// add an import for the definion of ConnectedPositioningStategy class +// add an import for the definition of ConnectedPositioningStrategy class import { ConnectedPositioningStrategy } from 'igniteui-angular/core'; // import { ConnectedPositioningStrategy } from '@infragistics/igniteui-angular'; for licensed package @@ -285,7 +278,7 @@ export class MyOverlayComponent implements OnDestroy {
- が指定されていない場合、切り替えた要素はデフォルト表示設定を使用します。 + が**指定されていない**場合、切り替えた要素は**デフォルト表示設定**を使用します。 ```typescript defaultOverlaySettings = { diff --git a/docs/angular/src/content/jp/components/stepper.mdx b/docs/angular/src/content/jp/components/stepper.mdx index 0776563843..c27ee7b9ad 100644 --- a/docs/angular/src/content/jp/components/stepper.mdx +++ b/docs/angular/src/content/jp/components/stepper.mdx @@ -256,7 +256,7 @@ Ignite UI for Angular Stepper では、タイトル、インジケーターな ステップのインジケーターのみを表示する場合は、 オプションを `indicator` に設定します。 -ステップ インジケーターはすべてのコンテンツをサポートしますが、サイズが常に **24 ピクセル**になるという制限があります。この点に注意して、ステップ インジケーターとして [IgxIconComponent](/icon) または [IgxAvatarComponent](/avatar) を使用することをお勧めします。 +ステップ インジケーターはすべてのコンテンツをサポートしますが、サイズが常に **24 ピクセル**になるという制限があります。この点に注意して、ステップ インジケーターとして [IgxIconComponent](/icon) または [IgxAvatarComponent](layouts/avatar.mdx) を使用することをお勧めします。 **Title (タイトル)** diff --git a/docs/angular/src/content/jp/components/themes/misc/angular-material-theming.mdx b/docs/angular/src/content/jp/components/themes/misc/angular-material-theming.mdx index 9bf1b5b5a0..915b65552d 100644 --- a/docs/angular/src/content/jp/components/themes/misc/angular-material-theming.mdx +++ b/docs/angular/src/content/jp/components/themes/misc/angular-material-theming.mdx @@ -417,7 +417,7 @@ $custom-mat-light-theme: mat.define-light-theme(( - [パレット](../sass/palettes.mdx) - [コンポーネント テーマ](../sass/component-themes.mdx) - [タイポグラフィ](../sass/typography.mdx) -- [Avatar コンポーネント](../../avatar.mdx) +- [Avatar コンポーネント](../../layouts/avatar.mdx) - [Button コンポーネント](../../button.mdx) - [Dialog コンポーネント](../../dialog.mdx) - [Icon コンポーネント](../../icon.mdx) diff --git a/docs/angular/src/content/jp/components/themes/misc/bootstrap-theming.mdx b/docs/angular/src/content/jp/components/themes/misc/bootstrap-theming.mdx index 0468a79346..92b63f123f 100644 --- a/docs/angular/src/content/jp/components/themes/misc/bootstrap-theming.mdx +++ b/docs/angular/src/content/jp/components/themes/misc/bootstrap-theming.mdx @@ -367,7 +367,7 @@ Ignite UI for Angular は、テーマごとに 4 つのデフォルト タイプ - [パレット](../sass/palettes.mdx) - [コンポーネント テーマ](../sass/component-themes.mdx) - [タイポグラフィ](../sass/typography.mdx) -- [Avatar コンポーネント](../../avatar.mdx) +- [Avatar コンポーネント](../../layouts/avatar.mdx) - [Button コンポーネント](../../button.mdx) - [Dialog コンポーネント](../../dialog.mdx) - [Icon コンポーネント](../../icon.mdx) diff --git a/docs/angular/src/content/jp/components/toc.json b/docs/angular/src/content/jp/components/toc.json index 76b65b25e1..a99226fdfb 100644 --- a/docs/angular/src/content/jp/components/toc.json +++ b/docs/angular/src/content/jp/components/toc.json @@ -2010,7 +2010,7 @@ }, { "name": "Badge", - "href": "badge.mdx", + "href": "inputs/badge.mdx", "updated": false }, { @@ -2196,7 +2196,7 @@ }, { "name": "Avatar", - "href": "avatar.mdx" + "href": "layouts/avatar.mdx" }, { "name": "Expansion Panel", diff --git a/docs/angular/src/content/jp/components/tooltip.mdx b/docs/angular/src/content/jp/components/tooltip.mdx index a06725c76f..4f3990798e 100644 --- a/docs/angular/src/content/jp/components/tooltip.mdx +++ b/docs/angular/src/content/jp/components/tooltip.mdx @@ -85,7 +85,7 @@ Ignite UI for Angular Tooltip モジュールまたはディレクティブを ## Angular Tooltip の使用 -上記のようにシンプルなテキスト ツールチップを作成します。`IgxAvatarModule` をインポートして要素として [`IgxAvatar`](/avatar) を使用します。 +上記のようにシンプルなテキスト ツールチップを作成します。`IgxAvatarModule` をインポートして要素として [`IgxAvatar`](layouts/avatar.mdx) を使用します。 ```typescript // app.module.ts @@ -159,7 +159,7 @@ avatar をターゲットにして、 を活用し、マップの特定の場所について詳細な情報を提供します。単純な div を使用してマップを表示し、ツールチップのロゴに [`IgxAvatar`](/avatar)、マップの場所アイコンに [`IgxIcon`](/icon) を使用します。この目的のためには、各モジュールを取得する必要があります。 + を活用し、マップの特定の場所について詳細な情報を提供します。単純な div を使用してマップを表示し、ツールチップのロゴに [`IgxAvatar`](layouts/avatar.mdx)、マップの場所アイコンに [`IgxIcon`](/icon) を使用します。この目的のためには、各モジュールを取得する必要があります。 ```typescript // app.module.ts diff --git a/docs/angular/src/content/jp/images/anatomy-content-light/avatar-lt-a.png b/docs/angular/src/content/jp/images/anatomy-content-light/avatar-lt-a.png new file mode 100644 index 0000000000..628c84a4d5 Binary files /dev/null and b/docs/angular/src/content/jp/images/anatomy-content-light/avatar-lt-a.png differ diff --git a/docs/angular/src/content/jp/images/anatomy-content-light/badge-lt-a.png b/docs/angular/src/content/jp/images/anatomy-content-light/badge-lt-a.png new file mode 100644 index 0000000000..7318080d95 Binary files /dev/null and b/docs/angular/src/content/jp/images/anatomy-content-light/badge-lt-a.png differ diff --git a/docs/angular/src/content/jp/images/avatar/avatar_do1.png b/docs/angular/src/content/jp/images/avatar/avatar_do1.png new file mode 100644 index 0000000000..079a6fac58 Binary files /dev/null and b/docs/angular/src/content/jp/images/avatar/avatar_do1.png differ diff --git a/docs/angular/src/content/jp/images/avatar/avatar_do1@2x.png b/docs/angular/src/content/jp/images/avatar/avatar_do1@2x.png new file mode 100644 index 0000000000..a916acd815 Binary files /dev/null and b/docs/angular/src/content/jp/images/avatar/avatar_do1@2x.png differ diff --git a/docs/angular/src/content/jp/images/avatar/avatar_do_not1.png b/docs/angular/src/content/jp/images/avatar/avatar_do_not1.png new file mode 100644 index 0000000000..6d51576c23 Binary files /dev/null and b/docs/angular/src/content/jp/images/avatar/avatar_do_not1.png differ diff --git a/docs/angular/src/content/jp/images/avatar/avatar_dont1@2x.png b/docs/angular/src/content/jp/images/avatar/avatar_dont1@2x.png new file mode 100644 index 0000000000..737a7f0c8a Binary files /dev/null and b/docs/angular/src/content/jp/images/avatar/avatar_dont1@2x.png differ diff --git "a/docs/angular/src/content/jp/images/badge/badge-do-n\320\276t.png" "b/docs/angular/src/content/jp/images/badge/badge-do-n\320\276t.png" new file mode 100644 index 0000000000..6b8bd52121 Binary files /dev/null and "b/docs/angular/src/content/jp/images/badge/badge-do-n\320\276t.png" differ diff --git a/docs/angular/src/content/jp/images/badge/badge-do.png b/docs/angular/src/content/jp/images/badge/badge-do.png new file mode 100644 index 0000000000..b8374e9278 Binary files /dev/null and b/docs/angular/src/content/jp/images/badge/badge-do.png differ diff --git a/docs/xplat/package.json b/docs/xplat/package.json index 4bac430430..8fa2b2ecf7 100644 --- a/docs/xplat/package.json +++ b/docs/xplat/package.json @@ -25,7 +25,6 @@ "dev:react:jp": "npm run generate:react:jp && cross-env PLATFORM=React astro dev --port 4332", "dev:webcomponents:jp": "npm run generate:webcomponents:jp && cross-env PLATFORM=WebComponents astro dev --port 4333", "dev:blazor:jp": "npm run generate:blazor:jp && cross-env PLATFORM=Blazor astro dev --port 4334", - "build:angular": "npm run generate:angular && cross-env PLATFORM=Angular NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/angular", "build:react": "npm run generate:react && cross-env PLATFORM=React NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/react", "build:webcomponents": "npm run generate:webcomponents && cross-env PLATFORM=WebComponents NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/wc", @@ -34,7 +33,6 @@ "build:react:jp": "npm run generate:react:jp && cross-env PLATFORM=React NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/react-jp", "build:webcomponents:jp": "npm run generate:webcomponents:jp && cross-env PLATFORM=WebComponents NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/wc-jp", "build:blazor:jp": "npm run generate:blazor:jp && cross-env PLATFORM=Blazor NODE_OPTIONS=--max-old-space-size=4096 astro build --outDir=../../dist/blazor-jp", - "build-staging:angular": "cross-env PLATFORM=Angular DOCS_ENV=staging NODE_ENV=production NODE_OPTIONS=--max-old-space-size=4096 npm run build:angular", "build-staging:react": "cross-env PLATFORM=React DOCS_ENV=staging NODE_ENV=production NODE_OPTIONS=--max-old-space-size=4096 npm run build:react", "build-staging:webcomponents": "cross-env PLATFORM=WebComponents DOCS_ENV=staging NODE_ENV=production NODE_OPTIONS=--max-old-space-size=4096 npm run build:webcomponents", @@ -51,7 +49,6 @@ "build-production:react:jp": "cross-env PLATFORM=React NODE_ENV=production npm run build:react:jp", "build-production:webcomponents:jp": "cross-env PLATFORM=WebComponents NODE_ENV=production npm run build:webcomponents:jp", "build-production:blazor:jp": "cross-env PLATFORM=Blazor NODE_ENV=production npm run build:blazor:jp", - "preview:angular": "cross-env PLATFORM=Angular astro preview --outDir=../../dist/angular --port 4331", "preview:react": "cross-env PLATFORM=React astro preview --outDir=../../dist/react --port 4332", "preview:webcomponents": "cross-env PLATFORM=WebComponents astro preview --outDir=../../dist/wc --port 4333", @@ -65,10 +62,10 @@ "node": ">=22.12.0" }, "dependencies": { - "astro": "^6.1.6", + "astro": "^7.2.2", "docs-template": "file:../../", - "igniteui-astro-components": "0.0.27", - "sharp": "^0.34.2" + "igniteui-astro-components": "1.0.2", + "sharp": "^0.35.3" }, "devDependencies": { "cross-env": "^10.1.0", diff --git a/docs/xplat/src/assets/images/avatar/avatar_do1.png b/docs/xplat/src/assets/images/avatar/avatar_do1.png new file mode 100644 index 0000000000..079a6fac58 Binary files /dev/null and b/docs/xplat/src/assets/images/avatar/avatar_do1.png differ diff --git a/docs/xplat/src/assets/images/avatar/avatar_do1@2x.png b/docs/xplat/src/assets/images/avatar/avatar_do1@2x.png new file mode 100644 index 0000000000..a916acd815 Binary files /dev/null and b/docs/xplat/src/assets/images/avatar/avatar_do1@2x.png differ diff --git a/docs/xplat/src/assets/images/avatar/avatar_do_not1.png b/docs/xplat/src/assets/images/avatar/avatar_do_not1.png new file mode 100644 index 0000000000..6d51576c23 Binary files /dev/null and b/docs/xplat/src/assets/images/avatar/avatar_do_not1.png differ diff --git a/docs/xplat/src/assets/images/avatar/avatar_dont1@2x.png b/docs/xplat/src/assets/images/avatar/avatar_dont1@2x.png new file mode 100644 index 0000000000..737a7f0c8a Binary files /dev/null and b/docs/xplat/src/assets/images/avatar/avatar_dont1@2x.png differ diff --git "a/docs/xplat/src/assets/images/badge/badge-do-n\320\276t.png" "b/docs/xplat/src/assets/images/badge/badge-do-n\320\276t.png" new file mode 100644 index 0000000000..6b8bd52121 Binary files /dev/null and "b/docs/xplat/src/assets/images/badge/badge-do-n\320\276t.png" differ diff --git a/docs/xplat/src/assets/images/badge/badge-do.png b/docs/xplat/src/assets/images/badge/badge-do.png new file mode 100644 index 0000000000..b8374e9278 Binary files /dev/null and b/docs/xplat/src/assets/images/badge/badge-do.png differ diff --git a/docs/xplat/src/assets/images/button-group/button-group-do-1.png b/docs/xplat/src/assets/images/button-group/button-group-do-1.png new file mode 100644 index 0000000000..4acaf050a9 Binary files /dev/null and b/docs/xplat/src/assets/images/button-group/button-group-do-1.png differ diff --git a/docs/xplat/src/assets/images/button-group/button-group-do-2.png b/docs/xplat/src/assets/images/button-group/button-group-do-2.png new file mode 100644 index 0000000000..d9c79b1461 Binary files /dev/null and b/docs/xplat/src/assets/images/button-group/button-group-do-2.png differ diff --git a/docs/xplat/src/assets/images/button-group/button-group-do-3.png b/docs/xplat/src/assets/images/button-group/button-group-do-3.png new file mode 100644 index 0000000000..2f016de185 Binary files /dev/null and b/docs/xplat/src/assets/images/button-group/button-group-do-3.png differ diff --git a/docs/xplat/src/assets/images/button-group/button-group-do-not-1.png b/docs/xplat/src/assets/images/button-group/button-group-do-not-1.png new file mode 100644 index 0000000000..4634972692 Binary files /dev/null and b/docs/xplat/src/assets/images/button-group/button-group-do-not-1.png differ diff --git a/docs/xplat/src/assets/images/button-group/button-group-do-not-2.png b/docs/xplat/src/assets/images/button-group/button-group-do-not-2.png new file mode 100644 index 0000000000..585f7ff91c Binary files /dev/null and b/docs/xplat/src/assets/images/button-group/button-group-do-not-2.png differ diff --git a/docs/xplat/src/assets/images/button-group/button-group-do-not-3.png b/docs/xplat/src/assets/images/button-group/button-group-do-not-3.png new file mode 100644 index 0000000000..68d4a04dc5 Binary files /dev/null and b/docs/xplat/src/assets/images/button-group/button-group-do-not-3.png differ diff --git a/docs/xplat/src/content/en/components/inputs/badge.mdx b/docs/xplat/src/content/en/components/inputs/badge.mdx index 333eea4044..4faba407f2 100644 --- a/docs/xplat/src/content/en/components/inputs/badge.mdx +++ b/docs/xplat/src/content/en/components/inputs/badge.mdx @@ -1,37 +1,97 @@ --- -title: "{Platform} Badge | Infragistics" -description: Infragistics' {Platform} Badge component allows you to display content in a predefined style to decorate other components anywhere in an application. -keywords: "{Platform}, UI controls, web widgets, UI widgets, Web Components, {Platform} Badge Components, Infragistics" +title: "Badge" +description: "The {ProductName} Badge displays a short status, category, count, or notification indicator alongside avatars, navigation menus, and other components." +keywords: "{Platform} Badge, {ProductName}, badge indicator" license: MIT mentionedTypes: ["Badge"] +last_updated: "2026-07-24" llms: - description: "The {ProductName} Badge is a component used in conjunction with avatars, navigation menus, or other components in an application when a visual notification is needed." + description: "The {ProductName} Badge component displays a short status, category, count, or notification indicator alongside avatars, navigation menus, and other components." --- import PlatformBlock from 'igniteui-astro-components/components/mdx/PlatformBlock.astro'; import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import badgeAnatomy from '@xplat-images/anatomy-content-light/badge-lt-a.png'; +import badgeDo from '@xplat-images/badge/badge-do.png'; +import badgeDoNot from '@xplat-images/badge/badge-do-nоt.png'; -# {Platform} Badge Overview +# Badge Component -The {ProductName} Badge is a component used in conjunction with avatars, navigation menus, or other components in an application when a visual notification is needed. Badges are usually designed with predefined styles to communicate information, success, warnings, or errors. +The {Platform} Badge component is provided by the platform-specific {ProductName} package and is used in conjunction with avatars, navigation menus, or other components in an application when a visual notification is needed. Badges are usually designed with predefined styles to communicate information, success, warnings, or errors. -## {Platform} Badge Example +## Live Demo - +The {Platform} Badge demo shows how the component can communicate a compact status or notification next to another interface element. - + -## Usage + + + + + + + + + + +## Anatomy + +The {Platform} Badge presents a compact label or dot indicator that decorates another interface element. + + + + + +1. Dot indicator: A small badge dot used to show a status or a new update.
+2. Icon: Represents the type of status or action.
+3. Container: The badge shape that holds and styles the icon or label.
+4. Label: Text or a number displayed inside the badge.
+ +The component renders its content inside the `base` CSS part. Use the component's default slot for text or other inline content; when `dot` is enabled, the badge renders as an indicator without content. + +```text + +└── ::part(base) + └── default slot content + +``` + +## Getting Started + +To use the {Platform} Badge, follow the [{ProductName} Getting Started](../general-getting-started.mdx) topic for the basic project setup, then register the component for your target platform. + +### Prerequisites and Version Compatibility + +Use a supported version of the {ProductName} package for your target framework. Keep the framework package, the Badge package, and the theme package on the same release version. The examples below identify the framework and package used by each code block so that the snippets remain self-contained when read without the surrounding page context. -First, you need to install the {ProductName} by running the following command: +For Web Components using the **{PackageWebComponents}** package, install the package: ```cmd npm install {PackageWebComponents} ``` -You will then need to import the , its necessary CSS, and register its module, like so: +You will then need to import the , its theme CSS, and register the component, like so: ```ts import { defineComponents, IgcBadgeComponent } from "igniteui-webcomponents"; @@ -40,19 +100,17 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; defineComponents(IgcBadgeComponent); ``` -For a complete introduction to the {ProductName}, read the [**Getting Started**](../general-getting-started.mdx) topic. - -First, you need to the install the corresponding {ProductName} npm package by running the following command: +For React using the **igniteui-react** package, install the package: ```cmd npm install igniteui-react ``` -You will then need to import the and its necessary CSS like so: +You will then need to import the Badge wrapper and its theme CSS, like so: ```tsx import { IgrBadge } from 'igniteui-react'; @@ -63,7 +121,7 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; -Before using the , you need to register it as follows: +For Blazor using the **IgniteUI.Blazor** package, register the Badge module as follows: ```csharp // in Program.cs file @@ -79,10 +137,34 @@ You will also need to link an additional CSS file to apply the styling to the
+ + +For Angular using the **igniteui-angular** package, install the package: + +```cmd +npm install igniteui-angular +``` + +Then import the Badge component: + +```ts +import { IgxBadgeComponent } from 'igniteui-angular/badge'; +``` + +Add `IgxBadgeComponent` to the component `imports` collection, then use the `igx-badge` element in your template. + The simplest way to start using the is as follows: +```html + +``` + + + +The simplest way to start using the is as follows: + ```html ``` @@ -105,39 +187,403 @@ The simplest way to start using the is as fo -## Examples +## Usage + +Use the {Platform} Badge to display a short status, category, count, or notification indicator alongside another component. + + + +Let's see how the demo sample is done. It's a simple success badge on an avatar. To build that, import the `IgxAvatarModule` together with the `IgxBadgeModule`: + +```typescript +import { IgxBadgeModule } from 'igniteui-angular/badge'; +import { IgxAvatarModule } from 'igniteui-angular/avatar'; +``` + +Add both modules to the component `imports` collection, or import the standalone components. Then add the components to your template: + +```html +
+ + +
+``` + +Use a relatively positioned wrapper to place the Badge over the avatar: + +```scss +.wrapper { + position: relative; + margin-top: 15px; +} + +igx-badge { + position: absolute; + bottom: 0; + left: 28px; +} +``` + +### Type + +The Badge can carry different types of content such as a number or an icon. + +Use the `[value]` input to display text or a numeric count inside the Badge: + +```html + +``` + +Use the `[icon]` input to display an icon inside the Badge: + +```html + +``` + +When both `[icon]` and `[value]` are set, the Badge displays both simultaneously: + +```html + +``` + +You can also project content directly. When projecting both an icon and text, wrap the text to keep the correct padding: + +```html + + bluetooth + Bluetooth + +``` + + + +#### Icon +In addition to Material Icons, the Angular Badge supports Material Icons Extended and other custom icon sets. Register the custom icon with `IgxIconService`, then specify its name and icon set: + +```ts +this._iconService.addSvgIconFromText(heartMonitor.name, heartMonitor.value, 'imx-icons'); +``` + +```html + +``` + + + +#### Dot + +The Ignite UI for Angular Badge can also render as a minimal dot indicator for notifications by setting its attribute. Dot badges do not support content, but they can be outlined and can use any of the available dot types (for example, `primary`, `success`, or `info`). + +Set the attribute to render a minimal notification indicator without content: + +```html + +``` + + + +### Size + +Control the Badge size with the `--size` CSS variable. For text badges smaller than `16px`, also adjust the font size and line height: + +```scss +igx-badge { + --size: 12px; + + font-size: calc(var(--size) / 2); + line-height: normal; +} +``` + + + +### Shape + +The Badge shape can be set to `rounded` (the default) or `square` with the attribute. + +```html + +``` + + + +When the Badge has a `square` shape, it can be further customized by setting a custom border radius using the `--border-radius` CSS variable. ### Variants -The {ProductName} badge supports several pre-defined stylistic variants. You can change the variant by assigning one of the supported values - `primary`(default), `info`, `success`, `warning`, or `danger` to the attribute. +The Angular Badge supports the Primary, Info, Success, Warn, and Error types. Set the attribute to select a type. + +```html + +``` + + + +
+ + + +The following example shows a success Badge displayed on an Avatar. Import the Badge and Avatar components from the platform-specific package, then place the Badge inside a relatively positioned wrapper. ```tsx - +import { IgrAvatar, IgrBadge } from 'igniteui-react'; +import 'igniteui-webcomponents/themes/light/bootstrap.css'; +``` + +Add the components to your JSX: + +```tsx +
+ + +
```
+```ts +import { defineComponents, IgcAvatarComponent, IgcBadgeComponent } from 'igniteui-webcomponents'; +import 'igniteui-webcomponents/themes/light/bootstrap.css'; + +defineComponents(IgcAvatarComponent, IgcBadgeComponent); +``` + +Add the components to your HTML: + ```html - +
+ + +
```
+Register the Avatar and Badge modules in `Program.cs`: + +```csharp +builder.Services.AddIgniteUIBlazor(typeof(IgbAvatarModule), typeof(IgbBadgeModule)); +``` + +Add the components to your Razor markup: + ```razor - +
+ + +
+``` + +
+ +Use a relatively positioned wrapper to place the Badge over the Avatar: + +```css +.wrapper { + position: relative; + margin-top: 15px; +} +``` + +
+ + + +### Type + +The {ProductName} Badge can carry different types of content, such as a number or an icon. + +Use the property to display text or a numeric count inside the Badge: + + + +```tsx +12 +``` + + + + + +```html +12 +``` + + + + + +```razor +12 +``` + + + +You can also project content directly. When projecting both an icon and text, wrap the text to keep the correct padding. + + + +```tsx + + + Bluetooth + ``` - + + +```html + + + Bluetooth + +``` -Even if a custom background color is set for the badge using the `--background-color` CSS variable, the variant color always takes precedence and is applied to the badge. + + + + +```razor + + + Bluetooth + +``` + + + + + +#### Icon + +Add an icon as child content inside the Badge: + + + +```tsx + + + +``` + + + + + +```html + + + +``` + + + + + +```razor + + + +``` + + + +For custom icons, register the icon with the platform's icon service and render it as child content inside the Badge. + +For example, register an SVG icon before using it in the Badge: + + + +```ts +import { registerIconFromText } from 'igniteui-webcomponents'; + +registerIconFromText( + 'heart-monitor', + '', + 'custom' +); +``` + + + + + +```razor +@code { + private IgbIcon icon; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender && icon != null) + { + await icon.EnsureReady(); + await icon.RegisterIconFromTextAsync( + "heart-monitor", + "", + "custom"); + } + } +} +``` + + + + + +#### Dot + +The {ProductName} Badge can also render as a minimal dot indicator for notifications by setting its attribute. Dot badges do not support content, but they can be outlined and can use any of the available dot types (for example, `primary`, `success`, or `info`). + +Set the attribute to render a minimal notification indicator without content: + + + +```tsx + +``` + + + + + +```html + +``` + + + + + +```razor + +``` + + + + + +### Size + +Control the Badge size with the `--size` CSS variable. For text badges smaller than `16px`, also adjust the font size and line height: + +```css +igc-badge { + --size: 12px; + + font-size: calc(var(--size) / 2); + line-height: normal; +} +``` + + ### Shape @@ -167,18 +613,22 @@ The badge component supports `rounded`(default) and `square` shapes. These value - + + + When the badge has a `square` shape, it can be further customized by setting a custom border radius using the `--border-radius` CSS variable. -### Outlined + -The badge can also have a subtle border around it when the attribute is set. +### Variants + +The {ProductName} Badge supports several pre-defined stylistic variants (Primary, Info, Success, Warn, and Error). Assign one of the supported values — `primary`, `info`, `success`, `warning`, or `danger` — to the attribute. ```tsx - + ``` @@ -186,7 +636,7 @@ The badge can also have a subtle border around it when the ```html - + ```
@@ -194,23 +644,23 @@ The badge can also have a subtle border around it when the ```razor - + ```
- + -The border color of the outlined badge can also be customized using the `--border-color` CSS variable. +
-### Dot +### Outlined -The {ProductName} badge component can also render as a minimal dot indicator for notifications by setting its attribute. Dot badges do not support content, but they can be outlined and can use any of the available dot types (e.g., primary, success, info, etc.). +The badge can also have a subtle border around it when the attribute is set. ```tsx - + ``` @@ -218,7 +668,7 @@ The {ProductName} badge component can also render as a minimal dot indicator for ```html - + ``` @@ -226,16 +676,123 @@ The {ProductName} badge component can also render as a minimal dot indicator for ```razor - + ``` - + + +```html + +``` + + + + + + + + + + + + + +The border color of the outlined badge can also be customized using the `--border-color` CSS variable. + + + +### Do/Don't + +**When to use:** Use a Badge to communicate a short status, category, count, or notification state alongside another component. Use `dot` when the indicator does not need visible text. + +**When not to use:** Do not use a Badge as the primary control for an action, as a replacement for a form validation message, or when the status cannot be understood from the badge content, surrounding context, or accessible labeling. + +
+ + + + + + + + + + + + + +
DoDon't
Badge used with an Avatar and a text labelBadge examples used without a surrounding interface element
+
+ +## Properties + +The {Platform} Badge exposes platform-specific properties for controlling its content, appearance, and indicator behavior. + + + +The Angular Badge exposes the following properties. Use the API reference for the complete type definitions. + +| name | type | default | description | +| --- | --- | --- | --- | +| | boolean | `false` | Renders the Badge as a dot indicator without content. | +| | boolean | `false` | Displays an outline around the Badge. | +| | BadgeShape | `rounded` | Sets the Badge shape. | +| | BadgeType | `default` | Sets the Angular Badge stylistic type. | +| | string | — | Applies a custom CSS class. | + + + + + +The React Badge exposes the following properties. + +| name | type | default | description | +| --- | --- | --- | --- | +| | boolean | `false` | Renders the Badge as a dot indicator. | +| | boolean | `false` | Displays an outline around the Badge. | +| | BadgeShape | `rounded` | Sets the Badge shape. | +| | StyleVariant | `primary` | Sets the Badge stylistic variant. | + + + + + +The Web Components Badge exposes the following properties. + +| name | type | default | description | +| --- | --- | --- | --- | +| | boolean | `false` | Renders the Badge as a dot indicator. | +| | boolean | `false` | Displays an outline around the Badge. | +| | BadgeShape | `rounded` | Sets the Badge shape. | +| | StyleVariant | `primary` | Sets the Badge stylistic variant. | +| | CSSResult | — | Applies custom styles. | + + + + + +The Blazor Badge exposes the following properties. + +| name | type | default | description | +| --- | --- | --- | --- | +| | boolean | `false` | Renders the Badge as a dot indicator. | +| | boolean | `false` | Displays an outline around the Badge. | +| | BadgeShape | `rounded` | Sets the Badge shape. | +| | StyleVariant | `primary` | Sets the Badge stylistic variant. | + + ## Styling -The component exposes a `base` CSS part that can be used to change all of its style properties. +The {Platform} Badge uses the component's `base` CSS part and documented styling variables to customize its appearance. + +### Sass Theming + +Use the {ProductName} theme system to style the Badge consistently with the rest of your application. + +### CSS Variables ```css igc-badge::part(base) { @@ -244,11 +801,164 @@ igc-badge::part(base) { } ``` - +| variable | what it changes | +| --- | --- | +| `--background-color` | The badge background color. | +| `--border-radius` | The badge corner radius. | +| `--border-color` | The outlined badge border color. | + +### Style Parts + +| part | what it styles | +| --- | --- | +| `base` | The Badge root element. | + + + + + +### Styling with Tailwind + +You can style the Badge using custom Tailwind utility classes. Make sure to [set up Tailwind](/themes/tailwind) first. + +Along with the Tailwind import in your global stylesheet, include the utility file: + +```scss +@import "tailwindcss"; +@use 'igniteui-theming/tailwind/utilities/material.css'; +``` + +Use `light-badge` and `dark-badge` for the light and dark theme variants. You can override the generated CSS variables with arbitrary properties: + +```html + + +``` + +The exclamation mark (`!`) ensures that the utility class takes precedence over the component's default theme. + + + + + + + + + +### Styling with Tailwind + +You can style the Badge with the custom Tailwind utility classes from `igniteui-theming`. Make sure to [set up Tailwind](/themes/tailwind) first, then import the Ignite UI utilities in your global stylesheet: + +```css +@import "tailwindcss"; +@import "igniteui-theming/tailwind/utilities/material.css"; +``` + + + +```jsx + +``` + + + + + +```html + +``` + + + + + +```razor + +``` + + + +The exclamation mark (`!`) gives the Tailwind utility precedence over the Badge's default theme styles. + + + + + +## Accessibility + +The {Platform} Badge communicates a visual status and must have meaningful text or surrounding accessible context when that status is important. + +### Keyboard Interaction + +The Badge is a visual status indicator and does not provide an interactive keyboard action. It is reached according to the focus behavior of the element it decorates. + +### Screen Readers / ARIA + +Provide meaningful visible content or an accessible label in the surrounding component when the Badge conveys information that is not otherwise available to assistive technology. Verify the resulting announcement for the specific surrounding control. + +### Accessibility Compliance + +Accessibility conformance for this component must be verified against the official product accessibility statement and the rendered usage context. + +## Troubleshooting + +The {Platform} Badge troubleshooting guidance follows a problem → cause → fix format for common styling and content issues. + +### Why does my custom background color not change the Badge? + +The selected `variant` takes precedence over the `--background-color` CSS variable. To use a custom background color, avoid setting a variant that applies its own background color. + +### Why is my dot Badge not displaying content? + +The `dot` property renders the Badge as a minimal indicator and does not support content. Use a regular Badge when you need to display text or other inline content. + +### Known Limitations + +The {Platform} Badge has the following platform-independent limitations. + +- A dot Badge is an indicator only and cannot display text or an icon. +- Badge styling and variant/type names differ between Angular and the other supported frameworks. Use the platform-specific examples and API links on this page rather than copying an attribute between frameworks. +- The Badge is a visual status indicator and does not provide keyboard interaction of its own. ## API References + +The {Platform} Badge API reference lists the complete verified API surface for the target platform. + +## Dependencies + +The {Platform} Badge requires a theme stylesheet to apply its visual styling. See the framework-specific setup in **Getting Started**. + ## Additional Resources +The following resources provide additional {Platform} Badge guidance and project support. + - [{ProductName} **Forums**]({ForumsLink}) - [{ProductName} **GitHub**]({GithubLink}) + +## Related Components + +The {Platform} Badge is commonly used with related components such as Avatar when a status indicator belongs to another visual element. + +- [Avatar](../layouts/avatar.mdx) — combine an Avatar with a Badge to show a status indicator. + +## FAQ + +These frequently asked questions cover common {Platform} Badge content, indicator, and package choices. + + + + + Yes. Use the platform-specific value and icon APIs shown in **Usage**. When projecting content directly, keep the icon and text in the component's default content area. + + + + Set the platform-specific `dot` property or attribute. A dot Badge intentionally renders without text or other content. + + + + Use `igniteui-angular` for Angular, `igniteui-react` for React, `igniteui-webcomponents` for Web Components, and `IgniteUI.Blazor` for Blazor. Keep related Ignite UI packages on the same release version. + + + \ No newline at end of file diff --git a/docs/xplat/src/content/en/components/inputs/button-group.mdx b/docs/xplat/src/content/en/components/inputs/button-group.mdx index a61151ce6a..32d1dfc9e5 100644 --- a/docs/xplat/src/content/en/components/inputs/button-group.mdx +++ b/docs/xplat/src/content/en/components/inputs/button-group.mdx @@ -1,40 +1,110 @@ --- -title: "{Platform} Button Group Component | {ProductName}" -description: Get started with the {Platform} Button Group Component - series of {Platform} Toggle Buttons, exposing features such as layout and selection. +title: "Button Group" +description: The {ProductName} Button Group component organizes related toggle buttons and supports horizontal or vertical alignment, single or multiple selection, and toggling. keywords: "{Platform}, UI controls, web widgets, UI widgets, {Platform} Button Group Components, Infragistics" mentionedTypes: ["ToggleButton", "ButtonGroup"] +relatedComponents: [ToggleButton] license: MIT +last_updated: "2026-07-28" llms: - description: "The {Platform} Button Group component is used to organize ToggleButton's into styled button groups with horizontal/vertical alignment, single/multiple selection and toggling." + description: "The {ProductName} Button Group organizes related toggle buttons into a group with horizontal or vertical alignment, single or multiple selection, and toggling." --- import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; import PlatformBlock from 'igniteui-astro-components/components/mdx/PlatformBlock.astro'; import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import buttonGroupAnatomy from '@xplat-images/anatomy-content-light/button-group-lt-a.png'; +import buttonGroupDo1 from '@xplat-images/button-group/button-group-do-1.png'; +import buttonGroupDo2 from '@xplat-images/button-group/button-group-do-2.png'; +import buttonGroupDo3 from '@xplat-images/button-group/button-group-do-3.png'; +import buttonGroupDoNot1 from '@xplat-images/button-group/button-group-do-not-1.png'; +import buttonGroupDoNot2 from '@xplat-images/button-group/button-group-do-not-2.png'; +import buttonGroupDoNot3 from '@xplat-images/button-group/button-group-do-not-3.png'; + +# Button Group Component +The {Platform} Button Group component is used to organize 's into styled button groups with horizontal/vertical alignment, single/multiple selection and toggling. -# {Platform} Button Group Overview +## Live Demo -The {Platform} Button Group component is used to organize 's into styled button groups with horizontal/vertical alignment, single/multiple selection and toggling. + -## {Platform} Button Example + - + + -## Usage + + - +## Anatomy + +The {Platform} Button Group organizes related Toggle Buttons into a single group with a shared container and individual button items. + + + + + +1. Container: Wraps the button's contents.
+2. Icon: Adds context to the button. Could be left, right, left and right or only icon.
+3. Label: The textual content that describes the button’s action to the user.
+ +The {Platform} Button Group contains Toggle Buttons, and each button can contain an icon and a label. + +```text +Button Group +└── Toggle Button + ├── Icon + └── Label +``` + +## Getting Started + + + +To use the {Platform} Button Group, follow the [{ProductName} Getting Started](/general/getting-started) topic for the basic project setup, then register the component for your target platform. + + + + + +To use the {Platform} Button Group, follow the [{ProductName} Getting Started](../general-getting-started.mdx) topic for the basic project setup, then register the component for your target platform. + + + +### Prerequisites and Version Compatibility + +Use a supported version of the {ProductName} package for your target framework. Keep the framework package, the Button Group package, and the theme package on the same release version. + -First, you need to install the {ProductName} by running the following command: +For Web Components using the **{PackageWebComponents}** package, install the package: ```cmd npm install {PackageWebComponents} ``` -You will then need to import the , its necessary CSS, and register its module, like so: +Then import the , its theme CSS, and register the component: ```ts import { defineComponents, IgcButtonGroupComponent } from "igniteui-webcomponents"; @@ -45,18 +115,15 @@ defineComponents(IgcButtonGroupComponent); - - - -First, you need to the install the corresponding {ProductName} npm package by running the following command: +For React using the **igniteui-react** package, install the package: ```cmd npm install igniteui-react ``` -You will then need to import the and its necessary CSS, like so: +Then import the Button Group wrapper and its theme CSS: ```tsx import { IgrButtonGroup } from 'igniteui-react'; @@ -65,12 +132,9 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; - - - -Before using the , you need to register it as follows: +For Blazor using the **IgniteUI.Blazor** package, register the Button Group module as follows: ```csharp // in Program.cs file @@ -78,7 +142,7 @@ Before using the , you need to register builder.Services.AddIgniteUIBlazor(typeof(IgbButtonGroupModule)); ``` -You will also need to link an additional CSS file to apply the styling to the component. The following needs to be placed in the **wwwroot/index.html** file in a **Blazor Web Assembly** project or the **Pages/_Host.cshtml** file in a **Blazor Server** project: +Then link the additional CSS file in the **wwwroot/index.html** file for a **Blazor WebAssembly** project or in the **Pages/_Host.cshtml** file for a **Blazor Server** project: ```razor @@ -86,12 +150,80 @@ You will also need to link an additional CSS file to apply the styling to the
+ + +For Angular using the **igniteui-angular** package, install the package: + +```cmd +ng add igniteui-angular +``` + +Then import `IgxButtonGroupModule` in an NgModule application, or import `IGX_BUTTON_GROUP_DIRECTIVES` and the required standalone components in the component `imports` collection. + +```ts +import { IGX_BUTTON_GROUP_DIRECTIVES } from 'igniteui-angular/button-group'; +import { IgxIconComponent } from 'igniteui-angular/icon'; +``` + +For a complete introduction to Ignite UI for Angular, read the [**Getting Started**](/general/getting-started) topic. + + + +The simplest way to start using the is as follows: + + + +```html + +``` + + + + + +```tsx + +``` + + + + + +```razor + +``` + + + + -For a complete introduction to the {ProductName}, read the [**Getting Started**](../general-getting-started.mdx) topic. +```html + +``` + + + +## Usage -Now that you have the {ProductName} Button Group imported, you can start with a basic configuration of the and its buttons. +Use the to wrap your components. To select a button by default, use the attribute: -Use the selector to wrap your s and display them into a button group. If you want a button to be selected by default, use the attribute: + + +```html + + + + + +``` + + @@ -171,25 +303,70 @@ Use the selector to wrap your -## Examples - ### Alignment -Use the property to set the orientation of the buttons in the button group. - +The Button Group supports horizontal and vertical layouts. Use the property to set the orientation of the buttons in the group. + + + +For Angular, set the `alignment` input with the `ButtonGroupAlignment` enum: + +```ts +import { ButtonGroupAlignment } from 'igniteui-angular/button-group'; + +public alignment = ButtonGroupAlignment.vertical; +``` + +```html + + + + + + +``` + + + + + + + + + ### Selection -In order to configure the {ProductName} selection, you could use its property. This property accepts the following three modes: +In order to configure the {ProductName} selection, use its platform-specific selection property. For Angular, use . For React, Web Components, and Blazor, use . The available modes are: - **single** - default selection mode of the button group. A single button can be selected/deselected by the user. - **single-required** - mimics a radio group behavior. Only one button can be selected and once initial selection is made, deselection is not possible through user interaction. - **multiple** - multiple buttons in the group can be selected and deselected. The sample below demonstrates the exposed selection modes: - + + +The Angular selection modes are `single`, `singleRequired`, and `multi`. + +Set the Angular `selectionMode` input to configure the selection behavior: + +```html + + + + + +``` + + + + + + + + A could be marked as selected via its attribute or through the attribute: @@ -263,16 +440,461 @@ A could be marked as selected via its Setting attribute is mandatory for using the property of the . +### States + +Each button in the group supports enabled and disabled variants, which can also be selected or not selected. Use the state behavior provided by the contained components. + + + + + + + + + + + + + +### Interaction States + +The enabled buttons in the group support idle, hover, and focused interaction states. Use the state behavior provided by the contained components. + + + + + + + + + + + + + +### Layout Template + +Each button can use text, an icon, or both. Keep the content style consistent across the group, and use the button content APIs to control the icon and label shown in each button. + + + + + + + + + + + + + +### Custom Toggle Buttons + + + +For Angular, use the `values` input to provide an array of customized buttons. Each item can define properties such as `label`, `icon`, `selected`, `disabled`, and `togglable`. + +Define the button values in the component class: + +```ts +interface IButton { + label?: string; + icon?: string; + disabled?: boolean; + togglable?: boolean; + selected?: boolean; + color?: string; +} + +public bordersButtons: IButton[] = [ + { icon: 'border_top', selected: true }, + { icon: 'border_right' }, + { icon: 'border_bottom' }, + { icon: 'border_left' } +]; +``` + +```html + +``` + +See the Angular Button Group sample for the complete `values` model and configuration. + + + + + + + +For Web Components, use individual Toggle Buttons to create a custom Button Group. Each button can define its own value, icon, label, selected state, and disabled state. + +Register the Button Group and Toggle Button components: + +```ts +import { defineComponents, IgcButtonGroupComponent, IgcToggleButtonComponent, IgcIconComponent } from 'igniteui-webcomponents'; + +defineComponents(IgcButtonGroupComponent, IgcToggleButtonComponent, IgcIconComponent); +``` + +Then define the custom buttons in markup: + +```html + + + + + + + + + + + +``` + + + + + + + +For React, use individual Toggle Buttons to create a custom Button Group. Each button can define its own value, icon, label, selected state, and disabled state. + +Import the Button Group, Toggle Button, and Icon components: + +```tsx +import { IgrButtonGroup, IgrToggleButton, IgrIcon } from 'igniteui-react'; +``` + +Then define the custom buttons in JSX: + +```tsx + + + + + + + + + + + +``` + + + + + + + +For Blazor, use individual Toggle Buttons to create a custom Button Group. Each button can define its own value, icon, label, selected state, and disabled state. + +Register the Button Group module in `Program.cs`: + +```csharp +builder.Services.AddIgniteUIBlazor(typeof(IgbButtonGroupModule)); +``` + +Then define the custom buttons in Razor markup: + +```razor + + + + + + + + + + + +``` + + + + + ### Size The `--ig-size` CSS custom property can be used to control the size of the button group. - + + +```scss +igx-buttongroup { + --ig-size: var(--ig-size-small); +} +``` + +```html + +``` + + + + + + + +```tsx + + +``` + + + + + +```html + +``` + + + + + +```razor + +``` + + + + + + + + +### Do/Don't + +**When to use:** Use a Button Group to organize related toggle actions where users may select one or more options. + +**When not to use:** Do not use a Button Group for unrelated actions or for a single toggle action; use a standalone instead. + +
+ + + + + + + + + + + + + + + + + + + + + +
DoDon't
Button Group do example 1Button Group don't example 1
Button Group do example 2Button Group don't example 2
Button Group do example 3Button Group don't example 3
+
+ +## Properties + +The Button Group properties are generated from the component API reference. + +The property rows are injected from the typed API source during the documentation build. + +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| | `ButtonGroupAlignment` | `horizontal` | Sets the orientation of the buttons in the group. | +| | `ButtonGroupSelection` | `single` | Sets the selection mode for the buttons in the group. | +| | `string[]` | `[]` | Gets or sets the values of the selected buttons. Each Toggle Button must have a unique `value`. | ## Styling -The component exposes `group` CSS part that allows us to style the button group container. -Also, the s provide `toggle` CSS part that could be used to style the button element. + + +The Angular Button Group theme exposes Sass parameters for the group items and their interaction states. Changing a primary theme property updates its related state properties to keep the component visually consistent. + +### Sass Theming + +Use the Angular theme system to customize the Button Group consistently with the rest of your application. + +Import the Angular theming functions before creating a custom Button Group theme: + +```scss +@use "igniteui-angular/theming" as *; +``` + +Create a theme with `button-group-theme` and include it in the component scope: + +```scss +$custom-button-group: button-group-theme( + $item-background: #57a5cd, +); + +:host { + @include tokens($custom-button-group); +} +``` + +### CSS Variables + +Use the Angular theme tokens to customize the Button Group item colors and interaction states. The primary Sass parameters listed below update their related state tokens. + +| Primary property | Dependent property | Description | +| --- | --- | --- | +| `$item-background` | `$item-hover-background` | Hover background for items. | +| | `$item-selected-background` | Selected item background. | +| | `$item-focused-background` | Focused item background. | +| | `$disabled-background-color` | Disabled item background. | +| | `$item-border-color` | Default item border color. | +| | `$item-text-color` | Default item text color. | +| | `$idle-shadow-color` | Idle item shadow color. | +| `$item-hover-background` | `$item-selected-hover-background` | Selected item hover background. | +| | `$item-focused-hover-background` | Focused hover background. | +| | `$item-hover-text-color` | Hovered item text color. | +| | `$item-hover-icon-color` | Hovered item icon color. | +| `$item-selected-background` | `$item-selected-focus-background` | Selected item focus background. | +| | `$disabled-selected-background` | Disabled selected background. | +| | `$item-selected-text-color` | Selected item text color. | +| | `$item-selected-icon-color` | Selected item icon color. | +| | `$item-selected-hover-text-color` | Selected hovered item text color. | +| | `$item-selected-hover-icon-color` | Selected hovered item icon color. | +| `$item-border-color` | `$item-hover-border-color` | Hovered item border color. | +| | `$item-focused-border-color` | Focused item border color. | +| | `$item-selected-border-color` | Selected item border color. | +| | `$item-selected-hover-border-color` | Selected hovered item border color. | +| | `$item-disabled-border` | Disabled item border color. | +| | `$disabled-selected-border-color` | Disabled selected border color. | + +### Style Parts + +Use the following CSS parts to target the Button Group and its contained Toggle Buttons: + +| Part | Component | What it styles | +| --- | --- | --- | +| `group` | | The Button Group container. | +| `toggle` | | An individual Toggle Button. | + +### Custom Styling + +The following example changes the group background and padding, and changes the text color of the contained Toggle Buttons: + +| Selector | Declaration | Effect | +| --- | --- | --- | +| `igx-button-group::part(group)` | `background-color`, `padding` | Changes the Button Group container background and spacing. | +| `igx-toggle-button::part(toggle)` | `color` | Changes the text color of an individual Toggle Button. | + +```css +igx-button-group::part(group) { + background-color: var(--ig-primary-500); + padding: 8px; +} + +igx-toggle-button::part(toggle) { + color: var(--ig-secondary-300); +} +``` + + + +### Styling with Tailwind + +You can style the Angular Button Group with the Ignite UI Tailwind utility classes. First, [set up Tailwind](/themes/misc/tailwind-classes), then import the utility file in the global stylesheet: + +```scss +@import "tailwindcss"; +@use 'igniteui-theming/tailwind/utilities/material.css'; +``` + +Use `light-button-group` or `dark-button-group` for the corresponding theme and override generated CSS variables with arbitrary properties: + +```html + + +``` + +The exclamation mark (`!`) makes the utility class important so it takes precedence over the component theme. + + + + + + + +The {Platform} Button Group uses CSS parts to style the group container and the individual Toggle Buttons. Use the `group` part on the Button Group and the `toggle` part on each Toggle Button to customize their appearance. + +### Sass Theming + +Use the {ProductName} theme system to style the Button Group consistently with the rest of your application. + +Import the theming functions before creating a custom Button Group theme: + +```scss +@use "igniteui-theming" as *; +``` + +Create a theme with `button-group-theme` and include it in the global stylesheet. The `$item-background` parameter is used as the base for the related interaction-state colors. Override additional parameters when you need more control over the Button Group appearance: + +```scss +$custom-button-group: button-group-theme( + $item-background: #57a5cd, +); + +igc-button-group { + @include button-group($custom-button-group); +} +``` + +The same theme applies to Web Components directly and to the underlying `igc-button-group` element rendered by the React and Blazor wrappers. + +### CSS Variables + +Use the following CSS variables to customize the Button Group item colors and interaction states. Set them on the Button Group element to apply the styles to its contained Toggle Buttons: + +| Primary property | Dependent property | Description | +| --- | --- | --- | +| `$item-background` | `$item-hover-background` | Hover background for items. | +| | `$item-selected-background` | Selected item background. | +| | `$item-focused-background` | Focused item background. | +| | `$disabled-background-color` | Disabled item background. | +| | `$item-border-color` | Default item border color. | +| | `$item-text-color` | Default item text color. | +| | `$idle-shadow-color` | Idle item shadow color. | +| `$item-hover-background` | `$item-selected-hover-background` | Selected item hover background. | +| | `$item-focused-hover-background` | Focused hover background. | +| | `$item-hover-text-color` | Hovered item text color. | +| | `$item-hover-icon-color` | Hovered item icon color. | +| `$item-selected-background` | `$item-selected-focus-background` | Selected item focus background. | +| | `$disabled-selected-background` | Disabled selected background. | +| | `$item-selected-text-color` | Selected item text color. | +| | `$item-selected-icon-color` | Selected item icon color. | +| | `$item-selected-hover-text-color` | Selected hovered item text color. | +| | `$item-selected-hover-icon-color` | Selected hovered item icon color. | +| `$item-border-color` | `$item-hover-border-color` | Hovered item border color. | +| | `$item-focused-border-color` | Focused item border color. | +| | `$item-selected-border-color` | Selected item border color. | +| | `$item-selected-hover-border-color` | Selected hovered item border color. | +| | `$item-disabled-border` | Disabled item border color. | +| | `$disabled-selected-border-color` | Disabled selected border color. | + +### Style Parts + +Use the following CSS parts to target the Button Group and its contained Toggle Buttons: + +| Part | Component | What it styles | +| --- | --- | --- | +| `group` | | The Button Group container. | +| `toggle` | | An individual Toggle Button. | + +### Custom Styling + +The following example changes the group background and padding, and changes the text color of the contained Toggle Buttons: + +| Selector | Declaration | Effect | +| --- | --- | --- | +| `igc-button-group::part(group)` | `background-color`, `padding` | Changes the Button Group container background and spacing. | +| `igc-toggle-button::part(toggle)` | `color` | Changes the text color of an individual Toggle Button. | ```css igc-button-group::part(group) { @@ -285,15 +907,126 @@ igc-toggle-button::part(toggle) { } ``` - + + +### Styling with Tailwind + +You can style the {Platform} Button Group with the custom Tailwind utility classes from `igniteui-theming`. Make sure to [set up Tailwind](/themes/tailwind) first, then import the Ignite UI utilities in your global stylesheet: + +```css +@import "tailwindcss"; +@import "igniteui-theming/tailwind/utilities/material.css"; +``` + + + +```jsx + +``` + + + + +```html + +``` + + + + + +```razor + +``` + + + +The exclamation mark (`!`) gives the Tailwind utility precedence over the Button Group's default theme styles. + + + + + +## Accessibility + +The Button Group groups related Toggle Buttons while preserving the interaction and accessible state of each button. Provide meaningful content for every button and choose a selection mode that matches the intended interaction. + +### Keyboard Interaction + +The {Platform} Button Group follows the keyboard behavior of its Toggle Buttons. Use the keyboard interaction provided by the contained buttons and verify the focus order and selection behavior for the configured selection mode. + +| Interaction | Expected behavior | +| --- | --- | +| Keyboard focus | The user can reach the contained Toggle Buttons according to their focus behavior. | +| Toggle Button interaction | The focused button changes its selected state according to the configured selection mode. | + +### Screen Readers / ARIA + +Use clear labels for every {Platform} Toggle Button so assistive technology users can identify each option and its selected state. When an icon does not provide an accessible name, provide an appropriate text label or accessible name for the button. + +### Accessibility Compliance + +Verify the rendered {Platform} Button Group against the accessibility requirements of the application. Check the button names, focus order, selected state announcements, and behavior for the configured selection mode in the target framework. + +## Troubleshooting + +The {Platform} Button Group troubleshooting guidance follows a problem, cause, and fix format for common selection issues. + +### Why does selectedItems not select a button? + +Ensure every Toggle Button has a unique `value` attribute. The `selectedItems` property depends on those values. + +### Known Limitations + +The {Platform} Button Group coordinates Toggle Buttons but does not replace their individual labels or accessible names. + +- Selection behavior depends on the configured `selection` mode. +- The `selectedItems` property depends on unique `value` attributes on the contained Toggle Buttons. +- The Button Group does not provide labels or icons for its buttons; define the content of each Toggle Button separately. ## API References + +The {Platform} Button Group API reference provides the complete API surface for the component and its related Toggle Button functionality. + + +## Dependencies + +The {Platform} Button Group requires the platform package and its theme stylesheet. The examples also use Toggle Button, Icon, and Ripple components. + ## Additional Resources +Use the following {Platform} resources for API details and project support: + - [{ProductName} **Forums**]({ForumsLink}) - [{ProductName} **GitHub**]({GithubLink}) + +## Related Components + +The {Platform} Button Group is built from selectable Toggle Buttons. Use the following related component when you need an individual toggle action instead of a group: + +- + +## FAQ + +These frequently asked questions cover common {Platform} Button Group selection, content, and setup scenarios. + + + + +The Button Group supports `single`, `single-required`, and `multiple` selection modes. Use the `selection` property to choose the mode that matches the interaction you need. + + + +Assign a unique `value` to every and set the corresponding values through the Button Group's `selectedItems` property. + + + +Yes. Add an icon to each and keep the button content consistent across the group. + + + diff --git a/docs/xplat/src/content/en/components/inputs/chip.mdx b/docs/xplat/src/content/en/components/inputs/chip.mdx index 387bb2605e..0f867dba75 100644 --- a/docs/xplat/src/content/en/components/inputs/chip.mdx +++ b/docs/xplat/src/content/en/components/inputs/chip.mdx @@ -201,6 +201,36 @@ The {ProductName} chip supports several pre-defined stylistic variants. You can +### Outlined + +The {ProductName} chip can be rendered in an outlined style and have a border around it by setting the property. + + + +```tsx + +``` + + + + + +```html + +``` + + + + + +```razor + +``` + + + + + ### Disabled The {ProductName} chip can be disabled by using the property. diff --git a/docs/xplat/src/content/en/components/layouts/avatar.mdx b/docs/xplat/src/content/en/components/layouts/avatar.mdx index d1222f46b2..8d72187d33 100644 --- a/docs/xplat/src/content/en/components/layouts/avatar.mdx +++ b/docs/xplat/src/content/en/components/layouts/avatar.mdx @@ -1,109 +1,190 @@ --- -title: "{Platform} Avatar | Layout Controls | Infragistics" -description: Use Infragistics' {Platform} avatar component to display an image, icon, or initials. -keywords: avatar, layout, {ProductName}, Infragistics +title: "{Platform} Avatar Component | Layouts | Infragistics" +description: "Use the {Platform} Avatar component to represent users, entities, or objects with images, initials, icons, or custom content." +keywords: "{Platform} Avatar, avatar component, profile image, initials, {ProductName}, Infragistics" +last_updated: "2026-07-29" license: MIT -mentionedTypes: ["Avatar"] +mentionedTypes: ["Avatar", "Badge", "Icon"] +relatedComponents: ["Badge"] llms: - description: "The {ProductName} Avatar helps to display initials, images, or icons in your application." + description: "The {ProductName} Avatar topic shows how to render user, entity, or object identity with images, initials, icons, custom content, shape, size, styling, and accessibility guidance." --- import PlatformBlock from 'igniteui-astro-components/components/mdx/PlatformBlock.astro'; import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import avatarAnatomy from '@xplat-images/anatomy-content-light/avatar-lt-a.png'; +import avatarDo from '@xplat-images/avatar/avatar_do1.png'; +import avatarDo2x from '@xplat-images/avatar/avatar_do1@2x.png'; +import avatarDoNot from '@xplat-images/avatar/avatar_do_not1.png'; +import avatarDoNot2x from '@xplat-images/avatar/avatar_dont1@2x.png'; +# Avatar Component -# {Platform} Avatar +The {ProductName} Avatar represents a user, entity, or object with an image, initials, or custom content. -The {ProductName} Avatar helps to display initials, images, or icons in your application. +Use the avatar to provide a compact visual identity in lists, cards, profile menus, and activity feeds. -## {Platform} Icon Avatar Example +## Live Demo - + + + -## Usage + + - + +## Anatomy -First, you need to install the {ProductName} npm package by running the following command: +The avatar is a single host element that applies image semantics and renders one of the supported content patterns. -```cmd -npm install {PackageWebComponents} -``` + - + +1. Image container: Displays image content type.
+2. Icon container: Displays icon content type.
+3. Initials container: Displays text content type.
- + +```text +igc-avatar[role="img"] // host - exposes the avatar +└─ div[part="base"] // avatar wrapper + ├─ span[part="initials"] // rendered when `initials` is set + ├─ slot // rendered when `initials` is not set + └─ img[part="image"] // rendered while `src` is set and loads +``` + -First, you need to the install the corresponding {ProductName} npm package by running the following command: + -```cmd -npm install igniteui-react +```text +igx-avatar[role="img"] // host - exposes the avatar +└─ one of, by priority: + ├─ div.igx-avatar__image // `src` set - image painted as a background + ├─ igx-icon // `icon` set + ├─ span // `initials` set - first two characters + └─ ng-content // custom projected content ``` -You will then need to import the and its necessary CSS, like so: + -```tsx -import { IgrAvatar } from 'igniteui-react'; -import 'igniteui-webcomponents/themes/light/bootstrap.css'; -``` +## Getting Started + + +Register the avatar component before you use it. If you have not set up {ProductName} yet, complete the shared [Getting Started](../general-getting-started.mdx) topic first. + +```ts +import { defineComponents, IgcAvatarComponent } from 'igniteui-webcomponents'; + +defineComponents(IgcAvatarComponent); +``` + -Before using the , you need to register it as follows: +Import the Angular avatar component before you render ``. If you have not set up {ProductName} yet, complete the shared [Getting Started](../general/getting-started.mdx) topic first. + +```ts +import { IgxAvatarComponent } from 'igniteui-angular/avatar'; +``` + - + -```csharp -// in Program.cs file +Import the React wrapper and theme stylesheet before you render the avatar. If you have not set up {ProductName} yet, complete the shared [Getting Started](../general-getting-started.mdx) topic first. -builder.Services.AddIgniteUIBlazor(typeof(IgbAvatarModule)); +```tsx +import { IgrAvatar } from 'igniteui-react'; +import 'igniteui-webcomponents/themes/light/bootstrap.css'; ``` +Register the avatar module in `Program.cs` and add the theme stylesheet to your host page. If you have not set up {ProductName} yet, complete the shared [Getting Started](../general-getting-started.mdx) topic first. - -You will also need to link an additional CSS file to apply the styling to the component. The following needs to be placed in the **wwwroot/index.html** file in a **Blazor Web Assembly** project or the **Pages/_Host.cshtml** file in a **Blazor Server** project: +```csharp +builder.Services.AddIgniteUIBlazor(typeof(IgbAvatarModule)); +``` ```razor ``` + + +## Usage + +Render an avatar with an image source, initials, or custom content in the default slot. + +### Variants + + + +Set only the content source you intend to show. The avatar renders when they are set, otherwise it renders default slot content, and it also renders an image element while is set and loads successfully. + + +Set only the content source you intend to show. The Angular avatar renders `src` first, then `icon`, then `initials`, and falls back to projected custom content when none of those inputs are set. + + -```ts -import { defineComponents, IgcAvatarComponent } from 'igniteui-webcomponents'; +```html + -defineComponents(IgcAvatarComponent); + + + + + + ``` -For a complete introduction to the {ProductName}, read the [**Getting Started**](../general-getting-started.mdx) topic. + -The is capable of displaying images, initials, or any other content, including icons. Declaring an is as simple as: +```html + - + -```html - + ``` @@ -111,7 +192,16 @@ The is capable of displaying images, initia ```tsx - + + + + + + + ``` @@ -119,19 +209,47 @@ The is capable of displaying images, initia ```razor - + + + + + + + ``` -The avatar has several attributes that allow rendering different content based on the context. The most basic way to display content in the boundaries of the avatar is to provide content between the opening and closing tags. + + + + + + + + + + + + +### Shape + +Set to `square`, `rounded`, or `circle`. ```html - - - + +``` + + + + + +```html + ``` @@ -139,9 +257,7 @@ The avatar has several attributes that allow rendering different content based o ```tsx - - - + ``` @@ -149,157 +265,424 @@ The avatar has several attributes that allow rendering different content based o ```razor - - - + ``` -### Initials + -If the attribute is set all children elements of the avatar will be ignored and the string passed to this attribute will be displayed. + - + -```html - + - - - + + + + +### Size + +Set `--ig-size` to one of the shared size tokens when you need a preset avatar size. + + + +```css +igc-avatar { + --ig-size: var(--ig-size-large); +} ``` - + -```tsx - - - +```html + ``` - + -```razor - + - - - -``` + + + + + - +### Do/Don't +**When to use:** Use the avatar when a UI needs a small representation of a person, organization, object, or account, such as a profile image, initials, or an icon. Keep a consistent avatar strategy within the same UI region so repeated identities are easy to scan. + +**When not to use:** Use the [Badge](../inputs/badge.mdx) component when you need to show a count, status, or notification indicator instead of representing an entity. Badges can also decorate avatars when both identity and status need to appear together. -### Image + -The avatar can also display an image when the attribute is assigned a valid URL to a static asset. In that case the value will be ignored and children elements will not be rendered. + - +**When not to use:** Use the [Badge](../inputs/badge.mdx) component when you need to show a count, status, or notification indicator instead of representing an entity. Badges can also decorate avatars when both identity and status need to appear together. -```html - - - -``` + + +
+ + + + + + + + + + + + + +
DoDon't
{Platform} Avatar do guidance{Platform} Avatar don't guidance
+
+ +## Properties + +The avatar exposes a small set of inputs for its content and shape. + + + +| Name | Type | Default | Description | +| -- | -- | -- | -- | +| | `string` | n/a | Sets alternative text for the image avatar. | +| | `string` | n/a | Sets text initials rendered when no image is displayed. | +| | `"square" \| "rounded" \| "circle"` | `"square"` | Sets the avatar shape. | +| | `string` | n/a | Sets the image source URL. | - + -```tsx - - - -``` +| Name | Type | Default | Description | +| -- | -- | -- | -- | +| | `string` | n/a | Sets the icon rendered by the avatar. | +| | `string` | n/a | Sets text initials rendered by the avatar. | +| | `"square" \| "rounded" \| "circle"` | `"square"` | Sets the avatar shape. | +| | `"small" \| "medium" \| "large"` | `"small"` | Sets the avatar size. | +| | `string` | n/a | Sets the image source URL. | +## Styling - + -```razor - - - -``` + - + + + -### Shape +The avatar appearance is controlled through theme variables and platform-specific styling hooks. -The avatar supports three shapes - `circle`, `rounded`, and `square`. The default shape of the avatar is `square` and it can be changed via the attribute. + - +Use the avatar CSS variables for token-level changes and CSS parts when you need to target the rendered wrapper, image, icon, or initials. +| Variable | What it changes | +| -- | -- | +| `--ig-avatar-background` | Avatar background color. | +| `--ig-avatar-color` | Text and initials color. | +| `--ig-avatar-icon-color` | Slotted icon color. | +| `--ig-avatar-border-radius` | Border radius used by rounded avatars. | +| `--ig-avatar-size` | Avatar width and height. | +| `--ig-size` | Shared component size token used to derive preset avatar sizes. | +| CSS Part | Description | +| -- | -- | +| `base` | The avatar wrapper. | +| `icon` | The icon wrapper. | +| `initials` | The initials wrapper. | +| `image` | The image element. | + -### Size + + +Use the avatar CSS variables for token-level changes and Angular host classes when you need to target a specific rendered type or shape. + +| Variable | What it changes | +| -- | -- | +| `--ig-avatar-background` | Avatar background color. | +| `--ig-avatar-color` | Text and initials color. | +| `--ig-avatar-icon-color` | Icon color. | +| `--ig-avatar-border-radius` | Border radius used by rounded avatars. | +| `--ig-avatar-size` | Avatar width and height. | +| `--ig-size` | Shared component size token used to derive preset avatar sizes. | + +| Selector | Description | +| -- | -- | +| `igx-avatar` | The avatar host element. | +| `.igx-avatar--rounded` | Applied when `shape` is `rounded`. | +| `.igx-avatar--circle` | Applied when `shape` is `circle`. | +| `.igx-avatar--image` | Applied when the avatar renders an image. | +| `.igx-avatar--icon` | Applied when the avatar renders an icon. | +| `.igx-avatar--initials` | Applied when the avatar renders initials. | +| `.igx-avatar__image` | The image avatar element. | -Apart from the shape, the size of the avatar can also be changed by utilizing the `--ig-size` CSS variable. The supported sizes are `small` (default), `medium`, and `large`. The following code snippet shows how to use a different component size: + -```css -igc-avatar { - --ig-size: var(--ig-size-large); +### Sass Theming + +Use the function when your application customizes Ignite UI themes through Sass. + + + +```scss +@use "igniteui-theming/sass/themes" as *; + +$custom-avatar-theme: avatar-theme( + $background: #72da67, + $border-radius: 16px, + $size: 3rem +); + +:root { + @include tokens($custom-avatar-theme); } ``` - + + + + +```scss +@use "igniteui-angular/theming" as *; +$custom-avatar-theme: avatar-theme( + $background: #72da67, + $border-radius: 16px, + $size: 3rem +); +:root { + @include tokens($custom-avatar-theme); +} +``` + -### Styling +### CSS Variables -The component exposes several CSS parts, giving you full control over its style: +Set component CSS variables directly when you need local styling without a Sass build step. -|Name|Description| -|--|--| -| `base` | The base wrapper of the avatar. | -| `initials` | The initials wrapper of the avatar. | -| `image` | The image wrapper of the avatar. | -| `icon` | The icon wrapper of the avatar. | + ```css igc-avatar { --ig-avatar-background: var(--ig-success-500); + --ig-avatar-color: var(--ig-success-500-contrast); + --ig-avatar-border-radius: 20px; } igc-avatar::part(base) { - --size: 60px; - color: var(--ig-success-500-contrast); - border-radius: 20px; + border: 2px solid var(--ig-success-700); } ``` - + + + + +```css +igx-avatar { + --ig-avatar-background: var(--ig-success-500); + --ig-avatar-color: var(--ig-success-500-contrast); + --ig-avatar-border-radius: 20px; +} +``` + + + +### Styling with Tailwind + + + +Use Tailwind utility classes with the {ProductName} Avatar when you need utility-first layout styling together with Ignite UI component tokens. + + + + + + + +Use the Angular Tailwind utility syntax when your application styles Ignite UI components through Tailwind classes. + + + + + +## Accessibility + +The avatar is a non-interactive identity visual with accessible image semantics. + +### Keyboard Interaction + +The avatar does not receive focus and has no keyboard interaction. + +| Key | Action | +| -- | -- | +| n/a | The avatar is not keyboard interactive. | + +### Screen Readers / ARIA + +The avatar initializes with image semantics and a default accessible label of `avatar`. + + + +- Set `alt` when a `src` image represents a specific person, entity, or object. +- Add an explicit `aria-label` when projected custom content needs a different accessible name. +- Treat decorative avatars as redundant when adjacent text already identifies the same entity. + + + + +- Use surrounding text to identify the represented person, entity, or object when an image avatar conveys identity. +- Treat decorative avatars as redundant when adjacent text already identifies the same entity. + + +### Accessibility Compliance + +Infragistics documents {ProductName} accessibility support for Section 508 and WCAG 2.1 guideline areas in the [Accessibility Compliance](../interactivity/accessibility-compliance.mdx) topic. + + + +| Criterion | How the component complies | +| -- | -- | +| [1.1.1 Non-text Content](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content) | The avatar has an accessible label, and image avatars can receive specific alternative text through `alt`. | +| [4.1.2 Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value) | The component initializes with image semantics and exposes content-related ARIA information. | + + + + + +| Criterion | How the component complies | +| -- | -- | +| [1.1.1 Non-text Content](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content) | The avatar has an accessible label and can be paired with surrounding text that identifies the represented entity. | +| [4.1.2 Name, Role, Value](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value) | The component initializes with `role="img"` and a default accessible label. | + + + +Your responsibilities: + +- Keep sufficient contrast between the avatar background and text or icon color when overriding styles. +- Avoid duplicating the same identity announcement when adjacent text already names the person or entity. + + + +- Provide a descriptive label or `alt` text when the avatar conveys identity. + + + + + +- Make sure nearby text identifies the represented entity when the avatar image conveys identity. + + + +## Troubleshooting + +Use this section to check boundaries and common decisions before treating Avatar as an interactive or status component. + +### Known Limitations +The avatar is a visual identity primitive and does not add interaction, status, or notification behavior by itself. + +- Use an interactive container, such as a button or list item, when the represented entity must be clickable. +- Use a badge with the avatar when you need to show status, counts, or notification indicators. ## API References + +Use these API references for the complete avatar API surface. + + + + + + + + + + + + + + +## Dependencies + + + +Slotted icons require the component to be registered or imported. + + + + + +The avatar also uses the shared theme stylesheet for its default appearance. + + + + + +The Sass styling workflow uses the and APIs. + + + ## Additional Resources +Use these resources for support and related Ignite UI documentation. + - [{ProductName} **Forums**]({ForumsLink}) - [{ProductName} **GitHub**]({GithubLink}) + +## Related Components + +Use these related components when identity needs to be combined with status, actions, or richer layout. + + + +- [Badge](../inputs/badge.mdx) - Use Badge to show counts, status, or notification indicators. Badge can decorate Avatar when the UI needs both identity and status. + + + + + +- [Badge](../inputs/badge.mdx) - Use Badge to show counts, status, or notification indicators. Badge can decorate Avatar when the UI needs both identity and status. + + + +## FAQ + + + + Use Avatar when the UI needs to represent a person, account, organization, or object. Use Badge when the UI needs to show a count, status, or notification indicator. + + + + No. Avatar is non-interactive and does not receive focus by itself. Put it inside an interactive component when the represented entity needs an action. + + + + Provide meaningful alternative text when the avatar image identifies a specific entity. Avoid repeating the same identity when adjacent text already names that entity. + + diff --git a/docs/xplat/src/content/en/toc.json b/docs/xplat/src/content/en/toc.json index 17c916bd26..5839d7ff38 100644 --- a/docs/xplat/src/content/en/toc.json +++ b/docs/xplat/src/content/en/toc.json @@ -70,8 +70,7 @@ }, { "exclude": [ - "Blazor", - "Angular" + "Blazor" ], "name": "Getting Started", "href": "general-getting-started.mdx", @@ -2223,11 +2222,9 @@ "href": "layouts/accordion.mdx" }, { - "exclude": [ - "Angular" - ], "name": "Avatar", - "href": "layouts/avatar.mdx" + "href": "layouts/avatar.mdx", + "updated": true }, { "exclude": [ @@ -2434,11 +2431,9 @@ "header": true }, { - "exclude": [ - "Angular" - ], "name": "Badge", - "href": "inputs/badge.mdx" + "href": "inputs/badge.mdx", + "updated": true }, { "exclude": [ @@ -2448,11 +2443,9 @@ "href": "inputs/button.mdx" }, { - "exclude": [ - "Angular" - ], "name": "Button Group", - "href": "inputs/button-group.mdx" + "href": "inputs/button-group.mdx", + "updated": true }, { "exclude": [ @@ -2772,9 +2765,6 @@ "href": "themes/styles.mdx" }, { - "exclude": [ - "Angular" - ], "name": "Custom Tailwind Classes", "href": "themes/tailwind.mdx", "new": true diff --git a/docs/xplat/src/content/jp/components/general-changelog-dv-blazor.mdx b/docs/xplat/src/content/jp/components/general-changelog-dv-blazor.mdx index bd4559a4c7..8a69a58bb9 100644 --- a/docs/xplat/src/content/jp/components/general-changelog-dv-blazor.mdx +++ b/docs/xplat/src/content/jp/components/general-changelog-dv-blazor.mdx @@ -35,6 +35,42 @@ import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; ## **{PackageVerLatest}** +### 機能拡張 + +#### {PackageCharts} + +- `Axis` およびすべての `XYChart` 派生チャートに軸の表示/非表示プロパティを追加し、スタイルのオーバーライドなしに個々の軸要素を切り替えられるようにしました。 + - `AreLabelsVisible` - ラベル パネルのレイアウト スロットを維持したまま、ティック ラベルのテキストを非表示にします。 + - `AreTickMarksVisible` - ティック マークのストロークを非表示にします。 + - `AreAnnotationsVisible` - 軸注釈 (例: `FinalValueLayer` バッジ) を非表示にします。 + - `IsLabelPanelVisible` - ラベル パネル全体を折りたたんでサイズをゼロにします。 + - 対応するチャート レベルの転送プロパティ `XAxisAreLabelsVisible`、`XAxisAreTickMarksVisible`、`XAxisAreAnnotationsVisible`、`XAxisIsLabelPanelVisible`、`YAxisAreLabelsVisible`、`YAxisAreTickMarksVisible`、`YAxisAreAnnotationsVisible`、`YAxisIsLabelPanelVisible` が `IgbCategoryChart`、`IgbFinancialChart` およびその他の `XYChart` 派生チャートに追加されました。 + +- シリーズに `LegendItemBadgeMarkerSizeScaling` を追加しました。これにより、凡例バッジがシリーズの `MarkerSize` に応じてどのようにスケールするかを制御できます。サポートされる値は `Auto` (デフォルト、バッジを 1x と 2x の間で補間)、`None` (バッジはデフォルトのサイズを維持)、`Linear` (バッジは `MarkerSize` に直接スケール) です。最終的に適用されるサイズは、読み取り専用プロパティ `ActualLegendItemBadgeMarkerWidth` および `ActualLegendItemBadgeMarkerHeight` を通じて公開されます。 + +- `IgbLinearGraphRange` (`IgbLinearGauge` および `IgbBulletGraph` で使用) および `IgbRadialGaugeRange` に `StartInset` と `EndInset` を追加しました。これらのプロパティは、デバイス非依存ピクセル単位で測定された距離だけ範囲の開始端と終了端を内側にトリミングし、ゲージのサイズや値範囲に関わらず隣接する範囲間に一定のギャップを生成します。両方のデフォルト値は `0` であるため、インセットが設定されない限り範囲は従来どおり隙間なく接します。 + +#### {PackageGrids} (グリッド) + +- 内部の Ignite UI for Angular 参照を 21.2 から 22.0 に更新し、`IgbGrid`、`IgbTreeGrid`、`IgbHierarchicalGrid`、`IgbRowIsland` の生成モデルを刷新しました。新しい `GridBase`、`HierarchicalGridBase`、`RowIslandBase` の共有 API が含まれます。 + +### バグ修正 + +| バグ番号 | コントロール | 説明 | +|------------|---------|-------------| +| 3817 | IgbInput およびその他の Web 入力 | ロード時にコンポーネントが登録されなかった問題を修正しました。`defineAllComponents` の登録が復元されました。 | +| 3743 | IgbGrid | フィルタリング イベントの詳細ペイロードで、以前の誤った型の代わりに `FilteringExpressionsTree` を使用するようになりました。 | +| 2129 | Web 入力 | `ReportValidity` と `CheckValidity` が `IgbCheckbox`、`IgbCombo`、`IgbDatePicker`、`IgbDateRangePicker`、`IgbInput`、`IgbRating`、`IgbSelect`、`IgbSlider`、`IgbTextarea` で誤った型を返していた問題を修正しました。 | +| 2123 | Web 入力 | フォーカス オプションが正しくマーシャリングされなかった問題を修正しました。プレーン オブジェクトとして処理されるようになりました。 | +| 3684 | IgbChat およびその他の Web コンポーネント | レンダラー要素を通じて渡されたときに列挙型プロパティが正しくシリアライズされなかった問題を修正しました。 | +| 3777 | IgbRadialGauge、IgbLinearGauge、IgbBulletGraph | ゲージで null 参照例外が発生する可能性があった問題を修正しました。 | +| 3534 | IgbSpreadsheet | 水平線が正しく表示されず、線の太さが変わると SVG 図形が位置をずらしていた問題を修正しました。 | +| 3821 | IgbDataPieChart | ホバー時に `SeriesPointerEnter` がハンドラーに届かず、集計によりまとめられたバケットの角度範囲が誤って測定されていた問題を修正しました。 | +| 3322 | IgbDataPieChart | 以前の画像の読み込みが完了する前に要求された画像が変更された場合に、スライス レイヤーが誤った画像を表示していた問題を修正しました。 | +| 3688 | IgbDataChart | 破棄時にチャートが正しく解放されなかった問題を修正しました。 | + +## **{PackageVerChanges-26-1-JUNE}** + ### IgbDockManager - Web Component の最新 2.1 バージョンへの内部参照を更新し、さまざまなバグ修正とパフォーマンスの改善を含みます。 diff --git a/docs/xplat/src/content/jp/components/inputs/badge.mdx b/docs/xplat/src/content/jp/components/inputs/badge.mdx index 05bedee379..27011abc50 100644 --- a/docs/xplat/src/content/jp/components/inputs/badge.mdx +++ b/docs/xplat/src/content/jp/components/inputs/badge.mdx @@ -1,42 +1,108 @@ --- -title: "{Platform} Badge | インフラジスティックス" -description: インフラジスティックスの {Platform} Badge コンポーネントを使用すると、事前定義されたスタイルでコンテンツを表示して、アプリケーション内の任意の場所で他のコンポーネントを装飾できます。 -keywords: "{Platform}, UI controls, web widgets, UI widgets, Web Components, {Platform} Badge Components, Infragistics, UI コントロール, web ウィジェット, UI ウィジェット, ウェブ コンポーネント, {Platform} バッジ コンポーネント, インフラジスティックス" +title: "{Platform} Badge Component | インフラジスティックス" +description: "{ProductName} Badge を使用すると、アバター、ナビゲーション メニュー、その他のコンポーネントと組み合わせて、短いステータス、カテゴリ、カウント、または通知インジケーターを表示できます。" +keywords: "{Platform} Badge, {ProductName}, badge indicator, {Platform} バッジ, 通知インジケーター" license: MIT mentionedTypes: ["Badge"] +last_updated: "2026-07-24" _language: ja llms: - description: "{ProductName} Badge は、視覚的な通知が必要な場合に、アバター、ナビゲーション メニュー、またはアプリケーション内の他のコンポーネントと組み合わせて使用されるコンポーネントです。" + description: "{ProductName} Badge コンポーネントは、アバター、ナビゲーション メニュー、その他のコンポーネントと組み合わせて、短いステータス、カテゴリ、カウント、または通知インジケーターを表示します。" --- import PlatformBlock from 'igniteui-astro-components/components/mdx/PlatformBlock.astro'; import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import badgeAnatomy from '@xplat-images/anatomy-content-light/badge-lt-a.png'; +import badgeDo from '@xplat-images/badge/badge-do.png'; +import badgeDoNot from '@xplat-images/badge/badge-do-nоt.png'; +# Badge (バッジ) コンポーネント +{Platform} Badge コンポーネントはプラットフォーム固有の {ProductName} パッケージによって提供され、視覚的な通知が必要な場合に、アプリケーション内でアバター、ナビゲーション メニュー、またはその他のコンポーネントと組み合わせて使用されます。バッジは通常、情報、成功、警告、またはエラーを伝えるために事前定義されたスタイルで設計されています。 -# {Platform} Badge (バッジ) の概要 +## ライブ デモ -{ProductName} Badge は、視覚的な通知が必要な場合に、アバター、ナビゲーション メニュー、またはアプリケーション内の他のコンポーネントと組み合わせて使用されるコンポーネントです。バッジは通常、情報、成功、警告、またはエラーを伝達するために事前定義されたスタイルでデザインされています。 +{Platform} Badge のデモは、このコンポーネントが他のインターフェース要素の隣でコンパクトなステータスや通知をどのように伝えられるかを示します。 -## {Platform} Badge の例 + - + - + -## 使用方法 + + - + + +## 構造 + +{Platform} Badge は、他のインターフェース要素を装飾するコンパクトなラベルまたはドット インジケーターを表示します。 + + + + + +1. ドット インジケーター: ステータスや新しい更新を示すために使用される小さなバッジ ドットです。
+2. アイコン: ステータスやアクションの種類を表します。
+3. コンテナー: アイコンやラベルを保持してスタイルを適用するバッジの形状です。
+4. ラベル: バッジ内に表示されるテキストまたは数字です。
+ +このコンポーネントは、`base` CSS パーツ内にコンテンツをレンダリングします。テキストやその他のインライン コンテンツにはコンポーネントのデフォルト スロットを使用してください。`dot` が有効になっている場合、バッジはコンテンツのないインジケーターとしてレンダリングされます。 + +```text + +└── ::part(base) + └── default slot content + +``` +## 作業の開始 -まず、次のコマンドを実行して {ProductName} をインストールする必要があります。 + + +{Platform} Badge を使用するには、まず [{ProductName} の作業の開始](../general/getting-started.mdx) トピックに従って基本的なプロジェクトのセットアップを行い、その後、対象プラットフォーム用にコンポーネントを登録してください。 + + + + + +{Platform} Badge を使用するには、まず [{ProductName} の作業の開始](../general-getting-started.mdx) トピックに従って基本的なプロジェクトのセットアップを行い、その後、対象プラットフォーム用にコンポーネントを登録してください。 + + + +### 前提条件とバージョンの互換性 + +対象フレームワークでサポートされているバージョンの {ProductName} パッケージを使用してください。フレームワーク パッケージ、Badge パッケージ、テーマ パッケージは同じリリース バージョンに揃えてください。以下の例では、各コード ブロックで使用されているフレームワークとパッケージを明記しているため、周囲のページ コンテキストなしで読んでもスニペットが自己完結的になっています。 + + + +**{PackageWebComponents}** パッケージを使用する Web Components の場合は、パッケージをインストールします: ```cmd npm install {PackageWebComponents} ``` -次に、以下のように、 とそれに必要な CSS をインポートし、そのモジュールを登録する必要があります: +次に、以下のように 、そのテーマ CSS をインポートし、コンポーネントを登録する必要があります: ```ts import { defineComponents, IgcBadgeComponent } from "igniteui-webcomponents"; @@ -45,23 +111,17 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; defineComponents(IgcBadgeComponent); ``` -{ProductName} の完全な概要については、[作業の開始](../general-getting-started.mdx)トピックを参照してください。 - - - - - -まず、次のコマンドを実行して、対応する {ProductName} npm パッケージをインストールする必要があります: +**igniteui-react** パッケージを使用する React の場合は、パッケージをインストールします: ```cmd npm install igniteui-react ``` -次に、以下のように、 と必要な CSS をインポートする必要があります: +次に、以下のように Badge のラッパーとそのテーマ CSS をインポートする必要があります: ```tsx import { IgrBadge } from 'igniteui-react'; @@ -70,13 +130,9 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; - - - - - を使用する前に、次のように登録する必要があります。 +**IgniteUI.Blazor** パッケージを使用する Blazor の場合は、次のように Badge モジュールを登録します: ```csharp // in Program.cs file @@ -84,20 +140,42 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ``` -また、追加の CSS ファイルをリンクして、スタイルを コンポーネントに適用する必要があります。以下は、**Blazor Web Assembly** プロジェクトの **wwwroot/index.html** ファイルまたは **Blazor Server** プロジェクトの **Pages/_Host.cshtml** ファイルに配置する必要があります: +また、スタイルを コンポーネントに適用するために、追加の CSS ファイルをリンクする必要があります。以下は、**Blazor Web Assembly** プロジェクトの **wwwroot/index.html** ファイル、または **Blazor Server** プロジェクトの **Pages/_Host.cshtml** ファイルに配置してください: ```razor ``` - + + +**igniteui-angular** パッケージを使用する Angular の場合は、パッケージをインストールします: + +```cmd +npm install igniteui-angular +``` + +次に、Badge コンポーネントをインポートします: + +```ts +import { IgxBadgeComponent } from 'igniteui-angular/badge'; +``` + +コンポーネントの `imports` コレクションに `IgxBadgeComponent` を追加し、テンプレートで `igx-badge` 要素を使用します。 の使用を開始する最も簡単な方法は次のとおりです: +```html + +``` + + + + の使用を開始する最も簡単な方法は次のとおりです: + ```html ``` @@ -120,16 +198,224 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); -## 例 +## 使用方法 + +{Platform} Badge を使用して、他のコンポーネントと並べて短いステータス、カテゴリ、カウント、または通知インジケーターを表示します。 + + + +デモ サンプルがどのように作成されているかを見てみましょう。これは、アバターの上にシンプルな success バッジを表示する例です。これを実現するには、`IgxAvatarModule` を `IgxBadgeModule` とともにインポートします: + +```typescript +import { IgxBadgeModule } from 'igniteui-angular/badge'; +import { IgxAvatarModule } from 'igniteui-angular/avatar'; +``` + +両方のモジュールをコンポーネントの `imports` コレクションに追加するか、スタンドアロン コンポーネントをインポートします。次に、コンポーネントをテンプレートに追加します: + +```html +
+ + +
+``` + +相対位置指定のラッパーを使用して、バッジをアバターの上に配置します: + +```scss +.wrapper { + position: relative; + margin-top: 15px; +} + +igx-badge { + position: absolute; + bottom: 0; + left: 28px; +} +``` + +### タイプ + +バッジは、数字やアイコンなど、さまざまな種類のコンテンツを持つことができます。 + +`[value]` 入力を使用して、バッジ内にテキストや数値のカウントを表示します: + +```html + +``` + +`[icon]` 入力を使用して、バッジ内にアイコンを表示します: + +```html + +``` + +`[icon]` と `[value]` の両方が設定されている場合、バッジは両方を同時に表示します: + +```html + +``` + +コンテンツを子要素として直接指定することもできます。アイコンとテキストの両方を子要素として指定する場合は、正しいパディングを保つためにテキストをラップしてください: + +```html + + bluetooth + Bluetooth + +``` + + + +#### アイコン +Material Icons に加えて、Angular Badge は Material Icons Extended やその他のカスタム アイコン セットをサポートします。`IgxIconService` でカスタム アイコンを登録し、その名前とアイコン セットを指定します: + +```ts +this._iconService.addSvgIconFromText(heartMonitor.name, heartMonitor.value, 'imx-icons'); +``` + +```html + +``` + + + +#### ドット + +Ignite UI for Angular Badge は、 属性を設定することで、通知用の最小限のドット インジケーターとしてレンダリングすることもできます。ドット バッジはコンテンツをサポートしませんが、アウトライン表示が可能で、利用可能なすべてのドット タイプ (例: `primary`、`success`、`info`) を使用できます。 + +コンテンツのない最小限の通知インジケーターをレンダリングするには、 属性を設定します: + +```html + +``` + + + +### サイズ + +`--size` CSS 変数でバッジのサイズを制御します。`16px` より小さいテキスト バッジの場合は、フォント サイズと行の高さも調整してください: + +```scss +igx-badge { + --size: 12px; + + font-size: calc(var(--size) / 2); + line-height: normal; +} +``` + + + +### 形状 + +バッジの形状は、 属性を使用して `rounded` (デフォルト) または `square` に設定できます。 + +```html + +``` + + + +バッジの形状が `square` の場合、`--border-radius` CSS 変数を使用してカスタムのボーダー半径を設定することでさらにカスタマイズできます。 + +### バリアント + +Angular Badge は、Primary、Info、Success、Warn、Error の種類をサポートします。 属性を設定して種類を選択します。 + +```html + +``` + + + +
+ + + +次の例は、Avatar 上に表示される success バッジを示しています。プラットフォーム固有のパッケージから Badge と Avatar コンポーネントをインポートし、相対位置指定のラッパー内に Badge を配置します。 + + + +```tsx +import { IgrAvatar, IgrBadge } from 'igniteui-react'; +import 'igniteui-webcomponents/themes/light/bootstrap.css'; +``` + +コンポーネントを JSX に追加します: + +```tsx +
+ + +
+``` + +
+ + + +```ts +import { defineComponents, IgcAvatarComponent, IgcBadgeComponent } from 'igniteui-webcomponents'; +import 'igniteui-webcomponents/themes/light/bootstrap.css'; -### バリエーション +defineComponents(IgcAvatarComponent, IgcBadgeComponent); +``` -{ProductName} バッジは、いくつかの事前定義されたスタイルのバリエーションをサポートします。サポートされている値 `primary` (デフォルト)、`info`、`success`、`warning`、または `danger` のいずれかを 属性に割り当てることにより、バリエーションを変更できます。 +コンポーネントを HTML に追加します: + +```html +
+ + +
+``` + +
+ + + +`Program.cs` で Avatar と Badge のモジュールを登録します: + +```csharp +builder.Services.AddIgniteUIBlazor(typeof(IgbAvatarModule), typeof(IgbBadgeModule)); +``` + +コンポーネントを Razor マークアップに追加します: + +```razor +
+ + +
+``` + +
+ +相対位置指定のラッパーを使用して、バッジを Avatar の上に配置します: + +```css +.wrapper { + position: relative; + margin-top: 15px; +} +``` + +
+ + + +### タイプ + +{ProductName} Badge は、数字やアイコンなど、さまざまな種類のコンテンツを持つことができます。 + + プロパティを使用して、バッジ内にテキストや数値のカウントを表示します: ```tsx - +12 ``` @@ -137,7 +423,7 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ```html - +12 ``` @@ -145,18 +431,174 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ```razor - +12 ``` - +コンテンツを子要素として直接指定することもできます。アイコンとテキストの両方を子要素として指定する場合は、正しいパディングを保つためにテキストをラップしてください。 + + + +```tsx + + + Bluetooth + +``` -バッジにカスタム背景色が `--background-color` CSS 変数で設定されていても、バリアントの色が常に優先され、バッジに適用されます。 + + + + +```html + + + Bluetooth + +``` + + + + + +```razor + + + Bluetooth + +``` + + + + + +#### アイコン + +バッジの子コンテンツとしてアイコンを追加します: + + + +```tsx + + + +``` + + + + + +```html + + + +``` + + + + + +```razor + + + +``` + + + +カスタム アイコンの場合は、プラットフォームのアイコン サービスにアイコンを登録し、バッジの子コンテンツとしてレンダリングします。 + +たとえば、バッジで使用する前に SVG アイコンを登録します: + + + +```ts +import { registerIconFromText } from 'igniteui-webcomponents'; + +registerIconFromText( + 'heart-monitor', + '', + 'custom' +); +``` + + + + + +```razor +@code { + private IgbIcon icon; + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender && icon != null) + { + await icon.EnsureReady(); + await icon.RegisterIconFromTextAsync( + "heart-monitor", + "", + "custom"); + } + } +} +``` + + + + + +#### ドット + +{ProductName} Badge は、 属性を設定することで、通知用の最小限のドット インジケーターとしてレンダリングすることもできます。ドット バッジはコンテンツをサポートしませんが、アウトライン表示が可能で、利用可能なすべてのドット タイプ (例: `primary`、`success`、`info`) を使用できます。 + +コンテンツのない最小限の通知インジケーターをレンダリングするには、 属性を設定します: + + + +```tsx + +``` + + + + + +```html + +``` + + + + + +```razor + +``` + + + + + +### サイズ + +`--size` CSS 変数でバッジのサイズを制御します。`16px` より小さいテキスト バッジの場合は、フォント サイズと行の高さも調整してください: + +```css +igc-badge { + --size: 12px; + + font-size: calc(var(--size) / 2); + line-height: normal; +} +``` + + ### 形状 -バッジ コンポーネントは、`rounded` (デフォルト) および `square` 形状をサポートします。これらの値は、 属性に割り当てることができます。 +バッジ コンポーネントは、`rounded` (デフォルト) と `square` の形状をサポートします。これらの値は 属性に割り当てることができます。 @@ -182,18 +624,22 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); - + + + バッジの形状が `square` の場合、`--border-radius` CSS 変数を使用してカスタムのボーダー半径を設定することでさらにカスタマイズできます。 -### アウトライン + + +### バリアント -バッジには、 属性を設定すると、周囲に控えめなボーダーを表示することもできます。 +{ProductName} Badge は、いくつかの事前定義されたスタイルのバリアント (Primary、Info、Success、Warn、Error) をサポートします。サポートされている値 `primary`、`info`、`success`、`warning`、`danger` のいずれかを 属性に割り当てます。 ```tsx - + ``` @@ -201,7 +647,7 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ```html - + ``` @@ -209,23 +655,23 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ```razor - + ``` - + -アウトライン バッジのボーダーの色は、`--border-color` CSS 変数を使用してカスタマイズすることもできます。 + -### Dot +### アウトライン -{ProductName} Badge コンポーネントは、 属性を設定することで、通知用の最小限のドット インジケーターとして表示することもできます。ドット バッジはコンテンツをサポートしませんが、アウトライン表示が可能で、利用可能なすべてのドット タイプ (例: primary、success、info など) を使用できます。 + 属性を設定すると、バッジの周囲に控えめなボーダーを表示することもできます。 ```tsx - + ``` @@ -233,7 +679,7 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ```html - + ``` @@ -241,18 +687,123 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbBadgeModule)); ```razor - + ``` - + + +```html + +``` + + + + + + + + + + + + + +アウトライン バッジのボーダー カラーは、`--border-color` CSS 変数を使用してカスタマイズすることもできます。 + + + +### 使用すべき場合と使用すべきでない場合 + +**使用すべき場合:** バッジを使用して、他のコンポーネントと並べて短いステータス、カテゴリ、カウント、または通知の状態を伝えます。インジケーターに表示テキストが不要な場合は `dot` を使用します。 + +**使用すべきでない場合:** アクションのための主要なコントロールとして、フォームの検証メッセージの代わりとして、またはバッジのコンテンツ、周囲のコンテキスト、アクセシブルなラベルからステータスを理解できない場合に、バッジを使用しないでください。 +
+ + + + + + + + + + + + + +
使用すべき使用すべきでない
Badge used with an Avatar and a text labelBadge examples used without a surrounding interface element
+
+## プロパティ + +{Platform} Badge は、コンテンツ、外観、インジケーターの動作を制御するためのプラットフォーム固有のプロパティを公開します。 + + + +Angular Badge は、次のプロパティを公開します。完全な型定義については、API リファレンスを参照してください。 + +| 名前 | 型 | デフォルト | 説明 | +| --- | --- | --- | --- | +| | boolean | `false` | バッジをコンテンツのないドット インジケーターとしてレンダリングします。 | +| | boolean | `false` | バッジの周囲にアウトラインを表示します。 | +| | BadgeShape | `rounded` | バッジの形状を設定します。 | +| | BadgeType | `default` | Angular Badge のスタイルの種類を設定します。 | +| | string | — | カスタム CSS クラスを適用します。 | + + + + + +React Badge は、次のプロパティを公開します。 + +| 名前 | 型 | デフォルト | 説明 | +| --- | --- | --- | --- | +| | boolean | `false` | バッジをドット インジケーターとしてレンダリングします。 | +| | boolean | `false` | バッジの周囲にアウトラインを表示します。 | +| | BadgeShape | `rounded` | バッジの形状を設定します。 | +| | StyleVariant | `primary` | バッジのスタイルのバリアントを設定します。 | + + + + + +Web Components Badge は、次のプロパティを公開します。 + +| 名前 | 型 | デフォルト | 説明 | +| --- | --- | --- | --- | +| | boolean | `false` | バッジをドット インジケーターとしてレンダリングします。 | +| | boolean | `false` | バッジの周囲にアウトラインを表示します。 | +| | BadgeShape | `rounded` | バッジの形状を設定します。 | +| | StyleVariant | `primary` | バッジのスタイルのバリアントを設定します。 | +| | CSSResult | — | カスタム スタイルを適用します。 | + + + + + +Blazor Badge は、次のプロパティを公開します。 + +| 名前 | 型 | デフォルト | 説明 | +| --- | --- | --- | --- | +| | boolean | `false` | バッジをドット インジケーターとしてレンダリングします。 | +| | boolean | `false` | バッジの周囲にアウトラインを表示します。 | +| | BadgeShape | `rounded` | バッジの形状を設定します。 | +| | StyleVariant | `primary` | バッジのスタイルのバリアントを設定します。 | + + ## スタイル設定 - コンポーネントは、すべてのスタイル プロパティを変更するために使用できる `base` CSS パーツを公開します。 +{Platform} Badge は、 コンポーネントの `base` CSS パーツと、ドキュメント化されたスタイル設定変数を使用して外観をカスタマイズします。 + +### Sass テーマ + +{ProductName} のテーマ システムを使用して、アプリケーションの他の部分と一貫性のあるスタイルでバッジをスタイル設定します。 + +### CSS 変数 ```css igc-badge::part(base) { @@ -261,16 +812,164 @@ igc-badge::part(base) { } ``` - +| 変数 | 変更内容 | +| --- | --- | +| `--background-color` | バッジの背景色。 | +| `--border-radius` | バッジの角の半径。 | +| `--border-color` | アウトライン バッジのボーダー カラー。 | + +### スタイル パーツ + +| パーツ | スタイル対象 | +| --- | --- | +| `base` | バッジのルート要素。 | + + + + + +### Tailwind によるスタイル設定 + +カスタムの Tailwind ユーティリティ クラスを使用してバッジをスタイル設定できます。事前に [Tailwind をセットアップ](/themes/tailwind) してください。 + +グローバル スタイルシートで Tailwind をインポートするとともに、ユーティリティ ファイルをインクルードします: + +```scss +@import "tailwindcss"; +@use 'igniteui-theming/tailwind/utilities/material.css'; +``` + +ライトおよびダーク テーマ バリアントには `light-badge` と `dark-badge` を使用します。生成された CSS 変数は、任意のプロパティでオーバーライドできます: + +```html + + +``` + +感嘆符 (`!`) により、ユーティリティ クラスがコンポーネントのデフォルト テーマより優先されるようになります。 + + + + + + + + + +### Tailwind によるスタイル設定 + +`igniteui-theming` のカスタム Tailwind ユーティリティ クラスを使用してバッジをスタイル設定できます。事前に [Tailwind をセットアップ](/themes/tailwind) し、その後グローバル スタイルシートで Ignite UI ユーティリティをインポートしてください: + +```css +@import "tailwindcss"; +@import "igniteui-theming/tailwind/utilities/material.css"; +``` + + + +```jsx + +``` + + + + + +```html + +``` + + + + + +```razor + +``` + + + +感嘆符 (`!`) により、Tailwind ユーティリティがバッジのデフォルトのテーマ スタイルより優先されます。 + + + + + +## アクセシビリティ + +{Platform} Badge は視覚的なステータスを伝えるものであり、そのステータスが重要な場合は、意味のあるテキストまたは周囲のアクセシブルなコンテキストを持つ必要があります。 +### キーボード インタラクション +バッジは視覚的なステータス インジケーターであり、インタラクティブなキーボード操作は提供しません。バッジが装飾する要素のフォーカス動作に従ってアクセスされます。 +### スクリーン リーダー / ARIA + +バッジが支援技術では他に得られない情報を伝える場合は、周囲のコンポーネントに意味のある表示コンテンツまたはアクセシブルなラベルを提供してください。特定の周囲のコントロールについて、実際のアナウンス内容を確認してください。 + +### アクセシビリティ準拠 + +このコンポーネントのアクセシビリティ準拠は、製品の公式アクセシビリティ ステートメントおよびレンダリングされる使用状況のコンテキストに対して検証する必要があります。 + +## トラブルシューティング + +{Platform} Badge のトラブルシューティング ガイダンスは、一般的なスタイルおよびコンテンツの問題について、問題 → 原因 → 対処法の形式で構成されています。 + +### カスタムの背景色を設定してもバッジが変わらないのはなぜですか? + +選択した `variant` は `--background-color` CSS 変数よりも優先されます。カスタムの背景色を使用するには、独自の背景色を適用するバリアントを設定しないようにしてください。 + +### ドット バッジにコンテンツが表示されないのはなぜですか? + +`dot` プロパティはバッジを最小限のインジケーターとしてレンダリングし、コンテンツをサポートしません。テキストやその他のインライン コンテンツを表示する必要がある場合は、通常のバッジを使用してください。 + +### 既知の制限 + +{Platform} Badge には、次のプラットフォームに依存しない制限があります。 + +- ドット バッジはインジケーターのみであり、テキストやアイコンを表示できません。 +- バッジのスタイルおよびバリアント/種類の名前は、Angular とその他のサポートされているフレームワーク間で異なります。属性をフレームワーク間でそのままコピーせず、このページのプラットフォーム固有の例と API リンクを使用してください。 +- バッジは視覚的なステータス インジケーターであり、単体でキーボード インタラクションを提供しません。 ## API リファレンス -
+{Platform} Badge の API リファレンスには、対象プラットフォームの完全に検証された API サーフェスが記載されています。 + + +## 依存関係 + +{Platform} Badge は、視覚的なスタイルを適用するためにテーマ スタイルシートを必要とします。フレームワーク固有のセットアップについては、**作業の開始** を参照してください。 ## その他のリソース +以下のリソースでは、{Platform} Badge に関する追加のガイダンスとプロジェクトのサポートを提供します。 + - [{ProductName} **フォーラム (英語)**]({ForumsLink}) - [{ProductName} **GitHub (英語)**]({GithubLink}) + +## 関連コンポーネント + +{Platform} Badge は、ステータス インジケーターが他の視覚的要素に属する場合、Avatar などの関連コンポーネントと組み合わせて使用されることが一般的です。 + +- [Avatar](../layouts/avatar.mdx) - Avatar と Badge を組み合わせてステータス インジケーターを表示します。 + +## FAQ + +これらの FAQ は、{Platform} Badge の一般的なコンテンツ、インジケーター、パッケージの選択について説明します。 + + + + + はい。**使用方法** に示されているプラットフォーム固有の value と icon の API を使用してください。コンテンツを子要素として直接指定する場合は、アイコンとテキストをコンポーネントのデフォルトのコンテンツ領域内に保持してください。 + + + + プラットフォーム固有の `dot` プロパティまたは属性を設定します。ドット バッジは、意図的にテキストやその他のコンテンツなしでレンダリングされます。 + + + + Angular には `igniteui-angular`、React には `igniteui-react`、Web Components には `igniteui-webcomponents`、Blazor には `IgniteUI.Blazor` を使用してください。関連する Ignite UI パッケージは同じリリース バージョンに揃えてください。 + + + diff --git a/docs/xplat/src/content/jp/components/inputs/circular-progress.mdx b/docs/xplat/src/content/jp/components/inputs/circular-progress.mdx index 5bc4769063..8d4c1b8b90 100644 --- a/docs/xplat/src/content/jp/components/inputs/circular-progress.mdx +++ b/docs/xplat/src/content/jp/components/inputs/circular-progress.mdx @@ -7,7 +7,7 @@ mentionedTypes: ["CircularProgress", "CircularGradient"] namespace: Infragistics.Controls _language: ja llms: - description: "{ProductName} Circular Progress Indicator コンポーネントは、変更でアプリケーションの進行状況を表す視覚的なインジケーターです。" + description: "{ProductName} Circular Progress Indicator コンポーネントは、変化していくアプリケーションの進行状況を表す視覚的なインジケーターです。" --- import DocsAside from 'igniteui-astro-components/components/mdx/DocsAside.astro'; import PlatformBlock from 'igniteui-astro-components/components/mdx/PlatformBlock.astro'; @@ -15,23 +15,18 @@ import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; - # {Platform} Circular Progress (円形プログレス) の概要 -{ProductName} Circular Progress Indicator コンポーネントは、変更でアプリケーションの進行状況を表す視覚的なインジケーターです。丸形インジケーターは状態変更で外観を更新します。 +{ProductName} Circular Progress Indicator コンポーネントは、変化していくアプリケーションの処理状況を視覚的に表示します。この円形インジケーターは、状態の変化に応じて表示を更新します。 ## {Platform} Circular Progress の例 - - ## 使用方法 - - まず、次のコマンドを実行して {ProductName} をインストールする必要があります: ```cmd @@ -47,16 +42,12 @@ import 'igniteui-webcomponents/themes/light/bootstrap.css'; defineComponents(IgcCircularProgressComponent); ``` -{ProductName} の完全な概要については、[作業の開始](../general-getting-started.mdx)トピックを参照してください。 - +{ProductName} の完全な概要については、[**作業の開始**](../general-getting-started.mdx)トピックを参照してください。 - - - まず、次のコマンドを実行して、対応する {ProductName} npm パッケージをインストールする必要があります: ```cmd @@ -73,12 +64,8 @@ IgrCircularProgressModule.register(); - - - - を使用する前に、次のように登録する必要があります: ```csharp @@ -95,7 +82,6 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbCircularProgressModule)); - の使用を開始する最も簡単な方法は次のとおりです: @@ -146,18 +132,13 @@ builder.Services.AddIgniteUIBlazor(typeof(IgbCircularProgressModule)); ```razor - ``` - -### 不確定のプログレス - -正確に決定されていないプロセスをトラックしたい場合、 プロパティを設定できます。また、 プロパティを設定することで、{ProductName} のデフォルトのラベルを非表示にし、公開された プロパティを介して進行状況インジケーターのデフォルトのラベルをカスタマイズできます。 +``` -```tsx -### Indeterminate Progress +### 不確定状態のプログレス -If you want to track a process that is not determined precisely, you can set the property. Also, you can hide the default label of the {ProductName} by setting the property and customize the progress indicator default label via the exposed `LabelFormat` property. +進行状況を正確に把握できない処理を表示する場合、 プロパティを設定できます。また、 プロパティを設定することで、{ProductName} のデフォルトのラベルを非表示にし、 プロパティを使用して進行状況インジケーターのデフォルトのラベルをカスタマイズできます。 @@ -183,16 +164,13 @@ If you want to track a process that is not determined precisely, you can set the -The following sample demonstrates the above configuration: - - +次のサンプルは、上記の構成を示しています: + +### アニメーション期間 - -### Animation Duration - -You can use the property on the component to specify how long the animation cycle should take in milliseconds. + コンポーネントの プロパティを使用して、アニメーション サイクルにかかる時間をミリ秒単位で指定できます。 @@ -218,17 +196,14 @@ You can use the which defines the gradient stops. - - - +### グラデーション プログレス +`gradient` スロットと、グラデーション ストップを定義する コンポーネントを使用して、プログレス バーが単色ではなくカラー グラデーションを使用するようにカスタマイズできます。 + -For each defined as gradient slot of {ProductName} a [SVG stop](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/stop) element would be created. The values passed as `color`, `offset` and `opacity` would be set as stop-color, offset and stop-opacity of the SVG element without further validations. +{ProductName} の `gradient` スロットとして定義された ごとに、[SVG stop](https://developer.mozilla.org/ja/docs/Web/SVG/Element/stop) 要素が作成されます。`color`、`offset`、`opacity` に指定した値は、追加の検証なしに SVG 要素の `stop-color`、`offset`、`stop-opacity` 属性として設定されます。 @@ -270,28 +245,27 @@ For each defined as gradient slot +## スタイル設定 -## Styling - -The component exposes CSS parts for almost all of its inner elements: + コンポーネントは、その内部要素のほとんどすべての CSS パーツを公開します。 -|Name|Description| +|名前|説明| |--|--| -| `svg` | The progress SVG element. | -| `gradient_start` | The progress linear-gradient start color. | -| `gradient_end` | The progress linear-gradient end color. | -| `track` | The progress ring's track area. | -| `fill` | The progress indicator area. | -| `label` | The progress label. | -| `value` | The progress label value. | -| `indeterminate` | The progress indeterminate state. | -| `primary` | The progress indicator primary state. | -| `danger` | The progress indicator error state. | -| `warning` | The progress indicator warning state. | -| `info` | The progress indicator info state. | -| `success` | The progress indicator success state. | - -Using this CSS parts we have almost full control over the Circular Progress styling. +| `svg` | 進行状況の SVG 要素。 | +| `gradient_start` | 進行状況の linear-gradient の開始色。 | +| `gradient_end` | 進行状況の linear-gradient の終了色。 | +| `track` | プログレス リングのトラック領域。 | +| `fill` | 進行状況インジケーター領域。 | +| `label` | 進行状況ラベル。 | +| `value` | 進行状況ラベルの値。 | +| `indeterminate` | 進行状況の indeterminate 状態。 | +| `primary` | 進行状況インジケーターの primary 状態。 | +| `danger` | 進行状況インジケーターの error 状態。 | +| `warning` | 進行状況インジケーターの warning 状態。 | +| `info` | 進行状況インジケーターの info 状態。 | +| `success` | 進行状況インジケーターの success 状態。 | + +この CSS パーツを使用すると、Circular Progress のスタイルをほぼ完全に制御できます。 ```css @@ -311,14 +285,14 @@ igc-circular-progress::part(track) { ``` - + -## API References +## API リファレンス -## Additional Resources +## その他のリソース -- [{ProductName} **Forums**]({ForumsLink}) -- [{ProductName} **GitHub**]({GithubLink}) +- [{ProductName} **フォーラム (英語)**]({ForumsLink}) +- [{ProductName} **GitHub (英語)**]({GithubLink}) diff --git a/docs/xplat/src/content/jp/components/layouts/avatar.mdx b/docs/xplat/src/content/jp/components/layouts/avatar.mdx index 8a96d06f89..1f9b240f93 100644 --- a/docs/xplat/src/content/jp/components/layouts/avatar.mdx +++ b/docs/xplat/src/content/jp/components/layouts/avatar.mdx @@ -1,81 +1,105 @@ --- -title: "{Platform} Avatar | レイアウト コントロール | インフラジスティックス" -description: インフラジスティックスの {Platform} Avatar コンポーネントを使用して、画像、アイコン、またはイニシャルを表示します。 -keywords: avatar, layout, {ProductName}, Infragistics, アバター, レイアウト, インフラジスティックス +title: "{Platform} Avatar Component | レイアウト | インフラジスティックス" +description: "{Platform} Avatar コンポーネントを使用して、ユーザー、エンティティ、またはオブジェクトを画像、イニシャル、アイコン、またはカスタム コンテンツで表します。" +keywords: "{Platform} Avatar, avatar component, profile image, initials, {ProductName}, Infragistics, アバター, プロフィール画像, イニシャル, インフラジスティックス" +last_updated: "2026-07-29" license: MIT -mentionedTypes: ["Avatar"] +mentionedTypes: ["Avatar", "Badge", "Icon"] +relatedComponents: ["Badge"] _language: ja llms: - description: "{ProductName} Avatar コンポーネントで画像、アイコン、またはイニシャルを表示し、サイズや形状を設定する方法を説明します。" + description: "{ProductName} Avatar トピックでは、画像、イニシャル、アイコン、カスタム コンテンツ、形状、サイズ、スタイル設定、アクセシビリティ ガイダンスを使用してユーザー、エンティティ、またはオブジェクトのアイデンティティをレンダリングする方法を示します。" --- import PlatformBlock from 'igniteui-astro-components/components/mdx/PlatformBlock.astro'; import Sample from 'igniteui-astro-components/components/mdx/Sample.astro'; import ApiLink from 'igniteui-astro-components/components/mdx/ApiLink.astro'; +import Anatomy from 'igniteui-astro-components/components/mdx/Anatomy.astro'; +import Faq from 'igniteui-astro-components/components/mdx/Faq.astro'; +import FaqItem from 'igniteui-astro-components/components/mdx/FaqItem.astro'; +import { Image } from 'astro:assets'; +import avatarAnatomy from '@xplat-images/anatomy-content-light/avatar-lt-a.png'; +import avatarDo from '@xplat-images/avatar/avatar_do1.png'; +import avatarDo2x from '@xplat-images/avatar/avatar_do1@2x.png'; +import avatarDoNot from '@xplat-images/avatar/avatar_do_not1.png'; +import avatarDoNot2x from '@xplat-images/avatar/avatar_dont1@2x.png'; -# {Platform} Avatar (アバター) +# Avatar (アバター) コンポーネント -{ProductName} アバターは、アプリケーションでイニシャル、画像、またはアイコンを表示するのに役立ちます。 +{ProductName} Avatar は、画像、イニシャル、またはカスタム コンテンツを使用してユーザー、エンティティ、またはオブジェクトを表します。 -## {Platform} Icon Avatar の例 +アバターを使用して、リスト、カード、プロフィール メニュー、アクティビティ フィードでコンパクトな視覚的アイデンティティを提供します。 - +## ライブ デモ + -## 使用方法 - - - -まず、次のコマンドを実行して {ProductName} npm パッケージをインストールする必要があります。 - -```cmd -npm install {PackageWebComponents} -``` + - + -まず、次のコマンドを実行して、対応する {ProductName} npm パッケージをインストールする必要があります: + -```cmd -npm install igniteui-react -``` + -次に、以下のように、 と必要な CSS をインポートする必要があります: +## 構造 -```tsx -import { IgrAvatar } from 'igniteui-react'; -import 'igniteui-webcomponents/themes/light/bootstrap.css'; -``` +アバターは、画像のセマンティクスを適用し、サポートされているコンテンツ パターンのいずれかをレンダリングする単一のホスト要素です。 + - + - +1. 画像コンテナー: 画像コンテンツ タイプを表示します。
+2. アイコン コンテナー: アイコン コンテンツ タイプを表示します。
+3. イニシャル コンテナー: テキスト コンテンツ タイプを表示します。
-```csharp -// in Program.cs file + -builder.Services.AddIgniteUIBlazor(typeof(IgbAvatarModule)); +```text +igc-avatar[role="img"] // ホスト - アバターを公開 +└─ div[part="base"] // アバター ラッパー + ├─ span[part="initials"] // `initials` が設定されている場合にレンダリング + ├─ slot // `initials` が設定されていない場合にレンダリング + └─ img[part="image"] // `src` が設定され読み込まれている間にレンダリング ``` - - -また、追加の CSS ファイルをリンクして、スタイルを コンポーネントに適用する必要があります。以下は、**Blazor Web Assembly** プロジェクトの **wwwroot/index.html** ファイルまたは **Blazor Server** プロジェクトの **Pages/_Host.cshtml** ファイルに配置する必要があります: + -```razor - +```text +igx-avatar[role="img"] // ホスト - アバターを公開 +└─ 優先順位順に以下のいずれか: + ├─ div.igx-avatar__image // `src` が設定されている場合 - 背景として画像をレンダリング + ├─ igx-icon // `icon` が設定されている場合 + ├─ span // `initials` が設定されている場合 - 最初の 2 文字 + └─ ng-content // カスタム プロジェクション コンテンツ ``` - +## 作業の開始 + +アバター コンポーネントを使用する前に登録します。{ProductName} をまだセットアップしていない場合は、最初に共通の[作業の開始](../general-getting-started.mdx)トピックを完了してください。 + ```ts import { defineComponents, IgcAvatarComponent } from 'igniteui-webcomponents'; @@ -84,39 +108,69 @@ defineComponents(IgcAvatarComponent); -{ProductName} の完全な概要については、[作業の開始](../general-getting-started.mdx)トピックを参照してください。 + - は、画像、イニシャル、またはアイコンを含むその他のコンテンツを表示できます。 の宣言は次のように簡単です。 +`` をレンダリングする前に Angular アバター コンポーネントをインポートします。{ProductName} をまだセットアップしていない場合は、最初に共通の[作業の開始](../general/getting-started.mdx)トピックを完了してください。 - - -```html - +```ts +import { IgxAvatarComponent } from 'igniteui-angular/avatar'; ``` +アバターをレンダリングする前に React ラッパーとテーマ スタイルシートをインポートします。{ProductName} をまだセットアップしていない場合は、最初に共通の[作業の開始](../general-getting-started.mdx)トピックを完了してください。 + ```tsx - +import { IgrAvatar } from 'igniteui-react'; +import 'igniteui-webcomponents/themes/light/bootstrap.css'; ``` +`Program.cs` でアバター モジュールを登録し、テーマ スタイルシートをホスト ページに追加します。{ProductName} をまだセットアップしていない場合は、最初に共通の[作業の開始](../general-getting-started.mdx)トピックを完了してください。 + +```csharp +builder.Services.AddIgniteUIBlazor(typeof(IgbAvatarModule)); +``` + ```razor - + ``` -アバターには、コンテキストに基づいてさまざまなコンテンツを描画できるようにするいくつかの属性があります。アバターの境界にコンテンツを表示する最も基本的な方法は、開始タグと終了タグの間にコンテンツを提供することです。 +## 使用方法 + +デフォルト スロットに画像ソース、イニシャル、またはカスタム コンテンツを使用してアバターをレンダリングします。 + +### バリアント + + + +表示するコンテンツ ソースのみを設定します。アバターは が設定されている場合にそれをレンダリングし、そうでない場合はデフォルト スロット コンテンツをレンダリングします。また、 が設定されて正常に読み込まれている間は画像要素もレンダリングします。 + + + + + +表示するコンテンツ ソースのみを設定します。Angular アバターは、最初に `src` をレンダリングし、次に `icon`、次に `initials` をレンダリングし、これらのいずれの入力も設定されていない場合はプロジェクションされたカスタム コンテンツにフォールバックします。 + + ```html + + + + + @@ -124,11 +178,30 @@ defineComponents(IgcAvatarComponent); + + +```html + + + + + +``` + + + ```tsx + + + + - + ``` @@ -137,6 +210,12 @@ defineComponents(IgcAvatarComponent); ```razor + + + + @@ -144,18 +223,34 @@ defineComponents(IgcAvatarComponent); -### イニシャル + - 属性が設定されている場合、アバターのすべての子要素は無視され、この属性に渡された文字列が表示されます。 + + + + + + + + + + +### 形状 + + を `square`、`rounded`、または `circle` に設定します。 ```html - + +``` - - - + + + + +```html + ``` @@ -163,9 +258,7 @@ defineComponents(IgcAvatarComponent); ```tsx - - - + ``` @@ -173,109 +266,424 @@ defineComponents(IgcAvatarComponent); ```razor - - - - - + ``` - + -### 画像 + - 属性に静的アセットに有効な URL が割り当てられている場合、アバターは画像を表示することもできます。その場合、 値は無視され、子要素は描画されません。 + - + -```html - - - -``` + - +### サイズ -```tsx - - - +プリセット アバター サイズが必要な場合は、`--ig-size` を共通サイズ トークンのいずれかに設定します。 + + + +```css +igc-avatar { + --ig-size: var(--ig-size-large); +} ``` - + -```razor - - - +```html + ``` - + -### 形状 + -アバターは、`circle`、`rounded`、`square` の 3 つの形状をサポートしています。アバターの形状は `square` であり、 属性を介して変更できます。 + - + -### サイズ + -形状とは別に、アバターのサイズも `--ig-size` CSS 変数を利用して変更できます。サポートされているサイズは、`small` (デフォルト)、`medium`、`large` です。次のコード スニペットは、異なるコンポーネント サイズを使用する方法を示しています。 + -```css -igc-avatar { - --ig-size: var(--ig-size-large); +### 使用すべき場合と使用すべきでない場合 + +**使用すべき場合:** プロフィール画像、イニシャル、またはアイコンなど、UI が人物、組織、オブジェクト、またはアカウントの小さな表現を必要とする場合にアバターを使用します。繰り返し表示されるアイデンティティを簡単に識別できるように、同じ UI 領域内で一貫したアバター戦略を維持します。 + + + +**使用すべきでない場合:** エンティティを表す代わりにカウント、ステータス、または通知インジケーターを表示する必要がある場合は、[Badge](../inputs/badge.mdx) コンポーネントを使用します。アイデンティティとステータスの両方を一緒に表示する必要がある場合、バッジはアバターを装飾することもできます。 + + + + + +**使用すべきでない場合:** エンティティを表す代わりにカウント、ステータス、または通知インジケーターを表示する必要がある場合は、[Badge](../inputs/badge.mdx) コンポーネントを使用します。アイデンティティとステータスの両方を一緒に表示する必要がある場合、バッジはアバターを装飾することもできます。 + + + +
+ + + + + + + + + + + + + +
使用すべき使用すべきでない
{Platform} Avatar do guidance{Platform} Avatar don't guidance
+
+ +## プロパティ + +アバターは、コンテンツと形状のための小さな入力セットを公開します。 + + + +| 名前 | 型 | デフォルト | 説明 | +| -- | -- | -- | -- | +| | `string` | n/a | 画像アバターの代替テキストを設定します。 | +| | `string` | n/a | 画像が表示されない場合にレンダリングされるテキスト イニシャルを設定します。 | +| | `"square" \| "rounded" \| "circle"` | `"square"` | アバターの形状を設定します。 | +| | `string` | n/a | 画像ソース URL を設定します。 | + + + + + +| 名前 | 型 | デフォルト | 説明 | +| -- | -- | -- | -- | +| | `string` | n/a | アバターがレンダリングするアイコンを設定します。 | +| | `string` | n/a | アバターがレンダリングするテキスト イニシャルを設定します。 | +| | `"square" \| "rounded" \| "circle"` | `"square"` | アバターの形状を設定します。 | +| | `"small" \| "medium" \| "large"` | `"small"` | アバターのサイズを設定します。 | +| | `string` | n/a | 画像ソース URL を設定します。 | + + + +## スタイル設定 + + + + + + + + + + + + + +アバターの外観はテーマ変数とプラットフォーム固有のスタイル設定フックを通じて制御されます。 + + + +トークン レベルの変更にはアバター CSS 変数を使用し、レンダリングされたラッパー、画像、アイコン、またはイニシャルをターゲットにする必要がある場合は CSS パーツを使用します。 + +| 変数 | 変更内容 | +| -- | -- | +| `--ig-avatar-background` | アバターの背景色。 | +| `--ig-avatar-color` | テキストとイニシャルの色。 | +| `--ig-avatar-icon-color` | スロット アイコンの色。 | +| `--ig-avatar-border-radius` | 丸みのあるアバターに使用されるボーダー半径。 | +| `--ig-avatar-size` | アバターの幅と高さ。 | +| `--ig-size` | プリセット アバター サイズの導出に使用される共通コンポーネント サイズ トークン。 | + +| CSS パーツ | 説明 | +| -- | -- | +| `base` | アバター ラッパー。 | +| `icon` | アイコン ラッパー。 | +| `initials` | イニシャル ラッパー。 | +| `image` | 画像要素。 | + + + + + +トークン レベルの変更にはアバター CSS 変数を使用し、特定のレンダリング タイプや形状をターゲットにする必要がある場合は Angular ホスト クラスを使用します。 + +| 変数 | 変更内容 | +| -- | -- | +| `--ig-avatar-background` | アバターの背景色。 | +| `--ig-avatar-color` | テキストとイニシャルの色。 | +| `--ig-avatar-icon-color` | アイコンの色。 | +| `--ig-avatar-border-radius` | 丸みのあるアバターに使用されるボーダー半径。 | +| `--ig-avatar-size` | アバターの幅と高さ。 | +| `--ig-size` | プリセット アバター サイズの導出に使用される共通コンポーネント サイズ トークン。 | + +| セレクター | 説明 | +| -- | -- | +| `igx-avatar` | アバター ホスト要素。 | +| `.igx-avatar--rounded` | `shape` が `rounded` の場合に適用されます。 | +| `.igx-avatar--circle` | `shape` が `circle` の場合に適用されます。 | +| `.igx-avatar--image` | アバターが画像をレンダリングする場合に適用されます。 | +| `.igx-avatar--icon` | アバターがアイコンをレンダリングする場合に適用されます。 | +| `.igx-avatar--initials` | アバターがイニシャルをレンダリングする場合に適用されます。 | +| `.igx-avatar__image` | 画像アバター要素。 | + + + +### Sass テーマ + +アプリケーションが Sass を通じて Ignite UI テーマをカスタマイズする場合は、 関数を使用します。 + + + +```scss +@use "igniteui-theming/sass/themes" as *; + +$custom-avatar-theme: avatar-theme( + $background: #72da67, + $border-radius: 16px, + $size: 3rem +); + +:root { + @include tokens($custom-avatar-theme); +} +``` + + + + + +```scss +@use "igniteui-angular/theming" as *; + +$custom-avatar-theme: avatar-theme( + $background: #72da67, + $border-radius: 16px, + $size: 3rem +); + +:root { + @include tokens($custom-avatar-theme); } ``` - + -### スタイル設定 +### CSS 変数 - コンポーネントはいくつかの CSS パーツを公開し、スタイルを完全に制御できるようにします。 +Sass ビルド ステップなしでローカルでのスタイル設定が必要な場合は、コンポーネント CSS 変数を直接設定します。 -|名前|説明| -|--|--| -| `base` | アバターの基本ラッパー。 | -| `initials` | アバターのイニシャル ラッパー。 | -| `image` | アバターの画像ラッパー。 | -| `icon` | アバターのアイコン ラッパー。 | + ```css igc-avatar { --ig-avatar-background: var(--ig-success-500); + --ig-avatar-color: var(--ig-success-500-contrast); + --ig-avatar-border-radius: 20px; } igc-avatar::part(base) { - --size: 60px; - color: var(--ig-success-500-contrast); - border-radius: 20px; + border: 2px solid var(--ig-success-700); +} +``` + + + + + +```css +igx-avatar { + --ig-avatar-background: var(--ig-success-500); + --ig-avatar-color: var(--ig-success-500-contrast); + --ig-avatar-border-radius: 20px; } ``` - + + +### Tailwind によるスタイル設定 + + + +Ignite UI コンポーネント トークンと共にユーティリティ ファーストのレイアウト スタイリングが必要な場合は、{ProductName} Avatar で Tailwind ユーティリティ クラスを使用します。 + + + + + + + +アプリケーションが Tailwind クラスを通じて Ignite UI コンポーネントをスタイリングする場合は、Angular Tailwind ユーティリティ構文を使用します。 + + + + + +## アクセシビリティ + +アバターは、アクセシブルな画像セマンティクスを持つ非インタラクティブなアイデンティティ表示要素です。 + +### キーボード インタラクション + +アバターはフォーカスを受け取らず、キーボード インタラクションはありません。 + +| キー | アクション | +| -- | -- | +| n/a | アバターはキーボードによるインタラクティブ操作に対応していません。 | + +### スクリーン リーダー / ARIA + +アバターは画像のセマンティクスと `avatar` のデフォルトのアクセシブル ラベルで初期化されます。 + + + +- `src` 画像が特定の人物、エンティティ、またはオブジェクトを表す場合は `alt` を設定します。 +- プロジェクションされたカスタム コンテンツに別のアクセシブルな名前が必要な場合は、明示的な `aria-label` を追加します。 +- 隣接するテキストがすでに同じエンティティを識別している場合、装飾的なアバターを冗長として扱います。 + + + + + +- 画像アバターがアイデンティティを伝える場合、周囲のテキストを使用して表現される人物、エンティティ、またはオブジェクトを識別します。 +- 隣接するテキストがすでに同じエンティティを識別している場合、装飾的なアバターを冗長として扱います。 + + + +### アクセシビリティ準拠 + +インフラジスティックスは、[アクセシビリティ準拠](../interactivity/accessibility-compliance.mdx) トピックで、Section 508 および WCAG 2.1 ガイドライン領域における {ProductName} のアクセシビリティ サポートを文書化しています。 + + + +| 基準 | コンポーネントの準拠方法 | +| -- | -- | +| [1.1.1 非テキスト コンテンツ](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content) | アバターにはアクセシブルなラベルがあり、画像アバターは `alt` を通じて特定の代替テキストを受け取ることができます。 | +| [4.1.2 名前、役割、値](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value) | コンポーネントは画像セマンティクスで初期化され、コンテンツ関連の ARIA 情報を公開します。 | + + + + + +| 基準 | コンポーネントの準拠方法 | +| -- | -- | +| [1.1.1 非テキスト コンテンツ](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content) | アバターにはアクセシブル ラベルがあり、表現されるエンティティを識別する周囲のテキストと組み合わせることができます。 | +| [4.1.2 名前、役割、値](https://www.w3.org/WAI/WCAG22/Understanding/name-role-value) | コンポーネントは `role="img"` とデフォルトのアクセシブル ラベルで初期化されます。 | + + + +ユーザー側の責任: + +- スタイルをオーバーライドするときに、アバターの背景とテキストまたはアイコンの色のコントラストを十分に保ちます。 +- 隣接するテキストがすでに人物またはエンティティの名前を示している場合、同じアイデンティティのアナウンスを重複させないようにします。 + + +- アバターがアイデンティティを伝える場合は、説明的なラベルまたは `alt` テキストを提供してください。 + + + + + +- アバター画像がアイデンティティを伝える場合、近くのテキストが表現されるエンティティを識別していることを確認します。 + + + +## トラブルシューティング + +Avatar をインタラクティブまたはステータス コンポーネントとして扱う前に、このセクションを使用して境界と一般的な決定を確認してください。 + +### 既知の制限 + +アバターは視覚的なアイデンティティのプリミティブであり、それ自体ではインタラクション、ステータス、または通知動作を追加しません。 + +- 表現されるエンティティがクリック可能でなければならない場合は、ボタンやリスト アイテムなどのインタラクティブなコンテナーを使用します。 +- ステータス、カウント、または通知インジケーターを表示する必要がある場合は、アバターにバッジを使用します。 ## API リファレンス -
+完全なアバター API サーフェスについては、これらの API リファレンスを使用してください。 + + + + + + + + + + + + + + + +## 依存関係 + + + +スロット アイコンには、 コンポーネントの登録またはインポートが必要です。 + + + + + +アバターはデフォルトの外観に共通テーマ スタイルシートも使用します。 + + + + + +Sass スタイル設定ワークフローは、 および API を使用します。 + + ## その他のリソース +サポートおよび関連する Ignite UI ドキュメントについては、これらのリソースを使用してください。 + - [{ProductName} **フォーラム (英語)**]({ForumsLink}) - [{ProductName} **GitHub (英語)**]({GithubLink}) + +## 関連コンポーネント + +アイデンティティをステータス、アクション、またはより豊富なレイアウトと組み合わせる必要がある場合は、これらの関連コンポーネントを使用してください。 + + + +- [Badge](../inputs/badge.mdx) - カウント、ステータス、または通知インジケーターを表示するには Badge を使用します。UI にアイデンティティとステータスの両方が必要な場合、Badge は Avatar を装飾できます。 + + + + + +- [Badge](../inputs/badge.mdx) - カウント、ステータス、または通知インジケーターを表示するには Badge を使用します。UI にアイデンティティとステータスの両方が必要な場合、Badge は Avatar を装飾できます。 + + + +## FAQ + + + + UI が人物、アカウント、組織、またはオブジェクトを表す必要がある場合に Avatar を使用します。UI がカウント、ステータス、または通知インジケーターを表示する必要がある場合は Badge を使用します。 + + + + いいえ。Avatar は非インタラクティブであり、それ自体ではフォーカスを受け取りません。表現されるエンティティがアクションを必要とする場合は、インタラクティブなコンポーネント内に配置してください。 + + + + アバター画像が特定のエンティティを識別する場合は、意味のある代替テキストを提供します。隣接するテキストがすでにそのエンティティの名前を示している場合、同じアイデンティティのアナウンスを繰り返さないようにします。 + + diff --git a/docs/xplat/src/content/jp/components/scheduling/date-picker.mdx b/docs/xplat/src/content/jp/components/scheduling/date-picker.mdx index e757836051..072177ef5d 100644 --- a/docs/xplat/src/content/jp/components/scheduling/date-picker.mdx +++ b/docs/xplat/src/content/jp/components/scheduling/date-picker.mdx @@ -359,13 +359,13 @@ prefix スロットと suffix スロットを使用すると、Input のメイ は、フォーカスされていないときにピッカーの入力を書式設定するために使用されます。 が指定されていない場合、ピッカーは をその として使用します。 -これらの詳細については、 の形式セクションを参照してください。 +これらの詳細については、 の形式セクションを参照してください。 ### 増加および減少 - は、 メソッドと メソッドを公開します。これらは両方とも から取得され、現在設定されている日付の特定の を増加および減少するために使用できます。 + は、 メソッドと メソッドを公開します。これらは両方とも から取得され、現在設定されている日付の特定の を増加および減少するために使用できます。 diff --git a/docs/xplat/src/content/jp/toc.json b/docs/xplat/src/content/jp/toc.json index 959793318a..9c26c7e51e 100644 --- a/docs/xplat/src/content/jp/toc.json +++ b/docs/xplat/src/content/jp/toc.json @@ -2432,9 +2432,6 @@ "header": true }, { - "exclude": [ - "Angular" - ], "name": "バッジ", "href": "inputs/badge.mdx" }, @@ -2770,9 +2767,6 @@ "href": "themes/styles.mdx" }, { - "exclude": [ - "Angular" - ], "name": "カスタム Tailwind クラス", "href": "themes/tailwind.mdx", "new": true diff --git a/package-lock.json b/package-lock.json index a871c5cf87..dc86737fb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,25 +12,28 @@ "docs/xplat" ], "dependencies": { - "astro-seo-schema": "^6.0.0", + "@astrojs/markdown-satteri": "^0.3.5", + "astro-seo-schema": "^7.0.0", "gray-matter": "^4.0.3", - "igniteui-astro-components": "0.0.27", - "igniteui-theming": "^25.0.2", - "igniteui-webcomponents": "^7.2.4", + "igniteui-astro-components": "1.0.2", + "igniteui-theming": "^26.0.1", + "igniteui-webcomponents": "^7.3.0-beta.1", "js-yaml": "^4.1.1", "jsdom": "^29.0.1", "pagefind": "^1.5.2", + "satteri": "^0.9.5", + "sharp": "0.35.3", "turndown": "^7.2.4", "turndown-plugin-gfm": "^1.0.2" }, "devDependencies": { - "@astrojs/mdx": "^6.0.0", + "@astrojs/mdx": "^7.0.5", "@astrojs/ts-plugin": "^1.10.7", "@types/jsdom": "^28.0.1", - "astro": "^6.1.6", + "astro": "^7.2.2", "cross-env": "^10.1.0", "cspell": "^9.2.2", - "markdownlint-cli": "^0.48.0", + "markdownlint-cli": "^0.49.1", "sass-embedded": "^1.98.0", "typescript": "^5.4.0" }, @@ -38,18 +41,18 @@ "node": ">=22.12.0" }, "peerDependencies": { - "@astrojs/mdx": ">=5", - "astro": ">=6" + "@astrojs/mdx": ">=7", + "astro": ">=7" } }, "docs/angular": { "name": "angular-docs", "version": "1.0.0", "dependencies": { - "astro": "^6.1.6", + "astro": "^7.2.2", "docs-template": "file:../../", - "igniteui-astro-components": "0.0.27", - "sharp": "^0.34.2" + "igniteui-astro-components": "1.0.2", + "sharp": "^0.35.3" }, "devDependencies": { "cross-env": "^7.0.3", @@ -81,10 +84,10 @@ "name": "xplat-docs", "version": "0.0.1", "dependencies": { - "astro": "^6.1.6", + "astro": "^7.2.2", "docs-template": "file:../../", - "igniteui-astro-components": "0.0.27", - "sharp": "^0.34.2" + "igniteui-astro-components": "1.0.2", + "sharp": "^0.35.3" }, "devDependencies": { "cross-env": "^10.1.0", @@ -149,375 +152,926 @@ "dev": true, "license": "MIT" }, - "node_modules/@astrojs/internal-helpers": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.0.tgz", - "integrity": "sha512-Ry2R3VPeIN4uPCSA4xQc+e+vsJXkalKpEbDc07hV+a/o5Bs2N/s/uDcPJH/05L19DKh9tAy7e6JM3YZ6Cxfezw==", + "node_modules/@astrojs/compiler-binding": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding/-/compiler-binding-0.4.0.tgz", + "integrity": "sha512-x2RjDUuWfwLNtc3mjAdSRInwqh/rqbLar9cm/5FOMbHvmYZB7yfKewzSclAxWjIZsypJDXv1lhaP2WG+P8TK3g==", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "js-yaml": "^4.1.1", - "picomatch": "^4.0.4", - "retext-smartypants": "^6.2.0", - "shiki": "^4.0.2", - "smol-toml": "^1.6.0", - "unified": "^11.0.5" - } - }, - "node_modules/@astrojs/markdown-remark": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.0.tgz", - "integrity": "sha512-+YxmVQu1Bd+MFfSzjq1rOJvD9+nIOJzz5YIIhdIH01RrxRkKbyKoEgyIqP3yv51MhzMDgd79QaPv+kCVPT8vHw==", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@astrojs/compiler-binding-darwin-arm64": "0.4.0", + "@astrojs/compiler-binding-darwin-x64": "0.4.0", + "@astrojs/compiler-binding-linux-arm64-gnu": "0.4.0", + "@astrojs/compiler-binding-linux-arm64-musl": "0.4.0", + "@astrojs/compiler-binding-linux-x64-gnu": "0.4.0", + "@astrojs/compiler-binding-linux-x64-musl": "0.4.0", + "@astrojs/compiler-binding-wasm32-wasi": "0.4.0", + "@astrojs/compiler-binding-win32-arm64-msvc": "0.4.0", + "@astrojs/compiler-binding-win32-x64-msvc": "0.4.0" + } + }, + "node_modules/@astrojs/compiler-binding-darwin-arm64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-arm64/-/compiler-binding-darwin-arm64-0.4.0.tgz", + "integrity": "sha512-ZVUwHundaQyFNjE6uoa0usaC0WOCitDCLS/4mdb4rOiJXwVUuKJBMxI5WMzXLWmamsXtK/Z//ifLXvV5Yeh4Hw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/prism": "4.0.2", - "github-slugger": "^2.0.0", - "hast-util-from-html": "^2.0.3", - "hast-util-to-text": "^4.0.2", - "mdast-util-definitions": "^6.0.0", - "rehype-raw": "^7.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-smartypants": "^3.0.2", - "unified": "^11.0.5", - "unist-util-remove-position": "^5.0.0", - "unist-util-visit": "^5.1.0", - "unist-util-visit-parents": "^6.0.2", - "vfile": "^6.0.3" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@astrojs/mdx": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-6.0.3.tgz", - "integrity": "sha512-+4P3ZvwsRAqAbBgY+uZMewFo3ficlIBPZfu/Luk+v4ia/ZOuFhpsw7r+7672uT2Fc1UPdp7yW0eU5egvSq0wbw==", - "dev": true, + "node_modules/@astrojs/compiler-binding-darwin-x64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-darwin-x64/-/compiler-binding-darwin-x64-0.4.0.tgz", + "integrity": "sha512-FI6G8AY8u6fR1SI/QRR5yGMwtvZwP34CDmZpZ5HwJGa50UM1VISTLhqkhV4a476pmgd25X1Aur2dqw6hUnrlKA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/markdown-remark": "7.2.0", - "@mdx-js/mdx": "^3.1.1", - "acorn": "^8.16.0", - "es-module-lexer": "^2.0.0", - "estree-util-visit": "^2.0.0", - "hast-util-to-html": "^9.0.5", - "piccolore": "^0.1.3", - "rehype-raw": "^7.0.0", - "remark-gfm": "^4.0.1", - "remark-smartypants": "^3.0.2", - "source-map": "^0.7.6", - "unist-util-visit": "^5.1.0", - "vfile": "^6.0.3" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=22.12.0" - }, - "peerDependencies": { - "@astrojs/markdown-satteri": "0.3.0", - "astro": "^6.4.0" - }, - "peerDependenciesMeta": { - "@astrojs/markdown-satteri": { - "optional": true - } + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@astrojs/prism": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", - "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", + "node_modules/@astrojs/compiler-binding-linux-arm64-gnu": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-gnu/-/compiler-binding-linux-arm64-gnu-0.4.0.tgz", + "integrity": "sha512-lB9gLFJK7m82EnjaU8nlRBEfcwGNeHidW3sSjODTUjMNaoewVuUz9fwwdY5M4jiSXIqWLH3yl6TX8FTDKA74Sw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "prismjs": "^1.30.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=22.12.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@astrojs/telemetry": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.2.tgz", - "integrity": "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==", + "node_modules/@astrojs/compiler-binding-linux-arm64-musl": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-arm64-musl/-/compiler-binding-linux-arm64-musl-0.4.0.tgz", + "integrity": "sha512-HPbvWqbxFxyaoQJhLxCaSjtYBx9KBo7JGVzEFZCmMl968a2PsSH0UfiODYgYPXofTOIsIH2aoCcrHXML0IA3ig==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "ci-info": "^4.4.0", - "dset": "^3.1.4", - "is-docker": "^4.0.0", - "is-wsl": "^3.1.1", - "which-pm-runs": "^1.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "18.20.8 || ^20.3.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@astrojs/ts-plugin": { - "version": "1.10.9", - "resolved": "https://registry.npmjs.org/@astrojs/ts-plugin/-/ts-plugin-1.10.9.tgz", - "integrity": "sha512-2pNc9EMXJcvYsmjQahYyqOiUNN9hMzgnxgIE/fZBLJAeOxPeOCSMa6BdngwV+bMgZDJcUSfC3qFt3+9abuUxtQ==", - "dev": true, + "node_modules/@astrojs/compiler-binding-linux-x64-gnu": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-gnu/-/compiler-binding-linux-x64-gnu-0.4.0.tgz", + "integrity": "sha512-tQKolMxoJ/+0AmLWm1PmJ/i+z3i10ZU1bNuVjEDulCf48azEMtUNjTZgHJ5MPtpYRNc7dlETr8QujUfduzoC7Q==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@astrojs/compiler": "^2.13.1", - "@astrojs/yaml2ts": "^0.2.4", - "@jridgewell/sourcemap-codec": "^1.5.5", - "@volar/language-core": "~2.4.28", - "@volar/typescript": "~2.4.28", - "semver": "^7.7.4", - "vscode-languageserver-textdocument": "^1.0.12" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@astrojs/yaml2ts": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", - "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", - "dev": true, + "node_modules/@astrojs/compiler-binding-linux-x64-musl": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-linux-x64-musl/-/compiler-binding-linux-x64-musl-0.4.0.tgz", + "integrity": "sha512-5v5YymudsxMHp3NBLCS8BUlu5CRqeLtWD9cKS/4nIhIEHCbpz9okmVV6I0HWqmBAPhWYcDa3vw/vltYPrOQCTA==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "yaml": "^2.8.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "node_modules/@astrojs/compiler-binding-wasm32-wasi": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-wasm32-wasi/-/compiler-binding-wasm32-wasi-0.4.0.tgz", + "integrity": "sha512-m/phuH3x3PREvv1OnkM44NoPh4MatUadix1fB1u5SvMLCyDTUZykDJbKnWf1cjnYmHdlB8HcjTjl6JrCqAIXcw==", + "cpu": [ + "wasm32" + ], "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.2.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "node_modules/@astrojs/compiler-binding-win32-arm64-msvc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-arm64-msvc/-/compiler-binding-win32-arm64-msvc-0.4.0.tgz", + "integrity": "sha512-B9zYf3okEY83kM8gydlpH2BHP00w4ifxPqlYlWrgTwuD6wnkrJDCwBlgy1q31cERjCJRXN1lrE2VmkLvFjv/6g==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "node_modules/@astrojs/compiler-binding-win32-x64-msvc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-binding-win32-x64-msvc/-/compiler-binding-win32-x64-msvc-0.4.0.tgz", + "integrity": "sha512-zB0Nrv0dGc0zZWPGDRmmETTPhDRqyZjAjk+gWMlVrJX5U89obpB3VUUE1ZiHxOCN5LQojeLK6O8L/dnoHolvNQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "node_modules/@astrojs/compiler-rs": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler-rs/-/compiler-rs-0.4.0.tgz", + "integrity": "sha512-koVikeon1kreEy+/JzLQRy3vzHHQVOjycs4degg4vFufKApZOwMZvSSAEztYNhmcQVfNVsVZZI4cEge3cexAbQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "@astrojs/compiler-binding": "0.4.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=22.12.0" } }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "node_modules/@astrojs/internal-helpers": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.10.4.tgz", + "integrity": "sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==", "license": "MIT", "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "js-yaml": "^4.3.0", + "picomatch": "^4.0.4", + "retext-smartypants": "^6.2.0", + "shiki": "^4.0.2", + "smol-toml": "^1.6.0", + "unified": "^11.0.5" } }, - "node_modules/@bufbuild/protobuf": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.1.tgz", - "integrity": "sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==", - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@capsizecss/unpack": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", - "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "node_modules/@astrojs/markdown-remark": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-7.2.4.tgz", + "integrity": "sha512-MvspGMynWKAjTe4/lTUdmBPHIFKNVLTCF6UlyWGogTGzNrTvjD+D4n48k7h8swxsEPKHK2TwxkZO7uoaCv1Pow==", "license": "MIT", "dependencies": { - "fontkitten": "^1.0.3" - }, - "engines": { - "node": ">=18" + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.1.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" } }, - "node_modules/@clack/core": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.2.tgz", - "integrity": "sha512-0Ty/1Gfm+Kb07sXcuESjyKfwEhSy4Ns1AgeEisHb/bDY5fWme0tTeTkU14T1Gmcs17YIjB/teiDe4uaCghbYqQ==", + "node_modules/@astrojs/markdown-satteri": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-satteri/-/markdown-satteri-0.3.8.tgz", + "integrity": "sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==", "license": "MIT", "dependencies": { - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 20.12.0" + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/prism": "4.0.2", + "github-slugger": "^2.0.0", + "satteri": "^0.10.3" } }, - "node_modules/@clack/prompts": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.6.0.tgz", - "integrity": "sha512-EYlRokl8szrP9Z25qT5aepMdBjzBvHF9ZEhzIiUBc9guz/T31EqRgvD0QSgZcpE93xiwrr+OkB4nz0BZyF6fSA==", + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.10.5.tgz", + "integrity": "sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-darwin-x64": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.10.5.tgz", + "integrity": "sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.10.5.tgz", + "integrity": "sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.10.5.tgz", + "integrity": "sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.10.5.tgz", + "integrity": "sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.10.5.tgz", + "integrity": "sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.10.5.tgz", + "integrity": "sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==", + "cpu": [ + "wasm32" + ], "license": "MIT", + "optional": true, "dependencies": { - "@clack/core": "1.4.2", - "fast-string-width": "^3.0.2", - "fast-wrap-ansi": "^0.2.0", - "sisteransi": "^1.0.5" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.2.3" }, "engines": { - "node": ">= 20.12.0" + "node": ">=14.0.0" } }, - "node_modules/@cspell/cspell-bundled-dicts": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.8.0.tgz", - "integrity": "sha512-MpXFpVyBPfJQ1YuVotljqUaGf6lWuf+fuWBBgs0PHFYTSjRPWuIxviAaCDnup/CJLLH60xQL4IlcQe4TOjzljw==", - "dev": true, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.10.5.tgz", + "integrity": "sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.10.5.tgz", + "integrity": "sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@astrojs/markdown-satteri/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", + "optional": true, "dependencies": { - "@cspell/dict-ada": "^4.1.1", - "@cspell/dict-al": "^1.1.1", - "@cspell/dict-aws": "^4.0.17", - "@cspell/dict-bash": "^4.2.2", - "@cspell/dict-companies": "^3.2.11", - "@cspell/dict-cpp": "^7.0.2", - "@cspell/dict-cryptocurrencies": "^5.0.5", - "@cspell/dict-csharp": "^4.0.8", - "@cspell/dict-css": "^4.1.1", - "@cspell/dict-dart": "^2.3.2", - "@cspell/dict-data-science": "^2.0.13", - "@cspell/dict-django": "^4.1.6", - "@cspell/dict-docker": "^1.1.17", - "@cspell/dict-dotnet": "^5.0.13", - "@cspell/dict-elixir": "^4.0.8", - "@cspell/dict-en_us": "^4.4.33", - "@cspell/dict-en-common-misspellings": "^2.1.12", - "@cspell/dict-en-gb-mit": "^3.1.22", - "@cspell/dict-filetypes": "^3.0.18", - "@cspell/dict-flutter": "^1.1.1", - "@cspell/dict-fonts": "^4.0.6", - "@cspell/dict-fsharp": "^1.1.1", - "@cspell/dict-fullstack": "^3.2.9", - "@cspell/dict-gaming-terms": "^1.1.2", - "@cspell/dict-git": "^3.1.0", - "@cspell/dict-golang": "^6.0.26", - "@cspell/dict-google": "^1.0.9", - "@cspell/dict-haskell": "^4.0.6", - "@cspell/dict-html": "^4.0.15", - "@cspell/dict-html-symbol-entities": "^4.0.5", - "@cspell/dict-java": "^5.0.12", - "@cspell/dict-julia": "^1.1.1", - "@cspell/dict-k8s": "^1.0.12", - "@cspell/dict-kotlin": "^1.1.1", - "@cspell/dict-latex": "^5.1.0", - "@cspell/dict-lorem-ipsum": "^4.0.5", - "@cspell/dict-lua": "^4.0.8", - "@cspell/dict-makefile": "^1.0.5", - "@cspell/dict-markdown": "^2.0.16", - "@cspell/dict-monkeyc": "^1.0.12", - "@cspell/dict-node": "^5.0.9", - "@cspell/dict-npm": "^5.2.38", - "@cspell/dict-php": "^4.1.1", - "@cspell/dict-powershell": "^5.0.15", - "@cspell/dict-public-licenses": "^2.0.16", - "@cspell/dict-python": "^4.2.26", - "@cspell/dict-r": "^2.1.1", - "@cspell/dict-ruby": "^5.1.1", - "@cspell/dict-rust": "^4.1.2", - "@cspell/dict-scala": "^5.0.9", - "@cspell/dict-shell": "^1.1.2", - "@cspell/dict-software-terms": "^5.2.2", - "@cspell/dict-sql": "^2.2.1", - "@cspell/dict-svelte": "^1.0.7", - "@cspell/dict-swift": "^2.0.6", - "@cspell/dict-terraform": "^1.1.3", - "@cspell/dict-typescript": "^3.2.3", - "@cspell/dict-vue": "^3.0.5", - "@cspell/dict-zig": "^1.0.0" - }, - "engines": { - "node": ">=20" + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" } }, - "node_modules/@cspell/cspell-json-reporter": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.8.0.tgz", - "integrity": "sha512-nqUaSo9T7l8KrE22gc7ZIs+zvP7ak1i7JqGdRs8sGvh2Ijqj43qYQLePgb1b/vm8a1bavnc51m+vf05hpd3g3Q==", - "dev": true, + "node_modules/@astrojs/markdown-satteri/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", + "optional": true, "dependencies": { - "@cspell/cspell-types": "9.8.0" - }, - "engines": { - "node": ">=20" + "tslib": "^2.4.0" } }, - "node_modules/@cspell/cspell-performance-monitor": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.8.0.tgz", - "integrity": "sha512-IsrXYzn23yJICIQ915ACdf+2lNEcFNTu5BIQt3khHOsGVvZ9/AZYpu9Dk825vUyZG7RHg2Oi6dYNiJtULG4ouQ==", - "dev": true, + "node_modules/@astrojs/markdown-satteri/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "license": "MIT", - "engines": { - "node": ">=20.18" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@cspell/cspell-pipe": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.8.0.tgz", - "integrity": "sha512-ISEUD8PHYkd2Ktafc6hFfIXdGKYUvthA09NbwwZsWmOqYyk4wWKHZKqyyxD+BcrFwOyMOJcD8OEvIjkRQp2SJw==", - "dev": true, + "node_modules/@astrojs/markdown-satteri/node_modules/satteri": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.10.5.tgz", + "integrity": "sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==", "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.5", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" + }, + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.10.5", + "@bruits/satteri-darwin-x64": "0.10.5", + "@bruits/satteri-linux-arm64-gnu": "0.10.5", + "@bruits/satteri-linux-arm64-musl": "0.10.5", + "@bruits/satteri-linux-x64-gnu": "0.10.5", + "@bruits/satteri-linux-x64-musl": "0.10.5", + "@bruits/satteri-wasm32-wasi": "0.10.5", + "@bruits/satteri-win32-arm64-msvc": "0.10.5", + "@bruits/satteri-win32-x64-msvc": "0.10.5" } }, - "node_modules/@cspell/cspell-resolver": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.8.0.tgz", - "integrity": "sha512-PZJj56BZpKfMxOzWkyt7b+aIXObe+8Ku/zLI4xDXPSuQPENbHBFHfPIZx68CyGEkanKxZ1ewKVx/FT1FUy+wDA==", - "dev": true, + "node_modules/@astrojs/mdx": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-7.0.8.tgz", + "integrity": "sha512-RNuwq2ccTSi7NX9YqlR0noaWoVdOrZuJvdfWXotAzdhMVB0b0zEMLnNU+xar7le0GwTMlTObD/QAu8jeHA/3nA==", "license": "MIT", "dependencies": { - "global-directory": "^5.0.0" + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/markdown-remark": "7.2.4", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.16.0", + "es-module-lexer": "^2.0.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.1.0", + "vfile": "^6.0.3" }, "engines": { - "node": ">=20" + "node": ">=22.12.0" + }, + "peerDependencies": { + "@astrojs/markdown-satteri": "^0.3.1", + "astro": "^7.0.0" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-satteri": { + "optional": true + } } }, - "node_modules/@cspell/cspell-service-bus": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.8.0.tgz", - "integrity": "sha512-P45sd2nqwcqhulBBbQnZB/JNcobecTrP4Ky3vmEq0cprsvavc+ZoHF9U2Ql5ghMSUzjrF2n1aNzZ8cH4IlsnKg==", - "dev": true, + "node_modules/@astrojs/prism": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-4.0.2.tgz", + "integrity": "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==", "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, "engines": { - "node": ">=20" + "node": ">=22.12.0" } }, - "node_modules/@cspell/cspell-types": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.8.0.tgz", - "integrity": "sha512-7Ge4UD6SCA49Tcc3+GTlz3Xn4cqVUAXtDO0u9IeHvJgkN3Me2Rw2GB/CtGmhKST3YeEeZMX7ww09TdHMUJlehw==", - "dev": true, + "node_modules/@astrojs/telemetry": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.3.tgz", + "integrity": "sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==", "license": "MIT", + "dependencies": { + "ci-info": "^4.4.0", + "dset": "^3.1.4", + "is-docker": "^4.0.0", + "package-manager-detector": "^1.6.0" + }, "engines": { - "node": ">=20" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/ts-plugin": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@astrojs/ts-plugin/-/ts-plugin-1.10.11.tgz", + "integrity": "sha512-W7Fmbaw81mcecFgJWgfY8FX7G7nCiooiakgd8ZAVprglEo81W2HzXh2I+okmAorCZLICl4PeEELkpGzrEXze4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.1", + "@astrojs/yaml2ts": "^0.2.4", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/language-core": "~2.4.28", + "@volar/typescript": "~2.4.28", + "semver": "^7.7.4", + "vscode-languageserver-textdocument": "^1.0.12" + } + }, + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.4.tgz", + "integrity": "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.8.3" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@bruits/satteri-darwin-arm64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-arm64/-/satteri-darwin-arm64-0.9.5.tgz", + "integrity": "sha512-iw4nZgx9v30lWo/MTngQqi1pI78KI0DnkSm+lVJGYdmPLgAyDNJigVhpG42/Iq55A6c1Ll8q66ljyyRiQUxwow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-darwin-x64": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-darwin-x64/-/satteri-darwin-x64-0.9.5.tgz", + "integrity": "sha512-6T26Z5Kf3cFW2PSlk9p7zT7yVxvuBSiJvYyz9u8KjYwMTqZyIDOj2wDyNpxKV4+6yUVG7rddq2QwvG/8LJA2+Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-gnu/-/satteri-linux-arm64-gnu-0.9.5.tgz", + "integrity": "sha512-u51id17uJwNEMK9nBlICsq6U31c+XVqQueVBkwRIzZG+gMpS8TOJctt5h5Wz33Z8xnMdTd+adtACVz0yHgGuOA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-arm64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-arm64-musl/-/satteri-linux-arm64-musl-0.9.5.tgz", + "integrity": "sha512-v39HxiwGC5Rqm01HksP6+5Y+xKLPlsuVFgIgpEAo+SiQ22c+mJVhS3u7Z6ePAKdhL5NJoK1xq70kLz3L13AhpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-gnu": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-gnu/-/satteri-linux-x64-gnu-0.9.5.tgz", + "integrity": "sha512-F3uO8uFp3pAP5ZGXttwvh57GS7s0lL953tnNdyI2gRyP4kOOkp6pyGojNJzCjkDvWI2Cvb9iNrKok3aqQPauAw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-linux-x64-musl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-linux-x64-musl/-/satteri-linux-x64-musl-0.9.5.tgz", + "integrity": "sha512-bicEqglLlz++mWyADaZoP0JY20s4vDfLjaPYgQqC+NI4zZLTOOg1T4GB8aqtc822Pqji8SQBmSrTb7CrP8i08Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@bruits/satteri-wasm32-wasi": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-wasm32-wasi/-/satteri-wasm32-wasi-0.9.5.tgz", + "integrity": "sha512-zauAuMwfPnKPUkd4AFixRFpXdgKwP2mKgxrIIo2gJzW0/ZneF9dbHnLkojSpaBnCCp7VUL1hIi5WWZvB1CqmAQ==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@bruits/satteri-win32-arm64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-arm64-msvc/-/satteri-win32-arm64-msvc-0.9.5.tgz", + "integrity": "sha512-SrfE7NEsgZjBvU3c+RR6oQRu0ToXY5uVJEbieXEF0YTctIV2zAVlbaMjWLts074QCgh3a+XHWkR/lWh2VH2LUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@bruits/satteri-win32-x64-msvc": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@bruits/satteri-win32-x64-msvc/-/satteri-win32-x64-msvc-0.9.5.tgz", + "integrity": "sha512-5Kw9ZAtTGS8WHizyn+CJhjjfIQrw+7jcZodpmpXJjefnO15M8UexIi6JR2E5thyvsmHyhL6ZDDMUNR4bKJPd4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.14.0.tgz", + "integrity": "sha512-C3UGsiCwSprE2NKIIFA3hCDlpXTMCAXRZuEVp88L1GY36Y41+rYL5fryE+nOFhp4p4JPQvdV8PQ4DWgHgeTE+w==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.1.tgz", + "integrity": "sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@clack/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.3.tgz", + "integrity": "sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.7.0.tgz", + "integrity": "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.4.3", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@cspell/cspell-bundled-dicts": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.8.0.tgz", + "integrity": "sha512-MpXFpVyBPfJQ1YuVotljqUaGf6lWuf+fuWBBgs0PHFYTSjRPWuIxviAaCDnup/CJLLH60xQL4IlcQe4TOjzljw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/dict-ada": "^4.1.1", + "@cspell/dict-al": "^1.1.1", + "@cspell/dict-aws": "^4.0.17", + "@cspell/dict-bash": "^4.2.2", + "@cspell/dict-companies": "^3.2.11", + "@cspell/dict-cpp": "^7.0.2", + "@cspell/dict-cryptocurrencies": "^5.0.5", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.1.1", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.13", + "@cspell/dict-elixir": "^4.0.8", + "@cspell/dict-en_us": "^4.4.33", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.22", + "@cspell/dict-filetypes": "^3.0.18", + "@cspell/dict-flutter": "^1.1.1", + "@cspell/dict-fonts": "^4.0.6", + "@cspell/dict-fsharp": "^1.1.1", + "@cspell/dict-fullstack": "^3.2.9", + "@cspell/dict-gaming-terms": "^1.1.2", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", + "@cspell/dict-google": "^1.0.9", + "@cspell/dict-haskell": "^4.0.6", + "@cspell/dict-html": "^4.0.15", + "@cspell/dict-html-symbol-entities": "^4.0.5", + "@cspell/dict-java": "^5.0.12", + "@cspell/dict-julia": "^1.1.1", + "@cspell/dict-k8s": "^1.0.12", + "@cspell/dict-kotlin": "^1.1.1", + "@cspell/dict-latex": "^5.1.0", + "@cspell/dict-lorem-ipsum": "^4.0.5", + "@cspell/dict-lua": "^4.0.8", + "@cspell/dict-makefile": "^1.0.5", + "@cspell/dict-markdown": "^2.0.16", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.38", + "@cspell/dict-php": "^4.1.1", + "@cspell/dict-powershell": "^5.0.15", + "@cspell/dict-public-licenses": "^2.0.16", + "@cspell/dict-python": "^4.2.26", + "@cspell/dict-r": "^2.1.1", + "@cspell/dict-ruby": "^5.1.1", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", + "@cspell/dict-shell": "^1.1.2", + "@cspell/dict-software-terms": "^5.2.2", + "@cspell/dict-sql": "^2.2.1", + "@cspell/dict-svelte": "^1.0.7", + "@cspell/dict-swift": "^2.0.6", + "@cspell/dict-terraform": "^1.1.3", + "@cspell/dict-typescript": "^3.2.3", + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-json-reporter": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.8.0.tgz", + "integrity": "sha512-nqUaSo9T7l8KrE22gc7ZIs+zvP7ak1i7JqGdRs8sGvh2Ijqj43qYQLePgb1b/vm8a1bavnc51m+vf05hpd3g3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-types": "9.8.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-performance-monitor": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.8.0.tgz", + "integrity": "sha512-IsrXYzn23yJICIQ915ACdf+2lNEcFNTu5BIQt3khHOsGVvZ9/AZYpu9Dk825vUyZG7RHg2Oi6dYNiJtULG4ouQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, + "node_modules/@cspell/cspell-pipe": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.8.0.tgz", + "integrity": "sha512-ISEUD8PHYkd2Ktafc6hFfIXdGKYUvthA09NbwwZsWmOqYyk4wWKHZKqyyxD+BcrFwOyMOJcD8OEvIjkRQp2SJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-resolver": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.8.0.tgz", + "integrity": "sha512-PZJj56BZpKfMxOzWkyt7b+aIXObe+8Ku/zLI4xDXPSuQPENbHBFHfPIZx68CyGEkanKxZ1ewKVx/FT1FUy+wDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-directory": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-service-bus": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.8.0.tgz", + "integrity": "sha512-P45sd2nqwcqhulBBbQnZB/JNcobecTrP4Ky3vmEq0cprsvavc+ZoHF9U2Ql5ghMSUzjrF2n1aNzZ8cH4IlsnKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cspell/cspell-types": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.8.0.tgz", + "integrity": "sha512-7Ge4UD6SCA49Tcc3+GTlz3Xn4cqVUAXtDO0u9IeHvJgkN3Me2Rw2GB/CtGmhKST3YeEeZMX7ww09TdHMUJlehw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" } }, "node_modules/@cspell/cspell-worker": { @@ -565,16 +1119,16 @@ } }, "node_modules/@cspell/dict-companies": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.11.tgz", - "integrity": "sha512-0cmafbcz2pTHXLd59eLR1gvDvN6aWAOM0+cIL4LLF9GX9yB2iKDNrKsvs4tJRqutoaTdwNFBbV0FYv+6iCtebQ==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.12.tgz", + "integrity": "sha512-mjiz/N3zWOCsz5VfwMUydSl7uW0OU9H2PnbCNc3RV44Vj6Q59CSp6EYGSGZQxrXU1gpsuZUrwr6QCjNjFOOg5A==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cpp": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", - "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.1.0.tgz", + "integrity": "sha512-rcjycobioQUd9Jm/Y1n8U+sq6ytpZ0iV8AYIo+vyEFfutC5x7g6hL6Fh3bCdh6IporGHRqfEutGK/4sfopD2ZA==", "dev": true, "license": "MIT" }, @@ -607,9 +1161,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-data-science": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.14.tgz", - "integrity": "sha512-jl6Ds4u5u5JT+yY30pWQpAbdCHfy3lCcNkLbpL/AZKoUaLEoXbaYsps9xQtvD7DyaiXxiLZkdH2yHHXtoFtZyg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.16.tgz", + "integrity": "sha512-M72mxv5asuAnORurz4iXRJ+Tw9XBq6eu7D2Ne7biP0Z1RciKGNxXWu9JycA/KlVvK1hAlKj/fANlXhuEWpXKFg==", "dev": true, "license": "MIT" }, @@ -642,23 +1196,23 @@ "license": "MIT" }, "node_modules/@cspell/dict-en_us": { - "version": "4.4.35", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.35.tgz", - "integrity": "sha512-xWpxBCc/FzzMMo/A+0qwARVaIIhR0Ql8yhhv4rvsvg+GfQF+LG9yzg2GwTM5N2rjvzmM3nKuR9zxFZq2I6fJSg==", + "version": "4.4.36", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.36.tgz", + "integrity": "sha512-2yOhI/+7d1DbfvMljGW4jw8pLqDEsVmnvUXBOCFXtLU2BWgQkrqOJDCNseYjEiEbTp0OtdrWEWWPFSP1TNugQw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en-common-misspellings": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", - "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.2.0.tgz", + "integrity": "sha512-5PmCHv+AhY0LVNo3bE1FdRKMmw1esKj83GPwLymnVPYNtlI2Jf6y27EjC0azg4zny5keWmku0GQiMf55Fi+qeA==", "dev": true, "license": "CC BY-SA 4.0" }, "node_modules/@cspell/dict-en-gb-mit": { - "version": "3.1.24", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.24.tgz", - "integrity": "sha512-Oowb/Uzkh7OmDRdCcETzMc9imEb4IpLlHJXoYjX8A8DS2X/54gqSjI915JFB8hKtFjBko5OM0BLQ+6cZhFEMmQ==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.25.tgz", + "integrity": "sha512-zGODptk24CMrXi49ieG2SUm94CKxEsVF0dYNF+1ZYH0MSsQDZ/PKDlrrbvtBqSupKdPSj0Z9sjOmMNfHHW9ZSg==", "dev": true, "license": "MIT" }, @@ -712,9 +1266,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-golang": { - "version": "6.0.26", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", - "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", + "version": "6.0.27", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.27.tgz", + "integrity": "sha512-rRDb2JL8EefaezHGTEclKXCs4eMOS0q/datk94Lm7KQOhlGlzS9FDVZiR1/guh0o+iJCmejQuf5NR2FQeQSWsg==", "dev": true, "license": "MIT" }, @@ -733,9 +1287,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-html": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.15.tgz", - "integrity": "sha512-GJYnYKoD9fmo2OI0aySEGZOjThnx3upSUvV7mmqUu8oG+mGgzqm82P/f7OqsuvTaInZZwZbo+PwJQd/yHcyFIw==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.16.tgz", + "integrity": "sha512-9B6/Cpb5YVcYgsEAlKudun1yd4ONllYS/ZibKLYea2apPR+l2vQdARnPrP9kTqa7NUNfRKl7m9Fb6k9rjimnow==", "dev": true, "license": "MIT" }, @@ -761,9 +1315,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-k8s": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", - "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.13.tgz", + "integrity": "sha512-ELGkS13k7K/NEfVimBSrxVTfqXvOF/Kvxj4I62YxRm8bvHbfoXgrGaOx28lPiNRz+dmu+yYtvuXbnURKtYbC6g==", "dev": true, "license": "MIT" }, @@ -803,22 +1357,22 @@ "license": "MIT" }, "node_modules/@cspell/dict-markdown": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.17.tgz", - "integrity": "sha512-H8bAxih6U8NOnSPL7R8My+tqjaB4tmnJTjERuz4zYqmf+cH+5xshX3UVgKlwWFcyjsYfv/zEDuRdMctQv1q6HQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.18.tgz", + "integrity": "sha512-KLRSwVrwKDz4n7bl2XQjzvaBZbGgx5QKkP5Ok1b24xaO3TpXsLhAbAn1mItvFlI2tF6Rkt83iYjQcYppywuf5Q==", "dev": true, "license": "MIT", "peerDependencies": { "@cspell/dict-css": "^4.1.2", - "@cspell/dict-html": "^4.0.15", + "@cspell/dict-html": "^4.0.16", "@cspell/dict-html-symbol-entities": "^4.0.5", "@cspell/dict-typescript": "^3.2.3" } }, "node_modules/@cspell/dict-monkeyc": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", - "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.1.0.tgz", + "integrity": "sha512-mc/hgvSy/emOIYtc8kuVEaLUlnaERunfAubfJ5plUXq6s0A69bcukJzUzSt9C0UTCwS28641ILRPv80m3L9QbA==", "dev": true, "license": "MIT" }, @@ -830,9 +1384,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-npm": { - "version": "5.2.41", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.41.tgz", - "integrity": "sha512-To3xsfRmMBYVXtWVEdUgV35M9a/JZ54dSuoY6m6D3uHKKL3I326Wmy4xifZ3PU8MQaWhyEH7zbIcUEtKwTQMcA==", + "version": "5.2.47", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.47.tgz", + "integrity": "sha512-r5ePbkmRtpMwiv+MHd6be1xIRLuXoEwaSLIZLu3mY+qtPVo0LUj/kVl4YeIxHONiwyef75zqS3gnT+s5UF7diQ==", "dev": true, "license": "MIT" }, @@ -858,13 +1412,13 @@ "license": "MIT" }, "node_modules/@cspell/dict-python": { - "version": "4.2.27", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.27.tgz", - "integrity": "sha512-Rj6xQgYS4X6ienjgAZF+njA0GRY4oSPouJWv0vfikCTn6EWlfk0V6Dy1HP3Migj1O+IC2NmespgVq+BZNSp8OA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.4.0.tgz", + "integrity": "sha512-49Eju/a97V6ExAeMJDM2Tk4jsYr0pm+kQzqQrKLAZdrRd6VrLIgseI481EQSmgoVkPPdsuwK1xj9ZlpDQIF4qg==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/dict-data-science": "^2.0.14" + "@cspell/dict-data-science": "^2.0.16" } }, "node_modules/@cspell/dict-r": { @@ -875,9 +1429,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-ruby": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.1.tgz", - "integrity": "sha512-LHrp84oEV6q1ZxPPyj4z+FdKyq1XAKYPtmGptrd+uwHbrF/Ns5+fy6gtSi7pS+uc0zk3JdO9w/tPK+8N1/7WUA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.2.tgz", + "integrity": "sha512-f6Slf11N91ittf71AWlfVVG9GZPezVRBfcMPCTNTWhUsY/VEspkBRZYDhPXjV4df3jqHy5YJs8nlsFcFVF/bMA==", "dev": true, "license": "MIT" }, @@ -885,1289 +1439,878 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-scala": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", - "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-shell": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.2.0.tgz", - "integrity": "sha512-PVctvT22lJ49niMiakO8xieY7ELCAzjSqhejWR7bAMb5AZ9F4WDEs+XdGMnoVHWeXq7K5rcepLPmEJb+37zzIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-software-terms": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.2.2.tgz", - "integrity": "sha512-0CaYd6TAsKtEoA7tNswm1iptEblTzEe3UG8beG2cpSTHk7afWIVMtJLgXDv0f/Li67Lf3Z1Jf3JeXR7GsJ2TRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-sql": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", - "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-svelte": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", - "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-swift": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", - "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-terraform": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", - "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-typescript": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", - "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-vue": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", - "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-zig": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", - "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dynamic-import": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.8.0.tgz", - "integrity": "sha512-wMgb32lqG9g6lCipUQsY9Bk5idXPDz7wvzOqEsU1M2HmNYmdE1wfPoRpfQfsVL965iG3+6h8QLr2+8FKpweFEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "9.8.0", - "import-meta-resolve": "^4.2.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/filetypes": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.8.0.tgz", - "integrity": "sha512-yHvtYn9qt6zykua77sNzTcf7HrG/dpo/+2pCMGSrfSrQypSNT6FUFvMS04W7kwhP86U1GkCjppNykXuoH3cqug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/rpc": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.8.0.tgz", - "integrity": "sha512-t4lHEa254W+PePXNQ1noW7QhQxz/mhsJ9X8LEt0ILzBbPWCJzN+JuaM7EiolIPiwxtfxpMwKx9482kt4eTja7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18" - } - }, - "node_modules/@cspell/strong-weak-map": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.8.0.tgz", - "integrity": "sha512-HocksAqZ0JcWA5oWO7TIlOCftXVGkPGzbeFlCRRrjJpZmYQH+4NdeEXyQC6T89NGocp45td/CgyBcAaFMy1N9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@cspell/url": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.8.0.tgz", - "integrity": "sha512-LY1lFiZLTQF/ma1ilfKmRmFmEOw0RfYhyl0UMhY7/d93b+kiDMhxP/9Qir4+5LyiRncaE3++ZcWno9Hya+ssRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", - "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", - "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.2.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", - "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "peerDependencies": { - "css-tree": "^3.2.1" - }, - "peerDependenciesMeta": { - "css-tree": { - "optional": true - } - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", - "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } + "dev": true, + "license": "MIT" }, - "node_modules/@epic-web/invariant": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "node_modules/@cspell/dict-scala": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", "dev": true, "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-shell": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.2.0.tgz", + "integrity": "sha512-PVctvT22lJ49niMiakO8xieY7ELCAzjSqhejWR7bAMb5AZ9F4WDEs+XdGMnoVHWeXq7K5rcepLPmEJb+37zzIw==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-software-terms": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.4.1.tgz", + "integrity": "sha512-tY88gnOWj2ax6h+i7BjU7dIH1f3fvY4WypS0a+TpjBgXC318AdOMmy0zK1SzxGNOjhWJfCeCZNVoLFM/DuOG4g==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-sql": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", + "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-svelte": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", + "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-swift": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", + "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-terraform": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.4.tgz", + "integrity": "sha512-Ere42ilvMFvQA4GlcN0OKlruMPR6EsvaB+iTHzj2xc+NJGRK64V7yApUcWrOrSgTiM/vhWXPIsK3OMfiAiNdmA==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-typescript": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", + "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-vue": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", + "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", + "dev": true, + "license": "MIT" }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], + "node_modules/@cspell/dynamic-import": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.8.0.tgz", + "integrity": "sha512-wMgb32lqG9g6lCipUQsY9Bk5idXPDz7wvzOqEsU1M2HmNYmdE1wfPoRpfQfsVL965iG3+6h8QLr2+8FKpweFEQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@cspell/url": "9.8.0", + "import-meta-resolve": "^4.2.0" + }, "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], + "node_modules/@cspell/filetypes": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.8.0.tgz", + "integrity": "sha512-yHvtYn9qt6zykua77sNzTcf7HrG/dpo/+2pCMGSrfSrQypSNT6FUFvMS04W7kwhP86U1GkCjppNykXuoH3cqug==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], + "node_modules/@cspell/rpc": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.8.0.tgz", + "integrity": "sha512-t4lHEa254W+PePXNQ1noW7QhQxz/mhsJ9X8LEt0ILzBbPWCJzN+JuaM7EiolIPiwxtfxpMwKx9482kt4eTja7A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=20.18" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], + "node_modules/@cspell/strong-weak-map": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.8.0.tgz", + "integrity": "sha512-HocksAqZ0JcWA5oWO7TIlOCftXVGkPGzbeFlCRRrjJpZmYQH+4NdeEXyQC6T89NGocp45td/CgyBcAaFMy1N9w==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@cspell/url": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.8.0.tgz", + "integrity": "sha512-LY1lFiZLTQF/ma1ilfKmRmFmEOw0RfYhyl0UMhY7/d93b+kiDMhxP/9Qir4+5LyiRncaE3++ZcWno9Hya+ssRg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" + "node_modules/@csstools/color-helpers": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", + "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], + "license": "MIT-0", "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" + "node_modules/@csstools/css-color-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.0.tgz", + "integrity": "sha512-5+5LEmFuY1AjXdYhmgjTJogtQnP1evJ1zrBZGUNZ0thkpwnnmKxcHdAMn/OtFjAb25zA+jKDVYVRl+5G7rjv1A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@csstools/color-helpers": "^6.1.1", + "@csstools/css-calc": "^3.3.0" + }, "engines": { - "node": ">=18" + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=18" + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.8.tgz", + "integrity": "sha512-CpMLjAvwQg3BL5S0IeqsZNMH7EQrEWi0kLKOC13ZBF0ZwERiLWlibNPJr8G1kdU3Ms/r2KiNrF81pUh2HwAHdg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], - "engines": { - "node": ">=18" + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } ], "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], + "node_modules/@emnapi/core": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz", + "integrity": "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==", "license": "MIT", "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.3", + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz", + "integrity": "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==", "license": "MIT", "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "tslib": "^2.4.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ - "arm64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ - "ia32" + "arm" ], "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { "node": ">=18" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", - "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT" - }, - "node_modules/@fontsource-variable/instrument-sans": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource-variable/instrument-sans/-/instrument-sans-5.2.8.tgz", - "integrity": "sha512-mTCaukbdIjjoipj2E3Q5XoZM3ZxJWdzyHevf/LG/0PHlfF9Q85pxOM7B7A9MerFyxmRzz5kVlumgIvgDSG4CPg==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@fontsource-variable/inter": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.2.8.tgz", - "integrity": "sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@fontsource-variable/jetbrains-mono": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", - "integrity": "sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==", - "license": "OFL-1.1", - "funding": { - "url": "https://github.com/sponsors/ayuhito" - } - }, - "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" } }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "darwin" + "freebsd" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ - "darwin" + "freebsd" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" + "ia32" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" + "loong64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ - "s390x" - ], - "libc": [ - "glibc" + "mips64el" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ - "x64" - ], - "libc": [ - "glibc" + "ppc64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ - "arm64" - ], - "libc": [ - "musl" + "riscv64" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ - "x64" - ], - "libc": [ - "musl" + "s390x" ], - "license": "LGPL-3.0-or-later", + "license": "MIT", "optional": true, "os": [ "linux" ], - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": ">=18" } }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ - "arm" - ], - "libc": [ - "glibc" + "x64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" + "x64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "netbsd" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" + "arm64" ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "openbsd" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ - "s390x" + "x64" ], - "libc": [ - "glibc" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" ], - "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", "optional": true, "os": [ - "linux" + "openharmony" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "sunos" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" ], - "libc": [ - "musl" + "license": "MIT", + "optional": true, + "os": [ + "win32" ], - "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "node": ">=18" } }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", + "license": "MIT", "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=18" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@fontsource-variable/instrument-sans": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/instrument-sans/-/instrument-sans-5.3.0.tgz", + "integrity": "sha512-u4gKbDBTNFGkg997tfQn3eHOhHuquWUFTRT/rwzuKtrxX5P2ekfs2x+LgBPP4P32+cC+vUwF1Cr+IdRoPQbrGw==", + "license": "OFL-1.1", "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource-variable/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource-variable/jetbrains-mono": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", + "integrity": "sha512-F32xpS2NsGYoQi2ADSkKTgpJj7ozajsGgDJ8woTnqjmIB+dxDIqImjl4pXZVEExu8UFZ2ndhmX18EBS/hdz3Lw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@hono/node-server": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.1.1.tgz", + "integrity": "sha512-ELuehkj5VCBdgEw9zs+ivkKwyzzUCSQuE96YmiPvn1ECBoZCczbFXJLeEGMTYjphP6gydh4pHMqEYPVMYUVgQg==", + "license": "MIT", + "engines": { + "node": ">=20" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "peerDependencies": { + "hono": "^4" } }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "license": "Apache-2.0", "optional": true, + "os": [ + "freebsd" + ], "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@img/sharp-wasm32": "0.35.3" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", "cpu": [ - "ia32" + "wasm32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "license": "Apache-2.0", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", + "node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -2185,16 +2328,6 @@ "integrity": "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==", "license": "BSD-3-Clause" }, - "node_modules/@lit-labs/virtualizer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@lit-labs/virtualizer/-/virtualizer-2.1.1.tgz", - "integrity": "sha512-JWxMwnlouLdwpw8spLTuax53WMnSP3xt0dCyxAS7GJr5Otda9MGgR/ghAdfwhSY75TmjbE1T2TqChwoGCw3ggw==", - "license": "BSD-3-Clause", - "dependencies": { - "lit": "^3.2.0", - "tslib": "^2.0.3" - } - }, "node_modules/@lit/context": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz", @@ -2217,7 +2350,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2258,12 +2390,12 @@ "license": "BSD-2-Clause" }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -2297,12 +2429,42 @@ } } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", + "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", + "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" + } + }, "node_modules/@oslojs/encoding": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", "license": "MIT" }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/@pagefind/darwin-arm64": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", @@ -2395,9 +2557,9 @@ ] }, "node_modules/@parcel/watcher": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", - "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2405,7 +2567,7 @@ "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">= 10.0.0" @@ -2415,25 +2577,24 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.6", - "@parcel/watcher-darwin-arm64": "2.5.6", - "@parcel/watcher-darwin-x64": "2.5.6", - "@parcel/watcher-freebsd-x64": "2.5.6", - "@parcel/watcher-linux-arm-glibc": "2.5.6", - "@parcel/watcher-linux-arm-musl": "2.5.6", - "@parcel/watcher-linux-arm64-glibc": "2.5.6", - "@parcel/watcher-linux-arm64-musl": "2.5.6", - "@parcel/watcher-linux-x64-glibc": "2.5.6", - "@parcel/watcher-linux-x64-musl": "2.5.6", - "@parcel/watcher-win32-arm64": "2.5.6", - "@parcel/watcher-win32-ia32": "2.5.6", - "@parcel/watcher-win32-x64": "2.5.6" + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", - "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", "cpu": [ "arm64" ], @@ -2451,9 +2612,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", - "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", "cpu": [ "arm64" ], @@ -2471,9 +2632,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", - "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", "cpu": [ "x64" ], @@ -2491,9 +2652,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", - "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", "cpu": [ "x64" ], @@ -2511,9 +2672,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", - "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", "cpu": [ "arm" ], @@ -2534,9 +2695,9 @@ } }, "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", - "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", "cpu": [ "arm" ], @@ -2557,9 +2718,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", - "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", "cpu": [ "arm64" ], @@ -2580,9 +2741,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", - "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", "cpu": [ "arm64" ], @@ -2603,9 +2764,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", - "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", "cpu": [ "x64" ], @@ -2626,9 +2787,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", - "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", "cpu": [ "x64" ], @@ -2649,335 +2810,202 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", - "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", - "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", - "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", - "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", "cpu": [ - "arm" - ], - "libc": [ - "glibc" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", "cpu": [ "arm" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", "cpu": [ - "loong64" - ], - "libc": [ - "glibc" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", "cpu": [ - "loong64" - ], - "libc": [ - "musl" + "x64" ], "license": "MIT", "optional": true, "os": [ - "linux" - ] + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" + "arm" ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", "cpu": [ - "ppc64" + "arm64" ], "libc": [ - "musl" + "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", "cpu": [ - "riscv64" + "arm64" ], "libc": [ - "glibc" + "musl" ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", "cpu": [ - "riscv64" + "ppc64" ], "libc": [ - "musl" + "glibc" ], "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", "cpu": [ "s390x" ], @@ -2988,12 +3016,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", "cpu": [ "x64" ], @@ -3004,12 +3035,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", "cpu": [ "x64" ], @@ -3020,25 +3054,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", - "cpu": [ - "x64" ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", "cpu": [ "arm64" ], @@ -3046,12 +3070,15 @@ "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", "cpu": [ "arm64" ], @@ -3059,25 +3086,15 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", - "cpu": [ - "ia32" ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ "x64" ], @@ -3085,31 +3102,27 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", - "cpu": [ - "x64" ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" }, "node_modules/@shikijs/core": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.0.tgz", - "integrity": "sha512-EooU3i9F6IAE8kEu+AnGf9DFZWkQBZ+hJn3tLVbsH+61mtQiva5biai66fAA6nvFPXkLgvrh7BrR7YcJU83xQQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.4.3.tgz", + "integrity": "sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==", "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.3.0", - "@shikijs/types": "4.3.0", + "@shikijs/primitive": "4.4.3", + "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", + "@types/hast": "^3.0.5", "hast-util-to-html": "^9.0.5" }, "engines": { @@ -3117,12 +3130,12 @@ } }, "node_modules/@shikijs/engine-javascript": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.0.tgz", - "integrity": "sha512-hTv/KiFf2tpiqlACPiztGGurEARWIutB8YUhcrA1pUC7VzzwKO+g5crUocrLztrZ5ro5Z4hbXg7bYclETn3gSQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.4.3.tgz", + "integrity": "sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.0", + "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" }, @@ -3131,12 +3144,12 @@ } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.0.tgz", - "integrity": "sha512-1vMdN3gHfnKfLYwecUI2ITJI4RhHt96xEaJumVn7Heb0IlJ8WQMIH0Voak+2j22BpSNKdnOfB/pCTPnPm2gq7A==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.4.3.tgz", + "integrity": "sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.0", + "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -3144,51 +3157,51 @@ } }, "node_modules/@shikijs/langs": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.0.tgz", - "integrity": "sha512-rnlqFbBRSys9bT4gl/5rw9RnS0W/I84ZldXPkO7cvlEMoV85TyF/aU01N7/NbSR776RNLjrJKjfFUXJR6wN1Cg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.4.3.tgz", + "integrity": "sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.0" + "@shikijs/types": "4.4.3" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/primitive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.0.tgz", - "integrity": "sha512-CPkz64PTa5diRW1ggzMZH9VM/du4RNChYgVtgqrFcgruvIybmCvySv8GkiHSczUHXYuuR8TdKEwFx+UnZMpgdg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.4.3.tgz", + "integrity": "sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.0", + "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/themes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.0.tgz", - "integrity": "sha512-Avgt05YiT+Y3prjIc9lmQxhJzHBcCfR6cjiFW4OyaMBbt2A6trX5rfjUzx+Vj/mE9qpArYjatnqo9XPjQNW/AQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.4.3.tgz", + "integrity": "sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==", "license": "MIT", "dependencies": { - "@shikijs/types": "4.3.0" + "@shikijs/types": "4.4.3" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/types": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.0.tgz", - "integrity": "sha512-oc8b9U2SYvofKZk8e/737nIX0qwf6eV2vHFATeObAu7r+mUVpLs8Re0BmVkIjAWAYgkmG/CzLNo7rzuBzRu/wQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.4.3.tgz", + "integrity": "sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -3200,6 +3213,16 @@ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", "license": "MIT" }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/debug": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", @@ -3219,16 +3242,15 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { "@types/unist": "*" @@ -3267,7 +3289,6 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", - "dev": true, "license": "MIT" }, "node_modules/@types/ms": { @@ -3286,9 +3307,9 @@ } }, "node_modules/@types/node": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.1.tgz", - "integrity": "sha512-fc3KiUoBt6kie0N9bIW3E47vZsuaMf0PM2AaUpLCLT0s/LvX1nxAim6Fc049cNxODPpGm6qRAuUOB86SkRuPQw==", + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.3.0.tgz", + "integrity": "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3322,9 +3343,9 @@ "license": "MIT" }, "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, "node_modules/@volar/language-core": { @@ -3370,10 +3391,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "dev": true, + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3386,7 +3406,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3425,14 +3444,26 @@ } } }, + "node_modules/am-i-vibing": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/am-i-vibing/-/am-i-vibing-0.4.0.tgz", + "integrity": "sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==", + "license": "MIT", + "dependencies": { + "process-ancestry": "^0.1.0" + }, + "bin": { + "am-i-vibing": "dist/cli.mjs" + } + }, "node_modules/angular-docs": { "resolved": "docs/angular", "link": true }, "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", "engines": { @@ -3442,6 +3473,21 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -3503,56 +3549,55 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "dev": true, "license": "MIT", "bin": { "astring": "bin/astring" } }, "node_modules/astro": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/astro/-/astro-6.4.8.tgz", - "integrity": "sha512-KK5lX90uU9EeVaTjINyj3sy9/NFXVa59aowaqbWBDDKLXZh4rr7GwIaCFYVetE22MJtsCNFerQXn0vlCLmpP/Q==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/astro/-/astro-7.2.6.tgz", + "integrity": "sha512-qzT4tAhgHYX/6/MUGslAkF0PVkM4WNsMw2A1GrbfA9cXp68hmdqF3f7MuF5rRFvwQbjowqjOf90ao9whfgV5mw==", "license": "MIT", "dependencies": { - "@astrojs/compiler": "^4.0.0", - "@astrojs/internal-helpers": "0.10.0", - "@astrojs/markdown-remark": "7.2.0", - "@astrojs/telemetry": "3.3.2", + "@astrojs/compiler-rs": "^0.4.0", + "@astrojs/internal-helpers": "0.10.4", + "@astrojs/markdown-satteri": "0.3.8", + "@astrojs/telemetry": "3.3.3", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.3.0", + "am-i-vibing": "^0.4.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", - "cookie": "^1.1.1", + "cookie": "^2.0.1", "devalue": "^5.8.1", - "diff": "^8.0.3", + "diff": "^9.0.0", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", - "esbuild": "^0.27.3", + "esbuild": "^0.28.0", + "find-process": "^2.1.1", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.0", "jsonc-parser": "^3.3.1", - "magic-string": "^0.30.21", + "magic-string": "^1.0.0", "magicast": "^0.5.2", "mrmime": "^2.0.1", - "neotraverse": "^0.6.18", + "neotraverse": "^1.0.1", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", - "rehype": "^13.0.2", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", @@ -3561,11 +3606,9 @@ "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", - "unifont": "~0.7.4", - "unist-util-visit": "^5.1.0", + "unifont": "~0.7.5", "unstorage": "^1.17.5", - "vfile": "^6.0.3", - "vite": "^7.3.2", + "vite": "^8.0.13", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", @@ -3584,25 +3627,27 @@ "url": "https://opencollective.com/astrodotbuild" }, "optionalDependencies": { - "sharp": "^0.34.0" + "sharp": "^0.34.0 || ^0.35.0" + }, + "peerDependencies": { + "@astrojs/markdown-remark": "7.2.4" + }, + "peerDependenciesMeta": { + "@astrojs/markdown-remark": { + "optional": true + } } }, "node_modules/astro-seo-schema": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/astro-seo-schema/-/astro-seo-schema-6.0.0.tgz", - "integrity": "sha512-6Etg+9zu7XdlUa40BIZrZP3vd+lReeJ1rNgT8Jer+1bPyGdrA/itQwJOhIkX+t5PadVwTmpt6xZouDycrZys6w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/astro-seo-schema/-/astro-seo-schema-7.0.0.tgz", + "integrity": "sha512-icG6vL2pKNf7WBI03JxZYn6gQiLASxq/U3JVv27roaPJ+WH0p3sats9mMInzp6x40G1mVdLLoAEUObmKY1If+A==", "license": "MIT", "peerDependencies": { - "astro": "^6.0.0", + "astro": "^7.0.0", "schema-dts": "^1.1.0" } }, - "node_modules/astro/node_modules/@astrojs/compiler": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-4.0.0.tgz", - "integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==", - "license": "MIT" - }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -3666,9 +3711,9 @@ } }, "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "license": "MIT", "engines": { "node": ">=18" @@ -3685,16 +3730,16 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/buffer-builder": { @@ -3824,7 +3869,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -3891,19 +3935,41 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/colorjs.io": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.7.1.tgz", + "integrity": "sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==", + "devOptional": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/color" + } + }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", @@ -3918,7 +3984,6 @@ "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, "license": "MIT", "engines": { "node": ">=20" @@ -3970,12 +4035,12 @@ } }, "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=22" }, "funding": { "type": "opencollective", @@ -4241,16 +4306,16 @@ } }, "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -4270,9 +4335,9 @@ } }, "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -4413,9 +4478,9 @@ } }, "node_modules/devalue": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz", - "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.1.tgz", + "integrity": "sha512-+17vil3EVQRzvtDJSFuTWEb8XJRvXqAiV3qZyQWD398QeXUa6CxsUyMdD1fxzEhUrd4FojitFz7lhIHBTlV4fw==", "license": "MIT" }, "node_modules/devlop": { @@ -4432,9 +4497,9 @@ } }, "node_modules/diff": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", - "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -4584,9 +4649,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.2.0.tgz", - "integrity": "sha512-3lGxdTXCLfe1MYfTz1y2ksAAUM4NAOP6rPEjxGJVKO7TZ5+tvHCaQWGpC4Y3IXvW3ece0Cz1cIP4FWBxOnGCTQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "license": "MIT" }, "node_modules/es-object-atoms": { @@ -4605,7 +4670,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -4622,7 +4686,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -4636,9 +4699,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -4648,32 +4711,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" } }, "node_modules/escape-html": { @@ -4711,7 +4774,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -4725,7 +4787,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -4742,7 +4803,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "dev": true, "license": "MIT", "funding": { "type": "opencollective", @@ -4753,7 +4813,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -4768,7 +4827,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -4784,7 +4842,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -4799,7 +4856,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" @@ -4833,9 +4889,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", - "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -4885,11 +4941,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.2.tgz", + "integrity": "sha512-YH4ru+eOJxQABscKFfRCy9R7x9QFGdezclVMwwgFFndzS2Xnm0uo6B0ABZsLhcpeptGv2qvuJVWlQr9gQZoC3A==", "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -4936,9 +4993,9 @@ "license": "MIT" }, "node_modules/fast-equals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", - "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.2.tgz", + "integrity": "sha512-sAjhj9ZhOxYCGiNMnZLaucOqf5ZeFnHNoKoAZiD9thhJ0N8RP85qJK759/97C/3L7NzzmGVB5uiX9AUpySZmUQ==", "dev": true, "license": "MIT", "engines": { @@ -4968,9 +5025,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", "funding": [ { "type": "github", @@ -5030,10 +5087,52 @@ "url": "https://opencollective.com/express" } }, + "node_modules/find-process": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-2.1.1.tgz", + "integrity": "sha512-SrQDx3QhlmHM90iqn9rdjCQcw/T+WlpOkHFsjoRgB+zTpDfltNA1VSNYeYELwhUTJy12UFxqjWhmhOrJc+o4sA==", + "license": "MIT", + "dependencies": { + "chalk": "~4.1.2", + "commander": "^14.0.3", + "loglevel": "^1.9.2" + }, + "bin": { + "find-process": "dist/cjs/bin/find-process.js" + } + }, + "node_modules/find-process/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/find-process/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, @@ -5242,9 +5341,9 @@ } }, "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", - "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -5445,7 +5544,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -5497,7 +5595,6 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -5587,9 +5684,9 @@ } }, "node_modules/hono": { - "version": "4.12.27", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz", - "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==", + "version": "4.13.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.13.4.tgz", + "integrity": "sha512-AGEwKIyRMHRv1t8Wjwa3LHxQ61X5CqrdFT+4BRNTpqS5aJNnpl5WLjADb7vFlJzI/8uK7T5QLVApCMQKNa3LgQ==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -5650,9 +5747,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5666,26 +5763,28 @@ } }, "node_modules/igniteui-astro-components": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/igniteui-astro-components/-/igniteui-astro-components-0.0.27.tgz", - "integrity": "sha512-IqwYm7CcBYISnuqd8uzllbjCgIt6pdhmO1+aiPUfiBncSQfM5xIanX2vGvRSz3dhxOSkBD0VZmLBvQ0HMT2+uQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/igniteui-astro-components/-/igniteui-astro-components-1.0.2.tgz", + "integrity": "sha512-5GXQPl+94na8d+RdKicfWtDyNrbGrIGYN8RQijTpgPKCb9sXs3RVWe+jx/ccOnCRm1CXg+Uvv0lt5dK3nUKHqg==", "license": "MIT", - "workspaces": [ - "playground" - ], "dependencies": { + "@astrojs/markdown-satteri": "^0.3.5", + "@astrojs/mdx": "^7.0.7", "@fontsource-variable/instrument-sans": "^5.2.8", "@fontsource-variable/inter": "^5.2.8", "@fontsource-variable/jetbrains-mono": "^5.2.8", + "github-slugger": "^2.0.0", "jsdom": "^29.0.1", - "shiki": "^3.23.0" + "satteri": "^0.9.5", + "shiki": "^4.3.0" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + "node": ">=22.12.0" }, "peerDependencies": { - "astro": "^5.0.0 || ^6.0.0", - "igniteui-webcomponents": "^7.2.4" + "astro": "^7.0.0", + "igniteui-theming": "^26.0.1", + "igniteui-webcomponents": "^7.3.0-beta.1" } }, "node_modules/igniteui-i18n-core": { @@ -5703,9 +5802,9 @@ } }, "node_modules/igniteui-theming": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-25.2.0.tgz", - "integrity": "sha512-bXRN379/vL05cDQl12jLABXALo+cXdD9zeYTlwURoEq1GrCkriYQnSqgwWmD/UdN/9Jc2MaMbsuXuYRZq5F71w==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/igniteui-theming/-/igniteui-theming-26.1.0.tgz", + "integrity": "sha512-12qUYBBahI8mjpSSrSTUB8ZIklqiroNoft/MQK6lZ0uLx9jO6CX9hGvfmJSClPGGEvAMrhLUYbvXPUOT5Hscgg==", "license": "MIT", "dependencies": { "@modelcontextprotocol/sdk": "^1.28.0", @@ -5732,6 +5831,12 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/igniteui-theming/node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "license": "MIT" + }, "node_modules/igniteui-theming/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -6115,13 +6220,12 @@ } }, "node_modules/igniteui-webcomponents": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/igniteui-webcomponents/-/igniteui-webcomponents-7.2.4.tgz", - "integrity": "sha512-h5hrroBn0kSYCYpj5OH4sKXkFZvdOeqpYnNTKMB5PsqsWexhQICkH5xKjDDj3VPbd135OvzWX5XQN0Nclj2qAQ==", + "version": "7.3.0-beta.1", + "resolved": "https://registry.npmjs.org/igniteui-webcomponents/-/igniteui-webcomponents-7.3.0-beta.1.tgz", + "integrity": "sha512-AUZO4l0GahTAcJEQSZglHH2ataQ/fdp4PsDNoQmjEYSuj/7m3eH4+2XRkowaYeZ5PcKS96W2NxdxncOTK50TNg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.0", - "@lit-labs/virtualizer": "^2.1.0", + "@floating-ui/dom": "^1.8.0", "@lit/context": "^1.1.0", "igniteui-i18n-core": "^1.0.5", "lit": "^3.3.0" @@ -6130,11 +6234,11 @@ "node": ">=22" }, "peerDependencies": { - "dompurify": "^3.3.0", + "dompurify": "^3.4.0", "igniteui-i18n-resources": "^1.0.5", - "marked": "^17.0.0", + "marked": "^18.0.0", "marked-shiki": "^1.2.0", - "shiki": "^3.20.0" + "shiki": "^4.3.0" }, "peerDependenciesMeta": { "dompurify": { @@ -6155,9 +6259,9 @@ } }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", "engines": { @@ -6241,13 +6345,12 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "dev": true, "license": "MIT" }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.5.0.tgz", + "integrity": "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g==", "license": "MIT", "engines": { "node": ">= 12" @@ -6275,7 +6378,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -6286,7 +6388,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", @@ -6301,7 +6402,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, "license": "MIT", "funding": { "type": "github", @@ -6359,46 +6459,12 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -6436,21 +6502,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6458,18 +6509,18 @@ "license": "ISC" }, "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "version": "6.2.10", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz", + "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } }, "node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "funding": [ { "type": "github", @@ -6546,56 +6597,317 @@ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "license": "MIT" }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "license": "MIT", + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/katex": { - "version": "0.16.47", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", - "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "bin": { - "katex": "cli.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "dev": true, "funding": [ { @@ -6643,6 +6955,19 @@ "@types/trusted-types": "^2.0.2" } }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -6654,31 +6979,31 @@ } }, "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.2.tgz", + "integrity": "sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/magicast": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", - "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", + "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "source-map-js": "^1.2.1" } }, @@ -6686,7 +7011,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=16" @@ -6696,15 +7020,25 @@ } }, "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -6724,9 +7058,9 @@ } }, "node_modules/markdownlint": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", - "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.41.1.tgz", + "integrity": "sha512-qHKeU2E1bdyNAT077go2FVTNXvYcktN5IHtF6XyeD1l0PClxzSp2tUApAV14ORI8DGX4H9bNKZEzelZp4qn8IA==", "dev": true, "license": "MIT", "dependencies": { @@ -6738,59 +7072,79 @@ "micromark-extension-gfm-table": "2.1.1", "micromark-extension-math": "3.1.0", "micromark-util-types": "2.0.2", - "string-width": "8.1.0" + "string-width": "8.2.1" }, "engines": { - "node": ">=20" + "node": ">=22" }, "funding": { "url": "https://github.com/sponsors/DavidAnson" } }, "node_modules/markdownlint-cli": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.48.0.tgz", - "integrity": "sha512-NkZQNu2E0Q5qLEEHwWj674eYISTLD4jMHkBzDobujXd1kv+yCxi8jOaD/rZoQNW1FBBMMGQpuW5So8B51N/e0A==", + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.49.1.tgz", + "integrity": "sha512-qpYqJbSYf3jv57bdnFmCaZ/Wlu6IYHp2b6SOKrKBJ7OnPrDHIKmx4NERWH49QH9viTI6yO6raVDDn5nrf60VQQ==", "dev": true, "license": "MIT", "dependencies": { - "commander": "~14.0.3", + "commander": "~15.0.0", "deep-extend": "~0.6.0", - "ignore": "~7.0.5", - "js-yaml": "~4.1.1", + "ignore": "~7.0.6", + "js-yaml": "~5.2.1", "jsonc-parser": "~3.3.1", "jsonpointer": "~5.0.1", - "markdown-it": "~14.1.1", - "markdownlint": "~0.40.0", - "minimatch": "~10.2.4", - "run-con": "~1.3.2", - "smol-toml": "~1.6.0", - "tinyglobby": "~0.2.15" + "markdown-it": "~14.3.0", + "markdownlint": "~0.41.1", + "minimatch": "~10.2.5", + "run-con": "~1.3.3", + "smol-toml": "~1.7.0", + "tinyglobby": "~0.2.17" }, "bin": { "markdownlint": "markdownlint.js" }, "engines": { - "node": ">=20" + "node": ">=22" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", + "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.12.0" } }, "node_modules/markdownlint-cli/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.2.3.tgz", + "integrity": "sha512-n+mUVyUX5bVv7G/G2zyIHOhdxfuU1dY2NOFzTQUWiMUbFss8b57NFlgCCaggU78wSw5KVS9cllzeLyzyR+n5nw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "bin/js-yaml.mjs" } }, "node_modules/markdownlint-cli/node_modules/smol-toml": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", - "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.2.tgz", + "integrity": "sha512-pXFZ9B2WinEPzxWkMmlYE/oYx2BP+qLrE95wP8tCuK901uLSMGdCb6QSr82z+wnhXkG4+cO+OMLbZB2Cn+97zw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6969,7 +7323,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "dev": true, "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", @@ -6987,7 +7340,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -7006,7 +7358,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -7031,7 +7382,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", @@ -7122,19 +7472,23 @@ "license": "CC0-1.0" }, "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", "dev": true, "license": "MIT" }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/merge-descriptors": { @@ -7383,7 +7737,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -7410,7 +7763,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -7433,7 +7785,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "dev": true, "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" @@ -7447,7 +7798,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.0.0", @@ -7468,7 +7818,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -7533,7 +7882,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -7762,7 +8110,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", - "dev": true, "funding": [ { "type": "GitHub Sponsors", @@ -7778,16 +8125,113 @@ "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-util-html-tag-name": { + "node_modules/micromark-util-symbol": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -7800,10 +8244,10 @@ ], "license": "MIT" }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "funding": [ { "type": "GitHub Sponsors", @@ -7814,1671 +8258,2066 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/micromark-util-resolve-all": { + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", + "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/negotiator/node_modules/content-type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/neotraverse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-1.0.1.tgz", + "integrity": "sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.5.tgz", + "integrity": "sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/oniguruma-parser": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "license": "MIT", "dependencies": { - "micromark-util-types": "^2.0.0" + "oniguruma-parser": "^0.12.2", + "regex": "^6.1.0", + "regex-recursion": "^6.0.2" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/p-limit": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz", + "integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==", "license": "MIT", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "yocto-queue": "^1.2.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/p-queue": { + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.3.tgz", + "integrity": "sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==", "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "eventemitter3": "^5.0.4", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "license": "MIT" }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/pagefind": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", + "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" } }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "node_modules/parent-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "callsites": "^3.1.0" }, "engines": { - "node": ">=18" + "node": ">=8" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "license": "MIT", "dependencies": { - "brace-expansion": "^5.0.5" + "entities": "^8.0.0" }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "license": "BSD-2-Clause", "engines": { - "node": "18 || 20 || >=22" + "node": ">=20.19.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=16.20.0" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^10 || ^12 || >=14" } }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=6" } }, - "node_modules/neotraverse": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", - "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "node_modules/process-ancestry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/process-ancestry/-/process-ancestry-0.1.0.tgz", + "integrity": "sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/nlcst-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", - "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "license": "MIT" - }, - "node_modules/node-mock-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", - "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", "dependencies": { - "boolbase": "^1.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12.20.0" + "node": ">=6" } }, - "node_modules/ofetch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", - "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", - "license": "MIT", + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", "dependencies": { - "destr": "^2.0.5", - "node-fetch-native": "^1.6.7", - "ufo": "^1.6.1" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", "license": "MIT" }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", "dependencies": { - "wrappy": "1" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/oniguruma-parser": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", - "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", - "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.2", - "regex": "^6.1.0", - "regex-recursion": "^6.0.2" + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/p-limit": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz", - "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==", + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "license": "MIT", "dependencies": { - "yocto-queue": "^1.2.1" - }, - "engines": { - "node": ">=20" + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/p-queue": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.3.0.tgz", - "integrity": "sha512-7NED7xhQ74Ngp4JP/2e0VZHp7vSWfJfqeiR92jPgxsz6m0Se4P03YoTKa9dDXyZ3r6P616gUXttrB6nnHYKang==", + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", "license": "MIT", "dependencies": { - "eventemitter3": "^5.0.4", - "p-timeout": "^7.0.0" - }, - "engines": { - "node": ">=20" + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", "license": "MIT", - "engines": { - "node": ">=20" + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", - "license": "MIT" - }, - "node_modules/pagefind": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", - "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "license": "MIT", - "bin": { - "pagefind": "lib/runner/bin.cjs" + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, - "optionalDependencies": { - "@pagefind/darwin-arm64": "1.5.2", - "@pagefind/darwin-x64": "1.5.2", - "@pagefind/freebsd-x64": "1.5.2", - "@pagefind/linux-arm64": "1.5.2", - "@pagefind/linux-x64": "1.5.2", - "@pagefind/windows-arm64": "1.5.2", - "@pagefind/windows-x64": "1.5.2" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/parent-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", - "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", - "dev": true, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", "license": "MIT", "dependencies": { - "callsites": "^3.1.0" - }, - "engines": { - "node": ">=8" + "regex-utilities": "^2.3.0" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "regex-utilities": "^2.3.0" } }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, - "node_modules/parse-latin": { + "node_modules/rehype-raw": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", - "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0", - "@types/unist": "^3.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-modify-children": "^4.0.0", - "unist-util-visit-children": "^3.0.0", + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", - "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", "license": "MIT", "dependencies": { - "entities": "^8.0.0" + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/parse5/node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=20.19.0" + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-key": { + "node_modules/remark-mdx": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/unified" } }, - "node_modules/piccolore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", - "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", - "license": "ISC" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "node_modules/remark-smartypants": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.3.tgz", + "integrity": "sha512-gCaK+ndZ0hYezlqFegHFCVh2CQemsi0Npdh1qVM9bxlUFknjkbP6VmojWhddOCrbK0PbbacmYLWfTULRiT1eWA==", "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, "engines": { - "node": ">=16.20.0" + "node": ">=16.0.0" } - }, - "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=0.10.0" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/property-information": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", - "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "license": "MIT", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" }, - "engines": { - "node": ">= 0.10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", - "license": "MIT" - }, - "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/unified" } }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">= 0.10" + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, - "node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "engines": { - "node": ">= 20.19.0" + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">= 18" } }, - "node_modules/recma-build-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", - "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "node_modules/run-con": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.3.tgz", + "integrity": "sha512-Lb7OKM9aaykzyoNiHGhSVCjZsvbyy6qDMp2vDXL+MoCfz3GfNJtHYH7uYsU3QNMyInBk++xx+EZ8xZ8Sxs5fNQ==", "dev": true, - "license": "MIT", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "vfile": "^6.0.0" + "deep-extend": "^0.6.0", + "ini": "~7.0.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "run-con": "cli.js" } }, - "node_modules/recma-jsx": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", - "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "node_modules/run-con/node_modules/ini": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-7.0.0.tgz", + "integrity": "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w==", "dev": true, + "license": "ISC", + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", + "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", "license": "MIT", + "optional": true, "dependencies": { - "acorn-jsx": "^5.0.0", - "estree-util-to-js": "^2.0.0", - "recma-parse": "^1.0.0", - "recma-stringify": "^1.0.0", - "unified": "^11.0.0" + "chokidar": "^5.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "sass": "sass.js" }, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/recma-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", - "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", - "dev": true, + "node_modules/sass-embedded": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.103.1.tgz", + "integrity": "sha512-UVIuFZPzz+4DXYbHzQ5gKaKkyP2IH3Sc/WoF63N2V7QIfnC2E9UpQAtiKlCVJTfBe43HRgHDBLnXpZkYAEBsNQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "esast-util-from-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" + "@bufbuild/protobuf": "^2.5.0", + "colorjs.io": "^0.7.0", + "immutable": "^5.1.5", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=20.19.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.103.1", + "sass-embedded-android-arm": "1.103.1", + "sass-embedded-android-arm64": "1.103.1", + "sass-embedded-android-riscv64": "1.103.1", + "sass-embedded-android-x64": "1.103.1", + "sass-embedded-darwin-arm64": "1.103.1", + "sass-embedded-darwin-x64": "1.103.1", + "sass-embedded-linux-arm": "1.103.1", + "sass-embedded-linux-arm64": "1.103.1", + "sass-embedded-linux-musl-arm": "1.103.1", + "sass-embedded-linux-musl-arm64": "1.103.1", + "sass-embedded-linux-musl-riscv64": "1.103.1", + "sass-embedded-linux-musl-x64": "1.103.1", + "sass-embedded-linux-riscv64": "1.103.1", + "sass-embedded-linux-x64": "1.103.1", + "sass-embedded-unknown-all": "1.103.1", + "sass-embedded-win32-arm64": "1.103.1", + "sass-embedded-win32-x64": "1.103.1" } }, - "node_modules/recma-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", - "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", - "dev": true, + "node_modules/sass-embedded-all-unknown": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.103.1.tgz", + "integrity": "sha512-MwX2ap06TbImAqlbnH6EndgBBejk6Eq2QB6Ae2hukCn9wmXf9cRu27um3mz3tyB4oJOOku0xfHqFH/+ckYj6YA==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], "license": "MIT", + "optional": true, "dependencies": { - "@types/estree": "^1.0.0", - "estree-util-to-js": "^2.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "sass": "1.103.1" } }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "node_modules/sass-embedded-android-arm": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.103.1.tgz", + "integrity": "sha512-p36WHpsu5HEo2+NVNbI2Nmb8VgVH0xwOQyzghvZhF7ikGCzEVYI5BP28vHUZlCcgj2TUvMEJKI2lV336a+F/sg==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "node_modules/sass-embedded-android-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.103.1.tgz", + "integrity": "sha512-jBXWMksyz55XeLOWvQs64BqiG5DcqflmMxcvMoA2oHtQT/7XZ02hBn502qpcF/q8Qd+qqG/hU5ccM+hGXrbQZw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" + "node_modules/sass-embedded-android-riscv64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.103.1.tgz", + "integrity": "sha512-rzrH7RNntk0rx+zCE9xOiAIUt37D1cQKvFfcoX0xiePdGbNHBN8DWKaWN9vaCRfbgKCmxPjevzaqFNI/G/8E1A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/rehype": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", - "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "node_modules/sass-embedded-android-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.103.1.tgz", + "integrity": "sha512-EQglAJXJutuIcqgZf7YOwzao2ND6ow/OgqN+cM48/Qaeb6AimYmZiUJmM9FFcmS3Q2n1k6/2OU3l3Hlin7bFpw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "rehype-parse": "^9.0.0", - "rehype-stringify": "^10.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.103.1.tgz", + "integrity": "sha512-rlaBeCul8pLbDRKdBAxdDxSBwFU5fbX42ci6CxW2Vbs34jWTMQ72+nE2v2KkGGce+JnYbb7UV6xDP/4uDWWi+w==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "node_modules/sass-embedded-darwin-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.103.1.tgz", + "integrity": "sha512-VSKFfhI//AOct6ppFmAaSH7tlW2LOFECMGs77jIoWf0ZjvGch/3sc9lUTTdIaYIOnTS4qpZck+8OcI2D0G92QA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rehype-recma": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", - "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", - "dev": true, + "node_modules/sass-embedded-linux-arm": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.103.1.tgz", + "integrity": "sha512-tJRLPUtBwXHTnBnG7I39gQvCLreuOHLLCMyKHPR1hQ7aFNwiZjADYzKMRQPNMUqti/Os9z+6I7V13FqgQHfuzg==", + "cpu": [ + "arm" + ], + "libc": "glibc", "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "hast-util-to-estree": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "node_modules/sass-embedded-linux-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.103.1.tgz", + "integrity": "sha512-rC+80/Xr9svo0ka2Zr/sjD+N1zEHTw2Urm/nsEjaVp5HSH2i22jwhTKTIqie2OLl6ti+qdYnbI0sSfxOYRtgrg==", + "cpu": [ + "arm64" + ], + "libc": "glibc", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.103.1.tgz", + "integrity": "sha512-N8L/kgVzXpnH+8d6ErIzqvb0l8kHODR3OfPaf0Azw6DOLGtEjwDRUbHno+G7iogGzyPOjKsM8OdyqHJj/bpTdw==", + "cpu": [ + "arm" + ], + "libc": "musl", "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/remark-mdx": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", - "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", - "dev": true, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.103.1.tgz", + "integrity": "sha512-jMgG/C/VMo7+ShMFdk0xjJmQmYkj1PbJu/yrQiaQHpuo5pE2G+vnkEgsuM5EM3lTQ4MbMfnf715qy1fkbNPiUQ==", + "cpu": [ + "arm64" + ], + "libc": "musl", "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.103.1.tgz", + "integrity": "sha512-LZm8rEvI6sKU87qPOlODsYeAs7CmWy0B4ShYkjG4OMcGCcV4Ffxn25XW4TFqmruThITQvJ8WT+WGblzdoxYgbA==", + "cpu": [ + "riscv64" + ], + "libc": "musl", "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.103.1.tgz", + "integrity": "sha512-rmKzgk4t6RpaDhSefbbnk5yrA4pk1nHlVhJECGay8yMfzK8eglATeY9fzPgt89xCuQk6rkOiy11e+m8tLYOW5Q==", + "cpu": [ + "x64" + ], + "libc": "musl", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.103.1.tgz", + "integrity": "sha512-xydQmtxla31uMrmN6z+mAogVGdEMDmkUElVq2+udomX/TPZDYJBkApEyJl237M2VLWVv29v1N4U4i2Z4xa7SDA==", + "cpu": [ + "riscv64" + ], + "libc": "glibc", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/remark-smartypants": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", - "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "node_modules/sass-embedded-linux-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.103.1.tgz", + "integrity": "sha512-Rln1oWm0MWKzzemOgQWrRFzfVBARwS9qxAidZPpCQHSohzPnWizFkmY1CUJad/YJNsA7sscueMdX63OEvxoM8w==", + "cpu": [ + "x64" + ], + "libc": "glibc", "license": "MIT", - "dependencies": { - "retext": "^9.0.0", - "retext-smartypants": "^6.0.0", - "unified": "^11.0.4", - "unist-util-visit": "^5.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "node_modules/sass-embedded-unknown-all": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.103.1.tgz", + "integrity": "sha512-p7kI4US8+n+YguKczXh+4KcodJnk+8cwv+QFdvMaz3OfPrdHV0EnhPsaVDWD9qXb1XXCEdUhpp6vQwGk3eKc3A==", "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "sass": "1.103.1" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/sass-embedded-win32-arm64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.103.1.tgz", + "integrity": "sha512-/0renOj3SpZGu4TA8CZJ6qZbTxGZk1khkPfiBTmV1uFB40ESYM5VsdXNj76P07bsAjIj9X2fCjTafLQFLSd9Nw==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "node_modules/sass-embedded-win32-x64": { + "version": "1.103.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.103.1.tgz", + "integrity": "sha512-fIg60j9u5YlLUU3W8FvySMR4HHIo9R12HHFQTW7njyQ8nXqgR+t+XfCzGJloQka8g583BlAfu31Q76Ljr5o+9g==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "node": ">=14.0.0" } }, - "node_modules/retext": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", - "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "node_modules/satteri": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/satteri/-/satteri-0.9.5.tgz", + "integrity": "sha512-ZuWVl+vnM64y+/TtX8Kosv2c00W+hLQiiwnEL6H0UKVVrxFqMw4D2CJHHQaouVd89OAhtBBfjWLqhKi3TVUV4w==", "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0", - "retext-latin": "^4.0.0", - "retext-stringify": "^4.0.0", - "unified": "^11.0.0" + "@types/estree-jsx": "^1.0.5", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@types/unist": "^3.0.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optionalDependencies": { + "@bruits/satteri-darwin-arm64": "0.9.5", + "@bruits/satteri-darwin-x64": "0.9.5", + "@bruits/satteri-linux-arm64-gnu": "0.9.5", + "@bruits/satteri-linux-arm64-musl": "0.9.5", + "@bruits/satteri-linux-x64-gnu": "0.9.5", + "@bruits/satteri-linux-x64-musl": "0.9.5", + "@bruits/satteri-wasm32-wasi": "0.9.5", + "@bruits/satteri-win32-arm64-msvc": "0.9.5", + "@bruits/satteri-win32-x64-msvc": "0.9.5" } }, - "node_modules/retext-latin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", - "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", - "license": "MIT", - "dependencies": { - "@types/nlcst": "^2.0.0", - "parse-latin": "^7.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" } }, - "node_modules/retext-smartypants": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", - "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", - "license": "MIT", + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unist-util-visit": "^5.0.0" + "xmlchars": "^2.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=v12.22.7" } }, - "node_modules/retext-stringify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", - "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "license": "MIT", "dependencies": { - "@types/nlcst": "^2.0.0", - "nlcst-to-string": "^4.0.0", - "unified": "^11.0.0" + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=4" } }, - "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.9" - }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", "bin": { - "rollup": "dist/bin/rollup" + "semver": "bin/semver.js" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", - "fsevents": "~2.3.2" + "node": ">=10" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" - } - }, - "node_modules/run-con": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", - "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~4.1.0", - "minimist": "^1.2.8", - "strip-json-comments": "~3.1.1" }, - "bin": { - "run-con": "cli.js" - } - }, - "node_modules/run-con/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "license": "MIT", - "optional": true, + "node_modules/sharp": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", + "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", + "license": "Apache-2.0", "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" }, "engines": { - "node": ">=20.19.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/sass-embedded": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.100.0.tgz", - "integrity": "sha512-Ut8wlQSk19tm7jMK6mz6cF1+e+E7tUnW2tM02zQDPnOTcVbV8qCQG8UWxZkkNlY50+hV3hqP24OOkUlMz8xBpw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.5.0", - "colorjs.io": "^0.5.0", - "immutable": "^5.1.5", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", - "varint": "^6.0.0" + "node_modules/sharp/node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" }, - "bin": { - "sass": "dist/bin/sass.js" + "funding": { + "url": "https://opencollective.com/libvips" }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.2" + } + }, + "node_modules/sharp/node_modules/@img/sharp-darwin-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=16.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "sass-embedded-all-unknown": "1.100.0", - "sass-embedded-android-arm": "1.100.0", - "sass-embedded-android-arm64": "1.100.0", - "sass-embedded-android-riscv64": "1.100.0", - "sass-embedded-android-x64": "1.100.0", - "sass-embedded-darwin-arm64": "1.100.0", - "sass-embedded-darwin-x64": "1.100.0", - "sass-embedded-linux-arm": "1.100.0", - "sass-embedded-linux-arm64": "1.100.0", - "sass-embedded-linux-musl-arm": "1.100.0", - "sass-embedded-linux-musl-arm64": "1.100.0", - "sass-embedded-linux-musl-riscv64": "1.100.0", - "sass-embedded-linux-musl-x64": "1.100.0", - "sass-embedded-linux-riscv64": "1.100.0", - "sass-embedded-linux-x64": "1.100.0", - "sass-embedded-unknown-all": "1.100.0", - "sass-embedded-win32-arm64": "1.100.0", - "sass-embedded-win32-x64": "1.100.0" + "@img/sharp-libvips-darwin-x64": "1.3.2" } }, - "node_modules/sass-embedded-all-unknown": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.100.0.tgz", - "integrity": "sha512-auFtXY/kwYILmSVjtBDwyj0axcLbYYiffOKWoaXHnI5bsYwiRbBh3EneR1rpbX2ZIZCrwX93i5pxKLTZF/662Q==", + "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", "cpu": [ - "!arm", - "!arm64", - "!riscv64", - "!x64" + "arm64" ], - "license": "MIT", + "license": "LGPL-3.0-or-later", "optional": true, - "dependencies": { - "sass": "1.100.0" + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-android-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.100.0.tgz", - "integrity": "sha512-70f3HgX2pFNmzpGQ86n5e6QfWn2fP4QUQGfFQK0P1XH73ZLIzLo2YqygrGKGKeeqtc5eU2Wl1/xQzhzuKnO4kw==", + "node_modules/sharp/node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", "cpu": [ "arm" ], - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "android" + "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.100.0.tgz", - "integrity": "sha512-W+Ru9JwTnfU0UX3jSZcbqFdtKFMcYdfFwytc57h2DgnqCOIiAqI2E06mABZBZC+r3LwXCBuS5GbXAGeVgvVDkA==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", "cpu": [ "arm64" ], - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "android" + "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.100.0.tgz", - "integrity": "sha512-icU3o0V/uCSytSpf+tX5Lf51BvyQEbLzDUJfUi9etSauYBGHpPKkdtdZH0si4v98phq11Kl8rSV1SggksxF1Hg==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", "cpu": [ - "riscv64" + "ppc64" ], - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "android" + "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-android-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.100.0.tgz", - "integrity": "sha512-mevF9VQk6gEYByy8+jusaHGmd7Usb2ytX/DsEOd0JtOGCtcf1kh575xJ6OUBDIcJ15uLnbau/0iy1eP6WVBvWA==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", "cpu": [ - "x64" + "riscv64" ], - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "android" + "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.100.0.tgz", - "integrity": "sha512-1PVlYi61POo93IT/FfrG1mc1tAHxeSTyUALF2aOFmXGWjVXr3bQzEQiBGCOvQbj/ix+5hNyXFXcEMEyKvtUJJA==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", "cpu": [ - "arm64" + "s390x" ], - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "darwin" + "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.100.0.tgz", - "integrity": "sha512-x97o3JnGyImZNCIVs9wQHJUE5QCvmVIKaH1cwrz/5dK7OT1FpeNiW+u9TUomP9hG6Ekjd8EL8NBHpxTfIhdjmg==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", "cpu": [ "x64" ], - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ - "darwin" + "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.100.0.tgz", - "integrity": "sha512-9Ul7O1eKrc5YlhwWjkp8tZPSe3UEwSZ1uwUZOQom1HL0pRlBA6F/IlGZYFTLwnHMIP1fc77MMNaBRfc05mKMpw==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", "cpu": [ - "arm" + "arm64" ], - "libc": "glibc", - "license": "MIT", + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.100.0.tgz", - "integrity": "sha512-Dwjmj8Z6VRy7rAi53JAdEwIyUjpfl7PhpSc2/LpQPQx+aO5Dp7Spaipkax0ufJl1SoDUdchCsM4y/88YaluorQ==", + "node_modules/sharp/node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", "cpu": [ - "arm64" + "x64" ], - "libc": "glibc", - "license": "MIT", + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.100.0.tgz", - "integrity": "sha512-sl0JgbGloPyJg66XXx5UDSDScZ0oU85DpMQU4JU/sCUCFj1Z8zZ69SJWKTCNE4/jwnce7WI2zPCV5AG+RHOZJw==", + "node_modules/sharp/node_modules/@img/sharp-linux-arm": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", "cpu": [ "arm" ], - "libc": "musl", - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.2" } }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.100.0.tgz", - "integrity": "sha512-XpACJB2KjSLjf2e9uuvGVdOURsoNrFqgRiihhXyUHK9W0t3LIHb7z5MA/7XGPIT9bWSOO2zyw+rH/FHtDV/Yrg==", + "node_modules/sharp/node_modules/@img/sharp-linux-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", "cpu": [ "arm64" ], - "libc": "musl", - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.2" + } + }, + "node_modules/sharp/node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.2" } }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.100.0.tgz", - "integrity": "sha512-ShvI0Kx04mwoCARwZ0UjiT97isQvzO80tAt91zmFyHLN9kelc/IrQi940farSm2xQVPCKdeVyeG0ekBsokSpYQ==", + "node_modules/sharp/node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", "cpu": [ "riscv64" ], - "libc": "musl", - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.2" } }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.100.0.tgz", - "integrity": "sha512-TDBCRWNuS4RDLQXvRc1gjZlWiWTWaWGp0Bwu/IKwJxov81lsvrCs3TihTyNXtW7V5aoN4Ky3r0QOkNb3mwmBnA==", + "node_modules/sharp/node_modules/@img/sharp-linux-s390x": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", "cpu": [ - "x64" + "s390x" ], - "libc": "musl", - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.2" } }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.100.0.tgz", - "integrity": "sha512-j4ENJGOheO+fm3j/yorLxCjBP6/XskrZx7dTLlT+lXYwN/qqCqoA/gsNLI0McS3DFM6GBwPiffzWsdWS8t6sEQ==", + "node_modules/sharp/node_modules/@img/sharp-linux-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", "cpu": [ - "riscv64" + "x64" ], - "libc": "glibc", - "license": "MIT", + "libc": [ + "glibc" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.2" } }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.100.0.tgz", - "integrity": "sha512-0vUSN8j0WGtCJIOPh//EmUvYGHW0QOe5iul8qyhPk50MAcw49MA0r34AhftjDdx94ILPF6vApFs0gwHPQRlpVA==", + "node_modules/sharp/node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", "cpu": [ - "x64" + "arm64" ], - "libc": "glibc", - "license": "MIT", + "libc": [ + "musl" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" } }, - "node_modules/sass-embedded-unknown-all": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.100.0.tgz", - "integrity": "sha512-c+naBgWId4MIpToXcI0DgqetjdAkwTTAxFAuOaBz7HUXLdyG1oZRrEvSsbe41nEdQOKH0vgofVFCeSQgoXOG9A==", - "license": "MIT", + "node_modules/sharp/node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", "optional": true, "os": [ - "!android", - "!darwin", - "!linux", - "!win32" + "linux" ], - "dependencies": { - "sass": "1.100.0" + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" } }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.100.0.tgz", - "integrity": "sha512-iE+yxj+hUXwwbqpHkXxgAWTzeRfcWxJ7SSTQEPMk48lwq3oCrWLlz5sQuWHbuTK/i0GKQfROdP+hOmPi89yjUg==", + "node_modules/sharp/node_modules/@img/sharp-win32-arm64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", "cpu": [ "arm64" ], - "license": "MIT", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=14.0.0" + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.100.0.tgz", - "integrity": "sha512-qI4F8MI7/KYoy9NdjJfhSspG42WPkADSNDvwEV7qWvCSFC83koJssRsKO2/PfY+niZz6BG65Ic/D+A11h959hw==", + "node_modules/sharp/node_modules/@img/sharp-win32-ia32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", "cpu": [ - "x64" + "ia32" ], - "license": "MIT", + "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" + "node": "^20.9.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/libvips" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, + "node_modules/sharp/node_modules/@img/sharp-win32-x64": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", + "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/shebang-command": { @@ -9503,19 +10342,19 @@ } }, "node_modules/shiki": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.0.tgz", - "integrity": "sha512-NKKjWzR6LIGL3sXBrWDw9sDS9cxx42/DkysaNqJEeOWE8Kix5gpak0bc00OfDVEO4oyXSyz8+aRaqKoBD1yo7A==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.4.3.tgz", + "integrity": "sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==", "license": "MIT", "dependencies": { - "@shikijs/core": "4.3.0", - "@shikijs/engine-javascript": "4.3.0", - "@shikijs/engine-oniguruma": "4.3.0", - "@shikijs/langs": "4.3.0", - "@shikijs/themes": "4.3.0", - "@shikijs/types": "4.3.0", + "@shikijs/core": "4.4.3", + "@shikijs/engine-javascript": "4.4.3", + "@shikijs/engine-oniguruma": "4.4.3", + "@shikijs/langs": "4.4.3", + "@shikijs/themes": "4.4.3", + "@shikijs/types": "4.4.3", "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "@types/hast": "^3.0.5" }, "engines": { "node": ">=20" @@ -9600,9 +10439,9 @@ "license": "MIT" }, "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -9615,7 +10454,6 @@ "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" @@ -9656,14 +10494,14 @@ } }, "node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", + "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { "node": ">=20" @@ -9728,7 +10566,6 @@ "version": "1.1.21", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "dev": true, "license": "MIT", "dependencies": { "style-to-object": "1.0.14" @@ -9738,7 +10575,6 @@ "version": "1.0.14", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "dev": true, "license": "MIT", "dependencies": { "inline-style-parser": "0.2.7" @@ -9760,18 +10596,18 @@ } }, "node_modules/svgo": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", - "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.1.0.tgz", + "integrity": "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==", "license": "MIT", "dependencies": { "commander": "^11.1.0", - "css-select": "^5.1.0", + "css-select": "^6.0.0", "css-tree": "^3.0.1", - "css-what": "^6.1.0", + "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.5.0" + "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" @@ -9836,9 +10672,9 @@ } }, "node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", + "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "license": "MIT", "engines": { "node": ">=18" @@ -9861,21 +10697,21 @@ } }, "node_modules/tldts": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.5.tgz", - "integrity": "sha512-RfEzKWcq5fHUOFq7J3rl3Oz6ylKGtcHqUznzj4EcXsxLSIjJcvpbXAQtWGeJQ0xKnimR5e0Cn+cn9TssfMzm+g==", + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.11.tgz", + "integrity": "sha512-aBiNayCfTQxuIJBm06M+xR14cYaYlDlSXZbgsnKzKNxDKUVq7KFwTjwBSsb7m9Y5xO8WfPnBc63WaYFMTGlvqw==", "license": "MIT", "dependencies": { - "tldts-core": "^7.4.5" + "tldts-core": "^7.4.11" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.5.tgz", - "integrity": "sha512-pGrwzZDvPwKe+7NNUqAunb6rqTfynr0VOUhCMdqbu5xlvNiszsAJygRzwvpVycdzejlbpY+SWJOn+s75Og7FEA==", + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.11.tgz", + "integrity": "sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==", "license": "MIT" }, "node_modules/toidentifier": { @@ -9888,9 +10724,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -9975,9 +10811,9 @@ } }, "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "license": "MIT", "engines": { "node": ">=18" @@ -10015,9 +10851,9 @@ "license": "MIT" }, "node_modules/ultrahtml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", - "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz", + "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==", "license": "MIT" }, "node_modules/uncrypto": { @@ -10027,18 +10863,18 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.28.0.tgz", - "integrity": "sha512-LJAfY+2w6HGeT8d8J1wNQsUGUEGio6NWWpwdwurQe4f6oojzCFuGLizl1KSve4irsTxyLly1QhEeE6iapdaIvQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.29.0.tgz", + "integrity": "sha512-vamA8dGlzMwhpyYpQp9d8vka3o4D/yn5I7ez7Or+msDA4bZ8Uh+Zy91WvWf3I73gDAkFha9JcYRqm2li0Npfgg==", "dev": true, "license": "MIT" }, @@ -10062,14 +10898,23 @@ } }, "node_modules/unifont": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.4.tgz", - "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.5.tgz", + "integrity": "sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==", "license": "MIT", "dependencies": { "css-tree": "^3.1.0", - "ofetch": "^1.5.1", - "ohash": "^2.0.11" + "ohash": "^2.0.11", + "undici": "^8.0.0" + } + }, + "node_modules/unifont/node_modules/undici": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" } }, "node_modules/unist-util-find-after": { @@ -10130,7 +10975,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" @@ -10372,17 +11216,16 @@ } }, "node_modules/vite": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "license": "MIT", "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -10398,9 +11241,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -10413,13 +11257,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -10472,9 +11319,9 @@ "license": "MIT" }, "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", "dev": true, "license": "MIT" }, @@ -10547,15 +11394,6 @@ "node": ">= 8" } }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index b9310ccea4..2762e6a0a2 100644 --- a/package.json +++ b/package.json @@ -147,34 +147,34 @@ "check-html-links:report": "node scripts/check-html-links.mjs --md=reports/html-links-report.md" }, "dependencies": { - "astro-seo-schema": "^6.0.0", + "@astrojs/markdown-satteri": "^0.3.5", + "astro-seo-schema": "^7.0.0", "gray-matter": "^4.0.3", - "igniteui-astro-components": "0.0.27", - "igniteui-theming": "^25.0.2", - "igniteui-webcomponents": "^7.2.4", + "igniteui-astro-components": "1.0.2", + "igniteui-theming": "^26.0.1", + "igniteui-webcomponents": "^7.3.0-beta.1", "js-yaml": "^4.1.1", "jsdom": "^29.0.1", "pagefind": "^1.5.2", + "satteri": "^0.9.5", + "sharp": "0.35.3", "turndown": "^7.2.4", "turndown-plugin-gfm": "^1.0.2" }, "devDependencies": { - "@astrojs/mdx": "^6.0.0", + "@astrojs/mdx": "^7.0.5", "@astrojs/ts-plugin": "^1.10.7", "@types/jsdom": "^28.0.1", - "astro": "^6.1.6", + "astro": "^7.2.2", "cross-env": "^10.1.0", "cspell": "^9.2.2", - "markdownlint-cli": "^0.48.0", + "markdownlint-cli": "^0.49.1", "sass-embedded": "^1.98.0", "typescript": "^5.4.0" }, "peerDependencies": { - "@astrojs/mdx": ">=5", - "astro": ">=6" - }, - "overrides": { - "shiki": "^4.0.0" + "@astrojs/mdx": ">=7", + "astro": ">=7" }, "engines": { "node": ">=22.12.0" diff --git a/src/integration.ts b/src/integration.ts index 4feb91f694..03c8a7c9d0 100644 --- a/src/integration.ts +++ b/src/integration.ts @@ -24,7 +24,7 @@ * { tag: 'link', attrs: { rel: 'stylesheet', href: '...' } }, * ], * // Extra Astro options (markdown, image, build, …) - * markdown: { remarkPlugins: [] }, + * markdown: { mdastPlugins: [], hastPlugins: [] }, * }); * * --- Option B: manual composition (for full control) --- @@ -49,7 +49,8 @@ import fsp from 'node:fs/promises'; import path from 'node:path'; import { buildHtmlToMdConverter, htmlPageToMd } from './html-to-md.ts'; import { createIndex as pagefindCreateIndex } from 'pagefind'; -import { fileURLToPath } from 'node:url'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import { createRequire } from 'node:module'; import { defineConfig } from 'astro/config'; import type { AstroIntegration } from 'astro'; import mdx from '@astrojs/mdx'; @@ -61,6 +62,7 @@ import { buildSidebarFromToc } from './sidebar'; import { getPlatformHead } from './platform'; import type { HeadEntry, PlatformKey, NavLang } from './platform.ts'; import { getGtmContainerId } from './lib/platform-context.js'; +import { satteri } from '@astrojs/markdown-satteri'; import { remarkEnvVars } from './plugins/remark-env-vars'; import { remarkMdLinks } from './plugins/remark-md-links'; import { remarkHtmlTransforms } from './plugins/remark-html-transforms'; @@ -70,6 +72,77 @@ import { rehypePagefindIgnore } from 'igniteui-astro-components/plugins/rehype-p import { rehypeStripEmptyParagraphs } from './plugins/rehype-strip-empty-paragraphs'; import { rehypeApiReferencesGrid } from './plugins/rehype-api-references-grid'; +/** + * Absolute directories of every installed `igniteui-theming` copy, nearest first. + * + * The linked component library's tree is searched too: when + * `igniteui-astro-components` is a local checkout it carries its own copy, and its + * stylesheets are compiled as part of this build. + */ +function resolveThemingPackageDirs(): string[] { + const origins: string[] = [fileURLToPath(import.meta.url)]; + try { + origins.push(createRequire(import.meta.url).resolve('igniteui-astro-components/package.json')); + } catch { /* library not linked — its tree simply isn't searched */ } + + const dirs: string[] = []; + for (const origin of origins) { + try { + const themingPkg = createRequire(origin).resolve('igniteui-theming/package.json'); + const dir = path.dirname(themingPkg); + if (!dirs.includes(dir)) dirs.push(dir); + } catch { /* not installed in this tree */ } + } + return dirs; +} + +/** + * Sass importer for `igniteui-theming` subpaths. + * + * `igniteui-theming` declares its Sass files as `"./sass/**\/*.*"`, which is not a + * valid Node subpath pattern — only a single `*` is allowed — so no `sass/...` + * subpath resolves through its exports map. Vite 8 (Astro 7) resolves Sass `@use` + * through its own resolver, which enforces package exports; earlier versions fell + * back to plain filesystem resolution, which is why these imports used to work. + * + * Vite appends its resolver-backed importer *after* any configured ones, so this + * runs first and short-circuits those imports to a real path. Returning the + * directory-style URL lets Sass apply its own partial/index rules, so + * `sass/typography` still finds `sass/typography/_index.scss`. + */ +function createThemingSassImporter(): { findFileUrl(url: string): URL | null } { + const prefix = 'igniteui-theming/'; + const packageDirs = resolveThemingPackageDirs(); + + return { + findFileUrl(url: string): URL | null { + if (!url.startsWith(prefix)) return null; + const subpath = url.slice(prefix.length); + + for (const dir of packageDirs) { + const candidate = path.join(dir, subpath); + // Sass appends the partial/index variants itself, so it is enough that + // the target or its containing directory exists in this copy. + if (fs.existsSync(candidate) || fs.existsSync(path.dirname(candidate))) { + return pathToFileURL(candidate); + } + } + return null; + }, + }; +} + +/** Sass `loadPaths` covering the node_modules trees that hold `igniteui-theming`. */ +function resolveScssLoadPaths(): string[] { + // An app-local install wins, matching the previous cwd-only behaviour. + const paths: string[] = [path.join(process.cwd(), 'node_modules')]; + for (const dir of resolveThemingPackageDirs()) { + const nodeModulesDir = path.dirname(dir); + if (!paths.includes(nodeModulesDir)) paths.push(nodeModulesDir); + } + return paths; +} + /** Build / deployment mode. Drives env-var `DOCS_BUILD_MODE`. */ export type DocsMode = 'development' | 'staging' | 'production'; @@ -389,7 +462,14 @@ export function siteMetaIntegration({ css: { preprocessorOptions: { scss: { - loadPaths: [path.join(process.cwd(), 'node_modules')], + // Vite installs Sass's NodePackageImporter by default, and + // Sass consults importers before `loadPaths`. That importer + // *throws* on a subpath the exports map doesn't cover instead + // of falling through, which breaks every + // `igniteui-theming/sass/...` import (see resolveScssLoadPaths). + // Clearing it puts resolution back on `loadPaths`. + importers: [createThemingSassImporter()], + loadPaths: resolveScssLoadPaths(), // The if-function deprecation originates inside // igniteui-theming (vendor code we cannot modify). silenceDeprecations: ['if-function'], @@ -667,6 +747,9 @@ export function createDocsSite(options: CreateDocsSiteOptions = {} as CreateDocs if (platform) { process.env.DOCS_PLATFORM = platform; } + // Locale for getEnvVars() and getGtmContainerId(). Must be set before the + // getGtmContainerId() call below — getEnvVars() caches on first read. + process.env.LANG_CODE = navLang; // Google Tag Manager — first in , as high as possible after the // mandatory charset/viewport/title tags rendered by DocsLayout. Container ID @@ -720,9 +803,36 @@ export function createDocsSite(options: CreateDocsSiteOptions = {} as CreateDocs return defineConfig({ site, ...(base !== undefined ? { base } : {}), + // Astro 7 defaults to `compressHTML: 'jsx'`, which drops whitespace between + // inline elements entirely instead of collapsing it to a single space. That + // silently joins adjacent text — breadcrumb segments, badge labels and callout + // titles render as "Open SourceIgnite UI" / "InfoThe -y flag". Keeping the + // Astro 6 behaviour preserves the rendered copy; switch to 'jsx' only after + // auditing templates for the inline pairs that need an explicit {" "}. + compressHTML: true, ...astroExtra, vite: { ...(astroExtra as any).vite, + css: { + ...(astroExtra as any).vite?.css, + preprocessorOptions: { + ...(astroExtra as any).vite?.css?.preprocessorOptions, + scss: { + // Vite installs Sass's NodePackageImporter by default, and Sass + // consults importers before `loadPaths`. That importer *throws* on a + // subpath the exports map doesn't cover rather than falling through, + // which breaks every `igniteui-theming/sass/...` import + // (see resolveScssLoadPaths). Clearing it puts resolution back on + // `loadPaths`. + importers: [createThemingSassImporter()], + loadPaths: resolveScssLoadPaths(), + // The if-function deprecation originates inside igniteui-theming + // (vendor code we cannot modify). + silenceDeprecations: ['if-function'], + ...(astroExtra as any).vite?.css?.preprocessorOptions?.scss, + }, + }, + }, server: { ...(astroExtra as any).vite?.server, proxy: { @@ -737,20 +847,25 @@ export function createDocsSite(options: CreateDocsSiteOptions = {} as CreateDocs wrap: true, }, ...(astroExtra as any).markdown, - remarkPlugins: [ - remarkEnvVars, - remarkMdLinks, - remarkHtmlTransforms, - ...((astroExtra as any).markdown?.remarkPlugins ?? []), - ], - rehypePlugins: [ - rehypeTableWrapper, - rehypeHeadingAnchors, - rehypeStripEmptyParagraphs, - rehypeApiReferencesGrid, - rehypePagefindIgnore, - ...((astroExtra as any).markdown?.rehypePlugins ?? []), - ], + // Astro 7 renders Markdown/MDX with Sätteri instead of remark/rehype. + // MDAST plugins run before HAST plugins, matching the old + // remarkPlugins-then-rehypePlugins ordering. + processor: satteri({ + mdastPlugins: [ + remarkEnvVars, + remarkMdLinks, + remarkHtmlTransforms, + ...((astroExtra as any).markdown?.mdastPlugins ?? []), + ], + hastPlugins: [ + rehypeTableWrapper, + rehypeHeadingAnchors, + rehypeStripEmptyParagraphs, + rehypeApiReferencesGrid, + rehypePagefindIgnore, + ...((astroExtra as any).markdown?.hastPlugins ?? []), + ], + }), }, integrations: [ siteMetaIntegration({ diff --git a/src/lib/platform-context.ts b/src/lib/platform-context.ts index 6525a2e8e1..92cfd188d1 100644 --- a/src/lib/platform-context.ts +++ b/src/lib/platform-context.ts @@ -263,11 +263,29 @@ export function getEnvVars(): Record { return _env!; } -/** Built-in Google Tag Manager container IDs, keyed by build mode. */ -const GTM_CONTAINER_ID_DEFAULTS: Record = { - production: 'GTM-T65CF7', - staging: 'GTM-NCKNPN', - development: 'GTM-NCKNPN', +/** Container IDs for one locale. `development` doubles as the fallback for unknown modes. */ +type GtmContainerIds = { + development: string; + staging: string; + production: string; + [mode: string]: string | undefined; +}; + +/** + * Built-in Google Tag Manager container IDs keyed by locale and build mode. + * `en` is required: it is the fallback for locales without their own set (e.g. `kr`). + */ +const GTM_CONTAINER_ID_DEFAULTS: { en: GtmContainerIds; [lang: string]: GtmContainerIds | undefined } = { + en: { + production: 'GTM-T65CF7', + staging: 'GTM-NCKNPN', + development: 'GTM-WLXLBZD', + }, + jp: { + production: 'GTM-KVNSWJ', + staging: 'GTM-WLWSDK', + development: 'GTM-NNHVMC7', + }, }; /** @@ -276,7 +294,7 @@ const GTM_CONTAINER_ID_DEFAULTS: Record = { * Resolution order: * 1. `GTM_CONTAINER_ID` env var — explicit override. * 2. `GTMContainerId` in the resolved `environment.json` (per-mode, per-locale). - * 3. Built-in default for the current build mode — production vs. staging/development. + * 3. Built-in default for the current locale and build mode. */ export function getGtmContainerId(): string { if (process.env.GTM_CONTAINER_ID) return process.env.GTM_CONTAINER_ID; @@ -284,6 +302,9 @@ export function getGtmContainerId(): string { const fromEnvJson = getEnvVars().GTMContainerId; if (fromEnvJson) return fromEnvJson; + // LANG_CODE is set by createDocsSite() from the resolved navLang. + const lang = process.env.LANG_CODE ?? 'en'; const mode = getBuildMode(); - return GTM_CONTAINER_ID_DEFAULTS[mode] ?? GTM_CONTAINER_ID_DEFAULTS.development; + const localeDefaults = GTM_CONTAINER_ID_DEFAULTS[lang] ?? GTM_CONTAINER_ID_DEFAULTS.en; + return localeDefaults[mode] ?? localeDefaults.development; } diff --git a/src/plugins/rehype-api-references-grid.ts b/src/plugins/rehype-api-references-grid.ts index 2258b150f0..9e37baf7c5 100644 --- a/src/plugins/rehype-api-references-grid.ts +++ b/src/plugins/rehype-api-references-grid.ts @@ -1,41 +1,29 @@ /** - * Rehype plugin: wrap API References section content in a grid div. + * Sätteri HAST plugin: wrap API References section content in a grid nav. * * Markdown `## API References` headings are followed by components * and wrappers separated by
tags. Blank lines between * items create multiple

elements, so a plain CSS `h2 + p` selector only * catches the first paragraph. * - * This plugin walks the HAST, finds every

whose text is "API References", - * collects all following siblings up to the next heading, strips
nodes and blank text nodes, - * and wraps the collected nodes in: - *
+ * This plugin finds every

whose text is "API References", collects all + * following siblings up to the next heading, strips
nodes and blank text + * nodes, and wraps the collected nodes in: + * + * + * The collected nodes are copied into the wrapper (see `detach`) and the + * originals removed, which carries MDX components across intact. */ -import { visit, SKIP } from 'unist-util-visit'; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type HastNode = any; +import { defineHastPlugin } from 'satteri'; +import type { HastNode } from 'satteri'; +import type { ElementContent } from 'hast'; /** True if the node is a heading (h1–h6). */ function isHeading(node: HastNode): boolean { return node.type === 'element' && /^h[1-6]$/.test(node.tagName); } -/** True if the node is an

whose text content equals "API References". */ -function isApiReferencesHeading(node: HastNode): boolean { - if (node.type !== 'element' || node.tagName !== 'h2') return false; - const text = extractText(node).trim(); - return text === 'API References'; -} - -/** Recursively extract all text from a node. */ -function extractText(node: HastNode): string { - if (node.type === 'text') return node.value; - if (node.children) return node.children.map(extractText).join(''); - return ''; -} - /** True if the node is an empty or whitespace-only text node. */ function isBlankText(node: HastNode): boolean { return node.type === 'text' && node.value.trim() === ''; @@ -47,70 +35,71 @@ function isBr(node: HastNode): boolean { ((node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') && node.name === 'br'); } -/** Strip blank text nodes and
elements from a node list. */ -function stripBlanks(nodes: HastNode[]): HastNode[] { - return nodes.filter((n) => !isBlankText(n) && !isBr(n)); +/** + * Recursively copy a node into a plain, id-free object. + * + * Sätteri encodes a node that still carries its arena id as a *ref*, which + * copies the subtree but leaves the original in place — and removing that + * original then invalidates the ref, deleting the copy too. Spreading drops the + * non-enumerable id (the materializers' convention), so the result is rebuilt + * as fresh content and the original can safely be removed. + */ +function detach(node: T): T { + const copy = { ...node } as T & { children?: HastNode[] }; + const children = childrenOf(node); + if (children) copy.children = children.map(detach); + return copy; } -export function rehypeApiReferencesGrid() { - return (tree: HastNode) => { - // Process any container node (root or element) whose children may include headings. - // The `root` node holds top-level siblings — that's where ## API References and the - // following blocks live, so we must include it in the visitor. - visit(tree, (node: HastNode) => node.type === 'root' || (node.type === 'element' && !!node.children), (node: HastNode) => { - - const children: HastNode[] = node.children; - let i = 0; - - while (i < children.length) { - const child = children[i]; - - if (isApiReferencesHeading(child)) { - // Collect all siblings after the heading until the next heading - const start = i + 1; - let end = start; - - while (end < children.length && !isHeading(children[end])) { - end++; - } - - const contentNodes = children.slice(start, end); - - // Flatten: unwrap

elements so their children become direct grid items - const flatNodes: HastNode[] = []; - for (const n of contentNodes) { - if (n.type === 'element' && n.tagName === 'p') { - flatNodes.push(...(n.children ?? [])); - } else { - flatNodes.push(n); - } - } - - const gridItems = stripBlanks(flatNodes); +/** Children of a node, or `undefined` for the leaf types that have none. */ +function childrenOf(node: HastNode): HastNode[] | undefined { + const children = (node as { children?: HastNode[] }).children; + return Array.isArray(children) ? children : undefined; +} - if (gridItems.length === 0) { - i++; - continue; +export function rehypeApiReferencesGrid() { + return defineHastPlugin({ + name: 'api-references-grid', + element: { + filter: ['h2'], + visit(node, ctx) { + if (ctx.textContent(node).trim() !== 'API References') return; + + const parent = ctx.parent(node); + const index = ctx.indexOf(node); + if (!parent || index === undefined) return; + + // Collect all siblings after the heading until the next heading. + const siblings = parent.children as HastNode[]; + let end = index + 1; + while (end < siblings.length && !isHeading(siblings[end])) end++; + + const contentNodes = siblings.slice(index + 1, end); + if (contentNodes.length === 0) return; + + // Flatten: unwrap

elements so their children become direct grid items. + const flatNodes: HastNode[] = []; + for (const n of contentNodes) { + if (n.type === 'element' && n.tagName === 'p') { + flatNodes.push(...(childrenOf(n) ?? [])); + } else { + flatNodes.push(n); } - - // Build the wrapper nav - const gridDiv: HastNode = { - type: 'element', - tagName: 'nav', - properties: { className: ['idg-api-references'] }, - children: gridItems, - }; - - // Replace the original siblings with the wrapper - children.splice(start, end - start, gridDiv); - - // Skip past the newly inserted wrapper - i = start + 1; - return SKIP; } - i++; - } - }); - }; + const gridItems = flatNodes.filter((n) => !isBlankText(n) && !isBr(n)); + if (gridItems.length === 0) return; + + ctx.insertAfter(node, { + type: 'element', + tagName: 'nav', + properties: { className: ['idg-api-references'] }, + children: gridItems.map(detach) as ElementContent[], + }); + + // The nav holds detached copies, so every original is removed. + for (const n of contentNodes) ctx.removeNode(n); + }, + }, + }); } diff --git a/src/plugins/rehype-strip-empty-paragraphs.ts b/src/plugins/rehype-strip-empty-paragraphs.ts index 0e5bfc73f0..08194027ab 100644 --- a/src/plugins/rehype-strip-empty-paragraphs.ts +++ b/src/plugins/rehype-strip-empty-paragraphs.ts @@ -1,8 +1,8 @@ /** - * Rehype plugin: strip empty <p> tags. + * Sätteri HAST plugin: strip empty <p> tags. * - * Remark inserts empty paragraph nodes for the whitespace/newlines that appear - * between sibling HTML elements inside custom elements such as + * The Markdown parser inserts empty paragraph nodes for the whitespace/newlines + * that appear between sibling HTML elements inside custom elements such as * ``. For example: * * @@ -14,30 +14,26 @@ * consist solely of whitespace text nodes. */ -import { visit, CONTINUE } from 'unist-util-visit'; +import { defineHastPlugin } from 'satteri'; +import type { Element } from 'hast'; /** Returns true when a `

` node has no meaningful content. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function isEmptyParagraph(node: any): boolean { +function isEmptyParagraph(node: Readonly): boolean { if (!node.children || node.children.length === 0) return true; return node.children.every( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (child: any) => child.type === 'text' && child.value.trim() === '' + (child) => child.type === 'text' && child.value.trim() === '' ); } -/** Rehype plugin that removes empty `

` elements from the tree. */ +/** Sätteri HAST plugin that removes empty `

` elements from the tree. */ export function rehypeStripEmptyParagraphs() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (tree: any) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - visit(tree, 'element', (node: any, index: number | undefined, parent: any) => { - if (node.tagName !== 'p' || !parent || index == null) return; - if (isEmptyParagraph(node)) { - parent.children.splice(index, 1); - // Return the same index so the visitor re-checks this position - return [CONTINUE, index]; - } - }); - }; + return defineHastPlugin({ + name: 'strip-empty-paragraphs', + element: { + filter: ['p'], + visit(node, ctx) { + if (isEmptyParagraph(node)) ctx.removeNode(node); + }, + }, + }); } diff --git a/src/plugins/remark-env-vars.ts b/src/plugins/remark-env-vars.ts index 1ea9838e6e..0d22f84f0e 100644 --- a/src/plugins/remark-env-vars.ts +++ b/src/plugins/remark-env-vars.ts @@ -14,7 +14,7 @@ * DOCS_ENV (or NODE_ENV) selects the env block: development | staging | production. */ -import { visit } from 'unist-util-visit'; +import { defineMdastPlugin } from 'satteri'; import fs from 'node:fs'; import path from 'node:path'; @@ -87,24 +87,30 @@ export function replaceEnvVars(str: string): string { return str.replace(ENV_PATTERN, (_match, key) => env[key] ?? `{environment:${key}}`); } -/** Remark plugin that substitutes `{environment:key}` tokens in the markdown AST. */ +/** + * Sätteri MDAST plugin that substitutes `{environment:key}` tokens. + * + * Exported as a factory so Sätteri calls it once per compile; the + * `loadEnv()` cache is module-level and intentionally shared across documents. + */ export function remarkEnvVars() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (tree: any) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - visit(tree, (node: any) => { - if (node.type === 'text' && node.value) { - node.value = replaceEnvVars(node.value); - } - if (node.type === 'link' && node.url) { - node.url = replaceEnvVars(node.url); - } - if (node.type === 'image' && node.url) { - node.url = replaceEnvVars(node.url); - } - if (node.type === 'html' && node.value) { - node.value = replaceEnvVars(node.value); - } - }); - }; + return defineMdastPlugin({ + name: 'env-vars', + text(node, ctx) { + const value = replaceEnvVars(node.value); + if (value !== node.value) ctx.setProperty(node, 'value', value); + }, + html(node, ctx) { + const value = replaceEnvVars(node.value); + if (value !== node.value) ctx.setProperty(node, 'value', value); + }, + link(node, ctx) { + const url = replaceEnvVars(node.url); + if (url !== node.url) ctx.setProperty(node, 'url', url); + }, + image(node, ctx) { + const url = replaceEnvVars(node.url); + if (url !== node.url) ctx.setProperty(node, 'url', url); + }, + }); } diff --git a/src/plugins/remark-html-transforms.ts b/src/plugins/remark-html-transforms.ts index beb3a5fe2f..a552075c8b 100644 --- a/src/plugins/remark-html-transforms.ts +++ b/src/plugins/remark-html-transforms.ts @@ -1,30 +1,32 @@ /** - * Remark plugin: inline HTML transforms. + * Sätteri MDAST plugin: inline HTML transforms. * * Handles legacy HTML patterns in markdown content: * - Rewrites relative `../images/` sources to root-relative paths * - Normalizes code block language identifiers to lowercase */ -import { visit } from 'unist-util-visit'; +import { defineMdastPlugin } from 'satteri'; const IMG_SRC_PATTERN = /src="(\.\.\/)+images\//g; -/** Remark plugin that transforms legacy HTML patterns in the AST. */ +/** Sätteri MDAST plugin that transforms legacy HTML patterns in the AST. */ export function remarkHtmlTransforms() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (tree: any) => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - visit(tree, (node: any) => { - // Inline HTML: relative img src → root-relative - if (node.type === 'html' && node.value) { - node.value = (node.value as string).replace(IMG_SRC_PATTERN, 'src="/images/'); - } + return defineMdastPlugin({ + name: 'html-transforms', - // Code blocks: normalize language to lowercase - if (node.type === 'code' && node.lang) { - node.lang = (node.lang as string).toLowerCase(); - } - }); - }; + // Inline HTML: relative img src → root-relative + html(node, ctx) { + if (!node.value) return; + const value = node.value.replace(IMG_SRC_PATTERN, 'src="/images/'); + if (value !== node.value) ctx.setProperty(node, 'value', value); + }, + + // Code blocks: normalize language to lowercase + code(node, ctx) { + if (!node.lang) return; + const lang = node.lang.toLowerCase(); + if (lang !== node.lang) ctx.setProperty(node, 'lang', lang); + }, + }); } diff --git a/src/plugins/remark-md-links.ts b/src/plugins/remark-md-links.ts index 1320a7f783..dda730217c 100644 --- a/src/plugins/remark-md-links.ts +++ b/src/plugins/remark-md-links.ts @@ -17,8 +17,9 @@ * Non-relative links (http/https, /, #, mailto:) and links without .mdx are left unchanged. */ -import { visit } from 'unist-util-visit'; +import { defineMdastPlugin } from 'satteri'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; /** * Resolve a relative .mdx link to an absolute Astro URL. @@ -52,37 +53,48 @@ function rewriteMdLink(url: string, filePath: string, docsDir: string): string { return docsBase + '/' + slug.toLowerCase() + trail + suffix; } -/** Remark plugin that rewrites relative .mdx links, prepends DOCS_BASE, and fixes relative image paths. */ +/** Resolve the source file path and docs root for the document being compiled. */ +function resolvePaths(fileURL: URL | undefined): { filePath: string; docsDir: string } { + const filePath = fileURL ? fileURLToPath(fileURL) : ''; + const docsDir = process.env.DOCS_SOURCE_PATH + ? path.resolve(process.env.DOCS_SOURCE_PATH) + : (filePath ? path.dirname(filePath) : ''); + return { filePath, docsDir }; +} + +/** + * Sätteri MDAST plugin that rewrites relative .mdx links, prepends DOCS_BASE, + * and fixes relative image paths. + */ export function remarkMdLinks() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (tree: any, file: any) => { - const filePath = (file.path as string) ?? ''; - const docsDir = process.env.DOCS_SOURCE_PATH - ? path.resolve(process.env.DOCS_SOURCE_PATH) - : (filePath ? path.dirname(filePath) : ''); + return defineMdastPlugin({ + name: 'md-links', - // eslint-disable-next-line @typescript-eslint/no-explicit-any - visit(tree, (node: any) => { - if (node.type === 'link' && node.url) { - node.url = rewriteMdLink(node.url as string, filePath, docsDir); + link(node, ctx) { + if (!node.url) return; + const { filePath, docsDir } = resolvePaths(ctx.fileURL); + let url = rewriteMdLink(node.url, filePath, docsDir); - // Prepend DOCS_BASE to root-relative internal links not already prefixed. - const docsBase = (process.env.DOCS_BASE ?? '').replace(/\/$/, ''); - if ( - docsBase && - (node.url as string).startsWith('/') && - !(node.url as string).startsWith('//') && - !(node.url as string).startsWith(docsBase + '/') - ) { - node.url = docsBase + (node.url as string); - } + // Prepend DOCS_BASE to root-relative internal links not already prefixed. + const docsBase = (process.env.DOCS_BASE ?? '').replace(/\/$/, ''); + if ( + docsBase && + url.startsWith('/') && + !url.startsWith('//') && + !url.startsWith(docsBase + '/') + ) { + url = docsBase + url; } - // Rewrite relative `../images/` paths in markdown image nodes to root-relative `/images/`. - // Generated MDX files may contain relative image references that Vite cannot resolve. - if (node.type === 'image' && node.url) { - node.url = (node.url as string).replace(/^(\.\.\/)+images\//, '/images/'); - } - }); - }; + if (url !== node.url) ctx.setProperty(node, 'url', url); + }, + + // Rewrite relative `../images/` paths in markdown image nodes to root-relative `/images/`. + // Generated MDX files may contain relative image references that Vite cannot resolve. + image(node, ctx) { + if (!node.url) return; + const url = node.url.replace(/^(\.\.\/)+images\//, '/images/'); + if (url !== node.url) ctx.setProperty(node, 'url', url); + }, + }); }