diff --git a/docs/reference/tokens.md b/docs/reference/tokens.md
index ac319e7..e8ea311 100644
--- a/docs/reference/tokens.md
+++ b/docs/reference/tokens.md
@@ -764,25 +764,103 @@ Two things that cost time and are recorded so they do not cost it again:
---
-## 12. Button roles — `T3.5`
+## 12. Button roles — `A5`, built at `T3.5`
-Reserved. `T3.5`'s fifth done-when is "button roles are documented in
-`docs/reference/tokens.md`"; it fills this section in with the four roles (primary, secondary,
-tertiary, destructive) and the mapping of every existing button class to one of them.
+**251 buttons across the 7 pages**, counted in the browser with every wizard step, creator
+section and tool panel forced visible — two thirds of them are `display: none` at load and a
+static grep misses them entirely.
-Inventory for it to start from — the button classes that exist today, and the two green
-action buttons `A5` names:
+### The four roles
-| Sheet | Classes | Green action? |
-|---|---|---|
-| `console.css` | `button`, `button.primary`, `button.danger`, `button.mini` | no |
-| `work-package-suite-styles.css` | `.add-btn`, `.nav-btn`, `.nav-btn.primary`, `.comments-toggle`, `.header-button` | **yes — `.nav-btn.primary` is `--success` `#198038`** (`:492-498`) |
-| `wp-creation-styles.css` | `.btn`, `.btn-ghost`, `.btn-primary`, `.btn-generate`, `.use-btn`, `.add-btn`, `.add-btn-gate`, `.row-del`, `.mode-btn`, `.link-btn`, `.wp-nav-cta` | **yes — `.btn-generate` and `.use-btn` are `--accent-green`** (`:264 :445`) |
-| `theme-light.css` | `.wp-appbar-btn`, `.wp-appbar-btn.primary` | no |
-| `index.html` inline | `.card-button`, `.comments-toggle`, `.submit-btn`, `.close-btn` | **yes — `.card.complete .card-button`** (`:125-126`) |
+Defined once, in `theme-light.css`, as `--wp-btn-*`. No fifth role exists.
-Three green-action sites, not two. `Save & View` and `SOP Complete` are the two the review
-named; the launcher's completed-SOP card button is the third and is the same defect.
+| Role | Looks like | For | Tokens |
+|---|---|---|---|
+| **primary** | filled accent, white text | the one action the screen exists for; at most one per view | `--wp-btn-primary-bg/-fg/-hover/-active` |
+| **secondary** | white fill, `--border-strong` hairline, accent on hover | every other real action — the app's workhorse | `--wp-btn-secondary-bg/-fg/-border/-hover-fg` |
+| **tertiary** | no fill, no border, accent text | navigating or undoing | `--wp-btn-tertiary-fg/-hover-fg` |
+| **danger** | outlined red; filled red only where a control is too small for an outline to read | destructive | `--wp-btn-danger-fg/-border/-soft-bg/-fill-bg/-fill-fg` |
+
+### Green is a status colour
+
+It says *cleared*, *ready*, *complete* — on a dot, a pill, a banner, a badge — and it never
+fills a button. That was the second button language `A5` recorded: `Save & View` and `SOP
+Complete` shouted louder than every other action in the suite while doing nothing more
+dangerous than saving a form.
+
+The green did not go anywhere. `.cstatus button.on-cleared`, `.toggle-btn.enabled`,
+`.wp-nav-dot.ok`, `.rb-ready`, `.badge-R`, `.auto-tag` and the launcher card's left border and
+`.card-status` all still carry it — every one of them a state rather than an action.
+
+### Every button class, mapped
+
+| Class | Role | Where | Changed at `T3.5`? |
+|---|---|---|---|
+| `button` (bare) | secondary | console | tokens only |
+| `button.primary` | primary | console | tokens only |
+| `button.danger`, `button.mini.danger` | danger, outlined | console | tokens only |
+| `button.mini` | secondary | console | — |
+| `.add-btn` | primary | wizard | tokens only |
+| `.nav-btn` | secondary | wizard | tokens only |
+| `.nav-btn.primary` | **primary** | wizard — `SOP complete` | **was green** |
+| `.seq-del` | danger, filled | wizard — a 28px ✕ | tokens only |
+| `.comments-toggle` | secondary | wizard | — |
+| `.header-button`, `.wp-appbar-btn` | secondary on a dark bar | theme | — |
+| `.btn.btn-primary` | primary | creator | tokens only |
+| `.btn.btn-generate` | **primary** | creator — `Save & view` | **was green** |
+| `.use-btn` | **primary** | creator | **was green** |
+| `.btn.btn-ghost` | secondary | creator | tokens only |
+| `.add-btn` (creator) | secondary, dashed | creator | uppercase removed |
+| `.add-btn-gate` | secondary, amber | creator — adds a QC hold | — |
+| `.row-del` | danger, outlined on hover | creator | tokens only |
+| `.wp-nav-cta`, `.wp-nav-cta-more` | primary | creator navigator | tokens only |
+| `.link-btn`, `.lock-edit`, `.cmt-jump` | tertiary | creator | tokens only |
+| `.mode-btn.active` | primary | creator | — |
+| `.cstatus button.on-*` | **status, not a role** | creator — Open / Cleared / N/A | — |
+| `.card-button` | primary | launcher | — |
+| `.card.complete .card-button` | **primary** | launcher | **was green** |
+| `.submit-btn`, `.comments-toggle` | primary | launcher | — |
+| `.close-btn` | secondary | launcher | — |
+| `.wpc-foot-btn` | secondary | shared chrome | tokens only |
+| `.wpc-clear`, `.comments-dropdown-close`, `.modal-close`, `.cmt-x`, `.wp-sidenav-close` | tertiary | everywhere | — |
+| `.wp-navbtn`, `.wp-nav-toggle`, `.wp-sidenav-link`, `.wp-nav-link`, `.wp-nav-item` | tertiary | drawers and rails | — |
+| `.ui-help-fab` | primary | help centre | out of scope — BL-004 |
+| `.dev-toggle` | deliberately invisible | creator | — |
+
+Four green action sites, not the two `A5` names. `.use-btn` and the launcher's completed-SOP
+card button never render green in the default fixture, so the review could not have seen them.
+
+### Sentence case
+
+Applied to **buttons and field labels only**, which is what `A5` scopes it to.
+
+The rule: *first word capitalised, everything after it lowercased, except acronyms* (`SOP`,
+`QC`, `WP`, `UPN`, `PM`, `APM`, `CM`, `QM`, `PDF`, `JSON`, `CSV`, `BIM`, `MIMO`) *and external
+proper nouns* (`Excel`, `Acumatica`). Page names get sentence case too when they appear inside
+a sentence-shaped label — "Open the user directory", not "Open the User Directory" — because
+the label is a description, not a title.
+
+- **~30 button labels** rewritten across the launcher, wizard, creator, admin and two scripts.
+- **46 field labels** rewritten. Labels carrying markup — a `.req` asterisk, a `.help-tip`
+ chip — had only their text nodes transformed, so the markup survives and "first word" means
+ the first word of the label rather than of each fragment.
+- **`text-transform: uppercase` removed from four rules**: `.btn` and `.add-btn` (creator
+ buttons) and `label` and `.cmt-namebar label` (creator field labels). The mono face, the
+ 10px size and the tracking are the creator's idiom and are untouched — only the forced
+ uppercase goes.
+- **`help.js` was updated too.** It names `Load Sample` and `SOP Complete` in prose, so
+ renaming the buttons without it would have left the help centre describing controls that no
+ longer exist.
+
+### Not touched, deliberately
+
+| What | Why |
+|---|---|
+| `console.css` `.card h2` uppercase | `T3.5` says explicitly not to. Confirmed by diff: the only changes to `console.css` in this task are token substitutions, none of them on `.card h2`. |
+| `table.grid th`, `.wp-types-header`, `.dash-table th` | table headers, not buttons or field labels |
+| `.section-label`, `.sub-heading`, `.wpc-proj-kicker`, `.wpc-pop-head`, `.wp-sidenav-sect` | section eyebrows and headings |
+| `.step-tab` uppercase | a stepper tab is neither a button nor a field label, and the stepper is rebuilt at `T7.x`. Logged as **BL-015**. |
+| `.nav-tab` labels (`SOP Configuration`, `Work Package Creation`) | these name the two tools rather than describing an action; they read as titles and are the same strings the launcher cards use. |
---
diff --git a/docs/waves/backlog.md b/docs/waves/backlog.md
index ffc24a7..3568808 100644
--- a/docs/waves/backlog.md
+++ b/docs/waves/backlog.md
@@ -179,7 +179,7 @@ deliberately deferred.
the four token systems collapse to one.
- **Why not now:** swapping it changes a rendered fill, which `T3.2` forbids. It is the same
conversation as the green action buttons.
-- **Suggested wave or follow-up:** `T3.5`, with `A5`. See `docs/reference/tokens.md` §8-E.
+- **Suggested wave or follow-up:** wave 9, with `C4`. `T3.5` is scoped to buttons; this is a field fill. See `docs/reference/tokens.md` §8-E.
### BL-009 — A ninth amber, four points from the eighth
@@ -191,7 +191,7 @@ deliberately deferred.
was missed by the `T3.1` inventory, which is why it survived this long.
- **Why not now:** merging it moves a rendered colour, which `T3.2` forbids. `T3.2` named it
`--wp-status-warning-text-alt` so it is visible rather than hidden in a hex.
-- **Suggested wave or follow-up:** `T3.5`. See `docs/reference/tokens.md` §8-K.
+- **Suggested wave or follow-up:** wave 9, with `C4`. `T3.5` is scoped to buttons; this is a status pill. See `docs/reference/tokens.md` §8-K.
### BL-010 — 829 raw spacing, type and radius values remain inside rules
@@ -254,6 +254,16 @@ deliberately deferred.
rebuild. The fix is the ring `T3.4` established: `outline: 2px solid var(--cds-focus);
outline-offset: -2px`, which `console.css`, `wp-chrome.css` and now the wizard all use.
+### BL-015 — The creator's stepper tabs are still forced uppercase
+
+- **Found during:** T3.5
+- **Where:** `html/wp-creation-styles.css:105` (`.step-tab`)
+- **What:** `A5` scopes sentence case to buttons and field labels, and `T3.5` removed the
+ forced uppercase from both. `.step-tab` is neither — it is a stepper tab — so it was left,
+ and it is now the only uppercase interactive text on the page.
+- **Why not now:** out of `A5`'s stated scope, and `A4`/`S9` rebuild the stepper.
+- **Suggested wave or follow-up:** `T7.x`, with the stepper rebuild.
+
### BL-014 — Four controls fall back to the browser's default focus ring
- **Found during:** T3.4
diff --git a/html/admin.html b/html/admin.html
index 8adae4f..87cbf03 100644
--- a/html/admin.html
+++ b/html/admin.html
@@ -95,7 +95,7 @@
User Directory page. They moved because user administration is no longer
admin-only: a Project Super User creates and manages the accounts on the
projects they administer, and they must never be sent through this console to do it.
-
The SOP is the project baseline. Walk the 10 steps with ← Back / Next →, or jump using the step indicators. The final step is ✓ SOP Complete — saving it unlocks the Work Package Creator and turns the home-page card green.
+
The SOP is the project baseline. Walk the 10 steps with ← Back / Next →, or jump using the step indicators. The final step is ✓ SOP complete — saving it unlocks the Work Package Creator and turns the home-page card green.
Project Basics — name, number, client, division/sector, site. Inherited by every WP.
Project Team Leadership — PM, APM, CM, QM, plus any additional members (+ Add Team Member).
⭐ Load Sample is context-aware: on the SOP tab it loads a complete sample SOP; on the WP tab it loads an example Work Package. Great for learning the tool or demoing.
+
Load sample
+
⭐ Load sample is context-aware: on the SOP tab it loads a complete sample SOP; on the WP tab it loads an example Work Package. Great for learning the tool or demoing.
Import / Export
Work Packages — ⤓ Export (JSON) downloads all saved packages; import restores them.
The SOP for the active project isn't complete yet. Finish SOP Configuration and click ✓ SOP Complete on the last step; the Creator unlocks and the home card turns green.
+
The SOP for the active project isn't complete yet. Finish SOP Configuration and click ✓ SOP complete on the last step; the Creator unlocks and the home card turns green.
Why can't I set a package to Issued?
At least one constraint is still Open. Clear or mark N/A every constraint — the release banner turns green — and the suite will offer to issue it.
My package's materials didn't all carry over when I split it.
diff --git a/html/index.html b/html/index.html
index b770de0..9490c8e 100644
--- a/html/index.html
+++ b/html/index.html
@@ -122,8 +122,10 @@
.card.complete {
border-left-color: var(--cds-support-success);
}
- .card.complete .card-button { background: var(--cds-support-success); }
- .card.complete .card-button:hover { background: var(--wp-hover-success); }
+ /* A5: the card-button stays primary when the SOP completes. The completion
+ is still said, twice — the card's left border turns green and .card-status
+ appears — which is green doing its job as a status rather than as an
+ action colour. */
.card-status {
display: inline-block;
font-size: 12px;
@@ -350,42 +352,42 @@
No projects yet. Create your first project, or start from a sample.
-
-
+
+
` + createFormHtml();
return;
diff --git a/html/theme-light.css b/html/theme-light.css
index 63727ad..725621b 100644
--- a/html/theme-light.css
+++ b/html/theme-light.css
@@ -279,6 +279,48 @@
--wp-dev-fg: #ffd479;
--wp-dev-rule: #ffb000;
+ /* -- button roles (A5) -----------------------------------------------------
+ Four roles and no fifth. Every button in the app is one of them, and the
+ class-to-role mapping is in docs/reference/tokens.md section 12.
+
+ primary the one action this screen exists for. Filled accent. At most one
+ per view.
+ secondary every other real action. White fill, --border-strong hairline,
+ accent on hover. This is the app's workhorse.
+ tertiary navigational or undoing. No fill, no border, accent text.
+ danger destructive. Outlined red by default; filled red only where the
+ control is small enough that an outline would not read (the ✕ on
+ a sequence row).
+
+ GREEN IS A STATUS COLOUR AND NEVER FILLS A BUTTON. It says cleared, ready,
+ complete — on a dot, a pill, a banner, a badge. Two buttons broke that rule
+ and are what A5 recorded: "SOP Complete" and "Save & View" shouted louder
+ than every other action in the suite while doing nothing more dangerous than
+ saving. They are primary now. The green did not go anywhere: the launcher
+ card still turns green when its SOP completes, on the border and the status
+ line, which is where a status belongs.
+
+ No value here is new — these are the fills the sheets already rendered,
+ given one definition so that "primary" means one thing. */
+ --wp-btn-primary-bg: var(--cds-interactive-01);
+ --wp-btn-primary-fg: var(--cds-text-on-color);
+ --wp-btn-primary-hover: var(--cds-hover-primary);
+ --wp-btn-primary-active: var(--cds-active-primary);
+
+ --wp-btn-secondary-bg: var(--cds-field);
+ --wp-btn-secondary-fg: var(--cds-text-primary);
+ --wp-btn-secondary-border: var(--cds-border-strong);
+ --wp-btn-secondary-hover-fg: var(--cds-interactive-01);
+
+ --wp-btn-tertiary-fg: var(--cds-interactive-01);
+ --wp-btn-tertiary-hover-fg: var(--cds-hover-primary-text);
+
+ --wp-btn-danger-fg: var(--cds-support-error);
+ --wp-btn-danger-border: var(--cds-support-error);
+ --wp-btn-danger-soft-bg: var(--wp-status-error-bg);
+ --wp-btn-danger-fill-bg: var(--cds-support-error);
+ --wp-btn-danger-fill-fg: var(--cds-text-on-color);
+
/* -- the second blue -------------------------------------------------------
#2563d6, not #0f62fe. Fills .sop-inherited — every field a work package
inherited from its SOP — at 7% alpha, which is why nobody has noticed a
diff --git a/html/work-package-suite-app.js b/html/work-package-suite-app.js
index eb1c6b3..a8bbedc 100644
--- a/html/work-package-suite-app.js
+++ b/html/work-package-suite-app.js
@@ -693,7 +693,7 @@ function renderWPTypes(){
});
const addRow = document.createElement('div');
addRow.style.cssText = 'margin-top:0.85rem;';
- addRow.innerHTML = ``;
+ addRow.innerHTML = ``;
container.appendChild(addRow);
}
diff --git a/html/work-package-suite-styles.css b/html/work-package-suite-styles.css
index 0c41bde..1a9398c 100644
--- a/html/work-package-suite-styles.css
+++ b/html/work-package-suite-styles.css
@@ -491,11 +491,12 @@ body.embed-full { overflow: hidden; }
margin-bottom: 0.5rem;
}
-/* BUTTONS */
+/* BUTTONS — roles are documented in docs/reference/tokens.md section 12 (A5) */
+/* primary */
.add-btn {
padding: 0.7rem 1.25rem;
- background: var(--primary);
- color: var(--cds-text-on-color);
+ background: var(--wp-btn-primary-bg);
+ color: var(--wp-btn-primary-fg);
border: none;
border-radius: 0;
font-size: 14px;
@@ -504,29 +505,33 @@ body.embed-full { overflow: hidden; }
transition: background 0.2s;
}
-.add-btn:hover { background: var(--cds-hover-primary); }
+.add-btn:hover { background: var(--wp-btn-primary-hover); }
+/* secondary */
.nav-btn {
padding: 0.7rem 1.4rem;
- background: var(--bg-card);
- border: 1px solid var(--border-strong);
+ background: var(--wp-btn-secondary-bg);
+ border: 1px solid var(--wp-btn-secondary-border);
border-radius: 0;
font-size: 14px;
font-weight: 600;
- color: var(--text);
+ color: var(--wp-btn-secondary-fg);
cursor: pointer;
transition: all 0.15s;
}
-.nav-btn:hover { border-color: var(--primary); color: var(--primary); background: var(--bg); }
+.nav-btn:hover { border-color: var(--wp-btn-secondary-hover-fg); color: var(--wp-btn-secondary-hover-fg); background: var(--bg); }
+/* A5: this was green — the loudest control in the suite, on a button whose job
+ is to save a form. The completion it announced is still announced, on the
+ launcher card's border and status line, which is where a status belongs. */
.nav-btn.primary {
- background: var(--success);
- color: var(--cds-text-on-color);
- border-color: var(--success);
+ background: var(--wp-btn-primary-bg);
+ color: var(--wp-btn-primary-fg);
+ border-color: var(--wp-btn-primary-bg);
}
-.nav-btn.primary:hover { background: var(--wp-hover-success); border-color: var(--wp-hover-success); color: var(--cds-text-on-color); }
+.nav-btn.primary:hover { background: var(--wp-btn-primary-hover); border-color: var(--wp-btn-primary-hover); color: var(--wp-btn-primary-fg); }
.nav-btn:disabled { opacity: 0.5; cursor: not-allowed; }
@@ -584,8 +589,9 @@ body.embed-full { overflow: hidden; }
/* Fill only — the ring itself is the shared rule above, which this used to opt out
of entirely with a bare `outline: none`. */
.seq-step input.seq-label:focus { background: var(--bg); }
+/* danger, filled: a 28px square is too small for an outline to read */
.seq-del {
- background: var(--danger); color: var(--cds-text-on-color); border: none; border-radius: 4px;
+ background: var(--wp-btn-danger-fill-bg); color: var(--wp-btn-danger-fill-fg); border: none; border-radius: 4px;
width: 28px; height: 28px; cursor: pointer; font-weight: 600; flex-shrink: 0;
}
.seq-arrow { text-align: center; color: var(--text-dim); font-size: 13px; line-height: .4; margin: -2px 0; }
diff --git a/html/work-package-suite.html b/html/work-package-suite.html
index f53ad98..ebb1cf0 100644
--- a/html/work-package-suite.html
+++ b/html/work-package-suite.html
@@ -30,7 +30,7 @@
-
+
1 / 10
@@ -83,23 +83,23 @@
Define the core project information that will be inherited by all Work Packages.
-
+
-
+
-
+
-
+
-
+
@@ -115,27 +115,27 @@
-
+
-
+
-
+
Kept on the distribution list of every work package by default.
-
+
Additional Team Members (optional)
-
+
@@ -162,7 +162,7 @@
Optional Additional Roles
-
+
@@ -174,7 +174,7 @@
@@ -187,12 +187,12 @@
Define how Work Packages are formatted, sized, and issued on this project. The choices here decide how the Work Package Creator behaves for every package.
-
+
Use ## for counter, [Sector] [TYPE] as variables
-
+
@@ -373,7 +373,7 @@
Work Package Creation
Complete the SOP Configuration first to enable Work Package creation. Once the SOP is finished, the full creator loads here with your project defaults pre-populated.
-
+
@@ -206,16 +206,16 @@
Scope & Worki
-
+
Enter the work as ordered steps — added in sequence, the way the crew performs them.
-
+
-
+
-
+
@@ -230,9 +230,9 @@
Structured bill of materials. Feeds kitting and the delivery forecast. Unit is from the Acumatica unit list.
Qty
Unit
Description
Discipline
-
+
-
+
@@ -242,7 +242,7 @@
Drawings & Attachments
Document / Drawing
Rev
Link / Note
-
+
@@ -259,12 +259,12 @@
Kitting & Material Movement (MIMO)
-
+
-
-
-
scheduled material-move date & time
-
+
+
+
scheduled material-move date & time
+
@@ -279,12 +279,12 @@
Quality, Inspection & Hold Points
-
+
-
+
-
+
Inherited from the SOP. A Hold Point stops work until inspection sign-off; a Witness Point is offered for inspection but work may proceed if declined.
@@ -301,23 +301,23 @@
Closeout
Completed at QC / Closed — captures as-built reality and lessons learned.
-
-
+
+
-
-
+
+
-
-
+
+
-
+
Work Package Dashboard
@@ -332,8 +332,8 @@
-
-
+
+
@@ -343,8 +343,8 @@
Saved Work Packages
WP #
Type
Subject
Status
Ready?
-
-
+
+
@@ -361,7 +361,7 @@
-
+
@@ -381,12 +381,12 @@
Comment on this form
-
+
Comments are saved in your browser. Use Export to send feedback back; the owner can Import each file.
No projects yet. Create your first project, or start from a sample.