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

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 (60) hide show
  1. package/CHANGELOG.md +472 -0
  2. package/README.md +71 -48
  3. package/dist/assets/BulkPublishModal-DzDZJg0U.js +36 -0
  4. package/dist/assets/CommandEditorPanel-DsCP9yG4.js +1 -0
  5. package/dist/assets/CommandPalette-ID3kRJ9l.js +1 -0
  6. package/dist/assets/CompareView-DGsrcdoN.js +7 -0
  7. package/dist/assets/CrmParameterEditor-C22QGWff.js +1 -0
  8. package/dist/assets/EditorDrawer-CvCe9WeO.js +2 -0
  9. package/dist/assets/HideInsteadOfDeleteModal-3j9g-E9l.js +1 -0
  10. package/dist/assets/IconPickerModal-BLoDLbLR.js +1 -0
  11. package/dist/assets/ImportXmlModal-BD-L1QzJ.js +1 -0
  12. package/dist/assets/{MonacoEditor-uzfuRCpJ.js → MonacoEditor-BMKRZv-g.js} +1 -1
  13. package/dist/assets/NewButtonModal-COYXwEyk.js +1 -0
  14. package/dist/assets/NewGroupModal-boP_t1fI.js +1 -0
  15. package/dist/assets/NewTabModal-BI4afbC5.js +1 -0
  16. package/dist/assets/RuleEditorPanel-l8QnRFj6.js +1 -0
  17. package/dist/assets/ScriptView-BVyCmRvD.js +1 -0
  18. package/dist/assets/TabDisplayRulesPanel-gORq6MO7.js +1 -0
  19. package/dist/assets/TranslationsView-DubBATog.js +1 -0
  20. package/dist/assets/WebResourceBrowser-BATScmTw.js +1 -0
  21. package/dist/assets/XmlView-Bn4KlTw3.js +2 -0
  22. package/dist/assets/dnd-C1w9VFfC.js +5 -0
  23. package/dist/assets/fluent-icons-CQEhzzaC.js +1 -0
  24. package/dist/assets/fluent-ui-BEjALNLO.js +59 -0
  25. package/dist/assets/index-6so8O90C.js +136 -0
  26. package/dist/assets/index-D5GCH8nj.css +1 -0
  27. package/dist/assets/ruleKinds-BKTUiZ1-.js +1 -0
  28. package/dist/assets/useReplaceWebResourceConfirm-DND-V0vw.js +1 -0
  29. package/dist/assets/useStableKeys-BkDn7til.js +1 -0
  30. package/dist/assets/{xmlValidator-BkeotXuB.js → xmlValidator-PbODaIQV.js} +1 -1
  31. package/dist/icons/icon.svg +7 -4
  32. package/dist/index.html +15 -9
  33. package/index.html +10 -4
  34. package/package.json +1 -1
  35. package/dist/assets/BulkPublishModal-mJ41AWew.js +0 -36
  36. package/dist/assets/CommandEditorPanel-BiP1kPHY.js +0 -1
  37. package/dist/assets/CommandPalette-q51_0qRZ.js +0 -1
  38. package/dist/assets/ConflictDrawer-CdWv_PbN.js +0 -1
  39. package/dist/assets/DiffViewer-BQP5f73U.js +0 -7
  40. package/dist/assets/HideInsteadOfDeleteModal-C9r6ah5p.js +0 -1
  41. package/dist/assets/IconPickerModal-B81Tnf5i.js +0 -1
  42. package/dist/assets/ImportXmlModal-C0cMaS59.js +0 -1
  43. package/dist/assets/LocalizationEditor-DniDtrZV.js +0 -1
  44. package/dist/assets/NewButtonModal-BXpX1Ld5.js +0 -1
  45. package/dist/assets/NewGroupModal-Bh7lXq52.js +0 -1
  46. package/dist/assets/NewTabModal-Pntdk3in.js +0 -1
  47. package/dist/assets/RuleEditorPanel-BUGKgc0N.js +0 -1
  48. package/dist/assets/ScalingEditorPanel-p3-Yw3CO.js +0 -1
  49. package/dist/assets/TabDisplayRulesPanel-CSNshwaw.js +0 -1
  50. package/dist/assets/UrlComposerModal-WKSTwUcW.js +0 -1
  51. package/dist/assets/WebResourceBrowser-BK-gVU2g.js +0 -1
  52. package/dist/assets/XmlDrawer-CQJElnD1.js +0 -2
  53. package/dist/assets/dnd-Cq8OftAq.js +0 -5
  54. package/dist/assets/fluent-icons-BqJj6rDi.js +0 -1
  55. package/dist/assets/fluent-ui-QADO660t.js +0 -43
  56. package/dist/assets/index-D9lerlVA.css +0 -1
  57. package/dist/assets/index-Di2_5czx.js +0 -136
  58. package/dist/assets/ruleKinds-B9hACGaq.js +0 -1
  59. package/dist/assets/useReplaceWebResourceConfirm-BUWBVNSC.js +0 -1
  60. package/dist/assets/useStableKeys-p2OkzZWO.js +0 -1
package/CHANGELOG.md CHANGED
@@ -9,6 +9,478 @@ 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.1] - 2026-11-01
13
+
14
+ The first beta of 0.9.0 (npm `beta`): the UX overhaul in Fluent 2, and Edit mode.
15
+ - **Edit mode:** a Structure tree of tabs, groups and buttons; group cards you can reorder;
16
+ "How users see it", a preview of the command bar; a Solution tab; a table picker in the top
17
+ bar; and a List view that fits and sorts.
18
+ - **One editor drawer** for commands, rules, scripts, XML, Compare and Translations, with Done and
19
+ one Undo step per drawer.
20
+ - **Properties:** sections by kind, read-only for buttons that aren't yours until you customise
21
+ them, with texts shown as the canvas shows them.
22
+ - **The publish dialog** says what will publish and why Publish is blocked.
23
+ - **Every dialog** uses one shell and opens on the right control.
24
+ - **A screen-based visual pass** at 1024 and 1920 px, in light and dark.
25
+
26
+ It includes everything in 0.8.0. Requires Power Platform ToolBox 1.2.7 or later, as 0.8 does.
27
+
28
+ ### 🏗️ Technical
29
+
30
+ - **Formatting is enforced (#118, item 1).** The codebase is formatted with Prettier once, in its
31
+ own commit (146 files: line wrapping, indentation, trailing commas and parentheses; no behaviour
32
+ change). CI now runs `npm run format:check` after lint, so unformatted code fails the build.
33
+ This comes first in the UI/UX work (#193), so later diffs show only real changes.
34
+ - **Shared Fluent UI components (#190).** These are the pieces the UI/UX issues build on, so each
35
+ surface looks and behaves the same:
36
+ - `AppDialog`: one dialog shell in three widths (440 / 600 / 960 px). Only the content scrolls,
37
+ so the actions never leave the dialog. A close button, and `DangerButton` for destructive
38
+ actions.
39
+ - `PropertySection`: collapsible properties sections with one heading style. The open sections
40
+ are remembered.
41
+ - `IdField`: a long id shown read-only and truncated, with the full id in a tooltip and a copy
42
+ button.
43
+ - `LocationInfo`: "About this location", with an explanation of each ribbon location in Unified
44
+ Interface terms. It replaces permanent banners (#181).
45
+ - `MessageSlot`: one message bar at a time with "+n more". Dismissing is remembered until the
46
+ message changes.
47
+ - `RuleTag`: a bound rule, named by the part of its id that tells rules apart instead of
48
+ "EnableRule". Click to open, ✕ to unbind.
49
+ - **Lint guard:** components can't add raw `button`/`input`/`select`/`textarea`/`table`
50
+ elements, or text in an extra-small Badge. The files that still do are listed in
51
+ `eslint.config.js` and come off the list as their issues are fixed.
52
+
53
+ ### 🔧 Changed
54
+
55
+ - **The top bar fits PPTB's widths (#179).** At about 1000–1200 px, the old top bar and sub-header
56
+ wrapped "Publish All" onto two lines. They also pushed View as, XML and Tab rules off-screen or
57
+ under the Properties pane. Now:
58
+ - **One top bar** replaces the sub-header row (36 px more for the canvas). It holds the
59
+ environment, solution, search, undo/redo, an **XML** menu (View XML, Import XML…, Compare with
60
+ published), **Open in Dynamics 365**, a **View** menu (Properties docked / floating / hidden,
61
+ the bottom panel) and Help.
62
+ - **Narrow windows:** tools that don't fit move into a **⋯** menu. **Publish** is never hidden.
63
+ - **Publish** says what it does ("Publish 2 changes"). With nothing to publish it's disabled,
64
+ and its tooltip says why.
65
+ - **Solution button:** shows just the solution's name. A warning icon appears when new ids would
66
+ use the org's default publisher prefix. The prefix, with an explanation, is in the picker.
67
+ - **Environment:** below 1200 px it shows just its type badge. The full URL is in a tooltip
68
+ you can reach with the keyboard.
69
+ - **Tool-wide messages** (connection changed, draft couldn't be saved) sit under the top bar
70
+ and push the panes down. They used to cover the left pane's tabs and the Properties header.
71
+ - **Below 1200 px wide,** the left pane becomes a rail that opens it as a drawer. Properties
72
+ opens as a drawer when you select something; the canvas stays usable behind it, so picking
73
+ another button updates it. At 1024 px the canvas went from about a third of the width to
74
+ nearly all of it.
75
+ - **The bottom panel starts collapsed** (new installs) and opens when you choose one of its
76
+ tabs.
77
+ - **The rows above the canvas fit and work from the keyboard (#180).** The location row was
78
+ hand-rolled tabs that the keyboard couldn't reach. The ribbon tab strip stacked each tab's label,
79
+ its full id and a delete button into 32 px, and pushed Add tab and Tab rules off-screen.
80
+ - **Locations use Unified Interface names:** Main grid · Main form · Sub-grid · Application. They
81
+ form a Fluent tab list (arrow keys, Enter) with a **More** menu when they don't fit.
82
+ - **About this location (ⓘ)** explains each location and shows its ribbon id.
83
+ - **App and View are compact menus** instead of 170 px drop-downs. The canvas's own XML button is
84
+ gone: the top bar's XML menu is the one entry point.
85
+ - **Ribbon tabs show their label only.** The id is in a tooltip. Double-click or F2 still renames.
86
+ **Tab options (⋯)** holds Rename…, Tab display rules…, **Move left / Move right** (the keyboard
87
+ way to reorder; dragging still works), and Delete tab….
88
+ - **Add tab and Tab rules** (with its rule count) stay reachable however many tabs there are.
89
+ When a rename isn't allowed, the reason is announced to screen readers.
90
+ - **Fewer, readable messages (#181).** Up to five permanent banners used to stack above the
91
+ canvas, and two or three more above a built-in button's properties. The long ones were clipped
92
+ to one line.
93
+ - **Gone from the canvas:** the Form, Sub-grid and Application notes are now in **About this
94
+ location**. A custom tab's Unified Interface note is behind an info button in the tab strip.
95
+ - **One message at a time, with "+n more":** things you need to act on share a single slot.
96
+ These are the unread-layer warning (with Retry), the Charts-tab warning, and the orphans
97
+ message (with Show). Dismissing the orphans message is remembered until their number changes.
98
+ - **Properties shows one notice for a button that isn't yours** (out of the box, managed, or
99
+ customized by several solutions). It comes with Customise button, Create override and View
100
+ solution layers. A modern command that replaces the button is the second notice.
101
+ - **Explanations became info buttons or hints:**
102
+ - "Disabled buttons are hidden in Unified Interface" in the rules sections;
103
+ - "enable rules allow fewer step types" in the rule editor;
104
+ - the ampersand note on a URL action's address.
105
+ - **Removed:** the developer note about "Monaco editing … integration path", and the "Your own
106
+ command." bar (its badge says it).
107
+ - **Clear empty, loading and error states (#195).**
108
+ - **Before a solution is chosen,** the canvas offered "This tab has no groups yet · Add
109
+ first group". Now it says **Choose a solution to start**, and its button opens the solution
110
+ picker.
111
+ - **With a solution but no table:** **Pick a table**. Choose table opens the tables drawer in
112
+ a narrow window, or puts you in the table search otherwise.
113
+ - **Loading** shows a progress bar, a skeleton in the shape of the canvas, and a status line
114
+ with the table and step.
115
+ - **A failed load** is a titled error with a plain-language cause (for example "Your
116
+ connection may have expired." for a 401) and Retry. The raw details are in a collapsible
117
+ section with Copy details.
118
+ - **Compare with nothing changed** says "No changes since the last publish", with **Show the
119
+ full XML anyway**, instead of a diff of identical XML.
120
+ - **Publish with nothing to publish** is disabled with a reason (see the top bar above).
121
+ - **Confirmation dialogs** use the shared dialog shell: 440 px wide, with the confirm button
122
+ red when it deletes or discards something.
123
+ - **Badges fit their text (#182).** Fluent's extra-small badge is a 10 px dot, so "NEW",
124
+ "Modern (migrated)", "Hidden by modern", control kinds and app names spilled over their
125
+ neighbours. Text badges are now the small size and never shrink below their text. On the
126
+ Modern command bar, buttons keep their full label and the row scrolls instead of squeezing
127
+ them. Your own Classic tiles are marked with a labelled dot ("Yours: added by your
128
+ customizations") instead of "NEW" text over the label.
129
+ - **One button menu everywhere (#182).** Right-clicking a button on the Classic or Modern canvas
130
+ opens the same menu with the same items in the same order:
131
+ - Edit properties, Change icon, Edit labels;
132
+ - Hide or Show, Create override, Customise;
133
+ - Duplicate, **Move to ▸** (a submenu of groups, not one item per group);
134
+ - **Delete…** last, in red, and it asks first.
135
+
136
+ It opens at the button, so Shift+F10 and the Menu key work too; it used to open at the top
137
+ left from the keyboard. Notes such as "Microsoft's global command bar buttons can't be
138
+ changed" are headings in the menu, not greyed-out items.
139
+
140
+ - **Properties says what is selected (#184).** A header stays at the top while you scroll: the
141
+ button's icon and label, whose it is (**Yours**, **Out of the box** or **Managed · solution**)
142
+ and its kind. Its close button clears the selection when docked, or closes the drawer in a
143
+ narrow window (where it replaces the drawer's own). The fields are in collapsible sections
144
+ that remember what you opened:
145
+ - **Appearance:** label, translations, tooltips, icon, Visible, and the **Button ID**;
146
+ - **Position:** the group and the order, with a hint;
147
+ - **Command:** the **Command ID** with **Edit command**;
148
+ - **Display rules** and **Enable rules**, with a count;
149
+ - **Scaling:** the tab it applies to, by name. A note says Unified Interface ignores it,
150
+ instead of a warning box on every button.
151
+ - **Advanced:** kind (now "Split button", not `splitButton`), template alias with a hint, and
152
+ the rest.
153
+
154
+ Both ids are read-only with a copy button and the full id in a tooltip. The doubled padding,
155
+ dividers and left border are gone.
156
+ - **Show on, rules and binding in Properties (#184).**
157
+ - **Show on** (in Appearance) is one choice, All clients / Unified Interface only / Classic web
158
+ client only, instead of three badges that each added a filter. It shows what the command's
159
+ display rules already say, or **Custom** when they don't match one choice. It names the other
160
+ buttons that use the same command, since they change too. On Microsoft's commands it's
161
+ read-only: customise the command first. Choosing Unified Interface only also removes
162
+ `Mscrm.HideOnModern` from your command, which together with it would hide the button
163
+ everywhere.
164
+ - **Bound rules** are tags: the name opens the rule, ✕ unbinds it. They work from the keyboard;
165
+ the old pills didn't.
166
+ - **Binding a rule or a command** uses a list you can filter by typing, instead of a long
167
+ drop-down. **Bind** stays disabled until you pick one.
168
+ - **Properties on Microsoft's buttons is read-only (#184).** Their Label, tooltips, order,
169
+ template alias, languages, icon and images can't be edited directly, and the fields now say so
170
+ ("Customise this button, or create an override, to edit these fields.") instead of looking
171
+ editable. Your own buttons, and Microsoft's once customised or overridden, stay editable.
172
+ Also in Properties:
173
+ - The languages of a button's text are keyboard-reachable tags, and its Image16/32 are links.
174
+ Before, they were click-only badges and raw buttons.
175
+ - "ModernImage (auto)" is now **Modern image**, with a hint saying what it is.
176
+ - The record-open override (OpenRecordItem) and the form note explain themselves behind an
177
+ info button, instead of about 110 words of small text, internal XML paths and an issue
178
+ number. The raw "Tab:" id line is gone.
179
+ - Deleting an orphaned customization you published recently asks in a dialog with a red
180
+ **Delete anyway**, instead of a second inline button.
181
+ - The Hidden, Orphaned and read-only lists use one heading style.
182
+ - **Clearer dialogs (#187).**
183
+ - **Hiding a button that isn't yours** offers two plain choices:
184
+ - **Hide this button only:** you can show it again under Hidden by customizations.
185
+ - **Hide it with display rules on its command:** easy to undo, but it hides every button
186
+ that uses the command, and the dialog names them. A button on another location says
187
+ where, e.g. "Edit (main form)", in this dialog and under Show on.
188
+
189
+ Display rules are the default only when no other button uses the command. Before, the
190
+ permanent HideCustomAction was the default, and the text was full of jargon.
191
+ - **Discard** in the unpublished-changes and restore-draft dialogs is red and says **Discard
192
+ changes**; **Restore changes** says what it does.
193
+ - **New group** offers the platform's group templates, as Change template does. The made-up
194
+ "Layout3" is gone.
195
+ - **New tab** has one hint instead of two info bars. The id it will get is read-only with a
196
+ copy button, and the location is named in the title ("New tab on the home grid") instead of
197
+ "Location: HomepageGrid".
198
+ - New button, Rename group, Change template, New group, New tab and the two
199
+ unpublished-changes dialogs all use the shared dialog shell. Their actions never leave the
200
+ dialog, and titles are in sentence case. The dialogs' extra entrance animation is removed.
201
+ - **The publish dialog says what it publishes first (#188).**
202
+ - **One row per change**, in words, with a badge (New, Change, Move, Show, Hide, Delete):
203
+ "Add **Credit Check** to the main grid and main form", "Hide **Edit** on the main grid".
204
+ - **Same count everywhere:** the top bar's **Publish n changes** and the dialog's primary
205
+ button count these rows, not edits. Five edits of one label are one change.
206
+ - **When Publish is blocked, it says why**, above the changes: no solution, changes that can't
207
+ be published yet, problems the check found, nothing to publish, or publishing everything
208
+ without its confirmation. Problems opens by itself.
209
+ - **Folded away until needed:** Problems, Warnings, Good to know, and Options. Options holds
210
+ what else to publish, the solution version (the switch now comes before the field) and the
211
+ comment. "PublishAllXmlAsync" is no longer shown.
212
+ - **View XML** shows the complete RibbonDiffXml each import writes (your layer with the
213
+ changes merged in) inside the dialog. Going back keeps the comment and the confirmation;
214
+ before, it closed the dialog.
215
+ - **Progress in words** ("Publishing…", "Done", "Failed"). Afterwards it says "Published 2
216
+ changes to CBS Ribbon Test", and that Unified Interface can take up to about 25 minutes to
217
+ show it (Command Checker's **Regenerate ribbon metadata** shows it sooner).
218
+ - The title names what publishes ("Publish CBS Ribbon Test") instead of "Publish to Dataverse",
219
+ and the dialog uses the shared dialog shell.
220
+ - **One editor drawer (#186, part 1).** The command and rule editors are views of one drawer
221
+ instead of drawers stacked on drawers.
222
+ - **A rule opened from the command editor** replaces the view, with a **Back** button to the
223
+ command and a trail ("Edit command › Edit enable rule"). One backdrop, never two.
224
+ - **The header says what you're editing** ("Edit command", "Edit display rule"), with the id
225
+ read-only and a copy button. A command also shows whose it is: Yours, Your copy, or
226
+ Read-only.
227
+ - **One Done button**, with "Changes apply as you edit · Ctrl Z to undo". Closing it any way is
228
+ safe: changes already apply as you make them.
229
+ - **One undo step per drawer:** everything changed between opening the drawer and Done is
230
+ undone with a single Ctrl Z.
231
+ - The drawer's body is the only thing that scrolls; the editors' own padded scroll areas are
232
+ gone.
233
+ - **The command editor, redone (#186, part 2).**
234
+ - **Its tabs sit in the drawer's header**, so they never scroll away: Actions, Enable rules (n),
235
+ Display rules (n) and Used by (n). The tab you're on is kept while you look at a rule.
236
+ - **Out-of-the-box commands are read-only until you customise them.** Before, editing one
237
+ customised it without asking. The fields look read-only, one line says why, and
238
+ **Customise command** is next to it. Viewing the script and opening a rule still work.
239
+ - **One Add action menu** (Run JavaScript, Open a URL) instead of a dropdown and two buttons.
240
+ - **Each action is a card** with a drag handle, Move up / Move down in its ⋮ menu, and Remove.
241
+ - **View script / Edit script** open the script inside the drawer, filling its height, with
242
+ Back to the command. Edit script saves straight to Dataverse, and says so. The "Monaco"
243
+ wording and the "integration path" note are gone.
244
+ - **Pass parameters** is a labelled switch instead of a button reading "✓ PassParams ON".
245
+ - **Plain labels and hints:** Library, Function ("The function's full name, including its
246
+ namespace."), Parameters, in order; the address error is a field message.
247
+ - **Rename** is a pencil next to your own command's id, with the error under the field.
248
+ Settings and Versions are gone (History in the bottom panel covers the second).
249
+ - **Used by** names each button and where it is ("Main grid › Main › Management").
250
+ - **Rules are tags:** open one with a click, unbind it with its ×. **New enable rule** now also
251
+ adds the rule to the command.
252
+ - **Rules, tab display rules and scaling (#186, part 3).**
253
+ - **The editor drawer is 720 px wide for every view**, so it doesn't change width when you open a
254
+ rule from a command and go back. A rule's nested Or steps no longer scroll sideways: parameter
255
+ rows shrink and wrap instead of sizing themselves to their longest option.
256
+ - **The rule view** says "Passes when every step below is true." Steps are numbered, with a
257
+ drag handle and Move up / Move down in a ⋮ menu (the "Drag" text button is gone). The header
258
+ shows the rule's id with copy, **Rename** for a rule that isn't Microsoft's (errors under the
259
+ field; the "Apply ID change" row is gone) and how many commands use it. "In words" heads the
260
+ summary.
261
+ - **Tab display rules open in the editor drawer and apply as you edit.** Save and Cancel are
262
+ gone: Done, and one Ctrl Z undoes everything done there. Steps are numbered cards; on the
263
+ application ribbon Add step offers a table step or a page step. An empty page address is a
264
+ field error (and Publish's check still blocks it). A tab another solution adds says so and is
265
+ read-only.
266
+ - **Scaling is read-only for now (#165).** Changes to scaling could never be published, so the
267
+ Scaling editor is removed until #165 makes them publishable. Properties shows the tab's
268
+ groups and scaling steps, and says scaling only shapes the classic ribbon.
269
+ - **XML and Compare in the editor drawer (#186, part 4).**
270
+ - **The XML of your changes opens on the location you're looking at**, not always on the home
271
+ grid, with Unified Interface names on its tabs. Copy, Download, Format and Import this XML sit
272
+ in a toolbar. Import takes the drawer's place instead of opening a dialog over it.
273
+ - **Compare with published** fills the drawer's height; Side by side / Unified are tabs.
274
+ - **History's View diff shows what that change did.** Before, every entry showed everything
275
+ since the last publish while saying it showed the entry's change.
276
+ - **No more "View solution layers".** Its drawer listed every solution in the environment as
277
+ a "layer" of the button, and called the newest the winner, whatever the button was. Dataverse
278
+ layers ribbon customizations per table, not per button; the button's notice still names the
279
+ managed solution and publisher it comes from.
280
+ - **List view:** the buttons table no longer runs under the modern commands below it on a short
281
+ window. It's as tall as its rows, up to ten, and scrolls for more.
282
+ - **Import RibbonDiffXml in two columns (#187, part 2).**
283
+ - **The editor keeps its height.** Before, it shrank to almost nothing after a preview, as the
284
+ message bars piled up under it. The preview now sits beside it and scrolls on its own.
285
+ - **One line above the editor** ("From Ribbon Workbench or a solution's customizations.xml. Only
286
+ <table>'s part is used.") replaces the 70-word introduction.
287
+ - **The preview counts what it found** ("Preview · 2 changes, 1 problem"), lists each change with
288
+ an Add / Update / Hide badge, and lists every problem in one list instead of a message bar per
289
+ error. A problem with a line ("Line 3: …") moves the editor to that line.
290
+ - **Import says how many changes it brings** ("Import 2 changes") and is off while there are
291
+ errors. Preview becomes "Preview again". After the import there's one Close button.
292
+ - **XML parse errors read as the parser's message**, without the browser's "This page contains
293
+ the following errors" wrapper.
294
+ - The dialog uses the shared dialog shell at its large size.
295
+ - **Translations in the editor drawer, applied as you type (#187, part 3).**
296
+ - **No Save or Cancel:** a change applies as you type, and one Ctrl Z undoes the whole edit.
297
+ The base language is still the button's own text (#157) and can't be emptied ("A button needs
298
+ a label."). Other languages are written to the button's labels with the base text kept in
299
+ step; opening it writes nothing.
300
+ - **Languages by name** ("German · 1031") instead of emoji flags, which Windows showed as
301
+ letter pairs. Each language is a card of labelled fields ("Label (German)"), not a raw table
302
+ of browser inputs that turned into white boxes in dark theme.
303
+ - **Add a language** from a list, or by LCID; a language you add stores nothing until it has
304
+ text. Remove one with its delete button, which the keyboard reaches.
305
+ - **A line-break button** in each label field; the hint no longer garbles its own example.
306
+ - **A built-in or another solution's button is read-only here too**, as in Properties.
307
+ - **The icon picker, redone (#187, part 4).**
308
+ - **Icons are buttons** in one group the arrow keys move through; Enter picks one. Before they
309
+ were clickable boxes the keyboard couldn't reach.
310
+ - **Regular / Filled are two toggles** whose labels stay put; the switch's label flipped with
311
+ its state.
312
+ - **The selection names the icon** ("Edit · Filled") and the web resource it's saved as, instead
313
+ of a raw `ModernImage="$webresource:…"` string.
314
+ - **Web resources:** the first 300 show, and the count says so ("Showing 300 of 1,240 SVG web
315
+ resources. Search to find others."); before, the list stopped at 200 without a word. The rows
316
+ are buttons, and the field takes a plain name.
317
+ - **Upload SVG is a real drop zone** with a **Choose SVG…** button; before it said "Drag an SVG
318
+ here" and ignored the drop. A file that isn't an SVG is refused with a message.
319
+ - Errors and notes are message bars, and the dialog uses the shared dialog shell.
320
+ - **The command palette, redone (#189, part 1).**
321
+ - **A real dialog:** focus stays in it, and Escape or a click outside closes it. Its search box
322
+ is Fluent's, readable in dark theme and with a focus outline.
323
+ - **The highlighted result follows the arrow keys** (Home and End too), stays in view, and is
324
+ announced to screen readers. Enter chooses it.
325
+ - **Choosing a button selects it on the canvas**, on its location and tab; before, it only
326
+ closed the palette. Its line names where it is ("Main form › Main › Management") without raw
327
+ location names or `$LocLabels:` tokens.
328
+ - **Grouped results** (Actions, Buttons, Commands, Rules, Tables) with readable kinds, and a
329
+ count of what's left when a group is cut ("12 more: keep typing to narrow it down").
330
+ - **`/` shows only actions and `@` only tables**; `/` used to filter nothing.
331
+ - **Only actions that can run are listed:** Undo and Redo when there's something to undo or
332
+ redo, Translations for a selected button you can edit, New button when there's a group.
333
+ - **No theme toggle:** the theme follows Power Platform ToolBox's setting.
334
+ - **The shared editors, redone (#189, part 2).**
335
+ - **Parameter rows label every field** (Type, Name, Value) and use plain type names ("From the
336
+ context", "Text", "True or false", "Whole number", "Decimal number"). Context values are
337
+ grouped (Context, Record, Selection context, Grid selection, Org/User) instead of one list of
338
+ 23. A URL parameter without a name says so under its field instead of showing a coloured dot,
339
+ and true / false is a switch.
340
+ - **Rule steps show friendly names** for the values the XML keeps ("Existing record", "Primary
341
+ table (the form or grid)", "Sub-grid", "User (Basic)", "One-to-many"…), use spin buttons for
342
+ counts and versions ("At least" / "At most"), and explain "If it can't be evaluated" and
343
+ "Invert result" on screen instead of in hover-only tooltips. Their fields wrap in a grid.
344
+ - **Kinds of step have plain names** ("Table privilege", "Your JavaScript", "Column value",
345
+ "Selected records"…), in groups such as Client and device, Form, Table and Your code. The
346
+ step picker searches with a Fluent search box and the arrow keys; the Quick action note is an
347
+ info button.
348
+ - **Provenance actions** (Customise, Uncustomise, Discard) sit in the message bar's actions area.
349
+ - **Tables are picked in the top bar (#194, step 1).** The left pane's Tables tab is replaced by a
350
+ Table combobox next to the solution, the first step of Edit mode.
351
+ - **The list** groups the solution's tables as Custom and Standard, with their logical names.
352
+ Typing filters by display or logical name. Alt+↓ opens it, and Escape closes it.
353
+ - **Markers:** the open table shows its number of unpublished changes. Another table with a
354
+ draft saved on this computer shows "Draft", and managed tables show a lock.
355
+ - **Switching** still asks first when there are unpublished changes.
356
+ - **"Choose table"** on the empty canvas opens the list, at any window width.
357
+ - **The left pane** shows Solution Elements only, until the Structure tree arrives (#194,
358
+ step 2).
359
+ - **The location's tabs, groups and buttons are a tree in the left pane (#194, step 2).** The left
360
+ pane has two tabs: **Structure** (the default) and **Solution**, which shows Solution Elements
361
+ as before. The ribbon tab strip above the canvas is gone.
362
+ - **The tree** shows tab › group › control for the location you're on. Groups show how many
363
+ controls they have, and controls show their Sequence or **Hidden**, a dot for yours, and are
364
+ listed in Sequence order.
365
+ - **Choosing a node** (click or Enter) shows that tab on the canvas, or selects the group or
366
+ control on the canvas and in Properties. A selection made on the canvas is shown in the tree,
367
+ with its group opened. The arrow keys move through the tree.
368
+ - **Each node has a menu:** right-click, Shift+F10, the Menu key, or its **⋯** button. A tab's
369
+ menu has Rename…, Tab display rules… (with the rule count), Add group…, Move up / Move down
370
+ and Delete tab…. Groups and controls have the same menus as on the Classic canvas; a group's
371
+ menu now also has **Add button…**. F2 renames a tab or group, or says why it can't be renamed.
372
+ - **Filter** by label or id: a match's tab and group stay open.
373
+ - **Add tab** is next to the filter. How Unified Interface shows a custom tab is behind an info
374
+ button in the location row.
375
+ - **Below 1200 px** the rail button opens Structure and Solution as a drawer. Choosing a group or
376
+ control closes it and opens Properties; a node's menu keeps it open.
377
+ - **Group cards (#194, step 3).** A new **Group cards** view, the default for anyone who hasn't
378
+ chosen a view: a card per group of the tab, with its template, and its buttons in Sequence order.
379
+ - **Rows** show the icon, the label, **Hidden** or **Yours**, and the Sequence. Click a row (or
380
+ Enter) to select it; right-click, Shift+F10 or the Menu key opens the button's menu.
381
+ - **Drag rows** to reorder them or move them to another card, with the pointer or the keyboard:
382
+ Space picks a row up, the arrow keys move it, Space or Enter drops it and Escape cancels. A
383
+ button that isn't yours moves as your copy, as on the Classic canvas (#26).
384
+ - **Each card's ⋮ menu** is the group menu: Add button…, Rename…, Duplicate group, Change
385
+ template…, **Move left / Move right** and Delete group. **+ Add button** is at the foot of the
386
+ card.
387
+ - **"How users see it" (#194, step 4).** Above the group cards, the tab's commands as the Unified
388
+ Interface command bar lists them: groups and buttons in Sequence order, without the ones your
389
+ customizations or a modern command hide, a button a migrated modern command replaces under that
390
+ command's name, and the visible modern commands among them. What doesn't fit goes into a **⋮ n**
391
+ menu, as in Unified Interface, and the selected command is always in view. Choosing a command
392
+ selects it on the cards, in the tree and in Properties. It's marked **Preview: rules not applied**:
393
+ display and enable rules are evaluated by Simulate mode (#191).
394
+ - **Visual pass, part 1 (#229).** From screenshots of CBS in PPTB Desktop at 1024 and 1920 px:
395
+ - **Properties of a button that isn't yours** shows its Label and tooltips as the canvas does
396
+ ("Save And New", not `Ribbon.Form.MainTab.Save.SaveAndNew`), in fields that look read-only; the
397
+ key they come from is the field's hint.
398
+ - **Placeholders and resource keys read as words:** the application ribbon's
399
+ `{!EntityPluralDisplayName}` tabs show "‹table name, plural›", and keys such as
400
+ `WebResource_Tab_Caption` or `Mscrm_…_ToolTipTitle` show "Web Resource" or the button's name.
401
+ - **No content text below Caption 1 (12 px):** small text, badges and counters are a size up across
402
+ Edit mode, the panes, the bottom panel and the dialogs (the Classic canvas's tiles excepted).
403
+ - **The bottom panel's grids no longer scroll sideways** because of their own vertical scrollbar.
404
+ - **Visual pass, part 2 (#229):** every dialog, the editor drawer's views and the publish dialog,
405
+ from screenshots in PPTB Desktop at 1024 and 1920 px.
406
+ - **Dialogs open on the right control.** New button, New group, New tab and Rename start in their
407
+ name field, not on the close button. Unpublished changes from an earlier session start on
408
+ **Restore changes**, so Enter keeps your work instead of discarding it.
409
+ - **Small dialogs' buttons fit on one line** ("Create group", "Change template" no longer wrap).
410
+ - **Choose a web resource** (from Properties or a JavaScript action) uses the same dialog as the
411
+ rest of CBS. Its list fills the dialog at any window size, Enter chooses a row, and Cancel or Close
412
+ never delivers a choice later.
413
+ - **Below 1200 px, Properties opens under the top bar**, so Publish, Search and the tools stay in
414
+ reach while you edit.
415
+ - **The List view's header sticks to the top edge;** rows no longer show above it as you scroll.
416
+ - **Rule steps fit the drawer:** a step's dropdowns no longer run out of its box, and the step
417
+ list opens inside the drawer.
418
+ - **Translations:** Label, Tooltip title and Tooltip body line up at the top.
419
+ - **The publish dialog** shows **What Publish imports** wide, and Solution version at the size of
420
+ the fields around it.
421
+ - **Icon names wrap between words** ("Clipboard / Paste", not "ClipboardPast / e").
422
+ - **Help lists the shortcuts** one to a line. **Compare** shows a count of none in neutral, not
423
+ red. The bottom panel's grids say they fill in once the ribbon loads, instead of "No
424
+ commands." while it loads. One level into the editor drawer, the header no longer repeats the
425
+ Back button's name.
426
+ - **The URL Action Composer is gone.** Nothing opened it, and URL actions are edited in the command
427
+ editor.
428
+ - **Visual pass, dark theme (#229):** every view, the panes and the dialogs captured with PPTB in
429
+ dark.
430
+ - **Button images read in the dark theme.** Ribbon images are drawn for a light command bar, so dark
431
+ glyphs (Sequences, AI Builder) nearly vanished. An image whose visible pixels are dark is now
432
+ shown inverted, in every view including the Classic ribbon; coloured and light images (Power BI,
433
+ Launch playbook) are shown as drawn.
434
+ - **The List view's Modern badge stays in its column:** after a long label, it ran into Kind.
435
+ - **The bottom panel's Commands and rules are grids (#185).** Hundreds of rows stay quick
436
+ (virtualized), the header stays put while the rows scroll, and nothing scrolls sideways: ids are
437
+ cut to their column with the whole id in a tooltip.
438
+ - **A command's rules are tags** that show the part of the id that tells them apart
439
+ (`ExactlyOneSelected`, not `EnableRule`), and open that rule.
440
+ - **One target per row:** a click or Space marks the row, **Edit**, Enter or a double-click opens
441
+ the editor. The rules' constant Type column is gone.
442
+ - **Counts** are badges on the tabs; a tab opens a collapsed panel.
443
+ - **Used by** counts the same way as the Solution tab: a command by the tabs, groups and controls
444
+ that use it, a rule by the commands that list it, per kind.
445
+ - **Search fields are SearchBoxes (#185),** with a clear button: the bottom panel's filters and the web
446
+ resource browser's search.
447
+ - **The Solution tab's + makes a New enable rule or a New display rule (#185),** not always an enable
448
+ rule. Template rows are plain rows, and branch counts are badges.
449
+ - **The List view fits and sorts (#183).** The grid is as tall as its rows, so only the canvas
450
+ scrolls, with the header kept in view; nothing scrolls sideways at 1024 px.
451
+ - **Columns:** #, Label (with its icon, and the id in its tooltip), Kind (`Split button`, not
452
+ `splitButton`), Group, Visible and **⋯**. ID and Command are in the **Columns** menu.
453
+ - **Sorting** works on every column; rows start in the order the tab shows them.
454
+ - **Rows are selected** with a click or Enter, as everywhere else (no radio buttons); the row's
455
+ menu is the button menu (**⋯**, right-click, Shift+F10).
456
+ - **Modern commands** are a collapsible section below the grid, with columns that truncate
457
+ instead of scrolling sideways.
458
+ - **Menus no longer select what they're opened on,** in the List and on the group cards: in a
459
+ narrow window that opened Properties, which took the focus and closed the menu.
460
+ - **The Solution tab is one tree (#194, step 5).** Buttons, Commands, Rules and Templates are
461
+ branches with a count, searched together; a branch with matches opens. Each row shows the part of
462
+ its id that tells it apart (e.g. `ExactlyOneSelected`, not `EnableRule`), with the whole id as its
463
+ description, and how much it's used (`used 3×`, Enable / Display). A branch lists 100 rows at a
464
+ time (**Show n more**), so the 498 commands of a table open at once. Choosing a command or rule
465
+ opens its editor; a button is selected, and its menu (right-click, Shift+F10 or ⋯) has **Go to
466
+ button** and **Add to** each group of the open tab, which adds your copy of it there. **+** makes a
467
+ new command or rule.
468
+ - **Two rail buttons below 1200 px (#194).** **Structure** and **Solution** each open the left pane
469
+ as a drawer on that tab.
470
+ - **Groups can be moved within their tab (#194).** Like tabs (#163), a group your customizations add,
471
+ or a new one, gets a Sequence between its new neighbours and the publish writes it. Two other
472
+ groups can't change places, so Move left / Move right are off there and say why. In the Structure
473
+ tree they read **Move up / Move down**.
474
+ - **A moved button is placed in Sequence order (#194).** Dropping a button before another now
475
+ places it among the destination group's buttons in Sequence order, the order Unified Interface
476
+ shows, not the order the ribbon XML happened to list them in.
477
+
478
+ ### 🔧 Fixed
479
+
480
+ - **Compare's XML diff is coloured (#195).** With a table open and a change pending, Compare
481
+ showed most of the XML without syntax colours: the editor painted before the colours were
482
+ ready and didn't repaint. It now repaints when they arrive.
483
+
12
484
  ## [0.8.0] - 2026-11-01
13
485
 
14
486
  Publish correctness and load performance. Tables open faster, and built-in buttons show captions