Skip to content

feat: artisanpack/copyright + marquee + comments-number site-chrome blocks - #571

Merged
ViewFromTheBox merged 2 commits into
feature/495-port-crosswinds-blocksfrom
feature/500-site-chrome-blocks
Jun 12, 2026
Merged

ViewFromTheBox merged 2 commits into
feature/495-port-crosswinds-blocksfrom
feature/500-site-chrome-blocks

Conversation

@ViewFromTheBox

@ViewFromTheBox ViewFromTheBox commented Jun 12, 2026 •

Copy link
Copy Markdown
Member

Description

Adds three site-wide chrome blocks under the artisanpack/* namespace:

  • artisanpack/copyright (dynamic) — © + configurable text + current year, with three display modes (icon-text / icon-only / text-only). Year is read at render time on every renderer so the line stays accurate without a rebuild.
  • artisanpack/marquee (static) — RichText body wrapped in a sized <div>. The renderers emit an inline animation: ap-marquee-scroll Ns linear infinite declaration that drives the keyframe shipped in the new frontend/marquee.css asset; the editor preview drops the animation so authors can edit the text without it scrolling under their cursor.
  • artisanpack/comments-number (dynamic) — <count> <singular|plural> line. PostResolver stamps _resolvedCommentCount (reusing the existing branch shared with post-comments-count), and the renderers pick the singular or plural label by count.

Closes: #500

Type of Change

  • New feature (adds new functionality)

Related Issue

Issue: #500

Motivation and Context

Site-chrome cluster of the umbrella block-port effort (#495). Each block ships under the artisanpack/* namespace with full Blade + React + Vue renderer parity. None of the three upstream blocks carried transforms, so none are added here.

Changes Made

  • 3 new editor blocks under resources/js/visual-editor/blocks/{copyright,marquee,comments-number}/ (block.json, edit.tsx, save.tsx, index.ts, inserter-icon.tsx; marquee adds marquee.css).
  • 3 new Blade partials under packages/visual-editor-renderer-blade/resources/views/blocks/artisanpack/.
  • 3 new React renderers under packages/visual-editor-renderer-react/src/blocks/artisanpack/ (copyright.tsx, marquee.tsx, commentsNumber.tsx) wired into registerCoreBlocks.
  • 3 new Vue renderers under packages/visual-editor-renderer-vue/src/blocks/artisanpack/ wired into registerCoreBlocks.
  • PostResolver now lists artisanpack/comments-number in SUPPORTED_BLOCKS and routes it through resolveCommentsCount() alongside post-comments-count.
  • New frontend/marquee.css ships through <x-ve-blocks-styles /> (new marqueeStyleHref + data-ve-marquee link tag), so consumers ship the keyframes alongside the existing accordion / tabs / grid bundles.
  • canvas-styles.ts imports the marquee stylesheet into the editor iframe and adds a small .ap-marquee__text { transform: none; white-space: normal } override so the editor renders the text statically.
  • renderer-parity.json extended with the three new block names; the parity verifier confirms all 140 blocks register in all three renderers.

How Has This Been Tested?

Testing Environment:

  • Operating System: macOS
  • Browser (if applicable): manual smoke test in the dev-app editor + Blade preview page
  • PHP Version: 8.4
  • Project Version: branch feature/500-site-chrome-blocks off feature/495-port-crosswinds-blocks

Tests Performed:

  1. npx vitest run — 1972 tests pass (added 9 to site-chrome-family.test.ts + 9 React + 9 Vue renderer tests).
  2. ./vendor/bin/pest — 1062 tests pass (added 8 Blade renderer tests + 2 PostResolver stamping tests + 1 BlocksStyles emission test; 2 unrelated pre-existing FA Icons failures remain on this branch's parent commit).
  3. node scripts/verify-renderer-parity.mjs — all 140 blocks registered across blade / react / vue.
  4. npm run build — Vite build succeeds.
  5. Manual: inserted each block in the editor, edited attributes, saved, reloaded — saved markup round-trips. Marquee scrolls correctly on the public Blade preview page after vendor:publish --tag=visual-editor-renderer-blade-assets.

Accessibility Tests Run

  • Keyboard navigation tested
  • Color contrast verified

Details: Marquee is decorative chrome; the inline animation is the only motion concern and the keyframe ships in a separate stylesheet so prefers-reduced-motion can be layered on top later. Comments number and copyright are plain <p> text.

Tests Added

  • Unit tests added/updated
  • Integration tests added/updated
  • All tests passing

Test details: 9 family-contract tests, 18 renderer tests (9 React + 9 Vue), 8 Blade renderer tests, 2 PostResolver stamping tests, 1 BlocksStyles emission test.

Documentation

  • Inline code documentation added

Documentation details: Each new file ships a brief docblock describing its role and the contract with the sibling renderers.

Pre-Submission Checklist

  • Code passes all tests
  • Self-review completed
  • Comments added for complex code

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added Copyright, Marquee, and Comments Number blocks (icon/text modes, configurable marquee width/speed, customizable comment labels).
  • Editor & Styling
    • Marquee styling and animation added to the editor canvas; inspector controls and inserter icons for new blocks; respects reduced-motion preferences.
  • Behavior
    • Comment count now resolves server-side and displays live counts; copyright year computed at render time.
  • Tests
    • Expanded test coverage across renderers and editor for all new blocks.

…me blocks

Adds three site-wide chrome blocks under the artisanpack namespace:

  - copyright (dynamic) — © + configurable text + current year, with three
    display modes (icon-text / icon-only / text-only). Year is read at
    render time on every renderer so the line stays accurate without a
    rebuild.
  - marquee (static) — RichText body wrapped in a sized `<div>`. The
    renderers emit an inline `animation: ap-marquee-scroll Ns linear
    infinite` declaration that drives the keyframe shipped in the new
    `frontend/marquee.css` asset; the editor preview drops the animation
    so authors can edit the text without it scrolling under their cursor.
  - comments-number (dynamic) — `<count> <singular|plural>` line.
    PostResolver stamps `_resolvedCommentCount` (reusing the existing
    branch shared with post-comments-count), and the renderers pick the
    singular or plural label by count.

Wires the marquee front-end stylesheet through `<x-ve-blocks-styles />`
(new `marqueeStyleHref` + `data-ve-marquee` link tag) so consumers ship
the keyframes alongside the existing accordion / tabs / grid bundles.

Closes #500
@coderabbitai

coderabbitai Bot commented Jun 12, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e89494c6-f682-49a6-b3a3-0b97092447c4

📥 Commits

Reviewing files that changed from the base of the PR and between aa8229c and 8a3a3c4.

📒 Files selected for processing (8)
  • packages/visual-editor-renderer-blade/resources/assets/frontend/marquee.css
  • packages/visual-editor-renderer-react/tests/BlockTree.test.tsx
  • packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
  • resources/js/visual-editor/blocks/__tests__/site-chrome-family.test.ts
  • resources/js/visual-editor/blocks/marquee/clamp.ts
  • resources/js/visual-editor/blocks/marquee/edit.tsx
  • resources/js/visual-editor/blocks/marquee/marquee.css
  • resources/js/visual-editor/blocks/marquee/save.tsx
🚧 Files skipped from review as they are similar to previous changes (5)
  • resources/js/visual-editor/blocks/marquee/marquee.css
  • packages/visual-editor-renderer-blade/resources/assets/frontend/marquee.css
  • packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
  • resources/js/visual-editor/blocks/tests/site-chrome-family.test.ts
  • resources/js/visual-editor/blocks/marquee/save.tsx

📝 Walkthrough

Walkthrough

Adds three artisanpack site-chrome blocks (copyright, marquee, comments-number) with Gutenberg metadata and editor UI, Blade/React/Vue renderers, marquee CSS and canvas integration, server-side comment-count stamping, and tests across renderer and editor targets.

Changes

Site-Chrome Block Fork (CW4)

Layer / File(s) Summary
Gutenberg block metadata & editor UI
resources/js/visual-editor/blocks/{copyright,marquee,comments-number}/*, resources/js/visual-editor/blocks/__tests__/site-chrome-family.test.ts
Adds block.json, edit, save, index, and inserter-icon modules for each block; editor UI includes Select/Range/Text controls and clamps; tests verify schema, attribute defaults, and save-contracts.
Blade renderer & frontend assets
packages/visual-editor-renderer-blade/resources/views/blocks/*, packages/visual-editor-renderer-blade/resources/assets/frontend/marquee.css, packages/visual-editor-renderer-blade/src/View/Components/BlocksStylesComponent.php
Blade templates for copyright, marquee, comments-number; frontend marquee.css with keyframes and reduced-motion handling; BlocksStylesComponent emits marquee stylesheet link.
React renderer & registry
packages/visual-editor-renderer-react/src/blocks/artisanpack/*, packages/visual-editor-renderer-react/src/blocks/registerCoreBlocks.ts, packages/visual-editor-renderer-react/tests/*
Adds React renderers for all three blocks, clamps numeric marquee attributes, registers in CORE_BLOCKS, and includes tests for markup, styles, clamping, and pluralization.
Vue renderer & registry
packages/visual-editor-renderer-vue/src/blocks/artisanpack/*, packages/visual-editor-renderer-vue/src/blocks/registerCoreBlocks.ts, packages/visual-editor-renderer-vue/tests/*
Adds Vue renderers mirroring React/Blade behavior, registers them, and adds Vue tests for rendering and edge cases.
Marquee editor clamp & canvas integration
resources/js/visual-editor/blocks/marquee/{clamp,edit,save,marquee.css}, resources/js/visual-editor/editor/canvas-styles.ts, resources/js/visual-editor/editor/__tests__/canvas-styles.test.ts
Introduces clamp helpers, MarqueeEdit and MarqueeSave, marquee CSS for editor and frontend, injects inline marquee styles into canvas bundle, and disables animation in editor preview; test expectations updated.
Blade/unit tests & BlockRenderer tests
packages/visual-editor-renderer-blade/tests/*, packages/visual-editor-renderer-react/tests/BlockTree.test.tsx, packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
Adds Blade feature/unit tests and extends renderer BlockTree tests to cover copyright, marquee, and comments-number scenarios.
Server stamping & renderer parity
src/Resources/PostResolver.php, packages/renderer-parity.json, tests/Unit/VisualEditor/Resources/PostResolverTest.php
PostResolver recognizes artisanpack/comments-number and stamps _resolvedCommentCount via resolveCommentsCount; renderer-parity.json adds the three new artisanpack block names; tests added for resolved count and fallback.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related issues

  • #495: Umbrella for Crosswinds block fork; this PR implements the CW4 site-chrome cluster.
  • #525: Related resolver changes for server-side comment stamping reused by this PR.

Possibly related PRs

Poem

🐰 I hopped through code with nimble paws,

Three tiny blocks in shiny gauze.
Marquee that scrolls and counts that rhyme,
Copyright keeps perfect time,
Blade, React, Vue — a triple-bunny cause.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.81% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately summarizes the main change: adding three site-chrome blocks (copyright, marquee, comments-number) under the artisanpack namespace across all renderers.
Linked Issues check ✅ Passed All acceptance criteria from issue #500 are met: three blocks register under artisanpack/*, renderer parity tests pass, editor UI controls are implemented, marquee animation is functional, and transforms are verified.
Out of Scope Changes check ✅ Passed All changes are directly aligned with issue #500 scope: three new site-chrome blocks with full Blade/React/Vue renderers, editor UI, tests, and supporting infrastructure (PostResolver, frontend CSS, canvas styles).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/500-site-chrome-blocks

Comment @coderabbitai help to get the list of available commands and usage tips.

@ViewFromTheBox
ViewFromTheBox marked this pull request as ready for review June 12, 2026 02:04

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (2)
resources/js/visual-editor/blocks/__tests__/site-chrome-family.test.ts (1)

70-79: ⚡ Quick win

Assert the full comments-number context contract (postId + postType).

This test currently verifies only postId, so a future removal of postType would pass unnoticed even though the block schema contract includes both.

Suggested patch
     it('comments-number declares singular + plural labels and the postId context', () => {
         const attrs = (commentsNumberMeta as { attributes?: Record<string, { default?: unknown }> })
             .attributes;
         expect(attrs?.singularCommentText?.default).toBe('Comment');
         expect(attrs?.pluralCommentText?.default).toBe('Comments');

         const usesContext = (commentsNumberMeta as { usesContext?: ReadonlyArray<string> })
             .usesContext;
         expect(usesContext).toContain('postId');
+        expect(usesContext).toContain('postType');
     });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@resources/js/visual-editor/blocks/__tests__/site-chrome-family.test.ts`
around lines 70 - 79, The test only asserts that commentsNumberMeta.usesContext
contains 'postId' but should assert the full context contract includes both
'postId' and 'postType'; update the test (referencing commentsNumberMeta and
usesContext) to either expect usesContext toContain 'postType' as well or
toEqual/contain the exact array of required context keys so removal of
'postType' will fail the test.
resources/js/visual-editor/blocks/marquee/edit.tsx (1)

35-47: ⚡ Quick win

Extract shared clamping helpers to avoid edit/save drift.

Line 35 and Line 42 duplicate clamping behavior also implemented in resources/js/visual-editor/blocks/marquee/save.tsx. Centralizing these helpers reduces parity regressions when ranges/defaults change.

Proposed refactor
+// resources/js/visual-editor/blocks/marquee/clamp.ts
+export function clampPercent(value: number | null | undefined, fallback: number): number {
+    if (typeof value !== 'number' || !Number.isFinite(value)) {
+        return fallback;
+    }
+    return Math.min(100, Math.max(1, Math.round(value)));
+}
+
+export function clampSpeed(value: number | null | undefined, fallback: number): number {
+    if (typeof value !== 'number' || !Number.isFinite(value)) {
+        return fallback;
+    }
+    return Math.min(100, Math.max(1, Math.round(value)));
+}
- function clampPercent(value: number | null | undefined, fallback: number): number {
-     ...
- }
-
- function clampSpeed(value: number | null | undefined, fallback: number): number {
-     ...
- }
+import { clampPercent, clampSpeed } from './clamp';
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@resources/js/visual-editor/blocks/marquee/edit.tsx` around lines 35 - 47, The
clampPercent and clampSpeed functions in edit.tsx duplicate logic also present
in resources/js/visual-editor/blocks/marquee/save.tsx; extract a single shared
helper (e.g., export clampNumber or clampPercent/clampSpeed) into a common
module (like resources/js/visual-editor/blocks/marquee/utils.ts or a shared
utils file), update edit.tsx to import and use the shared clamp helper(s)
instead of its local implementations (referencing the existing function names
clampPercent and clampSpeed to find the code), and update save.tsx to import the
same shared helper so both edit and save use identical clamping logic and
defaults.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@packages/visual-editor-renderer-blade/resources/assets/frontend/marquee.css`:
- Around line 20-34: The marquee currently forces continuous motion via
.ap-marquee__text and `@keyframes` ap-marquee-scroll; add a prefers-reduced-motion
override so users who opt out of animations don’t get forced continuous motion —
e.g. add an `@media` (prefers-reduced-motion: reduce) block that targets
.ap-marquee__text (and any element that applies the animation) to disable the
animation (animation: none or animation-play-state: paused) and reset transform
to a static value (e.g., transform: none) so the marquee is not animated for
reduced-motion users.

In `@packages/visual-editor-renderer-react/src/blocks/artisanpack/marquee.tsx`:
- Around line 25-40: The value coming from attrString(attributes.marqueeContent)
is injected raw via dangerouslySetInnerHTML; replace that with a sanitized
version: call the project’s shared HTML sanitizer (or import a lightweight
sanitizer like DOMPurify/sanitizeHtml) immediately after const content =
attrString(attributes.marqueeContent) to produce e.g. sanitizedContent, and pass
sanitizedContent into dangerouslySetInnerHTML instead of content; similarly
ensure the same sanitization is applied at the renderer boundary for the Vue
(innerHTML: content) and Blade ({!! $content !!}) renderers so hostile
markup/event handlers are stripped before rendering.

In `@packages/visual-editor-renderer-react/tests/BlockTree.test.tsx`:
- Around line 696-742: Freeze system time in the failing copyright tests by
using Vitest fake timers: call vi.useFakeTimers() and vi.setSystemTime(...) with
a fixed Date before you compute year and call renderTree (use the same fixed
Date to derive year), then restore timers (vi.useRealTimers()) after the test;
update the three test cases that use new Date().getUTCFullYear() (the tests
invoking renderTree and makeBlock for 'artisanpack/copyright') to set the fake
time, compute year from the pinned date, run assertions, and tear down the fake
timers.

In `@packages/visual-editor-renderer-vue/tests/BlockTree.test.ts`:
- Around line 695-741: These year-dependent specs (the it blocks that call
renderTree/makeBlock and assert on `new Date().getUTCFullYear()`) should freeze
the clock during the test run: in the test suite setup for these specs call your
test runner's fake timer/system time API (e.g. jest.useFakeTimers +
jest.setSystemTime with a fixed UTC Date) before the tests that render via
renderTree, and restore real time after (jest.useRealTimers or
jest.resetAllMocks) so the year assertions are deterministic; add this
setup/teardown in the same describe or beforeAll/afterAll that contains the
renderTree/makeBlock tests.

---

Nitpick comments:
In `@resources/js/visual-editor/blocks/__tests__/site-chrome-family.test.ts`:
- Around line 70-79: The test only asserts that commentsNumberMeta.usesContext
contains 'postId' but should assert the full context contract includes both
'postId' and 'postType'; update the test (referencing commentsNumberMeta and
usesContext) to either expect usesContext toContain 'postType' as well or
toEqual/contain the exact array of required context keys so removal of
'postType' will fail the test.

In `@resources/js/visual-editor/blocks/marquee/edit.tsx`:
- Around line 35-47: The clampPercent and clampSpeed functions in edit.tsx
duplicate logic also present in
resources/js/visual-editor/blocks/marquee/save.tsx; extract a single shared
helper (e.g., export clampNumber or clampPercent/clampSpeed) into a common
module (like resources/js/visual-editor/blocks/marquee/utils.ts or a shared
utils file), update edit.tsx to import and use the shared clamp helper(s)
instead of its local implementations (referencing the existing function names
clampPercent and clampSpeed to find the code), and update save.tsx to import the
same shared helper so both edit and save use identical clamping logic and
defaults.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3b3f54a6-2cbf-4a77-ae3e-047a43149098

📥 Commits

Reviewing files that changed from the base of the PR and between e34f9f2 and aa8229c.

📒 Files selected for processing (40)
  • packages/renderer-parity.json
  • packages/visual-editor-renderer-blade/resources/assets/frontend/marquee.css
  • packages/visual-editor-renderer-blade/resources/views/blocks/artisanpack/comments-number.blade.php
  • packages/visual-editor-renderer-blade/resources/views/blocks/artisanpack/copyright.blade.php
  • packages/visual-editor-renderer-blade/resources/views/blocks/artisanpack/marquee.blade.php
  • packages/visual-editor-renderer-blade/resources/views/components/blocks-styles.blade.php
  • packages/visual-editor-renderer-blade/src/View/Components/BlocksStylesComponent.php
  • packages/visual-editor-renderer-blade/tests/Feature/BlocksStylesComponentTest.php
  • packages/visual-editor-renderer-blade/tests/Unit/BlockRendererTest.php
  • packages/visual-editor-renderer-react/src/blocks/artisanpack/commentsNumber.tsx
  • packages/visual-editor-renderer-react/src/blocks/artisanpack/copyright.tsx
  • packages/visual-editor-renderer-react/src/blocks/artisanpack/marquee.tsx
  • packages/visual-editor-renderer-react/src/blocks/registerCoreBlocks.ts
  • packages/visual-editor-renderer-react/tests/BlockTree.test.tsx
  • packages/visual-editor-renderer-vue/src/blocks/artisanpack/commentsNumber.ts
  • packages/visual-editor-renderer-vue/src/blocks/artisanpack/copyright.ts
  • packages/visual-editor-renderer-vue/src/blocks/artisanpack/marquee.ts
  • packages/visual-editor-renderer-vue/src/blocks/registerCoreBlocks.ts
  • packages/visual-editor-renderer-vue/tests/BlockTree.test.ts
  • resources/js/visual-editor/blocks/__tests__/site-chrome-family.test.ts
  • resources/js/visual-editor/blocks/comments-number/block.json
  • resources/js/visual-editor/blocks/comments-number/edit.tsx
  • resources/js/visual-editor/blocks/comments-number/index.ts
  • resources/js/visual-editor/blocks/comments-number/inserter-icon.tsx
  • resources/js/visual-editor/blocks/comments-number/save.tsx
  • resources/js/visual-editor/blocks/copyright/block.json
  • resources/js/visual-editor/blocks/copyright/edit.tsx
  • resources/js/visual-editor/blocks/copyright/index.ts
  • resources/js/visual-editor/blocks/copyright/inserter-icon.tsx
  • resources/js/visual-editor/blocks/copyright/save.tsx
  • resources/js/visual-editor/blocks/marquee/block.json
  • resources/js/visual-editor/blocks/marquee/edit.tsx
  • resources/js/visual-editor/blocks/marquee/index.ts
  • resources/js/visual-editor/blocks/marquee/inserter-icon.tsx
  • resources/js/visual-editor/blocks/marquee/marquee.css
  • resources/js/visual-editor/blocks/marquee/save.tsx
  • resources/js/visual-editor/editor/__tests__/canvas-styles.test.ts
  • resources/js/visual-editor/editor/canvas-styles.ts
  • src/Resources/PostResolver.php
  • tests/Unit/VisualEditor/Resources/PostResolverTest.php

Comment thread packages/visual-editor-renderer-react/tests/BlockTree.test.tsx Outdated
Comment thread packages/visual-editor-renderer-vue/tests/BlockTree.test.ts Outdated
 - Honor prefers-reduced-motion on the marquee animation in both the
   editor preview and the published frontend stylesheet — the keyframe
   is suppressed and the off-screen transform is reset so opted-out
   visitors see static text instead of an endless scroll.
 - Extract the marquee width / speed clamp helpers into a shared
   `clamp.ts` module so edit.tsx and save.tsx can't drift in their
   validation ranges or defaults.
 - Freeze the system clock with `vi.useFakeTimers()` in the React + Vue
   copyright renderer specs so the year assertions stay deterministic
   across a Dec 31 → Jan 1 boundary.
 - Assert both `postId` AND `postType` in the comments-number
   usesContext contract test so a future removal of `postType` trips
   the suite.
@ViewFromTheBox
ViewFromTheBox merged commit 58227d7 into feature/495-port-crosswinds-blocks Jun 12, 2026
1 check passed
@ViewFromTheBox
ViewFromTheBox deleted the feature/500-site-chrome-blocks branch June 12, 2026 02:20
@ViewFromTheBox ViewFromTheBox moved this from In Review to Done in ArtisanPack UI Overview Jun 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

Crosswinds block fork CW4 · Site chrome cluster (copyright, marquee, comments-number)

1 participant