@propeller-commerce/propeller-v2-vue-ui 0.3.35 → 0.3.36

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,40 @@ 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.3.36] - 2026-07-21
12
+
13
+ ### Added
14
+
15
+ - **`SearchBar`: real anchor links for navigation.** New optional
16
+ `getResultHref(result)` and `getViewAllHref(term)` props. When provided, the
17
+ autosuggest result rows and the "View all results" CTA render as real
18
+ `<a href>` elements — middle-clickable, open-in-new-tab, hover-preview,
19
+ crawlable — while the existing `onResultClick`/`onViewAllClick` callbacks
20
+ still fire for SPA navigation (modified clicks fall through to the browser).
21
+ Omit the props to keep the previous behaviour.
22
+ - **`OrderList`: URL-persistable filters.** New optional `initialSearchForm`
23
+ (seed the filter form on mount, e.g. rehydrated from the URL) and
24
+ `onSearchApply(form)` (fires when the user applies/clears filters) props, so
25
+ the consuming page can keep the filter state in the URL — bookmarkable,
26
+ shareable, back-button-friendly. `useOrders` gained the matching
27
+ `initialSearchForm` option.
28
+
29
+ ### Changed
30
+
31
+ - **`AccountIconAndMenu`: account-menu items are now `<a href>` instead of
32
+ `<button>`** (both the sidebar and dropdown variants). They use each link's
33
+ existing `href`, so they are middle-clickable / new-tab-able / crawlable;
34
+ `onMenuItemClick` still handles plain-click SPA navigation.
35
+ - **`SearchBar`: the "View all results" fallback is now a `<button>`** (was a
36
+ non-focusable `<div>`), so it is keyboard-accessible even without the new
37
+ `getViewAllHref` prop.
38
+
39
+ ### Fixed
40
+
41
+ - **`OrderList`: clickable rows now show `cursor: pointer`.** When
42
+ `rowsClickable` is set, the row cursor matches its behaviour (was `auto`,
43
+ inconsistent with the favourites cards).
44
+
11
45
  ## [0.3.35] - 2026-07-20
12
46
 
13
47
  ### Fixed
@@ -1,4 +1,5 @@
1
1
  import { Contact, Customer, GraphQLClient } from '@propeller-commerce/propeller-sdk-v2';
2
+ import { OrderSearchForm } from '../composables/vue/useOrders';
2
3
  export interface OrderListProps {
3
4
  /** The authenticated user (Contact or Customer). Resolved from PropellerProvider when omitted. */
4
5
  user?: Contact | Customer | null;
@@ -16,6 +17,19 @@ export interface OrderListProps {
16
17
  enableSearch?: boolean;
17
18
  /** Fields enabled for searching (UI inputs) */
18
19
  searchFields?: string[];
20
+ /**
21
+ * Seed the filter form on mount — typically rehydrated from the URL query so
22
+ * a bookmarked/shared filtered view restores on reload. Pair with
23
+ * `onSearchApply` so the page can keep the URL in sync when filters change.
24
+ */
25
+ initialSearchForm?: OrderSearchForm;
26
+ /**
27
+ * Fires when the user applies or clears filters (the "Search"/"Clear"
28
+ * buttons). Receives the active filter form. Use it to persist the filters
29
+ * to the URL — the component owns no router, so the page decides how (and
30
+ * whether) to reflect them in `location`.
31
+ */
32
+ onSearchApply?: (form: OrderSearchForm) => void;
19
33
  /** Term fields configuration (backend) */
20
34
  termFields?: any[];
21
35
  /** Override company ID for order filtering (respects company switcher) */
@@ -47,6 +47,20 @@ export interface SearchBarProps {
47
47
  onResultClick?: (result: SearchBarResult) => void;
48
48
  /** Fires when "View all results" is clicked. Receives the search term. */
49
49
  onViewAllClick?: (term: string) => void;
50
+ /**
51
+ * Build the destination URL for a result item. When provided, each result
52
+ * renders as a real `<a href>` (middle-clickable, new-tab, crawlable) while
53
+ * `onResultClick` still fires for SPA navigation. Omit to keep the
54
+ * div-based fallback.
55
+ */
56
+ getResultHref?: (result: SearchBarResult) => string;
57
+ /**
58
+ * Build the destination URL for the "View all results" CTA. When provided,
59
+ * the CTA renders as a real `<a href>` (middle-clickable, new-tab, crawlable,
60
+ * keyboard-focusable) while `onViewAllClick` still fires for SPA navigation.
61
+ * Omit to keep the button fallback.
62
+ */
63
+ getViewAllHref?: (term: string) => string;
50
64
  /** Custom price formatting function */
51
65
  formatPrice?: (price: number) => string;
52
66
  /** Labels for the component */
@@ -18,6 +18,11 @@ export interface UseOrdersOptions {
18
18
  /** Default statuses to filter by */
19
19
  orderStatuses?: string[];
20
20
  termFields?: OrderSearchFields[];
21
+ /**
22
+ * Seed the search/filter form on mount — e.g. rehydrated from the URL query
23
+ * so a bookmarked/shared filtered view restores. The consumer owns the fetch.
24
+ */
25
+ initialSearchForm?: OrderSearchForm;
21
26
  configuration?: {
22
27
  imageSearchFiltersGrid?: MediaImageProductSearchInput;
23
28
  imageVariantFiltersSmall?: TransformationsInput;
package/dist/index.cjs CHANGED
@@ -1549,7 +1549,7 @@ function useOrders(options) {
1549
1549
  const orders = vue.ref([]);
1550
1550
  const loading = vue.ref(false);
1551
1551
  const error = vue.ref(null);
1552
- const searchForm = vue.ref({});
1552
+ const searchForm = vue.ref(options.initialSearchForm ?? {});
1553
1553
  const currentOrder = vue.ref(null);
1554
1554
  const orderLoading = vue.ref(false);
1555
1555
  const termFields = options.termFields ?? [
@@ -3406,7 +3406,7 @@ const _hoisted_4$J = { class: "propeller-account-menu__user-label text-xs text-m
3406
3406
  const _hoisted_5$I = { class: "propeller-account-menu__user-name font-medium text-foreground truncate" };
3407
3407
  const _hoisted_6$H = { class: "propeller-account-menu__nav py-2" };
3408
3408
  const _hoisted_7$H = { class: "propeller-account-menu__list space-y-0.5" };
3409
- const _hoisted_8$D = ["onClick", "data-active"];
3409
+ const _hoisted_8$D = ["href", "onClick", "data-active"];
3410
3410
  const _hoisted_9$B = { class: "propeller-account-menu__logout-wrapper px-4 py-3 border-t border-border" };
3411
3411
  const _hoisted_10$z = ["aria-label", "data-open"];
3412
3412
  const _hoisted_11$v = {
@@ -3429,7 +3429,7 @@ const _hoisted_15$s = { class: "propeller-account-menu__user-label text-xs text-
3429
3429
  const _hoisted_16$r = { class: "propeller-account-menu__user-name font-medium text-foreground truncate" };
3430
3430
  const _hoisted_17$q = { class: "propeller-account-menu__nav" };
3431
3431
  const _hoisted_18$o = { class: "propeller-account-menu__list space-y-0.5" };
3432
- const _hoisted_19$o = ["onClick"];
3432
+ const _hoisted_19$o = ["href", "onClick"];
3433
3433
  const _hoisted_20$m = { class: "propeller-account-menu__logout-wrapper mt-3 pt-3 border-t border-border" };
3434
3434
  const _hoisted_21$k = {
3435
3435
  key: 1,
@@ -3564,6 +3564,13 @@ const _sfc_main$T = /* @__PURE__ */ vue.defineComponent({
3564
3564
  menuOpen.value = false;
3565
3565
  if (props.onMenuItemClick) props.onMenuItemClick(href);
3566
3566
  }
3567
+ function handleMenuLinkClick(event, href) {
3568
+ if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
3569
+ return;
3570
+ }
3571
+ event.preventDefault();
3572
+ handleMenuItemClick(href);
3573
+ }
3567
3574
  function handleLogoutClick() {
3568
3575
  menuOpen.value = false;
3569
3576
  if (props.onLogoutClick) props.onLogoutClick();
@@ -3605,9 +3612,9 @@ const _sfc_main$T = /* @__PURE__ */ vue.defineComponent({
3605
3612
  key: link.href,
3606
3613
  class: "propeller-account-menu__item"
3607
3614
  }, [
3608
- vue.createElementVNode("button", {
3609
- type: "button",
3610
- onClick: async (event) => handleMenuItemClick(link.href),
3615
+ vue.createElementVNode("a", {
3616
+ href: link.href,
3617
+ onClick: (event) => handleMenuLinkClick(event, link.href),
3611
3618
  "data-active": isActiveLink(link.href) ? "true" : "false",
3612
3619
  class: vue.normalizeClass(`propeller-account-menu__link flex w-full items-center gap-3 px-4 py-2.5 text-sm font-medium transition-colors ${isActiveLink(link.href) ? "bg-secondary/5 text-secondary border-l-2 border-secondary" : "text-muted-foreground hover:bg-surface-hover hover:text-foreground"}`)
3613
3620
  }, vue.toDisplayString(link.label), 11, _hoisted_8$D)
@@ -3661,10 +3668,10 @@ const _sfc_main$T = /* @__PURE__ */ vue.defineComponent({
3661
3668
  key: link.href,
3662
3669
  class: "propeller-account-menu__item"
3663
3670
  }, [
3664
- vue.createElementVNode("button", {
3665
- type: "button",
3671
+ vue.createElementVNode("a", {
3672
+ href: link.href,
3666
3673
  class: "propeller-account-menu__link flex w-full items-center gap-3 px-3 py-2 text-sm font-medium rounded-[var(--radius-control)] text-muted-foreground hover:bg-surface-hover hover:text-foreground transition-colors",
3667
- onClick: async (event) => handleMenuItemClick(link.href)
3674
+ onClick: (event) => handleMenuLinkClick(event, link.href)
3668
3675
  }, vue.toDisplayString(link.label), 9, _hoisted_19$o)
3669
3676
  ]);
3670
3677
  }), 128))
@@ -13844,6 +13851,8 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
13844
13851
  columnConfig: {},
13845
13852
  enableSearch: { type: Boolean },
13846
13853
  searchFields: {},
13854
+ initialSearchForm: {},
13855
+ onSearchApply: { type: Function },
13847
13856
  termFields: {},
13848
13857
  companyId: {},
13849
13858
  orderStatus: {},
@@ -13888,7 +13897,8 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
13888
13897
  configuration: infra.configuration,
13889
13898
  channelIds: props.channelIds,
13890
13899
  onCartCreated: props.onCartCreated,
13891
- afterReorder: props.afterReorder
13900
+ afterReorder: props.afterReorder,
13901
+ initialSearchForm: props.initialSearchForm
13892
13902
  });
13893
13903
  const columns = vue.ref(
13894
13904
  props.columns || ["id", "date", "status", "total"]
@@ -14198,11 +14208,15 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
14198
14208
  class: "propeller-order-list__clear-btn inline-flex items-center px-4 py-2 border border-input text-sm font-medium rounded-[var(--radius-control)] shadow-sm text-muted-foreground bg-card hover:bg-surface-hover focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary",
14199
14209
  onClick: _cache[11] || (_cache[11] = async (event) => {
14200
14210
  vue.unref(resetSearch)();
14211
+ props.onSearchApply?.({});
14201
14212
  })
14202
14213
  }, vue.toDisplayString(getLabel("clearButton", "Clear")), 1),
14203
14214
  vue.createElementVNode("button", {
14204
14215
  class: "propeller-order-list__search-btn inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-[var(--radius-control)] shadow-sm text-primary-foreground bg-primary hover:bg-primary/80 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary",
14205
- onClick: _cache[12] || (_cache[12] = async (event) => vue.unref(fetchOrders)(1))
14216
+ onClick: _cache[12] || (_cache[12] = async (event) => {
14217
+ vue.unref(fetchOrders)(1);
14218
+ props.onSearchApply?.(vue.unref(searchForm));
14219
+ })
14206
14220
  }, vue.toDisplayString(getLabel("searchButton", "Search")), 1)
14207
14221
  ])
14208
14222
  ])) : vue.createCommentVNode("", true),
@@ -14225,7 +14239,7 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
14225
14239
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(orders), (order, index2) => {
14226
14240
  return vue.openBlock(), vue.createElementBlock("tr", {
14227
14241
  key: order.id,
14228
- class: "propeller-order-list__row hover:bg-surface-hover",
14242
+ class: vue.normalizeClass(`propeller-order-list__row hover:bg-surface-hover ${rowsClickable.value ? "cursor-pointer" : ""}`),
14229
14243
  "data-clickable": rowsClickable.value ? "true" : "false",
14230
14244
  onClick: async (event) => rowsClickable.value && __props.onOrderClick(order.id)
14231
14245
  }, [
@@ -14272,7 +14286,7 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
14272
14286
  ], 64)) : vue.createCommentVNode("", true)
14273
14287
  ], 10, _hoisted_36$6);
14274
14288
  }), 128))
14275
- ], 8, _hoisted_35$6);
14289
+ ], 10, _hoisted_35$6);
14276
14290
  }), 128))
14277
14291
  ])
14278
14292
  ])
@@ -19911,24 +19925,24 @@ const _hoisted_5$1 = {
19911
19925
  class: "propeller-search-bar__dropdown absolute top-full left-0 right-0 mt-2 bg-card rounded-[var(--radius-container)] shadow-xl border z-50 flex flex-col max-h-96"
19912
19926
  };
19913
19927
  const _hoisted_6$1 = { class: "propeller-search-bar__results flex-1 overflow-y-auto" };
19914
- const _hoisted_7$1 = ["onClick"];
19915
- const _hoisted_8$1 = {
19928
+ const _hoisted_7$1 = {
19916
19929
  key: 0,
19917
19930
  class: "propeller-search-bar__result-media relative w-16 h-16 flex-shrink-0"
19918
19931
  };
19919
- const _hoisted_9$1 = ["src", "alt"];
19920
- const _hoisted_10$1 = { class: "flex-1 min-w-0" };
19921
- const _hoisted_11$1 = { class: "propeller-search-bar__result-name font-semibold truncate" };
19922
- const _hoisted_12$1 = {
19932
+ const _hoisted_8$1 = ["src", "alt"];
19933
+ const _hoisted_9$1 = { class: "flex-1 min-w-0" };
19934
+ const _hoisted_10$1 = { class: "propeller-search-bar__result-name font-semibold truncate" };
19935
+ const _hoisted_11$1 = {
19923
19936
  key: 0,
19924
19937
  class: "propeller-search-bar__result-sku text-sm text-muted-foreground"
19925
19938
  };
19926
- const _hoisted_13$1 = {
19939
+ const _hoisted_12$1 = {
19927
19940
  key: 1,
19928
19941
  class: "propeller-search-bar__result-price text-sm font-semibold text-foreground flex-shrink-0 text-right"
19929
19942
  };
19930
- const _hoisted_14$1 = { class: "propeller-search-bar__result-price-value" };
19931
- const _hoisted_15$1 = { class: "propeller-search-bar__result-price-label block text-xs font-normal text-muted-foreground" };
19943
+ const _hoisted_13$1 = { class: "propeller-search-bar__result-price-value" };
19944
+ const _hoisted_14$1 = { class: "propeller-search-bar__result-price-label block text-xs font-normal text-muted-foreground" };
19945
+ const _hoisted_15$1 = ["href"];
19932
19946
  const _hoisted_16$1 = {
19933
19947
  key: 1,
19934
19948
  class: "propeller-search-bar__empty p-4 text-center text-muted-foreground"
@@ -19948,6 +19962,8 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
19948
19962
  onSubmit: { type: Function },
19949
19963
  onResultClick: { type: Function },
19950
19964
  onViewAllClick: { type: Function },
19965
+ getResultHref: { type: Function },
19966
+ getViewAllHref: { type: Function },
19951
19967
  formatPrice: { type: Function },
19952
19968
  labels: {},
19953
19969
  includeTax: { type: Boolean },
@@ -20101,6 +20117,21 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
20101
20117
  }
20102
20118
  showDropdown.value = false;
20103
20119
  }
20120
+ function isModifiedClick(event) {
20121
+ return event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
20122
+ }
20123
+ function handleResultAnchorClick(event, result) {
20124
+ if (props.getResultHref) {
20125
+ if (isModifiedClick(event)) return;
20126
+ event.preventDefault();
20127
+ }
20128
+ handleResultClick(result);
20129
+ }
20130
+ function handleViewAllAnchorClick(event) {
20131
+ if (isModifiedClick(event)) return;
20132
+ event.preventDefault();
20133
+ handleViewAllClick();
20134
+ }
20104
20135
  return (_ctx, _cache) => {
20105
20136
  return vue.openBlock(), vue.createElementBlock("div", {
20106
20137
  "data-search-bar": true,
@@ -20112,7 +20143,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
20112
20143
  onSubmit: _cache[1] || (_cache[1] = async (e) => handleSubmit(e))
20113
20144
  }, [
20114
20145
  vue.createElementVNode("div", _hoisted_2$1, [
20115
- _cache[4] || (_cache[4] = vue.createElementVNode("button", {
20146
+ _cache[3] || (_cache[3] = vue.createElementVNode("button", {
20116
20147
  type: "submit",
20117
20148
  class: "propeller-search-bar__submit absolute left-3 top-1/2 transform -translate-y-1/2 p-0 bg-transparent border-none cursor-pointer"
20118
20149
  }, [
@@ -20138,7 +20169,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
20138
20169
  value: searchTerm.value,
20139
20170
  onInput: _cache[0] || (_cache[0] = async (e) => handleInputChange(e.target.value))
20140
20171
  }, null, 40, _hoisted_3$1),
20141
- vue.unref(isLoading) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$1, [..._cache[3] || (_cache[3] = [
20172
+ vue.unref(isLoading) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$1, [..._cache[2] || (_cache[2] = [
20142
20173
  vue.createElementVNode("div", { class: "propeller-search-bar__spinner animate-spin rounded-full h-5 w-5 border-b-2 border-primary" }, null, -1)
20143
20174
  ])])) : vue.createCommentVNode("", true)
20144
20175
  ])
@@ -20147,34 +20178,46 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
20147
20178
  results.value.length > 0 ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
20148
20179
  vue.createElementVNode("div", _hoisted_6$1, [
20149
20180
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(results.value, (result, index2) => {
20150
- return vue.openBlock(), vue.createElementBlock("div", {
20181
+ return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(props.getResultHref ? "a" : "div"), {
20151
20182
  key: result.id + "-" + index2,
20183
+ href: props.getResultHref ? props.getResultHref(result) : void 0,
20152
20184
  class: "propeller-search-bar__result flex items-center gap-4 p-3 hover:bg-surface-hover cursor-pointer border-b border-border last:border-b-0",
20153
- onClick: async (event) => handleResultClick(result)
20154
- }, [
20155
- result.imageUrl || noImageUrl.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_8$1, [
20156
- vue.createElementVNode("img", {
20157
- class: "propeller-search-bar__result-image w-full h-full object-contain",
20158
- src: result.imageUrl || noImageUrl.value,
20159
- alt: result.name
20160
- }, null, 8, _hoisted_9$1)
20161
- ])) : vue.createCommentVNode("", true),
20162
- vue.createElementVNode("div", _hoisted_10$1, [
20163
- vue.createElementVNode("div", _hoisted_11$1, vue.toDisplayString(result.name), 1),
20164
- result.sku ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12$1, "SKU: " + vue.toDisplayString(result.sku), 1)) : vue.createCommentVNode("", true)
20185
+ onClick: (event) => handleResultAnchorClick(event, result)
20186
+ }, {
20187
+ default: vue.withCtx(() => [
20188
+ result.imageUrl || noImageUrl.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$1, [
20189
+ vue.createElementVNode("img", {
20190
+ class: "propeller-search-bar__result-image w-full h-full object-contain",
20191
+ src: result.imageUrl || noImageUrl.value,
20192
+ alt: result.name
20193
+ }, null, 8, _hoisted_8$1)
20194
+ ])) : vue.createCommentVNode("", true),
20195
+ vue.createElementVNode("div", _hoisted_9$1, [
20196
+ vue.createElementVNode("div", _hoisted_10$1, vue.toDisplayString(result.name), 1),
20197
+ result.sku ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_11$1, "SKU: " + vue.toDisplayString(result.sku), 1)) : vue.createCommentVNode("", true)
20198
+ ]),
20199
+ result.price !== void 0 && result.price !== null ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_12$1, [
20200
+ vue.createElementVNode("span", _hoisted_13$1, vue.toDisplayString(formatItemPrice(leadingPrice(result))), 1),
20201
+ vue.createElementVNode("span", _hoisted_14$1, vue.toDisplayString(priceTaxLabel()), 1)
20202
+ ])) : vue.createCommentVNode("", true)
20165
20203
  ]),
20166
- result.price !== void 0 && result.price !== null ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_13$1, [
20167
- vue.createElementVNode("span", _hoisted_14$1, vue.toDisplayString(formatItemPrice(leadingPrice(result))), 1),
20168
- vue.createElementVNode("span", _hoisted_15$1, vue.toDisplayString(priceTaxLabel()), 1)
20169
- ])) : vue.createCommentVNode("", true)
20170
- ], 8, _hoisted_7$1);
20204
+ _: 2
20205
+ }, 1032, ["href", "onClick"]);
20171
20206
  }), 128))
20172
20207
  ]),
20173
- itemsFound.value > results.value.length ? (vue.openBlock(), vue.createElementBlock("div", {
20174
- key: 0,
20175
- class: "propeller-search-bar__view-all flex-shrink-0 p-3 text-center text-primary hover:bg-primary/5 cursor-pointer font-semibold border-t border-border bg-card rounded-b-[var(--radius-container)]",
20176
- onClick: _cache[2] || (_cache[2] = async (event) => handleViewAllClick())
20177
- }, vue.toDisplayString(getLabel("viewAll", "View all results")) + " (" + vue.toDisplayString(itemsFound.value) + ") ", 1)) : vue.createCommentVNode("", true)
20208
+ itemsFound.value > results.value.length ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 0 }, [
20209
+ props.getViewAllHref ? (vue.openBlock(), vue.createElementBlock("a", {
20210
+ key: 0,
20211
+ href: props.getViewAllHref(searchTerm.value),
20212
+ class: "propeller-search-bar__view-all block flex-shrink-0 p-3 text-center text-primary hover:bg-primary/5 cursor-pointer font-semibold border-t border-border bg-card rounded-b-[var(--radius-container)]",
20213
+ onClick: handleViewAllAnchorClick
20214
+ }, vue.toDisplayString(getLabel("viewAll", "View all results")) + " (" + vue.toDisplayString(itemsFound.value) + ") ", 9, _hoisted_15$1)) : (vue.openBlock(), vue.createElementBlock("button", {
20215
+ key: 1,
20216
+ type: "button",
20217
+ class: "propeller-search-bar__view-all block w-full flex-shrink-0 p-3 text-center text-primary hover:bg-primary/5 cursor-pointer font-semibold border-t border-border bg-card rounded-b-[var(--radius-container)]",
20218
+ onClick: handleViewAllClick
20219
+ }, vue.toDisplayString(getLabel("viewAll", "View all results")) + " (" + vue.toDisplayString(itemsFound.value) + ") ", 1))
20220
+ ], 64)) : vue.createCommentVNode("", true)
20178
20221
  ], 64)) : vue.createCommentVNode("", true),
20179
20222
  results.value.length === 0 && searchTerm.value.length >= minLength.value && !vue.unref(isLoading) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_16$1, vue.toDisplayString(getLabel("noResults", "No products found for")) + ' "' + vue.toDisplayString(searchTerm.value) + '" ', 1)) : vue.createCommentVNode("", true)
20180
20223
  ])) : vue.createCommentVNode("", true)