From 82a0c94414d0419e23eda6eb668fa08f7bfdbaaa Mon Sep 17 00:00:00 2001 From: Lu Wilson Date: Tue, 16 Jun 2026 18:51:45 +0100 Subject: [PATCH 01/10] gerrit patch pull --- .../references/gerrit-patch-trial.md | 49 ++++ package.json | 4 +- scripts/patch-codex.mjs | 240 ++++++++++++++++++ .../example-codex-kitchen-sink/index.vue | 181 +++++++++++++ 4 files changed, 473 insertions(+), 1 deletion(-) create mode 100644 .agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md create mode 100644 scripts/patch-codex.mjs create mode 100644 src/prototypes/example-codex-kitchen-sink/index.vue diff --git a/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md b/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md new file mode 100644 index 0000000..39782e7 --- /dev/null +++ b/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md @@ -0,0 +1,49 @@ +# Testing a Codex Gerrit patch in ProtoWiki + +Use this when you want to trial an unmerged `design/codex` change in ProtoWiki without publishing a package. + +## Commands + +Apply the current patchset for a change: + +```bash +npm run patch-codex -- https://gerrit.wikimedia.org/r/c/design/codex/+/1288878 +``` + +The command: + +- reads Gerrit metadata for the given change +- fetches the current patchset into a local cache checkout +- builds `design/codex` +- packs and installs local tarballs for all three packages: + - `@wikimedia/codex` + - `@wikimedia/codex-design-tokens` + - `@wikimedia/codex-icons` + +Reset to normal registry-resolved packages: + +```bash +npm run patch-codex:reset +``` + +## Why all three packages are patched together + +ProtoWiki consumes all three Codex packages directly, and `@wikimedia/codex` depends on matching icon/token outputs. Keeping them in lockstep avoids mixed-version visual bugs. + +## Suggested smoke-test routes + +After applying a patch, run `npm run dev` and inspect: + +- `/` +- `/template-homepage` +- `/template-homepage/suggested-edits` +- `/example-event-worklist` +- `/template-article-live` +- `/example-codex-kitchen-sink` + +Focus on light/dark theme and desktop/mobile skin states. + +## Notes + +- The cache checkout lives under your system temp directory (`$TMPDIR/protowiki-codex-gerrit-cache` on macOS). +- This workflow uses `npm install --no-save`, so it does not intentionally rewrite dependency ranges in `package.json`. diff --git a/package.json b/package.json index 71244ba..c04335e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "type-check": "vue-tsc --noEmit", "format": "prettier --write \"src/**/*.{ts,vue,css}\"", "lint": "eslint . --ext .ts,.vue", - "snapshot:wiki-skins": "bash scripts/snapshot-wiki-skins.sh" + "snapshot:wiki-skins": "bash scripts/snapshot-wiki-skins.sh", + "patch-codex": "node scripts/patch-codex.mjs", + "patch-codex:reset": "node scripts/patch-codex.mjs --reset" }, "dependencies": { "@wikimedia/codex": "^2.6.0", diff --git a/scripts/patch-codex.mjs b/scripts/patch-codex.mjs new file mode 100644 index 0000000..b0a12cb --- /dev/null +++ b/scripts/patch-codex.mjs @@ -0,0 +1,240 @@ +#!/usr/bin/env node +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { spawnSync } from 'node:child_process' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const ROOT = path.resolve(__dirname, '..') +const CACHE_ROOT = path.join(os.tmpdir(), 'protowiki-codex-gerrit-cache') +const CODEX_REPO_DIR = path.join(CACHE_ROOT, 'design-codex') +const PACK_DIR = path.join(CACHE_ROOT, 'packs') +const GERRIT_REPO = 'https://gerrit.wikimedia.org/r/design/codex' + +const CODEX_PACKAGES = [ + '@wikimedia/codex', + '@wikimedia/codex-design-tokens', + '@wikimedia/codex-icons', +] + +const PACKAGE_DIRS = new Map([ + ['@wikimedia/codex', 'packages/codex'], + ['@wikimedia/codex-design-tokens', 'packages/codex-design-tokens'], + ['@wikimedia/codex-icons', 'packages/codex-icons'], +]) + +function run(command, args, opts = {}) { + const result = spawnSync(command, args, { + cwd: opts.cwd ?? ROOT, + stdio: 'pipe', + encoding: 'utf8', + }) + + if (result.status !== 0) { + const details = [result.stdout, result.stderr].filter(Boolean).join('\n') + throw new Error(`Command failed: ${command} ${args.join(' ')}\n${details || '(no output)'}`) + } + + return (result.stdout ?? '').trim() +} + +function readRootPackageJson() { + const packageJsonPath = path.join(ROOT, 'package.json') + return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) +} + +function parseChangeNumber(input) { + if (!input) { + throw new Error('Missing Gerrit URL or change number.') + } + const trimmed = input.trim() + if (/^\d+$/.test(trimmed)) { + return trimmed + } + + const url = new URL(trimmed) + const slashPlusMatch = url.pathname.match(/\/\+\/(\d+)(?:\/)?$/) + if (slashPlusMatch) { + return slashPlusMatch[1] + } + + const cPathMatch = url.pathname.match(/\/c\/[^/]+\/[^/]+\/\+\/(\d+)(?:\/)?$/) + if (cPathMatch) { + return cPathMatch[1] + } + + throw new Error(`Could not parse Gerrit change number from: ${input}`) +} + +function stripXssiPrefix(body) { + const lines = body.split('\n') + if (lines[0] === `)]}'`) { + return lines.slice(1).join('\n') + } + return body +} + +async function fetchJson(url) { + const response = await fetch(url) + if (!response.ok) { + throw new Error(`Request failed (${response.status}): ${url}`) + } + const text = await response.text() + return JSON.parse(stripXssiPrefix(text)) +} + +function ensureRepo() { + fs.mkdirSync(CACHE_ROOT, { recursive: true }) + if (!fs.existsSync(CODEX_REPO_DIR)) { + console.log(`Cloning design/codex into ${CODEX_REPO_DIR}`) + run('git', ['clone', '--filter=blob:none', GERRIT_REPO, CODEX_REPO_DIR], { cwd: CACHE_ROOT }) + } else { + run('git', ['remote', 'set-url', 'origin', GERRIT_REPO], { cwd: CODEX_REPO_DIR }) + } +} + +function ensureDependenciesInstalled() { + console.log('Installing Codex dependencies') + try { + run('npm', ['install'], { cwd: CODEX_REPO_DIR }) + } catch (error) { + console.warn('Default npm install failed; retrying with --ignore-scripts') + run('npm', ['install', '--ignore-scripts'], { cwd: CODEX_REPO_DIR }) + console.warn( + 'Installed with --ignore-scripts; this bypasses non-essential postinstall hooks in local tooling.', + ) + if (!(error instanceof Error)) { + throw error + } + } +} + +function buildCodex() { + console.log('Building design/codex packages used by ProtoWiki') + for (const packageName of CODEX_PACKAGES) { + run('npm', ['run', 'build', '--workspace', packageName], { cwd: CODEX_REPO_DIR }) + } +} + +function packOne(packageName) { + const relDir = PACKAGE_DIRS.get(packageName) + if (!relDir) { + throw new Error(`No package directory mapping for ${packageName}`) + } + const packageDir = path.join(CODEX_REPO_DIR, relDir) + fs.mkdirSync(PACK_DIR, { recursive: true }) + if (packageName === '@wikimedia/codex-design-tokens') { + const distDir = path.join(packageDir, 'dist') + for (const entry of fs.readdirSync(distDir)) { + if (!entry.startsWith('theme-')) continue + const src = path.join(distDir, entry) + const dest = path.join(packageDir, entry) + fs.copyFileSync(src, dest) + } + } + const packOutput = run('npm', ['pack', '--pack-destination', PACK_DIR], { cwd: packageDir }) + const tarballName = packOutput + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.endsWith('.tgz')) + .at(-1) + if (!tarballName) { + throw new Error(`Unable to find tarball name in npm pack output for ${packageName}`) + } + return path.join(PACK_DIR, tarballName) +} + +function installTarballs(tarballs) { + console.log('Installing local Codex tarballs into ProtoWiki') + run('npm', ['install', '--no-save', ...tarballs], { cwd: ROOT }) +} + +function resetToRegistry() { + const packageJson = readRootPackageJson() + const desired = CODEX_PACKAGES.map((name) => { + const range = packageJson.dependencies?.[name] + if (!range) { + throw new Error(`Missing dependency range in package.json: ${name}`) + } + return `${name}@${range}` + }) + + console.log('Restoring Codex packages from npm registry') + run('npm', ['install', '--no-save', ...desired], { cwd: ROOT }) + printInstalledVersions('reset complete') +} + +function printInstalledVersions(context) { + const lines = CODEX_PACKAGES.map((name) => { + const p = path.join(ROOT, 'node_modules', name, 'package.json') + if (!fs.existsSync(p)) { + return `${name}: not installed` + } + const v = JSON.parse(fs.readFileSync(p, 'utf8')).version + return `${name}: ${v}` + }) + console.log(`\nCodex package state (${context}):`) + for (const line of lines) { + console.log(`- ${line}`) + } +} + +function computePatchRef(changeNumber, patchsetNumber) { + const twoDigit = changeNumber.slice(-2).padStart(2, '0') + return `refs/changes/${twoDigit}/${changeNumber}/${patchsetNumber}` +} + +async function applyChange(changeInput) { + const changeNumber = parseChangeNumber(changeInput) + console.log(`Fetching Gerrit change ${changeNumber}`) + + const detailUrl = `https://gerrit.wikimedia.org/r/changes/design%2Fcodex~${changeNumber}/detail` + const detail = await fetchJson(detailUrl) + + const patchset = detail.current_revision_number + if (!patchset) { + throw new Error('Gerrit response did not include current_revision_number') + } + + const ref = computePatchRef(changeNumber, String(patchset)) + console.log(`Current patchset: ${patchset} (${ref})`) + + ensureRepo() + run('git', ['fetch', 'origin', ref], { cwd: CODEX_REPO_DIR }) + run('git', ['checkout', '--detach', 'FETCH_HEAD'], { cwd: CODEX_REPO_DIR }) + + ensureDependenciesInstalled() + buildCodex() + + const tarballs = CODEX_PACKAGES.map(packOne) + installTarballs(tarballs) + + const revision = detail.current_revision ?? '(unknown revision)' + printInstalledVersions(`patched from Gerrit ${changeNumber}`) + console.log(`\nApplied change ${changeNumber} at revision ${revision}.`) + console.log('To restore registry versions: npm run patch-codex:reset') +} + +async function main() { + const [, , firstArg, secondArg] = process.argv + if (firstArg === '--reset') { + resetToRegistry() + return + } + + const changeInput = secondArg && firstArg === '--change' ? secondArg : firstArg + if (!changeInput) { + console.log('Usage:') + console.log(' npm run patch-codex -- ') + console.log(' npm run patch-codex:reset') + process.exit(1) + } + + await applyChange(changeInput) +} + +main().catch((error) => { + console.error(error instanceof Error ? error.message : String(error)) + process.exit(1) +}) diff --git a/src/prototypes/example-codex-kitchen-sink/index.vue b/src/prototypes/example-codex-kitchen-sink/index.vue new file mode 100644 index 0000000..d3cc2ed --- /dev/null +++ b/src/prototypes/example-codex-kitchen-sink/index.vue @@ -0,0 +1,181 @@ + + + + + From 8d34548c74d9aae97b633f9b496ef1836a558f4e Mon Sep 17 00:00:00 2001 From: Lu Wilson Date: Wed, 17 Jun 2026 12:09:24 +0100 Subject: [PATCH 02/10] maybe gerrit patch --- .../references/gerrit-patch-trial.md | 106 ++- package-lock.json | 16 +- package.json | 2 + patches/codex/manifest.json | 710 ++++++++++++++++++ ...t__theme-wikimedia-ui-mode-dark.json.patch | 48 ++ ...__theme-wikimedia-ui-mode-large.json.patch | 48 ++ ...__theme-wikimedia-ui-mode-small.json.patch | 48 ++ ...theme-wikimedia-ui-mode-x-large.json.patch | 48 ++ ...tokens__dist__theme-wikimedia-ui.css.patch | 15 + ...-tokens__dist__theme-wikimedia-ui.js.patch | 15 + ...okens__dist__theme-wikimedia-ui.json.patch | 48 ++ ...okens__dist__theme-wikimedia-ui.less.patch | 15 + ...okens__dist__theme-wikimedia-ui.scss.patch | 15 + ...s__theme-wikimedia-ui-mode-dark.json.patch | 48 ++ ...__theme-wikimedia-ui-mode-large.json.patch | 48 ++ ...__theme-wikimedia-ui-mode-small.json.patch | 48 ++ ...theme-wikimedia-ui-mode-x-large.json.patch | 48 ++ ...esign-tokens__theme-wikimedia-ui.css.patch | 15 + ...design-tokens__theme-wikimedia-ui.js.patch | 15 + ...sign-tokens__theme-wikimedia-ui.json.patch | 48 ++ ...sign-tokens__theme-wikimedia-ui.less.patch | 15 + ...sign-tokens__theme-wikimedia-ui.scss.patch | 15 + ...a__codex__dist__codex.style-bidi.css.patch | 320 ++++++++ ...ia__codex__dist__codex.style-rtl.css.patch | 308 ++++++++ ...imedia__codex__dist__codex.style.css.patch | 308 ++++++++ ...dist__modules__CdxAccordion-bidi.css.patch | 25 + ..._dist__modules__CdxAccordion-rtl.css.patch | 25 + ...dex__dist__modules__CdxAccordion.css.patch | 25 + ...x__dist__modules__CdxButton-bidi.css.patch | 15 + ...ex__dist__modules__CdxButton-rtl.css.patch | 15 + ..._codex__dist__modules__CdxButton.css.patch | 15 + ...st__modules__CdxButtonGroup-bidi.css.patch | 36 + ...ist__modules__CdxButtonGroup-rtl.css.patch | 28 + ...x__dist__modules__CdxButtonGroup.css.patch | 28 + ...dex__dist__modules__CdxCard-bidi.css.patch | 15 + ...odex__dist__modules__CdxCard-rtl.css.patch | 15 + ...a__codex__dist__modules__CdxCard.css.patch | 15 + ..._dist__modules__CdxCheckbox-bidi.css.patch | 15 + ...__dist__modules__CdxCheckbox-rtl.css.patch | 15 + ...odex__dist__modules__CdxCheckbox.css.patch | 15 + ...dist__modules__CdxChipInput-bidi.css.patch | 15 + ..._dist__modules__CdxChipInput-rtl.css.patch | 15 + ...dex__dist__modules__CdxChipInput.css.patch | 15 + ...x__dist__modules__CdxDialog-bidi.css.patch | 15 + ...ex__dist__modules__CdxDialog-rtl.css.patch | 15 + ..._codex__dist__modules__CdxDialog.css.patch | 15 + ...ex__dist__modules__CdxImage-bidi.css.patch | 26 + ...dex__dist__modules__CdxImage-rtl.css.patch | 26 + ...__codex__dist__modules__CdxImage.css.patch | 26 + ...dex__dist__modules__CdxMenu-bidi.css.patch | 15 + ...odex__dist__modules__CdxMenu-rtl.css.patch | 15 + ...a__codex__dist__modules__CdxMenu.css.patch | 15 + ...__dist__modules__CdxMessage-bidi.css.patch | 15 + ...x__dist__modules__CdxMessage-rtl.css.patch | 15 + ...codex__dist__modules__CdxMessage.css.patch | 15 + ...__dist__modules__CdxPopover-bidi.css.patch | 30 + ...x__dist__modules__CdxPopover-rtl.css.patch | 26 + ...codex__dist__modules__CdxPopover.css.patch | 26 + ...st__modules__CdxProgressBar-bidi.css.patch | 15 + ...ist__modules__CdxProgressBar-rtl.css.patch | 15 + ...x__dist__modules__CdxProgressBar.css.patch | 15 + ...st__modules__CdxSearchInput-bidi.css.patch | 15 + ...ist__modules__CdxSearchInput-rtl.css.patch | 15 + ...x__dist__modules__CdxSearchInput.css.patch | 15 + ...x__dist__modules__CdxSelect-bidi.css.patch | 26 + ...ex__dist__modules__CdxSelect-rtl.css.patch | 26 + ..._codex__dist__modules__CdxSelect.css.patch | 26 + ...ex__dist__modules__CdxTable-bidi.css.patch | 15 + ...dex__dist__modules__CdxTable-rtl.css.patch | 15 + ...__codex__dist__modules__CdxTable.css.patch | 15 + ...dex__dist__modules__CdxTabs-bidi.css.patch | 17 + ...odex__dist__modules__CdxTabs-rtl.css.patch | 17 + ...a__codex__dist__modules__CdxTabs.css.patch | 17 + ..._dist__modules__CdxTextArea-bidi.css.patch | 15 + ...__dist__modules__CdxTextArea-rtl.css.patch | 15 + ...odex__dist__modules__CdxTextArea.css.patch | 15 + ...dist__modules__CdxTextInput-bidi.css.patch | 15 + ..._dist__modules__CdxTextInput-rtl.css.patch | 15 + ...dex__dist__modules__CdxTextInput.css.patch | 15 + ...dist__modules__CdxThumbnail-bidi.css.patch | 15 + ..._dist__modules__CdxThumbnail-rtl.css.patch | 15 + ...dex__dist__modules__CdxThumbnail.css.patch | 15 + ...t__modules__CdxToggleButton-bidi.css.patch | 15 + ...st__modules__CdxToggleButton-rtl.css.patch | 15 + ...__dist__modules__CdxToggleButton.css.patch | 15 + ...dules__CdxToggleButtonGroup-bidi.css.patch | 15 + ...odules__CdxToggleButtonGroup-rtl.css.patch | 15 + ...t__modules__CdxToggleButtonGroup.css.patch | 15 + ...__dist__modules__CdxTooltip-bidi.css.patch | 15 + ...x__dist__modules__CdxTooltip-rtl.css.patch | 15 + ...codex__dist__modules__CdxTooltip.css.patch | 15 + scripts/apply-codex-patch.mjs | 111 +++ scripts/lib-codex-patch.mjs | 168 +++++ scripts/patch-codex.mjs | 420 +++++++---- .../example-codex-kitchen-sink/index.vue | 17 +- 95 files changed, 4093 insertions(+), 169 deletions(-) create mode 100644 patches/codex/manifest.json create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-dark.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-large.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-small.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-x-large.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.css.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.js.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.less.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.scss.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-dark.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-large.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-small.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-x-large.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.css.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.js.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.json.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.less.patch create mode 100644 patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.scss.patch create mode 100644 patches/codex/wikimedia__codex__dist__codex.style-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__codex.style-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__codex.style.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxAccordion-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxAccordion-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxAccordion.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxButton-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxButton-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxButton.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxCard-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxCard-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxCard.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxCheckbox.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxChipInput-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxChipInput-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxChipInput.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxDialog-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxDialog-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxDialog.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxImage-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxImage-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxImage.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxMenu-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxMenu-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxMenu.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxMessage-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxMessage-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxMessage.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxPopover-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxPopover-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxPopover.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxProgressBar.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxSearchInput.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxSelect-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxSelect-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxSelect.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTable-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTable-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTable.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTabs-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTabs-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTabs.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTextArea-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTextArea-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTextArea.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTextInput-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTextInput-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTextInput.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxThumbnail.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxToggleButton.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTooltip-bidi.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTooltip-rtl.css.patch create mode 100644 patches/codex/wikimedia__codex__dist__modules__CdxTooltip.css.patch create mode 100644 scripts/apply-codex-patch.mjs create mode 100644 scripts/lib-codex-patch.mjs diff --git a/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md b/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md index 39782e7..4aca8b5 100644 --- a/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md +++ b/.agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md @@ -1,34 +1,93 @@ # Testing a Codex Gerrit patch in ProtoWiki -Use this when you want to trial an unmerged `design/codex` change in ProtoWiki without publishing a package. +Use this when you want to trial an unmerged `design/codex` change in ProtoWiki +— locally **and** on the deployed PR preview — without publishing a package. -## Commands +The approach commits a small, **deterministic diff** under `patches/codex/` +(no vendored tarballs). All the heavy work (cloning + building Codex) happens on +your machine; CI only re-formats the published Codex files and re-applies the +committed diff at install time, with no Codex build step. -Apply the current patchset for a change: +The diff covers the change's **full distribution footprint** — every built file +under `dist/**` plus the root `theme-*` token files that actually differ — not +just the handful ProtoWiki imports today. That keeps the patched `node_modules` +self-contained: any current or future import sees the change, and you never have +to re-run just because you added a new import. Each individual file diff stays +small (formatting normalizes the minified CSS), so even the complete footprint is +a manageable set of text diffs rather than committed tarballs. + +## Make the patch ```bash npm run patch-codex -- https://gerrit.wikimedia.org/r/c/design/codex/+/1288878 ``` -The command: - -- reads Gerrit metadata for the given change -- fetches the current patchset into a local cache checkout -- builds `design/codex` -- packs and installs local tarballs for all three packages: - - `@wikimedia/codex` - - `@wikimedia/codex-design-tokens` - - `@wikimedia/codex-icons` - -Reset to normal registry-resolved packages: +This is a "make + apply" command. It: + +1. Establishes a pristine baseline: deletes any existing `patches/codex/`, + removes the installed Codex packages, and runs `npm install` so + `node_modules` holds the real published Codex (the patch's baseline). +2. Fetches the change: reads Gerrit metadata for the current patchset and + fetches the change commit **and its parent** into a local cache checkout. +3. Builds twice (heavy, local): builds the Codex packages at the **parent** + commit (unpatched) and at the **change** commit (patched). +4. Detects the footprint: the distributed files (`dist/**` + root `theme-*`) + that differ between the two builds are exactly what the change touches — + auto-detected, not a hardcoded list, so it scales to whatever files a change + touches. Package metadata (`package.json` / `README` / `LICENSE`) is excluded. +5. Builds a tiny per-file diff anchored to the published artifact: it formats the + published file, the unpatched build, and the patched build with the committed + Prettier config, 3-way merges so only the unpatched→patched change is layered + onto the published file, then diffs `format(published)` → merged. +6. Writes the small patches to `patches/codex/*.patch` plus `manifest.json` + (Codex versions, change id, Prettier version, file list). +7. Applies the patch locally via `scripts/apply-codex-patch.mjs` (the same path + CI uses), so local == CI. + +Commit `patches/codex/`. Because the deploy / preview workflows run +`npm ci && npm run build`, the `postinstall` applier reproduces the change in the +PR preview. + +## How it is applied (and why it is small + deterministic) + +`scripts/apply-codex-patch.mjs` is wired as `postinstall`, so it runs on every +`npm install` / `npm ci`. For each file in the manifest it: + +- re-formats the freshly installed (published) file with the committed Prettier + config — bypassing `.prettierignore`, since the targets live in `node_modules`; +- applies the committed diff idempotently with `git apply` (it reverse-checks + first, so re-running is a no-op). + +- **Small per file**: formatting both sides normalizes the minified single-line + `codex.style.css` (one ~170 KB line), so each file's diff is proportional to the + real change, not the file size. Patching the whole distribution is therefore a + few thousand lines of text diff total, not megabytes of tarball. +- **Deterministic**: the diff is always applied to the **fixed, integrity-locked + published artifact** after re-formatting with the **pinned** Prettier (same + version via the lockfile, same committed `.prettierrc.json`). Same inputs + everywhere → `git apply` always lands. If it ever can't apply cleanly, the + applier errors loudly instead of producing a wrong build. +- **No CI build**: the applier is a fast text pass (format + apply), never a + Codex build. + +## Reset ```bash npm run patch-codex:reset ``` -## Why all three packages are patched together +Deletes `patches/codex/`, removes the installed Codex packages, and reinstalls +the registry-resolved packages from the `package.json` ranges. Run this before +merging if the upstream change is not yet released, so the branch does not ship a +patched Codex to production. + +## Why all three packages are considered together -ProtoWiki consumes all three Codex packages directly, and `@wikimedia/codex` depends on matching icon/token outputs. Keeping them in lockstep avoids mixed-version visual bugs. +ProtoWiki consumes all three Codex packages directly +(`@wikimedia/codex`, `@wikimedia/codex-design-tokens`, `@wikimedia/codex-icons`), +and `@wikimedia/codex` depends on matching icon/token outputs. The footprint +detection inspects all three, so a change touching any of them is captured in +lockstep — avoiding mixed-version visual bugs. ## Suggested smoke-test routes @@ -45,5 +104,16 @@ Focus on light/dark theme and desktop/mobile skin states. ## Notes -- The cache checkout lives under your system temp directory (`$TMPDIR/protowiki-codex-gerrit-cache` on macOS). -- This workflow uses `npm install --no-save`, so it does not intentionally rewrite dependency ranges in `package.json`. +- The cache checkout lives under your system temp directory + (`$TMPDIR/protowiki-codex-gerrit-cache` on macOS) and is reused across runs. +- **Regenerate on an upstream bump.** The patch is anchored to a specific + published Codex version and Prettier version. If you bump `@wikimedia/codex` + (see [`protowiki-update-codex`](../SKILL.md)) or Prettier, re-run + `npm run patch-codex -- ` to regenerate, then commit the refreshed + `patches/codex/`. (Same "regenerate on upstream bump" you'd have with + patch-package.) +- If the Gerrit change gets a new patchset, just re-run `npm run patch-codex` + to refresh the diff. +- Optimized for token/style/CSS-level changes (the common Codex-trial case). A + change that significantly alters the bundled JS is still captured, but its + formatted diff would be larger. diff --git a/package-lock.json b/package-lock.json index 4b9d607..2036a5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "protowiki", - "version": "0.1.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "protowiki", - "version": "0.1.0", + "version": "0.2.0", + "hasInstallScript": true, "dependencies": { "@wikimedia/codex": "^2.6.0", "@wikimedia/codex-design-tokens": "^2.6.0", @@ -18,6 +19,7 @@ "@types/node": "^22.10.0", "@vitejs/plugin-vue": "^6.0.0", "@vue/eslint-config-typescript": "^14.0.0", + "diff": "^9.0.0", "eslint": "^9.16.0", "eslint-plugin-vue": "^10.0.0", "postcss": "^8.5.12", @@ -2255,6 +2257,16 @@ "dev": true, "license": "MIT" }, + "node_modules/diff": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", diff --git a/package.json b/package.json index c04335e..349e277 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "format": "prettier --write \"src/**/*.{ts,vue,css}\"", "lint": "eslint . --ext .ts,.vue", "snapshot:wiki-skins": "bash scripts/snapshot-wiki-skins.sh", + "postinstall": "node scripts/apply-codex-patch.mjs", "patch-codex": "node scripts/patch-codex.mjs", "patch-codex:reset": "node scripts/patch-codex.mjs --reset" }, @@ -26,6 +27,7 @@ "@types/node": "^22.10.0", "@vitejs/plugin-vue": "^6.0.0", "@vue/eslint-config-typescript": "^14.0.0", + "diff": "^9.0.0", "eslint": "^9.16.0", "eslint-plugin-vue": "^10.0.0", "postcss": "^8.5.12", diff --git a/patches/codex/manifest.json b/patches/codex/manifest.json new file mode 100644 index 0000000..2514d7c --- /dev/null +++ b/patches/codex/manifest.json @@ -0,0 +1,710 @@ +{ + "change": "1288878", + "patchset": 2, + "revision": "6f06d901bc3a78a290ca2de006bf94fee8a25284", + "generatedAt": "2026-06-17T11:01:18.975Z", + "codexVersions": { + "@wikimedia/codex": "2.6.0", + "@wikimedia/codex-design-tokens": "2.6.0", + "@wikimedia/codex-icons": "2.6.0" + }, + "prettierVersion": "3.8.3", + "files": [ + { + "target": "@wikimedia/codex/dist/codex.style-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/codex.style-bidi.css", + "patch": "wikimedia__codex__dist__codex.style-bidi.css.patch", + "baseSha": "8904c14fad35778e350a0d15d85597bce4f17100a2818e07351c35c0ac8e118c", + "patchedSha": "a6ee3905826c21299c920983bee2f5e5d1b36d139af46910cbdaa2ebb3a4ec8c" + }, + { + "target": "@wikimedia/codex/dist/codex.style-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/codex.style-rtl.css", + "patch": "wikimedia__codex__dist__codex.style-rtl.css.patch", + "baseSha": "79ec4aca31509b82b146fd48c7c9edb70c0c7a13d78662e123517a03d85008c3", + "patchedSha": "d1750bf7d038455cafbf6514c204a31a4f6ba880f37c7fe26c24a1417678f809" + }, + { + "target": "@wikimedia/codex/dist/codex.style.css", + "package": "@wikimedia/codex", + "rel": "dist/codex.style.css", + "patch": "wikimedia__codex__dist__codex.style.css.patch", + "baseSha": "9b76b0eb1717ee84ad42ba8d5c59085d981d444ebd7696d7bb2658de6206d909", + "patchedSha": "ea10b8218cc876b32767eb11238a85ceb957a3be0a44f3cc83e0d65ae9b89467" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxAccordion-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxAccordion-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxAccordion-bidi.css.patch", + "baseSha": "d803fd7339951206ac07aef0656e9e4c2c1d0b0cddcfe9ecd3b9283024f96e86", + "patchedSha": "b692b2ea44ff59fce6fdc6f6386de03fda3d60e5beb04a529267255b1554ea05" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxAccordion-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxAccordion-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxAccordion-rtl.css.patch", + "baseSha": "112c89114caade2afa33913c8fbc6950b5e6c390612c9ba82c5847ba960af7cd", + "patchedSha": "0cb3b13fa8d2d33d312bbfbef0982a7f8cfec5924d9bea5084c0d657f14e550b" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxAccordion.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxAccordion.css", + "patch": "wikimedia__codex__dist__modules__CdxAccordion.css.patch", + "baseSha": "30b133cea95bae082af4d7ec323e625e4e0a1a4cad0e6df842790ddb34a37654", + "patchedSha": "d23ef4085da8fb3f41bf839814d88404a5fdf60c619a6681c3f522f407ea583f" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxButton-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxButton-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxButton-bidi.css.patch", + "baseSha": "c4586344d5fb0dc6af11209259d7077b62ab2cb8acae0c87c8178e3c4a9e76ac", + "patchedSha": "f6916cf15f8dee0f27453fed602fedc7edd7b8ff6f8c84f810c2c7481a24b710" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxButton-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxButton-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxButton-rtl.css.patch", + "baseSha": "27d1b9ed6c7edffc48dfe855106653ca19fa5a026df77031b2f7c26c0a4e49a6", + "patchedSha": "91785c2890a11ecf427ab17e608f8dde37ad8ab60c0a8992bff03638d5071af0" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxButton.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxButton.css", + "patch": "wikimedia__codex__dist__modules__CdxButton.css.patch", + "baseSha": "09ae3dbe1e3a0ab0aeb0a0e73df3e5a95c31b1d39225b7ef3feeac7caa0f5ba3", + "patchedSha": "f63b3e2c9bd3c6a0455a07b8bfbb441ccd5c4a52fe59643a227bdb0686dc18f8" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxButtonGroup-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxButtonGroup-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxButtonGroup-bidi.css.patch", + "baseSha": "8feea7a6e06f819f1fb9f99d894cd223713738e7c1194807905a3745882d42ed", + "patchedSha": "c55df98c87cabacdd1b8e629e2262d5161b0744f3bd8c8578f97df5aa4231f5c" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxButtonGroup-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxButtonGroup-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxButtonGroup-rtl.css.patch", + "baseSha": "e12301260e13fe99de0d651b2099b8d8d3bd3ed559a1feb02321feadcbad0662", + "patchedSha": "a995753ddf8c082d16211bd19f600a61832164c43c4f95880073a46574eeb02f" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxButtonGroup.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxButtonGroup.css", + "patch": "wikimedia__codex__dist__modules__CdxButtonGroup.css.patch", + "baseSha": "289e7df75ec354536466e35b55a9f7eccf9928e4ad761fe98a8b23441d4a1c45", + "patchedSha": "4c47c397a6ff3d9de2105f99f851d7fa70ee949ba126338b27904f607ee367d9" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxCard-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxCard-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxCard-bidi.css.patch", + "baseSha": "965a3c64ec316d43558e03e66c5eafb61f46d7a03da40ed72d3854cd8ae7e626", + "patchedSha": "e9cb948869dd6fdd046db3afcf601f4f54d7c8715e3cc39f267e94a749d39aa1" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxCard-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxCard-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxCard-rtl.css.patch", + "baseSha": "0e8bb06039549db0353ba6ce383e660c3be5ff37adb1fd899d53c6f6eb08d0f5", + "patchedSha": "2670e28f7f5aad045d66cfb395c09c015c9d6037644bc67a2dcceeca707b68bd" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxCard.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxCard.css", + "patch": "wikimedia__codex__dist__modules__CdxCard.css.patch", + "baseSha": "87c2bcdb322f4c7a869c7bded656f130feea37f8117d2d8bf1153a6a1d79bd5e", + "patchedSha": "2c79ca5e60f6b5539a33a10309b603b9b918795a03173bc5ffaa3354bda8c3e8" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxCheckbox-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxCheckbox-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxCheckbox-bidi.css.patch", + "baseSha": "68fd14666239c7f77872f09b474863f140a9265967e5ee3e3f0cb79309823f4a", + "patchedSha": "fb1ff37d743e57ae5c890d998796e82cd682e3c263ff14a9e239d5bdb0cb36c2" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxCheckbox-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxCheckbox-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxCheckbox-rtl.css.patch", + "baseSha": "5ab6e1effee90b0dbb1380eff524d7061c6c71e4afff3356a74734ef3835c017", + "patchedSha": "243ef6785d34576143d8954b1df12e255a3867346fa5b7a2b95d922861bff7fd" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxCheckbox.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxCheckbox.css", + "patch": "wikimedia__codex__dist__modules__CdxCheckbox.css.patch", + "baseSha": "8bbe0b3fe85ebf91b4bcb06dda962e183d1022ef1399c07e16e6887994fc69b7", + "patchedSha": "a2f00db60dc9419fd9705b75685499ec23755bdfd042d38c82893aa5e1783e51" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxChipInput-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxChipInput-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxChipInput-bidi.css.patch", + "baseSha": "fc66cd9d85356b0b72903ce529e12e5a261956a303f6a966332c3e75ffc05504", + "patchedSha": "ad3434a974837ea4bfc8b808d2899995c270a867dbb1f0da25524dbe6e6332f2" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxChipInput-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxChipInput-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxChipInput-rtl.css.patch", + "baseSha": "505ec39ed353514d3957ec7245db6c316a4503bc9cee76ad6350472da84524fd", + "patchedSha": "0b0bc9ba8d1e64b9da85a2c2a06f26656dbec6dd076afc85e987b90b8b6f196f" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxChipInput.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxChipInput.css", + "patch": "wikimedia__codex__dist__modules__CdxChipInput.css.patch", + "baseSha": "c88f2c7cb97665f3a3d5c2943a07b3420baaa147587f57e5992624e24bc230e8", + "patchedSha": "889135cd8d7e49c4a2a5448b3cdb79d24ed6c60e3712212ae81c7923cc8a86e7" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxDialog-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxDialog-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxDialog-bidi.css.patch", + "baseSha": "c1c83648100a85a8751a21d8a7b2afaa5a9c3411b74407297fadfb3d886f310e", + "patchedSha": "79897286c47e9c624230491fe7fb89f99ceda876cc45361a3d5621b9d6df3b30" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxDialog-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxDialog-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxDialog-rtl.css.patch", + "baseSha": "478d3560e13c421a757e48232ec44a5fad58646ab0ece355ab2fe4492e2d78fd", + "patchedSha": "128ec02cab543898b2a77f4b41a28da6729fe9aaff9bc6abac82b19514531017" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxDialog.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxDialog.css", + "patch": "wikimedia__codex__dist__modules__CdxDialog.css.patch", + "baseSha": "aba137e09987f760ab633f44bd5fe2c8c099e2689acf708fddfc11e8995af9df", + "patchedSha": "cc6aec4a9b3c38f3e18ea83ebb199cc0336ae6efccb7b0d04c5e9324a8d649fe" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxImage-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxImage-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxImage-bidi.css.patch", + "baseSha": "b305aa18db29ad7260f186d4fa9add23ecb02b508ff9b5d156fb1030d74aa6b7", + "patchedSha": "2fc73fbd15520ef62517faefa692533bf71d4c4b6b432105f3d941633e1457e0" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxImage-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxImage-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxImage-rtl.css.patch", + "baseSha": "ce92123f06d7c971379d8110f82679c7a35d96d41568ac1e908a39c726fff6b6", + "patchedSha": "8237e3fe3aff9523d6ec5336f91a19bd9fdb8e09b18fd0d3d09eb21aa722f210" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxImage.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxImage.css", + "patch": "wikimedia__codex__dist__modules__CdxImage.css.patch", + "baseSha": "a9dfd04dc2ce2172a53bee6a6f210e8c0b84f9178ee7f55a55412405ba512114", + "patchedSha": "6c6a669d3ed078a5895708ef0c5b1a5315e3da56cae0360120fa5e54d6b6e340" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxMenu-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxMenu-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxMenu-bidi.css.patch", + "baseSha": "af87b08e3cbfea183ff06916fc093d6549b60b603395b9e4b7717d87546a5af4", + "patchedSha": "80681025def2c3df09229193a5278a06353ed0f7346df899cc00a6ebd54e2382" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxMenu-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxMenu-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxMenu-rtl.css.patch", + "baseSha": "0cae371be5132921d2f87bc42e19d260f4e784d9cbc7629a9f109126ed320c0f", + "patchedSha": "a7d789dee0400e9427dfe3f0c5a973db623d43d8d66809320aa7571a9b009206" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxMenu.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxMenu.css", + "patch": "wikimedia__codex__dist__modules__CdxMenu.css.patch", + "baseSha": "d59543545b0c214ec6facb1f65d46d2f330fd064fc64372b68025a2592559a26", + "patchedSha": "c1d9edf6e12edf39c8de644d67356aad77760260082555ee844215a9426295f0" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxMessage-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxMessage-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxMessage-bidi.css.patch", + "baseSha": "8e3ef1f66a92352944b06af85adcc04e8715bf3966dccffeb9d6f4cfa7e6faf2", + "patchedSha": "2300cc98f3f33e01f97daae1def11bf22c55dc2b9e72a43871354ef4e132b5d0" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxMessage-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxMessage-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxMessage-rtl.css.patch", + "baseSha": "81caa67c6d35184f98ee66282e31696a2ad2bc4bcb4765430c2c16f01ba5a46f", + "patchedSha": "526553d5f9a0c108f624ecabfcb3eda1876055147e8fe761bb5cdcfb5d5393fc" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxMessage.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxMessage.css", + "patch": "wikimedia__codex__dist__modules__CdxMessage.css.patch", + "baseSha": "ce40adc2107664b3489202db6398bb1e4238dace33b05b0a3e966a9c3684965d", + "patchedSha": "20b2d3b01ee34afce1cd4b2609316c44759182f33b69464a9d12b313ac836be4" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxPopover-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxPopover-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxPopover-bidi.css.patch", + "baseSha": "d6ff586ca0b024c61b976329e0537e185a2101bbd6e2e8e1d1fd77878d77e7db", + "patchedSha": "b6ca9b7e8dad4e0f48f7e558a52c15cc682f5ee0e9830a3d91dd0c5f0ecd3ed1" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxPopover-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxPopover-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxPopover-rtl.css.patch", + "baseSha": "931a470dfd535d2aca03383334979464c3a1b5f3f7d13d2e151583aca0eff532", + "patchedSha": "bc025854b0e900df24128d9057b38cf7a8613b136002eb0a1ba1706d8f48ab04" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxPopover.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxPopover.css", + "patch": "wikimedia__codex__dist__modules__CdxPopover.css.patch", + "baseSha": "b769a9353e48765337bbd19c62ba87735eb9fd87296c3ac3c05e5affa35b9b76", + "patchedSha": "f321ec5418dedc44ba81754fb5d84e611d6c92f331536278ce153e9f0ff7af98" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxProgressBar-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxProgressBar-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxProgressBar-bidi.css.patch", + "baseSha": "7ff2afa9a25af0f834b6f247a2303b4a1457175617ffcb278a467bc3f678eb15", + "patchedSha": "efdb0d8a14fd3b8f6ec1d84976d09add9739489c0460af48c744bb270212c1a8" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxProgressBar-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxProgressBar-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxProgressBar-rtl.css.patch", + "baseSha": "f5cbb33d0b0f2bf7d3eb6b9b604684225c4c2559dec4cac413630059f5294734", + "patchedSha": "52d97290b898b2d4164e55b6562dcd8ec407f6b89023549359d7fc6a85a86653" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxProgressBar.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxProgressBar.css", + "patch": "wikimedia__codex__dist__modules__CdxProgressBar.css.patch", + "baseSha": "bf665f0509623a33693cbcdce704ba606b72a04a2a76da4848aff94424cd54a8", + "patchedSha": "1e437ae4120a8c9a4dea4fd82c883bf0f15339a9976aebe2598d462c84f0a155" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxSearchInput-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxSearchInput-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxSearchInput-bidi.css.patch", + "baseSha": "1101ea58a0cbc68e8e316210275a6e62fc9a88246c4fc4c57b99448c970a2c2a", + "patchedSha": "a9a3c48c89928426b527da77d26d68e7f6a46c2599b5c46c88deb4807c2ac720" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxSearchInput-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxSearchInput-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxSearchInput-rtl.css.patch", + "baseSha": "29800680e2760590f5ad4c5fa0f747395796259312aabdb2f066fb251b61ea9b", + "patchedSha": "7e0128e2c1d75e166ce8482421c8884ab4e2ec18798193fbe7216624188c6871" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxSearchInput.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxSearchInput.css", + "patch": "wikimedia__codex__dist__modules__CdxSearchInput.css.patch", + "baseSha": "bddeefd7c8a077ff4cb5ffdf15be7b6bc91faee080c33ce7079d26d008a3ecd9", + "patchedSha": "96b3af99e035ab595d5d6d31531d73c99dcc2d6fcd0d560a6f996aadf86a5eaa" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxSelect-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxSelect-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxSelect-bidi.css.patch", + "baseSha": "5ef7c1f5dd7164f784d8d4baddaf674ef5daa32a60e07d3fdf4acfc3463068be", + "patchedSha": "fd95453c36b902e55d8d584e09f30bb5bea74f71b6393c919f45dd3fe2ddc649" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxSelect-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxSelect-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxSelect-rtl.css.patch", + "baseSha": "c3ce6af867b9db63d81d0108fb421a173e0136bb9918882be8c79744651f284b", + "patchedSha": "4801c7d542f0dcd58312830251edc29afa79a61399dd16989034ecd3dec1eb8a" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxSelect.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxSelect.css", + "patch": "wikimedia__codex__dist__modules__CdxSelect.css.patch", + "baseSha": "e52f464ce38827bc8593e3b5cbf136c75bcce82e27f58bf1949e317c97a01504", + "patchedSha": "87146ef06b46789ad9008991dae54ab522cd32cb56fdbe34d1d1848033fa9fcd" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTable-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTable-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxTable-bidi.css.patch", + "baseSha": "f91150afe86c1b6fa15dfc9c3c49f8da4440fe7149bb2385b98c82df2b2feb59", + "patchedSha": "68c03f82031e6d0243d987570eff84b67185c0eab887f68b97853f9fe2873d72" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTable-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTable-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxTable-rtl.css.patch", + "baseSha": "c9b8d575935a958460a5d68250e1fbe1776c10745f1c85b5fe8cdbac1f328b23", + "patchedSha": "4d57907008eaca02ff34fc9ad0f3b40363cc6bf797a1936b698351ea7081a44b" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTable.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTable.css", + "patch": "wikimedia__codex__dist__modules__CdxTable.css.patch", + "baseSha": "4824b8b63c2beee8f636cfa801cfb3349cde8c13921bead839fed066ad6ca580", + "patchedSha": "fff3344f0607401791c1660575813fd4f57ef250f7418e8e3b4f426bc72f1c9c" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTabs-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTabs-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxTabs-bidi.css.patch", + "baseSha": "cf199b3741285ad9a3883b4ff3b95b7eee2f0ced512fcad1fbdd6235ea10d799", + "patchedSha": "d6f4eda4e014554ce55e57fb042b362e01cc30db5bdf8a680d8ce6cf67e2a769" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTabs-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTabs-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxTabs-rtl.css.patch", + "baseSha": "194c226006779a8478b4bd7ce3a2c9e4b30bcfd222b29124390cd9d1b582fe6e", + "patchedSha": "2223a7de6a02c4a03df652e9dd4922c2ae16e20c7f0632a518621f0394c6a3df" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTabs.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTabs.css", + "patch": "wikimedia__codex__dist__modules__CdxTabs.css.patch", + "baseSha": "68b2599b4f116dd77601ff720d9d3538dca3b6f227f4d05bf26fe675a3063b57", + "patchedSha": "e8e26c0bac65bbe34490507c328851717e3c3cc543fb3b94285d8356b32b48e5" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTextArea-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTextArea-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxTextArea-bidi.css.patch", + "baseSha": "0227caf55625be4c072555915d0b4633c297e451fa6cc302959bda91e93ab0bd", + "patchedSha": "1c30051451ca70d0cd20096ceab0f17c2d38a907fb699eecb74526660dfecef6" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTextArea-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTextArea-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxTextArea-rtl.css.patch", + "baseSha": "875ede201929d2fe60d4992facd90b39db7ab700aff1a6d52661ba2acc212746", + "patchedSha": "83528a70f7be5a658791ac01bc69af1f725e895560ce2277b63defb954cc1778" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTextArea.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTextArea.css", + "patch": "wikimedia__codex__dist__modules__CdxTextArea.css.patch", + "baseSha": "c1cc8a438bc49e405732f954e01af8b5fdb67ef1d43a650829ee06460bcbc290", + "patchedSha": "58d9e27c96525cc45998a975ec23cb53d078e059aea360b17e948c18709811ee" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTextInput-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTextInput-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxTextInput-bidi.css.patch", + "baseSha": "08d2b44c633ac4d52c0ca210b8787ba2498167698d9da7720d05c53187c1450c", + "patchedSha": "752ca4ebd1e2908a83e61d3f72bb514b1ef725f7e1424d18fc69aa5470f84dcb" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTextInput-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTextInput-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxTextInput-rtl.css.patch", + "baseSha": "829d4506f5e22b31900cd70c713646cbffa7abd15216c7437379b6f4cc981593", + "patchedSha": "86c85fdd55446d375722fedbf66112b6e50f2375ce5a088d7ee99e9c70d8accd" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTextInput.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTextInput.css", + "patch": "wikimedia__codex__dist__modules__CdxTextInput.css.patch", + "baseSha": "287cfefa9b1cc096d1eb3bf5395645e80f4983058a4a716147185e0c482ccfd5", + "patchedSha": "0db9d5c803d38009159d09f1ec56b814a999efe6d3503b10f6c1f5cf28d8edf9" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxThumbnail-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxThumbnail-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxThumbnail-bidi.css.patch", + "baseSha": "e7a6d65500857c68d7de0599a8a573c9d01c25116fbbea0f34bc46b7c25784c4", + "patchedSha": "f2a2551ecc36fd78f8ebeaae6e0d657fff2713f18ae71d4098ebaa613252d549" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxThumbnail-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxThumbnail-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxThumbnail-rtl.css.patch", + "baseSha": "63a1adba4f028d20ca18b5ff0db6ec9e459afdc878ec4e43ae03a7b9c9c639a0", + "patchedSha": "89f221e6edb89c44f3d3769c97209d9bfbf40d6ed3cdb886fa27953aaee67482" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxThumbnail.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxThumbnail.css", + "patch": "wikimedia__codex__dist__modules__CdxThumbnail.css.patch", + "baseSha": "63a1adba4f028d20ca18b5ff0db6ec9e459afdc878ec4e43ae03a7b9c9c639a0", + "patchedSha": "89f221e6edb89c44f3d3769c97209d9bfbf40d6ed3cdb886fa27953aaee67482" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxToggleButton-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxToggleButton-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxToggleButton-bidi.css.patch", + "baseSha": "5825b15dbf7d93cd51e9d09f8d8def54f2317339d2205589b26f8c0f447696df", + "patchedSha": "6a2172ae42c31fe99a688005e792f20e4c613115ff8516e9628abab59ccf4aa6" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxToggleButton-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxToggleButton-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxToggleButton-rtl.css.patch", + "baseSha": "a90a8d51c63b0ba159c6c060c585d77b7ea84e42c9860bc635bd0ac5daf97f7e", + "patchedSha": "de5b13de82db6f24075a1d30cabfd55fe80515482272e615d4962dbd482962b6" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxToggleButton.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxToggleButton.css", + "patch": "wikimedia__codex__dist__modules__CdxToggleButton.css.patch", + "baseSha": "21b48aad5a71da18a481558d5534599290103247bcdf4d21535f5fbc04aee363", + "patchedSha": "684f0ddcf13f578bf586b0309867e5b8ce251225cd1d188561d1912241615ed7" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxToggleButtonGroup-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxToggleButtonGroup-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxToggleButtonGroup-bidi.css.patch", + "baseSha": "d6a94a53d5ef7c4a81bf9a252a6cba80ca81605482686b0bf48e9579a2d3ceb2", + "patchedSha": "19580ba09593ed8fe05ff186560049591bd9d7d2f2fa6e6a69f75c8a26792ab8" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxToggleButtonGroup-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxToggleButtonGroup-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxToggleButtonGroup-rtl.css.patch", + "baseSha": "47937ae7c36b3f1e7394642725c777e7a85d879145552fc6759affdcc71db2f8", + "patchedSha": "8d28fea9345813872bf497e1d223f0b322f7bc5112c10246ff2ba87b277ea738" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxToggleButtonGroup.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxToggleButtonGroup.css", + "patch": "wikimedia__codex__dist__modules__CdxToggleButtonGroup.css.patch", + "baseSha": "f7e4496a0453519b91c8f4f2851f52eaa1667963050fbf3139b56ce8337670aa", + "patchedSha": "4c064d16b6ceb48110640dc2a63a0942ad51a4a735524b0a94fc13ffd4555709" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTooltip-bidi.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTooltip-bidi.css", + "patch": "wikimedia__codex__dist__modules__CdxTooltip-bidi.css.patch", + "baseSha": "de977b77b0ad6d48d15629290cd83e4fc0de9477644e5da00a1cf7836054d053", + "patchedSha": "ee8197021435b685ed28902ad7d38d31c8626ce5b290ff085cb2718ae02d1d87" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTooltip-rtl.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTooltip-rtl.css", + "patch": "wikimedia__codex__dist__modules__CdxTooltip-rtl.css.patch", + "baseSha": "e2591b25b50d06ec43a894435b571599536052025b8dc648e2f78b2763d75594", + "patchedSha": "cf623f0a170b3d3b14891ef878e84e7ad4c1d71d612660018ae6b3feaba02438" + }, + { + "target": "@wikimedia/codex/dist/modules/CdxTooltip.css", + "package": "@wikimedia/codex", + "rel": "dist/modules/CdxTooltip.css", + "patch": "wikimedia__codex__dist__modules__CdxTooltip.css.patch", + "baseSha": "e2591b25b50d06ec43a894435b571599536052025b8dc648e2f78b2763d75594", + "patchedSha": "cf623f0a170b3d3b14891ef878e84e7ad4c1d71d612660018ae6b3feaba02438" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui-mode-dark.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui-mode-dark.json", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-dark.json.patch", + "baseSha": "433af0fba1096d524ef87c05d3e5a5a85b7ce275a6321549e8ab95880126b6e0", + "patchedSha": "4eda3ced8dc30d8b8ada10a1c5bfe06339e5b6054b50dfc76db9dcbf9f6b4ba0" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui-mode-large.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui-mode-large.json", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-large.json.patch", + "baseSha": "c5119834056aae0532a4f3661a54fdd551fd777093823a5155c9ea822aa72e1a", + "patchedSha": "344af5a345c3699db2109fc4eb54cc9cb0cbbe5d9b1a78b6bdc0a768464d6c80" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui-mode-small.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui-mode-small.json", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-small.json.patch", + "baseSha": "770cc1cb3654f04cd8d1fc961d95098b397969d3fae0a2355b35bec9b349b202", + "patchedSha": "f3c958c6929547c1fa1ebf71ccc023d8241e2c533856e81ee1fa010bdab647bb" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui-mode-x-large.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui-mode-x-large.json", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-x-large.json.patch", + "baseSha": "41dd7e62a7b09faee3c5fd2d06b989b11d4d2acb3dfe01b9b82951fe6169bca0", + "patchedSha": "7eae6940b1f0dd076cdbb81480522e0ac0bd90fb0e42403825d13b10cdd8ac54" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui.css", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui.css", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.css.patch", + "baseSha": "3f5934a1b290ae0408b4ea9c76e42b5d99e200c7f1bf7191024a4b8c73c7cbb1", + "patchedSha": "18694255e2d953c118841e0554ec49537be8e2fd9f20da7fe3177f64bf859de4" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui.js", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui.js", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.js.patch", + "baseSha": "1a7e259d196ac0f79ee0690d78555828168c682fbc5ae595c9ecf03ae7083301", + "patchedSha": "6a84c6debbe3e8a2f98977cf31a4ee9822de9536d5cb4be2868076e215027316" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui.json", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.json.patch", + "baseSha": "a34bfa04a6e9321dc88127755dc0cd47f8b33ad43a7090844506e214b5e483b4", + "patchedSha": "59ebeb7436370466c0623f2d52a7eb4bd02b91d38b71ce990d3b15ba0a510d4c" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui.less", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui.less", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.less.patch", + "baseSha": "b641af174c3f8fa2b99ded6a2444d93a60c4cdd8f06c3471e178c79750146e47", + "patchedSha": "f29d1c31863bdb223874333770a6565940c913f880a0d380b2c5cc840abbc044" + }, + { + "target": "@wikimedia/codex-design-tokens/dist/theme-wikimedia-ui.scss", + "package": "@wikimedia/codex-design-tokens", + "rel": "dist/theme-wikimedia-ui.scss", + "patch": "wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.scss.patch", + "baseSha": "4f0b75be3bb18ddda692f80cdb3992726f59a14a3d8e072cae7560c2bdad4bd0", + "patchedSha": "0e7af13b75cd9728bba9a8d5ba17217fa6ada92837491c4bf7000a8fde4795c5" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui-mode-dark.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui-mode-dark.json", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-dark.json.patch", + "baseSha": "433af0fba1096d524ef87c05d3e5a5a85b7ce275a6321549e8ab95880126b6e0", + "patchedSha": "4eda3ced8dc30d8b8ada10a1c5bfe06339e5b6054b50dfc76db9dcbf9f6b4ba0" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui-mode-large.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui-mode-large.json", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-large.json.patch", + "baseSha": "c5119834056aae0532a4f3661a54fdd551fd777093823a5155c9ea822aa72e1a", + "patchedSha": "344af5a345c3699db2109fc4eb54cc9cb0cbbe5d9b1a78b6bdc0a768464d6c80" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui-mode-small.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui-mode-small.json", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-small.json.patch", + "baseSha": "770cc1cb3654f04cd8d1fc961d95098b397969d3fae0a2355b35bec9b349b202", + "patchedSha": "f3c958c6929547c1fa1ebf71ccc023d8241e2c533856e81ee1fa010bdab647bb" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui-mode-x-large.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui-mode-x-large.json", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-x-large.json.patch", + "baseSha": "41dd7e62a7b09faee3c5fd2d06b989b11d4d2acb3dfe01b9b82951fe6169bca0", + "patchedSha": "7eae6940b1f0dd076cdbb81480522e0ac0bd90fb0e42403825d13b10cdd8ac54" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui.css", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui.css", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui.css.patch", + "baseSha": "3f5934a1b290ae0408b4ea9c76e42b5d99e200c7f1bf7191024a4b8c73c7cbb1", + "patchedSha": "18694255e2d953c118841e0554ec49537be8e2fd9f20da7fe3177f64bf859de4" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui.js", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui.js", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui.js.patch", + "baseSha": "1a7e259d196ac0f79ee0690d78555828168c682fbc5ae595c9ecf03ae7083301", + "patchedSha": "6a84c6debbe3e8a2f98977cf31a4ee9822de9536d5cb4be2868076e215027316" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui.json", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui.json", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui.json.patch", + "baseSha": "a34bfa04a6e9321dc88127755dc0cd47f8b33ad43a7090844506e214b5e483b4", + "patchedSha": "59ebeb7436370466c0623f2d52a7eb4bd02b91d38b71ce990d3b15ba0a510d4c" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui.less", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui.less", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui.less.patch", + "baseSha": "b641af174c3f8fa2b99ded6a2444d93a60c4cdd8f06c3471e178c79750146e47", + "patchedSha": "f29d1c31863bdb223874333770a6565940c913f880a0d380b2c5cc840abbc044" + }, + { + "target": "@wikimedia/codex-design-tokens/theme-wikimedia-ui.scss", + "package": "@wikimedia/codex-design-tokens", + "rel": "theme-wikimedia-ui.scss", + "patch": "wikimedia__codex-design-tokens__theme-wikimedia-ui.scss.patch", + "baseSha": "4f0b75be3bb18ddda692f80cdb3992726f59a14a3d8e072cae7560c2bdad4bd0", + "patchedSha": "0e7af13b75cd9728bba9a8d5ba17217fa6ada92837491c4bf7000a8fde4795c5" + } + ] +} diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-dark.json.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-dark.json.patch new file mode 100644 index 0000000..662751d --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-dark.json.patch @@ -0,0 +1,48 @@ +Index: dist/theme-wikimedia-ui-mode-dark.json +=================================================================== +--- dist/theme-wikimedia-ui-mode-dark.json ++++ dist/theme-wikimedia-ui-mode-dark.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-large.json.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-large.json.patch new file mode 100644 index 0000000..2f0a8c9 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-large.json.patch @@ -0,0 +1,48 @@ +Index: dist/theme-wikimedia-ui-mode-large.json +=================================================================== +--- dist/theme-wikimedia-ui-mode-large.json ++++ dist/theme-wikimedia-ui-mode-large.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-small.json.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-small.json.patch new file mode 100644 index 0000000..f0fd6d8 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-small.json.patch @@ -0,0 +1,48 @@ +Index: dist/theme-wikimedia-ui-mode-small.json +=================================================================== +--- dist/theme-wikimedia-ui-mode-small.json ++++ dist/theme-wikimedia-ui-mode-small.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-x-large.json.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-x-large.json.patch new file mode 100644 index 0000000..52aa884 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui-mode-x-large.json.patch @@ -0,0 +1,48 @@ +Index: dist/theme-wikimedia-ui-mode-x-large.json +=================================================================== +--- dist/theme-wikimedia-ui-mode-x-large.json ++++ dist/theme-wikimedia-ui-mode-x-large.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.css.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.css.patch new file mode 100644 index 0000000..96e8bbf --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.css.patch @@ -0,0 +1,15 @@ +Index: dist/theme-wikimedia-ui.css +=================================================================== +--- dist/theme-wikimedia-ui.css ++++ dist/theme-wikimedia-ui.css +@@ -364,9 +364,9 @@ + --border-color-option-pink: #b5739e; + --border-color-option-maroon: #b57775; + --border-color-transparent: transparent; + --border-color-divider: #a2a9b1; +- --border-radius-base: 2px; ++ --border-radius-base: 4px; + --border-radius-sharp: 0; + --border-radius-pill: 9999px; + --border-radius-circle: 50%; /* Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 */ + --outline-color-progressive--focus: #36c; /* Use in places where no more customized focus styles are provided, for example on generic `:focus`. */ diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.js.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.js.patch new file mode 100644 index 0000000..2d76e14 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.js.patch @@ -0,0 +1,15 @@ +Index: dist/theme-wikimedia-ui.js +=================================================================== +--- dist/theme-wikimedia-ui.js ++++ dist/theme-wikimedia-ui.js +@@ -398,9 +398,9 @@ + export const cdxBorderSubtle = '1px solid #c8ccd1' + export const cdxBorderProgressive = '1px solid #36c' + export const cdxBorderDestructive = '1px solid #f54739' + export const cdxBorderTransparent = '1px solid transparent' +-export const cdxBorderRadiusBase = '2px' ++export const cdxBorderRadiusBase = '4px' + export const cdxBorderRadiusSharp = '0' + export const cdxBorderRadiusPill = '9999px' + export const cdxBorderRadiusCircle = '50%' // Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 + export const cdxOutlineBaseFocus = '1px solid transparent' // Enable Windows high contrast mode on certain widgets, that have default outlines overridden. diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.json.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.json.patch new file mode 100644 index 0000000..6e44b61 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.json.patch @@ -0,0 +1,48 @@ +Index: dist/theme-wikimedia-ui.json +=================================================================== +--- dist/theme-wikimedia-ui.json ++++ dist/theme-wikimedia-ui.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.less.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.less.patch new file mode 100644 index 0000000..ce0d6fc --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.less.patch @@ -0,0 +1,15 @@ +Index: dist/theme-wikimedia-ui.less +=================================================================== +--- dist/theme-wikimedia-ui.less ++++ dist/theme-wikimedia-ui.less +@@ -426,9 +426,9 @@ + @border-color-option-pink: var(--border-color-option-pink, #b5739e); + @border-color-option-maroon: var(--border-color-option-maroon, #b57775); + @border-color-transparent: var(--border-color-transparent, transparent); + @border-color-divider: var(--border-color-divider, #a2a9b1); +-@border-radius-base: 2px; ++@border-radius-base: 4px; + @border-radius-sharp: 0; + @border-radius-pill: 9999px; + @border-radius-circle: 50%; // Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 + @outline-color-progressive--focus: var( diff --git a/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.scss.patch b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.scss.patch new file mode 100644 index 0000000..1cdbeeb --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__dist__theme-wikimedia-ui.scss.patch @@ -0,0 +1,15 @@ +Index: dist/theme-wikimedia-ui.scss +=================================================================== +--- dist/theme-wikimedia-ui.scss ++++ dist/theme-wikimedia-ui.scss +@@ -361,9 +361,9 @@ + $border-color-option-pink: #b5739e; + $border-color-option-maroon: #b57775; + $border-color-transparent: transparent; + $border-color-divider: #a2a9b1; +-$border-radius-base: 2px; ++$border-radius-base: 4px; + $border-radius-sharp: 0; + $border-radius-pill: 9999px; + $border-radius-circle: 50%; // Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 + $outline-color-progressive--focus: #36c; // Use in places where no more customized focus styles are provided, for example on generic `:focus`. diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-dark.json.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-dark.json.patch new file mode 100644 index 0000000..8d35564 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-dark.json.patch @@ -0,0 +1,48 @@ +Index: theme-wikimedia-ui-mode-dark.json +=================================================================== +--- theme-wikimedia-ui-mode-dark.json ++++ theme-wikimedia-ui-mode-dark.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-large.json.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-large.json.patch new file mode 100644 index 0000000..d514309 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-large.json.patch @@ -0,0 +1,48 @@ +Index: theme-wikimedia-ui-mode-large.json +=================================================================== +--- theme-wikimedia-ui-mode-large.json ++++ theme-wikimedia-ui-mode-large.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-small.json.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-small.json.patch new file mode 100644 index 0000000..9dde599 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-small.json.patch @@ -0,0 +1,48 @@ +Index: theme-wikimedia-ui-mode-small.json +=================================================================== +--- theme-wikimedia-ui-mode-small.json ++++ theme-wikimedia-ui-mode-small.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-x-large.json.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-x-large.json.patch new file mode 100644 index 0000000..7fdafbe --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui-mode-x-large.json.patch @@ -0,0 +1,48 @@ +Index: theme-wikimedia-ui-mode-x-large.json +=================================================================== +--- theme-wikimedia-ui-mode-x-large.json ++++ theme-wikimedia-ui-mode-x-large.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.css.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.css.patch new file mode 100644 index 0000000..6dfeb67 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.css.patch @@ -0,0 +1,15 @@ +Index: theme-wikimedia-ui.css +=================================================================== +--- theme-wikimedia-ui.css ++++ theme-wikimedia-ui.css +@@ -364,9 +364,9 @@ + --border-color-option-pink: #b5739e; + --border-color-option-maroon: #b57775; + --border-color-transparent: transparent; + --border-color-divider: #a2a9b1; +- --border-radius-base: 2px; ++ --border-radius-base: 4px; + --border-radius-sharp: 0; + --border-radius-pill: 9999px; + --border-radius-circle: 50%; /* Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 */ + --outline-color-progressive--focus: #36c; /* Use in places where no more customized focus styles are provided, for example on generic `:focus`. */ diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.js.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.js.patch new file mode 100644 index 0000000..8ff4466 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.js.patch @@ -0,0 +1,15 @@ +Index: theme-wikimedia-ui.js +=================================================================== +--- theme-wikimedia-ui.js ++++ theme-wikimedia-ui.js +@@ -398,9 +398,9 @@ + export const cdxBorderSubtle = '1px solid #c8ccd1' + export const cdxBorderProgressive = '1px solid #36c' + export const cdxBorderDestructive = '1px solid #f54739' + export const cdxBorderTransparent = '1px solid transparent' +-export const cdxBorderRadiusBase = '2px' ++export const cdxBorderRadiusBase = '4px' + export const cdxBorderRadiusSharp = '0' + export const cdxBorderRadiusPill = '9999px' + export const cdxBorderRadiusCircle = '50%' // Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 + export const cdxOutlineBaseFocus = '1px solid transparent' // Enable Windows high contrast mode on certain widgets, that have default outlines overridden. diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.json.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.json.patch new file mode 100644 index 0000000..f9cc227 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.json.patch @@ -0,0 +1,48 @@ +Index: theme-wikimedia-ui.json +=================================================================== +--- theme-wikimedia-ui.json ++++ theme-wikimedia-ui.json +@@ -3991,8 +3991,22 @@ + "type": "theme" + }, + "path": ["dimension", "absolute", "2"] + }, ++ "4": { ++ "value": "4px", ++ "filePath": "src/themes/wikimedia-ui.json", ++ "isSource": false, ++ "original": { ++ "value": "4px" ++ }, ++ "name": "dimension-absolute-4", ++ "attributes": { ++ "tokens": [], ++ "type": "theme" ++ }, ++ "path": ["dimension", "absolute", "4"] ++ }, + "6": { + "value": "6px", + "filePath": "src/themes/wikimedia-ui.json", + "isSource": false, +@@ -10699,17 +10713,17 @@ + } + }, + "border-radius": { + "base": { +- "value": "2px", ++ "value": "4px", + "filePath": "src/application.json", + "isSource": false, + "original": { +- "value": "{ dimension.absolute.2 }" ++ "value": "{ dimension.absolute.4 }" + }, + "name": "border-radius-base", + "attributes": { +- "tokens": ["dimension.absolute.2"], ++ "tokens": ["dimension.absolute.4"], + "type": "base" + }, + "path": ["border-radius", "base"] + }, diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.less.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.less.patch new file mode 100644 index 0000000..34302d0 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.less.patch @@ -0,0 +1,15 @@ +Index: theme-wikimedia-ui.less +=================================================================== +--- theme-wikimedia-ui.less ++++ theme-wikimedia-ui.less +@@ -426,9 +426,9 @@ + @border-color-option-pink: var(--border-color-option-pink, #b5739e); + @border-color-option-maroon: var(--border-color-option-maroon, #b57775); + @border-color-transparent: var(--border-color-transparent, transparent); + @border-color-divider: var(--border-color-divider, #a2a9b1); +-@border-radius-base: 2px; ++@border-radius-base: 4px; + @border-radius-sharp: 0; + @border-radius-pill: 9999px; + @border-radius-circle: 50%; // Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 + @outline-color-progressive--focus: var( diff --git a/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.scss.patch b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.scss.patch new file mode 100644 index 0000000..8fea899 --- /dev/null +++ b/patches/codex/wikimedia__codex-design-tokens__theme-wikimedia-ui.scss.patch @@ -0,0 +1,15 @@ +Index: theme-wikimedia-ui.scss +=================================================================== +--- theme-wikimedia-ui.scss ++++ theme-wikimedia-ui.scss +@@ -361,9 +361,9 @@ + $border-color-option-pink: #b5739e; + $border-color-option-maroon: #b57775; + $border-color-transparent: transparent; + $border-color-divider: #a2a9b1; +-$border-radius-base: 2px; ++$border-radius-base: 4px; + $border-radius-sharp: 0; + $border-radius-pill: 9999px; + $border-radius-circle: 50%; // Use `50%` for circle or ellipsis. See https://stackoverflow.com/a/29966500 + $outline-color-progressive--focus: #36c; // Use in places where no more customized focus styles are provided, for example on generic `:focus`. diff --git a/patches/codex/wikimedia__codex__dist__codex.style-bidi.css.patch b/patches/codex/wikimedia__codex__dist__codex.style-bidi.css.patch new file mode 100644 index 0000000..61e9e4d --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__codex.style-bidi.css.patch @@ -0,0 +1,320 @@ +Index: dist/codex.style-bidi.css +=================================================================== +--- dist/codex.style-bidi.css ++++ dist/codex.style-bidi.css +@@ -50,9 +50,9 @@ + [dir] .cdx-button { + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + transition-property: background-color, color, border-color, box-shadow; + transition-duration: 0.1s; +@@ -720,17 +720,17 @@ + } + [dir] .cdx-accordion--separation-outline { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px 2px 0 0; ++ border-radius: 4px 4px 0 0; + } + [dir] .cdx-accordion + .cdx-accordion--separation-outline { + border-radius: 0; + } + [dir] .cdx-accordion--separation-outline:not(:has(+ .cdx-accordion)), + [dir] .cdx-accordion + .cdx-accordion--separation-outline:last-child { +- border-bottom-left-radius: 2px; +- border-bottom-right-radius: 2px; ++ border-bottom-left-radius: 4px; ++ border-bottom-right-radius: 4px; + } + [dir] .cdx-accordion--separation-minimal > summary { + padding: 6px 0; + } +@@ -767,9 +767,9 @@ + width: fit-content; + overflow: hidden; + } + [dir] .cdx-button-group { +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + } + [dir='ltr'] .cdx-button-group { + padding-left: 1px; +@@ -807,8 +807,24 @@ + box-shadow: + 0 -1px 0 0 var(--box-shadow-color-inverted, #fff), + 1px 0 0 0 var(--box-shadow-color-inverted, #fff); + } ++[dir='ltr'] .cdx-button-group .cdx-button:first-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} ++[dir='rtl'] .cdx-button-group .cdx-button:first-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} ++[dir='ltr'] .cdx-button-group .cdx-button:last-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} ++[dir='rtl'] .cdx-button-group .cdx-button:last-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} + .cdx-thumbnail { + display: inline-flex; + } + .cdx-thumbnail__placeholder, +@@ -825,9 +841,9 @@ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-thumbnail__image { + display: inline-block; + } +@@ -902,9 +918,9 @@ + } + [dir] .cdx-card { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + [dir] .cdx-card--is-link { + transition-property: background-color, color, border-color, box-shadow; +@@ -1171,9 +1187,9 @@ + [dir='rtl'] .cdx-checkbox__custom-input:not(.cdx-checkbox__custom-input--inline) { + padding-right: calc(var(--font-size-medium, 1rem) + 10px); + } + [dir] .cdx-checkbox__icon { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-checkbox__input:indeterminate + .cdx-checkbox__icon:before { + content: ' '; + position: absolute; +@@ -1341,9 +1357,9 @@ + line-height: var(--line-height-small, 1.375rem); + } + [dir] .cdx-tooltip { + background-color: var(--background-color-inverted, #101418); +- border-radius: 2px; ++ border-radius: 4px; + padding: 2px 6px; + animation-name: cdx-animation-tooltip; + animation-duration: 0.1s; + animation-timing-function: linear; +@@ -1446,9 +1462,9 @@ + min-height: 32px; + overflow: hidden; + } + [dir] .cdx-chip-input { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-chip-input__chips, + .cdx-chip-input__separate-input { + align-items: center; +@@ -1959,9 +1975,9 @@ + border: 1px solid var(--border-color-progressive, #36c); + border-width: 1px; + border-style: solid; + border-color: var(--border-color-progressive, #36c); +- border-radius: 2px; ++ border-radius: 4px; + } + [dir] .cdx-progress-bar:not(.cdx-progress-bar--inline).cdx-progress-bar--disabled { + border-color: var(--border-color-disabled, #c8ccd1); + } +@@ -2016,9 +2032,9 @@ + } + [dir] .cdx-menu { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } +@@ -2102,9 +2118,9 @@ + min-width: 256px; + overflow: hidden; + } + [dir] .cdx-text-input { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-text-input .cdx-text-input__start-icon { + position: absolute; + top: 50%; +@@ -2421,9 +2437,9 @@ + } + [dir] .cdx-dialog { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 16px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } +@@ -2578,9 +2594,9 @@ + } + [dir] .cdx-message { + background-color: var(--background-color-notice-subtle, #eaecf0); + border: 1px solid var(--border-color-notice, #72777d); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-message__icon, + .cdx-message__icon--vue { +@@ -3031,9 +3047,9 @@ + } + [dir] .cdx-image__image { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__image--object-fit-fill { + object-fit: fill; + } +@@ -3082,9 +3098,9 @@ + } + [dir] .cdx-image__placeholder { + background-color: var(--background-color-interactive-subtle, #f8f9fa); + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__placeholder__icon--size-smallest { + width: 0.75rem; + height: 0.75rem; +@@ -3608,9 +3624,9 @@ + } + [dir] .cdx-popover { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 16px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); +@@ -3725,12 +3741,12 @@ + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } + [dir='ltr'] .cdx-popover__arrow { +- border-top-left-radius: 2px; ++ border-top-left-radius: 4px; + } + [dir='rtl'] .cdx-popover__arrow { +- border-top-right-radius: 2px; ++ border-top-right-radius: 4px; + } + .cdx-popover--bottom-sheet { + position: static; + max-height: calc(100% - 8rem); +@@ -4137,9 +4153,9 @@ + } + [dir] .cdx-search-input--has-end-button { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-search-input--has-end-button .cdx-search-input__input-wrapper { + flex-grow: 1; + } +@@ -4229,9 +4245,9 @@ + } + [dir] .cdx-select { + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + background-repeat: no-repeat; + background-size: max(calc(var(--font-size-medium, 1rem) - 4px), 10px); +@@ -4307,9 +4323,9 @@ + } + [dir] .cdx-select-vue__handle { + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + } + [dir='ltr'] .cdx-select-vue__handle { +@@ -4705,9 +4721,9 @@ + word-wrap: break-word; + } + [dir] .cdx-table { + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + @supports (word-break: break-word) { + .cdx-table { + word-wrap: unset; +@@ -5177,10 +5193,10 @@ + } + [dir] .cdx-tabs__list__item { + background-color: var(--background-color-transparent, transparent); + border-width: 0; +- border-top-left-radius: 2px; +- border-top-right-radius: 2px; ++ border-top-left-radius: 4px; ++ border-top-right-radius: 4px; + padding: 4px 12px; + transition-property: background-color, color, border-color, box-shadow; + transition-duration: 0.1s; + } +@@ -5470,9 +5486,9 @@ + } + [dir] .cdx-text-area__textarea { + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding: 4px 8px; + } + .cdx-text-area__textarea--is-autosize { + resize: none; +@@ -5720,9 +5736,9 @@ + [dir] .cdx-toggle-button { + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + transition-property: background-color, color, border-color, box-shadow; + transition-duration: 0.1s; +@@ -5869,9 +5885,9 @@ + width: fit-content; + overflow: hidden; + } + [dir] .cdx-toggle-button-group { +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + } + [dir='ltr'] .cdx-toggle-button-group { + padding-left: 1px; diff --git a/patches/codex/wikimedia__codex__dist__codex.style-rtl.css.patch b/patches/codex/wikimedia__codex__dist__codex.style-rtl.css.patch new file mode 100644 index 0000000..62d3467 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__codex.style-rtl.css.patch @@ -0,0 +1,308 @@ +Index: dist/codex.style-rtl.css +=================================================================== +--- dist/codex.style-rtl.css ++++ dist/codex.style-rtl.css +@@ -41,9 +41,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-left: 11px; + padding-right: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); +@@ -573,17 +573,17 @@ + } + .cdx-accordion--separation-outline { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px 2px 0 0; ++ border-radius: 4px 4px 0 0; + } + .cdx-accordion + .cdx-accordion--separation-outline { + border-radius: 0; + } + .cdx-accordion--separation-outline:not(:has(+ .cdx-accordion)), + .cdx-accordion + .cdx-accordion--separation-outline:last-child { +- border-bottom-right-radius: 2px; +- border-bottom-left-radius: 2px; ++ border-bottom-right-radius: 4px; ++ border-bottom-left-radius: 4px; + } + .cdx-accordion--separation-minimal > summary { + padding: 6px 0; + } +@@ -613,9 +613,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-right: 1px; + overflow: hidden; + } +@@ -635,8 +635,16 @@ + box-shadow: + 0 -1px 0 0 var(--box-shadow-color-inverted, #fff), + 1px 0 0 0 var(--box-shadow-color-inverted, #fff); + } ++.cdx-button-group .cdx-button:first-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} ++.cdx-button-group .cdx-button:last-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} + .cdx-thumbnail { + display: inline-flex; + } + .cdx-thumbnail__placeholder, +@@ -650,9 +658,9 @@ + min-height: 40px; + width: 2.5rem; + height: 2.5rem; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-thumbnail__image { + background-color: var(--background-color-base-fixed, #fff); + display: inline-block; +@@ -717,9 +725,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-card--is-link { + transition-property: background-color, color, border-color, box-shadow; +@@ -930,9 +938,9 @@ + padding-top: 6px; + padding-right: calc(var(--font-size-medium, 1rem) + 10px); + } + .cdx-checkbox__icon { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-checkbox__input:indeterminate + .cdx-checkbox__icon:before { + content: ' '; + background-color: var(--background-color-base-fixed, #fff); +@@ -1067,9 +1075,9 @@ + z-index: 800; + width: -webkit-max-content; + width: max-content; + max-width: 16rem; +- border-radius: 2px; ++ border-radius: 4px; + padding: 2px 6px; + font-family: + -apple-system, + BlinkMacSystemFont, +@@ -1169,9 +1177,9 @@ + font-size: var(--font-size-small, 0.875rem); + } + .cdx-chip-input { + min-height: 32px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-chip-input__chips, + .cdx-chip-input__separate-input { +@@ -1612,9 +1620,9 @@ + border: 1px solid var(--border-color-progressive, #36c); + border-width: 1px; + border-style: solid; + border-color: var(--border-color-progressive, #36c); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-progress-bar:not(.cdx-progress-bar--inline).cdx-progress-bar--disabled { + border-color: var(--border-color-disabled, #c8ccd1); + } +@@ -1654,9 +1662,9 @@ + z-index: 50; + box-sizing: border-box; + width: 100%; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + font-size: var(--font-size-medium, 1rem); +@@ -1729,9 +1737,9 @@ + .cdx-text-input { + position: relative; + box-sizing: border-box; + min-width: 256px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-text-input .cdx-text-input__start-icon { + position: absolute; +@@ -1968,9 +1976,9 @@ + width: calc(100vw - 2rem); + height: unset; + max-height: calc(100vh - 2rem); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 16px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } +@@ -2112,9 +2120,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-notice, #72777d); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-message__icon, + .cdx-message__icon--vue { +@@ -2514,9 +2522,9 @@ + min-width: 24px; + min-height: 24px; + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + font-size: var(--font-size-x-small, 0.75rem); + } + .cdx-image__image--object-fit-fill { + object-fit: fill; +@@ -2560,9 +2568,9 @@ + align-items: center; + justify-content: center; + width: 100%; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__placeholder__icon--size-smallest { + width: 0.75rem; + height: 0.75rem; +@@ -3000,9 +3008,9 @@ + z-index: 700; + box-sizing: border-box; + min-width: 12rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 16px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); +@@ -3085,9 +3093,9 @@ + position: absolute; + width: 1rem; + height: 1rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-top-right-radius: 2px; ++ border-top-right-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + -webkit-clip-path: polygon(0 0, 100% 0, 0 100%); +@@ -3425,9 +3433,9 @@ + .cdx-search-input--has-end-button { + background-color: var(--background-color-base, #fff); + display: flex; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-search-input--has-end-button .cdx-search-input__input-wrapper { + flex-grow: 1; + margin: -1px; +@@ -3494,9 +3502,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-right: 8px; + padding-left: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); +@@ -3552,9 +3560,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-right: 8px; + padding-left: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); +@@ -3894,9 +3902,9 @@ + } + .cdx-table { + color: var(--color-base, #202122); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + word-wrap: break-word; + } + @supports (word-break: break-word) { + .cdx-table { +@@ -4282,10 +4290,10 @@ + display: block; + flex: 0 0 auto; + max-width: 16rem; + border-width: 0; +- border-top-right-radius: 2px; +- border-top-left-radius: 2px; ++ border-top-right-radius: 4px; ++ border-top-left-radius: 4px; + padding: 4px 12px; + font-size: var(--font-size-medium, 1rem); + font-weight: 700; + line-height: var(--line-height-small, 1.375rem); +@@ -4486,9 +4494,9 @@ + min-height: 64px; + width: 100%; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding: 4px 8px; + overflow: auto; + font-family: sans-serif; + font-size: var(--font-size-medium, 1rem); +@@ -4682,9 +4690,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-left: 11px; + padding-right: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); +@@ -4813,9 +4821,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-right: 1px; + overflow: hidden; + } diff --git a/patches/codex/wikimedia__codex__dist__codex.style.css.patch b/patches/codex/wikimedia__codex__dist__codex.style.css.patch new file mode 100644 index 0000000..3cf6448 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__codex.style.css.patch @@ -0,0 +1,308 @@ +Index: dist/codex.style.css +=================================================================== +--- dist/codex.style.css ++++ dist/codex.style.css +@@ -41,9 +41,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); +@@ -573,17 +573,17 @@ + } + .cdx-accordion--separation-outline { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px 2px 0 0; ++ border-radius: 4px 4px 0 0; + } + .cdx-accordion + .cdx-accordion--separation-outline { + border-radius: 0; + } + .cdx-accordion--separation-outline:not(:has(+ .cdx-accordion)), + .cdx-accordion + .cdx-accordion--separation-outline:last-child { +- border-bottom-left-radius: 2px; +- border-bottom-right-radius: 2px; ++ border-bottom-left-radius: 4px; ++ border-bottom-right-radius: 4px; + } + .cdx-accordion--separation-minimal > summary { + padding: 6px 0; + } +@@ -613,9 +613,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-left: 1px; + overflow: hidden; + } +@@ -635,8 +635,16 @@ + box-shadow: + 0 -1px 0 0 var(--box-shadow-color-inverted, #fff), + -1px 0 0 0 var(--box-shadow-color-inverted, #fff); + } ++.cdx-button-group .cdx-button:first-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} ++.cdx-button-group .cdx-button:last-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} + .cdx-thumbnail { + display: inline-flex; + } + .cdx-thumbnail__placeholder, +@@ -650,9 +658,9 @@ + min-height: 40px; + width: 2.5rem; + height: 2.5rem; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-thumbnail__image { + background-color: var(--background-color-base-fixed, #fff); + display: inline-block; +@@ -717,9 +725,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-card--is-link { + transition-property: background-color, color, border-color, box-shadow; +@@ -930,9 +938,9 @@ + padding-top: 6px; + padding-left: calc(var(--font-size-medium, 1rem) + 10px); + } + .cdx-checkbox__icon { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-checkbox__input:indeterminate + .cdx-checkbox__icon:before { + content: ' '; + background-color: var(--background-color-base-fixed, #fff); +@@ -1067,9 +1075,9 @@ + z-index: 800; + width: -webkit-max-content; + width: max-content; + max-width: 16rem; +- border-radius: 2px; ++ border-radius: 4px; + padding: 2px 6px; + font-family: + -apple-system, + BlinkMacSystemFont, +@@ -1169,9 +1177,9 @@ + font-size: var(--font-size-small, 0.875rem); + } + .cdx-chip-input { + min-height: 32px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-chip-input__chips, + .cdx-chip-input__separate-input { +@@ -1612,9 +1620,9 @@ + border: 1px solid var(--border-color-progressive, #36c); + border-width: 1px; + border-style: solid; + border-color: var(--border-color-progressive, #36c); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-progress-bar:not(.cdx-progress-bar--inline).cdx-progress-bar--disabled { + border-color: var(--border-color-disabled, #c8ccd1); + } +@@ -1654,9 +1662,9 @@ + z-index: 50; + box-sizing: border-box; + width: 100%; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + font-size: var(--font-size-medium, 1rem); +@@ -1729,9 +1737,9 @@ + .cdx-text-input { + position: relative; + box-sizing: border-box; + min-width: 256px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-text-input .cdx-text-input__start-icon { + position: absolute; +@@ -1968,9 +1976,9 @@ + width: calc(100vw - 2rem); + height: unset; + max-height: calc(100vh - 2rem); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 16px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } +@@ -2112,9 +2120,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-notice, #72777d); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-message__icon, + .cdx-message__icon--vue { +@@ -2514,9 +2522,9 @@ + min-width: 24px; + min-height: 24px; + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + font-size: var(--font-size-x-small, 0.75rem); + } + .cdx-image__image--object-fit-fill { + object-fit: fill; +@@ -2560,9 +2568,9 @@ + align-items: center; + justify-content: center; + width: 100%; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__placeholder__icon--size-smallest { + width: 0.75rem; + height: 0.75rem; +@@ -3000,9 +3008,9 @@ + z-index: 700; + box-sizing: border-box; + min-width: 12rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 16px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); +@@ -3085,9 +3093,9 @@ + position: absolute; + width: 1rem; + height: 1rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-top-left-radius: 2px; ++ border-top-left-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + -webkit-clip-path: polygon(0 0, 100% 0, 0 100%); +@@ -3425,9 +3433,9 @@ + .cdx-search-input--has-end-button { + background-color: var(--background-color-base, #fff); + display: flex; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-search-input--has-end-button .cdx-search-input__input-wrapper { + flex-grow: 1; + margin: -1px; +@@ -3494,9 +3502,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-left: 8px; + padding-right: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); +@@ -3552,9 +3560,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-left: 8px; + padding-right: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); +@@ -3894,9 +3902,9 @@ + } + .cdx-table { + color: var(--color-base, #202122); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + word-wrap: break-word; + } + @supports (word-break: break-word) { + .cdx-table { +@@ -4282,10 +4290,10 @@ + display: block; + flex: 0 0 auto; + max-width: 16rem; + border-width: 0; +- border-top-left-radius: 2px; +- border-top-right-radius: 2px; ++ border-top-left-radius: 4px; ++ border-top-right-radius: 4px; + padding: 4px 12px; + font-size: var(--font-size-medium, 1rem); + font-weight: 700; + line-height: var(--line-height-small, 1.375rem); +@@ -4486,9 +4494,9 @@ + min-height: 64px; + width: 100%; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding: 4px 8px; + overflow: auto; + font-family: sans-serif; + font-size: var(--font-size-medium, 1rem); +@@ -4682,9 +4690,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); +@@ -4813,9 +4821,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-left: 1px; + overflow: hidden; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxAccordion-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxAccordion-bidi.css.patch new file mode 100644 index 0000000..a7f2a8a --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxAccordion-bidi.css.patch @@ -0,0 +1,25 @@ +Index: dist/modules/CdxAccordion-bidi.css +=================================================================== +--- dist/modules/CdxAccordion-bidi.css ++++ dist/modules/CdxAccordion-bidi.css +@@ -155,17 +155,17 @@ + } + [dir] .cdx-accordion--separation-outline { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px 2px 0 0; ++ border-radius: 4px 4px 0 0; + } + [dir] .cdx-accordion + .cdx-accordion--separation-outline { + border-radius: 0; + } + [dir] .cdx-accordion--separation-outline:not(:has(+ .cdx-accordion)), + [dir] .cdx-accordion + .cdx-accordion--separation-outline:last-child { +- border-bottom-left-radius: 2px; +- border-bottom-right-radius: 2px; ++ border-bottom-left-radius: 4px; ++ border-bottom-right-radius: 4px; + } + [dir] .cdx-accordion--separation-minimal > summary { + padding: 6px 0; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxAccordion-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxAccordion-rtl.css.patch new file mode 100644 index 0000000..d29c1cc --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxAccordion-rtl.css.patch @@ -0,0 +1,25 @@ +Index: dist/modules/CdxAccordion-rtl.css +=================================================================== +--- dist/modules/CdxAccordion-rtl.css ++++ dist/modules/CdxAccordion-rtl.css +@@ -136,17 +136,17 @@ + } + .cdx-accordion--separation-outline { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px 2px 0 0; ++ border-radius: 4px 4px 0 0; + } + .cdx-accordion + .cdx-accordion--separation-outline { + border-radius: 0; + } + .cdx-accordion--separation-outline:not(:has(+ .cdx-accordion)), + .cdx-accordion + .cdx-accordion--separation-outline:last-child { +- border-bottom-right-radius: 2px; +- border-bottom-left-radius: 2px; ++ border-bottom-right-radius: 4px; ++ border-bottom-left-radius: 4px; + } + .cdx-accordion--separation-minimal > summary { + padding: 6px 0; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxAccordion.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxAccordion.css.patch new file mode 100644 index 0000000..68e2f69 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxAccordion.css.patch @@ -0,0 +1,25 @@ +Index: dist/modules/CdxAccordion.css +=================================================================== +--- dist/modules/CdxAccordion.css ++++ dist/modules/CdxAccordion.css +@@ -136,17 +136,17 @@ + } + .cdx-accordion--separation-outline { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px 2px 0 0; ++ border-radius: 4px 4px 0 0; + } + .cdx-accordion + .cdx-accordion--separation-outline { + border-radius: 0; + } + .cdx-accordion--separation-outline:not(:has(+ .cdx-accordion)), + .cdx-accordion + .cdx-accordion--separation-outline:last-child { +- border-bottom-left-radius: 2px; +- border-bottom-right-radius: 2px; ++ border-bottom-left-radius: 4px; ++ border-bottom-right-radius: 4px; + } + .cdx-accordion--separation-minimal > summary { + padding: 6px 0; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxButton-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxButton-bidi.css.patch new file mode 100644 index 0000000..42ae44b --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxButton-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxButton-bidi.css +=================================================================== +--- dist/modules/CdxButton-bidi.css ++++ dist/modules/CdxButton-bidi.css +@@ -17,9 +17,9 @@ + [dir] .cdx-button { + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + transition-property: background-color, color, border-color, box-shadow; + transition-duration: 0.1s; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxButton-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxButton-rtl.css.patch new file mode 100644 index 0000000..5f8f1bd --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxButton-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxButton-rtl.css +=================================================================== +--- dist/modules/CdxButton-rtl.css ++++ dist/modules/CdxButton-rtl.css +@@ -8,9 +8,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-left: 11px; + padding-right: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxButton.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxButton.css.patch new file mode 100644 index 0000000..29b4f79 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxButton.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxButton.css +=================================================================== +--- dist/modules/CdxButton.css ++++ dist/modules/CdxButton.css +@@ -8,9 +8,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-bidi.css.patch new file mode 100644 index 0000000..dfc8acb --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-bidi.css.patch @@ -0,0 +1,36 @@ +Index: dist/modules/CdxButtonGroup-bidi.css +=================================================================== +--- dist/modules/CdxButtonGroup-bidi.css ++++ dist/modules/CdxButtonGroup-bidi.css +@@ -5,9 +5,9 @@ + width: fit-content; + overflow: hidden; + } + [dir] .cdx-button-group { +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + } + [dir='ltr'] .cdx-button-group { + padding-left: 1px; +@@ -45,4 +45,20 @@ + box-shadow: + 0 -1px 0 0 var(--box-shadow-color-inverted, #fff), + 1px 0 0 0 var(--box-shadow-color-inverted, #fff); + } ++[dir='ltr'] .cdx-button-group .cdx-button:first-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} ++[dir='rtl'] .cdx-button-group .cdx-button:first-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} ++[dir='ltr'] .cdx-button-group .cdx-button:last-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} ++[dir='rtl'] .cdx-button-group .cdx-button:last-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-rtl.css.patch new file mode 100644 index 0000000..39283a8 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup-rtl.css.patch @@ -0,0 +1,28 @@ +Index: dist/modules/CdxButtonGroup-rtl.css +=================================================================== +--- dist/modules/CdxButtonGroup-rtl.css ++++ dist/modules/CdxButtonGroup-rtl.css +@@ -2,9 +2,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-right: 1px; + overflow: hidden; + } +@@ -24,4 +24,12 @@ + box-shadow: + 0 -1px 0 0 var(--box-shadow-color-inverted, #fff), + 1px 0 0 0 var(--box-shadow-color-inverted, #fff); + } ++.cdx-button-group .cdx-button:first-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} ++.cdx-button-group .cdx-button:last-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup.css.patch new file mode 100644 index 0000000..337060f --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxButtonGroup.css.patch @@ -0,0 +1,28 @@ +Index: dist/modules/CdxButtonGroup.css +=================================================================== +--- dist/modules/CdxButtonGroup.css ++++ dist/modules/CdxButtonGroup.css +@@ -2,9 +2,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-left: 1px; + overflow: hidden; + } +@@ -24,4 +24,12 @@ + box-shadow: + 0 -1px 0 0 var(--box-shadow-color-inverted, #fff), + -1px 0 0 0 var(--box-shadow-color-inverted, #fff); + } ++.cdx-button-group .cdx-button:first-child { ++ border-top-left-radius: inherit; ++ border-bottom-left-radius: inherit; ++} ++.cdx-button-group .cdx-button:last-child { ++ border-top-right-radius: inherit; ++ border-bottom-right-radius: inherit; ++} diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxCard-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxCard-bidi.css.patch new file mode 100644 index 0000000..b2d71f0 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxCard-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxCard-bidi.css +=================================================================== +--- dist/modules/CdxCard-bidi.css ++++ dist/modules/CdxCard-bidi.css +@@ -5,9 +5,9 @@ + } + [dir] .cdx-card { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + [dir] .cdx-card--is-link { + transition-property: background-color, color, border-color, box-shadow; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxCard-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxCard-rtl.css.patch new file mode 100644 index 0000000..e11d120 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxCard-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxCard-rtl.css +=================================================================== +--- dist/modules/CdxCard-rtl.css ++++ dist/modules/CdxCard-rtl.css +@@ -3,9 +3,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-card--is-link { + transition-property: background-color, color, border-color, box-shadow; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxCard.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxCard.css.patch new file mode 100644 index 0000000..c0efe72 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxCard.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxCard.css +=================================================================== +--- dist/modules/CdxCard.css ++++ dist/modules/CdxCard.css +@@ -3,9 +3,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-card--is-link { + transition-property: background-color, color, border-color, box-shadow; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-bidi.css.patch new file mode 100644 index 0000000..d308d07 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxCheckbox-bidi.css +=================================================================== +--- dist/modules/CdxCheckbox-bidi.css ++++ dist/modules/CdxCheckbox-bidi.css +@@ -114,9 +114,9 @@ + [dir='rtl'] .cdx-checkbox__custom-input:not(.cdx-checkbox__custom-input--inline) { + padding-right: calc(var(--font-size-medium, 1rem) + 10px); + } + [dir] .cdx-checkbox__icon { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-checkbox__input:indeterminate + .cdx-checkbox__icon:before { + content: ' '; + position: absolute; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-rtl.css.patch new file mode 100644 index 0000000..a97f1bd --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxCheckbox-rtl.css +=================================================================== +--- dist/modules/CdxCheckbox-rtl.css ++++ dist/modules/CdxCheckbox-rtl.css +@@ -75,9 +75,9 @@ + padding-top: 6px; + padding-right: calc(var(--font-size-medium, 1rem) + 10px); + } + .cdx-checkbox__icon { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-checkbox__input:indeterminate + .cdx-checkbox__icon:before { + content: ' '; + background-color: var(--background-color-base-fixed, #fff); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox.css.patch new file mode 100644 index 0000000..b5c7721 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxCheckbox.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxCheckbox.css +=================================================================== +--- dist/modules/CdxCheckbox.css ++++ dist/modules/CdxCheckbox.css +@@ -75,9 +75,9 @@ + padding-top: 6px; + padding-left: calc(var(--font-size-medium, 1rem) + 10px); + } + .cdx-checkbox__icon { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-checkbox__input:indeterminate + .cdx-checkbox__icon:before { + content: ' '; + background-color: var(--background-color-base-fixed, #fff); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxChipInput-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxChipInput-bidi.css.patch new file mode 100644 index 0000000..443d696 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxChipInput-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxChipInput-bidi.css +=================================================================== +--- dist/modules/CdxChipInput-bidi.css ++++ dist/modules/CdxChipInput-bidi.css +@@ -84,9 +84,9 @@ + min-height: 32px; + overflow: hidden; + } + [dir] .cdx-chip-input { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-chip-input__chips, + .cdx-chip-input__separate-input { + align-items: center; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxChipInput-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxChipInput-rtl.css.patch new file mode 100644 index 0000000..8ec1a05 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxChipInput-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxChipInput-rtl.css +=================================================================== +--- dist/modules/CdxChipInput-rtl.css ++++ dist/modules/CdxChipInput-rtl.css +@@ -69,9 +69,9 @@ + font-size: var(--font-size-small, 0.875rem); + } + .cdx-chip-input { + min-height: 32px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-chip-input__chips, + .cdx-chip-input__separate-input { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxChipInput.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxChipInput.css.patch new file mode 100644 index 0000000..f8394f4 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxChipInput.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxChipInput.css +=================================================================== +--- dist/modules/CdxChipInput.css ++++ dist/modules/CdxChipInput.css +@@ -69,9 +69,9 @@ + font-size: var(--font-size-small, 0.875rem); + } + .cdx-chip-input { + min-height: 32px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-chip-input__chips, + .cdx-chip-input__separate-input { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxDialog-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxDialog-bidi.css.patch new file mode 100644 index 0000000..61792e0 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxDialog-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxDialog-bidi.css +=================================================================== +--- dist/modules/CdxDialog-bidi.css ++++ dist/modules/CdxDialog-bidi.css +@@ -29,9 +29,9 @@ + } + [dir] .cdx-dialog { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 16px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxDialog-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxDialog-rtl.css.patch new file mode 100644 index 0000000..cc8ec64 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxDialog-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxDialog-rtl.css +=================================================================== +--- dist/modules/CdxDialog-rtl.css ++++ dist/modules/CdxDialog-rtl.css +@@ -20,9 +20,9 @@ + width: calc(100vw - 2rem); + height: unset; + max-height: calc(100vh - 2rem); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 16px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxDialog.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxDialog.css.patch new file mode 100644 index 0000000..510505b --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxDialog.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxDialog.css +=================================================================== +--- dist/modules/CdxDialog.css ++++ dist/modules/CdxDialog.css +@@ -20,9 +20,9 @@ + width: calc(100vw - 2rem); + height: unset; + max-height: calc(100vh - 2rem); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 16px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxImage-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxImage-bidi.css.patch new file mode 100644 index 0000000..f117ffd --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxImage-bidi.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxImage-bidi.css +=================================================================== +--- dist/modules/CdxImage-bidi.css ++++ dist/modules/CdxImage-bidi.css +@@ -22,9 +22,9 @@ + } + [dir] .cdx-image__image { + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__image--object-fit-fill { + object-fit: fill; + } +@@ -73,9 +73,9 @@ + } + [dir] .cdx-image__placeholder { + background-color: var(--background-color-interactive-subtle, #f8f9fa); + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__placeholder__icon--size-smallest { + width: 0.75rem; + height: 0.75rem; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxImage-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxImage-rtl.css.patch new file mode 100644 index 0000000..8ba77c4 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxImage-rtl.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxImage-rtl.css +=================================================================== +--- dist/modules/CdxImage-rtl.css ++++ dist/modules/CdxImage-rtl.css +@@ -19,9 +19,9 @@ + min-width: 24px; + min-height: 24px; + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + font-size: var(--font-size-x-small, 0.75rem); + } + .cdx-image__image--object-fit-fill { + object-fit: fill; +@@ -65,9 +65,9 @@ + align-items: center; + justify-content: center; + width: 100%; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__placeholder__icon--size-smallest { + width: 0.75rem; + height: 0.75rem; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxImage.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxImage.css.patch new file mode 100644 index 0000000..204d46e --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxImage.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxImage.css +=================================================================== +--- dist/modules/CdxImage.css ++++ dist/modules/CdxImage.css +@@ -19,9 +19,9 @@ + min-width: 24px; + min-height: 24px; + margin: 0; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + font-size: var(--font-size-x-small, 0.75rem); + } + .cdx-image__image--object-fit-fill { + object-fit: fill; +@@ -65,9 +65,9 @@ + align-items: center; + justify-content: center; + width: 100%; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-image__placeholder__icon--size-smallest { + width: 0.75rem; + height: 0.75rem; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxMenu-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxMenu-bidi.css.patch new file mode 100644 index 0000000..3094319 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxMenu-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxMenu-bidi.css +=================================================================== +--- dist/modules/CdxMenu-bidi.css ++++ dist/modules/CdxMenu-bidi.css +@@ -10,9 +10,9 @@ + } + [dir] .cdx-menu { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxMenu-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxMenu-rtl.css.patch new file mode 100644 index 0000000..be49cf0 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxMenu-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxMenu-rtl.css +=================================================================== +--- dist/modules/CdxMenu-rtl.css ++++ dist/modules/CdxMenu-rtl.css +@@ -7,9 +7,9 @@ + z-index: 50; + box-sizing: border-box; + width: 100%; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxMenu.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxMenu.css.patch new file mode 100644 index 0000000..42b184e --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxMenu.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxMenu.css +=================================================================== +--- dist/modules/CdxMenu.css ++++ dist/modules/CdxMenu.css +@@ -7,9 +7,9 @@ + z-index: 50; + box-sizing: border-box; + width: 100%; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxMessage-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxMessage-bidi.css.patch new file mode 100644 index 0000000..5c2760e --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxMessage-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxMessage-bidi.css +=================================================================== +--- dist/modules/CdxMessage-bidi.css ++++ dist/modules/CdxMessage-bidi.css +@@ -6,9 +6,9 @@ + } + [dir] .cdx-message { + background-color: var(--background-color-notice-subtle, #eaecf0); + border: 1px solid var(--border-color-notice, #72777d); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-message__icon, + .cdx-message__icon--vue { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxMessage-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxMessage-rtl.css.patch new file mode 100644 index 0000000..116e559 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxMessage-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxMessage-rtl.css +=================================================================== +--- dist/modules/CdxMessage-rtl.css ++++ dist/modules/CdxMessage-rtl.css +@@ -4,9 +4,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-notice, #72777d); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-message__icon, + .cdx-message__icon--vue { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxMessage.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxMessage.css.patch new file mode 100644 index 0000000..06d9e2a --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxMessage.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxMessage.css +=================================================================== +--- dist/modules/CdxMessage.css ++++ dist/modules/CdxMessage.css +@@ -4,9 +4,9 @@ + display: flex; + align-items: flex-start; + position: relative; + border: 1px solid var(--border-color-notice, #72777d); +- border-radius: 2px; ++ border-radius: 4px; + padding: 12px; + } + .cdx-message__icon, + .cdx-message__icon--vue { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxPopover-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxPopover-bidi.css.patch new file mode 100644 index 0000000..42291c8 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxPopover-bidi.css.patch @@ -0,0 +1,30 @@ +Index: dist/modules/CdxPopover-bidi.css +=================================================================== +--- dist/modules/CdxPopover-bidi.css ++++ dist/modules/CdxPopover-bidi.css +@@ -39,9 +39,9 @@ + } + [dir] .cdx-popover { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 16px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); +@@ -156,12 +156,12 @@ + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + } + [dir='ltr'] .cdx-popover__arrow { +- border-top-left-radius: 2px; ++ border-top-left-radius: 4px; + } + [dir='rtl'] .cdx-popover__arrow { +- border-top-right-radius: 2px; ++ border-top-right-radius: 4px; + } + .cdx-popover--bottom-sheet { + position: static; + max-height: calc(100% - 8rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxPopover-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxPopover-rtl.css.patch new file mode 100644 index 0000000..fee00dd --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxPopover-rtl.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxPopover-rtl.css +=================================================================== +--- dist/modules/CdxPopover-rtl.css ++++ dist/modules/CdxPopover-rtl.css +@@ -30,9 +30,9 @@ + z-index: 700; + box-sizing: border-box; + min-width: 12rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 16px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); +@@ -115,9 +115,9 @@ + position: absolute; + width: 1rem; + height: 1rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-top-right-radius: 2px; ++ border-top-right-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + -webkit-clip-path: polygon(0 0, 100% 0, 0 100%); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxPopover.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxPopover.css.patch new file mode 100644 index 0000000..9b92fc2 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxPopover.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxPopover.css +=================================================================== +--- dist/modules/CdxPopover.css ++++ dist/modules/CdxPopover.css +@@ -30,9 +30,9 @@ + z-index: 700; + box-sizing: border-box; + min-width: 12rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + padding: 16px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); +@@ -115,9 +115,9 @@ + position: absolute; + width: 1rem; + height: 1rem; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-top-left-radius: 2px; ++ border-top-left-radius: 4px; + box-shadow: + 0 4px 4px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)), + 0 0 8px 0 var(--box-shadow-color-alpha-base, rgba(0, 0, 0, 0.06)); + -webkit-clip-path: polygon(0 0, 100% 0, 0 100%); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-bidi.css.patch new file mode 100644 index 0000000..819dc2b --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxProgressBar-bidi.css +=================================================================== +--- dist/modules/CdxProgressBar-bidi.css ++++ dist/modules/CdxProgressBar-bidi.css +@@ -43,9 +43,9 @@ + border: 1px solid var(--border-color-progressive, #36c); + border-width: 1px; + border-style: solid; + border-color: var(--border-color-progressive, #36c); +- border-radius: 2px; ++ border-radius: 4px; + } + [dir] .cdx-progress-bar:not(.cdx-progress-bar--inline).cdx-progress-bar--disabled { + border-color: var(--border-color-disabled, #c8ccd1); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-rtl.css.patch new file mode 100644 index 0000000..1a5fd86 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxProgressBar-rtl.css +=================================================================== +--- dist/modules/CdxProgressBar-rtl.css ++++ dist/modules/CdxProgressBar-rtl.css +@@ -29,9 +29,9 @@ + border: 1px solid var(--border-color-progressive, #36c); + border-width: 1px; + border-style: solid; + border-color: var(--border-color-progressive, #36c); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-progress-bar:not(.cdx-progress-bar--inline).cdx-progress-bar--disabled { + border-color: var(--border-color-disabled, #c8ccd1); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar.css.patch new file mode 100644 index 0000000..e80ded7 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxProgressBar.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxProgressBar.css +=================================================================== +--- dist/modules/CdxProgressBar.css ++++ dist/modules/CdxProgressBar.css +@@ -29,9 +29,9 @@ + border: 1px solid var(--border-color-progressive, #36c); + border-width: 1px; + border-style: solid; + border-color: var(--border-color-progressive, #36c); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-progress-bar:not(.cdx-progress-bar--inline).cdx-progress-bar--disabled { + border-color: var(--border-color-disabled, #c8ccd1); + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-bidi.css.patch new file mode 100644 index 0000000..3ada8cb --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxSearchInput-bidi.css +=================================================================== +--- dist/modules/CdxSearchInput-bidi.css ++++ dist/modules/CdxSearchInput-bidi.css +@@ -3,9 +3,9 @@ + } + [dir] .cdx-search-input--has-end-button { + background-color: var(--background-color-base, #fff); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-search-input--has-end-button .cdx-search-input__input-wrapper { + flex-grow: 1; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-rtl.css.patch new file mode 100644 index 0000000..9894712 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxSearchInput-rtl.css +=================================================================== +--- dist/modules/CdxSearchInput-rtl.css ++++ dist/modules/CdxSearchInput-rtl.css +@@ -1,9 +1,9 @@ + .cdx-search-input--has-end-button { + background-color: var(--background-color-base, #fff); + display: flex; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-search-input--has-end-button .cdx-search-input__input-wrapper { + flex-grow: 1; + margin: -1px; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput.css.patch new file mode 100644 index 0000000..da37d85 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxSearchInput.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxSearchInput.css +=================================================================== +--- dist/modules/CdxSearchInput.css ++++ dist/modules/CdxSearchInput.css +@@ -1,9 +1,9 @@ + .cdx-search-input--has-end-button { + background-color: var(--background-color-base, #fff); + display: flex; + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-search-input--has-end-button .cdx-search-input__input-wrapper { + flex-grow: 1; + margin: -1px; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxSelect-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxSelect-bidi.css.patch new file mode 100644 index 0000000..82905b4 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxSelect-bidi.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxSelect-bidi.css +=================================================================== +--- dist/modules/CdxSelect-bidi.css ++++ dist/modules/CdxSelect-bidi.css +@@ -10,9 +10,9 @@ + } + [dir] .cdx-select { + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + background-repeat: no-repeat; + background-size: max(calc(var(--font-size-medium, 1rem) - 4px), 10px); +@@ -88,9 +88,9 @@ + } + [dir] .cdx-select-vue__handle { + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + } + [dir='ltr'] .cdx-select-vue__handle { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxSelect-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxSelect-rtl.css.patch new file mode 100644 index 0000000..bd29446 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxSelect-rtl.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxSelect-rtl.css +=================================================================== +--- dist/modules/CdxSelect-rtl.css ++++ dist/modules/CdxSelect-rtl.css +@@ -4,9 +4,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-right: 8px; + padding-left: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); +@@ -62,9 +62,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-right: 8px; + padding-left: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxSelect.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxSelect.css.patch new file mode 100644 index 0000000..ea7f168 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxSelect.css.patch @@ -0,0 +1,26 @@ +Index: dist/modules/CdxSelect.css +=================================================================== +--- dist/modules/CdxSelect.css ++++ dist/modules/CdxSelect.css +@@ -4,9 +4,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-left: 8px; + padding-right: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); +@@ -62,9 +62,9 @@ + min-width: 256px; + min-height: 32px; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 4px; + padding-bottom: 4px; + padding-left: 8px; + padding-right: calc(8px + 8px + calc(var(--font-size-medium, 1rem) + 4px)); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTable-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTable-bidi.css.patch new file mode 100644 index 0000000..ea698de --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTable-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTable-bidi.css +=================================================================== +--- dist/modules/CdxTable-bidi.css ++++ dist/modules/CdxTable-bidi.css +@@ -234,9 +234,9 @@ + word-wrap: break-word; + } + [dir] .cdx-table { + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + } + @supports (word-break: break-word) { + .cdx-table { + word-wrap: unset; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTable-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTable-rtl.css.patch new file mode 100644 index 0000000..324a70d --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTable-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTable-rtl.css +=================================================================== +--- dist/modules/CdxTable-rtl.css ++++ dist/modules/CdxTable-rtl.css +@@ -211,9 +211,9 @@ + } + .cdx-table { + color: var(--color-base, #202122); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + word-wrap: break-word; + } + @supports (word-break: break-word) { + .cdx-table { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTable.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTable.css.patch new file mode 100644 index 0000000..45786d3 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTable.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTable.css +=================================================================== +--- dist/modules/CdxTable.css ++++ dist/modules/CdxTable.css +@@ -211,9 +211,9 @@ + } + .cdx-table { + color: var(--color-base, #202122); + border: 1px solid var(--border-color-base, #a2a9b1); +- border-radius: 2px; ++ border-radius: 4px; + word-wrap: break-word; + } + @supports (word-break: break-word) { + .cdx-table { diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTabs-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTabs-bidi.css.patch new file mode 100644 index 0000000..14db0c9 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTabs-bidi.css.patch @@ -0,0 +1,17 @@ +Index: dist/modules/CdxTabs-bidi.css +=================================================================== +--- dist/modules/CdxTabs-bidi.css ++++ dist/modules/CdxTabs-bidi.css +@@ -72,10 +72,10 @@ + } + [dir] .cdx-tabs__list__item { + background-color: var(--background-color-transparent, transparent); + border-width: 0; +- border-top-left-radius: 2px; +- border-top-right-radius: 2px; ++ border-top-left-radius: 4px; ++ border-top-right-radius: 4px; + padding: 4px 12px; + transition-property: background-color, color, border-color, box-shadow; + transition-duration: 0.1s; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTabs-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTabs-rtl.css.patch new file mode 100644 index 0000000..241976f --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTabs-rtl.css.patch @@ -0,0 +1,17 @@ +Index: dist/modules/CdxTabs-rtl.css +=================================================================== +--- dist/modules/CdxTabs-rtl.css ++++ dist/modules/CdxTabs-rtl.css +@@ -50,10 +50,10 @@ + display: block; + flex: 0 0 auto; + max-width: 16rem; + border-width: 0; +- border-top-right-radius: 2px; +- border-top-left-radius: 2px; ++ border-top-right-radius: 4px; ++ border-top-left-radius: 4px; + padding: 4px 12px; + font-size: var(--font-size-medium, 1rem); + font-weight: 700; + line-height: var(--line-height-small, 1.375rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTabs.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTabs.css.patch new file mode 100644 index 0000000..f7c6620 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTabs.css.patch @@ -0,0 +1,17 @@ +Index: dist/modules/CdxTabs.css +=================================================================== +--- dist/modules/CdxTabs.css ++++ dist/modules/CdxTabs.css +@@ -50,10 +50,10 @@ + display: block; + flex: 0 0 auto; + max-width: 16rem; + border-width: 0; +- border-top-left-radius: 2px; +- border-top-right-radius: 2px; ++ border-top-left-radius: 4px; ++ border-top-right-radius: 4px; + padding: 4px 12px; + font-size: var(--font-size-medium, 1rem); + font-weight: 700; + line-height: var(--line-height-small, 1.375rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTextArea-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTextArea-bidi.css.patch new file mode 100644 index 0000000..7df7d68 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTextArea-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTextArea-bidi.css +=================================================================== +--- dist/modules/CdxTextArea-bidi.css ++++ dist/modules/CdxTextArea-bidi.css +@@ -92,9 +92,9 @@ + } + [dir] .cdx-text-area__textarea { + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding: 4px 8px; + } + .cdx-text-area__textarea--is-autosize { + resize: none; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTextArea-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTextArea-rtl.css.patch new file mode 100644 index 0000000..88a4c07 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTextArea-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTextArea-rtl.css +=================================================================== +--- dist/modules/CdxTextArea-rtl.css ++++ dist/modules/CdxTextArea-rtl.css +@@ -70,9 +70,9 @@ + min-height: 64px; + width: 100%; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding: 4px 8px; + overflow: auto; + font-family: sans-serif; + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTextArea.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTextArea.css.patch new file mode 100644 index 0000000..5bf79a8 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTextArea.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTextArea.css +=================================================================== +--- dist/modules/CdxTextArea.css ++++ dist/modules/CdxTextArea.css +@@ -70,9 +70,9 @@ + min-height: 64px; + width: 100%; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding: 4px 8px; + overflow: auto; + font-family: sans-serif; + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTextInput-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTextInput-bidi.css.patch new file mode 100644 index 0000000..4f27634 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTextInput-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTextInput-bidi.css +=================================================================== +--- dist/modules/CdxTextInput-bidi.css ++++ dist/modules/CdxTextInput-bidi.css +@@ -4,9 +4,9 @@ + min-width: 256px; + overflow: hidden; + } + [dir] .cdx-text-input { +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-text-input .cdx-text-input__start-icon { + position: absolute; + top: 50%; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTextInput-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTextInput-rtl.css.patch new file mode 100644 index 0000000..79cd5a2 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTextInput-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTextInput-rtl.css +=================================================================== +--- dist/modules/CdxTextInput-rtl.css ++++ dist/modules/CdxTextInput-rtl.css +@@ -1,9 +1,9 @@ + .cdx-text-input { + position: relative; + box-sizing: border-box; + min-width: 256px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-text-input .cdx-text-input__start-icon { + position: absolute; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTextInput.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTextInput.css.patch new file mode 100644 index 0000000..03d91f0 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTextInput.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTextInput.css +=================================================================== +--- dist/modules/CdxTextInput.css ++++ dist/modules/CdxTextInput.css +@@ -1,9 +1,9 @@ + .cdx-text-input { + position: relative; + box-sizing: border-box; + min-width: 256px; +- border-radius: 2px; ++ border-radius: 4px; + overflow: hidden; + } + .cdx-text-input .cdx-text-input__start-icon { + position: absolute; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-bidi.css.patch new file mode 100644 index 0000000..18a9156 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxThumbnail-bidi.css +=================================================================== +--- dist/modules/CdxThumbnail-bidi.css ++++ dist/modules/CdxThumbnail-bidi.css +@@ -15,9 +15,9 @@ + background-position: center; + background-repeat: no-repeat; + background-size: cover; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-thumbnail__image { + display: inline-block; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-rtl.css.patch new file mode 100644 index 0000000..9b7226a --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxThumbnail-rtl.css +=================================================================== +--- dist/modules/CdxThumbnail-rtl.css ++++ dist/modules/CdxThumbnail-rtl.css +@@ -12,9 +12,9 @@ + min-height: 40px; + width: 2.5rem; + height: 2.5rem; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-thumbnail__image { + background-color: var(--background-color-base-fixed, #fff); + display: inline-block; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail.css.patch new file mode 100644 index 0000000..f782840 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxThumbnail.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxThumbnail.css +=================================================================== +--- dist/modules/CdxThumbnail.css ++++ dist/modules/CdxThumbnail.css +@@ -12,9 +12,9 @@ + min-height: 40px; + width: 2.5rem; + height: 2.5rem; + border: 1px solid var(--border-color-subtle, #c8ccd1); +- border-radius: 2px; ++ border-radius: 4px; + } + .cdx-thumbnail__image { + background-color: var(--background-color-base-fixed, #fff); + display: inline-block; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-bidi.css.patch new file mode 100644 index 0000000..9013c53 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxToggleButton-bidi.css +=================================================================== +--- dist/modules/CdxToggleButton-bidi.css ++++ dist/modules/CdxToggleButton-bidi.css +@@ -17,9 +17,9 @@ + [dir] .cdx-toggle-button { + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + transition-property: background-color, color, border-color, box-shadow; + transition-duration: 0.1s; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-rtl.css.patch new file mode 100644 index 0000000..8e1a452 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxToggleButton-rtl.css +=================================================================== +--- dist/modules/CdxToggleButton-rtl.css ++++ dist/modules/CdxToggleButton-rtl.css +@@ -8,9 +8,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-left: 11px; + padding-right: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton.css.patch new file mode 100644 index 0000000..846377c --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButton.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxToggleButton.css +=================================================================== +--- dist/modules/CdxToggleButton.css ++++ dist/modules/CdxToggleButton.css +@@ -8,9 +8,9 @@ + max-width: 28rem; + margin: 0; + border-width: 1px; + border-style: solid; +- border-radius: 2px; ++ border-radius: 4px; + padding-right: 11px; + padding-left: 11px; + font-family: inherit; + font-size: var(--font-size-medium, 1rem); diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-bidi.css.patch new file mode 100644 index 0000000..628d225 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxToggleButtonGroup-bidi.css +=================================================================== +--- dist/modules/CdxToggleButtonGroup-bidi.css ++++ dist/modules/CdxToggleButtonGroup-bidi.css +@@ -5,9 +5,9 @@ + width: fit-content; + overflow: hidden; + } + [dir] .cdx-toggle-button-group { +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + } + [dir='ltr'] .cdx-toggle-button-group { + padding-left: 1px; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-rtl.css.patch new file mode 100644 index 0000000..d081833 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxToggleButtonGroup-rtl.css +=================================================================== +--- dist/modules/CdxToggleButtonGroup-rtl.css ++++ dist/modules/CdxToggleButtonGroup-rtl.css +@@ -2,9 +2,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-right: 1px; + overflow: hidden; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup.css.patch new file mode 100644 index 0000000..e050d55 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxToggleButtonGroup.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxToggleButtonGroup.css +=================================================================== +--- dist/modules/CdxToggleButtonGroup.css ++++ dist/modules/CdxToggleButtonGroup.css +@@ -2,9 +2,9 @@ + position: relative; + z-index: 0; + width: -webkit-fit-content; + width: fit-content; +- border-radius: 2px; ++ border-radius: 4px; + padding-top: 1px; + padding-left: 1px; + overflow: hidden; + } diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTooltip-bidi.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTooltip-bidi.css.patch new file mode 100644 index 0000000..5c28aa0 --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTooltip-bidi.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTooltip-bidi.css +=================================================================== +--- dist/modules/CdxTooltip-bidi.css ++++ dist/modules/CdxTooltip-bidi.css +@@ -20,9 +20,9 @@ + line-height: var(--line-height-small, 1.375rem); + } + [dir] .cdx-tooltip { + background-color: var(--background-color-inverted, #101418); +- border-radius: 2px; ++ border-radius: 4px; + padding: 2px 6px; + animation-name: cdx-animation-tooltip; + animation-duration: 0.1s; + animation-timing-function: linear; diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTooltip-rtl.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTooltip-rtl.css.patch new file mode 100644 index 0000000..e8ac01e --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTooltip-rtl.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTooltip-rtl.css +=================================================================== +--- dist/modules/CdxTooltip-rtl.css ++++ dist/modules/CdxTooltip-rtl.css +@@ -6,9 +6,9 @@ + z-index: 800; + width: -webkit-max-content; + width: max-content; + max-width: 16rem; +- border-radius: 2px; ++ border-radius: 4px; + padding: 2px 6px; + font-family: + -apple-system, + BlinkMacSystemFont, diff --git a/patches/codex/wikimedia__codex__dist__modules__CdxTooltip.css.patch b/patches/codex/wikimedia__codex__dist__modules__CdxTooltip.css.patch new file mode 100644 index 0000000..2c69bde --- /dev/null +++ b/patches/codex/wikimedia__codex__dist__modules__CdxTooltip.css.patch @@ -0,0 +1,15 @@ +Index: dist/modules/CdxTooltip.css +=================================================================== +--- dist/modules/CdxTooltip.css ++++ dist/modules/CdxTooltip.css +@@ -6,9 +6,9 @@ + z-index: 800; + width: -webkit-max-content; + width: max-content; + max-width: 16rem; +- border-radius: 2px; ++ border-radius: 4px; + padding: 2px 6px; + font-family: + -apple-system, + BlinkMacSystemFont, diff --git a/scripts/apply-codex-patch.mjs b/scripts/apply-codex-patch.mjs new file mode 100644 index 0000000..1bd5c5a --- /dev/null +++ b/scripts/apply-codex-patch.mjs @@ -0,0 +1,111 @@ +#!/usr/bin/env node +// postinstall hook: re-apply the committed Codex patch (if any) on top of the +// freshly installed published packages. +// +// For each patched file we re-format the installed file with the same pinned +// Prettier config used when the patch was authored, then apply the diff. Because +// the published artifact and the formatter are both fixed, the formatted +// baseline is byte-identical to authoring time, so the patch always lands. +// Content hashes (recorded in manifest.json) make this deterministic and +// idempotent: a file that is already patched is left untouched. This runs with +// no Codex build, so CI / PR previews stay fast. +// +// Authoring lives in scripts/patch-codex.mjs. + +import fs from 'node:fs' +import path from 'node:path' + +import { + PATCHES_DIR, + formatContent, + installedPackageDir, + installedTargetPath, + loadJsDiff, + loadPrettier, + readManifest, + readPrettierOptions, + sha256, +} from './lib-codex-patch.mjs' + +async function main() { + const manifest = readManifest() + if (!manifest || !Array.isArray(manifest.files) || manifest.files.length === 0) { + // No patch committed: nothing to do (e.g. a fresh template clone). + return + } + + // Warn (don't fail) if the installed Codex version drifted from the one the + // patch was authored against; the hash checks below are the real safety net. + for (const [pkg, expected] of Object.entries(manifest.codexVersions ?? {})) { + const pkgJson = path.join(installedPackageDir(pkg), 'package.json') + if (fs.existsSync(pkgJson)) { + const actual = JSON.parse(fs.readFileSync(pkgJson, 'utf8')).version + if (actual !== expected) { + console.warn( + `[apply-codex-patch] ${pkg} is ${actual} but the patch was made for ${expected}. ` + + 'Re-run `npm run patch-codex` to regenerate if it fails to apply.', + ) + } + } + } + + const prettier = await loadPrettier() + const jsdiff = await loadJsDiff() + const prettierOpts = readPrettierOptions() + + let applied = 0 + let skipped = 0 + + for (const file of manifest.files) { + const patchPath = path.join(PATCHES_DIR, file.patch) + const targetPath = file.target ? installedTargetPath(file.target) : null + if (!targetPath || !fs.existsSync(targetPath)) { + throw new Error(`[apply-codex-patch] target not found: ${file.target}`) + } + if (!fs.existsSync(patchPath)) { + throw new Error(`[apply-codex-patch] patch file missing: ${file.patch}`) + } + + // Normalize the installed file to the formatted baseline the patch expects. + const current = fs.readFileSync(targetPath, 'utf8') + const formatted = await formatContent(prettier, current, file.rel, prettierOpts) + const formattedSha = sha256(formatted) + + if (formattedSha === file.patchedSha) { + // Already patched (idempotent re-run): make sure the on-disk file matches. + if (formatted !== current) { + fs.writeFileSync(targetPath, formatted) + } + skipped += 1 + continue + } + + if (formattedSha !== file.baseSha) { + throw new Error( + `[apply-codex-patch] ${file.target} does not match the expected published baseline. ` + + 'The installed Codex version or Prettier likely changed; re-run `npm run patch-codex`.', + ) + } + + const patchText = fs.readFileSync(patchPath, 'utf8') + const result = jsdiff.applyPatch(formatted, patchText) + if (result === false || sha256(result) !== file.patchedSha) { + throw new Error( + `[apply-codex-patch] failed to apply patch for ${file.target}. ` + + 'Re-run `npm run patch-codex` to regenerate.', + ) + } + + fs.writeFileSync(targetPath, result) + applied += 1 + } + + console.log( + `[apply-codex-patch] Codex change ${manifest.change}: applied ${applied}, already-applied ${skipped}.`, + ) +} + +main().catch((error) => { + console.error(error instanceof Error ? error.message : String(error)) + process.exit(1) +}) diff --git a/scripts/lib-codex-patch.mjs b/scripts/lib-codex-patch.mjs new file mode 100644 index 0000000..c7f5f90 --- /dev/null +++ b/scripts/lib-codex-patch.mjs @@ -0,0 +1,168 @@ +// Shared helpers for the Codex Gerrit patch workflow. +// +// Two scripts use this: +// - patch-codex.mjs (local "make": build the change, emit a tiny diff) +// - apply-codex-patch.mjs (postinstall: format + apply the committed diff) +// +// The formatting helpers MUST behave identically in both, because the committed +// patch is authored against `format(published)` and re-applied to +// `format(published)` at install time. Same formatter + same input => the patch +// always lands. + +import fs from 'node:fs' +import path from 'node:path' +import crypto from 'node:crypto' +import { fileURLToPath } from 'node:url' +import { spawnSync } from 'node:child_process' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +export const ROOT = path.resolve(__dirname, '..') +export const PATCHES_DIR = path.join(ROOT, 'patches', 'codex') +export const MANIFEST_PATH = path.join(PATCHES_DIR, 'manifest.json') + +export const CODEX_PACKAGES = [ + '@wikimedia/codex', + '@wikimedia/codex-design-tokens', + '@wikimedia/codex-icons', +] + +// File extensions we can format + diff as text. Anything else (images, fonts) +// is skipped: a binary asset can't be expressed as a tiny line diff anyway. +const FORMATTABLE_EXTS = new Set(['.css', '.scss', '.less', '.js', '.cjs', '.mjs', '.json']) + +const PARSER_BY_EXT = { + '.css': 'css', + '.scss': 'scss', + '.less': 'less', + '.js': 'babel', + '.cjs': 'babel', + '.mjs': 'babel', + '.json': 'json', +} + +export function isFormattable(file) { + return FORMATTABLE_EXTS.has(path.extname(file)) +} + +export function parserForFile(file) { + return PARSER_BY_EXT[path.extname(file)] ?? null +} + +export function run(command, args, opts = {}) { + const result = spawnSync(command, args, { + cwd: opts.cwd ?? ROOT, + stdio: 'pipe', + encoding: 'utf8', + maxBuffer: 1024 * 1024 * 64, + }) + if (result.status !== 0) { + const details = [result.stdout, result.stderr].filter(Boolean).join('\n') + throw new Error(`Command failed: ${command} ${args.join(' ')}\n${details || '(no output)'}`) + } + return (result.stdout ?? '').trim() +} + +// Raw spawn that returns status + output without throwing, for commands whose +// non-zero exit codes are meaningful (git diff --no-index, git merge-file, +// git apply --check). +export function tryRun(command, args, opts = {}) { + const result = spawnSync(command, args, { + cwd: opts.cwd ?? ROOT, + stdio: 'pipe', + encoding: 'utf8', + maxBuffer: 1024 * 1024 * 64, + input: opts.input, + }) + return { + status: result.status, + stdout: result.stdout ?? '', + stderr: result.stderr ?? '', + } +} + +export function readPrettierOptions() { + const configPath = path.join(ROOT, '.prettierrc.json') + if (!fs.existsSync(configPath)) { + return {} + } + return JSON.parse(fs.readFileSync(configPath, 'utf8')) +} + +export function sha256(content) { + return crypto.createHash('sha256').update(content).digest('hex') +} + +let cachedJsDiff = null +export async function loadJsDiff() { + if (cachedJsDiff) { + return cachedJsDiff + } + try { + cachedJsDiff = await import('diff') + } catch { + throw new Error( + 'The "diff" package is required to apply the Codex patch but is not installed. Run `npm install` with dev dependencies.', + ) + } + return cachedJsDiff +} + +let cachedPrettier = null +export async function loadPrettier() { + if (cachedPrettier) { + return cachedPrettier + } + try { + cachedPrettier = await import('prettier') + } catch { + throw new Error( + 'Prettier is required to format Codex files but is not installed. Run `npm install` with dev dependencies.', + ) + } + return cachedPrettier +} + +export async function formatContent(prettier, content, file, baseOptions) { + const parser = parserForFile(file) + if (!parser) { + return content + } + const mod = prettier.default ?? prettier + return mod.format(content, { ...baseOptions, parser }) +} + +export function prettierVersion(prettier) { + const mod = prettier.default ?? prettier + return mod.version ?? 'unknown' +} + +// Map a committed target (e.g. "@wikimedia/codex/dist/codex.style.css") to its +// owning package and the path within that package. +export function splitTarget(target) { + const pkg = CODEX_PACKAGES.find((name) => target === name || target.startsWith(`${name}/`)) + if (!pkg) { + throw new Error(`Target is not a known Codex package file: ${target}`) + } + const rel = target.slice(pkg.length + 1) + return { pkg, rel } +} + +export function installedPackageDir(pkg) { + return path.join(ROOT, 'node_modules', pkg) +} + +export function installedTargetPath(target) { + const { pkg, rel } = splitTarget(target) + return path.join(installedPackageDir(pkg), rel) +} + +export function patchFileName(target) { + return `${target.replace(/^@/, '').replace(/[/]/g, '__')}.patch` +} + +export function readManifest() { + if (!fs.existsSync(MANIFEST_PATH)) { + return null + } + return JSON.parse(fs.readFileSync(MANIFEST_PATH, 'utf8')) +} diff --git a/scripts/patch-codex.mjs b/scripts/patch-codex.mjs index b0a12cb..71b72f5 100644 --- a/scripts/patch-codex.mjs +++ b/scripts/patch-codex.mjs @@ -1,48 +1,56 @@ #!/usr/bin/env node +// Trial an unmerged Codex Gerrit change in ProtoWiki by committing a tiny, +// deterministic diff instead of vendored tarballs. +// +// npm run patch-codex -- (build + emit patch) +// npm run patch-codex:reset (remove the patch) +// +// All heavy work (cloning + building Codex) happens locally. The committed +// output is a small `patches/codex/*` diff that is re-applied at install time +// by scripts/apply-codex-patch.mjs (wired as `postinstall`), so CI / PR +// previews reproduce the change with no Codex build step. See +// .agents/skills/protowiki-update-codex/references/gerrit-patch-trial.md. + import fs from 'node:fs' import os from 'node:os' import path from 'node:path' -import { fileURLToPath } from 'node:url' -import { spawnSync } from 'node:child_process' -const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const ROOT = path.resolve(__dirname, '..') +import { + CODEX_PACKAGES, + MANIFEST_PATH, + PATCHES_DIR, + ROOT, + formatContent, + installedPackageDir, + isFormattable, + loadJsDiff, + loadPrettier, + patchFileName, + prettierVersion, + readManifest, + readPrettierOptions, + run, + sha256, + tryRun, +} from './lib-codex-patch.mjs' + const CACHE_ROOT = path.join(os.tmpdir(), 'protowiki-codex-gerrit-cache') const CODEX_REPO_DIR = path.join(CACHE_ROOT, 'design-codex') -const PACK_DIR = path.join(CACHE_ROOT, 'packs') const GERRIT_REPO = 'https://gerrit.wikimedia.org/r/design/codex' -const CODEX_PACKAGES = [ - '@wikimedia/codex', - '@wikimedia/codex-design-tokens', - '@wikimedia/codex-icons', -] - const PACKAGE_DIRS = new Map([ ['@wikimedia/codex', 'packages/codex'], ['@wikimedia/codex-design-tokens', 'packages/codex-design-tokens'], ['@wikimedia/codex-icons', 'packages/codex-icons'], ]) -function run(command, args, opts = {}) { - const result = spawnSync(command, args, { - cwd: opts.cwd ?? ROOT, - stdio: 'pipe', - encoding: 'utf8', - }) - - if (result.status !== 0) { - const details = [result.stdout, result.stderr].filter(Boolean).join('\n') - throw new Error(`Command failed: ${command} ${args.join(' ')}\n${details || '(no output)'}`) - } - - return (result.stdout ?? '').trim() -} - -function readRootPackageJson() { - const packageJsonPath = path.join(ROOT, 'package.json') - return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) -} +// Build order matters: codex imports codex-icons' built output, so tokens and +// icons must be built before codex. +const CODEX_BUILD_ORDER = [ + '@wikimedia/codex-design-tokens', + '@wikimedia/codex-icons', + '@wikimedia/codex', +] function parseChangeNumber(input) { if (!input) { @@ -52,27 +60,19 @@ function parseChangeNumber(input) { if (/^\d+$/.test(trimmed)) { return trimmed } - const url = new URL(trimmed) - const slashPlusMatch = url.pathname.match(/\/\+\/(\d+)(?:\/)?$/) - if (slashPlusMatch) { - return slashPlusMatch[1] - } - - const cPathMatch = url.pathname.match(/\/c\/[^/]+\/[^/]+\/\+\/(\d+)(?:\/)?$/) - if (cPathMatch) { - return cPathMatch[1] + const match = + url.pathname.match(/\/\+\/(\d+)(?:\/)?$/) || + url.pathname.match(/\/c\/[^/]+\/[^/]+\/\+\/(\d+)(?:\/)?$/) + if (match) { + return match[1] } - throw new Error(`Could not parse Gerrit change number from: ${input}`) } function stripXssiPrefix(body) { const lines = body.split('\n') - if (lines[0] === `)]}'`) { - return lines.slice(1).join('\n') - } - return body + return lines[0] === `)]}'` ? lines.slice(1).join('\n') : body } async function fetchJson(url) { @@ -80,8 +80,34 @@ async function fetchJson(url) { if (!response.ok) { throw new Error(`Request failed (${response.status}): ${url}`) } - const text = await response.text() - return JSON.parse(stripXssiPrefix(text)) + return JSON.parse(stripXssiPrefix(await response.text())) +} + +function computePatchRef(changeNumber, patchsetNumber) { + const twoDigit = changeNumber.slice(-2).padStart(2, '0') + return `refs/changes/${twoDigit}/${changeNumber}/${patchsetNumber}` +} + +function removeInstalledCodex() { + for (const pkg of CODEX_PACKAGES) { + fs.rmSync(installedPackageDir(pkg), { recursive: true, force: true }) + } +} + +function removePatches() { + fs.rmSync(PATCHES_DIR, { recursive: true, force: true }) +} + +function freshRegistryInstall() { + // Patches are gone, so the postinstall applier is a no-op and node_modules + // ends up holding the pristine published packages (our patch baseline). + console.log('Installing pristine published Codex packages') + run('npm', ['install'], { cwd: ROOT }) +} + +function installedVersion(pkg) { + const p = path.join(installedPackageDir(pkg), 'package.json') + return JSON.parse(fs.readFileSync(p, 'utf8')).version } function ensureRepo() { @@ -94,144 +120,258 @@ function ensureRepo() { } } -function ensureDependenciesInstalled() { - console.log('Installing Codex dependencies') - try { - run('npm', ['install'], { cwd: CODEX_REPO_DIR }) - } catch (error) { - console.warn('Default npm install failed; retrying with --ignore-scripts') +function installCodexDeps() { + console.log('Installing Codex build dependencies') + const ci = tryRun('npm', ['ci', '--ignore-scripts'], { cwd: CODEX_REPO_DIR }) + if (ci.status !== 0) { + console.warn('npm ci failed; falling back to npm install --ignore-scripts') run('npm', ['install', '--ignore-scripts'], { cwd: CODEX_REPO_DIR }) - console.warn( - 'Installed with --ignore-scripts; this bypasses non-essential postinstall hooks in local tooling.', - ) - if (!(error instanceof Error)) { - throw error - } } } function buildCodex() { - console.log('Building design/codex packages used by ProtoWiki') - for (const packageName of CODEX_PACKAGES) { - run('npm', ['run', 'build', '--workspace', packageName], { cwd: CODEX_REPO_DIR }) - } -} - -function packOne(packageName) { - const relDir = PACKAGE_DIRS.get(packageName) - if (!relDir) { - throw new Error(`No package directory mapping for ${packageName}`) - } - const packageDir = path.join(CODEX_REPO_DIR, relDir) - fs.mkdirSync(PACK_DIR, { recursive: true }) - if (packageName === '@wikimedia/codex-design-tokens') { - const distDir = path.join(packageDir, 'dist') - for (const entry of fs.readdirSync(distDir)) { - if (!entry.startsWith('theme-')) continue - const src = path.join(distDir, entry) - const dest = path.join(packageDir, entry) - fs.copyFileSync(src, dest) - } - } - const packOutput = run('npm', ['pack', '--pack-destination', PACK_DIR], { cwd: packageDir }) - const tarballName = packOutput - .split('\n') - .map((line) => line.trim()) - .filter((line) => line.endsWith('.tgz')) - .at(-1) - if (!tarballName) { - throw new Error(`Unable to find tarball name in npm pack output for ${packageName}`) + for (const pkg of CODEX_BUILD_ORDER) { + run('npm', ['run', 'build', '--workspace', pkg], { cwd: CODEX_REPO_DIR }) } - return path.join(PACK_DIR, tarballName) } -function installTarballs(tarballs) { - console.log('Installing local Codex tarballs into ProtoWiki') - run('npm', ['install', '--no-save', ...tarballs], { cwd: ROOT }) -} +// Collect every distributed build artifact of the installed Codex packages: +// everything under `dist/**` plus the root `theme-*` token files. Patching the +// full distribution (rather than only the files ProtoWiki imports today) keeps +// the patched node_modules self-contained — any current or future import sees +// the change, with no need to re-run when ProtoWiki's imports change. Package +// metadata (package.json / README / LICENSE) is deliberately excluded. +function collectCandidates() { + const candidates = [] + + for (const pkg of CODEX_PACKAGES) { + const pkgRoot = installedPackageDir(pkg) + if (!fs.existsSync(pkgRoot)) continue + const buildPkgDir = path.join(CODEX_REPO_DIR, PACKAGE_DIRS.get(pkg)) + + const add = (rel) => { + const installedFile = path.join(pkgRoot, rel) + if (!isFormattable(installedFile)) return + // Token theme files ship at the package root but are built into dist/. + const buildRel = + !rel.includes('/') && rel.startsWith('theme-') ? path.join('dist', rel) : rel + candidates.push({ + target: `${pkg}/${rel}`, + pkg, + rel, + installedFile, + buildFile: path.join(buildPkgDir, buildRel), + }) + } -function resetToRegistry() { - const packageJson = readRootPackageJson() - const desired = CODEX_PACKAGES.map((name) => { - const range = packageJson.dependencies?.[name] - if (!range) { - throw new Error(`Missing dependency range in package.json: ${name}`) + const distDir = path.join(pkgRoot, 'dist') + if (fs.existsSync(distDir)) { + const walk = (dir) => { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const abs = path.join(dir, entry.name) + if (entry.isDirectory()) { + walk(abs) + } else if (entry.isFile()) { + add(path.relative(pkgRoot, abs)) + } + } + } + walk(distDir) } - return `${name}@${range}` - }) - console.log('Restoring Codex packages from npm registry') - run('npm', ['install', '--no-save', ...desired], { cwd: ROOT }) - printInstalledVersions('reset complete') + for (const entry of fs.readdirSync(pkgRoot, { withFileTypes: true })) { + if (entry.isFile() && entry.name.startsWith('theme-')) { + add(entry.name) + } + } + } + + return candidates } -function printInstalledVersions(context) { - const lines = CODEX_PACKAGES.map((name) => { - const p = path.join(ROOT, 'node_modules', name, 'package.json') - if (!fs.existsSync(p)) { - return `${name}: not installed` +function snapshotBuild(candidates) { + const map = new Map() + for (const candidate of candidates) { + if (fs.existsSync(candidate.buildFile)) { + map.set(candidate.target, fs.readFileSync(candidate.buildFile, 'utf8')) } - const v = JSON.parse(fs.readFileSync(p, 'utf8')).version - return `${name}: ${v}` - }) - console.log(`\nCodex package state (${context}):`) - for (const line of lines) { - console.log(`- ${line}`) } + return map } -function computePatchRef(changeNumber, patchsetNumber) { - const twoDigit = changeNumber.slice(-2).padStart(2, '0') - return `refs/changes/${twoDigit}/${changeNumber}/${patchsetNumber}` +// 3-way merge: layer the base->other change onto current, returning the merged +// text. Throws on conflict so we never emit a wrong patch silently. +function mergeThreeWay(rel, current, base, other) { + const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-merge-')) + try { + const cur = path.join(tmp, 'current') + const bse = path.join(tmp, 'base') + const oth = path.join(tmp, 'other') + fs.writeFileSync(cur, current) + fs.writeFileSync(bse, base) + fs.writeFileSync(oth, other) + const res = tryRun('git', ['merge-file', '-p', cur, bse, oth]) + if (res.status === 0) return res.stdout + if (res.status > 0) { + throw new Error( + `Could not cleanly merge the change into the published ${rel} ` + + '(the change overlaps with version differences). Try a newer patchset or re-run.', + ) + } + throw new Error(`git merge-file failed for ${rel}: ${res.stderr}`) + } finally { + fs.rmSync(tmp, { recursive: true, force: true }) + } } -async function applyChange(changeInput) { +async function makePatch(changeInput) { const changeNumber = parseChangeNumber(changeInput) console.log(`Fetching Gerrit change ${changeNumber}`) - const detailUrl = `https://gerrit.wikimedia.org/r/changes/design%2Fcodex~${changeNumber}/detail` const detail = await fetchJson(detailUrl) - const patchset = detail.current_revision_number if (!patchset) { throw new Error('Gerrit response did not include current_revision_number') } - const ref = computePatchRef(changeNumber, String(patchset)) console.log(`Current patchset: ${patchset} (${ref})`) + // 1. Establish a pristine published baseline in node_modules. + removePatches() + removeInstalledCodex() + freshRegistryInstall() + const versions = Object.fromEntries(CODEX_PACKAGES.map((pkg) => [pkg, installedVersion(pkg)])) + console.log(`Baseline Codex version: ${versions['@wikimedia/codex']}`) + + // 2. Fetch the change and its parent. ensureRepo() run('git', ['fetch', 'origin', ref], { cwd: CODEX_REPO_DIR }) - run('git', ['checkout', '--detach', 'FETCH_HEAD'], { cwd: CODEX_REPO_DIR }) + const changeSha = run('git', ['rev-parse', 'FETCH_HEAD'], { cwd: CODEX_REPO_DIR }) + const parentSha = run('git', ['rev-parse', 'FETCH_HEAD^'], { cwd: CODEX_REPO_DIR }) + + // 3. Build the unpatched parent and the patched change. + const candidates = collectCandidates() - ensureDependenciesInstalled() + console.log('Building Codex at the parent commit (unpatched)') + run('git', ['checkout', '--force', '--detach', parentSha], { cwd: CODEX_REPO_DIR }) + installCodexDeps() buildCodex() + const unpatched = snapshotBuild(candidates) - const tarballs = CODEX_PACKAGES.map(packOne) - installTarballs(tarballs) + console.log('Building Codex at the change commit (patched)') + run('git', ['checkout', '--force', '--detach', changeSha], { cwd: CODEX_REPO_DIR }) + buildCodex() + const patched = snapshotBuild(candidates) + + // 4. The change's true footprint: files that differ between the two builds. + const changed = candidates.filter((candidate) => { + const before = unpatched.get(candidate.target) + const after = patched.get(candidate.target) + return before !== undefined && after !== undefined && before !== after + }) - const revision = detail.current_revision ?? '(unknown revision)' - printInstalledVersions(`patched from Gerrit ${changeNumber}`) - console.log(`\nApplied change ${changeNumber} at revision ${revision}.`) - console.log('To restore registry versions: npm run patch-codex:reset') + if (changed.length === 0) { + throw new Error('The change produced no differences in any distributed Codex file.') + } + + // 5. For each changed file, layer the change onto the published file (after + // formatting, so the minified single-line CSS diffs by content not file size). + const prettier = await loadPrettier() + const jsdiff = await loadJsDiff() + const prettierOpts = readPrettierOptions() + + fs.mkdirSync(PATCHES_DIR, { recursive: true }) + const manifestFiles = [] + + for (const candidate of changed) { + const published = fs.readFileSync(candidate.installedFile, 'utf8') + const fmtPublished = await formatContent(prettier, published, candidate.rel, prettierOpts) + const fmtBase = await formatContent( + prettier, + unpatched.get(candidate.target), + candidate.rel, + prettierOpts, + ) + const fmtOther = await formatContent( + prettier, + patched.get(candidate.target), + candidate.rel, + prettierOpts, + ) + + const merged = mergeThreeWay(candidate.rel, fmtPublished, fmtBase, fmtOther) + const fmtMerged = await formatContent(prettier, merged, candidate.rel, prettierOpts) + if (fmtMerged === fmtPublished) continue + + const diff = jsdiff.createPatch(candidate.rel, fmtPublished, fmtMerged, '', '') + const fileName = patchFileName(candidate.target) + fs.writeFileSync(path.join(PATCHES_DIR, fileName), diff) + manifestFiles.push({ + target: candidate.target, + package: candidate.pkg, + rel: candidate.rel, + patch: fileName, + // Content hashes of the formatted baseline and patched result, so the + // applier can apply (and skip re-applying) deterministically. + baseSha: sha256(fmtPublished), + patchedSha: sha256(fmtMerged), + }) + console.log(` patched ${candidate.target}`) + } + + if (manifestFiles.length === 0) { + throw new Error('No effective changes remained after merging into the published files.') + } + + const manifest = { + change: changeNumber, + patchset, + revision: changeSha, + generatedAt: new Date().toISOString(), + codexVersions: versions, + prettierVersion: prettierVersion(prettier), + files: manifestFiles, + } + fs.writeFileSync(MANIFEST_PATH, `${JSON.stringify(manifest, null, 2)}\n`) + + // 6. Apply locally via the same path CI uses. + console.log('Applying patch locally') + console.log(run('node', ['scripts/apply-codex-patch.mjs'], { cwd: ROOT })) + + console.log(`\nWrote ${manifestFiles.length} patch file(s) to patches/codex/.`) + console.log('Commit patches/codex/ so the PR preview reproduces the change.') + console.log('To remove the patch: npm run patch-codex:reset') +} + +function reset() { + const manifest = readManifest() + removePatches() + removeInstalledCodex() + freshRegistryInstall() + if (manifest) { + console.log(`Removed Codex patch for change ${manifest.change}; restored published packages.`) + } else { + console.log('No Codex patch present; reinstalled published packages.') + } +} + +function printUsage() { + console.log('Usage:') + console.log(' npm run patch-codex -- ') + console.log(' npm run patch-codex:reset') } async function main() { - const [, , firstArg, secondArg] = process.argv + const [, , firstArg] = process.argv if (firstArg === '--reset') { - resetToRegistry() + reset() return } - - const changeInput = secondArg && firstArg === '--change' ? secondArg : firstArg - if (!changeInput) { - console.log('Usage:') - console.log(' npm run patch-codex -- ') - console.log(' npm run patch-codex:reset') + if (!firstArg) { + printUsage() process.exit(1) } - - await applyChange(changeInput) + await makePatch(firstArg) } main().catch((error) => { diff --git a/src/prototypes/example-codex-kitchen-sink/index.vue b/src/prototypes/example-codex-kitchen-sink/index.vue index d3cc2ed..d2ac379 100644 --- a/src/prototypes/example-codex-kitchen-sink/index.vue +++ b/src/prototypes/example-codex-kitchen-sink/index.vue @@ -15,8 +15,8 @@ import SpecialPageWrapper from '@/components/SpecialPageWrapper.vue' definePage({ meta: { - title: 'Example: Codex kitchen sink', - description: 'Quick visual regression surface for border radius and grouped controls.', + title: 'Codex playground', + description: 'An assortment of Codex components.', }, }) @@ -55,7 +55,7 @@ const primaryAction = computed(() => ({