diff --git a/docs/design/artboards/d215/cap/measure_after.js b/docs/design/artboards/d215/cap/measure_after.js index 44865ae3b..510628425 100644 --- a/docs/design/artboards/d215/cap/measure_after.js +++ b/docs/design/artboards/d215/cap/measure_after.js @@ -18,9 +18,10 @@ 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']; -// byo-handoff is drawn but can't be captured on prod: reaching it issues a real key. -const PROD_SURFACES = SURFACES.filter(s => s !== 'byo-handoff'); +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']; +// 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-')); const VIEWPORTS = ['1440', '390']; const EXPECTED = SURFACES.flatMap(s => VIEWPORTS.map(v => `${s}-${v}`)); diff --git a/docs/design/artboards/d215/cap/measure_after.test.js b/docs/design/artboards/d215/cap/measure_after.test.js index 4601b2d6f..69c1d1ac1 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, 18); + assert.strictEqual(Object.keys(t).length, 32); 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, 18); + assert.strictEqual(EXPECTED.length, 32); }); // 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 2ca2c279d..7a90813f6 100644 --- a/docs/design/artboards/d215/index.html +++ b/docs/design/artboards/d215/index.html @@ -510,6 +510,108 @@ .app.m .composer { margin: 4px 10px 10px; } .app.m .cgrid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } .app.m .tile { height: 104px; } +/* first run: the live v2-first-run__* and v2-chat__start* names. The dialog sits inside .app, over the pod. */ +.v2-chat__starts { display: grid; grid-template-columns: minmax(0, max-content); gap: 6px; margin: 2px 0 6px 48px; } +.v2-chat__start { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; min-height: 32px; padding: 6px 12px; border-radius: 10px; font: 500 13px/1.35 var(--f-body); color: var(--ink); background: linear-gradient(180deg, var(--key-a), var(--key-b)); box-shadow: inset 0 0 0 1px var(--key-edge), var(--sh-key); } +.v2-chat__start--primary { color: var(--on-fill); font-weight: 600; background: linear-gradient(180deg, var(--fill-a), var(--fill-b)); box-shadow: inset 0 0 0 1px var(--fill-edge); } +.v2-chat__start-note { margin: 0 0 8px 48px; font-size: 12px; line-height: 1.4; color: var(--mu); } +.v2-first-run__overlay { position: absolute; inset: 0; z-index: 20; display: grid; place-items: center; padding: 24px; background: var(--scrim); } +.v2-first-run { width: min(720px, 100%); padding: 28px; border-radius: 16px; background: var(--sf); color: var(--ink); box-shadow: var(--sh-pop); } +.v2-first-run__eyebrow { margin-bottom: 8px; font: 500 11.5px/16px var(--f-mono); color: var(--mu); } +.v2-first-run__heading-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; } +.v2-first-run__title { margin: 0; font: 700 28px/1.15 var(--f-display); letter-spacing: -0.025em; color: var(--ink); } +.v2-first-run__lede { max-width: 560px; margin: 10px 0 0; font-size: 14px; line-height: 1.55; color: var(--se); } +.v2-first-run__skip { all: unset; box-sizing: border-box; cursor: pointer; flex: none; display: inline-flex; align-items: center; height: 32px; padding: 0 10px; border-radius: 9px; font: 600 12.5px/1 var(--f-body); color: var(--se); } +.v2-first-run__steps { display: grid; gap: 10px; margin: 22px 0 0; padding: 0; list-style: none; } +.v2-first-run__step { display: grid; grid-template-columns: 28px minmax(0, 1fr); gap: 12px; align-items: start; padding: 14px; border-radius: 12px; background: var(--p); box-shadow: inset 0 0 0 1px var(--d); } +.v2-first-run__step-mark { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%; background: var(--sf); box-shadow: inset 0 0 0 1px var(--b); font: 600 12px/1 var(--f-mono); color: var(--se); } +.v2-first-run__step-mark svg.i { width: 16px; height: 16px; } +.v2-first-run__step-mark--done { background: var(--c-soft); box-shadow: inset 0 0 0 1px var(--c); color: var(--c-text); } +.v2-first-run__step-body { display: flex; min-width: 0; flex-direction: column; align-items: flex-start; gap: 5px; font-size: 13px; line-height: 1.45; color: var(--se); } +.v2-first-run__step-body strong { font-size: 14px; font-weight: 600; color: var(--ink); } +.v2-first-run__setup, .v2-first-run__hello { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; gap: 7px; height: 32px; margin-top: 6px; padding: 0 13px; border-radius: 10px; font: 600 13px/1 var(--f-body); } +.v2-first-run__setup svg.i, .v2-first-run__hello svg.i { width: 16px; height: 16px; } +.v2-first-run__setup { color: var(--ink); background: linear-gradient(180deg, var(--key-a), var(--key-b)); box-shadow: inset 0 0 0 1px var(--key-edge), var(--sh-key); } +.v2-first-run__hello { color: var(--on-fill); background: linear-gradient(180deg, var(--fill-a), var(--fill-b)); box-shadow: inset 0 0 0 1px var(--fill-edge); } +.v2-first-run__hello[disabled] { opacity: .45; cursor: default; } +.v2-first-run__waiting, .v2-first-run__connected, .v2-first-run__error { display: inline-flex; align-items: center; gap: 8px; } +.v2-first-run__connected { color: var(--c-text); font-weight: 600; } +.v2-first-run__connected svg.i, .v2-first-run__error svg.i { width: 16px; height: 16px; } +.v2-first-run__error { color: var(--ink); font-size: 12.5px; } +.app.m .v2-chat__starts { margin-left: 40px; } +.app.m .v2-chat__start { min-height: 44px; } +.app.m .v2-chat__start-note { margin-left: 40px; } +.app.m .v2-first-run__overlay { padding: 12px; place-items: end center; } +.app.m .v2-first-run { padding: 20px 16px; } +.app.m .v2-first-run__heading-row { flex-direction: column; gap: 8px; } +.app.m .v2-first-run__title { font-size: 24px; } +.app.m .v2-first-run__skip { height: 44px; align-self: flex-start; padding-left: 0; } +.app.m .v2-first-run__setup, .app.m .v2-first-run__hello { height: 44px; font-size: 14px; } +/* activity: the live v2-activity__* names. Rows are a list; marks are 16px icons; acts follow the Direction A bar. */ +.v2-activity { width: 100%; max-width: 860px; margin: 0 auto; display: flex; flex-direction: column; gap: 14px; min-width: 0; } +.v2-activity__controls { display: flex; align-items: center; gap: 10px; } +.v2-activity__compose { display: grid; gap: 8px; padding: 12px 14px; border-radius: 12px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); } +.v2-activity__compose-top { display: flex; align-items: center; gap: 8px; font: 500 12px/1 var(--f-mono); color: var(--mu); } +.v2-activity__compose-picker-button { all: unset; box-sizing: border-box; cursor: pointer; display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 8px; border-radius: 8px; font: 600 12.5px/1 var(--f-body); color: var(--ink); box-shadow: inset 0 0 0 1px var(--d); } +.v2-activity__compose-picker-button svg.i { width: 14px; height: 14px; color: var(--mu); } +.v2-activity__compose-field { min-height: 40px; padding: 8px 10px; border-radius: 9px; background: var(--p); box-shadow: inset 0 0 0 1px var(--d); font-size: 13.5px; color: var(--ph); } +.v2-activity__compose-foot { display: flex; align-items: center; justify-content: space-between; } +.v2-activity__compose-hint { font: 500 11.5px/1 var(--f-mono); color: var(--mu); } +.v2-activity__compose .b-p[disabled] { opacity: .45; cursor: default; } +.v2-activity__section-heading { display: flex; align-items: center; gap: 8px; margin-top: 4px; } +.v2-activity__section-heading h2 { margin: 0; font: 700 15px/1.2 var(--f-display); letter-spacing: -0.01em; color: var(--ink); } +.v2-activity__count { display: inline-grid; place-items: center; min-width: 20px; height: 18px; padding: 0 5px; border-radius: 9px; background: var(--c); color: var(--on-c); font: 600 11px/1 var(--f-mono); } +.v2-activity__hint { font: 500 11.5px/1 var(--f-mono); color: var(--mu); } +.v2-activity__queue { border-radius: 12px; box-shadow: inset 0 0 0 1px var(--d); background: var(--sf); overflow: hidden; } +.v2-activity__queue-row { display: grid; grid-template-columns: 28px minmax(0, 1fr) auto; gap: 12px; align-items: start; padding: 12px 14px; border-top: 1px solid var(--d); } +.v2-activity__queue-row:first-child { border-top: 0; } +.v2-activity__queue-mark { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%; } +.v2-activity__queue-mark svg.i { width: 16px; height: 16px; } +.v2-activity__queue-mark--agent { color: var(--c-text); background: var(--c-soft); } +.v2-activity__queue-mark--human { color: var(--se); background: var(--t); box-shadow: inset 0 0 0 1px var(--d); } +.v2-activity__queue-copy { display: grid; gap: 3px; min-width: 0; } +.v2-activity__queue-kind { font: 500 11px/16px var(--f-mono); color: var(--mu); } +.v2-activity__queue-copy strong { font-size: 14px; line-height: 1.35; color: var(--ink); font-weight: 600; } +.v2-activity__queue-detail { font-size: 13px; line-height: 1.45; color: var(--se); } +.v2-activity__queue-actions { display: flex; align-items: center; gap: 6px; } +.v2-activity__options { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; } +.v2-activity__option-note { font-size: 12px; line-height: 1.4; color: var(--mu); margin-top: 2px; } +.v2-activity__option-note b { font: 500 11px/1 var(--f-mono); color: var(--c-text); } +.v2-activity__moved-list { display: grid; gap: 10px; } +.v2-activity__moved-group { border-radius: 12px; box-shadow: inset 0 0 0 1px var(--d); background: var(--sf); } +.v2-activity__moved-head { display: flex; justify-content: space-between; padding: 9px 14px; font: 500 11.5px/1 var(--f-mono); color: var(--mu); border-bottom: 1px solid var(--d); } +.v2-activity__moved-line { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto; gap: 10px; padding: 8px 14px; font-size: 13px; line-height: 1.4; color: var(--se); } +.v2-activity__moved-line strong { color: var(--ink); font-weight: 600; } +.v2-activity__moved-more { padding: 4px 14px 10px; font: 500 11.5px/1 var(--f-mono); color: var(--mu); } +.v2-activity__moved-line time { font: 500 11px/1.6 var(--f-mono); color: var(--mu); } +.v2-activity__empty { padding: 18px 14px; border-radius: 12px; box-shadow: inset 0 0 0 1px var(--d); background: var(--sf); font-size: 13.5px; color: var(--se); } +.v2-activity__start { border-radius: 12px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); } +.v2-activity__start-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--d); } +.v2-activity__start-head h2 { margin: 0; font: 700 15px/1.2 var(--f-display); color: var(--ink); } +.v2-activity__start-kicker { font: 500 11.5px/1 var(--f-mono); color: var(--mu); } +.v2-activity__start-row { display: grid; grid-template-columns: 28px minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 12px 14px; border-top: 1px solid var(--d); } +.v2-activity__start-head + .v2-activity__start-row { border-top: 0; } +.v2-activity__start-num { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%; background: var(--sf); box-shadow: inset 0 0 0 1px var(--b); font: 600 12px/1 var(--f-mono); color: var(--se); } +.v2-activity__start-copy { display: grid; gap: 2px; min-width: 0; } +.v2-activity__start-copy strong { font-size: 14px; color: var(--ink); } +.v2-activity__start-copy p { margin: 0; font-size: 13px; line-height: 1.45; color: var(--se); } +.v2-activity__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-activity { gap: 12px; } +.app.m .v2-activity__queue-row { grid-template-columns: 28px minmax(0, 1fr); } +.app.m .v2-activity__queue-actions { grid-column: 2; flex-wrap: wrap; } +.app.m .v2-activity__queue-actions .b { height: 44px; } +.app.m .v2-activity__queue-actions .ib { width: 44px; } +.app.m .v2-activity__queue-actions > .b-p, .app.m .v2-activity__queue-actions > .b-s:not(.ib) { flex: 1 1 100%; } +.app.m .v2-activity__options { flex-direction: column; } +.app.m .v2-activity__options .b { width: 100%; height: 44px; } +.app.m .v2-activity__start-row { grid-template-columns: 28px minmax(0, 1fr); } +.app.m .v2-activity__start-act { grid-column: 2; } +.app.m .v2-activity__start-act .b { height: 44px; width: 100%; } +.app.m .v2-activity__start-head { flex-direction: column; align-items: flex-start; gap: 4px; } +.app.m .v2-activity__error { flex-direction: column; align-items: stretch; } +.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; }

Same look. Less said.

  • One screen firstRepeated blocks become a table; rare settings collapse.
  • @@ -861,6 +963,65 @@

    Same look. Less said.

    +
    +

    First run

    /v2/pods/:id · Scout welcome + Guide dialog
    helper words welcome – → 16dialog – → 68scroll 390 – → 1.0×
    +
    +
    Scout welcome · 1440new pod, first message
    NWNorthwind1now
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Needs you 0
    Agents 1
    Files 0
    Who can join
    +
    Dialog · waiting · 1440step 2 not connected yet
    NWNorthwind1now
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Needs you 0
    Agents 1
    Files 0
    Who can join
    +
    +
    +
    Dialog · connected · 1440steps 1–2 done
    NWNorthwind1now
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Needs you 0
    Agents 1
    Files 0
    Who can join
    +
    Dialog · hello failed · 1440room did not open
    NWNorthwind1now
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Needs you 0
    Agents 1
    Files 0
    Who can join
    +
    +
    +
    Scout welcome · 390
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Pods
    Needs you
    Team
    Settings
    +
    Dialog · waiting · 390
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Pods
    Needs you
    Team
    Settings
    +
      +
    • Two doors, one pod. Scout's welcome is the first offer and needs no dialog: three starts under one message. Run an agent here is the one ink key; the other two are bordered. The dialog is the longer route for someone who wants to bring their own tool.
    • +
    • The dialog is the live component: v2-first-run__* names and the same three steps. Marks that were unicode (✓, ↗) become 16px icons. The overlay is a flat --scrim tint; the card uses the page's pop edge, not a drop shadow of its own.
    • +
    • Connected is the only cobalt: the step-1 and step-2 marks and the word Connected. The waiting line pulses its dot, the same cue as the Bring-your-own handoff.
    • +
    • At 390 the card is inset 12px, Skip for now and every act are 44px, and the steps scroll inside the card.
    • +

    Each state, one line

    + + + + + +
    Scout welcomeStarts stay until this person sends that start. Run an agent here runs in place for the pod's creator and disappears once they hold a hosted agent; others open Bring your own.
    Dialog · waitingStep 3 is disabled. If the status check fails, the waiting line is replaced by "Connection status is temporarily unavailable. We'll keep checking." in the error style.
    Dialog · connectedSteps 1–2 show the cobalt check; Say hello is the one ink key. While the 1:1 opens, the key reads "Opening…" and is disabled.
    Dialog · hello failed"Could not open your 1:1 yet. Try again." under the key, alert glyph first. The key stays live.
    Not auto-shownOpens from Feedback › Guide, or from the persisted first-run latch. Skip closes it and keeps the welcome underneath.
    +
    +
    +
    Dialog · connected · 390
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Pods
    Needs you
    Team
    Settings
    +
    Dialog · hello failed · 390
    Northwind
    Scoutguide · now

    I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.

    Beta: 1 hosted agent per account, 50 turns a day.

    Message Northwind
    Pods
    Needs you
    Team
    Settings
    +
    +
    + +
    +

    Activity

    /v2/activity
    helper words queue – → 92empty – → 65scroll 390 – → 1.1×
    +
    +
    Needs you + moved · 1440four kinds of ask

    Activity

    4 need you · 7 moved
    Post in
    Write a message. Mention an agent to wake it…
    ⌘↵ to send

    Needs you

    4oldest waiting first
    northwind · 4m
    Kai wants to merge #482 into mainBranch passes checks; this needs your OK.
    northwind · 11m
    Which launch week should the beta open?Recommended · Gives QA a full week after the checklist closes.
    support · 26m
    DanaCan you check whether the Slack bot is posting to the wrong channel?
    docs · 1h
    Ivy handed off the install guideDraft is in the pod; needs a human pass on the screenshots.

    Moved forward

    grouped by pod · newest first
    northwind5
    KaiOpened #482: retry the webhook on a 502.
    IvyPosted the checklist draft to the pod.
    3 more in northwind
    +
    Empty · get started · 1440before the first ask

    Activity

    0 need you · 0 moved

    Get started

    3 steps · until your first ask arrives
    1
    Hire your first agent

    Pick a persona. It gets a seat in this workspace and answers when you @mention it.

    2
    Say something to it

    @mention it in the pod where it lives. Your first message there is the moment this becomes yours.

    3
    Connect a channel

    Slack or Telegram — the agent answers where your team already talks.

    Needs you

    Nothing needs you.

    Moved forward

    grouped by pod · newest first
    Nothing yet today.
    +
    +
    +
    Load failed · 1440queue could not load

    Activity

    +
      +
    • One page, two questions. Needs you first, oldest waiting at the top; Moved forward below, grouped by pod. The window (Today / 7 days) and the pod scope are the only controls and sit in the head.
    • +
    • The kind is a 16px mark, never a word. The mark colour says who is asking: an agent is cobalt, a person is tint. The pod and the age ride a mono kicker above the title.
    • +
    • Only the deciding act is a word. Approve, the first decision option and Mark handled are the one ink key; the other options and Reply are bordered. Deny, Mark handled on a mention and Open are 32px icon keys with a title and aria-label.
    • +
    • At 390 each row stacks: copy first, then the acts, with every act 44px and the decision options full width. The compose card moves to the pod thread, so the page starts at the queue; Moved forward follows below the fold.
    • +

    Each state, one line

    + + + + +
    Needs you + movedCount chip is the live queue length; "oldest waiting first" is the hint. A ruled decision collapses to "✓ Kai ruled: …" with Open only.
    Empty · get startedShows only until the first ask has ever arrived. Step 1 is the one ink key; finished steps drop out and the kicker counts the rest.
    Load failedThe head and controls stay. One line and Retry; nothing else renders, and the rail badge keeps its last count.
    Reply openThe Reply key swaps for a two-row field with Send; the row grows, nothing else moves.
    +
    +
    +
    Needs you + moved · 390

    Activity

    4 need you · 7 moved

    Needs you

    4oldest waiting first
    northwind · 4m
    Kai wants to merge #482 into mainBranch passes checks; this needs your OK.
    northwind · 11m
    Which launch week should the beta open?Recommended · Gives QA a full week after the checklist closes.
    support · 26m
    DanaCan you check whether the Slack bot is posting to the wrong channel?
    Pods
    3Needs you
    Team
    Settings
    +
    Empty · get started · 390

    Activity

    0 need you · 0 moved

    Get started

    3 steps · until your first ask arrives
    1
    Hire your first agent

    Pick a persona. It gets a seat in this workspace and answers when you @mention it.

    2
    Say something to it

    @mention it in the pod where it lives. Your first message there is the moment this becomes yours.

    3
    Connect a channel

    Slack or Telegram — the agent answers where your team already talks.

    Needs you

    Nothing needs you.
    Pods
    3Needs you
    Team
    Settings
    +
    Load failed · 390

    Activity

    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 666801470..1fcf24d21 100644 --- a/docs/design/artboards/d215/targets.json +++ b/docs/design/artboards/d215/targets.json @@ -69,6 +69,62 @@ }, "byo-handoff-390": { "helperWords": 106, - "innerRatio": 1.52 + "innerRatio": 1.31 + }, + "firstrun-welcome-1440": { + "helperWords": 16, + "innerRatio": 1 + }, + "firstrun-waiting-1440": { + "helperWords": 68, + "innerRatio": 1 + }, + "firstrun-connected-1440": { + "helperWords": 62, + "innerRatio": 1 + }, + "firstrun-error-1440": { + "helperWords": 62, + "innerRatio": 1 + }, + "firstrun-welcome-390": { + "helperWords": 12, + "innerRatio": 1 + }, + "firstrun-waiting-390": { + "helperWords": 64, + "innerRatio": 1 + }, + "firstrun-connected-390": { + "helperWords": 58, + "innerRatio": 1 + }, + "firstrun-error-390": { + "helperWords": 58, + "innerRatio": 1 + }, + "activity-queue-1440": { + "helperWords": 92, + "innerRatio": 1 + }, + "activity-empty-1440": { + "helperWords": 65, + "innerRatio": 1 + }, + "activity-error-1440": { + "helperWords": 0, + "innerRatio": 1 + }, + "activity-queue-390": { + "helperWords": 41, + "innerRatio": 1.09 + }, + "activity-empty-390": { + "helperWords": 57, + "innerRatio": 1 + }, + "activity-error-390": { + "helperWords": 0, + "innerRatio": 1 } }