@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 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
- props.showStock && defaultProductInventory ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardStock, {}) : null,
7587
- props.showPrice !== false && priceObj ? /* @__PURE__ */ jsxRuntime.jsx(ClusterCardPrice, {}) : null,
7588
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-cluster-card__cta flex-shrink-0 ml-auto", children: /* @__PURE__ */ jsxRuntime.jsx(ClusterCardViewClusterLink, {}) })
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.jsx("div", { className: "propeller-cluster-card__cta px-3 pb-3 sm:px-4 sm:pb-4", children: /* @__PURE__ */ jsxRuntime.jsx(ClusterCardViewClusterLink, {}) })
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 getLabel52(key) {
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: getLabel52("previous")
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
- getLabel52("page"),
8920
+ getLabel53("page"),
8897
8921
  "\xA0",
8898
8922
  currentPage,
8899
8923
  "\xA0",
8900
- getLabel52("of"),
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: getLabel52("next")
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: getLabel52("previous")
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: getLabel52("next")
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 getLabel52(key) {
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
- getLabel52("products")
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
- getLabel52("perPage")
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: getLabel52(field)
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: getLabel52("ASC") }),
10681
- /* @__PURE__ */ jsxRuntime.jsx("option", { value: propellerSdkV2.SortOrder.DESC, children: getLabel52("DESC") })
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" ? getLabel52("switchToList") : getLabel52("switchToGrid"),
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: getLabel52("clearAll")
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
- getLabel52("price"),
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
- props.showStock && !!product.inventory ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardStock, {}) : null,
13267
- props.showPrice !== false && !!product?.price ? /* @__PURE__ */ jsxRuntime.jsx(ProductCardPrice, { priceSize: "text-sm" }) : null,
13268
- props.allowAddToCart !== false ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-product-card__cta flex-shrink-0 ml-auto", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardAddToCart, {}) }) : null
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.allowAddToCart !== false ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "propeller-product-card__cta px-3 pb-3 sm:px-4 sm:pb-4", children: /* @__PURE__ */ jsxRuntime.jsx(ProductCardAddToCart, {}) }) : null
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;