From 087e844c227d738a6e6b3ba770373d4815205068 Mon Sep 17 00:00:00 2001 From: Rim Zabarov Date: Thu, 12 Nov 2026 22:57:48 +0300 Subject: [PATCH 1/7] =?UTF-8?q?sf-editor=201.2.4=20over=20SIMAI=20Framewor?= =?UTF-8?q?k=20ui-7fb26d395af2:=20=C2=ABMore=C2=BB=20as=20a=20compact=20bu?= =?UTF-8?q?tton,=20probes=20follow=20the=20pair?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The heading level row kept H1-H3 as a track only with room to spare: over sf-segmented 1.6.0 (C47) the track folds into its dropdown when its labels do not fit, and «More» as a dropdown field took 96 of the 258 at 1440. «More» is now a compact button opening the editor's menu with H4-H6; a chosen deeper level shows on it. The parity probe measures the seen control when folded, cards-390 expects a 14 title on a phone (C34, C89), and the accent probe reads the page's roles outside the bg-primary place (C42 (4)). Co-Authored-By: Claude Opus 5.5 --- package/CHANGELOG.md | 14 +++++++++++++ package/README.md | 7 ++++--- package/framework.lock.json | 4 ++-- package/set.json | 2 +- package/src/smart/editor/component.json | 3 ++- package/src/smart/editor/index.js | 21 +++++++++++++++++++ .../src/smart/editor/js/templates/default.css | 4 ++-- .../src/smart/editor/js/templates/default.js | 14 +++++++++---- package/tests/browser/editor-1-2.browser.mjs | 7 +++++-- .../tests/browser/editor-parity.browser.mjs | 14 +++++++++---- 10 files changed, 71 insertions(+), 19 deletions(-) diff --git a/package/CHANGELOG.md b/package/CHANGELOG.md index ec24bc3..3d54456 100644 --- a/package/CHANGELOG.md +++ b/package/CHANGELOG.md @@ -3,6 +3,20 @@ The set `editor`, by its npm version `@simai-studio/editor`; component versions in brackets. +## Unreleased + +- `sf-editor` 1.2.4: over SIMAI Framework `ui-7fb26d395af2` a segmented + track folds into its dropdown when its labels do not fit (sf-segmented + 1.6.0, C47). The heading level row keeps H1–H3 as a track at 1440: + «More» is a compact button (⋯) that opens the editor's menu with H4–H6, + and shows the chosen deeper level (H5) when there is one, instead of a + dropdown field whose label and chevron took the track's room. +- The probes follow the pair: a card title is 14 on a phone (C34, C89); the + accent section's roles are read outside the bg-primary place, whose own + primary and on-primary are its ink and fill (C42 (4)); the parity probe + measures the control a person sees when the level track is folded. +- Built over SIMAI Framework `ui-7fb26d395af2` (ui-source `8c13bf45aeca`). + ## 1.1.1 — 2026-11-09 - `sf-editor` 1.2.3: over SIMAI Framework `ui-b4a77681f0a7` the 1/3 control diff --git a/package/README.md b/package/README.md index 89fa74a..c005a86 100644 --- a/package/README.md +++ b/package/README.md @@ -41,9 +41,10 @@ ui-source at the revision `framework.lock.json` pins (from git, never a working tree), with this folder's `src/` and `tests/` laid over it. A file here may not replace a ui-source file. -The pin is `a29cc9989beb`, the source of the released pair -`ui-b4a77681f0a7` (core.runtime 1.47.0), whose 1/3 control is 28 on a -desktop (C27); `ui-cb287da78ab1` was the first that carries the shadow +The pin is `8c13bf45aeca`, the source of the released pair +`ui-7fb26d395af2`, whose segmented track folds into its dropdown when its +labels do not fit (C47); `ui-b4a77681f0a7` was the first whose 1/3 control +is 28 on a desktop (C27), `ui-cb287da78ab1` was the first that carries the shadow places (C20), `ui-d6f01121baca` was the first that names `sf-segmented`, the ghost look and the C16 surface and state roles the editor reads; `ui-0c23f6a0af12` was the first whose Composition render takes `options.embedded`, `ui-1e5ec795a1ce` the first whose name registry diff --git a/package/framework.lock.json b/package/framework.lock.json index 7f66d96..676d702 100644 --- a/package/framework.lock.json +++ b/package/framework.lock.json @@ -1,10 +1,10 @@ { "schema": "simai.framework.product-package-source-lock", "schema_version": 1, - "summary": "The ui-source revision the set editor is built and tested against: the overlay is ui-source at this revision with this folder's src/, tests/ and docs/ laid over it, and ui-builder's package build builds the same (standards simai.component-set 1.0.0 and simai.component-package 1.1.1). It is the source of the released SIMAI Framework pair ui-b4a77681f0a7 (simai/ui contracts/releases/ui-b4a77681f0a7.lock.json, build_inputs.source). The same commit is framework.source_revision in set.json.", + "summary": "The ui-source revision the set editor is built and tested against: the overlay is ui-source at this revision with this folder's src/, tests/ and docs/ laid over it, and ui-builder's package build builds the same (standards simai.component-set 1.0.0 and simai.component-package 1.1.1). It is the source of the released SIMAI Framework pair ui-7fb26d395af2 (simai/ui contracts/releases/ui-7fb26d395af2.lock.json, build_inputs.source). The same commit is framework.source_revision in set.json.", "package": "editor", "source": { "repository": "simai/ui-source", - "revision": "a29cc9989bebace9a98c235b074ce23998ad39c6" + "revision": "8c13bf45aecaae2c31188b729ef4765fc91bffae" } } diff --git a/package/set.json b/package/set.json index e4ce576..73f7ab4 100644 --- a/package/set.json +++ b/package/set.json @@ -15,7 +15,7 @@ }, "framework": { "core_runtime": ">=1.43.0", - "source_revision": "a29cc9989bebace9a98c235b074ce23998ad39c6" + "source_revision": "8c13bf45aecaae2c31188b729ef4765fc91bffae" }, "requires_sets": [], "families": [ diff --git a/package/src/smart/editor/component.json b/package/src/smart/editor/component.json index a985245..5faefa7 100644 --- a/package/src/smart/editor/component.json +++ b/package/src/smart/editor/component.json @@ -2,7 +2,7 @@ "$comment": "The source of sf-editor's element plumbing (core/js/element-manifest.js); standard simai.smart-component 1.4, vocabulary 1.1.5. Part B of the owner's one-block-editor decision of 2026-11-03 (ui-control control/ui-editor/UNIFIED-BLOCK-EDITOR.md, control/decisions/2026-11-03-one-editor-part-a.md), on the Part A contracts of SIMAI Framework pair ui-a2ca21f06e0c. Written by hand in the 1.4 form on the shape of sf-editor-content; x-decisions says how each point was decided.", "id": "smart.editor", "tag": "sf-editor", - "version": "1.2.3", + "version": "1.2.4", "kind": "leaf", "family": "editor", "settings": { @@ -460,6 +460,7 @@ "storage: none. Every change is a change event with the whole Document; site blocks go out in block-save.", "version 1.2.1 (2026-11-08): a patch (accessibility). The canvas draws the page Document with Composition render options.embedded (SIMAI Framework pair ui-0c23f6a0af12, ui-source #60), so the page's layout.page and a main region become
inside the editor's own page instead of a second, nested main (axe landmark-main-is-top-level, landmark-no-duplicate-main). The canvas still counts that div as the page's main landmark, so around such a page it stays an unnamed group and the page's landmarks stay top level, as before. toHTML, the HTML a site prints, keeps the landmarks. A pair before it ignores the option. Settings, values and events are unchanged.", "version 1.2.2 (2026-11-09): a patch (names). The editor writes the names of SIMAI Framework pair ui-d6f01121baca (core.runtime 1.42.0) instead of their dated aliases (removed 2027-01-01): sf-segmented with appearance track for sf-button-group with appearance segmented (relation cl-segmented, uses smart.segmented), appearance ghost for link on sf-button, and the C16 roles --sf-surface-page, --sf-surface-area, --sf-on-surface-container-variant, --sf-surface-state-hover, --sf-primary-state-select and --sf-shadow-card for --sf-surface-0, --sf-surface-1, --sf-on-surface-container--variant, --sf-surface-transparent-hover, --sf-primary-transparent-select and --sf-elevation-1--shadow. The drawing is the same. C20 (ui-source feat/c20-shadows, core.runtime 1.43.0, the pair after ui-d6f01121baca): the four floating panels (help, the floating block toolbar, the catalogue, the lock note) stand on the overlay place, --sf-surface-popup, --sf-shadow-overlay and --sf-on-surface-popup-variant, for --sf-elevation-2--surface, --sf-elevation-2--shadow and --sf-on-elevation-2--variant; the page sheet takes --sf-shadow-raised for --sf-shadow-card. Those former names stay until 2027-01-01; the overlay is the owner-approved C20 look. The set needs core.runtime 1.43.0 or newer. Over the pair ui-cb287da78ab1 (core.runtime 1.45.0, standard §4.4) the reference names one args object per action, whose schema is the action's `with` fields (ui-source 9d2eeb8e); the actions are the runtime's (elementFromManifest actions), which take that object and the fields in order alike. Settings, values and events are unchanged.", + "version 1.2.4 (2026-11-12): a patch (look, sf-segmented 1.6.0 C47). Over SIMAI Framework pair ui-7fb26d395af2 a segmented track folds into its dropdown when its labels do not fit the room it is given. The heading level row (H1–H3 and «More» at 1440) no longer had the room with «More» as a field: its label and chevron took 96 of the 258. «More» is now a compact button that opens the editor's menu with the deeper steps (H4–H6); when one of them is chosen the button shows it (tonal, «H5»), so the level stays in sight. The track keeps the rest of the row and stays a track at 1440. The value it writes and the events are unchanged.", "version 1.2.3 (2026-11-09): a patch (sizes, C27 with C18/C19, DEV option A). Over SIMAI Framework pair ui-b4a77681f0a7 (core.runtime 1.47.0) the 1/3 control is 28 on a desktop (C27); the gutter's + and grip keep following --sf-ui-1/3--control-height (28 on a desktop, the phone step on a phone), with no local 24. The gutter stands in the canvas's start inset (--sf-editor-gutter-room grows with the ladder), never at a negative offset, so it stays inside the window at 1280, 1440 and 390; at 1440 the sheet is 788, the canvas beside the larger room. The gap between the gutter and its block is the gutter's end margin (--sf-editor-gutter-gap, --sf-space-1/4) read by the placement, for the 4 the script held. Settings, values and events are unchanged." ], "x-rule": { diff --git a/package/src/smart/editor/index.js b/package/src/smart/editor/index.js index f188186..86aecdf 100644 --- a/package/src/smart/editor/index.js +++ b/package/src/smart/editor/index.js @@ -1469,11 +1469,32 @@ class SfEditor extends EditorElement { menu.openFor?.(button, {side: "block-end", align: "start"}); } + /** The deeper steps of a field (a heading's H4–H6) in the editor's menu, under their button. */ + openStepsMenu(field, steps, anchor) { + const menu = this.querySelector(".sf-editor-menu"); + if (!menu) return; + const current = String(field.value ?? ""); + menu.entries = steps.map((step) => ({id: `step:${step.value}`, text: step.label, current: step.value === current})); + menu.dataset.for = this.model.selected ?? ""; + this.stepsField = field; + const button = anchor?.querySelector?.(":scope > button, button") ?? anchor; + menu.openFor?.(button, {side: "block-end", align: "end"}); + } + onMenuSelect(event) { event.stopPropagation(); const menu = event.currentTarget; const id = menu.dataset.for; const action = event.detail?.entry?.id ?? event.detail?.id; + if (typeof action === "string" && action.startsWith("step:")) { + const field = this.stepsField; + this.stepsField = null; + if (!field || id !== this.model.selected) return; + const result = this.model.setParam(id, field.key, action.slice(5), this.breakpoint); + if (!result.ok) this.say(this.sfWord(`refused-${result.reason}`)); + this.redraw(); + return; + } queueMicrotask(() => { // The menu closes: the keys (⌘Z first) act where a person works, on the canvas. if (action !== "build") this.canvasElement?.focus({preventScroll: true}); diff --git a/package/src/smart/editor/js/templates/default.css b/package/src/smart/editor/js/templates/default.css index 87a2470..6cd6d88 100644 --- a/package/src/smart/editor/js/templates/default.css +++ b/package/src/smart/editor/js/templates/default.css @@ -1026,9 +1026,9 @@ min-inline-size: 0; } - .sf-editor-switch-row > sf-dropdown > * { + /* «More» keeps its own width: the track takes the rest of the row. */ + .sf-editor-switch-row > .sf-editor-more-steps > * { flex: none; - inline-size: calc(var(--sf-ui-1\/2--control-height) * 3); } diff --git a/package/src/smart/editor/js/templates/default.js b/package/src/smart/editor/js/templates/default.js index 5ea42e8..8ee1472 100644 --- a/package/src/smart/editor/js/templates/default.js +++ b/package/src/smart/editor/js/templates/default.js @@ -597,10 +597,16 @@ function fieldRow(component, field, w) { const shown = all.slice(0, 3); const rest = all.slice(3); const inRest = rest.some((item) => item.value === String(value)); - control = segmentedSwitch(field, shown, inRest ? "" : value, component, rest.length ? html` - ({value: item.value, text: item.label}))} .value=${inRest ? String(value) : ""} - @change=${(event) => component.onField(event, field)}>` : nothing); + // «More» is a compact button with the editor's menu, not a field: a field's + // label and chevron took the room the track needs to stay a track (it folds + // into a dropdown when its labels do not fit, sf-segmented 1.6.0). The chosen + // deeper step is the button's text, so the level stays in sight. + const chosen = rest.find((item) => item.value === String(value)); + const label = w("more-steps", {name: field.label}); + const open = (event) => component.openStepsMenu(field, rest, event.currentTarget); + control = segmentedSwitch(field, shown, inRest ? "" : value, component, !rest.length ? nothing : chosen + ? html`` + : html``); } else if (field.choiceLabels.length && segmented(field)) { // Alignment draws as the prototype's three icons; the words stay their names. const icon = field.target === "align" ? ALIGN_ICONS : null; diff --git a/package/tests/browser/editor-1-2.browser.mjs b/package/tests/browser/editor-1-2.browser.mjs index 39f4b6e..100f334 100644 --- a/package/tests/browser/editor-1-2.browser.mjs +++ b/package/tests/browser/editor-1-2.browser.mjs @@ -368,9 +368,11 @@ try { await settle(tab, 500); const seen = await tab.evaluate((id) => { const section = document.querySelector(`#editor .sf-editor-page [data-sf-composition-id="${id}"]`); + // Inside a bg-primary place --sf-primary and --sf-on-primary are the place's + // own ink and fill (C42 (4)): the page's roles are read outside it. const probe = document.createElement('span'); probe.style.cssText = 'color: var(--sf-primary); background: var(--sf-on-primary)'; - section.append(probe); + section.parentElement.append(probe); const want = getComputedStyle(probe); const text = section.querySelector('h1, h2, h3, p') ?? section; const result = {classes: section.className, background: getComputedStyle(section).backgroundColor, primary: want.color, text: getComputedStyle(text).color, onPrimary: want.backgroundColor}; @@ -444,7 +446,8 @@ try { const at = heading.getBoundingClientRect(); return {card: {left: card.left, right: card.right}, lines, size: parseFloat(style.fontSize), weight: Number(style.fontWeight), title: {left: at.left, right: at.right}}; })); - check('cards-390: a heading in a card is its title, 16 px semibold', titled.every((card) => Math.abs(card.size - 16) <= 0.5 && card.weight >= 600 && card.weight < 700), titled.map((card) => [card.size, card.weight])); + // A card title is 14/18 on a phone, 16/24 on a desktop (owner decisions C34, C89). + check('cards-390: a heading in a card is its title, 14 px semibold on the phone', titled.every((card) => Math.abs(card.size - 14) <= 0.5 && card.weight >= 600 && card.weight < 700), titled.map((card) => [card.size, card.weight])); check('cards-390: no line leaves its card', titled.every((card) => card.lines.every((line) => line.left >= card.card.left - 0.5 && line.right <= card.card.right + 0.5 && line.scroll <= 0)), titled); check('cards-390: the titles do not overlap', titled.every((card, index) => index === 0 || card.title.left >= titled[index - 1].title.right), titled.map((card) => card.title)); check('cards-390: no page errors', cards.errors.length === 0, cards.errors.slice(0, 3)); diff --git a/package/tests/browser/editor-parity.browser.mjs b/package/tests/browser/editor-parity.browser.mjs index 7e9e4aa..75aef92 100644 --- a/package/tests/browser/editor-parity.browser.mjs +++ b/package/tests/browser/editor-parity.browser.mjs @@ -456,6 +456,11 @@ try { if (!right?.checkVisibility?.()) return null; const row = right.querySelector('.sf-editor-field[data-key="level"]'); const group = row?.querySelector('.sf-button-group'); + // sf-segmented 1.6.0 folds into its dropdown when its labels do not fit + // the row: the track stays in the tree, inert, to be measured, and the + // person sees the dropdown. What is seen is measured. + const folded = Boolean(group?.classList.contains('sf-button-group--folded')); + const seen = folded ? row.querySelector('.sf-button-group-narrow') : group; const segments = [...(group?.querySelectorAll('.sf-button-group-segment') ?? [])]; const active = segments.find((segment) => segment.classList.contains('active')); const plate = group?.querySelector('.sf-button-group-plate'); @@ -465,7 +470,8 @@ try { const primary = getComputedStyle(probe).color; probe.remove(); return { - labels: segments.map((segment) => segment.textContent.trim()), active: active?.textContent.trim(), + folded, labels: segments.map((segment) => segment.textContent.trim()), + active: folded ? seen?.querySelector('.sf-dropdown-value')?.textContent.trim() : active?.textContent.trim(), // Since sf-segmented 1.4.0 (pair ui-d6f01121baca, D11c) the track draws the // choice as one plate under the chosen segment, not as the segment's fill. activeFill: plate ? getComputedStyle(plate).backgroundColor : '', activeShadow: plate ? getComputedStyle(plate).boxShadow : '', primary, @@ -474,11 +480,11 @@ try { const p = plate?.getBoundingClientRect(); return Boolean(a && p) && Math.abs(a.left - p.left) <= 1 && Math.abs(a.width - p.width) <= 1; })(), - height: group ? Math.round(group.getBoundingClientRect().height) : 0, + height: seen ? Math.round(seen.getBoundingClientRect().height) : 0, more: Boolean(row?.querySelector('.sf-editor-more-steps')), sameRow: (() => { const more = row?.querySelector('.sf-editor-more-steps > *')?.getBoundingClientRect(); - const track = group?.getBoundingClientRect(); + const track = seen?.getBoundingClientRect(); return Boolean(more && track) && Math.abs(more.top - track.top) <= 1 && more.left >= track.right; })(), primaryPlates: [...right.querySelectorAll('.sf-button-group--segmented > .sf-button-group-segment.active')].filter((segment) => getComputedStyle(segment).backgroundColor === primary).length, @@ -486,7 +492,7 @@ try { }); if (level) { check(`8 ${label}: the heading level is H1–H3 with the rest behind «ещё»`, level.labels.join() === 'H1,H2,H3' && level.active === 'H2' && level.more && level.sameRow, level); - check(`8 ${label}: the switch is light: the chosen segment a raised surface with a shadow, no primary fill anywhere`, level.activeFill !== level.primary && level.activeFill !== 'rgba(0, 0, 0, 0)' && level.activeShadow !== 'none' && level.plateUnderActive && level.primaryPlates === 0 && level.height === bar.control, level); + check(`8 ${label}: the switch is light: the chosen segment a raised surface with a shadow, no primary fill anywhere`, (level.folded || level.activeFill !== level.primary && level.activeFill !== 'rgba(0, 0, 0, 0)' && level.activeShadow !== 'none' && level.plateUnderActive) && level.primaryPlates === 0 && level.height === bar.control, level); const panel = await tab.evaluate(() => { const right = document.querySelector('#editor .sf-editor-right'); const cards = [...right.querySelectorAll('.sf-editor-card')]; From 93054243d1d6e25720f82f45112b09dca8dac98f Mon Sep 17 00:00:00 2001 From: Rim Zabarov Date: Thu, 12 Nov 2026 22:58:54 +0300 Subject: [PATCH 2/7] sf-editor 1.2.4: manifest version and source digests, registry test names 1.2.4 Co-Authored-By: Claude Opus 5.5 --- package/src/smart/editor/smart.manifest.json | 10 +++++----- package/tests/smart-contract-registry-package.test.mjs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package/src/smart/editor/smart.manifest.json b/package/src/smart/editor/smart.manifest.json index bd1ae26..15e5787 100644 --- a/package/src/smart/editor/smart.manifest.json +++ b/package/src/smart/editor/smart.manifest.json @@ -1,7 +1,7 @@ { "schema_version": 2, "id": "smart.editor", - "version": "1.2.3", + "version": "1.2.4", "title": "Page editor", "summary": "The one block editor of the SIMAI page: layout and text in one Composition Document, edited by depth. A click on text types, a click beside it chooses the block, Esc goes up and Enter down. One catalogue (Text and Blocks, groups, variants with pictures, search, favourites, recent) serves the + between blocks, / in text and the library; blocks move by the grip with drop lines or Alt+arrows, and a drop beside a block splits it into columns. The parameter panel says where every value comes from (type, theme, variant, block, screen) and sets values per screen; the Data tab binds a block to a host source through the source port. The block builder makes and changes site blocks everywhere; the site template is a separate, explicit edit. Rights and theme come from the host. One undo history; output as JSON, HTML and Markdown.", "kind": "smart", @@ -590,7 +590,7 @@ "source_artifacts": [ { "path": "src/smart/editor/index.js", - "sha256": "7d10660bb1ae33aff903189c49f31c650a3cbf2089a4d5ff523161efc5763e5b" + "sha256": "cc362bd96b8444a3b572a6130de2a0649bfc94c5f9cb40d75ac7cadff93aa6b8" }, { "path": "src/smart/editor/js/model.mjs", @@ -606,11 +606,11 @@ }, { "path": "src/smart/editor/js/templates/default.js", - "sha256": "64e1cd32def3c19789d8a888b7dc7c2ffa33a87bd6b078519a9809c09484e3ae" + "sha256": "5663f5b9355b47568df4a4539ce65b06eb22fc8ca169d0d739cb6d217045ce4d" }, { "path": "src/smart/editor/js/templates/default.css", - "sha256": "094a0dd7b7a6a091f005a8fbe0ac0f9e5d9e387154609ef0177a739dca7c65c6" + "sha256": "7aa7080cdea1aa8151c583c588019f57fec9f2624eb70e04c5305a0636152161" }, { "path": "src/smart/editor/rule.js", @@ -622,7 +622,7 @@ }, { "path": "src/smart/editor/component.json", - "sha256": "c1c85ff233378ae60ccca226539aa522142fdd427e729c628f71e4fbded9b5a4" + "sha256": "93c95880bbd1800241cb119bba94f403c1f8ed47e51859ca54364d9c794b6389" }, { "path": "src/smart/editor/lang/en.json", diff --git a/package/tests/smart-contract-registry-package.test.mjs b/package/tests/smart-contract-registry-package.test.mjs index a2eae97..1ba3d81 100644 --- a/package/tests/smart-contract-registry-package.test.mjs +++ b/package/tests/smart-contract-registry-package.test.mjs @@ -25,6 +25,6 @@ test("the set's editor is generated into the searchable registry beside the free test("CLI describes and verifies sf-editor", () => { const packet = JSON.parse(run("describe", "smart.editor", "--format", "ai")); assert.equal(packet.public_abi.custom_element, "sf-editor"); - assert.equal(packet.identity.version, "1.2.3"); + assert.equal(packet.identity.version, "1.2.4"); assert.deepEqual(JSON.parse(run("verify", "smart.editor")), {ok: true, verified: ["smart.editor"]}); }); From 69991bb5d34232ba6fbda0597d707354fefaba24 Mon Sep 17 00:00:00 2001 From: Rim Zabarov Date: Thu, 12 Nov 2026 22:59:06 +0300 Subject: [PATCH 3/7] The registry test counts 84 entries at the pair ui-7fb26d395af2 Co-Authored-By: Claude Opus 5.5 --- package/tests/smart-contract-registry-package.test.mjs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package/tests/smart-contract-registry-package.test.mjs b/package/tests/smart-contract-registry-package.test.mjs index 1ba3d81..c0e8c5c 100644 --- a/package/tests/smart-contract-registry-package.test.mjs +++ b/package/tests/smart-contract-registry-package.test.mjs @@ -16,8 +16,9 @@ test("the set's editor is generated into the searchable registry beside the free assert.equal(registry.schema, "simai.smart-component-contract-registry.v2"); // The free registry's Smart components at the pinned revision (71 at // ec2f29df) and the set's one, sf-editor, make 72. At da48ba8f (pair - // ui-0c23f6a0af12) the free registry holds 81: 82. - assert.equal(registry.entries.length, 82); + // ui-0c23f6a0af12) the free registry holds 81: 82. At 8c13bf45 (pair + // ui-7fb26d395af2) it holds 83: 84. + assert.equal(registry.entries.length, 84); assert.ok(registry.entries.some((entry) => entry.id === "smart.editor"), "smart.editor"); assert.ok(registry.entries.every(({contract_schema}) => contract_schema.version === 2)); }); From b24db1799f9b511d03928afb048acd2a086e66cd Mon Sep 17 00:00:00 2001 From: Rim Zabarov Date: Thu, 12 Nov 2026 23:17:47 +0300 Subject: [PATCH 4/7] First paint: the editor's snapshots over ui-7fb26d395af2 Co-Authored-By: Claude Opus 5.5 --- .../smart/editor/static/default/author.html | 28 ++++++++-------- .../smart/editor/static/default/empty.html | 30 +++++++++-------- .../editor/static/default/reference.html | 32 ++++++++++--------- package/src/smart/editor/static/sheets.json | 4 +++ 4 files changed, 52 insertions(+), 42 deletions(-) diff --git a/package/src/smart/editor/static/default/author.html b/package/src/smart/editor/static/default/author.html index 1a2e876..24c4aac 100644 --- a/package/src/smart/editor/static/default/author.html +++ b/package/src/smart/editor/static/default/author.html @@ -26,19 +26,19 @@
- - -
+
@@ -134,6 +135,7 @@

Блоки и структура

+ @@ -148,7 +150,7 @@

- - -

+
@@ -134,6 +135,7 @@

Блоки и структура

+ @@ -143,7 +145,7 @@

Блоки и структура

- - - -
+
@@ -148,6 +149,7 @@

Блоки и структура

+ @@ -157,7 +159,7 @@

Блоки и структура

-