Commit Graph
397 Commits
Author SHA1 Message Date
shadowdaoandClaude Opus 5.5 57734fbe51 Merge feat/sitesmith-hook into release/sitesmith-colors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 10:54:46 -08:00
shadowdaoandClaude Opus 5.5 6decf8cdb0 Merge feat/color-system into release/sitesmith-colors
Conflicts: package.json (kept both test:browser:mobile and the colour scripts);
head-parity test (kept E_icons from mobile-parity/main AND the E_brand_swatches /
F_swatches_no_brand cases from color-system; pinned bytes re-derived later
against the merged WHP script).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 10:54:46 -08:00
shadowdao f6b90d393f Merge fix/mobile-parity into release/sitesmith-colors 2026-11-01 10:54:16 -08:00
shadowdaoandClaude Sonnet 5.5 7627be78dc SwatchManager chooser: readable text colour and a visible chip border on dark colours
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:12:58 -08:00
shadowdaoandClaude Sonnet 5.5 75bd5921da Real-editor colour-system e2e (Firefox + Chromium): hex entry, pick from page/image, palette, persistence, brand recolour canvas==frontend==backend, caps, contrast
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:12:38 -08:00
shadowdaoandClaude Sonnet 5.5 c4b6802cab Add real-browser mobile parity test (Firefox + Chromium, 390/1280)
npm run test:browser:mobile; MOBILE_PARITY_RECORD/BASELINE compare desktop boxes against a base-commit snapshot.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:10:15 -08:00
shadowdaoandClaude Sonnet 5.5 2e5492600e Editor: mirror default mobile column stacking (canvas emulation + Stack toggle)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:10:15 -08:00
shadowdaoandClaude Sonnet 5.5 69fd34bd7c Preview/Published head: stack ColumnLayout on phones, wrap Navbar links, emit Font Awesome
- <=767px: [class^=cols_] wrappers (every ColumnLayout split) stack; a mobile flexDirection:row override still opts out.
- <=767px: navbars without a hamburger wrap instead of overflowing.
- wrapInDocument emits the same Font Awesome links as the backend sb_font_awesome_link (Preview is a sandboxed srcdoc iframe).
- head-parity pins updated (+ E_icons case).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:10:15 -08:00
shadowdaoandClaude Sonnet 5.5 79cdd593d9 Navbar: showMobileMenu defaults to true for new Navbars and the seeded header
Existing Navbars (prop absent/false) are untouched: render default and toHtml stay falsy.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:10:15 -08:00
shadowdaoandClaude Sonnet 5.5 501f276746 Colour pick mode: header/footer zone previews (pointer-events:none) are now pickable
Found by the real-editor e2e: picking over the header or its logo box returned the page colour behind it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:09:39 -08:00
shadowdaoandClaude Sonnet 5.5 ba5611c3e3 Inline contrast in Text, Button, Pricing and Nav/Footer panels (effective background from node parents)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:02:57 -08:00
shadowdaoandClaude Sonnet 5.5 dcf9c92fee Site Design panel: Saved colours section + inline contrast on text/muted/link/primary-button
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:01:21 -08:00
shadowdaoandClaude Sonnet 5.5 faaa8a87a0 Site Design: SwatchManager (saved colours, brand toggle, guarded delete/un-brand, use-as-site-colour, pick + palette)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 10:00:51 -08:00
shadowdaoandClaude Sonnet 5.5 c34690d08b Colour fields: hex validation, brand chips, pick tools, save colour, inline contrast prop; gradient parse accepts brand refs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:58:55 -08:00
shadowdaoandClaude Sonnet 5.5 150c84065b TokenSwatchRow: saved colours after the site tokens (brand = live ring + token ref)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:57:17 -08:00
shadowdaoandClaude Sonnet 5.5 9c61f41079 Site colours: replaceBrandRef + PageContext siteStateStrings/rewriteSiteStates for brand-ref rewriting
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:56:55 -08:00
shadowdaoandClaude Sonnet 5.5 2f5c311118 Sitesmith hook: start+poll transport, failure-safe results, refs/assets wrappers
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:54:55 -08:00
shadowdaoandClaude Sonnet 5.5 179aaebe49 Colour picking: native EyeDropper + in-canvas pick mode with brand/token matching, real-browser e2e
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:54:33 -08:00
shadowdaoandClaude Sonnet 5.5 54920dff08 Site colours: pick-from-image and palette-from-image modals
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:53:13 -08:00
shadowdaoandClaude Sonnet 5.5 e4ba07b47e ContrastNote: inline low-contrast hint with suggestion
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:53:05 -08:00
shadowdaoandClaude Sonnet 5.5 453268a31c Publish checks: button + site-level contrast via checkContrast, unchecked info line
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:52:44 -08:00
shadowdaoandClaude Sonnet 5.5 fb9ac0e6c4 Site colours: real-browser check for image sampling + palette (Firefox + Chromium)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:52:40 -08:00
shadowdaoandClaude Sonnet 5.5 39e954bd77 Contrast: pure WCAG checkContrast/suggestFix/siteColorPairs
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:51:57 -08:00
shadowdaoandClaude Sonnet 5.5 e09a87d2a6 Site colours: palette extraction + same-origin image sampling utils
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:51:47 -08:00
shadowdaoandClaude Sonnet 5.5 1190a98265 tokens: isTokenRef accepts brand token names (digits)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:51:32 -08:00
shadowdaoandClaude Sonnet 5.5 c388be7fe7 Head parity: pin brand-colour swatch cases (E, F) from the WHP script
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:50:25 -08:00
shadowdaoandClaude Sonnet 5.5 faecc76384 Site colours: saved swatches + live brand-colour tokens in design model
design.swatches [{id,label,hex,brand,slot}]; brand ones are published as
--wsb-brand-N appended inside :root (canvas and export share buildTokenVarDecls).
Sites without brand colours emit identical bytes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:49:53 -08:00
shadowdao ab7a10073b Merge fix/editor-parity into release/editor-parity (on top of captcha + Font Awesome) 2026-11-01 09:26:21 -08:00
shadowdaoandClaude Sonnet 5.5 ae02eb7d0d test(site-builder): parity harness neutralises documented editor-only differences (empty drop zone, empty-image placeholder)
Container marks the applied drop zone with data-wsb-dropzone.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:18:29 -08:00
shadowdaoandClaude Sonnet 5.5 d75f9d90ca fix(site-builder): published Text/Heading keep plain-text newlines as <br> like the canvas
Canvas renders plain text via textToInlineHtml (newline -> <br>); toHtml used escapeHtml,
so line breaks typed in the editor vanished on publish (TTM about page: ~100px shorter).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:16:26 -08:00
shadowdaoandClaude Sonnet 5.5 7d77201e5a fix(site-builder): Container 40px drop-zone min-height only when empty
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:14:28 -08:00
shadowdaoandClaude Sonnet 5.5 01d5ba5496 fix(site-builder): HeroSimple canvas render uses the exporter's declaration order (style wins over minHeight prop)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:13:54 -08:00
shadowdaoandClaude Sonnet 5.5 7a1ab36e63 fix(site-builder): editor canvas drops blank style values like the exporter
React assigns '' for a blank style value and a blank longhand after a shorthand
({padding:'20px', paddingTop:''}) wipes the shorthand in the canvas; the exporter
drops blanks. ResolvedRender is the one place node style reaches React, so
normalise there.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:12:35 -08:00
shadowdaoandClaude Sonnet 5.5 64fc21866c test(site-builder): canvas parity harness loads stored state verbatim (no blank-style stripping)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:11:52 -08:00
shadowdaoandClaude Sonnet 5.5 d6bfc51ae3 Merge fix/canvas-reset into fix/editor-parity
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 09:10:23 -08:00
shadowdaoandClaude Sonnet 5.5 dc415db2d3 fix(site-builder): editor canvas renders content with the published base reset
Published pages/Preview ship a head reset (*{margin:0;padding:0}, img block,
a inherit, body line-height 1.6 / #1f2937 / 16px); the editor canvas had none,
so h1-h6/p margins, line-height and inherited size/colour differed.

- editor.css: one commented block scoping the reset to .canvas-device-frame,
  every selector zero-specificity (:where) so inline styles / class rules win
  exactly as when published; editor chrome untouched (snapshot identical).
- tokens.ts: canvas heading/link token rules made zero-specificity too.
- utils/css-reset.ts: single source for the reset declarations (html-export
  imports it; test asserts byte-identity with the backend head and that the
  editor.css block carries the same declarations).
- scripts/e2e-canvas-parity.mjs (npm run test:browser:canvas): real editor vs
  published HTML in Firefox + Chromium, boxes within 1px + computed styles.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 08:23:19 -08:00
shadowdaoandClaude Sonnet 5.5 dbf3dda3e4 fix(site-builder): hero gradient blank on editor canvas - shorthand + undefined longhands
HeroSimple emitted 'background' together with backgroundImage/Size/Position
that were undefined. React assigns '' for those on first render and Chromium
and Firefox then wipe the shorthand's gradient (background-image: none), so
the canvas hero rendered white. Build the style with only the relevant keys
(shared by render and toHtml); exported HTML is byte-identical.

Adds a real-browser (Chromium+Firefox) regression test: npm run test:browser:bg,
and toHtml byte-identity assertions.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 07:52:34 -08:00
shadowdaoandClaude Sonnet 5.5 7b3baa815c feat(site-builder): Font Awesome 7.3.1 icons (per-network brands) in editor and exports
Exporters emit fa-solid/fa-brands/fa-regular classes through utils/fa-icon.ts;
SocialLinks gets X/TikTok/Bluesky/Threads/Discord/Mastodon/Reddit/Telegram;
the editor loads all.min.css + v4-shims (SRI) so editor chrome FA4 names work.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0185ukXgKV8v9BUrQWXSUW4P
2026-10-31 11:59:46 -07:00
shadowdaoandClaude Sonnet 5.5 bb97e5b396 feat(forms): captcha is mandatory on every relay form; remove the toggle
relayFormWiring always emits captcha="1" for relay-wired forms (legacy captcha prop ignored,
old projects with captcha:false load fine). CaptchaMock always shown for relay-wired forms;
FormStylePanel toggle replaced by a read-only note.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0185ukXgKV8v9BUrQWXSUW4P
2026-10-31 11:29:07 -07:00
shadowdaoandClaude Sonnet 5.5 92da689e62 feat(forms): captcha prop + panel toggle + marker attribute for relay forms
captcha=true emits captcha="1", explicit false emits captcha="0", undefined emits
nothing (legacy designs byte-identical). New forms default true. Editor shows an inert mock.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0185ukXgKV8v9BUrQWXSUW4P
2026-10-31 08:25:12 -07:00
shadowdaoandClaude Opus 5.5 76f0ba9ca1 fix(site-builder): navbar logo image never shown — no logoType control
The Navbar renders logoImage only when logoType === 'image', but the
Logo/Text toggle lived in the settings UI removed in 65a10a1 (2026-07-12);
NavStylePanel kept the image picker and never gained the toggle. A picked
logo was stored and silently ignored (editor and published site showed the
text fallback "MySite"; seen on olsdigital.com).

- Logo Type Text/Image toggle in the Navbar Logo section
- picking an image sets logoImage + logoType:'image' in one undo step

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 05:50:33 -07:00
shadowdao bdb4789903 Merge fe-after-backend: client_id, warnings, limits, head parity 2026-10-07 13:52:24 -07:00
shadowdaoandClaude Sonnet 5.5 9d425afa29 feat(editor): adopt backend final-fix contract (client_id, warnings, limits, head parity)
client_id per editor load (memory only), already_saved, save warnings via notices,
upload_max_bytes enforced client-side with the server error text on 413,
project_max_bytes warning, headCode in the Preview font scan, pinned backend heads.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-07 13:49:53 -07:00
shadowdaoandClaude Opus 5.5 eb401cd979 fix(sections): inserting from the section library closes the mobile Blocks sheet
The section library now calls closeSheet() after inserting a section (or a
global section). It mounts in CanvasOverlays, beside EditorShell, so it could
not reach the MobileChromeProvider inside the shell; the provider moves up to
App around the shell and the overlays so both share one sheet state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:41:22 -07:00
shadowdaoandClaude Opus 5.5 472e5e4d81 fix(selection): Esc clears a multi-selection; context menu acts on all selected
Esc was only claimed by select.parent for a single node, so a multi-selection
could not be dropped from the keyboard. Add select.clear (Esc, >1 selected)
through the existing dispatcher, which already skips text fields and open
dialogs. The context menu's Duplicate/Delete now run the multi-selection core
commands (edit.duplicate / edit.delete) when the clicked node is part of a
multi-selection, instead of acting on the first node only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:41:22 -07:00
shadowdaoandClaude Opus 5.5 84bc626ed0 fix(sitesmith): first-run wizard only for users who can use Sitesmith
The business-profile wizard was forced on an empty canvas even when
Sitesmith was locked (paid addon), capped or switched off. The decision now
waits for the entitlement and skips the wizard unless the user can chat
(OK_MONTHLY / OK_BONUS); a failed entitlement falls back to the modal.
useSitesmith reports an ok:false entitlement as an error so it cannot hang.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:41:22 -07:00
shadowdaoandClaude Opus 5.5 92c88496a7 fix(publish-checklist): Fix on SEO checks opens the page's SEO settings
Title-length, missing meta description and noindex-landing checks carry
fix: 'page-settings', but Fix only closed the list. It now shows that page's
PageSettingsModal in place of the checklist; closing it finishes the Fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:41:22 -07:00
shadowdaoandClaude Opus 5.5 49ed687c3b fix(topbar): mobile overflow menu reaches Version history and the command palette
On mobile the collapsed topbar had no route to Version history, Export ZIP,
Business profile or the command palette. Add a 'Version history' item (only
when the site.history command is registered, run through the registry) and a
'More commands…' item that opens the command palette.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:41:22 -07:00
shadowdaoandClaude Opus 5.5 c62a333257 fix(editor): header/footer zone previews show the active device's overrides
The zone previews render the exported HTML, whose <style data-wsb-responsive>
@media rules evaluate against the browser viewport, so tablet/mobile modes
showed desktop styling for header/footer. ZonePreview now applies the active
device's override rules unconditionally (applyResponsiveCssForDevice) and
drops the rest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:40:54 -07:00
shadowdaoandClaude Opus 5.5 e20c604413 fix(editor): mobile column stacking follows the desktop style, as published
Published mobile stacking is the global RESPONSIVE_CSS rule matching the
DESKTOP inline style, so un-stacking Columns on mobile under a stacked tablet
(styleMobile.flexDirection 'row') publishes un-stacked. The editor's
device-emulation copy matched the resolved inline style and showed it stacked.
RenderNode now marks nodes with a flexDirection/display override with
data-wsb-base-stack (baseStacksOnMobile) and editor.css keys off it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 13:40:54 -07:00