@mohsinonxrm/pptb-commandbar-studio 0.8.0 → 0.9.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/CHANGELOG.md +578 -0
  2. package/README.md +82 -61
  3. package/dist/assets/BulkPublishModal-DjdSDcWe.js +36 -0
  4. package/dist/assets/CommandEditorPanel-DYsxUTOk.js +1 -0
  5. package/dist/assets/CommandPalette-DihgRpHI.js +1 -0
  6. package/dist/assets/CompareView-CdQo0D6e.js +7 -0
  7. package/dist/assets/CrmParameterEditor-DO6Rt764.js +1 -0
  8. package/dist/assets/EditorDrawer-Cid60F3b.js +2 -0
  9. package/dist/assets/HideInsteadOfDeleteModal-Bk_foggy.js +1 -0
  10. package/dist/assets/IconPickerModal-CW_pvpVS.js +1 -0
  11. package/dist/assets/ImportXmlModal-BcszuTi-.js +1 -0
  12. package/dist/assets/MonacoEditor-DweI16yt.js +2 -0
  13. package/dist/assets/NewButtonModal-C2fAUuZI.js +1 -0
  14. package/dist/assets/NewGroupModal-BDr4DPBs.js +1 -0
  15. package/dist/assets/NewTabModal-CYc1fc2A.js +1 -0
  16. package/dist/assets/RuleEditorPanel-BxGrJYo4.js +1 -0
  17. package/dist/assets/ScriptView-tkdIK4sg.js +1 -0
  18. package/dist/assets/TabDisplayRulesPanel-S_AxUWfB.js +1 -0
  19. package/dist/assets/TranslationsView-DZIGE2pC.js +1 -0
  20. package/dist/assets/WebResourceBrowser-Dc3kBMvH.js +1 -0
  21. package/dist/assets/XmlView-B0weY9hR.js +2 -0
  22. package/dist/assets/dnd-iy5K5XAJ.js +5 -0
  23. package/dist/assets/fluent-ui-CQyNN9H3.js +59 -0
  24. package/dist/assets/index-D5GCH8nj.css +1 -0
  25. package/dist/assets/index-DRTwBo4g.js +136 -0
  26. package/dist/assets/monaco-DQA8g3bM.css +1 -0
  27. package/dist/assets/monaco-cQE5XS3B.js +1010 -0
  28. package/dist/assets/monacoSetup-BIq1zGyP.js +1 -0
  29. package/dist/assets/preload-helper-PPVm8Dsz.js +1 -0
  30. package/dist/assets/ruleKinds-BKTUiZ1-.js +1 -0
  31. package/dist/assets/{server.browser-xEJRzS2D.js → server.browser-DTeSoizu.js} +1 -1
  32. package/dist/assets/useReplaceWebResourceConfirm-BhU1AM5L.js +1 -0
  33. package/dist/assets/useStableKeys-49o4VnxU.js +1 -0
  34. package/dist/assets/{xmlValidator-BkeotXuB.js → xmlValidator-CnbyWxHe.js} +2 -2
  35. package/dist/icons/icon.svg +11 -4
  36. package/dist/index.html +15 -11
  37. package/index.html +10 -4
  38. package/package.json +3 -1
  39. package/dist/assets/BulkPublishModal-mJ41AWew.js +0 -36
  40. package/dist/assets/CommandEditorPanel-BiP1kPHY.js +0 -1
  41. package/dist/assets/CommandPalette-q51_0qRZ.js +0 -1
  42. package/dist/assets/ConflictDrawer-CdWv_PbN.js +0 -1
  43. package/dist/assets/DiffViewer-BQP5f73U.js +0 -7
  44. package/dist/assets/HideInsteadOfDeleteModal-C9r6ah5p.js +0 -1
  45. package/dist/assets/IconPickerModal-B81Tnf5i.js +0 -1
  46. package/dist/assets/ImportXmlModal-C0cMaS59.js +0 -1
  47. package/dist/assets/LocalizationEditor-DniDtrZV.js +0 -1
  48. package/dist/assets/MonacoEditor-uzfuRCpJ.js +0 -2
  49. package/dist/assets/NewButtonModal-BXpX1Ld5.js +0 -1
  50. package/dist/assets/NewGroupModal-Bh7lXq52.js +0 -1
  51. package/dist/assets/NewTabModal-Pntdk3in.js +0 -1
  52. package/dist/assets/RuleEditorPanel-BUGKgc0N.js +0 -1
  53. package/dist/assets/ScalingEditorPanel-p3-Yw3CO.js +0 -1
  54. package/dist/assets/TabDisplayRulesPanel-CSNshwaw.js +0 -1
  55. package/dist/assets/UrlComposerModal-WKSTwUcW.js +0 -1
  56. package/dist/assets/WebResourceBrowser-BK-gVU2g.js +0 -1
  57. package/dist/assets/XmlDrawer-CQJElnD1.js +0 -2
  58. package/dist/assets/abap-DLDM7-KI.js +0 -1
  59. package/dist/assets/apex-DNDY2TF8.js +0 -1
  60. package/dist/assets/azcli-Y6nb8tq_.js +0 -1
  61. package/dist/assets/bat-BwHxbl9M.js +0 -1
  62. package/dist/assets/bicep-CFznDFnq.js +0 -2
  63. package/dist/assets/cameligo-Bf6VGUru.js +0 -1
  64. package/dist/assets/clojure-Dnu-v4kV.js +0 -1
  65. package/dist/assets/coffee-Bd8akH9Z.js +0 -1
  66. package/dist/assets/cpp-BbWJElDN.js +0 -1
  67. package/dist/assets/csharp-Co3qMtFm.js +0 -1
  68. package/dist/assets/csp-D-4FJmMZ.js +0 -1
  69. package/dist/assets/css-DdJfP1eB.js +0 -3
  70. package/dist/assets/css.worker-C_6RgliQ.js +0 -97
  71. package/dist/assets/cssMode-yNaVDuBb.js +0 -1
  72. package/dist/assets/cypher-cTPe9QuQ.js +0 -1
  73. package/dist/assets/dart-BOtBlQCF.js +0 -1
  74. package/dist/assets/dnd-Cq8OftAq.js +0 -5
  75. package/dist/assets/dockerfile-BG73LgW2.js +0 -1
  76. package/dist/assets/ecl-BEgZUVRK.js +0 -1
  77. package/dist/assets/elixir-BkW5O-1t.js +0 -1
  78. package/dist/assets/flow9-BeJ5waoc.js +0 -1
  79. package/dist/assets/fluent-icons-BqJj6rDi.js +0 -1
  80. package/dist/assets/fluent-ui-QADO660t.js +0 -43
  81. package/dist/assets/freemarker2-CzWSO7cF.js +0 -3
  82. package/dist/assets/fsharp-PahG7c26.js +0 -1
  83. package/dist/assets/go-acbASCJo.js +0 -1
  84. package/dist/assets/graphql-BxJiqAUM.js +0 -1
  85. package/dist/assets/handlebars-BpG2O9CH.js +0 -1
  86. package/dist/assets/hcl-DtV1sZF8.js +0 -1
  87. package/dist/assets/html-Bm7ESfBq.js +0 -1
  88. package/dist/assets/html.worker-CLyYFd_g.js +0 -474
  89. package/dist/assets/htmlMode--CmpAV7s.js +0 -1
  90. package/dist/assets/index-D9lerlVA.css +0 -1
  91. package/dist/assets/index-Di2_5czx.js +0 -136
  92. package/dist/assets/ini-Kd9XrMLS.js +0 -1
  93. package/dist/assets/java-CXBNlu9o.js +0 -1
  94. package/dist/assets/javascript-DYy3TIq5.js +0 -1
  95. package/dist/assets/json.worker-BggoxaER.js +0 -62
  96. package/dist/assets/jsonMode-DwsyQ3o1.js +0 -7
  97. package/dist/assets/julia-cl7-CwDS.js +0 -1
  98. package/dist/assets/kotlin-s7OhZKlX.js +0 -1
  99. package/dist/assets/less-9HpZscsL.js +0 -2
  100. package/dist/assets/lexon-OrD6JF1K.js +0 -1
  101. package/dist/assets/liquid-qkuWCPaY.js +0 -1
  102. package/dist/assets/lspLanguageFeatures-Cgd9CNvq.js +0 -4
  103. package/dist/assets/lua-Cyyb5UIc.js +0 -1
  104. package/dist/assets/m3-B8OfTtLu.js +0 -1
  105. package/dist/assets/markdown-BFxVWTOG.js +0 -1
  106. package/dist/assets/mdx-CtHfOclF.js +0 -1
  107. package/dist/assets/mips-CiqrrVzr.js +0 -1
  108. package/dist/assets/monaco-BIO15LCS.js +0 -1005
  109. package/dist/assets/monaco-DdLsZAcA.css +0 -1
  110. package/dist/assets/msdax-DmeGPVcC.js +0 -1
  111. package/dist/assets/mysql-C_tMU-Nz.js +0 -1
  112. package/dist/assets/objective-c-BDtDVThU.js +0 -1
  113. package/dist/assets/pascal-vHIfCaH5.js +0 -1
  114. package/dist/assets/pascaligo-DtZ0uQbO.js +0 -1
  115. package/dist/assets/perl-Ub6l9XKa.js +0 -1
  116. package/dist/assets/pgsql-BlNEE0v7.js +0 -1
  117. package/dist/assets/php-BBUBE1dy.js +0 -1
  118. package/dist/assets/pla-DSh2-awV.js +0 -1
  119. package/dist/assets/postiats-CocnycG-.js +0 -1
  120. package/dist/assets/powerquery-tScXyioY.js +0 -1
  121. package/dist/assets/powershell-COWaemsV.js +0 -1
  122. package/dist/assets/protobuf-Brw8urJB.js +0 -2
  123. package/dist/assets/pug-8SOpv6rk.js +0 -1
  124. package/dist/assets/python-CazlH6B-.js +0 -1
  125. package/dist/assets/qsharp-Bw9ernYp.js +0 -1
  126. package/dist/assets/r-j7ic8hl3.js +0 -1
  127. package/dist/assets/razor-BfGfB6aB.js +0 -1
  128. package/dist/assets/redis-Bu5POkcn.js +0 -1
  129. package/dist/assets/redshift-Bs9aos_-.js +0 -1
  130. package/dist/assets/restructuredtext-CqXO7rUv.js +0 -1
  131. package/dist/assets/ruby-zBfavPgS.js +0 -1
  132. package/dist/assets/ruleKinds-B9hACGaq.js +0 -1
  133. package/dist/assets/rust-BzKRNQWT.js +0 -1
  134. package/dist/assets/sb-BBc9UKZt.js +0 -1
  135. package/dist/assets/scala-D9hQfWCl.js +0 -1
  136. package/dist/assets/scheme-BPhDTwHR.js +0 -1
  137. package/dist/assets/scss-CBJaRo0y.js +0 -3
  138. package/dist/assets/shell-DiJ1NA_G.js +0 -1
  139. package/dist/assets/solidity-Db0IVjzk.js +0 -1
  140. package/dist/assets/sophia-CnS9iZB_.js +0 -1
  141. package/dist/assets/sparql-CJmd_6j2.js +0 -1
  142. package/dist/assets/sql-ClhHkBeG.js +0 -1
  143. package/dist/assets/st-CHwy0fLd.js +0 -1
  144. package/dist/assets/swift-CnmFD0ga.js +0 -1
  145. package/dist/assets/systemverilog-Bs9z6M-B.js +0 -1
  146. package/dist/assets/tcl-Dm6ycUr_.js +0 -1
  147. package/dist/assets/tsMode-BZv6gTt6.js +0 -11
  148. package/dist/assets/twig-Csy3S7wG.js +0 -1
  149. package/dist/assets/typescript-BgDL1fzP.js +0 -1
  150. package/dist/assets/typespec-Btyra-wh.js +0 -1
  151. package/dist/assets/useReplaceWebResourceConfirm-BUWBVNSC.js +0 -1
  152. package/dist/assets/useStableKeys-p2OkzZWO.js +0 -1
  153. package/dist/assets/vb-Db0cS2oM.js +0 -1
  154. package/dist/assets/wgsl-BTesnYfV.js +0 -298
  155. package/dist/assets/workers-BZ4mXA5s.js +0 -1
  156. package/dist/assets/xml-Cl6spsD4.js +0 -1
  157. package/dist/assets/yaml-El-x4GhS.js +0 -1
package/CHANGELOG.md CHANGED
@@ -9,6 +9,572 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [0.9.0-beta.2] - 2026-11-01
13
+
14
+ ### 🔧 Changed
15
+
16
+ - **The Insider icon's gold corner is bigger, two-tone and flush with the edge (#236).** Betas
17
+ show a gold corner on the tool icon. It was small and light, and a blue sliver showed between it
18
+ and the hexagon's edge. It's now about 1.5 times larger, sits on both edges, and is split on the
19
+ same diagonal as the blue in two golds (`#CC8A00` and `#F2A100`), so it reads at the 20–24 px
20
+ PPTB shows. FetchXML Studio and Dataverse Request Studio use the same stamp. Restart PPTB to see
21
+ it: PPTB keeps tool icons until it restarts.
22
+ - **The tool starts without loading the code editor (#118).** Monaco (about 4 MB) loaded with the
23
+ tool, before any editor opened. It now loads the first time you open the XML view, Compare, a
24
+ script, Import XML or the publish dialog's XML. It brings XML and JavaScript only: the other
25
+ languages and the CSS, HTML and JSON workers are gone, and the package is 3.3 MB smaller
26
+ (16.3 → 13.0 MB unpacked).
27
+
28
+ ### 🔧 Fixed
29
+
30
+ - **The pane resize handles work from the keyboard (#23).** Tab to the handle beside the left
31
+ pane, the Properties pane or the bottom panel, then use the arrow keys (Shift for bigger
32
+ steps). Screen readers announce which pane it sizes, its width or height, and how far it can
33
+ go in this window. Dragging a handle saved the pane
34
+ sizes on every mouse move; it now saves them at most every quarter second.
35
+ - **Screen readers get accurate roles on the Classic and Modern canvases (#23).** The Classic
36
+ canvas called itself a tree grid without rows or cells; its groups are now plain groups. The
37
+ selected button on both canvases is marked as current, instead of with an attribute buttons
38
+ don't support.
39
+ - **The Classic canvas works from the keyboard (#23).** Tabbing to a button didn't select it:
40
+ its group took the focus event and selected itself instead. The arrow keys didn't move between
41
+ buttons you can drag, because the drag handler replaced the button's own. Enter or Space
42
+ picks a button up to move it with the arrow keys, as before, and now keeps that button
43
+ selected (its group moved the selection to the group's first button). Escape cancels the move
44
+ without leaving the canvas stuck in drag mode.
45
+ - **The Structure pane's hint wraps inside its padding.** With no table chosen, the second line
46
+ of "Choose a table to see its tabs, groups and buttons." started at the pane's edge.
47
+
48
+ ### 🏗️ Technical
49
+
50
+ - **Accessibility lint (#23).** The `jsx-a11y` recommended rules are on, so CI fails on new
51
+ keyboard and screen-reader problems. The few deliberate exceptions (dialog autofocus, the
52
+ command palette's options, focusable tooltip triggers, the resize handles) are disabled on
53
+ their line with the reason.
54
+ - **Release workflow hardening (#250, as FetchXML Studio #188).**
55
+ - **Separate jobs:** `release.yml` is split into `build`, `publish` and `github-release`.
56
+ - The job that installs and runs the dependencies (`npm ci --ignore-scripts`, no cache, the
57
+ checks, the build) can only read the repository.
58
+ - Only `publish` can get the npm OIDC token, only for a tag push, and it installs no
59
+ project dependencies: it publishes the tarball `build` packed.
60
+ - Only `github-release` can write to the repository.
61
+ - **More checks before publishing:** the release build now also runs the runtime audit,
62
+ typecheck, lint and the package-contents check, so a tag on a commit that skipped CI can't
63
+ publish.
64
+ - **Pinned versions:** npm is pinned to 11.21.1 instead of `npm@latest`, and Node to 24.22.0.
65
+ The actions are pinned by commit SHA (checkout v7.0.1, setup-node v7.1.0, upload-artifact
66
+ v7.0.2, download-artifact v8.0.2). Each is at least 14 days old, the project's dependency
67
+ rule.
68
+ - **Rehearsal:** the workflow can run by hand as a rehearsal: every check and
69
+ `npm publish --dry-run`, with no npm token and no GitHub Release. A manual run never
70
+ publishes, even on a tag.
71
+ - **`latest` can't move back:** a stable tag gets `latest` only for main's own version line,
72
+ and a `support/X.Y` commit is checked first. Support branches merge forward into `main`, so
73
+ re-running an older line's release after that merge could have published it to `latest`.
74
+ - **CI:** uses `npm ci --ignore-scripts` and the same action pins, and doesn't keep the
75
+ checkout's token.
76
+ - **Releases check what they must update (#246, as FetchXML Studio #270).** A new
77
+ `check-release.mjs` runs in CI (every PR, and pushes to the long-lived branches) and in the
78
+ release build. It fails when any of these don't match `package.json`'s version:
79
+ - the version's shape (`X.Y.Z`, `X.Y.Z-beta.N` or `X.Y.Z-rc.N`);
80
+ - `package-lock.json`;
81
+ - the CHANGELOG (a dated `[X.Y.Z]` section with entries, under `[Unreleased]`);
82
+ - the version badge (`assets/badges/version.svg` must be what `npm run version-badge` writes);
83
+ - after the build, the bundled icon (the Insider icon for pre-releases).
84
+
85
+ The GitHub Release notes are now built from the CHANGELOG section, after a line on the channel
86
+ and the PPTB requirement, with GitHub's PR list after them. Before, they were the PR list
87
+ alone, replaced by hand. A rehearsal previews them in the run summary. RELEASING.md has a
88
+ table of what every release changes, and an *After every release* checklist (the npm tag, the
89
+ published icon, the tracking issue, the forward merge, deprecating the replaced version).
90
+ Forward merges keep the higher version.
91
+ - **Repository hygiene (#118).**
92
+ - **Dead code removed:** the unused PublishXml publish helpers (with their PublishAllXml
93
+ fallback), a second copy of the LocLabel XML builder, `groupTemplates.ts` (it listed
94
+ templates that don't exist), and five unused exports (`fetchPublisherPrefix`,
95
+ `isInsidePPTB`, `classicIdForMigratedCommand`, `isOverrideCustomAction`, `evaluateRule`).
96
+ - **A misleading comment corrected:** the generator's system-command filter doesn't keep
97
+ unchanged out-of-the-box commands out of a publish (the parser keeps their actions since
98
+ #42); `keepOnly` in `publishService` does.
99
+ - **Coverage:** `npm run test:coverage` (`@vitest/coverage-v8`), and CI writes the totals to
100
+ the run summary. It reports; it doesn't gate.
101
+ - **README:** removed features the tool doesn't have (the form ribbon scope selector, Power Fx
102
+ and Custom API actions, editing web resources in Monaco, the URL Action Composer) and the
103
+ old test counts; the roadmap points at the milestones.
104
+ - **CHANGELOG:** entries for 0.5.1 and 0.5.2.
105
+
106
+ ## [0.9.0-beta.1] - 2026-11-01
107
+
108
+ The first beta of 0.9.0 (npm `beta`): the UX overhaul in Fluent 2, and Edit mode.
109
+ - **Edit mode:** a Structure tree of tabs, groups and buttons; group cards you can reorder;
110
+ "How users see it", a preview of the command bar; a Solution tab; a table picker in the top
111
+ bar; and a List view that fits and sorts.
112
+ - **One editor drawer** for commands, rules, scripts, XML, Compare and Translations, with Done and
113
+ one Undo step per drawer.
114
+ - **Properties:** sections by kind, read-only for buttons that aren't yours until you customise
115
+ them, with texts shown as the canvas shows them.
116
+ - **The publish dialog** says what will publish and why Publish is blocked.
117
+ - **Every dialog** uses one shell and opens on the right control.
118
+ - **A screen-based visual pass** at 1024 and 1920 px, in light and dark.
119
+
120
+ It includes everything in 0.8.0. Requires Power Platform ToolBox 1.2.7 or later, as 0.8 does.
121
+
122
+ ### 🏗️ Technical
123
+
124
+ - **Formatting is enforced (#118, item 1).** The codebase is formatted with Prettier once, in its
125
+ own commit (146 files: line wrapping, indentation, trailing commas and parentheses; no behaviour
126
+ change). CI now runs `npm run format:check` after lint, so unformatted code fails the build.
127
+ This comes first in the UI/UX work (#193), so later diffs show only real changes.
128
+ - **Shared Fluent UI components (#190).** These are the pieces the UI/UX issues build on, so each
129
+ surface looks and behaves the same:
130
+ - `AppDialog`: one dialog shell in three widths (440 / 600 / 960 px). Only the content scrolls,
131
+ so the actions never leave the dialog. A close button, and `DangerButton` for destructive
132
+ actions.
133
+ - `PropertySection`: collapsible properties sections with one heading style. The open sections
134
+ are remembered.
135
+ - `IdField`: a long id shown read-only and truncated, with the full id in a tooltip and a copy
136
+ button.
137
+ - `LocationInfo`: "About this location", with an explanation of each ribbon location in Unified
138
+ Interface terms. It replaces permanent banners (#181).
139
+ - `MessageSlot`: one message bar at a time with "+n more". Dismissing is remembered until the
140
+ message changes.
141
+ - `RuleTag`: a bound rule, named by the part of its id that tells rules apart instead of
142
+ "EnableRule". Click to open, ✕ to unbind.
143
+ - **Lint guard:** components can't add raw `button`/`input`/`select`/`textarea`/`table`
144
+ elements, or text in an extra-small Badge. The files that still do are listed in
145
+ `eslint.config.js` and come off the list as their issues are fixed.
146
+
147
+ ### 🔧 Changed
148
+
149
+ - **The top bar fits PPTB's widths (#179).** At about 1000–1200 px, the old top bar and sub-header
150
+ wrapped "Publish All" onto two lines. They also pushed View as, XML and Tab rules off-screen or
151
+ under the Properties pane. Now:
152
+ - **One top bar** replaces the sub-header row (36 px more for the canvas). It holds the
153
+ environment, solution, search, undo/redo, an **XML** menu (View XML, Import XML…, Compare with
154
+ published), **Open in Dynamics 365**, a **View** menu (Properties docked / floating / hidden,
155
+ the bottom panel) and Help.
156
+ - **Narrow windows:** tools that don't fit move into a **⋯** menu. **Publish** is never hidden.
157
+ - **Publish** says what it does ("Publish 2 changes"). With nothing to publish it's disabled,
158
+ and its tooltip says why.
159
+ - **Solution button:** shows just the solution's name. A warning icon appears when new ids would
160
+ use the org's default publisher prefix. The prefix, with an explanation, is in the picker.
161
+ - **Environment:** below 1200 px it shows just its type badge. The full URL is in a tooltip
162
+ you can reach with the keyboard.
163
+ - **Tool-wide messages** (connection changed, draft couldn't be saved) sit under the top bar
164
+ and push the panes down. They used to cover the left pane's tabs and the Properties header.
165
+ - **Below 1200 px wide,** the left pane becomes a rail that opens it as a drawer. Properties
166
+ opens as a drawer when you select something; the canvas stays usable behind it, so picking
167
+ another button updates it. At 1024 px the canvas went from about a third of the width to
168
+ nearly all of it.
169
+ - **The bottom panel starts collapsed** (new installs) and opens when you choose one of its
170
+ tabs.
171
+ - **The rows above the canvas fit and work from the keyboard (#180).** The location row was
172
+ hand-rolled tabs that the keyboard couldn't reach. The ribbon tab strip stacked each tab's label,
173
+ its full id and a delete button into 32 px, and pushed Add tab and Tab rules off-screen.
174
+ - **Locations use Unified Interface names:** Main grid · Main form · Sub-grid · Application. They
175
+ form a Fluent tab list (arrow keys, Enter) with a **More** menu when they don't fit.
176
+ - **About this location (ⓘ)** explains each location and shows its ribbon id.
177
+ - **App and View are compact menus** instead of 170 px drop-downs. The canvas's own XML button is
178
+ gone: the top bar's XML menu is the one entry point.
179
+ - **Ribbon tabs show their label only.** The id is in a tooltip. Double-click or F2 still renames.
180
+ **Tab options (⋯)** holds Rename…, Tab display rules…, **Move left / Move right** (the keyboard
181
+ way to reorder; dragging still works), and Delete tab….
182
+ - **Add tab and Tab rules** (with its rule count) stay reachable however many tabs there are.
183
+ When a rename isn't allowed, the reason is announced to screen readers.
184
+ - **Fewer, readable messages (#181).** Up to five permanent banners used to stack above the
185
+ canvas, and two or three more above a built-in button's properties. The long ones were clipped
186
+ to one line.
187
+ - **Gone from the canvas:** the Form, Sub-grid and Application notes are now in **About this
188
+ location**. A custom tab's Unified Interface note is behind an info button in the tab strip.
189
+ - **One message at a time, with "+n more":** things you need to act on share a single slot.
190
+ These are the unread-layer warning (with Retry), the Charts-tab warning, and the orphans
191
+ message (with Show). Dismissing the orphans message is remembered until their number changes.
192
+ - **Properties shows one notice for a button that isn't yours** (out of the box, managed, or
193
+ customized by several solutions). It comes with Customise button, Create override and View
194
+ solution layers. A modern command that replaces the button is the second notice.
195
+ - **Explanations became info buttons or hints:**
196
+ - "Disabled buttons are hidden in Unified Interface" in the rules sections;
197
+ - "enable rules allow fewer step types" in the rule editor;
198
+ - the ampersand note on a URL action's address.
199
+ - **Removed:** the developer note about "Monaco editing … integration path", and the "Your own
200
+ command." bar (its badge says it).
201
+ - **Clear empty, loading and error states (#195).**
202
+ - **Before a solution is chosen,** the canvas offered "This tab has no groups yet · Add
203
+ first group". Now it says **Choose a solution to start**, and its button opens the solution
204
+ picker.
205
+ - **With a solution but no table:** **Pick a table**. Choose table opens the tables drawer in
206
+ a narrow window, or puts you in the table search otherwise.
207
+ - **Loading** shows a progress bar, a skeleton in the shape of the canvas, and a status line
208
+ with the table and step.
209
+ - **A failed load** is a titled error with a plain-language cause (for example "Your
210
+ connection may have expired." for a 401) and Retry. The raw details are in a collapsible
211
+ section with Copy details.
212
+ - **Compare with nothing changed** says "No changes since the last publish", with **Show the
213
+ full XML anyway**, instead of a diff of identical XML.
214
+ - **Publish with nothing to publish** is disabled with a reason (see the top bar above).
215
+ - **Confirmation dialogs** use the shared dialog shell: 440 px wide, with the confirm button
216
+ red when it deletes or discards something.
217
+ - **Badges fit their text (#182).** Fluent's extra-small badge is a 10 px dot, so "NEW",
218
+ "Modern (migrated)", "Hidden by modern", control kinds and app names spilled over their
219
+ neighbours. Text badges are now the small size and never shrink below their text. On the
220
+ Modern command bar, buttons keep their full label and the row scrolls instead of squeezing
221
+ them. Your own Classic tiles are marked with a labelled dot ("Yours: added by your
222
+ customizations") instead of "NEW" text over the label.
223
+ - **One button menu everywhere (#182).** Right-clicking a button on the Classic or Modern canvas
224
+ opens the same menu with the same items in the same order:
225
+ - Edit properties, Change icon, Edit labels;
226
+ - Hide or Show, Create override, Customise;
227
+ - Duplicate, **Move to ▸** (a submenu of groups, not one item per group);
228
+ - **Delete…** last, in red, and it asks first.
229
+
230
+ It opens at the button, so Shift+F10 and the Menu key work too; it used to open at the top
231
+ left from the keyboard. Notes such as "Microsoft's global command bar buttons can't be
232
+ changed" are headings in the menu, not greyed-out items.
233
+
234
+ - **Properties says what is selected (#184).** A header stays at the top while you scroll: the
235
+ button's icon and label, whose it is (**Yours**, **Out of the box** or **Managed · solution**)
236
+ and its kind. Its close button clears the selection when docked, or closes the drawer in a
237
+ narrow window (where it replaces the drawer's own). The fields are in collapsible sections
238
+ that remember what you opened:
239
+ - **Appearance:** label, translations, tooltips, icon, Visible, and the **Button ID**;
240
+ - **Position:** the group and the order, with a hint;
241
+ - **Command:** the **Command ID** with **Edit command**;
242
+ - **Display rules** and **Enable rules**, with a count;
243
+ - **Scaling:** the tab it applies to, by name. A note says Unified Interface ignores it,
244
+ instead of a warning box on every button.
245
+ - **Advanced:** kind (now "Split button", not `splitButton`), template alias with a hint, and
246
+ the rest.
247
+
248
+ Both ids are read-only with a copy button and the full id in a tooltip. The doubled padding,
249
+ dividers and left border are gone.
250
+ - **Show on, rules and binding in Properties (#184).**
251
+ - **Show on** (in Appearance) is one choice, All clients / Unified Interface only / Classic web
252
+ client only, instead of three badges that each added a filter. It shows what the command's
253
+ display rules already say, or **Custom** when they don't match one choice. It names the other
254
+ buttons that use the same command, since they change too. On Microsoft's commands it's
255
+ read-only: customise the command first. Choosing Unified Interface only also removes
256
+ `Mscrm.HideOnModern` from your command, which together with it would hide the button
257
+ everywhere.
258
+ - **Bound rules** are tags: the name opens the rule, ✕ unbinds it. They work from the keyboard;
259
+ the old pills didn't.
260
+ - **Binding a rule or a command** uses a list you can filter by typing, instead of a long
261
+ drop-down. **Bind** stays disabled until you pick one.
262
+ - **Properties on Microsoft's buttons is read-only (#184).** Their Label, tooltips, order,
263
+ template alias, languages, icon and images can't be edited directly, and the fields now say so
264
+ ("Customise this button, or create an override, to edit these fields.") instead of looking
265
+ editable. Your own buttons, and Microsoft's once customised or overridden, stay editable.
266
+ Also in Properties:
267
+ - The languages of a button's text are keyboard-reachable tags, and its Image16/32 are links.
268
+ Before, they were click-only badges and raw buttons.
269
+ - "ModernImage (auto)" is now **Modern image**, with a hint saying what it is.
270
+ - The record-open override (OpenRecordItem) and the form note explain themselves behind an
271
+ info button, instead of about 110 words of small text, internal XML paths and an issue
272
+ number. The raw "Tab:" id line is gone.
273
+ - Deleting an orphaned customization you published recently asks in a dialog with a red
274
+ **Delete anyway**, instead of a second inline button.
275
+ - The Hidden, Orphaned and read-only lists use one heading style.
276
+ - **Clearer dialogs (#187).**
277
+ - **Hiding a button that isn't yours** offers two plain choices:
278
+ - **Hide this button only:** you can show it again under Hidden by customizations.
279
+ - **Hide it with display rules on its command:** easy to undo, but it hides every button
280
+ that uses the command, and the dialog names them. A button on another location says
281
+ where, e.g. "Edit (main form)", in this dialog and under Show on.
282
+
283
+ Display rules are the default only when no other button uses the command. Before, the
284
+ permanent HideCustomAction was the default, and the text was full of jargon.
285
+ - **Discard** in the unpublished-changes and restore-draft dialogs is red and says **Discard
286
+ changes**; **Restore changes** says what it does.
287
+ - **New group** offers the platform's group templates, as Change template does. The made-up
288
+ "Layout3" is gone.
289
+ - **New tab** has one hint instead of two info bars. The id it will get is read-only with a
290
+ copy button, and the location is named in the title ("New tab on the home grid") instead of
291
+ "Location: HomepageGrid".
292
+ - New button, Rename group, Change template, New group, New tab and the two
293
+ unpublished-changes dialogs all use the shared dialog shell. Their actions never leave the
294
+ dialog, and titles are in sentence case. The dialogs' extra entrance animation is removed.
295
+ - **The publish dialog says what it publishes first (#188).**
296
+ - **One row per change**, in words, with a badge (New, Change, Move, Show, Hide, Delete):
297
+ "Add **Credit Check** to the main grid and main form", "Hide **Edit** on the main grid".
298
+ - **Same count everywhere:** the top bar's **Publish n changes** and the dialog's primary
299
+ button count these rows, not edits. Five edits of one label are one change.
300
+ - **When Publish is blocked, it says why**, above the changes: no solution, changes that can't
301
+ be published yet, problems the check found, nothing to publish, or publishing everything
302
+ without its confirmation. Problems opens by itself.
303
+ - **Folded away until needed:** Problems, Warnings, Good to know, and Options. Options holds
304
+ what else to publish, the solution version (the switch now comes before the field) and the
305
+ comment. "PublishAllXmlAsync" is no longer shown.
306
+ - **View XML** shows the complete RibbonDiffXml each import writes (your layer with the
307
+ changes merged in) inside the dialog. Going back keeps the comment and the confirmation;
308
+ before, it closed the dialog.
309
+ - **Progress in words** ("Publishing…", "Done", "Failed"). Afterwards it says "Published 2
310
+ changes to CBS Ribbon Test", and that Unified Interface can take up to about 25 minutes to
311
+ show it (Command Checker's **Regenerate ribbon metadata** shows it sooner).
312
+ - The title names what publishes ("Publish CBS Ribbon Test") instead of "Publish to Dataverse",
313
+ and the dialog uses the shared dialog shell.
314
+ - **One editor drawer (#186, part 1).** The command and rule editors are views of one drawer
315
+ instead of drawers stacked on drawers.
316
+ - **A rule opened from the command editor** replaces the view, with a **Back** button to the
317
+ command and a trail ("Edit command › Edit enable rule"). One backdrop, never two.
318
+ - **The header says what you're editing** ("Edit command", "Edit display rule"), with the id
319
+ read-only and a copy button. A command also shows whose it is: Yours, Your copy, or
320
+ Read-only.
321
+ - **One Done button**, with "Changes apply as you edit · Ctrl Z to undo". Closing it any way is
322
+ safe: changes already apply as you make them.
323
+ - **One undo step per drawer:** everything changed between opening the drawer and Done is
324
+ undone with a single Ctrl Z.
325
+ - The drawer's body is the only thing that scrolls; the editors' own padded scroll areas are
326
+ gone.
327
+ - **The command editor, redone (#186, part 2).**
328
+ - **Its tabs sit in the drawer's header**, so they never scroll away: Actions, Enable rules (n),
329
+ Display rules (n) and Used by (n). The tab you're on is kept while you look at a rule.
330
+ - **Out-of-the-box commands are read-only until you customise them.** Before, editing one
331
+ customised it without asking. The fields look read-only, one line says why, and
332
+ **Customise command** is next to it. Viewing the script and opening a rule still work.
333
+ - **One Add action menu** (Run JavaScript, Open a URL) instead of a dropdown and two buttons.
334
+ - **Each action is a card** with a drag handle, Move up / Move down in its ⋮ menu, and Remove.
335
+ - **View script / Edit script** open the script inside the drawer, filling its height, with
336
+ Back to the command. Edit script saves straight to Dataverse, and says so. The "Monaco"
337
+ wording and the "integration path" note are gone.
338
+ - **Pass parameters** is a labelled switch instead of a button reading "✓ PassParams ON".
339
+ - **Plain labels and hints:** Library, Function ("The function's full name, including its
340
+ namespace."), Parameters, in order; the address error is a field message.
341
+ - **Rename** is a pencil next to your own command's id, with the error under the field.
342
+ Settings and Versions are gone (History in the bottom panel covers the second).
343
+ - **Used by** names each button and where it is ("Main grid › Main › Management").
344
+ - **Rules are tags:** open one with a click, unbind it with its ×. **New enable rule** now also
345
+ adds the rule to the command.
346
+ - **Rules, tab display rules and scaling (#186, part 3).**
347
+ - **The editor drawer is 720 px wide for every view**, so it doesn't change width when you open a
348
+ rule from a command and go back. A rule's nested Or steps no longer scroll sideways: parameter
349
+ rows shrink and wrap instead of sizing themselves to their longest option.
350
+ - **The rule view** says "Passes when every step below is true." Steps are numbered, with a
351
+ drag handle and Move up / Move down in a ⋮ menu (the "Drag" text button is gone). The header
352
+ shows the rule's id with copy, **Rename** for a rule that isn't Microsoft's (errors under the
353
+ field; the "Apply ID change" row is gone) and how many commands use it. "In words" heads the
354
+ summary.
355
+ - **Tab display rules open in the editor drawer and apply as you edit.** Save and Cancel are
356
+ gone: Done, and one Ctrl Z undoes everything done there. Steps are numbered cards; on the
357
+ application ribbon Add step offers a table step or a page step. An empty page address is a
358
+ field error (and Publish's check still blocks it). A tab another solution adds says so and is
359
+ read-only.
360
+ - **Scaling is read-only for now (#165).** Changes to scaling could never be published, so the
361
+ Scaling editor is removed until #165 makes them publishable. Properties shows the tab's
362
+ groups and scaling steps, and says scaling only shapes the classic ribbon.
363
+ - **XML and Compare in the editor drawer (#186, part 4).**
364
+ - **The XML of your changes opens on the location you're looking at**, not always on the home
365
+ grid, with Unified Interface names on its tabs. Copy, Download, Format and Import this XML sit
366
+ in a toolbar. Import takes the drawer's place instead of opening a dialog over it.
367
+ - **Compare with published** fills the drawer's height; Side by side / Unified are tabs.
368
+ - **History's View diff shows what that change did.** Before, every entry showed everything
369
+ since the last publish while saying it showed the entry's change.
370
+ - **No more "View solution layers".** Its drawer listed every solution in the environment as
371
+ a "layer" of the button, and called the newest the winner, whatever the button was. Dataverse
372
+ layers ribbon customizations per table, not per button; the button's notice still names the
373
+ managed solution and publisher it comes from.
374
+ - **List view:** the buttons table no longer runs under the modern commands below it on a short
375
+ window. It's as tall as its rows, up to ten, and scrolls for more.
376
+ - **Import RibbonDiffXml in two columns (#187, part 2).**
377
+ - **The editor keeps its height.** Before, it shrank to almost nothing after a preview, as the
378
+ message bars piled up under it. The preview now sits beside it and scrolls on its own.
379
+ - **One line above the editor** ("From Ribbon Workbench or a solution's customizations.xml. Only
380
+ <table>'s part is used.") replaces the 70-word introduction.
381
+ - **The preview counts what it found** ("Preview · 2 changes, 1 problem"), lists each change with
382
+ an Add / Update / Hide badge, and lists every problem in one list instead of a message bar per
383
+ error. A problem with a line ("Line 3: …") moves the editor to that line.
384
+ - **Import says how many changes it brings** ("Import 2 changes") and is off while there are
385
+ errors. Preview becomes "Preview again". After the import there's one Close button.
386
+ - **XML parse errors read as the parser's message**, without the browser's "This page contains
387
+ the following errors" wrapper.
388
+ - The dialog uses the shared dialog shell at its large size.
389
+ - **Translations in the editor drawer, applied as you type (#187, part 3).**
390
+ - **No Save or Cancel:** a change applies as you type, and one Ctrl Z undoes the whole edit.
391
+ The base language is still the button's own text (#157) and can't be emptied ("A button needs
392
+ a label."). Other languages are written to the button's labels with the base text kept in
393
+ step; opening it writes nothing.
394
+ - **Languages by name** ("German · 1031") instead of emoji flags, which Windows showed as
395
+ letter pairs. Each language is a card of labelled fields ("Label (German)"), not a raw table
396
+ of browser inputs that turned into white boxes in dark theme.
397
+ - **Add a language** from a list, or by LCID; a language you add stores nothing until it has
398
+ text. Remove one with its delete button, which the keyboard reaches.
399
+ - **A line-break button** in each label field; the hint no longer garbles its own example.
400
+ - **A built-in or another solution's button is read-only here too**, as in Properties.
401
+ - **The icon picker, redone (#187, part 4).**
402
+ - **Icons are buttons** in one group the arrow keys move through; Enter picks one. Before they
403
+ were clickable boxes the keyboard couldn't reach.
404
+ - **Regular / Filled are two toggles** whose labels stay put; the switch's label flipped with
405
+ its state.
406
+ - **The selection names the icon** ("Edit · Filled") and the web resource it's saved as, instead
407
+ of a raw `ModernImage="$webresource:…"` string.
408
+ - **Web resources:** the first 300 show, and the count says so ("Showing 300 of 1,240 SVG web
409
+ resources. Search to find others."); before, the list stopped at 200 without a word. The rows
410
+ are buttons, and the field takes a plain name.
411
+ - **Upload SVG is a real drop zone** with a **Choose SVG…** button; before it said "Drag an SVG
412
+ here" and ignored the drop. A file that isn't an SVG is refused with a message.
413
+ - Errors and notes are message bars, and the dialog uses the shared dialog shell.
414
+ - **The command palette, redone (#189, part 1).**
415
+ - **A real dialog:** focus stays in it, and Escape or a click outside closes it. Its search box
416
+ is Fluent's, readable in dark theme and with a focus outline.
417
+ - **The highlighted result follows the arrow keys** (Home and End too), stays in view, and is
418
+ announced to screen readers. Enter chooses it.
419
+ - **Choosing a button selects it on the canvas**, on its location and tab; before, it only
420
+ closed the palette. Its line names where it is ("Main form › Main › Management") without raw
421
+ location names or `$LocLabels:` tokens.
422
+ - **Grouped results** (Actions, Buttons, Commands, Rules, Tables) with readable kinds, and a
423
+ count of what's left when a group is cut ("12 more: keep typing to narrow it down").
424
+ - **`/` shows only actions and `@` only tables**; `/` used to filter nothing.
425
+ - **Only actions that can run are listed:** Undo and Redo when there's something to undo or
426
+ redo, Translations for a selected button you can edit, New button when there's a group.
427
+ - **No theme toggle:** the theme follows Power Platform ToolBox's setting.
428
+ - **The shared editors, redone (#189, part 2).**
429
+ - **Parameter rows label every field** (Type, Name, Value) and use plain type names ("From the
430
+ context", "Text", "True or false", "Whole number", "Decimal number"). Context values are
431
+ grouped (Context, Record, Selection context, Grid selection, Org/User) instead of one list of
432
+ 23. A URL parameter without a name says so under its field instead of showing a coloured dot,
433
+ and true / false is a switch.
434
+ - **Rule steps show friendly names** for the values the XML keeps ("Existing record", "Primary
435
+ table (the form or grid)", "Sub-grid", "User (Basic)", "One-to-many"…), use spin buttons for
436
+ counts and versions ("At least" / "At most"), and explain "If it can't be evaluated" and
437
+ "Invert result" on screen instead of in hover-only tooltips. Their fields wrap in a grid.
438
+ - **Kinds of step have plain names** ("Table privilege", "Your JavaScript", "Column value",
439
+ "Selected records"…), in groups such as Client and device, Form, Table and Your code. The
440
+ step picker searches with a Fluent search box and the arrow keys; the Quick action note is an
441
+ info button.
442
+ - **Provenance actions** (Customise, Uncustomise, Discard) sit in the message bar's actions area.
443
+ - **Tables are picked in the top bar (#194, step 1).** The left pane's Tables tab is replaced by a
444
+ Table combobox next to the solution, the first step of Edit mode.
445
+ - **The list** groups the solution's tables as Custom and Standard, with their logical names.
446
+ Typing filters by display or logical name. Alt+↓ opens it, and Escape closes it.
447
+ - **Markers:** the open table shows its number of unpublished changes. Another table with a
448
+ draft saved on this computer shows "Draft", and managed tables show a lock.
449
+ - **Switching** still asks first when there are unpublished changes.
450
+ - **"Choose table"** on the empty canvas opens the list, at any window width.
451
+ - **The left pane** shows Solution Elements only, until the Structure tree arrives (#194,
452
+ step 2).
453
+ - **The location's tabs, groups and buttons are a tree in the left pane (#194, step 2).** The left
454
+ pane has two tabs: **Structure** (the default) and **Solution**, which shows Solution Elements
455
+ as before. The ribbon tab strip above the canvas is gone.
456
+ - **The tree** shows tab › group › control for the location you're on. Groups show how many
457
+ controls they have, and controls show their Sequence or **Hidden**, a dot for yours, and are
458
+ listed in Sequence order.
459
+ - **Choosing a node** (click or Enter) shows that tab on the canvas, or selects the group or
460
+ control on the canvas and in Properties. A selection made on the canvas is shown in the tree,
461
+ with its group opened. The arrow keys move through the tree.
462
+ - **Each node has a menu:** right-click, Shift+F10, the Menu key, or its **⋯** button. A tab's
463
+ menu has Rename…, Tab display rules… (with the rule count), Add group…, Move up / Move down
464
+ and Delete tab…. Groups and controls have the same menus as on the Classic canvas; a group's
465
+ menu now also has **Add button…**. F2 renames a tab or group, or says why it can't be renamed.
466
+ - **Filter** by label or id: a match's tab and group stay open.
467
+ - **Add tab** is next to the filter. How Unified Interface shows a custom tab is behind an info
468
+ button in the location row.
469
+ - **Below 1200 px** the rail button opens Structure and Solution as a drawer. Choosing a group or
470
+ control closes it and opens Properties; a node's menu keeps it open.
471
+ - **Group cards (#194, step 3).** A new **Group cards** view, the default for anyone who hasn't
472
+ chosen a view: a card per group of the tab, with its template, and its buttons in Sequence order.
473
+ - **Rows** show the icon, the label, **Hidden** or **Yours**, and the Sequence. Click a row (or
474
+ Enter) to select it; right-click, Shift+F10 or the Menu key opens the button's menu.
475
+ - **Drag rows** to reorder them or move them to another card, with the pointer or the keyboard:
476
+ Space picks a row up, the arrow keys move it, Space or Enter drops it and Escape cancels. A
477
+ button that isn't yours moves as your copy, as on the Classic canvas (#26).
478
+ - **Each card's ⋮ menu** is the group menu: Add button…, Rename…, Duplicate group, Change
479
+ template…, **Move left / Move right** and Delete group. **+ Add button** is at the foot of the
480
+ card.
481
+ - **"How users see it" (#194, step 4).** Above the group cards, the tab's commands as the Unified
482
+ Interface command bar lists them: groups and buttons in Sequence order, without the ones your
483
+ customizations or a modern command hide, a button a migrated modern command replaces under that
484
+ command's name, and the visible modern commands among them. What doesn't fit goes into a **⋮ n**
485
+ menu, as in Unified Interface, and the selected command is always in view. Choosing a command
486
+ selects it on the cards, in the tree and in Properties. It's marked **Preview: rules not applied**:
487
+ display and enable rules are evaluated by Simulate mode (#191).
488
+ - **Visual pass, part 1 (#229).** From screenshots of CBS in PPTB Desktop at 1024 and 1920 px:
489
+ - **Properties of a button that isn't yours** shows its Label and tooltips as the canvas does
490
+ ("Save And New", not `Ribbon.Form.MainTab.Save.SaveAndNew`), in fields that look read-only; the
491
+ key they come from is the field's hint.
492
+ - **Placeholders and resource keys read as words:** the application ribbon's
493
+ `{!EntityPluralDisplayName}` tabs show "‹table name, plural›", and keys such as
494
+ `WebResource_Tab_Caption` or `Mscrm_…_ToolTipTitle` show "Web Resource" or the button's name.
495
+ - **No content text below Caption 1 (12 px):** small text, badges and counters are a size up across
496
+ Edit mode, the panes, the bottom panel and the dialogs (the Classic canvas's tiles excepted).
497
+ - **The bottom panel's grids no longer scroll sideways** because of their own vertical scrollbar.
498
+ - **Visual pass, part 2 (#229):** every dialog, the editor drawer's views and the publish dialog,
499
+ from screenshots in PPTB Desktop at 1024 and 1920 px.
500
+ - **Dialogs open on the right control.** New button, New group, New tab and Rename start in their
501
+ name field, not on the close button. Unpublished changes from an earlier session start on
502
+ **Restore changes**, so Enter keeps your work instead of discarding it.
503
+ - **Small dialogs' buttons fit on one line** ("Create group", "Change template" no longer wrap).
504
+ - **Choose a web resource** (from Properties or a JavaScript action) uses the same dialog as the
505
+ rest of CBS. Its list fills the dialog at any window size, Enter chooses a row, and Cancel or Close
506
+ never delivers a choice later.
507
+ - **Below 1200 px, Properties opens under the top bar**, so Publish, Search and the tools stay in
508
+ reach while you edit.
509
+ - **The List view's header sticks to the top edge;** rows no longer show above it as you scroll.
510
+ - **Rule steps fit the drawer:** a step's dropdowns no longer run out of its box, and the step
511
+ list opens inside the drawer.
512
+ - **Translations:** Label, Tooltip title and Tooltip body line up at the top.
513
+ - **The publish dialog** shows **What Publish imports** wide, and Solution version at the size of
514
+ the fields around it.
515
+ - **Icon names wrap between words** ("Clipboard / Paste", not "ClipboardPast / e").
516
+ - **Help lists the shortcuts** one to a line. **Compare** shows a count of none in neutral, not
517
+ red. The bottom panel's grids say they fill in once the ribbon loads, instead of "No
518
+ commands." while it loads. One level into the editor drawer, the header no longer repeats the
519
+ Back button's name.
520
+ - **The URL Action Composer is gone.** Nothing opened it, and URL actions are edited in the command
521
+ editor.
522
+ - **Visual pass, dark theme (#229):** every view, the panes and the dialogs captured with PPTB in
523
+ dark.
524
+ - **Button images read in the dark theme.** Ribbon images are drawn for a light command bar, so dark
525
+ glyphs (Sequences, AI Builder) nearly vanished. An image whose visible pixels are dark is now
526
+ shown inverted, in every view including the Classic ribbon; coloured and light images (Power BI,
527
+ Launch playbook) are shown as drawn.
528
+ - **The List view's Modern badge stays in its column:** after a long label, it ran into Kind.
529
+ - **The bottom panel's Commands and rules are grids (#185).** Hundreds of rows stay quick
530
+ (virtualized), the header stays put while the rows scroll, and nothing scrolls sideways: ids are
531
+ cut to their column with the whole id in a tooltip.
532
+ - **A command's rules are tags** that show the part of the id that tells them apart
533
+ (`ExactlyOneSelected`, not `EnableRule`), and open that rule.
534
+ - **One target per row:** a click or Space marks the row, **Edit**, Enter or a double-click opens
535
+ the editor. The rules' constant Type column is gone.
536
+ - **Counts** are badges on the tabs; a tab opens a collapsed panel.
537
+ - **Used by** counts the same way as the Solution tab: a command by the tabs, groups and controls
538
+ that use it, a rule by the commands that list it, per kind.
539
+ - **Search fields are SearchBoxes (#185),** with a clear button: the bottom panel's filters and the web
540
+ resource browser's search.
541
+ - **The Solution tab's + makes a New enable rule or a New display rule (#185),** not always an enable
542
+ rule. Template rows are plain rows, and branch counts are badges.
543
+ - **The List view fits and sorts (#183).** The grid is as tall as its rows, so only the canvas
544
+ scrolls, with the header kept in view; nothing scrolls sideways at 1024 px.
545
+ - **Columns:** #, Label (with its icon, and the id in its tooltip), Kind (`Split button`, not
546
+ `splitButton`), Group, Visible and **⋯**. ID and Command are in the **Columns** menu.
547
+ - **Sorting** works on every column; rows start in the order the tab shows them.
548
+ - **Rows are selected** with a click or Enter, as everywhere else (no radio buttons); the row's
549
+ menu is the button menu (**⋯**, right-click, Shift+F10).
550
+ - **Modern commands** are a collapsible section below the grid, with columns that truncate
551
+ instead of scrolling sideways.
552
+ - **Menus no longer select what they're opened on,** in the List and on the group cards: in a
553
+ narrow window that opened Properties, which took the focus and closed the menu.
554
+ - **The Solution tab is one tree (#194, step 5).** Buttons, Commands, Rules and Templates are
555
+ branches with a count, searched together; a branch with matches opens. Each row shows the part of
556
+ its id that tells it apart (e.g. `ExactlyOneSelected`, not `EnableRule`), with the whole id as its
557
+ description, and how much it's used (`used 3×`, Enable / Display). A branch lists 100 rows at a
558
+ time (**Show n more**), so the 498 commands of a table open at once. Choosing a command or rule
559
+ opens its editor; a button is selected, and its menu (right-click, Shift+F10 or ⋯) has **Go to
560
+ button** and **Add to** each group of the open tab, which adds your copy of it there. **+** makes a
561
+ new command or rule.
562
+ - **Two rail buttons below 1200 px (#194).** **Structure** and **Solution** each open the left pane
563
+ as a drawer on that tab.
564
+ - **Groups can be moved within their tab (#194).** Like tabs (#163), a group your customizations add,
565
+ or a new one, gets a Sequence between its new neighbours and the publish writes it. Two other
566
+ groups can't change places, so Move left / Move right are off there and say why. In the Structure
567
+ tree they read **Move up / Move down**.
568
+ - **A moved button is placed in Sequence order (#194).** Dropping a button before another now
569
+ places it among the destination group's buttons in Sequence order, the order Unified Interface
570
+ shows, not the order the ribbon XML happened to list them in.
571
+
572
+ ### 🔧 Fixed
573
+
574
+ - **Compare's XML diff is coloured (#195).** With a table open and a change pending, Compare
575
+ showed most of the XML without syntax colours: the editor painted before the colours were
576
+ ready and didn't repaint. It now repaints when they arrive.
577
+
12
578
  ## [0.8.0] - 2026-11-01
13
579
 
14
580
  Publish correctness and load performance. Tables open faster, and built-in buttons show captions
@@ -680,6 +1246,18 @@ in the desktop app and the VS Code extension. 0.5.x stays available for PPTB ver
680
1246
  config (replaced, see above), coverage, the bundle analyzer and unused testing-library packages (12 dev dependencies
681
1247
  in total).
682
1248
 
1249
+ ## [0.5.2] - 2026-07-17
1250
+
1251
+ Republished 0.5.1 (same commit, `274eb2a`); no changes.
1252
+
1253
+ ## [0.5.1] - 2026-07-17
1254
+
1255
+ Published to npm before the repository had tags or CI.
1256
+
1257
+ - **Monaco works inside PPTB.** Its language workers are bundled with the tool, same-origin,
1258
+ instead of being fetched, which PPTB's content security policy blocks (`e8aaf9c`).
1259
+ - **npm packaging metadata** for the ToolBox (`274eb2a`).
1260
+
683
1261
  ## [0.5.0] - 2026-07-16
684
1262
 
685
1263
  ### 🎉 First Beta Release