diff --git a/docs/design/artboards/d215/cap/measure_after.js b/docs/design/artboards/d215/cap/measure_after.js index 510628425..ad1b43d45 100644 --- a/docs/design/artboards/d215/cap/measure_after.js +++ b/docs/design/artboards/d215/cap/measure_after.js @@ -18,7 +18,7 @@ const fs = require('fs'); const HERE = __dirname; const TARGETS = path.join(HERE, '..', 'targets.json'); -const SURFACES = ['settings', 'agent-settings', 'agent-memory', 'board', 'connectors', 'chat', 'sidebar', 'byo', 'byo-handoff', 'firstrun-welcome', 'firstrun-waiting', 'firstrun-connected', 'firstrun-error', 'activity-queue', 'activity-empty', 'activity-error']; +const SURFACES = ['settings', 'agent-settings', 'agent-memory', 'board', 'connectors', 'chat', 'sidebar', 'byo', 'byo-handoff', 'firstrun-welcome', 'firstrun-waiting', 'firstrun-connected', 'firstrun-error', 'activity-queue', 'activity-empty', 'activity-error', 'profile-person', 'profile-empty', 'profile-error']; // byo-handoff is drawn but can't be captured on prod: reaching it issues a real key. The first-run // dialog is a latch-gated overlay, and the Scout welcome only exists in a brand-new pod, so neither is measured on prod. const PROD_SURFACES = SURFACES.filter(s => s !== 'byo-handoff' && !s.startsWith('firstrun-')); diff --git a/docs/design/artboards/d215/cap/measure_after.test.js b/docs/design/artboards/d215/cap/measure_after.test.js index 69c1d1ac1..ebdf2904f 100644 --- a/docs/design/artboards/d215/cap/measure_after.test.js +++ b/docs/design/artboards/d215/cap/measure_after.test.js @@ -29,7 +29,7 @@ test('--only with an unknown surface throws', () => { test('the committed targets.json passes its own validation', () => { const t = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'targets.json'), 'utf8')); - assert.strictEqual(Object.keys(t).length, 32); + assert.strictEqual(Object.keys(t).length, 38); validateTargets(t); }); @@ -39,7 +39,7 @@ test('an empty or partial measurement is refused', () => { const partial = { ...t }; delete partial['board-390']; assert.throws(() => validateTargets(partial), /missing board-390/); assert.throws(() => validateTargets({ ...t, 'chat-1440': { helperWords: NaN, innerRatio: 2 } }), /invalid chat-1440/); - assert.strictEqual(EXPECTED.length, 32); + assert.strictEqual(EXPECTED.length, 38); }); // A page whose SPA shell answers 200 and then redirects to `landsOn`. Its metrics would score diff --git a/docs/design/artboards/d215/index.html b/docs/design/artboards/d215/index.html index 7a90813f6..3597e6e99 100644 --- a/docs/design/artboards/d215/index.html +++ b/docs/design/artboards/d215/index.html @@ -612,6 +612,34 @@ .app.m .v2-activity__error .b { height: 44px; } .app.m .v2-activity__moved-line { grid-template-columns: 44px minmax(0, 1fr) auto; } .mtop .meta { font: 500 12px/1 var(--f-mono); color: var(--mu); white-space: nowrap; } +/* profile: the live profile page, lifted onto the connectors page's primitives. */ +.av--64 { width: 64px; height: 64px; border-radius: 16px; } +.v2-profile { width: 100%; max-width: 860px; margin: 0 auto; display: flex; flex-direction: column; gap: 16px; min-width: 0; } +.v2-profile__card { display: grid; grid-template-columns: 64px minmax(0, 1fr) auto; gap: 16px; align-items: center; padding: 16px; border-radius: 12px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); } +.v2-profile__who { display: grid; gap: 3px; min-width: 0; } +.v2-profile__who strong { font: 700 18px/1.25 var(--f-display); letter-spacing: -0.01em; color: var(--ink); } +.v2-profile__handle { font: 500 12px/16px var(--f-mono); color: var(--se); } +.v2-profile__since { font-size: 12.5px; line-height: 1.4; color: var(--mu); } +.v2-profile__cols { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: 16px; align-items: start; } +.v2-profile__block { display: grid; gap: 8px; min-width: 0; } +.v2-profile__block h2 { margin: 0; font: 700 15px/1.2 var(--f-display); letter-spacing: -0.01em; color: var(--ink); } +.v2-profile__none { margin: 0; padding: 16px 14px; border-radius: 12px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); font-size: 13.5px; color: var(--se); } +.v2-profile__posts { border-radius: 12px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); overflow: hidden; } +.v2-profile__post { display: grid; gap: 3px; padding: 11px 14px; border-top: 1px solid var(--d); cursor: pointer; font-size: 13.5px; line-height: 1.45; color: var(--ink); } +.v2-profile__post:first-child { border-top: 0; } +.v2-profile__meta { font: 500 11px/16px var(--f-mono); color: var(--mu); } +.v2-profile__chips { display: flex; flex-wrap: wrap; gap: 8px; } +.v2-profile__chip { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; height: 32px; padding: 0 12px; border-radius: 8px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); font: 600 13px/1 var(--f-body); color: var(--ink); } +.v2-profile__chip span { font: 500 11px/1 var(--f-mono); color: var(--mu); } +.v2-profile__error { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px; border-radius: 12px; box-shadow: inset 0 0 0 1px var(--d); background: var(--sf); font-size: 13.5px; color: var(--ink); } +.app.m .v2-profile { gap: 14px; } +.app.m .v2-profile__card { grid-template-columns: 64px minmax(0, 1fr); } +.app.m .v2-profile__card > .b { grid-column: 1 / -1; height: 44px; width: 100%; } +.app.m .v2-profile__cols { grid-template-columns: minmax(0, 1fr); } +.app.m .v2-profile__post { min-height: 44px; } +.app.m .v2-profile__chip { height: 44px; } +.app.m .v2-profile__error { flex-direction: column; align-items: stretch; } +.app.m .v2-profile__error .b { height: 44px; }

Same look. Less said.

  • One screen firstRepeated blocks become a table; rare settings collapse.
  • @@ -1022,6 +1050,32 @@

    Same look. Less said.

    +
    +

    Profile

    /v2/profile/:id
    helper words person – → 5empty – → 14scroll 390 – → 1.0×
    +
    +
    Person · 1440public view
    +
    Nothing public yet · 1440follow still works

    Profile

    Dana Okafor@danaMember since 3 months ago

    Recent public posts

    No public posts yet.

    Joined pods

    No joined pods to show.

    +
    +
    +
    Load failed · 1440user could not be fetched

    Profile

    +
      +
    • One card, then what they have made public. The card holds the avatar, the name, the handle and how long they have been here, with Follow as the one ink key. Recent public posts and Joined pods sit under it, side by side at 1440 and stacked at 390.
    • +
    • Rows are the targets. A post row opens its thread; a pod chip opens the pod. Both are 44px tall at 390 and 32px at 1440, and neither carries an icon, because the whole row is the key.
    • +
    • Flag for Lily, drawn without the email. The live card prints user.email under the name. A public page should not show someone's address, so the frame shows the handle. If the email has to stay, it needs to be owner-only.
    • +
    • Own profile is not drawn here. /v2/profile already redirects to Settings; the Overview, Apps, API Token and User Admin tabs live there.
    • +

    Each state, one line

    + + + +
    PersonFollow flips to Unfollow (a bordered key) once the call returns; it is disabled while the call is in flight.
    Nothing public yetEach block keeps its title and says so in one line: "No public posts yet." and "No joined pods to show."
    Load failedOne line and Retry. The live page prints the line in red with no way out; Retry is new and is the one addition in this frame.
    +
    +
    +
    Person · 390
    +
    Nothing public yet · 390

    Profile

    Dana Okafor@danaMember since 3 months ago

    Recent public posts

    No public posts yet.

    Joined pods

    No joined pods to show.

    Pods
    3Needs you
    Team
    Settings
    +
    Load failed · 390

    Profile

    Pods
    3Needs you
    Team
    Settings
    +
    +
    +

    Dark mode

    one dark value per token
    diff --git a/docs/design/artboards/d215/targets.json b/docs/design/artboards/d215/targets.json index 1fcf24d21..4ecb139c4 100644 --- a/docs/design/artboards/d215/targets.json +++ b/docs/design/artboards/d215/targets.json @@ -126,5 +126,29 @@ "activity-error-390": { "helperWords": 0, "innerRatio": 1 + }, + "profile-person-1440": { + "helperWords": 5, + "innerRatio": 1 + }, + "profile-empty-1440": { + "helperWords": 14, + "innerRatio": 1 + }, + "profile-error-1440": { + "helperWords": 0, + "innerRatio": 1 + }, + "profile-person-390": { + "helperWords": 5, + "innerRatio": 1 + }, + "profile-empty-390": { + "helperWords": 14, + "innerRatio": 1 + }, + "profile-error-390": { + "helperWords": 0, + "innerRatio": 1 } }