@propeller-commerce/propeller-v2-react-ui 0.4.6 → 0.4.9
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 +60 -0
- package/dist/index.cjs +154 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +154 -36
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,66 @@ 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.4.9] - 2026-06-19
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **`GridFiltersPanel`** — a responsive wrapper around `GridFilters`. At `lg`
|
|
16
|
+
(1024px) and up it renders the filters as the inline sidebar; below `lg` it
|
|
17
|
+
collapses them behind a "Filters" button that opens a left slide-in drawer
|
|
18
|
+
(dimmed backdrop, close button, "Show results" to dismiss). A single
|
|
19
|
+
`GridFilters` instance backs both layouts — no duplicate fetch or state.
|
|
20
|
+
Replaces the host's `<aside><GridFilters/></aside>`. New label keys:
|
|
21
|
+
`filtersButton`, `applyFilters`, `closeFilters`. Optional `activeFilterCount`
|
|
22
|
+
shows a badge on the button.
|
|
23
|
+
|
|
24
|
+
## [0.4.8] - 2026-06-19
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- **Product card list view broke on desktop after the 0.4.7 mobile
|
|
29
|
+
redesign.** The mobile-first footer (`flex-col`, full-width `AddToCart`
|
|
30
|
+
controls) leaked into the desktop row layout because the `md:` overrides
|
|
31
|
+
lost the cross-Tailwind cascade. The desktop (≥768px) row intent is now
|
|
32
|
+
restated on the BEM hook classes in `styles.css` — footer back to a row,
|
|
33
|
+
`__footer-meta` to `display: contents`, and the `AddToCart` controls back to
|
|
34
|
+
a single nowrap row with a fixed-width quantity input.
|
|
35
|
+
- **Price clipped in the mobile grid card.** The stock + price meta row could
|
|
36
|
+
overflow a narrow (~190px) grid card. The row now wraps and the price is
|
|
37
|
+
allowed to shrink (`min-w-0`, right-aligned) instead of being cut off.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- **`ClusterCard` gets the same responsive footer as `ProductCard`.** Below
|
|
42
|
+
768px the list view uses a 2-row footer (stock/price, then full-width "View
|
|
43
|
+
cluster" button) and the grid view pairs stock/price in a wrapping meta row;
|
|
44
|
+
desktop (≥768px) is unchanged.
|
|
45
|
+
|
|
46
|
+
## [0.4.7] - 2026-06-19
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- **Mobile product card layout (below 768px).** On narrow viewports the
|
|
51
|
+
`ProductCard` action area no longer overflows the card edge — the quantity
|
|
52
|
+
stepper and "Add to cart" button were clipped. Below `md` (768px):
|
|
53
|
+
- **List view** (`columns === 1`): the footer becomes two rows — stock and
|
|
54
|
+
price share the first row (`justify-between`), and the full-width
|
|
55
|
+
`AddToCart` (stepper + button) sits on the second row.
|
|
56
|
+
- **Grid view** (`columns > 1`): the footer becomes three rows — stock ↔
|
|
57
|
+
price, then a full-width stepper, then a full-width button.
|
|
58
|
+
|
|
59
|
+
At `md` and up the previous desktop layout is unchanged. This flows through
|
|
60
|
+
every surface that renders `ProductCard` / `ProductGrid` (catalog, search,
|
|
61
|
+
product slider). Implemented purely with responsive Tailwind classes — no
|
|
62
|
+
JavaScript width detection.
|
|
63
|
+
|
|
64
|
+
### Added
|
|
65
|
+
|
|
66
|
+
- **Cart icon in the `AddToCart` button.** The submit button now renders a
|
|
67
|
+
built-in cart glyph (`.propeller-add-to-cart__icon`) before its label, drawn
|
|
68
|
+
with `currentColor` and `em` sizing so consumers can restyle its size,
|
|
69
|
+
colour and stroke via CSS.
|
|
70
|
+
|
|
11
71
|
## [0.4.6] - 2026-06-09
|
|
12
72
|
|
|
13
73
|
### Fixed
|
package/dist/index.cjs
CHANGED
|
@@ -4024,8 +4024,8 @@ function AddToCart(rawProps) {
|
|
|
4024
4024
|
className: `propeller-add-to-cart ${props.className || ""}`,
|
|
4025
4025
|
"data-loading": loading ? "true" : "false",
|
|
4026
4026
|
children: [
|
|
4027
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-add-to-cart__controls flex items-center gap-2 w-full", children: [
|
|
4028
|
-
props.allowIncrDecr !== false ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-add-to-cart__stepper flex items-center border border-input rounded-control bg-card h-10", children: [
|
|
4027
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-add-to-cart__controls flex flex-wrap items-center gap-2 w-full md:flex-nowrap", children: [
|
|
4028
|
+
props.allowIncrDecr !== false ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-add-to-cart__stepper flex items-center border border-input rounded-control bg-card h-10 w-full md:w-auto", children: [
|
|
4029
4029
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4030
4030
|
"button",
|
|
4031
4031
|
{
|
|
@@ -4044,7 +4044,7 @@ function AddToCart(rawProps) {
|
|
|
4044
4044
|
"input",
|
|
4045
4045
|
{
|
|
4046
4046
|
type: "number",
|
|
4047
|
-
className: "propeller-add-to-cart__quantity w-12 text-center text-sm bg-transparent border-none focus:ring-0 focus:outline-none h-full [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
|
4047
|
+
className: "propeller-add-to-cart__quantity flex-1 md:flex-none md:w-12 text-center text-sm bg-transparent border-none focus:ring-0 focus:outline-none h-full [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
|
4048
4048
|
min: getMinQuantity(props.product),
|
|
4049
4049
|
step: getStep(props.product),
|
|
4050
4050
|
value: quantity,
|
|
@@ -4077,7 +4077,7 @@ function AddToCart(rawProps) {
|
|
|
4077
4077
|
"input",
|
|
4078
4078
|
{
|
|
4079
4079
|
type: "number",
|
|
4080
|
-
className: "propeller-add-to-cart__quantity w-16 h-10 text-center text-sm border border-input rounded-control focus:ring-2 focus:ring-secondary focus:border-transparent [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
|
4080
|
+
className: "propeller-add-to-cart__quantity w-full md:w-16 h-10 text-center text-sm border border-input rounded-control focus:ring-2 focus:ring-secondary focus:border-transparent [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
|
4081
4081
|
min: getMinQuantity(props.product),
|
|
4082
4082
|
step: getStep(props.product),
|
|
4083
4083
|
value: quantity,
|
|
@@ -4095,10 +4095,28 @@ function AddToCart(rawProps) {
|
|
|
4095
4095
|
"button",
|
|
4096
4096
|
{
|
|
4097
4097
|
type: "button",
|
|
4098
|
-
className: "propeller-add-to-cart__submit flex-1 inline-flex justify-center items-center h-10 px-6 border border-transparent text-sm font-medium rounded-control text-secondary-foreground bg-secondary hover:bg-secondary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-secondary disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
4098
|
+
className: "propeller-add-to-cart__submit flex-1 basis-full md:basis-auto inline-flex justify-center items-center gap-2 h-10 px-6 border border-transparent text-sm font-medium rounded-control text-secondary-foreground bg-secondary hover:bg-secondary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-secondary disabled:opacity-50 disabled:cursor-not-allowed transition-colors",
|
|
4099
4099
|
onClick: () => handleAddToCart(),
|
|
4100
4100
|
disabled: loading,
|
|
4101
4101
|
children: [
|
|
4102
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4103
|
+
"svg",
|
|
4104
|
+
{
|
|
4105
|
+
className: "propeller-add-to-cart__icon w-[1.1em] h-[1.1em] flex-shrink-0",
|
|
4106
|
+
viewBox: "0 0 24 24",
|
|
4107
|
+
fill: "none",
|
|
4108
|
+
stroke: "currentColor",
|
|
4109
|
+
strokeWidth: 2,
|
|
4110
|
+
strokeLinecap: "round",
|
|
4111
|
+
strokeLinejoin: "round",
|
|
4112
|
+
"aria-hidden": "true",
|
|
4113
|
+
children: [
|
|
4114
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "21", r: "1" }),
|
|
4115
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "19", cy: "21", r: "1" }),
|
|
4116
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12" })
|
|
4117
|
+
]
|
|
4118
|
+
}
|
|
4119
|
+
),
|
|
4102
4120
|
loading ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: propellerV2CoreUi.getLabel(props.labels, "adding", "Adding...") }) : null,
|
|
4103
4121
|
!loading ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: propellerV2CoreUi.getLabel(props.labels, "add", "Add") }) : null
|
|
4104
4122
|
]
|
|
@@ -7582,22 +7600,28 @@ function ClusterCard(rawProps) {
|
|
|
7582
7600
|
props.showManufacturer && manufacturer ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardManufacturer, {}) : null,
|
|
7583
7601
|
props.showShortDescription && shortDescription ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardShortDescription, {}) : null
|
|
7584
7602
|
] }) }),
|
|
7585
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-cluster-card__footer w-full md:w-auto flex items-center gap-3 px-4 py-2 md:py-0 border-t md:border-t-0 border-border-subtle", children: [
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
|
|
7603
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-cluster-card__footer w-full md:w-auto flex flex-col gap-2 md:flex-row md:items-center md:gap-3 px-4 py-2 md:py-0 border-t md:border-t-0 border-border-subtle", children: [
|
|
7604
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-cluster-card__footer-meta flex items-center justify-between gap-3 md:contents", children: [
|
|
7605
|
+
props.showStock && defaultProductInventory ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardStock, {}) : null,
|
|
7606
|
+
props.showPrice !== false && priceObj ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardPrice, {}) : null
|
|
7607
|
+
] }),
|
|
7608
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-cluster-card__cta w-full md:w-auto md:flex-shrink-0 md:ml-auto", children: /* @__PURE__ */ jsxRuntime.jsx(ClusterCardViewClusterLink, {}) })
|
|
7589
7609
|
] })
|
|
7590
7610
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
7591
7611
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-cluster-card__body flex flex-1 flex-col gap-1.5 p-3 sm:gap-2 sm:p-4", children: [
|
|
7592
7612
|
props.showSku !== false && clusterSku ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardSku, {}) : null,
|
|
7593
7613
|
props.showName !== false ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardName, { linkable: true }) : null,
|
|
7594
|
-
props.showStock && defaultProductInventory ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardStock, {}) : null,
|
|
7614
|
+
props.showStock && defaultProductInventory ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsxRuntime.jsx(ClusterCardStock, {}) }) : null,
|
|
7595
7615
|
textLabelValues.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardTextLabels, {}) : null,
|
|
7596
7616
|
props.showManufacturer && manufacturer ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardManufacturer, {}) : null,
|
|
7597
7617
|
props.showShortDescription && shortDescription ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardShortDescription, {}) : null,
|
|
7598
|
-
props.showPrice !== false && priceObj ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardPrice, {}) : null
|
|
7618
|
+
props.showPrice !== false && priceObj ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto hidden md:block", children: /* @__PURE__ */ jsxRuntime.jsx(ClusterCardPrice, {}) }) : null
|
|
7599
7619
|
] }),
|
|
7600
|
-
/* @__PURE__ */ jsxRuntime.
|
|
7620
|
+
props.showStock && defaultProductInventory || props.showPrice !== false && priceObj ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-cluster-card__footer-meta flex flex-wrap items-center justify-between gap-x-2 gap-y-1 px-3 pt-1 sm:px-4 md:hidden", children: [
|
|
7621
|
+
props.showStock && defaultProductInventory ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardStock, {}) : null,
|
|
7622
|
+
props.showPrice !== false && priceObj ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardPrice, {}) : null
|
|
7623
|
+
] }) : null,
|
|
7624
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-cluster-card__cta px-3 pb-3 pt-2 sm:px-4 sm:pb-4", children: /* @__PURE__ */ jsxRuntime.jsx(ClusterCardViewClusterLink, {}) })
|
|
7601
7625
|
] })
|
|
7602
7626
|
]
|
|
7603
7627
|
}
|
|
@@ -8816,7 +8840,7 @@ var DEFAULT_LABELS = {
|
|
|
8816
8840
|
of: "of"
|
|
8817
8841
|
};
|
|
8818
8842
|
function GridPagination(props) {
|
|
8819
|
-
function
|
|
8843
|
+
function getLabel53(key) {
|
|
8820
8844
|
const labels = props.labels || {};
|
|
8821
8845
|
return labels[key] !== void 0 ? labels[key] : DEFAULT_LABELS[key] || key;
|
|
8822
8846
|
}
|
|
@@ -8889,15 +8913,15 @@ function GridPagination(props) {
|
|
|
8889
8913
|
className: "propeller-grid-pagination__btn propeller-grid-pagination__btn--prev inline-flex items-center rounded-control border border-input bg-card px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-surface-hover disabled:opacity-40 disabled:cursor-not-allowed",
|
|
8890
8914
|
disabled: currentPage === 1,
|
|
8891
8915
|
onClick: () => handlePageChange(currentPage - 1),
|
|
8892
|
-
children:
|
|
8916
|
+
children: getLabel53("previous")
|
|
8893
8917
|
}
|
|
8894
8918
|
),
|
|
8895
8919
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "propeller-grid-pagination__info px-2 text-sm font-medium text-muted-foreground", children: [
|
|
8896
|
-
|
|
8920
|
+
getLabel53("page"),
|
|
8897
8921
|
"\xA0",
|
|
8898
8922
|
currentPage,
|
|
8899
8923
|
"\xA0",
|
|
8900
|
-
|
|
8924
|
+
getLabel53("of"),
|
|
8901
8925
|
"\xA0",
|
|
8902
8926
|
totalPages
|
|
8903
8927
|
] }),
|
|
@@ -8908,7 +8932,7 @@ function GridPagination(props) {
|
|
|
8908
8932
|
className: "propeller-grid-pagination__btn propeller-grid-pagination__btn--next inline-flex items-center rounded-control border border-input bg-card px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-surface-hover disabled:opacity-40 disabled:cursor-not-allowed",
|
|
8909
8933
|
disabled: currentPage === totalPages,
|
|
8910
8934
|
onClick: () => handlePageChange(currentPage + 1),
|
|
8911
|
-
children:
|
|
8935
|
+
children: getLabel53("next")
|
|
8912
8936
|
}
|
|
8913
8937
|
)
|
|
8914
8938
|
] }) : null,
|
|
@@ -8920,7 +8944,7 @@ function GridPagination(props) {
|
|
|
8920
8944
|
className: "propeller-grid-pagination__btn propeller-grid-pagination__btn--prev inline-flex items-center rounded-control border border-input bg-card px-3 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-surface-hover disabled:opacity-40 disabled:cursor-not-allowed",
|
|
8921
8945
|
disabled: currentPage === 1,
|
|
8922
8946
|
onClick: () => handlePageChange(currentPage - 1),
|
|
8923
|
-
children:
|
|
8947
|
+
children: getLabel53("previous")
|
|
8924
8948
|
}
|
|
8925
8949
|
),
|
|
8926
8950
|
getFullPages().map((item, idx) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -8947,7 +8971,7 @@ function GridPagination(props) {
|
|
|
8947
8971
|
className: "propeller-grid-pagination__btn propeller-grid-pagination__btn--next inline-flex items-center rounded-control border border-input bg-card px-3 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-surface-hover disabled:opacity-40 disabled:cursor-not-allowed",
|
|
8948
8972
|
disabled: currentPage === totalPages,
|
|
8949
8973
|
onClick: () => handlePageChange(currentPage + 1),
|
|
8950
|
-
children:
|
|
8974
|
+
children: getLabel53("next")
|
|
8951
8975
|
}
|
|
8952
8976
|
)
|
|
8953
8977
|
] }) : null
|
|
@@ -10508,6 +10532,94 @@ function GridFilters(rawProps) {
|
|
|
10508
10532
|
);
|
|
10509
10533
|
}
|
|
10510
10534
|
var GridFilters_default = GridFilters;
|
|
10535
|
+
function GridFiltersPanel(props) {
|
|
10536
|
+
const { activeFilterCount, wrapperClassName, labels, ...gridFiltersProps } = props;
|
|
10537
|
+
const [open, setOpen] = React6.useState(false);
|
|
10538
|
+
React6.useEffect(() => {
|
|
10539
|
+
if (!open) return;
|
|
10540
|
+
const onKey = (e) => {
|
|
10541
|
+
if (e.key === "Escape") setOpen(false);
|
|
10542
|
+
};
|
|
10543
|
+
document.addEventListener("keydown", onKey);
|
|
10544
|
+
const prevOverflow = document.body.style.overflow;
|
|
10545
|
+
document.body.style.overflow = "hidden";
|
|
10546
|
+
return () => {
|
|
10547
|
+
document.removeEventListener("keydown", onKey);
|
|
10548
|
+
document.body.style.overflow = prevOverflow;
|
|
10549
|
+
};
|
|
10550
|
+
}, [open]);
|
|
10551
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `propeller-grid-filters-panel w-full lg:w-64 lg:flex-shrink-0 ${wrapperClassName || ""}`, children: [
|
|
10552
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10553
|
+
"button",
|
|
10554
|
+
{
|
|
10555
|
+
type: "button",
|
|
10556
|
+
className: "propeller-grid-filters-panel__trigger lg:hidden inline-flex items-center justify-center gap-2 h-10 px-4 rounded-control border border-border bg-card text-sm font-medium text-foreground shadow-sm hover:bg-surface-hover transition-colors",
|
|
10557
|
+
onClick: () => setOpen(true),
|
|
10558
|
+
"aria-haspopup": "dialog",
|
|
10559
|
+
"aria-expanded": open,
|
|
10560
|
+
children: [
|
|
10561
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10562
|
+
"svg",
|
|
10563
|
+
{
|
|
10564
|
+
className: "propeller-grid-filters-panel__trigger-icon w-[1.1em] h-[1.1em] flex-shrink-0",
|
|
10565
|
+
viewBox: "0 0 24 24",
|
|
10566
|
+
fill: "none",
|
|
10567
|
+
stroke: "currentColor",
|
|
10568
|
+
strokeWidth: 2,
|
|
10569
|
+
strokeLinecap: "round",
|
|
10570
|
+
strokeLinejoin: "round",
|
|
10571
|
+
"aria-hidden": "true",
|
|
10572
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M22 3H2l8 9.46V19l4 2v-8.54L22 3z" })
|
|
10573
|
+
}
|
|
10574
|
+
),
|
|
10575
|
+
propellerV2CoreUi.getLabel(labels, "filtersButton", "Filters"),
|
|
10576
|
+
activeFilterCount && activeFilterCount > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "propeller-grid-filters-panel__count inline-flex items-center justify-center min-w-[1.25rem] h-5 px-1 rounded-full bg-secondary text-secondary-foreground text-xs font-semibold", children: activeFilterCount }) : null
|
|
10577
|
+
]
|
|
10578
|
+
}
|
|
10579
|
+
),
|
|
10580
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10581
|
+
"div",
|
|
10582
|
+
{
|
|
10583
|
+
className: `propeller-grid-filters-panel__backdrop lg:hidden fixed inset-0 z-40 bg-foreground/40 transition-opacity ${open ? "opacity-100" : "pointer-events-none opacity-0"}`,
|
|
10584
|
+
onClick: () => setOpen(false),
|
|
10585
|
+
"aria-hidden": "true"
|
|
10586
|
+
}
|
|
10587
|
+
),
|
|
10588
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10589
|
+
"div",
|
|
10590
|
+
{
|
|
10591
|
+
className: `propeller-grid-filters-panel__panel fixed inset-y-0 left-0 z-50 w-80 max-w-[85vw] bg-card shadow-xl flex flex-col transition-transform duration-300 lg:static lg:z-auto lg:w-auto lg:max-w-none lg:translate-x-0 lg:bg-transparent lg:shadow-none lg:block ${open ? "translate-x-0" : "-translate-x-full"}`,
|
|
10592
|
+
role: "dialog",
|
|
10593
|
+
"aria-modal": "true",
|
|
10594
|
+
children: [
|
|
10595
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-grid-filters-panel__header lg:hidden flex items-center justify-between gap-3 px-4 h-14 border-b border-border-subtle flex-shrink-0", children: [
|
|
10596
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "propeller-grid-filters-panel__title text-base font-semibold text-foreground", children: propellerV2CoreUi.getLabel(labels, "filtersButton", "Filters") }),
|
|
10597
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10598
|
+
"button",
|
|
10599
|
+
{
|
|
10600
|
+
type: "button",
|
|
10601
|
+
className: "propeller-grid-filters-panel__close inline-flex items-center justify-center h-8 w-8 rounded-control text-foreground-subtle hover:text-foreground hover:bg-surface-hover transition-colors",
|
|
10602
|
+
onClick: () => setOpen(false),
|
|
10603
|
+
"aria-label": propellerV2CoreUi.getLabel(labels, "closeFilters", "Close"),
|
|
10604
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", className: "w-5 h-5", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 6 6 18M6 6l12 12" }) })
|
|
10605
|
+
}
|
|
10606
|
+
)
|
|
10607
|
+
] }),
|
|
10608
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-grid-filters-panel__body flex-1 overflow-y-auto px-4 py-4 lg:flex-none lg:overflow-visible lg:p-0", children: /* @__PURE__ */ jsxRuntime.jsx(GridFilters_default, { ...gridFiltersProps, labels }) }),
|
|
10609
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-grid-filters-panel__footer lg:hidden px-4 py-3 border-t border-border-subtle flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10610
|
+
"button",
|
|
10611
|
+
{
|
|
10612
|
+
type: "button",
|
|
10613
|
+
className: "propeller-grid-filters-panel__apply w-full inline-flex justify-center items-center h-10 px-6 rounded-control text-sm font-medium text-secondary-foreground bg-secondary hover:bg-secondary/90 transition-colors",
|
|
10614
|
+
onClick: () => setOpen(false),
|
|
10615
|
+
children: propellerV2CoreUi.getLabel(labels, "applyFilters", "Show results")
|
|
10616
|
+
}
|
|
10617
|
+
) })
|
|
10618
|
+
]
|
|
10619
|
+
}
|
|
10620
|
+
)
|
|
10621
|
+
] });
|
|
10622
|
+
}
|
|
10511
10623
|
function GridTitle(props) {
|
|
10512
10624
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `propeller-grid-title mb-8 ${props.className || ""}`, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-grid-title__row flex items-baseline gap-3 mb-3", children: [
|
|
10513
10625
|
props.headingLevel === "h2" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "propeller-grid-title__heading text-3xl sm:text-4xl font-bold tracking-tight", children: props.title }) : null,
|
|
@@ -10560,7 +10672,7 @@ function GridToolbar(rawProps) {
|
|
|
10560
10672
|
const [currentSortOrder, setCurrentSortOrder] = React6.useState(propellerSdkV2.SortOrder.DESC);
|
|
10561
10673
|
const [currentOffset, setCurrentOffset] = React6.useState(12);
|
|
10562
10674
|
const [currentViewMode, setCurrentViewMode] = React6.useState("grid");
|
|
10563
|
-
function
|
|
10675
|
+
function getLabel53(key) {
|
|
10564
10676
|
const labels = props.labels || {};
|
|
10565
10677
|
return labels[key] !== void 0 ? labels[key] : DEFAULT_LABELS2[key] || key;
|
|
10566
10678
|
}
|
|
@@ -10637,7 +10749,7 @@ function GridToolbar(rawProps) {
|
|
|
10637
10749
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-grid-toolbar__bar flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 mb-4", children: [
|
|
10638
10750
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-grid-toolbar__count text-sm text-muted-foreground font-medium", children: props.itemsFound > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
10639
10751
|
props.itemsFound,
|
|
10640
|
-
|
|
10752
|
+
getLabel53("products")
|
|
10641
10753
|
] }) : null }),
|
|
10642
10754
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-grid-toolbar__controls flex flex-wrap items-center gap-3", children: [
|
|
10643
10755
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10648,7 +10760,7 @@ function GridToolbar(rawProps) {
|
|
|
10648
10760
|
onChange: (e) => handleOffsetChange(parseInt(e.target.value)),
|
|
10649
10761
|
children: getOffsetOptions()?.map((n) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: n, children: [
|
|
10650
10762
|
n,
|
|
10651
|
-
|
|
10763
|
+
getLabel53("perPage")
|
|
10652
10764
|
] }, n))
|
|
10653
10765
|
}
|
|
10654
10766
|
),
|
|
@@ -10664,7 +10776,7 @@ function GridToolbar(rawProps) {
|
|
|
10664
10776
|
{
|
|
10665
10777
|
value: field,
|
|
10666
10778
|
disabled: field === "PRICE" && isPriceSortDisabled(),
|
|
10667
|
-
children:
|
|
10779
|
+
children: getLabel53(field)
|
|
10668
10780
|
},
|
|
10669
10781
|
field
|
|
10670
10782
|
))
|
|
@@ -10677,8 +10789,8 @@ function GridToolbar(rawProps) {
|
|
|
10677
10789
|
value: currentSortOrder,
|
|
10678
10790
|
onChange: (e) => handleSortOrderChange(e.target.value),
|
|
10679
10791
|
children: [
|
|
10680
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: propellerSdkV2.SortOrder.ASC, children:
|
|
10681
|
-
/* @__PURE__ */ jsxRuntime.jsx("option", { value: propellerSdkV2.SortOrder.DESC, children:
|
|
10792
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: propellerSdkV2.SortOrder.ASC, children: getLabel53("ASC") }),
|
|
10793
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: propellerSdkV2.SortOrder.DESC, children: getLabel53("DESC") })
|
|
10682
10794
|
]
|
|
10683
10795
|
}
|
|
10684
10796
|
),
|
|
@@ -10688,7 +10800,7 @@ function GridToolbar(rawProps) {
|
|
|
10688
10800
|
type: "button",
|
|
10689
10801
|
className: "propeller-grid-toolbar__view-toggle h-9 w-9 flex items-center justify-center rounded-control border border-input bg-transparent hover:bg-accent hover:text-accent-foreground transition-colors",
|
|
10690
10802
|
onClick: (event) => handleViewChange(),
|
|
10691
|
-
title: currentViewMode === "grid" ?
|
|
10803
|
+
title: currentViewMode === "grid" ? getLabel53("switchToList") : getLabel53("switchToGrid"),
|
|
10692
10804
|
children: [
|
|
10693
10805
|
currentViewMode === "grid" ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10694
10806
|
"svg",
|
|
@@ -10746,7 +10858,7 @@ function GridToolbar(rawProps) {
|
|
|
10746
10858
|
onClick: (event) => {
|
|
10747
10859
|
if (props.onClearFilters) props.onClearFilters();
|
|
10748
10860
|
},
|
|
10749
|
-
children:
|
|
10861
|
+
children: getLabel53("clearAll")
|
|
10750
10862
|
}
|
|
10751
10863
|
),
|
|
10752
10864
|
props.priceFilterMin !== void 0 || props.priceFilterMax !== void 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -10757,7 +10869,7 @@ function GridToolbar(rawProps) {
|
|
|
10757
10869
|
if (props.onPriceFilterRemove) props.onPriceFilterRemove();
|
|
10758
10870
|
},
|
|
10759
10871
|
children: [
|
|
10760
|
-
|
|
10872
|
+
getLabel53("price"),
|
|
10761
10873
|
": \u20AC",
|
|
10762
10874
|
props.priceFilterMin ?? 0,
|
|
10763
10875
|
" \u2013 \u20AC",
|
|
@@ -13262,22 +13374,28 @@ function ProductCardRoot(rawProps) {
|
|
|
13262
13374
|
props.showManufacturer && manufacturer ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardManufacturer, {}) : null,
|
|
13263
13375
|
props.showShortDescription && shortDescription ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardShortDescription, {}) : null
|
|
13264
13376
|
] }) }),
|
|
13265
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-product-card__footer w-full md:w-auto flex items-center gap-3 px-4 py-2 md:py-0 border-t md:border-t-0 border-border-subtle", children: [
|
|
13266
|
-
|
|
13267
|
-
|
|
13268
|
-
|
|
13377
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-product-card__footer w-full md:w-auto flex flex-col gap-2 md:flex-row md:items-center md:gap-3 px-4 py-2 md:py-0 border-t md:border-t-0 border-border-subtle", children: [
|
|
13378
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-product-card__footer-meta flex items-center justify-between gap-3 md:contents", children: [
|
|
13379
|
+
props.showStock && !!product.inventory ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardStock, {}) : null,
|
|
13380
|
+
props.showPrice !== false && !!product?.price ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardPrice, { priceSize: "text-sm" }) : null
|
|
13381
|
+
] }),
|
|
13382
|
+
props.allowAddToCart !== false ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-product-card__cta w-full md:w-auto md:flex-shrink-0 md:ml-auto", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardAddToCart, {}) }) : null
|
|
13269
13383
|
] })
|
|
13270
13384
|
] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
13271
13385
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-product-card__body flex flex-1 flex-col gap-1.5 p-3 sm:gap-2 sm:p-4", children: [
|
|
13272
13386
|
props.showSku !== false && sku ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardSku, {}) : null,
|
|
13273
13387
|
props.showName !== false ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardName, { linkable: true }) : null,
|
|
13274
13388
|
textLabelValues.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardTextLabels, {}) : null,
|
|
13275
|
-
props.showStock && !!product.inventory ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardStock, {}) : null,
|
|
13389
|
+
props.showStock && !!product.inventory ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hidden md:block", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardStock, {}) }) : null,
|
|
13276
13390
|
props.showManufacturer && manufacturer ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardManufacturer, {}) : null,
|
|
13277
13391
|
props.showShortDescription && shortDescription ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardShortDescription, {}) : null,
|
|
13278
|
-
props.showPrice !== false && !!product?.price ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-product-card__price mt-auto pt-1", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardPrice, { priceSize: "text-base sm:text-lg" }) }) : null
|
|
13392
|
+
props.showPrice !== false && !!product?.price ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-product-card__price mt-auto pt-1 hidden md:block", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardPrice, { priceSize: "text-base sm:text-lg" }) }) : null
|
|
13279
13393
|
] }),
|
|
13280
|
-
props.
|
|
13394
|
+
props.showStock && !!product.inventory || props.showPrice !== false && !!product?.price ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "propeller-product-card__footer-meta flex flex-wrap items-center justify-between gap-x-2 gap-y-1 px-3 pt-1 sm:px-4 md:hidden", children: [
|
|
13395
|
+
props.showStock && !!product.inventory ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardStock, {}) : null,
|
|
13396
|
+
props.showPrice !== false && !!product?.price ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardPrice, { priceSize: "text-base", className: "propeller-product-card__price min-w-0 text-right" }) : null
|
|
13397
|
+
] }) : null,
|
|
13398
|
+
props.allowAddToCart !== false ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-product-card__cta px-3 pb-3 pt-2 sm:px-4 sm:pb-4", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardAddToCart, {}) }) : null
|
|
13281
13399
|
] })
|
|
13282
13400
|
]
|
|
13283
13401
|
}
|
|
@@ -17269,6 +17387,7 @@ exports.FavoriteListItem = FavoriteListItem_default;
|
|
|
17269
17387
|
exports.FavoriteLists = FavoriteLists_default;
|
|
17270
17388
|
exports.ForgotPassword = ForgotPassword_default;
|
|
17271
17389
|
exports.GridFilters = GridFilters_default;
|
|
17390
|
+
exports.GridFiltersPanel = GridFiltersPanel;
|
|
17272
17391
|
exports.GridPagination = GridPagination_default;
|
|
17273
17392
|
exports.GridTitle = GridTitleWithProvider_default;
|
|
17274
17393
|
exports.GridToolbar = GridToolbar_default;
|