openvibers/openvibe.shared Commits

4.183.0: Calm reduces and only Off removes; every shape glyph has a solid, every product its mark (#404)

OP OpenVibers committed 3 days ago · 33dda783bd · 80 files, +712 −287

* Fourteen more solid drawings for glyphs shown small

grid, square, more, record, window, sidebar, columns, table, card, briefcase, inbox, user-circle, compass and print.
A frame's inner line becomes a gap between two filled panels, so the shape still reads at 14 px. (The glyphs made of
lines only, 66 of the 142 without a solid drawing, thicken when small by design and need none.)

* Fourteen more: marks in a disc, the media keys, and things with a badge

plus-circle, minus-circle, contrast, rewind, fast-forward, skip, flame, heart-broken, clapper, mug, user-minus,
user-lock, clipboard-check and file-code. A mark inside a filled shape is cut out of it, wide enough to read at 14 px.

* Seven more: a die, a lifebuoy, cubes, a paw, a weight, a person with a pen or a tag

* Four more: chat, user, camera and cloud with a slash

The shape is cut along the slash, a band a little wider than the line, so the slash stays a line across it (as
eye-off and mic-off already do).

* Ten more: laugh, cookie, radio, toolbox, task, window-restore, cc, eraser, seedling, hammer

* Thirteen more solids; the stand-alone svg strokes a solid's line parts

airplane, burst, fish, shoe, sword, donate, mask, couch, child, walk, finish, piggy and folder-tree. The four slashed
ones get a wider cut along the slash, so it reads at 14 px.

glyphs.svg(name, { style: 'solid' }) gave a class-ln part no stroke of its own (it has no stylesheet): a line inside a
solid drawing was filled as a shape or not drawn at all. It carries the stroke inline now, as the sprite already did.

* The last five shapes: car, door, podium, rocket, a camera that flips

Every glyph without a solid drawing is now one made of lines, which thickens when small instead.

* Twelve site marks: no product draws the bare V any more

Computer, Mail, Locker, Git, Barcode, Party, Studio, My, Home and the old names for Link and OpenRestream had no mark
of their own, so Live's and Network's site grids drew the fallback V for five of them; a shoe, a heart, a calendar
and a camera, which sites name as marks, did the same. Each has its glyph in the ring now, centred by measurement.
The test covers every product id.

* Motion: Calm reduces, only Off removes

The owner, 2026-11-10: "Reduce motion is too much reduction, it ruins a lot of stuff, so it should still have full
motion but actually just reduce it instead of getting rid of it."

Motion has four choices now, and one signal on <html> (theme-loader.js writes it, the device's own setting counted in):
  auto     follows the device: Calm when it asks, full otherwise (no attribute)
  full     plays everything, even when the device asks            data-ov-motion=full
  reduced  Calm: every effect still plays, smaller and slower     data-ov-motion=reduced
  off      the only choice that stops motion                      data-ov-motion=off

What Calm is: --ov-move, the factor a moving thing multiplies its distance by (1, .35, 0; display.move() in script),
the calm feel's lengths with no overshoot, and endless loops slowed to 0.6 of their speed by the loader (anything
that ends plays as written). A lift rises a pixel, a reveal five, a tilt leans a third as far, confetti is a third of
the pieces, the mark keeps its intro and hover and drops only the linger, three leaves fall, not seven. The page
itself does not glide (scroll-behavior on html); a rail or a sheet does.

What changed in the files: every rule that stopped an effect under prefers-reduced-motion or under
html[data-ov-motion=reduced] is gone (75 of them across 45 files); what such a rule did to leave a thing finished
(a drawn stroke, a static glow, a bar at rest) belongs to html[data-ov-motion=off] now. The calmer keyframes that
already existed (the menu's pop, the home screen's wiggle and card fade, a new message) stay as Calm's. Script that
skipped an effect when the device asked skips it only with motion off.

test/motion-setting.test.js holds the rule: nothing in the package stops motion unless motion is off.

* Merge remote-tracking branch 'origin/main' into glyphs/line-solids

# Conflicts:
#	navbar.js

* 4.183.0: Calm reduces and only Off removes; solids and site marks

Merges the motion change (motion/reduce-not-remove) into the icons branch, on top of 4.181.0, so both ship as one
release and the sites take one pin round. CHANGELOG, STATUS and the generated files are rebuilt.

* Strips under Calm: the nudge is half as far, the drift half as fast

kit-web.js skipped both when the device asked; they now play, gentler, and only motion off keeps a strip still.
The rails check reads the edges after the nudge (a macOS runner asks and used to skip it).

Changes

ddiff --git a/CHANGELOG.md b/CHANGELOG.md
iindex d004e29..8653545 100644
---- a/CHANGELOG.md
++++ b/CHANGELOG.md
@@@ -1,5 +1,48 @@
# Changelog
++## 4.183.0 — 2026-11-10
++
++**Motion: Calm reduces, only Off removes.** The owner, 2026-11-10: "Reduce motion is too much reduction, it ruins a lot
++of stuff, so it should still have full motion but actually just reduce it instead of getting rid of it." Until now Calm
++(the person's choice, or the device asking for less motion) gave every animation and transition no length at all.
++
++- **Four choices, one signal.** `display.motion` is `auto`, `full`, `reduced` or `off`, and `theme-loader.js` writes
++ the answer on `<html>`, the device's own setting counted in: Automatic follows the device (Calm when it asks, nothing
++ otherwise), Full plays everything even when the device asks (`data-ov-motion=full`), Calm is `data-ov-motion=reduced`,
++ and Off (`data-ov-motion=off`) is the only choice that stops motion. `display.motion()` answers `'full'`, `'calm'` or
++ `'off'`. The look panel's Motion row offers the four (Auto, Full, Calm, Off).
++- **What Calm is.** `--ov-move`, the factor a moving thing multiplies its distance by: 1 in full, .35 under Calm, 0 with
++ motion off (`calc(12px * var(--ov-move, 1))` in CSS, `display.move()` and `OVFx.move()` in script). The calm feel's
++ lengths with no overshoot. And the loader slows every endless loop (a pulse, a drift, a shimmer) to 0.6 of its speed
++ as it starts; anything that ends plays as it was written. The page itself does not glide when it scrolls; a rail or
++ a sheet does.
++- **The effects.** A lift rises a pixel and a reveal five; a tilt leans a third as far; a burst of confetti is a third
++ of the pieces thrown half as hard; a count-up is quicker; the glint is fainter and slower; the mark keeps its intro
++ and its hover and drops only the linger, and three leaves fall instead of seven; the ghost cursor glides slower and
++ waits longer; a name's particle burst is three pieces, not six; a drawer slides a third of its width and fades; a strip nudges half as far and drifts at half the speed.
++- **The files.** 75 rules across 45 files stopped an effect under `prefers-reduced-motion` or under
++ `html[data-ov-motion=reduced]`: all are gone. What such a rule did to leave a thing finished (a drawn stroke, a
++ static glow, a bar at rest) belongs to `html[data-ov-motion=off]`. The calmer keyframes that already existed (the
++ menu's pop, the home screen's wiggle and card fade, a new message) stay as Calm's. Script that skipped an effect when
++ the device asked skips it only with motion off; a live preview (a video that starts by itself) still waits for a tap
++ under Calm.
++- **For a site's own styles:** delete the rules that stop motion under `prefers-reduced-motion` or under
++ `html[data-ov-motion=reduced]`; multiply a distance of 24px or more by `var(--ov-move, 1)`; keep a rule only where it
++ swaps in a calmer keyframe, keyed on `html[data-ov-motion=reduced]`; a finished state belongs to
++ `html[data-ov-motion=off]`. `test/motion-setting.test.js` holds this package to it.
++- The loader grew about 2.9 KB raw (budget 66,500 characters). Network must accept `full` and `off` in the display
++ record before a site offers them (OpenVibe.Network `server/themes/routes.js`).
++
++**Icons: every shape glyph has a solid drawing, and every product has its mark.** Icons shown at 18 px or smaller draw
++their solid form; 142 of the 278 glyphs had none. 75 of those are made of lines only and thicken when small by design;
++the other 67 are shapes, and all of them are drawn now (frames and cards, marks in a disc, the media keys, things,
++people, slashed shapes), so 203 of 278 glyphs have a solid drawing and every glyph without one is a line glyph.
++`glyphs.svg(name, { style: 'solid' })` gave a class-ln part no stroke of its own, so a line inside a solid drawing was
++filled as a shape or not drawn; it carries the stroke inline now, as the sprite already did. Site marks: eleven
++product ids had no mark and drew the bare "V" (computer, mail, lock/locker, git, barcode, party, studio, my, home,
++restream, node), and four things sites name as marks did the same (shoe, heart, calendar, camera). Each has its glyph
++in the ring, centred by measurement; `test/site-icons.test.js` covers every product id.
++
## 4.181.0 — 2026-11-10
**The Dock's agent view, timeline and Actor go through Network's frame relay.** `dock-agent.js`, `dock-timeline.js`
ddiff --git a/README.md b/README.md
iindex 14ee788..c770fbe 100644
---- a/README.md
++++ b/README.md
@@@ -5,7 +5,7 @@
**Docs:** https://openvibe.services · **For AI:** https://openvibe.network/llms.txt
**Install and test:** `npm ci && npm test`
--**Status:** alpha, v4.181.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
++**Status:** alpha, v4.183.0 (every release is a tag; see [CHANGELOG.md](CHANGELOG.md)). Every deployed
consumer installs a tagged release and none keeps a vendored copy
([docs/migration-plan.md](docs/migration-plan.md) is done); each repository's `package.json` names
the tag it pins.
ddiff --git a/STATUS.json b/STATUS.json
iindex 7163762..acca2f6 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -4,13 +4,15 @@
"code": true,
"wave": "W2",
"package": "openvibe-shared",
-- "version": "4.181.0",
++ "version": "4.183.0",
"plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026)",
"deployed": false,
"deployment": "none of its own: a package released as git tags; OpenVibe.Network serves /shared/* from its pinned tag, and a site can serve its own pinned copy (openvibe-shared/serve)",
"contracts": "openvibe-contracts v0.384.0 (devDependency: the release manifest contract)",
"sdk": "openvibe-sdk v0.133.0",
"features": [
++ "motion has four choices (Automatic, Full, Calm, Off) and one signal, html[data-ov-motion]: Calm keeps every effect and makes it smaller and slower (--ov-move, display.move(), endless loops at 0.6 of their speed), and only Off stops motion; no rule in the package stops an effect because the device asked for less (4.183.0)",
++ "every shape glyph has a solid drawing (203 of 278; the other 75 are line glyphs that thicken when small), glyphs.svg() draws a solid's line parts as lines, and every product id has its own site mark, so no product draws the bare V (4.183.0)",
"the Dock's agent view, timeline and Actor ask Network's /api/frame relay instead of openvibe.codes and openvibe.actor, so a signed-in page logs no cross-origin console errors; an explicit base still reaches the product (4.181.0)",
"an agent's live panel: ov-canvas.js draws actor.canvas@1 (headings, text, lists, checklists, tables, metrics, bar and line charts, pictures from openvibe.media, https links, buttons) the same on every site; built node by node, a button only asks, a tick tells, versions only grow (4.145.0)",
"send it on OpenVibe: the share sheet's first place for a signed-in person is OpenVibe Chat; the Dock opens on Send to… (a conversation, or someone new by their name) and the message waits in the box until the person sends it, OpenVibeDock.share({ text, title }) (4.144.0)",
ddiff --git a/action-center.js b/action-center.js
iindex 3736b80..dfa5603 100644
---- a/action-center.js
++++ b/action-center.js
@@@ -158,7 +158,6 @@
.ovac-group { display: flex; align-items: center; gap: 8px; margin: 10px 10px 4px; font-size: 11px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--text-muted, #8b8b96); }
.ovac-group span { font-variant-numeric: tabular-nums; letter-spacing: 0; color: var(--text-secondary, #b6b6c0); }
.ovac-group[data-bucket="waiting"] { color: color-mix(in srgb, var(--warning, #f5a524) 70%, var(--text-primary, #ececf1)); }
-- @media (prefers-reduced-motion: reduce) { .ovac { animation: none; } .ovac-item[data-bucket="running"] .ovac-state::before { animation: none; } }
`;
document.head.appendChild(st);
}
ddiff --git a/agent-session.css b/agent-session.css
iindex 0ad1c55..4e0b4e6 100644
---- a/agent-session.css
++++ b/agent-session.css
@@@ -113,7 +113,6 @@ details[open] > summary .ovas-chev { transform: rotate(90deg); }
.ovas-bar { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; padding: 0 2px; } .ovas-bar::-webkit-scrollbar { display: none; }
.ovas-chip { flex: none; } .ovas-icons .ovas-kind + .ovas-kind { display: none; }
}
--@media (prefers-reduced-motion: reduce) { .ovas-spin, .ovas-spin::before, .ovas-spin::after, .ovas-plan li::before { animation: none; } }
/* Files changed (4.32.0): every file the agents edited or wrote, with its +/−; a tap opens its step. */
.ovas-files { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
ddiff --git a/appbar.js b/appbar.js
iindex 5dd58dc..1e13de1 100644
---- a/appbar.js
++++ b/appbar.js
@@@ -70,7 +70,6 @@
html.ov-has-appbar:has(:is(input:not([type=checkbox]):not([type=radio]):not([type=range]), textarea, select, [contenteditable="true"]):focus) .ovnav-appbar,
body.ov-panel-open .ovnav-appbar { transform: translateY(110%); }
}
-- @media (prefers-reduced-motion: reduce) { .ovnav-appbar, .ovnav-appbar .ovnav-ab-ic, .ovnav-appbar .ovnav-ab-pill { transition: none; } .ovnav-appbar .ovnav-ab-ic svg { animation: none !important; } }
@media print { .ovnav-appbar { display: none !important; } }`;
document.head.appendChild(st);
}
ddiff --git a/boost.js b/boost.js
iindex 9446b1d..a89dd34 100644
---- a/boost.js
++++ b/boost.js
@@@ -113,7 +113,7 @@
}
// route-transition.js's content hash (scripts/sibling-revs.js writes it), so a release gives it a new URL (4.138.0).
-- const BOOST_REV = { 'route-transition.js': '7e15e1169d14' };
++ const BOOST_REV = { 'route-transition.js': '1bd3c4576b8c' };
function fx(mainEl) {
if (o.fx === false) return Promise.resolve(null);
if (root.OVRouteFx) return Promise.resolve(root.OVRouteFx);
ddiff --git a/dock-actor.js b/dock-actor.js
iindex a664b28..78d4d55 100644
---- a/dock-actor.js
++++ b/dock-actor.js
@@@ -63,7 +63,6 @@
background: var(--bg-input, transparent); color: var(--text-primary, #ececf1); font: inherit; font-size: 13px; }
.ovdac-note { font-size: 12px; color: var(--text-muted, #8b8b96); }
@keyframes ovdac-pulse { 50% { opacity: .4; } }
-- @media (prefers-reduced-motion: reduce) { .ovdac-state.is-working .dot, .ovdac-step .dot { animation: none; } }
`;
(d.head || d.documentElement).appendChild(st);
}
ddiff --git a/dock-agent.js b/dock-agent.js
iindex dd6b7b0..890af5a 100644
---- a/dock-agent.js
++++ b/dock-agent.js
@@@ -67,7 +67,6 @@
.ovda-acts button[data-act="end"] { color: color-mix(in srgb, var(--live-red, #e5484d) 65%, var(--text-primary, #ececf1)); }
.ovda svg { fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
@keyframes ovda-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .35; } }
-- @media (prefers-reduced-motion: reduce) { .ovda-line .dot.live { animation: none; } }
`;
(d.head || d.documentElement).appendChild(st);
}
ddiff --git a/dock-runs.js b/dock-runs.js
iindex 5bf504c..dd0c46b 100644
---- a/dock-runs.js
++++ b/dock-runs.js
@@@ -31,7 +31,7 @@
.ovdk-run-title{color:inherit;text-decoration:none;min-width:0}.ovdk-run-title:hover b{text-decoration:underline;text-underline-offset:2px}.ovdk-run-line{font-size:12.5px;color:var(--text-secondary,#a8a8b2);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ovdk-run-model{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-secondary,#a8a8b2)}.ovdk-run-maker{display:inline-grid;place-items:center;width:20px;height:20px;border-radius:6px;background:color-mix(in srgb,var(--text-primary,#ececf1) 8%,transparent)}.ovdk-run-maker svg{width:14px;height:14px;fill:currentColor}
.ovdk-run-bar{height:3px;margin:2px 0;background:color-mix(in srgb,var(--accent,#3b82f6) 18%,transparent);border-radius:9px;overflow:hidden}.ovdk-run-bar:after{content:'';display:block;width:40%;height:100%;border-radius:9px;background:var(--accent,#3b82f6);animation:ovdk-run-go 1.6s cubic-bezier(.45,0,.2,1) infinite}
--@keyframes ovdk-run-go{from{transform:translateX(-100%)}to{transform:translateX(250%)}}@media (prefers-reduced-motion:reduce){.ovdk-run-bar:after{animation:none;width:45%}}
++@keyframes ovdk-run-go{from{transform:translateX(-100%)}to{transform:translateX(250%)}}html[data-ov-motion=off] .ovdk-run-bar:after{width:45%}
.ovdk-run-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:3px}.ovdk-run-actions a,.ovdk-run-actions button,.ovdk-run-actions summary{min-height:32px;display:inline-flex;align-items:center;padding:0 12px;border-radius:999px;color:inherit;background:color-mix(in srgb,var(--text-primary,#ececf1) 7%,transparent);border:0;cursor:pointer;font:inherit;font-size:12.5px;font-weight:650;text-decoration:none;list-style:none}
.ovdk-run-actions summary::-webkit-details-marker{display:none}.ovdk-run-actions .primary{background:var(--accent,#3b82f6);color:var(--on-accent,#fff)}
@media (hover:hover){.ovdk-run-actions a:hover,.ovdk-run-actions button:not(.primary):hover,.ovdk-run-actions summary:hover{background:color-mix(in srgb,var(--text-primary,#ececf1) 12%,transparent)}}
ddiff --git a/dock-timeline.js b/dock-timeline.js
iindex 725c18b..8a7e231 100644
---- a/dock-timeline.js
++++ b/dock-timeline.js
@@@ -101,7 +101,7 @@
'.ovdt-card.ovdt-empty{padding:12px 14px}',
'.ovdt-link{color:color-mix(in srgb,var(--accent,#3b82f6) 72%,var(--text-primary,#ececf1));font-weight:650;text-decoration:none}',
'@media (max-width:640px){.ovdt-link{display:inline-flex;align-items:center;min-height:44px;padding:0 4px}}',
-- '@media (prefers-reduced-motion:reduce){.ovdt-outcome[data-s="running"]::before{animation:none}}',
++ '',
].join('');
(doc.head || doc.documentElement).appendChild(st);
}
ddiff --git a/dock-timer.js b/dock-timer.js
iindex cfd3616..5375c17 100644
---- a/dock-timer.js
++++ b/dock-timer.js
@@@ -36,7 +36,6 @@
.ovdk-tmenu .go { background: var(--accent, #3b82f6); border-color: transparent; color: var(--on-accent, #fff); }
.ovdk-pill[data-tone="timer"] .ovdk-t { font-variant-numeric: tabular-nums; }
.ovdk-pill[data-tone="timer-done"] { box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent, #3b82f6) 45%, transparent); }
--@media (prefers-reduced-motion: reduce) { .ovdk-timer-bar i { transition: none; } }
`;
const pad = (n) => String(n).padStart(2, '0');
const left = (ms) => {
ddiff --git a/dock-vibe.js b/dock-vibe.js
iindex 24ba2a7..2bde957 100644
---- a/dock-vibe.js
++++ b/dock-vibe.js
@@@ -53,7 +53,6 @@
.ovdk-res-a button:disabled { opacity: .55; cursor: default; }
.ovdk-res-c.is-stopped { border-color: var(--border, rgba(255,255,255,.12)); background: transparent; }
.ovdk-res-c.is-stopped .ovdk-i, .ovdk-res-c.is-stopped .ovdk-res-t { color: var(--text-muted, #8b8b96); }
-- @media (prefers-reduced-motion: reduce) { .ovdk-typing i { animation: none; } }
`;
let ctx = null, G = {};
const icon = (path) => { const s = h('span', 'ovdk-i'); s.innerHTML = svg(path); return s; };
ddiff --git a/dock.js b/dock.js
iindex 433509a..7731ce3 100644
---- a/dock.js
++++ b/dock.js
@@@ -63,7 +63,8 @@
const mounts = {};
const phone = () => { try { return root.matchMedia('(max-width: 640px)').matches; } catch { return false; } };
-- const reduced = () => { try { return root.matchMedia('(prefers-reduced-motion: reduce)').matches || document.documentElement.getAttribute('data-ov-motion') === 'reduced'; } catch { return false; } };
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduced = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
const state = () => (doc && doc.state) || DEFAULT_STATE;
const counts = () => (doc && doc.counts) || {};
@@@ -110,7 +111,7 @@
}
// Each sibling's content hash (scripts/sibling-revs.js writes it), so a release gives each a new URL.
-- const DOCK_REV = { 'dock-vibe.js': '3dc4a69f0678', 'dock-runs.js': '8df917372f19', 'ai-marks-client.js': 'f4a880a9f206', 'action-center.js': '125c20e01289', 'dock-timeline.js': 'a73188de9bd8', 'dock-actor.js': '470b0c14e9f1', 'dock-agent.js': '8a5423641d14', 'dock-timer.js': 'f5d9fee28824', 'dock-share.js': 'e83b2e27b3ef', 'dock-card.js': '2643c20b0016' };
++ const DOCK_REV = { 'dock-vibe.js': '41d5083aeeb8', 'dock-runs.js': 'b734e5e7ba11', 'ai-marks-client.js': 'f4a880a9f206', 'action-center.js': 'e40346ec1f16', 'dock-timeline.js': 'bffaed38fccf', 'dock-actor.js': 'c2163d1ab4e4', 'dock-agent.js': 'de6612c136a8', 'dock-timer.js': '460d68aa8321', 'dock-share.js': 'e83b2e27b3ef', 'dock-card.js': '2643c20b0016' };
function load(src, test) {
return new Promise((ok) => {
if (test()) return ok(true);
@@@ -145,8 +146,6 @@
.ovdk-pill:has(.ovdk-t:empty) { padding-right: 8px; }
@keyframes ovdk-in { from { opacity: 0; transform: translateY(10px) scale(.9); } }
@keyframes ovdk-ping { to { transform: scale(2.6); opacity: 0; } }
-- @media (prefers-reduced-motion: reduce) { .ovdk-pill, .ovdk-m::before { animation: none !important; } }
-- html[data-ov-motion="reduced"] .ovdk-pill, html[data-ov-motion="reduced"] .ovdk-m::before { animation: none; }
.ovdk { --ovdk-gap: 16px; position: fixed; z-index: 9996; display: flex; flex-direction: column; overflow: hidden; box-sizing: border-box;
right: max(var(--ovdk-gap), env(safe-area-inset-right, 0px)); bottom: calc(max(var(--ovdk-gap), env(safe-area-inset-bottom, 0px)) + var(--ovnav-appbar-h, 0px));
width: ${DEF.width}px; height: ${DEF.height}px; max-width: calc(100vw - 32px); max-height: calc(100vh - 96px); max-height: calc(100dvh - 96px);
@@@ -194,7 +193,6 @@
.ovdk-orbx:active .ovdk-ox { transform: rotate(270deg) scale(.7); }
@keyframes ovdk-ox-in { from { transform: rotate(45deg) scale(.8); } }
@keyframes ovdk-o1-out { from { opacity: 1; transform: scale(1); } }
-- @media (prefers-reduced-motion: reduce) { .ovdk-ox, .ovdk-ox circle { transition: none; animation: none !important; } }
.ovdk-more { position: absolute; z-index: 6; right: 8px; top: calc(100% - 4px); width: min(320px, calc(100% - 16px)); display: grid; gap: 2px; padding: 6px; border-radius: 16px;
border: 1px solid var(--border, rgba(255,255,255,.12)); background: var(--bg-elevated, var(--bg-secondary, #1d1f27)); box-shadow: 0 18px 40px -12px rgba(0,0,0,.55); cursor: default; }
.ovdk-more[hidden] { display: none; }
@@@ -317,8 +315,6 @@
.ovdk-head { cursor: default; }
}
html.ovdk-sheet-open, html.ovdk-sheet-open body { overflow: hidden; }
-- @media (prefers-reduced-motion: reduce) { .ovdk.is-in, .ovdk-wait span { animation: none; } }
-- html[data-ov-motion="reduced"] .ovdk.is-in { animation: none; }
// In a window of its own the panel is the window: full bleed, no card, no phone sheet.
.ovdk-pip .ovdk, .ovdk-pip .ovdk[data-corner] { left: 0 !important; top: 0 !important; right: 0 !important; bottom: 0 !important;
width: 100% !important; height: 100% !important; max-width: none !important; max-height: none !important;
ddiff --git a/footer.js b/footer.js
iindex 1954d71..35d9c40 100644
---- a/footer.js
++++ b/footer.js
@@@ -461,11 +461,11 @@
.ovf-legal-inline{justify-content:center}
.ovf-account{flex-direction:column;align-items:flex-start}
}
--@media (prefers-reduced-motion:reduce){.ovf-account,.ovf-pulse,.ovf-inner--expanded,.ovf-dot{animation:none}.ovf-col a:hover,.ovf-social a:hover,.ovf-account-links a:hover{transform:none}}
++html[data-ov-motion=off] .ovf-col a:hover,html[data-ov-motion=off] .ovf-social a:hover,html[data-ov-motion=off] .ovf-account-links a:hover{transform:none}
.ovf{-webkit-tap-highlight-color:transparent}
:where(.ovf) :where(a,button):active{scale:.97}
:where(.ovf) :where(a,button):focus-visible{outline:2px solid var(--accent-light,var(--accent,#3b82f6));outline-offset:2px;border-radius:4px}
--@media (prefers-reduced-motion:reduce){:where(.ovf) :where(a,button):active{scale:none;opacity:.82}}`;
++html[data-ov-motion=off] :where(.ovf) :where(a,button):active{scale:none;opacity:.82}`;
function injectCSS() {
if (typeof document === 'undefined' || document.getElementById('ovf-css')) return;
ddiff --git a/glyphs.js b/glyphs.js
iindex 919755e..a9a49c8 100644
---- a/glyphs.js
++++ b/glyphs.js
@@@ -230,6 +230,86 @@
// shows the solid one when the icon is 18 px or smaller (pure CSS, see scripts/build-glyphs.js); a glyph without
// one draws its lines heavier there instead.
const SOLID = Object.freeze({
++ // 4.182.0, the last five shapes: a car, a door, a podium, a rocket and a camera that flips. After these, every
++ // glyph without a solid drawing is one made of lines, which thickens when small instead.
++ car: '<path fill-rule="evenodd" d="M5.8 5.4h12.4l2.6 5.4H3.2ZM2.9 12.2h18.2v4.4H2.9ZM6.1 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM15.7 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM5.2 17.4h2.6v1.8H5.2ZM16.2 17.4h2.6v1.8h-2.6Z"/>',
++ door: '<path fill-rule="evenodd" d="M14.6 4.1 5.4 2.4v19.2l9.2-1.7ZM9.9 12a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path class="ln" d="M15.9 5h1.6a1 1 0 0 1 1 1v15M15.9 21H21M3 21h2.4"/>',
++ ranking: '<path d="M3.4 13.6h5V9.8h7.2v5.8h5v5.5H3.4ZM12 2l1 2 2.2.3-1.6 1.6.4 2.2L12 7.1l-2 1 .4-2.2-1.6-1.6 2.2-.3Z"/>',
++ rocket: '<path fill-rule="evenodd" d="M12.1 16.2 7.8 11.9C9.4 6 13.8 2.9 21.1 2.9c0 7.3-3.1 11.7-9 13.3ZM13.8 8.5a1.7 1.7 0 1 0 3.4 0a1.7 1.7 0 1 0-3.4 0Z"/><path d="M4.2 11.9 7.2 7.4h3.4L7 12.3ZM11.7 17 12.1 19.8l4.5-3.2v-3.4ZM6.7 17.3c-1.9 0-3.8 1.9-3.8 3.8 1.9 0 3.8-1.9 3.8-3.8Z"/>',
++ 'camera-flip': '<path fill-rule="evenodd" d="M3 8.3a1.8 1.8 0 0 1 1.8-1.8h2.5L9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v10.1a1.8 1.8 0 0 1-1.8 1.8H4.8A1.8 1.8 0 0 1 3 18.4ZM7.96 12.03A4.3 4.3 0 0 1 16.04 12.03L13.79 12.85A1.9 1.9 0 0 0 10.21 12.85ZM16.04 14.97A4.3 4.3 0 0 1 7.96 14.97L10.21 14.15A1.9 1.9 0 0 0 13.79 14.15Z"/>',
++ // 4.182.0, sixth batch: things with one outline (an aeroplane, a burst, a fish, a shoe, a sword, a mask, a
++ // piggy bank), a couch, a coin over a box, two folders on a tree, a chequered flag, and two people.
++ airplane: '<path d="M12 2.5c1.3 0 2 1.2 2 3V9.7l7.5 4.5v2.5L14 14.2v3.5l2 1.5v2.5L12 20.5l-4 1.2v-2.5l2-1.5v-3.5l-7.5 2.5v-2.5L10 9.7V5.5c0-1.8.7-3 2-3Z"/>',
++ burst: '<path d="M12 1.9l2.2 4.9 5-2-2 5 4.9 2.2-4.9 2.2 2 5-5-2-2.2 4.9-2.2-4.9-5 2 2-5L1.9 12l4.9-2.2-2-5 5 2Z"/>',
++ fish: '<path fill-rule="evenodd" d="M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path d="M8.4 12 2.9 7.4v9.2Z"/>',
++ shoe: '<path d="M1.9 15.9V9.5l4.3-.6 3.1-4.2 4.2 1.9-.9 2.7 3.6 2 4.4.9a2.2 2.2 0 0 1 1.5 2.1v1.6Z"/><path class="ln" d="M2.5 18.8h19"/>',
++ sword: '<path d="M20.6 3.4v4.4l-10.1 10.1-4.4-4.4L16.2 3.4Z"/><path class="ln" d="M5.5 12 12 18.5M8.5 15.5 4 20"/>',
++ donate: '<path fill-rule="evenodd" d="M12 2.9a5.6 5.6 0 1 0 0 11.2 5.6 5.6 0 0 0 0-11.2Zm-.8 3.2h1.6v4.8h-1.6ZM3.4 14.9h17.2v5.7H3.4ZM8 17v1.5h8V17Z"/>',
++ mask: '<path fill-rule="evenodd" d="M2.9 6.2c3.2 1.4 6.2 2 9.1 2s5.9-.6 9.1-2c0 6.9-2.8 11.4-5.6 11.4-1.5 0-2.1-1.5-3.5-1.5s-2 1.5-3.5 1.5c-2.8 0-5.6-4.5-5.6-11.4ZM6.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0ZM13.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0Z"/>',
++ couch: '<path d="M7 4.4h10A2.6 2.6 0 0 1 19.6 7v2a3.2 3.2 0 0 0-3.2 3.2v.1H7.6v-.1A3.2 3.2 0 0 0 4.4 9V7A2.6 2.6 0 0 1 7 4.4ZM2.4 12a2.6 2.6 0 0 1 5.2 0v1.9h8.8V12a2.6 2.6 0 0 1 5.2 0v5.6H2.4Z"/><path class="ln" d="M5 17.6v1.9M19 17.6v1.9"/>',
++ child: '<circle cx="12" cy="5.5" r="2.7"/><path class="ln" d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/>',
++ walk: '<circle cx="12.5" cy="4.5" r="2.4"/><path class="ln" d="m8.5 21 2.6-6 2.1 2.4V21M11.1 15l1-5.6-3 1.6-1.5 3M12.1 9.4l2 3 3 1"/>',
++ finish: '<path d="M5.6 3.6h4.2v4.9H5.6ZM14.6 3.6h4.3a1 1 0 0 1 1 1v3.9h-5.3ZM9.8 8.5h4.8v4.9H9.8Z"/><path class="ln" d="M5 21V3.5"/>',
++ piggy: '<path fill-rule="evenodd" d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12ZM15 10.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0ZM9.3 7.8v1.4h3.4V7.8Z"/>',
++ 'folder-tree': '<path d="M9.9 4.9h3.9l1 1.5h6.3v5.2H9.9ZM9.9 13.9h3.9l1 1.5h6.3v5.2H9.9Z"/><path class="ln" d="M4.5 3.5v13a1 1 0 0 0 1 1H9.9M4.5 8.5H9.9"/>',
++ // 4.182.0, fifth batch: a laughing face, a cookie, a radio, a toolbox, a task, two windows, captions, an
++ // eraser, a seedling and a hammer.
++ laugh: '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 8.1l3.4 1.7-3.4 1.7-.67-1.34.72-.36-.72-.36ZM17 8.1l-3.4 1.7 3.4 1.7.67-1.34-.72-.36.72-.36ZM7.6 13.4h8.8a4.4 4.4 0 0 1-8.8 0Z"/>',
++ cookie: '<path fill-rule="evenodd" d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4ZM7.3 9.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM10.8 14a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM6.8 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM14.3 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z"/>',
++ radio: '<path fill-rule="evenodd" d="M5 7.4h14a2.6 2.6 0 0 1 2.6 2.6v8a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18v-8A2.6 2.6 0 0 1 5 7.4ZM12.9 14a2.6 2.6 0 1 0 5.2 0a2.6 2.6 0 1 0-5.2 0ZM6 11.3v2.1h4.8v-2.1ZM6 14.8v2.1h4.8v-2.1Z"/><path class="ln" d="M7 7.4 17 3.5"/>',
++ toolbox: '<path d="M2.4 10a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.3H2.4ZM2.4 13.7h4.8v1.5h1.6v-1.5h6.4v1.5h1.6v-1.5h4.8V18a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18Z"/><path class="ln" d="M9 7.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v1.9"/>',
++ task: '<path fill-rule="evenodd" d="M7 3.4h10a3.6 3.6 0 0 1 3.6 3.6v10a3.6 3.6 0 0 1-3.6 3.6H7A3.6 3.6 0 0 1 3.4 17V7A3.6 3.6 0 0 1 7 3.4ZM6.9 12.1l4.2 4.2 6.1-7.3-1.7-1.4-4.6 5.5-2.4-2.4Z"/>',
++ 'window-restore': '<path d="M2.9 10.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-8a2.6 2.6 0 0 1-2.6-2.6ZM7.9 6.6V6.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-1.1v-5.6a3.9 3.9 0 0 0-3.9-3.9Z"/>',
++ cc: '<path fill-rule="evenodd" d="M5.5 4.4h13a3.1 3.1 0 0 1 3.1 3.1v9a3.1 3.1 0 0 1-3.1 3.1h-13a3.1 3.1 0 0 1-3.1-3.1v-9a3.1 3.1 0 0 1 3.1-3.1ZM10.82 9.47A3.3 3.3 0 1 0 10.82 14.53L9.54 13A1.3 1.3 0 1 1 9.54 11ZM17.62 9.47A3.3 3.3 0 1 0 17.62 14.53L16.34 13A1.3 1.3 0 1 1 16.34 11Z"/>',
++ eraser: '<path d="M14 3.9l6.1 6.1-5.2 5.2-6.1-6.1ZM7.4 10l6.2 6.2-3.2 3.2H6.1l-2.9-2.9a1.6 1.6 0 0 1 0-2.3Z"/><path class="ln" d="M13 19.4h7"/>',
++ seedling: '<path d="M12.4 11.4C12.4 7 9.6 4 4.5 4c0 4.6 2.8 7.4 7.9 7.4ZM11.6 13.9c0-4.4 2.8-7.4 7.9-7.4 0 4.6-2.8 7.4-7.9 7.4Z"/><path class="ln" d="M12 20.5V13"/>',
++ hammer: '<path d="M13 2.7l7.3 7.3-3.6 3.6-7.3-7.3ZM12.9 8.9 3.9 17.9a2 2 0 0 0 2.8 2.8l9-9Z"/>',
++ // 4.182.0, the "-off" family: the shape is cut along the slash (a band a little wider than the line), so the
++ // slash stays a line across it, as eye-off and mic-off already do.
++ 'chat-off': '<path d="M8.1 4.4H19a1.6 1.6 0 0 1 1.6 1.6v9.5a1.6 1.6 0 0 1-.4 1ZM3.4 7.1 12.9 16.6H8.3l-4.9 4.6Z"/><path class="ln" d="m4 4 16 16"/>',
++ 'user-off': '<path d="M8.95 5.27A4.1 4.1 0 1 1 14.74 11.06ZM4.2 21c0-4.2 2.8-6.8 6.2-7.1L17.3 21Z"/><path class="ln" d="m4 4 16 16"/>',
++ 'camera-off': '<path d="M8.5 4.8 9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v9ZM3.8 7.5 16.5 20.2H4.8A1.8 1.8 0 0 1 3 18.4V8.3Z"/><path class="ln" d="m4 4 16 16"/>',
++ 'cloud-off': '<path d="M9.34 5.66A6.4 6.4 0 0 1 17.6 10a4.4 4.4 0 0 1 3 6.92ZM5.64 9.32 15.12 18.8H7A4.7 4.7 0 0 1 5.4 9.4Z"/><path class="ln" d="m4 4 16 16"/>',
++ // 4.182.0, third batch: a die, a lifebuoy, cubes, a paw, a weight, and a person with a pen or a tag.
++ dice: '<path fill-rule="evenodd" d="M6.4 2.9h11.2a3.5 3.5 0 0 1 3.5 3.5v11.2a3.5 3.5 0 0 1-3.5 3.5H6.4a3.5 3.5 0 0 1-3.5-3.5V6.4a3.5 3.5 0 0 1 3.5-3.5ZM6.4 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM10.1 12a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM6.4 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0Z"/>',
++ lifebuoy: '<path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 5.4a4.2 4.2 0 1 1 0 8.4 4.2 4.2 0 0 1 0-8.4ZM14.33 16.17 17.44 19.28 19.28 17.44 16.17 14.33ZM9.67 16.17 6.56 19.28 4.72 17.44 7.83 14.33ZM14.33 7.83 17.44 4.72 19.28 6.56 16.17 9.67ZM9.67 7.83 6.56 4.72 4.72 6.56 7.83 9.67Z"/>',
++ cubes: '<path d="M12 3.3 8.4 5.1v4.2l3.6 1.8 3.6-1.8V5.1ZM7.5 11.8 3.9 13.6v4.2l3.6 1.8 3.6-1.8v-4.2ZM16.5 11.8l-3.6 1.8v4.2l3.6 1.8 3.6-1.8v-4.2Z"/>',
++ paw: '<path d="M7.4 18.4c0-3.1 2-5.6 4.6-5.6s4.6 2.5 4.6 5.6c0 1.6-1.2 2.6-2.6 2.6-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1.4 0-2.6-1-2.6-2.6Z"/><circle cx="5.8" cy="11" r="2.3"/><circle cx="9.4" cy="6.4" r="2.3"/><circle cx="14.6" cy="6.4" r="2.3"/><circle cx="18.2" cy="11" r="2.3"/>',
++ weight: '<circle cx="12" cy="5.2" r="2.6"/><path d="M6.6 9h10.8l3.3 12.1H3.3Z"/>',
++ 'user-pen': '<circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path d="M19.9 11.9l2.2 2.2-5.3 5.3-2.9.7.7-2.9Z"/>',
++ 'user-tag': '<circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path fill-rule="evenodd" d="M14.1 14.4h4.6l3.1 3.1-3.1 3.1h-4.6ZM15.3 17.5a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/>',
++ // 4.182.0, second batch: marks in a disc, the media keys, and a few things (flame, mug, clapper, a person with
++ // a badge). A mark inside a filled shape is cut out of it; a thin part that must stay a line is class "ln".
++ 'plus-circle': '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm-1.2 4.2h2.4v3.8H17v2.4h-3.8V17h-2.4v-3.8H7v-2.4h3.8Z"/>',
++ 'minus-circle': '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 10.8v2.4h10v-2.4Z"/>',
++ contrast: '<path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 2.2a7.4 7.4 0 0 1 0 14.8Z"/>',
++ rewind: '<path d="M21 5.7v12.6L12.3 12ZM11.7 5.7v12.6L3 12Z"/>',
++ 'fast-forward': '<path d="M3 5.7v12.6L11.7 12ZM12.3 5.7v12.6L21 12Z"/>',
++ skip: '<path d="M5.4 4.3v15.4L15.6 12Z"/><rect x="17.2" y="4.4" width="2.6" height="15.2" rx="1.2"/>',
++ flame: '<path fill-rule="evenodd" d="M12 21.6c3.9 0 6.6-2.7 6.6-6.3 0-4.4-4.5-7.9-6.1-12.9h-1C9.9 7.4 5.4 10.9 5.4 15.3c0 3.6 2.7 6.3 6.6 6.3Zm0-3.4c1.2 0 2-.8 2-1.9 0-1.2-1-2.2-2-3.6-1 1.4-2 2.4-2 3.6 0 1.1.8 1.9 2 1.9Z"/>',
++ 'heart-broken': '<path fill-rule="evenodd" d="M12 20.1s-7.6-4.6-7.6-10.6a4.3 4.3 0 0 1 7.6-2.9 4.3 4.3 0 0 1 7.6 2.9c0 6-7.6 10.6-7.6 10.6ZM11.1 7.4l2.2.5-1.1 2.2 2.9 2-2.1 4.8-2-.9 1.2-3-3-2Z"/>',
++ clapper: '<path fill-rule="evenodd" d="M2.4 6.1 19.7 2.9l.9 4.3L3 8.9ZM6.8 5.3 9 8.3l2.6-.2L9.4 4.8ZM12.4 4.2l2.2 3.6 2.6-.3L15 3.8Z"/><path d="M2.9 10.1h18.2v9a1.6 1.6 0 0 1-1.6 1.6h-15a1.6 1.6 0 0 1-1.6-1.6Z"/>',
++ mug: '<path d="M3.9 8.4h12.2v7.6a4.6 4.6 0 0 1-4.6 4.6h-3a4.6 4.6 0 0 1-4.6-4.6Z"/><path class="ln" d="M16.1 10.5H17a2.5 2.5 0 0 1 0 5h-.9M8 3.2c-.8 1 .8 2 0 3M11.5 3.2c-.8 1 .8 2 0 3"/>',
++ 'user-minus': '<circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path class="ln" d="M15.8 17.5h5.4"/>',
++ 'user-lock': '<circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><rect x="14.6" y="15.2" width="6.8" height="5.6" rx="1.3"/><path class="ln" d="M16.5 15.2v-1a1.5 1.5 0 0 1 3 0v1"/>',
++ 'clipboard-check': '<path fill-rule="evenodd" d="M7.4 4.4h9.2a2.1 2.1 0 0 1 2.1 2.1v13.4a2.1 2.1 0 0 1-2.1 2.1H7.4a2.1 2.1 0 0 1-2.1-2.1V6.5a2.1 2.1 0 0 1 2.1-2.1ZM7.9 13.5 11 16.6l5.1-5.1-1.6-1.6-3.5 3.5-1.5-1.5Z"/><rect x="8.6" y="2.6" width="6.8" height="3.8" rx="1.2"/>',
++ 'file-code': '<path fill-rule="evenodd" d="M6 2.6h7.6v5.2h5V21.4H6ZM10 11.2l1.5 1.4-1.6 1.7 1.6 1.7-1.5 1.4-2.9-3.1ZM14.6 11.2l-1.5 1.4 1.6 1.7-1.6 1.7 1.5 1.4 2.9-3.1Z"/><path d="M15.2 2.9l3.1 3.3h-3.1Z"/>',
++ // 4.182.0: thirteen more shapes that are shown small (frames, cards and the person in a circle). A frame's
++ // inner line becomes a gap between two filled panels, so the shape still reads at 14 px.
++ grid: '<rect x="3.4" y="3.4" width="7.4" height="7.4" rx="2"/><rect x="13.2" y="3.4" width="7.4" height="7.4" rx="2"/><rect x="3.4" y="13.2" width="7.4" height="7.4" rx="2"/><rect x="13.2" y="13.2" width="7.4" height="7.4" rx="2"/>',
++ square: '<rect x="3.4" y="3.4" width="17.2" height="17.2" rx="3"/>',
++ more: '<circle cx="5" cy="12" r="2.1"/><circle cx="12" cy="12" r="2.1"/><circle cx="19" cy="12" r="2.1"/>',
++ record: '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.2a6 6 0 1 1 0 12 6 6 0 0 1 0-12Z"/><circle cx="12" cy="12" r="3.6"/>',
++ window: '<path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h18.2v7.5a2.6 2.6 0 0 1-2.6 2.6h-13a2.6 2.6 0 0 1-2.6-2.6Z"/>',
++ sidebar: '<path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h2.7v16.2H5.5a2.6 2.6 0 0 1-2.6-2.6ZM10.2 3.9h8.3a2.6 2.6 0 0 1 2.6 2.6v11a2.6 2.6 0 0 1-2.6 2.6h-8.3Z"/>',
++ columns: '<path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h8.1v10.1H5.5a2.6 2.6 0 0 1-2.6-2.6ZM13 10h8.1v7.5a2.6 2.6 0 0 1-2.6 2.6H13Z"/>',
++ table: '<path d="M2.4 6a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.4H2.4ZM2.4 10.4h5.4v10.2H5a2.6 2.6 0 0 1-2.6-2.6ZM9.7 10.4h4.6v10.2H9.7ZM16.2 10.4h5.4V18a2.6 2.6 0 0 1-2.6 2.6h-2.8Z"/>',
++ card: '<path fill-rule="evenodd" d="M1.9 7a2.6 2.6 0 0 1 2.6-2.6h15a2.6 2.6 0 0 1 2.6 2.6v10a2.6 2.6 0 0 1-2.6 2.6h-15a2.6 2.6 0 0 1-2.6-2.6ZM1.9 9.2v1.8h20.2V9.2ZM5.4 14.3v1.6h5.2v-1.6Z"/>',
++ briefcase: '<path d="M2.4 9a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.9H2.4ZM2.4 13.1h7.4v1.5h4.4v-1.5h7.4V18a2.6 2.6 0 0 1-2.6 2.6H5a2.6 2.6 0 0 1-2.6-2.6Z"/><path class="ln" d="M9 6.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v.9"/>',
++ inbox: '<path fill-rule="evenodd" d="M2.4 13.4 5 4.4h14l2.6 9V19a1.6 1.6 0 0 1-1.6 1.6H4A1.6 1.6 0 0 1 2.4 19ZM6.2 6.4 4.4 12.5h3.9l1.5 2.5h4.4l1.5-2.5h3.9L17.8 6.4Z"/>',
++ 'user-circle': '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.8a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4ZM6.3 17.6a6.6 6.6 0 0 1 11.4 0 8 8 0 0 1-11.4 0Z"/>',
++ compass: '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.4 7.6 13.9 13.9 7.6 16.4 10.1 10.1Z"/>',
++ print: '<path d="M6.4 2.9h11.2v4.3H6.4ZM2.9 11a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v4a2.6 2.6 0 0 1-2.6 2.6h-.3v-4.4H5.8v4.4h-.3A2.6 2.6 0 0 1 2.9 15ZM7.2 14.6h9.6v6.5H7.2Z"/>',
// 4.73.0: the most-used shapes on the sites (Live's sweep, 2026-11-01) get their solid drawing too.
copy: '<rect x="7.6" y="7.6" width="13" height="13" rx="2.4"/><path class="ln" d="M16 7.6V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h1.6"/>',
scissors: '<path fill-rule="evenodd" d="M6 3.9a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4Zm0 2a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4ZM6 13.7a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4Zm0 2a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z"/><path class="ln" d="M8.5 8.8 20 18M8.5 15.2 20 6"/>',
@@@ -466,7 +546,10 @@
if (!d) return '';
const weights = { thin: 1, light: 1.5, regular: 2, bold: 2.5, duotone: 2 };
if (!['thin', 'light', 'regular', 'bold', 'solid', 'duotone'].includes(style)) throw new TypeError('glyphs.svg: unsupported style');
-- const solidPath = solid(name);
++ // A part of a solid drawing that must stay a line (class "ln") carries its own stroke here: this svg stands
++ // alone, with no stylesheet to give it one (ov-glyphs.js does it in CSS, the sprite inline, the same way).
++ // Without it the line was filled as a shape, or not drawn at all.
++ const solidPath = solid(name).replace(/class="ln"/g, 'class="ln" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"');
const drawing = style === 'solid' && solidPath ? solidPath : d;
const extra = style === 'solid' && solidPath ? ' stroke="none"' : ` stroke-width="${weights[style]}"`;
const layered = style === 'duotone' && solidPath ? `<g fill="currentColor" stroke="none" opacity=".2">${solidPath}</g>${d}` : drawing;
ddiff --git a/island.js b/island.js
iindex 56a4dba..d9a84ff 100644
---- a/island.js
++++ b/island.js
@@@ -12,7 +12,7 @@
* OpenVibeIsland.remove(id) · .list()
*
* Works without the navbar (fixed pill, top centre). All text goes through textContent; links are
-- * http(s) or same-origin paths only. Motion respects prefers-reduced-motion.
++ * http(s) or same-origin paths only. Motion follows the Motion setting (Calm slows its loops, Off stops them).
*/
(function (root) {
'use strict';
@@@ -54,7 +54,7 @@
@keyframes ovisGrow{from{max-width:30px;opacity:0}to{opacity:1}}
@keyframes ovisInd{0%{transform:translateX(-110%)}100%{transform:translateX(300%)}}
@media (max-width:640px){.ov-island{margin-left:6px}.ovi-pill{max-width:40vw;padding-right:9px}.ovi-pill-pct{display:none}.ovi-card{position:fixed;top:56px;left:12px;right:12px;width:auto}}
--@media (prefers-reduced-motion:reduce){.ovi-pill,.ovi-bar.is-ind i{animation:none}.ovi-card,.ovi-bar i{transition:none}}`;
++`;
const items = new Map(); // id → activity (insertion order = age)
const timers = new Map();
ddiff --git a/items.css b/items.css
iindex 515cc00..a754cee 100644
---- a/items.css
++++ b/items.css
@@@ -9,7 +9,7 @@
* items.js adds the classes from the person's equipped set; a page that already knows the token (a server-rendered
* profile) writes the class itself. These are Live's own name effects (OpenVibe.Live public/css/cosmetics.css),
* unchanged, so a name looks the same in Live's chat and everywhere else. The network's Calm setting
-- * (html[data-ov-motion=reduced], theme-loader.js) and prefers-reduced-motion stop the animation and keep the colour.
++ * (data-ov-motion=reduced on <html>, theme-loader.js) plays them slower; with motion off the colour stays and nothing moves.
*/
.ov-fx { display: inline-block; }
@@@ -247,12 +247,7 @@
28% { content: '🍋'; }
35%, 100% { content: '7'; }
}
--html[data-ov-motion=reduced] .name-fx-vegas, html[data-ov-motion=reduced] .name-fx-vegas::before,
--html[data-ov-motion=reduced] .name-fx-vegas::after { animation: none !important; }
--@media (prefers-reduced-motion: reduce) {
-- .name-fx-vegas, .name-fx-vegas::before, .name-fx-vegas::after { animation: none !important; }
-- .name-fx-vegas { filter: drop-shadow(0 0 3px rgba(255, 207, 63, .9)); }
--}
++html[data-ov-motion=off] .name-fx-vegas{filter: drop-shadow(0 0 3px rgba(255, 207, 63, .9))}
/* 2fat Bass Drop (2026-10-23, one of a kind: 2fat, who brings the old classic bangers back): the name thumps on the beat,
a big drop then a smaller one, in club lights, with an equalizer dancing before it and a speaker after it. Only its
@@@ -313,12 +308,7 @@ html[data-ov-motion=reduced] .name-fx-vegas::after { animation: none !important;
0% { transform: scale(1.25); }
25%, 100% { transform: scale(1); }
}
--html[data-ov-motion=reduced] .name-fx-twofat, html[data-ov-motion=reduced] .name-fx-twofat::before,
--html[data-ov-motion=reduced] .name-fx-twofat::after { animation: none !important; }
--@media (prefers-reduced-motion: reduce) {
-- .name-fx-twofat, .name-fx-twofat::before, .name-fx-twofat::after { animation: none !important; }
-- .name-fx-twofat { filter: drop-shadow(0 0 3px rgba(255, 47, 214, .9)); }
--}
++html[data-ov-motion=off] .name-fx-twofat{filter: drop-shadow(0 0 3px rgba(255, 47, 214, .9))}
/* Community badges (network.badge.image@1): the reviewed image, a little larger than the text, just before the name. */
.ov-badge { display: inline-block; width: 1.15em; height: 1.15em; margin-right: 3px; vertical-align: -0.2em; border-radius: 3px; object-fit: contain; }
@@@ -392,7 +382,4 @@ html[data-theme-mode="light"] .name-fx-twofat { background-image: linear-gradien
.px-vegas .ov-px-p { color: #ffcf3f; text-shadow: 0 0 4px rgba(255, 61, 127, .75); }
.px-twofat .ov-px-p { color: #ff2fd6; text-shadow: 0 0 4px rgba(61, 224, 255, .8); }
--@media (prefers-reduced-motion: reduce) {
-- .ov-fx[class*="name-fx-"], .ov-hat { animation: none !important; }
-- .ov-px-p { display: none; }
--}
++html[data-ov-motion=off] .ov-px-p{display: none}
ddiff --git a/items.js b/items.js
iindex b59be52..c5a2edd 100644
---- a/items.js
++++ b/items.js
@@@ -72,26 +72,30 @@
}
const slotOf = (slots, kind) => { for (const [key, v] of Object.entries(slots || {})) if (key.split(':')[0] === kind && v) return v; return null; };
-- const calm = () => {
-- const d = root.document && root.document.documentElement;
-- if (d && d.getAttribute && d.getAttribute('data-ov-motion') === 'reduced') return true;
-- return !!(root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches);
++ // How far things move: 1 in full, .35 under Calm, 0 with motion off (<html data-ov-motion>, theme-loader.js).
++ const move = () => {
++ const d = root.document && root.document.documentElement, m = d && d.getAttribute ? d.getAttribute('data-ov-motion') : '';
++ if (m === 'off') return 0;
++ return m === 'reduced' || (!m && root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches) ? 0.35 : 1;
};
-- /** A short burst of characters out of the name (pointer or keyboard focus); never under reduced motion. */
++ /** A short burst of characters out of the name (pointer or keyboard focus): six in full, three a shorter way under
++ * Calm, none with motion off. */
function burst(el) {
-- if (calm() || !el.isConnected || el.dataset.ovPxBusy) return;
++ const k = move();
++ if (!k || !el.isConnected || el.dataset.ovPxBusy) return;
const chars = Array.from(el.dataset.ovPxChars || '').slice(0, 6);
if (!chars.length) return;
el.dataset.ovPxBusy = '1';
-- for (let i = 0; i < 6; i++) {
++ const far = k < 1 ? 0.5 : 1;
++ for (let i = 0; i < (k < 1 ? 3 : 6); i++) {
const p = el.ownerDocument.createElement('span');
p.className = 'ov-px-p';
p.setAttribute('aria-hidden', 'true');
p.textContent = chars[i % chars.length];
const angle = (Math.PI * 2 * i) / 6 + Math.random() * 0.6;
-- p.style.setProperty('--px-dx', `${Math.round(Math.cos(angle) * 22)}px`);
-- p.style.setProperty('--px-dy', `${Math.round(Math.sin(angle) * 16 - 10)}px`);
++ p.style.setProperty('--px-dx', `${Math.round(Math.cos(angle) * 22 * far)}px`);
++ p.style.setProperty('--px-dy', `${Math.round((Math.sin(angle) * 16 - 10) * far)}px`);
p.style.left = `${Math.round(30 + Math.random() * 40)}%`;
el.appendChild(p);
setTimeout(() => p.remove(), 1900);
ddiff --git a/kit-data.css b/kit-data.css
iindex bcce9da..7991133 100644
---- a/kit-data.css
++++ b/kit-data.css
@@@ -173,7 +173,6 @@
.ovk-receipt-facts dt { color: var(--ovk-muted); }
.ovk-receipt-facts dd { display: inline-flex; align-items: center; gap: 6px; margin: 0; font-weight: 700; font-variant-numeric: tabular-nums; }
.ovk-receipt-facts .ovk-meter { width: 56px; height: 6px; }
--@media (prefers-reduced-motion: reduce) { .ovk-drop-zone { transition: none; } }
/* ── The tool frame (4.55.0): kit.tool and its pieces. One order on every tool page: the name and what it does, the
box, the answer and its next step, the family, the folds. The family's tint is only on the icon tile; buttons keep
ddiff --git a/kit-web.js b/kit-web.js
iindex 35b59d2..ed05bd9 100644
---- a/kit-web.js
++++ b/kit-web.js
@@@ -165,7 +165,11 @@
});
// Rails: ‹ › move a page of cards where there is a pointer to click them; each hides at its end.
const fine = typeof matchMedia === 'function' && matchMedia('(hover: hover) and (pointer: fine)').matches;
-- const still = () => (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches) || document.documentElement.getAttribute('data-ov-motion') === 'reduced';
++ // Motion (4.183.0): only Off keeps a strip still. Calm glides, nudges half as far and drifts at half the speed
++ // (<html data-ov-motion>, theme-loader.js; a page without the loader asks the device).
++ const motionAttr = () => document.documentElement.getAttribute('data-ov-motion');
++ const still = () => motionAttr() === 'off';
++ const gentle = () => { const m = motionAttr(); return m === 'reduced' || (!m && typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches) ? 0.5 : 1; };
all('.ovk-rail').forEach((r) => {
if (!once(r, 'ovkRail')) return;
const track = r.querySelector('.ovk-rail-track');
@@@ -223,7 +227,7 @@
if (max <= 4) return;
// A float of its own: a browser rounds scrollLeft, and under a pixel a frame would never move.
if (pos < 0 || Math.abs(pos - track.scrollLeft) > 2) pos = track.scrollLeft;
-- pos = Math.max(0, Math.min(max, pos + dir * dt * 0.028));
++ pos = Math.max(0, Math.min(max, pos + dir * dt * 0.028 * gentle()));
track.scrollLeft = pos;
if (pos >= max - 1) dir = -1; else if (pos <= 0) dir = 1;
raf = requestAnimationFrame(step);
@@@ -236,10 +240,10 @@
const max = track.scrollWidth - track.clientWidth;
if (max <= 4) continue;
if (drift) { last = 0; if (!raf) raf = requestAnimationFrame(step); continue; }
-- // One nudge, phones only (a computer has the ‹ › buttons): 48 px along and back.
++ // One nudge, phones only (a computer has the ‹ › buttons): 48 px along and back (24 under Calm).
if (!nudged && !fine && track.scrollLeft < 4) {
nudged = true;
-- setTimeout(() => { if (touched) return; track.scrollBy({ left: 48, behavior: 'smooth' }); setTimeout(() => { if (!touched) track.scrollBy({ left: -48, behavior: 'smooth' }); }, 420); }, 350);
++ setTimeout(() => { if (touched) return; const far = 48 * gentle(); track.scrollBy({ left: far, behavior: 'smooth' }); setTimeout(() => { if (!touched) track.scrollBy({ left: -far, behavior: 'smooth' }); }, 420); }, 350);
}
}
}, { threshold: [0, 0.6] }).observe(track);
ddiff --git a/kit.css b/kit.css
iindex 50c0f73..2f18c41 100644
---- a/kit.css
++++ b/kit.css
@@@ -63,9 +63,16 @@
:is([data-theme=neon-tokyo], [data-theme=vapor], [data-theme=matrix], [data-theme=hacker], [data-theme=high-contrast], [data-theme=dracula], [data-theme=monokai], [data-theme=abyss]) {
--ov-dur-1: .09s; --ov-dur-2: .15s; --ov-dur-3: .24s; --ov-dur-4: .42s; --ov-ease-spring: cubic-bezier(.3, 1.8, .6, 1);
}
--html[data-ov-motion=reduced] { --ov-dur-1: 0s; --ov-dur-2: 0s; --ov-dur-3: 0s; --ov-dur-4: 0s; }
++/* Motion (4.183.0; the owner, 2026-11-10: "it should still have full motion but actually just reduce it instead of
++ getting rid of it"). Calm keeps every effect and makes it smaller and slower: the calm feel's lengths, no
++ overshoot, and --ov-move, the factor a moving thing multiplies its distance by (calc(12px * var(--ov-move, 1))).
++ Only Off stops motion. theme-loader.js writes data-ov-motion (reduced for Calm, the device's own setting counted
++ in; off; full); the media rule serves a page the loader has not reached. */
++:where(html) { --ov-move: 1; }
++html[data-ov-motion=reduced] { --ov-move: .35; --ov-dur-1: .15s; --ov-dur-2: .25s; --ov-dur-3: .4s; --ov-dur-4: .62s; --ov-ease-spring: var(--ov-ease-out); }
++@media (prefers-reduced-motion: reduce) { html:not([data-ov-motion]) { --ov-move: .35; --ov-ease-spring: var(--ov-ease-out); } }
/* :root:root outranks ov-fx.js's own :root and theme feels, which load later. */
--@media (prefers-reduced-motion: reduce) { :root:root { --ov-dur-1: 0s; --ov-dur-2: 0s; --ov-dur-3: 0s; --ov-dur-4: 0s; } }
++:root:root[data-ov-motion=off] { --ov-move: 0; --ov-dur-1: 0s; --ov-dur-2: 0s; --ov-dur-3: 0s; --ov-dur-4: 0s; }
/* Shape personalities (plan L45: "Paper is quiet and square, Neon glows and bounces"). A quiet look has square corners
* and lies flat, with a hairline where a shadow would be; a loud one is round and its raised things glow in its accent.
* The ids are Network's theme catalog (as ov-fx.js's motion feels); any other look keeps the defaults above. */
@@@ -335,7 +342,6 @@ div.ovk-set-row { cursor: default; }
.ovk-split { grid-template-columns: minmax(0, 1fr) 320px; align-items: start; }
.ovk-split > .ovk-side { position: sticky; top: calc(var(--ovk-top) + 12px); }
}
--@media (prefers-reduced-motion: reduce) { .ovk-switch, .ovk-switch::after, .ovk-fold > summary > .ovk-i, .ovk-head, .ovk-btn { transition: none; } }
@media print { .ovk-head, .ovk-dock, .ovk-save { position: static; background: none; -webkit-backdrop-filter: none; backdrop-filter: none; } }
/* Touch (4.46.0, the fleet tap audit): small buttons are 44px tall on a touch screen, the find bar's go button reaches
@@@ -393,12 +399,11 @@ div.ovk-set-row { cursor: default; }
.ovk-sidebar-foot { padding-top: 8px; border-top: 1px solid var(--ovk-line); }
@media (max-width: 760px) {
.ovk-with-sidebar { grid-template-columns: minmax(0, 1fr); }
-- .ovk-sidebar { position: fixed; z-index: 10060; top: 0; left: 0; bottom: 0; height: auto; width: min(320px, 86vw); padding-top: max(12px, env(safe-area-inset-top, 0px)); padding-bottom: max(10px, env(safe-area-inset-bottom, 0px)); border-right: 0; translate: -100% 0; visibility: hidden; transition: translate .25s ease, visibility 0s linear .25s; box-shadow: 12px 0 32px rgba(0, 0, 0, .25); }
-- .ovk-sidebar.is-open { translate: 0 0; visibility: visible; transition: translate .25s ease; }
++ .ovk-sidebar { position: fixed; z-index: 10060; top: 0; left: 0; bottom: 0; height: auto; width: min(320px, 86vw); padding-top: max(12px, env(safe-area-inset-top, 0px)); padding-bottom: max(10px, env(safe-area-inset-bottom, 0px)); border-right: 0; translate: calc(-100% * var(--ov-move, 1)) 0; opacity: 0; visibility: hidden; transition: translate .25s ease, opacity .2s ease, visibility 0s linear .25s; box-shadow: 12px 0 32px rgba(0, 0, 0, .25); }
++ .ovk-sidebar.is-open { translate: 0 0; opacity: 1; visibility: visible; transition: translate .25s ease, opacity .2s ease; }
.ovk-sidebar-close, .ovk-sidebar-open { display: inline-grid; }
.ovk-sidebar-scrim { position: fixed; inset: 0; z-index: 10050; background: rgba(0, 0, 0, .4); }
}
--@media (prefers-reduced-motion: reduce) { .ovk-sidebar, .ovk-sidebar.is-open { transition: none; } .ovk-sidebar-dot.is-busy { animation: none; } }
/* ── Scroll areas (4.69.0; the owner, 2026-11-01: "you can't scroll down the page even when you're at the bottom of
the chat… this should be consistent across websites"). The network's rule: a scroll area inside a page that scrolls
@@@ -435,16 +440,14 @@ div.ovk-set-row { cursor: default; }
.ovk-skel-dot { flex: none; width: 22px; height: 22px; border-radius: 50%; }
.ovk-skel-stat { display: grid; gap: 6px; padding: 12px; border-radius: var(--ov-radius-2); border: 1px solid var(--border, rgba(255,255,255,.08)); }
.ovk-skel-num { height: 22px; width: 48%; }
--@media (prefers-reduced-motion: reduce) { .ovk-skel { animation: none; } }
--html[data-ov-motion=reduced] .ovk-skel { animation: none; }
/* ── Moving between pages (4.70.0, plan L52) ── A server-rendered site's pages cross-fade while the navbar and the app bar
-- stay put (cross-document view transitions; a browser without them just loads the page). Off under reduced motion. */
++ stay put (cross-document view transitions; a browser without them just loads the page). A cross-fade moves nothing,
++ so Calm keeps it; with motion off the loader gives it no length. */
@view-transition { navigation: auto; }
::view-transition-old(root), ::view-transition-new(root) { animation-duration: .18s; }
#navbar-mount, .openvibe-navbar { view-transition-name: ov-navbar; }
.ovnav-appbar { view-transition-name: ov-appbar; }
--@media (prefers-reduced-motion: reduce) { @view-transition { navigation: none; } }
/* Content labels (L1): quiet chips beside a title, the adult one in the warning colour. They say what a thing carries;
each viewer's own choice (ov-labels.js) decides whether it shows, blurs or hides. */
ddiff --git a/loading.js b/loading.js
iindex 517e4e3..73f9b7f 100644
---- a/loading.js
++++ b/loading.js
@@@ -19,7 +19,7 @@
*
* The element it mounts into should be positioned (relative, absolute or fixed); it fills it. Text is set with
* textContent; the poster must be an https URL, a same-site path or a blob/data image. Motion stops under
-- * prefers-reduced-motion. Works without the rest of the OpenVibe Frame; colours follow the site's theme.
++ * the Motion setting (Calm slows its loops, Off stops them). Works without the rest of the OpenVibe Frame; colours follow the site's theme.
*/
(function (root) {
'use strict';
@@@ -86,7 +86,7 @@
@keyframes ovld-drift { from { transform: scale(1.06) translate3d(-1.5%, -1%, 0); } to { transform: scale(1.14) translate3d(1.5%, 1%, 0); } }
@keyframes ovld-sweep { from { left: -30%; } to { left: 100%; } }
@keyframes ovld-shimmer { from { background-position: 100% 0; } to { background-position: 0 0; } }
--@media (prefers-reduced-motion: reduce) { .ovld-poster, .ovld-ring, .ovld-ring .og, .ovld-ring .vg, .ovld-line i, .ovld-skel-mark, .ovld-skel-line { animation: none !important; } }`;
++`;
function styles() {
if (typeof document === 'undefined' || document.getElementById('openvibe-loading-styles')) return;
@@@ -97,7 +97,8 @@
}
const posterUrl = (u) => { const s = String(u || ''); if (/^(blob:|data:image\/)/.test(s)) return s; try { const x = new URL(s, location.href); return x.protocol === 'https:' || x.origin === location.origin ? x.href : null; } catch { return null; } };
const el = (tag, cls, text) => { const e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; };
-- const reduced = () => typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduced = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
function mount(host, opts = {}) {
styles();
ddiff --git a/messages.css b/messages.css
iindex 5ab3164..aa21504 100644
---- a/messages.css
++++ b/messages.css
@@@ -49,4 +49,3 @@
@keyframes ovm-in { from { opacity: 0; transform: translateY(8px) scale(.97); } }
@keyframes ovm-fade { from { opacity: 0; } }
html[data-ov-motion=reduced] .ovm-group:last-child { animation-name: ovm-fade; }
--@media (prefers-reduced-motion: reduce) { .ovm-group:last-child { animation-name: ovm-fade; animation-duration: .15s; } }
ddiff --git a/motion.js b/motion.js
iindex 9c77b61..688132a 100644
---- a/motion.js
++++ b/motion.js
@@@ -1,8 +1,10 @@
/**
* openvibe-shared/motion.js — the network's motion, small and opt-in (plan 2026-10-28 §3.11): a page marks what moves and
* this makes it move, once, when it is seen. The server always renders the finished state (the real number, the whole
-- * scene, the plain placeholder), so a page is complete without this file, under reduced motion (the OS setting or the
-- * account's, html[data-ov-motion=reduced]) and for crawlers.
++ * scene, the plain placeholder), so a page is complete without this file, with motion off (html[data-ov-motion=off])
++ * and for crawlers. Calm (html[data-ov-motion=reduced]: the person's choice, or the device asking for less motion)
++ * plays all of it, gentler: a reveal rises a third as far, a number counts up quicker, the ghost cursor glides slower
++ * and waits longer.
*
* [data-ov-reveal] fades and rises in the first time it scrolls into view (html.ov-motion hides it until then)
* [data-ov-ticker="1204"] counts up to its number when seen (the text the server wrote is the end state)
@@@ -21,7 +23,9 @@
'use strict';
if (typeof document === 'undefined') return;
const html = document.documentElement;
-- const still = () => (typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches) || html.getAttribute('data-ov-motion') === 'reduced';
++ // 'full' | 'calm' | 'off': <html data-ov-motion> is the signal (theme-loader.js); without the loader, ask the device.
++ const motion = () => { const m = html.getAttribute('data-ov-motion'); return m === 'off' ? 'off' : m === 'reduced' || (!m && typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches) ? 'calm' : 'full'; };
++ const still = () => motion() === 'off';
const seen = typeof IntersectionObserver === 'function'
? (el, fn, margin) => { const io = new IntersectionObserver((es) => es.forEach((e) => { if (e.isIntersecting) { io.unobserve(e.target); fn(e.target); } }), { rootMargin: margin || '0px 0px -8% 0px' }); io.observe(el); }
: (el, fn) => fn(el);
@@@ -30,7 +34,7 @@
const end = Number(el.getAttribute('data-ov-ticker'));
const text = el.textContent;
if (!Number.isFinite(end) || end <= 0 || still()) return;
-- const t0 = performance.now(), dur = Math.min(1400, 500 + Math.log10(end + 1) * 220);
++ const t0 = performance.now(), dur = Math.min(1400, 500 + Math.log10(end + 1) * 220) * (motion() === 'calm' ? 0.6 : 1);
const step = (t) => {
const k = Math.min(1, (t - t0) / dur), e = 1 - Math.pow(1 - k, 3);
el.textContent = k < 1 ? Math.round(end * e).toLocaleString('en-US') : text;
@@@ -63,6 +67,7 @@
.ov-ghost-host{position:relative}
.ov-ghost{position:absolute;left:0;top:0;z-index:5;width:22px;height:22px;pointer-events:none;opacity:0;transition:transform .55s cubic-bezier(.3,.8,.3,1),opacity .3s ease;filter:drop-shadow(0 2px 4px rgba(0,0,0,.35))}
.ov-ghost.is-on{opacity:1}
++html[data-ov-motion=reduced] .ov-ghost{transition-duration:.9s,.3s}
.ov-ghost svg{display:block;width:22px;height:22px}
.ov-ghost-ring{position:absolute;left:-9px;top:-9px;width:18px;height:18px;border-radius:50%;border:2px solid var(--room-accent,var(--accent,#3b82f6));opacity:0}
.ov-ghost.is-click .ov-ghost-ring{animation:ovGhostRing .5s ease-out}
@@@ -82,6 +87,7 @@
cur.innerHTML = GHOST_SVG;
scene.appendChild(cur);
let i = 0, timer = 0, visible = false, gone = false;
++ const slow = () => (motion() === 'calm' ? 1.5 : 1);
const mark = (el) => { steps.forEach((x) => x.removeAttribute('data-ov-ghost-on')); if (el) el.setAttribute('data-ov-ghost-on', ''); };
const place = (el) => {
const a = scene.getBoundingClientRect(), b = el.getBoundingClientRect();
@@@ -99,8 +105,8 @@
cur.classList.remove('is-click'); void cur.offsetWidth; cur.classList.add('is-click');
mark(el);
i = (i + 1) % steps.length;
-- timer = setTimeout(step, i === 0 ? 2600 : 1300);
-- }, 650);
++ timer = setTimeout(step, (i === 0 ? 2600 : 1300) * slow());
++ }, 650 * slow());
};
const stop = () => {
if (gone) return;
ddiff --git a/nav-icons.js b/nav-icons.js
iindex 54e92e98..3d344a2 100644
---- a/nav-icons.js
++++ b/nav-icons.js
@@@ -48,7 +48,7 @@
'fa-xmark': [0, '<path d="M5.4 5.4l13.2 13.2M18.6 5.4 5.4 18.6"/>', ''],
'fa-magnifying-glass': [0, '<circle cx="11" cy="11" r="6.5"/><path d="m20 20-4.2-4.2"/>', '<path fill-rule="evenodd" d="M11 3.4a7.6 7.6 0 1 1 0 15.2 7.6 7.6 0 0 1 0-15.2Zm0 3.1a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9Z"/><path class="ln" d="m16.6 16.6 3.8 3.8"/>'],
'fa-gear': [0, '<circle cx="12" cy="12" r="2.4"/><path d="M17.85 14.4a1.35 1.35 0 0 0 0.25 1.6l0.1 0.1a1.6 1.6 0 1 1 -2.5 2.5l-0.1 -0.1a1.35 1.35 0 0 0 -1.6 -0.25 1.35 1.35 0 0 0 -0.9 1.35V19.1a1.6 1.6 0 1 1 -3.6 0v-0.1a1.35 1.35 0 0 0 -1 -1.35 1.35 1.35 0 0 0 -1.6 0.25l-0.1 0.1a1.6 1.6 0 1 1 -2.5 -2.5l0.1 -0.1a1.35 1.35 0 0 0 0.25 -1.6 1.35 1.35 0 0 0 -1.35 -0.9H4.95a1.6 1.6 0 1 1 0 -3.6h0.1a1.35 1.35 0 0 0 1.35 -1 1.35 1.35 0 0 0 -0.25 -1.6l-0.1 -0.1a1.6 1.6 0 1 1 2.5 -2.5l0.1 0.1a1.35 1.35 0 0 0 1.6 0.25H9.65a1.35 1.35 0 0 0 0.9 -1.35V4.95a1.6 1.6 0 1 1 3.6 0v0.1a1.35 1.35 0 0 0 0.9 1.35 1.35 1.35 0 0 0 1.6 -0.25l0.1 -0.1a1.6 1.6 0 1 1 2.5 2.5l-0.1 0.1a1.35 1.35 0 0 0 -0.25 1.6V9.65a1.35 1.35 0 0 0 1.35 0.9H19.1a1.6 1.6 0 1 1 0 3.6h-0.1a1.35 1.35 0 0 0 -1.35 0.9Z"/>', '<path fill-rule="evenodd" d="M18.5 14.65a1.5 1.5 0 0 0 0.3 1.8l0.1 0.1a1.75 1.75 0 1 1 -2.8 2.8l-0.1 -0.1a1.5 1.5 0 0 0 -1.8 -0.3 1.5 1.5 0 0 0 -1 1.5V19.9a1.75 1.75 0 1 1 -4 0v-0.1a1.5 1.5 0 0 0 -1.1 -1.5 1.5 1.5 0 0 0 -1.8 0.3l-0.1 0.1a1.75 1.75 0 1 1 -2.8 -2.8l0.1 -0.1a1.5 1.5 0 0 0 0.3 -1.8 1.5 1.5 0 0 0 -1.5 -1H4.15a1.75 1.75 0 1 1 0 -4h0.1a1.5 1.5 0 0 0 1.5 -1.1 1.5 1.5 0 0 0 -0.3 -1.8l-0.1 -0.1a1.75 1.75 0 1 1 2.8 -2.8l0.1 0.1a1.5 1.5 0 0 0 1.8 0.3H9.4a1.5 1.5 0 0 0 1 -1.5V4.15a1.75 1.75 0 1 1 4 0v0.1a1.5 1.5 0 0 0 1 1.5 1.5 1.5 0 0 0 1.8 -0.3l0.1 -0.1a1.75 1.75 0 1 1 2.8 2.8l-0.1 0.1a1.5 1.5 0 0 0 -0.3 1.8V9.4a1.5 1.5 0 0 0 1.5 1H19.9a1.75 1.75 0 1 1 0 4h-0.1a1.5 1.5 0 0 0 -1.5 1ZM12 9.05a3 3 0 1 0 0 6.8 3 3 0 0 0 0 -6.8Z"/>'],
-- 'fa-circle-half-stroke': [0, '<circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/>', ''],
++ 'fa-circle-half-stroke': [0, '<circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/>', '<path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 2.2a7.4 7.4 0 0 1 0 14.8Z"/>'],
'fa-moon': [0, '<path d="M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5Z"/>', '<path d="M20.4 14.4A8.5 8.5 0 1 1 9.6 3.6a7 7 0 0 0 10.8 10.8Z"/>'],
'fa-sun': [0, '<circle cx="12" cy="12" r="3.8"/><path d="M12 2.5v2M12 19.6v2M5.25 5.25l1.4 1.4M17.4 17.4l1.4 1.4M2.5 12h2M19.6 12h2M5.25 18.75l1.4 -1.4M17.4 6.6l1.4 -1.4"/>', '<circle cx="12" cy="12" r="4.6"/><path class="ln" d="M12 2.2v1.6M12 20.2v1.6M5 5l1.1 1.1M17.9 17.9 19 19M2.2 12h1.6M20.2 12h1.6M5 19l1.1-1.1M17.9 6.1 19 5"/>'],
'fa-file-pdf': [0, '<path d="M6 3h8l4 4v14H6Z"/><path d="M14 3v4h4"/>', '<path d="M6 2.6h7.6v5.2h5V21.4H6ZM15.2 2.9l3.1 3.3h-3.1Z"/>'],
@@@ -68,7 +68,7 @@
'fa-photo-film': [0, '<rect x="3" y="4" width="18" height="16" rx="2"/><path d="M7.5 4v16M16.5 4v16M3 9h4.5M3 15h4.5M16.5 9H21M16.5 15H21"/>', '<path fill-rule="evenodd" d="M5 3.8h14a2.2 2.2 0 0 1 2.2 2.2v12a2.2 2.2 0 0 1-2.2 2.2H5A2.2 2.2 0 0 1 2.8 18V6A2.2 2.2 0 0 1 5 3.8Zm3.7 1.9v12.6h6.6V5.7ZM4.6 6.2v1.9h2V6.2Zm0 4.9v1.8h2v-1.8Zm0 4.8v1.9h2v-1.9Zm12.8-9.7v1.9h2V6.2Zm0 4.9v1.8h2v-1.8Zm0 4.8v1.9h2v-1.9Z"/>'],
'fa-tower-cell': [0, '<circle cx="12" cy="12" r="2.15"/><path d="M8.4 8.4a5.15 5.15 0 0 0 0 7.55M15.6 8.4a5.15 5.15 0 0 1 0 7.55M6 6a8.55 8.55 0 0 0 0 12.6M18 6a8.55 8.55 0 0 1 0 12.6"/>', '<circle cx="12" cy="12" r="3.1"/><path class="ln" d="M7.8 7.8a6 6 0 0 0 0 8.4M16.2 7.8a6 6 0 0 1 0 8.4M5 5a10 10 0 0 0 0 14M19 5a10 10 0 0 1 0 14"/>'],
'fa-diagram-project': [0, '<circle cx="12" cy="5" r="2.2"/><circle cx="5.5" cy="18" r="2.2"/><circle cx="18.5" cy="18" r="2.2"/><path d="M11 7 6.5 16M13 7l4.5 9M7.7 18h8.6"/>', '<circle cx="12" cy="5" r="3"/><circle cx="5.5" cy="18" r="3"/><circle cx="18.5" cy="18" r="3"/><path class="ln" d="M10.9 7.4 6.7 15.4M13.1 7.4l4.2 8M8.4 18h7.2"/>'],
-- 'fa-toolbox': [0, '<rect x="3" y="8" width="18" height="12" rx="2"/><path d="M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3"/>', ''],
++ 'fa-toolbox': [0, '<rect x="3" y="8" width="18" height="12" rx="2"/><path d="M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3"/>', '<path d="M2.4 10a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.3H2.4ZM2.4 13.7h4.8v1.5h1.6v-1.5h6.4v1.5h1.6v-1.5h4.8V18a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18Z"/><path class="ln" d="M9 7.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v1.9"/>'],
'fa-comment-dots': [0, '<path d="M4 5h16v11H8l-4 4Z"/>', '<path d="M3.5 5.6A1.6 1.6 0 0 1 5.1 4h13.8a1.6 1.6 0 0 1 1.6 1.6v9.8a1.6 1.6 0 0 1-1.6 1.6H8.6L3.5 21Z"/>'],
'fa-money-bill-wave': [0, '<rect x="2.5" y="6" width="19" height="12" rx="2"/><circle cx="12" cy="12" r="2.5"/><path d="M6 9.5v.01M18 14.5v.01"/>', '<path fill-rule="evenodd" d="M4.4 5.4h15.2a2.2 2.2 0 0 1 2.2 2.2v8.8a2.2 2.2 0 0 1-2.2 2.2H4.4a2.2 2.2 0 0 1-2.2-2.2V7.6a2.2 2.2 0 0 1 2.2-2.2ZM12 8.7a3.3 3.3 0 1 0 0 6.6 3.3 3.3 0 0 0 0-6.6ZM6 8.5a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Zm12 4.8a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Z"/><circle cx="12" cy="12" r="1.5"/>'],
'fa-crown': [0, '<path d="M3 8.5 7.5 12.5 12 5.5l4.5 7 4.5-4L19 19H5Z"/>', '<path d="M2.6 7.8 7.4 12 12 4.6 16.6 12l4.8-4.2-2 11.7H4.6Z"/>'],
@@@ -101,7 +101,7 @@
'fa-pen': [0, '<path d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"/>', '<path d="M16.3 3.2a2.3 2.3 0 0 1 3.3 3.3L7.4 18.7l-4.6 1.2 1.2-4.6Z"/><path class="ln" d="M12.6 20.3H21"/>'],
'fa-earth-americas': [0, '<circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3c3 3 3 15 0 18M12 3c-3 3-3 15 0 18"/>', '<path d="M2.84 11.1A9.2 9.2 0 0 1 12 2.8a4.4 9.2 0 0 0-4.38 8.3ZM21.16 11.1A9.2 9.2 0 0 0 12 2.8a4.4 9.2 0 0 1 4.38 8.3ZM2.84 12.9A9.2 9.2 0 0 0 12 21.2a4.4 9.2 0 0 1-4.38-8.3ZM21.16 12.9A9.2 9.2 0 0 1 12 21.2a4.4 9.2 0 0 0 4.38-8.3ZM12 2.8a2.6 9.2 0 0 0-2.59 8.3h5.18A2.6 9.2 0 0 0 12 2.8ZM12 21.2a2.6 9.2 0 0 1-2.59-8.3h5.18A2.6 9.2 0 0 1 12 21.2Z"/>'],
'fa-hashtag': [0, '<path d="M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17"/>', ''],
-- 'fa-inbox': [0, '<path d="M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5"/>', ''],
++ 'fa-inbox': [0, '<path d="M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5"/>', '<path fill-rule="evenodd" d="M2.4 13.4 5 4.4h14l2.6 9V19a1.6 1.6 0 0 1-1.6 1.6H4A1.6 1.6 0 0 1 2.4 19ZM6.2 6.4 4.4 12.5h3.9l1.5 2.5h4.4l1.5-2.5h3.9L17.8 6.4Z"/>'],
'fa-folder': [0, '<path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"/>', '<path d="M2.8 6.8a2 2 0 0 1 2-2h4.4l2 2h8a2 2 0 0 1 2 2v8.6a2 2 0 0 1-2 2H4.8a2 2 0 0 1-2-2Z"/>'],
'fa-puzzle-piece': [0, '<path d="M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z"/>', '<path d="M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z"/>'],
'fa-shield': [0, '<path d="M12 3 5 6v6c0 4.4 3 7.6 7 9 4-1.4 7-4.6 7-9V6Z"/>', '<path d="M12 2.6 4.6 5.8V12c0 4.6 3.1 8 7.4 9.5 4.3-1.5 7.4-4.9 7.4-9.5V5.8Z"/>'],
@@@ -109,9 +109,9 @@
'fa-microphone': [0, '<rect x="9" y="3" width="6" height="11" rx="3"/><path d="M5 11a7 7 0 0 0 14 0M12 18v3"/>', '<path d="M8.7 5.8a3.3 3.3 0 0 1 6.6 0V11a3.3 3.3 0 0 1-6.6 0Z"/><path class="ln" d="M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21"/>'],
'fa-infinity': [0, '<path d="M12 12c-2-2.7-3.7-4-5.5-4a4 4 0 0 0 0 8c1.8 0 3.5-1.3 5.5-4Zm0 0c2 2.7 3.7 4 5.5 4a4 4 0 0 0 0-8c-1.8 0-3.5 1.3-5.5 4Z"/>', ''],
'fa-list': [0, '<path d="M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01"/>', ''],
-- 'fa-flag-checkered': [0, '<path d="M5 21V3.5"/><rect x="5" y="4" width="14.5" height="9" rx="1"/><path d="M5 8.5h14.5M9.8 4v9M14.6 4v9"/>', ''],
++ 'fa-flag-checkered': [0, '<path d="M5 21V3.5"/><rect x="5" y="4" width="14.5" height="9" rx="1"/><path d="M5 8.5h14.5M9.8 4v9M14.6 4v9"/>', '<path d="M5.6 3.6h4.2v4.9H5.6ZM14.6 3.6h4.3a1 1 0 0 1 1 1v3.9h-5.3ZM9.8 8.5h4.8v4.9H9.8Z"/><path class="ln" d="M5 21V3.5"/>'],
'fa-tv': [0, '<rect x="2.5" y="7" width="19" height="13" rx="2"/><path d="m8 3 4 4 4-4"/>', '<rect x="2.2" y="6.6" width="19.6" height="14" rx="2.4"/><path class="ln" d="m8 2.8 4 3.6 4-3.6"/>'],
-- 'fa-compass': [0, '<circle cx="12" cy="12" r="8.5"/><path d="m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z"/>', ''],
++ 'fa-compass': [0, '<circle cx="12" cy="12" r="8.5"/><path d="m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z"/>', '<path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.4 7.6 13.9 13.9 7.6 16.4 10.1 10.1Z"/>'],
};
if (typeof module !== 'undefined' && module.exports) module.exports = NAV_ICONS;
ddiff --git a/nav-slots.js b/nav-slots.js
iindex 86d49d3..b09fae2 100644
---- a/nav-slots.js
++++ b/nav-slots.js
@@@ -15,7 +15,6 @@
.openvibe-navbar .ovnav-slot b:empty { display: none; }
.openvibe-navbar .ovnav-lead { margin-left: -6px; animation: ovnav-slot-in .22s cubic-bezier(.2, .9, .3, 1) both; }
@keyframes ovnav-slot-in { from { opacity: 0; transform: translateX(-6px); } }
--@media (prefers-reduced-motion: reduce) { .openvibe-navbar .ovnav-lead { animation: none; } }
@media (max-width: 400px) { .openvibe-navbar .ovnav-slot { width: 32px; height: 32px; } }
@media (min-width: 761px) { .openvibe-navbar .ovnav-slot.ovnav-phone-only { display: none; } }`;
const SLOT_ICONS = {
ddiff --git a/navbar.js b/navbar.js
iindex 9b57111..575586d 100644
---- a/navbar.js
++++ b/navbar.js
@@@ -46,7 +46,7 @@
.ovrt-bar::after { content: ''; position: absolute; right: 0; top: -2px; width: 90px; height: 7px; border-radius: 50%; background: var(--accent-light, #93c5fd); filter: blur(4px); opacity: .9; }
.ovrt-bar.is-run { opacity: 1; transform: scaleX(.88); transition: transform 3s cubic-bezier(.08, .7, .2, 1), opacity .1s; }
.ovrt-bar.is-done { opacity: 0; transform: scaleX(1); transition: transform .2s ease, opacity .35s .15s; }
-- @media (prefers-reduced-motion: reduce) { .ovrt-bar.is-run, .ovrt-bar.is-done { transition: none; } .ovrt-bar::after { display: none; } }
++ html[data-ov-motion=off] .ovrt-bar::after{display: none}
.openvibe-navbar::before { content: ""; position: absolute; inset: 0 0 -28px; pointer-events: none; z-index: -1; opacity: 0; transition: opacity .45s cubic-bezier(.2,.7,.2,1); background: linear-gradient(180deg, rgba(4,7,14,.62), rgba(4,7,14,.28) 55%, rgba(4,7,14,0)); }
.openvibe-navbar:not(.ovnav-top) { background-color: color-mix(in srgb, var(--bg-secondary, #252530) 84%, transparent); -webkit-backdrop-filter: saturate(1.5) blur(16px); backdrop-filter: saturate(1.5) blur(16px); box-shadow: 0 12px 32px -14px rgba(0,0,0,.6); }
.openvibe-navbar.ovnav-top { background-color: transparent; border-bottom-color: transparent; box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; }
@@@ -55,7 +55,6 @@
body.ov-nav-overlay .openvibe-navbar.ovnav-top::before { opacity: 1; }
body.ov-nav-overlay > #navbar-mount, body.ov-nav-overlay > .openvibe-navbar { margin-bottom: calc(-1 * var(--ovnav-real-h, 52px)); }
body.ov-panel-open .openvibe-navbar.ovnav-top { background-color: var(--bg-secondary, #252530); border-bottom-color: var(--border, #333340); }
-- @media (prefers-reduced-motion: reduce) { .openvibe-navbar, .openvibe-navbar::before { transition: none; } }
/* Names: the brand face (ov-brand.woff2: Nunito, Latin, 700-900). */
@font-face { font-family: 'OV Brand'; src: url(${siblingV('ov-brand.woff2')}) format('woff2'); font-weight: 700 900; font-style: normal; font-display: swap; unicode-range: U+0020-007E, U+00A0, U+00B7, U+00E9, U+2013-2014, U+2018-2019, U+201C-201D, U+2026; }
.openvibe-navbar-brand { display: flex; align-items: center; gap: 9px; text-decoration: none; color: inherit; margin-right: 8px; min-width: 0; }
@@@ -317,8 +316,6 @@
.ovnav-orb[aria-expanded="true"] :is(.ovo-r0, .ovo-r2) { fill: var(--ovo-a); opacity: 1; }
@keyframes ovo-ripple { 0%, 100% { transform: scale(1); } 45% { transform: scale(1.55); } }
@keyframes ovo-wave { 0%, 100% { transform: scale(.7); opacity: .5; } 50% { transform: scale(1.25); opacity: 1; } }
-- @media (prefers-reduced-motion: reduce) { .ovnav-orb .ovo-g, .ovnav-orb .ovo-d, .ovnav-orb::before { transition: none; animation: none !important; } }
-- html[data-ov-motion="reduced"] .ovnav-orb .ovo-d { animation: none !important; }
.openvibe-navbar .openvibe-navbar-brand .ovnav-orb { margin-left: 1px; }
/* 4.148.0 (the owner: "replace the hamburger with that button"): the phone's menu button is the orb, in the
burger's place at the bar's right. Hidden on a wide bar (its links are there), shown at 860 px and below;
@@@ -404,8 +401,8 @@
@keyframes ov-pop-out { to { opacity: 0; transform: scale(.94); filter: blur(3px); } }
@keyframes ov-fade { from { opacity: 0; } }
@keyframes ov-pop-calm { from { opacity: 0; transform: scale(.97); } }
-- @media (prefers-reduced-motion: reduce) { .ov-pop { animation-name: ov-pop-calm !important; animation-duration: .18s !important; } .ov-pop-out { animation-name: ov-fade !important; animation-duration: .12s !important; animation-direction: reverse !important; } }
html[data-ov-motion=reduced] .ov-pop { animation-name: ov-pop-calm !important; animation-duration: .18s !important; }
++ html[data-ov-motion=reduced] .ov-pop-out { animation-name: ov-fade !important; animation-duration: .12s !important; animation-direction: reverse !important; }
.openvibe-navbar-dropdown-header {
padding: 12px 10px 12px 14px; border-bottom: 1px solid var(--border, #333340);
@@@ -530,9 +527,7 @@
:where(.openvibe-navbar, .openvibe-navbar-dropdown, .ovnav-drawer) :where(a, button, [role="button"], [tabindex]:not([tabindex="-1"])):focus-visible {
outline: 2px solid var(--accent-light, var(--accent, #3b82f6)); outline-offset: 2px;
}
-- @media (prefers-reduced-motion: reduce) {
-- :where(.openvibe-navbar, .openvibe-navbar-dropdown, .ovnav-drawer) :where(a, button, [role="button"]):not(:disabled):active { scale: none; opacity: .82; }
-- }
++ html[data-ov-motion=off] :where(.openvibe-navbar, .openvibe-navbar-dropdown, .ovnav-drawer) :where(a, button, [role="button"]):not(:disabled):active{scale: none;opacity: .82}
`;
document.head.appendChild(s);
}
@@@ -559,7 +554,7 @@
'fa-wallet': [0, '<path d="M4 7.5A2.5 2.5 0 0 1 6.5 5H18v4M4 7.5V18a2 2 0 0 0 2 2h14V9H6.5A2.5 2.5 0 0 1 4 7.5Z"/><path d="M16 14.5h.01"/>', '<path fill-rule="evenodd" d="M6.5 4.6H18v4h1.4a.8.8 0 0 1 .8.8v10.8H6a2.2 2.2 0 0 1-2.2-2.2V7.3a2.7 2.7 0 0 1 2.7-2.7Zm0 1.8a.9.9 0 0 0 0 1.8h9.7V6.4ZM16 13.3a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z"/>'],
'fa-chevron-down': [0, '<path d="m6.6 9.9 6.6 6.6 6.6 -6.6"/>', ''],
'fa-gear': [0, '<circle cx="12" cy="12" r="2.4"/><path d="M17.85 14.4a1.35 1.35 0 0 0 0.25 1.6l0.1 0.1a1.6 1.6 0 1 1 -2.5 2.5l-0.1 -0.1a1.35 1.35 0 0 0 -1.6 -0.25 1.35 1.35 0 0 0 -0.9 1.35V19.1a1.6 1.6 0 1 1 -3.6 0v-0.1a1.35 1.35 0 0 0 -1 -1.35 1.35 1.35 0 0 0 -1.6 0.25l-0.1 0.1a1.6 1.6 0 1 1 -2.5 -2.5l0.1 -0.1a1.35 1.35 0 0 0 0.25 -1.6 1.35 1.35 0 0 0 -1.35 -0.9H4.95a1.6 1.6 0 1 1 0 -3.6h0.1a1.35 1.35 0 0 0 1.35 -1 1.35 1.35 0 0 0 -0.25 -1.6l-0.1 -0.1a1.6 1.6 0 1 1 2.5 -2.5l0.1 0.1a1.35 1.35 0 0 0 1.6 0.25H9.65a1.35 1.35 0 0 0 0.9 -1.35V4.95a1.6 1.6 0 1 1 3.6 0v0.1a1.35 1.35 0 0 0 0.9 1.35 1.35 1.35 0 0 0 1.6 -0.25l0.1 -0.1a1.6 1.6 0 1 1 2.5 2.5l-0.1 0.1a1.35 1.35 0 0 0 -0.25 1.6V9.65a1.35 1.35 0 0 0 1.35 0.9H19.1a1.6 1.6 0 1 1 0 3.6h-0.1a1.35 1.35 0 0 0 -1.35 0.9Z"/>', '<path fill-rule="evenodd" d="M18.5 14.65a1.5 1.5 0 0 0 0.3 1.8l0.1 0.1a1.75 1.75 0 1 1 -2.8 2.8l-0.1 -0.1a1.5 1.5 0 0 0 -1.8 -0.3 1.5 1.5 0 0 0 -1 1.5V19.9a1.75 1.75 0 1 1 -4 0v-0.1a1.5 1.5 0 0 0 -1.1 -1.5 1.5 1.5 0 0 0 -1.8 0.3l-0.1 0.1a1.75 1.75 0 1 1 -2.8 -2.8l0.1 -0.1a1.5 1.5 0 0 0 0.3 -1.8 1.5 1.5 0 0 0 -1.5 -1H4.15a1.75 1.75 0 1 1 0 -4h0.1a1.5 1.5 0 0 0 1.5 -1.1 1.5 1.5 0 0 0 -0.3 -1.8l-0.1 -0.1a1.75 1.75 0 1 1 2.8 -2.8l0.1 0.1a1.5 1.5 0 0 0 1.8 0.3H9.4a1.5 1.5 0 0 0 1 -1.5V4.15a1.75 1.75 0 1 1 4 0v0.1a1.5 1.5 0 0 0 1 1.5 1.5 1.5 0 0 0 1.8 -0.3l0.1 -0.1a1.75 1.75 0 1 1 2.8 2.8l-0.1 0.1a1.5 1.5 0 0 0 -0.3 1.8V9.4a1.5 1.5 0 0 0 1.5 1H19.9a1.75 1.75 0 1 1 0 4h-0.1a1.5 1.5 0 0 0 -1.5 1ZM12 9.05a3 3 0 1 0 0 6.8 3 3 0 0 0 0 -6.8Z"/>'],
-- 'fa-circle-half-stroke': [0, '<circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/>', ''],
++ 'fa-circle-half-stroke': [0, '<circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/>', '<path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 2.2a7.4 7.4 0 0 1 0 14.8Z"/>'],
'fa-moon': [0, '<path d="M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5Z"/>', '<path d="M20.4 14.4A8.5 8.5 0 1 1 9.6 3.6a7 7 0 0 0 10.8 10.8Z"/>'],
'fa-sun': [0, '<circle cx="12" cy="12" r="3.8"/><path d="M12 2.5v2M12 19.6v2M5.25 5.25l1.4 1.4M17.4 17.4l1.4 1.4M2.5 12h2M19.6 12h2M5.25 18.75l1.4 -1.4M17.4 6.6l1.4 -1.4"/>', '<circle cx="12" cy="12" r="4.6"/><path class="ln" d="M12 2.2v1.6M12 20.2v1.6M5 5l1.1 1.1M17.9 17.9 19 19M2.2 12h1.6M20.2 12h1.6M5 19l1.1-1.1M17.9 6.1 19 5"/>'],
'fa-comment-dots': [0, '<path d="M4 5h16v11H8l-4 4Z"/>', '<path d="M3.5 5.6A1.6 1.6 0 0 1 5.1 4h13.8a1.6 1.6 0 0 1 1.6 1.6v9.8a1.6 1.6 0 0 1-1.6 1.6H8.6L3.5 21Z"/>'],
@@@ -569,10 +564,10 @@
const NAV_ICONS_LAZY = {
0: 'fa-book fa-camera fa-comments fa-gamepad fa-gauge-high fa-hand-fist fa-house fa-link fa-list-check fa-network-wired fa-paste fa-people-arrows fa-scissors fa-screwdriver-wrench fa-shirt fa-text-height fa-user fa-video fa-wand-magic-sparkles fa-arrow-up-right-from-square fa-chevron-right fa-bars fa-xmark fa-magnifying-glass fa-file-pdf fa-arrow-down fa-arrow-right fa-clock fa-envelope fa-star fa-heart fa-play fa-circle-info fa-triangle-exclamation fa-check fa-globe fa-code fa-robot fa-photo-film fa-tower-cell fa-diagram-project fa-toolbox fa-money-bill-wave fa-crown fa-server fa-newspaper fa-tag fa-ticket fa-chart-line fa-pen-nib fa-key fa-plug fa-bolt fa-satellite-dish fa-microchip fa-circle-nodes fa-download fa-upload fa-image fa-music fa-file-lines fa-font fa-location-dot fa-lock fa-wave-square fa-map fa-utensils fa-user-shield fa-gauge fa-pen fa-earth-americas fa-hashtag fa-inbox fa-folder fa-puzzle-piece fa-shield fa-display fa-microphone fa-infinity fa-list fa-flag-checkered fa-tv fa-compass',
};
-- const NAV_ICONS_REV = '1091daee9c7e'; // sha256(nav-icons.js), first 12 hex: its ?v= (cacheable forever)
++ const NAV_ICONS_REV = '148a0eda9ca8'; // sha256(nav-icons.js), first 12 hex: its ?v= (cacheable forever)
// END generated
// The files loaded from beside this one, by content (scripts/sibling-revs.js): a release changes their URLs.
-- const SIBLING_REV = { 'ov-mark.js': 'ced6e6ecf191', 'ov-glyphs.js': '6f8c8dd2a10d', 'ov-brand.woff2': '3b4e6a8a5878', 'ov-look.js': '2d3a47d3535c', 'ov-fx.js': 'f0dc83b9c816', 'ov-labels.js': 'a30b178391f5', 'ov-forms.js': '20f4ef41d127', 'ov-forms.css': '98cf0f28bb68', 'ov-share.js': '44a863d7a267', 'ov-share.css': '45b92b654148', 'search.js': 'bbae7542436f', 'dock.js': '67101584eb54', 'presence.js': '1b675c37d888', 'panels.js': 'd90bfe987d81', 'surfaces.js': 'e72f5a304f2d', 'notification-ui.js': 'e06f1388b696', 'history.js': '1e6598f78ba4', 'site-switcher.js': '292bea111aa8', 'appbar.js': '1edf7532f228', 'release-watch.js': '25f02a3f0684', 'ov-icons.js': 'ba3981246bc0', 'sso-client.js': '52439265b980', 'overlay.js': 'd18308ab8a63', 'ov-home.js': '631efe800b13', 'nav-slots.js': 'a5af310d62e0', 'ov-wallet.js': '5c4d7fdb448d', 'ov-wallet.css': 'e46f653fa59e' };
++ const SIBLING_REV = { 'ov-mark.js': '8cc78bde2190', 'ov-glyphs.js': '97224763226b', 'ov-brand.woff2': '3b4e6a8a5878', 'ov-look.js': '7ef00feeb07c', 'ov-fx.js': 'bb5afd571c72', 'ov-labels.js': 'd40f7ca14bc4', 'ov-forms.js': '2eb9e2604c3e', 'ov-forms.css': '06208fe89eac', 'ov-share.js': 'd419508a797e', 'ov-share.css': 'd609a71f611a', 'search.js': 'b170f6e994fa', 'dock.js': 'd45d3e6e7c39', 'presence.js': '5f195d41f8c5', 'panels.js': 'd90bfe987d81', 'surfaces.js': 'e72f5a304f2d', 'notification-ui.js': 'dc24929109b5', 'history.js': '1e6598f78ba4', 'site-switcher.js': 'd8980cf95157', 'appbar.js': '4e34b7d60372', 'release-watch.js': '25f02a3f0684', 'ov-icons.js': '8e5047755456', 'sso-client.js': '52439265b980', 'overlay.js': '336b30eae325', 'ov-home.js': '093d5979ae12', 'nav-slots.js': '1db19edaeac4', 'ov-wallet.js': '5c4d7fdb448d', 'ov-wallet.css': 'e46f653fa59e' };
// The navbar's icons are filled paths (no Font Awesome CSS needed): the ones above ship here, the rest
// (nav-icons.js) load after first paint when a link, chip or menu row names one, into an empty <svg> of their
// size. Anything unknown, or nav-icons.js failing, falls back to <i class="fa-solid">.
ddiff --git a/notification-ui.js b/notification-ui.js
iindex 572fc01..82b61f9 100644
---- a/notification-ui.js
++++ b/notification-ui.js
@@@ -313,12 +313,7 @@
}
html.ovn-sheet-open, html.ovn-sheet-open body { overflow: hidden; }
@media (max-height: 520px) { .openvibe-notif-item .msg { -webkit-line-clamp: 1; } }
-- @media (prefers-reduced-motion: reduce) {
-- .openvibe-toast, .ovn-phone .openvibe-toast, .openvibe-notif-panel { animation: none; }
-- .openvibe-toast.removing { animation: none; opacity: 0; }
-- .openvibe-bell.ringing svg, .openvibe-bell .badge { animation: none; }
-- .openvibe-toast-progress { display: none; }
-- }
++ html[data-ov-motion=off] .openvibe-toast.removing{opacity: 0}html[data-ov-motion=off] .openvibe-toast-progress{display: none}
`;
document.head.appendChild(style);
}
ddiff --git a/ov-forms.css b/ov-forms.css
iindex 5acc302..ad291d8 100644
---- a/ov-forms.css
++++ b/ov-forms.css
@@@ -216,10 +216,6 @@ html.ov-sel-locked, html.ov-sel-locked body { overflow: hidden; overscroll-behav
.ov-choice-desc { font-size: 12.5px; line-height: 1.45; color: var(--text-muted, color-mix(in srgb, CanvasText 58%, Canvas)); }
.ov-choice .ov-sel-badge { position: absolute; top: 12px; right: 12px; }
--@media (prefers-reduced-motion: reduce) {
-- .ov-sel, .ov-sel-chev svg, .ov-sel-pop, .ov-sel-sheet, .ov-sel-scrim, .ov-sel-mark svg, .ov-choice, .ov-input { transition: none !important; }
-- :where(input[type="checkbox"][role="switch"]) { transition: none; }
--}
@media (forced-colors: active) {
.ov-sel, .ov-sel-pop, .ov-sel-sheet { border: 1px solid CanvasText; }
.ov-sel-opt.is-active, .ov-sel-opt[aria-selected="true"] { outline: 2px solid Highlight; }
ddiff --git a/ov-forms.js b/ov-forms.js
iindex a448102..7ebe6bd 100644
---- a/ov-forms.js
++++ b/ov-forms.js
@@@ -37,7 +37,8 @@
const done = new WeakMap(); // select → its state
let open = null; // the state whose list is open
let uid = 0;
-- const reduce = () => !!(root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches);
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduce = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
const phone = () => !!(root.matchMedia && root.matchMedia(PHONE).matches);
const el = (tag, cls, attrs) => {
const n = doc.createElement(tag);
ddiff --git a/ov-fx.js b/ov-fx.js
iindex 6a79b92..e77b965 100644
---- a/ov-fx.js
++++ b/ov-fx.js
@@@ -17,8 +17,10 @@
* Motion tokens (a look can set them; theme-loader.js passes a theme's own): --ov-dur-1…4, --ov-ease-out,
* --ov-ease-spring, --ov-ease-in-out. Each look has a feel (4.67.0): the quiet paper and light themes move calmly (a
* little slower, no overshoot), the neon and terminal ones snap (quicker, a livelier spring); the rest are lively. Nothing here runs by itself: every effect waits for a hover, a press, or the
-- * element coming on screen, plays once, and stops. Under prefers-reduced-motion or Calm (html[data-ov-motion=reduced])
-- * nothing moves: reveals and numbers are simply there, and no confetti falls.
++ * element coming on screen, plays once, and stops. Calm (the person's choice, or the device asking for less motion:
++ * html[data-ov-motion=reduced]) keeps every effect and makes it smaller and slower: a lift rises a pixel, a reveal
++ * rises five, a tilt leans a third as far, a burst of confetti is a third the size, nothing overshoots. Only Off
++ * (html[data-ov-motion=off]) stops them: reveals and numbers are simply there, and no confetti falls.
*/
(function (root) {
'use strict';
@@@ -30,10 +32,11 @@
const CSS = ':root{--ov-dur-1:.12s;--ov-dur-2:.2s;--ov-dur-3:.32s;--ov-dur-4:.52s;--ov-ease-out:cubic-bezier(.2,.8,.2,1);--ov-ease-spring:cubic-bezier(.34,1.56,.64,1);--ov-ease-in-out:cubic-bezier(.65,0,.35,1)}'
+ `html:is(${CALM}){--ov-dur-1:.15s;--ov-dur-2:.25s;--ov-dur-3:.4s;--ov-dur-4:.62s;--ov-ease-spring:var(--ov-ease-out)}`
+ `html:is(${SNAPPY}){--ov-dur-1:.09s;--ov-dur-2:.15s;--ov-dur-3:.24s;--ov-dur-4:.42s;--ov-ease-spring:cubic-bezier(.3,1.8,.6,1)}`
-- + 'html[data-ov-motion=reduced]{--ov-dur-1:0s;--ov-dur-2:0s;--ov-dur-3:0s;--ov-dur-4:0s}'
-- // A demo scope keeps its lengths whatever reduced them (Calm above, or kit.css under the device's own setting),
-- // in the look's own feel.
-- + '[data-fx-demo]{--ov-dur-1:.12s;--ov-dur-2:.2s;--ov-dur-3:.32s;--ov-dur-4:.52s}'
++ + 'html[data-ov-motion=reduced]{--ov-move:.35;--ov-dur-1:.15s;--ov-dur-2:.25s;--ov-dur-3:.4s;--ov-dur-4:.62s;--ov-ease-spring:var(--ov-ease-out)}'
++ + '@media (prefers-reduced-motion:reduce){html:not([data-ov-motion]){--ov-move:.35;--ov-dur-1:.15s;--ov-dur-2:.25s;--ov-dur-3:.4s;--ov-dur-4:.62s;--ov-ease-spring:var(--ov-ease-out)}}'
++ + 'html[data-ov-motion=off]{--ov-move:0;--ov-dur-1:0s;--ov-dur-2:0s;--ov-dur-3:0s;--ov-dur-4:0s}'
++ // A demo scope plays in full whatever the page's motion is, in the look's own feel.
++ + '[data-fx-demo]{--ov-move:1;--ov-ease-spring:cubic-bezier(.34,1.56,.64,1);--ov-dur-1:.12s;--ov-dur-2:.2s;--ov-dur-3:.32s;--ov-dur-4:.52s}'
+ `html:is(${CALM}) [data-fx-demo]{--ov-dur-1:.15s;--ov-dur-2:.25s;--ov-dur-3:.4s;--ov-dur-4:.62s}`
+ `html:is(${SNAPPY}) [data-fx-demo]{--ov-dur-1:.09s;--ov-dur-2:.15s;--ov-dur-3:.24s;--ov-dur-4:.42s}`
+ '.ovfx-glint{position:relative;overflow:hidden;isolation:isolate}'
@@@ -42,26 +45,37 @@
+ '.ovfx-glow{transition:box-shadow var(--ov-dur-3) var(--ov-ease-out)}'
+ '.ovfx-glow:hover,.ovfx-glow:focus-visible{box-shadow:0 0 0 1px color-mix(in srgb,var(--accent,#4f7cff) 45%,transparent),0 10px 34px -10px color-mix(in srgb,var(--accent,#4f7cff) 70%,transparent)}'
+ '.ovfx-lift{transition:transform var(--ov-dur-3) var(--ov-ease-spring),box-shadow var(--ov-dur-3) var(--ov-ease-out)}'
-- + '.ovfx-lift:hover{transform:translateY(-3px);box-shadow:0 12px 28px -14px rgba(0,0,0,.45)}'
++ + '.ovfx-lift:hover{transform:translateY(calc(-3px * var(--ov-move,1)));box-shadow:0 12px 28px -14px rgba(0,0,0,.45)}'
+ '.ovfx-press{transition:transform var(--ov-dur-4) var(--ov-ease-spring)}'
-- + '.ovfx-press:active{transform:scale(.96);transition-duration:var(--ov-dur-1)}'
-- + '.ovfx-lift.ovfx-press:active{transform:translateY(-1px) scale(.97)}'
++ + '.ovfx-press:active{transform:scale(calc(1 - .04 * var(--ov-move,1)));transition-duration:var(--ov-dur-1)}'
++ + '.ovfx-lift.ovfx-press:active{transform:translateY(calc(-1px * var(--ov-move,1))) scale(calc(1 - .03 * var(--ov-move,1)))}'
+ '.ovfx-ripple{position:relative;overflow:hidden;isolation:isolate}'
+ '.ovfx-rip{position:absolute;border-radius:50%;pointer-events:none;background:currentColor;opacity:.22;transform:scale(0);animation:ovfxRip .6s var(--ov-ease-out) forwards}'
+ '@keyframes ovfxRip{to{transform:scale(1);opacity:0}}'
+ '.ovfx-tilt{transition:transform var(--ov-dur-3) var(--ov-ease-out);transform-style:preserve-3d;will-change:transform}'
-- + '.ovfx-hide{opacity:0;transform:translateY(14px)}'
++ + '.ovfx-hide{opacity:0;transform:translateY(calc(14px * var(--ov-move,1)))}'
+ '.ovfx-in{opacity:1;transform:none;transition:opacity .5s var(--ov-ease-out),transform .6s var(--ov-ease-spring);transition-delay:var(--ovfx-d,0ms)}'
+ '.ovfx-shimmer{background:linear-gradient(100deg,color-mix(in srgb,var(--text-muted,#8b93ad) 12%,transparent) 30%,color-mix(in srgb,var(--text-muted,#8b93ad) 22%,transparent) 50%,color-mix(in srgb,var(--text-muted,#8b93ad) 12%,transparent) 70%) 0 0/300% 100%;animation:ovfxShim 1.4s linear infinite;color:transparent!important;border-radius:8px}'
+ '@keyframes ovfxShim{from{background-position:100% 0}to{background-position:0 0}}'
+ '.ovfx-confetti{position:fixed;inset:0;pointer-events:none;z-index:2147483000}'
-- + '@media (prefers-reduced-motion:reduce){.ovfx-glint:not([data-fx-demo] *)::after{display:none}.ovfx-lift:not([data-fx-demo] *),.ovfx-press:not([data-fx-demo] *),.ovfx-tilt:not([data-fx-demo] *),.ovfx-in:not([data-fx-demo] *){transition:none!important}.ovfx-shimmer:not([data-fx-demo] *){animation:none}}'
-- + 'html[data-ov-motion=reduced] .ovfx-glint:not([data-fx-demo] *)::after{display:none}html[data-ov-motion=reduced] .ovfx-shimmer:not([data-fx-demo] *){animation:none}html[data-ov-motion=reduced] .ovfx-in:not([data-fx-demo] *){transition:none}';
++ // Calm: the sheen crosses fainter and slower, the ripple is fainter. Off: no sheen, no shimmer, nothing fades in.
++ + 'html[data-ov-motion=reduced] .ovfx-glint:not([data-fx-demo] *)::after{opacity:.55}html[data-ov-motion=reduced] .ovfx-glint:not([data-fx-demo] *):is(:hover,:focus-visible)::after{transition-duration:1.1s}html[data-ov-motion=reduced] .ovfx-rip:not([data-fx-demo] *){opacity:.14}'
++ + 'html[data-ov-motion=off] .ovfx-glint:not([data-fx-demo] *)::after{display:none}html[data-ov-motion=off] .ovfx-shimmer:not([data-fx-demo] *){animation:none}html[data-ov-motion=off] :is(.ovfx-in,.ovfx-lift,.ovfx-press,.ovfx-tilt):not([data-fx-demo] *){transition:none!important}';
-- // The demo scope (4.180.0): inside [data-fx-demo] the effects play even when motion is reduced. A page that exists
-- // to show motion sets it on one container, only after the person presses a button that says so; nothing else may.
++ // The demo scope (4.180.0): inside [data-fx-demo] the effects play in full whatever the page's motion is. A page
++ // that exists to show motion sets it on one container, only after the person presses a button that says so.
const demo = (el) => !!(el && el.closest && el.closest('[data-fx-demo]'));
-- const reduced = (el) => !demo(el) && ((root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches) || doc.documentElement.getAttribute('data-ov-motion') === 'reduced');
++ // How far things move here: 1 in full, CALM_MOVE under Calm, 0 when motion is off. <html data-ov-motion> is the signal
++ // (theme-loader.js writes it, the device's own setting counted in); a page without the loader asks the device.
++ const CALM_MOVE = 0.35;
++ const move = (el) => {
++ if (demo(el)) return 1;
++ const m = doc.documentElement.getAttribute('data-ov-motion');
++ if (m === 'off') return 0;
++ if (m === 'reduced') return CALM_MOVE;
++ return !m && root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches ? CALM_MOVE : 1;
++ };
++ const off = (el) => move(el) === 0;
const fine = () => !!(root.matchMedia && root.matchMedia('(hover: hover) and (pointer: fine)').matches);
const done = new WeakSet();
let io = null;
@@@ -89,7 +103,7 @@
const below = (el) => { try { return el.getBoundingClientRect().top > (root.innerHeight || 0); } catch (e) { return false; } };
function countUp(el, c) {
-- const t0 = root.performance ? root.performance.now() : Date.now(), ms = Math.min(1600, 500 + Math.log10(Math.max(10, c.to)) * 220);
++ const t0 = root.performance ? root.performance.now() : Date.now(), ms = Math.min(1600, 500 + Math.log10(Math.max(10, c.to)) * 220) * (move(el) < 1 ? 0.6 : 1);
const step = (now) => {
const p = Math.min(1, ((now || Date.now()) - t0) / ms), e = 1 - Math.pow(1 - p, 3);
el.textContent = p < 1 ? c.fmt(c.to * e) : c.text;
@@@ -111,7 +125,7 @@
// ── Pointer effects ──
function ripple(el, ev) {
-- if (reduced(el)) return;
++ if (off(el)) return;
const r = el.getBoundingClientRect(), d = Math.max(r.width, r.height) * 2.2;
const s = doc.createElement('span'); s.className = 'ovfx-rip';
s.style.cssText = `width:${d}px;height:${d}px;left:${(ev.clientX || r.left + r.width / 2) - r.left - d / 2}px;top:${(ev.clientY || r.top + r.height / 2) - r.top - d / 2}px`;
@@@ -120,19 +134,21 @@
function tilt(el) {
let raf = 0;
el.addEventListener('pointermove', (ev) => {
-- if (ev.pointerType !== 'mouse' || reduced(el) || raf) return;
++ if (ev.pointerType !== 'mouse' || off(el) || raf) return;
raf = root.requestAnimationFrame(() => {
raf = 0;
const r = el.getBoundingClientRect(), x = (ev.clientX - r.left) / r.width - 0.5, y = (ev.clientY - r.top) / r.height - 0.5;
-- el.style.transform = `perspective(900px) rotateX(${(-y * 6).toFixed(2)}deg) rotateY(${(x * 7).toFixed(2)}deg)`;
++ const k = move(el);
++ el.style.transform = `perspective(900px) rotateX(${(-y * 6 * k).toFixed(2)}deg) rotateY(${(x * 7 * k).toFixed(2)}deg)`;
});
});
el.addEventListener('pointerleave', () => { if (raf) { root.cancelAnimationFrame(raf); raf = 0; } el.style.transform = ''; });
}
-- // ── Confetti: one canvas, about 1.6 s, then gone ──
++ // ── Confetti: one canvas, about 1.6 s, then gone. Calm: a third of the pieces, thrown half as hard ──
function confetti(opts) {
-- if (reduced(opts && opts.from) || !doc.body) return false;
++ const k = move(opts && opts.from);
++ if (!k || !doc.body) return false;
const o = opts || {}, cs = root.getComputedStyle(doc.documentElement);
const accent = (cs.getPropertyValue('--accent') || '').trim() || '#4f7cff';
const colors = o.colors || [accent, '#4f7cff', '#8b5cf6', '#22c55e', '#facc15', '#f472b6'];
@@@ -141,9 +157,9 @@
cv.width = W * dpr; cv.height = H * dpr; doc.body.appendChild(cv);
const ctx = cv.getContext('2d'); if (!ctx) { cv.remove(); return false; }
ctx.scale(dpr, dpr);
-- const x0 = o.x == null ? W / 2 : o.x, y0 = o.y == null ? H / 3 : o.y, n = Math.min(160, o.count || 80);
++ const x0 = o.x == null ? W / 2 : o.x, y0 = o.y == null ? H / 3 : o.y, n = Math.max(8, Math.round(Math.min(160, o.count || 80) * (k < 1 ? k : 1))), throwBy = k < 1 ? 0.55 : 1;
const ps = Array.from({ length: n }, (_, i) => {
-- const a = -Math.PI / 2 + (Math.random() - 0.5) * Math.PI * 0.9, v = 6 + Math.random() * 7;
++ const a = -Math.PI / 2 + (Math.random() - 0.5) * Math.PI * 0.9, v = (6 + Math.random() * 7) * throwBy;
return { x: x0, y: y0, vx: Math.cos(a) * v, vy: Math.sin(a) * v, r: Math.random() * Math.PI, vr: (Math.random() - 0.5) * 0.3, w: 5 + Math.random() * 5, h: 3 + Math.random() * 4, c: colors[i % colors.length], round: Math.random() < 0.3 };
});
const t0 = Date.now();
@@@ -172,14 +188,14 @@
if (n === 'ripple') el.addEventListener('pointerdown', (ev) => ripple(el, ev));
if (n === 'tilt' && fine()) { el.classList.add('ovfx-tilt'); tilt(el); }
if (n === 'confetti') el.addEventListener('click', () => { const r = el.getBoundingClientRect(); confetti({ x: r.left + r.width / 2, y: r.top + r.height / 2, count: 70, from: el }); });
-- if (n === 'reveal' && !reduced(el)) {
++ if (n === 'reveal' && !off(el)) {
const kids = el.children.length && el.getAttribute('data-fx-self') == null ? Array.from(el.children) : [el];
if (!below(el)) continue; // already on screen when wired: never hide what someone can see
const gap = Math.max(0, Math.min(200, Number(el.getAttribute('data-fx-stagger')) || 50));
kids.forEach((k, i) => { k.classList.add('ovfx-hide'); k.style.setProperty('--ovfx-d', `${Math.min(i, 12) * gap}ms`); });
el.__ovfxReveal = kids; observe(el);
}
-- if (n === 'count' && !reduced(el)) {
++ if (n === 'count' && !off(el)) {
const c = countOf(el);
if (c && below(el)) { el.__ovfxCount = c; observe(el); } else if (c) { el.__ovfxCount = c; seen(el); }
}
@@@ -196,6 +212,6 @@
if ('MutationObserver' in root) new root.MutationObserver((rs) => rs.forEach((r) => r.addedNodes.forEach((n) => { if (n.nodeType === 1) scan(n); }))).observe(doc.documentElement, { childList: true, subtree: true });
}
-- root.OVFx = { scan, confetti, wire, FEEL: { CALM, SNAPPY } };
++ root.OVFx = { scan, confetti, wire, move, FEEL: { CALM, SNAPPY } };
if (doc.readyState === 'loading') doc.addEventListener('DOMContentLoaded', init); else init();
})(typeof window !== 'undefined' ? window : this);
ddiff --git a/ov-glyphs.js b/ov-glyphs.js
iindex 07bf0d1..94f302a 100644
---- a/ov-glyphs.js
++++ b/ov-glyphs.js
@@@ -24,13 +24,13 @@
'use strict';
if (typeof window === 'undefined' || window.OVGlyphs) return;
const G = {"airplane":"<path d=\"M12 3c1 0 1.5 1 1.5 2.5V10l7.5 4.5V16l-7.5-2.5V18l2 1.5V21L12 20l-3.5 1v-1.5l2-1.5v-4.5L3 16v-1.5L10.5 10V5.5C10.5 4 11 3 12 3Z\"/>","alert":"<path d=\"M12 4 2.8 19.5h18.4Z\"/><path d=\"M12 10v4M12 17h.01\"/>","alert-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5v5.5M12 16.5h.01\"/>","align-left":"<path d=\"M4 6h16M4 10h10M4 14h16M4 18h10\"/>","archive":"<rect x=\"3\" y=\"4\" width=\"18\" height=\"5\" rx=\"1\"/><path d=\"M5 9v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9M10 13h4\"/>","arrow-down":"<path d=\"M12 4v16M6 14l6 6 6-6\"/>","arrow-left":"<path d=\"M20 12H4M10 6l-6 6 6 6\"/>","arrow-right":"<path d=\"M4 12h16M14 6l6 6-6 6\"/>","arrow-up":"<path d=\"M12 20V4M6 10l6-6 6 6\"/>","arrows-h":"<path d=\"M3.5 12h17M7.5 8l-4 4 4 4M16.5 8l4 4-4 4\"/>","at":"<circle cx=\"12\" cy=\"12\" r=\"3.6\"/><path d=\"M15.6 12v1.4a2.6 2.6 0 0 0 5.2 0V12a8.8 8.8 0 1 0-3.4 6.9\"/>","back":"<path d=\"M15 5l-7 7 7 7\"/>","ban":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m6 6 12 12\"/>","bell":"<path d=\"M6 14.5V9.5a6 6 0 0 1 12 0v5l1.5 2h-15ZM10 18.5a2 2 0 0 0 4 0\"/>","book":"<path d=\"M4 5a2 2 0 0 1 2-2h13v16H6a2 2 0 0 0-2 2Z\"/><path d=\"M4 19V5\"/>","book-open":"<path d=\"M12 6.6C10 5.1 7 4.6 3.5 5.2v13.2c3.5-.6 6.5-.1 8.5 1.4 2-1.5 5-2 8.5-1.4V5.2C17 4.6 14 5.1 12 6.6Z\"/><path d=\"M12 6.6v13.2\"/>","box":"<path d=\"M3.5 8 12 4l8.5 4v8.5L12 20.5l-8.5-4Z\"/><path d=\"M3.5 8 12 12l8.5-4M12 12v8.5M7.8 6l8.4 4\"/>","brain":"<path d=\"M9 4a3 3 0 0 0-3 3 3 3 0 0 0-2 5 3 3 0 0 0 2 5 3 3 0 0 0 6 1.2V5.5A2 2 0 0 0 9 4ZM15 4a3 3 0 0 1 3 3 3 3 0 0 1 2 5 3 3 0 0 1-2 5 3 3 0 0 1-6 1.2\"/>","branch":"<circle cx=\"6\" cy=\"5\" r=\"2\"/><circle cx=\"6\" cy=\"19\" r=\"2\"/><circle cx=\"18\" cy=\"7\" r=\"2\"/><path d=\"M6 7v10M18 9c0 5.5-6.5 4-11 8.5\"/>","bridge":"<path d=\"M3 16.05h18M5.25 16.05V11.1M18.75 16.05V11.1M3 10.65c3.6 0 5.4 -2.7 9 -2.7s5.4 2.7 9 2.7M8.85 16.05V12.9M15.15 16.05V12.9M12 16.05V9.3\"/>","briefcase":"<rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"2\"/><path d=\"M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7M3 12.5h7.5M13.5 12.5H21M10.5 11.5h3v2.5h-3Z\"/>","bug":"<rect x=\"7.5\" y=\"7\" width=\"9\" height=\"12.5\" rx=\"4.5\"/><path d=\"M9.5 7.3a2.5 2.5 0 0 1 5 0M12 11.5v8M7.5 12.5H4M20 12.5h-3.5M7.9 9 5 6.5M16.1 9 19 6.5M7.9 16.5 5 19M16.1 16.5 19 19\"/>","burst":"<path d=\"M12 2.5L13.99 7.2L18.72 5.28L16.8 10.01L21.5 12L16.8 13.99L18.72 18.72L13.99 16.8L12 21.5L10.01 16.8L5.28 18.72L7.2 13.99L2.5 12L7.2 10.01L5.28 5.28L10.01 7.2Z\"/>","busy":"<path d=\"M6 12h.01M12 12h.01M18 12h.01\" stroke-width=\"3.4\"/>","calendar":"<rect x=\"4\" y=\"5\" width=\"16\" height=\"15\" rx=\"2\"/><path d=\"M4 10h16M9 3v4M15 3v4\"/>","camera":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><circle cx=\"12\" cy=\"13.3\" r=\"3.4\"/>","camera-flip":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><path d=\"M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2\"/>","camera-off":"<path d=\"M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z\"/><circle cx=\"12\" cy=\"13.3\" r=\"3.4\"/><path d=\"M3.5 3.5l17 17\"/>","car":"<path d=\"M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z\"/><path d=\"M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0\"/>","card":"<rect x=\"2.5\" y=\"5\" width=\"19\" height=\"14\" rx=\"2\"/><path d=\"M2.5 10h19M6 15h4\"/>","care":"<path d=\"M4 16.5h3l4 3h5.5a2 2 0 0 0 0 -4H13M8 16.5l2.2 -2h3.3\"/><path d=\"M16.5 11s-3.2 -2 -3.2 -4.4a1.9 1.9 0 0 1 3.2 -1.3 1.9 1.9 0 0 1 3.2 1.3c0 2.4 -3.2 4.4 -3.2 4.4Z\"/>","cart":"<path d=\"M3 4h2l2.4 11h11L21 7H6.2\"/><circle cx=\"9\" cy=\"19.5\" r=\"1.3\"/><circle cx=\"17\" cy=\"19.5\" r=\"1.3\"/>","cc":"<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2.5\"/><path d=\"M10.6 10.1a2.4 2.4 0 1 0 0 3.8M17.1 10.1a2.4 2.4 0 1 0 0 3.8\"/>","chart":"<path d=\"M4 4v16h16\"/><path d=\"m7.5 14.5 3.5-4 3 2.5 5-6\"/>","chat":"<path d=\"M4 5h16v11H8l-4 4Z\"/>","chat-off":"<path d=\"M4 5h16v11H8l-4 4Z\"/><path d=\"M3.5 3.5l17 17\"/>","check":"<path d=\"m5 12.5 4.5 4.5L19 7.5\"/>","check-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8 12.4 2.8 2.8L16 9.6\"/>","check-double":"<path d=\"m2.5 12.5 4 4L15 8M11 16.5l1 1L21.5 8\"/>","chevron":"<path d=\"m9.9 6.6 6.6 6.6 -6.6 6.6\"/>","chevrons-left":"<path d=\"m11.4 18 -6 -6 6 -6M19.2 18l-6 -6 6 -6\"/>","chevrons-right":"<path d=\"m4.8 18 6 -6 -6 -6M12.6 18l6 -6 -6 -6\"/>","child":"<circle cx=\"12\" cy=\"5.5\" r=\"2.2\"/><path d=\"M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6\"/>","chip":"<rect x=\"7\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.5\"/><path d=\"M10 3v4M14 3v4M10 17v4M14 17v4M3 10h4M3 14h4M17 10h4M17 14h4\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>","city":"<path d=\"M3 21h18M5 21V9h5v12M10 21V4h6v17M16 21v-8h3.5v8M7.5 12h.01M7.5 15.5h.01M13 7.5h.01M13 11h.01M13 14.5h.01\"/>","clapper":"<path d=\"M3.5 10h17v9a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1Z\"/><path d=\"M3.5 10 2.9 6.6l16.4-3 .7 3.6ZM8 5.7l2.3 3.3M13.3 4.7l2.3 3.3\"/>","clipboard":"<rect x=\"5.5\" y=\"5\" width=\"13\" height=\"16\" rx=\"2\"/><path d=\"M9 5V3.5h6V5M9 11h6M9 15h4\"/>","clipboard-check":"<rect x=\"5.5\" y=\"5\" width=\"13\" height=\"16\" rx=\"2\"/><path d=\"M9 5V3.5h6V5M9 13.5l2 2 4-4\"/>","clock":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 7.5V12l3 2\"/>","close":"<path d=\"M5.4 5.4l13.2 13.2M18.6 5.4 5.4 18.6\"/>","cloud":"<path d=\"M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18Z\"/>","cloud-off":"<path d=\"M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18Z\"/><path d=\"M3.5 3.5l17 17\"/>","code":"<path d=\"m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14\"/>","coin":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M14.5 9.2c-.5-.8-1.4-1.2-2.5-1.2-1.5 0-2.5.8-2.5 2s1 1.6 2.5 2 2.5.8 2.5 2-1 2-2.5 2c-1.1 0-2-.4-2.5-1.2M12 6.5v11\"/>","columns":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M12 4.5v15M3.5 9h17\"/>","commit":"<circle cx=\"12\" cy=\"12\" r=\"3.6\"/><path d=\"M3 12h5.4M15.6 12H21\"/>","compass":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z\"/>","compress":"<path d=\"M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5\"/>","computer":"<rect x=\"3\" y=\"4\" width=\"18\" height=\"12\" rx=\"2\"/><path d=\"M8 20h8M12 16v4\"/>","contrast":"<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 3v18M12 7.5h7M12 12h9M12 16.5h7\"/>","cookie":"<path d=\"M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z\"/><path d=\"M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01\"/>","copy":"<rect x=\"8\" y=\"8\" width=\"12\" height=\"12\" rx=\"2\"/><path d=\"M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2\"/>","couch":"<path d=\"M5 10V7a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v3\"/><path d=\"M3 12a2 2 0 0 1 4 0v1.5h10V12a2 2 0 0 1 4 0v5H3ZM5 17v2M19 17v2\"/>","crown":"<path d=\"M3 8.5 7.5 12.5 12 5.5l4.5 7 4.5-4L19 19H5Z\"/>","cubes":"<path d=\"M12 3.5 8 5.5v4.5l4 2 4-2V5.5ZM7.5 12 3.5 14v4.5l4 2 4-2V14ZM16.5 12l-4 2v4.5l4 2 4-2V14Z\"/>","database":"<ellipse cx=\"12\" cy=\"6\" rx=\"7\" ry=\"3\"/><path d=\"M5 6v12c0 1.7 3.1 3 7 3s7-1.3 7-3V6M5 12c0 1.7 3.1 3 7 3s7-1.3 7-3\"/>","dice":"<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"3\"/><path d=\"M8.5 8.5h.01M15.5 8.5h.01M12 12h.01M8.5 15.5h.01M15.5 15.5h.01\" stroke-width=\"2.6\"/>","dish":"<path d=\"M5 9.5A9.5 9.5 0 0 0 14.5 19Z\"/><path d=\"m9.5 14.5 4.5-4.5M14.5 4.5a5 5 0 0 1 5 5M14.5 8a1.5 1.5 0 0 1 1.5 1.5\"/>","dollar":"<path d=\"M16 7.5C15.3 6 13.8 5 12 5 9.5 5 8 6.3 8 8s1.7 2.6 4 3 4 1.4 4 3.3-1.6 3.2-4 3.2c-1.9 0-3.4-1-4-2.5M12 3v18\"/>","donate":"<circle cx=\"12\" cy=\"8.5\" r=\"5\"/><path d=\"M12 6.4v4.2M4 15.5h16V20H4ZM8.5 17.75h7\"/>","door":"<path d=\"M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01\"/>","down":"<path d=\"m6.6 9.9 6.6 6.6 6.6 -6.6\"/>","download":"<path d=\"M12 4v11M7 10l5 5 5-5M5 20h14\"/>","drive":"<rect x=\"3\" y=\"13\" width=\"18\" height=\"7\" rx=\"2\"/><path d=\"M3.5 13 6.5 5h11l3 8M17 16.5h.01M14 16.5h.01\"/>","drop":"<path d=\"M12 3s6 6.5 6 11a6 6 0 0 1-12 0c0-4.5 6-11 6-11Z\"/>","ear":"<path d=\"M7.5 9a5 5 0 1 1 9.6 2c-.8 1.6-2.6 2.5-2.6 4.6a3 3 0 0 1-5.7 1.4\"/><path d=\"M10.5 9.3a2 2 0 1 1 3.5 1.3\"/>","enter":"<path d=\"M14 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4M10 8l4 4-4 4M14 12H4\"/>","eraser":"<path d=\"m14 4.5 5.5 5.5-9 9H6.3l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z\"/><path d=\"M9 9.5l5.5 5.5M10.5 19H20\"/>","expand":"<path d=\"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5\"/>","eye":"<path d=\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>","eye-off":"<path d=\"M3 12s3.5-6.5 9-6.5c1.6 0 3 .5 4.3 1.2M21 12s-3.5 6.5-9 6.5c-1.6 0-3-.5-4.3-1.2\"/><path d=\"M9.9 9.9a3 3 0 0 0 4.2 4.2M4 4l16 16\"/>","fast-forward":"<path d=\"M3.5 6.5v11L11 12ZM12.5 6.5v11L20 12Z\"/>","file":"<path d=\"M6 3h8l4 4v14H6Z\"/><path d=\"M14 3v4h4\"/>","file-code":"<path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z\"/><path d=\"M14 3v5h5M10 12.5 8 14.5l2 2M14 12.5l2 2-2 2\"/>","film":"<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M7.5 4v16M16.5 4v16M3 9h4.5M3 15h4.5M16.5 9H21M16.5 15H21\"/>","filter":"<path d=\"M4 6h16M7 12h10M10 18h4\"/>","finish":"<path d=\"M5 21V3.5\"/><rect x=\"5\" y=\"4\" width=\"14.5\" height=\"9\" rx=\"1\"/><path d=\"M5 8.5h14.5M9.8 4v9M14.6 4v9\"/>","fire":"<path d=\"M12 19.5a6 6 0 0 0 6 -6c0 -3.8 -2.6 -6 -3.7 -9 -1.8 2 -2.3 4 -2.3 4S10.8 6.5 9.8 4.7C7.6 7.2 6 10.1 6 13.5a6 6 0 0 0 6 6Z\"/>","fish":"<path d=\"M8 12c2-3.2 4.5-4.8 7.5-4.8 2.6 0 4.5 2 5.5 4.8-1 2.8-2.9 4.8-5.5 4.8-3 0-5.5-1.6-7.5-4.8Z\"/><path d=\"M8 12 3.5 8.5v7Z\"/><path d=\"M16.8 10.6h.01\"/>","fist":"<path d=\"M6.5 10V6.5a1.5 1.5 0 0 1 3 0V9M9.5 8.5v-3a1.5 1.5 0 0 1 3 0v3M12.5 8.5v-2a1.5 1.5 0 0 1 3 0V9M15.5 9V8a1.5 1.5 0 0 1 3 0v5a7 7 0 0 1 -7 7H11a5.5 5.5 0 0 1 -5.5 -5.5V12A2 2 0 0 1 7.5 11h2a1.5 1.5 0 0 1 0 3H8\"/>","flag":"<path d=\"M6.5 21V4M6.5 4h11l-2 4 2 4H6.5\"/>","flask":"<path d=\"M9.5 3.5h5M10 3.5V9.5L4.8 18.2a1.5 1.5 0 0 0 1.3 2.3h11.8a1.5 1.5 0 0 0 1.3-2.3L14 9.5V3.5\"/><path d=\"M7.2 15h9.6\"/>","focus":"<circle cx=\"12\" cy=\"12\" r=\"1.6\"/><path d=\"M12 3v5M10 6l2 2 2-2M12 21v-5M10 18l2-2 2 2M3 12h5M6 10l2 2-2 2M21 12h-5M18 10l-2 2 2 2\"/>","folder":"<path d=\"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z\"/>","folder-tree":"<path d=\"M4.5 3.5v13a1 1 0 0 0 1 1H10M4.5 8.5H10\"/><path d=\"M10.5 5.5h3l1 1.5h5.5V11h-9.5ZM10.5 14.5h3l1 1.5h5.5V20h-9.5Z\"/>","food":"<path d=\"M8 3v7M6 3v4.5a2 2 0 0 0 4 0V3M8 10v11M18 21V3c-2 1.2 -3.2 3.6 -3.2 7v3H18\"/>","game":"<rect x=\"2.5\" y=\"7\" width=\"19\" height=\"11\" rx=\"5\"/><path d=\"M7 11v3M5.5 12.5h3M15.5 12h.01M18 13.5h.01\"/>","gauge":"<path d=\"M4 16.5a8 8 0 1 1 16 0\"/><path d=\"m12 13 4 -5.5\"/><circle cx=\"12\" cy=\"13\" r=\"1.3\"/>","gavel":"<path d=\"m14 4.5 5.5 5.5M10.5 8l5.5 5.5M12.3 6.3l-6 6 5.4 5.4 6-6M3 21l6.3-6.3M14 21h7\"/>","gear":"<circle cx=\"12\" cy=\"12\" r=\"2.4\"/><path d=\"M17.85 14.4a1.35 1.35 0 0 0 0.25 1.6l0.1 0.1a1.6 1.6 0 1 1 -2.5 2.5l-0.1 -0.1a1.35 1.35 0 0 0 -1.6 -0.25 1.35 1.35 0 0 0 -0.9 1.35V19.1a1.6 1.6 0 1 1 -3.6 0v-0.1a1.35 1.35 0 0 0 -1 -1.35 1.35 1.35 0 0 0 -1.6 0.25l-0.1 0.1a1.6 1.6 0 1 1 -2.5 -2.5l0.1 -0.1a1.35 1.35 0 0 0 0.25 -1.6 1.35 1.35 0 0 0 -1.35 -0.9H4.95a1.6 1.6 0 1 1 0 -3.6h0.1a1.35 1.35 0 0 0 1.35 -1 1.35 1.35 0 0 0 -0.25 -1.6l-0.1 -0.1a1.6 1.6 0 1 1 2.5 -2.5l0.1 0.1a1.35 1.35 0 0 0 1.6 0.25H9.65a1.35 1.35 0 0 0 0.9 -1.35V4.95a1.6 1.6 0 1 1 3.6 0v0.1a1.35 1.35 0 0 0 0.9 1.35 1.35 1.35 0 0 0 1.6 -0.25l0.1 -0.1a1.6 1.6 0 1 1 2.5 2.5l-0.1 0.1a1.35 1.35 0 0 0 -0.25 1.6V9.65a1.35 1.35 0 0 0 1.35 0.9H19.1a1.6 1.6 0 1 1 0 3.6h-0.1a1.35 1.35 0 0 0 -1.35 0.9Z\"/>","gem":"<path d=\"M6.5 4h11L21 9l-9 11L3 9Z\"/><path d=\"M3 9h18M9.5 4 8 9l4 11M14.5 4 16 9l-4 11\"/>","ghost":"<path d=\"M5 20V11a7 7 0 0 1 14 0v9l-2.3-1.8-2.4 1.8-2.3-1.8L9.7 20l-2.4-1.8Z\"/><path d=\"M9.5 10.5h.01M14.5 10.5h.01\"/>","gift":"<rect x=\"4\" y=\"9\" width=\"16\" height=\"11\" rx=\"1\"/><path d=\"M3 9h18M12 9v11M12 9c-1.5-3-5-4-5-1.5S12 9 12 9s5-1 5-3.5S13.5 6 12 9\"/>","globe":"<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18M12 3c3 3 3 15 0 18M12 3c-3 3-3 15 0 18\"/>","grid":"<rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.5\"/>","grip":"<path d=\"M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01\" stroke-width=\"3\"/>","group":"<path d=\"M3 7V3h4M17 3h4v4M21 17v4h-4M7 21H3v-4\"/><rect x=\"7\" y=\"7\" width=\"6\" height=\"5\" rx=\"1\"/><rect x=\"11\" y=\"12\" width=\"6\" height=\"5\" rx=\"1\"/>","hammer":"<path d=\"M13 3.5 19.5 10l-2.8 2.8 -6.5 -6.5Z\"/><path d=\"M13.5 9.5 4.5 18.5a1.4 1.4 0 0 0 2 2l9 -9\"/>","hand":"<path d=\"M10 13V5.5a1.5 1.5 0 0 1 3 0V11M13 10V4.5a1.5 1.5 0 0 1 3 0V11M16 10.5V6a1.5 1.5 0 0 1 3 0v7c0 4 -2.5 7 -6.5 7 -2.6 0 -4.2 -1.3 -5.7 -3.6L5 13.6a1.5 1.5 0 0 1 2.4 -1.8L10 15\"/>","handshake":"<path d=\"M2.5 9.5v6M21.5 9.5v6\"/><path d=\"M2.5 10.5h2.5l4-3 3.2 1.4L15 7.5l4 3h2.5\"/><path d=\"M5 10.5l6.8 6.8a1.3 1.3 0 0 0 1.9-1.8M13.7 15.5l.6.6a1.3 1.3 0 0 0 1.9-1.8M16.2 14.3l.3.3a1.3 1.3 0 0 0 1.9-1.8L19 10.5M18.4 12.8l-4.6-4.6-2.6 2.3a1.5 1.5 0 0 1-2.1-2.1l2.1-2.2\"/>","hash":"<path d=\"M5 9h15M4 15h15M10 3.5 8 20.5M16 3.5l-2 17\"/>","heading":"<path d=\"M6 4v16M18 4v16M6 12h12M4 4h4M16 4h4M4 20h4M16 20h4\"/>","headphones":"<path d=\"M4 15v-3a8 8 0 0 1 16 0v3\"/><rect x=\"3\" y=\"14\" width=\"4.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"16.5\" y=\"14\" width=\"4.5\" height=\"6.5\" rx=\"1.5\"/>","heart":"<path d=\"M12 19.5s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10Z\"/>","heart-broken":"<path d=\"M12 19.5s-7 -4.4 -7 -10a4 4 0 0 1 7 -2.6A4 4 0 0 1 19 10c0 5.6 -7 10 -7 10Z\"/><path d=\"M12 6.9 10.4 10.5l3 2 -1.4 3.4\"/>","heart-pulse":"<path d=\"M19.8 12.5c-1.9 4-7.8 7.5-7.8 7.5s-5.9-3.5-7.8-7.5M3.4 9.5A4.8 4.8 0 0 1 12 7a4.8 4.8 0 0 1 8.6 2.5\"/><path d=\"M2.5 12h4.5l1.5-2.5 2.5 5 2-3.5h8.5\"/>","help":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M9.6 9.3a2.5 2.5 0 0 1 4.8.9c0 1.7-2.4 2.2-2.4 3.8M12 17h.01\"/>","history":"<path d=\"M4 12a8 8 0 1 0 2.4-5.7L4 8.6M4 4.5v4.1h4.1\"/><path d=\"M12 8v4.2l3 1.8\"/>","home":"<path d=\"M4 11 12 4l8 7v8a1 1 0 0 1-1 1h-4v-6h-6v6H5a1 1 0 0 1-1-1Z\"/>","hot-tub":"<circle cx=\"8\" cy=\"5.5\" r=\"1.8\"/><path d=\"M3 12h18v3.5a4.5 4.5 0 0 1-4.5 4.5h-9A4.5 4.5 0 0 1 3 15.5ZM6 12v-1.5A2.5 2.5 0 0 1 8.5 8H9M13.5 9.5c.8-1-.8-2 0-3M17.5 9.5c.8-1-.8-2 0-3\"/>","hourglass":"<path d=\"M6 3.5h12M6 20.5h12M7.5 3.5c0 4.5 4.5 5.5 4.5 8.5s-4.5 4-4.5 8.5M16.5 3.5c0 4.5-4.5 5.5-4.5 8.5s4.5 4 4.5 8.5\"/>","id":"<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><circle cx=\"9\" cy=\"11\" r=\"2\"/><path d=\"M6 16c.5-1.5 1.7-2.3 3-2.3s2.5.8 3 2.3M15 10h3M15 13.5h3\"/>","idea":"<path d=\"M9 18h6M10 21h4M8.6 14.6A6 6 0 1 1 15.4 14.6c-.7.6-1.4 1.5-1.4 2.4h-4c0-.9-.7-1.8-1.4-2.4Z\"/>","image":"<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"3\"/><circle cx=\"9\" cy=\"10\" r=\"1.6\"/><path d=\"m21 16-5-5-8 8\"/>","inbox":"<path d=\"M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5\"/>","infinity":"<path d=\"M12 12c-2-2.7-3.7-4-5.5-4a4 4 0 0 0 0 8c1.8 0 3.5-1.3 5.5-4Zm0 0c2 2.7 3.7 4 5.5 4a4 4 0 0 0 0-8c-1.8 0-3.5 1.3-5.5 4Z\"/>","info":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5M12 8h.01\"/>","invite":"<circle cx=\"9\" cy=\"8\" r=\"3.2\"/><path d=\"M3 20c0-3.3 2.7-5.5 6-5.5s6 2.2 6 5.5M19 8v6M16 11h6\"/>","key":"<circle cx=\"8\" cy=\"15\" r=\"4\"/><path d=\"m10.8 12.2 8.7-8.7M16 7l3 3M14 9l2 2\"/>","keyboard":"<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2\"/><path d=\"M6 10h.01M9 10h.01M12 10h.01M15 10h.01M18 10h.01M8 14h8\"/>","language":"<path d=\"M4 5h9M8.5 3v2M6 5c.5 3 2.5 6 6 7.5M11 5c-.6 3.4-2.8 6.8-6.5 8.5M12 21l4-9 4 9M13.4 18h5.2\"/>","laugh":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2\"/>","layers":"<path d=\"m12 4.5 9 5 -9 5 -9 -5Z\"/><path d=\"m3 14 9 5 9 -5\"/>","leaf":"<path d=\"M5 19c0-8.5 5-13.6 15-15-.9 9.9-6 15-15 15ZM5 19l8-8\"/>","leave":"<path d=\"M13 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1 -2 2h-4M9 16l-4 -4 4 -4M5 12h10\"/>","lifebuoy":"<circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"m5.6 5.6 3.6 3.6M14.8 14.8l3.6 3.6M18.4 5.6l-3.6 3.6M9.2 14.8l-3.6 3.6\"/>","link":"<path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\"/>","link-off":"<path d=\"M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1\"/><path d=\"M3.5 3.5l17 17\"/>","list":"<path d=\"M9 6h11M9 12h11M9 18h11M4.5 6h.01M4.5 12h.01M4.5 18h.01\"/>","list-ordered":"<path d=\"M10 7h11M10 13h11M10 19h11M4 5.5 5 5v4.5M4 9.5h2M4 14a1 1 0 0 1 2 0.3c0 1.1 -2 1.7 -2 2.7h2.2\"/>","live":"<circle cx=\"12\" cy=\"12\" r=\"2.15\"/><path d=\"M8.4 8.4a5.15 5.15 0 0 0 0 7.55M15.6 8.4a5.15 5.15 0 0 1 0 7.55M6 6a8.55 8.55 0 0 0 0 12.6M18 6a8.55 8.55 0 0 1 0 12.6\"/>","lock":"<rect x=\"5\" y=\"11\" width=\"14\" height=\"9\" rx=\"2\"/><path d=\"M8 11V8a4 4 0 0 1 8 0v3\"/>","lungs":"<path d=\"M12 4v7.5M12 9.5l-2.8 2M12 9.5l2.8 2M8.6 6.8C6 6.8 4 10.5 4 15c0 2.6 1 4.5 3 4.5s2.5-2 2.5-4.5V8.5M15.4 6.8C18 6.8 20 10.5 20 15c0 2.6-1 4.5-3 4.5s-2.5-2-2.5-4.5V8.5\"/>","mail":"<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"m4 7 8 6 8-6\"/>","map":"<path d=\"M9 4 3 6v14l6-2 6 2 6-2V4l-6 2Z\"/><path d=\"M9 4v14M15 6v14\"/>","mask":"<path d=\"M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z\"/><path d=\"M7.5 11.5h2M14.5 11.5h2\"/>","medical":"<rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"2\"/><path d=\"M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M12 10.5v6M9 13.5h6\"/>","megaphone":"<path d=\"M3.5 10v4a1 1 0 0 0 1 1H7l9 4.5v-15L7 9H4.5a1 1 0 0 0-1 1Z\"/><path d=\"M7 15l1.3 5h2.4L10 15.6M19 9.5a3.2 3.2 0 0 1 0 5\"/>","members":"<circle cx=\"9\" cy=\"8\" r=\"3.2\"/><path d=\"M3 20c0-3.3 2.7-5.5 6-5.5s6 2.2 6 5.5M16 4.8a3.2 3.2 0 0 1 0 6.4M18 14.8c1.9.6 3 2.4 3 5.2\"/>","menu":"<path d=\"M4 7h16M4 12h16M4 17h16\"/>","mic":"<rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\"/><path d=\"M5 11a7 7 0 0 0 14 0M12 18v3\"/>","mic-off":"<rect x=\"9\" y=\"3\" width=\"6\" height=\"11\" rx=\"3\"/><path d=\"M5 11a7 7 0 0 0 11.6 5.3M19 11c0 .8-.1 1.6-.4 2.3M12 18v3M4 4l16 16\"/>","minus":"<path d=\"M5 12h14\"/>","minus-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 12h8\"/>","money":"<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\"/><path d=\"M6 9.5v.01M18 14.5v.01\"/>","moon":"<path d=\"M20 14.5A8 8 0 1 1 9.5 4a6.5 6.5 0 0 0 10.5 10.5Z\"/>","more":"<circle cx=\"5\" cy=\"12\" r=\"1.6\"/><circle cx=\"12\" cy=\"12\" r=\"1.6\"/><circle cx=\"19\" cy=\"12\" r=\"1.6\"/>","mountain":"<path d=\"M2.5 19 9 6l4.2 7.2L16 9.5 21.5 19Z\"/>","move":"<path d=\"M12 3.5v17M3.5 12h17M9 6.5l3-3 3 3M9 17.5l3 3 3-3M6.5 9l-3 3 3 3M17.5 9l3 3-3 3\"/>","mug":"<path d=\"M4.5 9h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z\"/><path d=\"M15.5 10.5H17a2.5 2.5 0 0 1 0 5h-1.5M8 3.5c-.8 1 .8 2 0 3M11.5 3.5c-.8 1 .8 2 0 3\"/>","music":"<path d=\"M9 18V6l11-2v12\"/><circle cx=\"6.5\" cy=\"18\" r=\"2.5\"/><circle cx=\"17.5\" cy=\"16\" r=\"2.5\"/>","mute":"<path d=\"M4 9.5h3.5L12 6v12l-4.5-3.5H4Z\"/><path d=\"m16 10 4 4M20 10l-4 4\"/>","news":"<path d=\"M4 4h13v14a2 2 0 0 0 2 2H6a2 2 0 0 1 -2 -2Z\"/><path d=\"M17 8h3v10a2 2 0 0 1 -2 2M7.5 8h6M7.5 11.5h6M7.5 15h3.5\"/>","nodes":"<circle cx=\"12\" cy=\"5\" r=\"2.2\"/><circle cx=\"5.5\" cy=\"18\" r=\"2.2\"/><circle cx=\"18.5\" cy=\"18\" r=\"2.2\"/><path d=\"M11 7 6.5 16M13 7l4.5 9M7.7 18h8.6\"/>","open":"<path d=\"M14 4h6v6M20 4l-9 9M18 14v4a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4\"/>","palette":"<path d=\"M12 3a9 9 0 1 0 0 18c1.2 0 1.8-.8 1.8-1.7 0-1.2-1-1.6-1-2.6s.8-1.7 2-1.7H17a4 4 0 0 0 4-4C21 6.7 17 3 12 3Z\"/><circle cx=\"7.5\" cy=\"11\" r=\"1.2\"/><circle cx=\"10\" cy=\"7.3\" r=\"1.2\"/><circle cx=\"14.5\" cy=\"7.3\" r=\"1.2\"/>","parking":"<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"3\"/><path d=\"M9.5 17V7h3.5a3 3 0 0 1 0 6H9.5\"/>","pause":"<path d=\"M8 5v14M16 5v14\"/>","paw":"<path d=\"M8 18.4c0-2.8 1.8-5 4-5s4 2.2 4 5c0 1.3-1 2-2 2-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1 0-2-.7-2-2Z\"/><circle cx=\"5.8\" cy=\"11\" r=\"1.8\"/><circle cx=\"9.4\" cy=\"6.4\" r=\"1.8\"/><circle cx=\"14.6\" cy=\"6.4\" r=\"1.8\"/><circle cx=\"18.2\" cy=\"11\" r=\"1.8\"/>","pencil":"<path d=\"M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z\"/>","phone":"<path d=\"M5 4h4l2 5-2.5 1.5a11 11 0 0 0 5 5L15 13l5 2v4a2 2 0 0 1-2 2A16 16 0 0 1 3 6a2 2 0 0 1 2-2\"/>","phone-off":"<path d=\"M5 4h4l2 5-2.5 1.5a11 11 0 0 0 5 5L15 13l5 2v4a2 2 0 0 1-2 2A16 16 0 0 1 3 6a2 2 0 0 1 2-2\"/><path d=\"M3.5 3.5l17 17\"/>","piggy":"<path d=\"M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12Z\"/><path d=\"M16 10.5h.01M9.5 8.5h3\"/>","pin":"<path d=\"M12 21s-6.5-5.6-6.5-11a6.5 6.5 0 0 1 13 0C18.5 15.4 12 21 12 21Z\"/><circle cx=\"12\" cy=\"10\" r=\"2.4\"/>","plane":"<path d=\"M20.5 3.5 3.5 10.5l6.8 3.2 3.2 6.8Z\"/><path d=\"m10.3 13.7 10.2-10.2\"/>","play":"<path d=\"M7 5v14l11 -7Z\"/>","plug":"<path d=\"M9 3v5M15 3v5M6.5 8h11v3a5.5 5.5 0 0 1-11 0ZM12 16.5V21\"/>","plus":"<path d=\"M12 5v14M5 12h14\"/>","plus-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 8v8M8 12h8\"/>","print":"<path d=\"M7 9V3.5h10V9\"/><rect x=\"3.5\" y=\"9\" width=\"17\" height=\"8\" rx=\"2\"/><path d=\"M7 14h10v6.5H7ZM16.5 12h.01\"/>","puzzle":"<path d=\"M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z\"/>","quote":"<path d=\"M10 6.5C6.5 7.5 4.5 10 4.5 13.5v3h5v-5h-5M19.5 6.5c-3.5 1-5.5 3.5-5.5 7v3h5v-5h-5\"/>","radio":"<rect x=\"3\" y=\"8\" width=\"18\" height=\"12\" rx=\"2\"/><path d=\"M7 8 17 3.5\"/><circle cx=\"15.5\" cy=\"14\" r=\"2.5\"/><path d=\"M6.5 12.5h4M6.5 15.5h4\"/>","ranking":"<path d=\"M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5\"/><path d=\"m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z\"/>","record":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>","recycle":"<path d=\"M7.2 19.5H4.8a1.4 1.4 0 0 1-1.2-2.1l2.6-4.5M9.8 4.9l1-1.7a1.4 1.4 0 0 1 2.4 0l2.6 4.5M18.6 12.9l1.8 3.1a1.4 1.4 0 0 1-1.2 2.1h-5.2\"/><path d=\"M11 17.6l2.1 2.1-2.1 2.1M3.4 10.6l2.8-.8.8 2.9M18 5.6l-.8 2.9-2.9-.8\"/>","reply":"<path d=\"M9 6 4 11l5 5M4 11h10a6 6 0 0 1 6 6v1\"/>","restroom":"<circle cx=\"7\" cy=\"4.8\" r=\"1.8\"/><circle cx=\"17\" cy=\"4.8\" r=\"1.8\"/><path d=\"M12 3v18M5.5 21v-5.5H4.5V10.5A1.5 1.5 0 0 1 6 9h2a1.5 1.5 0 0 1 1.5 1.5v5H8.5V21M16 21v-4h-2.5l2-6.6a1 1 0 0 1 1-.9h1a1 1 0 0 1 1 .9l2 6.6H18v4\"/>","retry":"<path d=\"M4 12a8 8 0 0 1 13.7-5.7L20 8.5M20 4v4.5h-4.5M20 12a8 8 0 0 1-13.7 5.7L4 15.5M4 20v-4.5h4.5\"/>","rewind":"<path d=\"M20.5 6.5v11L13 12ZM11.5 6.5v11L4 12Z\"/>","road":"<path d=\"M8 3 4 21M16 3l4 18M12 4v2.5M12 10.5v3M12 17.5V20\"/>","robot":"<rect x=\"5\" y=\"8\" width=\"14\" height=\"11\" rx=\"3\"/><path d=\"M12 4v4M9 13h.01M15 13h.01M9.5 16.5h5M3 13v2M21 13v2\"/>","rocket":"<path d=\"M12 15.5 8.5 12C10 6.5 14 3.5 20.5 3.5 20.5 10 17.5 14 12 15.5ZM8.5 12 5 11.5 7.5 8h4M12 15.5l.5 3.5 3.5-2.5v-4M6.5 17.5c-1.5 0-3 1.5-3 3 1.5 0 3-1.5 3-3Z\"/><circle cx=\"15.5\" cy=\"8.5\" r=\"1.5\"/>","route":"<circle cx=\"6\" cy=\"18\" r=\"2.4\"/><circle cx=\"18\" cy=\"6\" r=\"2.4\"/><path d=\"M8.4 18H16a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h7.6\"/>","rss":"<path d=\"M5 4.5a14.5 14.5 0 0 1 14.5 14.5M5 10.5A8.5 8.5 0 0 1 13.5 19\"/><path d=\"M5.5 18.5h.01\" stroke-width=\"3.4\"/>","save":"<path d=\"M5 4h11l3 3v13H5Z\"/><path d=\"M8 4v5h7V4M8 20v-6h8v6\"/>","scale":"<path d=\"M12 3.5V21M8 21h8M4.5 7h15M12 3.5h.01M2.5 14 5 7.5 7.5 14M16.5 14 19 7.5l2.5 6.5M2.5 14a2.5 2.5 0 0 0 5 0M16.5 14a2.5 2.5 0 0 0 5 0\"/>","scissors":"<circle cx=\"6\" cy=\"7\" r=\"2.6\"/><circle cx=\"6\" cy=\"17\" r=\"2.6\"/><path d=\"M8.2 8.6 20 18M8.2 15.4 20 6\"/>","scroll":"<path d=\"M8 3.5h10.5a2 2 0 0 1 2 2v1.5H17M8 3.5a2 2 0 0 0-2 2v12a3 3 0 0 1-3 3h11a3 3 0 0 0 3-3v-12a2 2 0 0 0-2-2M10 9h4M10 13h4\"/>","search":"<circle cx=\"11\" cy=\"11\" r=\"6.5\"/><path d=\"m20 20-4.2-4.2\"/>","seedling":"<path d=\"M12 20v-9M12 11C12 7 9.5 4.5 5 4.5c0 4 2.5 6.5 7 6.5ZM12 13.5c0 -4 2.5 -6.5 7 -6.5 0 4 -2.5 6.5 -7 6.5Z\"/>","server":"<rect x=\"4\" y=\"4\" width=\"16\" height=\"7\" rx=\"2\"/><rect x=\"4\" y=\"13\" width=\"16\" height=\"7\" rx=\"2\"/><path d=\"M8 7.5h.01M8 16.5h.01\"/>","shapes":"<circle cx=\"7.5\" cy=\"7.5\" r=\"3.5\"/><path d=\"m16.5 3.5 4 7h-8ZM14 14h6v6h-6ZM3.5 20l3.5-6 3.5 6Z\"/>","share":"<path d=\"M12 15V3.5M7.5 8 12 3.5 16.5 8M5 13v6a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-6\"/>","shelter":"<path d=\"M2.5 10.5 12 3l9.5 7.5M5 9v12M19 9v12\"/><circle cx=\"12\" cy=\"11\" r=\"1.8\"/><path d=\"M9.5 21v-4.5a2.5 2.5 0 0 1 5 0V21\"/>","shield":"<path d=\"M12 3 5 6v6c0 4.4 3 7.6 7 9 4-1.4 7-4.6 7-9V6Z\"/>","shirt":"<path d=\"M8 3 3 6l2 4 2-1v12h10V9l2 1 2-4-5-3c-.5 1.5-2 2.5-4 2.5S8.5 4.5 8 3Z\"/>","signature":"<path d=\"M3 14.5c2.5 0 3.5 -9 6 -9 1.5 0 1 6 2.5 6 1 0 1.5 -2.5 2.5 -2.5s0.8 2 2 2c0.8 0 1.5 -0.6 2 -1.2M3 18.5h18\"/>","skip":"<path d=\"M6 5l9 7-9 7Z\"/><path d=\"M18.5 5v14\"/>","skull":"<path d=\"M12 3a7 7 0 0 0-7 7c0 2.3 1.1 3.9 2.5 5v3h9v-3c1.4-1.1 2.5-2.7 2.5-5a7 7 0 0 0-7-7Z\"/><circle cx=\"9.5\" cy=\"10.5\" r=\"1.4\"/><circle cx=\"14.5\" cy=\"10.5\" r=\"1.4\"/><path d=\"M10.5 18v3M13.5 18v3\"/>","slash":"<path d=\"M5 5l14 14\"/>","sliders":"<path d=\"M4 7h9.5M18.5 7H20M4 17h3.5M12.5 17H20\"/><circle cx=\"16\" cy=\"7\" r=\"2.3\"/><circle cx=\"10\" cy=\"17\" r=\"2.3\"/>","smile":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8.5 14a4 4 0 0 0 7 0M9 9.5h.01M15 9.5h.01\"/>","snow":"<path d=\"M12 3v18M4.2 7.5l15.6 9M4.2 16.5l15.6-9M9.5 4.5 12 7l2.5-2.5M9.5 19.5 12 17l2.5 2.5\"/>","sort":"<path d=\"M4 6h9M4 12h6M4 18h3M17.5 5v14M14.5 16l3 3 3-3\"/>","sort-asc":"<path d=\"M4 6h3M4 12h6M4 18h9M17.5 5v14M14.5 16l3 3 3-3\"/>","spark":"<path d=\"M11.5 3l1.8 5.2L18.5 10l-5.2 1.8L11.5 17l-1.8 -5.2L4.5 10l5.2 -1.8ZM18.5 15l0.8 2.2L21.5 18l-2.2 0.8L18.5 21l-0.8 -2.2L15.5 18l2.2 -0.8Z\"/>","square":"<rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2.5\"/>","star":"<path d=\"m12 4 2.4 5 5.4.6-4 3.7 1.1 5.4L12 16l-4.9 2.7 1.1-5.4-4-3.7 5.4-.6Z\"/>","steps":"<path d=\"M9 6h11M9 12h11M9 18h11\"/><path d=\"m3 6 1.5 1.5L7 5M3 12l1.5 1.5L7 11M3 18l1.5 1.5L7 17\"/>","stop":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m8.5 8.5 7 7\"/>","store":"<path d=\"M4 9 5.5 4h13L20 9M4 9h16v1.5a2.7 2.7 0 0 1-5.3 0 2.7 2.7 0 0 1-5.4 0A2.7 2.7 0 0 1 4 10.5ZM5 13v7h14v-7M10 20v-4h4v4\"/>","storm":"<path d=\"M7 16.5a4.5 4.5 0 1 1 0.9 -8.9A5.5 5.5 0 0 1 18.5 10a3.8 3.8 0 0 1 -0.5 7.5\"/><path d=\"m13 12 -2.5 4h3L11 20\"/>","sun":"<circle cx=\"12\" cy=\"12\" r=\"3.8\"/><path d=\"M12 2.5v2M12 19.6v2M5.25 5.25l1.4 1.4M17.4 17.4l1.4 1.4M2.5 12h2M19.6 12h2M5.25 18.75l1.4 -1.4M17.4 6.6l1.4 -1.4\"/>","swap":"<path d=\"M4 8h14l-3.5-3.5M20 16H6l3.5 3.5\"/>","sword":"<path d=\"M20 4v3.5L10.5 17 7 13.5 16.5 4Z\"/><path d=\"M5.5 12 12 18.5M8.5 15.5 4 20\"/>","table":"<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20\"/>","tack":"<path d=\"M9 3h6l-1 5 3 3H7l3-3ZM12 11v10\"/>","tag":"<path d=\"M3 11V3h8l10 10 -8 8Z\"/><circle cx=\"7.5\" cy=\"7.5\" r=\"1.3\"/>","target":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/>","tent":"<path d=\"M2.5 20h19M12 5 4 20M12 5l8 15M12 13.5 9 20M12 13.5l3 6.5\"/>","terminal":"<rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"m7 9 3 3-3 3M13 15h4\"/>","text":"<path d=\"M5.5 20 11 4h2l5.5 16M7.6 14h8.8\"/>","thumbs-up":"<path d=\"M7 10.5v9.5H4.5a1 1 0 0 1-1-1v-7.5a1 1 0 0 1 1-1Z\"/><path d=\"M7 10.5 10.5 3.5a2.2 2.2 0 0 1 2.5 2.6L12.3 9.5H18a2 2 0 0 1 2 2.4l-1.3 6.5a2 2 0 0 1-2 1.6H7\"/>","ticket":"<path d=\"M3 7h18v3a2 2 0 0 0 0 4v3H3v-3a2 2 0 0 0 0-4Z\"/><path d=\"M14 7v10\"/>","timeline":"<path d=\"M3 12h1M8 12h2M14 12h2M20 12h1\"/><circle cx=\"6\" cy=\"12\" r=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><circle cx=\"18\" cy=\"12\" r=\"2\"/><path d=\"M6 10V5.5M12 14v4.5M18 10V5.5\"/>","toolbox":"<rect x=\"3\" y=\"8\" width=\"18\" height=\"12\" rx=\"2\"/><path d=\"M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3\"/>","train":"<rect x=\"6\" y=\"3\" width=\"12\" height=\"13\" rx=\"3\"/><path d=\"M6 10h12M9 13h.01M15 13h.01M8.5 21l2-3.5M15.5 21l-2-3.5\"/>","trash":"<path d=\"M4 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3\"/>","tree":"<path d=\"M12 3 6.5 10.5h3L5 17h14l-4.5-6.5h3ZM12 17v4\"/>","trend-down":"<path d=\"M3 7l6 6 4-4 8 8\"/><path d=\"M15 17h6v-6\"/>","trend-up":"<path d=\"M3 17 9 11l4 4 8-8\"/><path d=\"M15 7h6v6\"/>","trophy":"<path d=\"M8 4h8v5a4 4 0 0 1-8 0ZM8 6H5a3 3 0 0 0 3 4M16 6h3a3 3 0 0 1-3 4M12 13v4M8 20h8\"/>","tv":"<rect x=\"2.5\" y=\"7\" width=\"19\" height=\"13\" rx=\"2\"/><path d=\"m8 3 4 4 4-4\"/>","umbrella":"<path d=\"M3 12a9 9 0 0 1 18 0ZM12 12v6.5a2 2 0 0 1-4 0M12 3v.01\"/>","undo":"<path d=\"M9 14 4 9l5-5\"/><path d=\"M4 9h10.5a5.5 5.5 0 0 1 0 11H11\"/>","up":"<path d=\"m5.4 15.3 6.6-6.6 6.6 6.6\"/>","upload":"<path d=\"M12 20V9M7 14l5-5 5 5M5 4h14\"/>","user":"<circle cx=\"12\" cy=\"8\" r=\"3.5\"/><path d=\"M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6\"/>","user-check":"<circle cx=\"9\" cy=\"8\" r=\"3.2\"/><path d=\"M3 20c0-3.3 2.7-5.5 6-5.5s6 2.2 6 5.5M16 11l2 2 4-4\"/>","user-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/><path d=\"M6.6 18.3a6.5 6.5 0 0 1 10.8 0\"/>","user-lock":"<circle cx=\"10\" cy=\"8\" r=\"3.5\"/><path d=\"M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7\"/><rect x=\"15\" y=\"15.5\" width=\"6\" height=\"5\" rx=\"1\"/><path d=\"M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2\"/>","user-minus":"<circle cx=\"10\" cy=\"8\" r=\"3.5\"/><path d=\"M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7\"/><path d=\"M15.5 17.5h6\"/>","user-off":"<circle cx=\"12\" cy=\"8\" r=\"3.5\"/><path d=\"M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6\"/><path d=\"M3.5 3.5l17 17\"/>","user-pen":"<circle cx=\"10\" cy=\"8\" r=\"3.5\"/><path d=\"M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7\"/><path d=\"M20 12.5l1.5 1.5-5 5-2 .5.5-2Z\"/>","user-tag":"<circle cx=\"10\" cy=\"8\" r=\"3.5\"/><path d=\"M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7\"/><path d=\"M14.5 15h4l2.5 2.5-2.5 2.5h-4Z\"/><path d=\"M16.5 17.5h.01\"/>","video":"<rect x=\"3\" y=\"6\" width=\"13\" height=\"12\" rx=\"2\"/><path d=\"m16 10 5-3v10l-5-3\"/>","volume":"<path d=\"M4 9.5h3.5L12 6v12l-4.5-3.5H4Z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5M18 7a7 7 0 0 1 0 10\"/>","walk":"<circle cx=\"12.5\" cy=\"4.5\" r=\"1.9\"/><path d=\"m8.5 21 2.6 -6 2.1 2.4V21M11.1 15l1 -5.6 -3 1.6 -1.5 3M12.1 9.4l2 3 3 1\"/>","wallet":"<path d=\"M4 7.5A2.5 2.5 0 0 1 6.5 5H18v4M4 7.5V18a2 2 0 0 0 2 2h14V9H6.5A2.5 2.5 0 0 1 4 7.5Z\"/><path d=\"M16 14.5h.01\"/>","water":"<path d=\"M2.5 10c2.4 0 2.4 -2 4.8 -2s2.4 2 4.7 2 2.4 -2 4.8 -2 2.4 2 4.7 2M2.5 16c2.4 0 2.4 -2 4.8 -2s2.4 2 4.7 2 2.4 -2 4.8 -2 2.4 2 4.7 2\"/>","wave":"<path d=\"M3.45 16.3c2.25 0 2.25 -1.8 4.5 -1.8s2.25 1.8 4.5 1.8 2.25 -1.8 4.5 -1.8 2.25 1.8 4.5 1.8\"/><path d=\"M6.45 12.5A6 6 0 0 1 17.15 8.95c-2.05 -0.45 -3.8 0.35 -4.3 2.15\"/>","weight":"<circle cx=\"12\" cy=\"5.5\" r=\"2\"/><path d=\"M7 9h10l3 11.5H4Z\"/>","wifi":"<path d=\"M2.5 9a14 14 0 0 1 19 0M5.5 12.5a9.5 9.5 0 0 1 13 0M8.5 16a5 5 0 0 1 7 0M12 19.5h.01\"/>","wind":"<path d=\"M3 10h11a3 3 0 1 0 -3 -3M3 14h15a3 3 0 1 1 -3 3M3 18h7\"/>","window":"<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M3.5 9h17\"/>","window-restore":"<rect x=\"3.5\" y=\"8.5\" width=\"12\" height=\"11\" rx=\"2\"/><path d=\"M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3\"/>","wizard":"<path d=\"M4 20h16M6.5 20 10 9.5 15.5 4 14 10.5 17.5 20\"/><path d=\"M8.6 15.5h7\"/>","wrench":"<path d=\"M14.5 4a5 5 0 0 0-4.4 7L4 17.1V20h2.9l6.1-6.1a5 5 0 0 0 7-4.4l-3 1.1-2.4-2.4 1.1-3Z\"/>","x-circle":"<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"m9 9 6 6M15 9l-6 6\"/>","zap":"<path d=\"M13 3 5 13h6l-1 8 8-10h-6Z\"/>"};
-- const S = {"alert":"<path fill-rule=\"evenodd\" d=\"M10.4 3.9a1.85 1.85 0 0 1 3.2 0l8.3 14.4a1.85 1.85 0 0 1-1.6 2.8H3.7a1.85 1.85 0 0 1-1.6-2.8ZM10.9 9h2.2v5.6h-2.2ZM12 15.9a1.3 1.3 0 1 1 0 2.6 1.3 1.3 0 0 1 0-2.6Z\"/>","alert-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM10.8 6.8h2.4v7h-2.4ZM12 15.1a1.45 1.45 0 1 1 0 2.9 1.45 1.45 0 0 1 0-2.9Z\"/>","archive":"<rect x=\"2.6\" y=\"3.4\" width=\"18.8\" height=\"5.4\" rx=\"1.2\"/><path fill-rule=\"evenodd\" d=\"M4.4 10h15.2v9.2a1.6 1.6 0 0 1-1.6 1.6H6a1.6 1.6 0 0 1-1.6-1.6ZM9.6 12.4v1.8h4.8v-1.8Z\"/>","bell":"<path d=\"M5.8 14.7V9.5a6.2 6.2 0 0 1 12.4 0v5.2l1.7 2.3H4.1ZM9.9 18.1h4.2a2.1 2.1 0 0 1 -4.2 0Z\"/>","book":"<path d=\"M4.5 5A2.5 2.5 0 0 1 7 2.5h12.5v15H7a2.5 2.5 0 0 0-2.5 2.5Z\"/><path class=\"ln\" d=\"M7.5 20.5h11.5\"/>","book-open":"<path d=\"M11 6.4C9 5 6.3 4.5 3 5.1v13.3c3.3-.6 6 0 8 1.4ZM13 6.4c2-1.4 4.7-1.9 8-1.3v13.3c-3.3-.6-6 0-8 1.4Z\"/>","box":"<path d=\"m12 3.6 8.9 4.3-8.9 4.3-8.9-4.3ZM3.1 9.5l8.1 3.9v7.8l-8.1-4.1ZM20.9 9.5l-8.1 3.9v7.8l8.1-4.1Z\"/>","brain":"<path d=\"M9 3.8a3.1 3.1 0 0 0-3.1 3 3 3 0 0 0-2.1 5.2 3 3 0 0 0 2.1 5.1 3.1 3.1 0 0 0 5.5 1.3V5.5A2.2 2.2 0 0 0 9 3.8Z\"/><path d=\"M15 3.8a3.1 3.1 0 0 1 3.1 3 3 3 0 0 1 2.1 5.2 3 3 0 0 1-2.1 5.1 3.1 3.1 0 0 1-5.5 1.3V5.5A2.2 2.2 0 0 1 15 3.8Z\"/>","bridge":"<path d=\"M1.8 15.4h20.4v2.8H1.8ZM3.6 10.4h2v5H3.6ZM18.4 10.4h2v5h-2Z\"/><path class=\"ln\" d=\"M2 10.5c4 0 6 -3 10 -3s6 3 10 3M8.5 15.4V12.6M15.5 15.4V12.6M12 15.4V9\"/>","bug":"<path fill-rule=\"evenodd\" d=\"M12 7a4.8 4.8 0 0 1 4.8 4.8v3.4a4.8 4.8 0 0 1 -9.6 0v-3.4A4.8 4.8 0 0 1 12 8Zm-0.7 4.4v7.4h1.4v-7.4Z\"/><path d=\"M9.4 5.8a2.6 2.6 0 0 1 5.2 0Z\"/><path class=\"ln\" d=\"M7.2 12.5H3.8M20.2 12.5h-3.4M7.6 9.4 5 7M16.4 9.4 19 7M7.6 16.6 5 19M16.4 16.6 19 19\"/>","calendar":"<path fill-rule=\"evenodd\" d=\"M4 7.4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2V19a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2Zm2.2 4V18.8h11.6v-7.4Z\"/><path class=\"ln\" d=\"M9 3.2v3.6M15 3.2v3.6\"/>","camera":"<path fill-rule=\"evenodd\" d=\"M3 8.3a1.8 1.8 0 0 1 1.8-1.8h2.5L9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v10.1a1.8 1.8 0 0 1-1.8 1.8H4.8A1.8 1.8 0 0 1 3 18.4Zm9 1.9a3.4 3.4 0 1 0 0 6.8 3.4 3.4 0 0 0 0-6.8Z\"/>","care":"<path d=\"M16.5 11.6s-3.8 -2.3 -3.8 -5a2.2 2.2 0 0 1 3.8 -1.5 2.2 2.2 0 0 1 3.8 1.5c0 2.7 -3.8 5 -3.8 5Z\"/><path class=\"ln\" d=\"M4 16.5h3l4 3h5.5a2 2 0 0 0 0 -4H13M8 16.5l2.2 -2h3.3\"/>","cart":"<path d=\"M5.5 6.4h16.1l-2.7 8.9H7.5Z\"/><circle cx=\"9\" cy=\"19.6\" r=\"1.7\"/><circle cx=\"17\" cy=\"19.6\" r=\"1.7\"/><path class=\"ln\" d=\"M2.8 4H5l2.5 11.3\"/>","chart":"<path class=\"ln\" d=\"M4 4v16h16\"/><path d=\"M7 15.2 10.9 10.7l3 2.5 5.1-6.1V18H7Z\"/>","chat":"<path d=\"M3.5 5.6A1.6 1.6 0 0 1 5.1 4h13.8a1.6 1.6 0 0 1 1.6 1.6v9.8a1.6 1.6 0 0 1-1.6 1.6H8.6L3.5 21Z\"/>","check-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.3 8.9l1.6 1.6-6.9 6.9-4.1-4.1 1.6-1.6 2.5 2.5Z\"/>","chip":"<path fill-rule=\"evenodd\" d=\"M8.2 6.6h7.6a1.6 1.6 0 0 1 1.6 1.6v7.6a1.6 1.6 0 0 1-1.6 1.6H8.2a1.6 1.6 0 0 1-1.6-1.6V8.2a1.6 1.6 0 0 1 1.6-1.6Zm1.9 3.5v3.8h3.8v-3.8Z\"/><path class=\"ln\" d=\"M10 3v3.6M14 3v3.6M10 17.4V21M14 17.4V21M3 10h3.6M3 14h3.6M17.4 10H21M17.4 14H21\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"9\"/>","city":"<path fill-rule=\"evenodd\" d=\"M4.6 8.8h5.2v12.4H4.6Zm2.2 2.6v1.6h1.4v-1.6Zm0 3.4v1.6h1.4v-1.6Z\"/><path fill-rule=\"evenodd\" d=\"M10.6 3.8h5.8v17.4h-5.8Zm2 2.8v1.6h1.6V6.6Zm0 3.4v1.6h1.6V10Zm0 3.4v1.6h1.6v-1.6Z\"/><path d=\"M17.2 12.8h2.6v8.4h-2.6Z\"/><path class=\"ln\" d=\"M2.8 21.2h18.4\"/>","clipboard":"<path fill-rule=\"evenodd\" d=\"M7.4 4.4h9.2a2.1 2.1 0 0 1 2.1 2.1v13.4a2.1 2.1 0 0 1-2.1 2.1H7.4a2.1 2.1 0 0 1-2.1-2.1V6.5a2.1 2.1 0 0 1 2.1-2.1ZM9 10.2v1.6h6v-1.6Zm0 4v1.6h4v-1.6Z\"/><rect x=\"8.6\" y=\"2.6\" width=\"6.8\" height=\"3.8\" rx=\"1.2\"/>","clock":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM10.9 6.6h2.2v5l3.2 1.9-1.1 1.9-4.3-2.6Z\"/>","cloud":"<path d=\"M7 18.8h10a4.4 4.4 0 0 0 .6-8.8A6.4 6.4 0 0 0 5.4 9.4 4.7 4.7 0 0 0 7 18.8Z\"/>","coin":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM11 6h2v1.2c1.1.2 2 .8 2.5 1.7l-1.7 1c-.3-.6-1-1-1.8-1-.9 0-1.5.4-1.5 1s.5.8 1.8 1.1c1.8.4 3.4 1 3.4 3 0 1.4-1 2.4-2.7 2.7V18h-2v-1.3c-1.2-.2-2.2-.9-2.7-1.9l1.7-1c.4.7 1.1 1.1 2 1.1 1 0 1.6-.4 1.6-1s-.6-.8-1.9-1.1c-1.7-.4-3.3-1-3.3-2.9 0-1.3 1-2.3 2.6-2.6Z\"/>","compress":"<path d=\"M9.8 9.8H3.2L9.8 3.2ZM14.2 9.8h6.6l-6.6-6.6ZM9.8 14.2H3.2l6.6 6.6ZM14.2 14.2h6.6l-6.6 6.6Z\"/>","computer":"<rect x=\"2.6\" y=\"3.6\" width=\"18.8\" height=\"12.8\" rx=\"2.2\"/><path class=\"ln\" d=\"M8 20.2h8M12 16.4v3.8\"/>","copy":"<rect x=\"7.6\" y=\"7.6\" width=\"13\" height=\"13\" rx=\"2.4\"/><path class=\"ln\" d=\"M16 7.6V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h1.6\"/>","crown":"<path d=\"M2.6 7.8 7.4 12 12 4.6 16.6 12l4.8-4.2-2 11.7H4.6Z\"/>","database":"<ellipse cx=\"12\" cy=\"6\" rx=\"7.4\" ry=\"3\"/><path d=\"M4.6 7.6a7.4 3 0 0 0 14.8 0v4a7.4 3 0 0 1-14.8 0ZM4.6 13.2a7.4 3 0 0 0 14.8 0v4.4a7.4 3 0 0 1-14.8 0Z\"/>","dish":"<path d=\"M4.6 9.4A10 10 0 0 0 14.6 19.4Z\"/><path class=\"ln\" d=\"m9.8 14.2 4.2-4.2M14.5 4.5a5 5 0 0 1 5 5M14.5 8a1.5 1.5 0 0 1 1.5 1.5\"/>","download":"<path d=\"M10.8 3.6h2.4v6.6h4.4L12 15.8l-5.6-5.6h4.4Z\"/><path class=\"ln\" d=\"M5 20h14\"/>","drive":"<path fill-rule=\"evenodd\" d=\"M4.9 12.1h14.2a2.8 2.8 0 0 1 2.8 2.8v3.2a2.8 2.8 0 0 1-2.8 2.8H4.9a2.8 2.8 0 0 1-2.8-2.8v-3.2a2.8 2.8 0 0 1 2.8-2.8ZM17 15.3a1.2 1.2 0 1 1 0 2.4 1.2 1.2 0 0 1 0-2.4ZM13.8 15.3a1.2 1.2 0 1 1 0 2.4 1.2 1.2 0 0 1 0-2.4Z\"/><path class=\"ln\" d=\"M3.6 12.6 6.5 5h11l2.9 7.6\"/>","drop":"<path d=\"M12 2.4s6.4 6.8 6.4 11.6a6.4 6.4 0 0 1-12.8 0C5.6 9.2 12 2.4 12 2.4Z\"/>","expand":"<path d=\"M3.2 3.2h6.6L3.2 9.8ZM20.8 3.2h-6.6l6.6 6.6ZM3.2 20.8h6.6l-6.6-6.6ZM20.8 20.8h-6.6l6.6-6.6Z\"/>","eye":"<path fill-rule=\"evenodd\" d=\"M12 4.8C6 4.8 1.8 12 1.8 12s4.2 7.2 10.2 7.2S22.2 12 22.2 12 18 4.8 12 4.8Zm0 3.6a3.6 3.6 0 1 1 0 7.2 3.6 3.6 0 0 1 0-7.2Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.7\"/>","eye-off":"<path d=\"M8.71 5.31A10.83 10.83 0 0 1 22.2 12a10.83 10.83 0 0 1-2.66 4.14L15.6 12.2a3.6 3.6 0 0 0-3.8-3.8ZM15.29 18.69A10.83 10.83 0 0 1 1.8 12a10.83 10.83 0 0 1 2.66-4.14L8.4 11.8a3.6 3.6 0 0 0 3.8 3.8Z\"/><path class=\"ln\" d=\"m4 4 16 16\"/>","file":"<path d=\"M6 2.6h7.6v5.2h5V21.4H6ZM15.2 2.9l3.1 3.3h-3.1Z\"/>","film":"<path fill-rule=\"evenodd\" d=\"M5 3.8h14a2.2 2.2 0 0 1 2.2 2.2v12a2.2 2.2 0 0 1-2.2 2.2H5A2.2 2.2 0 0 1 2.8 18V6A2.2 2.2 0 0 1 5 3.8Zm3.7 1.9v12.6h6.6V5.7ZM4.6 6.2v1.9h2V6.2Zm0 4.9v1.8h2v-1.8Zm0 4.8v1.9h2v-1.9Zm12.8-9.7v1.9h2V6.2Zm0 4.9v1.8h2v-1.8Zm0 4.8v1.9h2v-1.9Z\"/>","fire":"<path fill-rule=\"evenodd\" d=\"M12 20a6.3 6.3 0 0 0 6.3 -6.3c0 -4 -2.7 -6.3 -3.9 -9.5 -1.9 2.1 -2.4 4.2 -2.4 4.2S10.8 6.5 9.7 4.6C7.4 7.2 5.7 10.3 5.7 13.7A6.3 6.3 0 0 0 12 21.5Zm0 -2.6a2.6 2.6 0 0 0 2.6 -2.6c0 -1.5 -1.1 -2.5 -1.6 -3.7 -0.8 0.9 -1 1.7 -1 1.7s-0.5 -0.8 -0.9 -1.5c-0.9 1.1 -1.6 2.3 -1.6 3.6a2.6 2.6 0 0 0 2.5 2.5Z\"/>","flag":"<path class=\"ln\" d=\"M6.5 21V3.8\"/><path d=\"M7.1 3.6h11.6l-2.1 4.4 2.1 4.4H7.1Z\"/>","folder":"<path d=\"M2.8 6.8a2 2 0 0 1 2-2h4.4l2 2h8a2 2 0 0 1 2 2v8.6a2 2 0 0 1-2 2H4.8a2 2 0 0 1-2-2Z\"/>","food":"<path d=\"M5.2 3h1.5v4.6h0.6V3h1.4v4.6h0.6V3h1.5v4.8A2.8 2.8 0 0 1 9 10.4V21H7V10.4a2.8 2.8 0 0 1 -1.8 -2.6ZM19 21h-2.2v-7.2h-2.9V10c0 -3.8 1.7 -6.4 5.1 -7.5Z\"/>","game":"<path fill-rule=\"evenodd\" d=\"M7.6 6.4h8.8a5.8 5.8 0 0 1 0 11.6H7.6a5.8 5.8 0 0 1 0-11.6Zm-1.4 3.8v1.6H4.6v1.8h1.6v1.6H8v-1.6h1.6v-1.8H8v-1.6Zm9.3 1a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Zm2.6 1.6a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z\"/>","gauge":"<path fill-rule=\"evenodd\" d=\"M4.5 17.5A9 9 0 1 1 19.5 19ZM15.3 8.45l-2.1 5.4 -2.05 0.25 -0.4 -2Z\"/>","gavel":"<path d=\"M11.3 5.9 4.9 12.3l6.8 6.8 6.4-6.4Z\"/><path class=\"ln\" d=\"m14 4.5 5.5 5.5M3 21l6.3-6.3M14 21h7\"/>","gear":"<path fill-rule=\"evenodd\" d=\"M18.5 14.65a1.5 1.5 0 0 0 0.3 1.8l0.1 0.1a1.75 1.75 0 1 1 -2.8 2.8l-0.1 -0.1a1.5 1.5 0 0 0 -1.8 -0.3 1.5 1.5 0 0 0 -1 1.5V19.9a1.75 1.75 0 1 1 -4 0v-0.1a1.5 1.5 0 0 0 -1.1 -1.5 1.5 1.5 0 0 0 -1.8 0.3l-0.1 0.1a1.75 1.75 0 1 1 -2.8 -2.8l0.1 -0.1a1.5 1.5 0 0 0 0.3 -1.8 1.5 1.5 0 0 0 -1.5 -1H4.15a1.75 1.75 0 1 1 0 -4h0.1a1.5 1.5 0 0 0 1.5 -1.1 1.5 1.5 0 0 0 -0.3 -1.8l-0.1 -0.1a1.75 1.75 0 1 1 2.8 -2.8l0.1 0.1a1.5 1.5 0 0 0 1.8 0.3H9.4a1.5 1.5 0 0 0 1 -1.5V4.15a1.75 1.75 0 1 1 4 0v0.1a1.5 1.5 0 0 0 1 1.5 1.5 1.5 0 0 0 1.8 -0.3l0.1 -0.1a1.75 1.75 0 1 1 2.8 2.8l-0.1 0.1a1.5 1.5 0 0 0 -0.3 1.8V9.4a1.5 1.5 0 0 0 1.5 1H19.9a1.75 1.75 0 1 1 0 4h-0.1a1.5 1.5 0 0 0 -1.5 1ZM12 9.05a3 3 0 1 0 0 6.8 3 3 0 0 0 0 -6.8Z\"/>","gem":"<path d=\"M6.4 3.6h11.2l3.8 5.3-9.4 11.6L2.6 8.9Z\"/>","ghost":"<path fill-rule=\"evenodd\" d=\"M4.8 20.6V11a7.2 7.2 0 0 1 14.4 0v9.6l-2.4-1.8-2.4 1.8-2.4-1.8-2.4 1.8-2.4-1.8ZM9.4 9.3a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6Zm5.2 0a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6Z\"/>","gift":"<path d=\"M3.4 8.6h17.2v3.2H3.4ZM4.6 12.8h6.4v8H5.6a1 1 0 0 1-1-1ZM13 12.8h6.4v7a1 1 0 0 1-1 1H13Z\"/><path class=\"ln\" d=\"M12 8.6c-1.5-3-5-4-5-1.5S12 8.6 12 8.6s5-1 5-3.5-3.5-1.5-5 3.5\"/>","globe":"<path d=\"M2.84 11.1A9.2 9.2 0 0 1 12 2.8a4.4 9.2 0 0 0-4.38 8.3ZM21.16 11.1A9.2 9.2 0 0 0 12 2.8a4.4 9.2 0 0 1 4.38 8.3ZM2.84 12.9A9.2 9.2 0 0 0 12 21.2a4.4 9.2 0 0 1-4.38-8.3ZM21.16 12.9A9.2 9.2 0 0 1 12 21.2a4.4 9.2 0 0 0 4.38-8.3ZM12 2.8a2.6 9.2 0 0 0-2.59 8.3h5.18A2.6 9.2 0 0 0 12 2.8ZM12 21.2a2.6 9.2 0 0 1-2.59-8.3h5.18A2.6 9.2 0 0 1 12 21.2Z\"/>","group":"<rect x=\"6.2\" y=\"6.2\" width=\"7.2\" height=\"5.4\" rx=\"1.2\"/><rect x=\"10.6\" y=\"12.6\" width=\"7.2\" height=\"5.2\" rx=\"1.2\"/><path class=\"ln\" d=\"M3 7V3h4M17 3h4v4M21 17v4h-4M7 21H3v-4\"/>","hand":"<path d=\"M9.2 14.2V5.5a1.3 1.3 0 0 1 2.6 0v4.9a0.5 0.5 0 0 0 1 0V4.4a1.3 1.3 0 0 1 2.6 0v6a0.5 0.5 0 0 0 1 0V6.2a1.3 1.3 0 0 1 2.6 0v7.2c0 4.2 -2.6 7.2 -6.8 7.2 -2.7 0 -4.4 -1.4 -5.9 -3.7l-1.7 -2.7a1.6 1.6 0 0 1 2.6 -1.9Z\"/>","headphones":"<path class=\"ln\" d=\"M4 14.5V12a8 8 0 0 1 16 0v2.5\"/><rect x=\"2.6\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/><rect x=\"16\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/>","heart":"<path d=\"M12 20.1s-7.6 -4.6 -7.6 -10.6a4.3 4.3 0 0 1 7.6 -2.9 4.3 4.3 0 0 1 7.6 2.9c0 6 -7.6 10.6 -7.6 10.6Z\"/>","help":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM8.4 9.4A3.6 3.6 0 1 1 13 12.86v1.54h-2V11h1a1.6 1.6 0 1 0-1.6-1.6ZM12 15.75a1.25 1.25 0 1 1 0 2.5 1.25 1.25 0 0 1 0-2.5Z\"/>","history":"<path d=\"M6.06 6.06A8.4 8.4 0 1 1 3.6 12h2.8a5.6 5.6 0 1 0 1.64-3.96ZM3 3.2v6.6h6.6ZM11 8.2h2v3.4l2.5 1.5-1 1.7-3.5-2.1Z\"/>","home":"<path d=\"M3.3 11.2 12 3.6l8.7 7.6v8.9a1 1 0 0 1-1 1h-5.2v-6.4h-5v6.4H4.3a1 1 0 0 1-1-1Z\"/>","hot-tub":"<circle cx=\"8\" cy=\"5.3\" r=\"2.5\"/><path d=\"M2.1 11.1h19.8v4.4a5.4 5.4 0 0 1-5.4 5.4h-9a5.4 5.4 0 0 1-5.4-5.4Z\"/><path class=\"ln\" d=\"M6 11.1v-.6A2.5 2.5 0 0 1 8.5 8H9M13.5 9.5c.8-1-.8-2 0-3M17.5 9.5c.8-1-.8-2 0-3\"/>","id":"<path fill-rule=\"evenodd\" d=\"M5 4.8h14a2.2 2.2 0 0 1 2.2 2.2v10a2.2 2.2 0 0 1-2.2 2.2H5A2.2 2.2 0 0 1 2.8 17V7A2.2 2.2 0 0 1 5 4.8Zm4 4.1a2.1 2.1 0 1 0 0 4.2 2.1 2.1 0 0 0 0-4.2Zm-3.1 7.5h6.2c-.6-1.7-1.8-2.6-3.1-2.6s-2.5.9-3.1 2.6Zm8.6-7v1.5h3.9V9.4Zm0 3.5v1.5h3.9v-1.5Z\"/>","idea":"<path d=\"M8.3 15.3A6.5 6.5 0 1 1 15.7 15.3c-.7.6-1.3 1.3-1.4 2.2H9.7c-.1-.9-.7-1.6-1.4-2.2Z\"/><path class=\"ln\" d=\"M9.6 20.8h4.8\"/>","image":"<path fill-rule=\"evenodd\" d=\"M3 6.1a2.6 2.6 0 0 1 2.6-2.6h12.8A2.6 2.6 0 0 1 21 6.1v11.8a2.6 2.6 0 0 1-2.6 2.6H5.6A2.6 2.6 0 0 1 3 17.9Zm6 2.1a1.9 1.9 0 1 0 0 3.8 1.9 1.9 0 0 0 0-3.8Zm7.2 3.3-8 7.5h10.2a1.4 1.4 0 0 0 1.4-1.4v-2.9Z\"/>","info":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM10.8 10.6h2.4V17h-2.4ZM12 6.5a1.45 1.45 0 1 1 0 2.9 1.45 1.45 0 0 1 0-2.9Z\"/>","invite":"<circle cx=\"9\" cy=\"7.9\" r=\"3.6\"/><path d=\"M2.4 20.8c0-3.8 3-6.5 6.6-6.5s6.6 2.7 6.6 6.5Z\"/><path class=\"ln\" d=\"M19 8v6M16 11h6\"/>","key":"<path fill-rule=\"evenodd\" d=\"M8 9.8a5.2 5.2 0 1 1 0 10.4 5.2 5.2 0 0 1 0-10.4Zm0 3.4a1.8 1.8 0 1 0 0 3.6 1.8 1.8 0 0 0 0-3.6Z\"/><path class=\"ln\" d=\"m11.2 11.8 8.3-8.3M16 7l3 3M13.8 9.2l2 2\"/>","keyboard":"<path fill-rule=\"evenodd\" d=\"M4.4 5.4h15.2A2.4 2.4 0 0 1 22 7.8v8.4a2.4 2.4 0 0 1-2.4 2.4H4.4A2.4 2.4 0 0 1 2 16.2V7.8a2.4 2.4 0 0 1 2.4-2.4ZM5 9h2v2H5ZM8 9h2v2H8ZM11 9h2v2h-2ZM14 9h2v2h-2ZM17 9h2v2h-2ZM7.6 13.4h8.8v1.8H7.6Z\"/>","layers":"<path d=\"m12 3.9 9.6 5.6 -9.6 5.6 -9.6 -5.6Z\"/><path class=\"ln\" d=\"m3 14.6 9 5 9 -5\"/>","leaf":"<path fill-rule=\"evenodd\" d=\"M5 19c0-8.5 5-13.6 15-15-.9 9.9-6 15-15 15Zm2.9-1.9L16 8l-9.1 8.1Z\"/><path class=\"ln\" d=\"M3.4 20.6 5.6 18.4\"/>","live":"<circle cx=\"12\" cy=\"12\" r=\"3.1\"/><path class=\"ln\" d=\"M7.8 7.8a6 6 0 0 0 0 8.4M16.2 7.8a6 6 0 0 1 0 8.4M5 5a10 10 0 0 0 0 14M19 5a10 10 0 0 1 0 14\"/>","lock":"<path d=\"M5 11.6a1.6 1.6 0 0 1 1.6-1.6h10.8a1.6 1.6 0 0 1 1.6 1.6v8a1.6 1.6 0 0 1-1.6 1.6H6.6A1.6 1.6 0 0 1 5 19.6Z\"/><path class=\"ln\" d=\"M8.2 10V7.6a3.8 3.8 0 0 1 7.6 0V10\"/>","mail":"<path d=\"M3 7.6v-.4A2.2 2.2 0 0 1 5.2 5h13.6A2.2 2.2 0 0 1 21 7.2v.4l-8.2 5.3a1.5 1.5 0 0 1-1.6 0ZM3 9.6v7.2A2.2 2.2 0 0 0 5.2 19h13.6a2.2 2.2 0 0 0 2.2-2.2V9.6l-7.6 4.9a2.6 2.6 0 0 1-2.8 0Z\"/>","map":"<path d=\"M2.6 6.1 8.3 4.2v14l-5.7 1.9ZM9.7 4.2l4.6 1.6v14l-4.6-1.6ZM15.7 5.8l5.7-1.9v14l-5.7 1.9Z\"/>","medical":"<path fill-rule=\"evenodd\" d=\"M4.9 6.1h14.2a2.8 2.8 0 0 1 2.8 2.8v9.2a2.8 2.8 0 0 1-2.8 2.8H4.9a2.8 2.8 0 0 1-2.8-2.8V8.9a2.8 2.8 0 0 1 2.8-2.8ZM10.8 10h2.4v2.3h2.3v2.4h-2.3V17h-2.4v-2.3H8.5v-2.4h2.3Z\"/><path class=\"ln\" d=\"M9 6.1V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1.1\"/>","megaphone":"<path d=\"M3.4 10a1.1 1.1 0 0 1 1.1-1.1h2.6l9.4-4.7v15.6l-9.4-4.7H4.5A1.1 1.1 0 0 1 3.4 14Z\"/><path class=\"ln\" d=\"M7.2 15.2l1.2 4.9M19 9.4a3.3 3.3 0 0 1 0 5.2\"/>","members":"<circle cx=\"9\" cy=\"7.9\" r=\"3.6\"/><path d=\"M2.4 20.8c0-3.8 3-6.5 6.6-6.5s6.6 2.7 6.6 6.5Z\"/><circle cx=\"16.6\" cy=\"7.4\" r=\"2.9\"/><path d=\"M16.8 13.4c2.9.4 4.8 2.8 4.8 6.4V20.8h-4.4c0-2.9-1-5.2-2.8-6.7Z\"/>","mic":"<path d=\"M8.7 5.8a3.3 3.3 0 0 1 6.6 0V11a3.3 3.3 0 0 1-6.6 0Z\"/><path class=\"ln\" d=\"M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21\"/>","mic-off":"<path d=\"M8.73 5.33A3.3 3.3 0 0 1 15.3 5.8V11a3.3 3.3 0 0 1-.1.8Z\"/><path class=\"ln\" d=\"M5 11a7 7 0 0 0 11.6 5.3M19 11c0 .8-.1 1.6-.4 2.3M12 18v3M4 4l16 16\"/>","money":"<path fill-rule=\"evenodd\" d=\"M4.4 5.4h15.2a2.2 2.2 0 0 1 2.2 2.2v8.8a2.2 2.2 0 0 1-2.2 2.2H4.4a2.2 2.2 0 0 1-2.2-2.2V7.6a2.2 2.2 0 0 1 2.2-2.2ZM12 8.7a3.3 3.3 0 1 0 0 6.6 3.3 3.3 0 0 0 0-6.6ZM6 8.5a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Zm12 4.8a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/>","moon":"<path d=\"M20.4 14.4A8.5 8.5 0 1 1 9.6 3.6a7 7 0 0 0 10.8 10.8Z\"/>","mountain":"<path d=\"M2.5 19 9 6l4.2 7.2L16 9.5 21.5 19Z\"/>","music":"<path d=\"M8.4 6.6l12-2.3v3.2l-12 2.3Z\"/><path class=\"ln\" d=\"M9.5 18V7.8M19.5 16V5.6\"/><circle cx=\"6.7\" cy=\"18\" r=\"2.9\"/><circle cx=\"16.7\" cy=\"16\" r=\"2.9\"/>","mute":"<path d=\"M3.4 8.9h3.9l5.3-4.1v14.4l-5.3-4.1H3.4Z\"/><path class=\"ln\" d=\"m15.7 9.7 4.6 4.6M20.3 9.7l-4.6 4.6\"/>","news":"<path fill-rule=\"evenodd\" d=\"M4 3.6h13.4v14.3a2.1 2.1 0 0 0 2.1 2.1H6.1A2.1 2.1 0 0 1 4 18.9ZM7.5 7.3h6.4v1.6H7.5Zm0 3.5h6.4v1.6H7.5Zm0 3.5h3.8v1.6H7.5Z\"/><path class=\"ln\" d=\"M17.4 8.4H20V18a2 2 0 0 1 -2 2\"/>","nodes":"<circle cx=\"12\" cy=\"5\" r=\"3\"/><circle cx=\"5.5\" cy=\"18\" r=\"3\"/><circle cx=\"18.5\" cy=\"18\" r=\"3\"/><path class=\"ln\" d=\"M10.9 7.4 6.7 15.4M13.1 7.4l4.2 8M8.4 18h7.2\"/>","palette":"<path fill-rule=\"evenodd\" d=\"M12 2.7a9.3 9.3 0 1 0 0 18.6c1.3 0 2-.9 2-1.9 0-1.2-1-1.5-1-2.5s.8-1.6 2-1.6H17a4.3 4.3 0 0 0 4.3-4.3C21.3 6.5 17.2 2.7 12 2.7ZM7.5 9.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm2.5-3.7a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm4.5 0a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Z\"/>","parking":"<path fill-rule=\"evenodd\" d=\"M6.2 2.6h11.6a3.6 3.6 0 0 1 3.6 3.6v11.6a3.6 3.6 0 0 1-3.6 3.6H6.2a3.6 3.6 0 0 1-3.6-3.6V6.2a3.6 3.6 0 0 1 3.6-3.6ZM8.4 18V6H13a4 4 0 0 1 0 8h-2.4v4ZM10.6 8.2v3.6H13a1.8 1.8 0 0 0 0-3.6Z\"/>","pause":"<rect x=\"6.3\" y=\"4.6\" width=\"4\" height=\"14.8\" rx=\"1.2\"/><rect x=\"13.7\" y=\"4.6\" width=\"4\" height=\"14.8\" rx=\"1.2\"/>","pencil":"<path d=\"M16.3 3.2a2.3 2.3 0 0 1 3.3 3.3L7.4 18.7l-4.6 1.2 1.2-4.6Z\"/><path class=\"ln\" d=\"M12.6 20.3H21\"/>","phone":"<path d=\"M4.6 3.4h4.8l2.3 5.8-2.6 1.6a10.4 10.4 0 0 0 4.1 4.1l1.6-2.6 5.8 2.3v4.8a2.2 2.2 0 0 1-2.2 2.2A16.8 16.8 0 0 1 2.4 5.6a2.2 2.2 0 0 1 2.2-2.2Z\"/>","pin":"<path fill-rule=\"evenodd\" d=\"M12 2.3a7.3 7.3 0 0 0-7.3 7.3c0 5.6 7.3 12.1 7.3 12.1s7.3-6.5 7.3-12.1A7.3 7.3 0 0 0 12 2.3Zm0 4.6a2.6 2.6 0 1 1 0 5.2 2.6 2.6 0 0 1 0-5.2Z\"/>","plane":"<path d=\"M21 3 3.1 10.4l6.5 3ZM21 3l-10.4 11.4 3 6.5Z\"/>","play":"<path d=\"M6.4 4.4v15.2a0.8 0.8 0 0 0 1.2 0.7l11.4 -7.6a0.8 0.8 0 0 0 0 -1.4L7.6 3.7a0.8 0.8 0 0 0 -1.2 0.7Z\"/>","plug":"<path d=\"M5.8 7.2h12.4v3.8a6.2 6.2 0 0 1-12.4 0Z\"/><path class=\"ln\" d=\"M9 2.8v4.4M15 2.8v4.4M12 17.2v4\"/>","puzzle":"<path d=\"M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z\"/>","restroom":"<circle cx=\"7\" cy=\"4.6\" r=\"2\"/><circle cx=\"17\" cy=\"4.6\" r=\"2\"/><path d=\"M6 8.8h2a1.7 1.7 0 0 1 1.7 1.7v5.2H8.6v5.5H5.4v-5.5H4.3v-5.2A1.7 1.7 0 0 1 6 8.8Z\"/><path d=\"M16.4 9.3h1.2a1 1 0 0 1 1 .8l2.1 7H18.3v3.9h-2.6v-3.9h-2.4l2.1-7a1 1 0 0 1 1-.8Z\"/><path class=\"ln\" d=\"M12 3v18\"/>","retry":"<path class=\"ln\" d=\"M4.4 12a7.6 7.6 0 0 1 12.7-5.6M19.6 12a7.6 7.6 0 0 1-12.7 5.6\"/><path d=\"M20.8 3.3v6.6h-6.6ZM3.2 20.7v-6.6h6.6Z\"/>","robot":"<path fill-rule=\"evenodd\" d=\"M8 7.4h8a3.6 3.6 0 0 1 3.6 3.6v5A3.6 3.6 0 0 1 16 19.6H8A3.6 3.6 0 0 1 4.4 16v-5A3.6 3.6 0 0 1 8 7.4Zm1 4.4a1.4 1.4 0 1 0 0 2.8 1.4 1.4 0 0 0 0-2.8Zm6 0a1.4 1.4 0 1 0 0 2.8 1.4 1.4 0 0 0 0-2.8ZM9.4 15.8v1.5h5.2v-1.5Z\"/><path class=\"ln\" d=\"M12 3.4v4M2.6 12.4v3.2M21.4 12.4v3.2\"/>","save":"<path fill-rule=\"evenodd\" d=\"M5 3.4h11.4l3.2 3.2V20a.6.6 0 0 1-.6.6H5a.6.6 0 0 1-.6-.6V4a.6.6 0 0 1 .6-.6Zm3.1 1.3v4.5h6.8V4.7ZM7.6 13.4v5.9h8.8v-5.9Z\"/>","scissors":"<path fill-rule=\"evenodd\" d=\"M6 3.9a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4Zm0 2a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4ZM6 13.7a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4Zm0 2a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z\"/><path class=\"ln\" d=\"M8.5 8.8 20 18M8.5 15.2 20 6\"/>","search":"<path fill-rule=\"evenodd\" d=\"M11 3.4a7.6 7.6 0 1 1 0 15.2 7.6 7.6 0 0 1 0-15.2Zm0 3.1a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9Z\"/><path class=\"ln\" d=\"m16.6 16.6 3.8 3.8\"/>","server":"<path fill-rule=\"evenodd\" d=\"M6 3.6h12a2.4 2.4 0 0 1 2.4 2.4v3a2.4 2.4 0 0 1-2.4 2.4H6A2.4 2.4 0 0 1 3.6 9V6A2.4 2.4 0 0 1 6 3.6Zm2 2.6a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6ZM6 12.6h12a2.4 2.4 0 0 1 2.4 2.4v3a2.4 2.4 0 0 1-2.4 2.4H6A2.4 2.4 0 0 1 3.6 18v-3A2.4 2.4 0 0 1 6 12.6Zm2 2.6a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6Z\"/>","shapes":"<circle cx=\"7.5\" cy=\"7.5\" r=\"4.2\"/><path d=\"m16.5 2.6 4.8 8.4h-9.6ZM13.4 13.4h7.2v7.2h-7.2ZM2.8 20.6 7 13.4l4.2 7.2Z\"/>","shelter":"<path fill-rule=\"evenodd\" d=\"M12 2.4 2 10.3l1.2 1.6 1-.8v10.5h15.6V11.1l1 .8 1.2-1.6ZM9.4 21.6v-5a2.6 2.6 0 0 1 5.2 0v5ZM12 9.2a1.8 1.8 0 1 1 0 3.6 1.8 1.8 0 0 1 0-3.6Z\"/>","shield":"<path d=\"M12 2.6 4.6 5.8V12c0 4.6 3.1 8 7.4 9.5 4.3-1.5 7.4-4.9 7.4-9.5V5.8Z\"/>","shirt":"<path d=\"M7.8 2.2 2 5.6l2.6 5.2 1.6-.8v11.8h11.6V10l1.6.8L22 5.6l-5.8-3.4c-.6 1.6-2 2.6-4.2 2.6S8.4 3.8 7.8 2.2Z\"/>","skull":"<path fill-rule=\"evenodd\" d=\"M12 2.1a7.9 7.9 0 0 0-7.9 7.9c0 2.4 1.1 4.2 2.5 5.4V19a2 2 0 0 0 2 2h6.8a2 2 0 0 0 2-2v-3.6c1.4-1.2 2.5-3 2.5-5.4A7.9 7.9 0 0 0 12 2.1ZM9.2 8.9a1.7 1.7 0 1 1 0 3.4 1.7 1.7 0 0 1 0-3.4ZM14.8 8.9a1.7 1.7 0 1 1 0 3.4 1.7 1.7 0 0 1 0-3.4ZM12 12.8l1 1.8h-2ZM10.1 17.6h.9v2.4h-.9ZM13 17.6h.9v2.4H13Z\"/>","sliders":"<path class=\"ln\" d=\"M4 7h8.8M19.2 7H20M4 17h2.8M13.2 17H20\"/><circle cx=\"16\" cy=\"7\" r=\"3.2\"/><circle cx=\"10\" cy=\"17\" r=\"3.2\"/>","smile":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM9 8.6a1.35 1.35 0 1 1 0 2.7 1.35 1.35 0 0 1 0-2.7ZM15 8.6a1.35 1.35 0 1 1 0 2.7 1.35 1.35 0 0 1 0-2.7ZM7.9 13.4h8.2a4.1 4.1 0 0 1-8.2 0Z\"/>","spark":"<path d=\"M11.5 2.6l2 5.6 5.6 2 -5.6 2L11.5 17.8l-2 -5.6 -5.6 -2 5.6 -2ZM18.5 14.6l0.9 2.5 2.5 0.9 -2.5 0.9 -0.9 2.5 -0.9 -2.5 -2.5 -0.9 2.5 -0.9Z\"/>","star":"<path d=\"M12 3.2l2.6 5.4 5.9.7-4.4 4 1.2 5.9L12 16.3l-5.3 2.9 1.2-5.9-4.4-4 5.9-.7Z\"/>","steps":"<path fill-rule=\"evenodd\" d=\"M2.6 3.6h5.2v5.2H2.6Zm1.1 2.6.8-.9.9.9 1.5-1.5.9.9-2.4 2.4ZM2.6 9.4h5.2v5.2H2.6Zm1.1 2.6.8-.9.9.9 1.5-1.5.9.9-2.4 2.4ZM2.6 15.2h5.2v5.2H2.6Zm1.1 2.6.8-.9.9.9 1.5-1.5.9.9-2.4 2.4Z\"/><path class=\"ln\" d=\"M10.8 6.2H21M10.8 12H21M10.8 17.8H21\"/>","store":"<path d=\"M5.2 3.6h13.6l1.8 5.6v1.3a2.9 2.9 0 0 1-5.73 0 2.9 2.9 0 0 1-5.74 0 2.9 2.9 0 0 1-5.73 0V9.2ZM4.8 14.3h14.4v5.1a1 1 0 0 1-1 1H14v-4.6h-4v4.6H5.8a1 1 0 0 1-1-1Z\"/>","sun":"<circle cx=\"12\" cy=\"12\" r=\"4.6\"/><path class=\"ln\" d=\"M12 2.2v1.6M12 20.2v1.6M5 5l1.1 1.1M17.9 17.9 19 19M2.2 12h1.6M20.2 12h1.6M5 19l1.1-1.1M17.9 6.1 19 5\"/>","tack":"<path d=\"M8.2 2.4h7.6a.9.9 0 0 1 .9 1.1l-.9 4.2 3 3a.8.8 0 0 1-.6 1.5H5.8a.8.8 0 0 1-.6-1.5l3-3-.9-4.2a.9.9 0 0 1 .9-1.1Z\"/><path class=\"ln\" d=\"M12 12.2V21\"/>","tag":"<path fill-rule=\"evenodd\" d=\"M2.6 3.1A1.5 1.5 0 0 1 4.1 2.6h7.3l10.1 10.1 -8.8 8.8L2.6 10.4Zm5.1 2.5a1.9 1.9 0 1 0 0 3.8 1.9 1.9 0 0 0 0 -3.8Z\"/>","target":"<path fill-rule=\"evenodd\" d=\"M12 3.1a8.9 8.9 0 1 1 0 17.8 8.9 8.9 0 0 1 0-17.8Zm0 2.8a6.1 6.1 0 1 0 0 12.2 6.1 6.1 0 0 0 0-12.2Zm0 2.6a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7Z\"/>","tent":"<path fill-rule=\"evenodd\" d=\"M12 4.2 20.6 19.8H3.4ZM12 13 9 19.8h6Z\"/><path class=\"ln\" d=\"M2.4 20.2h19.2\"/>","terminal":"<path fill-rule=\"evenodd\" d=\"M5 3.6h14a2.4 2.4 0 0 1 2.4 2.4v12a2.4 2.4 0 0 1-2.4 2.4H5A2.4 2.4 0 0 1 2.6 18V6A2.4 2.4 0 0 1 5 3.6Zm1.4 6 1.3-1.3 3.6 3.7-3.6 3.7-1.3-1.3 2.4-2.4Zm6.4 4.6h4.4v1.7h-4.4Z\"/>","text":"<path fill-rule=\"evenodd\" d=\"M10.3 3.4h3.4l6.3 17.2h-3.1l-1.5-4.3H8.6l-1.5 4.3H4ZM9.5 13.7h5L12 6.4Z\"/>","thumbs-up":"<path d=\"M7.4 10.4v10H4.6a1.1 1.1 0 0 1-1.1-1.1v-7.8a1.1 1.1 0 0 1 1.1-1.1ZM8.8 10.4l3.5-7.1a2.3 2.3 0 0 1 2.6 2.7l-.6 3.4h5.5a2.1 2.1 0 0 1 2.1 2.5l-1.4 6.8a2.1 2.1 0 0 1-2.1 1.7H8.8Z\"/>","ticket":"<path fill-rule=\"evenodd\" d=\"M2.6 6.4h18.8v3.4a2.2 2.2 0 0 0 0 4.4v3.4H2.6v-3.4a2.2 2.2 0 0 0 0-4.4ZM13.3 8.4v1.8h1.4V8.4Zm0 2.7v1.8h1.4v-1.8Zm0 2.7v1.8h1.4v-1.8Z\"/>","train":"<path fill-rule=\"evenodd\" d=\"M9 3h6a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3Zm-1.2 2.6v4.2h8.4V5.6ZM9 12a1.1 1.1 0 1 0 0 2.2A1.1 1.1 0 0 0 9 12Zm6 0a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Z\"/><path class=\"ln\" d=\"M8.5 21l2-3.5M15.5 21l-2-3.5\"/>","trash":"<path d=\"M5.8 7.6h12.4l-1 12a2 2 0 0 1-2 1.8H8.8a2 2 0 0 1-2-1.8Z\"/><path class=\"ln\" d=\"M3.8 6.6h16.4M9 6.6V4h6v2.6\"/>","tree":"<path d=\"M12 2.6 5.6 11.2h3.2L4 17.8h16l-4.8-6.6h3.2Z\"/><path class=\"ln\" d=\"M12 17v4.2\"/>","trophy":"<path d=\"M7.3 3.3h9.4V9a4.7 4.7 0 0 1-9.4 0Z\"/><path class=\"ln\" d=\"M7.3 5.8H5.1a3 3 0 0 0 3 4.1M16.7 5.8h2.2a3 3 0 0 1-3 4.1M12 13.8V17M8 20.4h8\"/>","tv":"<rect x=\"2.2\" y=\"6.6\" width=\"19.6\" height=\"14\" rx=\"2.4\"/><path class=\"ln\" d=\"m8 2.8 4 3.6 4-3.6\"/>","umbrella":"<path d=\"M2.1 12.6a9.9 9.9 0 0 1 19.8 0Z\"/><path class=\"ln\" d=\"M12 12.6v5.9a2 2 0 0 1-4 0\"/>","upload":"<path d=\"M10.8 20.4h2.4v-6.6h4.4L12 8.2l-5.6 5.6h4.4Z\"/><path class=\"ln\" d=\"M5 4h14\"/>","user":"<circle cx=\"12\" cy=\"7.8\" r=\"4.1\"/><path d=\"M4.2 21c0-4.3 3.5-7.2 7.8-7.2s7.8 2.9 7.8 7.2Z\"/>","user-check":"<circle cx=\"9\" cy=\"7.9\" r=\"3.6\"/><path d=\"M2.4 20.8c0-3.8 3-6.5 6.6-6.5s6.6 2.7 6.6 6.5Z\"/><path class=\"ln\" d=\"m15.6 11.2 2.2 2.2 4.2-4.2\"/>","video":"<path d=\"M2.5 7.6a2 2 0 0 1 2-2H14a2 2 0 0 1 2 2v8.8a2 2 0 0 1-2 2H4.5a2 2 0 0 1-2-2ZM17.2 10.1l4.3-2.6v9l-4.3-2.6Z\"/>","volume":"<path d=\"M3.4 8.9h3.9l5.3-4.1v14.4l-5.3-4.1H3.4Z\"/><path class=\"ln\" d=\"M15.9 9.3a3.7 3.7 0 0 1 0 5.4M18.4 6.6a7.4 7.4 0 0 1 0 10.8\"/>","wallet":"<path fill-rule=\"evenodd\" d=\"M6.5 4.6H18v4h1.4a.8.8 0 0 1 .8.8v10.8H6a2.2 2.2 0 0 1-2.2-2.2V7.3a2.7 2.7 0 0 1 2.7-2.7Zm0 1.8a.9.9 0 0 0 0 1.8h9.7V6.4ZM16 13.3a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z\"/>","water":"<path d=\"M2.5 8.6c2.4 0 2.4 -2 4.8 -2s2.4 2 4.7 2 2.4 -2 4.8 -2 2.4 2 4.7 2v3.2c-2.3 0 -2.3 -2 -4.7 -2s-2.4 2 -4.8 2 -2.3 -2 -4.7 -2 -2.4 2 -4.8 2ZM2.5 15.6c2.4 0 2.4 -2 4.8 -2s2.4 2 4.7 2 2.4 -2 4.8 -2 2.4 2 4.7 2v3.2c-2.3 0 -2.3 -2 -4.7 -2s-2.4 2 -4.8 2 -2.3 -2 -4.7 -2 -2.4 2 -4.8 2Z\"/>","wrench":"<path d=\"M14.5 3.6a5.4 5.4 0 0 0-4.9 7.4L3.6 17V20.4H7l6-6a5.4 5.4 0 0 0 7.4-4.9l-3.1 1.2-2.6-2.6 1.2-3.1Z\"/>","x-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM9.2 7.8 12 10.6l2.8-2.8 1.4 1.4-2.8 2.8 2.8 2.8-1.4 1.4-2.8-2.8-2.8 2.8-1.4-1.4 2.8-2.8-2.8-2.8Z\"/>","zap":"<path d=\"M13.4 2.4 4.6 13.4h6.2l-1.2 8.2 8.8-11h-6.2Z\"/>"};
++ const S = {"airplane":"<path d=\"M12 2.5c1.3 0 2 1.2 2 3V9.7l7.5 4.5v2.5L14 14.2v3.5l2 1.5v2.5L12 20.5l-4 1.2v-2.5l2-1.5v-3.5l-7.5 2.5v-2.5L10 9.7V5.5c0-1.8.7-3 2-3Z\"/>","alert":"<path fill-rule=\"evenodd\" d=\"M10.4 3.9a1.85 1.85 0 0 1 3.2 0l8.3 14.4a1.85 1.85 0 0 1-1.6 2.8H3.7a1.85 1.85 0 0 1-1.6-2.8ZM10.9 9h2.2v5.6h-2.2ZM12 15.9a1.3 1.3 0 1 1 0 2.6 1.3 1.3 0 0 1 0-2.6Z\"/>","alert-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM10.8 6.8h2.4v7h-2.4ZM12 15.1a1.45 1.45 0 1 1 0 2.9 1.45 1.45 0 0 1 0-2.9Z\"/>","archive":"<rect x=\"2.6\" y=\"3.4\" width=\"18.8\" height=\"5.4\" rx=\"1.2\"/><path fill-rule=\"evenodd\" d=\"M4.4 10h15.2v9.2a1.6 1.6 0 0 1-1.6 1.6H6a1.6 1.6 0 0 1-1.6-1.6ZM9.6 12.4v1.8h4.8v-1.8Z\"/>","bell":"<path d=\"M5.8 14.7V9.5a6.2 6.2 0 0 1 12.4 0v5.2l1.7 2.3H4.1ZM9.9 18.1h4.2a2.1 2.1 0 0 1 -4.2 0Z\"/>","book":"<path d=\"M4.5 5A2.5 2.5 0 0 1 7 2.5h12.5v15H7a2.5 2.5 0 0 0-2.5 2.5Z\"/><path class=\"ln\" d=\"M7.5 20.5h11.5\"/>","book-open":"<path d=\"M11 6.4C9 5 6.3 4.5 3 5.1v13.3c3.3-.6 6 0 8 1.4ZM13 6.4c2-1.4 4.7-1.9 8-1.3v13.3c-3.3-.6-6 0-8 1.4Z\"/>","box":"<path d=\"m12 3.6 8.9 4.3-8.9 4.3-8.9-4.3ZM3.1 9.5l8.1 3.9v7.8l-8.1-4.1ZM20.9 9.5l-8.1 3.9v7.8l8.1-4.1Z\"/>","brain":"<path d=\"M9 3.8a3.1 3.1 0 0 0-3.1 3 3 3 0 0 0-2.1 5.2 3 3 0 0 0 2.1 5.1 3.1 3.1 0 0 0 5.5 1.3V5.5A2.2 2.2 0 0 0 9 3.8Z\"/><path d=\"M15 3.8a3.1 3.1 0 0 1 3.1 3 3 3 0 0 1 2.1 5.2 3 3 0 0 1-2.1 5.1 3.1 3.1 0 0 1-5.5 1.3V5.5A2.2 2.2 0 0 1 15 3.8Z\"/>","bridge":"<path d=\"M1.8 15.4h20.4v2.8H1.8ZM3.6 10.4h2v5H3.6ZM18.4 10.4h2v5h-2Z\"/><path class=\"ln\" d=\"M2 10.5c4 0 6 -3 10 -3s6 3 10 3M8.5 15.4V12.6M15.5 15.4V12.6M12 15.4V9\"/>","briefcase":"<path d=\"M2.4 9a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.9H2.4ZM2.4 13.1h7.4v1.5h4.4v-1.5h7.4V18a2.6 2.6 0 0 1-2.6 2.6H5a2.6 2.6 0 0 1-2.6-2.6Z\"/><path class=\"ln\" d=\"M9 6.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v.9\"/>","bug":"<path fill-rule=\"evenodd\" d=\"M12 7a4.8 4.8 0 0 1 4.8 4.8v3.4a4.8 4.8 0 0 1 -9.6 0v-3.4A4.8 4.8 0 0 1 12 8Zm-0.7 4.4v7.4h1.4v-7.4Z\"/><path d=\"M9.4 5.8a2.6 2.6 0 0 1 5.2 0Z\"/><path class=\"ln\" d=\"M7.2 12.5H3.8M20.2 12.5h-3.4M7.6 9.4 5 7M16.4 9.4 19 7M7.6 16.6 5 19M16.4 16.6 19 19\"/>","burst":"<path d=\"M12 1.9l2.2 4.9 5-2-2 5 4.9 2.2-4.9 2.2 2 5-5-2-2.2 4.9-2.2-4.9-5 2 2-5L1.9 12l4.9-2.2-2-5 5 2Z\"/>","calendar":"<path fill-rule=\"evenodd\" d=\"M4 7.4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2V19a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2Zm2.2 4V18.8h11.6v-7.4Z\"/><path class=\"ln\" d=\"M9 3.2v3.6M15 3.2v3.6\"/>","camera":"<path fill-rule=\"evenodd\" d=\"M3 8.3a1.8 1.8 0 0 1 1.8-1.8h2.5L9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v10.1a1.8 1.8 0 0 1-1.8 1.8H4.8A1.8 1.8 0 0 1 3 18.4Zm9 1.9a3.4 3.4 0 1 0 0 6.8 3.4 3.4 0 0 0 0-6.8Z\"/>","camera-flip":"<path fill-rule=\"evenodd\" d=\"M3 8.3a1.8 1.8 0 0 1 1.8-1.8h2.5L9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v10.1a1.8 1.8 0 0 1-1.8 1.8H4.8A1.8 1.8 0 0 1 3 18.4ZM7.96 12.03A4.3 4.3 0 0 1 16.04 12.03L13.79 12.85A1.9 1.9 0 0 0 10.21 12.85ZM16.04 14.97A4.3 4.3 0 0 1 7.96 14.97L10.21 14.15A1.9 1.9 0 0 0 13.79 14.15Z\"/>","camera-off":"<path d=\"M8.5 4.8 9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v9ZM3.8 7.5 16.5 20.2H4.8A1.8 1.8 0 0 1 3 18.4V8.3Z\"/><path class=\"ln\" d=\"m4 4 16 16\"/>","car":"<path fill-rule=\"evenodd\" d=\"M5.8 5.4h12.4l2.6 5.4H3.2ZM2.9 12.2h18.2v4.4H2.9ZM6.1 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM15.7 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM5.2 17.4h2.6v1.8H5.2ZM16.2 17.4h2.6v1.8h-2.6Z\"/>","card":"<path fill-rule=\"evenodd\" d=\"M1.9 7a2.6 2.6 0 0 1 2.6-2.6h15a2.6 2.6 0 0 1 2.6 2.6v10a2.6 2.6 0 0 1-2.6 2.6h-15a2.6 2.6 0 0 1-2.6-2.6ZM1.9 9.2v1.8h20.2V9.2ZM5.4 14.3v1.6h5.2v-1.6Z\"/>","care":"<path d=\"M16.5 11.6s-3.8 -2.3 -3.8 -5a2.2 2.2 0 0 1 3.8 -1.5 2.2 2.2 0 0 1 3.8 1.5c0 2.7 -3.8 5 -3.8 5Z\"/><path class=\"ln\" d=\"M4 16.5h3l4 3h5.5a2 2 0 0 0 0 -4H13M8 16.5l2.2 -2h3.3\"/>","cart":"<path d=\"M5.5 6.4h16.1l-2.7 8.9H7.5Z\"/><circle cx=\"9\" cy=\"19.6\" r=\"1.7\"/><circle cx=\"17\" cy=\"19.6\" r=\"1.7\"/><path class=\"ln\" d=\"M2.8 4H5l2.5 11.3\"/>","cc":"<path fill-rule=\"evenodd\" d=\"M5.5 4.4h13a3.1 3.1 0 0 1 3.1 3.1v9a3.1 3.1 0 0 1-3.1 3.1h-13a3.1 3.1 0 0 1-3.1-3.1v-9a3.1 3.1 0 0 1 3.1-3.1ZM10.82 9.47A3.3 3.3 0 1 0 10.82 14.53L9.54 13A1.3 1.3 0 1 1 9.54 11ZM17.62 9.47A3.3 3.3 0 1 0 17.62 14.53L16.34 13A1.3 1.3 0 1 1 16.34 11Z\"/>","chart":"<path class=\"ln\" d=\"M4 4v16h16\"/><path d=\"M7 15.2 10.9 10.7l3 2.5 5.1-6.1V18H7Z\"/>","chat":"<path d=\"M3.5 5.6A1.6 1.6 0 0 1 5.1 4h13.8a1.6 1.6 0 0 1 1.6 1.6v9.8a1.6 1.6 0 0 1-1.6 1.6H8.6L3.5 21Z\"/>","chat-off":"<path d=\"M8.1 4.4H19a1.6 1.6 0 0 1 1.6 1.6v9.5a1.6 1.6 0 0 1-.4 1ZM3.4 7.1 12.9 16.6H8.3l-4.9 4.6Z\"/><path class=\"ln\" d=\"m4 4 16 16\"/>","check-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.3 8.9l1.6 1.6-6.9 6.9-4.1-4.1 1.6-1.6 2.5 2.5Z\"/>","child":"<circle cx=\"12\" cy=\"5.5\" r=\"2.7\"/><path class=\"ln\" d=\"M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6\"/>","chip":"<path fill-rule=\"evenodd\" d=\"M8.2 6.6h7.6a1.6 1.6 0 0 1 1.6 1.6v7.6a1.6 1.6 0 0 1-1.6 1.6H8.2a1.6 1.6 0 0 1-1.6-1.6V8.2a1.6 1.6 0 0 1 1.6-1.6Zm1.9 3.5v3.8h3.8v-3.8Z\"/><path class=\"ln\" d=\"M10 3v3.6M14 3v3.6M10 17.4V21M14 17.4V21M3 10h3.6M3 14h3.6M17.4 10H21M17.4 14H21\"/>","circle":"<circle cx=\"12\" cy=\"12\" r=\"9\"/>","city":"<path fill-rule=\"evenodd\" d=\"M4.6 8.8h5.2v12.4H4.6Zm2.2 2.6v1.6h1.4v-1.6Zm0 3.4v1.6h1.4v-1.6Z\"/><path fill-rule=\"evenodd\" d=\"M10.6 3.8h5.8v17.4h-5.8Zm2 2.8v1.6h1.6V6.6Zm0 3.4v1.6h1.6V10Zm0 3.4v1.6h1.6v-1.6Z\"/><path d=\"M17.2 12.8h2.6v8.4h-2.6Z\"/><path class=\"ln\" d=\"M2.8 21.2h18.4\"/>","clapper":"<path fill-rule=\"evenodd\" d=\"M2.4 6.1 19.7 2.9l.9 4.3L3 8.9ZM6.8 5.3 9 8.3l2.6-.2L9.4 4.8ZM12.4 4.2l2.2 3.6 2.6-.3L15 3.8Z\"/><path d=\"M2.9 10.1h18.2v9a1.6 1.6 0 0 1-1.6 1.6h-15a1.6 1.6 0 0 1-1.6-1.6Z\"/>","clipboard":"<path fill-rule=\"evenodd\" d=\"M7.4 4.4h9.2a2.1 2.1 0 0 1 2.1 2.1v13.4a2.1 2.1 0 0 1-2.1 2.1H7.4a2.1 2.1 0 0 1-2.1-2.1V6.5a2.1 2.1 0 0 1 2.1-2.1ZM9 10.2v1.6h6v-1.6Zm0 4v1.6h4v-1.6Z\"/><rect x=\"8.6\" y=\"2.6\" width=\"6.8\" height=\"3.8\" rx=\"1.2\"/>","clipboard-check":"<path fill-rule=\"evenodd\" d=\"M7.4 4.4h9.2a2.1 2.1 0 0 1 2.1 2.1v13.4a2.1 2.1 0 0 1-2.1 2.1H7.4a2.1 2.1 0 0 1-2.1-2.1V6.5a2.1 2.1 0 0 1 2.1-2.1ZM7.9 13.5 11 16.6l5.1-5.1-1.6-1.6-3.5 3.5-1.5-1.5Z\"/><rect x=\"8.6\" y=\"2.6\" width=\"6.8\" height=\"3.8\" rx=\"1.2\"/>","clock":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM10.9 6.6h2.2v5l3.2 1.9-1.1 1.9-4.3-2.6Z\"/>","cloud":"<path d=\"M7 18.8h10a4.4 4.4 0 0 0 .6-8.8A6.4 6.4 0 0 0 5.4 9.4 4.7 4.7 0 0 0 7 18.8Z\"/>","cloud-off":"<path d=\"M9.34 5.66A6.4 6.4 0 0 1 17.6 10a4.4 4.4 0 0 1 3 6.92ZM5.64 9.32 15.12 18.8H7A4.7 4.7 0 0 1 5.4 9.4Z\"/><path class=\"ln\" d=\"m4 4 16 16\"/>","coin":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM11 6h2v1.2c1.1.2 2 .8 2.5 1.7l-1.7 1c-.3-.6-1-1-1.8-1-.9 0-1.5.4-1.5 1s.5.8 1.8 1.1c1.8.4 3.4 1 3.4 3 0 1.4-1 2.4-2.7 2.7V18h-2v-1.3c-1.2-.2-2.2-.9-2.7-1.9l1.7-1c.4.7 1.1 1.1 2 1.1 1 0 1.6-.4 1.6-1s-.6-.8-1.9-1.1c-1.7-.4-3.3-1-3.3-2.9 0-1.3 1-2.3 2.6-2.6Z\"/>","columns":"<path d=\"M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h8.1v10.1H5.5a2.6 2.6 0 0 1-2.6-2.6ZM13 10h8.1v7.5a2.6 2.6 0 0 1-2.6 2.6H13Z\"/>","compass":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.4 7.6 13.9 13.9 7.6 16.4 10.1 10.1Z\"/>","compress":"<path d=\"M9.8 9.8H3.2L9.8 3.2ZM14.2 9.8h6.6l-6.6-6.6ZM9.8 14.2H3.2l6.6 6.6ZM14.2 14.2h6.6l-6.6 6.6Z\"/>","computer":"<rect x=\"2.6\" y=\"3.6\" width=\"18.8\" height=\"12.8\" rx=\"2.2\"/><path class=\"ln\" d=\"M8 20.2h8M12 16.4v3.8\"/>","contrast":"<path fill-rule=\"evenodd\" d=\"M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 2.2a7.4 7.4 0 0 1 0 14.8Z\"/>","cookie":"<path fill-rule=\"evenodd\" d=\"M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4ZM7.3 9.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM10.8 14a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM6.8 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM14.3 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z\"/>","copy":"<rect x=\"7.6\" y=\"7.6\" width=\"13\" height=\"13\" rx=\"2.4\"/><path class=\"ln\" d=\"M16 7.6V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h1.6\"/>","couch":"<path d=\"M7 4.4h10A2.6 2.6 0 0 1 19.6 7v2a3.2 3.2 0 0 0-3.2 3.2v.1H7.6v-.1A3.2 3.2 0 0 0 4.4 9V7A2.6 2.6 0 0 1 7 4.4ZM2.4 12a2.6 2.6 0 0 1 5.2 0v1.9h8.8V12a2.6 2.6 0 0 1 5.2 0v5.6H2.4Z\"/><path class=\"ln\" d=\"M5 17.6v1.9M19 17.6v1.9\"/>","crown":"<path d=\"M2.6 7.8 7.4 12 12 4.6 16.6 12l4.8-4.2-2 11.7H4.6Z\"/>","cubes":"<path d=\"M12 3.3 8.4 5.1v4.2l3.6 1.8 3.6-1.8V5.1ZM7.5 11.8 3.9 13.6v4.2l3.6 1.8 3.6-1.8v-4.2ZM16.5 11.8l-3.6 1.8v4.2l3.6 1.8 3.6-1.8v-4.2Z\"/>","database":"<ellipse cx=\"12\" cy=\"6\" rx=\"7.4\" ry=\"3\"/><path d=\"M4.6 7.6a7.4 3 0 0 0 14.8 0v4a7.4 3 0 0 1-14.8 0ZM4.6 13.2a7.4 3 0 0 0 14.8 0v4.4a7.4 3 0 0 1-14.8 0Z\"/>","dice":"<path fill-rule=\"evenodd\" d=\"M6.4 2.9h11.2a3.5 3.5 0 0 1 3.5 3.5v11.2a3.5 3.5 0 0 1-3.5 3.5H6.4a3.5 3.5 0 0 1-3.5-3.5V6.4a3.5 3.5 0 0 1 3.5-3.5ZM6.4 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM10.1 12a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM6.4 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0Z\"/>","dish":"<path d=\"M4.6 9.4A10 10 0 0 0 14.6 19.4Z\"/><path class=\"ln\" d=\"m9.8 14.2 4.2-4.2M14.5 4.5a5 5 0 0 1 5 5M14.5 8a1.5 1.5 0 0 1 1.5 1.5\"/>","donate":"<path fill-rule=\"evenodd\" d=\"M12 2.9a5.6 5.6 0 1 0 0 11.2 5.6 5.6 0 0 0 0-11.2Zm-.8 3.2h1.6v4.8h-1.6ZM3.4 14.9h17.2v5.7H3.4ZM8 17v1.5h8V17Z\"/>","door":"<path fill-rule=\"evenodd\" d=\"M14.6 4.1 5.4 2.4v19.2l9.2-1.7ZM9.9 12a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z\"/><path class=\"ln\" d=\"M15.9 5h1.6a1 1 0 0 1 1 1v15M15.9 21H21M3 21h2.4\"/>","download":"<path d=\"M10.8 3.6h2.4v6.6h4.4L12 15.8l-5.6-5.6h4.4Z\"/><path class=\"ln\" d=\"M5 20h14\"/>","drive":"<path fill-rule=\"evenodd\" d=\"M4.9 12.1h14.2a2.8 2.8 0 0 1 2.8 2.8v3.2a2.8 2.8 0 0 1-2.8 2.8H4.9a2.8 2.8 0 0 1-2.8-2.8v-3.2a2.8 2.8 0 0 1 2.8-2.8ZM17 15.3a1.2 1.2 0 1 1 0 2.4 1.2 1.2 0 0 1 0-2.4ZM13.8 15.3a1.2 1.2 0 1 1 0 2.4 1.2 1.2 0 0 1 0-2.4Z\"/><path class=\"ln\" d=\"M3.6 12.6 6.5 5h11l2.9 7.6\"/>","drop":"<path d=\"M12 2.4s6.4 6.8 6.4 11.6a6.4 6.4 0 0 1-12.8 0C5.6 9.2 12 2.4 12 2.4Z\"/>","eraser":"<path d=\"M14 3.9l6.1 6.1-5.2 5.2-6.1-6.1ZM7.4 10l6.2 6.2-3.2 3.2H6.1l-2.9-2.9a1.6 1.6 0 0 1 0-2.3Z\"/><path class=\"ln\" d=\"M13 19.4h7\"/>","expand":"<path d=\"M3.2 3.2h6.6L3.2 9.8ZM20.8 3.2h-6.6l6.6 6.6ZM3.2 20.8h6.6l-6.6-6.6ZM20.8 20.8h-6.6l6.6-6.6Z\"/>","eye":"<path fill-rule=\"evenodd\" d=\"M12 4.8C6 4.8 1.8 12 1.8 12s4.2 7.2 10.2 7.2S22.2 12 22.2 12 18 4.8 12 4.8Zm0 3.6a3.6 3.6 0 1 1 0 7.2 3.6 3.6 0 0 1 0-7.2Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.7\"/>","eye-off":"<path d=\"M8.71 5.31A10.83 10.83 0 0 1 22.2 12a10.83 10.83 0 0 1-2.66 4.14L15.6 12.2a3.6 3.6 0 0 0-3.8-3.8ZM15.29 18.69A10.83 10.83 0 0 1 1.8 12a10.83 10.83 0 0 1 2.66-4.14L8.4 11.8a3.6 3.6 0 0 0 3.8 3.8Z\"/><path class=\"ln\" d=\"m4 4 16 16\"/>","fast-forward":"<path d=\"M3 5.7v12.6L11.7 12ZM12.3 5.7v12.6L21 12Z\"/>","file":"<path d=\"M6 2.6h7.6v5.2h5V21.4H6ZM15.2 2.9l3.1 3.3h-3.1Z\"/>","file-code":"<path fill-rule=\"evenodd\" d=\"M6 2.6h7.6v5.2h5V21.4H6ZM10 11.2l1.5 1.4-1.6 1.7 1.6 1.7-1.5 1.4-2.9-3.1ZM14.6 11.2l-1.5 1.4 1.6 1.7-1.6 1.7 1.5 1.4 2.9-3.1Z\"/><path d=\"M15.2 2.9l3.1 3.3h-3.1Z\"/>","film":"<path fill-rule=\"evenodd\" d=\"M5 3.8h14a2.2 2.2 0 0 1 2.2 2.2v12a2.2 2.2 0 0 1-2.2 2.2H5A2.2 2.2 0 0 1 2.8 18V6A2.2 2.2 0 0 1 5 3.8Zm3.7 1.9v12.6h6.6V5.7ZM4.6 6.2v1.9h2V6.2Zm0 4.9v1.8h2v-1.8Zm0 4.8v1.9h2v-1.9Zm12.8-9.7v1.9h2V6.2Zm0 4.9v1.8h2v-1.8Zm0 4.8v1.9h2v-1.9Z\"/>","finish":"<path d=\"M5.6 3.6h4.2v4.9H5.6ZM14.6 3.6h4.3a1 1 0 0 1 1 1v3.9h-5.3ZM9.8 8.5h4.8v4.9H9.8Z\"/><path class=\"ln\" d=\"M5 21V3.5\"/>","fire":"<path fill-rule=\"evenodd\" d=\"M12 20a6.3 6.3 0 0 0 6.3 -6.3c0 -4 -2.7 -6.3 -3.9 -9.5 -1.9 2.1 -2.4 4.2 -2.4 4.2S10.8 6.5 9.7 4.6C7.4 7.2 5.7 10.3 5.7 13.7A6.3 6.3 0 0 0 12 21.5Zm0 -2.6a2.6 2.6 0 0 0 2.6 -2.6c0 -1.5 -1.1 -2.5 -1.6 -3.7 -0.8 0.9 -1 1.7 -1 1.7s-0.5 -0.8 -0.9 -1.5c-0.9 1.1 -1.6 2.3 -1.6 3.6a2.6 2.6 0 0 0 2.5 2.5Z\"/>","fish":"<path fill-rule=\"evenodd\" d=\"M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z\"/><path d=\"M8.4 12 2.9 7.4v9.2Z\"/>","flag":"<path class=\"ln\" d=\"M6.5 21V3.8\"/><path d=\"M7.1 3.6h11.6l-2.1 4.4 2.1 4.4H7.1Z\"/>","folder":"<path d=\"M2.8 6.8a2 2 0 0 1 2-2h4.4l2 2h8a2 2 0 0 1 2 2v8.6a2 2 0 0 1-2 2H4.8a2 2 0 0 1-2-2Z\"/>","folder-tree":"<path d=\"M9.9 4.9h3.9l1 1.5h6.3v5.2H9.9ZM9.9 13.9h3.9l1 1.5h6.3v5.2H9.9Z\"/><path class=\"ln\" d=\"M4.5 3.5v13a1 1 0 0 0 1 1H9.9M4.5 8.5H9.9\"/>","food":"<path d=\"M5.2 3h1.5v4.6h0.6V3h1.4v4.6h0.6V3h1.5v4.8A2.8 2.8 0 0 1 9 10.4V21H7V10.4a2.8 2.8 0 0 1 -1.8 -2.6ZM19 21h-2.2v-7.2h-2.9V10c0 -3.8 1.7 -6.4 5.1 -7.5Z\"/>","game":"<path fill-rule=\"evenodd\" d=\"M7.6 6.4h8.8a5.8 5.8 0 0 1 0 11.6H7.6a5.8 5.8 0 0 1 0-11.6Zm-1.4 3.8v1.6H4.6v1.8h1.6v1.6H8v-1.6h1.6v-1.8H8v-1.6Zm9.3 1a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Zm2.6 1.6a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z\"/>","gauge":"<path fill-rule=\"evenodd\" d=\"M4.5 17.5A9 9 0 1 1 19.5 19ZM15.3 8.45l-2.1 5.4 -2.05 0.25 -0.4 -2Z\"/>","gavel":"<path d=\"M11.3 5.9 4.9 12.3l6.8 6.8 6.4-6.4Z\"/><path class=\"ln\" d=\"m14 4.5 5.5 5.5M3 21l6.3-6.3M14 21h7\"/>","gear":"<path fill-rule=\"evenodd\" d=\"M18.5 14.65a1.5 1.5 0 0 0 0.3 1.8l0.1 0.1a1.75 1.75 0 1 1 -2.8 2.8l-0.1 -0.1a1.5 1.5 0 0 0 -1.8 -0.3 1.5 1.5 0 0 0 -1 1.5V19.9a1.75 1.75 0 1 1 -4 0v-0.1a1.5 1.5 0 0 0 -1.1 -1.5 1.5 1.5 0 0 0 -1.8 0.3l-0.1 0.1a1.75 1.75 0 1 1 -2.8 -2.8l0.1 -0.1a1.5 1.5 0 0 0 0.3 -1.8 1.5 1.5 0 0 0 -1.5 -1H4.15a1.75 1.75 0 1 1 0 -4h0.1a1.5 1.5 0 0 0 1.5 -1.1 1.5 1.5 0 0 0 -0.3 -1.8l-0.1 -0.1a1.75 1.75 0 1 1 2.8 -2.8l0.1 0.1a1.5 1.5 0 0 0 1.8 0.3H9.4a1.5 1.5 0 0 0 1 -1.5V4.15a1.75 1.75 0 1 1 4 0v0.1a1.5 1.5 0 0 0 1 1.5 1.5 1.5 0 0 0 1.8 -0.3l0.1 -0.1a1.75 1.75 0 1 1 2.8 2.8l-0.1 0.1a1.5 1.5 0 0 0 -0.3 1.8V9.4a1.5 1.5 0 0 0 1.5 1H19.9a1.75 1.75 0 1 1 0 4h-0.1a1.5 1.5 0 0 0 -1.5 1ZM12 9.05a3 3 0 1 0 0 6.8 3 3 0 0 0 0 -6.8Z\"/>","gem":"<path d=\"M6.4 3.6h11.2l3.8 5.3-9.4 11.6L2.6 8.9Z\"/>","ghost":"<path fill-rule=\"evenodd\" d=\"M4.8 20.6V11a7.2 7.2 0 0 1 14.4 0v9.6l-2.4-1.8-2.4 1.8-2.4-1.8-2.4 1.8-2.4-1.8ZM9.4 9.3a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6Zm5.2 0a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6Z\"/>","gift":"<path d=\"M3.4 8.6h17.2v3.2H3.4ZM4.6 12.8h6.4v8H5.6a1 1 0 0 1-1-1ZM13 12.8h6.4v7a1 1 0 0 1-1 1H13Z\"/><path class=\"ln\" d=\"M12 8.6c-1.5-3-5-4-5-1.5S12 8.6 12 8.6s5-1 5-3.5-3.5-1.5-5 3.5\"/>","globe":"<path d=\"M2.84 11.1A9.2 9.2 0 0 1 12 2.8a4.4 9.2 0 0 0-4.38 8.3ZM21.16 11.1A9.2 9.2 0 0 0 12 2.8a4.4 9.2 0 0 1 4.38 8.3ZM2.84 12.9A9.2 9.2 0 0 0 12 21.2a4.4 9.2 0 0 1-4.38-8.3ZM21.16 12.9A9.2 9.2 0 0 1 12 21.2a4.4 9.2 0 0 0 4.38-8.3ZM12 2.8a2.6 9.2 0 0 0-2.59 8.3h5.18A2.6 9.2 0 0 0 12 2.8ZM12 21.2a2.6 9.2 0 0 1-2.59-8.3h5.18A2.6 9.2 0 0 1 12 21.2Z\"/>","grid":"<rect x=\"3.4\" y=\"3.4\" width=\"7.4\" height=\"7.4\" rx=\"2\"/><rect x=\"13.2\" y=\"3.4\" width=\"7.4\" height=\"7.4\" rx=\"2\"/><rect x=\"3.4\" y=\"13.2\" width=\"7.4\" height=\"7.4\" rx=\"2\"/><rect x=\"13.2\" y=\"13.2\" width=\"7.4\" height=\"7.4\" rx=\"2\"/>","group":"<rect x=\"6.2\" y=\"6.2\" width=\"7.2\" height=\"5.4\" rx=\"1.2\"/><rect x=\"10.6\" y=\"12.6\" width=\"7.2\" height=\"5.2\" rx=\"1.2\"/><path class=\"ln\" d=\"M3 7V3h4M17 3h4v4M21 17v4h-4M7 21H3v-4\"/>","hammer":"<path d=\"M13 2.7l7.3 7.3-3.6 3.6-7.3-7.3ZM12.9 8.9 3.9 17.9a2 2 0 0 0 2.8 2.8l9-9Z\"/>","hand":"<path d=\"M9.2 14.2V5.5a1.3 1.3 0 0 1 2.6 0v4.9a0.5 0.5 0 0 0 1 0V4.4a1.3 1.3 0 0 1 2.6 0v6a0.5 0.5 0 0 0 1 0V6.2a1.3 1.3 0 0 1 2.6 0v7.2c0 4.2 -2.6 7.2 -6.8 7.2 -2.7 0 -4.4 -1.4 -5.9 -3.7l-1.7 -2.7a1.6 1.6 0 0 1 2.6 -1.9Z\"/>","headphones":"<path class=\"ln\" d=\"M4 14.5V12a8 8 0 0 1 16 0v2.5\"/><rect x=\"2.6\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/><rect x=\"16\" y=\"13.4\" width=\"5.4\" height=\"7.6\" rx=\"1.8\"/>","heart":"<path d=\"M12 20.1s-7.6 -4.6 -7.6 -10.6a4.3 4.3 0 0 1 7.6 -2.9 4.3 4.3 0 0 1 7.6 2.9c0 6 -7.6 10.6 -7.6 10.6Z\"/>","heart-broken":"<path fill-rule=\"evenodd\" d=\"M12 20.1s-7.6-4.6-7.6-10.6a4.3 4.3 0 0 1 7.6-2.9 4.3 4.3 0 0 1 7.6 2.9c0 6-7.6 10.6-7.6 10.6ZM11.1 7.4l2.2.5-1.1 2.2 2.9 2-2.1 4.8-2-.9 1.2-3-3-2Z\"/>","help":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM8.4 9.4A3.6 3.6 0 1 1 13 12.86v1.54h-2V11h1a1.6 1.6 0 1 0-1.6-1.6ZM12 15.75a1.25 1.25 0 1 1 0 2.5 1.25 1.25 0 0 1 0-2.5Z\"/>","history":"<path d=\"M6.06 6.06A8.4 8.4 0 1 1 3.6 12h2.8a5.6 5.6 0 1 0 1.64-3.96ZM3 3.2v6.6h6.6ZM11 8.2h2v3.4l2.5 1.5-1 1.7-3.5-2.1Z\"/>","home":"<path d=\"M3.3 11.2 12 3.6l8.7 7.6v8.9a1 1 0 0 1-1 1h-5.2v-6.4h-5v6.4H4.3a1 1 0 0 1-1-1Z\"/>","hot-tub":"<circle cx=\"8\" cy=\"5.3\" r=\"2.5\"/><path d=\"M2.1 11.1h19.8v4.4a5.4 5.4 0 0 1-5.4 5.4h-9a5.4 5.4 0 0 1-5.4-5.4Z\"/><path class=\"ln\" d=\"M6 11.1v-.6A2.5 2.5 0 0 1 8.5 8H9M13.5 9.5c.8-1-.8-2 0-3M17.5 9.5c.8-1-.8-2 0-3\"/>","id":"<path fill-rule=\"evenodd\" d=\"M5 4.8h14a2.2 2.2 0 0 1 2.2 2.2v10a2.2 2.2 0 0 1-2.2 2.2H5A2.2 2.2 0 0 1 2.8 17V7A2.2 2.2 0 0 1 5 4.8Zm4 4.1a2.1 2.1 0 1 0 0 4.2 2.1 2.1 0 0 0 0-4.2Zm-3.1 7.5h6.2c-.6-1.7-1.8-2.6-3.1-2.6s-2.5.9-3.1 2.6Zm8.6-7v1.5h3.9V9.4Zm0 3.5v1.5h3.9v-1.5Z\"/>","idea":"<path d=\"M8.3 15.3A6.5 6.5 0 1 1 15.7 15.3c-.7.6-1.3 1.3-1.4 2.2H9.7c-.1-.9-.7-1.6-1.4-2.2Z\"/><path class=\"ln\" d=\"M9.6 20.8h4.8\"/>","image":"<path fill-rule=\"evenodd\" d=\"M3 6.1a2.6 2.6 0 0 1 2.6-2.6h12.8A2.6 2.6 0 0 1 21 6.1v11.8a2.6 2.6 0 0 1-2.6 2.6H5.6A2.6 2.6 0 0 1 3 17.9Zm6 2.1a1.9 1.9 0 1 0 0 3.8 1.9 1.9 0 0 0 0-3.8Zm7.2 3.3-8 7.5h10.2a1.4 1.4 0 0 0 1.4-1.4v-2.9Z\"/>","inbox":"<path fill-rule=\"evenodd\" d=\"M2.4 13.4 5 4.4h14l2.6 9V19a1.6 1.6 0 0 1-1.6 1.6H4A1.6 1.6 0 0 1 2.4 19ZM6.2 6.4 4.4 12.5h3.9l1.5 2.5h4.4l1.5-2.5h3.9L17.8 6.4Z\"/>","info":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM10.8 10.6h2.4V17h-2.4ZM12 6.5a1.45 1.45 0 1 1 0 2.9 1.45 1.45 0 0 1 0-2.9Z\"/>","invite":"<circle cx=\"9\" cy=\"7.9\" r=\"3.6\"/><path d=\"M2.4 20.8c0-3.8 3-6.5 6.6-6.5s6.6 2.7 6.6 6.5Z\"/><path class=\"ln\" d=\"M19 8v6M16 11h6\"/>","key":"<path fill-rule=\"evenodd\" d=\"M8 9.8a5.2 5.2 0 1 1 0 10.4 5.2 5.2 0 0 1 0-10.4Zm0 3.4a1.8 1.8 0 1 0 0 3.6 1.8 1.8 0 0 0 0-3.6Z\"/><path class=\"ln\" d=\"m11.2 11.8 8.3-8.3M16 7l3 3M13.8 9.2l2 2\"/>","keyboard":"<path fill-rule=\"evenodd\" d=\"M4.4 5.4h15.2A2.4 2.4 0 0 1 22 7.8v8.4a2.4 2.4 0 0 1-2.4 2.4H4.4A2.4 2.4 0 0 1 2 16.2V7.8a2.4 2.4 0 0 1 2.4-2.4ZM5 9h2v2H5ZM8 9h2v2H8ZM11 9h2v2h-2ZM14 9h2v2h-2ZM17 9h2v2h-2ZM7.6 13.4h8.8v1.8H7.6Z\"/>","laugh":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 8.1l3.4 1.7-3.4 1.7-.67-1.34.72-.36-.72-.36ZM17 8.1l-3.4 1.7 3.4 1.7.67-1.34-.72-.36.72-.36ZM7.6 13.4h8.8a4.4 4.4 0 0 1-8.8 0Z\"/>","layers":"<path d=\"m12 3.9 9.6 5.6 -9.6 5.6 -9.6 -5.6Z\"/><path class=\"ln\" d=\"m3 14.6 9 5 9 -5\"/>","leaf":"<path fill-rule=\"evenodd\" d=\"M5 19c0-8.5 5-13.6 15-15-.9 9.9-6 15-15 15Zm2.9-1.9L16 8l-9.1 8.1Z\"/><path class=\"ln\" d=\"M3.4 20.6 5.6 18.4\"/>","lifebuoy":"<path fill-rule=\"evenodd\" d=\"M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 5.4a4.2 4.2 0 1 1 0 8.4 4.2 4.2 0 0 1 0-8.4ZM14.33 16.17 17.44 19.28 19.28 17.44 16.17 14.33ZM9.67 16.17 6.56 19.28 4.72 17.44 7.83 14.33ZM14.33 7.83 17.44 4.72 19.28 6.56 16.17 9.67ZM9.67 7.83 6.56 4.72 4.72 6.56 7.83 9.67Z\"/>","live":"<circle cx=\"12\" cy=\"12\" r=\"3.1\"/><path class=\"ln\" d=\"M7.8 7.8a6 6 0 0 0 0 8.4M16.2 7.8a6 6 0 0 1 0 8.4M5 5a10 10 0 0 0 0 14M19 5a10 10 0 0 1 0 14\"/>","lock":"<path d=\"M5 11.6a1.6 1.6 0 0 1 1.6-1.6h10.8a1.6 1.6 0 0 1 1.6 1.6v8a1.6 1.6 0 0 1-1.6 1.6H6.6A1.6 1.6 0 0 1 5 19.6Z\"/><path class=\"ln\" d=\"M8.2 10V7.6a3.8 3.8 0 0 1 7.6 0V10\"/>","mail":"<path d=\"M3 7.6v-.4A2.2 2.2 0 0 1 5.2 5h13.6A2.2 2.2 0 0 1 21 7.2v.4l-8.2 5.3a1.5 1.5 0 0 1-1.6 0ZM3 9.6v7.2A2.2 2.2 0 0 0 5.2 19h13.6a2.2 2.2 0 0 0 2.2-2.2V9.6l-7.6 4.9a2.6 2.6 0 0 1-2.8 0Z\"/>","map":"<path d=\"M2.6 6.1 8.3 4.2v14l-5.7 1.9ZM9.7 4.2l4.6 1.6v14l-4.6-1.6ZM15.7 5.8l5.7-1.9v14l-5.7 1.9Z\"/>","mask":"<path fill-rule=\"evenodd\" d=\"M2.9 6.2c3.2 1.4 6.2 2 9.1 2s5.9-.6 9.1-2c0 6.9-2.8 11.4-5.6 11.4-1.5 0-2.1-1.5-3.5-1.5s-2 1.5-3.5 1.5c-2.8 0-5.6-4.5-5.6-11.4ZM6.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0ZM13.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0Z\"/>","medical":"<path fill-rule=\"evenodd\" d=\"M4.9 6.1h14.2a2.8 2.8 0 0 1 2.8 2.8v9.2a2.8 2.8 0 0 1-2.8 2.8H4.9a2.8 2.8 0 0 1-2.8-2.8V8.9a2.8 2.8 0 0 1 2.8-2.8ZM10.8 10h2.4v2.3h2.3v2.4h-2.3V17h-2.4v-2.3H8.5v-2.4h2.3Z\"/><path class=\"ln\" d=\"M9 6.1V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1.1\"/>","megaphone":"<path d=\"M3.4 10a1.1 1.1 0 0 1 1.1-1.1h2.6l9.4-4.7v15.6l-9.4-4.7H4.5A1.1 1.1 0 0 1 3.4 14Z\"/><path class=\"ln\" d=\"M7.2 15.2l1.2 4.9M19 9.4a3.3 3.3 0 0 1 0 5.2\"/>","members":"<circle cx=\"9\" cy=\"7.9\" r=\"3.6\"/><path d=\"M2.4 20.8c0-3.8 3-6.5 6.6-6.5s6.6 2.7 6.6 6.5Z\"/><circle cx=\"16.6\" cy=\"7.4\" r=\"2.9\"/><path d=\"M16.8 13.4c2.9.4 4.8 2.8 4.8 6.4V20.8h-4.4c0-2.9-1-5.2-2.8-6.7Z\"/>","mic":"<path d=\"M8.7 5.8a3.3 3.3 0 0 1 6.6 0V11a3.3 3.3 0 0 1-6.6 0Z\"/><path class=\"ln\" d=\"M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21\"/>","mic-off":"<path d=\"M8.73 5.33A3.3 3.3 0 0 1 15.3 5.8V11a3.3 3.3 0 0 1-.1.8Z\"/><path class=\"ln\" d=\"M5 11a7 7 0 0 0 11.6 5.3M19 11c0 .8-.1 1.6-.4 2.3M12 18v3M4 4l16 16\"/>","minus-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 10.8v2.4h10v-2.4Z\"/>","money":"<path fill-rule=\"evenodd\" d=\"M4.4 5.4h15.2a2.2 2.2 0 0 1 2.2 2.2v8.8a2.2 2.2 0 0 1-2.2 2.2H4.4a2.2 2.2 0 0 1-2.2-2.2V7.6a2.2 2.2 0 0 1 2.2-2.2ZM12 8.7a3.3 3.3 0 1 0 0 6.6 3.3 3.3 0 0 0 0-6.6ZM6 8.5a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Zm12 4.8a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Z\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\"/>","moon":"<path d=\"M20.4 14.4A8.5 8.5 0 1 1 9.6 3.6a7 7 0 0 0 10.8 10.8Z\"/>","more":"<circle cx=\"5\" cy=\"12\" r=\"2.1\"/><circle cx=\"12\" cy=\"12\" r=\"2.1\"/><circle cx=\"19\" cy=\"12\" r=\"2.1\"/>","mountain":"<path d=\"M2.5 19 9 6l4.2 7.2L16 9.5 21.5 19Z\"/>","mug":"<path d=\"M3.9 8.4h12.2v7.6a4.6 4.6 0 0 1-4.6 4.6h-3a4.6 4.6 0 0 1-4.6-4.6Z\"/><path class=\"ln\" d=\"M16.1 10.5H17a2.5 2.5 0 0 1 0 5h-.9M8 3.2c-.8 1 .8 2 0 3M11.5 3.2c-.8 1 .8 2 0 3\"/>","music":"<path d=\"M8.4 6.6l12-2.3v3.2l-12 2.3Z\"/><path class=\"ln\" d=\"M9.5 18V7.8M19.5 16V5.6\"/><circle cx=\"6.7\" cy=\"18\" r=\"2.9\"/><circle cx=\"16.7\" cy=\"16\" r=\"2.9\"/>","mute":"<path d=\"M3.4 8.9h3.9l5.3-4.1v14.4l-5.3-4.1H3.4Z\"/><path class=\"ln\" d=\"m15.7 9.7 4.6 4.6M20.3 9.7l-4.6 4.6\"/>","news":"<path fill-rule=\"evenodd\" d=\"M4 3.6h13.4v14.3a2.1 2.1 0 0 0 2.1 2.1H6.1A2.1 2.1 0 0 1 4 18.9ZM7.5 7.3h6.4v1.6H7.5Zm0 3.5h6.4v1.6H7.5Zm0 3.5h3.8v1.6H7.5Z\"/><path class=\"ln\" d=\"M17.4 8.4H20V18a2 2 0 0 1 -2 2\"/>","nodes":"<circle cx=\"12\" cy=\"5\" r=\"3\"/><circle cx=\"5.5\" cy=\"18\" r=\"3\"/><circle cx=\"18.5\" cy=\"18\" r=\"3\"/><path class=\"ln\" d=\"M10.9 7.4 6.7 15.4M13.1 7.4l4.2 8M8.4 18h7.2\"/>","palette":"<path fill-rule=\"evenodd\" d=\"M12 2.7a9.3 9.3 0 1 0 0 18.6c1.3 0 2-.9 2-1.9 0-1.2-1-1.5-1-2.5s.8-1.6 2-1.6H17a4.3 4.3 0 0 0 4.3-4.3C21.3 6.5 17.2 2.7 12 2.7ZM7.5 9.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm2.5-3.7a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Zm4.5 0a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3Z\"/>","parking":"<path fill-rule=\"evenodd\" d=\"M6.2 2.6h11.6a3.6 3.6 0 0 1 3.6 3.6v11.6a3.6 3.6 0 0 1-3.6 3.6H6.2a3.6 3.6 0 0 1-3.6-3.6V6.2a3.6 3.6 0 0 1 3.6-3.6ZM8.4 18V6H13a4 4 0 0 1 0 8h-2.4v4ZM10.6 8.2v3.6H13a1.8 1.8 0 0 0 0-3.6Z\"/>","pause":"<rect x=\"6.3\" y=\"4.6\" width=\"4\" height=\"14.8\" rx=\"1.2\"/><rect x=\"13.7\" y=\"4.6\" width=\"4\" height=\"14.8\" rx=\"1.2\"/>","paw":"<path d=\"M7.4 18.4c0-3.1 2-5.6 4.6-5.6s4.6 2.5 4.6 5.6c0 1.6-1.2 2.6-2.6 2.6-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1.4 0-2.6-1-2.6-2.6Z\"/><circle cx=\"5.8\" cy=\"11\" r=\"2.3\"/><circle cx=\"9.4\" cy=\"6.4\" r=\"2.3\"/><circle cx=\"14.6\" cy=\"6.4\" r=\"2.3\"/><circle cx=\"18.2\" cy=\"11\" r=\"2.3\"/>","pencil":"<path d=\"M16.3 3.2a2.3 2.3 0 0 1 3.3 3.3L7.4 18.7l-4.6 1.2 1.2-4.6Z\"/><path class=\"ln\" d=\"M12.6 20.3H21\"/>","phone":"<path d=\"M4.6 3.4h4.8l2.3 5.8-2.6 1.6a10.4 10.4 0 0 0 4.1 4.1l1.6-2.6 5.8 2.3v4.8a2.2 2.2 0 0 1-2.2 2.2A16.8 16.8 0 0 1 2.4 5.6a2.2 2.2 0 0 1 2.2-2.2Z\"/>","piggy":"<path fill-rule=\"evenodd\" d=\"M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12ZM15 10.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0ZM9.3 7.8v1.4h3.4V7.8Z\"/>","pin":"<path fill-rule=\"evenodd\" d=\"M12 2.3a7.3 7.3 0 0 0-7.3 7.3c0 5.6 7.3 12.1 7.3 12.1s7.3-6.5 7.3-12.1A7.3 7.3 0 0 0 12 2.3Zm0 4.6a2.6 2.6 0 1 1 0 5.2 2.6 2.6 0 0 1 0-5.2Z\"/>","plane":"<path d=\"M21 3 3.1 10.4l6.5 3ZM21 3l-10.4 11.4 3 6.5Z\"/>","play":"<path d=\"M6.4 4.4v15.2a0.8 0.8 0 0 0 1.2 0.7l11.4 -7.6a0.8 0.8 0 0 0 0 -1.4L7.6 3.7a0.8 0.8 0 0 0 -1.2 0.7Z\"/>","plug":"<path d=\"M5.8 7.2h12.4v3.8a6.2 6.2 0 0 1-12.4 0Z\"/><path class=\"ln\" d=\"M9 2.8v4.4M15 2.8v4.4M12 17.2v4\"/>","plus-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm-1.2 4.2h2.4v3.8H17v2.4h-3.8V17h-2.4v-3.8H7v-2.4h3.8Z\"/>","print":"<path d=\"M6.4 2.9h11.2v4.3H6.4ZM2.9 11a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v4a2.6 2.6 0 0 1-2.6 2.6h-.3v-4.4H5.8v4.4h-.3A2.6 2.6 0 0 1 2.9 15ZM7.2 14.6h9.6v6.5H7.2Z\"/>","puzzle":"<path d=\"M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z\"/>","radio":"<path fill-rule=\"evenodd\" d=\"M5 7.4h14a2.6 2.6 0 0 1 2.6 2.6v8a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18v-8A2.6 2.6 0 0 1 5 7.4ZM12.9 14a2.6 2.6 0 1 0 5.2 0a2.6 2.6 0 1 0-5.2 0ZM6 11.3v2.1h4.8v-2.1ZM6 14.8v2.1h4.8v-2.1Z\"/><path class=\"ln\" d=\"M7 7.4 17 3.5\"/>","ranking":"<path d=\"M3.4 13.6h5V9.8h7.2v5.8h5v5.5H3.4ZM12 2l1 2 2.2.3-1.6 1.6.4 2.2L12 7.1l-2 1 .4-2.2-1.6-1.6 2.2-.3Z\"/>","record":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.2a6 6 0 1 1 0 12 6 6 0 0 1 0-12Z\"/><circle cx=\"12\" cy=\"12\" r=\"3.6\"/>","restroom":"<circle cx=\"7\" cy=\"4.6\" r=\"2\"/><circle cx=\"17\" cy=\"4.6\" r=\"2\"/><path d=\"M6 8.8h2a1.7 1.7 0 0 1 1.7 1.7v5.2H8.6v5.5H5.4v-5.5H4.3v-5.2A1.7 1.7 0 0 1 6 8.8Z\"/><path d=\"M16.4 9.3h1.2a1 1 0 0 1 1 .8l2.1 7H18.3v3.9h-2.6v-3.9h-2.4l2.1-7a1 1 0 0 1 1-.8Z\"/><path class=\"ln\" d=\"M12 3v18\"/>","retry":"<path class=\"ln\" d=\"M4.4 12a7.6 7.6 0 0 1 12.7-5.6M19.6 12a7.6 7.6 0 0 1-12.7 5.6\"/><path d=\"M20.8 3.3v6.6h-6.6ZM3.2 20.7v-6.6h6.6Z\"/>","rewind":"<path d=\"M21 5.7v12.6L12.3 12ZM11.7 5.7v12.6L3 12Z\"/>","robot":"<path fill-rule=\"evenodd\" d=\"M8 7.4h8a3.6 3.6 0 0 1 3.6 3.6v5A3.6 3.6 0 0 1 16 19.6H8A3.6 3.6 0 0 1 4.4 16v-5A3.6 3.6 0 0 1 8 7.4Zm1 4.4a1.4 1.4 0 1 0 0 2.8 1.4 1.4 0 0 0 0-2.8Zm6 0a1.4 1.4 0 1 0 0 2.8 1.4 1.4 0 0 0 0-2.8ZM9.4 15.8v1.5h5.2v-1.5Z\"/><path class=\"ln\" d=\"M12 3.4v4M2.6 12.4v3.2M21.4 12.4v3.2\"/>","rocket":"<path fill-rule=\"evenodd\" d=\"M12.1 16.2 7.8 11.9C9.4 6 13.8 2.9 21.1 2.9c0 7.3-3.1 11.7-9 13.3ZM13.8 8.5a1.7 1.7 0 1 0 3.4 0a1.7 1.7 0 1 0-3.4 0Z\"/><path d=\"M4.2 11.9 7.2 7.4h3.4L7 12.3ZM11.7 17 12.1 19.8l4.5-3.2v-3.4ZM6.7 17.3c-1.9 0-3.8 1.9-3.8 3.8 1.9 0 3.8-1.9 3.8-3.8Z\"/>","save":"<path fill-rule=\"evenodd\" d=\"M5 3.4h11.4l3.2 3.2V20a.6.6 0 0 1-.6.6H5a.6.6 0 0 1-.6-.6V4a.6.6 0 0 1 .6-.6Zm3.1 1.3v4.5h6.8V4.7ZM7.6 13.4v5.9h8.8v-5.9Z\"/>","scissors":"<path fill-rule=\"evenodd\" d=\"M6 3.9a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4Zm0 2a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4ZM6 13.7a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4Zm0 2a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z\"/><path class=\"ln\" d=\"M8.5 8.8 20 18M8.5 15.2 20 6\"/>","search":"<path fill-rule=\"evenodd\" d=\"M11 3.4a7.6 7.6 0 1 1 0 15.2 7.6 7.6 0 0 1 0-15.2Zm0 3.1a4.5 4.5 0 1 0 0 9 4.5 4.5 0 0 0 0-9Z\"/><path class=\"ln\" d=\"m16.6 16.6 3.8 3.8\"/>","seedling":"<path d=\"M12.4 11.4C12.4 7 9.6 4 4.5 4c0 4.6 2.8 7.4 7.9 7.4ZM11.6 13.9c0-4.4 2.8-7.4 7.9-7.4 0 4.6-2.8 7.4-7.9 7.4Z\"/><path class=\"ln\" d=\"M12 20.5V13\"/>","server":"<path fill-rule=\"evenodd\" d=\"M6 3.6h12a2.4 2.4 0 0 1 2.4 2.4v3a2.4 2.4 0 0 1-2.4 2.4H6A2.4 2.4 0 0 1 3.6 9V6A2.4 2.4 0 0 1 6 3.6Zm2 2.6a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6ZM6 12.6h12a2.4 2.4 0 0 1 2.4 2.4v3a2.4 2.4 0 0 1-2.4 2.4H6A2.4 2.4 0 0 1 3.6 18v-3A2.4 2.4 0 0 1 6 12.6Zm2 2.6a1.3 1.3 0 1 0 0 2.6 1.3 1.3 0 0 0 0-2.6Z\"/>","shapes":"<circle cx=\"7.5\" cy=\"7.5\" r=\"4.2\"/><path d=\"m16.5 2.6 4.8 8.4h-9.6ZM13.4 13.4h7.2v7.2h-7.2ZM2.8 20.6 7 13.4l4.2 7.2Z\"/>","shelter":"<path fill-rule=\"evenodd\" d=\"M12 2.4 2 10.3l1.2 1.6 1-.8v10.5h15.6V11.1l1 .8 1.2-1.6ZM9.4 21.6v-5a2.6 2.6 0 0 1 5.2 0v5ZM12 9.2a1.8 1.8 0 1 1 0 3.6 1.8 1.8 0 0 1 0-3.6Z\"/>","shield":"<path d=\"M12 2.6 4.6 5.8V12c0 4.6 3.1 8 7.4 9.5 4.3-1.5 7.4-4.9 7.4-9.5V5.8Z\"/>","shirt":"<path d=\"M7.8 2.2 2 5.6l2.6 5.2 1.6-.8v11.8h11.6V10l1.6.8L22 5.6l-5.8-3.4c-.6 1.6-2 2.6-4.2 2.6S8.4 3.8 7.8 2.2Z\"/>","skip":"<path d=\"M5.4 4.3v15.4L15.6 12Z\"/><rect x=\"17.2\" y=\"4.4\" width=\"2.6\" height=\"15.2\" rx=\"1.2\"/>","skull":"<path fill-rule=\"evenodd\" d=\"M12 2.1a7.9 7.9 0 0 0-7.9 7.9c0 2.4 1.1 4.2 2.5 5.4V19a2 2 0 0 0 2 2h6.8a2 2 0 0 0 2-2v-3.6c1.4-1.2 2.5-3 2.5-5.4A7.9 7.9 0 0 0 12 2.1ZM9.2 8.9a1.7 1.7 0 1 1 0 3.4 1.7 1.7 0 0 1 0-3.4ZM14.8 8.9a1.7 1.7 0 1 1 0 3.4 1.7 1.7 0 0 1 0-3.4ZM12 12.8l1 1.8h-2ZM10.1 17.6h.9v2.4h-.9ZM13 17.6h.9v2.4H13Z\"/>","sliders":"<path class=\"ln\" d=\"M4 7h8.8M19.2 7H20M4 17h2.8M13.2 17H20\"/><circle cx=\"16\" cy=\"7\" r=\"3.2\"/><circle cx=\"10\" cy=\"17\" r=\"3.2\"/>","smile":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM9 8.6a1.35 1.35 0 1 1 0 2.7 1.35 1.35 0 0 1 0-2.7ZM15 8.6a1.35 1.35 0 1 1 0 2.7 1.35 1.35 0 0 1 0-2.7ZM7.9 13.4h8.2a4.1 4.1 0 0 1-8.2 0Z\"/>","spark":"<path d=\"M11.5 2.6l2 5.6 5.6 2 -5.6 2L11.5 17.8l-2 -5.6 -5.6 -2 5.6 -2ZM18.5 14.6l0.9 2.5 2.5 0.9 -2.5 0.9 -0.9 2.5 -0.9 -2.5 -2.5 -0.9 2.5 -0.9Z\"/>","square":"<rect x=\"3.4\" y=\"3.4\" width=\"17.2\" height=\"17.2\" rx=\"3\"/>","star":"<path d=\"M12 3.2l2.6 5.4 5.9.7-4.4 4 1.2 5.9L12 16.3l-5.3 2.9 1.2-5.9-4.4-4 5.9-.7Z\"/>","steps":"<path fill-rule=\"evenodd\" d=\"M2.6 3.6h5.2v5.2H2.6Zm1.1 2.6.8-.9.9.9 1.5-1.5.9.9-2.4 2.4ZM2.6 9.4h5.2v5.2H2.6Zm1.1 2.6.8-.9.9.9 1.5-1.5.9.9-2.4 2.4ZM2.6 15.2h5.2v5.2H2.6Zm1.1 2.6.8-.9.9.9 1.5-1.5.9.9-2.4 2.4Z\"/><path class=\"ln\" d=\"M10.8 6.2H21M10.8 12H21M10.8 17.8H21\"/>","store":"<path d=\"M5.2 3.6h13.6l1.8 5.6v1.3a2.9 2.9 0 0 1-5.73 0 2.9 2.9 0 0 1-5.74 0 2.9 2.9 0 0 1-5.73 0V9.2ZM4.8 14.3h14.4v5.1a1 1 0 0 1-1 1H14v-4.6h-4v4.6H5.8a1 1 0 0 1-1-1Z\"/>","sun":"<circle cx=\"12\" cy=\"12\" r=\"4.6\"/><path class=\"ln\" d=\"M12 2.2v1.6M12 20.2v1.6M5 5l1.1 1.1M17.9 17.9 19 19M2.2 12h1.6M20.2 12h1.6M5 19l1.1-1.1M17.9 6.1 19 5\"/>","sword":"<path d=\"M20.6 3.4v4.4l-10.1 10.1-4.4-4.4L16.2 3.4Z\"/><path class=\"ln\" d=\"M5.5 12 12 18.5M8.5 15.5 4 20\"/>","table":"<path d=\"M2.4 6a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.4H2.4ZM2.4 10.4h5.4v10.2H5a2.6 2.6 0 0 1-2.6-2.6ZM9.7 10.4h4.6v10.2H9.7ZM16.2 10.4h5.4V18a2.6 2.6 0 0 1-2.6 2.6h-2.8Z\"/>","tack":"<path d=\"M8.2 2.4h7.6a.9.9 0 0 1 .9 1.1l-.9 4.2 3 3a.8.8 0 0 1-.6 1.5H5.8a.8.8 0 0 1-.6-1.5l3-3-.9-4.2a.9.9 0 0 1 .9-1.1Z\"/><path class=\"ln\" d=\"M12 12.2V21\"/>","tag":"<path fill-rule=\"evenodd\" d=\"M2.6 3.1A1.5 1.5 0 0 1 4.1 2.6h7.3l10.1 10.1 -8.8 8.8L2.6 10.4Zm5.1 2.5a1.9 1.9 0 1 0 0 3.8 1.9 1.9 0 0 0 0 -3.8Z\"/>","target":"<path fill-rule=\"evenodd\" d=\"M12 3.1a8.9 8.9 0 1 1 0 17.8 8.9 8.9 0 0 1 0-17.8Zm0 2.8a6.1 6.1 0 1 0 0 12.2 6.1 6.1 0 0 0 0-12.2Zm0 2.6a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7Z\"/>","tent":"<path fill-rule=\"evenodd\" d=\"M12 4.2 20.6 19.8H3.4ZM12 13 9 19.8h6Z\"/><path class=\"ln\" d=\"M2.4 20.2h19.2\"/>","terminal":"<path fill-rule=\"evenodd\" d=\"M5 3.6h14a2.4 2.4 0 0 1 2.4 2.4v12a2.4 2.4 0 0 1-2.4 2.4H5A2.4 2.4 0 0 1 2.6 18V6A2.4 2.4 0 0 1 5 3.6Zm1.4 6 1.3-1.3 3.6 3.7-3.6 3.7-1.3-1.3 2.4-2.4Zm6.4 4.6h4.4v1.7h-4.4Z\"/>","text":"<path fill-rule=\"evenodd\" d=\"M10.3 3.4h3.4l6.3 17.2h-3.1l-1.5-4.3H8.6l-1.5 4.3H4ZM9.5 13.7h5L12 6.4Z\"/>","thumbs-up":"<path d=\"M7.4 10.4v10H4.6a1.1 1.1 0 0 1-1.1-1.1v-7.8a1.1 1.1 0 0 1 1.1-1.1ZM8.8 10.4l3.5-7.1a2.3 2.3 0 0 1 2.6 2.7l-.6 3.4h5.5a2.1 2.1 0 0 1 2.1 2.5l-1.4 6.8a2.1 2.1 0 0 1-2.1 1.7H8.8Z\"/>","ticket":"<path fill-rule=\"evenodd\" d=\"M2.6 6.4h18.8v3.4a2.2 2.2 0 0 0 0 4.4v3.4H2.6v-3.4a2.2 2.2 0 0 0 0-4.4ZM13.3 8.4v1.8h1.4V8.4Zm0 2.7v1.8h1.4v-1.8Zm0 2.7v1.8h1.4v-1.8Z\"/>","toolbox":"<path d=\"M2.4 10a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.3H2.4ZM2.4 13.7h4.8v1.5h1.6v-1.5h6.4v1.5h1.6v-1.5h4.8V18a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18Z\"/><path class=\"ln\" d=\"M9 7.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v1.9\"/>","train":"<path fill-rule=\"evenodd\" d=\"M9 3h6a3 3 0 0 1 3 3v7a3 3 0 0 1-3 3H9a3 3 0 0 1-3-3V6a3 3 0 0 1 3-3Zm-1.2 2.6v4.2h8.4V5.6ZM9 12a1.1 1.1 0 1 0 0 2.2A1.1 1.1 0 0 0 9 12Zm6 0a1.1 1.1 0 1 0 0 2.2 1.1 1.1 0 0 0 0-2.2Z\"/><path class=\"ln\" d=\"M8.5 21l2-3.5M15.5 21l-2-3.5\"/>","trash":"<path d=\"M5.8 7.6h12.4l-1 12a2 2 0 0 1-2 1.8H8.8a2 2 0 0 1-2-1.8Z\"/><path class=\"ln\" d=\"M3.8 6.6h16.4M9 6.6V4h6v2.6\"/>","tree":"<path d=\"M12 2.6 5.6 11.2h3.2L4 17.8h16l-4.8-6.6h3.2Z\"/><path class=\"ln\" d=\"M12 17v4.2\"/>","trophy":"<path d=\"M7.3 3.3h9.4V9a4.7 4.7 0 0 1-9.4 0Z\"/><path class=\"ln\" d=\"M7.3 5.8H5.1a3 3 0 0 0 3 4.1M16.7 5.8h2.2a3 3 0 0 1-3 4.1M12 13.8V17M8 20.4h8\"/>","tv":"<rect x=\"2.2\" y=\"6.6\" width=\"19.6\" height=\"14\" rx=\"2.4\"/><path class=\"ln\" d=\"m8 2.8 4 3.6 4-3.6\"/>","umbrella":"<path d=\"M2.1 12.6a9.9 9.9 0 0 1 19.8 0Z\"/><path class=\"ln\" d=\"M12 12.6v5.9a2 2 0 0 1-4 0\"/>","upload":"<path d=\"M10.8 20.4h2.4v-6.6h4.4L12 8.2l-5.6 5.6h4.4Z\"/><path class=\"ln\" d=\"M5 4h14\"/>","user":"<circle cx=\"12\" cy=\"7.8\" r=\"4.1\"/><path d=\"M4.2 21c0-4.3 3.5-7.2 7.8-7.2s7.8 2.9 7.8 7.2Z\"/>","user-check":"<circle cx=\"9\" cy=\"7.9\" r=\"3.6\"/><path d=\"M2.4 20.8c0-3.8 3-6.5 6.6-6.5s6.6 2.7 6.6 6.5Z\"/><path class=\"ln\" d=\"m15.6 11.2 2.2 2.2 4.2-4.2\"/>","user-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.8a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4ZM6.3 17.6a6.6 6.6 0 0 1 11.4 0 8 8 0 0 1-11.4 0Z\"/>","user-lock":"<circle cx=\"10\" cy=\"8\" r=\"4.1\"/><path d=\"M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z\"/><rect x=\"14.6\" y=\"15.2\" width=\"6.8\" height=\"5.6\" rx=\"1.3\"/><path class=\"ln\" d=\"M16.5 15.2v-1a1.5 1.5 0 0 1 3 0v1\"/>","user-minus":"<circle cx=\"10\" cy=\"8\" r=\"4.1\"/><path d=\"M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z\"/><path class=\"ln\" d=\"M15.8 17.5h5.4\"/>","user-off":"<path d=\"M8.95 5.27A4.1 4.1 0 1 1 14.74 11.06ZM4.2 21c0-4.2 2.8-6.8 6.2-7.1L17.3 21Z\"/><path class=\"ln\" d=\"m4 4 16 16\"/>","user-pen":"<circle cx=\"10\" cy=\"8\" r=\"4.1\"/><path d=\"M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z\"/><path d=\"M19.9 11.9l2.2 2.2-5.3 5.3-2.9.7.7-2.9Z\"/>","user-tag":"<circle cx=\"10\" cy=\"8\" r=\"4.1\"/><path d=\"M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z\"/><path fill-rule=\"evenodd\" d=\"M14.1 14.4h4.6l3.1 3.1-3.1 3.1h-4.6ZM15.3 17.5a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z\"/>","video":"<path d=\"M2.5 7.6a2 2 0 0 1 2-2H14a2 2 0 0 1 2 2v8.8a2 2 0 0 1-2 2H4.5a2 2 0 0 1-2-2ZM17.2 10.1l4.3-2.6v9l-4.3-2.6Z\"/>","volume":"<path d=\"M3.4 8.9h3.9l5.3-4.1v14.4l-5.3-4.1H3.4Z\"/><path class=\"ln\" d=\"M15.9 9.3a3.7 3.7 0 0 1 0 5.4M18.4 6.6a7.4 7.4 0 0 1 0 10.8\"/>","walk":"<circle cx=\"12.5\" cy=\"4.5\" r=\"2.4\"/><path class=\"ln\" d=\"m8.5 21 2.6-6 2.1 2.4V21M11.1 15l1-5.6-3 1.6-1.5 3M12.1 9.4l2 3 3 1\"/>","wallet":"<path fill-rule=\"evenodd\" d=\"M6.5 4.6H18v4h1.4a.8.8 0 0 1 .8.8v10.8H6a2.2 2.2 0 0 1-2.2-2.2V7.3a2.7 2.7 0 0 1 2.7-2.7Zm0 1.8a.9.9 0 0 0 0 1.8h9.7V6.4ZM16 13.3a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Z\"/>","water":"<path d=\"M2.5 8.6c2.4 0 2.4 -2 4.8 -2s2.4 2 4.7 2 2.4 -2 4.8 -2 2.4 2 4.7 2v3.2c-2.3 0 -2.3 -2 -4.7 -2s-2.4 2 -4.8 2 -2.3 -2 -4.7 -2 -2.4 2 -4.8 2ZM2.5 15.6c2.4 0 2.4 -2 4.8 -2s2.4 2 4.7 2 2.4 -2 4.8 -2 2.4 2 4.7 2v3.2c-2.3 0 -2.3 -2 -4.7 -2s-2.4 2 -4.8 2 -2.3 -2 -4.7 -2 -2.4 2 -4.8 2Z\"/>","weight":"<circle cx=\"12\" cy=\"5.2\" r=\"2.6\"/><path d=\"M6.6 9h10.8l3.3 12.1H3.3Z\"/>","window":"<path d=\"M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h18.2v7.5a2.6 2.6 0 0 1-2.6 2.6h-13a2.6 2.6 0 0 1-2.6-2.6Z\"/>","window-restore":"<path d=\"M2.9 10.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-8a2.6 2.6 0 0 1-2.6-2.6ZM7.9 6.6V6.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-1.1v-5.6a3.9 3.9 0 0 0-3.9-3.9Z\"/>","wrench":"<path d=\"M14.5 3.6a5.4 5.4 0 0 0-4.9 7.4L3.6 17V20.4H7l6-6a5.4 5.4 0 0 0 7.4-4.9l-3.1 1.2-2.6-2.6 1.2-3.1Z\"/>","x-circle":"<path fill-rule=\"evenodd\" d=\"M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM9.2 7.8 12 10.6l2.8-2.8 1.4 1.4-2.8 2.8 2.8 2.8-1.4 1.4-2.8-2.8-2.8 2.8-1.4-1.4 2.8-2.8-2.8-2.8Z\"/>","zap":"<path d=\"M13.4 2.4 4.6 13.4h6.2l-1.2 8.2 8.8-11h-6.2Z\"/>"};
const FA = {"address-card":"id","adjust":"contrast","align-left":"align-left","angle-down":"down","angle-right":"chevron","angles-left":"chevrons-left","angles-right":"chevrons-right","arrow-down":"arrow-down","arrow-down-short-wide":"sort-asc","arrow-down-wide-short":"sort","arrow-left":"arrow-left","arrow-right":"arrow-right","arrow-right-arrow-left":"swap","arrow-right-from-bracket":"leave","arrow-right-to-bracket":"enter","arrow-rotate-right":"retry","arrow-trend-down":"trend-down","arrow-trend-up":"trend-up","arrow-up":"arrow-up","arrow-up-from-bracket":"share","arrow-up-right-from-square":"open","arrows-left-right":"arrows-h","arrows-rotate":"retry","arrows-to-dot":"focus","arrows-up-down-left-right":"move","at":"at","backward":"rewind","backward-fast":"rewind","balance-scale":"scale","ban":"ban","bars":"menu","basket-shopping":"cart","bell":"bell","bolt":"zap","bolt-lightning":"zap","book":"book","book-open":"book-open","box":"box","box-archive":"archive","box-open":"box","brain":"brain","bridge":"bridge","briefcase":"briefcase","briefcase-medical":"medical","broadcast-tower":"live","bug":"bug","bullhorn":"megaphone","bullseye":"target","burst":"burst","calendar":"calendar","calendar-day":"calendar","calendar-days":"calendar","camera":"camera","camera-cctv":"camera","camera-retro":"camera","camera-rotate":"camera-flip","camera-slash":"camera-off","campground":"tent","car":"car","caret-down":"down","cart":"cart","cart-plus":"cart","cart-shopping":"cart","chart-area":"chart","chart-bar":"chart","chart-column":"chart","chart-line":"chart","chart-simple":"chart","check":"check","check-circle":"check-circle","check-double":"check-double","chevron-down":"down","chevron-left":"back","chevron-right":"chevron","chevron-up":"up","child":"child","circle":"circle","circle-check":"check-circle","circle-dollar-to-slot":"donate","circle-dot":"record","circle-exclamation":"alert-circle","circle-half-stroke":"contrast","circle-info":"info","circle-minus":"minus-circle","circle-nodes":"nodes","circle-notch":"busy","circle-play":"play","circle-plus":"plus-circle","circle-question":"help","circle-user":"user-circle","circle-xmark":"x-circle","city":"city","clapperboard":"clapper","clipboard":"clipboard","clipboard-check":"clipboard-check","clipboard-list":"clipboard","clock":"clock","clock-rotate-left":"history","clone":"copy","closed-captioning":"cc","cloud":"cloud","cloud-arrow-up":"upload","cloud-bolt":"storm","cloud-moon":"cloud","cloud-rain":"cloud","cloud-showers-heavy":"cloud","cloud-slash":"cloud-off","cloud-sun":"cloud","code":"code","code-branch":"branch","code-commit":"commit","code-fork":"branch","coin":"coin","coins":"coin","comment":"chat","comment-dots":"chat","comment-slash":"chat-off","comments":"chat","compass":"compass","compress":"compress","cookie":"cookie","cookie-bite":"cookie","copy":"copy","couch":"couch","credit-card":"card","crown":"crown","cube":"box","cubes":"cubes","cut":"scissors","database":"database","desktop":"computer","diagram-project":"nodes","dice":"dice","dice-five":"dice","dice-six":"dice","display":"computer","dollar-sign":"dollar","door-closed":"door","door-open":"door","down-left-and-up-right-to-center":"compress","download":"download","droplet":"drop","ear-listen":"ear","earth-americas":"globe","earth-europe":"globe","ellipsis":"more","ellipsis-vertical":"more","envelope":"mail","eraser":"eraser","exchange-alt":"swap","expand":"expand","external-link":"open","eye":"eye","eye-slash":"eye-off","face-grin":"laugh","face-grin-squint":"laugh","face-grin-squint-tears":"laugh","face-grin-stars":"smile","face-laugh":"laugh","face-smile":"smile","faucet":"drop","faucet-drip":"drop","file":"file","file-audio":"file","file-code":"file-code","file-image":"image","file-lines":"file","file-pdf":"file","file-pen":"pencil","film":"film","filter":"filter","fire":"fire","fish":"fish","fist-raised":"fist","flag":"flag","flag-checkered":"finish","flask":"flask","flask-vial":"flask","floppy-disk":"save","folder":"folder","folder-open":"folder","folder-tree":"folder-tree","font":"text","forward":"fast-forward","forward-fast":"fast-forward","forward-step":"skip","gamepad":"game","gauge":"gauge","gauge-high":"gauge","gauge-simple":"gauge","gauge-simple-high":"gauge","gauge-simple-low":"gauge","gavel":"gavel","gear":"gear","gears":"gear","gem":"gem","ghost":"ghost","gift":"gift","globe":"globe","grid":"grid","grip":"grip","grip-vertical":"grip","hammer":"hammer","hand":"hand","hand-fist":"fist","hand-holding-dollar":"coin","hand-holding-heart":"care","hand-point-right":"hand","hand-pointer":"hand","handshake":"handshake","handshake-angle":"handshake","hard-drive":"drive","hashtag":"hash","hat-wizard":"wizard","hdd":"drive","heading":"heading","headphones":"headphones","headphones-simple":"headphones","headset":"headphones","heart":"heart","heart-crack":"heart-broken","heart-pulse":"heart-pulse","heartbeat":"heart-pulse","hiking":"mountain","hot-tub":"hot-tub","hot-tub-person":"hot-tub","hourglass":"hourglass","hourglass-end":"hourglass","hourglass-half":"hourglass","hourglass-start":"hourglass","house":"home","house-chimney":"home","house-signal":"home","icicles":"snow","icons":"shapes","id-card":"id","image":"image","images":"image","inbox":"inbox","infinity":"infinity","info-circle":"info","key":"key","keyboard":"keyboard","kit-medical":"medical","language":"language","laptop":"computer","layer-group":"layers","leaf":"leaf","left-right":"arrows-h","life-ring":"lifebuoy","lightbulb":"idea","link":"link","link-slash":"link-off","list":"list","list-check":"steps","list-ol":"list-ordered","list-ul":"list","location-dot":"pin","location-pin":"pin","lock":"lock","lungs":"lungs","magnifying-glass":"search","map":"map","map-location-dot":"map","map-marker-alt":"pin","map-pin":"pin","mask":"mask","message":"chat","microchip":"chip","microphone":"mic","microphone-lines":"mic","microphone-slash":"mic-off","minus":"minus","minus-circle":"minus-circle","mobile-screen":"phone","mobile-screen-button":"phone","money-bill":"money","money-bill-1":"money","money-bill-transfer":"money","money-bill-wave":"money","money-check":"money","moon":"moon","mountain":"mountain","mountain-sun":"mountain","mug-hot":"mug","mug-saucer":"mug","music":"music","network-wired":"nodes","newspaper":"news","object-group":"group","paint-brush":"palette","paintbrush":"palette","palette":"palette","paper-plane":"plane","parking":"parking","paste":"clipboard","pause":"pause","paw":"paw","pen":"pencil","pen-nib":"pencil","pen-to-square":"pencil","pencil":"pencil","people-arrows":"members","people-group":"members","person-hiking":"mountain","person-shelter":"shelter","person-swimming":"water","person-walking":"walk","phone":"phone","phone-slash":"phone-off","photo-film":"film","piggy-bank":"piggy","plane":"airplane","plane-departure":"airplane","play":"play","plug":"plug","plug-circle-bolt":"plug","plug-circle-check":"plug","plug-circle-xmark":"plug","plus":"plus","plus-circle":"plus-circle","print":"print","puzzle":"puzzle","puzzle-piece":"puzzle","puzzle-piece-simple":"puzzle","question":"help","quote-left":"quote","quote-right":"quote","radio":"radio","ranking-star":"ranking","recycle":"recycle","reply":"reply","restroom":"restroom","right-from-bracket":"leave","right-left":"swap","right-to-bracket":"enter","road":"road","robot":"robot","rocket":"rocket","rotate":"retry","rotate-back":"undo","rotate-left":"retry","rotate-right":"retry","route":"route","rss":"rss","satellite-dish":"dish","save":"save","scale-balanced":"scale","scissors":"scissors","screwdriver-wrench":"wrench","scroll":"scroll","search":"search","seedling":"seedling","server":"server","shapes":"shapes","share-nodes":"nodes","shield":"shield","shield-halved":"shield","shirt":"shirt","signal":"wifi","signature":"signature","sitemap":"nodes","skull":"skull","skull-crossbones":"skull","slash":"slash","sliders":"sliders","sliders-h":"sliders","smog":"cloud","snowflake":"snow","sparkles":"spark","spinner":"busy","square":"square","square-parking":"parking","star":"star","star-of-life":"spark","step-forward":"skip","stop":"stop","store":"store","suitcase":"briefcase","suitcase-medical":"medical","sun":"sun","sword":"sword","table":"table","table-cells":"grid","table-columns":"columns","table-list":"table","tag":"tag","tags":"tag","television":"tv","terminal":"terminal","text-height":"text","th":"grid","thumbs-up":"thumbs-up","thumbtack":"tack","ticket":"ticket","timeline":"timeline","times":"close","toolbox":"toolbox","tower-broadcast":"live","tower-cell":"live","train":"train","trash":"trash","trash-can":"trash","tree":"tree","triangle-exclamation":"alert","trophy":"trophy","tv":"tv","umbrella":"umbrella","umbrella-beach":"umbrella","undo":"undo","unlock":"lock","up-right-and-down-left-from-center":"expand","up-right-from-square":"open","upload":"upload","user":"user","user-astronaut":"user","user-check":"user-check","user-circle":"user-circle","user-edit":"user-pen","user-group":"members","user-lock":"user-lock","user-minus":"user-minus","user-pen":"user-pen","user-plus":"invite","user-secret":"user","user-shield":"shield","user-slash":"user-off","user-tag":"user-tag","users":"members","utensils":"food","video":"video","video-slash":"video","volume-high":"volume","volume-low":"volume","volume-off":"mute","volume-xmark":"mute","wallet":"wallet","wand-magic":"spark","wand-magic-sparkles":"spark","water":"water","wave-square":"wave","weight-hanging":"weight","wifi":"wifi","wind":"wind","window-maximize":"window","window-restore":"window-restore","wrench":"wrench","xmark":"close","xmark-circle":"x-circle"};
const FB = {"youtube":"youtube","square-youtube":"youtube","twitch":"twitch","discord":"discord","github":"github","square-github":"github","x-twitter":"x","square-x-twitter":"x","twitter":"x","kick":"kick","kickstarter-k":"kick","kickstarter":"kickstarter","google":"google","tiktok":"tiktok","threads":"threads","spotify":"spotify","soundcloud":"soundcloud","reddit":"reddit","reddit-alien":"reddit","tumblr":"tumblr","hacker-news":"ycombinator","line":"line","paypal":"paypal","patreon":"patreon","mastodon":"mastodon","linux":"linux","instagram":"instagram","facebook":"facebook","facebook-f":"facebook","cloudflare":"cloudflare","brave":"brave","bluesky":"bluesky","bitcoin":"bitcoin","apple":"apple","telegram":"telegram","whatsapp":"whatsapp","steam":"steam","snapchat":"snapchat","pinterest":"pinterest","vimeo":"vimeo","vimeo-v":"vimeo","npm":"npm","node":"nodedotjs","node-js":"nodedotjs","docker":"docker","python":"python","android":"android","chrome":"googlechrome","firefox":"firefoxbrowser","firefox-browser":"firefoxbrowser","gitlab":"gitlab","ubuntu":"ubuntu","raspberry":"raspberrypi","raspberry-pi":"raspberrypi","stripe":"stripe","cc-stripe":"stripe","signal":"signal","matrix":"matrix","medium":"medium","wikipedia":"wikipedia","wikipedia-w":"wikipedia","ethereum":"ethereum"};
// Font Awesome's style, size, layout and animation classes: they say how, not what.
const MOD = /^fa-(solid|regular|light|thin|duotone|sharp|sharp-duotone|classic|brands|fw|lg|xl|xs|sm|2xs|2xl|[0-9]+x|spin|spin-pulse|spin-reverse|pulse|beat|beat-fade|bounce|fade|flip|shake|border|inverse|li|ul|stack|stack-1x|stack-2x|layers|layers-text|layers-counter|pull-left|pull-right|rotate-[0-9]+|rotate-by|flip-horizontal|flip-vertical|flip-both|swap-opacity|width-auto|width-fixed)$/;
const BUSY = '<circle cx="6" cy="12" r="1.8"/><circle cx="12" cy="12" r="1.8"/><circle cx="18" cy="12" r="1.8"/>';
-- const CSS = ".ovg::before,.ovg::after{content:none!important;display:none!important}.ovg{display:inline-block;width:1.15em;height:1.15em;line-height:1;vertical-align:-.18em;font-family:inherit!important;font-style:normal!important}.ovg>svg{display:block;width:100%;height:100%;fill:none;stroke:currentColor;stroke-width:calc(var(--ovg-stroke,2) * 1px + max(0px, (18.4px - 1.15em) * .25));stroke-linecap:round;stroke-linejoin:round;overflow:visible}html[data-ov-icons=solid]{--ovg-pref:99999px}html[data-ov-icons=line]{--ovg-pref:0px}.ovg>svg.has-s{stroke-width:min(var(--ovg-stroke,2) * 1px + max(0px, (18.4px - 1.15em) * .25), max(0px, (1.15em - var(--ovg-pref, var(--ovg-solid-below, 18.4px))) * 999))}.ovg>svg>.ovg-s{fill:currentColor;stroke:none;clip-path:inset(max(0px, (1.15em - var(--ovg-pref, var(--ovg-solid-below, 18.4px))) * 999))}.ovg>svg>.ovg-s .ln{fill:none;stroke:currentColor;stroke-width:2.6px}.ovg>svg>.ovg-s,.ovg>svg>.ovg-s *{stroke-dasharray:none!important;animation:none!important}.ovg.ovg-solid>svg.has-s{stroke-width:0}.ovg.ovg-solid>svg>.ovg-s{clip-path:none}.ovg.ovg-line>svg.has-s{stroke-width:calc(var(--ovg-stroke,2) * 1px + max(0px, (18.4px - 1.15em) * .25))}.ovg.ovg-line>svg>.ovg-s{clip-path:inset(50%)}.ovg.ovg-thin{--ovg-stroke:1}.ovg.ovg-light{--ovg-stroke:1.5}.ovg.ovg-regular{--ovg-stroke:2}.ovg.ovg-bold{--ovg-stroke:2.5}.ovg.ovg-duotone>svg>.ovg-s{clip-path:none;opacity:.2;fill:var(--ovg-duotone-color,currentColor)}.ovg.ovg-duotone>svg.has-s{stroke-width:var(--ovg-stroke,2)}:where([aria-current=page],[aria-current=true],[aria-pressed=true],[aria-selected=true],.is-here)>.ovg:not(.ovg-line)>svg.has-s{stroke-width:0}:where([aria-current=page],[aria-current=true],[aria-pressed=true],[aria-selected=true],.is-here)>.ovg:not(.ovg-line)>svg>.ovg-s{clip-path:none}.ovg.ovg-brand>svg{fill:currentColor;stroke:none}.ovg.ovg-brand.ovg-brand-color{color:var(--ovg-brand)}.ovg.fa-thin{--ovg-stroke:1}.ovg.fa-light{--ovg-stroke:1.5}.ovg.fa-solid{--ovg-solid-below:99999px}.ovg.fa-duotone{--ovg-duotone-color:var(--fa-secondary-color,currentColor)}.ovg.fa-duotone>svg{stroke:var(--fa-primary-color,currentColor)}.ovg.fa-2xs{font-size:.625em}.ovg.fa-xs{font-size:.75em}.ovg.fa-sm{font-size:.875em}.ovg.fa-lg{font-size:1.25em}.ovg.fa-xl{font-size:1.5em}.ovg.fa-2xl{font-size:2em}.ovg.fa-1x{font-size:1em}.ovg.fa-2x{font-size:2em}.ovg.fa-3x{font-size:3em}.ovg.fa-4x{font-size:4em}.ovg.fa-5x{font-size:5em}.ovg.fa-6x{font-size:6em}.ovg.fa-7x{font-size:7em}.ovg.fa-8x{font-size:8em}.ovg.fa-9x{font-size:9em}.ovg.fa-10x{font-size:10em}.ovg.fa-fw{width:1.25em;text-align:center}.ovg.fa-border{box-sizing:content-box;border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);padding:var(--fa-border-padding,.2em .25em .15em)}.ovg.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.ovg.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.ovg.fa-rotate-90>svg{transform:rotate(90deg)}.ovg.fa-rotate-180>svg{transform:rotate(180deg)}.ovg.fa-rotate-270>svg{transform:rotate(270deg)}.ovg.fa-rotate-by>svg{transform:rotate(var(--fa-rotate-angle,0))}.ovg.fa-flip-horizontal>svg{transform:scale(-1,1)}.ovg.fa-flip-vertical>svg{transform:scale(1,-1)}.ovg.fa-flip-both>svg{transform:scale(-1,-1)}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{position:absolute;left:calc(var(--fa-li-width,2em)*-1);width:var(--fa-li-width,2em);text-align:center;line-height:inherit}.fa-stack{display:inline-block;position:relative;width:2.5em;height:2em;line-height:2em;vertical-align:middle}.fa-stack>.ovg{position:absolute;inset:0;margin:auto;width:1em;height:1em}.fa-stack>.ovg.fa-stack-2x{font-size:2em}.ovg.fa-inverse{color:var(--fa-inverse,#fff)}.fa-layers{display:inline-block;position:relative;width:1em;height:1em;text-align:center;vertical-align:-.125em}.fa-layers>.ovg{position:absolute;inset:0;margin:auto;width:1em;height:1em}.fa-layers-text{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:inline-block}.fa-layers-counter{position:absolute;top:var(--fa-top,0);right:var(--fa-right,0);display:inline-block;box-sizing:border-box;min-width:var(--fa-counter-min-width,1.5em);max-width:var(--fa-counter-max-width,5em);padding:var(--fa-counter-padding,.25em .5em);border-radius:var(--fa-counter-border-radius,1em);background:var(--fa-counter-background-color,#ff253a);color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:scale(var(--fa-counter-scale,.25));transform-origin:top right}.ovg.fa-beat{animation:ovgBeat var(--fa-animation-duration,1s) var(--fa-animation-timing,ease-in-out) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-bounce{animation:ovgBounce var(--fa-animation-duration,1s) var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1)) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-fade{animation:ovgFade var(--fa-animation-duration,1s) var(--fa-animation-timing,cubic-bezier(.4,0,.6,1)) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-beat-fade{animation:ovgBeatFade var(--fa-animation-duration,1s) var(--fa-animation-timing,cubic-bezier(.4,0,.6,1)) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-flip{animation:ovgFlip var(--fa-animation-duration,1s) var(--fa-animation-timing,ease-in-out) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-shake{animation:ovgShake var(--fa-animation-duration,1s) var(--fa-animation-timing,linear) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-spin,.ovg.fa-pulse,.ovg.fa-spin-pulse{animation:ovgBreathe var(--fa-animation-duration,1.6s) ease-in-out var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite)!important}.ovg[data-ovg=busy].fa-spin,.ovg[data-ovg=busy].fa-pulse,.ovg[data-ovg=busy].fa-spin-pulse{animation:none!important}@keyframes ovgBeat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes ovgBounce{0%{transform:scale(1,1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%,100%{transform:scale(1,1) translateY(0)}}@keyframes ovgFade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes ovgBeatFade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes ovgFlip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes ovgShake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,100%{transform:rotate(0)}}@keyframes ovgBreathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.9)}}.ovg.ovg-draw>svg>*{stroke-dasharray:1;stroke-dashoffset:1;animation:ovgDraw var(--ovg-draw-duration,.6s) cubic-bezier(.4,0,.2,1) var(--ovg-draw-delay,0s) forwards}.ovg.ovg-draw>svg>*:nth-child(2){animation-delay:calc(var(--ovg-draw-delay,0s) + .12s)}.ovg.ovg-draw>svg>*:nth-child(n+3){animation-delay:calc(var(--ovg-draw-delay,0s) + .24s)}@keyframes ovgDraw{to{stroke-dashoffset:0}}.ovg.ovg-once{--fa-animation-iteration-count:1}.ovg[data-ovg=busy]>svg{fill:currentColor;stroke:none}.ovg[data-ovg=busy] circle{animation:ovgHop 1s ease-in-out infinite;transform-box:fill-box;transform-origin:center}.ovg[data-ovg=busy] circle:nth-child(2){animation-delay:.15s}.ovg[data-ovg=busy] circle:nth-child(3){animation-delay:.3s}@keyframes ovgHop{0%,60%,100%{transform:translateY(0);opacity:.55}30%{transform:translateY(-3px);opacity:1}}@media (prefers-reduced-motion:reduce){.ovg,.ovg[data-ovg=busy] circle,.ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}}html[data-ov-motion=reduced] .ovg,html[data-ov-motion=reduced] .ovg[data-ovg=busy] circle,html[data-ov-motion=reduced] .ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}";
++ const CSS = ".ovg::before,.ovg::after{content:none!important;display:none!important}.ovg{display:inline-block;width:1.15em;height:1.15em;line-height:1;vertical-align:-.18em;font-family:inherit!important;font-style:normal!important}.ovg>svg{display:block;width:100%;height:100%;fill:none;stroke:currentColor;stroke-width:calc(var(--ovg-stroke,2) * 1px + max(0px, (18.4px - 1.15em) * .25));stroke-linecap:round;stroke-linejoin:round;overflow:visible}html[data-ov-icons=solid]{--ovg-pref:99999px}html[data-ov-icons=line]{--ovg-pref:0px}.ovg>svg.has-s{stroke-width:min(var(--ovg-stroke,2) * 1px + max(0px, (18.4px - 1.15em) * .25), max(0px, (1.15em - var(--ovg-pref, var(--ovg-solid-below, 18.4px))) * 999))}.ovg>svg>.ovg-s{fill:currentColor;stroke:none;clip-path:inset(max(0px, (1.15em - var(--ovg-pref, var(--ovg-solid-below, 18.4px))) * 999))}.ovg>svg>.ovg-s .ln{fill:none;stroke:currentColor;stroke-width:2.6px}.ovg>svg>.ovg-s,.ovg>svg>.ovg-s *{stroke-dasharray:none!important;animation:none!important}.ovg.ovg-solid>svg.has-s{stroke-width:0}.ovg.ovg-solid>svg>.ovg-s{clip-path:none}.ovg.ovg-line>svg.has-s{stroke-width:calc(var(--ovg-stroke,2) * 1px + max(0px, (18.4px - 1.15em) * .25))}.ovg.ovg-line>svg>.ovg-s{clip-path:inset(50%)}.ovg.ovg-thin{--ovg-stroke:1}.ovg.ovg-light{--ovg-stroke:1.5}.ovg.ovg-regular{--ovg-stroke:2}.ovg.ovg-bold{--ovg-stroke:2.5}.ovg.ovg-duotone>svg>.ovg-s{clip-path:none;opacity:.2;fill:var(--ovg-duotone-color,currentColor)}.ovg.ovg-duotone>svg.has-s{stroke-width:var(--ovg-stroke,2)}:where([aria-current=page],[aria-current=true],[aria-pressed=true],[aria-selected=true],.is-here)>.ovg:not(.ovg-line)>svg.has-s{stroke-width:0}:where([aria-current=page],[aria-current=true],[aria-pressed=true],[aria-selected=true],.is-here)>.ovg:not(.ovg-line)>svg>.ovg-s{clip-path:none}.ovg.ovg-brand>svg{fill:currentColor;stroke:none}.ovg.ovg-brand.ovg-brand-color{color:var(--ovg-brand)}.ovg.fa-thin{--ovg-stroke:1}.ovg.fa-light{--ovg-stroke:1.5}.ovg.fa-solid{--ovg-solid-below:99999px}.ovg.fa-duotone{--ovg-duotone-color:var(--fa-secondary-color,currentColor)}.ovg.fa-duotone>svg{stroke:var(--fa-primary-color,currentColor)}.ovg.fa-2xs{font-size:.625em}.ovg.fa-xs{font-size:.75em}.ovg.fa-sm{font-size:.875em}.ovg.fa-lg{font-size:1.25em}.ovg.fa-xl{font-size:1.5em}.ovg.fa-2xl{font-size:2em}.ovg.fa-1x{font-size:1em}.ovg.fa-2x{font-size:2em}.ovg.fa-3x{font-size:3em}.ovg.fa-4x{font-size:4em}.ovg.fa-5x{font-size:5em}.ovg.fa-6x{font-size:6em}.ovg.fa-7x{font-size:7em}.ovg.fa-8x{font-size:8em}.ovg.fa-9x{font-size:9em}.ovg.fa-10x{font-size:10em}.ovg.fa-fw{width:1.25em;text-align:center}.ovg.fa-border{box-sizing:content-box;border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);padding:var(--fa-border-padding,.2em .25em .15em)}.ovg.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.ovg.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.ovg.fa-rotate-90>svg{transform:rotate(90deg)}.ovg.fa-rotate-180>svg{transform:rotate(180deg)}.ovg.fa-rotate-270>svg{transform:rotate(270deg)}.ovg.fa-rotate-by>svg{transform:rotate(var(--fa-rotate-angle,0))}.ovg.fa-flip-horizontal>svg{transform:scale(-1,1)}.ovg.fa-flip-vertical>svg{transform:scale(1,-1)}.ovg.fa-flip-both>svg{transform:scale(-1,-1)}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{position:absolute;left:calc(var(--fa-li-width,2em)*-1);width:var(--fa-li-width,2em);text-align:center;line-height:inherit}.fa-stack{display:inline-block;position:relative;width:2.5em;height:2em;line-height:2em;vertical-align:middle}.fa-stack>.ovg{position:absolute;inset:0;margin:auto;width:1em;height:1em}.fa-stack>.ovg.fa-stack-2x{font-size:2em}.ovg.fa-inverse{color:var(--fa-inverse,#fff)}.fa-layers{display:inline-block;position:relative;width:1em;height:1em;text-align:center;vertical-align:-.125em}.fa-layers>.ovg{position:absolute;inset:0;margin:auto;width:1em;height:1em}.fa-layers-text{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:inline-block}.fa-layers-counter{position:absolute;top:var(--fa-top,0);right:var(--fa-right,0);display:inline-block;box-sizing:border-box;min-width:var(--fa-counter-min-width,1.5em);max-width:var(--fa-counter-max-width,5em);padding:var(--fa-counter-padding,.25em .5em);border-radius:var(--fa-counter-border-radius,1em);background:var(--fa-counter-background-color,#ff253a);color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transform:scale(var(--fa-counter-scale,.25));transform-origin:top right}.ovg.fa-beat{animation:ovgBeat var(--fa-animation-duration,1s) var(--fa-animation-timing,ease-in-out) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-bounce{animation:ovgBounce var(--fa-animation-duration,1s) var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1)) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-fade{animation:ovgFade var(--fa-animation-duration,1s) var(--fa-animation-timing,cubic-bezier(.4,0,.6,1)) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-beat-fade{animation:ovgBeatFade var(--fa-animation-duration,1s) var(--fa-animation-timing,cubic-bezier(.4,0,.6,1)) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-flip{animation:ovgFlip var(--fa-animation-duration,1s) var(--fa-animation-timing,ease-in-out) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-shake{animation:ovgShake var(--fa-animation-duration,1s) var(--fa-animation-timing,linear) var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite) var(--fa-animation-direction,normal)}.ovg.fa-spin,.ovg.fa-pulse,.ovg.fa-spin-pulse{animation:ovgBreathe var(--fa-animation-duration,1.6s) ease-in-out var(--fa-animation-delay,0s) var(--fa-animation-iteration-count,infinite)!important}.ovg[data-ovg=busy].fa-spin,.ovg[data-ovg=busy].fa-pulse,.ovg[data-ovg=busy].fa-spin-pulse{animation:none!important}@keyframes ovgBeat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes ovgBounce{0%{transform:scale(1,1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%,100%{transform:scale(1,1) translateY(0)}}@keyframes ovgFade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes ovgBeatFade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes ovgFlip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes ovgShake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,100%{transform:rotate(0)}}@keyframes ovgBreathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.9)}}.ovg.ovg-draw>svg>*{stroke-dasharray:1;stroke-dashoffset:1;animation:ovgDraw var(--ovg-draw-duration,.6s) cubic-bezier(.4,0,.2,1) var(--ovg-draw-delay,0s) forwards}.ovg.ovg-draw>svg>*:nth-child(2){animation-delay:calc(var(--ovg-draw-delay,0s) + .12s)}.ovg.ovg-draw>svg>*:nth-child(n+3){animation-delay:calc(var(--ovg-draw-delay,0s) + .24s)}@keyframes ovgDraw{to{stroke-dashoffset:0}}.ovg.ovg-once{--fa-animation-iteration-count:1}.ovg[data-ovg=busy]>svg{fill:currentColor;stroke:none}.ovg[data-ovg=busy] circle{animation:ovgHop 1s ease-in-out infinite;transform-box:fill-box;transform-origin:center}.ovg[data-ovg=busy] circle:nth-child(2){animation-delay:.15s}.ovg[data-ovg=busy] circle:nth-child(3){animation-delay:.3s}@keyframes ovgHop{0%,60%,100%{transform:translateY(0);opacity:.55}30%{transform:translateY(-3px);opacity:1}}html[data-ov-motion=off] .ovg,html[data-ov-motion=off] .ovg[data-ovg=busy] circle,html[data-ov-motion=off] .ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}";
const nameOf = (el) => { for (const c of el.classList) if (c.startsWith('fa-') && !MOD.test(c)) return c.slice(3); return null; };
const fromFa = (fa) => { const n = String(fa || '').replace(/^fa-/, ''); return Object.prototype.hasOwnProperty.call(FA, n) ? FA[n] : null; };
// data-fa-transform, in Font Awesome's units (a sixteenth of the icon).
ddiff --git a/ov-glyphs.svg b/ov-glyphs.svg
iindex c216f4f..40f0250 100644
---- a/ov-glyphs.svg
++++ b/ov-glyphs.svg
@@@ -5,6 +5,8 @@
<symbol id="ovg-airplane-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3c1 0 1.5 1 1.5 2.5V10l7.5 4.5V16l-7.5-2.5V18l2 1.5V21L12 20l-3.5 1v-1.5l2-1.5v-4.5L3 16v-1.5L10.5 10V5.5C10.5 4 11 3 12 3Z"/></symbol>
<symbol id="ovg-airplane-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3c1 0 1.5 1 1.5 2.5V10l7.5 4.5V16l-7.5-2.5V18l2 1.5V21L12 20l-3.5 1v-1.5l2-1.5v-4.5L3 16v-1.5L10.5 10V5.5C10.5 4 11 3 12 3Z"/></symbol>
<symbol id="ovg-airplane-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3c1 0 1.5 1 1.5 2.5V10l7.5 4.5V16l-7.5-2.5V18l2 1.5V21L12 20l-3.5 1v-1.5l2-1.5v-4.5L3 16v-1.5L10.5 10V5.5C10.5 4 11 3 12 3Z"/></symbol>
++<symbol id="ovg-airplane-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.5c1.3 0 2 1.2 2 3V9.7l7.5 4.5v2.5L14 14.2v3.5l2 1.5v2.5L12 20.5l-4 1.2v-2.5l2-1.5v-3.5l-7.5 2.5v-2.5L10 9.7V5.5c0-1.8.7-3 2-3Z"/></symbol>
++<symbol id="ovg-airplane-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M12 2.5c1.3 0 2 1.2 2 3V9.7l7.5 4.5v2.5L14 14.2v3.5l2 1.5v2.5L12 20.5l-4 1.2v-2.5l2-1.5v-3.5l-7.5 2.5v-2.5L10 9.7V5.5c0-1.8.7-3 2-3Z"/></g><path d="M12 3c1 0 1.5 1 1.5 2.5V10l7.5 4.5V16l-7.5-2.5V18l2 1.5V21L12 20l-3.5 1v-1.5l2-1.5v-4.5L3 16v-1.5L10.5 10V5.5C10.5 4 11 3 12 3Z"/></symbol>
<symbol id="ovg-alert" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 4 2.8 19.5h18.4Z"/><path d="M12 10v4M12 17h.01"/></symbol>
<symbol id="ovg-alert-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 4 2.8 19.5h18.4Z"/><path d="M12 10v4M12 17h.01"/></symbol>
<symbol id="ovg-alert-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 4 2.8 19.5h18.4Z"/><path d="M12 10v4M12 17h.01"/></symbol>
@@@ -123,6 +125,8 @@
<symbol id="ovg-briefcase-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7M3 12.5h7.5M13.5 12.5H21M10.5 11.5h3v2.5h-3Z"/></symbol>
<symbol id="ovg-briefcase-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7M3 12.5h7.5M13.5 12.5H21M10.5 11.5h3v2.5h-3Z"/></symbol>
<symbol id="ovg-briefcase-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7M3 12.5h7.5M13.5 12.5H21M10.5 11.5h3v2.5h-3Z"/></symbol>
++<symbol id="ovg-briefcase-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.4 9a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.9H2.4ZM2.4 13.1h7.4v1.5h4.4v-1.5h7.4V18a2.6 2.6 0 0 1-2.6 2.6H5a2.6 2.6 0 0 1-2.6-2.6Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M9 6.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v.9"/></symbol>
++<symbol id="ovg-briefcase-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.4 9a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.9H2.4ZM2.4 13.1h7.4v1.5h4.4v-1.5h7.4V18a2.6 2.6 0 0 1-2.6 2.6H5a2.6 2.6 0 0 1-2.6-2.6Z"/><path class="ln" d="M9 6.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v.9"/></g><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7M3 12.5h7.5M13.5 12.5H21M10.5 11.5h3v2.5h-3Z"/></symbol>
<symbol id="ovg-bug" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="7.5" y="7" width="9" height="12.5" rx="4.5"/><path d="M9.5 7.3a2.5 2.5 0 0 1 5 0M12 11.5v8M7.5 12.5H4M20 12.5h-3.5M7.9 9 5 6.5M16.1 9 19 6.5M7.9 16.5 5 19M16.1 16.5 19 19"/></symbol>
<symbol id="ovg-bug-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="7.5" y="7" width="9" height="12.5" rx="4.5"/><path d="M9.5 7.3a2.5 2.5 0 0 1 5 0M12 11.5v8M7.5 12.5H4M20 12.5h-3.5M7.9 9 5 6.5M16.1 9 19 6.5M7.9 16.5 5 19M16.1 16.5 19 19"/></symbol>
<symbol id="ovg-bug-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="7.5" y="7" width="9" height="12.5" rx="4.5"/><path d="M9.5 7.3a2.5 2.5 0 0 1 5 0M12 11.5v8M7.5 12.5H4M20 12.5h-3.5M7.9 9 5 6.5M16.1 9 19 6.5M7.9 16.5 5 19M16.1 16.5 19 19"/></symbol>
@@@ -135,6 +139,8 @@
<symbol id="ovg-burst-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2.5L13.99 7.2L18.72 5.28L16.8 10.01L21.5 12L16.8 13.99L18.72 18.72L13.99 16.8L12 21.5L10.01 16.8L5.28 18.72L7.2 13.99L2.5 12L7.2 10.01L5.28 5.28L10.01 7.2Z"/></symbol>
<symbol id="ovg-burst-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2.5L13.99 7.2L18.72 5.28L16.8 10.01L21.5 12L16.8 13.99L18.72 18.72L13.99 16.8L12 21.5L10.01 16.8L5.28 18.72L7.2 13.99L2.5 12L7.2 10.01L5.28 5.28L10.01 7.2Z"/></symbol>
<symbol id="ovg-burst-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2.5L13.99 7.2L18.72 5.28L16.8 10.01L21.5 12L16.8 13.99L18.72 18.72L13.99 16.8L12 21.5L10.01 16.8L5.28 18.72L7.2 13.99L2.5 12L7.2 10.01L5.28 5.28L10.01 7.2Z"/></symbol>
++<symbol id="ovg-burst-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1.9l2.2 4.9 5-2-2 5 4.9 2.2-4.9 2.2 2 5-5-2-2.2 4.9-2.2-4.9-5 2 2-5L1.9 12l4.9-2.2-2-5 5 2Z"/></symbol>
++<symbol id="ovg-burst-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M12 1.9l2.2 4.9 5-2-2 5 4.9 2.2-4.9 2.2 2 5-5-2-2.2 4.9-2.2-4.9-5 2 2-5L1.9 12l4.9-2.2-2-5 5 2Z"/></g><path d="M12 2.5L13.99 7.2L18.72 5.28L16.8 10.01L21.5 12L16.8 13.99L18.72 18.72L13.99 16.8L12 21.5L10.01 16.8L5.28 18.72L7.2 13.99L2.5 12L7.2 10.01L5.28 5.28L10.01 7.2Z"/></symbol>
<symbol id="ovg-busy" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 12h.01M12 12h.01M18 12h.01" stroke-width="3.4"/></symbol>
<symbol id="ovg-busy-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M6 12h.01M12 12h.01M18 12h.01" stroke-width="3.4"/></symbol>
<symbol id="ovg-busy-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 12h.01M12 12h.01M18 12h.01" stroke-width="3.4"/></symbol>
@@@ -159,21 +165,29 @@
<symbol id="ovg-camera-flip-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><path d="M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2"/></symbol>
<symbol id="ovg-camera-flip-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><path d="M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2"/></symbol>
<symbol id="ovg-camera-flip-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><path d="M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2"/></symbol>
++<symbol id="ovg-camera-flip-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M3 8.3a1.8 1.8 0 0 1 1.8-1.8h2.5L9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v10.1a1.8 1.8 0 0 1-1.8 1.8H4.8A1.8 1.8 0 0 1 3 18.4ZM7.96 12.03A4.3 4.3 0 0 1 16.04 12.03L13.79 12.85A1.9 1.9 0 0 0 10.21 12.85ZM16.04 14.97A4.3 4.3 0 0 1 7.96 14.97L10.21 14.15A1.9 1.9 0 0 0 13.79 14.15Z"/></symbol>
++<symbol id="ovg-camera-flip-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M3 8.3a1.8 1.8 0 0 1 1.8-1.8h2.5L9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v10.1a1.8 1.8 0 0 1-1.8 1.8H4.8A1.8 1.8 0 0 1 3 18.4ZM7.96 12.03A4.3 4.3 0 0 1 16.04 12.03L13.79 12.85A1.9 1.9 0 0 0 10.21 12.85ZM16.04 14.97A4.3 4.3 0 0 1 7.96 14.97L10.21 14.15A1.9 1.9 0 0 0 13.79 14.15Z"/></g><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><path d="M15 12.6a3.1 3.1 0 0 0-5.6-1.2M9 14.4a3.1 3.1 0 0 0 5.6 1.2M9.3 9.5v2h2M14.7 17.5v-2h-2"/></symbol>
<symbol id="ovg-camera-off" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><circle cx="12" cy="13.3" r="3.4"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-camera-off-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><circle cx="12" cy="13.3" r="3.4"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-camera-off-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><circle cx="12" cy="13.3" r="3.4"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-camera-off-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><circle cx="12" cy="13.3" r="3.4"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-camera-off-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><circle cx="12" cy="13.3" r="3.4"/><path d="M3.5 3.5l17 17"/></symbol>
++<symbol id="ovg-camera-off-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M8.5 4.8 9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v9ZM3.8 7.5 16.5 20.2H4.8A1.8 1.8 0 0 1 3 18.4V8.3Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="m4 4 16 16"/></symbol>
++<symbol id="ovg-camera-off-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M8.5 4.8 9 4h6l1.7 2.5h2.5A1.8 1.8 0 0 1 21 8.3v9ZM3.8 7.5 16.5 20.2H4.8A1.8 1.8 0 0 1 3 18.4V8.3Z"/><path class="ln" d="m4 4 16 16"/></g><path d="M3.5 8h3.4l1.8-2.8h6.6L17.1 8h3.4v11.5h-17Z"/><circle cx="12" cy="13.3" r="3.4"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-car" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z"/><path d="M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0"/></symbol>
<symbol id="ovg-car-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z"/><path d="M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0"/></symbol>
<symbol id="ovg-car-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z"/><path d="M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0"/></symbol>
<symbol id="ovg-car-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z"/><path d="M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0"/></symbol>
<symbol id="ovg-car-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z"/><path d="M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0"/></symbol>
++<symbol id="ovg-car-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M5.8 5.4h12.4l2.6 5.4H3.2ZM2.9 12.2h18.2v4.4H2.9ZM6.1 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM15.7 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM5.2 17.4h2.6v1.8H5.2ZM16.2 17.4h2.6v1.8h-2.6Z"/></symbol>
++<symbol id="ovg-car-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M5.8 5.4h12.4l2.6 5.4H3.2ZM2.9 12.2h18.2v4.4H2.9ZM6.1 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM15.7 14.4a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0ZM5.2 17.4h2.6v1.8H5.2ZM16.2 17.4h2.6v1.8h-2.6Z"/></g><path d="M3.5 16v-4.5L6.2 6h11.6l2.7 5.5V16Z"/><path d="M3.5 11.5h17M6.5 16v2.5M17.5 16v2.5M7.2 14h0M16.8 14h0"/></symbol>
<symbol id="ovg-card" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="5" width="19" height="14" rx="2"/><path d="M2.5 10h19M6 15h4"/></symbol>
<symbol id="ovg-card-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="5" width="19" height="14" rx="2"/><path d="M2.5 10h19M6 15h4"/></symbol>
<symbol id="ovg-card-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="5" width="19" height="14" rx="2"/><path d="M2.5 10h19M6 15h4"/></symbol>
<symbol id="ovg-card-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="5" width="19" height="14" rx="2"/><path d="M2.5 10h19M6 15h4"/></symbol>
<symbol id="ovg-card-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="5" width="19" height="14" rx="2"/><path d="M2.5 10h19M6 15h4"/></symbol>
++<symbol id="ovg-card-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M1.9 7a2.6 2.6 0 0 1 2.6-2.6h15a2.6 2.6 0 0 1 2.6 2.6v10a2.6 2.6 0 0 1-2.6 2.6h-15a2.6 2.6 0 0 1-2.6-2.6ZM1.9 9.2v1.8h20.2V9.2ZM5.4 14.3v1.6h5.2v-1.6Z"/></symbol>
++<symbol id="ovg-card-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M1.9 7a2.6 2.6 0 0 1 2.6-2.6h15a2.6 2.6 0 0 1 2.6 2.6v10a2.6 2.6 0 0 1-2.6 2.6h-15a2.6 2.6 0 0 1-2.6-2.6ZM1.9 9.2v1.8h20.2V9.2ZM5.4 14.3v1.6h5.2v-1.6Z"/></g><rect x="2.5" y="5" width="19" height="14" rx="2"/><path d="M2.5 10h19M6 15h4"/></symbol>
<symbol id="ovg-care" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 16.5h3l4 3h5.5a2 2 0 0 0 0 -4H13M8 16.5l2.2 -2h3.3"/><path d="M16.5 11s-3.2 -2 -3.2 -4.4a1.9 1.9 0 0 1 3.2 -1.3 1.9 1.9 0 0 1 3.2 1.3c0 2.4 -3.2 4.4 -3.2 4.4Z"/></symbol>
<symbol id="ovg-care-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M4 16.5h3l4 3h5.5a2 2 0 0 0 0 -4H13M8 16.5l2.2 -2h3.3"/><path d="M16.5 11s-3.2 -2 -3.2 -4.4a1.9 1.9 0 0 1 3.2 -1.3 1.9 1.9 0 0 1 3.2 1.3c0 2.4 -3.2 4.4 -3.2 4.4Z"/></symbol>
<symbol id="ovg-care-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 16.5h3l4 3h5.5a2 2 0 0 0 0 -4H13M8 16.5l2.2 -2h3.3"/><path d="M16.5 11s-3.2 -2 -3.2 -4.4a1.9 1.9 0 0 1 3.2 -1.3 1.9 1.9 0 0 1 3.2 1.3c0 2.4 -3.2 4.4 -3.2 4.4Z"/></symbol>
@@@ -193,6 +207,8 @@
<symbol id="ovg-cc-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2.5"/><path d="M10.6 10.1a2.4 2.4 0 1 0 0 3.8M17.1 10.1a2.4 2.4 0 1 0 0 3.8"/></symbol>
<symbol id="ovg-cc-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2.5"/><path d="M10.6 10.1a2.4 2.4 0 1 0 0 3.8M17.1 10.1a2.4 2.4 0 1 0 0 3.8"/></symbol>
<symbol id="ovg-cc-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2.5"/><path d="M10.6 10.1a2.4 2.4 0 1 0 0 3.8M17.1 10.1a2.4 2.4 0 1 0 0 3.8"/></symbol>
++<symbol id="ovg-cc-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M5.5 4.4h13a3.1 3.1 0 0 1 3.1 3.1v9a3.1 3.1 0 0 1-3.1 3.1h-13a3.1 3.1 0 0 1-3.1-3.1v-9a3.1 3.1 0 0 1 3.1-3.1ZM10.82 9.47A3.3 3.3 0 1 0 10.82 14.53L9.54 13A1.3 1.3 0 1 1 9.54 11ZM17.62 9.47A3.3 3.3 0 1 0 17.62 14.53L16.34 13A1.3 1.3 0 1 1 16.34 11Z"/></symbol>
++<symbol id="ovg-cc-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M5.5 4.4h13a3.1 3.1 0 0 1 3.1 3.1v9a3.1 3.1 0 0 1-3.1 3.1h-13a3.1 3.1 0 0 1-3.1-3.1v-9a3.1 3.1 0 0 1 3.1-3.1ZM10.82 9.47A3.3 3.3 0 1 0 10.82 14.53L9.54 13A1.3 1.3 0 1 1 9.54 11ZM17.62 9.47A3.3 3.3 0 1 0 17.62 14.53L16.34 13A1.3 1.3 0 1 1 16.34 11Z"/></g><rect x="3" y="5" width="18" height="14" rx="2.5"/><path d="M10.6 10.1a2.4 2.4 0 1 0 0 3.8M17.1 10.1a2.4 2.4 0 1 0 0 3.8"/></symbol>
<symbol id="ovg-chart" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4v16h16"/><path d="m7.5 14.5 3.5-4 3 2.5 5-6"/></symbol>
<symbol id="ovg-chart-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4v16h16"/><path d="m7.5 14.5 3.5-4 3 2.5 5-6"/></symbol>
<symbol id="ovg-chart-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 4v16h16"/><path d="m7.5 14.5 3.5-4 3 2.5 5-6"/></symbol>
@@@ -212,6 +228,8 @@
<symbol id="ovg-chat-off-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 5h16v11H8l-4 4Z"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-chat-off-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 5h16v11H8l-4 4Z"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-chat-off-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 5h16v11H8l-4 4Z"/><path d="M3.5 3.5l17 17"/></symbol>
++<symbol id="ovg-chat-off-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M8.1 4.4H19a1.6 1.6 0 0 1 1.6 1.6v9.5a1.6 1.6 0 0 1-.4 1ZM3.4 7.1 12.9 16.6H8.3l-4.9 4.6Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="m4 4 16 16"/></symbol>
++<symbol id="ovg-chat-off-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M8.1 4.4H19a1.6 1.6 0 0 1 1.6 1.6v9.5a1.6 1.6 0 0 1-.4 1ZM3.4 7.1 12.9 16.6H8.3l-4.9 4.6Z"/><path class="ln" d="m4 4 16 16"/></g><path d="M4 5h16v11H8l-4 4Z"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 12.5 4.5 4.5L19 7.5"/></symbol>
<symbol id="ovg-check-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="m5 12.5 4.5 4.5L19 7.5"/></symbol>
<symbol id="ovg-check-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m5 12.5 4.5 4.5L19 7.5"/></symbol>
@@@ -249,6 +267,8 @@
<symbol id="ovg-child-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5.5" r="2.2"/><path d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/></symbol>
<symbol id="ovg-child-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5.5" r="2.2"/><path d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/></symbol>
<symbol id="ovg-child-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5.5" r="2.2"/><path d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/></symbol>
++<symbol id="ovg-child-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5.5" r="2.7"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/></symbol>
++<symbol id="ovg-child-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="12" cy="5.5" r="2.7"/><path class="ln" d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/></g><circle cx="12" cy="5.5" r="2.2"/><path d="M7.5 10.5 12 9l4.5 1.5M12 9v6M9 21l3-6 3 6"/></symbol>
<symbol id="ovg-chip" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="7" width="10" height="10" rx="1.5"/><path d="M10 3v4M14 3v4M10 17v4M14 17v4M3 10h4M3 14h4M17 10h4M17 14h4"/></symbol>
<symbol id="ovg-chip-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="7" width="10" height="10" rx="1.5"/><path d="M10 3v4M14 3v4M10 17v4M14 17v4M3 10h4M3 14h4M17 10h4M17 14h4"/></symbol>
<symbol id="ovg-chip-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="7" width="10" height="10" rx="1.5"/><path d="M10 3v4M14 3v4M10 17v4M14 17v4M3 10h4M3 14h4M17 10h4M17 14h4"/></symbol>
@@@ -275,6 +295,8 @@
<symbol id="ovg-clapper-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 10h17v9a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1Z"/><path d="M3.5 10 2.9 6.6l16.4-3 .7 3.6ZM8 5.7l2.3 3.3M13.3 4.7l2.3 3.3"/></symbol>
<symbol id="ovg-clapper-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 10h17v9a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1Z"/><path d="M3.5 10 2.9 6.6l16.4-3 .7 3.6ZM8 5.7l2.3 3.3M13.3 4.7l2.3 3.3"/></symbol>
<symbol id="ovg-clapper-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 10h17v9a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1Z"/><path d="M3.5 10 2.9 6.6l16.4-3 .7 3.6ZM8 5.7l2.3 3.3M13.3 4.7l2.3 3.3"/></symbol>
++<symbol id="ovg-clapper-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M2.4 6.1 19.7 2.9l.9 4.3L3 8.9ZM6.8 5.3 9 8.3l2.6-.2L9.4 4.8ZM12.4 4.2l2.2 3.6 2.6-.3L15 3.8Z"/><path d="M2.9 10.1h18.2v9a1.6 1.6 0 0 1-1.6 1.6h-15a1.6 1.6 0 0 1-1.6-1.6Z"/></symbol>
++<symbol id="ovg-clapper-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M2.4 6.1 19.7 2.9l.9 4.3L3 8.9ZM6.8 5.3 9 8.3l2.6-.2L9.4 4.8ZM12.4 4.2l2.2 3.6 2.6-.3L15 3.8Z"/><path d="M2.9 10.1h18.2v9a1.6 1.6 0 0 1-1.6 1.6h-15a1.6 1.6 0 0 1-1.6-1.6Z"/></g><path d="M3.5 10h17v9a1 1 0 0 1-1 1h-15a1 1 0 0 1-1-1Z"/><path d="M3.5 10 2.9 6.6l16.4-3 .7 3.6ZM8 5.7l2.3 3.3M13.3 4.7l2.3 3.3"/></symbol>
<symbol id="ovg-clipboard" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 11h6M9 15h4"/></symbol>
<symbol id="ovg-clipboard-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 11h6M9 15h4"/></symbol>
<symbol id="ovg-clipboard-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 11h6M9 15h4"/></symbol>
@@@ -287,6 +309,8 @@
<symbol id="ovg-clipboard-check-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 13.5l2 2 4-4"/></symbol>
<symbol id="ovg-clipboard-check-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 13.5l2 2 4-4"/></symbol>
<symbol id="ovg-clipboard-check-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 13.5l2 2 4-4"/></symbol>
++<symbol id="ovg-clipboard-check-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M7.4 4.4h9.2a2.1 2.1 0 0 1 2.1 2.1v13.4a2.1 2.1 0 0 1-2.1 2.1H7.4a2.1 2.1 0 0 1-2.1-2.1V6.5a2.1 2.1 0 0 1 2.1-2.1ZM7.9 13.5 11 16.6l5.1-5.1-1.6-1.6-3.5 3.5-1.5-1.5Z"/><rect x="8.6" y="2.6" width="6.8" height="3.8" rx="1.2"/></symbol>
++<symbol id="ovg-clipboard-check-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M7.4 4.4h9.2a2.1 2.1 0 0 1 2.1 2.1v13.4a2.1 2.1 0 0 1-2.1 2.1H7.4a2.1 2.1 0 0 1-2.1-2.1V6.5a2.1 2.1 0 0 1 2.1-2.1ZM7.9 13.5 11 16.6l5.1-5.1-1.6-1.6-3.5 3.5-1.5-1.5Z"/><rect x="8.6" y="2.6" width="6.8" height="3.8" rx="1.2"/></g><rect x="5.5" y="5" width="13" height="16" rx="2"/><path d="M9 5V3.5h6V5M9 13.5l2 2 4-4"/></symbol>
<symbol id="ovg-clock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/></symbol>
<symbol id="ovg-clock-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/></symbol>
<symbol id="ovg-clock-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 7.5V12l3 2"/></symbol>
@@@ -311,6 +335,8 @@
<symbol id="ovg-cloud-off-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18Z"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-cloud-off-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18Z"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-cloud-off-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18Z"/><path d="M3.5 3.5l17 17"/></symbol>
++<symbol id="ovg-cloud-off-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M9.34 5.66A6.4 6.4 0 0 1 17.6 10a4.4 4.4 0 0 1 3 6.92ZM5.64 9.32 15.12 18.8H7A4.7 4.7 0 0 1 5.4 9.4Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="m4 4 16 16"/></symbol>
++<symbol id="ovg-cloud-off-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M9.34 5.66A6.4 6.4 0 0 1 17.6 10a4.4 4.4 0 0 1 3 6.92ZM5.64 9.32 15.12 18.8H7A4.7 4.7 0 0 1 5.4 9.4Z"/><path class="ln" d="m4 4 16 16"/></g><path d="M7 18h10a4 4 0 0 0 .5-8A6 6 0 0 0 6 9.5 4.3 4.3 0 0 0 7 18Z"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-code" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14"/></symbol>
<symbol id="ovg-code-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14"/></symbol>
<symbol id="ovg-code-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 5l-4 14"/></symbol>
@@@ -328,6 +354,8 @@
<symbol id="ovg-columns-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 4.5v15M3.5 9h17"/></symbol>
<symbol id="ovg-columns-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 4.5v15M3.5 9h17"/></symbol>
<symbol id="ovg-columns-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 4.5v15M3.5 9h17"/></symbol>
++<symbol id="ovg-columns-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h8.1v10.1H5.5a2.6 2.6 0 0 1-2.6-2.6ZM13 10h8.1v7.5a2.6 2.6 0 0 1-2.6 2.6H13Z"/></symbol>
++<symbol id="ovg-columns-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h8.1v10.1H5.5a2.6 2.6 0 0 1-2.6-2.6ZM13 10h8.1v7.5a2.6 2.6 0 0 1-2.6 2.6H13Z"/></g><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 4.5v15M3.5 9h17"/></symbol>
<symbol id="ovg-commit" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3.6"/><path d="M3 12h5.4M15.6 12H21"/></symbol>
<symbol id="ovg-commit-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3.6"/><path d="M3 12h5.4M15.6 12H21"/></symbol>
<symbol id="ovg-commit-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3.6"/><path d="M3 12h5.4M15.6 12H21"/></symbol>
@@@ -338,6 +366,8 @@
<symbol id="ovg-compass-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z"/></symbol>
<symbol id="ovg-compass-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z"/></symbol>
<symbol id="ovg-compass-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z"/></symbol>
++<symbol id="ovg-compass-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.4 7.6 13.9 13.9 7.6 16.4 10.1 10.1Z"/></symbol>
++<symbol id="ovg-compass-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM16.4 7.6 13.9 13.9 7.6 16.4 10.1 10.1Z"/></g><circle cx="12" cy="12" r="8.5"/><path d="m15.6 8.4-2.1 5.1-5.1 2.1 2.1-5.1Z"/></symbol>
<symbol id="ovg-compress" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5"/></symbol>
<symbol id="ovg-compress-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5"/></symbol>
<symbol id="ovg-compress-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5"/></symbol>
@@@ -357,11 +387,15 @@
<symbol id="ovg-contrast-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/></symbol>
<symbol id="ovg-contrast-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/></symbol>
<symbol id="ovg-contrast-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/></symbol>
++<symbol id="ovg-contrast-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 2.2a7.4 7.4 0 0 1 0 14.8Z"/></symbol>
++<symbol id="ovg-contrast-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 2.2a7.4 7.4 0 0 1 0 14.8Z"/></g><circle cx="12" cy="12" r="9"/><path d="M12 3v18M12 7.5h7M12 12h9M12 16.5h7"/></symbol>
<symbol id="ovg-cookie" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z"/><path d="M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01"/></symbol>
<symbol id="ovg-cookie-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z"/><path d="M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01"/></symbol>
<symbol id="ovg-cookie-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z"/><path d="M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01"/></symbol>
<symbol id="ovg-cookie-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z"/><path d="M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01"/></symbol>
<symbol id="ovg-cookie-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z"/><path d="M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01"/></symbol>
++<symbol id="ovg-cookie-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4ZM7.3 9.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM10.8 14a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM6.8 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM14.3 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z"/></symbol>
++<symbol id="ovg-cookie-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4ZM7.3 9.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM10.8 14a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM6.8 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0ZM14.3 15.5a1.2 1.2 0 1 0 2.4 0a1.2 1.2 0 1 0-2.4 0Z"/></g><path d="M20.5 12.5a8.5 8.5 0 1 1-9-9 3 3 0 0 0 4 3.6 3 3 0 0 0 5 5.4Z"/><path d="M8.5 9.5h.01M12 14h.01M8 15.5h.01M15.5 15.5h.01"/></symbol>
<symbol id="ovg-copy" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="8" width="12" height="12" rx="2"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/></symbol>
<symbol id="ovg-copy-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="8" width="12" height="12" rx="2"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/></symbol>
<symbol id="ovg-copy-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="8" width="12" height="12" rx="2"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/></symbol>
@@@ -374,6 +408,8 @@
<symbol id="ovg-couch-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 10V7a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v1.5h10V12a2 2 0 0 1 4 0v5H3ZM5 17v2M19 17v2"/></symbol>
<symbol id="ovg-couch-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 10V7a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v1.5h10V12a2 2 0 0 1 4 0v5H3ZM5 17v2M19 17v2"/></symbol>
<symbol id="ovg-couch-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 10V7a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v1.5h10V12a2 2 0 0 1 4 0v5H3ZM5 17v2M19 17v2"/></symbol>
++<symbol id="ovg-couch-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M7 4.4h10A2.6 2.6 0 0 1 19.6 7v2a3.2 3.2 0 0 0-3.2 3.2v.1H7.6v-.1A3.2 3.2 0 0 0 4.4 9V7A2.6 2.6 0 0 1 7 4.4ZM2.4 12a2.6 2.6 0 0 1 5.2 0v1.9h8.8V12a2.6 2.6 0 0 1 5.2 0v5.6H2.4Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M5 17.6v1.9M19 17.6v1.9"/></symbol>
++<symbol id="ovg-couch-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M7 4.4h10A2.6 2.6 0 0 1 19.6 7v2a3.2 3.2 0 0 0-3.2 3.2v.1H7.6v-.1A3.2 3.2 0 0 0 4.4 9V7A2.6 2.6 0 0 1 7 4.4ZM2.4 12a2.6 2.6 0 0 1 5.2 0v1.9h8.8V12a2.6 2.6 0 0 1 5.2 0v5.6H2.4Z"/><path class="ln" d="M5 17.6v1.9M19 17.6v1.9"/></g><path d="M5 10V7a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v3"/><path d="M3 12a2 2 0 0 1 4 0v1.5h10V12a2 2 0 0 1 4 0v5H3ZM5 17v2M19 17v2"/></symbol>
<symbol id="ovg-crown" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8.5 7.5 12.5 12 5.5l4.5 7 4.5-4L19 19H5Z"/></symbol>
<symbol id="ovg-crown-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8.5 7.5 12.5 12 5.5l4.5 7 4.5-4L19 19H5Z"/></symbol>
<symbol id="ovg-crown-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8.5 7.5 12.5 12 5.5l4.5 7 4.5-4L19 19H5Z"/></symbol>
@@@ -386,6 +422,8 @@
<symbol id="ovg-cubes-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.5 8 5.5v4.5l4 2 4-2V5.5ZM7.5 12 3.5 14v4.5l4 2 4-2V14ZM16.5 12l-4 2v4.5l4 2 4-2V14Z"/></symbol>
<symbol id="ovg-cubes-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.5 8 5.5v4.5l4 2 4-2V5.5ZM7.5 12 3.5 14v4.5l4 2 4-2V14ZM16.5 12l-4 2v4.5l4 2 4-2V14Z"/></symbol>
<symbol id="ovg-cubes-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.5 8 5.5v4.5l4 2 4-2V5.5ZM7.5 12 3.5 14v4.5l4 2 4-2V14ZM16.5 12l-4 2v4.5l4 2 4-2V14Z"/></symbol>
++<symbol id="ovg-cubes-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M12 3.3 8.4 5.1v4.2l3.6 1.8 3.6-1.8V5.1ZM7.5 11.8 3.9 13.6v4.2l3.6 1.8 3.6-1.8v-4.2ZM16.5 11.8l-3.6 1.8v4.2l3.6 1.8 3.6-1.8v-4.2Z"/></symbol>
++<symbol id="ovg-cubes-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M12 3.3 8.4 5.1v4.2l3.6 1.8 3.6-1.8V5.1ZM7.5 11.8 3.9 13.6v4.2l3.6 1.8 3.6-1.8v-4.2ZM16.5 11.8l-3.6 1.8v4.2l3.6 1.8 3.6-1.8v-4.2Z"/></g><path d="M12 3.5 8 5.5v4.5l4 2 4-2V5.5ZM7.5 12 3.5 14v4.5l4 2 4-2V14ZM16.5 12l-4 2v4.5l4 2 4-2V14Z"/></symbol>
<symbol id="ovg-database" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v12c0 1.7 3.1 3 7 3s7-1.3 7-3V6M5 12c0 1.7 3.1 3 7 3s7-1.3 7-3"/></symbol>
<symbol id="ovg-database-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v12c0 1.7 3.1 3 7 3s7-1.3 7-3V6M5 12c0 1.7 3.1 3 7 3s7-1.3 7-3"/></symbol>
<symbol id="ovg-database-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="6" rx="7" ry="3"/><path d="M5 6v12c0 1.7 3.1 3 7 3s7-1.3 7-3V6M5 12c0 1.7 3.1 3 7 3s7-1.3 7-3"/></symbol>
@@@ -398,6 +436,8 @@
<symbol id="ovg-dice-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="3.5" width="17" height="17" rx="3"/><path d="M8.5 8.5h.01M15.5 8.5h.01M12 12h.01M8.5 15.5h.01M15.5 15.5h.01" stroke-width="2.6"/></symbol>
<symbol id="ovg-dice-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="3.5" width="17" height="17" rx="3"/><path d="M8.5 8.5h.01M15.5 8.5h.01M12 12h.01M8.5 15.5h.01M15.5 15.5h.01" stroke-width="2.6"/></symbol>
<symbol id="ovg-dice-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="3.5" width="17" height="17" rx="3"/><path d="M8.5 8.5h.01M15.5 8.5h.01M12 12h.01M8.5 15.5h.01M15.5 15.5h.01" stroke-width="2.6"/></symbol>
++<symbol id="ovg-dice-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M6.4 2.9h11.2a3.5 3.5 0 0 1 3.5 3.5v11.2a3.5 3.5 0 0 1-3.5 3.5H6.4a3.5 3.5 0 0 1-3.5-3.5V6.4a3.5 3.5 0 0 1 3.5-3.5ZM6.4 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM10.1 12a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM6.4 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0Z"/></symbol>
++<symbol id="ovg-dice-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M6.4 2.9h11.2a3.5 3.5 0 0 1 3.5 3.5v11.2a3.5 3.5 0 0 1-3.5 3.5H6.4a3.5 3.5 0 0 1-3.5-3.5V6.4a3.5 3.5 0 0 1 3.5-3.5ZM6.4 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 8.3a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM10.1 12a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM6.4 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0ZM13.8 15.7a1.9 1.9 0 1 0 3.8 0a1.9 1.9 0 1 0-3.8 0Z"/></g><rect x="3.5" y="3.5" width="17" height="17" rx="3"/><path d="M8.5 8.5h.01M15.5 8.5h.01M12 12h.01M8.5 15.5h.01M15.5 15.5h.01" stroke-width="2.6"/></symbol>
<symbol id="ovg-dish" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 9.5A9.5 9.5 0 0 0 14.5 19Z"/><path d="m9.5 14.5 4.5-4.5M14.5 4.5a5 5 0 0 1 5 5M14.5 8a1.5 1.5 0 0 1 1.5 1.5"/></symbol>
<symbol id="ovg-dish-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M5 9.5A9.5 9.5 0 0 0 14.5 19Z"/><path d="m9.5 14.5 4.5-4.5M14.5 4.5a5 5 0 0 1 5 5M14.5 8a1.5 1.5 0 0 1 1.5 1.5"/></symbol>
<symbol id="ovg-dish-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 9.5A9.5 9.5 0 0 0 14.5 19Z"/><path d="m9.5 14.5 4.5-4.5M14.5 4.5a5 5 0 0 1 5 5M14.5 8a1.5 1.5 0 0 1 1.5 1.5"/></symbol>
@@@ -415,11 +455,15 @@
<symbol id="ovg-donate-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8.5" r="5"/><path d="M12 6.4v4.2M4 15.5h16V20H4ZM8.5 17.75h7"/></symbol>
<symbol id="ovg-donate-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8.5" r="5"/><path d="M12 6.4v4.2M4 15.5h16V20H4ZM8.5 17.75h7"/></symbol>
<symbol id="ovg-donate-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8.5" r="5"/><path d="M12 6.4v4.2M4 15.5h16V20H4ZM8.5 17.75h7"/></symbol>
++<symbol id="ovg-donate-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.9a5.6 5.6 0 1 0 0 11.2 5.6 5.6 0 0 0 0-11.2Zm-.8 3.2h1.6v4.8h-1.6ZM3.4 14.9h17.2v5.7H3.4ZM8 17v1.5h8V17Z"/></symbol>
++<symbol id="ovg-donate-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.9a5.6 5.6 0 1 0 0 11.2 5.6 5.6 0 0 0 0-11.2Zm-.8 3.2h1.6v4.8h-1.6ZM3.4 14.9h17.2v5.7H3.4ZM8 17v1.5h8V17Z"/></g><circle cx="12" cy="8.5" r="5"/><path d="M12 6.4v4.2M4 15.5h16V20H4ZM8.5 17.75h7"/></symbol>
<symbol id="ovg-door" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01"/></symbol>
<symbol id="ovg-door-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01"/></symbol>
<symbol id="ovg-door-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01"/></symbol>
<symbol id="ovg-door-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01"/></symbol>
<symbol id="ovg-door-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01"/></symbol>
++<symbol id="ovg-door-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M14.6 4.1 5.4 2.4v19.2l9.2-1.7ZM9.9 12a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M15.9 5h1.6a1 1 0 0 1 1 1v15M15.9 21H21M3 21h2.4"/></symbol>
++<symbol id="ovg-door-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M14.6 4.1 5.4 2.4v19.2l9.2-1.7ZM9.9 12a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path class="ln" d="M15.9 5h1.6a1 1 0 0 1 1 1v15M15.9 21H21M3 21h2.4"/></g><path d="M14 4.5 6 3v18l8-1.5ZM14 5h3.5a1 1 0 0 1 1 1v15M3 21h18M11 12h.01"/></symbol>
<symbol id="ovg-down" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6.6 9.9 6.6 6.6 6.6 -6.6"/></symbol>
<symbol id="ovg-down-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="m6.6 9.9 6.6 6.6 6.6 -6.6"/></symbol>
<symbol id="ovg-down-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m6.6 9.9 6.6 6.6 6.6 -6.6"/></symbol>
@@@ -461,6 +505,8 @@
<symbol id="ovg-eraser-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m14 4.5 5.5 5.5-9 9H6.3l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z"/><path d="M9 9.5l5.5 5.5M10.5 19H20"/></symbol>
<symbol id="ovg-eraser-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m14 4.5 5.5 5.5-9 9H6.3l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z"/><path d="M9 9.5l5.5 5.5M10.5 19H20"/></symbol>
<symbol id="ovg-eraser-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m14 4.5 5.5 5.5-9 9H6.3l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z"/><path d="M9 9.5l5.5 5.5M10.5 19H20"/></symbol>
++<symbol id="ovg-eraser-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M14 3.9l6.1 6.1-5.2 5.2-6.1-6.1ZM7.4 10l6.2 6.2-3.2 3.2H6.1l-2.9-2.9a1.6 1.6 0 0 1 0-2.3Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M13 19.4h7"/></symbol>
++<symbol id="ovg-eraser-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M14 3.9l6.1 6.1-5.2 5.2-6.1-6.1ZM7.4 10l6.2 6.2-3.2 3.2H6.1l-2.9-2.9a1.6 1.6 0 0 1 0-2.3Z"/><path class="ln" d="M13 19.4h7"/></g><path d="m14 4.5 5.5 5.5-9 9H6.3l-2.6-2.6a1.5 1.5 0 0 1 0-2.1Z"/><path d="M9 9.5l5.5 5.5M10.5 19H20"/></symbol>
<symbol id="ovg-expand" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5"/></symbol>
<symbol id="ovg-expand-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5"/></symbol>
<symbol id="ovg-expand-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5"/></symbol>
@@@ -487,6 +533,8 @@
<symbol id="ovg-fast-forward-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 6.5v11L11 12ZM12.5 6.5v11L20 12Z"/></symbol>
<symbol id="ovg-fast-forward-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 6.5v11L11 12ZM12.5 6.5v11L20 12Z"/></symbol>
<symbol id="ovg-fast-forward-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 6.5v11L11 12ZM12.5 6.5v11L20 12Z"/></symbol>
++<symbol id="ovg-fast-forward-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M3 5.7v12.6L11.7 12ZM12.3 5.7v12.6L21 12Z"/></symbol>
++<symbol id="ovg-fast-forward-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M3 5.7v12.6L11.7 12ZM12.3 5.7v12.6L21 12Z"/></g><path d="M3.5 6.5v11L11 12ZM12.5 6.5v11L20 12Z"/></symbol>
<symbol id="ovg-file" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h8l4 4v14H6Z"/><path d="M14 3v4h4"/></symbol>
<symbol id="ovg-file-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h8l4 4v14H6Z"/><path d="M14 3v4h4"/></symbol>
<symbol id="ovg-file-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 3h8l4 4v14H6Z"/><path d="M14 3v4h4"/></symbol>
@@@ -499,6 +547,8 @@
<symbol id="ovg-file-code-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"/><path d="M14 3v5h5M10 12.5 8 14.5l2 2M14 12.5l2 2-2 2"/></symbol>
<symbol id="ovg-file-code-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"/><path d="M14 3v5h5M10 12.5 8 14.5l2 2M14 12.5l2 2-2 2"/></symbol>
<symbol id="ovg-file-code-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"/><path d="M14 3v5h5M10 12.5 8 14.5l2 2M14 12.5l2 2-2 2"/></symbol>
++<symbol id="ovg-file-code-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M6 2.6h7.6v5.2h5V21.4H6ZM10 11.2l1.5 1.4-1.6 1.7 1.6 1.7-1.5 1.4-2.9-3.1ZM14.6 11.2l-1.5 1.4 1.6 1.7-1.6 1.7 1.5 1.4 2.9-3.1Z"/><path d="M15.2 2.9l3.1 3.3h-3.1Z"/></symbol>
++<symbol id="ovg-file-code-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M6 2.6h7.6v5.2h5V21.4H6ZM10 11.2l1.5 1.4-1.6 1.7 1.6 1.7-1.5 1.4-2.9-3.1ZM14.6 11.2l-1.5 1.4 1.6 1.7-1.6 1.7 1.5 1.4 2.9-3.1Z"/><path d="M15.2 2.9l3.1 3.3h-3.1Z"/></g><path d="M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8Z"/><path d="M14 3v5h5M10 12.5 8 14.5l2 2M14 12.5l2 2-2 2"/></symbol>
<symbol id="ovg-film" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M7.5 4v16M16.5 4v16M3 9h4.5M3 15h4.5M16.5 9H21M16.5 15H21"/></symbol>
<symbol id="ovg-film-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M7.5 4v16M16.5 4v16M3 9h4.5M3 15h4.5M16.5 9H21M16.5 15H21"/></symbol>
<symbol id="ovg-film-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M7.5 4v16M16.5 4v16M3 9h4.5M3 15h4.5M16.5 9H21M16.5 15H21"/></symbol>
@@@ -516,6 +566,8 @@
<symbol id="ovg-finish-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 21V3.5"/><rect x="5" y="4" width="14.5" height="9" rx="1"/><path d="M5 8.5h14.5M9.8 4v9M14.6 4v9"/></symbol>
<symbol id="ovg-finish-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 21V3.5"/><rect x="5" y="4" width="14.5" height="9" rx="1"/><path d="M5 8.5h14.5M9.8 4v9M14.6 4v9"/></symbol>
<symbol id="ovg-finish-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 21V3.5"/><rect x="5" y="4" width="14.5" height="9" rx="1"/><path d="M5 8.5h14.5M9.8 4v9M14.6 4v9"/></symbol>
++<symbol id="ovg-finish-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M5.6 3.6h4.2v4.9H5.6ZM14.6 3.6h4.3a1 1 0 0 1 1 1v3.9h-5.3ZM9.8 8.5h4.8v4.9H9.8Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M5 21V3.5"/></symbol>
++<symbol id="ovg-finish-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M5.6 3.6h4.2v4.9H5.6ZM14.6 3.6h4.3a1 1 0 0 1 1 1v3.9h-5.3ZM9.8 8.5h4.8v4.9H9.8Z"/><path class="ln" d="M5 21V3.5"/></g><path d="M5 21V3.5"/><rect x="5" y="4" width="14.5" height="9" rx="1"/><path d="M5 8.5h14.5M9.8 4v9M14.6 4v9"/></symbol>
<symbol id="ovg-fire" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19.5a6 6 0 0 0 6 -6c0 -3.8 -2.6 -6 -3.7 -9 -1.8 2 -2.3 4 -2.3 4S10.8 6.5 9.8 4.7C7.6 7.2 6 10.1 6 13.5a6 6 0 0 0 6 6Z"/></symbol>
<symbol id="ovg-fire-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19.5a6 6 0 0 0 6 -6c0 -3.8 -2.6 -6 -3.7 -9 -1.8 2 -2.3 4 -2.3 4S10.8 6.5 9.8 4.7C7.6 7.2 6 10.1 6 13.5a6 6 0 0 0 6 6Z"/></symbol>
<symbol id="ovg-fire-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19.5a6 6 0 0 0 6 -6c0 -3.8 -2.6 -6 -3.7 -9 -1.8 2 -2.3 4 -2.3 4S10.8 6.5 9.8 4.7C7.6 7.2 6 10.1 6 13.5a6 6 0 0 0 6 6Z"/></symbol>
@@@ -528,6 +580,8 @@
<symbol id="ovg-fish-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12c2-3.2 4.5-4.8 7.5-4.8 2.6 0 4.5 2 5.5 4.8-1 2.8-2.9 4.8-5.5 4.8-3 0-5.5-1.6-7.5-4.8Z"/><path d="M8 12 3.5 8.5v7Z"/><path d="M16.8 10.6h.01"/></symbol>
<symbol id="ovg-fish-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12c2-3.2 4.5-4.8 7.5-4.8 2.6 0 4.5 2 5.5 4.8-1 2.8-2.9 4.8-5.5 4.8-3 0-5.5-1.6-7.5-4.8Z"/><path d="M8 12 3.5 8.5v7Z"/><path d="M16.8 10.6h.01"/></symbol>
<symbol id="ovg-fish-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 12c2-3.2 4.5-4.8 7.5-4.8 2.6 0 4.5 2 5.5 4.8-1 2.8-2.9 4.8-5.5 4.8-3 0-5.5-1.6-7.5-4.8Z"/><path d="M8 12 3.5 8.5v7Z"/><path d="M16.8 10.6h.01"/></symbol>
++<symbol id="ovg-fish-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path d="M8.4 12 2.9 7.4v9.2Z"/></symbol>
++<symbol id="ovg-fish-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M7.6 12c2.1-3.6 4.8-5.4 7.9-5.4 2.9 0 5 2.2 6.1 5.4-1.1 3.2-3.2 5.4-6.1 5.4-3.1 0-5.8-1.8-7.9-5.4ZM15.7 10.6a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/><path d="M8.4 12 2.9 7.4v9.2Z"/></g><path d="M8 12c2-3.2 4.5-4.8 7.5-4.8 2.6 0 4.5 2 5.5 4.8-1 2.8-2.9 4.8-5.5 4.8-3 0-5.5-1.6-7.5-4.8Z"/><path d="M8 12 3.5 8.5v7Z"/><path d="M16.8 10.6h.01"/></symbol>
<symbol id="ovg-fist" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 10V6.5a1.5 1.5 0 0 1 3 0V9M9.5 8.5v-3a1.5 1.5 0 0 1 3 0v3M12.5 8.5v-2a1.5 1.5 0 0 1 3 0V9M15.5 9V8a1.5 1.5 0 0 1 3 0v5a7 7 0 0 1 -7 7H11a5.5 5.5 0 0 1 -5.5 -5.5V12A2 2 0 0 1 7.5 11h2a1.5 1.5 0 0 1 0 3H8"/></symbol>
<symbol id="ovg-fist-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 10V6.5a1.5 1.5 0 0 1 3 0V9M9.5 8.5v-3a1.5 1.5 0 0 1 3 0v3M12.5 8.5v-2a1.5 1.5 0 0 1 3 0V9M15.5 9V8a1.5 1.5 0 0 1 3 0v5a7 7 0 0 1 -7 7H11a5.5 5.5 0 0 1 -5.5 -5.5V12A2 2 0 0 1 7.5 11h2a1.5 1.5 0 0 1 0 3H8"/></symbol>
<symbol id="ovg-fist-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6.5 10V6.5a1.5 1.5 0 0 1 3 0V9M9.5 8.5v-3a1.5 1.5 0 0 1 3 0v3M12.5 8.5v-2a1.5 1.5 0 0 1 3 0V9M15.5 9V8a1.5 1.5 0 0 1 3 0v5a7 7 0 0 1 -7 7H11a5.5 5.5 0 0 1 -5.5 -5.5V12A2 2 0 0 1 7.5 11h2a1.5 1.5 0 0 1 0 3H8"/></symbol>
@@@ -545,6 +599,8 @@
<symbol id="ovg-flame-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21c3.6 0 6-2.4 6-5.7 0-4.2-4.4-7.7-6-12.3-1.6 4.6-6 8.1-6 12.3C6 18.6 8.4 21 12 21Z"/><path d="M12 17.5c1.4 0 2.4-1 2.4-2.3 0-1.4-1.2-2.6-2.4-4.2-1.2 1.6-2.4 2.8-2.4 4.2 0 1.3 1 2.3 2.4 2.3Z"/></symbol>
<symbol id="ovg-flame-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21c3.6 0 6-2.4 6-5.7 0-4.2-4.4-7.7-6-12.3-1.6 4.6-6 8.1-6 12.3C6 18.6 8.4 21 12 21Z"/><path d="M12 17.5c1.4 0 2.4-1 2.4-2.3 0-1.4-1.2-2.6-2.4-4.2-1.2 1.6-2.4 2.8-2.4 4.2 0 1.3 1 2.3 2.4 2.3Z"/></symbol>
<symbol id="ovg-flame-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21c3.6 0 6-2.4 6-5.7 0-4.2-4.4-7.7-6-12.3-1.6 4.6-6 8.1-6 12.3C6 18.6 8.4 21 12 21Z"/><path d="M12 17.5c1.4 0 2.4-1 2.4-2.3 0-1.4-1.2-2.6-2.4-4.2-1.2 1.6-2.4 2.8-2.4 4.2 0 1.3 1 2.3 2.4 2.3Z"/></symbol>
++<symbol id="ovg-flame-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 21.6c3.9 0 6.6-2.7 6.6-6.3 0-4.4-4.5-7.9-6.1-12.9h-1C9.9 7.4 5.4 10.9 5.4 15.3c0 3.6 2.7 6.3 6.6 6.3Zm0-3.4c1.2 0 2-.8 2-1.9 0-1.2-1-2.2-2-3.6-1 1.4-2 2.4-2 3.6 0 1.1.8 1.9 2 1.9Z"/></symbol>
++<symbol id="ovg-flame-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 21.6c3.9 0 6.6-2.7 6.6-6.3 0-4.4-4.5-7.9-6.1-12.9h-1C9.9 7.4 5.4 10.9 5.4 15.3c0 3.6 2.7 6.3 6.6 6.3Zm0-3.4c1.2 0 2-.8 2-1.9 0-1.2-1-2.2-2-3.6-1 1.4-2 2.4-2 3.6 0 1.1.8 1.9 2 1.9Z"/></g><path d="M12 21c3.6 0 6-2.4 6-5.7 0-4.2-4.4-7.7-6-12.3-1.6 4.6-6 8.1-6 12.3C6 18.6 8.4 21 12 21Z"/><path d="M12 17.5c1.4 0 2.4-1 2.4-2.3 0-1.4-1.2-2.6-2.4-4.2-1.2 1.6-2.4 2.8-2.4 4.2 0 1.3 1 2.3 2.4 2.3Z"/></symbol>
<symbol id="ovg-flask" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 3.5h5M10 3.5V9.5L4.8 18.2a1.5 1.5 0 0 0 1.3 2.3h11.8a1.5 1.5 0 0 0 1.3-2.3L14 9.5V3.5"/><path d="M7.2 15h9.6"/></symbol>
<symbol id="ovg-flask-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 3.5h5M10 3.5V9.5L4.8 18.2a1.5 1.5 0 0 0 1.3 2.3h11.8a1.5 1.5 0 0 0 1.3-2.3L14 9.5V3.5"/><path d="M7.2 15h9.6"/></symbol>
<symbol id="ovg-flask-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 3.5h5M10 3.5V9.5L4.8 18.2a1.5 1.5 0 0 0 1.3 2.3h11.8a1.5 1.5 0 0 0 1.3-2.3L14 9.5V3.5"/><path d="M7.2 15h9.6"/></symbol>
@@@ -567,6 +623,8 @@
<symbol id="ovg-folder-tree-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 3.5v13a1 1 0 0 0 1 1H10M4.5 8.5H10"/><path d="M10.5 5.5h3l1 1.5h5.5V11h-9.5ZM10.5 14.5h3l1 1.5h5.5V20h-9.5Z"/></symbol>
<symbol id="ovg-folder-tree-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 3.5v13a1 1 0 0 0 1 1H10M4.5 8.5H10"/><path d="M10.5 5.5h3l1 1.5h5.5V11h-9.5ZM10.5 14.5h3l1 1.5h5.5V20h-9.5Z"/></symbol>
<symbol id="ovg-folder-tree-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 3.5v13a1 1 0 0 0 1 1H10M4.5 8.5H10"/><path d="M10.5 5.5h3l1 1.5h5.5V11h-9.5ZM10.5 14.5h3l1 1.5h5.5V20h-9.5Z"/></symbol>
++<symbol id="ovg-folder-tree-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M9.9 4.9h3.9l1 1.5h6.3v5.2H9.9ZM9.9 13.9h3.9l1 1.5h6.3v5.2H9.9Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M4.5 3.5v13a1 1 0 0 0 1 1H9.9M4.5 8.5H9.9"/></symbol>
++<symbol id="ovg-folder-tree-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M9.9 4.9h3.9l1 1.5h6.3v5.2H9.9ZM9.9 13.9h3.9l1 1.5h6.3v5.2H9.9Z"/><path class="ln" d="M4.5 3.5v13a1 1 0 0 0 1 1H9.9M4.5 8.5H9.9"/></g><path d="M4.5 3.5v13a1 1 0 0 0 1 1H10M4.5 8.5H10"/><path d="M10.5 5.5h3l1 1.5h5.5V11h-9.5ZM10.5 14.5h3l1 1.5h5.5V20h-9.5Z"/></symbol>
<symbol id="ovg-food" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v7M6 3v4.5a2 2 0 0 0 4 0V3M8 10v11M18 21V3c-2 1.2 -3.2 3.6 -3.2 7v3H18"/></symbol>
<symbol id="ovg-food-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v7M6 3v4.5a2 2 0 0 0 4 0V3M8 10v11M18 21V3c-2 1.2 -3.2 3.6 -3.2 7v3H18"/></symbol>
<symbol id="ovg-food-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3v7M6 3v4.5a2 2 0 0 0 4 0V3M8 10v11M18 21V3c-2 1.2 -3.2 3.6 -3.2 7v3H18"/></symbol>
@@@ -640,6 +698,8 @@
<symbol id="ovg-grid-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
<symbol id="ovg-grid-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
<symbol id="ovg-grid-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
++<symbol id="ovg-grid-solid" viewBox="0 0 24 24" fill="currentColor"><rect x="3.4" y="3.4" width="7.4" height="7.4" rx="2"/><rect x="13.2" y="3.4" width="7.4" height="7.4" rx="2"/><rect x="3.4" y="13.2" width="7.4" height="7.4" rx="2"/><rect x="13.2" y="13.2" width="7.4" height="7.4" rx="2"/></symbol>
++<symbol id="ovg-grid-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><rect x="3.4" y="3.4" width="7.4" height="7.4" rx="2"/><rect x="13.2" y="3.4" width="7.4" height="7.4" rx="2"/><rect x="3.4" y="13.2" width="7.4" height="7.4" rx="2"/><rect x="13.2" y="13.2" width="7.4" height="7.4" rx="2"/></g><rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><rect x="13" y="13" width="7" height="7" rx="1.5"/></symbol>
<symbol id="ovg-grip" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01" stroke-width="3"/></symbol>
<symbol id="ovg-grip-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01" stroke-width="3"/></symbol>
<symbol id="ovg-grip-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6h.01M15 6h.01M9 12h.01M15 12h.01M9 18h.01M15 18h.01" stroke-width="3"/></symbol>
@@@ -657,6 +717,8 @@
<symbol id="ovg-hammer-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3.5 19.5 10l-2.8 2.8 -6.5 -6.5Z"/><path d="M13.5 9.5 4.5 18.5a1.4 1.4 0 0 0 2 2l9 -9"/></symbol>
<symbol id="ovg-hammer-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3.5 19.5 10l-2.8 2.8 -6.5 -6.5Z"/><path d="M13.5 9.5 4.5 18.5a1.4 1.4 0 0 0 2 2l9 -9"/></symbol>
<symbol id="ovg-hammer-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3.5 19.5 10l-2.8 2.8 -6.5 -6.5Z"/><path d="M13.5 9.5 4.5 18.5a1.4 1.4 0 0 0 2 2l9 -9"/></symbol>
++<symbol id="ovg-hammer-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M13 2.7l7.3 7.3-3.6 3.6-7.3-7.3ZM12.9 8.9 3.9 17.9a2 2 0 0 0 2.8 2.8l9-9Z"/></symbol>
++<symbol id="ovg-hammer-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M13 2.7l7.3 7.3-3.6 3.6-7.3-7.3ZM12.9 8.9 3.9 17.9a2 2 0 0 0 2.8 2.8l9-9Z"/></g><path d="M13 3.5 19.5 10l-2.8 2.8 -6.5 -6.5Z"/><path d="M13.5 9.5 4.5 18.5a1.4 1.4 0 0 0 2 2l9 -9"/></symbol>
<symbol id="ovg-hand" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13V5.5a1.5 1.5 0 0 1 3 0V11M13 10V4.5a1.5 1.5 0 0 1 3 0V11M16 10.5V6a1.5 1.5 0 0 1 3 0v7c0 4 -2.5 7 -6.5 7 -2.6 0 -4.2 -1.3 -5.7 -3.6L5 13.6a1.5 1.5 0 0 1 2.4 -1.8L10 15"/></symbol>
<symbol id="ovg-hand-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13V5.5a1.5 1.5 0 0 1 3 0V11M13 10V4.5a1.5 1.5 0 0 1 3 0V11M16 10.5V6a1.5 1.5 0 0 1 3 0v7c0 4 -2.5 7 -6.5 7 -2.6 0 -4.2 -1.3 -5.7 -3.6L5 13.6a1.5 1.5 0 0 1 2.4 -1.8L10 15"/></symbol>
<symbol id="ovg-hand-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13V5.5a1.5 1.5 0 0 1 3 0V11M13 10V4.5a1.5 1.5 0 0 1 3 0V11M16 10.5V6a1.5 1.5 0 0 1 3 0v7c0 4 -2.5 7 -6.5 7 -2.6 0 -4.2 -1.3 -5.7 -3.6L5 13.6a1.5 1.5 0 0 1 2.4 -1.8L10 15"/></symbol>
@@@ -698,6 +760,8 @@
<symbol id="ovg-heart-broken-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19.5s-7 -4.4 -7 -10a4 4 0 0 1 7 -2.6A4 4 0 0 1 19 10c0 5.6 -7 10 -7 10Z"/><path d="M12 6.9 10.4 10.5l3 2 -1.4 3.4"/></symbol>
<symbol id="ovg-heart-broken-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19.5s-7 -4.4 -7 -10a4 4 0 0 1 7 -2.6A4 4 0 0 1 19 10c0 5.6 -7 10 -7 10Z"/><path d="M12 6.9 10.4 10.5l3 2 -1.4 3.4"/></symbol>
<symbol id="ovg-heart-broken-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19.5s-7 -4.4 -7 -10a4 4 0 0 1 7 -2.6A4 4 0 0 1 19 10c0 5.6 -7 10 -7 10Z"/><path d="M12 6.9 10.4 10.5l3 2 -1.4 3.4"/></symbol>
++<symbol id="ovg-heart-broken-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 20.1s-7.6-4.6-7.6-10.6a4.3 4.3 0 0 1 7.6-2.9 4.3 4.3 0 0 1 7.6 2.9c0 6-7.6 10.6-7.6 10.6ZM11.1 7.4l2.2.5-1.1 2.2 2.9 2-2.1 4.8-2-.9 1.2-3-3-2Z"/></symbol>
++<symbol id="ovg-heart-broken-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 20.1s-7.6-4.6-7.6-10.6a4.3 4.3 0 0 1 7.6-2.9 4.3 4.3 0 0 1 7.6 2.9c0 6-7.6 10.6-7.6 10.6ZM11.1 7.4l2.2.5-1.1 2.2 2.9 2-2.1 4.8-2-.9 1.2-3-3-2Z"/></g><path d="M12 19.5s-7 -4.4 -7 -10a4 4 0 0 1 7 -2.6A4 4 0 0 1 19 10c0 5.6 -7 10 -7 10Z"/><path d="M12 6.9 10.4 10.5l3 2 -1.4 3.4"/></symbol>
<symbol id="ovg-heart-pulse" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19.8 12.5c-1.9 4-7.8 7.5-7.8 7.5s-5.9-3.5-7.8-7.5M3.4 9.5A4.8 4.8 0 0 1 12 7a4.8 4.8 0 0 1 8.6 2.5"/><path d="M2.5 12h4.5l1.5-2.5 2.5 5 2-3.5h8.5"/></symbol>
<symbol id="ovg-heart-pulse-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M19.8 12.5c-1.9 4-7.8 7.5-7.8 7.5s-5.9-3.5-7.8-7.5M3.4 9.5A4.8 4.8 0 0 1 12 7a4.8 4.8 0 0 1 8.6 2.5"/><path d="M2.5 12h4.5l1.5-2.5 2.5 5 2-3.5h8.5"/></symbol>
<symbol id="ovg-heart-pulse-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M19.8 12.5c-1.9 4-7.8 7.5-7.8 7.5s-5.9-3.5-7.8-7.5M3.4 9.5A4.8 4.8 0 0 1 12 7a4.8 4.8 0 0 1 8.6 2.5"/><path d="M2.5 12h4.5l1.5-2.5 2.5 5 2-3.5h8.5"/></symbol>
@@@ -762,6 +826,8 @@
<symbol id="ovg-inbox-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5"/></symbol>
<symbol id="ovg-inbox-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5"/></symbol>
<symbol id="ovg-inbox-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5"/></symbol>
++<symbol id="ovg-inbox-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M2.4 13.4 5 4.4h14l2.6 9V19a1.6 1.6 0 0 1-1.6 1.6H4A1.6 1.6 0 0 1 2.4 19ZM6.2 6.4 4.4 12.5h3.9l1.5 2.5h4.4l1.5-2.5h3.9L17.8 6.4Z"/></symbol>
++<symbol id="ovg-inbox-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M2.4 13.4 5 4.4h14l2.6 9V19a1.6 1.6 0 0 1-1.6 1.6H4A1.6 1.6 0 0 1 2.4 19ZM6.2 6.4 4.4 12.5h3.9l1.5 2.5h4.4l1.5-2.5h3.9L17.8 6.4Z"/></g><path d="M3 13.5 5.5 5h13l2.5 8.5V19a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1ZM3 13.5h5l1.5 2.5h5l1.5-2.5h5"/></symbol>
<symbol id="ovg-infinity" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 12c-2-2.7-3.7-4-5.5-4a4 4 0 0 0 0 8c1.8 0 3.5-1.3 5.5-4Zm0 0c2 2.7 3.7 4 5.5 4a4 4 0 0 0 0-8c-1.8 0-3.5 1.3-5.5 4Z"/></symbol>
<symbol id="ovg-infinity-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 12c-2-2.7-3.7-4-5.5-4a4 4 0 0 0 0 8c1.8 0 3.5-1.3 5.5-4Zm0 0c2 2.7 3.7 4 5.5 4a4 4 0 0 0 0-8c-1.8 0-3.5 1.3-5.5 4Z"/></symbol>
<symbol id="ovg-infinity-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 12c-2-2.7-3.7-4-5.5-4a4 4 0 0 0 0 8c1.8 0 3.5-1.3 5.5-4Zm0 0c2 2.7 3.7 4 5.5 4a4 4 0 0 0 0-8c-1.8 0-3.5 1.3-5.5 4Z"/></symbol>
@@@ -805,6 +871,8 @@
<symbol id="ovg-laugh-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2"/></symbol>
<symbol id="ovg-laugh-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2"/></symbol>
<symbol id="ovg-laugh-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2"/></symbol>
++<symbol id="ovg-laugh-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 8.1l3.4 1.7-3.4 1.7-.67-1.34.72-.36-.72-.36ZM17 8.1l-3.4 1.7 3.4 1.7.67-1.34-.72-.36.72-.36ZM7.6 13.4h8.8a4.4 4.4 0 0 1-8.8 0Z"/></symbol>
++<symbol id="ovg-laugh-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 8.1l3.4 1.7-3.4 1.7-.67-1.34.72-.36-.72-.36ZM17 8.1l-3.4 1.7 3.4 1.7.67-1.34-.72-.36.72-.36ZM7.6 13.4h8.8a4.4 4.4 0 0 1-8.8 0Z"/></g><circle cx="12" cy="12" r="8.5"/><path d="M8 13.5h8a4 4 0 0 1-8 0ZM7.5 8.6l2.2 1.2-2.2 1.2M16.5 8.6l-2.2 1.2 2.2 1.2"/></symbol>
<symbol id="ovg-layers" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 4.5 9 5 -9 5 -9 -5Z"/><path d="m3 14 9 5 9 -5"/></symbol>
<symbol id="ovg-layers-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="m12 4.5 9 5 -9 5 -9 -5Z"/><path d="m3 14 9 5 9 -5"/></symbol>
<symbol id="ovg-layers-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m12 4.5 9 5 -9 5 -9 -5Z"/><path d="m3 14 9 5 9 -5"/></symbol>
@@@ -829,6 +897,8 @@
<symbol id="ovg-lifebuoy-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="4"/><path d="m5.6 5.6 3.6 3.6M14.8 14.8l3.6 3.6M18.4 5.6l-3.6 3.6M9.2 14.8l-3.6 3.6"/></symbol>
<symbol id="ovg-lifebuoy-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="4"/><path d="m5.6 5.6 3.6 3.6M14.8 14.8l3.6 3.6M18.4 5.6l-3.6 3.6M9.2 14.8l-3.6 3.6"/></symbol>
<symbol id="ovg-lifebuoy-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="4"/><path d="m5.6 5.6 3.6 3.6M14.8 14.8l3.6 3.6M18.4 5.6l-3.6 3.6M9.2 14.8l-3.6 3.6"/></symbol>
++<symbol id="ovg-lifebuoy-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 5.4a4.2 4.2 0 1 1 0 8.4 4.2 4.2 0 0 1 0-8.4ZM14.33 16.17 17.44 19.28 19.28 17.44 16.17 14.33ZM9.67 16.17 6.56 19.28 4.72 17.44 7.83 14.33ZM14.33 7.83 17.44 4.72 19.28 6.56 16.17 9.67ZM9.67 7.83 6.56 4.72 4.72 6.56 7.83 9.67Z"/></symbol>
++<symbol id="ovg-lifebuoy-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.4a9.6 9.6 0 1 0 0 19.2 9.6 9.6 0 0 0 0-19.2Zm0 5.4a4.2 4.2 0 1 1 0 8.4 4.2 4.2 0 0 1 0-8.4ZM14.33 16.17 17.44 19.28 19.28 17.44 16.17 14.33ZM9.67 16.17 6.56 19.28 4.72 17.44 7.83 14.33ZM14.33 7.83 17.44 4.72 19.28 6.56 16.17 9.67ZM9.67 7.83 6.56 4.72 4.72 6.56 7.83 9.67Z"/></g><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="4"/><path d="m5.6 5.6 3.6 3.6M14.8 14.8l3.6 3.6M18.4 5.6l-3.6 3.6M9.2 14.8l-3.6 3.6"/></symbol>
<symbol id="ovg-link" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/></symbol>
<symbol id="ovg-link-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/></symbol>
<symbol id="ovg-link-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10 14a4 4 0 0 0 5.7 0l3-3a4 4 0 0 0-5.7-5.7l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1"/></symbol>
@@@ -887,6 +957,8 @@
<symbol id="ovg-mask-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z"/><path d="M7.5 11.5h2M14.5 11.5h2"/></symbol>
<symbol id="ovg-mask-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z"/><path d="M7.5 11.5h2M14.5 11.5h2"/></symbol>
<symbol id="ovg-mask-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z"/><path d="M7.5 11.5h2M14.5 11.5h2"/></symbol>
++<symbol id="ovg-mask-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M2.9 6.2c3.2 1.4 6.2 2 9.1 2s5.9-.6 9.1-2c0 6.9-2.8 11.4-5.6 11.4-1.5 0-2.1-1.5-3.5-1.5s-2 1.5-3.5 1.5c-2.8 0-5.6-4.5-5.6-11.4ZM6.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0ZM13.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0Z"/></symbol>
++<symbol id="ovg-mask-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M2.9 6.2c3.2 1.4 6.2 2 9.1 2s5.9-.6 9.1-2c0 6.9-2.8 11.4-5.6 11.4-1.5 0-2.1-1.5-3.5-1.5s-2 1.5-3.5 1.5c-2.8 0-5.6-4.5-5.6-11.4ZM6.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0ZM13.9 11.5a1.6 1.1 0 1 0 3.2 0a1.6 1.1 0 1 0-3.2 0Z"/></g><path d="M3.5 7c3 1.3 5.8 1.8 8.5 1.8S17.5 8.3 20.5 7c0 6-2.5 10-5 10-1.4 0-2-1.5-3.5-1.5S9.9 17 8.5 17c-2.5 0-5-4-5-10Z"/><path d="M7.5 11.5h2M14.5 11.5h2"/></symbol>
<symbol id="ovg-medical" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M12 10.5v6M9 13.5h6"/></symbol>
<symbol id="ovg-medical-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M12 10.5v6M9 13.5h6"/></symbol>
<symbol id="ovg-medical-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="7" width="18" height="13" rx="2"/><path d="M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M12 10.5v6M9 13.5h6"/></symbol>
@@@ -937,6 +1009,8 @@
<symbol id="ovg-minus-circle-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M8 12h8"/></symbol>
<symbol id="ovg-minus-circle-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M8 12h8"/></symbol>
<symbol id="ovg-minus-circle-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M8 12h8"/></symbol>
++<symbol id="ovg-minus-circle-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 10.8v2.4h10v-2.4Z"/></symbol>
++<symbol id="ovg-minus-circle-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4ZM7 10.8v2.4h10v-2.4Z"/></g><circle cx="12" cy="12" r="8.5"/><path d="M8 12h8"/></symbol>
<symbol id="ovg-money" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="6" width="19" height="12" rx="2"/><circle cx="12" cy="12" r="2.5"/><path d="M6 9.5v.01M18 14.5v.01"/></symbol>
<symbol id="ovg-money-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="6" width="19" height="12" rx="2"/><circle cx="12" cy="12" r="2.5"/><path d="M6 9.5v.01M18 14.5v.01"/></symbol>
<symbol id="ovg-money-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="6" width="19" height="12" rx="2"/><circle cx="12" cy="12" r="2.5"/><path d="M6 9.5v.01M18 14.5v.01"/></symbol>
@@@ -956,6 +1030,8 @@
<symbol id="ovg-more-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="12" r="1.6"/><circle cx="12" cy="12" r="1.6"/><circle cx="19" cy="12" r="1.6"/></symbol>
<symbol id="ovg-more-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="12" r="1.6"/><circle cx="12" cy="12" r="1.6"/><circle cx="19" cy="12" r="1.6"/></symbol>
<symbol id="ovg-more-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="12" r="1.6"/><circle cx="12" cy="12" r="1.6"/><circle cx="19" cy="12" r="1.6"/></symbol>
++<symbol id="ovg-more-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="5" cy="12" r="2.1"/><circle cx="12" cy="12" r="2.1"/><circle cx="19" cy="12" r="2.1"/></symbol>
++<symbol id="ovg-more-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="5" cy="12" r="2.1"/><circle cx="12" cy="12" r="2.1"/><circle cx="19" cy="12" r="2.1"/></g><circle cx="5" cy="12" r="1.6"/><circle cx="12" cy="12" r="1.6"/><circle cx="19" cy="12" r="1.6"/></symbol>
<symbol id="ovg-mountain" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 19 9 6l4.2 7.2L16 9.5 21.5 19Z"/></symbol>
<symbol id="ovg-mountain-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 19 9 6l4.2 7.2L16 9.5 21.5 19Z"/></symbol>
<symbol id="ovg-mountain-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 19 9 6l4.2 7.2L16 9.5 21.5 19Z"/></symbol>
@@@ -973,6 +1049,8 @@
<symbol id="ovg-mug-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 9h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z"/><path d="M15.5 10.5H17a2.5 2.5 0 0 1 0 5h-1.5M8 3.5c-.8 1 .8 2 0 3M11.5 3.5c-.8 1 .8 2 0 3"/></symbol>
<symbol id="ovg-mug-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 9h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z"/><path d="M15.5 10.5H17a2.5 2.5 0 0 1 0 5h-1.5M8 3.5c-.8 1 .8 2 0 3M11.5 3.5c-.8 1 .8 2 0 3"/></symbol>
<symbol id="ovg-mug-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 9h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z"/><path d="M15.5 10.5H17a2.5 2.5 0 0 1 0 5h-1.5M8 3.5c-.8 1 .8 2 0 3M11.5 3.5c-.8 1 .8 2 0 3"/></symbol>
++<symbol id="ovg-mug-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M3.9 8.4h12.2v7.6a4.6 4.6 0 0 1-4.6 4.6h-3a4.6 4.6 0 0 1-4.6-4.6Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M16.1 10.5H17a2.5 2.5 0 0 1 0 5h-.9M8 3.2c-.8 1 .8 2 0 3M11.5 3.2c-.8 1 .8 2 0 3"/></symbol>
++<symbol id="ovg-mug-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M3.9 8.4h12.2v7.6a4.6 4.6 0 0 1-4.6 4.6h-3a4.6 4.6 0 0 1-4.6-4.6Z"/><path class="ln" d="M16.1 10.5H17a2.5 2.5 0 0 1 0 5h-.9M8 3.2c-.8 1 .8 2 0 3M11.5 3.2c-.8 1 .8 2 0 3"/></g><path d="M4.5 9h11v7a4 4 0 0 1-4 4h-3a4 4 0 0 1-4-4Z"/><path d="M15.5 10.5H17a2.5 2.5 0 0 1 0 5h-1.5M8 3.5c-.8 1 .8 2 0 3M11.5 3.5c-.8 1 .8 2 0 3"/></symbol>
<symbol id="ovg-music" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V6l11-2v12"/><circle cx="6.5" cy="18" r="2.5"/><circle cx="17.5" cy="16" r="2.5"/></symbol>
<symbol id="ovg-music-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V6l11-2v12"/><circle cx="6.5" cy="18" r="2.5"/><circle cx="17.5" cy="16" r="2.5"/></symbol>
<symbol id="ovg-music-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18V6l11-2v12"/><circle cx="6.5" cy="18" r="2.5"/><circle cx="17.5" cy="16" r="2.5"/></symbol>
@@@ -1032,6 +1110,8 @@
<symbol id="ovg-paw-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 18.4c0-2.8 1.8-5 4-5s4 2.2 4 5c0 1.3-1 2-2 2-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1 0-2-.7-2-2Z"/><circle cx="5.8" cy="11" r="1.8"/><circle cx="9.4" cy="6.4" r="1.8"/><circle cx="14.6" cy="6.4" r="1.8"/><circle cx="18.2" cy="11" r="1.8"/></symbol>
<symbol id="ovg-paw-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 18.4c0-2.8 1.8-5 4-5s4 2.2 4 5c0 1.3-1 2-2 2-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1 0-2-.7-2-2Z"/><circle cx="5.8" cy="11" r="1.8"/><circle cx="9.4" cy="6.4" r="1.8"/><circle cx="14.6" cy="6.4" r="1.8"/><circle cx="18.2" cy="11" r="1.8"/></symbol>
<symbol id="ovg-paw-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 18.4c0-2.8 1.8-5 4-5s4 2.2 4 5c0 1.3-1 2-2 2-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1 0-2-.7-2-2Z"/><circle cx="5.8" cy="11" r="1.8"/><circle cx="9.4" cy="6.4" r="1.8"/><circle cx="14.6" cy="6.4" r="1.8"/><circle cx="18.2" cy="11" r="1.8"/></symbol>
++<symbol id="ovg-paw-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M7.4 18.4c0-3.1 2-5.6 4.6-5.6s4.6 2.5 4.6 5.6c0 1.6-1.2 2.6-2.6 2.6-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1.4 0-2.6-1-2.6-2.6Z"/><circle cx="5.8" cy="11" r="2.3"/><circle cx="9.4" cy="6.4" r="2.3"/><circle cx="14.6" cy="6.4" r="2.3"/><circle cx="18.2" cy="11" r="2.3"/></symbol>
++<symbol id="ovg-paw-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M7.4 18.4c0-3.1 2-5.6 4.6-5.6s4.6 2.5 4.6 5.6c0 1.6-1.2 2.6-2.6 2.6-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1.4 0-2.6-1-2.6-2.6Z"/><circle cx="5.8" cy="11" r="2.3"/><circle cx="9.4" cy="6.4" r="2.3"/><circle cx="14.6" cy="6.4" r="2.3"/><circle cx="18.2" cy="11" r="2.3"/></g><path d="M8 18.4c0-2.8 1.8-5 4-5s4 2.2 4 5c0 1.3-1 2-2 2-.8 0-1.3-.5-2-.5s-1.2.5-2 .5c-1 0-2-.7-2-2Z"/><circle cx="5.8" cy="11" r="1.8"/><circle cx="9.4" cy="6.4" r="1.8"/><circle cx="14.6" cy="6.4" r="1.8"/><circle cx="18.2" cy="11" r="1.8"/></symbol>
<symbol id="ovg-pencil" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"/></symbol>
<symbol id="ovg-pencil-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"/></symbol>
<symbol id="ovg-pencil-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4Z"/></symbol>
@@@ -1056,6 +1136,8 @@
<symbol id="ovg-piggy-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12Z"/><path d="M16 10.5h.01M9.5 8.5h3"/></symbol>
<symbol id="ovg-piggy-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12Z"/><path d="M16 10.5h.01M9.5 8.5h3"/></symbol>
<symbol id="ovg-piggy-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12Z"/><path d="M16 10.5h.01M9.5 8.5h3"/></symbol>
++<symbol id="ovg-piggy-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12ZM15 10.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0ZM9.3 7.8v1.4h3.4V7.8Z"/></symbol>
++<symbol id="ovg-piggy-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12ZM15 10.5a1 1 0 1 0 2 0a1 1 0 1 0-2 0ZM9.3 7.8v1.4h3.4V7.8Z"/></g><path d="M4 12c0-3.3 3.4-6 8-6 1.3 0 2.5.2 3.6.6L18.5 5v3.4c.8.7 1.4 1.6 1.6 2.6h1.4v3.5H20c-.5 1-1.3 1.8-2.4 2.4V20h-3v-2c-.8.2-1.7.3-2.6.3-.8 0-1.6-.1-2.4-.3v2h-3v-3C5 15.8 4 14 4 12Z"/><path d="M16 10.5h.01M9.5 8.5h3"/></symbol>
<symbol id="ovg-pin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21s-6.5-5.6-6.5-11a6.5 6.5 0 0 1 13 0C18.5 15.4 12 21 12 21Z"/><circle cx="12" cy="10" r="2.4"/></symbol>
<symbol id="ovg-pin-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21s-6.5-5.6-6.5-11a6.5 6.5 0 0 1 13 0C18.5 15.4 12 21 12 21Z"/><circle cx="12" cy="10" r="2.4"/></symbol>
<symbol id="ovg-pin-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21s-6.5-5.6-6.5-11a6.5 6.5 0 0 1 13 0C18.5 15.4 12 21 12 21Z"/><circle cx="12" cy="10" r="2.4"/></symbol>
@@@ -1094,11 +1176,15 @@
<symbol id="ovg-plus-circle-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 8v8M8 12h8"/></symbol>
<symbol id="ovg-plus-circle-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 8v8M8 12h8"/></symbol>
<symbol id="ovg-plus-circle-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 8v8M8 12h8"/></symbol>
++<symbol id="ovg-plus-circle-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm-1.2 4.2h2.4v3.8H17v2.4h-3.8V17h-2.4v-3.8H7v-2.4h3.8Z"/></symbol>
++<symbol id="ovg-plus-circle-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm-1.2 4.2h2.4v3.8H17v2.4h-3.8V17h-2.4v-3.8H7v-2.4h3.8Z"/></g><circle cx="12" cy="12" r="8.5"/><path d="M12 8v8M8 12h8"/></symbol>
<symbol id="ovg-print" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 9V3.5h10V9"/><rect x="3.5" y="9" width="17" height="8" rx="2"/><path d="M7 14h10v6.5H7ZM16.5 12h.01"/></symbol>
<symbol id="ovg-print-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M7 9V3.5h10V9"/><rect x="3.5" y="9" width="17" height="8" rx="2"/><path d="M7 14h10v6.5H7ZM16.5 12h.01"/></symbol>
<symbol id="ovg-print-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M7 9V3.5h10V9"/><rect x="3.5" y="9" width="17" height="8" rx="2"/><path d="M7 14h10v6.5H7ZM16.5 12h.01"/></symbol>
<symbol id="ovg-print-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 9V3.5h10V9"/><rect x="3.5" y="9" width="17" height="8" rx="2"/><path d="M7 14h10v6.5H7ZM16.5 12h.01"/></symbol>
<symbol id="ovg-print-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M7 9V3.5h10V9"/><rect x="3.5" y="9" width="17" height="8" rx="2"/><path d="M7 14h10v6.5H7ZM16.5 12h.01"/></symbol>
++<symbol id="ovg-print-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M6.4 2.9h11.2v4.3H6.4ZM2.9 11a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v4a2.6 2.6 0 0 1-2.6 2.6h-.3v-4.4H5.8v4.4h-.3A2.6 2.6 0 0 1 2.9 15ZM7.2 14.6h9.6v6.5H7.2Z"/></symbol>
++<symbol id="ovg-print-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M6.4 2.9h11.2v4.3H6.4ZM2.9 11a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v4a2.6 2.6 0 0 1-2.6 2.6h-.3v-4.4H5.8v4.4h-.3A2.6 2.6 0 0 1 2.9 15ZM7.2 14.6h9.6v6.5H7.2Z"/></g><path d="M7 9V3.5h10V9"/><rect x="3.5" y="9" width="17" height="8" rx="2"/><path d="M7 14h10v6.5H7ZM16.5 12h.01"/></symbol>
<symbol id="ovg-puzzle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z"/></symbol>
<symbol id="ovg-puzzle-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z"/></symbol>
<symbol id="ovg-puzzle-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5.5 7.5h3.5a2 2 0 1 1 4 0h3.5v3.5a2 2 0 1 1 0 4v3.5h-3.5a2 2 0 1 0-4 0H5.5v-3.5a2 2 0 1 0 0-4Z"/></symbol>
@@@ -1116,16 +1202,22 @@
<symbol id="ovg-radio-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M7 8 17 3.5"/><circle cx="15.5" cy="14" r="2.5"/><path d="M6.5 12.5h4M6.5 15.5h4"/></symbol>
<symbol id="ovg-radio-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M7 8 17 3.5"/><circle cx="15.5" cy="14" r="2.5"/><path d="M6.5 12.5h4M6.5 15.5h4"/></symbol>
<symbol id="ovg-radio-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M7 8 17 3.5"/><circle cx="15.5" cy="14" r="2.5"/><path d="M6.5 12.5h4M6.5 15.5h4"/></symbol>
++<symbol id="ovg-radio-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M5 7.4h14a2.6 2.6 0 0 1 2.6 2.6v8a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18v-8A2.6 2.6 0 0 1 5 7.4ZM12.9 14a2.6 2.6 0 1 0 5.2 0a2.6 2.6 0 1 0-5.2 0ZM6 11.3v2.1h4.8v-2.1ZM6 14.8v2.1h4.8v-2.1Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M7 7.4 17 3.5"/></symbol>
++<symbol id="ovg-radio-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M5 7.4h14a2.6 2.6 0 0 1 2.6 2.6v8a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18v-8A2.6 2.6 0 0 1 5 7.4ZM12.9 14a2.6 2.6 0 1 0 5.2 0a2.6 2.6 0 1 0-5.2 0ZM6 11.3v2.1h4.8v-2.1ZM6 14.8v2.1h4.8v-2.1Z"/><path class="ln" d="M7 7.4 17 3.5"/></g><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M7 8 17 3.5"/><circle cx="15.5" cy="14" r="2.5"/><path d="M6.5 12.5h4M6.5 15.5h4"/></symbol>
<symbol id="ovg-ranking" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5"/><path d="m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z"/></symbol>
<symbol id="ovg-ranking-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5"/><path d="m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z"/></symbol>
<symbol id="ovg-ranking-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5"/><path d="m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z"/></symbol>
<symbol id="ovg-ranking-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5"/><path d="m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z"/></symbol>
<symbol id="ovg-ranking-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5"/><path d="m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z"/></symbol>
++<symbol id="ovg-ranking-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M3.4 13.6h5V9.8h7.2v5.8h5v5.5H3.4ZM12 2l1 2 2.2.3-1.6 1.6.4 2.2L12 7.1l-2 1 .4-2.2-1.6-1.6 2.2-.3Z"/></symbol>
++<symbol id="ovg-ranking-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M3.4 13.6h5V9.8h7.2v5.8h5v5.5H3.4ZM12 2l1 2 2.2.3-1.6 1.6.4 2.2L12 7.1l-2 1 .4-2.2-1.6-1.6 2.2-.3Z"/></g><path d="M3 20.5h18M4 20.5V14h5M9 20.5V10h6v10.5M15 20.5V16h5v4.5"/><path d="m12 3 .9 1.8 2 .3-1.45 1.4.35 2L12 7.6l-1.8.9.35-2L9.1 5.1l2-.3Z"/></symbol>
<symbol id="ovg-record" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="3"/></symbol>
<symbol id="ovg-record-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="3"/></symbol>
<symbol id="ovg-record-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="3"/></symbol>
<symbol id="ovg-record-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="3"/></symbol>
<symbol id="ovg-record-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="3"/></symbol>
++<symbol id="ovg-record-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.2a6 6 0 1 1 0 12 6 6 0 0 1 0-12Z"/><circle cx="12" cy="12" r="3.6"/></symbol>
++<symbol id="ovg-record-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.2a6 6 0 1 1 0 12 6 6 0 0 1 0-12Z"/><circle cx="12" cy="12" r="3.6"/></g><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="12" r="3"/></symbol>
<symbol id="ovg-recycle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7.2 19.5H4.8a1.4 1.4 0 0 1-1.2-2.1l2.6-4.5M9.8 4.9l1-1.7a1.4 1.4 0 0 1 2.4 0l2.6 4.5M18.6 12.9l1.8 3.1a1.4 1.4 0 0 1-1.2 2.1h-5.2"/><path d="M11 17.6l2.1 2.1-2.1 2.1M3.4 10.6l2.8-.8.8 2.9M18 5.6l-.8 2.9-2.9-.8"/></symbol>
<symbol id="ovg-recycle-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M7.2 19.5H4.8a1.4 1.4 0 0 1-1.2-2.1l2.6-4.5M9.8 4.9l1-1.7a1.4 1.4 0 0 1 2.4 0l2.6 4.5M18.6 12.9l1.8 3.1a1.4 1.4 0 0 1-1.2 2.1h-5.2"/><path d="M11 17.6l2.1 2.1-2.1 2.1M3.4 10.6l2.8-.8.8 2.9M18 5.6l-.8 2.9-2.9-.8"/></symbol>
<symbol id="ovg-recycle-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M7.2 19.5H4.8a1.4 1.4 0 0 1-1.2-2.1l2.6-4.5M9.8 4.9l1-1.7a1.4 1.4 0 0 1 2.4 0l2.6 4.5M18.6 12.9l1.8 3.1a1.4 1.4 0 0 1-1.2 2.1h-5.2"/><path d="M11 17.6l2.1 2.1-2.1 2.1M3.4 10.6l2.8-.8.8 2.9M18 5.6l-.8 2.9-2.9-.8"/></symbol>
@@@ -1155,6 +1247,8 @@
<symbol id="ovg-rewind-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 6.5v11L13 12ZM11.5 6.5v11L4 12Z"/></symbol>
<symbol id="ovg-rewind-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 6.5v11L13 12ZM11.5 6.5v11L4 12Z"/></symbol>
<symbol id="ovg-rewind-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 6.5v11L13 12ZM11.5 6.5v11L4 12Z"/></symbol>
++<symbol id="ovg-rewind-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M21 5.7v12.6L12.3 12ZM11.7 5.7v12.6L3 12Z"/></symbol>
++<symbol id="ovg-rewind-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M21 5.7v12.6L12.3 12ZM11.7 5.7v12.6L3 12Z"/></g><path d="M20.5 6.5v11L13 12ZM11.5 6.5v11L4 12Z"/></symbol>
<symbol id="ovg-road" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3 4 21M16 3l4 18M12 4v2.5M12 10.5v3M12 17.5V20"/></symbol>
<symbol id="ovg-road-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3 4 21M16 3l4 18M12 4v2.5M12 10.5v3M12 17.5V20"/></symbol>
<symbol id="ovg-road-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3 4 21M16 3l4 18M12 4v2.5M12 10.5v3M12 17.5V20"/></symbol>
@@@ -1172,6 +1266,8 @@
<symbol id="ovg-rocket-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 15.5 8.5 12C10 6.5 14 3.5 20.5 3.5 20.5 10 17.5 14 12 15.5ZM8.5 12 5 11.5 7.5 8h4M12 15.5l.5 3.5 3.5-2.5v-4M6.5 17.5c-1.5 0-3 1.5-3 3 1.5 0 3-1.5 3-3Z"/><circle cx="15.5" cy="8.5" r="1.5"/></symbol>
<symbol id="ovg-rocket-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 15.5 8.5 12C10 6.5 14 3.5 20.5 3.5 20.5 10 17.5 14 12 15.5ZM8.5 12 5 11.5 7.5 8h4M12 15.5l.5 3.5 3.5-2.5v-4M6.5 17.5c-1.5 0-3 1.5-3 3 1.5 0 3-1.5 3-3Z"/><circle cx="15.5" cy="8.5" r="1.5"/></symbol>
<symbol id="ovg-rocket-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 15.5 8.5 12C10 6.5 14 3.5 20.5 3.5 20.5 10 17.5 14 12 15.5ZM8.5 12 5 11.5 7.5 8h4M12 15.5l.5 3.5 3.5-2.5v-4M6.5 17.5c-1.5 0-3 1.5-3 3 1.5 0 3-1.5 3-3Z"/><circle cx="15.5" cy="8.5" r="1.5"/></symbol>
++<symbol id="ovg-rocket-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12.1 16.2 7.8 11.9C9.4 6 13.8 2.9 21.1 2.9c0 7.3-3.1 11.7-9 13.3ZM13.8 8.5a1.7 1.7 0 1 0 3.4 0a1.7 1.7 0 1 0-3.4 0Z"/><path d="M4.2 11.9 7.2 7.4h3.4L7 12.3ZM11.7 17 12.1 19.8l4.5-3.2v-3.4ZM6.7 17.3c-1.9 0-3.8 1.9-3.8 3.8 1.9 0 3.8-1.9 3.8-3.8Z"/></symbol>
++<symbol id="ovg-rocket-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12.1 16.2 7.8 11.9C9.4 6 13.8 2.9 21.1 2.9c0 7.3-3.1 11.7-9 13.3ZM13.8 8.5a1.7 1.7 0 1 0 3.4 0a1.7 1.7 0 1 0-3.4 0Z"/><path d="M4.2 11.9 7.2 7.4h3.4L7 12.3ZM11.7 17 12.1 19.8l4.5-3.2v-3.4ZM6.7 17.3c-1.9 0-3.8 1.9-3.8 3.8 1.9 0 3.8-1.9 3.8-3.8Z"/></g><path d="M12 15.5 8.5 12C10 6.5 14 3.5 20.5 3.5 20.5 10 17.5 14 12 15.5ZM8.5 12 5 11.5 7.5 8h4M12 15.5l.5 3.5 3.5-2.5v-4M6.5 17.5c-1.5 0-3 1.5-3 3 1.5 0 3-1.5 3-3Z"/><circle cx="15.5" cy="8.5" r="1.5"/></symbol>
<symbol id="ovg-route" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="18" r="2.4"/><circle cx="18" cy="6" r="2.4"/><path d="M8.4 18H16a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h7.6"/></symbol>
<symbol id="ovg-route-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="18" r="2.4"/><circle cx="18" cy="6" r="2.4"/><path d="M8.4 18H16a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h7.6"/></symbol>
<symbol id="ovg-route-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="6" cy="18" r="2.4"/><circle cx="18" cy="6" r="2.4"/><path d="M8.4 18H16a3 3 0 0 0 0-6H8a3 3 0 0 1 0-6h7.6"/></symbol>
@@@ -1218,6 +1314,8 @@
<symbol id="ovg-seedling-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20v-9M12 11C12 7 9.5 4.5 5 4.5c0 4 2.5 6.5 7 6.5ZM12 13.5c0 -4 2.5 -6.5 7 -6.5 0 4 -2.5 6.5 -7 6.5Z"/></symbol>
<symbol id="ovg-seedling-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20v-9M12 11C12 7 9.5 4.5 5 4.5c0 4 2.5 6.5 7 6.5ZM12 13.5c0 -4 2.5 -6.5 7 -6.5 0 4 -2.5 6.5 -7 6.5Z"/></symbol>
<symbol id="ovg-seedling-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20v-9M12 11C12 7 9.5 4.5 5 4.5c0 4 2.5 6.5 7 6.5ZM12 13.5c0 -4 2.5 -6.5 7 -6.5 0 4 -2.5 6.5 -7 6.5Z"/></symbol>
++<symbol id="ovg-seedling-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M12.4 11.4C12.4 7 9.6 4 4.5 4c0 4.6 2.8 7.4 7.9 7.4ZM11.6 13.9c0-4.4 2.8-7.4 7.9-7.4 0 4.6-2.8 7.4-7.9 7.4Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M12 20.5V13"/></symbol>
++<symbol id="ovg-seedling-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M12.4 11.4C12.4 7 9.6 4 4.5 4c0 4.6 2.8 7.4 7.9 7.4ZM11.6 13.9c0-4.4 2.8-7.4 7.9-7.4 0 4.6-2.8 7.4-7.9 7.4Z"/><path class="ln" d="M12 20.5V13"/></g><path d="M12 20v-9M12 11C12 7 9.5 4.5 5 4.5c0 4 2.5 6.5 7 6.5ZM12 13.5c0 -4 2.5 -6.5 7 -6.5 0 4 -2.5 6.5 -7 6.5Z"/></symbol>
<symbol id="ovg-send" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19V5M5 12l7-7 7 7"/></symbol>
<symbol id="ovg-send-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19V5M5 12l7-7 7 7"/></symbol>
<symbol id="ovg-send-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19V5M5 12l7-7 7 7"/></symbol>
@@@ -1268,11 +1366,15 @@
<symbol id="ovg-shoe-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 15.5v-5.5l4 -0.5 3 -4 3.2 1.4 -0.9 2.6 4 2.2 4.7 1a2 2 0 0 1 1.5 1.9V15.5Z"/><path d="M2.5 18.5h19"/></symbol>
<symbol id="ovg-shoe-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 15.5v-5.5l4 -0.5 3 -4 3.2 1.4 -0.9 2.6 4 2.2 4.7 1a2 2 0 0 1 1.5 1.9V15.5Z"/><path d="M2.5 18.5h19"/></symbol>
<symbol id="ovg-shoe-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 15.5v-5.5l4 -0.5 3 -4 3.2 1.4 -0.9 2.6 4 2.2 4.7 1a2 2 0 0 1 1.5 1.9V15.5Z"/><path d="M2.5 18.5h19"/></symbol>
++<symbol id="ovg-shoe-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M1.9 15.9V9.5l4.3-.6 3.1-4.2 4.2 1.9-.9 2.7 3.6 2 4.4.9a2.2 2.2 0 0 1 1.5 2.1v1.6Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M2.5 18.8h19"/></symbol>
++<symbol id="ovg-shoe-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M1.9 15.9V9.5l4.3-.6 3.1-4.2 4.2 1.9-.9 2.7 3.6 2 4.4.9a2.2 2.2 0 0 1 1.5 2.1v1.6Z"/><path class="ln" d="M2.5 18.8h19"/></g><path d="M2.5 15.5v-5.5l4 -0.5 3 -4 3.2 1.4 -0.9 2.6 4 2.2 4.7 1a2 2 0 0 1 1.5 1.9V15.5Z"/><path d="M2.5 18.5h19"/></symbol>
<symbol id="ovg-sidebar" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2.5"/><path d="M9.5 4.5v15"/></symbol>
<symbol id="ovg-sidebar-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2.5"/><path d="M9.5 4.5v15"/></symbol>
<symbol id="ovg-sidebar-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2.5"/><path d="M9.5 4.5v15"/></symbol>
<symbol id="ovg-sidebar-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2.5"/><path d="M9.5 4.5v15"/></symbol>
<symbol id="ovg-sidebar-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2.5"/><path d="M9.5 4.5v15"/></symbol>
++<symbol id="ovg-sidebar-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h2.7v16.2H5.5a2.6 2.6 0 0 1-2.6-2.6ZM10.2 3.9h8.3a2.6 2.6 0 0 1 2.6 2.6v11a2.6 2.6 0 0 1-2.6 2.6h-8.3Z"/></symbol>
++<symbol id="ovg-sidebar-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h2.7v16.2H5.5a2.6 2.6 0 0 1-2.6-2.6ZM10.2 3.9h8.3a2.6 2.6 0 0 1 2.6 2.6v11a2.6 2.6 0 0 1-2.6 2.6h-8.3Z"/></g><rect x="3.5" y="4.5" width="17" height="15" rx="2.5"/><path d="M9.5 4.5v15"/></symbol>
<symbol id="ovg-signature" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 14.5c2.5 0 3.5 -9 6 -9 1.5 0 1 6 2.5 6 1 0 1.5 -2.5 2.5 -2.5s0.8 2 2 2c0.8 0 1.5 -0.6 2 -1.2M3 18.5h18"/></symbol>
<symbol id="ovg-signature-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M3 14.5c2.5 0 3.5 -9 6 -9 1.5 0 1 6 2.5 6 1 0 1.5 -2.5 2.5 -2.5s0.8 2 2 2c0.8 0 1.5 -0.6 2 -1.2M3 18.5h18"/></symbol>
<symbol id="ovg-signature-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 14.5c2.5 0 3.5 -9 6 -9 1.5 0 1 6 2.5 6 1 0 1.5 -2.5 2.5 -2.5s0.8 2 2 2c0.8 0 1.5 -0.6 2 -1.2M3 18.5h18"/></symbol>
@@@ -1283,6 +1385,8 @@
<symbol id="ovg-skip-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 5l9 7-9 7Z"/><path d="M18.5 5v14"/></symbol>
<symbol id="ovg-skip-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 5l9 7-9 7Z"/><path d="M18.5 5v14"/></symbol>
<symbol id="ovg-skip-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M6 5l9 7-9 7Z"/><path d="M18.5 5v14"/></symbol>
++<symbol id="ovg-skip-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M5.4 4.3v15.4L15.6 12Z"/><rect x="17.2" y="4.4" width="2.6" height="15.2" rx="1.2"/></symbol>
++<symbol id="ovg-skip-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M5.4 4.3v15.4L15.6 12Z"/><rect x="17.2" y="4.4" width="2.6" height="15.2" rx="1.2"/></g><path d="M6 5l9 7-9 7Z"/><path d="M18.5 5v14"/></symbol>
<symbol id="ovg-skull" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a7 7 0 0 0-7 7c0 2.3 1.1 3.9 2.5 5v3h9v-3c1.4-1.1 2.5-2.7 2.5-5a7 7 0 0 0-7-7Z"/><circle cx="9.5" cy="10.5" r="1.4"/><circle cx="14.5" cy="10.5" r="1.4"/><path d="M10.5 18v3M13.5 18v3"/></symbol>
<symbol id="ovg-skull-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a7 7 0 0 0-7 7c0 2.3 1.1 3.9 2.5 5v3h9v-3c1.4-1.1 2.5-2.7 2.5-5a7 7 0 0 0-7-7Z"/><circle cx="9.5" cy="10.5" r="1.4"/><circle cx="14.5" cy="10.5" r="1.4"/><path d="M10.5 18v3M13.5 18v3"/></symbol>
<symbol id="ovg-skull-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a7 7 0 0 0-7 7c0 2.3 1.1 3.9 2.5 5v3h9v-3c1.4-1.1 2.5-2.7 2.5-5a7 7 0 0 0-7-7Z"/><circle cx="9.5" cy="10.5" r="1.4"/><circle cx="14.5" cy="10.5" r="1.4"/><path d="M10.5 18v3M13.5 18v3"/></symbol>
@@@ -1336,6 +1440,8 @@
<symbol id="ovg-square-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2.5"/></symbol>
<symbol id="ovg-square-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2.5"/></symbol>
<symbol id="ovg-square-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2.5"/></symbol>
++<symbol id="ovg-square-solid" viewBox="0 0 24 24" fill="currentColor"><rect x="3.4" y="3.4" width="17.2" height="17.2" rx="3"/></symbol>
++<symbol id="ovg-square-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><rect x="3.4" y="3.4" width="17.2" height="17.2" rx="3"/></g><rect x="4" y="4" width="16" height="16" rx="2.5"/></symbol>
<symbol id="ovg-star" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 4 2.4 5 5.4.6-4 3.7 1.1 5.4L12 16l-4.9 2.7 1.1-5.4-4-3.7 5.4-.6Z"/></symbol>
<symbol id="ovg-star-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="m12 4 2.4 5 5.4.6-4 3.7 1.1 5.4L12 16l-4.9 2.7 1.1-5.4-4-3.7 5.4-.6Z"/></symbol>
<symbol id="ovg-star-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m12 4 2.4 5 5.4.6-4 3.7 1.1 5.4L12 16l-4.9 2.7 1.1-5.4-4-3.7 5.4-.6Z"/></symbol>
@@@ -1384,11 +1490,15 @@
<symbol id="ovg-sword-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 4v3.5L10.5 17 7 13.5 16.5 4Z"/><path d="M5.5 12 12 18.5M8.5 15.5 4 20"/></symbol>
<symbol id="ovg-sword-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 4v3.5L10.5 17 7 13.5 16.5 4Z"/><path d="M5.5 12 12 18.5M8.5 15.5 4 20"/></symbol>
<symbol id="ovg-sword-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 4v3.5L10.5 17 7 13.5 16.5 4Z"/><path d="M5.5 12 12 18.5M8.5 15.5 4 20"/></symbol>
++<symbol id="ovg-sword-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M20.6 3.4v4.4l-10.1 10.1-4.4-4.4L16.2 3.4Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M5.5 12 12 18.5M8.5 15.5 4 20"/></symbol>
++<symbol id="ovg-sword-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M20.6 3.4v4.4l-10.1 10.1-4.4-4.4L16.2 3.4Z"/><path class="ln" d="M5.5 12 12 18.5M8.5 15.5 4 20"/></g><path d="M20 4v3.5L10.5 17 7 13.5 16.5 4Z"/><path d="M5.5 12 12 18.5M8.5 15.5 4 20"/></symbol>
<symbol id="ovg-table" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20"/></symbol>
<symbol id="ovg-table-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20"/></symbol>
<symbol id="ovg-table-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20"/></symbol>
<symbol id="ovg-table-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20"/></symbol>
<symbol id="ovg-table-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20"/></symbol>
++<symbol id="ovg-table-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.4 6a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.4H2.4ZM2.4 10.4h5.4v10.2H5a2.6 2.6 0 0 1-2.6-2.6ZM9.7 10.4h4.6v10.2H9.7ZM16.2 10.4h5.4V18a2.6 2.6 0 0 1-2.6 2.6h-2.8Z"/></symbol>
++<symbol id="ovg-table-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.4 6a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.4H2.4ZM2.4 10.4h5.4v10.2H5a2.6 2.6 0 0 1-2.6-2.6ZM9.7 10.4h4.6v10.2H9.7ZM16.2 10.4h5.4V18a2.6 2.6 0 0 1-2.6 2.6h-2.8Z"/></g><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 9.5h18M3 15h18M9 9.5V20M15 9.5V20"/></symbol>
<symbol id="ovg-tack" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 3h6l-1 5 3 3H7l3-3ZM12 11v10"/></symbol>
<symbol id="ovg-tack-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M9 3h6l-1 5 3 3H7l3-3ZM12 11v10"/></symbol>
<symbol id="ovg-tack-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 3h6l-1 5 3 3H7l3-3ZM12 11v10"/></symbol>
@@@ -1415,6 +1525,8 @@
<symbol id="ovg-task-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="3"/><path d="m8 12 3 3 5-6"/></symbol>
<symbol id="ovg-task-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="3"/><path d="m8 12 3 3 5-6"/></symbol>
<symbol id="ovg-task-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="3"/><path d="m8 12 3 3 5-6"/></symbol>
++<symbol id="ovg-task-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M7 3.4h10a3.6 3.6 0 0 1 3.6 3.6v10a3.6 3.6 0 0 1-3.6 3.6H7A3.6 3.6 0 0 1 3.4 17V7A3.6 3.6 0 0 1 7 3.4ZM6.9 12.1l4.2 4.2 6.1-7.3-1.7-1.4-4.6 5.5-2.4-2.4Z"/></symbol>
++<symbol id="ovg-task-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M7 3.4h10a3.6 3.6 0 0 1 3.6 3.6v10a3.6 3.6 0 0 1-3.6 3.6H7A3.6 3.6 0 0 1 3.4 17V7A3.6 3.6 0 0 1 7 3.4ZM6.9 12.1l4.2 4.2 6.1-7.3-1.7-1.4-4.6 5.5-2.4-2.4Z"/></g><rect x="4" y="4" width="16" height="16" rx="3"/><path d="m8 12 3 3 5-6"/></symbol>
<symbol id="ovg-tent" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 20h19M12 5 4 20M12 5l8 15M12 13.5 9 20M12 13.5l3 6.5"/></symbol>
<symbol id="ovg-tent-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 20h19M12 5 4 20M12 5l8 15M12 13.5 9 20M12 13.5l3 6.5"/></symbol>
<symbol id="ovg-tent-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 20h19M12 5 4 20M12 5l8 15M12 13.5 9 20M12 13.5l3 6.5"/></symbol>
@@@ -1460,6 +1572,8 @@
<symbol id="ovg-toolbox-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3"/></symbol>
<symbol id="ovg-toolbox-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3"/></symbol>
<symbol id="ovg-toolbox-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3"/></symbol>
++<symbol id="ovg-toolbox-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.4 10a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.3H2.4ZM2.4 13.7h4.8v1.5h1.6v-1.5h6.4v1.5h1.6v-1.5h4.8V18a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M9 7.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v1.9"/></symbol>
++<symbol id="ovg-toolbox-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.4 10a2.6 2.6 0 0 1 2.6-2.6h14a2.6 2.6 0 0 1 2.6 2.6v2.3H2.4ZM2.4 13.7h4.8v1.5h1.6v-1.5h6.4v1.5h1.6v-1.5h4.8V18a2.6 2.6 0 0 1-2.6 2.6H5A2.6 2.6 0 0 1 2.4 18Z"/><path class="ln" d="M9 7.4V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5v1.9"/></g><rect x="3" y="8" width="18" height="12" rx="2"/><path d="M9 8V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V8M3 13h18M8 11.5v3M16 11.5v3"/></symbol>
<symbol id="ovg-train" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="3" width="12" height="13" rx="3"/><path d="M6 10h12M9 13h.01M15 13h.01M8.5 21l2-3.5M15.5 21l-2-3.5"/></symbol>
<symbol id="ovg-train-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="3" width="12" height="13" rx="3"/><path d="M6 10h12M9 13h.01M15 13h.01M8.5 21l2-3.5M15.5 21l-2-3.5"/></symbol>
<symbol id="ovg-train-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="3" width="12" height="13" rx="3"/><path d="M6 10h12M9 13h.01M15 13h.01M8.5 21l2-3.5M15.5 21l-2-3.5"/></symbol>
@@@ -1548,31 +1662,43 @@
<symbol id="ovg-user-circle-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="10" r="3"/><path d="M6.6 18.3a6.5 6.5 0 0 1 10.8 0"/></symbol>
<symbol id="ovg-user-circle-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="10" r="3"/><path d="M6.6 18.3a6.5 6.5 0 0 1 10.8 0"/></symbol>
<symbol id="ovg-user-circle-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="10" r="3"/><path d="M6.6 18.3a6.5 6.5 0 0 1 10.8 0"/></symbol>
++<symbol id="ovg-user-circle-solid" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.8a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4ZM6.3 17.6a6.6 6.6 0 0 1 11.4 0 8 8 0 0 1-11.4 0Z"/></symbol>
++<symbol id="ovg-user-circle-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path fill-rule="evenodd" d="M12 2.8a9.2 9.2 0 1 0 0 18.4 9.2 9.2 0 0 0 0-18.4Zm0 3.8a3.2 3.2 0 1 1 0 6.4 3.2 3.2 0 0 1 0-6.4ZM6.3 17.6a6.6 6.6 0 0 1 11.4 0 8 8 0 0 1-11.4 0Z"/></g><circle cx="12" cy="12" r="8.5"/><circle cx="12" cy="10" r="3"/><path d="M6.6 18.3a6.5 6.5 0 0 1 10.8 0"/></symbol>
<symbol id="ovg-user-lock" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><rect x="15" y="15.5" width="6" height="5" rx="1"/><path d="M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2"/></symbol>
<symbol id="ovg-user-lock-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><rect x="15" y="15.5" width="6" height="5" rx="1"/><path d="M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2"/></symbol>
<symbol id="ovg-user-lock-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><rect x="15" y="15.5" width="6" height="5" rx="1"/><path d="M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2"/></symbol>
<symbol id="ovg-user-lock-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><rect x="15" y="15.5" width="6" height="5" rx="1"/><path d="M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2"/></symbol>
<symbol id="ovg-user-lock-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><rect x="15" y="15.5" width="6" height="5" rx="1"/><path d="M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2"/></symbol>
++<symbol id="ovg-user-lock-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><rect x="14.6" y="15.2" width="6.8" height="5.6" rx="1.3"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M16.5 15.2v-1a1.5 1.5 0 0 1 3 0v1"/></symbol>
++<symbol id="ovg-user-lock-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><rect x="14.6" y="15.2" width="6.8" height="5.6" rx="1.3"/><path class="ln" d="M16.5 15.2v-1a1.5 1.5 0 0 1 3 0v1"/></g><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><rect x="15" y="15.5" width="6" height="5" rx="1"/><path d="M16.5 15.5v-1.2a1.5 1.5 0 0 1 3 0v1.2"/></symbol>
<symbol id="ovg-user-minus" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M15.5 17.5h6"/></symbol>
<symbol id="ovg-user-minus-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M15.5 17.5h6"/></symbol>
<symbol id="ovg-user-minus-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M15.5 17.5h6"/></symbol>
<symbol id="ovg-user-minus-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M15.5 17.5h6"/></symbol>
<symbol id="ovg-user-minus-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M15.5 17.5h6"/></symbol>
++<symbol id="ovg-user-minus-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="M15.8 17.5h5.4"/></symbol>
++<symbol id="ovg-user-minus-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path class="ln" d="M15.8 17.5h5.4"/></g><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M15.5 17.5h6"/></symbol>
<symbol id="ovg-user-off" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-user-off-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-user-off-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-user-off-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-user-off-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/><path d="M3.5 3.5l17 17"/></symbol>
++<symbol id="ovg-user-off-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M8.95 5.27A4.1 4.1 0 1 1 14.74 11.06ZM4.2 21c0-4.2 2.8-6.8 6.2-7.1L17.3 21Z"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="m4 4 16 16"/></symbol>
++<symbol id="ovg-user-off-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M8.95 5.27A4.1 4.1 0 1 1 14.74 11.06ZM4.2 21c0-4.2 2.8-6.8 6.2-7.1L17.3 21Z"/><path class="ln" d="m4 4 16 16"/></g><circle cx="12" cy="8" r="3.5"/><path d="M5 20c0-3.6 3.1-6 7-6s7 2.4 7 6"/><path d="M3.5 3.5l17 17"/></symbol>
<symbol id="ovg-user-pen" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M20 12.5l1.5 1.5-5 5-2 .5.5-2Z"/></symbol>
<symbol id="ovg-user-pen-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M20 12.5l1.5 1.5-5 5-2 .5.5-2Z"/></symbol>
<symbol id="ovg-user-pen-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M20 12.5l1.5 1.5-5 5-2 .5.5-2Z"/></symbol>
<symbol id="ovg-user-pen-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M20 12.5l1.5 1.5-5 5-2 .5.5-2Z"/></symbol>
<symbol id="ovg-user-pen-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M20 12.5l1.5 1.5-5 5-2 .5.5-2Z"/></symbol>
++<symbol id="ovg-user-pen-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path d="M19.9 11.9l2.2 2.2-5.3 5.3-2.9.7.7-2.9Z"/></symbol>
++<symbol id="ovg-user-pen-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path d="M19.9 11.9l2.2 2.2-5.3 5.3-2.9.7.7-2.9Z"/></g><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M20 12.5l1.5 1.5-5 5-2 .5.5-2Z"/></symbol>
<symbol id="ovg-user-tag" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M14.5 15h4l2.5 2.5-2.5 2.5h-4Z"/><path d="M16.5 17.5h.01"/></symbol>
<symbol id="ovg-user-tag-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M14.5 15h4l2.5 2.5-2.5 2.5h-4Z"/><path d="M16.5 17.5h.01"/></symbol>
<symbol id="ovg-user-tag-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M14.5 15h4l2.5 2.5-2.5 2.5h-4Z"/><path d="M16.5 17.5h.01"/></symbol>
<symbol id="ovg-user-tag-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M14.5 15h4l2.5 2.5-2.5 2.5h-4Z"/><path d="M16.5 17.5h.01"/></symbol>
<symbol id="ovg-user-tag-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M14.5 15h4l2.5 2.5-2.5 2.5h-4Z"/><path d="M16.5 17.5h.01"/></symbol>
++<symbol id="ovg-user-tag-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path fill-rule="evenodd" d="M14.1 14.4h4.6l3.1 3.1-3.1 3.1h-4.6ZM15.3 17.5a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/></symbol>
++<symbol id="ovg-user-tag-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="10" cy="8" r="4.1"/><path d="M2.9 20.6c0-4.1 3.2-6.9 7.1-6.9 1.2 0 2.3.3 3.2.8v6.1Z"/><path fill-rule="evenodd" d="M14.1 14.4h4.6l3.1 3.1-3.1 3.1h-4.6ZM15.3 17.5a1.1 1.1 0 1 0 2.2 0a1.1 1.1 0 1 0-2.2 0Z"/></g><circle cx="10" cy="8" r="3.5"/><path d="M3.5 20c0-3.6 2.9-6 6.5-6 1.2 0 2.3.3 3.2.7"/><path d="M14.5 15h4l2.5 2.5-2.5 2.5h-4Z"/><path d="M16.5 17.5h.01"/></symbol>
<symbol id="ovg-video" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="6" width="13" height="12" rx="2"/><path d="m16 10 5-3v10l-5-3"/></symbol>
<symbol id="ovg-video-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="6" width="13" height="12" rx="2"/><path d="m16 10 5-3v10l-5-3"/></symbol>
<symbol id="ovg-video-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="6" width="13" height="12" rx="2"/><path d="m16 10 5-3v10l-5-3"/></symbol>
@@@ -1592,6 +1718,8 @@
<symbol id="ovg-walk-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12.5" cy="4.5" r="1.9"/><path d="m8.5 21 2.6 -6 2.1 2.4V21M11.1 15l1 -5.6 -3 1.6 -1.5 3M12.1 9.4l2 3 3 1"/></symbol>
<symbol id="ovg-walk-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12.5" cy="4.5" r="1.9"/><path d="m8.5 21 2.6 -6 2.1 2.4V21M11.1 15l1 -5.6 -3 1.6 -1.5 3M12.1 9.4l2 3 3 1"/></symbol>
<symbol id="ovg-walk-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12.5" cy="4.5" r="1.9"/><path d="m8.5 21 2.6 -6 2.1 2.4V21M11.1 15l1 -5.6 -3 1.6 -1.5 3M12.1 9.4l2 3 3 1"/></symbol>
++<symbol id="ovg-walk-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="12.5" cy="4.5" r="2.4"/><path fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" d="m8.5 21 2.6-6 2.1 2.4V21M11.1 15l1-5.6-3 1.6-1.5 3M12.1 9.4l2 3 3 1"/></symbol>
++<symbol id="ovg-walk-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="12.5" cy="4.5" r="2.4"/><path class="ln" d="m8.5 21 2.6-6 2.1 2.4V21M11.1 15l1-5.6-3 1.6-1.5 3M12.1 9.4l2 3 3 1"/></g><circle cx="12.5" cy="4.5" r="1.9"/><path d="m8.5 21 2.6 -6 2.1 2.4V21M11.1 15l1 -5.6 -3 1.6 -1.5 3M12.1 9.4l2 3 3 1"/></symbol>
<symbol id="ovg-wallet" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7.5A2.5 2.5 0 0 1 6.5 5H18v4M4 7.5V18a2 2 0 0 0 2 2h14V9H6.5A2.5 2.5 0 0 1 4 7.5Z"/><path d="M16 14.5h.01"/></symbol>
<symbol id="ovg-wallet-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7.5A2.5 2.5 0 0 1 6.5 5H18v4M4 7.5V18a2 2 0 0 0 2 2h14V9H6.5A2.5 2.5 0 0 1 4 7.5Z"/><path d="M16 14.5h.01"/></symbol>
<symbol id="ovg-wallet-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7.5A2.5 2.5 0 0 1 6.5 5H18v4M4 7.5V18a2 2 0 0 0 2 2h14V9H6.5A2.5 2.5 0 0 1 4 7.5Z"/><path d="M16 14.5h.01"/></symbol>
@@@ -1616,6 +1744,8 @@
<symbol id="ovg-weight-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5.5" r="2"/><path d="M7 9h10l3 11.5H4Z"/></symbol>
<symbol id="ovg-weight-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5.5" r="2"/><path d="M7 9h10l3 11.5H4Z"/></symbol>
<symbol id="ovg-weight-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5.5" r="2"/><path d="M7 9h10l3 11.5H4Z"/></symbol>
++<symbol id="ovg-weight-solid" viewBox="0 0 24 24" fill="currentColor"><circle cx="12" cy="5.2" r="2.6"/><path d="M6.6 9h10.8l3.3 12.1H3.3Z"/></symbol>
++<symbol id="ovg-weight-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><circle cx="12" cy="5.2" r="2.6"/><path d="M6.6 9h10.8l3.3 12.1H3.3Z"/></g><circle cx="12" cy="5.5" r="2"/><path d="M7 9h10l3 11.5H4Z"/></symbol>
<symbol id="ovg-wifi" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 9a14 14 0 0 1 19 0M5.5 12.5a9.5 9.5 0 0 1 13 0M8.5 16a5 5 0 0 1 7 0M12 19.5h.01"/></symbol>
<symbol id="ovg-wifi-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 9a14 14 0 0 1 19 0M5.5 12.5a9.5 9.5 0 0 1 13 0M8.5 16a5 5 0 0 1 7 0M12 19.5h.01"/></symbol>
<symbol id="ovg-wifi-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2.5 9a14 14 0 0 1 19 0M5.5 12.5a9.5 9.5 0 0 1 13 0M8.5 16a5 5 0 0 1 7 0M12 19.5h.01"/></symbol>
@@@ -1631,11 +1761,15 @@
<symbol id="ovg-window-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M3.5 9h17"/></symbol>
<symbol id="ovg-window-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M3.5 9h17"/></symbol>
<symbol id="ovg-window-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M3.5 9h17"/></symbol>
++<symbol id="ovg-window-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h18.2v7.5a2.6 2.6 0 0 1-2.6 2.6h-13a2.6 2.6 0 0 1-2.6-2.6Z"/></symbol>
++<symbol id="ovg-window-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.9 6.5a2.6 2.6 0 0 1 2.6-2.6h13a2.6 2.6 0 0 1 2.6 2.6v1.5H2.9ZM2.9 10h18.2v7.5a2.6 2.6 0 0 1-2.6 2.6h-13a2.6 2.6 0 0 1-2.6-2.6Z"/></g><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M3.5 9h17"/></symbol>
<symbol id="ovg-window-restore" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="8.5" width="12" height="11" rx="2"/><path d="M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"/></symbol>
<symbol id="ovg-window-restore-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="8.5" width="12" height="11" rx="2"/><path d="M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"/></symbol>
<symbol id="ovg-window-restore-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="8.5" width="12" height="11" rx="2"/><path d="M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"/></symbol>
<symbol id="ovg-window-restore-regular" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="8.5" width="12" height="11" rx="2"/><path d="M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"/></symbol>
<symbol id="ovg-window-restore-bold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3.5" y="8.5" width="12" height="11" rx="2"/><path d="M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"/></symbol>
++<symbol id="ovg-window-restore-solid" viewBox="0 0 24 24" fill="currentColor"><path d="M2.9 10.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-8a2.6 2.6 0 0 1-2.6-2.6ZM7.9 6.6V6.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-1.1v-5.6a3.9 3.9 0 0 0-3.9-3.9Z"/></symbol>
++<symbol id="ovg-window-restore-duotone" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><g fill="currentColor" stroke="none" opacity=".2"><path d="M2.9 10.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-8a2.6 2.6 0 0 1-2.6-2.6ZM7.9 6.6V6.5a2.6 2.6 0 0 1 2.6-2.6h8a2.6 2.6 0 0 1 2.6 2.6v7a2.6 2.6 0 0 1-2.6 2.6h-1.1v-5.6a3.9 3.9 0 0 0-3.9-3.9Z"/></g><rect x="3.5" y="8.5" width="12" height="11" rx="2"/><path d="M8.5 8.5v-2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"/></symbol>
<symbol id="ovg-wizard" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20h16M6.5 20 10 9.5 15.5 4 14 10.5 17.5 20"/><path d="M8.6 15.5h7"/></symbol>
<symbol id="ovg-wizard-thin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20h16M6.5 20 10 9.5 15.5 4 14 10.5 17.5 20"/><path d="M8.6 15.5h7"/></symbol>
<symbol id="ovg-wizard-light" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20h16M6.5 20 10 9.5 15.5 4 14 10.5 17.5 20"/><path d="M8.6 15.5h7"/></symbol>
ddiff --git a/ov-home.js b/ov-home.js
iindex 4a204d9..7ecd43e 100644
---- a/ov-home.js
++++ b/ov-home.js
@@@ -183,7 +183,6 @@ html[data-ov-motion=reduced] .ovh.is-edit .ovh-grid:not(.ovh-recent) .ovh-ic { a
.ovh-lives { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.ovh-lives a { display: inline-flex; align-items: center; gap: 6px; min-height: 36px; padding: 0 12px; border-radius: 999px; background: color-mix(in srgb, var(--live, #ef4444) 12%, transparent); color: inherit; text-decoration: none; font-size: 13px; font-weight: 650; }
.ovh-lives a::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--live, #ef4444); }
--@media (prefers-reduced-motion: reduce) { .ovh.is-edit .ovh-grid .ovh-ic { animation-name: ovh-wiggle-calm !important; } .ovh-chip.is-working .ovh-dot { animation: none !important; } }
/* You (11-09, the owner: "the U tab still sucks"): you on top, with Display and Settings beside your name; what you were
doing as a rail of cards; what you use most as one bar; then your home. */
@@@ -236,9 +235,7 @@ html[data-ov-motion=reduced] .ovh.is-edit .ovh-grid:not(.ovh-recent) .ovh-ic { a
@keyframes ovh-onair { 50% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--live, #ef4444) 55%, transparent), 0 0 18px color-mix(in srgb, var(--live, #ef4444) 35%, transparent); } }
/* Calm is gentle, not still (the owner, 11-09): shorter travel, slower breath. */
html[data-ov-motion=reduced] .ovh-card { animation-name: ovh-fade; animation-duration: .5s; }
--html[data-ov-motion=reduced] .ovh-card.is-live .ovh-ic { animation-duration: 4s; }
@keyframes ovh-fade { from { opacity: 0; } }
--@media (prefers-reduced-motion: reduce) { .ovh-card { animation-name: ovh-fade; } .ovh-use-bar > span { animation-duration: .4s; } }
/* The invitation, one compact row (11-09): mark, words, Set it up, and an × to put it away. */
.ovh-actor.is-invite { grid-template-columns: 44px minmax(0, 1fr) auto auto; grid-template-rows: auto auto; gap: 2px 10px; align-items: center; min-height: 0; padding: 10px 6px 12px 12px; }
.ovh-actor.is-invite .ovh-face { grid-row: 1 / 3; align-self: start; width: 44px; height: 44px; border-radius: 14px; }
@@@ -988,7 +985,8 @@ html[data-ov-motion=reduced] .ovh-card.is-live .ovh-ic { animation-duration: 4s;
return fetch(feedUrl(o, kind, cursor), { credentials: 'omit', headers: Object.assign({ Accept: 'application/json' }, signedIn(o) ? { Authorization: `Bearer ${o.token}` } : {}) })
.then((r) => (r.ok ? r.json() : null)).then((j) => (j && Array.isArray(j.items) ? j : null)).catch(() => null);
}
-- const still = () => { try { return matchMedia('(prefers-reduced-motion: reduce)').matches || document.documentElement.getAttribute('data-ov-motion') === 'reduced' || !!(navigator.connection && navigator.connection.saveData); } catch { return false; } };
++ // A preview is a video that starts by itself: Calm and Off both leave it to a tap (as does a data saver).
++ const still = () => { try { const m = document.documentElement.getAttribute('data-ov-motion'); return m === 'off' || m === 'reduced' || (!m && matchMedia('(prefers-reduced-motion: reduce)').matches) || !!(navigator.connection && navigator.connection.saveData); } catch { return false; } };
const count = (n) => { const v = Number(n) || 0; return v >= 1000 ? `${(v / 1000).toFixed(v >= 10000 ? 0 : 1)}k` : String(v); };
let player = null; // one IntersectionObserver plays the preview in view and pauses the rest
function watchPreview(box, c) {
@@@ -1305,7 +1303,6 @@ html[data-ov-motion=reduced] .ovh-card.is-live .ovh-ic { animation-duration: 4s;
.ovfd-skel{display:block;height:180px;border-radius:16px;background:linear-gradient(90deg,color-mix(in srgb,var(--text-primary,#e8ecf3) 5%,transparent) 0,color-mix(in srgb,var(--text-primary,#e8ecf3) 9%,transparent) 50%,color-mix(in srgb,var(--text-primary,#e8ecf3) 5%,transparent) 100%);background-size:200% 100%;animation:ovfd-shimmer 1.4s ease-in-out infinite}
.ovfd-more{min-height:1px}.ovfd-caught{text-align:center;padding:10px 0}
@keyframes ovfd-shimmer{to{background-position:-200% 0}}
--@media (prefers-reduced-motion:reduce){.ovfd-skel{animation:none}.ovfd-livechip{animation-duration:4s}}
`;
document.head.appendChild(st);
}
ddiff --git a/ov-icons.js b/ov-icons.js
iindex a3f8696..1690d9e 100644
---- a/ov-icons.js
++++ b/ov-icons.js
@@@ -22,7 +22,7 @@
* SVG and transform on the <svg> element only: no CSS transform ever touches an element inside the SVG
* (transform-box/transform-origin on SVG children left glyphs and whole icons unpainted on phones while
* scrolling), and hover effects apply only where a pointer can hover, so a thumb scrolling over a link
-- * starts nothing. Motion stops under prefers-reduced-motion. Unknown names fall back to the OV mark "V".
++ * starts nothing. Calm slows the loops; only motion off stops them. Unknown names fall back to the OV mark "V".
*/
(function (root) {
'use strict';
@@@ -117,6 +117,21 @@
fund: '<circle cx="15" cy="7.5" r="2.5"/>' + P('M3.5 14h3L10 12.5h4a1.5 1.5 0 0 1 0 3h-3M6.5 19l3-1.5H15l4.5-4a1.4 1.4 0 0 0-2-2l-3 2.5'),
paste: '<rect x="6" y="6" width="12" height="14" rx="1.8"/>' + P('M9.5 6V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1M9 11h6M9 14h6M9 17h3'),
account: '<circle cx="12" cy="9" r="3.2"/>' + P('M5.5 19a6.5 6.5 0 0 1 13 0'),
++ // 4.182.0: the products that had no mark of their own drew the fallback "V" in every site grid (Live's and
++ // Network's homes showed five of them), and so did a few things sites name as marks (a shoe, a heart, a
++ // calendar, a camera). Each has its glyph now.
++ computer: '<rect x="4.5" y="6" width="15" height="10" rx="1.8"/>' + P('M9.5 19h5M12 16v3'),
++ mail: '<rect x="4" y="6.5" width="16" height="11" rx="2"/>' + P('m5 8.5 7 5 7-5'),
++ lock: '<rect x="6.5" y="11" width="11" height="8" rx="1.8"/>' + P('M9 11V8.5a3 3 0 0 1 6 0V11'),
++ git: '<circle cx="7.5" cy="6.5" r="1.8"/><circle cx="7.5" cy="17.5" r="1.8"/><circle cx="16.5" cy="8.5" r="1.8"/>' + P('M7.5 8.3v7.4M16.5 10.3c0 4-5 3.2-8.2 6'),
++ barcode: P('M5.5 7.5v9M8.5 7.5v9M11 7.5v9M14 7.5v9M16 7.5v9M18.5 7.5v9'),
++ party: '<rect x="4.5" y="5.5" width="15" height="9.5" rx="1.8"/><circle cx="8.5" cy="18.3" r="1.3"/><circle cx="15.5" cy="18.3" r="1.3"/>' + P('M10.6 8.5v3.6l3.1-1.8z'),
++ studio: '<circle cx="15" cy="8" r="1.8"/><circle cx="9" cy="12" r="1.8"/><circle cx="16" cy="16" r="1.8"/>' + P('M5 8h8.2M16.8 8H19M5 12h2.2M10.8 12H19M5 16h9.2M17.8 16H19'),
++ home: P('M5 11.5 12 5.5l7 6M7 10.5V18h10v-7.5M10.5 18v-4h3v4'),
++ heart: P('M12 18.5s-6.5-4-6.5-9a3.6 3.6 0 0 1 6.5-2.2 3.6 3.6 0 0 1 6.5 2.2c0 5-6.5 9-6.5 9z'),
++ calendar: '<rect x="5" y="6.5" width="14" height="12.5" rx="2"/>' + P('M5 10.5h14M9 4.5v3.5M15 4.5v3.5'),
++ camera: '<circle cx="12" cy="13.5" r="2.8"/>' + P('M5 9h3l1.5-2.3h5L16 9h3v9.5H5z'),
++ shoe: P('M3.8 15.5v-4.8l3.5-.5 2.6-3.5 2.8 1.2-.8 2.3 3.5 1.9 4.1.9a1.8 1.8 0 0 1 1.3 1.7v.8zM3.8 18.2h17'),
bell: P('M6.5 16.5h11l-1.2-2V11a4.3 4.3 0 0 0-8.6 0v3.5zM10.5 19a1.6 1.6 0 0 0 3 0'),
history: '<circle cx="12" cy="12" r="7.5"/>' + P('M12 8v4.2l2.8 1.8'),
theme: P('M12 4.5a7.5 7.5 0 1 0 0 15c1 0 1.6-.8 1.2-1.7-.5-1.1.3-2.3 1.5-2.3h1.6a3.2 3.2 0 0 0 3.2-3.2C19.5 8 16.2 4.5 12 4.5z') + '<circle cx="8.5" cy="11" r=".7"/><circle cx="11.5" cy="8" r=".7"/><circle cx="15" cy="9" r=".7"/>',
@@@ -125,12 +140,14 @@
clip: P('M6 6l12 12M6 18L18 6') ,
};
// [dx, dy] in glyph units that move each glyph's drawn bounds onto the centre of the ring. Generated.
-- const OFFSETS = {"ov":[0,-0.5],"network":[0.56,-0.39],"live":[-0.01,-0.38],"tools":[0,-0.39],"media":[0,-0.39],"games":[0,-0.39],"community":[0,-0.39],"chat":[0,-0.39],"codes":[0,-0.39],"bot":[0,-0.39],"code":[0,-0.39],"blog":[0,-0.39],"wiki":[-0.01,-0.39],"news":[0,-0.39],"reviews":[-0.02,-0.39],"tips":[0,-0.39],"vip":[-0.01,-0.39],"trade":[0,-0.39],"host":[0,-0.39],"deals":[0.19,-0.21],"coupons":[-0.01,-0.39],"stream":[0,-0.39],"video":[-0.01,-0.39],"download":[0,-0.39],"upload":[0,-0.39],"image":[0,-0.39],"audio":[0,-0.38],"pdf":[0.28,-0.39],"docs":[0,-0.39],"text":[-0.01,-0.39],"logo":[-1.25,-0.5],"dns":[0,-0.39],"ip":[0,-0.37],"ssl":[-0.01,-0.39],"ping":[0,-0.39],"whois":[0,-0.39],"search":[0,-0.39],"map":[-0.01,-0.39],"food":[-0.01,-0.39],"gauge":[0,-0.39],"link":[0,-0.39],"shield":[0,-0.33],"plug":[0,-0.39],"work":[0,0.17],"rent":[0,-0.39],"help":[0,-0.39],"quest":[-0.01,-0.39],"inventory":[0,-0.37],"play":[0,-0.39],"drive":[0,-0.39],"services":[-0.01,-0.39],"space":[0,-0.39],"watch":[-0.02,-0.39],"actor":[0,-0.39],"events":[-0.01,-0.39],"ai":[0,-0.39],"run":[-0.01,-0.39],"billing":[0,-0.39],"feeds":[-0.01,-0.39],"pics":[-0.01,-0.39],"homes":[-0.01,-0.39],"website":[0,-0.39],"zone":[-0.01,-0.39],"fund":[-0.01,-0.39],"paste":[0,-0.39],"account":[-0.01,-0.39],"bell":[-0.01,-0.39],"history":[0,-0.39],"theme":[0,-0.39],"check":[-0.01,-0.39],"error":[0,-0.39],"clip":[0.13,-0.39]};
++ const OFFSETS = {"ov":[0,-0.5],"network":[0.56,-0.39],"live":[-0.01,-0.38],"tools":[0,-0.39],"media":[0,-0.39],"games":[0,-0.39],"community":[0,-0.39],"chat":[0,-0.39],"codes":[0,-0.39],"bot":[0,-0.39],"code":[0,-0.39],"blog":[0,-0.39],"wiki":[-0.01,-0.39],"news":[0,-0.39],"reviews":[-0.02,-0.39],"tips":[0,-0.39],"vip":[-0.01,-0.39],"trade":[0,-0.39],"host":[0,-0.39],"deals":[0.19,-0.21],"coupons":[-0.01,-0.39],"stream":[0,-0.39],"video":[-0.01,-0.39],"download":[0,-0.39],"upload":[0,-0.39],"image":[0,-0.39],"audio":[0,-0.38],"pdf":[0.28,-0.39],"docs":[0,-0.39],"text":[-0.01,-0.39],"logo":[-1.25,-0.5],"dns":[0,-0.39],"ip":[0,-0.37],"ssl":[-0.01,-0.39],"ping":[0,-0.39],"whois":[0,-0.39],"search":[0,-0.39],"map":[-0.01,-0.39],"food":[-0.01,-0.39],"gauge":[0,-0.39],"link":[0,-0.39],"shield":[0,-0.33],"plug":[0,-0.39],"work":[0,0.17],"rent":[0,-0.39],"help":[0,-0.39],"quest":[-0.01,-0.39],"inventory":[0,-0.37],"play":[0,-0.39],"drive":[0,-0.39],"services":[-0.01,-0.39],"space":[0,-0.39],"watch":[-0.02,-0.39],"actor":[0,-0.39],"events":[-0.01,-0.39],"ai":[0,-0.39],"run":[-0.01,-0.39],"billing":[0,-0.39],"feeds":[-0.01,-0.39],"pics":[-0.01,-0.39],"homes":[-0.01,-0.39],"website":[0,-0.39],"zone":[-0.01,-0.39],"fund":[-0.01,-0.39],"paste":[0,-0.39],"account":[-0.01,-0.39],"bell":[-0.01,-0.39],"history":[0,-0.39],"theme":[0,-0.39],"check":[-0.01,-0.39],"error":[0,-0.39],"clip":[0.13,-0.39],"computer":[0,-0.5],"mail":[0,0],"lock":[0,-0.25],"git":[0,0],"barcode":[0,0],"party":[0,-0.55],"studio":[0,0],"home":[0,0.25],"heart":[0,-0.17],"calendar":[0,0.25],"camera":[0,-0.6],"shoe":[-0.3,-0.45]};
const ALIASES = { yt: 'youtube', net: 'dns', dev: 'code', img: 'image', sound: 'audio', document: 'pdf', pastes: 'paste', openre: 'stream', maps: 'map', user: 'account', notifications: 'bell', 'media-hub': 'drive', mediahub: 'drive', sources: 'feeds', agent: 'actor', jobs: 'work', homes: 'homes', page: 'docs', db: 'zone', database: 'zone', location: 'ip', gamepad: 'games', robot: 'bot', deploy: 'upload', copy: 'paste', activity: 'ping',
// The 2026-10-28 rooms, on the nearest glyph until each has its own (rooms.js): never the fallback mark.
domains: 'dns', design: 'theme', today: 'history', report: 'gauge', surf: 'games', casino: 'games', fun: 'quest', meme: 'image', exchange: 'trade', cam: 'video', tours: 'map', vision: 'ai', shoes: 'deals',
// OpenVibe Connect (Website Connect v0, 2026-11-02): a port on your machine, on the web.
-- connect: 'plug' };
++ connect: 'plug',
++ // 4.182.0: other names the same products go by.
++ my: 'account', locker: 'lock', email: 'mail', restream: 'stream', node: 'link', desktop: 'computer' };
const registry = Object.create(null);
for (const [k, g] of Object.entries(GLYPHS)) registry[k] = { glyph: g };
@@@ -169,7 +186,7 @@
@keyframes oviBounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-6%)}}
@keyframes oviPop{0%{transform:scale(.8)}60%{transform:scale(1.12)}100%{transform:scale(1)}}
@keyframes oviShake{0%,100%{transform:translateX(0)}25%{transform:translateX(-6%)}75%{transform:translateX(6%)}}
--@media (prefers-reduced-motion:reduce){.ov-icon *, .ov-icon svg{animation:none!important;transition:none!important}.ov-icon .ovi-comet{display:none}}`;
++html[data-ov-motion=off] .ov-icon .ovi-comet{display:none}`;
// BEGIN generated solid glyphs (scripts/build-nav-icons.py)
// Font Awesome Free 6 solid glyphs (CC BY 4.0) for the ring icons; viewBox 0 0 <w> 512.
ddiff --git a/ov-labels.js b/ov-labels.js
iindex c354432..590a41b 100644
---- a/ov-labels.js
++++ b/ov-labels.js
@@@ -37,7 +37,7 @@
.ov-labels-gate span{display:inline-flex;align-items:center;min-height:36px;padding:0 16px;border-radius:999px;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.28)}
.ov-labels-gate:hover span,.ov-labels-gate:focus-visible span{background:rgba(255,255,255,.26)}
.ov-labels-gate:focus-visible{outline:2px solid var(--accent,#60a5fa);outline-offset:-4px}
--@media (prefers-reduced-motion:reduce){.ov-labels-cover>:not(.ov-labels-gate){transform:none}}`;
++html[data-ov-motion=off] .ov-labels-cover>:not(.ov-labels-gate){transform:none}`;
function injectCSS() {
if (document.getElementById('ov-labels-css')) return;
ddiff --git a/ov-locker.css b/ov-locker.css
iindex e50199a..14df460 100644
---- a/ov-locker.css
++++ b/ov-locker.css
@@@ -116,10 +116,6 @@ html.ovl-locked, html.ovl-locked body { overflow: hidden; }
.ovl-card .ovl-form { width: 100%; max-width: 340px; text-align: start; }
.ovl-card .ovl-btn.is-primary { width: 100%; }
--@media (prefers-reduced-motion: reduce) {
-- .ovl-sheet, .ovl-btn, .ovl-inputrow, .ovl-meterbar::after { transition: none !important; }
-- .ovl-done .ovl-ico.is-big { animation: none; }
--}
@media (forced-colors: active) { .ovl-sheet, .ovl-card { border: 1px solid CanvasText; } }
/* The one-time recovery kit is the only printed content. */
ddiff --git a/ov-locker.js b/ov-locker.js
iindex 544a004..90798f3 100644
---- a/ov-locker.js
++++ b/ov-locker.js
@@@ -50,7 +50,8 @@
return n;
};
const icon = (name, cls) => { const s = el('span', cls || 'ovl-ico'); s.innerHTML = ICON[name]; return s; }; // constants only
-- const reduce = () => !!(root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches);
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduce = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
const b64 = (u8) => { let s = ''; for (let i = 0; i < u8.length; i++) s += String.fromCharCode(u8[i]); return root.btoa(s); };
const unb64 = (s) => Uint8Array.from(root.atob(String(s)), (c) => c.charCodeAt(0));
const unb64url = (s) => unb64(String(s).replace(/-/g, '+').replace(/_/g, '/') + '==='.slice((String(s).length + 3) % 4));
ddiff --git a/ov-look.js b/ov-look.js
iindex 977e131..aa3e486 100644
---- a/ov-look.js
++++ b/ov-look.js
@@@ -42,7 +42,7 @@
+ '.ovlk .ovlk-seg button[aria-checked=true]{background:var(--accent-strong,var(--accent,#3472d8));color:var(--on-accent-strong,#fff)}'
+ '.ovlk .ovlk-seg button:focus-visible{outline:2px solid var(--accent,#3b82f6);outline-offset:1px}'
+ '.ovlk-seg svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.ovlk-seg svg.is-solid{fill:currentColor;stroke:none}'
-- + '@media (prefers-reduced-motion:reduce){.ovlk-switch::after{transition:none}}';
++ + '';
function css() {
if (document.getElementById('ov-look-css')) return;
@@@ -102,7 +102,8 @@
[['light', 'Light'], ['dark', 'Dark'], ['auto', 'Auto']].map(([v, t]) => el('button', { type: 'button', role: 'radio', 'aria-checked': String(sch === v), 'data-look-scheme': v }, [t])))]));
}
panel.append(row('text', 'Text size', [[100, 'Default'], [112, 'Large'], [125, 'Largest']]));
-- panel.append(row('motion', 'Motion', [['auto', 'Animated'], ['reduced', 'Calm']]));
++ // Motion (4.183.0): Auto follows the device; Calm keeps every effect, smaller and slower; only Off stops them.
++ panel.append(row('motion', 'Motion', [['auto', 'Auto'], ['full', 'Full'], ['reduced', 'Calm'], ['off', 'Off']]));
}
const signedIn = opts.signedIn != null ? !!opts.signedIn : /(?:^|; )ov_sso_hint=account/.test(document.cookie || '') || !!(root.localStorage && (() => { try { return root.localStorage.getItem('ov_token'); } catch (e) { return null; } })());
const named = showing ? showing.name : ((PICKS.find(([id]) => id === cur) || [0, cur])[1]);
ddiff --git a/ov-mark.js b/ov-mark.js
iindex 77787cd..74d198b 100644
---- a/ov-mark.js
++++ b/ov-mark.js
@@@ -36,13 +36,16 @@
* visit, from the first time a mark is on screen in this tab; later pages of a multi-page site open with the mark at
* rest), while it or its link is hovered or focused (and LINGER_MS after), and while it shows a state, a page load or
* progress. Otherwise its CSS animations are paused where they are. It never moves while the page is hidden, while it
-- * is off-screen (IntersectionObserver), with data-static, under prefers-reduced-motion or under the network's own
-- * reduced-motion setting (html[data-ov-motion=reduced], theme-loader.js); its colours and shapes still change.
++ * is off-screen (IntersectionObserver), with data-static, or with motion off (html[data-ov-motion=off],
++ * theme-loader.js); its colours and shapes still change. Calm (html[data-ov-motion=reduced]: the person's choice, or
++ * the device asking for less motion) keeps the intro, the hover and every state, drops the linger after a hover and
++ * lets fewer leaves fall a shorter way.
*
* The season (theme-loader.js sets <html data-ov-season-mark="halloween|winter"> for anyone who has not turned seasonal
* themes off, on any theme): the mark wears it, the O a pumpkin with its stem and leaf in October, caps of snow in
* December. Now and then (every 4 to 8 minutes) a mark on screen flickers for a moment, and on the first visit of the
-- * day a few leaves (snowflakes in December) drift down from the first mark seen. Never under either reduced-motion setting.
++ * day a few leaves (snowflakes in December) drift down from the first mark seen: seven in full, three under Calm, none
++ * with motion off.
*/
(function () {
'use strict';
@@@ -186,8 +189,7 @@ html[data-ov-season-mark=winter] .ovm-fall i{width:6px;height:6px;border-radius:
@keyframes ovmWiggle{0%,100%{transform:none}25%{transform:rotate(-18deg)}60%{transform:rotate(12deg)}}
@keyframes ovmTwinkle{0%,100%{opacity:1}50%{opacity:.3}}
@keyframes ovmFall{0%{opacity:0;transform:none}12%{opacity:1}72%{opacity:1;transform:translate(var(--x),var(--y)) rotate(var(--r))}100%{opacity:0;transform:translate(var(--x),var(--y)) rotate(var(--r))}}
--@media (prefers-reduced-motion:reduce){.ov-mark:not([data-fx-demo] *) *{animation-iteration-count:1!important}.ov-mark:not([data-fx-demo] *)::before{transition:none!important}.ovm-fall{display:none}}
--html[data-ov-motion=reduced] .ov-mark:not([data-fx-demo] *) *{animation-iteration-count:1!important}
++html[data-ov-motion=off] .ov-mark:not([data-fx-demo] *) *{animation-iteration-count:1!important}html[data-ov-motion=off] .ovm-fall{display:none}
.ov-busy{cursor:progress;pointer-events:none}
.ov-busy-mark{display:inline-block;vertical-align:-.2em;margin-right:.45em;flex:none}
`;
@@@ -252,23 +254,28 @@ html[data-ov-motion=reduced] .ov-mark:not([data-fx-demo] *) *{animation-iteratio
return end;
}
// Inside [data-fx-demo] (ov-fx.js: a motion page's own container, set when the person asks) a mark plays in full.
-- function reduced(el) {
-- if (el && el.closest && el.closest('[data-fx-demo]')) return false;
-- return !!(rm && rm.matches) || document.documentElement.getAttribute('data-ov-motion') === 'reduced';
++ // 'full' | 'calm' | 'off': <html data-ov-motion> is the signal (theme-loader.js, the device's setting counted in);
++ // a page without the loader asks the device.
++ function motion(el) {
++ if (el && el.closest && el.closest('[data-fx-demo]')) return 'full';
++ const m = document.documentElement.getAttribute('data-ov-motion');
++ if (m === 'off') return 'off';
++ return m === 'reduced' || (!m && rm && rm.matches) ? 'calm' : 'full';
}
++ const off = (el) => motion(el) === 'off';
function update(el) {
const st = state.get(el); if (!st) return;
const svgEl = el.querySelector('svg');
if (!el.isConnected || !svgEl) { forget(el); return; }
const now = Date.now();
-- // Calm (the Motion setting, or the device asking for less) is gentle, not still: a state still animates, once.
const may = !el.hasAttribute('data-static') && !document.hidden && st.onScreen === true;
-- if (may && !reduced(el) && !st.introEnd) { st.introEnd = introDeadline(now); if (season()) setTimeout(() => fallOnce(el), 900); }
++ if (may && !off(el) && !st.introEnd) { st.introEnd = introDeadline(now); if (season()) setTimeout(() => fallOnce(el), 900); }
const s = el.getAttribute('data-state');
// Anything the mark is showing keeps it moving: a state, a page on its way, a known progress.
const showing = (s && s !== 'idle') || el.hasAttribute('data-nav') || el.hasAttribute('data-progress');
const intro = now < st.introEnd;
-- const run = may && (showing || (!reduced(el) && (intro || st.hover || st.focus || now < st.lingerEnd)));
++ // Calm plays the intro and answers a hover or focus, and rests as soon as that ends (no linger).
++ const run = may && (showing || (!off(el) && (intro || st.hover || st.focus || (motion(el) === 'full' && now < st.lingerEnd))));
if (run !== el.hasAttribute('data-ovm-run')) { if (run) el.setAttribute('data-ovm-run', ''); else el.removeAttribute('data-ovm-run'); }
// The intro's pop and growth are on only inside the intro (paused with the rest while the mark cannot move).
if ((may && intro) !== el.hasAttribute('data-ovm-intro') && (may || !intro)) { if (may && intro) el.setAttribute('data-ovm-intro', ''); else el.removeAttribute('data-ovm-intro'); }
@@@ -295,7 +302,7 @@ html[data-ov-motion=reduced] .ov-mark:not([data-fx-demo] *) *{animation-iteratio
clearTimeout(flourishTimer); flourishTimer = 0;
if (!season()) return;
flourishTimer = setTimeout(() => {
-- if (season() && !reduced() && !document.hidden) {
++ if (season() && !off() && !document.hidden) {
document.querySelectorAll('.ov-mark[data-ov]:not([data-static])').forEach((el) => {
const st = state.get(el); if (!st || st.onScreen === false) return;
el.setAttribute('data-ovm-flourish', ''); setTimeout(() => el.removeAttribute('data-ovm-flourish'), 1700);
@@@ -306,7 +313,8 @@ html[data-ov-motion=reduced] .ov-mark:not([data-fx-demo] *) *{animation-iteratio
}
const FALL_KEY = 'ov-season-fall';
function fallOnce(el) {
-- const id = season(); if (!id || reduced() || document.hidden || !el.isConnected) return;
++ const id = season(); if (!id || off() || document.hidden || !el.isConnected) return;
++ const calm = motion() === 'calm';
const day = id + ':' + new Date().toDateString();
try { const ls = window.localStorage; if (ls.getItem(FALL_KEY) === day) return; ls.setItem(FALL_KEY, day); } catch { return; }
const r = el.getBoundingClientRect(); if (!r.width || !document.body) return;
@@@ -319,11 +327,11 @@ html[data-ov-motion=reduced] .ov-mark:not([data-fx-demo] *) *{animation-iteratio
const rb = bar && bar.getBoundingClientRect();
const floor = rb && rb.bottom > y0 + 8 ? rb.bottom - y0 - 4 : 0;
const colors = id === 'winter' ? ['#f4fbff', '#d8f3ff', '#ffffff'] : ['#ff7a1a', '#f5a524', '#d9481f', '#7fd04e'];
-- for (let i = 0; i < 7; i++) {
++ for (let i = 0; i < (calm ? 3 : 7); i++) {
const s = document.createElement('i');
-- const dx = Math.max(8 - x0, Math.min((window.innerWidth || 0) - 8 - x0, Math.round((Math.random() - 0.3) * 200)));
++ const dx = Math.max(8 - x0, Math.min((window.innerWidth || 0) - 8 - x0, Math.round((Math.random() - 0.3) * (calm ? 70 : 200))));
const dy = floor ? Math.round(floor - Math.random() * 3) : Math.round(36 + Math.random() * 28);
-- s.style.cssText = `--x:${dx}px;--y:${dy}px;--r:${Math.round(Math.random() * 540 - 270)}deg;animation-delay:${(i * 0.18 + Math.random() * 0.2).toFixed(2)}s;animation-duration:${(2.4 + Math.random() * 1.2).toFixed(2)}s;background:${colors[i % colors.length]}`;
++ s.style.cssText = `--x:${dx}px;--y:${dy}px;--r:${Math.round((Math.random() * 540 - 270) * (calm ? 0.35 : 1))}deg;animation-delay:${(i * 0.18 + Math.random() * 0.2).toFixed(2)}s;animation-duration:${(2.4 + Math.random() * 1.2).toFixed(2)}s;background:${colors[i % colors.length]}`;
box.appendChild(s);
}
document.body.appendChild(box);
ddiff --git a/ov-share.css b/ov-share.css
iindex 2885f6e..0710e6a 100644
---- a/ov-share.css
++++ b/ov-share.css
@@@ -358,10 +358,6 @@ html.ov-share-locked, html.ov-share-locked body { overflow: hidden; overscroll-b
.ov-share-copybuf { position: fixed; top: 0; left: 0; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
--@media (prefers-reduced-motion: reduce) {
-- .ov-share, .ov-share-btn, .ov-share-segopt, .ov-share-addfield, .ov-share-radio, .ov-share-tile, .ov-share-tileic, .ov-share-device, .ov-share-toast, .ov-share-linkpill { transition: none !important; }
-- .ov-share *, .ov-share-box.is-first * { animation: none !important; }
--}
@media (forced-colors: active) {
.ov-share { border: 1px solid CanvasText; }
.ov-share-segopt:has(input:checked), .ov-share-radio:has(input:checked) { outline: 2px solid Highlight; }
ddiff --git a/ov-share.js b/ov-share.js
iindex 1390fb9..4f0930f 100644
---- a/ov-share.js
++++ b/ov-share.js
@@@ -103,7 +103,8 @@
return n;
};
const iconEl = (name, cls) => { const s = el('span', cls || 'ov-share-ico'); s.innerHTML = ICON[name]; return s; }; // constants only
-- const reduce = () => !!(root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches);
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduce = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
const cleanName = (s) => String(s || '').trim().replace(/^@+/, '');
const sid = (s) => (!s ? '' : typeof s === 'string' ? s : `${s.type}:${s.id}`);
const same = (a, b) => !!a && !!b && sid(a) === sid(b);
ddiff --git a/ov-thread.js b/ov-thread.js
iindex 68879a9..0f68c96 100644
---- a/ov-thread.js
++++ b/ov-thread.js
@@@ -21,7 +21,8 @@
'use strict';
if (root.OVThread) return;
var fine = root.matchMedia && root.matchMedia('(hover: hover) and (pointer: fine)').matches;
-- var reduce = root.matchMedia && root.matchMedia('(prefers-reduced-motion: reduce)').matches;
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ var reduce = document.documentElement.getAttribute('data-ov-motion') === 'off';
var canCopy = !!(root.navigator && navigator.clipboard && navigator.clipboard.writeText);
function q(el, sel) { return el ? el.querySelector(sel) : null; }
ddiff --git a/ov-upload.css b/ov-upload.css
iindex e66d89e..b69e7a1 100644
---- a/ov-upload.css
++++ b/ov-upload.css
@@@ -60,5 +60,4 @@
@keyframes ov-upload-in { from { opacity: 0; transform: translateY(6px); } }
@keyframes ov-upload-bob { 50% { transform: translateY(-3px); } }
@media (pointer: coarse), (max-width: 700px) { .ov-upload__picker { min-height: 120px; } .ov-upload__drop { display: none; } }
--html[data-ov-motion=reduced] .ov-progress[data-state="sending"] .ov-progress__fill::after { animation: none; }
--@media (prefers-reduced-motion: reduce) { .ov-progress__fill, .ov-progress[data-state="processing"] .ov-progress__fill, .ov-progress[data-state="done"] .ov-progress__percent, .ov-progress__check path, .ov-upload__row, .ov-upload.is-dragging .ov-upload__icon { transition: none; animation: none; } .ov-progress__check path { stroke-dashoffset: 0; } .ov-progress[data-state="sending"] .ov-progress__fill::after { display: none; } }
++html[data-ov-motion=off] .ov-progress__check path{stroke-dashoffset: 0}html[data-ov-motion=off] .ov-progress[data-state="sending"] .ov-progress__fill::after{display: none}
ddiff --git a/overlay.js b/overlay.js
iindex 3c0f0c6..2ba03f0 100644
---- a/overlay.js
++++ b/overlay.js
@@@ -38,7 +38,8 @@
const declared = new Map(); // id → descriptor (drawn by the page itself)
let styleEl = null, clicksWired = false;
-- const reduced = () => { try { return root.matchMedia('(prefers-reduced-motion: reduce)').matches; } catch { return false; } };
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduced = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
const phone = () => { try { return root.matchMedia('(max-width: 759px)').matches; } catch { return false; } };
const fine = () => { try { return root.matchMedia('(hover: hover) and (pointer: fine)').matches; } catch { return false; } };
@@@ -122,7 +123,7 @@
.ovo-side-h .ovo-b{background:transparent;color:inherit;width:30px;height:30px}
.ovo-side-h .ovo-b:hover{background:rgba(127,127,127,.18)}
.ovo-side iframe{flex:1;width:100%;border:0;background:transparent}
--@media (prefers-reduced-motion:reduce){.ovo-card.is-settling,.ovo-side{transition:none}.ovo-card.is-entering{transform:translate3d(var(--ovo-x,0px),var(--ovo-y,0px),0)}}
++html[data-ov-motion=off] .ovo-card.is-entering{transform:translate3d(var(--ovo-x,0px),var(--ovo-y,0px),0)}
`;
(document.head || document.documentElement).appendChild(styleEl);
}
ddiff --git a/package-lock.json b/package-lock.json
iindex 12f2442..9aaf899 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -1,12 +1,12 @@
{
"name": "openvibe-shared",
-- "version": "4.181.0",
++ "version": "4.183.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "openvibe-shared",
-- "version": "4.181.0",
++ "version": "4.183.0",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0",
ddiff --git a/package.json b/package.json
iindex fdb35d6..e31176f 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-shared",
-- "version": "4.181.0",
++ "version": "4.183.0",
"description": "Shared navbar, footer, themes, icons, legal pages, SEO, auth and analytics for every OpenVibe site",
"main": "index.js",
"bin": {
ddiff --git a/player.css b/player.css
iindex f3dd1d8..f1bcb87 100644
---- a/player.css
++++ b/player.css
@@@ -186,7 +186,7 @@
@keyframes ov-player-hop { 0%, 80%, 100% { transform: translateY(0); opacity: .45; } 40% { transform: translateY(-5px); opacity: 1; } }
.ov-player-spinner { position: absolute; left: 50%; top: 50%; z-index: 2; margin: -4px 0 0 -4px; display: none; filter: drop-shadow(0 1px 6px rgba(0, 0, 0, .5)); }
.ov-player.is-waiting:not(.is-paused) .ov-player-spinner { display: block; }
--@media (prefers-reduced-motion: reduce) { .ov-player-spinner, .ov-player-spinner::before, .ov-player-spinner::after { animation: none; opacity: .8; } .ov-player-bar, .ov-player-video, .ov-player-poster, .ov-player-flash, .ov-player-ad-line { transition: none; } .ov-player-unmute { animation: none; } }
++html[data-ov-motion=off] .ov-player-spinner,html[data-ov-motion=off] .ov-player-spinner::before,html[data-ov-motion=off] .ov-player-spinner::after{opacity: .8}
/* Touch screens: the slider shows, finger-sized, wherever the page can set the volume (.can-volume: Android). An iPhone
leaves volume to its own buttons, so there the mute button stays alone. */
@media (hover: none) {
ddiff --git a/player.js b/player.js
iindex 2538d40..359d6d7 100644
---- a/player.js
++++ b/player.js
@@@ -167,7 +167,7 @@
* on screen, blurred and crossfaded by player.css. A cross-origin video taints a canvas, which can still be shown.
*/
function glow(root, video) {
-- const reduce = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;
++ const reduce = document.documentElement.getAttribute('data-ov-motion') === 'off'; // a slow colour fade moves nothing: Calm keeps it
const saver = typeof navigator !== 'undefined' && navigator.connection && navigator.connection.saveData;
const probe = document.createElement('canvas');
if (reduce || saver || typeof probe.getContext !== 'function' || !probe.getContext('2d')) return null;
ddiff --git a/presence.js b/presence.js
iindex 24d755f..05b94e0 100644
---- a/presence.js
++++ b/presence.js
@@@ -86,7 +86,7 @@
.ovp-pop::before { content: ""; justify-self: center; width: 40px; height: 4px; border-radius: 99px; background: color-mix(in srgb, var(--text-primary, #fff) 25%, transparent); }
.ovp-opt { min-height: 56px; }
}
-- @media (prefers-reduced-motion: reduce) { .ovp-scrim, .ovp-pop { animation: none; } }`;
++ `;
document.head.appendChild(s);
}
ddiff --git a/room.css b/room.css
iindex 3f88314..c7d29d4 100644
---- a/room.css
++++ b/room.css
@@@ -175,8 +175,6 @@
.ovk-rail--wrap.ovk-rail--l { --ovk-rail-min: 320px; }
.ovk-rail--wrap .ovk-rail-btn { display: none; }
}
--@media (prefers-reduced-motion: reduce) { .ovk-card-media > img, .ovk-card-peek, .ovk-card-video { transition: none; } .ovk-card-badge.is-live::before { animation: none; } }
--html[data-ov-motion=reduced] .ovk-card-badge.is-live::before { animation: none; }
/* ── sc.room(): a room's front door (moved from showcase.css in 4.29.2, so product homes that never draw a room do not
* load it) ── */
@@@ -226,7 +224,7 @@ html[data-ov-motion=reduced] .ovk-card-badge.is-live::before { animation: none;
.sc-scene-stage{position:relative;min-width:0;border-radius:20px;padding:clamp(14px,2.4vw,24px);background:radial-gradient(120% 80% at 85% 0%,color-mix(in srgb,var(--room-accent,#3b82f6) 16%,transparent),transparent 62%),var(--bg-card,#0f1729);border:1px solid var(--border,#1f2d47);box-shadow:0 30px 60px -32px rgba(0,0,0,.55);overflow:hidden}
.sc-room-devlinks{margin:12px 0 0;font-size:.9rem;color:var(--text-muted,#7386a3)}
.sc-room-devlinks a{color:var(--room-strong,#60a5fa);font-weight:700}
--html.ov-motion [data-ov-reveal]{opacity:0;transform:translateY(18px);transition:opacity .6s cubic-bezier(.2,.7,.2,1),transform .6s cubic-bezier(.2,.7,.2,1)}
++html.ov-motion [data-ov-reveal]{opacity:0;transform:translateY(calc(18px * var(--ov-move,1)));transition:opacity .6s cubic-bezier(.2,.7,.2,1),transform .6s cubic-bezier(.2,.7,.2,1)}
html.ov-motion [data-ov-reveal].is-in{opacity:1;transform:none}
@media (max-width:759px){
.sc-room-hero{grid-template-columns:minmax(0,1fr);margin-inline:-16px;padding-inline:16px;overflow-x:clip}
@@@ -238,9 +236,7 @@ html.ov-motion [data-ov-reveal].is-in{opacity:1;transform:none}
.sc-scene,.sc-scene.is-flip{grid-template-columns:minmax(0,1fr)}.sc-scene.is-flip .sc-scene-text{order:0}
}
@media (max-width:599px){.sc-room-chips{flex-wrap:nowrap;overflow-x:auto;margin-inline:-16px;padding:2px 16px;scrollbar-width:none}.sc-room-chips::-webkit-scrollbar{display:none}.sc-room-box input{height:52px;padding-left:18px}}
--@media (prefers-reduced-motion:reduce){.sc-rm-glow,.sc-rm-orbit,.sc-room-live::before{animation:none}html.ov-motion [data-ov-reveal]{opacity:1;transform:none;transition:none}}
--html[data-ov-motion=reduced] .sc-rm-glow,html[data-ov-motion=reduced] .sc-rm-orbit,html[data-ov-motion=reduced] .sc-room-live::before{animation:none}
--html[data-ov-motion=reduced].ov-motion [data-ov-reveal]{opacity:1;transform:none;transition:none}
++html[data-ov-motion=off].ov-motion [data-ov-reveal]{opacity:1;transform:none}
/* Sideways strips say they scroll (kit-web.js sets the classes): the edge fades where more is hidden. */
:where(.ovk-rail-track, [data-ovk-scroll]) { --ovk-fade: 28px; }
@@@ -252,4 +248,3 @@ html[data-ov-motion=reduced].ov-motion [data-ov-reveal]{opacity:1;transform:none
.ovk-scroll-bar { display: block; width: 56px; height: 4px; margin: 10px auto 0; border-radius: 4px; background: color-mix(in srgb, var(--text-primary, #e6edf7) 12%, transparent); overflow: hidden; }
.ovk-scroll-bar[hidden] { display: none; }
.ovk-scroll-bar > i { display: block; height: 100%; border-radius: 4px; background: var(--accent, #3b82f6); transition: transform .12s linear; }
--@media (prefers-reduced-motion: reduce) { .ovk-scroll-bar > i { transition: none; } }
ddiff --git a/route-transition.js b/route-transition.js
iindex 76ad8ec..82e0033 100644
---- a/route-transition.js
++++ b/route-transition.js
@@@ -24,7 +24,7 @@
@keyframes ovrtEnter{from{opacity:0}to{opacity:1}}
@keyframes ovrtIn{from{opacity:0}to{opacity:1}}
@keyframes ovrtSlide{from{transform:translateX(-100%)}to{transform:translateX(265%)}}
--@media (prefers-reduced-motion:reduce){.ovrt-enter,.ovrt-wait,.ovrt-wait i::after{animation:none}.ovrt-bar.is-run,.ovrt-bar.is-done{transition:none}.ovrt-bar::after{display:none}}`;
++html[data-ov-motion=off] .ovrt-bar::after{display:none}`;
const st = document.createElement('style');
st.id = 'ovrt-css';
st.textContent = css;
@@@ -37,7 +37,8 @@
if (state === 'run') { barEl.classList.remove('is-done', 'is-run'); void barEl.offsetWidth; barEl.classList.add('is-run'); }
else { barEl.classList.add('is-done'); barTimer = root.setTimeout(() => barEl.classList.remove('is-run', 'is-done'), 600); }
}
-- const reduced = () => { try { return root.matchMedia('(prefers-reduced-motion: reduce)').matches; } catch { return false; } };
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const reduced = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
const PHASES = { styles: 'applying styles', code: 'starting up' };
function start(section, { label, prefix = 'ov' } = {}) {
ddiff --git a/scripts/build-glyphs.js b/scripts/build-glyphs.js
iindex dd57f21..d78c4a1 100644
---- a/scripts/build-glyphs.js
++++ b/scripts/build-glyphs.js
@@@ -90,7 +90,7 @@ const CSS = [
'.ovg[data-ovg=busy] circle:nth-child(2){animation-delay:.15s}.ovg[data-ovg=busy] circle:nth-child(3){animation-delay:.3s}',
'@keyframes ovgHop{0%,60%,100%{transform:translateY(0);opacity:.55}30%{transform:translateY(-3px);opacity:1}}',
// Reduced motion: nothing moves.
-- '@media (prefers-reduced-motion:reduce){.ovg,.ovg[data-ovg=busy] circle,.ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}}html[data-ov-motion=reduced] .ovg,html[data-ov-motion=reduced] .ovg[data-ovg=busy] circle,html[data-ov-motion=reduced] .ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}',
++ 'html[data-ov-motion=off] .ovg,html[data-ov-motion=off] .ovg[data-ovg=busy] circle,html[data-ov-motion=off] .ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}',
].join('');
const brands = require('../brands');
ddiff --git a/search.js b/search.js
iindex c5735d8..8149b13 100644
---- a/search.js
++++ b/search.js
@@@ -325,7 +325,6 @@
@media (hover: hover) { .ovs-app:hover, .ovs-link:hover, .ovs-live:hover, .ovs-fold:hover { background: var(--bg-hover, rgba(255,255,255,.07)); color: inherit; } .ovs-app:hover .ovs-appic { transform: translateY(-2px); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent, #3b82f6) 45%, transparent); } }
@media (max-width: 640px) { .ovs-apps { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (pointer: coarse) { .ovs-chip { height: 44px; } .ovs-group button, .ovs-group .ovs-more { min-height: 44px; display: inline-flex; align-items: center; } }
--@media (prefers-reduced-motion: reduce) { .ovs-livedot { animation: none; } .ovs .ovs-appic { transition: none; } }
.ovs-foot { display: flex; gap: 14px; padding: 8px 16px; border-top: 1px solid var(--border, rgba(255,255,255,.1)); font-size: 11.5px; color: var(--text-muted, #93a0b4); }
.ovs-foot kbd { font: inherit; font-weight: 700; padding: 1px 5px; border-radius: 5px; border: 1px solid var(--border, rgba(255,255,255,.14)); }
.ovs-busy .ovs-bar { background-image: linear-gradient(90deg, transparent, color-mix(in srgb, var(--accent, #3b82f6) 40%, transparent), transparent); background-size: 40% 2px; background-repeat: no-repeat; background-position: -40% 100%; animation: ovs-scan 1s linear infinite; }
@@@ -387,7 +386,7 @@
.ovs-orb.is-x .ovo-g { transform: rotate(180deg) scale(.95); }
.ovs-orb.is-x .ovo-r1 { opacity: 0; transform: scale(0); }
.ovs-orb.is-x :is(.ovo-r0, .ovo-r2) { fill: var(--ovo-a); opacity: 1; transform: scale(1.12); }
--@media (prefers-reduced-motion: reduce) { .ovs.is-open, .ovs-busy .ovs-bar, .ovs.ovs-anchored .ovs-panel, .ovs-skel, .ovs-list > li { animation: none; } .ovs-orb, .ovs-orb .ovo-g, .ovs-orb .ovo-d { transition: none !important; } }`;
++`;
document.head.appendChild(st);
}
@@@ -408,7 +407,8 @@
const orbSvg = () => `<svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true"><g class="ovo-g">${ORB_DOTS.map(([x, y, r]) => `<circle class="ovo-d ovo-r${r}" cx="${x}" cy="${y}" r="${r ? 2.15 : 2.5}"/>`).join('')}</g></svg>`;
let orbEl = null, closing = 0;
const phoneSheet = () => { try { return !!(el && el.classList.contains('ovs-anchored') && root.matchMedia('(max-width: 640px)').matches); } catch { return false; } };
-- const calm = () => { try { return root.matchMedia('(prefers-reduced-motion: reduce)').matches || document.documentElement.getAttribute('data-ov-motion') === 'reduced'; } catch { return false; } };
++ // Motion off (html[data-ov-motion=off], theme-loader.js) is the only setting that skips an effect; Calm plays it.
++ const calm = () => document.documentElement.getAttribute('data-ov-motion') === 'off';
function build() {
styles();
ddiff --git a/showcase-stage.js b/showcase-stage.js
iindex 740633e..f30e308 100644
---- a/showcase-stage.js
++++ b/showcase-stage.js
@@@ -15,8 +15,8 @@
* Everything is server-rendered HTML with the real words and numbers in it (crawlers and no-JavaScript readers get the
* whole page); the motion only adds. `demo` is the site's own HTML (trusted: the site renders it from its data). Motion is
* opacity, stroke-dash and transforms on HTML elements or on an <svg> itself, never a CSS transform on an element inside
-- * an SVG (phones left those unpainted while scrolling); all of it stops for prefers-reduced-motion and the Calm setting
-- * (html[data-ov-motion=reduced]).
++ * an SVG (phones left those unpainted while scrolling); Calm (html[data-ov-motion=reduced]) plays it with its loops slowed, and all of
++ * it stops with motion off (html[data-ov-motion=off]).
*/
const sc = require('./showcase');
const glyphs = require('./glyphs');
@@@ -182,14 +182,14 @@ const CSS = `
@keyframes sc-tilt{25%{transform:rotate(-4deg)}75%{transform:rotate(4deg)}}
@keyframes sc-pop{from{transform:scale(.6);opacity:0}}
@keyframes sc-glow{50%{background:color-mix(in srgb,var(--accent,#3b82f6) 26%,transparent)}}
--@media (prefers-reduced-motion:reduce){.sc-stage *,.sc-reel *,.sc-numbers *,.sc-flow *,.sc-stage-demo,.sc-reel-card,.sc-flow-list::before{animation:none!important;transition:none!important}.sc-stage-demo,.sc-reel-card,.sc-num-line{opacity:1;transform:none}.sc-flow-list::before{transform:none}.sc-motif .m-draw{stroke-dashoffset:0}}
--html[data-ov-motion=reduced] :is(.sc-stage,.sc-reel,.sc-numbers,.sc-flow) *,html[data-ov-motion=reduced] :is(.sc-stage-demo,.sc-reel-card){animation:none!important;transition:none!important;opacity:1;transform:none}
--html[data-ov-motion=reduced] .sc-flow-list::before{transform:none;transition:none}
++html[data-ov-motion=off] .sc-stage-demo,html[data-ov-motion=off] .sc-reel-card,html[data-ov-motion=off] .sc-num-line{opacity:1;transform:none}html[data-ov-motion=off] .sc-flow-list::before{transform:none}html[data-ov-motion=off] .sc-motif .m-draw{stroke-dashoffset:0}
++html[data-ov-motion=off] :is(.sc-stage,.sc-reel,.sc-numbers,.sc-flow) *,html[data-ov-motion=off] :is(.sc-stage-demo,.sc-reel-card){opacity:1;transform:none}
++html[data-ov-motion=off] .sc-flow-list::before{transform:none}
`;
// Starts each piece when it comes into view; rolls the numbers up from zero once. Without IntersectionObserver, or with
--// reduced motion, everything is shown as it is (the server already wrote the final numbers).
--const MOTION_JS = "(function(){try{var d=document,h=d.documentElement,still=(window.matchMedia&&matchMedia('(prefers-reduced-motion: reduce)').matches)||h.getAttribute('data-ov-motion')==='reduced',els=[].slice.call(d.querySelectorAll('[data-sc-in]'));"
++// motion off, everything is shown as it is (the server already wrote the final numbers).
++const MOTION_JS = "(function(){try{var d=document,h=d.documentElement,still=h.getAttribute('data-ov-motion')==='off',els=[].slice.call(d.querySelectorAll('[data-sc-in]'));"
+ "function roll(e){if(still)return;[].slice.call(e.querySelectorAll('[data-to]')).forEach(function(n){var to=+n.getAttribute('data-to');if(!(to>0))return;var f=new Intl.NumberFormat('en-US'),t0=performance.now();(function s(t){var k=Math.min(1,(t-t0)/900);n.textContent=f.format(Math.round(to*(1-Math.pow(1-k,3))));if(k<1)requestAnimationFrame(s)})(t0)})}"
+ "if(!('IntersectionObserver' in window)){els.forEach(function(e){e.classList.add('is-in')});return}"
+ "var io=new IntersectionObserver(function(es){es.forEach(function(x){if(!x.isIntersecting)return;x.target.classList.add('is-in');roll(x.target);io.unobserve(x.target)})},{threshold:.15});els.forEach(function(e){io.observe(e)})}catch(e){}})();";
ddiff --git a/showcase.css b/showcase.css
iindex 3045641..83860e9 100644
---- a/showcase.css
++++ b/showcase.css
@@@ -23,8 +23,6 @@ a.sc-orb-node:hover .sc-orb-face>*:first-child,a.sc-orb-node:focus-visible .sc-o
.sc-orb-core b{margin-top:6px;font-size:14px;font-weight:800}.sc-orb-core small{font-size:12px;color:var(--text-muted,#7386a3)}
@keyframes sc-breathe{0%,100%{opacity:.7;transform:scale(.95)}50%{opacity:1;transform:scale(1.05)}}
--@media (prefers-reduced-motion:reduce){.sc-ring,.sc-aura-glow,.sc-orb-ring,.sc-orb-face{animation:none}}
--html[data-ov-motion=reduced] .sc-ring,html[data-ov-motion=reduced] .sc-aura-glow,html[data-ov-motion=reduced] .sc-orb-ring,html[data-ov-motion=reduced] .sc-orb-face{animation:none}
@media (max-width:860px){
.sc-hero.sc-has-vis{display:block}
.sc-hero.sc-has-vis .sc-hero-vis{position:absolute;z-index:-1;top:-26px;right:0;width:180px;opacity:.36;pointer-events:none}
@@@ -161,7 +159,6 @@ a.sc-stat:hover{border-color:var(--accent,#3b82f6)}
.sc-row.sc-row>*{flex:0 0 var(--sc-row-w,82%);min-width:0;scroll-snap-align:start}
.sc-fold-hint{display:none}
}
--@media (prefers-reduced-motion:reduce){.sc-fold>summary::after{transition:none}}
/* apps(): a launcher. Phones: icon tiles, name under the icon; from 600 px: rows with a one-line tagline. */
.sc-apps-group{margin:18px 0 8px;font-size:13px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary,#96a7c2)}
.sc-apps-sec .sc-apps-group:first-of-type{margin-top:6px}
@@@ -204,8 +201,8 @@ a.sc-stat:hover{border-color:var(--accent,#3b82f6)}
html{overflow-x:clip}
.sc-hero::before{content:'';position:absolute;z-index:-1;inset:-40px 0 auto;height:340px;pointer-events:none;background:radial-gradient(ellipse at 30% 20%,color-mix(in srgb,var(--accent,#3b82f6) 22%,transparent),transparent 62%),radial-gradient(ellipse at 80% 0%,color-mix(in srgb,var(--secondary,#22d3ee) 14%,transparent),transparent 58%);filter:blur(10px);opacity:.9}
@keyframes scPulse{50%{opacity:.35}}
--@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){.sc-sec{animation:scRise linear both;animation-timeline:view();animation-range:entry 0% cover 18%}}}
--@keyframes scRise{from{transform:translateY(18px)}to{transform:none}}
++@supports (animation-timeline:view()){.sc-sec{animation:scRise linear both;animation-timeline:view();animation-range:entry 0% cover 18%}html[data-ov-motion=off] .sc-sec{animation:none}}
++@keyframes scRise{from{transform:translateY(calc(18px * var(--ov-move,1)))}to{transform:none}}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media (max-width:860px){.sc-hero.sc-split{grid-template-columns:1fr}.sc-hero{padding-top:36px}.sc-spot{grid-template-columns:1fr;gap:14px}.sc-spot:nth-child(even) .sc-spot-media{order:0}}
@media (max-width:520px){.sc-actions .sc-btn{flex:1 1 100%;justify-content:center}.sc-code{grid-template-columns:1fr}}
@@@ -225,7 +222,6 @@ html{overflow-x:clip}
.sc-stat dd{font-size:19px;gap:5px;letter-spacing:-.01em}.sc-stat-ic svg,.sc-stat-ic .ov-icon{width:15px;height:15px}
.sc-stat dt{font-size:11.5px;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
}
--@media (prefers-reduced-motion:reduce){.sc-card,.sc-btn,.sc-next-main,.sc-next-go,.sc-tile,.sc-thumb img,.sc-net a,.sc-apps a{transition:none}.sc-badge.sc-live::before{animation:none}}
.ov-icon{--ovi-size:32px;display:inline-grid;place-items:center;width:var(--ovi-size);height:var(--ovi-size);flex:none;vertical-align:middle;line-height:0;color:var(--ovi-accent,var(--accent,#3b82f6));position:relative}
.ov-icon svg{width:100%;height:100%;overflow:visible;display:block;transition:transform .25s cubic-bezier(.2,1.4,.3,1)}
.ov-icon .ovi-bg{fill:currentColor;opacity:.1;transition:opacity .25s}
@@@ -260,4 +256,4 @@ html{overflow-x:clip}
@keyframes oviBounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-6%)}}
@keyframes oviPop{0%{transform:scale(.8)}60%{transform:scale(1.12)}100%{transform:scale(1)}}
@keyframes oviShake{0%,100%{transform:translateX(0)}25%{transform:translateX(-6%)}75%{transform:translateX(6%)}}
--@media (prefers-reduced-motion:reduce){.ov-icon *, .ov-icon svg{animation:none!important;transition:none!important}.ov-icon .ovi-comet{display:none}}
++html[data-ov-motion=off] .ov-icon .ovi-comet{display:none}
ddiff --git a/showcase.js b/showcase.js
iindex 4b85213..f8d0f5c 100644
---- a/showcase.js
++++ b/showcase.js
@@@ -475,8 +475,6 @@ a.sc-orb-node:hover .sc-orb-face>*:first-child,a.sc-orb-node:focus-visible .sc-o
.sc-orb-core b{margin-top:6px;font-size:14px;font-weight:800}.sc-orb-core small{font-size:12px;color:var(--text-muted,#7386a3)}
@keyframes sc-breathe{0%,100%{opacity:.7;transform:scale(.95)}50%{opacity:1;transform:scale(1.05)}}
--@media (prefers-reduced-motion:reduce){.sc-ring,.sc-aura-glow,.sc-orb-ring,.sc-orb-face{animation:none}}
--html[data-ov-motion=reduced] .sc-ring,html[data-ov-motion=reduced] .sc-aura-glow,html[data-ov-motion=reduced] .sc-orb-ring,html[data-ov-motion=reduced] .sc-orb-face{animation:none}
@media (max-width:860px){
.sc-hero.sc-has-vis{display:block}
.sc-hero.sc-has-vis .sc-hero-vis{position:absolute;z-index:-1;top:-26px;right:0;width:180px;opacity:.36;pointer-events:none}
@@@ -613,7 +611,6 @@ a.sc-stat:hover{border-color:var(--accent,#3b82f6)}
.sc-row.sc-row>*{flex:0 0 var(--sc-row-w,82%);min-width:0;scroll-snap-align:start}
.sc-fold-hint{display:none}
}
--@media (prefers-reduced-motion:reduce){.sc-fold>summary::after{transition:none}}
/* apps(): a launcher. Phones: icon tiles, name under the icon; from 600 px: rows with a one-line tagline. */
.sc-apps-group{margin:18px 0 8px;font-size:13px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary,#96a7c2)}
.sc-apps-sec .sc-apps-group:first-of-type{margin-top:6px}
@@@ -656,8 +653,8 @@ a.sc-stat:hover{border-color:var(--accent,#3b82f6)}
html{overflow-x:clip}
.sc-hero::before{content:'';position:absolute;z-index:-1;inset:-40px 0 auto;height:340px;pointer-events:none;background:radial-gradient(ellipse at 30% 20%,color-mix(in srgb,var(--accent,#3b82f6) 22%,transparent),transparent 62%),radial-gradient(ellipse at 80% 0%,color-mix(in srgb,var(--secondary,#22d3ee) 14%,transparent),transparent 58%);filter:blur(10px);opacity:.9}
@keyframes scPulse{50%{opacity:.35}}
--@supports (animation-timeline:view()){@media (prefers-reduced-motion:no-preference){.sc-sec{animation:scRise linear both;animation-timeline:view();animation-range:entry 0% cover 18%}}}
--@keyframes scRise{from{transform:translateY(18px)}to{transform:none}}
++@supports (animation-timeline:view()){.sc-sec{animation:scRise linear both;animation-timeline:view();animation-range:entry 0% cover 18%}html[data-ov-motion=off] .sc-sec{animation:none}}
++@keyframes scRise{from{transform:translateY(calc(18px * var(--ov-move,1)))}to{transform:none}}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media (max-width:860px){.sc-hero.sc-split{grid-template-columns:1fr}.sc-hero{padding-top:36px}.sc-spot{grid-template-columns:1fr;gap:14px}.sc-spot:nth-child(even) .sc-spot-media{order:0}}
@media (max-width:520px){.sc-actions .sc-btn{flex:1 1 100%;justify-content:center}.sc-code{grid-template-columns:1fr}}
@@@ -677,7 +674,6 @@ html{overflow-x:clip}
.sc-stat dd{font-size:19px;gap:5px;letter-spacing:-.01em}.sc-stat-ic svg,.sc-stat-ic .ov-icon{width:15px;height:15px}
.sc-stat dt{font-size:11.5px;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
}
--@media (prefers-reduced-motion:reduce){.sc-card,.sc-btn,.sc-next-main,.sc-next-go,.sc-tile,.sc-thumb img,.sc-net a,.sc-apps a{transition:none}.sc-badge.sc-live::before{animation:none}}
`;
module.exports = { NETWORK_JS, icon, room, hero, features, steps, code, demo, fold, compare, pricing, limits, stories, stats, cards, spotlight, faq, network, apps, nextSteps, cta, jsonLd, faqJsonLd, RELATED, CSS, STYLESHEET: 'showcase.css', esc };
ddiff --git a/site-switcher.js b/site-switcher.js
iindex 18584bc..5bf6813 100644
---- a/site-switcher.js
++++ b/site-switcher.js
@@@ -61,8 +61,6 @@
.ovsw-foot a:hover { text-decoration: underline; }
@keyframes ovsw-in { from { opacity: 0; transform: translateY(-8px) scale(.97); } }
@keyframes ovsw-tile { from { opacity: 0; transform: translateY(6px) scale(.94); } }
--@media (prefers-reduced-motion: reduce) { .ovsw-panel, .ovsw-t { animation: none; } .ovsw-t .ov-icon { transition: none; } }
--html[data-ov-motion="reduced"] .ovsw-panel, html[data-ov-motion="reduced"] .ovsw-t { animation: none; }
`;
let el = null, panel = null, ctx = {}, lastFocus = null, mine = null, query = '';
ddiff --git a/test/footer-alive.test.js b/test/footer-alive.test.js
iindex dbb9728..affecf2 100644
---- a/test/footer-alive.test.js
++++ b/test/footer-alive.test.js
@@@ -80,7 +80,7 @@ function load(host = 'openvibe.live') {
assert.ok(f.pulseHTML({ live_now: 0, sites: 40, views_7d: 1500 }).includes('1.5k page views'));
assert.strictEqual(f.pulseHTML({ live_now: null, watching: null, sites: null, views_7d: null }), '', 'nothing known: nothing shown');
assert.ok(SRC.includes("new IntersectionObserver(") && SRC.includes('setInterval(readPulse, PULSE_MS)'), 'read when the footer is in view, every minute while it is');
-- assert.ok(SRC.includes('.ovf-dot{') && SRC.includes('prefers-reduced-motion:reduce){.ovf-account,.ovf-pulse,.ovf-inner--expanded,.ovf-dot{animation:none}'), 'the live dot pulses, never with reduced motion');
++ assert.ok(SRC.includes('.ovf-dot{') && !SRC.includes('prefers-reduced-motion'), 'the live dot pulses; Calm slows it (the loader) and only motion off stops it');
}
// The compact footer stays one line (4.15.1): the closed "More from OpenVibe" pill ends the compact line (the footer is a
ddiff --git a/test/fx.test.js b/test/fx.test.js
iindex 54d56dc..e90a17d 100644
---- a/test/fx.test.js
++++ b/test/fx.test.js
@@@ -10,8 +10,8 @@ const { parseHTML } = require('linkedom');
const SRC = fs.readFileSync(path.join(__dirname, '..', 'ov-fx.js'), 'utf8');
--function setup({ reduce = false, calm = false, html = '' } = {}) {
-- const { window, document, MutationObserver } = parseHTML(`<!doctype html><html${calm ? ' data-ov-motion="reduced"' : ''}><head></head><body>${html}</body></html>`);
++function setup({ reduce = false, calm = false, off = false, html = '' } = {}) {
++ const { window, document, MutationObserver } = parseHTML(`<!doctype html><html${off ? ' data-ov-motion="off"' : calm ? ' data-ov-motion="reduced"' : ''}><head></head><body>${html}</body></html>`);
const observed = [];
class IO { constructor(cb) { this.cb = cb; } observe(el) { observed.push(el); } unobserve() {} fire(el) { this.cb([{ target: el, isIntersecting: true }]); } }
let io = null;
@@@ -40,16 +40,21 @@ function setup({ reduce = false, calm = false, html = '' } = {}) {
assert.ok(t.document.getElementById('s').classList.contains('ovfx-shimmer') && t.document.getElementById('r').classList.contains('ovfx-ripple'));
const css = t.document.getElementById('ov-fx-css').textContent;
assert.match(css, /--ov-dur-1:\.12s;--ov-dur-2:\.2s;--ov-dur-3:\.32s;--ov-dur-4:\.52s/, 'the motion tokens');
-- assert.match(css, /html\[data-ov-motion=reduced\]\{--ov-dur-1:0s/, 'Calm zeroes them');
-- assert.ok(css.includes('@media (prefers-reduced-motion:reduce){.ovfx-glint:not([data-fx-demo] *)::after{display:none}'), 'the device asking for less motion stops the glint, outside a demo scope');
-- assert.ok(css.includes('[data-fx-demo]{--ov-dur-1:.12s;--ov-dur-2:.2s'), 'a demo scope sets its own lengths, so neither Calm nor the device setting (kit.css) reaches inside it');
++ assert.match(css, /html\[data-ov-motion=reduced\]\{--ov-move:\.35;--ov-dur-1:\.15s;[^}]*--ov-ease-spring:var\(--ov-ease-out\)\}/, 'Calm: a third of the distance, the calm lengths, no overshoot; never zero');
++ assert.match(css, /@media \(prefers-reduced-motion:reduce\)\{html:not\(\[data-ov-motion\]\)\{--ov-move:\.35;/, 'the same when the device asks and no loader has spoken');
++ assert.match(css, /html\[data-ov-motion=off\]\{--ov-move:0;--ov-dur-1:0s/, 'only Off zeroes them');
++ assert.ok(css.includes('.ovfx-lift:hover{transform:translateY(calc(-3px * var(--ov-move,1)))') && css.includes('.ovfx-hide{opacity:0;transform:translateY(calc(14px * var(--ov-move,1)))}'), 'distances are multiplied by --ov-move');
++ assert.ok(css.includes('html[data-ov-motion=reduced] .ovfx-glint:not([data-fx-demo] *)::after{opacity:.55}'), 'Calm keeps the glint, fainter and slower');
++ assert.ok(css.includes('html[data-ov-motion=off] .ovfx-glint:not([data-fx-demo] *)::after{display:none}'), 'motion off stops the glint, outside a demo scope');
++ assert.ok(!/data-ov-motion=reduced\][^{]*\{[^}]*(animation|transition):none/.test(css), 'nothing is stopped under Calm');
++ assert.ok(css.includes('[data-fx-demo]{--ov-move:1;') && css.includes('--ov-dur-1:.12s;--ov-dur-2:.2s'), 'a demo scope sets its own lengths and distance, so no setting reaches inside it');
assert.ok(/html:is\([^)]*neon-tokyo[^)]*\) \[data-fx-demo\]\{--ov-dur-1:\.09s/.test(css), 'in the look\'s own feel');
assert.ok(!/infinite/.test(css.replace(/\.ovfx-shimmer\{[^}]*\}/, '')), 'nothing loops but a placeholder\'s shimmer');
assert.strictEqual(typeof t.window.OVFx.confetti, 'function');
// A feel per look (4.67.0): quiet themes move calmly (no overshoot), neon ones snap; Calm still wins.
assert.match(css, /html:is\(\[data-theme=paper\],[^)]*\)\{--ov-dur-1:\.15s;[^}]*--ov-ease-spring:var\(--ov-ease-out\)\}/, 'calm looks: slower, no overshoot');
assert.match(css, /html:is\(\[data-theme=neon-tokyo\],[^)]*\)\{--ov-dur-1:\.09s;/, 'neon looks snap');
-- assert.ok(css.indexOf('html[data-ov-motion=reduced]{--ov-dur-1:0s') > css.indexOf('html:is([data-theme=neon-tokyo]'), 'Calm comes last, so it wins over any feel');
++ assert.ok(css.indexOf('html[data-ov-motion=reduced]{--ov-move:.35') > css.indexOf('html:is([data-theme=neon-tokyo]'), 'Calm comes last, so it wins over any feel');
}
// ── reveal: below the fold it waits for the screen; on screen it is never hidden ──
@@@ -79,9 +84,19 @@ function setup({ reduce = false, calm = false, html = '' } = {}) {
assert.strictEqual(t.document.getElementById('w').textContent, 'soon', 'not a number: left alone');
}
-- // ── reduced motion and Calm: nothing hidden, nothing counted, no confetti ──
++ // ── Calm (the setting, or the device asking for less): everything still plays, a third as far ──
for (const opts of [{ reduce: true }, { calm: true }]) {
const t = setup({ ...opts, html: '<ul data-fx="reveal" data-top="1400"><li>a</li></ul><b id="n" data-fx="count" data-top="1400">900</b>' });
++ assert.strictEqual(t.document.querySelectorAll('.ovfx-hide').length, 1, 'the reveal waits to play');
++ assert.strictEqual(t.observed.length, 2, 'the reveal and the number both wait for the screen');
++ assert.strictEqual(t.window.OVFx.move(), 0.35, 'a third of the distance');
++ }
++ assert.strictEqual(setup().window.OVFx.move(), 1, 'full motion: the whole distance');
++
++ // ── motion off: nothing hidden, nothing counted, no confetti ──
++ {
++ const t = setup({ off: true, reduce: true, html: '<ul data-fx="reveal" data-top="1400"><li>a</li></ul><b id="n" data-fx="count" data-top="1400">900</b>' });
++ assert.strictEqual(t.window.OVFx.move(), 0);
assert.strictEqual(t.document.querySelectorAll('.ovfx-hide').length, 0, 'nothing hidden');
assert.strictEqual(t.observed.length, 0, 'nothing waits to count');
assert.strictEqual(t.document.getElementById('n').textContent, '900');
@@@ -89,8 +104,8 @@ function setup({ reduce = false, calm = false, html = '' } = {}) {
}
// ── the demo scope: a page that shows motion may play it inside [data-fx-demo], when the person asks ──
-- for (const opts of [{ reduce: true }, { calm: true }]) {
-- const t = setup({ ...opts, html: '<div data-fx-demo><ul id="in" data-fx="reveal" data-top="1400"><li>a</li></ul></div><ul id="out" data-fx="reveal" data-top="1400"><li>b</li></ul>' });
++ {
++ const t = setup({ off: true, html: '<div data-fx-demo><ul id="in" data-fx="reveal" data-top="1400"><li>a</li></ul></div><ul id="out" data-fx="reveal" data-top="1400"><li>b</li></ul>' });
assert.strictEqual(t.document.querySelectorAll('#in .ovfx-hide').length, 1, 'inside the scope the reveal waits to play');
assert.strictEqual(t.document.querySelectorAll('#out .ovfx-hide').length, 0, 'outside it nothing is hidden: the setting holds for the rest of the page');
assert.strictEqual(t.window.OVFx.confetti({ x: 1, y: 1 }), false, 'confetti with no source element stays off');
@@@ -114,5 +129,5 @@ function setup({ reduce = false, calm = false, html = '' } = {}) {
assert.ok(require('../files').BROWSER.includes('ov-fx.js'), 'served');
}
-- console.log('fx: names wire their effects; reveal waits below the fold and never hides what is on screen; numbers end on their own text; reduced motion and Calm keep still; later markup wired; loaded only on request');
++ console.log('fx: names wire their effects; reveal waits below the fold and never hides what is on screen; numbers end on their own text; Calm plays everything a third as far; only motion off keeps still; later markup wired; loaded only on request');
})().catch((e) => { console.error(e); process.exit(1); });
ddiff --git a/test/glyphs.test.js b/test/glyphs.test.js
iindex 88226ae..9f6a9a8 100644
---- a/test/glyphs.test.js
++++ b/test/glyphs.test.js
@@@ -35,6 +35,10 @@ assert.ok(glyphs.svg('eye', { style: 'thin' }).includes('stroke-width="1"'));
assert.ok(glyphs.svg('eye', { style: 'light' }).includes('stroke-width="1.5"'));
assert.ok(glyphs.svg('eye', { style: 'bold' }).includes('stroke-width="2.5"'));
assert.ok(glyphs.svg('bell', { style: 'solid' }).includes('fill="currentColor"') && glyphs.svg('bell', { style: 'solid' }).includes('stroke="none"'));
++// A line inside a solid drawing keeps its stroke in the stand-alone svg (it was filled as a shape, or not drawn).
++assert.ok(glyphs.svg('calendar', { style: 'solid' }).includes('<path class="ln" fill="none" stroke="currentColor" stroke-width="2.6"'), 'a solid drawing\'s line part is stroked, not filled');
++assert.ok(!glyphs.svg('bell', { style: 'solid' }).includes('class="ln"'), 'a drawing with no line part is unchanged');
++assert.ok(glyphs.solid('calendar').includes('<path class="ln" d='), 'the stored drawing itself is unchanged (ov-glyphs.js styles .ln in CSS)');
assert.ok(glyphs.svg('bell', { style: 'duotone' }).includes('opacity=".2"'));
assert.throws(() => glyphs.svg('eye', { style: 'heavy' }), /unsupported style/);
for (const n of ['globe', 'mail', 'key', 'server', 'phone', 'help', 'cart', 'store', 'terminal', 'database', 'eye-off', 'mic-off']) assert.ok(glyphs.solid(n), `${n}: one of the next most-used shapes has its solid drawing (4.80.0)`);
@@@ -73,7 +77,7 @@ ON_ICON.forEach((cls) => assert.ok(CSS.includes(`.ovg.${cls}{`) || CSS.includes(
['--fa-beat-scale', '--fa-bounce-height', '--fa-fade-opacity', '--fa-flip-angle', '--fa-rotate-angle', '--fa-animation-duration', '--fa-li-width',
'--fa-border-color', '--fa-counter-background-color', '--fa-primary-color', '--fa-inverse'].forEach((v) => assert.ok(CSS.includes(v), `Font Awesome's ${v}`));
assert.ok(!CSS.includes('360deg') && /\.ovg\.fa-spin[^{]*\{animation:ovgBreathe/.test(CSS), 'fa-spin breathes: nothing spins (L27)');
--assert.ok(CSS.includes('@media (prefers-reduced-motion:reduce){.ovg,.ovg[data-ovg=busy] circle,.ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}}'), 'reduced motion stops every animation, and a drawn-in glyph is simply there');
++assert.ok(CSS.includes('html[data-ov-motion=off] .ovg,html[data-ov-motion=off] .ovg[data-ovg=busy] circle,html[data-ov-motion=off] .ovg.ovg-draw>svg>*{animation:none!important;stroke-dashoffset:0!important}') && !CSS.includes('prefers-reduced-motion') && !CSS.includes('data-ov-motion=reduced'), 'motion off stops every animation and a drawn-in glyph is simply there; Calm plays them');
// ── In a page ──
(async () => {
ddiff --git a/test/items.test.js b/test/items.test.js
iindex 65bf8c7..839eca8 100644
---- a/test/items.test.js
++++ b/test/items.test.js
@@@ -98,13 +98,13 @@ const subjectOf = (i) => `usr_01JZ${String(i).padStart(22, '0')}`;
const fx = [...css.matchAll(/^\.(name-fx-[a-z]+) \{/gm)].map((m) => m[1]);
assert.strictEqual(fx.length, 15, `15 name effects (${fx.join(', ')})`);
assert.ok(fx.includes('name-fx-rainbow') && fx.includes('name-fx-divine') && fx.includes('name-fx-vegas') && fx.includes('name-fx-twofat'));
-- assert.match(css, /html\[data-ov-motion=reduced\] \.name-fx-twofat::after \{ animation: none !important; \}/, 'the Calm setting stops the bass drop');
-- assert.match(css, /html\[data-ov-motion=reduced\] \.name-fx-vegas::after \{ animation: none !important; \}/, 'the Calm setting stops the reels');
++ assert.ok(!/data-ov-motion=reduced\]/.test(css) && !/prefers-reduced-motion/.test(css), 'Calm plays every name effect (the loader slows the loops)');
++ assert.match(css, /html\[data-ov-motion=off\] \.name-fx-twofat\{filter:/, 'with motion off the bass drop rests on its glow');
++ assert.match(css, /html\[data-ov-motion=off\] \.name-fx-vegas\{filter:/, 'and so do the reels');
assert.match(css, /\.ov-fx \{ display: inline-block; \}/);
-- assert.match(css, /prefers-reduced-motion: reduce[\s\S]*animation: none !important/);
assert.match(css, /\.ov-hat-pulse \{ animation: ovHatPulse/);
assert.match(css, /\.ov-badge \{ display: inline-block;/);
assert.match(css, /\.px-sparkle \.ov-px-p \{ color: #ffd700; \}/);
-- assert.match(css, /prefers-reduced-motion: reduce[\s\S]*\.ov-px-p \{ display: none; \}/);
++ assert.match(css, /html\[data-ov-motion=off\] \.ov-px-p\{display: none\}/, 'no particles with motion off');
console.log('items: all checks passed');
})().catch((err) => { console.error(err); process.exit(1); });
ddiff --git a/test/kit-shape.test.js b/test/kit-shape.test.js
iindex 446ead1..a9546eb 100644
---- a/test/kit-shape.test.js
++++ b/test/kit-shape.test.js
@@@ -28,8 +28,10 @@ assert.match(room, /:where\(\[data-theme=paper\][^{]*\) \{\s*--ov-radius-1: 4px;
assert.match(room, /:where\(\[data-theme=neon-tokyo\][^{]*\) \{\s*--ov-radius-1: 14px;/);
// Motion (4.82.0): ov-fx.js's tokens, in kit.css too, so var(--ov-dur-*) resolves on every page and Reduced reaches it.
assert.ok(kit.includes('--ov-dur-1: .12s;') && kit.includes('--ov-dur-4: .52s;') && kit.includes('--ov-ease-out: cubic-bezier(.2, .8, .2, 1);'), 'the motion tokens, as ov-fx.js sets them');
--assert.match(kit, /html\[data-ov-motion=reduced\] \{ --ov-dur-1: 0s;/, 'Reduced motion stops them');
--assert.match(kit, /@media \(prefers-reduced-motion: reduce\) \{ :root:root \{ --ov-dur-1: 0s;/, 'and so does a device that asks for less, over ov-fx.js\'s own :root');
++assert.match(kit, /html\[data-ov-motion=reduced\] \{ --ov-move: \.35; --ov-dur-1: \.15s;/, 'Calm: a third of the distance and the calm lengths, never zero');
++assert.match(kit, /@media \(prefers-reduced-motion: reduce\) \{ html:not\(\[data-ov-motion\]\) \{ --ov-move: \.35;/, 'a page the loader has not reached is calm when the device asks');
++assert.match(kit, /:root:root\[data-ov-motion=off\] \{ --ov-move: 0; --ov-dur-1: 0s;/, 'only Off stops them, over ov-fx.js\'s own :root');
++assert.ok(!/(prefers-reduced-motion: reduce|data-ov-motion=reduced\])[^{]*\{[^}]*\{?[^}]*(animation|transition): none/.test(kit), 'the kit stops nothing under Calm');
assert.match(kit, /:is\(\[data-theme=paper\][^{]*\) \{\s*--ov-dur-1: \.15s;/, 'Paper is calm');
const fx = fs.readFileSync(path.join(__dirname, '..', 'ov-fx.js'), 'utf8');
assert.ok(fx.includes('--ov-dur-1:.12s;--ov-dur-2:.2s;--ov-dur-3:.32s;--ov-dur-4:.52s'), 'the same values as ov-fx.js');
ddiff --git a/test/motion-ghost-chrome.test.js b/test/motion-ghost-chrome.test.js
iindex c5196ed..02af167 100644
---- a/test/motion-ghost-chrome.test.js
++++ b/test/motion-ghost-chrome.test.js
@@@ -23,7 +23,7 @@ const scene = (extra = '') => `<!doctype html><html lang="en"><head><meta charse
const server = http.createServer((req, res) => {
if (req.url === '/motion.js') { res.writeHead(200, { 'content-type': 'application/javascript' }); return res.end(fs.readFileSync(path.join(__dirname, '..', 'motion.js'))); }
res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
-- return res.end(req.url === '/still' ? scene(' data-x="1"').replace('<html lang="en">', '<html lang="en" data-ov-motion="reduced">') : scene());
++ return res.end(req.url === '/still' ? scene(' data-x="1"').replace('<html lang="en">', '<html lang="en" data-ov-motion="off">') : scene());
});
(async () => {
@@@ -56,7 +56,7 @@ const server = http.createServer((req, res) => {
await still.send('Emulation.setEmulatedMedia', { features: [{ name: 'prefers-reduced-motion', value: 'reduce' }] });
await still.goto(`${base}/still`, { maxMs: 5000 });
await wait(1500);
-- assert.strictEqual(await still.evaluate('!document.querySelector(".ov-ghost") && document.querySelectorAll("[data-ov-ghost-on]").length === 0'), true, 'reduced motion: no cursor at all');
++ assert.strictEqual(await still.evaluate('!document.querySelector(".ov-ghost") && document.querySelectorAll("[data-ov-ghost-on]").length === 0'), true, 'motion off: no cursor at all');
const errors = p.state.errors.concat(still.state.errors).filter((e) => !/Failed to load resource/.test(e.text));
assert.deepStrictEqual(errors, [], JSON.stringify(errors));
console.log('motion-ghost-chrome: all checks passed');
ddiff --git a/test/motion-setting.test.js b/test/motion-setting.test.js
nnew file mode 100644
iindex 0000000..b279c40
---- /dev/null
++++ b/test/motion-setting.test.js
@@@ -0,0 +1,97 @@
++'use strict';
++// Motion (4.183.0; the owner, 2026-11-10: "it should still have full motion but actually just reduce it instead of
++// getting rid of it"). The loader turns four choices and the device's own setting into one signal on <html>:
++// auto → nothing, or reduced when the device asks for less; full → full, even when the device asks;
++// reduced (Calm) → reduced: every effect still plays, smaller and slower; off → off, the only one that stops motion.
++// Rules this file holds: nothing but Off carries a rule that stops motion, Calm slows endless loops instead of ending
++// them, and no stylesheet or script in the package stops an effect because the device asked for less.
++const assert = require('assert');
++const fs = require('fs');
++const path = require('path');
++const vm = require('vm');
++
++const ROOT = path.join(__dirname, '..');
++const SRC = fs.readFileSync(path.join(ROOT, 'theme-loader.js'), 'utf8');
++
++function boot({ motion, deviceAsks = false } = {}) {
++ const attrs = new Map(), styles = [], media = [];
++ const html = { style: { setProperty() {}, removeProperty() {} }, setAttribute: (k, v) => attrs.set(k, String(v)), getAttribute: (k) => (attrs.has(k) ? attrs.get(k) : null), removeAttribute: (k) => attrs.delete(k), classList: { add() {}, remove() {} } };
++ const head = { appendChild: (el) => { styles.push(el); return el; } };
++ const store = motion ? { ov_display: JSON.stringify({ motion }) } : {};
++ const mq = { matches: deviceAsks, addEventListener(_t, fn) { media.push(fn); } };
++ const sandbox = {
++ document: { documentElement: html, head, readyState: 'complete', cookie: '', querySelector: () => null, querySelectorAll: () => [], getElementById: (id) => styles.find((s) => s.id === id) || null,
++ createElement: () => ({ setAttribute() {}, appendChild() {}, style: {} }), addEventListener() {}, getAnimations: () => [] },
++ localStorage: { getItem: (k) => (k in store ? store[k] : null), setItem: (k, v) => { store[k] = String(v); }, removeItem: (k) => { delete store[k]; } },
++ location: { hostname: 'openvibe.live', protocol: 'https:', search: '', href: 'https://openvibe.live/' }, getComputedStyle: () => ({ getPropertyValue: () => '' }),
++ matchMedia: (q) => (/reduced-motion/.test(q) ? mq : { matches: false, addEventListener() {} }),
++ fetch: () => Promise.resolve({ ok: false }), CustomEvent: class {}, addEventListener() {}, dispatchEvent() {}, setTimeout() {}, clearTimeout() {}, URL, JSON, Object, String, Number, Math, Array, Promise, Error, Date, WeakSet,
++ };
++ sandbox.window = sandbox;
++ vm.runInNewContext(SRC, sandbox);
++ const L = sandbox.OpenVibeThemeLoader;
++ return { L, attr: () => html.getAttribute('data-ov-motion'), css: () => (styles.find((s) => s.id === 'ov-display-css') || {}).textContent || '', mq, media };
++}
++
++// ── four choices, one signal ──
++let t = boot();
++assert.deepStrictEqual(Array.from(t.L.display.options.motion), ['auto', 'full', 'reduced', 'off'], 'Automatic, Full, Calm, Off');
++assert.strictEqual(t.attr(), null, 'automatic on a device that asks nothing: full motion, no attribute');
++assert.strictEqual(t.L.display.motion(), 'full');
++assert.strictEqual(t.L.display.move(), 1);
++
++t = boot({ deviceAsks: true });
++assert.strictEqual(t.attr(), 'reduced', 'automatic follows the device: it asks for less, the page is calm');
++assert.strictEqual(t.L.display.motion(), 'calm');
++assert.strictEqual(t.L.display.move(), 0.35, 'calm moves a third as far; it does not stand still');
++
++t = boot({ motion: 'full', deviceAsks: true });
++assert.strictEqual(t.attr(), 'full', 'Full is the person\'s own choice and outranks the device');
++assert.strictEqual(t.L.display.move(), 1);
++
++t = boot({ motion: 'reduced' });
++assert.strictEqual(t.attr(), 'reduced', 'Calm');
++assert.strictEqual(t.L.display.motion(), 'calm');
++
++t = boot({ motion: 'off' });
++assert.strictEqual(t.attr(), 'off', 'Off');
++assert.strictEqual(t.L.display.move(), 0);
++
++// The device changing its mind applies at once under Automatic, and never under a choice the person made.
++t = boot();
++t.mq.matches = true; t.media.forEach((fn) => fn());
++assert.strictEqual(t.attr(), 'reduced', 'the device starts asking: calm at once');
++t = boot({ motion: 'full' });
++t.mq.matches = true; t.media.forEach((fn) => fn());
++assert.strictEqual(t.attr(), 'full', 'a choice holds');
++
++// ── the stylesheet: Calm stops nothing ──
++const css = boot({ motion: 'reduced' }).css();
++assert.ok(css.includes(':where(html){--ov-move:1}') && css.includes('html[data-ov-motion=reduced]{--ov-move:0.35;') && css.includes('html[data-ov-motion=off]{--ov-move:0}'), '--ov-move: 1, a third, none');
++const calmRules = css.match(/html\[data-ov-motion=reduced\][^{]*\{[^}]*\}/g) || [];
++assert.ok(calmRules.length && calmRules.every((r) => !/animation|transition/.test(r)), 'no rule gives Calm a shorter animation or transition');
++assert.ok(/html\[data-ov-motion=off\] \*:not\(\[data-fx-demo\] \*\)[^{]*\{animation-duration:\.001ms!important/.test(css), 'Off is the one blanket rule, outside a demo scope');
++assert.ok(/CALM_RATE = 0\.6/.test(SRC) && SRC.includes('t.iterations !== Infinity') && SRC.includes("addEventListener('animationstart'"), 'under Calm an endless loop is slowed as it starts; anything that ends plays as written');
++assert.ok(SRC.includes("motionOf() === 'off') return;"), 'the theme crossfade is a colour fade: only Off skips it');
++
++// ── the package: nothing stops an effect because the device asked for less ──
++const STOPS = /(animation|transition)\s*:\s*none/;
++const offenders = [];
++for (const name of fs.readdirSync(ROOT)) {
++ if (!/\.(js|css)$/.test(name)) continue;
++ const text = fs.readFileSync(path.join(ROOT, name), 'utf8');
++ let i = 0;
++ for (;;) {
++ const at = text.indexOf('prefers-reduced-motion', i);
++ if (at < 0) break;
++ const open = text.indexOf('{', at), line = text.slice(at, text.indexOf('\n', at) < 0 ? text.length : text.indexOf('\n', at));
++ // A media block that stops something (the fallbacks that set --ov-move are fine; so is asking the device in script).
++ if (/^prefers-reduced-motion:\s*reduce\)\s*\{/.test(text.slice(at)) && open > 0 && STOPS.test(line)) offenders.push(`${name}: ${line.slice(0, 90)}`);
++ i = at + 10;
++ }
++ const calm = text.match(/html\[data-ov-motion="?reduced"?\][^{};]*\{[^}]*\}/g) || [];
++ for (const r of calm) if (STOPS.test(r)) offenders.push(`${name}: ${r.slice(0, 90)}`);
++}
++assert.deepStrictEqual(offenders, [], 'a rule that stops motion belongs to html[data-ov-motion=off]');
++
++console.log('motion setting: automatic follows the device, Full outranks it, Calm moves a third as far and stops nothing, Off alone stops motion');
ddiff --git a/test/name-effects-light.test.js b/test/name-effects-light.test.js
iindex f5e1f2d..b4d6968 100644
---- a/test/name-effects-light.test.js
++++ b/test/name-effects-light.test.js
@@@ -13,6 +13,6 @@ effects.forEach((fx) => {
});
// The colour-animated ones animate their light colours, so the dark keyframes cannot bring the bright colour back.
['Fire', 'Ice', 'Neon'].forEach((k) => assert.match(css, new RegExp(`@keyframes nameFx${k}Light \\{`), `${k} has light keyframes`));
--// Reduced motion still stops them all.
--assert.match(css, /@media \(prefers-reduced-motion: reduce\) \{\s*\.ov-fx\[class\*="name-fx-"\], \.ov-hat \{ animation: none !important; \}/);
++// Calm plays them (the loader slows the loops); motion off is the loader's one rule, so nothing here stops them.
++assert.doesNotMatch(css, /prefers-reduced-motion/);
console.log('name effects light: all checks passed');
ddiff --git a/test/ov-mark.test.js b/test/ov-mark.test.js
iindex 385d989..2b7bf47 100644
---- a/test/ov-mark.test.js
++++ b/test/ov-mark.test.js
@@@ -212,29 +212,35 @@ function setup({ reduce = false, session = memoryStorage(), start = 1000000, roo
assert.strictEqual(t.running(), false, 'idle again');
}
-- // ── reduced motion (the OS setting or the network's own) and data-static: never ──
++ // ── Calm (the device asking for less, or the setting) still plays; motion off and data-static: never ──
{
-- const t = setup({ reduce: true });
++ const c = setup({ reduce: true });
++ c.io.fire(c.mark, true);
++ c.mark.closest('a').dispatchEvent(new c.Event('pointerenter'));
++ assert.strictEqual(c.running(), true, 'the device asking for less motion: the mark still answers a hover');
++
++ const t = setup({ rootAttrs: ' data-ov-motion="off"' });
t.io.fire(t.mark, true);
t.mark.closest('a').dispatchEvent(new t.Event('pointerenter'));
-- assert.strictEqual(t.running(), false, 'prefers-reduced-motion');
-- assert.strictEqual(t.smilPaused(), true, 'SMIL stopped too (the V sweep used to run under reduced motion)');
++ assert.strictEqual(t.running(), false, 'motion off');
++ assert.strictEqual(t.smilPaused(), true, 'SMIL stopped too (the V sweep used to run with motion off)');
// The demo scope: inside [data-fx-demo] (a motion page's own container, set when the person asks) it plays.
-- const d = setup({ reduce: true });
++ const d = setup({ rootAttrs: ' data-ov-motion="off"' });
d.document.body.setAttribute('data-fx-demo', '');
d.io.fire(d.mark, true);
d.mark.closest('a').dispatchEvent(new d.Event('pointerenter'));
-- assert.strictEqual(d.running(), true, 'a mark inside a demo scope plays under prefers-reduced-motion');
++ assert.strictEqual(d.running(), true, 'a mark inside a demo scope plays with motion off');
const u = setup();
u.io.fire(u.mark, true);
u.document.documentElement.setAttribute('data-ov-motion', 'reduced'); await u.flush();
-- assert.strictEqual(u.running(), false, 'html[data-ov-motion=reduced]: no intro, no hover play');
-- // Calm is gentle, not still (the owner, 11-09: "the animations need to work even on calm mode"): a state still
-- // animates (its loops play once, by CSS).
++ assert.strictEqual(u.running(), true, 'html[data-ov-motion=reduced]: Calm keeps the intro (the owner, 11-10: reduce it, do not get rid of it)');
++ u.document.documentElement.setAttribute('data-ov-motion', 'off'); await u.flush();
++ assert.strictEqual(u.running(), false, 'html[data-ov-motion=off]: no intro, no hover play');
++ // Even with motion off a state is shown (the loader gives its loops no length).
u.mark.setAttribute('data-state', 'busy'); await u.flush();
-- assert.strictEqual(u.running(), true, 'a state still animates under Calm');
++ assert.strictEqual(u.running(), true, 'a state is still shown with motion off');
u.mark.removeAttribute('data-state'); await u.flush();
u.document.documentElement.removeAttribute('data-ov-motion'); await u.flush();
assert.strictEqual(u.running(), true, 'back inside the intro');
@@@ -244,7 +250,7 @@ function setup({ reduce = false, session = memoryStorage(), start = 1000000, roo
assert.strictEqual(u.running(foot), false, 'data-static');
assert.strictEqual(u.smilPaused(foot), true);
u.mq.matches = true; u.mq.listeners.forEach((fn) => fn());
-- assert.strictEqual(u.running(), false, 'reduced-motion change applies at once');
++ assert.strictEqual(u.running(), true, 'the device asking for less mid-visit: Calm, the intro goes on');
}
// ── a removed mark is let go; one added later mounts and gets its own intro ──────
@@@ -347,7 +353,7 @@ function setup({ reduce = false, session = memoryStorage(), start = 1000000, roo
assert.match(css, /\.ov-mark:hover \.gr\{animation:ovmGlint|\.ov-mark:hover \.gr,/, 'and crosses on hover');
assert.match(css, /\.ov-mark\[data-glow\]::before\{opacity:\.42/, 'data-glow keeps the glow on');
assert.match(css, /\.ov-mark\[data-tone\]::before,\.ov-mark\[data-state=sleep\]::before\{display:none\}/);
-- assert.ok(css.includes('.ov-mark:not([data-fx-demo] *)::before{transition:none!important}'), 'reduced motion: the glow appears without moving (outside a demo scope)');
++ assert.ok(!css.includes('::before{transition:none!important}') && css.includes('html[data-ov-motion=off] .ov-mark:not([data-fx-demo] *) *{animation-iteration-count:1!important}'), 'the glow fades in under Calm too; only motion off holds the mark still (outside a demo scope)');
assert.match(css, /\.ov-mark:active \.m\{transform:scale\(\.9\)/, 'a press gives a little');
assert.ok(!/ovmPop/.test(css), 'the old pop is gone');
// The glint's copy of the V follows the V into its shapes.
ddiff --git a/test/ov-upload.test.js b/test/ov-upload.test.js
iindex 24e534a..1f48681 100644
---- a/test/ov-upload.test.js
++++ b/test/ov-upload.test.js
@@@ -18,5 +18,6 @@ assert.strictEqual(upload.timeLeft(Infinity), 'Estimating time left');
assert.ok(files.isBrowserFile('ov-upload.js') && files.isBrowserFile('ov-upload.css'));
const css = fs.readFileSync(path.join(__dirname, '../ov-upload.css'), 'utf8');
--assert.match(css, /prefers-reduced-motion: reduce/);
++assert.match(css, /html\[data-ov-motion=off\] \.ov-progress__check path\{stroke-dashoffset: 0\}/, 'with motion off the tick is simply drawn');
++assert.doesNotMatch(css, /prefers-reduced-motion/, 'Calm plays the progress');
assert.match(css, /\.ov-upload__input\s*\{[^}]*clip:/s, 'native input is visually hidden');
ddiff --git a/test/rails-scroll-chrome.test.js b/test/rails-scroll-chrome.test.js
iindex 7c0ca83..fe08db1 100644
---- a/test/rails-scroll-chrome.test.js
++++ b/test/rails-scroll-chrome.test.js
@@@ -39,7 +39,9 @@ const server = http.createServer((req, res) => {
const context = await browser.newContext();
const p = await h.openPage(browser, context, { width: 390, height: 844 });
await p.goto(`${base}/`, { maxMs: 5000 });
-- await wait(300);
++ // A browser with no fine pointer gets the one nudge (along and back, done about 1.2 s after the strip is seen), under
++ // Calm too since 4.183.0 (a macOS runner asks for less motion and used to skip it): read the edges after it.
++ await wait(1600);
const first = await p.evaluate(`({ endFade: document.getElementById('plain').classList.contains('is-more-end'), startFade: document.getElementById('plain').classList.contains('is-more-start'),
bar: !document.querySelector('#plain + .ovk-scroll-bar').hidden, shortBar: document.querySelector('#short + .ovk-scroll-bar').hidden, shortFade: document.getElementById('short').classList.contains('is-more-end') })`);
assert.ok(first.endFade && !first.startFade, `the far edge fades where more is hidden (${JSON.stringify(first)})`);
@@@ -51,12 +53,12 @@ const server = http.createServer((req, res) => {
assert.ok(!end.endFade && end.startFade, 'at the end only the near edge fades');
assert.ok(/translateX\((?!0%)/.test(end.thumb), `the bar's thumb moved (${end.thumb})`);
// Drift: it moves on its own, and a touch stops it for good.
-- // A slow runner (CI) gets more time; a browser that asks for less motion is not asked to drift.
-- const calm = await p.evaluate("matchMedia('(prefers-reduced-motion: reduce)').matches");
++ // A slow runner (CI) gets more time. A browser that asks for less motion drifts too, at half the speed (Calm
++ // reduces, it does not remove); it may already be on its way back, so any change counts.
const a = await p.evaluate("document.getElementById('drift').scrollLeft");
let b = a;
-- for (let i = 0; i < 30 && !calm && b <= a; i++) { await wait(100); b = await p.evaluate("document.getElementById('drift').scrollLeft"); }
-- assert.ok(calm || b > a, `a drifting strip moves by itself (${a} → ${b})`);
++ for (let i = 0; i < 40 && b === a; i++) { await wait(100); b = await p.evaluate("document.getElementById('drift').scrollLeft"); }
++ assert.ok(b !== a, `a drifting strip moves by itself (${a} → ${b})`);
await p.evaluate("document.getElementById('drift').dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }))");
const c = await p.evaluate("document.getElementById('drift').scrollLeft");
await wait(700);
ddiff --git a/test/room-kit.test.js b/test/room-kit.test.js
iindex 853f891..4a0f500 100644
---- a/test/room-kit.test.js
++++ b/test/room-kit.test.js
@@@ -148,7 +148,7 @@ const sc = require('../showcase');
assert.ok(!scss.includes('.sc-room-hero{'), 'showcase.css, which every product home loads, does not carry the room front door');
const motion = fs.readFileSync(path.join(__dirname, '..', 'motion.js'), 'utf8');
assert.ok(/el\.textContent = k < 1 \? .* : text;/.test(motion), 'the ticker ends on the server\'s text');
-- assert.ok(motion.includes("html.getAttribute('data-ov-motion') === 'reduced'"), 'the account\'s reduced motion is honoured');
++ assert.ok(motion.includes("m === 'off' ? 'off'") && motion.includes("const still = () => motion() === 'off';"), 'only motion off keeps it still; Calm plays it');
}
console.log('room kit: rooms, card, rail, sc.room and motion ok');
ddiff --git a/test/showcase-stage.test.js b/test/showcase-stage.test.js
iindex 904416f..caa9eeb 100644
---- a/test/showcase-stage.test.js
++++ b/test/showcase-stage.test.js
@@@ -38,6 +38,6 @@ assert.strictEqual((flow.match(/<li /g) || []).length, 3);
// Motion rules.
assert.ok(!/\.sc-motif [^{]*\{[^}]*transform/.test(st.CSS), 'no CSS transform on anything inside the motif SVG');
--assert.ok(/@media \(prefers-reduced-motion:reduce\)/.test(st.CSS) && /html\[data-ov-motion=reduced\]/.test(st.CSS), 'reduced motion and Calm stop it');
--assert.ok(/IntersectionObserver/.test(st.MOTION_JS) && /prefers-reduced-motion/.test(st.MOTION_JS), 'it starts in view and stays still when asked');
++assert.ok(/html\[data-ov-motion=off\]/.test(st.CSS) && !/prefers-reduced-motion/.test(st.CSS) && !/data-ov-motion=reduced/.test(st.CSS), 'Calm plays it; only motion off stops it');
++assert.ok(/IntersectionObserver/.test(st.MOTION_JS) && /getAttribute\('data-ov-motion'\)==='off'/.test(st.MOTION_JS), 'it starts in view and stays still with motion off');
console.log('showcase-stage: stage, reel, numbers and flow render whole, escaped, with motifs and motion that can stop');
ddiff --git a/test/showcase.test.js b/test/showcase.test.js
iindex 9c14249..709e7d9 100644
---- a/test/showcase.test.js
++++ b/test/showcase.test.js
@@@ -51,7 +51,7 @@ assert.ok(code.includes('<pre tabindex="0" aria-label="Node">'), 'code samples a
assert.ok(code.includes('class="language-js"') && code.includes('&lt;script&gt;x&lt;/script&gt;</code>'), 'code is escaped and trimmed');
const d = sc.demo({ title: 'Try it', iframe: { src: 'https://x.example/?a=1&b=2', height: 5000 } });
assert.ok(d.includes('loading="lazy"') && d.includes('height:900px') && d.includes('&amp;b=2'), 'a demo frame is lazy and bounded');
--assert.ok(typeof sc.CSS === 'string' && sc.CSS.includes('.sc-card') && sc.CSS.includes('prefers-reduced-motion'));
++assert.ok(typeof sc.CSS === 'string' && sc.CSS.includes('.sc-card') && sc.CSS.includes('data-ov-motion=off'));
const { execFileSync } = require('child_process');
execFileSync(process.execPath, [require('path').join(__dirname, '..', 'scripts', 'build-styles.js'), '--check'], { stdio: 'inherit' });
const files = require('../files');
@@@ -67,9 +67,12 @@ assert.ok(/@container \(min-width:520px\) and \(max-width:1035px\)\{\.sc-grid:ha
{
const ring = sc.features({ items: [{ icon: 'ov:live', title: 'Live' }, { icon: 'fa-code', title: 'Code' }] });
assert.ok(ring.includes('<span class="sc-ic sc-ic-ov"><span class="ov-icon sc-ovi" data-icon="live" style="--ovi-size:40px"'), 'the ring icon is 40 px in an untinted slot');
-- // A name the ring set lacks is its glyph in a ring, never the bare OV mark (2026-11-02, Today's ov:calendar).
-- const cal = sc.features({ title: 'More', items: [{ icon: 'ov:calendar', title: 'Your agenda', text: 'x' }] });
-- assert.ok(cal.includes('<span class="ov-icon sc-ovi sc-ovi--glyph" data-icon="calendar"'), 'a glyph in a ring');
++ // A name the ring set lacks is its glyph in a ring, never the bare OV mark (2026-11-02, Today's ov:calendar; the
++ // calendar has its own mark since 4.182.0, so the example is a trophy).
++ const cal = sc.features({ title: 'More', items: [{ icon: 'ov:trophy', title: 'Your wins', text: 'x' }] });
++ assert.ok(cal.includes('<span class="ov-icon sc-ovi sc-ovi--glyph" data-icon="trophy"'), 'a glyph in a ring');
++ const real = sc.features({ title: 'More', items: [{ icon: 'ov:calendar', title: 'Your agenda', text: 'x' }] });
++ assert.ok(real.includes('data-icon="calendar"') && !real.includes('sc-ovi--glyph'), 'a name the ring set has is its own mark');
assert.ok(!/data-icon="calendar"[^>]*>[^<]*<svg viewBox="0 0 48 48"/.test(cal), 'not the ring set\'s fallback');
assert.ok(ring.includes('<span class="sc-ic"><i class="fa-solid fa-code"'), 'a Font Awesome icon keeps the plain slot');
assert.ok(sc.CSS.includes('.sc-ic.sc-ic-ov{background:none'), 'the slot drops its tile for a ring icon');
@@@ -128,7 +131,7 @@ assert.ok(/@container \(min-width:520px\) and \(max-width:1035px\)\{\.sc-grid:ha
assert.ok(sc.network({ service: 'unknown-thing' }).includes('OpenVibe.Live'), 'a product without its own list gets the core ones');
assert.ok(sc.network({ service: 'x', items: [['tools', 'Tools', 'https://openvibe.tools/'], ['bad', 'Bad', 'ftp://x']] }).includes('OpenVibe.Tools'));
for (const [svc, list] of Object.entries(sc.RELATED)) for (const [to, what, href] of list) assert.ok(to && what && /^https:\/\//.test(href) && to !== svc, `${svc} → ${to}`);
-- assert.ok(sc.CSS.includes('animation-timeline:view()') && sc.CSS.includes('prefers-reduced-motion:no-preference'), 'scroll reveal, only for people who want motion');
++ assert.ok(sc.CSS.includes('animation-timeline:view()') && sc.CSS.includes('html[data-ov-motion=off] .sc-sec{animation:none}') && sc.CSS.includes('translateY(calc(18px * var(--ov-move,1)))'), 'scroll reveal: a third as far under Calm, none with motion off');
const rise = sc.CSS.match(/@keyframes scRise\{[^@]*?\}\}/);
assert.ok(rise && !/opacity/.test(rise[0]), 'the reveal only moves: a section that fades in is measured half-transparent, so its text fails contrast checks (axe on every product home)');
}
@@@ -161,7 +164,7 @@ assert.ok(/@container \(min-width:520px\) and \(max-width:1035px\)\{\.sc-grid:ha
assert.ok(/&lt;Chat&gt;/.test(o) && !/<Chat>/.test(o), 'names are escaped');
assert.ok(!/javascript:/.test(o) && /<span class="sc-orb-node" style="--i:0;--n:1"/.test(o), 'an unsafe link is no link');
assert.ok(/<b>Quests<\/b><small>every site<\/small>/.test(o), 'the centre says what it is');
-- assert.ok(/@media \(prefers-reduced-motion:reduce\)\{\.sc-ring,\.sc-aura-glow,\.sc-orb-ring,\.sc-orb-face\{animation:none\}\}/.test(sc.CSS), 'still under reduced motion');
++ assert.ok(!/sc-orb-face\{animation:none\}/.test(sc.CSS), 'the ring keeps turning under Calm (slower, by the loader)');
}
// (4.26.1 kept the eyebrow without the site name; 4.159.0 drops the eyebrow from the hero altogether, tested above.)
ddiff --git a/test/site-icons.test.js b/test/site-icons.test.js
iindex d3ca554..e4ae8ff 100644
---- a/test/site-icons.test.js
++++ b/test/site-icons.test.js
@@@ -5,7 +5,10 @@ const assert = require('assert');
const icons = require('../ov-icons.js');
const fallback = icons.resolve('zz-not-an-icon');
--const sites = ['live', 'network', 'tools', 'space', 'website', 'connect', 'shoes', 'tours', 'cam', 'vision', 'design', 'domains', 'report', 'today', 'casino', 'fun', 'meme', 'exchange', 'surf'];
++// 4.182.0: every product on the network (the ids Live's and Network's site grids ask for), and the things sites
++// name as marks. Five products drew the fallback "V" in those grids; a sweep of every home found them.
++const sites = ('live chat games community network tools design quest wiki blog video cam codes actor bot exchange report deals coupons food reviews rent work help events news meme fun casino surf tours trade tips vip vision watch zone space host run domains today media my services computer mail lock locker git barcode link party studio pics drive email bench billing inventory search sources mediahub media-hub openre restream website connect play home node shoes'
++ + ' shoe heart calendar camera').split(' ');
sites.forEach((id) => assert.notStrictEqual(icons.resolve(id), fallback, `${id} draws a real glyph`));
assert.strictEqual(icons.resolve('connect'), 'plug');
console.log(`site icons: ${sites.length} sites draw a real glyph; Connect is the plug`);
ddiff --git a/test/theme-parity.test.js b/test/theme-parity.test.js
iindex 2739a11..bcb271d 100644
---- a/test/theme-parity.test.js
++++ b/test/theme-parity.test.js
@@@ -50,7 +50,8 @@ for (const t of BUILTIN_THEMES) {
assert.ok(LT.arctic['--success'], 'loader entries carry the full token set');
// 62,000 since 4.64.0: the look travels between sites (?ov_look=) and every copy is dated; brotli 15.45 KB (was 15.41) (2026-10-31).
// 63,500 since 4.111.1 (2026-11-05): the FAVICON block draws the Pair (about 1.2 KB raw) instead of the retired ring.
--assert.ok(loader.length < 63500, `theme-loader.js stays small for first paint (${loader.length} characters)`);
++// 66,500 since 4.183.0 (2026-11-10): motion has four choices, --ov-move, and Calm paces endless loops (about 2.9 KB raw).
++assert.ok(loader.length < 66500, `theme-loader.js stays small for first paint (${loader.length} characters)`);
assert.ok(loader.includes('KNOWN_PROPS'), 'loader clears tokens the new theme does not set');
// 5. Derived tokens: text on the accent always reads, on every theme.
ddiff --git a/theme-loader.js b/theme-loader.js
iindex 87c6f84..972a476 100644
---- a/theme-loader.js
++++ b/theme-loader.js
@@@ -215,11 +215,10 @@
// ── A correction fades in ─────────────────────────────────
// A theme that changes under someone (the account's answer, another tab) crossfades for 0.4 s instead of jumping;
-- // first paint and their own picks stay instant, and calm motion (either preference) never fades.
++ // first paint and their own picks stay instant. A colour fade moves nothing, so Calm keeps it; only Off stops it.
let _fadeTimer = 0;
function fadeNext() {
-- if (typeof document === 'undefined' || !document.head || readDisplay().motion === 'reduced') return;
-- try { if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; } catch (e) { /* */ }
++ if (typeof document === 'undefined' || !document.head || motionOf() === 'off') return;
const el = document.documentElement;
if (!document.getElementById('ov-theme-fade-css')) {
const st = document.createElement('style'); st.id = 'ov-theme-fade-css';
@@@ -354,7 +353,7 @@
// ── Display settings, one record for every OpenVibe site: display.get() → DISPLAY_OPTS' values; display.set(patch)
// applies here and in other tabs and saves to the account. <html data-ov-*> and --ov-text-scale before first paint.
-- const DISPLAY_KEY = 'ov_display', DISPLAY_OPTS = { motion: ['auto', 'reduced'], text: ['100', '112', '125'], seasonal: ['on', 'off'], scheme: ['manual', 'auto'], contrast: ['normal', 'more'], font: ['default', 'readable'], colors: ['default', 'cb-safe'], oled: ['off', 'on'], icons: ['auto', 'line', 'solid'] };
++ const DISPLAY_KEY = 'ov_display', DISPLAY_OPTS = { motion: ['auto', 'full', 'reduced', 'off'], text: ['100', '112', '125'], seasonal: ['on', 'off'], scheme: ['manual', 'auto'], contrast: ['normal', 'more'], font: ['default', 'readable'], colors: ['default', 'cb-safe'], oled: ['off', 'on'], icons: ['auto', 'line', 'solid'] };
// Status names some sites use (--error, --error-text, --ok, --warn, --accent-text) that no theme sets: they resolve to the theme's
// readable status colours instead of each site's fallback literal (pale on light themes). :where() keeps them
// below any site's own value (4.86.0).
@@@ -367,6 +366,37 @@
+ 'html[data-ov-colors=cb-safe][data-theme-mode=light]{--success:#0072b2!important;--success-text:#005a8c!important;--warning:#e69f00!important;--warning-text:#8a6100!important;--danger:#d55e00!important;--danger-text:#a84400!important}'
+ 'html[data-ov-oled=on][data-theme-mode=dark]{--bg-primary:#000!important;--bg-secondary:#050608!important;--bg-tertiary:#0b0d12!important;--bg-card:#0a0c10!important;--bg-input:#0b0d12!important;--bg-hover:#12151c!important}';
const COMFORT_ATTRS = { contrast: ['data-ov-contrast', 'normal'], font: ['data-ov-font', 'default'], colors: ['data-ov-colors', 'default'], oled: ['data-ov-oled', 'off'], icons: ['data-ov-icons', 'auto'] };
++ // ── Motion (4.183.0; the owner, 2026-11-10: "still have full motion but actually just reduce it instead of getting
++ // rid of it"). auto follows the device, full plays everything, reduced is Calm (every effect, smaller and slower),
++ // off alone stops motion. <html data-ov-motion=full|reduced|off> is the one signal; --ov-move is what a moving
++ // thing multiplies its distance by (display.move() in script); under Calm an endless loop runs at CALM_RATE.
++ const CALM_MOVE = 0.35, CALM_RATE = 0.6;
++ let _rm = null;
++ function deviceCalm() { try { _rm = _rm || window.matchMedia('(prefers-reduced-motion: reduce)'); return !!_rm.matches; } catch (e) { return false; } }
++ function motionOf(d) { const m = (d || readDisplay()).motion; return m === 'off' ? 'off' : m === 'reduced' ? 'calm' : m === 'full' ? 'full' : deviceCalm() ? 'calm' : 'full'; }
++ function moveOf() { const m = motionOf(); return m === 'off' ? 0 : m === 'calm' ? CALM_MOVE : 1; }
++ const MOTION_CSS = ':where(html){--ov-move:1}html[data-ov-motion=reduced]{--ov-move:' + CALM_MOVE + ';scroll-behavior:auto!important}html[data-ov-motion=off]{--ov-move:0}'
++ + 'html[data-ov-motion=off] *:not([data-fx-demo] *),html[data-ov-motion=off] *:not([data-fx-demo] *)::before,html[data-ov-motion=off] *:not([data-fx-demo] *)::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}'
++ + 'html[data-ov-motion=off]::view-transition-group(*),html[data-ov-motion=off]::view-transition-old(*),html[data-ov-motion=off]::view-transition-new(*){animation-duration:.001ms!important}'
++ + 'html[data-ov-motion=off] .ov-icon .ovi-comet{display:none}';
++ const _paced = typeof WeakSet === 'function' ? new WeakSet() : null;
++ function paceLoops(scope) {
++ if (!_paced || typeof document === 'undefined') return;
++ try {
++ const calm = document.documentElement.getAttribute('data-ov-motion') === 'reduced';
++ const list = scope && scope.getAnimations ? scope.getAnimations({ subtree: true }) : document.getAnimations();
++ for (let i = 0; i < list.length; i++) {
++ const a = list[i], fx = a.effect, t = fx && fx.getComputedTiming ? fx.getComputedTiming() : null;
++ if (!t || t.iterations !== Infinity) continue;
++ const el = fx.target, slow = calm && !(el && el.closest && el.closest('[data-fx-demo]'));
++ if (slow && !_paced.has(a)) { _paced.add(a); a.updatePlaybackRate(a.playbackRate * CALM_RATE); }
++ else if (!slow && _paced.has(a)) { _paced.delete(a); a.updatePlaybackRate(a.playbackRate / CALM_RATE); }
++ }
++ } catch (e) { /* no Web Animations here: loops keep their own speed */ }
++ }
++ if (typeof document !== 'undefined' && document.addEventListener) {
++ document.addEventListener('animationstart', function (e) { if (document.documentElement.getAttribute('data-ov-motion') === 'reduced') paceLoops(e.target); }, true);
++ }
function readDisplay() {
const out = { motion: 'auto', text: '100', seasonal: 'on', scheme: 'manual', contrast: 'normal', font: 'default', colors: 'default', oled: 'off', icons: 'auto' };
try { const d = JSON.parse(localStorage.getItem(DISPLAY_KEY) || 'null') || {}; for (const k in DISPLAY_OPTS) if (DISPLAY_OPTS[k].indexOf(String(d[k])) >= 0) out[k] = String(d[k]); } catch (e) { /* */ }
@@@ -375,14 +405,16 @@
function applyDisplay(d) {
if (typeof document === 'undefined') return;
const el = document.documentElement;
-- if (d.motion === 'reduced') el.setAttribute('data-ov-motion', 'reduced'); else el.removeAttribute('data-ov-motion');
++ const m = motionOf(d), attr = m === 'off' ? 'off' : m === 'calm' ? 'reduced' : d.motion === 'full' ? 'full' : '';
++ if (attr) el.setAttribute('data-ov-motion', attr); else el.removeAttribute('data-ov-motion');
if (d.text === '100') { el.style.removeProperty('--ov-text-scale'); el.removeAttribute('data-ov-text'); } else { el.style.setProperty('--ov-text-scale', String(parseInt(d.text, 10) / 100)); el.setAttribute('data-ov-text', d.text); }
for (const k in COMFORT_ATTRS) { const [attr, off] = COMFORT_ATTRS[k]; if (d[k] && d[k] !== off) el.setAttribute(attr, d[k]); else el.removeAttribute(attr); }
if (!document.getElementById('ov-display-css') && document.head) {
const st = document.createElement('style'); st.id = 'ov-display-css';
-- st.textContent = 'html[data-ov-text]{font-size:calc(100% * var(--ov-text-scale,1))}html[data-ov-motion=reduced] *:not([data-fx-demo] *),html[data-ov-motion=reduced] *:not([data-fx-demo] *)::before,html[data-ov-motion=reduced] *:not([data-fx-demo] *)::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}html[data-ov-motion=reduced] .ov-icon .ovi-comet{display:none}' + ALIAS_CSS + COMFORT_CSS;
++ st.textContent = 'html[data-ov-text]{font-size:calc(100% * var(--ov-text-scale,1))}' + MOTION_CSS + ALIAS_CSS + COMFORT_CSS;
document.head.appendChild(st);
}
++ paceLoops();
try { window.dispatchEvent(new CustomEvent('ov:display', { detail: d })); } catch (e) { /* */ }
}
/** When the display settings in this browser were last changed (ms), or 0 for a copy older than 4.64.0. */
@@@ -594,6 +626,14 @@
} catch (e) { /* no media queries */ }
}
++ if (typeof window !== 'undefined' && window.matchMedia) {
++ try {
++ const rmq = window.matchMedia('(prefers-reduced-motion: reduce)');
++ const onMotion = function () { if (readDisplay().motion === 'auto') applyDisplay(readDisplay()); };
++ if (rmq.addEventListener) rmq.addEventListener('change', onMotion); else if (rmq.addListener) rmq.addListener(onMotion);
++ } catch (e) { /* no media queries */ }
++ }
++
// A theme not in the built-in map (community, custom) comes from the catalog, never falls back to the default.
function fetchThemeVars(themeId) {
return fetch(_config.apiBase + '/api/themes/' + encodeURIComponent(themeId))
@@@ -661,7 +701,7 @@
// ── Public API ───────────────────────────────────────────
const OpenVibeThemeLoader = {
THEMES: THEMES,
-- display: { get: readDisplay, set: setDisplay, options: DISPLAY_OPTS },
++ display: { get: readDisplay, set: setDisplay, options: DISPLAY_OPTS, motion: function () { return motionOf(); }, move: moveOf },
apply: applyById,
applyVars: applyVars,
// Seasons: SEASONS, now() → the season today (or null), showing() → the season whose theme is on screen (or null)
ddiff --git a/thread.css b/thread.css
iindex b38bec3..04fcc84 100644
---- a/thread.css
++++ b/thread.css
@@@ -94,7 +94,7 @@
/* An answer that types in (ov-thread.js reveal): only opacity, so a screen reader reads it all at once. */
.ovt-answer.is-revealing .ovt-sw { opacity: 0; transition: opacity .28s ease-out; }
.ovt-answer.is-revealing .ovt-sw.on { opacity: 1; }
--html[data-ov-motion=reduced] .ovt-answer.is-revealing .ovt-sw { opacity: 1 !important; transition: none !important; }
++html[data-ov-motion=off] .ovt-answer.is-revealing .ovt-sw{opacity: 1 !important}
.ovt-answer pre:has(.ovt-code-copy) { padding-right: 68px; }
.ovt-code-copy { position: absolute; top: 6px; right: 6px; padding: 2px 8px; border-radius: 8px; border: 1px solid var(--ovt-line); background: var(--bg-card, #131c2e); color: var(--text-secondary, #96a7c2); font-size: 12px; cursor: pointer; }
.ovt-files { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
@@@ -211,12 +211,7 @@ html[data-ov-motion=reduced] .ovt-answer.is-revealing .ovt-sw { opacity: 1 !impo
@keyframes ovt-rise { from { opacity: 0; transform: translateY(8px); } }
@keyframes ovt-fade { from { opacity: 0; } }
@keyframes ovt-shimmer { to { background-position: -300% 0; } }
--@media (prefers-reduced-motion: reduce) {
-- .ovt-dot, .ovt-turn[data-open] .ovt-avatar, .ovt-w-live, .ovt-turn.is-new .ovt-bubble, .ovt-turn.is-fresh .ovt-answer { animation: none; }
-- .ovt-answer.is-revealing .ovt-sw { opacity: 1 !important; transition: none !important; }
-- .ovt-w-live { color: var(--text-secondary, #96a7c2); background: none; }
-- .ovt-panel, .ovt-chev { transition: none; }
--}
++html[data-ov-motion=off] .ovt-answer.is-revealing .ovt-sw{opacity: 1 !important}html[data-ov-motion=off] .ovt-w-live{color: var(--text-secondary, #96a7c2);background: none}
/* ── The composer's Options (11-09, the owner: "too many options… hidden under a cog… less cluttered but still has the power
features"): one button; the pickers in a panel above it on a computer, a sheet on a phone; what differs from the defaults
@@@ -274,10 +269,6 @@ html.ovt-sheet-open, html.ovt-sheet-open body { overflow: hidden; }
.ovt.has-nav-lead .ovt-head [data-ovk-sidebar-open] { display: none; }
.ovt.has-nav-lead .ovt-head:not(:has(> :not([data-ovk-sidebar-open], span.ovt-title:empty))) { display: none; }
}
--@media (prefers-reduced-motion: reduce) {
-- .ovt-opts-panel, .ovt-opt-chip, .ovt-opts[open]::before { animation: none; }
-- :where([data-ovt-fold]) { transition: none; }
--}
/* Answers' actions are icon buttons (11-09): 32 px, the word as tooltip; a copy shows a tick for a moment. */
.ovt-acts .ovt-act { width: 32px; padding: 0; justify-content: center; }
ddiff --git a/tooltip.js b/tooltip.js
iindex 0344c8e..a8f0278 100644
---- a/tooltip.js
++++ b/tooltip.js
@@@ -74,7 +74,7 @@
.ovtip-arrow{display:none}
.ovtip-title{font-size:1rem}
}
--@media (prefers-reduced-motion:reduce){.ovtip{transition:opacity .12s}.ovtip.is-on::after{animation:none}}`;
++`;
let tip = null, arrow = null, current = null, raf = 0, hideTimer = 0;
const isTouch = () => window.matchMedia('(hover: none)').matches;
ddiff --git a/ui.js b/ui.js
iindex ec9a5e8..3d5f348 100644
---- a/ui.js
++++ b/ui.js
@@@ -56,7 +56,7 @@
@keyframes ovuiOut{to{opacity:0;transform:translateX(16px)}}
@keyframes ovuiFade{from{opacity:0}to{opacity:1}}
@media (max-width:560px){.ovui-toasts{left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom,0px));max-width:none}}
--@media (prefers-reduced-motion:reduce){.ovui-toast,.ovui-dialog,.ovui-back{animation:none!important}}`;
++`;
function css() { if (document.getElementById('ovui-css')) return; const s = document.createElement('style'); s.id = 'ovui-css'; s.textContent = CSS; document.head.appendChild(s); }
function el(tag, cls, text) { const e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = String(text); return e; }
ddiff --git a/vibes-pay.js b/vibes-pay.js
iindex 8c89b76..7acc4f5 100644
---- a/vibes-pay.js
++++ b/vibes-pay.js
@@@ -134,7 +134,7 @@
.ov-vibes-pay:hover { background: var(--ov-vibes-accent-light); }
.ov-vibes-pay:focus-visible { outline: 3px solid color-mix(in srgb, var(--ov-vibes-accent) 55%, transparent); outline-offset: 2px; }
.ov-vibes-pay:disabled, .ov-vibes-pay[aria-busy="true"] { opacity: .62; cursor: progress; }
--@media (prefers-reduced-motion: no-preference) { .ov-vibes-pay { transition: background-color .15s ease; } }
++.ov-vibes-pay { transition: background-color .15s ease; }
`;
function ensureStyles() {