Files
wehub-resource-sync 070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:00:47 +08:00

51 lines
1.9 KiB
TypeScript

import { readFileSync } from 'node:fs';
import { describe, expect, it } from 'vitest';
const entryLayoutCss = readFileSync(new URL('../../src/styles/home/entry-layout.css', import.meta.url), 'utf8');
function cssDeclarations(selector: string): string {
const blocks: string[] = [];
const rulePattern = /([^{}]+)\{([^}]*)\}/g;
let match: RegExpExecArray | null;
while ((match = rulePattern.exec(entryLayoutCss)) !== null) {
const selectors = (match[1] ?? '').split(',').map((item) => item.trim());
if (selectors.includes(selector)) blocks.push(match[2] ?? '');
}
if (blocks.length === 0) throw new Error(`Missing CSS block for ${selector}`);
return blocks.join('\n');
}
function ruleValue(block: string, property: string): string {
const matches = [...block.matchAll(new RegExp(`(?:^|[;\\n])\\s*${property}:\\s*([^;]+);`, 'g'))];
const match = matches.at(-1);
if (!match) throw new Error(`Missing CSS property ${property}`);
return match[1]!.trim();
}
describe('InlineModelSwitcher styles', () => {
it('clips long model labels inside the compact chip', () => {
const chip = cssDeclarations('.inline-switcher__chip');
expect(ruleValue(chip, 'overflow')).toBe('hidden');
for (const selector of [
'.inline-switcher__chip-mode',
'.inline-switcher__chip-primary',
'.inline-switcher__chip-model',
]) {
const block = cssDeclarations(selector);
expect(ruleValue(block, 'min-width'), selector).toBe('0');
expect(ruleValue(block, 'overflow'), selector).toBe('hidden');
expect(ruleValue(block, 'text-overflow'), selector).toBe('ellipsis');
expect(ruleValue(block, 'white-space'), selector).toBe('nowrap');
}
});
it('hides the long status text in compact hero placement', () => {
const compactText = cssDeclarations(
'.inline-switcher--compact .inline-switcher__chip-text',
);
expect(ruleValue(compactText, 'display')).toBe('none');
});
});