Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
c3e64d5
feat(speedcurve): add @speedcurve/lux to catalog
zizzfizzix May 17, 2026
8ef8647
feat(speedcurve): add afterNextPaint utility
zizzfizzix May 17, 2026
7ab8999
feat(speedcurve): add SpeedCurveOptions schema
zizzfizzix May 17, 2026
1269c31
feat(speedcurve): add useScriptSpeedCurve composable
zizzfizzix May 17, 2026
8d6d52d
feat(speedcurve): register SpeedCurve LUX in registry
zizzfizzix May 17, 2026
43f8ad5
feat(speedcurve): add SpeedCurve logo
zizzfizzix May 17, 2026
0a8a765
chore(speedcurve): regenerate registry-types.json
zizzfizzix May 17, 2026
75b3af4
fix(speedcurve): add ScriptRegistry type + peerDependency
zizzfizzix May 17, 2026
a20cb78
test(speedcurve): add primer injection unit tests
zizzfizzix May 17, 2026
602383a
test(speedcurve): add config apply unit tests
zizzfizzix May 17, 2026
481820d
test(speedcurve): add auto-tracker unit tests
zizzfizzix May 17, 2026
d2e2afb
test(speedcurve): add afterNextPaint unit tests
zizzfizzix May 17, 2026
7689d3b
test(speedcurve): add e2e fixture pages
zizzfizzix May 17, 2026
02385f5
test(speedcurve): add comprehensive e2e tests
zizzfizzix May 17, 2026
25cb1ab
feat(speedcurve): add playground page
zizzfizzix May 17, 2026
3d0f6da
docs(speedcurve): add user-facing documentation
zizzfizzix May 17, 2026
a78d4e2
feat(speedcurve): add speedcurve entry to script-meta registry
zizzfizzix May 17, 2026
0a504a5
chore(speedcurve): fix all ESLint issues
zizzfizzix May 17, 2026
c2dd394
chore(speedcurve): fix ESLint issues, restore SPA capitalization, con…
zizzfizzix May 17, 2026
c8cee0e
refactor(speedcurve): type SpeedCurveInput with upstream UserConfig; …
zizzfizzix May 17, 2026
6762b9f
test(speedcurve): increase timeout for autoTrackSpaNavigations=false …
zizzfizzix May 17, 2026
8caadd0
fix(speedcurve): block CDN in e2e tests; fix composableName casing
zizzfizzix May 17, 2026
393d677
feat(speedcurve): replace placeholder logo with official SpeedCurve i…
zizzfizzix May 17, 2026
10e0e4c
feat(speedcurve): use brand colors in logo (#3c95c5 light, #fff dark)
zizzfizzix May 17, 2026
e4b6e0c
fix(speedcurve): self-review fixes
zizzfizzix May 18, 2026
8581927
feat(speedcurve): restructure playground into A→B→C chains per SPA mode
zizzfizzix May 18, 2026
8bd9201
fix(speedcurve): unify label/labelFor, remove auto option
zizzfizzix May 18, 2026
539a02a
fix(speedcurve): address CodeRabbit review feedback
zizzfizzix May 18, 2026
59b6925
fix(speedcurve): address CR nitpicks — imports, regression test
zizzfizzix May 18, 2026
9fec586
fix(speedcurve): don't forward setup callback to browser.newPage()
zizzfizzix May 18, 2026
590a606
revert(speedcurve): remove setup callback from basic.test.ts
zizzfizzix May 18, 2026
d0ff15a
fix(speedcurve): update e2e fixtures to use label instead of labelFor
zizzfizzix May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion FIRST_PARTY.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ Four presets in `proxy-configs.ts` cover all proxy-enabled scripts:
| `PRIVACY_HEATMAP` | ip, language, hardware | GA, Clarity, Hotjar |
| `PRIVACY_IP_ONLY` | ip only | PostHog, Plausible, Umami, Rybbit, Databuddy, Ahrefs, Fathom, CF Web Analytics, Vercel, Matomo, Carbon Ads, Lemon Squeezy, Intercom, Gravatar, YouTube, Vimeo, Calendly |

Note: GTM, Segment, Crisp, Mixpanel, and Bing UET are bundle-only (no proxy capability), so no privacy transforms are applied.
Note: GTM, Segment, Crisp, Mixpanel, Bing UET, and SpeedCurve have no proxy capability, so no privacy transforms are applied.

## Script Support

Expand Down Expand Up @@ -150,6 +150,7 @@ Note: GTM, Segment, Crisp, Mixpanel, and Bing UET are bundle-only (no proxy capa
| `googleTagManager` | googleTagManager | n/a | Bundle only |
| `segment` | segment | n/a | Bundle only |
| `crisp` | crisp | n/a | Bundle only |
| `speedcurve` | speedcurve | n/a | No proxy (ID-parameterized CDN URL) |

### Excluded from first-party mode (`proxy: false`)

Expand Down
108 changes: 108 additions & 0 deletions docs/content/scripts/speedcurve.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
---
title: SpeedCurve LUX
description: Use SpeedCurve LUX Real User Monitoring in your Nuxt app to measure performance experienced by real users, with automatic SPA navigation tracking.
links:
- label: Source
icon: i-simple-icons-github
to: https://github.com/nuxt/scripts/blob/main/packages/script/src/runtime/registry/speedcurve.ts
size: xs
---

[SpeedCurve LUX](https://speedcurve.com/features/lux/) is a Real User Monitoring (RUM) tool that measures the performance your users experience. It tracks Core Web Vitals, custom timing marks, and JavaScript errors.

::script-stats
::

::script-docs
::

The composable comes with the following defaults:
<!-- eslint-disable-next-line harlanzw/ai-deslop-passive-voice -->
- **Trigger: Client** The LUX primer is injected into `<head>`{lang="html"} immediately; `lux.js` loads when Nuxt hydrates.

You can access the `LUX` object as a proxy directly, or await `$script` to get the loaded instance.

::code-group

```ts [Proxy]
const { proxy } = useScriptSpeedCurve({ id: 'YOUR_ID' })
proxy.LUX.label = 'my-page'
```

```ts [onLoaded]
const { onLoaded } = useScriptSpeedCurve({ id: 'YOUR_ID' })
onLoaded(({ LUX }) => {
LUX.label = 'my-page'
})
```

::

## SPA navigation

Set `spaMode: true` to enable SpeedCurve's SPA tracking mode. The composable wires Vue Router automatically:

- `router.beforeEach` calls `LUX.startSoftNavigation()`{lang="ts"} (closes the previous beacon, starts a new one)
- `nuxt.hook('page:finish')`{lang="ts"} calls `LUX.markLoadTime()`{lang="ts"} after the next paint (sets the END mark)
- Cancelled navigations seal the phantom beacon with `addData('luxNavFailed', '1')`{lang="ts"} for easy filtering

```ts [app.vue]
useScriptSpeedCurve({
id: 'YOUR_ID',
spaMode: true,
autoTrackSpaNavigations: true, // default when spaMode is true
})
```

To disable auto-wiring and instrument manually:

```ts
useScriptSpeedCurve({
id: 'YOUR_ID',
spaMode: true,
autoTrackSpaNavigations: false,
})
// Then call LUX.startSoftNavigation() and LUX.markLoadTime() yourself
```

## Custom page labels

By default the composable uses `String(to.name ?? to.path)`{lang="ts"} as the page label for each navigation. Pass a function to `label` to override it:

```ts
useScriptSpeedCurve({
id: 'YOUR_ID',
spaMode: true,
label: to => to.meta.title as string ?? to.path,
})
```

Set `label: false` to disable labeling entirely. Pass a plain string to set a static label (only meaningful without `spaMode`, since the router hook overwrites it on every navigation).

## CSP

Add these directives to your Content Security Policy:

```text
script-src cdn.speedcurve.com;
img-src lux.speedcurve.com;
connect-src lux.speedcurve.com beacon.speedcurve.com;
```

Reference: https://support.speedcurve.com/docs/add-rum-to-your-csp

::script-types
::

## Example

Loading SpeedCurve LUX through `app.vue` with SPA tracking enabled.

```vue [app.vue]
<script setup lang="ts">
useScriptSpeedCurve({
id: 'YOUR_SPEEDCURVE_ID',
spaMode: true,
})
</script>
```
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"dev": "nuxt dev playground",
"dev:ssl": "nuxt dev playground --https",
"dev:prepare": "pnpm -r dev:prepare && nuxt prepare && nuxt prepare playground && pnpm prepare:fixtures",
"prepare:fixtures": "nuxt prepare test/fixtures/basic && nuxt prepare test/fixtures/cdn && nuxt prepare test/fixtures/extend-registry && nuxt prepare test/fixtures/partytown && nuxt prepare test/fixtures/first-party && nuxt prepare test/fixtures/linkedin-insight && nuxt prepare test/fixtures/linkedin-insight-cdn && nuxt prepare test/fixtures/calendly && nuxt prepare test/fixtures/calendly-cdn && nuxt prepare test/fixtures/ahrefs-analytics && nuxt prepare test/fixtures/ahrefs-analytics-cdn && nuxt prepare test/fixtures/usercentrics",
"prepare:fixtures": "nuxt prepare test/fixtures/basic && nuxt prepare test/fixtures/cdn && nuxt prepare test/fixtures/extend-registry && nuxt prepare test/fixtures/partytown && nuxt prepare test/fixtures/first-party && nuxt prepare test/fixtures/linkedin-insight && nuxt prepare test/fixtures/linkedin-insight-cdn && nuxt prepare test/fixtures/calendly && nuxt prepare test/fixtures/calendly-cdn && nuxt prepare test/fixtures/ahrefs-analytics && nuxt prepare test/fixtures/ahrefs-analytics-cdn && nuxt prepare test/fixtures/usercentrics && nuxt prepare test/fixtures/speedcurve",
"typecheck": "nuxt typecheck",
"release": "pnpm build && bumpp -r --output=CHANGELOG.md",
"lint": "eslint .",
Expand Down
6 changes: 6 additions & 0 deletions packages/script/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,15 @@
"unimport",
"#nuxt-scripts/types",
"posthog-js",
"@speedcurve/lux",
"@nuxt/devtools-kit",
"sirv"
]
},
"peerDependencies": {
"@googlemaps/markerclusterer": "^2.6.2",
"@paypal/paypal-js": "^8.1.2 || ^9.0.0",
"@speedcurve/lux": "^4.4.3",
"@stripe/stripe-js": "^7.0.0 || ^8.0.0 || ^9.0.0",
"@types/google.maps": "^3.58.1",
"@types/vimeo__player": "^2.18.3",
Expand All @@ -89,6 +91,9 @@
"@paypal/paypal-js": {
"optional": true
},
"@speedcurve/lux": {
"optional": true
},
"@stripe/stripe-js": {
"optional": true
},
Expand Down Expand Up @@ -130,6 +135,7 @@
"devDependencies": {
"@nuxt/kit": "catalog:",
"@nuxt/module-builder": "catalog:",
"@speedcurve/lux": "catalog:",
"rollup": "catalog:",
"unbuild": "catalog:",
"unimport": "catalog:"
Expand Down
4 changes: 4 additions & 0 deletions packages/script/src/registry-logos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,8 @@ export const LOGOS = {
usercentrics: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><circle cx="16" cy="16" r="16" fill="#1976d2"/><path fill="#fff" d="M16 7.5a4.25 4.25 0 1 0 0 8.5a4.25 4.25 0 0 0 0-8.5m-7 17a7 7 0 0 1 14 0v.5H9z"/></svg>`,
bingUet: `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 256 256"><path fill="#F25022" d="M0 0h121.5v121.5H0z"/><path fill="#7FBA00" d="M134.5 0H256v121.5H134.5z"/><path fill="#00A4EF" d="M0 134.5h121.5V256H0z"/><path fill="#FFB900" d="M134.5 134.5H256V256H134.5z"/></svg>`,
snapchatPixel: `<svg width="50" height="50" viewBox="147.353 39.286 514.631 514.631" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"><path style="fill:#FFFC00;" d="M147.553,423.021v0.023c0.308,11.424,0.403,22.914,2.33,34.268 c2.042,12.012,4.961,23.725,10.53,34.627c7.529,14.756,17.869,27.217,30.921,37.396c9.371,7.309,19.608,13.111,30.94,16.771 c16.524,5.33,33.571,7.373,50.867,7.473c10.791,0.068,21.575,0.338,32.37,0.293c78.395-0.33,156.792,0.566,235.189-0.484 c10.403-0.141,20.636-1.41,30.846-3.277c19.569-3.582,36.864-11.932,51.661-25.133c17.245-15.381,28.88-34.205,34.132-56.924 c3.437-14.85,4.297-29.916,4.444-45.035v-3.016c0-1.17-0.445-256.892-0.486-260.272c-0.115-9.285-0.799-18.5-2.54-27.636 c-2.117-11.133-5.108-21.981-10.439-32.053c-5.629-10.641-12.68-20.209-21.401-28.57c-13.359-12.81-28.775-21.869-46.722-26.661 c-16.21-4.327-32.747-5.285-49.405-5.27c-0.027-0.004-0.09-0.173-0.094-0.255H278.56c-0.005,0.086-0.008,0.172-0.014,0.255 c-9.454,0.173-18.922,0.102-28.328,1.268c-10.304,1.281-20.509,3.21-30.262,6.812c-15.362,5.682-28.709,14.532-40.11,26.347 c-12.917,13.386-22.022,28.867-26.853,46.894c-4.31,16.084-5.248,32.488-5.271,49.008"/><path style="fill:#FFFFFF;" d="M407.001,473.488c-1.068,0-2.087-0.039-2.862-0.076c-0.615,0.053-1.25,0.076-1.886,0.076 c-22.437,0-37.439-10.607-50.678-19.973c-9.489-6.703-18.438-13.031-28.922-14.775c-5.149-0.854-10.271-1.287-15.22-1.287 c-8.917,0-15.964,1.383-21.109,2.389c-3.166,0.617-5.896,1.148-8.006,1.148c-2.21,0-4.895-0.49-6.014-4.311 c-0.887-3.014-1.523-5.934-2.137-8.746c-1.536-7.027-2.65-11.316-5.281-11.723c-28.141-4.342-44.768-10.738-48.08-18.484 c-0.347-0.814-0.541-1.633-0.584-2.443c-0.129-2.309,1.501-4.334,3.777-4.711c22.348-3.68,42.219-15.492,59.064-35.119 c13.049-15.195,19.457-29.713,20.145-31.316c0.03-0.072,0.065-0.148,0.101-0.217c3.247-6.588,3.893-12.281,1.926-16.916 c-3.626-8.551-15.635-12.361-23.58-14.882c-1.976-0.625-3.845-1.217-5.334-1.808c-7.043-2.782-18.626-8.66-17.083-16.773 c1.124-5.916,8.949-10.036,15.273-10.036c1.756,0,3.312,0.308,4.622,0.923c7.146,3.348,13.575,5.045,19.104,5.045 c6.876,0,10.197-2.618,11-3.362c-0.198-3.668-0.44-7.546-0.674-11.214c0-0.004-0.005-0.048-0.005-0.048 c-1.614-25.675-3.627-57.627,4.546-75.95c24.462-54.847,76.339-59.112,91.651-59.112c0.408,0,6.674-0.062,6.674-0.062 c0.283-0.005,0.59-0.009,0.908-0.009c15.354,0,67.339,4.27,91.816,59.15c8.173,18.335,6.158,50.314,4.539,76.016l-0.076,1.23 c-0.222,3.49-0.427,6.793-0.6,9.995c0.756,0.696,3.795,3.096,9.978,3.339c5.271-0.202,11.328-1.891,17.998-5.014 c2.062-0.968,4.345-1.169,5.895-1.169c2.343,0,4.727,0.456,6.714,1.285l0.106,0.041c5.66,2.009,9.367,6.024,9.447,10.242 c0.071,3.932-2.851,9.809-17.223,15.485c-1.472,0.583-3.35,1.179-5.334,1.808c-7.952,2.524-19.951,6.332-23.577,14.878 c-1.97,4.635-1.322,10.326,1.926,16.912c0.036,0.072,0.067,0.145,0.102,0.221c1,2.344,25.205,57.535,79.209,66.432 c2.275,0.379,3.908,2.406,3.778,4.711c-0.048,0.828-0.248,1.656-0.598,2.465c-3.289,7.703-19.915,14.09-48.064,18.438 c-2.642,0.408-3.755,4.678-5.277,11.668c-0.63,2.887-1.271,5.717-2.146,8.691c-0.819,2.797-2.641,4.164-5.567,4.164h-0.441 c-1.905,0-4.604-0.346-8.008-1.012c-5.95-1.158-12.623-2.236-21.109-2.236c-4.948,0-10.069,0.434-15.224,1.287 c-10.473,1.744-19.421,8.062-28.893,14.758C444.443,462.88,429.436,473.488,407.001,473.488"/><path style="fill:#020202;" d="M408.336,124.235c14.455,0,64.231,3.883,87.688,56.472c7.724,17.317,5.744,48.686,4.156,73.885 c-0.248,3.999-0.494,7.875-0.694,11.576l-0.084,1.591l1.062,1.185c0.429,0.476,4.444,4.672,13.374,5.017l0.144,0.008l0.15-0.003 c5.904-0.225,12.554-2.059,19.776-5.442c1.064-0.498,2.48-0.741,3.978-0.741c1.707,0,3.521,0.321,5.017,0.951l0.226,0.09 c3.787,1.327,6.464,3.829,6.505,6.093c0.022,1.28-0.935,5.891-14.359,11.194c-1.312,0.518-3.039,1.069-5.041,1.7 c-8.736,2.774-21.934,6.96-26.376,17.427c-2.501,5.896-1.816,12.854,2.034,20.678c1.584,3.697,26.52,59.865,82.631,69.111 c-0.011,0.266-0.079,0.557-0.229,0.9c-0.951,2.24-6.996,9.979-44.612,15.783c-5.886,0.902-7.328,7.5-9,15.17 c-0.604,2.746-1.218,5.518-2.062,8.381c-0.258,0.865-0.306,0.914-1.233,0.914c-0.128,0-0.278,0-0.442,0 c-1.668,0-4.2-0.346-7.135-0.922c-5.345-1.041-12.647-2.318-21.982-2.318c-5.21,0-10.577,0.453-15.962,1.352 c-11.511,1.914-20.872,8.535-30.786,15.543c-13.314,9.408-27.075,19.143-48.071,19.143c-0.917,0-1.812-0.031-2.709-0.076 l-0.236-0.01l-0.237,0.018c-0.515,0.045-1.034,0.068-1.564,0.068c-20.993,0-34.76-9.732-48.068-19.143 c-9.916-7.008-19.282-13.629-30.791-15.543c-5.38-0.896-10.752-1.352-15.959-1.352c-9.333,0-16.644,1.428-21.978,2.471 c-2.935,0.574-5.476,1.066-7.139,1.066c-1.362,0-1.388-0.08-1.676-1.064c-0.844-2.865-1.461-5.703-2.062-8.445 c-1.676-7.678-3.119-14.312-9.002-15.215c-37.613-5.809-43.659-13.561-44.613-15.795c-0.149-0.352-0.216-0.652-0.231-0.918 c56.11-9.238,81.041-65.408,82.63-69.119c3.857-7.818,4.541-14.775,2.032-20.678c-4.442-10.461-17.638-14.653-26.368-17.422 c-2.007-0.635-3.735-1.187-5.048-1.705c-11.336-4.479-14.823-8.991-14.305-11.725c0.601-3.153,6.067-6.359,10.837-6.359 c1.072,0,2.012,0.173,2.707,0.498c7.747,3.631,14.819,5.472,21.022,5.472c9.751,0,14.091-4.537,14.557-5.055l1.057-1.182 l-0.085-1.583c-0.197-3.699-0.44-7.574-0.696-11.565c-1.583-25.205-3.563-56.553,4.158-73.871 c23.37-52.396,72.903-56.435,87.525-56.435c0.36,0,6.717-0.065,6.717-0.065C407.744,124.239,408.033,124.235,408.336,124.235 M408.336,115.197h-0.017c-0.333,0-0.646,0-0.944,0.004c-2.376,0.024-6.282,0.062-6.633,0.066c-8.566,0-25.705,1.21-44.115,9.336 c-10.526,4.643-19.994,10.921-28.14,18.66c-9.712,9.221-17.624,20.59-23.512,33.796c-8.623,19.336-6.576,51.905-4.932,78.078 l0.006,0.041c0.176,2.803,0.361,5.73,0.53,8.582c-1.265,0.581-3.316,1.194-6.339,1.194c-4.864,0-10.648-1.555-17.187-4.619 c-1.924-0.896-4.12-1.349-6.543-1.349c-3.893,0-7.997,1.146-11.557,3.239c-4.479,2.63-7.373,6.347-8.159,10.468 c-0.518,2.726-0.493,8.114,5.492,13.578c3.292,3.008,8.128,5.782,14.37,8.249c1.638,0.645,3.582,1.261,5.641,1.914 c7.145,2.271,17.959,5.702,20.779,12.339c1.429,3.365,0.814,7.793-1.823,13.145c-0.069,0.146-0.138,0.289-0.201,0.439 c-0.659,1.539-6.807,15.465-19.418,30.152c-7.166,8.352-15.059,15.332-23.447,20.752c-10.238,6.617-21.316,10.943-32.923,12.855 c-4.558,0.748-7.813,4.809-7.559,9.424c0.078,1.33,0.39,2.656,0.931,3.939c0.004,0.008,0.009,0.016,0.013,0.023 c1.843,4.311,6.116,7.973,13.063,11.203c8.489,3.943,21.185,7.26,37.732,9.855c0.836,1.59,1.704,5.586,2.305,8.322 c0.629,2.908,1.285,5.898,2.22,9.074c1.009,3.441,3.626,7.553,10.349,7.553c2.548,0,5.478-0.574,8.871-1.232 c4.969-0.975,11.764-2.305,20.245-2.305c4.702,0,9.575,0.414,14.48,1.229c9.455,1.574,17.606,7.332,27.037,14 c13.804,9.758,29.429,20.803,53.302,20.803c0.651,0,1.304-0.021,1.949-0.066c0.789,0.037,1.767,0.066,2.799,0.066 c23.88,0,39.501-11.049,53.29-20.799l0.022-0.02c9.433-6.66,17.575-12.41,27.027-13.984c4.903-0.814,9.775-1.229,14.479-1.229 c8.102,0,14.517,1.033,20.245,2.15c3.738,0.736,6.643,1.09,8.872,1.09l0.218,0.004h0.226c4.917,0,8.53-2.699,9.909-7.422 c0.916-3.109,1.57-6.029,2.215-8.986c0.562-2.564,1.46-6.674,2.296-8.281c16.558-2.6,29.249-5.91,37.739-9.852 c6.931-3.215,11.199-6.873,13.053-11.166c0.556-1.287,0.881-2.621,0.954-3.979c0.261-4.607-2.999-8.676-7.56-9.424 c-51.585-8.502-74.824-61.506-75.785-63.758c-0.062-0.148-0.132-0.295-0.205-0.438c-2.637-5.354-3.246-9.777-1.816-13.148 c2.814-6.631,13.621-10.062,20.771-12.332c2.07-0.652,4.021-1.272,5.646-1.914c7.039-2.78,12.07-5.796,15.389-9.221 c3.964-4.083,4.736-7.995,4.688-10.555c-0.121-6.194-4.856-11.698-12.388-14.393c-2.544-1.052-5.445-1.607-8.399-1.607 c-2.011,0-4.989,0.276-7.808,1.592c-6.035,2.824-11.441,4.368-16.082,4.588c-2.468-0.125-4.199-0.66-5.32-1.171 c0.141-2.416,0.297-4.898,0.458-7.486l0.067-1.108c1.653-26.19,3.707-58.784-4.92-78.134c-5.913-13.253-13.853-24.651-23.604-33.892 c-8.178-7.744-17.678-14.021-28.242-18.661C434.052,116.402,416.914,115.197,408.336,115.197"/><rect x="147.553" y="39.443" style="fill:none;" width="514.231" height="514.23"/></svg>`,
speedcurve: {
light: `<svg viewBox="0 0 70 70" width="32" height="32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M65.2 24.44a16.81 16.81 0 0 0-11.61-4.53c-4.39 0-8.51 1.6-11.61 4.53l-8.24 7.76c-.16.16-.3.34-.45.58l-.04.08-.08.04c-.26.14-.45.27-.61.43l-8.66 8.16c-2 1.89-4.66 2.93-7.5 2.93-2.82 0-5.48-1.04-7.49-2.93a9.6 9.6 0 0 1 0-14.13l9.05-8.53c.05-.04.09-.1.13-.15l.07-.09 12.8-12.07a3.84 3.84 0 0 1 2.65-1.03c1 0 1.94.36 2.65 1.03a3.41 3.41 0 0 1 0 5L15.43 31.14a2.64 2.64 0 0 0 0 3.88c.55.52 1.28.8 2.06.8s1.5-.28 2.06-.8l20.82-19.64a8.7 8.7 0 0 0 2.8-6.37c0-2.41-1-4.68-2.8-6.38A9.8 9.8 0 0 0 33.61 0a9.8 9.8 0 0 0-6.76 2.64l-13.9 13.1-.13.15-.07.1-7.95 7.49C1.7 26.4 0 30.28 0 34.42s1.7 8.03 4.8 10.95a16.81 16.81 0 0 0 11.6 4.53c4.4 0 8.51-1.6 11.61-4.53l8.66-8.17c.16-.15.3-.33.45-.57l.05-.08.08-.04c.25-.14.45-.27.6-.43l8.24-7.76c2-1.89 4.67-2.93 7.5-2.93s5.49 1.04 7.49 2.93c2 1.89 3.1 4.4 3.1 7.06 0 2.67-1.1 5.18-3.1 7.07L38.84 63.42a4.1 4.1 0 0 1-2.8 1.1 4.07 4.07 0 0 1-2.81-1.1 3.6 3.6 0 0 1 0-5.29l21.53-20.3a2.65 2.65 0 0 0 0-3.88 2.98 2.98 0 0 0-2.06-.8c-.77 0-1.5.28-2.05.8L29.1 54.25a8.91 8.91 0 0 0-2.86 6.53 8.91 8.91 0 0 0 2.86 6.52c1.85 1.74 4.3 2.7 6.92 2.7s5.08-.96 6.92-2.7L65.2 46.33c3.1-2.93 4.8-6.81 4.8-10.95 0-4.13-1.7-8.02-4.8-10.94" fill="#3c95c5"></path></g></svg>`,
dark: `<svg viewBox="0 0 70 70" width="32" height="32" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="M65.2 24.44a16.81 16.81 0 0 0-11.61-4.53c-4.39 0-8.51 1.6-11.61 4.53l-8.24 7.76c-.16.16-.3.34-.45.58l-.04.08-.08.04c-.26.14-.45.27-.61.43l-8.66 8.16c-2 1.89-4.66 2.93-7.5 2.93-2.82 0-5.48-1.04-7.49-2.93a9.6 9.6 0 0 1 0-14.13l9.05-8.53c.05-.04.09-.1.13-.15l.07-.09 12.8-12.07a3.84 3.84 0 0 1 2.65-1.03c1 0 1.94.36 2.65 1.03a3.41 3.41 0 0 1 0 5L15.43 31.14a2.64 2.64 0 0 0 0 3.88c.55.52 1.28.8 2.06.8s1.5-.28 2.06-.8l20.82-19.64a8.7 8.7 0 0 0 2.8-6.37c0-2.41-1-4.68-2.8-6.38A9.8 9.8 0 0 0 33.61 0a9.8 9.8 0 0 0-6.76 2.64l-13.9 13.1-.13.15-.07.1-7.95 7.49C1.7 26.4 0 30.28 0 34.42s1.7 8.03 4.8 10.95a16.81 16.81 0 0 0 11.6 4.53c4.4 0 8.51-1.6 11.61-4.53l8.66-8.17c.16-.15.3-.33.45-.57l.05-.08.08-.04c.25-.14.45-.27.6-.43l8.24-7.76c2-1.89 4.67-2.93 7.5-2.93s5.49 1.04 7.49 2.93c2 1.89 3.1 4.4 3.1 7.06 0 2.67-1.1 5.18-3.1 7.07L38.84 63.42a4.1 4.1 0 0 1-2.8 1.1 4.07 4.07 0 0 1-2.81-1.1 3.6 3.6 0 0 1 0-5.29l21.53-20.3a2.65 2.65 0 0 0 0-3.88 2.98 2.98 0 0 0-2.06-.8c-.77 0-1.5.28-2.05.8L29.1 54.25a8.91 8.91 0 0 0-2.86 6.53 8.91 8.91 0 0 0 2.86 6.52c1.85 1.74 4.3 2.7 6.92 2.7s5.08-.96 6.92-2.7L65.2 46.33c3.1-2.93 4.8-6.81 4.8-10.95 0-4.13-1.7-8.02-4.8-10.94" fill="#fff"></path></g></svg>`,
},
} satisfies Record<BuiltInRegistryScriptKey, LogoValue>
Loading
Loading