smoodly 0.0.56 → 0.0.57
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.
- package/dist/admin/files.generated.js +1 -1
- package/dist/admin/shell/IconRail.js +13 -8
- package/dist/admin/shell/console-links.d.ts +3 -0
- package/dist/admin/shell/console-links.js +8 -3
- package/dist/admin/ui/theme.js +25 -12
- package/dist/marks.d.ts +4 -2
- package/dist/marks.js +4 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -14,27 +14,32 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
14
14
|
// 2026-09-25; the route is /settings; every member has a page there since
|
|
15
15
|
// Redirects, 2026-09-26, so the shell passes `settings` once the role is
|
|
16
16
|
// known). The user avatar is pinned to the bottom and opens the account
|
|
17
|
-
// flyout: the email, the theme toggle, "
|
|
17
|
+
// flyout: the email, the theme toggle, "My Account" (at smoodly.io) and Sign
|
|
18
18
|
// out (spec 2026-10-16 sign-in and the dashboard §6).
|
|
19
19
|
//
|
|
20
20
|
// Flyouts: click toggles, Esc closes and returns focus to the trigger,
|
|
21
21
|
// ↑/↓ move between entries, a pointer down outside closes. A child being
|
|
22
22
|
// active highlights its parent tile and the entry inside the menu.
|
|
23
23
|
import { useEffect, useId, useRef, useState } from "react";
|
|
24
|
-
import { Globe, Image, LibraryBig, PanelTop, RadioTower, Settings } from "lucide-react";
|
|
24
|
+
import { ExternalLink, Globe, Image, LibraryBig, PanelTop, RadioTower, Settings } from "lucide-react";
|
|
25
25
|
import { tileCopy } from "./deploy-tile.js";
|
|
26
26
|
import { ThemeToggle } from "../ui/primitives.js";
|
|
27
27
|
import { useAdminHref } from "./base.js";
|
|
28
28
|
import { consoleLinks } from "./console-links.js";
|
|
29
|
+
import { SMOODLY_VERSION } from "../../version.js";
|
|
29
30
|
import { RouteLink } from "./RouteLink.js";
|
|
30
31
|
/** Lucide at the rail's size and stroke (the tile's CSS restates both). */
|
|
31
32
|
const ICON = { size: 18, strokeWidth: 2, "aria-hidden": true };
|
|
32
33
|
/** The app icon, inlined: a package can't ship a file into the host app's
|
|
33
|
-
* /public.
|
|
34
|
-
*
|
|
35
|
-
*
|
|
34
|
+
* /public. The wordmark's "s" on a rounded square (chosen 2026-10-23; the
|
|
35
|
+
* same tile, green with a white s, is smoodly.io's favicon). The square takes
|
|
36
|
+
* --logo-outer and the glyph --logo-inner, so a look decides its colours. */
|
|
36
37
|
function AppIcon() {
|
|
37
|
-
return (_jsxs("svg", { className: "sm-rail__logo", viewBox: "0 0
|
|
38
|
+
return (_jsxs("svg", { className: "sm-rail__logo", viewBox: "0 0 64 64", fill: "none", xmlns: "http://www.w3.org/2000/svg", role: "img", "aria-label": "Smoodly", children: [_jsx("rect", { width: "64", height: "64", rx: "14", style: { fill: "var(--logo-outer)" } }), _jsx("path", { style: { fill: "var(--logo-inner)" }, transform: "translate(14.382 -4.365) scale(0.7123)", d: "M30.5851 22.9763C36.7891 22.9763 45.6052 24.6681 49.3603 26.5237L46.2583 42.2415C41.6869 40.113 35.2653 38.4212 29.4422 38.4212C26.0137 38.4212 23.7825 39.1852 23.7825 40.9862C23.7825 42.1869 24.9797 42.8964 27.1021 43.333L31.5647 44.3153C40.8162 46.3346 45.5508 51.1373 45.5508 58.505C45.5508 73.4587 33.9592 79.1345 18.939 79.1345C11.4833 79.1345 4.24536 77.3335 0.109375 75.6963L3.42905 58.9416C8.97998 61.8341 16.4356 63.6351 21.2247 63.6351C24.6532 63.6351 26.9933 62.7619 26.9933 60.6334C26.9933 59.4327 26.1226 58.505 23.5648 58.0684L19.7553 57.3043C12.5173 55.9399 6.31336 50.9735 6.31336 43.0055C6.31336 30.6169 15.6737 23.0309 30.6939 23.0309L30.5851 22.9763Z" })] }));
|
|
39
|
+
}
|
|
40
|
+
/** A menu link that opens smoodly.io in a new tab, with the arrow that says so. */
|
|
41
|
+
function ExtLink({ href, onClick, children }) {
|
|
42
|
+
return (_jsxs("a", { role: "menuitem", className: "sm-rail__menu-item", href: href, target: "_blank", rel: "noreferrer", onClick: onClick, children: [_jsx("span", { children: children }), _jsx(ExternalLink, { className: "sm-rail__ext", size: 13, strokeWidth: 1.75, "aria-hidden": "true" })] }));
|
|
38
43
|
}
|
|
39
44
|
export function IconRail({ registry, active, email, settings = true, deploy, onSignOut }) {
|
|
40
45
|
const adminHref = useAdminHref();
|
|
@@ -92,9 +97,9 @@ export function IconRail({ registry, active, email, settings = true, deploy, onS
|
|
|
92
97
|
const collectionsOpen = open === "collections" || (hovered && open === null);
|
|
93
98
|
const name = email?.split("@")[0] ?? "Editor";
|
|
94
99
|
const initials = name.slice(0, 2).toUpperCase();
|
|
95
|
-
return (_jsxs("nav", { className: "sm-rail", "aria-label": "Primary", ref: root, onKeyDown: onKeyDown, children: [_jsx(AppIcon, {}), _jsxs("ul", { className: "sm-rail__list", children: [link("pages", "Pages", _jsx(PanelTop, { ...ICON }), adminHref("/pages")), collections.length > 0 && (_jsxs("li", { className: "sm-rail__item", onMouseEnter: () => setHovered(true), onMouseLeave: hoverLeave, children: [_jsxs("button", { type: "button", className: "sm-rail__btn", "aria-current": collectionActive ? "page" : undefined, "aria-haspopup": "menu", "aria-expanded": collectionsOpen, "aria-controls": menuId("collections"), onClick: () => toggle("collections"), children: [_jsx("span", { className: "sm-rail__tile", children: _jsx(LibraryBig, { ...ICON }) }), _jsx("span", { className: "sm-rail__label", children: "Collections" })] }), _jsx("ul", { className: "sm-rail__menu sm-rail__menu--collections", role: "menu", id: menuId("collections"), "data-open": collectionsOpen, children: collections.map((c) => (_jsx("li", { role: "none", children: _jsx(RouteLink, { role: "menuitem", className: "sm-rail__menu-item", href: adminHref(`/${c.name}`), "aria-current": c.name === active ? "page" : undefined, onClick: () => { close(); hoverLeave(); }, children: _jsx("span", { children: c.title }) }) }, c.name))) })] })), link("media", "Media", _jsx(Image, { ...ICON }), adminHref("/media")), registry.globals.length > 0 && link("globals", "Site", _jsx(Globe, { ...ICON }), adminHref("/globals")), settings && link("settings", "Settings", _jsx(Settings, { ...ICON }), adminHref("/settings"))] }), deploy && (() => {
|
|
100
|
+
return (_jsxs("nav", { className: "sm-rail", "aria-label": "Primary", ref: root, onKeyDown: onKeyDown, children: [_jsxs("div", { className: "sm-rail__item", children: [_jsx("button", { type: "button", className: "sm-rail__brand", title: "Smoodly", "aria-haspopup": "menu", "aria-expanded": open === "brand", "aria-controls": menuId("brand"), onClick: () => toggle("brand"), children: _jsx(AppIcon, {}) }), _jsxs("ul", { className: "sm-rail__menu sm-rail__menu--brand", role: "menu", id: menuId("brand"), "data-open": open === "brand", children: [_jsx("li", { role: "none", children: _jsx(ExtLink, { href: consoleLinks().project, onClick: close, children: "This site at smoodly.io" }) }), _jsx("li", { role: "none", children: _jsx(ExtLink, { href: consoleLinks().docs, onClick: close, children: "Documentation" }) }), _jsxs("li", { className: "sm-rail__menu-version", role: "presentation", children: ["Smoodly ", SMOODLY_VERSION] })] })] }), _jsxs("ul", { className: "sm-rail__list", children: [link("pages", "Pages", _jsx(PanelTop, { ...ICON }), adminHref("/pages")), collections.length > 0 && (_jsxs("li", { className: "sm-rail__item", onMouseEnter: () => setHovered(true), onMouseLeave: hoverLeave, children: [_jsxs("button", { type: "button", className: "sm-rail__btn", "aria-current": collectionActive ? "page" : undefined, "aria-haspopup": "menu", "aria-expanded": collectionsOpen, "aria-controls": menuId("collections"), onClick: () => toggle("collections"), children: [_jsx("span", { className: "sm-rail__tile", children: _jsx(LibraryBig, { ...ICON }) }), _jsx("span", { className: "sm-rail__label", children: "Collections" })] }), _jsx("ul", { className: "sm-rail__menu sm-rail__menu--collections", role: "menu", id: menuId("collections"), "data-open": collectionsOpen, children: collections.map((c) => (_jsx("li", { role: "none", children: _jsx(RouteLink, { role: "menuitem", className: "sm-rail__menu-item", href: adminHref(`/${c.name}`), "aria-current": c.name === active ? "page" : undefined, onClick: () => { close(); hoverLeave(); }, children: _jsx("span", { children: c.title }) }) }, c.name))) })] })), link("media", "Media", _jsx(Image, { ...ICON }), adminHref("/media")), registry.globals.length > 0 && link("globals", "Site", _jsx(Globe, { ...ICON }), adminHref("/globals")), settings && link("settings", "Settings", _jsx(Settings, { ...ICON }), adminHref("/settings"))] }), deploy && (() => {
|
|
96
101
|
const copy = tileCopy(deploy.status, Date.now());
|
|
97
102
|
const id = menuId("deploy");
|
|
98
103
|
return (_jsxs("div", { className: "sm-rail__item sm-rail__deploy", "data-state": deploy.status.state, children: [_jsxs("button", { type: "button", className: "sm-rail__btn", "aria-haspopup": "menu", "aria-expanded": open === "deploy", "aria-controls": id, onClick: () => toggle("deploy"), title: copy.detail, children: [_jsxs("span", { className: `sm-rail__tile${copy.lit ? " sm-rail__tile--lit" : ""}${copy.warn ? " sm-rail__tile--warn" : ""}`, children: [_jsx(RadioTower, { ...ICON }), copy.badge && _jsx("span", { className: "sm-rail__badge", "aria-label": `${copy.badge} changes waiting`, children: copy.badge })] }), _jsx("span", { className: "sm-rail__label", children: copy.label })] }), _jsxs("ul", { className: "sm-rail__menu sm-rail__menu--up", role: "menu", id: id, "data-open": open === "deploy", children: [_jsx("li", { className: "sm-rail__menu-detail", role: "presentation", children: copy.detail }), _jsx("li", { role: "none", children: _jsx("button", { type: "button", role: "menuitem", className: "sm-rail__menu-item", disabled: copy.action === null || deploy.busy, title: copy.disabledReason ?? undefined, onClick: () => { close(); deploy.onDeploy(); }, children: copy.action === "retry" ? "Deploy again" : "Deploy now" }) }), copy.disabledReason && _jsx("li", { className: "sm-rail__menu-note", role: "presentation", children: copy.disabledReason })] })] }));
|
|
99
|
-
})(), _jsxs("div", { className: "sm-rail__item sm-rail__foot", children: [_jsx("button", { type: "button", className: "sm-rail__user", title: name, "aria-haspopup": "menu", "aria-expanded": open === "user", "aria-controls": menuId("user"), onClick: () => toggle("user"), children: initials }), _jsxs("ul", { className: "sm-rail__menu sm-rail__menu--up", role: "menu", id: menuId("user"), "data-open": open === "user", children: [_jsx("li", { className: "sm-rail__menu-title", role: "presentation", children: email ?? name }), _jsx("li", { role: "none", children: _jsx(ThemeToggle, {}) }), _jsx("li", { role: "none", children: _jsx(
|
|
104
|
+
})(), _jsxs("div", { className: "sm-rail__item sm-rail__foot", children: [_jsx("button", { type: "button", className: "sm-rail__user", title: name, "aria-haspopup": "menu", "aria-expanded": open === "user", "aria-controls": menuId("user"), onClick: () => toggle("user"), children: initials }), _jsxs("ul", { className: "sm-rail__menu sm-rail__menu--up", role: "menu", id: menuId("user"), "data-open": open === "user", children: [_jsx("li", { className: "sm-rail__menu-title", role: "presentation", children: email ?? name }), _jsx("li", { role: "none", children: _jsx(ThemeToggle, {}) }), _jsx("li", { role: "none", children: _jsx(ExtLink, { href: consoleLinks().account, onClick: close, children: "My Account" }) }), _jsx("li", { role: "none", children: _jsx("button", { type: "button", role: "menuitem", className: "sm-rail__menu-item", onClick: () => { close(); onSignOut(); }, children: "Sign out" }) })] })] })] }));
|
|
100
105
|
}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
// Where the admin points at smoodly.io (spec 2026-10-16 sign-in and the dashboard §5, §6): the
|
|
2
|
-
//
|
|
3
|
-
// service names (`GET /v1/auth`'s consoleUrl)
|
|
1
|
+
// Where the admin points at smoodly.io (spec 2026-10-16 sign-in and the dashboard §5, §6): the rail's Smoodly menu
|
|
2
|
+
// (this site, the docs; 2026-10-23), the account menu's "My Account" and the Members page's "Manage members at
|
|
3
|
+
// smoodly.io". The dashboard links are deep links into the console the service names (`GET /v1/auth`'s consoleUrl),
|
|
4
|
+
// set once by the entry from the page's data; the docs are smoodly.io itself.
|
|
4
5
|
let console = { url: "https://smoodly.io", spaceId: "" };
|
|
5
6
|
export function setConsole(url, spaceId) {
|
|
6
7
|
console = { url: url.replace(/\/+$/, ""), spaceId };
|
|
7
8
|
}
|
|
9
|
+
const SITE = "https://smoodly.io";
|
|
8
10
|
export const consoleLinks = () => ({
|
|
9
11
|
sites: `${console.url}/projects`,
|
|
10
12
|
members: `${console.url}/spaces/${encodeURIComponent(console.spaceId)}/members`,
|
|
13
|
+
project: `${console.url}/spaces/${encodeURIComponent(console.spaceId)}`,
|
|
14
|
+
account: `${console.url}/account`,
|
|
15
|
+
docs: `${SITE}/docs`,
|
|
11
16
|
});
|
package/dist/admin/ui/theme.js
CHANGED
|
@@ -52,7 +52,7 @@ const TOKENS_LIGHT = `
|
|
|
52
52
|
dark mode that washed out over the white page, 2026-09-10). */
|
|
53
53
|
--plus-bg:#DDEBE4; --plus-hover:#D0E3D9; --plus-fg:#1C6E5B;
|
|
54
54
|
--plus-icon-bg:#1C6E5B; --plus-icon-fg:#FFFFFF; --plus-shadow:none;
|
|
55
|
-
--logo-color:var(--accent); --logo-outer:#
|
|
55
|
+
--logo-color:var(--accent); --logo-outer:#0B5A49; --logo-inner:#5FC9A0; /* the rail's app icon: deep green square, mint s (2026-10-23) */
|
|
56
56
|
|
|
57
57
|
--status-published-fg:var(--green-700); --status-published-bg:var(--green-50);
|
|
58
58
|
--status-changes-fg:var(--amber-700); --status-changes-bg:var(--amber-50);
|
|
@@ -92,7 +92,6 @@ const TOKENS_DARK = `
|
|
|
92
92
|
--btn-secondary-bg:var(--surface); --btn-secondary-hover:#2C3049;
|
|
93
93
|
--switch-bg:var(--line-dashed);
|
|
94
94
|
--toolbar-bg:#0F1120; --toolbar-fg:#EEF0F5;
|
|
95
|
-
--logo-inner:#151727;
|
|
96
95
|
|
|
97
96
|
--status-published-fg:var(--green-300); --status-published-bg:rgba(111,211,154,.14);
|
|
98
97
|
--status-changes-fg:var(--amber-300); --status-changes-bg:rgba(232,184,90,.14);
|
|
@@ -134,9 +133,9 @@ const SCALE = `
|
|
|
134
133
|
--outline-row-h:36px; --seg-pad-y:7px; --tabs-pad:3px;
|
|
135
134
|
--plus-h:32px; --plus-pad:0 14px 0 6px; --plus-label:inline;
|
|
136
135
|
--nav-w:72px; --inspector-w:360px; --gutter:20px;
|
|
137
|
-
/* The frame is
|
|
138
|
-
--frame-pad:
|
|
139
|
-
--rail-pad:18px 6px 16px; --rail-logo:block; --rail-logo-opacity
|
|
136
|
+
/* The frame is 8px above, right of and below the sheet (6px in the handoff, +2px 2026-10-23); the rail fills the left edge. */
|
|
137
|
+
--frame-pad:8px; --frame-pad-top:8px; --shell-gap:0px; --sheet-radius:20px; --sheet-pad:0 24px 24px;
|
|
138
|
+
--rail-pad:18px 6px 16px; --rail-logo:block; --rail-logo-opacity:1; --rail-tile-w:44px; --rail-tile-h:40px; --rail-tile-radius:12px;
|
|
140
139
|
--topbar-pad:0; --back-size:32px; --back-bg:var(--surface);
|
|
141
140
|
--table-pad:8px 12px; --table-top:80px; --canvas-pad:28px 40px 0; --card-pad:16px 18px; --card-gap:12px; --form-pad:32px 40px;
|
|
142
141
|
--border:1px solid var(--line);
|
|
@@ -159,8 +158,10 @@ export const ADMIN_CSS = `
|
|
|
159
158
|
${cascade(".sm-admin", SCALE, TOKENS_LIGHT, TOKENS_DARK)}
|
|
160
159
|
|
|
161
160
|
/* The admin owns the viewport; a host <body> margin would push it into a
|
|
162
|
-
page scrollbar
|
|
161
|
+
page scrollbar, and the page's overscroll bounce would pull the frame off
|
|
162
|
+
the top edge (2026-10-23). Scoped by :has, so only a page holding the admin is touched. */
|
|
163
163
|
body:has(.sm-admin){margin:0}
|
|
164
|
+
html:has(.sm-admin),body:has(.sm-admin){overscroll-behavior:none}
|
|
164
165
|
.sm-admin,.sm-admin *,.sm-admin *::before,.sm-admin *::after{box-sizing:border-box}
|
|
165
166
|
.sm-admin{
|
|
166
167
|
font-family:var(--font-sans);font-size:var(--text-md);line-height:1.4;
|
|
@@ -181,7 +182,7 @@ body:has(.sm-admin){margin:0}
|
|
|
181
182
|
|
|
182
183
|
/* ── shell ─────────────────────────────────────────────────────────── */
|
|
183
184
|
/* Rail | main. The shell is the frame (design_handoff_smoodly_neutral/
|
|
184
|
-
components/AppShell.html): navy,
|
|
185
|
+
components/AppShell.html): navy, 8px above, right of and below the main
|
|
185
186
|
column, which is the white sheet with a 20px radius and its own inner
|
|
186
187
|
padding; the rail fills the frame's left edge.
|
|
187
188
|
The main column stacks the top bar over one tile-shaped region: list,
|
|
@@ -204,9 +205,20 @@ body:has(.sm-admin){margin:0}
|
|
|
204
205
|
padding:var(--rail-pad);background:var(--bar-bg);border-right:var(--bar-border);color:var(--rail-fg);
|
|
205
206
|
font:500 10px/1 var(--font-sans);position:relative;
|
|
206
207
|
}
|
|
207
|
-
/* The
|
|
208
|
-
|
|
209
|
-
|
|
208
|
+
/* The app icon (the Smoodly menu's trigger): the deep green square with the
|
|
209
|
+
mint s, 26px wide (2026-10-23; the lozenge before it was 20px, asked for
|
|
210
|
+
2026-09-26, at .8 opacity). */
|
|
211
|
+
.sm-rail__brand{appearance:none;background:none;border:0;padding:0;margin-bottom:6px;cursor:pointer;display:block;border-radius:6px;color:inherit}
|
|
212
|
+
/* Hover (2026-10-23): the app icon and the avatar brighten a touch. */
|
|
213
|
+
.sm-rail__logo{transition:filter .15s}
|
|
214
|
+
.sm-rail__brand:hover .sm-rail__logo{filter:brightness(1.3)}
|
|
215
|
+
.sm-rail__user{transition:background .15s}
|
|
216
|
+
.sm-rail__user:hover{background:color-mix(in srgb,var(--accent-soft),#fff 60%)}
|
|
217
|
+
.sm-rail__brand:focus-visible{outline:2px solid var(--rail-active-fg);outline-offset:2px;box-shadow:none}
|
|
218
|
+
.sm-rail__logo{width:26px;height:auto;display:var(--rail-logo);flex:none;opacity:var(--rail-logo-opacity)}
|
|
219
|
+
.sm-rail__ext{width:13px;height:13px;flex:none;margin-left:12px;opacity:.45}
|
|
220
|
+
.sm-rail__menu-item:hover .sm-rail__ext,.sm-rail__menu-item:focus-visible .sm-rail__ext{opacity:.8}
|
|
221
|
+
.sm-rail__menu-version{font-size:var(--text-xs);color:var(--text-subtle);padding:7px 10px 4px;margin-top:3px;border-top:1px solid var(--line)}
|
|
210
222
|
.sm-rail__list{display:flex;flex-direction:column;gap:8px;width:100%;margin:0;padding:0;list-style:none}
|
|
211
223
|
.sm-rail__item{position:relative}
|
|
212
224
|
.sm-rail__btn{
|
|
@@ -257,6 +269,7 @@ body:has(.sm-admin){margin:0}
|
|
|
257
269
|
.sm-rail__menu--up{top:auto;bottom:0}
|
|
258
270
|
/* The Collections flyout opens on hover, so it is roomier (the names at --text-lg) and an invisible
|
|
259
271
|
bridge spans the 6px gap so the pointer can cross from the rail without closing it. */
|
|
272
|
+
.sm-rail__menu--brand{width:220px}
|
|
260
273
|
.sm-rail__menu--collections{width:208px;padding:8px;gap:2px;font-size:var(--text-lg)}
|
|
261
274
|
.sm-rail__menu--collections::before{content:"";position:absolute;left:-8px;top:0;bottom:0;width:8px}
|
|
262
275
|
.sm-rail__menu--collections .sm-rail__menu-item{padding:9px 12px}
|
|
@@ -636,8 +649,8 @@ body:has(.sm-admin){margin:0}
|
|
|
636
649
|
below the inset so it reads on the cream ground of the top bar and the
|
|
637
650
|
canvas meta row as well as on a white card. */
|
|
638
651
|
.sm-seg{display:flex;gap:2px;padding:3px;background:var(--seg-bg);border-radius:var(--radius-btn)}
|
|
639
|
-
/* A locale switch: each option wide enough to read as a tab, not a chip. */
|
|
640
|
-
.sm-seg--locale .sm-seg__opt{min-width:64px}
|
|
652
|
+
/* A locale switch: each option wide enough to read as a tab, not a chip; the codes at 12px (2026-10-23). */
|
|
653
|
+
.sm-seg--locale .sm-seg__opt{min-width:64px;font-size:var(--text-sm)}
|
|
641
654
|
/* The Canvas | Structure switch: two icon options. */
|
|
642
655
|
.sm-seg--view .sm-seg__opt{padding:4px 8px;display:grid;place-items:center}
|
|
643
656
|
.sm-seg--stretch{width:100%}
|
package/dist/marks.d.ts
CHANGED
|
@@ -12,8 +12,10 @@ export declare const BLANK_ATTR = "data-smd-blank";
|
|
|
12
12
|
* editor sizes the frame to the reported height, so the document's own viewport must never scroll
|
|
13
13
|
* (2026-09-26): a fractional content height (4595.3px in a 4595px frame) left it scrollable by a hair,
|
|
14
14
|
* and a trackpad scroll over the canvas showed the frame's overlay scrollbar. Hidden overflow drops no
|
|
15
|
-
* layout, and the live site never carries this.
|
|
16
|
-
|
|
15
|
+
* layout, and the live site never carries this. For the same reason every wheel over the frame belongs
|
|
16
|
+
* to the editor's scroller (2026-11-13): a site's own `overscroll-behavior: none` on its root stops the
|
|
17
|
+
* wheel from chaining out of the frame, so the rule sets it back, over whatever the site says. */
|
|
18
|
+
export declare const BRIDGE_CSS = "html{overflow:hidden;overscroll-behavior:auto!important}[data-smd-node][data-smd-blank]{min-height:7rem}";
|
|
17
19
|
/** The element that renders a field's value verbatim. */
|
|
18
20
|
export declare const FIELD_ATTR = "data-smd-field";
|
|
19
21
|
/** A list item's or object field's root: scopes the field names inside it. */
|
package/dist/marks.js
CHANGED
|
@@ -11,8 +11,10 @@ export const BLANK_ATTR = "data-smd-blank";
|
|
|
11
11
|
* editor sizes the frame to the reported height, so the document's own viewport must never scroll
|
|
12
12
|
* (2026-09-26): a fractional content height (4595.3px in a 4595px frame) left it scrollable by a hair,
|
|
13
13
|
* and a trackpad scroll over the canvas showed the frame's overlay scrollbar. Hidden overflow drops no
|
|
14
|
-
* layout, and the live site never carries this.
|
|
15
|
-
|
|
14
|
+
* layout, and the live site never carries this. For the same reason every wheel over the frame belongs
|
|
15
|
+
* to the editor's scroller (2026-11-13): a site's own `overscroll-behavior: none` on its root stops the
|
|
16
|
+
* wheel from chaining out of the frame, so the rule sets it back, over whatever the site says. */
|
|
17
|
+
export const BRIDGE_CSS = `html{overflow:hidden;overscroll-behavior:auto!important}[${NODE_ATTR}][${BLANK_ATTR}]{min-height:7rem}`;
|
|
16
18
|
/** The element that renders a field's value verbatim. */
|
|
17
19
|
export const FIELD_ATTR = "data-smd-field";
|
|
18
20
|
/** A list item's or object field's root: scopes the field names inside it. */
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SMOODLY_VERSION = "0.0.
|
|
1
|
+
export declare const SMOODLY_VERSION = "0.0.57";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Generated by scripts/write-version.mjs from package.json — do not edit.
|
|
2
|
-
export const SMOODLY_VERSION = "0.0.
|
|
2
|
+
export const SMOODLY_VERSION = "0.0.57";
|
package/package.json
CHANGED