diff --git a/.stylelintrc.json b/.stylelintrc.json
index 51834b04b..ec396c43e 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -3,7 +3,25 @@
"overrides": [
{
"customSyntax": "postcss-html",
- "files": ["**/*.svelte"]
+ "files": ["**/*.svelte"],
+ "rules": {
+ "csstools/value-no-unknown-custom-properties": [
+ true,
+ {
+ "ignoreLocallyDefined": true,
+ "importFrom": [
+ "src/styles/bass.css",
+ "src/styles/buttons.css",
+ "src/styles/layout.css",
+ "src/styles/reset.css",
+ "src/styles/theme.css",
+ "src/styles/typography.css",
+ "src/styles/utilities.css",
+ "src/styles/variables.css"
+ ]
+ }
+ ]
+ }
}
],
"plugins": [
@@ -18,6 +36,7 @@
"csstools/value-no-unknown-custom-properties": [
true,
{
+ "ignoreProperties": ["--ideal-font-size", "--max-font-size"],
"importFrom": [
"src/styles/bass.css",
"src/styles/buttons.css",
@@ -47,6 +66,12 @@
"expandShorthand": true,
"ignoreValues": ["inherit", "unset", "initial", "transparent"]
}
+ ],
+ "selector-pseudo-class-no-unknown": [
+ true,
+ {
+ "ignorePseudoClasses": ["global"]
+ }
]
}
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 6739498a1..36baa5d15 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -19,16 +19,26 @@
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"cSpell.words": [
+ "Aaah",
+ "consolas",
"Deepgram",
"flushall",
"maxres",
+ "menlo",
"nohotkeys",
+ "oklch",
"Oopsie",
"openai",
+ "pocketcasts",
"popovertarget",
+ "raah",
+ "recents",
"shownumber",
"testid",
"Tolinski",
- "waait"
+ "waait",
+ "wght",
+ "xtra",
+ "xxlarge"
]
}
diff --git a/package.json b/package.json
index e8ff45b51..80889ef6b 100644
--- a/package.json
+++ b/package.json
@@ -1,144 +1,144 @@
{
- "name": "syntax",
- "version": "3.0.0",
- "private": true,
- "scripts": {
- "dev": "node ./scripts/preheat.js",
- "preheat": "node ./scripts/preheat.js --env-only",
- "vite-dev": "vite dev",
- "copy-files": "zx ./why_do_i_need_this.mjs",
- "build": "run-s --print-name build:svelte copy-files",
- "build:svelte": "vite build",
- "preview": "vite preview",
- "test": "svelte-kit sync && playwright test",
- "test:ui": "svelte-kit sync && playwright test --ui",
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
- "test:unit": "svelte-kit sync && vitest",
- "eslint": "eslint .",
- "lint": "prettier --plugin-search-dir . --check . && eslint . && pnpm stylelint",
- "format": "prettier --plugin-search-dir . --write .",
- "site:update": "pnpm update -i -L",
- "db:studio": "prisma studio",
- "db:generate": "prisma generate",
- "db:push": "prisma db push",
- "db:seed": "prisma db seed",
- "i-changed-the-schema": "pnpm run db:push && pnpm run db:generate",
- "postinstall": "pnpm db:generate && pnpm exec playwright install",
- "stylelint": "NODE_OPTIONS=--no-deprecation stylelint \"**/*.css\"",
- "storybook": "storybook dev -p 6006",
- "build-storybook": "storybook build"
- },
- "devDependencies": {
- "@codecov/sveltekit-plugin": "1.9.1",
- "@eslint/compat": "^1.3.2",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "^9.33.0",
- "@playwright/test": "^1.54.2",
- "@spiriit/vite-plugin-svg-spritemap": "^5.0.0",
- "@storybook/addon-docs": "^9.1.2",
- "@storybook/addon-queryparams": "^7.0.1",
- "@storybook/addon-svelte-csf": "^5.0.7",
- "@storybook/sveltekit": "^9.1.2",
- "@sveltejs/kit": "^2.27.3",
- "@sveltejs/vite-plugin-svelte": "^6.1.1",
- "@types/chroma-js": "^3.1.1",
- "@types/js-cookie": "^3.0.6",
- "@types/node": "^24.2.1",
- "@types/speakingurl": "^13.0.6",
- "@typescript-eslint/eslint-plugin": "^8.39.0",
- "@typescript-eslint/parser": "^8.39.0",
- "dotenv": "^17.2.1",
- "eslint": "^9.33.0",
- "eslint-config-prettier": "^10.1.8",
- "eslint-plugin-storybook": "^9.1.2",
- "eslint-plugin-svelte": "^3.11.0",
- "globals": "^16.3.0",
- "mysql2": "^3.14.3",
- "postcss": "^8.5.6",
- "postcss-custom-media": "^11.0.6",
- "postcss-html": "^1.8.0",
- "postcss-import": "^16.1.1",
- "postcss-import-ext-glob": "^2.1.1",
- "postcss-load-config": "^6.0.1",
- "postcss-preset-env": "^10.2.4",
- "prettier": "^3.6.2",
- "prettier-plugin-svelte": "^3.4.0",
- "prisma": "6.13.0",
- "semver": "^7.7.2",
- "storybook": "^9.1.2",
- "stylelint": "^16.23.1",
- "stylelint-config-standard": "^39.0.0",
- "stylelint-declaration-strict-value": "^1.10.11",
- "stylelint-media-use-custom-media": "^4.0.0",
- "stylelint-no-undefined-classes": "^0.2.0",
- "stylelint-value-no-unknown-custom-properties": "^6.0.1",
- "svelte": "^5.38.0",
- "svelte-check": "^4.3.1",
- "svelte-preprocess": "^6.0.3",
- "tslib": "^2.8.1",
- "typescript": "^5.9.2",
- "vite": "^7.1.1",
- "vitest": "^3.2.4"
- },
- "type": "module",
- "engines": {
- "node": ">=18.13 || ^20",
- "pnpm": ">=8"
- },
- "dependencies": {
- "@anthropic-ai/sdk": "^0.6.8",
- "@deepgram/sdk": "^2.4.0",
- "@ffmpeg.wasm/core-mt": "0.13.2",
- "@ffmpeg.wasm/main": "^0.13.1",
- "@leveluptuts/svelte-side-menu": "^1.1.0",
- "@oddbird/popover-polyfill": "^0.6.1",
- "@prisma/client": "6.13.0",
- "@sentry/profiling-node": "^10.3.0",
- "@sentry/sveltekit": "^10.3.0",
- "@sparticuz/chromium": "132.0.0",
- "@svelte-put/shortcut": "^4.1.0",
- "@sveltejs/adapter-vercel": "^5.8.2",
- "@types/core-js": "^2.5.8",
- "@upstash/redis": "^1.35.3",
- "chroma-js": "^3.1.2",
- "core-js": "^3.45.0",
- "date-fns": "^4.1.0",
- "dotenv-expand": "^12.0.2",
- "flexsearch": "^0.8.205",
- "gpt-3-encoder": "^1.1.4",
- "gray-matter": "^4.0.3",
- "js-cookie": "^3.0.5",
- "linkedom": "^0.18.11",
- "media-chrome": "^4.12.0",
- "npm-run-all2": "^8.0.4",
- "openai": "^4.93.0",
- "p-map": "^7.0.3",
- "puppeteer-core": "24.6.1",
- "rehype-autolink-headings": "^7.1.0",
- "rehype-highlight": "^7.0.2",
- "rehype-raw": "^7.0.0",
- "rehype-stringify": "^10.0.1",
- "remark-gfm": "^4.0.1",
- "remark-heading-id": "^1.0.1",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.1.2",
- "sk-form-data": "^2.0.2",
- "speakingurl": "^14.0.1",
- "svelte-french-toast": "1.2.0",
- "svelte-local-storage-store": "^0.6.4",
- "svelte-turnstile": "^0.11.0",
- "sveltekit-search-params": "^3.0.0",
- "ts-node": "^10.9.2",
- "unified": "^11.0.5",
- "waait": "^1.0.5",
- "youtube-video-element": "^1.6.2",
- "zod": "^4.0.16",
- "zx": "^8.8.0"
- },
- "eslintConfig": {
- "extends": [
- "plugin:storybook/recommended"
- ]
- }
+ "name": "syntax",
+ "version": "3.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "node ./scripts/preheat.js",
+ "preheat": "node ./scripts/preheat.js --env-only",
+ "vite-dev": "vite dev",
+ "copy-files": "zx ./why_do_i_need_this.mjs",
+ "build": "run-s --print-name build:svelte copy-files",
+ "build:svelte": "vite build",
+ "preview": "vite preview",
+ "test": "svelte-kit sync && playwright test",
+ "test:ui": "svelte-kit sync && playwright test --ui",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "test:unit": "svelte-kit sync && vitest",
+ "eslint": "eslint .",
+ "lint": "prettier --plugin-search-dir . --check . && eslint . && pnpm stylelint",
+ "format": "prettier --plugin-search-dir . --write .",
+ "site:update": "pnpm update -i -L",
+ "db:studio": "prisma studio",
+ "db:generate": "prisma generate",
+ "db:push": "prisma db push",
+ "db:seed": "prisma db seed",
+ "i-changed-the-schema": "pnpm run db:push && pnpm run db:generate",
+ "postinstall": "pnpm db:generate && pnpm exec playwright install",
+ "stylelint": "NODE_OPTIONS=--no-deprecation stylelint \"**/*.{css,svelte}\"",
+ "storybook": "storybook dev -p 6006",
+ "build-storybook": "storybook build"
+ },
+ "devDependencies": {
+ "@codecov/sveltekit-plugin": "1.9.1",
+ "@eslint/compat": "^1.3.2",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "^9.33.0",
+ "@playwright/test": "^1.54.2",
+ "@spiriit/vite-plugin-svg-spritemap": "^5.0.0",
+ "@storybook/addon-docs": "^9.1.2",
+ "@storybook/addon-queryparams": "^7.0.1",
+ "@storybook/addon-svelte-csf": "^5.0.7",
+ "@storybook/sveltekit": "^9.1.2",
+ "@sveltejs/kit": "^2.27.3",
+ "@sveltejs/vite-plugin-svelte": "^6.1.1",
+ "@types/chroma-js": "^3.1.1",
+ "@types/js-cookie": "^3.0.6",
+ "@types/node": "^24.2.1",
+ "@types/speakingurl": "^13.0.6",
+ "@typescript-eslint/eslint-plugin": "^8.39.0",
+ "@typescript-eslint/parser": "^8.39.0",
+ "dotenv": "^17.2.1",
+ "eslint": "^9.33.0",
+ "eslint-config-prettier": "^10.1.8",
+ "eslint-plugin-storybook": "^9.1.2",
+ "eslint-plugin-svelte": "^3.11.0",
+ "globals": "^16.3.0",
+ "mysql2": "^3.14.3",
+ "postcss": "^8.5.6",
+ "postcss-custom-media": "^11.0.6",
+ "postcss-html": "^1.8.0",
+ "postcss-import": "^16.1.1",
+ "postcss-import-ext-glob": "^2.1.1",
+ "postcss-load-config": "^6.0.1",
+ "postcss-preset-env": "^10.2.4",
+ "prettier": "^3.6.2",
+ "prettier-plugin-svelte": "^3.4.0",
+ "prisma": "6.13.0",
+ "semver": "^7.7.2",
+ "storybook": "^9.1.2",
+ "stylelint": "^16.23.1",
+ "stylelint-config-standard": "^39.0.0",
+ "stylelint-declaration-strict-value": "^1.10.11",
+ "stylelint-media-use-custom-media": "^4.0.0",
+ "stylelint-no-undefined-classes": "^0.2.0",
+ "stylelint-value-no-unknown-custom-properties": "^6.0.1",
+ "svelte": "^5.38.0",
+ "svelte-check": "^4.3.1",
+ "svelte-preprocess": "^6.0.3",
+ "tslib": "^2.8.1",
+ "typescript": "^5.9.2",
+ "vite": "^7.1.1",
+ "vitest": "^3.2.4"
+ },
+ "type": "module",
+ "engines": {
+ "node": ">=18.13 || ^20",
+ "pnpm": ">=8"
+ },
+ "dependencies": {
+ "@anthropic-ai/sdk": "^0.6.8",
+ "@deepgram/sdk": "^2.4.0",
+ "@ffmpeg.wasm/core-mt": "0.13.2",
+ "@ffmpeg.wasm/main": "^0.13.1",
+ "@leveluptuts/svelte-side-menu": "^1.1.0",
+ "@oddbird/popover-polyfill": "^0.6.1",
+ "@prisma/client": "6.13.0",
+ "@sentry/profiling-node": "^10.3.0",
+ "@sentry/sveltekit": "^10.3.0",
+ "@sparticuz/chromium": "132.0.0",
+ "@svelte-put/shortcut": "^4.1.0",
+ "@sveltejs/adapter-vercel": "^5.8.2",
+ "@types/core-js": "^2.5.8",
+ "@upstash/redis": "^1.35.3",
+ "chroma-js": "^3.1.2",
+ "core-js": "^3.45.0",
+ "date-fns": "^4.1.0",
+ "dotenv-expand": "^12.0.2",
+ "flexsearch": "^0.8.205",
+ "gpt-3-encoder": "^1.1.4",
+ "gray-matter": "^4.0.3",
+ "js-cookie": "^3.0.5",
+ "linkedom": "^0.18.11",
+ "media-chrome": "^4.12.0",
+ "npm-run-all2": "^8.0.4",
+ "openai": "^4.93.0",
+ "p-map": "^7.0.3",
+ "puppeteer-core": "24.6.1",
+ "rehype-autolink-headings": "^7.1.0",
+ "rehype-highlight": "^7.0.2",
+ "rehype-raw": "^7.0.0",
+ "rehype-stringify": "^10.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-heading-id": "^1.0.1",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.1.2",
+ "sk-form-data": "^2.0.2",
+ "speakingurl": "^14.0.1",
+ "svelte-french-toast": "1.2.0",
+ "svelte-local-storage-store": "^0.6.4",
+ "svelte-turnstile": "^0.11.0",
+ "sveltekit-search-params": "^3.0.0",
+ "ts-node": "^10.9.2",
+ "unified": "^11.0.5",
+ "waait": "^1.0.5",
+ "youtube-video-element": "^1.6.2",
+ "zod": "^4.0.16",
+ "zx": "^8.8.0"
+ },
+ "eslintConfig": {
+ "extends": [
+ "plugin:storybook/recommended"
+ ]
+ }
}
diff --git a/src/icons/Icons.svelte b/src/icons/Icons.svelte
index 7b13bde10..ca58f0849 100644
--- a/src/icons/Icons.svelte
+++ b/src/icons/Icons.svelte
@@ -30,7 +30,7 @@
}
.icon-name {
- font-size: var(--fs-caption);
+ font-size: var(--fs-2);
color: var(--c-fg);
text-align: center;
}
diff --git a/src/lib/AdminSearch.svelte b/src/lib/AdminSearch.svelte
index 6b70015b3..e675f2907 100644
--- a/src/lib/AdminSearch.svelte
+++ b/src/lib/AdminSearch.svelte
@@ -15,7 +15,7 @@
border: var(--border);
padding: 10px;
font-size: var(--font-size-base);
- color: var(--fg);
- border-radius: var(--brad);
+ color: var(--c-fg);
+ border-radius: var(--br-medium);
}
diff --git a/src/lib/ComponentWindow.svelte b/src/lib/ComponentWindow.svelte
index 6ed968291..9050a4ec8 100644
--- a/src/lib/ComponentWindow.svelte
+++ b/src/lib/ComponentWindow.svelte
@@ -26,7 +26,7 @@
-
@@ -36,6 +36,7 @@
resize: both;
overflow: auto;
border: var(--border);
+
> span {
position: absolute;
}
diff --git a/src/lib/DropdownMenu.svelte b/src/lib/DropdownMenu.svelte
index 25ca1ff13..bd325338b 100644
--- a/src/lib/DropdownMenu.svelte
+++ b/src/lib/DropdownMenu.svelte
@@ -34,10 +34,10 @@
}
[popover] {
- background: var(--bg-sheet);
- border: solid 1px var(--black-7);
+ background: var(--c-bg);
+ border: solid 1px var(--c-black-7);
border-radius: 6px;
- color: var(--white);
+ color: var(--c-white);
padding: 10px;
translate: 0 10px;
}
@@ -47,11 +47,11 @@
}
.dropdown-links {
- background: var(--bg-1);
- box-shadow: inset 0 0 0 1px var(--subtle);
- border-radius: var(--brad);
- color: var(--fg);
- translate: 0px 3px;
+ background: var(--c-bg-1);
+ box-shadow: inset 0 0 0 1px var(--c-black-1);
+ border-radius: var(--br-medium);
+ color: var(--c-fg);
+ translate: 0 3px;
position: absolute;
z-index: 10;
}
diff --git a/src/lib/FacePile.svelte b/src/lib/FacePile.svelte
index cbcf0d400..db7bcfb64 100644
--- a/src/lib/FacePile.svelte
+++ b/src/lib/FacePile.svelte
@@ -20,28 +20,33 @@
diff --git a/src/lib/IconOLD.svelte b/src/lib/IconOLD.svelte
index 7dcde68c6..5117570f7 100644
--- a/src/lib/IconOLD.svelte
+++ b/src/lib/IconOLD.svelte
@@ -1,4 +1,4 @@
-
diff --git a/src/lib/Tabs.svelte b/src/lib/Tabs.svelte
index 18a4f054a..40f6f92d7 100644
--- a/src/lib/Tabs.svelte
+++ b/src/lib/Tabs.svelte
@@ -25,23 +25,23 @@
& > a {
padding: 10px 1rem;
- border-radius: var(--brad) var(--brad) 0 0;
+ border-radius: var(--br-medium) var(--br-medium) 0 0;
font-variation-settings: var(--fv-900);
}
a:hover {
- background: var(--bg-1);
+ background: var(--c-bg);
}
a.active {
text-decoration: none;
background: var(--c-primary);
position: relative;
- color: var(--dark);
+ color: var(--c-black);
}
& :global(a) {
- color: var(--fg);
+ color: var(--c-fg);
}
}
}
diff --git a/src/lib/badges/Badge.svelte b/src/lib/badges/Badge.svelte
index aa1bce83f..8115f6a76 100644
--- a/src/lib/badges/Badge.svelte
+++ b/src/lib/badges/Badge.svelte
@@ -14,8 +14,8 @@
diff --git a/src/lib/forms/Input.svelte b/src/lib/forms/Input.svelte
index 66fc85483..9eb2e7463 100644
--- a/src/lib/forms/Input.svelte
+++ b/src/lib/forms/Input.svelte
@@ -4,16 +4,10 @@
type?: HTMLInputElement['type'];
value?: string;
id: string;
- [key: string]: any
+ [key: string]: any;
}
- let {
- label = '',
- type = 'text',
- value = $bindable(''),
- id,
- ...rest
- }: Props = $props();
+ let { label = '', type = 'text', value = $bindable(''), id, ...rest }: Props = $props();
function typeAction(node: HTMLInputElement) {
node.type = type;
@@ -35,14 +29,14 @@
position: absolute;
top: -40%;
left: 0;
- font-size: var(--font-size-xs);
+ font-size: var(--fs-2);
}
input {
font-size: var(--font-size-base);
padding: 8px 14px;
border: none;
- box-shadow: inset 0 0 0 3px oklch(var(--blacklch) / 0.2);
+ box-shadow: inset 0 0 0 3px oklch(var(--c-blacklch) / 0.2);
border-radius: 4px;
width: 100%;
}
diff --git a/src/lib/forms/UserSubmissionForm.svelte b/src/lib/forms/UserSubmissionForm.svelte
index a5404f811..f8a1c38a9 100644
--- a/src/lib/forms/UserSubmissionForm.svelte
+++ b/src/lib/forms/UserSubmissionForm.svelte
@@ -152,14 +152,14 @@
.status {
padding: 10px;
- background: var(--subtle);
+ background: var(--c-black-1);
border-left: 8px solid var(--c-primary);
- font-size: var(--font-size-sm);
+ font-size: var(--fs-3);
margin: 1rem 0;
width: fit-content;
&.error {
- border-color: var(--warning);
+ border-color: var(--c-red);
}
p {
@@ -174,7 +174,7 @@
padding: 0.6rem;
border-radius: 5px;
font-family: var(--ff-body);
- border: 1px solid var(--fg);
+ border: 1px solid var(--c-fg);
}
textarea {
@@ -183,7 +183,7 @@
}
.required {
- color: var(--warning);
+ color: var(--c-red);
font-size: 8px;
text-transform: uppercase;
margin: 0;
diff --git a/src/lib/hosts/Host.svelte b/src/lib/hosts/Host.svelte
index ec183c56d..9bb11d917 100644
--- a/src/lib/hosts/Host.svelte
+++ b/src/lib/hosts/Host.svelte
@@ -71,10 +71,10 @@
}
.host-guest-tag {
- background: var(--yellow);
- color: var(--black);
+ background: var(--c-yellow);
+ color: var(--c-black);
padding: 0 4px;
transform: rotate(-3deg);
- font-size: var(--font-size-xs);
+ font-size: var(--fs-2);
}
diff --git a/src/lib/hosts/HostSocialLink.svelte b/src/lib/hosts/HostSocialLink.svelte
index 42065a7cd..a5329555c 100644
--- a/src/lib/hosts/HostSocialLink.svelte
+++ b/src/lib/hosts/HostSocialLink.svelte
@@ -2,12 +2,12 @@
import Icon from '$lib/Icon.svelte';
interface Props {
host: {
- name: string;
- github?: string | null;
- twitter?: string | null;
- url?: string | null;
- slug?: string;
- };
+ name: string;
+ github?: string | null;
+ twitter?: string | null;
+ url?: string | null;
+ slug?: string;
+ };
}
let { host }: Props = $props();
@@ -37,13 +37,15 @@
diff --git a/src/lib/layout/Footer.svelte b/src/lib/layout/Footer.svelte
index 9e60c4a90..69e988534 100644
--- a/src/lib/layout/Footer.svelte
+++ b/src/lib/layout/Footer.svelte
@@ -4,7 +4,7 @@
import ProducedBySentry from './ProducedBySentry.svelte';
-