Skip to content

Commit 03ae1ac

Browse files
[feat](ui): Aurora Glass — borderless full-bleed shell, glass chrome, model-true hero badges, brand mark, copyright
Fase 1b–1e (documented first in DECISIONS.md): - Borderless: framed app box removed, whitespace replaces hairline dividers, border tokens softened; charts keep --aa-grid-line so data never fades. - Glassmorphism: .aa-glass (color-mix + backdrop blur) on header + top-nav pill; opaque @supports fallbacks + aurora-static low-core fallback; mobile tabbar separates by shadow. - Hero radar chips: inside the wrap (no clipping any breakpoint); copy computed live from the frozen engine (D2 top pick + fit score, busy-online-shop preset). - Brand mark: radar-pentagon + lit decision apex; favicon.svg single source, BrandMark header glyph, PWA icons regenerated headlessly. - Copyright: (c) 2026 Faqih Pratama Muhti (programmerShinobi) in footer, meta, print report; identity exclusive — code MIT / content CC BY 4.0 unchanged. Verified: tsc, lint, build, 116 unit + 14 e2e, all 6 guards, visual check (dark/light/advisor/phone screenshots). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 0c75c72 commit 03ae1ac

18 files changed

Lines changed: 170 additions & 60 deletions

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,28 @@ The decision **model** carries its own version, recorded in the
99

1010
## [Unreleased]
1111

12+
### Changed (Fase 1 — "Aurora Glass" borderless evolution + identity — 2026-07-16)
13+
14+
- **Component tree grouped by feature area**`src/components/` reorganised into
15+
`chrome/ · landing/ · advisor/ · insights/ · overlays/` (tests move with their components; the
16+
frozen model guards pin `src/config/*` only and are untouched).
17+
- **Borderless design language** — the framed app box is gone: content sits full-bleed on the
18+
aurora canvas; sections separate by whitespace (`.f-div` is now pure spacing); hairline border
19+
tokens softened; the header and top nav float as **glassmorphism** panels (`.aa-glass`:
20+
translucent `color-mix` fill + `backdrop-filter` blur, with opaque fallbacks via `@supports` and
21+
on low-core `aurora-static` devices); the mobile tab bar separates by shadow, not stroke. Chart
22+
grids keep their own `--aa-grid-line` token so data lines never fade with the chrome.
23+
- **Hero radar badges fixed + model-true** — the Home radar chips no longer hang outside the card
24+
(no clipping at any breakpoint), and their copy is **computed from the frozen engine** (the D2
25+
recommendation + fit score for the *busy online shop* preset) instead of mockup text — the badge
26+
can never drift from what the Advisor actually recommends.
27+
- **New brand mark** — a 5-dimension radar pentagon with one lit decision apex ("five dimensions,
28+
one recommendation"): `public/favicon.svg` + `BrandMark` header glyph + regenerated PWA icons
29+
(192/512/maskable/apple-touch, headless render, no new deps).
30+
- **Copyright & identity**`© 2026 Faqih Pratama Muhti (programmerShinobi)` in the global
31+
footer, `<meta author/copyright>`, and the print report; brand & identity exclusive, code stays
32+
MIT and content CC BY 4.0 (single-sourced in `src/config/site.ts`).
33+
1234
### Changed (Full bilingualisation + light-theme polish — 2026-07-15)
1335

1436
- **Light theme softened** — the page background is now an off-white slate (`#e8ecf4`) instead of

DECISIONS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ commitment the code must match (cross-checked by review, gates, and tests).
272272
recommendation). Single source (`public/favicon.svg` + a `BrandMark` component), reused for
273273
header wordmark, favicon and regenerated PWA icons (192/512/maskable) via the existing headless
274274
render script — no image dependency added.
275-
- **Copyright & identity.** A footer identity line — `© 2026 Faqih Ibrahim Abdullah (programmerShinobi).
275+
- **Copyright & identity.** A footer identity line — `© 2026 Faqih Pratama Muhti (programmerShinobi).
276276
All rights reserved.` — plus the same notice in `site.ts` config, the SEO snapshots, the README
277277
and the print report. **Scope note:** code stays MIT and docs CC BY 4.0 (unchanged LICENSE
278278
files); the copyright line asserts *identity/attribution* of the work, it does not re-license it.

index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
name="description"
88
content="Architecture Advisor — a transparent, quality-attribute-driven decision-support tool for choosing software architecture, and always explaining why. Free, client-side, open source."
99
/>
10+
<meta name="author" content="Faqih Pratama Muhti (programmerShinobi)" />
11+
<meta name="copyright" content="© 2026 Faqih Pratama Muhti (programmerShinobi)" />
1012
<title>Architecture Advisor</title>
1113

1214
<!-- Icons + PWA theme (manifest link is injected by vite-plugin-pwa). -->

public/favicon.svg

Lines changed: 10 additions & 5 deletions
Loading

public/icons/apple-touch-icon.png

3.83 KB
Loading

public/icons/icon-192.png

7.24 KB
Loading

public/icons/icon-512.png

32.8 KB
Loading

public/icons/icon-maskable-512.png

10.2 KB
Loading

src/App.tsx

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { effectiveWeights, rankWith, sensitivity, type Overrides } from './lib/s
4141
import { detectAntiPatterns } from './lib/antiPatternEngine';
4242
import type { ExportInput } from './lib/snapshot';
4343
import type { ScenarioState } from './lib/scenarioIO';
44+
import { SITE_COPYRIGHT } from './config/site';
4445
import type { DimensionId, Levels, RankedOption } from './types';
4546

4647
// The Manual/Guide is lazy-loaded: it is an on-demand modal and now carries the detailed,
@@ -211,18 +212,10 @@ export default function App() {
211212
{mainView === 'advisor' && <AdvisorMobileBar />}
212213
<div className={'screen-only aa-page' + (mainView === 'advisor' ? ' has-actionbar' : '')}>
213214
<div className="page aa-frame">
214-
<div style={{ background: 'var(--color-background-secondary)', borderRadius: 'var(--border-radius-xl)', padding: 'var(--aa-space-3)' }}>
215-
<div
216-
id="f-app"
217-
className={mode + ' aa-surface'}
218-
style={{
219-
position: 'relative',
220-
background: 'var(--color-background-primary)',
221-
border: '0.5px solid var(--color-border-tertiary)',
222-
borderRadius: 'var(--border-radius-lg)',
223-
overflow: 'hidden',
224-
}}
225-
>
215+
{/* Borderless full-bleed shell (Fase 1): no framed box — content floats on the aurora
216+
canvas; the header/nav are glass. The extra wrapper div is gone with the frame. */}
217+
<div>
218+
<div id="f-app" className={mode} style={{ position: 'relative' }}>
226219
<Header
227220
mode={mode}
228221
onToggleMode={setMode}
@@ -234,7 +227,7 @@ export default function App() {
234227
saveSig={saveSig}
235228
/>
236229

237-
<nav aria-label={t('m.primaryNav')} className="screen-only aa-topnav">
230+
<nav aria-label={t('m.primaryNav')} className="screen-only aa-topnav aa-glass">
238231
{(['home', 'advisor', 'learn'] as const).map((v) => {
239232
const active = mainView === v;
240233
return (
@@ -247,13 +240,11 @@ export default function App() {
247240
appearance: 'none',
248241
background: active ? 'var(--color-background-info)' : 'transparent',
249242
border: 'none',
250-
borderBottom: `2px solid ${active ? 'var(--color-text-info)' : 'transparent'}`,
251-
borderRadius: 'var(--border-radius-md) var(--border-radius-md) 0 0',
252-
color: active ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',
243+
borderRadius: '999px',
244+
color: active ? 'var(--color-text-info)' : 'var(--color-text-secondary)',
253245
fontSize: '14px',
254246
fontWeight: active ? 600 : 500,
255-
padding: '8px 16px',
256-
marginBottom: '-0.5px',
247+
padding: '8px 18px',
257248
cursor: 'pointer',
258249
transition: 'background 0.15s ease, color 0.15s ease',
259250
}}
@@ -403,18 +394,21 @@ export default function App() {
403394
}}
404395
/>
405396

406-
{/* Global footer — always visible (both Advisor & Insights); browser guidance (FR-EDGE-4 / SRS §2.3). */}
397+
{/* Global footer — always visible (both Advisor & Insights); browser guidance (FR-EDGE-4 / SRS §2.3)
398+
+ copyright & identity (Fase 1, DECISIONS.md). Borderless: whitespace, no hairline. */}
407399
<footer
408400
className="screen-only"
409401
style={{
410-
padding: 'var(--aa-space-3) var(--aa-panel-pad)',
411-
borderTop: '0.5px solid var(--color-border-tertiary)',
402+
padding: 'var(--aa-space-6) var(--aa-panel-pad) var(--aa-space-4)',
412403
fontSize: 'var(--aa-fs-2xs)',
413404
color: 'var(--color-text-tertiary)',
414405
textAlign: 'center',
415406
}}
416407
>
417-
{t('footer.browsers')}
408+
<div>{t('footer.browsers')}</div>
409+
<div style={{ marginTop: 'var(--aa-space-2)' }}>
410+
{SITE_COPYRIGHT} · {t('footer.rights')}
411+
</div>
418412
</footer>
419413
</div>
420414
</div>

src/components/advisor/C4Preview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ function style(kind: C4NodeKind) {
1818
if (kind === 'actor')
1919
return { fill: 'var(--color-background-info)', stroke: 'var(--color-text-info)', text: 'var(--color-text-info)' };
2020
if (kind === 'store')
21-
return { fill: 'var(--color-background-secondary)', stroke: 'var(--color-border-secondary)', text: 'var(--color-text-secondary)' };
22-
return { fill: 'var(--color-background-secondary)', stroke: 'var(--color-border-secondary)', text: 'var(--color-text-primary)' };
21+
return { fill: 'var(--color-background-secondary)', stroke: 'var(--aa-grid-line)', text: 'var(--color-text-secondary)' };
22+
return { fill: 'var(--color-background-secondary)', stroke: 'var(--aa-grid-line)', text: 'var(--color-text-primary)' };
2323
}
2424

2525
// Renders the C4 stub as deterministic SVG (rows of nodes, fan-out / 1:1 edges). Theme-aware

0 commit comments

Comments
 (0)