From 9ef0c48c0076a1cc9498b8179edfc18f1344a421 Mon Sep 17 00:00:00 2001 From: Kjell Tore Guttormsen Date: Wed, 6 May 2026 12:55:25 +0200 Subject: [PATCH] =?UTF-8?q?feat(llm-security):=20playground=20v7.6.0=20fas?= =?UTF-8?q?e=201-2=20=E2=80=94=20fjern=20DS-duplikater=20+=20page-shell=20?= =?UTF-8?q?harmonisering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slett ~50 duplikat-CSS-deklarasjoner fra playground-ens @@ -6707,13 +6631,12 @@ const orgName = (store.state.shared.organization && store.state.shared.organization.name) || ''; const isReturning = !!orgName; - const headerHtml = ( - '
' + - '' + (isReturning ? 'RE-ONBOARDING' : 'ONBOARDING') + ' · ' + allCompleteCount + ' av ' + ONBOARDING_GROUPS.length + ' grupper komplette' + - '

' + (isReturning ? 'Oppdater fellesfeltene' : 'Velkommen — la oss sette opp llm-security for ' + (orgName || 'din virksomhet')) + '

' + - '

Disse 5 gruppene er felles state. De forhåndsutfyller alle command-skjemaer for nye prosjekter, så du slipper å re-skrive samme info.

' + - '
' - ); + const headerHtml = renderPageShell({ + eyebrow: (isReturning ? 'RE-ONBOARDING' : 'ONBOARDING') + ' · ' + allCompleteCount + ' av ' + ONBOARDING_GROUPS.length + ' grupper komplette', + title: isReturning ? 'Oppdater fellesfeltene' : 'Velkommen — la oss sette opp llm-security for ' + (orgName || 'din virksomhet'), + lede: 'Disse 5 gruppene er felles state. De forhåndsutfyller alle command-skjemaer for nye prosjekter, så du slipper å re-skrive samme info.', + meta: ['Gruppe ' + (ONBOARDING_GROUPS.findIndex(function (g) { return g.id === group.id; }) + 1) + ' av ' + ONBOARDING_GROUPS.length, group.title || group.id] + }, ''); const stepNavHtml = ( '
' + @@ -6880,6 +6803,12 @@ ? 'Velg arbeidsspor eller utforsk eksisterende prosjekter. Felles state er aktiv og forhåndsutfyller skjemaer.' : 'Single-file sikkerhetsskanning + auditing for Claude Code-prosjekter. Start med onboarding for å aktivere felles state.', verdict: 'n-a', + hero: true, + meta: [ + 'Plugin v7.5.0', + projects.length + ' prosjekt' + (projects.length === 1 ? '' : 'er'), + CATALOG.commands.length + ' kommandoer' + ], keyStats: [ { label: 'PROSJEKTER', value: projects.length }, { label: 'AKTIVE RAPPORTER', value: activeReportCount }, @@ -6977,6 +6906,11 @@ title: 'Command-katalog', lede: 'Alle ' + total + ' kommandoer gruppert på kategori. Bygg pipeline-strenger uten et aktivt prosjekt.', verdict: 'n-a', + meta: [ + total + ' kommandoer', + reportCount + ' rapport-produserende', + toolCount + ' verktøy' + ], keyStats: [ { label: 'TOTALT', value: total }, { label: 'RAPPORT-KOMMANDOER', value: reportCount }, @@ -7159,6 +7093,11 @@ title: project.name, lede: project.description || '', verdict: inferProjectVerdict(project), + meta: [ + 'Target: ' + (project.target || project.target_path || '—'), + 'Sist oppdatert: ' + inferProjectLastUpdated(project), + (project.scenario || project.template || 'standard') + ], keyStats: [ { label: 'RAPPORTER', value: reportFilled + '/' + reportTotal }, { label: 'SIST OPPDATERT', value: inferProjectLastUpdated(project) }, @@ -7206,17 +7145,30 @@ return '
' + items + '
'; } + /** + * Render page-shell — DS Tier 3 page__header-klyngen brukt på alle 4 overflater: + * - onboarding: page__eyebrow="ONBOARDING · n av 5 grupper komplette" + * - home: page__eyebrow="HJEM" (m/ hero-modifier for editorial type-hierarki) + * - catalog: page__eyebrow="KATALOG" + * - project: page__eyebrow="PROSJEKT · " + * Pluss alle 18 rapport-renderere (eyebrow per archetype). + * opts: { eyebrow, title, lede, meta:[], verdict, hero, keyStats } + */ function renderPageShell(opts, bodyHtml) { opts = opts || {}; const eyebrow = opts.eyebrow ? '' + escapeHtml(opts.eyebrow) + '' : ''; const title = '

' + escapeHtml(opts.title || '') + '

'; const lede = opts.lede ? '

' + escapeHtml(opts.lede) + '

' : ''; + const meta = (opts.meta && opts.meta.length) + ? '
' + opts.meta.map(function (m) { return '' + escapeHtml(m) + ''; }).join('') + '
' + : ''; const verdict = (opts.verdict && opts.verdict !== 'n-a') ? renderVerdictPill(opts.verdict) : ''; const aside = verdict ? '
' + verdict + '
' : ''; const stats = renderKeyStatsGrid(opts.keyStats); + const heroClass = opts.hero ? ' page__header--hero' : ''; return ( - '