diff --git a/TESTING.md b/TESTING.md index ce81b09..001ab96 100644 --- a/TESTING.md +++ b/TESTING.md @@ -361,7 +361,8 @@ Recorded shell deviations: palette, then the OS. - **D5**: no Activity button or Activity row until an activity center exists. - **D28**: no SAVED VIEWS or COLLECTIONS, and no Design review. The bottom nav is - System plus the production Overview hub (the concept's `activity` glyph, no count). + System plus the production Overview hub (its own outline home glyph, not the concept's + `activity` pulse, and no count). The connection reads "Your library, on your server" with a neutral muted dot. - **D29**: no prototype copy. There is no "Interactive concept" badge and no "What changes & why" button. The footer reads "ComfyAssets · Local tools. Your diff --git a/tests/browser/shell-concept.spec.mjs b/tests/browser/shell-concept.spec.mjs index 6cb5197..63d274e 100644 --- a/tests/browser/shell-concept.spec.mjs +++ b/tests/browser/shell-concept.spec.mjs @@ -52,6 +52,10 @@ function remainingFooter(footer,spans) { return `${parseFloat(footer.paddingTop)+parseFloat(footer.paddingBottom)+content}px`; } +// D28 ruling (final review A, Minor 1): Overview gets a distinct outline home glyph. The concept has no home icon, and +// its `activity` pulse stays reserved for the Activity row D5 omits, so the two entries never share one glyph. +const OVERVIEW_GLYPH='M3 11 12 4l9 7M5 10v10h14V10M10 20v-6h4v6'; + /** Recorded shell deviations only (spec §8). Everything else in the concept inventory must equal production. */ function mapShellConcept(reference) { const {chrome}=reference; @@ -60,13 +64,13 @@ function mapShellConcept(reference) { .filter(nav=>nav.id!=='saved-nav'&&nav.id!=='collections-nav') .map(nav=>{ if(nav.id!=='system-nav')return nav; - const activity=rowNamed(nav,'Activity'),system=rowNamed(nav,'System'); + const system=rowNamed(nav,'System'); return {...nav,rows:[ // D5: no Activity row until an activity center exists. D28: no Design review (prototype page). system, - // D28: the production Overview hub follows System, as a concept nav row without a count. Its icon is the - // concept's own `activity` glyph, which production names `overview`. - {...system,text:'Overview',current:null,gapAfter:null,icon:{...system.icon,d:activity.icon.d}}, + // D28: the production Overview hub follows System, as a concept nav row without a count. Its icon is + // the ruling's own outline home glyph (OVERVIEW_GLYPH), never the concept's `activity` pulse. + {...system,text:'Overview',current:null,gapAfter:null,icon:{...system.icon,d:OVERVIEW_GLYPH}}, ]}; }); return {...reference,chrome:{...chrome, diff --git a/tests/browser/workspace-visual.spec.mjs b/tests/browser/workspace-visual.spec.mjs index 1bc7bea..7662960 100644 --- a/tests/browser/workspace-visual.spec.mjs +++ b/tests/browser/workspace-visual.spec.mjs @@ -552,7 +552,9 @@ test('approved icons are decorative safe SVGs and reject unknown vocabulary', as expect(icon).toMatchObject({ svg: true, className: 'icon', owner: true, viewBox: '0 0 24 24', hidden: 'true', focusable: 'false', fill: 'none', stroke: 'currentColor', width: '1.65', children: 1 }); expect(icon.path.length).toBeGreaterThan(10); } - expect(icons.rendered.find(icon => icon.name === 'overview').path).toBe('M3 12h4l3-8 4 16 3-8h4'); + // D28 ruling: Overview's own outline home glyph, not the concept's `activity` pulse ('M3 12h4l3-8 4 16 3-8h4'). + expect(icons.rendered.find(icon => icon.name === 'overview').path).toBe('M3 11 12 4l9 7M5 10v10h14V10M10 20v-6h4v6'); + expect(new Set(icons.rendered.map(icon => icon.path)).size).toBe(icons.rendered.length); }); diff --git a/web/js/workspace/icons.mjs b/web/js/workspace/icons.mjs index 88cf39f..ef24a92 100644 --- a/web/js/workspace/icons.mjs +++ b/web/js/workspace/icons.mjs @@ -3,7 +3,8 @@ const paths = Object.freeze({ "library": "M4 4h5v16H4z M11 4h4v16h-4z M17 5l3-1 3 15-3 1z", "tags": "M3 3h8l10 10-8 8L3 11V3ZM7 7h.01", "upload": "M12 16V3m-5 5 5-5 5 5M3 15v6h18v-6", - "overview": "M3 12h4l3-8 4 16 3-8h4", + // D28 ruling: an outline home glyph of its own; the concept's `activity` pulse stays with the Activity row D5 omits. + "overview": "M3 11 12 4l9 7M5 10v10h14V10M10 20v-6h4v6", "settings": "M12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8ZM12 2v3m0 14v3M2 12h3m14 0h3M5 5l2 2m10 10 2 2M5 19l2-2M17 7l2-2", "grid": "M3 3h7v7H3z M14 3h7v7h-7z M3 14h7v7H3z M14 14h7v7h-7z", "list": "M9 5h12M9 12h12M9 19h12M3 5h.01M3 12h.01M3 19h.01",