feat(brand): AirCard-IOS – neues Logo und Name
- Name AirCard-IOS in Kopfzeile, Titel, Meta-Angaben (theme-color, apple-mobile-web-app-title) und README - Website-Icon: neues Logo als favicon.svg, favicon-32.png und deckendes apple-touch-icon.png (180 x 180, ohne Rundung) - Kopfzeile zeigt das Logo (28 px, auf schmalen Schirmen 24 px) vor dem Namen - Karten-Marken neu aus dem Logo abgeleitet (einfarbig, currentColor): Symbol mit drei gestaffelten Karten und ausgeschnittenen Wellen, Text als Pfade (Nunito Sans 800); IDs unverändert - Tests: Labels, Marken-Aufbau, Favicon, Icon-Dateien, index.html Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
94f6d74249
commit
d64c14eae1
11 files changed
+143
-16
No files matched your search
@@ -29,7 +29,7 @@ describe('Registers', () => {
|
||||
|
||||
it('Labels stehen im Wortlaut der Vorlage in Reihenfolge', () => {
|
||||
expect(NETWORK_MARKS.map((m) => m.label)).toEqual(NETWORK_LABELS);
|
||||
expect(BRAND_MARKS.map((m) => m.label)).toEqual(['AirCards · Symbol', 'AirCards · Text', 'Apple']);
|
||||
expect(BRAND_MARKS.map((m) => m.label)).toEqual(['AirCard-IOS · Symbol', 'AirCard-IOS · Text', 'Apple']);
|
||||
});
|
||||
|
||||
it('BRAND_MARKS: Logo-Gruppe, feste Reihenfolge', () => {
|
||||
@@ -51,7 +51,7 @@ describe('Registers', () => {
|
||||
it('getNetworkMark / getBrandMark finden den Eintrag', () => {
|
||||
for (const id of NETWORK_IDS) expect(getNetworkMark(id).id).toBe(id);
|
||||
expect(getBrandMark('apple').id).toBe('apple');
|
||||
expect(getBrandMark('aircards-text').label).toBe('AirCards · Text');
|
||||
expect(getBrandMark('aircards-text').label).toBe('AirCard-IOS · Text');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -163,12 +163,62 @@ describe('maxH', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('AirCard-IOS-Marken', () => {
|
||||
const symbol = getBrandMark('aircards-symbol').svg;
|
||||
const text = getBrandMark('aircards-text').svg;
|
||||
|
||||
it('Symbol: drei Karten mit Deckkraft .45/.7/1, Wellen als Maske aus der vorderen Karte geschnitten', () => {
|
||||
expect(symbol).toContain('fill-opacity=".45"');
|
||||
expect(symbol).toContain('fill-opacity=".7"');
|
||||
expect(symbol).toMatch(/<mask\b[^>]*\bid="aircards-symbol-[\w-]+"/);
|
||||
expect(symbol).toMatch(/<rect\b[^>]*\bmask="url\(#aircards-symbol-[\w-]+\)"/);
|
||||
expect(symbol).not.toMatch(/fill-opacity="1"/);
|
||||
});
|
||||
|
||||
it('Symbol: enge viewBox um die drei Karten (680 x 730)', () => {
|
||||
expect(svgAspect(symbol)).toBeCloseTo(680 / 730, 3);
|
||||
});
|
||||
|
||||
it('Text: nur Pfade, ein breites Wortlogo', () => {
|
||||
expect(text).toContain('<path');
|
||||
expect(svgAspect(text)).toBeGreaterThan(6);
|
||||
});
|
||||
|
||||
it('Marken sind rein Pfad/Form: kein <text>, keine Schrift, keine externen Verweise', () => {
|
||||
for (const svg of [symbol, text]) {
|
||||
expect(svg).not.toContain('<text');
|
||||
expect(svg).not.toContain('font-family');
|
||||
expect(svg).not.toContain('<style');
|
||||
expect(svg).not.toMatch(/(?:xlink:)?href\s*=/);
|
||||
expect(svg).not.toMatch(/url\(\s*['"]?(?!#)/);
|
||||
}
|
||||
});
|
||||
|
||||
it('Marken verwenden als einzige Farbe currentColor (Masken-Weiß/-Schwarz ausgenommen)', () => {
|
||||
for (const svg of [symbol, text]) {
|
||||
const colours = [...svg.matchAll(/\b(?:fill|stroke)="([^"]+)"/g)].map((h) => h[1].toLowerCase());
|
||||
for (const c of colours) expect(['currentcolor', 'none', '#fff', '#000'], c).toContain(c);
|
||||
}
|
||||
expect(text).not.toMatch(/#(?:fff|000)/i);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Favicon', () => {
|
||||
it('hat feste Farben und kein currentColor', () => {
|
||||
it('ist das neue Logo: 1024er Raster, feste Farben, kein currentColor, keine Metadaten', () => {
|
||||
expect(favicon).not.toContain('currentColor');
|
||||
expect(favicon).toContain('#E8EEF7');
|
||||
expect(favicon).toContain('#0F1828');
|
||||
expect(favicon).toMatch(/viewBox="0 0 64 64"/);
|
||||
expect(favicon).toMatch(/viewBox="0 0 1024 1024"/);
|
||||
expect(favicon).toContain('#0e0a24');
|
||||
expect(favicon).toContain('#8b6cff');
|
||||
for (const bad of ['<metadata', '<title', '<desc', 'sodipodi', 'inkscape', '<script', '<image', '<text', 'xlink:href']) {
|
||||
expect(favicon, bad).not.toContain(bad);
|
||||
}
|
||||
});
|
||||
|
||||
it('jedes url(#…) zeigt auf eine id derselben Datei', () => {
|
||||
const defined = new Set([...favicon.matchAll(/\bid="([^"]+)"/g)].map((h) => h[1]));
|
||||
const refs = [...favicon.matchAll(/url\(\s*['"]?#([^)'"\s]+)/g)].map((h) => h[1]);
|
||||
expect(refs.length).toBeGreaterThan(0);
|
||||
for (const ref of refs) expect(defined.has(ref), ref).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user