@propeller-commerce/propeller-v2-react-ui 0.26.1 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,89 @@ once it reaches 1.0. Until then (the `0.x` line) the public API may change
8
8
  between minor versions; breaking changes are called out below and in
9
9
  [MIGRATION.md](./MIGRATION.md).
10
10
 
11
+ ## [0.28.0] - 2026-10-02
12
+
13
+ ### Added
14
+
15
+ - **`imgComponent` on `<PropellerDepsProvider>` — one setting routes every
16
+ image through the host’s image component.** Components rendered a bare
17
+ `<img src="https://media.…">`, so catalog images were fetched straight from
18
+ the media CDN. That CDN sends no `X-Robots-Tag` and serves no `robots.txt`,
19
+ so those images sat outside the storefront’s crawler directives and got none
20
+ of the host framework’s image optimisation. The existing `imageComponent`
21
+ slot could not close this: it takes a `product`/`cluster` and resolves the
22
+ URL itself, so it only fitted five surfaces, and the other nineteen image
23
+ sites had already resolved a URL string by render time. Set `imgComponent`
24
+ once on the provider and images across the package route through it,
25
+ including components added later. Optional — omitting it keeps the previous
26
+ markup. (PWP-1001)
27
+ - **`<PropellerImg>` and `useImgComponent()` are exported.** Hosts composing
28
+ their own cards get the same seam; `<PropellerImg>` is also on the `/pure`
29
+ entry for Server Components.
30
+ - **`OrderItemCard` accepts `imgComponent` as a prop.** It is `@rsc-safe` and
31
+ reads no context, so the provider cannot reach it — same direct-prop
32
+ convention as its existing `priceComponent` / `stockComponent`.
33
+
34
+ ### Changed
35
+
36
+ - **Nineteen image sites now render `<PropellerImg>`** across `ProductCard`,
37
+ `ClusterCard`, `ProductGallery`, `CartItem`, `OrderItemCard`, `SearchBar`,
38
+ `ProductBundles`, `MachineCard`, `AddToCart`, `QuickOrder`, `ItemsOverview`,
39
+ `FavoriteListItem`, `FavoriteListDetails`, `ClusterOptions`,
40
+ `ClusterConfigurator`, `CartBonusItems` and `DefaultProductImage`. Markup is
41
+ unchanged when no component is injected.
42
+ - **Carrier and payment-provider logos stay plain `<img>`.** Their domains sit
43
+ outside the host’s image allowlist, so routing them through a framework
44
+ image component would stop them loading. They are catalog-external and not
45
+ crawlable.
46
+ - **`npm run check:img` fails the build on a raw `<img>`.** The seam only holds
47
+ if new components use it, and a raw `<img>` opts a surface out silently.
48
+ Wired into `validate` and `prepublishOnly`.
49
+
50
+ ### Fixed
51
+
52
+ - **The "no image" placeholder was two different icons.** Cards, favourites and
53
+ `DefaultProductImage` drew one glyph; cart rows, the cart drawer, bundles, the
54
+ add-to-cart modal and the checkout overview drew another, at a heavier stroke
55
+ weight — so the same missing-image product looked like two different states
56
+ depending on which surface showed it. All of them now use the card icon at a
57
+ consistent stroke weight. The machine card keeps its own glyph, which is
58
+ deliberate.
59
+ - **The cart drawer’s image box did not centre its contents.** It overrides
60
+ `CartItem.Image`’s class, and the override dropped the flex centring, so the
61
+ placeholder sat top-left at its natural size instead of filling the box.
62
+ - **Placeholder icons were exposed to screen readers.** They carry no
63
+ information the row does not already state in text, so they now set
64
+ `aria-hidden`, matching what `DefaultProductImage` already did.
65
+ ---
66
+
67
+ ## [0.27.0] - 2026-09-28
68
+
69
+ ### Fixed
70
+
71
+ - **A quantity field could not be cleared and retyped.** The typed-input handler
72
+ only committed a value once it was at or above the minimum, so with a minimum
73
+ of 2, backspacing to empty or typing "1" was ignored and the previous number
74
+ stayed stuck in the box. The field now accepts any keystroke while editing and
75
+ resolves to a valid quantity on blur. (PWP-970)
76
+
77
+ - **Incrementing an off-grid quantity kept it off-grid.** `increment()` added the
78
+ step without first snapping to the `min + n*step` grid, so a quantity that was
79
+ already off it never returned. Both steppers now snap first. (PWP-970)
80
+
81
+ - **Quick order ignored the order step.** Its quantity input was hardcoded to
82
+ `step={1}` and nothing snapped, while bulk paste and spreadsheet upload are the
83
+ primary ordering route for a wholesale account. `QuickOrderMatch` now carries
84
+ `step` alongside `minQuantity`, and typed quantities snap to it. (PWP-970)
85
+
86
+ - **`OrderItemCard` accepted a misconfiguration in silence.** It ships from the
87
+ RSC-safe `/pure` entry and reads no context, so the host must supply `language`
88
+ and `configuration.urls` — but both are optional, nothing warned, and the
89
+ failure only showed as a wrong-language name or a link that dropped the locale
90
+ prefix two clicks later. A development-only warning now names each omission
91
+ once. `titleLinkable` defaults to true, so the link case applies unless a host
92
+ opts out. (PWP-972)
93
+
11
94
  ## [0.26.1] - 2026-09-28
12
95
 
13
96
  ### Fixed