@propeller-commerce/propeller-v2-react-ui 0.18.0 → 0.19.1
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 +102 -12
- package/dist/index.cjs +335 -217
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +103 -10
- package/dist/index.d.ts +103 -10
- package/dist/index.js +337 -219
- package/dist/index.js.map +1 -1
- package/dist/pure.cjs +18 -16
- package/dist/pure.cjs.map +1 -1
- package/dist/pure.d.cts +47 -1
- package/dist/pure.d.ts +47 -1
- package/dist/pure.js +19 -17
- package/dist/pure.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,98 @@ 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.19.1] - 2026-08-26
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **Order and quote lines whose product is gone from the catalog.** A product
|
|
16
|
+
that is hidden, withdrawn or deleted still appears on every order and quote it
|
|
17
|
+
was sold on, but the API returns no product record for it — `orderItem.product`
|
|
18
|
+
is simply absent. `OrderItemCard` already fell back to the order item's own
|
|
19
|
+
snapshot of the line for the name, sku, thumbnail and link, but not for the
|
|
20
|
+
price: an injected `priceComponent` was handed `product.price`, rendered blank
|
|
21
|
+
on `undefined`, and the line total silently disappeared from the row. Such a
|
|
22
|
+
line now falls through to the order item's `priceTotal`. Rows with a product
|
|
23
|
+
are unaffected — the slot is still used whenever there is a catalog price to
|
|
24
|
+
give it.
|
|
25
|
+
- **`OrderShipments` printed `-` for the SKU** of a shipment line whose product
|
|
26
|
+
is missing, having read `product.sku` with no fallback. It now reads the order
|
|
27
|
+
item's own `sku`, which is stored on the order and always there.
|
|
28
|
+
|
|
29
|
+
## [0.19.0] - 2026-08-26
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- **`useCart().addItems(items)`** — sequential bulk add that threads each add's
|
|
34
|
+
resolved cart id into the next. "Add this whole set to the basket" is a normal
|
|
35
|
+
requirement (kits, re-order, recipe packs) and there was no bulk call, so every
|
|
36
|
+
consumer wrote the loop themselves and hit the bug below.
|
|
37
|
+
- **`currency` on `ProductCardProps` / `ProductGridProps`**, resolved from
|
|
38
|
+
`<PropellerProvider>` like `ClusterCard` already did.
|
|
39
|
+
- **`className` on `CartSummaryProps`** and **`inputClassName` on
|
|
40
|
+
`SearchBarProps`**, merged over the defaults through `tailwind-merge`.
|
|
41
|
+
- **`configuration` on `OrderItemCardProps`** — supply the host's URL builders
|
|
42
|
+
and the item link is generated the way every other link on the storefront is.
|
|
43
|
+
- **Bonus items in the add-to-cart modal.** A promotion granting a free product
|
|
44
|
+
said nothing at the moment it fired; the shopper only found it by opening the
|
|
45
|
+
cart later, which is after it can influence them. Only the items *this* add
|
|
46
|
+
earned are shown. `bonusItemsLabels` overrides the block's labels.
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
- **`addItem` could not add more than one product per tick.** It resolved the
|
|
51
|
+
cart id from React state, which does not update until the next render, so a
|
|
52
|
+
loop sent the same stale id every iteration: the 2nd..nth add failed with
|
|
53
|
+
"No cart ID provided", or — with `createCart` — quietly started a NEW cart per
|
|
54
|
+
product so only the last one survived. Neither failure throws, so both looked
|
|
55
|
+
like the adds had simply vanished. The id now lives in a ref written the
|
|
56
|
+
moment a cart resolves.
|
|
57
|
+
- **Cart lines lost their images unless every add path passed `configuration`.**
|
|
58
|
+
The media arguments are optional and nothing warned; the mutation succeeded
|
|
59
|
+
and the returned items carried no `imageVariants` at all, so the shopper saw
|
|
60
|
+
empty tiles for products with perfectly good PIM images — two screens away
|
|
61
|
+
from the call site. The hook now defaults them; an explicit `configuration`
|
|
62
|
+
still wins.
|
|
63
|
+
- **A non-euro shop could not change the currency in the catalogue.**
|
|
64
|
+
`ProductGrid` resolved a currency and never forwarded it, so every card fell
|
|
65
|
+
through to the package's `€`. `GridFilters`' price inputs and the active
|
|
66
|
+
price-filter chip hardcoded the glyph too — the chip had no prop and no class,
|
|
67
|
+
so no userland fix existed.
|
|
68
|
+
- **Prices used Dutch separators in every language.** Number format now follows
|
|
69
|
+
the storefront language via core-ui's `localeForLanguage`, so an English shop
|
|
70
|
+
renders `£3.45` rather than `£ 3,45`. Components that format money take a
|
|
71
|
+
`language` prop, resolved from the provider where they already read infra.
|
|
72
|
+
- **Search autosuggest and order-item links dropped the locale prefix.** Both
|
|
73
|
+
built `/product/:id/:slug` from literals instead of the host's URL builders,
|
|
74
|
+
so on a prefixed storefront they sent the visitor to the default language.
|
|
75
|
+
They now use `configuration.urls` when supplied, with the literals as a bare-
|
|
76
|
+
mount fallback.
|
|
77
|
+
- **`ProductBulkPrices` ignored an explicit empty `title`.** The heading is
|
|
78
|
+
resolved with `getLabel`, which treats `''` as missing and substitutes its
|
|
79
|
+
English default — so the component's own "no title, no heading" branch was
|
|
80
|
+
dead code and the block rendered "Volume pricing" on a Dutch page.
|
|
81
|
+
- **The mini-cart labelled an excl-VAT figure "Total".** The cart page calls the
|
|
82
|
+
same number "Total excl. VAT" and reserves "Total" for the incl-VAT figure, so
|
|
83
|
+
the first number a shopper saw understated the price by one VAT amount. The
|
|
84
|
+
label now follows the same switch the figure does.
|
|
85
|
+
- **`CartSummary` painted a card background with no card.** No padding, radius
|
|
86
|
+
or shadow, directly above a properly styled `ActionCode` in the same column.
|
|
87
|
+
- **`SearchBar`'s input was styled for a dark header** (`bg-white/95
|
|
88
|
+
border-white/20`), rendering as a white-on-white ghost on a light one. It now
|
|
89
|
+
uses the themed surface and border tokens.
|
|
90
|
+
- **`ProductBundles`' add button read "In cart"**, a status rather than the
|
|
91
|
+
action it performs, where every other cart control in the package says
|
|
92
|
+
"Add to cart".
|
|
93
|
+
- **`OrderList` showed a bare line of text while loading**, collapsing the list
|
|
94
|
+
and snapping it back — most visible when switching language on the account
|
|
95
|
+
pages. It renders skeleton rows that hold the layout instead.
|
|
96
|
+
|
|
97
|
+
### Changed
|
|
98
|
+
|
|
99
|
+
- `AddToCartProps.onAddToCart` may return a promise, and `useCart` awaits the
|
|
100
|
+
override. Matches the widened slot contract in core-ui 0.7.0.
|
|
101
|
+
- Requires `@propeller-commerce/propeller-v2-core-ui` `^0.7.0`.
|
|
102
|
+
|
|
11
103
|
## [0.18.0] - 2026-08-20
|
|
12
104
|
|
|
13
105
|
### Added
|
|
@@ -42,7 +134,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
42
134
|
### Fixed
|
|
43
135
|
|
|
44
136
|
- **A host `className` override could not beat the component's own utility
|
|
45
|
-
|
|
137
|
+
.** Class lists were built by string-appending the override
|
|
46
138
|
after the package's defaults, which decides nothing — the cascade does, not
|
|
47
139
|
attribute order. `iconClassName="text-cocoa"` on `AccountIconAndMenu` (baked-in
|
|
48
140
|
`text-white`) produced an element carrying both and rendered white, while the
|
|
@@ -53,7 +145,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
53
145
|
untouched.
|
|
54
146
|
|
|
55
147
|
- **Anonymous catalog listings were scoped differently on the client than on
|
|
56
|
-
the server
|
|
148
|
+
the server.** Listing hooks derived `userId` only from a
|
|
57
149
|
logged-in user and omitted the key entirely for guests, while a server-side
|
|
58
150
|
seed scopes anonymous queries to the channel's `anonymousUserId`. The two
|
|
59
151
|
therefore asked different questions, and the client refetch quietly replaced
|
|
@@ -67,20 +159,19 @@ between minor versions; breaking changes are called out below and in
|
|
|
67
159
|
|
|
68
160
|
- **`configuration.anonymousUserId`** — the channel's guest account, resolved
|
|
69
161
|
server-side and handed to the package so client-side listings can scope to
|
|
70
|
-
it. Same route `baseCategoryId` takes
|
|
162
|
+
it. Same route `baseCategoryId` takes; no module guesses it.
|
|
71
163
|
|
|
72
164
|
## [0.16.0] - 2026-08-12
|
|
73
165
|
|
|
74
166
|
### Fixed
|
|
75
167
|
|
|
76
|
-
- **Localized names and slugs ignored the storefront language
|
|
77
|
-
PWP-940).** A localized array carries one entry per authored language in
|
|
168
|
+
- **Localized names and slugs ignored the storefront language.** A localized array carries one entry per authored language in
|
|
78
169
|
catalog order, so `names[0]` / `slugs[0]` is the catalog's DEFAULT language,
|
|
79
170
|
not the storefront's. Thirteen sites read index 0 unconditionally while
|
|
80
171
|
eleven others resolved by language correctly. Now all of them go through
|
|
81
172
|
`getLocalizedValue`, which prefers the active language and falls back to any
|
|
82
173
|
translation that has a value:
|
|
83
|
-
- `ClusterOptions` — option group and option product names
|
|
174
|
+
- `ClusterOptions` — option group and option product names
|
|
84
175
|
- `FavoriteListItem`, `FavoriteListDetails` — product and cluster names
|
|
85
176
|
- `ItemsOverview` — item, bundle-leader, bundle-item and child-option names
|
|
86
177
|
- `ProductBundles` — bundle item names
|
|
@@ -90,8 +181,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
90
181
|
|
|
91
182
|
The three slug sites are the ones that actually broke: they emitted
|
|
92
183
|
default-language URLs on every non-default locale.
|
|
93
|
-
- **`useCart` never adopted a cart id that arrived after mount (
|
|
94
|
-
PWP-937).** The id was seeded once with `useState(options.cartId || '')` and
|
|
184
|
+
- **`useCart` never adopted a cart id that arrived after mount.** The id was seeded once with `useState(options.cartId || '')` and
|
|
95
185
|
only reassigned from the hook's own cart-creation path, so a component that
|
|
96
186
|
mounted before the cart resolved held `''` permanently. `CartIconAndSidebar`
|
|
97
187
|
renders in the header on the first paint of every page, so its "Request
|
|
@@ -111,7 +201,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
111
201
|
`useInfraProps`, like the other catalog components. Passing it explicitly
|
|
112
202
|
still wins.
|
|
113
203
|
- The favorites list's add-product button default now reads "Add product to
|
|
114
|
-
favorite list" instead of "Add product directly to this wishlist"
|
|
204
|
+
favorite list" instead of "Add product directly to this wishlist".
|
|
115
205
|
Hosts that translate `FavoriteListDetails.addProductDirectly` should update
|
|
116
206
|
their own copy — "favorite list" is the agreed term, not "wishlist".
|
|
117
207
|
|
|
@@ -119,7 +209,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
119
209
|
|
|
120
210
|
### Fixed
|
|
121
211
|
|
|
122
|
-
- **Checkout step 3 opened with nothing selected on a fresh cart
|
|
212
|
+
- **Checkout step 3 opened with nothing selected on a fresh cart.**
|
|
123
213
|
`CartPaymethods` and `CartCarriers` only ever adopted a value the cart already
|
|
124
214
|
stored, so a cart that had never reached step 3 — every first order, and every
|
|
125
215
|
order after the cart is recreated — rendered both grids blank and refused to
|
|
@@ -158,7 +248,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
158
248
|
### Fixed
|
|
159
249
|
|
|
160
250
|
- **The product specifications table emptied out in a language the catalogue is
|
|
161
|
-
only partly translated into
|
|
251
|
+
only partly translated into**. A localized list carries only the
|
|
162
252
|
languages someone authored, so asking for one nobody wrote returns nothing —
|
|
163
253
|
it does not fall back. `ProductSpecifications` matched strictly on
|
|
164
254
|
`language === props.language`, which failed twice over: the label fell through
|
|
@@ -264,7 +354,7 @@ between minor versions; breaking changes are called out below and in
|
|
|
264
354
|
fall back to, and the row rendered with a blank label and an empty slug:
|
|
265
355
|
invisible and unclickable. Switching a bilingual storefront to a language with
|
|
266
356
|
partial translations collapsed the menu to whichever categories happened to be
|
|
267
|
-
translated
|
|
357
|
+
translated.
|
|
268
358
|
|
|
269
359
|
`names` and `slugs` are now fetched unfiltered — every translation — and
|
|
270
360
|
`mapCategory` picks the active language, falling back to whichever translation
|