Recent Activities
This page shows what are we working on.
-
1.4.1
-
head
-
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
-
Add EasySlide functionality for header panel with custom slides and styles e55b0b
-
-
head
-
fix(admin): keep AI actions off the field's scope row (#96)
.admin__field-control holds more than the input. Magento renders the error
label, the note, additional info and — at store-view scope only — the
admin__field-service block carrying "Use Default Value" into it as siblings of
the field. Making that container a flex row for the AI actions (#82) hoisted all
of them onto the field's line; the field, at flex-basis 0, then collapsed to a
sliver and its value read as empty. A merchant on 2.4.9 reported a store-scoped
Text Area attribute rendering blank with the scope checkbox displaced, and
rolled back to 1.2.0.
Give every child its own full-width row, then opt the field and the actions back
onto a shared first row. That keeps what #82 asked for and puts everything else
back where it sits with no actions at all.
Also ship the removal path the same report asked for: Setup\Uninstall drops the
module's tables and configuration so module:uninstall --remove-data leaves
nothing behind, and docs/UNINSTALL.md covers both turning the module off and
taking it out, including why a disabled module's own di.xml cannot be the source
of a preference the 2.4.9 compiler rejects. 9c5b39 -
feat(content-builder): let the AI place Magento widgets (#91) (#95)
* feat(content-builder): let the AI place Magento widgets (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(content-builder): describe only the enabled widgets, and offer no select we cannot list (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(content-builder): write the widget defaults the prompt promises, and report what a directive could not carry (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com> dd87e3 -
fix(content-builder): write the widget defaults the prompt promises, and report what a directive could not carry (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d652df -
fix(content-builder): describe only the enabled widgets, and offer no select we cannot list (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 60f747 -
feat(content-builder): let the AI place Magento widgets (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 5be597 -
Merge pull request #94 from breezefront/fix/vision-test-post-max-size
test(vision): let a test narrow the post_max_size setUp established ee92e8 -
fix(content-builder): describe only the enabled widgets, and offer no select we cannot list (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> bbfe20 -
test(vision): let a test narrow the post_max_size setUp established
The first willReturn matcher answered every invocation, so the second one
a test body added never fired and the cap test asserted against 64M.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> a5fccd -
feat(content-builder): let the AI place Magento widgets (#91)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3a19b3 -
Merge pull request #92 from breezefront/feat/85-image-extraction
feat(content-builder): take a generated page's images from the screenshot (#85) 8b2d79 -
fix(image): scan a trimmed edge exactly, and compare whole origins (#85)
Round four. Four of the five inline comments repeat findings already fixed in
the two commits before this one; these are what was left.
The trim sampled every Nth pixel along an edge, which is safe for a
photograph's flat margin and wrong for the one case the trim exists to serve: a
line icon's stroke is a pixel or two wide, can fall between samples, and the
edge then reads as empty and the outline is cut off the icon. A crop small
enough to be an icon is now scanned pixel by pixel; the sampled path stays for
anything larger.
The media base URL was compared to the web base URL by host alone, so media on
https://shop.test:8443/ looked local to a storefront on the default port and
was written as a root-relative path that resolves against the wrong server.
Scheme, host and port are compared together.
Prune read every matching content document into memory before picking the file
names out of them. It streams the rows instead — the names are forty
characters each, the documents are whole pages.
Both descriptions of the setting said that turning it off makes every image a
placeholder. Since the brief's own images are now left alone, that is no longer
what happens.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 47ab31 -
fix(content-builder): keep repaired icons in their band, and check GD first (#85)
Round three of the review.
Clamping a box to its band and then squaring it up put it back outside: an
icon against a section edge grew through the boundary and cropped pixels from
the section next door. It is moved back inside rather than cut down, because
cutting it down restores exactly the flattened box the repair exists to
rescue. A box the grid flattened onto a single line is also kept now when that
line falls inside the band — intersecting a zero-height box with anything
leaves nothing, so the band check was throwing away the very shape squaredUp()
was written for.
WebP is an optional part of GD and every crop ends in an imagewebp() call, so
a server built without it failed on the last step of each crop and kept every
placeholder without saying why. The setting answers false there, once, with
the reason in the log — and the prompt then does not spend tokens asking for
coordinates nothing can use.
The base screenshot rule lost the word "logo" when it was rescoped, which left
an extraction-disabled build without the instruction it had before this branch
existed. Restored.
Prune's per-run cap now counts what it removes rather than what it looks at.
Skipping a file costs a stat and an array lookup since the reference lookup
became one scan per table, so spending the budget on files that were never
going away only let them hide the collectable ones behind them, in the same
order, every night.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> f0884f -
fix(content-builder): keep the brief's images, and judge crops by the prop (#85)
Four from the second review round.
The stand-in host was matched with str_ends_with, so notdummyimage.com — a
domain belonging to somebody else — counted as ours and an icon supplied from
it would have had its switch closed. Matched as the host itself or a subdomain
of it now.
A crop's kind was decided by its size alone. The symbol thresholds are close to
"anything but a blank square", which is what a monochrome line icon needs, and
a wireframe's grey box with a cross through it is small enough to be handed
them — so the one thing the detector exists to reject sailed past it. Size
still decides how a region is cut; what the result is allowed to be is decided
by the prop, and only a prop named for an icon is judged as a symbol.
A background image the brief had already supplied was overwritten by the band
fallback whenever the model reported no region for it. Naming an image is a
decision and a region is a guess about where one is, so extraction now fills
only a prop that is empty or still holds the generated stand-in — every image
prop, not only the background that exposed it.
Prune asked "is this file referenced" once per file: three LIKE queries against
unindexed text columns, up to fifteen hundred full scans in one cron run on a
backlog. It reads the names back out of the content instead, once per table per
run, and not at all on a night with nothing old enough to remove.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 933f93 -
fix(content-builder): choose the screenshot, and the switch, deliberately (#85)
Two more from the review, both about a decision that was being made by
accident.
BuildPage hands over every image the conversation carries, and extraction cut
from the first of them. In the screenshot modal there is only ever one, but in
the editor's chat panel the reference the admin has just sent sits behind the
one they sent an hour ago — so the model described the new design and the crops
came out of the old one, silently. A region names no image and nothing here can
tell them apart, so the newest is cropped as the best available guess, and the
build says so when there was more than one to choose from.
The other is the icon case. Filling an image prop with a dummyimage.com box is
right where the prop always renders: the merchant sees a labelled grey
rectangle and knows to replace it. Behind a switch it is not, because the
component offers a better answer — a feature card without an icon, which is
what the switch's own default says. The stand-in now counts as unfilled there,
and the host it is recognised by is the constant the prompt is written from
rather than a second copy of the string.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 4c31e2 -
fix(content-builder): answer the review on extracted images (#85)
Six things the review found, none of which change what a good run produces:
- A background whose box was unusable fell back to its band and got its
picture, but the failed box had already added a warning telling the merchant
to set the image in the editor. The fallback is resolved first, and the
warning is left for the case where nothing was found.
- The symbol threshold was two colours, which is what a crisp monochrome icon
quantises to. Its own docblock says "no second colour worth the name" — one.
The WebP round trip usually adds enough noise to hide this, so it cost an
icon only where the screenshot drew one cleanly.
- Reusing a stored crop kept the old mtime, so a draft could adopt a file
already past the retention window and have it pruned before the page was
saved. A reused crop is touched.
- Prune spent its per-run budget on files it had already decided to keep,
which let a directory of recent crops hide the old ones behind them on every
run. Only files past the cutoff count against it.
- The upload limit bounds compressed bytes, not the bitmap they unpack into.
The measurement already happens before anything decodes, so an implausible
pixel area is refused there rather than in the allocation after it.
- The README promised a warning for every unfilled image prop. A prop the
design said nothing about passes silently, and that is the normal wireframe
case, so the sentence now says what the code does.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 6e71f8 -
test(image): read the WebP signature instead of silencing getimagesize (#85)
The Magento2 standard rejects the error suppression, and the assertion did
not need it: the question is what bytes were written, which the RIFF/WEBP
container signature answers on its own.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> c02438 -
feat(content-builder): take a generated page's images from the screenshot (#85)
A page built from a real design came back with a dummyimage.com box wherever
the design had a photo, and the admin replaced every one by hand. The merchant
already handed us the picture: the model is now asked, on the build call that
was happening anyway, where each image is, and the region is cropped out of the
screenshot locally and stored in media.
Two coordinate sources, because neither works alone. A per-prop box is the only
thing that can locate an icon and is loose about it; a band's vertical extent is
coarse but dependable. So a box is held to its own band before it is used — a
hero box spanning three bands was the common failure on a tall screenshot — a
box the 0..1000 grid flattened is squared up on its surviving axis, a small box
is padded and trimmed back onto its own content, and a background image falls
back to the band strip when no usable box came back.
A crop that turns out to hold a wireframe placeholder is skipped and the
dummyimage URL kept: a grey rectangle stored as the page's hero is worse than
the placeholder it replaced. Symbols are judged by their own thresholds, since a
line icon is monochrome by design. Generating an image for those regions is the
separate second half of #85.
Model/Image carries no Content Builder dependency — the per-band build loop of
#84 crops the same screenshot with the same services. 53eece
-
-
1.4.0
-
chore(release): 1.4.0
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 0bcf86 -
Merge pull request #89 from breezefront/claude/relaxed-shirley-d523bc
feat(backup): restore values overwritten by an AI run (#8) 1593f6 -
test(backup): cover the selection path and grid columns; honest run date (#8) 551936
-
Merge pull request #90 from breezefront/fix/composer-constraints
fix(composer): tighten dependency constraints (breezefront/breeze-ai#1) 976098 -
fix(openai): stop advising an upgrade PHP 8.1 cannot install
The TypeError branch told the user to update openai-php/client to ^0.19.
Only 0.10.x reaches it, and 0.10.x is also the only branch PHP 8.1 can
install: 0.11 and up require PHP 8.2. On the stores that actually hit
this, the advice was impossible to follow.
Name the PHP requirement instead of a client version.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> e3f75f -
fix(composer): tighten dependency constraints (breezefront/breeze-ai#1)
- php: "^7.4|^8.0|^8.1|^8.2" collapsed to ">=7.4 <9" anyway, since ^8.0
already covers 8.1-8.4. It also claimed support for PHP 7.4/8.0, which
cannot work: openai-php/client 0.10.x requires PHP ^8.1 and 0.19.x
requires ^8.2, so no version resolves below 8.1. Now "^8.1", matching
swissup/module-breeze.
- magento/framework: "*" guarded nothing. Dropped, as in module-breeze
and module-breeze-integrations.
swissup/module-core stays "*" — it is pulled in transitively and no
specific core version is required.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> b725ac -
fix(backup): declare restore isolation, strict capture, scope-true wording (#8) ad050c
-
fix(backup): re-check selections, capture and write together (#8) d54dbe
-
fix(backup): row action bypasses the mass-action filter, keep uncaptured video columns (#8)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 12ba05 -
fix(backup): keep restores retriable, recorded and correctly scoped (#8)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 0fb862 -
fix(backup): one capture per field, per-commit counts, gated mass action (#8)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 7ed888 -
feat(backup): restore values overwritten by an AI run (#8)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 3ec08b -
Merge pull request #88 from breezefront/claude/beautiful-liskov-50c01d
feat(usage): log tokens, cost and duration per AI call (#86) 6aba08 -
fix(usage): say when the ledger stops recording, distrust stored rates (#86) 784abb
-
fix(usage): escape separators so a value cannot forge a field (#86) 085672
-
fix(usage): price the model that answered, keep one line per call (#86) 4ac0c0
-
fix(usage): count reasoning tokens, keep sub-cent charges (#86) 7549fb
-
fix(usage): never infer a rate the ledger cannot stand behind (#86) a856a8
-
test(usage): cover the log wiring, not just the writer (#86) 0117c1
-
feat(usage): log tokens, cost and duration per AI call (#86) 128d10
-
-
head
-
1.2.0
-
head
-
Stop running composer from the backend
Running composer through the web server was never reliable, so the backend no
longer dispatches composer operations. Install, Update, Remove, Enable and
Disable now open a modal with the command to copy and run in a terminal, both
for a single row and for a massaction. Run Installer stays a real backend
operation - the one-click installer does not use composer.
Enable and Disable had no console equivalent, so marketplace:package:enable and
marketplace:package:disable were added (aliases marketplace:enable and
marketplace:disable).
Channel configuration and Tasks History are removed from the backend as well.
Channels are managed with the marketplace:channel:* and marketplace:auth:*
commands. With the settings form gone, ChannelsSave was the last job producer,
so the whole queue is removed: JobDispatcher, QueueDispatcher, Validator, the
Job entity, the activity widget, the queue crons and the job table.
The SettingsDataProvider modifiers are kept as empty stubs so that the channel
modules registering them in the pool keep compiling.
BREAKING: the swissup_marketplace_job table is dropped on setup:upgrade, and
HandlerInterface::validateBeforeDispatch() is removed - it had no callers left.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> d70a96 -
Forward command output strings to terminal c17318
-
Allow using dry-run option 2d329d
-
Reuse composer_cache from user's directory if possible 9cc10a
-
Command shortcuts 2cfa4c
-
-
1.11.0
-
3.2.0
-
3.1.0
-
1.54.0
-
3.0.1
-
Version 3.0.1 5a6bfd
-
CrossSells product inside minicart (#16) bebce9
-
WIP 32aaaf
-
WIP 0bee05
-
WIP 94daf5
-
WIP b2f96e
-
WIP d00d50
-
WIP f7edca
-
WIP 9684e3
-
WIP fa90be
-
WIP 9aad61
-
WIP d56788
-
WIP de83d9
-
WIP ec6ed0
-
WIP da5afc
-
WIP #7 aa798b
-
H1-H3 and block title font sizes https://github.com/swissup/argento-breeze/issues/3 9ac6aa
-
-
1.2.4
-
Version 1.2.4 e4c020
-
Merge pull request #5 from swissup/fix/arrow-room-lost-after-mount
fix(arrows): keep the arrow room after the switcher mounts 1a9480 -
fix(arrows): keep the arrow room after the switcher mounts
`.control:has(> .input-text.qty)` only matches the server-rendered markup.
`product.js` wraps the input into `.qty-wrapper` on init, after which the input
is no longer a direct child of `.control`, the rule stops matching and the 20px
reserved on each side for the arrows disappears — the arrows overflow the field
and the layout shifts once JS runs.
Match the input as a descendant instead, which holds both before and after the
wrap. Verified in the browser: `.control` padding went `0px 20px` -> `0px` the
moment the wrapper was inserted, and stays `0px 20px` with this selector.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> 082597
-
-
1.2.3
-
1.0.14
-
1.0.13
-
Version 1.0.13 99f37c
-
Merge pull request #29 from breezefront/feature/color-background-gradient
feat: COLOR_BACKGROUND field type with gradient support c2fd43 -
style: drop closing slash on void input tags (Magento Coding Standard)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> a84957 -
feat: add COLOR_BACKGROUND field type with gradient support
Implements the COLOR_BACKGROUND field type (issue #22) — a color field that
accepts either a solid color or a CSS gradient, analogous to Shopify's
`color_background` setting. Enables gradient backgrounds for elements exposed
as CSS variables (e.g. footer `--footer-bg`).
Backend:
- CssValueFormatter: formatColorBackground() passes gradients through with
comment-escaping, delegates solid values to the color pipeline; getComment
handles the new type.
- ValidationService: accepts gradient / palette-ref / solid-hex values.
- SectionFormatter + CssVariableBuilder: treat color_background like color for
format resolution and palette-var emission; gradients pass through untouched.
- schema.graphqls: COLOR_BACKGROUND enum value.
Frontend (Alpine/Tailwind theme editor, adminhtml):
- gradient-utils: pure parse/serialize/detect + stop manipulation
(paren-aware split so var()/rgb() stops survive), plus presets.
- color-background renderer: gradient swatch vs solid, reuses the color
renderer for solid; own compiled-template slot.
- color-background handler: two-tab popup (Solid Pickr + palette / Gradient
editor), preset swatches, draggable stops, position input, linear/radial,
angle slider, per-stop Pickr; commits raw CSS gradient.
- _gradient-picker.less styles; registered in field-renderer / field-handlers.
Tests: PHPUnit (formatter/validation/section/cssvar) + Jest
(gradient-utils, renderer, handler) — all green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> b5a3ef
-