Recent Activities

This page shows what are we working on.

breezefront / theme-frontend-breeze-enterprise-eir

5 hours ago error
  • head
    • Productpage. Review in progress. 669824

    • BCB featured product component. 0651cf

    • Add styles for featured product details, SKU, and price row in BCB d65f2d

    • BCB accordion styles at product info main. 1a262b

    • Installer. Add accordion for products. 466a5b

    • Add padding to swatch options in product add form for improved layout f10f77

    • Product main info ... in progress bf5c3f

    • Enhance product quantity input with increment/decrement buttons and update styles for better usability 72192e

    • Update product page medium image dimensions to 590x590 012c72

    • Fix minicart styles: set empty counter opacity to 0 79fcd1

    • Increased h2 bottom margin dff6ea

    • Product page action buttons. d008f0

    • Updated footer content links and section titles for improved clarity and user experience 241039

    • BCB homepage: fixed wrong image name b1a4f4

    • Rating stars styles in product listing f17a0f

    • BCB homepage: updated full width banner and sections spacings 2076c7

    • Fixed sort order of product details inside grid listing 9ad360

    • BCB homepage: updated Videos and full width banner sections 072733

    • Product page title font-size. d0987c

    • Footer. Minor fix for ring reval animation. Restore missing divider in footer. (#3) 54cdc4

    • Footer ring reveal animation added (#3) 4a8be8

    • BCB homepage: added animated badges to top banners grid 197e37

    • BCB homepage: added rotation animation for Full Width Banner 1420f9

    • BCB homepage: top banner updated a53bd5

    • Update favicon color 5ea666

    • Update favicon 18d8dc

    • Slightly update footer background. 5fcbfc

    • Footer content update. Add contact block (#3) dea42e

    • Fixed missing minicart overlay on first open (#2) 54feaa

    • BCB homepage: updated Browse categories block dbfa89

    • Breadcrumbs 196469

    • Done with search (#2) d8e0f3

    • Enhance minisearch functionality with slideout behavior and styling adjustments without Ajaxsearch (#2) 8c4a9d

    • Minisearch styles when ajaxsearch disabled... in progress (#2) 259fac

    • Remove unused styles from viewcart action and update empty subtitle styles in minicart (#2) dba7a5

    • Minicart complete (#2) 56efd2

    • Search on desktop (#2) 9c587e

    • BCB homepage: added videos section 7ee864

    • Minicart inprogress (only buttons to adjust)... (#2) c1be91

    • Minicart update in progress.... c3d18b

    • Minicart update in progress... (#2) 55e7b9

    • INstaller. Create dummy CMS block header_panel_info to allow user add custom content (#2) f70d58

    • Adjust minicart counter (#2) 03e843

    • BCB homepage: Added brand logos section b905f1

    • BCB homepage: Added testimonials section 2ab2cf

    • Update newsletter styles: adjust input border and add consent positioning (#2) 02d37d

    • Header. Update search behaviou and look of the result dropown. 993432

    • BCB homepage: Added FAQ a0bfde

    • Add focused search styles. d80f88

    • BCB homepage: added new sections 875068

    • BCB homepage: added ECI and full-width banner d40cfa

    • Top navigation added. 8fa9a3

    • Remove color from menu links dec081

    • Clone currency and store switchers in header slideout menu for improved functionality de36e3

    • Enhance header and newsletter styles for improved layout and responsiveness in header slideout menu. b63dd0

    • Installer. Update header slideout menu styles. 825795

    • Update footer top content HTML to enhance newsletter section styling.
      Don't set font familiy for header in Page Builder ba0b81

    • BCB homepage WIP b228af

    • Basic navpro slideout styles 75ac0e

    • Refactor header slideout menu and newsletter styles for improved layout and consistency 3b42ff

    • Header slideout menu... d4f174

    • Listing styles for the list mode and old price update. cbff61

    • Update README.md to clarify usage of `with-bottom-divider` CSS class and provide detailed instructions 1b9ea5

    • Pagination and make with-bottom-divider general. 37ea17

    • Added list banner 5 config; updated installer, moved it to json a43985

    • Add new layout configuration and remove easybanner references; update footer content and styles 87165b

    • Refactor easybanner configuration and installer for product listing banners 8b1d0d

    • Installer. Listing grid banner added. 914c01

    • Add swatches variables and layout styles d59581

    • Update positioning for filter title and content in layered navigation 8cbd21

    • Add image dimensions for product listings and related widgets in view.xml 6985cd

    • layout and styles for category view, product toolbar, shop by button 08fd27

    • Add layered navigation styles and update imports 944ff1

    • Keep working on prodcut listing and category page. 411088

    • Keep working on product listing toolbar. ebcfac

    • Working on product listing and toolbar look. 1ab39d

    • Add Cooper* font 132906

    • Add listing item styles and variables e725b5

    • Product lisnting in progress - grey bg and border radius. 4e7c35

    • Add new variable files for colors, typography, header, footer, icons, navigation, popover, minisearch, and gradient ba122c

    • Refactor footer and newsletter styles for improved consistency and responsiveness d831e4

    • Footer top newsletter - some updates. 452ca5

    • Add footer top content block and styles for newsletter integration (WIP) 128131

    • Footer bottom. 8d58ea

    • Add footer content block and styles for enhanced footer layout 4d6b1b

    • Header. Hide menu on medium screens. Update search look on monile. e0146d

    • Installer. Add navigation slideout menu a89fd5

breezefront / module-breeze-ai

11 hours ago success
  • head
    • fix(grid): correct two comment rationales, harden SelectProbe (#134) 6ee879

    • fix(grid): show a run with no operation rows (#134) 5a2bf8

  • 1.8.0
    • chore(release): 1.8.0 da63cd

    • Merge pull request #140 from breezefront/feat/137-build-cost-estimate

      feat(content-builder): state the provider, tier and caps behind the build cost estimate (#137) d6c111

    • Merge master into feat/137-build-cost-estimate

      Estimate reads the image credential through GeneratorTarget (#138).

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 73729f

    • Merge pull request #139 from breezefront/feat/136-138-generation-default-on

      feat(content-builder): generation on by default, with the image key as a Breeze AI model row (#136, #138) f9755b

    • fix(content-builder): no empty brackets on a migrated row (#138)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> bc3564

    • fix(content-builder): say nothing about a switch turned off (#136)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 9554a8

    • test(content-builder): one place that builds ImagePrice (#137)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c2b186

    • refactor(content-builder): one provider lookup for the estimate (#137)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 2996c9

    • fix(content-builder): name a tier only where it is billed (#137)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 0118db

    • chore(content-builder): drop the orphaned image source (#138)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6955f2

    • fix(content-builder): name the real fallback (#136)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 5ab3f1

    • feat(content-builder): state the provider, tier and caps behind the build cost estimate (#137)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> dce887

    • feat(content-builder): generate images out of the box, falling back to extraction without a key (#136)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6144e1

    • feat(content-builder): keep the image credential as a Breeze AI model row (#138)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 01dc56

swissup / module-pagespeed

11 hours ago success
  • 1.19.1
    • Version 1.19.1

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 2e1f10

    • fix(lazyload): never lazy-load the LCP image (#119)

      The lazy-load optimizer skipped only two hardcoded Luma class names
      (gallery-placeholder__image, product-image-photo), so on Argento/Breeze
      storefronts it added loading="lazy" to the product page main image -
      the LCP element. The image kept the theme's fetchpriority="high" while
      also being lazy, which delays the LCP request and fails Lighthouse's
      "Largest Contentful Paint image was lazily loaded" audit.

      Skip any image the page already marks as fetchpriority="high". That is
      a theme-agnostic LCP hint, so it also covers themes we do not know
      about. Add main-image to the class ignore list as a fallback for themes
      that mark the LCP element without setting fetchpriority.

      Found on minisport (Argento/Breeze): enabling the optimizer pipeline
      added loading="lazy" to the LCP product image and dropped the audit to
      a failure.

      Co-authored-by: Claude Opus 5 <noreply@anthropic.com> 221998

    • fix(lazyload): never lazy-load the LCP image

      The lazy-load optimizer skipped only two hardcoded Luma class names
      (gallery-placeholder__image, product-image-photo), so on Argento/Breeze
      storefronts it added loading="lazy" to the product page main image -
      the LCP element. The image kept the theme's fetchpriority="high" while
      also being lazy, which delays the LCP request and fails Lighthouse's
      "Largest Contentful Paint image was lazily loaded" audit.

      Skip any image the page already marks as fetchpriority="high". That is
      a theme-agnostic LCP hint, so it also covers themes we do not know
      about. Add main-image to the class ignore list as a fallback for themes
      that mark the LCP element without setting fetchpriority.

      Found on minisport (Argento/Breeze): enabling the optimizer pipeline
      added loading="lazy" to the LCP product image and dropped the audit to
      a failure.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> e975df

  • 1.19.0
    • Version 1.19.0

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 94fd39

    • fix(preload): cap font preloads and fix @font-face parsing (#117)

      Font preloads had no cap and no notion of whether a face blocks rendering, while the url() parsing dropped most real-world forms and could aim a preload at a nonexistent host. Measured on a live Argento product page, 138 KB of preloaded fonts plus an eager 219 KB footer PNG stretched a 68 KB LCP JPEG into a 3.1 s download; removing them took LCP from 3.83 s to 2.11 s on Slow 4G.

      - pagespeed/main/font_preload_limit (default 0, opt-in) caps the preloads per response
      - pagespeed/main/font_preload_ignore skips urls by substring, for icon fonts
      - candidates ranked by effective font-display: render-blocking first, then fallback, then swap; optional never preloaded
      - url() values unquoted, fragments dropped, queries kept, hrefs mirroring the protocol-relative form the delivered css uses
      - @font-face delimited and read on a comment-masked copy, with offset-based injection
      - collection armed one-shot per process() call, so it no longer depends on caller order

      Preload gained a Config constructor argument, so deploys need setup:di:compile.

      Fixes #117 9a26a2

    • fix(preload): make font preloading from stylesheets opt-in (#117)

      Default font_preload_limit goes from 2 to 0.

      Fixing the url parsing means stores whose @font-face urls are quoted or
      absolute — most of them — start getting font preloads they never had,
      because the old code silently dropped those urls. Shipping a default of 2
      would therefore add up to two High priority requests into the LCP window
      on upgrade, which is the exact regression this branch exists to remove:
      on the store that prompted it, 138 KB of preloaded fonts cost 1.7 s of
      LCP. With font-display:swap injected the fonts do not block rendering
      anyway, so the bandwidth buys little.

      The budget and the ranking stay; an admin who knows which weight renders
      above the fold raises it to 1 or 2.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> a6c93d

    • fix(preload): make font collection one-shot per armed call (#117)

      Sixth review pass pointed out that CssResolver calls process() without
      ever calling setResponse(), so merged stylesheets never contribute
      candidates — my claim that the ranking converges across every stylesheet
      was wrong. Only the critical style blocks feed it.

      Rather than widen collection, which would pull fonts out of every merged
      stylesheet in a change meant to cap them, the gate is now honest and
      deterministic. setResponse() arms exactly the next process() call, so a
      bare process() never pushes. Left armed, whether a merged stylesheet
      contributed depended on the order the two callers happened to run in for
      a given request, which made the preload set vary between requests.

      CriticalCss already chains setResponse() before each process() call, so
      production behaviour is unchanged. The multi-call tests now re-arm the
      same way, which also makes them mirror that caller.

      Also pins the two remaining shapes of the mask's documented limit — a }
      and a ; inside a quoted value — as misses rather than corruption.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 95ecf9

    • docs(preload): record the comment mask's limit and pin its failure mode (#117)

      The mask cannot tell a real comment from a comment opener inside a css
      string or data uri, so a fake opener can blank a whole @font-face. That
      limit is now stated at maskCssComments(), together with why a css
      tokenizer is not worth carrying to read one descriptor.

      The test pins the direction the failure takes: the face is skipped, so it
      gets no injection and contributes no preload candidate, and the
      stylesheet passes through unchanged. Skipping is acceptable; rewriting a
      stylesheet we could not read is not.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 48133a

    • fix(preload): delimit @font-face on a comment-masked copy (#117)

      Fifth review pass.

      A } inside a comment ended the face body early for the plain regex, so
      @font-face{/* } */src:url(a.woff2)} yielded the body "/* " — the url was
      never collected, and worse, the injection then ran
      str_replace('/* ', 'font-display:swap;/* ') across the whole stylesheet.
      The truncation predates this branch; the injection path made it harmful.

      Comments are now blanked to spaces of the same byte length before the
      faces are delimited, so a masked } cannot end a body while every offset
      still points into the original text. Injection splices at those offsets,
      from the end so earlier ones stay valid. That also fixes a second
      injection bug: two identical face bodies in one stylesheet had their
      swap injected by str_replace on the body text, which rewrote both and
      then did it again on the next iteration.

      Invalid duplicate descriptors no longer beat a valid one either. The
      browser drops invalid declarations at parse time, so
      font-display:optional;font-display:garbage stays optional; the last
      valid value wins and auto applies only when nothing valid was declared.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 7b87f1

    • fix(preload): validate the whole font-display value (#117)

      Fourth review pass. The value pattern captured the leading alphabetic
      token, so font-display: optional garbage read as optional and its
      preload was suppressed — but the whole value is invalid css and the
      browser falls back to auto, which blocks. Same for a descriptor written
      with !important, which is dropped entirely.

      The value is now taken up to the declaration terminator, trimmed, then
      checked against the five valid keywords, so anything invalid resolves to
      auto as the browser does.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 9ca057

    • fix(preload): read @font-face without its comments (#117)

      Third review pass. A css comment may sit wherever whitespace may, so
      font-family:A;/* keep */font-display:optional; hid the declaration from
      the boundary matcher. The face then got a swap injected in front of a
      declaration that stays effective, and was ranked as swap and preloaded
      even though the author marked it optional.

      Every read of a @font-face body now works on a comment-free copy, which
      fixes the same class of bug in url extraction too: a commented-out
      url(old.woff2) was being harvested as a preload candidate and could
      spend the budget on a file the browser never requests. The injection
      itself still targets the original text.

      While there: a face declaring font-display twice resolved to the first
      declaration, where the cascade takes the last.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d0f213

    • fix(preload): match font-display as a declaration, mirror scheme case (#117)

      Second review pass found two more holes.

      The injection guard tested for the substring "font-display" anywhere in
      the @font-face body, so a family named after the descriptor or a font
      path containing the word suppressed the swap injection and left the face
      blocking. Both the guard and the value read now require the descriptor
      at a declaration boundary — start of the body, or after a previous
      declaration.

      Scheme stripping accepted any spelling, but the css rewrite in process()
      is a case-sensitive str_replace: HTTPS://host/f.woff2 stays absolute in
      the delivered css while the preload became protocol-relative, which is a
      different url on an http storefront. The href now mirrors that replace
      exactly and keeps an unusual spelling absolute. The http(s) check also
      moved off filter_var, which accepts file:// happily.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> ba6b69

    • fix(preload): move the font budget to Preload and tighten parsing (#117)

      Review follow-up. Four defects in the first pass:

      Selection ran per process() call, but CriticalCss calls the improver
      once per critical <style> block and the css resolver plugin once per
      stylesheet. A swap face in the first block could spend the whole budget
      before a render-blocking face in a later one was seen, and the same href
      in two blocks consumed two slots. Candidates now accumulate in Preload
      and the ranked selection happens in getAssets(), once, when every
      stylesheet has been through the improver. Selection is pure, so
      repeated getAssets() calls agree.

      Deduplication kept the least urgent rank. Wrong: when one woff2 backs
      two families, the family that blocks still blocks, so the file is
      render-critical and the most urgent declaration has to win.

      The font-display regex was case-sensitive and matched only the
      alphabetic prefix of a value, so FONT-DISPLAY: OPTIONAL read as
      render-blocking while the invalid optional-invalid read as optional and
      was skipped. It is now case-insensitive, takes the whole token, and
      resolves anything outside the five valid values to auto.

      Preload hrefs forced https. process() rewrites absolute css urls to
      protocol-relative, so on an http storefront the preload pointed at a
      url the stylesheet never requests. Hrefs now mirror the delivered css:
      protocol-relative for absolute and protocol-relative sources,
      root-relative left alone, non-http schemes skipped.

      Also adds declare(strict_types=1) to the new test file.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 8b22be

    • fix(preload): cap font preloads and fix url() parsing (#117)

      Improver pushed a preload for every woff2 it could parse out of a
      stylesheet, with no cap and no check on whether the face blocks
      rendering. Chrome fetches preloaded fonts at High priority, so each one
      competes with the LCP image on the same connection and fetchpriority
      cannot outrank it. Measured on a live Argento product page: dropping
      138 KB of preloaded fonts (plus an eager 219 KB footer PNG) took LCP
      from 3.83 s to 2.11 s on Slow 4G.

      The url handling was broken in both directions. str_replace('//', '/')
      ran before the validity check, so absolute and quoted urls were
      silently dropped, while a root-relative url became https://<first path
      segment> — a preload aimed at a host named "static". The cache-busting
      query was stripped too, so a preload that did survive missed the css
      request and the font downloaded twice.

      - pagespeed/main/font_preload_limit (default 2, 0 disables) caps the
      preloads per response, shared across every stylesheet processed
      - pagespeed/main/font_preload_ignore skips urls by substring, for
      decorative icon fonts
      - candidates are ranked by effective font-display: render-blocking
      first, then fallback, then swap; optional is never preloaded
      - url() values are unquoted, fragments dropped, queries kept, and
      root-relative hrefs left alone; hrefs are deduped

      The budget lands together with the parsing fix on purpose: fixing the
      parsing alone would start emitting the preloads that were being dropped
      and ship the regression by default.

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c16e23

breezefront / theme-frontend-breeze-enterprise-apollo

12 hours ago success

breezefront / module-breeze-layout-builder

14 hours ago error
  • head
    • Fixed preview issue after previous commit ea8cea

    • Updating page selector links when store view switched 0d3d12

    • Added page visibility control and installer support for header/footer content 796f48

    • Fixed not working theme editor colors for overlay header 2660ce

    • Do not show overlay header toggles for native layout b000f5

    • WIP. Header layouts: added overlay mode support 8122c9

    • Correct page cleanup when BLB is closed 45b825

    • Improved header/footer preview 07c294

    • Header/Footer management with Header Layouts 7a0a82

  • 1.2.0
    • Version 1.2.0 24fff8

    • Added Contact Us page support d64e46

    • Config option for upcoming TaxVAT switcher in theme header 7f31bd

swissup / theme-frontend-argento-blank

15 hours ago success

swissup / hyva-highlight

16 hours ago success
  • head
    • fix: improve slider accessibility and hide empty title 62cff5

    • fix: update default heading tag and title class 39ca0c

  • 1.1.5
    • Version 1.1.5 ee2259

    • style: hide default pager from items template in highlight widget 09b318

    • perf: optimize image loading priority for highlight products e5f047

swissup / theme-frontend-argentohyva-stripes

18 hours ago success
  • head
    • style: Improve footer links #12 f97617

    • fix: improve accessibility & mobile logos #9 6a8485

  • 1.1.0
    • Version 1.1.0 adaf76

    • Improve spacing for text and headings #7 4d669d

    • fix: accessibility improve #54 793c44

    • Improve spacing for text and headings #7 3f5bc1

    • style: adjust EasyTabs layout and borders for expanded state e5db6c

    • style: implement container-based layout for more flexible product sliders cde87a

    • feat: implement brands block a37b3b

    • feat: implement contact map CMS block 5221b0

    • style: home page 933872

    • style: implement advanced product card hover effect and fix slider shadow clipping ca693c

    • style: use div wrappers instead of li for product carousel f17016

    • fix: correct mobile menu 18eb40

swissup / argento-420shop

19 hours ago success
  • v1.8.4
    • Version v1.8.4 eac18a

    • Merge pull request #27 from swissup/fix/duplicate-switcher-language-id

      Fix duplicate switcher-language ID on mobile header switcher a8be67

    • Fix duplicate switcher-language ID on mobile header switcher

      store_language_mobile rendered the same Swissup_Easyflags flags.phtml
      template as the desktop store_language switcher but never passed
      id_modifier, so both blocks emitted id="switcher-language" and stayed
      in the DOM together across breakpoints (only CSS toggled visibility).

      Pass id_modifier="mobile" for the mobile block, matching the pattern
      already used by navigation.language.switcher (id_modifier="menu").
      Desktop store_language keeps the unmodified id for backward compat. 2b04a8

    • Move easyslide mixin into the swiper bundle group

      The easyslide widget itself is bundled under the "swiper" group
      (declared by module-easy-slide's own breeze_default.xml), not
      "default" - a mixin in the wrong group never loads on pages that use
      the slider, since bundle groups only fetch when one of their own
      items' load trigger fires. 92057e

    • Merge pull request #26 from swissup/fix/easyslide-centered-slides-cls

      Fix CLS from EasySlide centeredSlides re-center on init 9855dc

    • Fix CLS from EasySlide centeredSlides re-center on init

      centeredSlides re-centers the active slide via a CSS transform once
      Swiper mounts, moving already-painted content and counting as a
      layout shift on every page load that uses this admin option.
      startRandomSlide already hides the slider (opacity: 0) until Swiper
      reports init - reuse that same reveal step for centeredSlides via a
      theme-level mixin, so the re-center happens before anything is shown. 5f9992

  • v1.8.3
    • Version v1.8.3 cf5afd

    • Merge pull request #25 from swissup/claude/busy-chebyshev-550a8e

      Fix remaining homepage CLS contributors on 420shop.nl 38a7a7

    • Fix hero slider CLS regression on autoplay transitions

      Live Lighthouse re-test on staging (after the earlier round of homepage
      CLS fixes) surfaced a new contributor: switching to the next autoplay
      slide caused a ~0.106 layout shift on its own, larger than everything
      fixed in the previous commit combined.

      Root cause: Swiper's autoHeight option resizes .swiper-wrapper to match
      the currently active slide's own box. slider.phtml computes a real
      per-image aspect-ratio for every slide, so any two slides with
      different native image ratios produce a different wrapper height -
      autoHeight then reflows the page on every transition between them.

      Fix, scoped to this theme's slider.phtml/// _slider.less override only:
      - Force autoHeight off in the JS config passed to the Swiper widget,
      regardless of what's stored in the admin slider config.
      - Only give the first (initially visible) slide its own precise inline
      aspect-ratio, to still reserve the correct box before it loads.
      Other slides fall back to the shared CSS aspect-ratio in
      _slider.less, so the wrapper's reserved height is fixed once and
      never changes as autoplay rotates through slides.

      Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> f90c23

    • Fix remaining homepage CLS contributors on 420shop.nl

      Follow-up to the hero-slider CLS fix (#24) — a fresh mobile Lighthouse
      run against staging still showed CLS 0.244, unrelated to the slider.
      Root causes traced and fixed:

      - .jumbotron.hero.block-news (the "Nieuw op 420shop" carousel) was
      excluded from the existing min-height reservation, and
      #hr_frontPage_box_1/_2 placeholders had no reservation at all —
      both left main#maincontent > div.columns to reflow as content
      loaded. Added both to the reserved-height selector groups
      (mobile + critical-CSS duplicate, kept in sync).

      - Hot-stuff promo images (bong/rolling-tray/grinder) have width/height
      HTML attrs but no matching CSS aspect-ratio, because their
      argento-grid/col-md-4/.image markup was copied from the unrelated
      Argento theme family and never got real grid/image CSS in this
      Breeze-family theme. Added a scoped aspect-ratio + object-fit rule
      for .block-hot-stuff .image img, mirroring the EasySlide fix
      pattern, plus flex on .argento-grid to remove the unclearfixed
      float ambiguity.

      - Same missing-aspect-ratio gap existed on .swiper-slide
      .product-image-photo (Bestsellers/NewList carousels); added
      aspect-ratio matching the theme's category_page_grid image config.

      - Child theme's own Barlow Semi Condensed font-family declarations
      used a plain sans-serif fallback instead of the metric-matched
      fallback faces already defined in the parent theme, causing
      avoidable reflow on font swap. Switched to the full fallback chain
      in the 6 places that had it wrong.

      Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> 278dfe

    • Merge pull request #24 from swissup/fix/hero-slide-cls

      Fix high CLS on hero slider (theme override of easyslide templates) 4ef475

    • Potential fix for pull request finding

      Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> be0239

    • Potential fix for pull request finding

      Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> 465ba1

    • Potential fix for pull request finding

      Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> efa291

    • Move slider CLS-fix CSS into custom/vendor/_slider.less

      Follows the existing _cart.less/_faq.less/etc convention instead of
      growing the already-700+-line _custom.less further.

      Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> c25841

    • Fix high CLS on hero slider (autoHeight collapses slide before Swiper init)

      Same root cause and fix as swissup/module-easy-slide#42: slide has no
      reserved height before JS runs, and Swiper's autoHeight only sets the
      real height after init/image load - visible jump, reported as
      0.36-0.47 CLS on the homepage.

      Overriding here (rather than waiting on the module release) so it
      ships to 420shop.nl now:

      - Swissup_EasySlide/templates/{slider,image}.phtml: theme override
      of the module templates, carrying the same fix (inline aspect-ratio
      per slide, eager+fetchpriority=high on the first slide)
      - web/css/_custom.less: matching aspect-ratio/object-fit rules next
      to the existing .easyslide-description customizations

      Once module-easy-slide#42 is merged and released, these template
      overrides can be removed (composer bump + delete the two files).

      Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> 2611d4

breezefront / module-breeze-content-builder

1 day ago success
  • head
    • feat(FeaturedProduct): introduce less variables 9d348a

    • refactor(FeaturedProductRenderer): replace image URL and alt text with pre-rendered HTML 623392

    • Fixed FAQ items readability on light theme, closes #44 091320

    • Fixed avoid using self-closing tag with non-void html element 9a3123

    • Added hide on pages checkbox list prop type ccf9e8

    • Updated dependent fields logic 278125

    • feat(accordion): enable product attribute as body source for FAQ items b26684

    • feat(accordion): add support for per-item icons in FAQ items b7607f

    • Correct page cleanup when BCB is closed a40061

    • Merge pull request #38 from breezefront/feat/108-newsletter-and-missing-components

      feat(components): inline newsletter layout (#108) 57dafb

    • fix(components): newsletter heading follows an inherited text colour (#108)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c56d7d

    • fix(a11y): real heading elements and decorative icons (#41)

      Newsletter rendered its section heading as <div class="...__heading h2">:
      invisible to assistive technology and absent from the document outline,
      even though it is the heading of a page band. It now emits a real h1-h6
      element chosen by a new heading_type prop (default h2), matching what
      text_block already does. Same fix for the featured_product name, which
      was also a styled div.

      Breeze styles the tag and the class off a single selector list -
      `h2, .h2 { ... }` in theme-frontend-breeze-blank/web/css/base/
      _typography.less - so under a Breeze theme, dropping the class for the
      tag is visually neutral. Under a non-Breeze theme .h2 is not styled at
      all, so those headings were rendering as plain body text and now pick up
      the theme's own h2 size: a fix rather than a regression, but not a no-op.
      Either way it changes the markup of existing pages, which is why this is
      split out of #38.

      text_block borrowed the heading text for its icon alt and wrapped inline
      SVG in a plain div, so a screen reader announced the heading twice, or
      three times when the SVG carried its own <title>. The icon is decorative
      in every design that uses it: alt="" on the image branch, aria-hidden on
      the SVG wrapper. A case that needs a real name should get an explicit
      icon_alt prop rather than reusing the heading.

      The admin H1 guard only fired on banner's headline_type, so raising a
      text_block - and now a newsletter - to H1 skipped the warning. It now
      watches heading_type too; _countH1 already counted both.

      Also corrects the selector these three comments cite: the rule is
      `h1, .h1` in the Breeze theme, not `:where(h1), .h1` in the module.

      product_grid was checked and already emits a real h2. Accordion item
      titles remain divs wrapping an <a> trigger; the heading+button pattern
      there is a larger change and stays open.

      Refs #41 53edaa

    • fix(components): collage layout for flat-colour CTA, decorative icon a11y (#108)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6e2743

    • feat(components): inline newsletter layout (#108)

      Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 85ed20

    • Changes for header/footer page: publish spinner, layout picker with images 25b2ae

  • 1.2.2
    • Version 1.2.2 214d13

    • Fixed ignored text color when heading used in content c92d33