Commit 6478ced
feat(walkthrough): a first-visit tour built from this app's own menu (#484)
* feat(walkthrough): a first-visit tour built from this app's own menu
ADR-043. The app had no walkthrough, so a new user arrived on a shell with no
orientation at all.
Every step targets a route READ FROM THIS MANIFEST, never invented.
CnWalkthrough resolves target {kind: nav-item, ref} by querying
[data-cn-route=<ref>], which CnAppNav emits from the ROUTE - so a tour pointing
at a menu id that differs from its route still renders, as a centred anchorless
coachmark that points at nothing. Verified: every ref resolves to a page this
manifest declares.
Where a menu label is a translation KEY rather than a sentence, the copy uses
the key's last segment as a word. Printing launchpad.menu.dashboards at a user
is worse than useless, and falling back to the route gives 'Click
dashboard-detail in the menu' - an internal identifier read aloud.
Verified: manifest validates against schema 2.26.0, every target ref resolves,
and no raw translation key reaches the copy.
* fix(walkthrough): point the tour at flows, and translate its copy
gate-70 walkthrough-flows-stop - this app ships a flows page and no tour step
targeted it. The gate's own measurement is why it exists: across 20 manifests,
12 apps shipped a flows page and exactly ONE tour mentioned it, so the
automation surface was discoverable only by someone who already knew.
Detected the way the gate detects it - type:'flows' OR the migrated form, an
index over config.entitySource:'flows'. Matching on type alone would miss every
app the flow-page migration touched, which is all of them.
The step advances on route-match and sets allowManualNext. The same gate fails a
step advancing only on object-created: that turns 'here is where flows live'
into 'build an automation before you may continue', and a tour nobody can finish
is worse than one that never mentions flows.
gate-102 manifest-l10n-coverage - the tour's titles, bodies and tasks had no
l10n/nl.json key. Added, and the browser catalogue rebuilt where the app ships
one, because the browser reads nl.js rather than nl.json.
* style(walkthrough): drop the em-dash from the flows step
gate-96 (manifest-copy-style) fails this: voice.md section 8 is unambiguous —
no em-dashes, Conduction strips them fleet-wide.
The nl.json KEY is the English string, so it is renamed with it; leaving the
key behind would orphan the Dutch translation of a string that still ships.
The Dutch VALUE carried the same em-dash and gets the same treatment — the
gate only counts manifest strings, but it is the same user-facing sentence.
Note for a later sweep: this app's nl.json still holds 16 other em-dash
strings from Vue copy. They are outside this gate's scope (it reads manifest
strings) and outside this PR's.
* fix(l10n): refresh the browser catalogue after the em-dash rename
check:l10n-js reported 'Stale browser catalogue: l10n/nl.js'. Renaming the key
in nl.json without nl.js leaves the two halves of the same catalogue
disagreeing, and the runtime reads the .js one.
---------
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>1 parent c2d7977 commit 6478ced
3 files changed
Lines changed: 122 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
4 | 16 | | |
5 | 17 | | |
6 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
3 | 15 | | |
4 | 16 | | |
5 | 17 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
3 | 101 | | |
4 | 102 | | |
5 | 103 | | |
| |||
0 commit comments