Skip to content

feat (design library): save patterns#3629

Open
kaeizen wants to merge 9 commits into
developfrom
feat/design-library-saving-patterns
Open

feat (design library): save patterns#3629
kaeizen wants to merge 9 commits into
developfrom
feat/design-library-saving-patterns

Conversation

@kaeizen

@kaeizen kaeizen commented Oct 15, 2025

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features
    • Added a Saved Patterns section to the Design Library for storing and reusing custom layouts.
    • Added import and export tools for design library settings using JSON files.
    • Added premium access messaging for Saved Patterns and related import/export features.
  • Improvements
    • Improved design selection, previews, keyboard navigation, and saved-pattern interactions.
    • Preserved design types when adding or substituting patterns and pages.
  • Bug Fixes
    • Added safer handling when design library content is unavailable.
    • Improved preview behavior and notification visibility across design library views.

@coderabbitai

coderabbitai Bot commented Oct 15, 2025

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 80bb8ed4-bfc6-4a7a-9c90-565fa4355200

📥 Commits

Reviewing files that changed from the base of the PR and between 708b376 and bd61624.

📒 Files selected for processing (13)
  • src/design-library/index.js
  • src/design-library/init.php
  • src/lazy-components/design-library/design-library-list/design-library-list-item.js
  • src/lazy-components/design-library/design-library-list/design-preview.js
  • src/lazy-components/design-library/design-library-list/editor.scss
  • src/lazy-components/design-library/design-library-list/index.js
  • src/lazy-components/design-library/design-library-list/use-preview-renderer.js
  • src/lazy-components/design-library/editor.scss
  • src/lazy-components/design-library/header-actions.js
  • src/lazy-components/design-library/index.js
  • src/lazy-components/design-library/util.js
  • src/welcome/admin.js
  • src/welcome/admin.scss
✅ Files skipped from review due to trivial changes (1)
  • src/lazy-components/design-library/editor.scss
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/design-library/init.php
  • src/welcome/admin.js

📝 Walkthrough

Walkthrough

The change adds saved-pattern storage and design-library support, including saved-tab rendering, typed selection data, preview behavior, and access controls. It also adds an admin import-export settings view with JSON file handling and modal integration.

Changes

Saved design library

Layer / File(s) Summary
Saved pattern storage and retrieval
src/design-library/index.js, src/design-library/init.php
Saved patterns are registered as REST-exposed settings, retrieved locally for the saved type, and excluded from plan filtering.
Saved pattern selection and access
src/lazy-components/design-library/index.js, src/lazy-components/design-library/design-library-list/index.js, src/lazy-components/design-library/header-actions.js
Saved patterns are sourced through filters, selected designs retain their type, and non-Pro access renders the appropriate controls.
Saved pattern preview and interaction
src/lazy-components/design-library/design-library-list/*, src/lazy-components/design-library/util.js
Preview rendering, placeholder replacement, keyboard interaction, and filtered pattern actions now support saved and non-page designs.
Saved pattern styling and overlays
src/lazy-components/design-library/editor.scss, src/lazy-components/design-library/design-library-list/editor.scss
Saved-item cursors, edit-button hover behavior, pro-note sizing, snackbar layering, and spinner overlay styles are updated.

Settings import and export

Layer / File(s) Summary
Import-export settings entry
src/welcome/admin.js
A new settings tab handles import/export navigation, JSON file parsing, modal state, and modal rendering.
Import-export styling integration
src/welcome/admin.scss, src/welcome/import-export/*
The admin stylesheet imports the import-export styling module.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AdminSettings
  participant ImportExportSettings
  participant ImportExportModal
  participant SettingsModel
  AdminSettings->>ImportExportSettings: open import-export tab
  ImportExportSettings->>ImportExportSettings: parse selected JSON file
  ImportExportSettings->>ImportExportModal: provide modal state and import data
  ImportExportModal->>SettingsModel: save imported settings
  SettingsModel-->>ImportExportModal: return save result
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and matches the main change: adding saved pattern support in the design library.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ 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 feat/design-library-saving-patterns

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Oct 15, 2025

Copy link
Copy Markdown

🤖 Pull request artifacts

file commit
pr3629-stackable-3629-merge.zip bd61624

github-actions Bot added a commit that referenced this pull request Oct 15, 2025

@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: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/modal-design-library/modal.js (1)

81-101: Ensure savedPatterns defaults to an array
applyFilters( 'stackable.design-library.patterns', selectedTab ) uses the current tab string as the default value. When no filter provides saved patterns (the common case on non‑Pro setups), savedPatterns becomes the string 'saved', so the sidebar state setters receive a string instead of an array and the saved tab breaks. Pass an empty array as the default and forward selectedTab as a context argument.

- const savedPatterns = applyFilters( 'stackable.design-library.patterns', selectedTab )
+ const savedPatterns = applyFilters( 'stackable.design-library.patterns', [], selectedTab )
🧹 Nitpick comments (1)
src/components/modal-design-library/editor.scss (1)

468-472: Consider a z-index management strategy.

The conditional z-index elevation works, but the high value (100001) and the need for :has() selector suggests potential z-index management complexity. Consider establishing a documented z-index scale or using CSS custom properties for consistent layering.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1e56ba3 and 8966428.

📒 Files selected for processing (19)
  • src/block/design-library/edit.js (4 hunks)
  • src/components/design-library-list/design-library-list-item.js (6 hunks)
  • src/components/design-library-list/design-preview.js (2 hunks)
  • src/components/design-library-list/editor.scss (2 hunks)
  • src/components/design-library-list/index.js (3 hunks)
  • src/components/design-library-list/use-preview-renderer.js (4 hunks)
  • src/components/design-library-list/util.js (1 hunks)
  • src/components/modal-design-library/editor.scss (1 hunks)
  • src/components/modal-design-library/header-actions.js (2 hunks)
  • src/components/modal-design-library/modal.js (9 hunks)
  • src/components/pro-control/index.js (1 hunks)
  • src/design-library/index.js (2 hunks)
  • src/design-library/init.php (3 hunks)
  • src/welcome/admin.js (4 hunks)
  • src/welcome/admin.scss (1 hunks)
  • src/welcome/import-export/context.js (1 hunks)
  • src/welcome/import-export/design-library.js (1 hunks)
  • src/welcome/import-export/import-export.scss (1 hunks)
  • src/welcome/import-export/index.js (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-25T08:17:15.564Z
Learnt from: kaeizen
PR: gambitph/Stackable#3601
File: src/components/design-library-list/use-preview-renderer.js:307-331
Timestamp: 2025-09-25T08:17:15.564Z
Learning: In the design library preview renderer hook (src/components/design-library-list/use-preview-renderer.js), selectedTab changes trigger content updates through a chain of effects rather than direct dependencies. The first useEffect (template processing) responds to selectedTab changes indirectly and updates content state, which then triggers the second useEffect (rendering/scaling) that depends on content. This eliminates the need to add selectedTab to the second effect's dependency array.

Applied to files:

  • src/components/design-library-list/index.js
  • src/components/design-library-list/use-preview-renderer.js
  • src/components/design-library-list/design-preview.js
  • src/components/modal-design-library/modal.js
  • src/components/design-library-list/design-library-list-item.js
🧬 Code graph analysis (12)
src/components/design-library-list/util.js (1)
src/components/design-library-list/use-preview-renderer.js (1)
  • isDesignLibraryDevMode (71-71)
src/components/design-library-list/index.js (4)
src/components/design-library-list/use-preview-renderer.js (1)
  • props (41-53)
src/components/modal-design-library/header-actions.js (1)
  • props (25-32)
src/components/modal-design-library/modal.js (1)
  • selectedTab (68-68)
src/components/pro-control/index.js (1)
  • ProControl (163-191)
src/design-library/init.php (3)
src/dynamic-breakpoints.php (1)
  • sanitize_array_setting (135-137)
src/plugins/global-settings/color-schemes/index.php (1)
  • sanitize_array_setting (154-156)
src/global-settings.php (1)
  • sanitize_array_setting (507-509)
src/components/design-library-list/use-preview-renderer.js (3)
src/components/design-library-list/index.js (1)
  • selectedTab (84-92)
src/components/modal-design-library/modal.js (1)
  • selectedTab (68-68)
src/components/design-library-list/util.js (4)
  • getCategorySlug (329-339)
  • getCategorySlug (329-339)
  • replacePlaceholders (183-197)
  • replacePlaceholders (183-197)
src/components/design-library-list/design-preview.js (2)
src/components/design-library-list/index.js (1)
  • selectedTab (84-92)
src/components/modal-design-library/modal.js (1)
  • selectedTab (68-68)
src/components/modal-design-library/header-actions.js (1)
src/components/advanced-toolbar-control/index.js (1)
  • AdvancedToolbarControl (197-291)
src/components/modal-design-library/modal.js (3)
src/components/color-palette-control/index.js (1)
  • applyFilters (119-119)
src/components/design-library-list/index.js (1)
  • selectedTab (84-92)
src/design-library/index.js (2)
  • filterDesigns (74-89)
  • filterDesigns (74-89)
src/components/design-library-list/design-library-list-item.js (3)
src/components/design-library-list/use-auto-scroll.js (2)
  • onMouseOut (141-141)
  • onMouseOver (140-140)
src/components/design-library-list/index.js (2)
  • selectedTab (84-92)
  • previewProps (101-124)
src/components/color-palette-control/index.js (1)
  • applyFilters (119-119)
src/block/design-library/edit.js (3)
src/components/design-library-list/use-preview-renderer.js (1)
  • isDesignLibraryDevMode (71-71)
src/design-library/index.js (2)
  • design (103-103)
  • designs (7-7)
src/components/design-library-list/util.js (1)
  • blocksForSubstitution (217-217)
src/welcome/import-export/design-library.js (3)
src/welcome/admin.js (9)
  • props (606-613)
  • props (646-650)
  • props (832-836)
  • props (898-903)
  • props (1171-1175)
  • props (1359-1363)
  • props (1464-1468)
  • props (1605-1608)
  • settings (514-514)
src/welcome/import-export/index.js (1)
  • props (23-25)
src/welcome/import-export/context.js (2)
  • useImportExportSettingsContext (5-7)
  • useImportExportSettingsContext (5-7)
src/welcome/import-export/index.js (2)
src/welcome/admin.js (3)
  • modalState (1615-1615)
  • importFile (1616-1616)
  • settings (514-514)
src/welcome/import-export/context.js (2)
  • ImportExportSettingsContext (3-3)
  • ImportExportSettingsContext (3-3)
src/welcome/admin.js (1)
src/welcome/import-export/index.js (2)
  • ImportExportModal (22-51)
  • ImportExportModal (22-51)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: build
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 7.3 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 8.2 and WP 6.7.2
🔇 Additional comments (12)
src/components/pro-control/index.js (1)

153-160: LGTM!

The new ProControl label for saved patterns follows the established pattern and provides clear feature descriptions.

src/components/design-library-list/editor.scss (3)

57-75: LGTM!

The overlay edit button container follows a standard hover-reveal pattern with appropriate transitions and positioning.


83-86: LGTM!

The hover transition delay provides a good user experience by avoiding premature display of edit controls during quick mouse movements.


285-290: LGTM!

The cursor styling correctly indicates that saved items are non-interactive content while the footer remains actionable.

src/block/design-library/edit.js (2)

119-119: LGTM!

The type parameter is correctly threaded through the design creation flow, enabling type-aware processing for saved patterns and other design types.

Also applies to: 259-260, 267-267, 341-341, 348-350


210-238: Verify spacing behavior for saved designs.

The conditional type !== 'saved' skips margin/padding adjustments for saved designs, preserving their original spacing. Confirm this is the intended behavior, as users might expect consistent spacing adjustments across all design types.

Consider:

  • Should saved designs retain their exact spacing, or should they adapt to the current site's spacing presets like other designs?
  • Are there specific use cases where preserving original spacing is critical for saved patterns?
src/design-library/index.js (2)

32-38: LGTM!

The defensive coding with optional chaining and fallbacks prevents runtime errors when API data is incomplete or missing, improving robustness.


78-82: LGTM!

The filtering logic correctly skips plan-based filtering for saved patterns, as these are user-created designs that don't have premium/plan restrictions.

src/welcome/admin.scss (1)

918-918: LGTM!

The import statement correctly integrates the new import-export UI styles into the admin stylesheet.

src/welcome/import-export/context.js (1)

1-8: LGTM!

The context and hook implementation follows React best practices for sharing state across the import/export UI components.

src/components/design-library-list/design-preview.js (2)

58-76: Verify the condition change for event listeners.

The condition changed from selectedTab !== 'patterns' to selectedTab !== 'pages', which is a logic inversion. This now restricts mouse drag listeners to only the 'pages' tab, whereas they previously applied to all non-patterns tabs. Confirm this is intentional and that patterns, saved, and other tabs still have appropriate interaction handlers.

Based on learnings


124-124: LGTM!

The addition of the is-layout-constrained class provides appropriate layout constraints for the preview wrapper.

Comment thread src/components/design-library-list/design-library-list-item.js
Comment thread src/lazy-components/design-library/header-actions.js
Comment thread src/welcome/import-export/index.js Outdated
github-actions Bot added a commit that referenced this pull request Oct 15, 2025

@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: 3

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8966428 and 048572d.

📒 Files selected for processing (4)
  • src/components/design-library-list/design-library-list-item.js (6 hunks)
  • src/components/design-library-list/design-preview.js (3 hunks)
  • src/components/design-library-list/editor.scss (2 hunks)
  • src/welcome/import-export/index.js (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-25T08:17:15.564Z
Learnt from: kaeizen
PR: gambitph/Stackable#3601
File: src/components/design-library-list/use-preview-renderer.js:307-331
Timestamp: 2025-09-25T08:17:15.564Z
Learning: In the design library preview renderer hook (src/components/design-library-list/use-preview-renderer.js), selectedTab changes trigger content updates through a chain of effects rather than direct dependencies. The first useEffect (template processing) responds to selectedTab changes indirectly and updates content state, which then triggers the second useEffect (rendering/scaling) that depends on content. This eliminates the need to add selectedTab to the second effect's dependency array.

Applied to files:

  • src/components/design-library-list/design-library-list-item.js
  • src/components/design-library-list/design-preview.js
🧬 Code graph analysis (3)
src/components/design-library-list/design-library-list-item.js (2)
src/components/design-library-list/use-auto-scroll.js (2)
  • onMouseOut (141-141)
  • onMouseOver (140-140)
src/components/design-library-list/index.js (2)
  • selectedTab (84-92)
  • previewProps (101-124)
src/welcome/import-export/index.js (2)
src/welcome/admin.js (3)
  • modalState (1615-1615)
  • importFile (1616-1616)
  • settings (514-514)
src/welcome/import-export/context.js (2)
  • ImportExportSettingsContext (3-3)
  • ImportExportSettingsContext (3-3)
src/components/design-library-list/design-preview.js (2)
src/components/design-library-list/index.js (1)
  • selectedTab (84-92)
src/components/modal-design-library/modal.js (1)
  • selectedTab (68-68)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 7.3 and WP 6.5.5
🔇 Additional comments (3)
src/components/design-library-list/design-preview.js (3)

56-76: Tab gating logic correctly updated for multi-tab support.

The condition change from selectedTab === 'patterns' to selectedTab !== 'pages' correctly limits the drag-scrolling functionality to the 'pages' tab only, which aligns with the PR's addition of a 'saved' patterns tab alongside existing 'pages' and 'patterns' tabs.


127-127: Verify layout across all preview types. The is-layout-constrained class is applied unconditionally in design-preview.js (line 127). Manually test pages, patterns, and saved previews to confirm it delivers the intended layout for each.


93-94: Confirm native inert support or include polyfill.

  • Native support: Chrome/Edge ≥102, Firefox ≥112, Safari ≥15.5.
  • For older browsers, import the WICG/inert polyfill (wicg/inert) plus required shims (Map, Set, Element.prototype.matches, Node.prototype.contains).

Comment thread src/components/design-library-list/design-library-list-item.js Outdated
Comment thread src/components/design-library-list/editor.scss
Comment thread src/welcome/import-export/index.js
github-actions Bot added a commit that referenced this pull request Oct 15, 2025

@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: 0

🧹 Nitpick comments (1)
src/components/modal-design-library/modal.js (1)

81-81: Consider memoizing savedPatterns to avoid unnecessary effect runs.

savedPatterns is computed on every render via applyFilters. If the filter returns a new array reference each time (rather than a memoized value), the effect on line 95 will re-run on every render when selectedTab === 'saved', causing setSidebarDesigns to be called repeatedly with the same data.

Consider wrapping the computation in useMemo:

-const savedPatterns = applyFilters( 'stackable.design-library.patterns', [], selectedTab )
+const savedPatterns = useMemo( 
+	() => applyFilters( 'stackable.design-library.patterns', [], selectedTab ),
+	[ selectedTab ]
+)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 048572d and d727100.

📒 Files selected for processing (1)
  • src/components/modal-design-library/modal.js (9 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-25T08:17:15.564Z
Learnt from: kaeizen
PR: gambitph/Stackable#3601
File: src/components/design-library-list/use-preview-renderer.js:307-331
Timestamp: 2025-09-25T08:17:15.564Z
Learning: In the design library preview renderer hook (src/components/design-library-list/use-preview-renderer.js), selectedTab changes trigger content updates through a chain of effects rather than direct dependencies. The first useEffect (template processing) responds to selectedTab changes indirectly and updates content state, which then triggers the second useEffect (rendering/scaling) that depends on content. This eliminates the need to add selectedTab to the second effect's dependency array.

Applied to files:

  • src/components/modal-design-library/modal.js
🧬 Code graph analysis (1)
src/components/modal-design-library/modal.js (2)
src/components/design-library-list/index.js (1)
  • selectedTab (84-92)
src/design-library/index.js (2)
  • filterDesigns (74-89)
  • filterDesigns (74-89)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 7.3 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP 6.5.5
🔇 Additional comments (4)
src/components/modal-design-library/modal.js (4)

96-102: LGTM! Early return logic for saved tab is correct.

The saved tab path appropriately:

  • Populates sidebar from filtered patterns instead of fetching from server
  • Resets category selection and flags
  • Updates loading state

125-125: Type propagation is consistent and aligns with filter logic.

Adding type: selectedTab to:

  • The filterDesigns call (line 125)
  • Selected designs for 'pages' tab (line 152)
  • Multi-select design data for other tabs (line 182)

This correctly threads the design type through selection and filtering, enabling downstream code to differentiate between pattern sources (patterns vs. saved vs. pages).

Also applies to: 152-152, 182-182


261-269: Visibility logic correctly expanded to include saved patterns.

Changing conditions from selectedTab === 'patterns' to selectedTab !== 'pages' appropriately allows both 'patterns' and 'saved' tabs to:

  • Display the Section Background toggle (line 261)
  • Show the multi-select footer with "Add Designs" (line 409)

This aligns with the intended behavior where saved patterns support the same styling options as regular patterns.

Also applies to: 409-420


406-406: Passing selectedTab prop enables tab-aware rendering.

DesignLibraryList now receives the active tab context, which per the relevant code snippets is consumed via useDesignLibraryContext and used to adapt preview rendering behavior based on the tab.

github-actions Bot added a commit that referenced this pull request Oct 15, 2025

@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: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d727100 and 9dbd54d.

📒 Files selected for processing (2)
  • src/components/design-library-list/editor.scss (2 hunks)
  • src/components/modal-design-library/modal.js (9 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-25T08:17:15.564Z
Learnt from: kaeizen
PR: gambitph/Stackable#3601
File: src/components/design-library-list/use-preview-renderer.js:307-331
Timestamp: 2025-09-25T08:17:15.564Z
Learning: In the design library preview renderer hook (src/components/design-library-list/use-preview-renderer.js), selectedTab changes trigger content updates through a chain of effects rather than direct dependencies. The first useEffect (template processing) responds to selectedTab changes indirectly and updates content state, which then triggers the second useEffect (rendering/scaling) that depends on content. This eliminates the need to add selectedTab to the second effect's dependency array.

Applied to files:

  • src/components/modal-design-library/modal.js
🧬 Code graph analysis (1)
src/components/modal-design-library/modal.js (3)
src/hooks/use-block-color-schemes.js (1)
  • useSelect (19-217)
src/components/design-library-list/index.js (1)
  • selectedTab (84-92)
src/design-library/index.js (2)
  • filterDesigns (74-89)
  • filterDesigns (74-89)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: PHP 8.2 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 7.3 and WP 6.5.5
  • GitHub Check: PHP 7.3 and WP latest

Comment thread src/lazy-components/design-library/design-library-list/editor.scss
github-actions Bot added a commit that referenced this pull request Oct 15, 2025

@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: 1

🧹 Nitpick comments (3)
src/welcome/import-export/index.js (3)

125-125: Remove unnecessary arrow function wrapper.

The arrow function wrapper () => handleImport() is unnecessary since handleImport takes no arguments.

Apply this diff:

-			onClick={ () => handleImport() }
+			onClick={ handleImport }

101-115: Consider extracting TabPanel configuration.

The TabPanel structure is duplicated between Import and Export components. Extract the tab configuration to a shared constant to reduce duplication.

Add before the components:

const SETTINGS_TABS = [
	{
		name: 'design-library',
		title: __( 'Design Library', i18n ),
	},
	{
		name: 'design-system',
		title: __( 'Design System', i18n ),
		disabled: true,
	},
]

Then use tabs={ SETTINGS_TABS } in both TabPanel instances.

Also applies to: 167-181


97-98: Note: Context value structure differs between Import and Export.

Import provides a 3-item array [importFile, importedSettings, setImportedSettings] while Export provides a 2-item array [exportedSettings, setExportedSettings]. Consumers must know which mode they're in to destructure correctly. Consider documenting this or using a consistent object shape instead.

Also applies to: 163-164

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9dbd54d and 853a1dc.

📒 Files selected for processing (2)
  • src/components/design-library-list/design-library-list-item.js (6 hunks)
  • src/welcome/import-export/index.js (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-09-25T08:17:15.564Z
Learnt from: kaeizen
PR: gambitph/Stackable#3601
File: src/components/design-library-list/use-preview-renderer.js:307-331
Timestamp: 2025-09-25T08:17:15.564Z
Learning: In the design library preview renderer hook (src/components/design-library-list/use-preview-renderer.js), selectedTab changes trigger content updates through a chain of effects rather than direct dependencies. The first useEffect (template processing) responds to selectedTab changes indirectly and updates content state, which then triggers the second useEffect (rendering/scaling) that depends on content. This eliminates the need to add selectedTab to the second effect's dependency array.

Applied to files:

  • src/components/design-library-list/design-library-list-item.js
🧬 Code graph analysis (2)
src/components/design-library-list/design-library-list-item.js (2)
src/components/design-library-list/use-auto-scroll.js (2)
  • onMouseOut (141-141)
  • onMouseOver (140-140)
src/components/design-library-list/index.js (2)
  • selectedTab (84-92)
  • previewProps (101-124)
src/welcome/import-export/index.js (2)
src/welcome/admin.js (3)
  • modalState (1615-1615)
  • importFile (1616-1616)
  • settings (514-514)
src/welcome/import-export/context.js (2)
  • ImportExportSettingsContext (3-3)
  • ImportExportSettingsContext (3-3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.5.5
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 7.3 and WP 6.5.5
🔇 Additional comments (10)
src/components/design-library-list/design-library-list-item.js (6)

24-24: LGTM: Clean imports for the new filtering mechanism.

The Fragment and applyFilters imports support the new pattern-actions filter hook added at line 124.

Also applies to: 28-28


94-104: LGTM: Keyboard activation properly restored.

The buttonAttributes object correctly implements Enter/Space key handling with preventDefault() to avoid page scrolling, addressing the previous review feedback.


124-124: LGTM: Safe default for the filter hook.

Using Fragment as the default prevents the render crash (plain object) while providing a safe, renderable fallback when no Pro filters are attached. This is a valid alternative to passing null.


113-113: Verify the intentional inconsistency in interaction areas across tabs.

The tile's clickable region varies by tab:

  • Patterns tab: entire tile is clickable (line 113)
  • Saved tab: only the footer is clickable (line 152)
  • Pages tab: only the Insert button is clickable (lines 169-182)

This inconsistent interaction model may confuse users as they switch tabs. Please confirm this is intentional and aligns with the UX design.

Also applies to: 152-152, 169-182


107-108: LGTM: eslint-disable comments are justified for the conditional interaction model.

The suppressed accessibility warnings are reasonable because:

  • Mouse handlers (onMouseOut/onMouseOver) implement auto-scroll preview, not core user interaction
  • Core interaction (design selection) has proper keyboard support via buttonAttributes when applied
  • The conditional spread pattern makes it difficult for the linter to verify keyboard support

Monitor these suppressions if the interaction logic changes to ensure accessibility remains intact.

Also applies to: 148-148


168-183: LGTM: Selection indicator now works correctly across all non-pages tabs.

Inverting the conditional from selectedTab === 'pages' to selectedTab !== 'pages' ensures the selection number displays for both Patterns and Saved tabs while preserving the Insert button for the Pages tab.

src/welcome/import-export/index.js (4)

22-51: LGTM!

The modal structure is clean with proper i18n, conditional rendering based on modalState, and appropriate state management for notices.


65-93: LGTM! Previous review concerns fully addressed.

The async error handling now correctly:

  • Awaits model.save() with try/catch
  • Returns early on validation errors (lines 71-76) without closing the modal
  • Returns early when no settings to save (lines 78-81)
  • Only calls onClose() after successful save (line 87)
  • Surfaces failures to the user via notices and console errors

130-141: LGTM!

The timestamp formatting is correct, including the month adjustment (+1). Using local time for admin export filenames is acceptable.


2-2: Remove incorrect side-effect import placement suggestion
The side-effect import of ./design-library is safe: design-library.js imports its needed WordPress dependencies internally, so there’s no hook availability issue.

Likely an incorrect or invalid review comment.

Comment thread src/welcome/import-export/index.js Outdated
github-actions Bot added a commit that referenced this pull request Oct 15, 2025

@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: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 853a1dc and f7eeec0.

📒 Files selected for processing (2)
  • src/components/design-library-list/editor.scss (2 hunks)
  • src/welcome/import-export/index.js (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/design-library-list/editor.scss
🧰 Additional context used
🧬 Code graph analysis (1)
src/welcome/import-export/index.js (2)
src/welcome/admin.js (3)
  • modalState (1615-1615)
  • importFile (1616-1616)
  • settings (514-514)
src/welcome/import-export/context.js (2)
  • ImportExportSettingsContext (3-3)
  • ImportExportSettingsContext (3-3)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: PHP 7.3 and WP 6.5.5
  • GitHub Check: PHP 7.3 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.7.2
  • GitHub Check: PHP 8.2 and WP latest
  • GitHub Check: PHP 8.2 and WP 6.6.2
  • GitHub Check: PHP 8.2 and WP 6.5.5
🔇 Additional comments (5)
src/welcome/import-export/index.js (5)

22-51: LGTM! Clean modal wrapper implementation.

The component correctly handles modal state, notice display, and conditional rendering of import/export flows.


66-68: Verify: Should users be notified when import file is invalid?

When importedSettings lacks a settings key, the modal closes silently without showing any error notice. This may confuse users who don't understand why their import failed.

Consider whether this should show an error notice before closing:

 if ( ! ( 'settings' in importedSettings ) ) {
+	setNotice( __( 'Invalid import file format.', i18n ) )
+	// eslint-disable-next-line no-console
+	console.error( __( 'Stackable: Import error - Missing "settings" key', i18n ) )
 	onClose()
 	return
 }

65-93: Excellent error handling in import flow.

The async error handling properly addresses previous review feedback:

  • Awaits model.save() and catches failures
  • Returns early on validation errors without closing the modal
  • Only closes on successful save
  • Surfaces errors to users via notices and console logs

130-141: LGTM! Timestamped filename generation.

The utility correctly formats the current date/time into a consistent filename pattern.


143-202: LGTM! Robust export implementation.

The export flow correctly:

  • Wraps JSON.stringify in try-catch to handle serialization errors (addresses previous review)
  • Creates and downloads the blob safely
  • Only closes the modal on successful export
  • Surfaces errors via notices and console logs
  • Disables the button until there are settings to export

Comment thread src/welcome/import-export/index.js
Comment thread src/welcome/import-export/index.js
@kaeizen kaeizen self-assigned this Oct 30, 2025
github-actions Bot added a commit that referenced this pull request Nov 10, 2025
github-actions Bot added a commit that referenced this pull request Nov 11, 2025
Port saved-patterns design library changes into lazy-components,
combine develop error handling with saved-tab support, and fix
saved-patterns REST setting defaults/sanitization.

Co-authored-by: Cursor <cursoragent@cursor.com>
github-actions Bot added a commit that referenced this pull request Jul 11, 2026
@github-actions

Copy link
Copy Markdown

Size Change: +2.58 kB (+0.1%)

Total Size: 2.63 MB

📦 View Changed
Filename Size Change
build/stackable/dist/admin_welcome.css 6.81 kB +253 B (+3.86%)
build/stackable/dist/admin_welcome.js 146 kB +1.68 kB (+1.17%)
build/stackable/dist/chunks/470.40035c6a93f16588ac4d.js 12.7 kB +12.7 kB (new file) 🆕
build/stackable/dist/chunks/470.efe64a24dd56a919b61f.js 0 B -12.7 kB (removed) 🏆
build/stackable/dist/chunks/design-library.4afe5ebdfc236d349d13.js 9.36 kB +9.36 kB (new file) 🆕
build/stackable/dist/chunks/design-library.545fd477b5950cca0fc6.js 0 B -9.12 kB (removed) 🏆
build/stackable/dist/deprecated/frontend_blocks_deprecated_v2.css 10.5 kB -2 B (-0.02%)
build/stackable/dist/editor_blocks.css 33 kB +121 B (+0.37%)
build/stackable/dist/editor_blocks.js 185 kB +17 B (+0.01%)
build/stackable/dist/frontend_blocks_responsive.css 1.94 kB -5 B (-0.26%)
build/stackable/dist/frontend_blocks.css 12.9 kB -58 B (-0.45%)
build/stackable/dist/stk.js 200 kB +97 B (+0.05%)
build/stackable/dist/translation-strings.js 9.59 kB -28 B (-0.29%)
build/stackable/src/design-library/init.php 2.95 kB +252 B (+9.35%) 🔍
build/stackable/src/dynamic-breakpoints.php 4.08 kB -4 B (-0.1%)
ℹ️ View Unchanged
Filename Size
build/stackable/dist/admin_welcome.js.LICENSE.txt 303 B
build/stackable/dist/chunks/865.33e395e7b3cae1c5dc60.js 4.55 kB
build/stackable/dist/chunks/cimo-download-notice.5f8ba7b00bde0a09df9e.js 1.71 kB
build/stackable/dist/chunks/google-fonts.f834b4c5631c13dffad2.js 18.4 kB
build/stackable/dist/chunks/html-to-image.ed052e3a1c03afea65db.js 5.31 kB
build/stackable/dist/chunks/index.php 96 B
build/stackable/dist/chunks/modal-tour.c043905302c8630fefd7.js 12.7 kB
build/stackable/dist/chunks/style-guide.9436c4f9c24b5ed6edeb.js 68.8 kB
build/stackable/dist/chunks/style-guide.9436c4f9c24b5ed6edeb.js.LICENSE.txt 129 B
build/stackable/dist/deprecated/editor_blocks_deprecated_v2.css 5.63 kB
build/stackable/dist/deprecated/editor_blocks_deprecated_v2.js 171 kB
build/stackable/dist/deprecated/editor_blocks_deprecated_v2.js.LICENSE.txt 307 B
build/stackable/dist/deprecated/frontend_blocks_deprecated_v2.js 11.1 kB
build/stackable/dist/deprecated/frontend_blocks_deprecated_v2.js.LICENSE.txt 233 B
build/stackable/dist/deprecated/index.php 96 B
build/stackable/dist/editor_blocks.js.LICENSE.txt 303 B
build/stackable/dist/frontend_block_accordion_polyfill.js 967 B
build/stackable/dist/frontend_block_accordion.js 1.49 kB
build/stackable/dist/frontend_block_carousel.js 3.72 kB
build/stackable/dist/frontend_block_count_up.js 1.18 kB
build/stackable/dist/frontend_block_countdown.js 1.24 kB
build/stackable/dist/frontend_block_expand.js 619 B
build/stackable/dist/frontend_block_horizontal_scroller.js 714 B
build/stackable/dist/frontend_block_map.js 730 B
build/stackable/dist/frontend_block_notification.js 508 B
build/stackable/dist/frontend_block_progress_bar.js 454 B
build/stackable/dist/frontend_block_progress_circle.js 456 B
build/stackable/dist/frontend_block_tabs.js 1.22 kB
build/stackable/dist/frontend_block_video_popup.js 4.8 kB
build/stackable/dist/frontend_blocks.js 317 B
build/stackable/dist/frontend_image_lightbox.css 2.27 kB
build/stackable/dist/frontend_image_lightbox.js 16.5 kB
build/stackable/dist/frontend_image_optimizer_polyfill.js 591 B
build/stackable/dist/images/block-accordion-basic.68f5b01.png 1.34 kB
build/stackable/dist/images/block-accordion-colored-hover.8f72f13.png 1.78 kB
build/stackable/dist/images/block-accordion-colored.b9ef3d8.png 1.06 kB
build/stackable/dist/images/block-accordion-line-colored-hover.4610270.png 1.29 kB
build/stackable/dist/images/block-accordion-line-colored.c1836c4.png 1.03 kB
build/stackable/dist/images/block-accordion-plain.007aaa8.png 1.14 kB
build/stackable/dist/images/block-blockquote-basic.e72b033.png 2.12 kB
build/stackable/dist/images/block-blockquote-centered-quote.26d25c7.png 1.44 kB
build/stackable/dist/images/block-blockquote-highlight.55187fa.png 1.47 kB
build/stackable/dist/images/block-blockquote-huge.8356ba3.png 1.2 kB
build/stackable/dist/images/block-blockquote-plain.19ab34f.png 1.29 kB
build/stackable/dist/images/block-blog-posts-basic.680a570.png 1.12 kB
build/stackable/dist/images/block-blog-posts-horizontal-card.ba75baa.png 1.2 kB
build/stackable/dist/images/block-blog-posts-image-card.77c6eb9.png 1.47 kB
build/stackable/dist/images/block-blog-posts-list.b951ba2.png 1.18 kB
build/stackable/dist/images/block-blog-posts-portfolio.4e75beb.png 1.13 kB
build/stackable/dist/images/block-blog-posts-portfolio2.3b4e83e.png 1.12 kB
build/stackable/dist/images/block-blog-posts-vertical-card.9b351f9.png 1.18 kB
build/stackable/dist/images/block-blog-posts-vertical-card2.94c4317.png 1.64 kB
build/stackable/dist/images/block-button-basic.51ee84c.png 1.27 kB
build/stackable/dist/images/block-button-fullwidth.289248b.png 970 B
build/stackable/dist/images/block-button-grouped-1.d5b8cea.png 1.08 kB
build/stackable/dist/images/block-button-grouped-2.2997468.png 1.12 kB
build/stackable/dist/images/block-button-spread.90a905b.png 1.08 kB
build/stackable/dist/images/block-call-to-action-basic.d807764.png 2.38 kB
build/stackable/dist/images/block-call-to-action-horizontal-2.789cf52.png 2.13 kB
build/stackable/dist/images/block-call-to-action-horizontal-3.5e7b64d.png 1.11 kB
build/stackable/dist/images/block-call-to-action-horizontal.ca8c70b.png 1.07 kB
build/stackable/dist/images/block-call-to-action-plain.1329525.png 1 kB
build/stackable/dist/images/block-call-to-action-split-centered.32f650b.png 1.69 kB
build/stackable/dist/images/block-card-basic.3dab7e1.png 1.91 kB
build/stackable/dist/images/block-card-faded.d90df58.png 1.06 kB
build/stackable/dist/images/block-card-full.5628067.png 1.04 kB
build/stackable/dist/images/block-card-horizontal.d3bbeff.png 1.11 kB
build/stackable/dist/images/block-card-plain.da837ce.png 1.03 kB
build/stackable/dist/images/block-column-basic.b01f03b.png 432 B
build/stackable/dist/images/block-column-plain.754d303.png 242 B
build/stackable/dist/images/block-columns-grid.1ff8b85.png 351 B
build/stackable/dist/images/block-columns-plain.652f4f5.png 245 B
build/stackable/dist/images/block-columns-tiled.3667138.png 458 B
build/stackable/dist/images/block-columns-uneven-2.9e10f3f.png 383 B
build/stackable/dist/images/block-columns-uneven.8d5964c.png 246 B
build/stackable/dist/images/block-components-separator-curve-1.254c17a.png 1.18 kB
build/stackable/dist/images/block-components-separator-curve-2.d665227.png 1.25 kB
build/stackable/dist/images/block-components-separator-curve-3.4244deb.png 779 B
build/stackable/dist/images/block-components-separator-rounded-1.13da362.png 1.18 kB
build/stackable/dist/images/block-components-separator-rounded-2.ff50047.png 931 B
build/stackable/dist/images/block-components-separator-rounded-3.e9fc958.png 667 B
build/stackable/dist/images/block-components-separator-slant-1.5247f2f.png 1.18 kB
build/stackable/dist/images/block-components-separator-slant-2.7fb32a4.png 1.16 kB
build/stackable/dist/images/block-components-separator-straight-1.8900892.png 863 B
build/stackable/dist/images/block-components-separator-wave-1.f17479d.png 1.28 kB
build/stackable/dist/images/block-components-separator-wave-2.eb49cf9.png 1.19 kB
build/stackable/dist/images/block-components-separator-wave-3.baef658.png 1.29 kB
build/stackable/dist/images/block-components-separator-wave-4.28b0f44.png 510 B
build/stackable/dist/images/block-container-basic.dd84828.png 1.01 kB
build/stackable/dist/images/block-container-image.4c81c13.png 1.01 kB
build/stackable/dist/images/block-container-image2.752422b.png 1.16 kB
build/stackable/dist/images/block-container-image3.f995a65.png 1.86 kB
build/stackable/dist/images/block-container-plain.34d3d43.png 966 B
build/stackable/dist/images/block-count-up-abstract.67823c9.png 1.34 kB
build/stackable/dist/images/block-count-up-boxed.985f72c.png 2.18 kB
build/stackable/dist/images/block-count-up-plain-2.9e90150.png 1.41 kB
build/stackable/dist/images/block-count-up-plain.0a13db2.png 1.4 kB
build/stackable/dist/images/block-count-up-side.ec8c2dd.png 1.32 kB
build/stackable/dist/images/block-design-library-preview.f1220a2.jpg 18.1 kB
build/stackable/dist/images/block-divider-asterisks.019c81a.png 1.17 kB
build/stackable/dist/images/block-divider-bar.4f8f364.png 947 B
build/stackable/dist/images/block-divider-basic.ea69f9d.png 873 B
build/stackable/dist/images/block-divider-dots.8407764.png 1.03 kB
build/stackable/dist/images/block-feature-basic.d5c6217.png 2.31 kB
build/stackable/dist/images/block-feature-grid-basic.c2975a9.png 1.62 kB
build/stackable/dist/images/block-feature-grid-horizontal.d6e2e24.png 1.95 kB
build/stackable/dist/images/block-feature-grid-large-mid.e0e8e0a.png 1.82 kB
build/stackable/dist/images/block-feature-grid-plain.c733275.png 1.24 kB
build/stackable/dist/images/block-feature-grid-zigzag.306f879.png 1.87 kB
build/stackable/dist/images/block-feature-half.7d450d0.png 1.08 kB
build/stackable/dist/images/block-feature-overlap-shape.7dec2f3.png 1.94 kB
build/stackable/dist/images/block-feature-overlap-shape2.44a52d2.png 2.04 kB
build/stackable/dist/images/block-feature-overlap-shape3.cd36866.png 2.55 kB
build/stackable/dist/images/block-feature-overlap-shape4.a6a8039.png 1.82 kB
build/stackable/dist/images/block-feature-overlap-shape5.911477a.png 1.85 kB
build/stackable/dist/images/block-feature-overlap.eecca61.png 1.16 kB
build/stackable/dist/images/block-feature-overlap2.d656224.png 1.73 kB
build/stackable/dist/images/block-feature-overlap3.fac5ae2.png 1.24 kB
build/stackable/dist/images/block-feature-overlap4.fb5f612.png 1.32 kB
build/stackable/dist/images/block-feature-overlap5.64c2bc0.png 1.21 kB
build/stackable/dist/images/block-feature-plain.8af805e.png 1.12 kB
build/stackable/dist/images/block-header-basic.3ade30c.png 1.07 kB
build/stackable/dist/images/block-header-center-overlay.e78fa5b.png 1.63 kB
build/stackable/dist/images/block-header-half-overlay.6e52b0b.png 1.08 kB
build/stackable/dist/images/block-header-half.55c4824.png 1.06 kB
build/stackable/dist/images/block-header-huge.a2ab3b3.png 1.81 kB
build/stackable/dist/images/block-header-plain.b02346e.png 1.03 kB
build/stackable/dist/images/block-header-side-overlay.38f09f6.png 1.14 kB
build/stackable/dist/images/block-image-box-basic.f0c950a.png 1.79 kB
build/stackable/dist/images/block-image-box-box.941daff.png 1.32 kB
build/stackable/dist/images/block-image-box-captioned.d153775.png 1.14 kB
build/stackable/dist/images/block-image-box-fade.e40838a.png 1.76 kB
build/stackable/dist/images/block-image-box-line.3dfcfff.png 2.6 kB
build/stackable/dist/images/block-image-box-plain.17f7c1e.png 1.6 kB
build/stackable/dist/images/block-map-aubergine.a0d1ec8.png 5.03 kB
build/stackable/dist/images/block-map-dark.d22258f.png 3.74 kB
build/stackable/dist/images/block-map-default.f277d0b.png 6.74 kB
build/stackable/dist/images/block-map-night.b489d95.png 9.43 kB
build/stackable/dist/images/block-map-retro.6e9e18c.png 5.43 kB
build/stackable/dist/images/block-map-silver.28c1a66.png 4.93 kB
build/stackable/dist/images/block-notification-basic.c622a4c.png 1.45 kB
build/stackable/dist/images/block-notification-bordered.9ce3a4b.png 1.06 kB
build/stackable/dist/images/block-notification-large-icon.222b1ce.png 2.01 kB
build/stackable/dist/images/block-notification-outlined.f5db8f6.png 1.05 kB
build/stackable/dist/images/block-notification-plain.ffbc0a7.png 1.02 kB
build/stackable/dist/images/block-number-box-background.5d2e597.png 2.52 kB
build/stackable/dist/images/block-number-box-basic.48056c0.png 2.77 kB
build/stackable/dist/images/block-number-box-faded.36e0ec4.png 1.52 kB
build/stackable/dist/images/block-number-box-heading.ebb5529.png 2.01 kB
build/stackable/dist/images/block-number-box-heading2.e3a9fdd.png 1.96 kB
build/stackable/dist/images/block-number-box-plain.7879145.png 1.55 kB
build/stackable/dist/images/block-pricing-box-basic.274f7b9.png 2.16 kB
build/stackable/dist/images/block-pricing-box-colored.b4279c7.png 1.78 kB
build/stackable/dist/images/block-pricing-box-compact.c67635e.png 2.27 kB
build/stackable/dist/images/block-pricing-box-plain.b5adaa7.png 1.37 kB
build/stackable/dist/images/block-pricing-box-sectioned.f376238.png 2.02 kB
build/stackable/dist/images/block-team-member-basic.cd0961b.png 2.2 kB
build/stackable/dist/images/block-team-member-half.bd51006.png 1.74 kB
build/stackable/dist/images/block-team-member-horizontal.09870f5.png 2.01 kB
build/stackable/dist/images/block-team-member-overlay.2bcdb9d.png 2.4 kB
build/stackable/dist/images/block-team-member-plain.3203ea6.png 1.29 kB
build/stackable/dist/images/block-testimonial-background.5d6565d.png 2.21 kB
build/stackable/dist/images/block-testimonial-basic.cc376c2.png 3.15 kB
build/stackable/dist/images/block-testimonial-basic2.2f9f6ac.png 2.19 kB
build/stackable/dist/images/block-testimonial-bubble.2008575.png 1.77 kB
build/stackable/dist/images/block-testimonial-plain.478ddbc.png 1.27 kB
build/stackable/dist/images/block-testimonial-vertical-inverse.a8a8da4.png 2.42 kB
build/stackable/dist/images/block-testimonial-vertical.ef92405.png 2.28 kB
build/stackable/dist/images/block-text-plain.c150f04.png 342 B
build/stackable/dist/images/block-text-side-title-1.f3774a5.png 361 B
build/stackable/dist/images/block-text-side-title-2.b87a180.png 331 B
build/stackable/dist/images/components-button-controls-basic.ab5e9f1.png 1.11 kB
build/stackable/dist/images/components-button-controls-ghost.d3d7b9a.png 1.18 kB
build/stackable/dist/images/components-button-controls-link.dba9a28.png 939 B
build/stackable/dist/images/components-button-controls-plain.c779ddf.png 963 B
build/stackable/dist/images/components-columns-width-control-2-1-grid.afd9a92.png 350 B
build/stackable/dist/images/components-columns-width-control-2-1-uneven.6cd9789.png 415 B
build/stackable/dist/images/components-columns-width-control-2-1.acc91e5.png 408 B
build/stackable/dist/images/components-columns-width-control-2-2-grid.fb0db0a.png 320 B
build/stackable/dist/images/components-columns-width-control-2-2-uneven.343b32f.png 352 B
build/stackable/dist/images/components-columns-width-control-2-2.07b68cc.png 282 B
build/stackable/dist/images/components-columns-width-control-2-3-grid.49f9601.png 304 B
build/stackable/dist/images/components-columns-width-control-2-3-uneven.2f83bb9.png 311 B
build/stackable/dist/images/components-columns-width-control-2-3.014c061.png 270 B
build/stackable/dist/images/components-columns-width-control-3-1-grid.74f65ec.png 319 B
build/stackable/dist/images/components-columns-width-control-3-1-uneven.e06e928.png 313 B
build/stackable/dist/images/components-columns-width-control-3-1.40b83bd.png 288 B
build/stackable/dist/images/components-columns-width-control-3-2-grid.3a3415f.png 395 B
build/stackable/dist/images/components-columns-width-control-3-2-uneven.16d95c7.png 390 B
build/stackable/dist/images/components-columns-width-control-3-2.d6c2e1a.png 280 B
build/stackable/dist/images/components-columns-width-control-3-3-grid.dc0bc99.png 371 B
build/stackable/dist/images/components-columns-width-control-3-3-uneven.1563189.png 383 B
build/stackable/dist/images/components-columns-width-control-3-3.5463833.png 353 B
build/stackable/dist/images/components-columns-width-control-3-4-grid.a51c65c.png 344 B
build/stackable/dist/images/components-columns-width-control-3-4-uneven.c30113e.png 361 B
build/stackable/dist/images/components-columns-width-control-3-4.f094a43.png 350 B
build/stackable/dist/images/components-columns-width-control-4-1-grid.8273e1a.png 387 B
build/stackable/dist/images/components-columns-width-control-4-1-uneven.6ac045a.png 384 B
build/stackable/dist/images/components-columns-width-control-4-1.cd295e6.png 484 B
build/stackable/dist/images/components-columns-width-control-4-2-grid.b0b7a8e.png 325 B
build/stackable/dist/images/components-columns-width-control-4-2-uneven.24ee9ad.png 309 B
build/stackable/dist/images/components-columns-width-control-4-2.38a83ef.png 312 B
build/stackable/dist/images/components-columns-width-control-4-3-grid.92b740b.png 377 B
build/stackable/dist/images/components-columns-width-control-4-3-uneven.1e31bb8.png 353 B
build/stackable/dist/images/components-columns-width-control-4-3.dc1bfc0.png 435 B
build/stackable/dist/images/components-design-separator-control-curve-1.254c17a.png 1.18 kB
build/stackable/dist/images/components-design-separator-control-curve-2.d665227.png 1.25 kB
build/stackable/dist/images/components-design-separator-control-curve-3.4244deb.png 779 B
build/stackable/dist/images/components-design-separator-control-rounded-1.13da362.png 1.18 kB
build/stackable/dist/images/components-design-separator-control-rounded-2.ff50047.png 931 B
build/stackable/dist/images/components-design-separator-control-rounded-3.e9fc958.png 667 B
build/stackable/dist/images/components-design-separator-control-slant-1.5247f2f.png 1.18 kB
build/stackable/dist/images/components-design-separator-control-slant-2.7fb32a4.png 1.16 kB
build/stackable/dist/images/components-design-separator-control-straight-1.8900892.png 863 B
build/stackable/dist/images/components-design-separator-control-wave-1.f17479d.png 1.28 kB
build/stackable/dist/images/components-design-separator-control-wave-2.eb49cf9.png 1.19 kB
build/stackable/dist/images/components-design-separator-control-wave-3.baef658.png 1.29 kB
build/stackable/dist/images/components-design-separator-control-wave-4.28b0f44.png 510 B
build/stackable/dist/images/components-icon-controls-outlined.d293bf5.png 1.26 kB
build/stackable/dist/images/components-icon-controls-plain.d0d9e7b.png 473 B
build/stackable/dist/images/components-icon-controls-shaped.3f56d80.png 1.03 kB
build/stackable/dist/images/components-image-shape-control-blob1.52fa507.png 1.66 kB
build/stackable/dist/images/components-image-shape-control-circle.355575c.png 1.6 kB
build/stackable/dist/images/components-image-shape-control-default.a1e033f.png 853 B
build/stackable/dist/images/components-image-shape-control-square.b0df757.png 887 B
build/stackable/dist/images/components-pro-control-pro-icon.114d653.png 7.13 kB
build/stackable/dist/images/higher-order-with-design-layout-selector-basic.3ade30c.png 1.07 kB
build/stackable/dist/images/index.php 96 B
build/stackable/dist/images/lazy-components-design-library-maps.0f15487.webp 34.2 kB
build/stackable/dist/images/lazy-components-style-guide-hero-bg.c55e339.webp 80.4 kB
build/stackable/dist/images/lazy-components-style-guide-media-text.c06b506.webp 32.6 kB
build/stackable/dist/images/lazy-components-style-guide-profile.5f2c46d.webp 25.5 kB
build/stackable/dist/images/src-welcome-cimo-icon.b7e3f36.png 1.28 kB
build/stackable/dist/images/src-welcome-interactions-icon.cc1be03.png 613 B
build/stackable/dist/index.php 96 B
build/stackable/dist/stk.js.LICENSE.txt 303 B
build/stackable/freemius.php 1.3 kB
build/stackable/freemius/assets/css/admin/account.css 1.25 kB
build/stackable/freemius/assets/css/admin/add-ons.css 2.08 kB
build/stackable/freemius/assets/css/admin/affiliation.css 513 B
build/stackable/freemius/assets/css/admin/checkout.css 420 B
build/stackable/freemius/assets/css/admin/clone-resolution.css 523 B
build/stackable/freemius/assets/css/admin/common.css 1.52 kB
build/stackable/freemius/assets/css/admin/connect.css 2.41 kB
build/stackable/freemius/assets/css/admin/debug.css 474 B
build/stackable/freemius/assets/css/admin/dialog-boxes.css 2.4 kB
build/stackable/freemius/assets/css/admin/gdpr-optin-notice.css 158 B
build/stackable/freemius/assets/css/admin/index.php 96 B
build/stackable/freemius/assets/css/admin/optout.css 1.03 kB
build/stackable/freemius/assets/css/admin/plugins.css 249 B
build/stackable/freemius/assets/css/customizer.css 788 B
build/stackable/freemius/assets/css/index.php 96 B
build/stackable/freemius/assets/img/index.php 96 B
build/stackable/freemius/assets/img/plugin-icon.png 7.56 kB
build/stackable/freemius/assets/img/stackable-ultimate-gutenberg-blocks.png 3.67 kB
build/stackable/freemius/assets/img/theme-icon.png 8.91 kB
build/stackable/freemius/assets/index.php 96 B
build/stackable/freemius/assets/js/index.php 96 B
build/stackable/freemius/assets/js/jquery.form.js 327 B
build/stackable/freemius/assets/js/nojquery.ba-postmessage.js 1.18 kB
build/stackable/freemius/assets/js/postmessage.js 764 B
build/stackable/freemius/assets/js/pricing/14fb1bd5b7c41648488b06147f50a0dc.svg 8.5 kB
build/stackable/freemius/assets/js/pricing/27b5a722a5553d9de0170325267fccec.png 5.37 kB
build/stackable/freemius/assets/js/pricing/45da596e2b512ffc3bb638baaf0fdc4e.png 3.39 kB
build/stackable/freemius/assets/js/pricing/178afa6030e76635dbe835e111d2c507.png 5.05 kB
build/stackable/freemius/assets/js/pricing/4375c4a3ddc6f637c2ab9a2d7220f91e.png 7.56 kB
build/stackable/freemius/assets/js/pricing/a34e046aee1702a5690679750a7f4d0f.svg 10.1 kB
build/stackable/freemius/assets/js/pricing/b09d0b38b627c2fa564d050f79f2f064.svg 2.33 kB
build/stackable/freemius/assets/js/pricing/c03f665db27af43971565560adfba594.png 5.2 kB
build/stackable/freemius/assets/js/pricing/cb5fc4f6ec7ada72e986f6e7dde365bf.png 8.33 kB
build/stackable/freemius/assets/js/pricing/d65812c447b4523b42d59018e1c0bb53.png 29.3 kB
build/stackable/freemius/assets/js/pricing/f3aac72a8e63997d6bb888f816457e9b.png 5.08 kB
build/stackable/freemius/assets/js/pricing/fde48e4609a6ddc11d639fc2421f2afd.png 8.91 kB
build/stackable/freemius/assets/js/pricing/freemius-pricing.js 83.3 kB
build/stackable/freemius/assets/js/pricing/freemius-pricing.js.LICENSE.txt 395 B
build/stackable/freemius/assets/js/pricing/index.php 96 B
build/stackable/freemius/composer.json 562 B
build/stackable/freemius/config.php 3.28 kB
build/stackable/freemius/includes/class-freemius-abstract.php 2.33 kB
build/stackable/freemius/includes/class-freemius.php 167 kB
build/stackable/freemius/includes/class-fs-admin-notices.php 2.12 kB
build/stackable/freemius/includes/class-fs-api.php 5.13 kB
build/stackable/freemius/includes/class-fs-garbage-collector.php 3.56 kB
build/stackable/freemius/includes/class-fs-hook-snapshot.php 517 B
build/stackable/freemius/includes/class-fs-lock.php 840 B
build/stackable/freemius/includes/class-fs-logger.php 4.92 kB
build/stackable/freemius/includes/class-fs-options.php 2.81 kB
build/stackable/freemius/includes/class-fs-plugin-updater.php 13 kB
build/stackable/freemius/includes/class-fs-security.php 803 B
build/stackable/freemius/includes/class-fs-storage.php 3.68 kB
build/stackable/freemius/includes/class-fs-user-lock.php 722 B
build/stackable/freemius/includes/customizer/class-fs-customizer-support-section.php 1 kB
build/stackable/freemius/includes/customizer/class-fs-customizer-upsell-control.php 1.74 kB
build/stackable/freemius/includes/customizer/index.php 96 B
build/stackable/freemius/includes/debug/class-fs-debug-bar-panel.php 702 B
build/stackable/freemius/includes/debug/debug-bar-start.php 590 B
build/stackable/freemius/includes/debug/index.php 96 B
build/stackable/freemius/includes/entities/class-fs-affiliate-terms.php 1.27 kB
build/stackable/freemius/includes/entities/class-fs-affiliate.php 523 B
build/stackable/freemius/includes/entities/class-fs-billing.php 587 B
build/stackable/freemius/includes/entities/class-fs-entity.php 1.05 kB
build/stackable/freemius/includes/entities/class-fs-payment.php 1.21 kB
build/stackable/freemius/includes/entities/class-fs-plugin-info.php 400 B
build/stackable/freemius/includes/entities/class-fs-plugin-license.php 1.82 kB
build/stackable/freemius/includes/entities/class-fs-plugin-plan.php 1.02 kB
build/stackable/freemius/includes/entities/class-fs-plugin-tag.php 550 B
build/stackable/freemius/includes/entities/class-fs-plugin.php 1.07 kB
build/stackable/freemius/includes/entities/class-fs-pricing.php 895 B
build/stackable/freemius/includes/entities/class-fs-scope-entity.php 339 B
build/stackable/freemius/includes/entities/class-fs-site.php 1.89 kB
build/stackable/freemius/includes/entities/class-fs-subscription.php 933 B
build/stackable/freemius/includes/entities/class-fs-user.php 812 B
build/stackable/freemius/includes/entities/index.php 96 B
build/stackable/freemius/includes/fs-core-functions.php 8.03 kB
build/stackable/freemius/includes/fs-essential-functions.php 4.22 kB
build/stackable/freemius/includes/fs-html-escaping-functions.php 915 B
build/stackable/freemius/includes/fs-plugin-info-dialog.php 13.9 kB
build/stackable/freemius/includes/index.php 96 B
build/stackable/freemius/includes/l10n.php 510 B
build/stackable/freemius/includes/managers/class-fs-admin-menu-manager.php 5.53 kB
build/stackable/freemius/includes/managers/class-fs-admin-notice-manager.php 3.72 kB
build/stackable/freemius/includes/managers/class-fs-cache-manager.php 1.55 kB
build/stackable/freemius/includes/managers/class-fs-checkout-manager.php 2.37 kB
build/stackable/freemius/includes/managers/class-fs-clone-manager.php 11.1 kB
build/stackable/freemius/includes/managers/class-fs-contact-form-manager.php 871 B
build/stackable/freemius/includes/managers/class-fs-debug-manager.php 3.39 kB
build/stackable/freemius/includes/managers/class-fs-gdpr-manager.php 1.38 kB
build/stackable/freemius/includes/managers/class-fs-key-value-storage.php 2.49 kB
build/stackable/freemius/includes/managers/class-fs-license-manager.php 883 B
build/stackable/freemius/includes/managers/class-fs-option-manager.php 2.47 kB
build/stackable/freemius/includes/managers/class-fs-permission-manager.php 3.88 kB
build/stackable/freemius/includes/managers/class-fs-plan-manager.php 1.01 kB
build/stackable/freemius/includes/managers/class-fs-plugin-manager.php 1.74 kB
build/stackable/freemius/includes/managers/index.php 96 B
build/stackable/freemius/includes/sdk/Exceptions/ArgumentNotExistException.php 168 B
build/stackable/freemius/includes/sdk/Exceptions/EmptyArgumentException.php 164 B
build/stackable/freemius/includes/sdk/Exceptions/Exception.php 656 B
build/stackable/freemius/includes/sdk/Exceptions/index.php 96 B
build/stackable/freemius/includes/sdk/Exceptions/InvalidArgumentException.php 162 B
build/stackable/freemius/includes/sdk/Exceptions/OAuthException.php 196 B
build/stackable/freemius/includes/sdk/FreemiusBase.php 2.21 kB
build/stackable/freemius/includes/sdk/FreemiusWordPress.php 6.16 kB
build/stackable/freemius/includes/sdk/index.php 96 B
build/stackable/freemius/includes/sdk/LICENSE.txt 6.8 kB
build/stackable/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php 652 B
build/stackable/freemius/includes/supplements/fs-essential-functions-2.2.1.php 515 B
build/stackable/freemius/includes/supplements/fs-migration-2.5.1.php 463 B
build/stackable/freemius/includes/supplements/index.php 96 B
build/stackable/freemius/index.php 96 B
build/stackable/freemius/languages/freemius-cs_CZ.mo 14.8 kB
build/stackable/freemius/languages/freemius-da_DK.mo 12.6 kB
build/stackable/freemius/languages/freemius-de_DE.mo 24.4 kB
build/stackable/freemius/languages/freemius-es_ES.mo 19.3 kB
build/stackable/freemius/languages/freemius-fr_FR.mo 17.2 kB
build/stackable/freemius/languages/freemius-he_IL.mo 13.2 kB
build/stackable/freemius/languages/freemius-hu_HU.mo 10.4 kB
build/stackable/freemius/languages/freemius-it_IT.mo 21 kB
build/stackable/freemius/languages/freemius-ja.mo 16.7 kB
build/stackable/freemius/languages/freemius-nl_NL.mo 17.2 kB
build/stackable/freemius/languages/freemius-ru_RU.mo 16.3 kB
build/stackable/freemius/languages/freemius-ta.mo 19.2 kB
build/stackable/freemius/languages/freemius-zh_CN.mo 24.1 kB
build/stackable/freemius/languages/freemius.pot 16.5 kB
build/stackable/freemius/languages/index.php 96 B
build/stackable/freemius/LICENSE.txt 12.1 kB
build/stackable/freemius/README.md 4.01 kB
build/stackable/freemius/require.php 682 B
build/stackable/freemius/start.php 5.84 kB
build/stackable/freemius/templates/account.php 12.1 kB
build/stackable/freemius/templates/account/billing.php 4.15 kB
build/stackable/freemius/templates/account/index.php 96 B
build/stackable/freemius/templates/account/partials/activate-license-button.php 863 B
build/stackable/freemius/templates/account/partials/addon.php 4.35 kB
build/stackable/freemius/templates/account/partials/deactivate-license-button.php 614 B
build/stackable/freemius/templates/account/partials/disconnect-button.php 1.66 kB
build/stackable/freemius/templates/account/partials/index.php 96 B
build/stackable/freemius/templates/account/partials/site.php 3.85 kB
build/stackable/freemius/templates/account/payments.php 754 B
build/stackable/freemius/templates/add-ons.php 5.01 kB
build/stackable/freemius/templates/add-trial-to-pricing.php 500 B
build/stackable/freemius/templates/admin-notice.php 961 B
build/stackable/freemius/templates/ajax-loader.php 184 B
build/stackable/freemius/templates/api-connectivity-message-js.php 498 B
build/stackable/freemius/templates/auto-installation.php 2.53 kB
build/stackable/freemius/templates/checkout.php 375 B
build/stackable/freemius/templates/checkout/frame.php 2.53 kB
build/stackable/freemius/templates/checkout/index.php 96 B
build/stackable/freemius/templates/checkout/process-redirect.php 1.53 kB
build/stackable/freemius/templates/checkout/redirect.php 1.31 kB
build/stackable/freemius/templates/clone-resolution-js.php 1.24 kB
build/stackable/freemius/templates/connect.php 10.3 kB
build/stackable/freemius/templates/connect/index.php 96 B
build/stackable/freemius/templates/connect/permission.php 679 B
build/stackable/freemius/templates/connect/permissions-group.php 873 B
build/stackable/freemius/templates/contact.php 1.83 kB
build/stackable/freemius/templates/debug.php 8.43 kB
build/stackable/freemius/templates/debug/api-calls.php 1.81 kB
build/stackable/freemius/templates/debug/index.php 96 B
build/stackable/freemius/templates/debug/logger.php 950 B
build/stackable/freemius/templates/debug/plugins-themes-sync.php 854 B
build/stackable/freemius/templates/debug/scheduled-crons.php 1.41 kB
build/stackable/freemius/templates/email.php 545 B
build/stackable/freemius/templates/forms/affiliation.php 5.4 kB
build/stackable/freemius/templates/forms/data-debug-mode.php 2.33 kB
build/stackable/freemius/templates/forms/deactivation/contact.php 458 B
build/stackable/freemius/templates/forms/deactivation/form.php 6.07 kB
build/stackable/freemius/templates/forms/deactivation/index.php 96 B
build/stackable/freemius/templates/forms/deactivation/retry-skip.php 601 B
build/stackable/freemius/templates/forms/email-address-update.php 3.02 kB
build/stackable/freemius/templates/forms/index.php 96 B
build/stackable/freemius/templates/forms/license-activation.php 7.56 kB
build/stackable/freemius/templates/forms/optout.php 2.65 kB
build/stackable/freemius/templates/forms/premium-versions-upgrade-handler.php 2.36 kB
build/stackable/freemius/templates/forms/premium-versions-upgrade-metadata.php 682 B
build/stackable/freemius/templates/forms/resend-key.php 2.39 kB
build/stackable/freemius/templates/forms/subscription-cancellation.php 3.17 kB
build/stackable/freemius/templates/forms/trial-start.php 2.01 kB
build/stackable/freemius/templates/forms/user-change.php 2.77 kB
build/stackable/freemius/templates/gdpr-optin-js.php 912 B
build/stackable/freemius/templates/index.php 96 B
build/stackable/freemius/templates/js/index.php 96 B
build/stackable/freemius/templates/js/jquery.content-change.php 649 B
build/stackable/freemius/templates/js/open-license-activation.php 537 B
build/stackable/freemius/templates/js/permissions.php 3.7 kB
build/stackable/freemius/templates/js/style-premium-theme.php 731 B
build/stackable/freemius/templates/partials/index.php 46 B
build/stackable/freemius/templates/partials/network-activation.php 1.14 kB
build/stackable/freemius/templates/plugin-icon.php 361 B
build/stackable/freemius/templates/plugin-info/description.php 869 B
build/stackable/freemius/templates/plugin-info/features.php 1.14 kB
build/stackable/freemius/templates/plugin-info/index.php 96 B
build/stackable/freemius/templates/plugin-info/screenshots.php 450 B
build/stackable/freemius/templates/pricing.php 1.52 kB
build/stackable/freemius/templates/secure-https-header.php 616 B
build/stackable/freemius/templates/sticky-admin-notice-js.php 694 B
build/stackable/freemius/templates/tabs-capture-js.php 860 B
build/stackable/freemius/templates/tabs.php 2.14 kB
build/stackable/index.php 96 B
build/stackable/languages/index.php 96 B
build/stackable/languages/stackable-ultimate-gutenberg-blocks.pot 54 kB
build/stackable/plugin.php 3.7 kB
build/stackable/readme.txt 14.5 kB
build/stackable/src/admin.php 657 B
build/stackable/src/block-components/alignment/index.php 1.11 kB
build/stackable/src/block-components/index.php 96 B
build/stackable/src/block/accordion/block.json 383 B
build/stackable/src/block/accordion/index.php 1.65 kB
build/stackable/src/block/blockquote/block.json 324 B
build/stackable/src/block/blockquote/index.php 96 B
build/stackable/src/block/button-group/block.json 447 B
build/stackable/src/block/button-group/index.php 96 B
build/stackable/src/block/button/block.json 339 B
build/stackable/src/block/button/index.php 96 B
build/stackable/src/block/call-to-action/block.json 423 B
build/stackable/src/block/call-to-action/index.php 96 B
build/stackable/src/block/card/block.json 405 B
build/stackable/src/block/card/index.php 96 B
build/stackable/src/block/carousel/block.json 300 B
build/stackable/src/block/carousel/index.php 290 B
build/stackable/src/block/column/block.json 357 B
build/stackable/src/block/column/index.php 96 B
build/stackable/src/block/columns/block.json 392 B
build/stackable/src/block/columns/index.php 464 B
build/stackable/src/block/count-up/block.json 357 B
build/stackable/src/block/count-up/index.php 293 B
build/stackable/src/block/countdown/block.json 315 B
build/stackable/src/block/countdown/index.php 292 B
build/stackable/src/block/design-library/block.json 350 B
build/stackable/src/block/design-library/index.php 96 B
build/stackable/src/block/divider/block.json 250 B
build/stackable/src/block/divider/index.php 96 B
build/stackable/src/block/expand/block.json 397 B
build/stackable/src/block/expand/index.php 288 B
build/stackable/src/block/feature-grid/block.json 413 B
build/stackable/src/block/feature-grid/index.php 96 B
build/stackable/src/block/feature/block.json 397 B
build/stackable/src/block/feature/index.php 96 B
build/stackable/src/block/heading/block.json 327 B
build/stackable/src/block/heading/index.php 96 B
build/stackable/src/block/hero/block.json 383 B
build/stackable/src/block/hero/index.php 96 B
build/stackable/src/block/horizontal-scroller/block.json 354 B
build/stackable/src/block/horizontal-scroller/index.php 305 B
build/stackable/src/block/icon-box/block.json 359 B
build/stackable/src/block/icon-box/index.php 96 B
build/stackable/src/block/icon-button/block.json 346 B
build/stackable/src/block/icon-button/index.php 96 B
build/stackable/src/block/icon-label/block.json 342 B
build/stackable/src/block/icon-label/deprecated.php 546 B
build/stackable/src/block/icon-label/index.php 96 B
build/stackable/src/block/icon-list-item/block.json 345 B
build/stackable/src/block/icon-list-item/index.php 96 B
build/stackable/src/block/icon-list/block.json 401 B
build/stackable/src/block/icon-list/index.php 96 B
build/stackable/src/block/icon/block.json 327 B
build/stackable/src/block/icon/index.php 96 B
build/stackable/src/block/image-box/block.json 403 B
build/stackable/src/block/image-box/index.php 96 B
build/stackable/src/block/image/block.json 315 B
build/stackable/src/block/image/index.php 96 B
build/stackable/src/block/index.php 96 B
build/stackable/src/block/map/block.json 326 B
build/stackable/src/block/map/index.php 459 B
build/stackable/src/block/notification/block.json 424 B
build/stackable/src/block/notification/index.php 289 B
build/stackable/src/block/number-box/block.json 337 B
build/stackable/src/block/number-box/index.php 96 B
build/stackable/src/block/posts/block.json 475 B
build/stackable/src/block/posts/index.php 5.46 kB
build/stackable/src/block/price/block.json 373 B
build/stackable/src/block/price/index.php 96 B
build/stackable/src/block/pricing-box/block.json 435 B
build/stackable/src/block/pricing-box/index.php 96 B
build/stackable/src/block/progress-bar/block.json 330 B
build/stackable/src/block/progress-bar/index.php 518 B
build/stackable/src/block/progress-circle/block.json 333 B
build/stackable/src/block/progress-circle/index.php 518 B
build/stackable/src/block/separator/block.json 323 B
build/stackable/src/block/separator/index.php 96 B
build/stackable/src/block/spacer/block.json 222 B
build/stackable/src/block/spacer/index.php 96 B
build/stackable/src/block/subtitle/block.json 316 B
build/stackable/src/block/subtitle/index.php 96 B
build/stackable/src/block/tab-content/block.json 269 B
build/stackable/src/block/tab-content/index.php 96 B
build/stackable/src/block/tab-labels/block.json 270 B
build/stackable/src/block/tab-labels/index.php 96 B
build/stackable/src/block/table-of-contents/block.json 343 B
build/stackable/src/block/table-of-contents/index.php 265 B
build/stackable/src/block/tabs/block.json 385 B
build/stackable/src/block/tabs/index.php 287 B
build/stackable/src/block/team-member/block.json 410 B
build/stackable/src/block/team-member/index.php 96 B
build/stackable/src/block/testimonial/block.json 393 B
build/stackable/src/block/testimonial/index.php 96 B
build/stackable/src/block/text/block.json 329 B
build/stackable/src/block/text/index.php 96 B
build/stackable/src/block/timeline/block.json 322 B
build/stackable/src/block/timeline/index.php 551 B
build/stackable/src/block/video-popup/block.json 414 B
build/stackable/src/block/video-popup/index.php 1.33 kB
build/stackable/src/blocks.php 1.04 kB
build/stackable/src/compatibility/blocksy/index.php 1.99 kB
build/stackable/src/compatibility/ewww.php 580 B
build/stackable/src/compatibility/index.php 179 B
build/stackable/src/compatibility/neve/index.php 416 B
build/stackable/src/compatibility/woocommerce.php 721 B
build/stackable/src/components/__experimental-multi-post-picker-control/index.php 762 B
build/stackable/src/components/index.php 96 B
build/stackable/src/css-optimize.php 4.98 kB
build/stackable/src/deprecated/block-defaults.php 794 B
build/stackable/src/deprecated/block-defaults/custom-block-styles.php 3.43 kB
build/stackable/src/deprecated/block-defaults/index.php 96 B
build/stackable/src/deprecated/editor-settings.php 441 B
build/stackable/src/deprecated/font-awesome-version.php 433 B
build/stackable/src/deprecated/global-color-schemes.php 617 B
build/stackable/src/deprecated/index.php 96 B
build/stackable/src/deprecated/native-global-colors.php 1.18 kB
build/stackable/src/deprecated/navigation-panel-pre-enabled.php 449 B
build/stackable/src/deprecated/v2/block/accordion/block.json 187 B
build/stackable/src/deprecated/v2/block/accordion/index.php 96 B
build/stackable/src/deprecated/v2/block/blockquote/block.json 143 B
build/stackable/src/deprecated/v2/block/blockquote/index.php 96 B
build/stackable/src/deprecated/v2/block/blog-posts/attributes.php 2.9 kB
build/stackable/src/deprecated/v2/block/blog-posts/block.json 222 B
build/stackable/src/deprecated/v2/block/blog-posts/deprecated.php 1.82 kB
build/stackable/src/deprecated/v2/block/blog-posts/index.php 5.68 kB
build/stackable/src/deprecated/v2/block/blog-posts/util.php 663 B
build/stackable/src/deprecated/v2/block/button/block.json 163 B
build/stackable/src/deprecated/v2/block/button/index.php 96 B
build/stackable/src/deprecated/v2/block/call-to-action/block.json 216 B
build/stackable/src/deprecated/v2/block/call-to-action/index.php 96 B
build/stackable/src/deprecated/v2/block/card/block.json 208 B
build/stackable/src/deprecated/v2/block/card/index.php 96 B
build/stackable/src/deprecated/v2/block/column/block.json 222 B
build/stackable/src/deprecated/v2/block/column/index.php 96 B
build/stackable/src/deprecated/v2/block/columns/block.json 228 B
build/stackable/src/deprecated/v2/block/columns/index.php 96 B
build/stackable/src/deprecated/v2/block/container/block.json 207 B
build/stackable/src/deprecated/v2/block/container/index.php 96 B
build/stackable/src/deprecated/v2/block/count-up/block.json 217 B
build/stackable/src/deprecated/v2/block/count-up/index.php 96 B
build/stackable/src/deprecated/v2/block/divider/block.json 150 B
build/stackable/src/deprecated/v2/block/divider/index.php 96 B
build/stackable/src/deprecated/v2/block/expand/block.json 220 B
build/stackable/src/deprecated/v2/block/expand/index.php 96 B
build/stackable/src/deprecated/v2/block/feature-grid/block.json 188 B
build/stackable/src/deprecated/v2/block/feature-grid/index.php 96 B
build/stackable/src/deprecated/v2/block/feature/block.json 161 B
build/stackable/src/deprecated/v2/block/feature/index.php 96 B
build/stackable/src/deprecated/v2/block/header/block.json 191 B
build/stackable/src/deprecated/v2/block/header/index.php 96 B
build/stackable/src/deprecated/v2/block/heading/block.json 184 B
build/stackable/src/deprecated/v2/block/heading/index.php 96 B
build/stackable/src/deprecated/v2/block/icon-list/block.json 214 B
build/stackable/src/deprecated/v2/block/icon-list/index.php 96 B
build/stackable/src/deprecated/v2/block/icon/block.json 186 B
build/stackable/src/deprecated/v2/block/icon/index.php 96 B
build/stackable/src/deprecated/v2/block/image-box/block.json 199 B
build/stackable/src/deprecated/v2/block/image-box/index.php 96 B
build/stackable/src/deprecated/v2/block/index.php 96 B
build/stackable/src/deprecated/v2/block/notification/block.json 209 B
build/stackable/src/deprecated/v2/block/notification/index.php 96 B
build/stackable/src/deprecated/v2/block/number-box/block.json 196 B
build/stackable/src/deprecated/v2/block/number-box/index.php 96 B
build/stackable/src/deprecated/v2/block/pricing-box/block.json 167 B
build/stackable/src/deprecated/v2/block/pricing-box/index.php 96 B
build/stackable/src/deprecated/v2/block/separator/block.json 184 B
build/stackable/src/deprecated/v2/block/separator/index.php 96 B
build/stackable/src/deprecated/v2/block/spacer/block.json 147 B
build/stackable/src/deprecated/v2/block/spacer/index.php 96 B
build/stackable/src/deprecated/v2/block/team-member/block.json 186 B
build/stackable/src/deprecated/v2/block/team-member/index.php 96 B
build/stackable/src/deprecated/v2/block/testimonial/block.json 167 B
build/stackable/src/deprecated/v2/block/testimonial/index.php 96 B
build/stackable/src/deprecated/v2/block/text/block.json 190 B
build/stackable/src/deprecated/v2/block/text/index.php 96 B
build/stackable/src/deprecated/v2/block/video-popup/block.json 250 B
build/stackable/src/deprecated/v2/block/video-popup/index.php 96 B
build/stackable/src/deprecated/v2/blocks.php 1.95 kB
build/stackable/src/deprecated/v2/design-library/index.php 96 B
build/stackable/src/deprecated/v2/design-library/init.php 1.33 kB
build/stackable/src/deprecated/v2/disabled-blocks.php 831 B
build/stackable/src/deprecated/v2/global-settings.php 308 B
build/stackable/src/deprecated/v2/index.php 96 B
build/stackable/src/deprecated/v2/init.php 3.28 kB
build/stackable/src/deprecated/v2/optimization-settings.php 1.06 kB
build/stackable/src/design-library/index.php 96 B
build/stackable/src/editor-settings.php 1.82 kB
build/stackable/src/fonts.php 1.92 kB
build/stackable/src/global-settings.php 7.73 kB
build/stackable/src/icons.php 602 B
build/stackable/src/index.php 96 B
build/stackable/src/init.php 5.76 kB
build/stackable/src/jetpack.php 781 B
build/stackable/src/kses.php 1.41 kB
build/stackable/src/lightbox/index.php 427 B
build/stackable/src/multisite.php 1.31 kB
build/stackable/src/plugins/global-settings/block-styles/index.php 927 B
build/stackable/src/plugins/global-settings/buttons-and-icons/index.php 1.49 kB
build/stackable/src/plugins/global-settings/color-schemes/deprecated/index.php 306 B
build/stackable/src/plugins/global-settings/color-schemes/index.php 5.12 kB
build/stackable/src/plugins/global-settings/index.php 96 B
build/stackable/src/plugins/global-settings/preset-controls/index.php 2.5 kB
build/stackable/src/plugins/global-settings/spacing-and-borders/index.php 1.48 kB
build/stackable/src/plugins/index.php 96 B
build/stackable/src/plugins/theme-block-style-inheritance/index.php 4.79 kB
build/stackable/src/pro.php 1.61 kB
build/stackable/src/stk-block-types.php 3.97 kB
build/stackable/src/styles/block-design-system.php 870 B
build/stackable/src/styles/index.php 96 B
build/stackable/src/unique-id.php 567 B
build/stackable/src/welcome/freemius.php 478 B
build/stackable/src/welcome/getting-started.php 717 B
build/stackable/src/welcome/images/align-left.svg 180 B
build/stackable/src/welcome/images/arrow-left.svg 422 B
build/stackable/src/welcome/images/arrow-right.svg 478 B
build/stackable/src/welcome/images/arrow-up-right.svg 330 B
build/stackable/src/welcome/images/banner-bg.svg 3.2 kB
build/stackable/src/welcome/images/book-open.svg 202 B
build/stackable/src/welcome/images/check.svg 383 B
build/stackable/src/welcome/images/cimo-icon.png 3.92 kB
build/stackable/src/welcome/images/divider.svg 912 B
build/stackable/src/welcome/images/docs.svg 308 B
build/stackable/src/welcome/images/gambit-logo-small.png 3.08 kB
build/stackable/src/welcome/images/headphones.svg 228 B
build/stackable/src/welcome/images/index.php 96 B
build/stackable/src/welcome/images/info.svg 216 B
build/stackable/src/welcome/images/interactions-icon.png 816 B
build/stackable/src/welcome/images/pro-icon.svg 381 B
build/stackable/src/welcome/images/quick-buttons-arrow.svg 496 B
build/stackable/src/welcome/images/settings-icon-essential.svg 277 B
build/stackable/src/welcome/images/settings-icon-section.svg 258 B
build/stackable/src/welcome/images/settings-icon-special.svg 260 B
build/stackable/src/welcome/images/smile.svg 233 B
build/stackable/src/welcome/images/stackable-icon.png 4.55 kB
build/stackable/src/welcome/images/stackable-icon.svg 336 B
build/stackable/src/welcome/images/stackable-logo.png 24.8 kB
build/stackable/src/welcome/images/stackable-logo.svg 1.43 kB
build/stackable/src/welcome/images/star.svg 216 B
build/stackable/src/welcome/images/tutorials.svg 320 B
build/stackable/src/welcome/images/user.svg 304 B
build/stackable/src/welcome/index.php 4.96 kB
build/stackable/src/welcome/news.php 1.3 kB
build/stackable/src/welcome/notification-rate.php 808 B
build/stackable/src/welcome/notification.php 1.82 kB
build/stackable/src/welcome/updates.php 646 B
build/stackable/src/welcome/useful-plugins.php 2.74 kB

compressed-size-action

@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: 2

♻️ Duplicate comments (1)
src/lazy-components/design-library/header-actions.js (1)

43-46: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

showProNotice is used as a value instead of called as a function — Saved tab always shown.

! showProNotice evaluates to false when showProNotice is a function reference, so ! isPro && ! showProNotice is always false. The ternary always appends the Saved tab regardless of pro-notice settings. This was flagged in a previous review and appears unresolved.

#!/bin/bash
# Verify that showProNotice is a function, not a boolean/value
rg -n 'export.*showProNotice' --type=js -g '!node_modules' -g '!dist' | head -20
🤖 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 `@src/lazy-components/design-library/header-actions.js` around lines 43 - 46,
Update the controls condition to invoke showProNotice() rather than evaluating
the function reference, so the Saved tab is appended only when the existing
isPro and pro-notice settings require it. Preserve the current controls and
Saved-tab construction unchanged.
🤖 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 `@src/lazy-components/design-library/design-library-list/editor.scss`:
- Around line 57-83: Update the `@media` (hover: none) override within
.stk-block-design__edit-btn-container to set visibility to visible alongside
opacity: 1, ensuring the container is displayed and interactive on touch devices
while preserving the hover transition behavior elsewhere.

In `@src/lazy-components/design-library/index.js`:
- Around line 112-115: The errors producer in ModalDesignLibrary passes a string
while DesignLibraryList expects an object. In
src/lazy-components/design-library/index.js:112-115, update setErrors in the
designs.error branch to wrap the message under an error key;
src/lazy-components/design-library/design-library-list/index.js:65-70 requires
no direct change because its existing Object.values(errors) rendering will then
display the message.

---

Duplicate comments:
In `@src/lazy-components/design-library/header-actions.js`:
- Around line 43-46: Update the controls condition to invoke showProNotice()
rather than evaluating the function reference, so the Saved tab is appended only
when the existing isPro and pro-notice settings require it. Preserve the current
controls and Saved-tab construction unchanged.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 80bb8ed4-bfc6-4a7a-9c90-565fa4355200

📥 Commits

Reviewing files that changed from the base of the PR and between 708b376 and bd61624.

📒 Files selected for processing (13)
  • src/design-library/index.js
  • src/design-library/init.php
  • src/lazy-components/design-library/design-library-list/design-library-list-item.js
  • src/lazy-components/design-library/design-library-list/design-preview.js
  • src/lazy-components/design-library/design-library-list/editor.scss
  • src/lazy-components/design-library/design-library-list/index.js
  • src/lazy-components/design-library/design-library-list/use-preview-renderer.js
  • src/lazy-components/design-library/editor.scss
  • src/lazy-components/design-library/header-actions.js
  • src/lazy-components/design-library/index.js
  • src/lazy-components/design-library/util.js
  • src/welcome/admin.js
  • src/welcome/admin.scss
✅ Files skipped from review due to trivial changes (1)
  • src/lazy-components/design-library/editor.scss
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/design-library/init.php
  • src/welcome/admin.js

@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.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 2

♻️ Duplicate comments (1)
src/lazy-components/design-library/header-actions.js (1)

43-46: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

showProNotice is used as a value instead of called as a function — Saved tab always shown.

! showProNotice evaluates to false when showProNotice is a function reference, so ! isPro && ! showProNotice is always false. The ternary always appends the Saved tab regardless of pro-notice settings. This was flagged in a previous review and appears unresolved.

#!/bin/bash
# Verify that showProNotice is a function, not a boolean/value
rg -n 'export.*showProNotice' --type=js -g '!node_modules' -g '!dist' | head -20
🤖 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 `@src/lazy-components/design-library/header-actions.js` around lines 43 - 46,
Update the controls condition to invoke showProNotice() rather than evaluating
the function reference, so the Saved tab is appended only when the existing
isPro and pro-notice settings require it. Preserve the current controls and
Saved-tab construction unchanged.
🤖 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 `@src/lazy-components/design-library/design-library-list/editor.scss`:
- Around line 57-83: Update the `@media` (hover: none) override within
.stk-block-design__edit-btn-container to set visibility to visible alongside
opacity: 1, ensuring the container is displayed and interactive on touch devices
while preserving the hover transition behavior elsewhere.

In `@src/lazy-components/design-library/index.js`:
- Around line 112-115: The errors producer in ModalDesignLibrary passes a string
while DesignLibraryList expects an object. In
src/lazy-components/design-library/index.js:112-115, update setErrors in the
designs.error branch to wrap the message under an error key;
src/lazy-components/design-library/design-library-list/index.js:65-70 requires
no direct change because its existing Object.values(errors) rendering will then
display the message.

---

Duplicate comments:
In `@src/lazy-components/design-library/header-actions.js`:
- Around line 43-46: Update the controls condition to invoke showProNotice()
rather than evaluating the function reference, so the Saved tab is appended only
when the existing isPro and pro-notice settings require it. Preserve the current
controls and Saved-tab construction unchanged.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 80bb8ed4-bfc6-4a7a-9c90-565fa4355200

📥 Commits

Reviewing files that changed from the base of the PR and between 708b376 and bd61624.

📒 Files selected for processing (13)
  • src/design-library/index.js
  • src/design-library/init.php
  • src/lazy-components/design-library/design-library-list/design-library-list-item.js
  • src/lazy-components/design-library/design-library-list/design-preview.js
  • src/lazy-components/design-library/design-library-list/editor.scss
  • src/lazy-components/design-library/design-library-list/index.js
  • src/lazy-components/design-library/design-library-list/use-preview-renderer.js
  • src/lazy-components/design-library/editor.scss
  • src/lazy-components/design-library/header-actions.js
  • src/lazy-components/design-library/index.js
  • src/lazy-components/design-library/util.js
  • src/welcome/admin.js
  • src/welcome/admin.scss
✅ Files skipped from review due to trivial changes (1)
  • src/lazy-components/design-library/editor.scss
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/design-library/init.php
  • src/welcome/admin.js
🛑 Comments failed to post (2)
src/lazy-components/design-library/design-library-list/editor.scss (1)

57-83: 🩺 Stability & Availability | 🔴 Critical | ⚡ Quick win

Edit button container remains invisible on touch devices due to missing visibility override.

The @media (hover: none) block at lines 71-73 sets opacity: 1 but does not override visibility: hidden (line 70). Since visibility: hidden makes an element both invisible and non-interactive regardless of opacity, the edit button container won't appear on touch devices. Compare with the existing .ugb-button-component at lines 47-56, which only uses opacity — its touch fallback works because there's no visibility to fight. The new container introduced visibility for the hover transition but forgot to override it in the no-hover media query.

🔧 Proposed fix: add `visibility: visible` to the touch media query
 		visibility: hidden;
 		`@media` (hover: none) {
 			opacity: 1;
+			visibility: visible;
 		}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

	.stk-block-design__edit-btn-container {
		opacity: 0;
		z-index: 2;
		transition: opacity 0.4s cubic-bezier(0.2, 0.6, 0.4, 1), visibility 0.4s cubic-bezier(0.2, 0.6, 0.4, 1);
		position: absolute;
		padding: 60px 30px 30px;
		background: linear-gradient(180deg, transparent, `#fffe` 40px, `#fff`) !important;
		top: auto;
		bottom: -1px;
		left: 0;
		right: 0;
		display: flex;
		gap: 24px;
		visibility: hidden;
		`@media` (hover: none) {
			opacity: 1;
			visibility: visible;
		}

		.ugb-button-component {
			width: 100%;
			justify-content: center;
			pointer-events: none;
			`@media` (hover: none) {
				pointer-events: auto;
			}
		}
	}
🤖 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 `@src/lazy-components/design-library/design-library-list/editor.scss` around
lines 57 - 83, Update the `@media` (hover: none) override within
.stk-block-design__edit-btn-container to set visibility to visible alongside
opacity: 1, ensuring the container is displayed and interactive on touch devices
while preserving the hover transition behavior elsewhere.
src/lazy-components/design-library/index.js (1)

112-115: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

errors prop contract mismatch: producer passes a string, consumer expects an object. ModalDesignLibrary sets errors to designs.error (a string), but DesignLibraryList guards on typeof errors === 'object' — the error message is silently swallowed and never shown to users.

  • src/lazy-components/design-library/index.js#L112-L115: Change setErrors( designs.error ) to setErrors( { error: designs.error } ) so the value is an object with an error key.
  • src/lazy-components/design-library/design-library-list/index.js#L65-L70: No change needed once the producer wraps the error — Object.values( errors ).join( '; ' ) will correctly render the message.
📍 Affects 2 files
  • src/lazy-components/design-library/index.js#L112-L115 (this comment)
  • src/lazy-components/design-library/design-library-list/index.js#L65-L70
🤖 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 `@src/lazy-components/design-library/index.js` around lines 112 - 115, The
errors producer in ModalDesignLibrary passes a string while DesignLibraryList
expects an object. In src/lazy-components/design-library/index.js:112-115,
update setErrors in the designs.error branch to wrap the message under an error
key; src/lazy-components/design-library/design-library-list/index.js:65-70
requires no direct change because its existing Object.values(errors) rendering
will then display the message.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants