@depict-ai/ui 4.10.13 → 4.10.14

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.
@@ -10,7 +10,7 @@ import $b8hua$babelruntimehelpersclassPrivateFieldGet from "@babel/runtime/helpe
10
10
  /*! Depict.ai search and product listing SDK */
11
11
  import { register_es_version } from "../../multi_import_deduplicator.mjs";
12
12
  register_es_version("ui", "ES10");
13
- const $8db9a15135765c11$export$83d89fbfd8236492 = "4.10.13";
13
+ const $8db9a15135765c11$export$83d89fbfd8236492 = "4.10.14";
14
14
  function $00a5b94f0c11efbb$export$d9f36cf74e24d595(media_query) {
15
15
  const signal = $b8hua$createSignal(false);
16
16
  $b8hua$onCleanup($b8hua$javascript_media_query(media_query, _ref => {
@@ -2210,8 +2210,10 @@ var $3e850b2f2cca761f$var$_tmpl$ = ["<button", ' type="button" class="', '"', ">
2210
2210
  function $3e850b2f2cca761f$export$ca21a16d65b3dd8(_ref) {
2211
2211
  let {
2212
2212
  show_extras_: [get_show_extras, set_show_extras],
2213
- i18n_: i18n_
2213
+ i18n_: i18n_,
2214
+ expanding_container_element_: expanding_container_element_
2214
2215
  } = _ref;
2216
+ let button;
2215
2217
  return $b8hua$ssr($3e850b2f2cca761f$var$_tmpl$, $b8hua$ssrHydrationKey(), "expand-filter ".concat(get_show_extras() ? "expanded" : ""), $b8hua$ssrAttribute("aria-expanded", $b8hua$escape(get_show_extras(), true), false), $b8hua$escape($b8hua$createComponent((0, $ff3225aef892a467$export$f21ab0717a89c77f), {})), get_show_extras() ? $b8hua$escape(i18n_.view_less_()) : $b8hua$escape(i18n_.view_more_()));
2216
2218
  }
2217
2219
  var $02b6641aa50ce528$var$_tmpl$ = ["<span", ' class="highlighted-part">', "</span>"],
@@ -2373,7 +2375,8 @@ function $133484ef10e4e954$export$dd948f91abc3a1c4(_ref) {
2373
2375
  $b8hua$createRenderEffect(() => {
2374
2376
  set_view_more_button_below_group_(togglable_rest() ? $b8hua$createComponent((0, $3e850b2f2cca761f$export$ca21a16d65b3dd8), {
2375
2377
  show_extras_: show_extras_signal,
2376
- i18n_: i18n_
2378
+ i18n_: i18n_,
2379
+ expanding_container_element_: expanding_container_els
2377
2380
  }) : []);
2378
2381
  });
2379
2382
  $b8hua$onCleanup(() => set_view_more_button_below_group_());
@@ -3090,7 +3093,8 @@ function $0ae614c5c7babb43$export$a32086fa6616eafd(_ref) {
3090
3093
  $b8hua$createRenderEffect(() => {
3091
3094
  set_view_more_button_below_group(some_top_level_are_hidden() ? $b8hua$createComponent((0, $3e850b2f2cca761f$export$ca21a16d65b3dd8), {
3092
3095
  show_extras_: show_extras,
3093
- i18n_: i18n_
3096
+ i18n_: i18n_,
3097
+ expanding_container_element_: expanding_container_els
3094
3098
  }) : []);
3095
3099
  });
3096
3100
  $b8hua$onCleanup(() => set_view_more_button_below_group());
@@ -3816,7 +3820,8 @@ function $2cb856c297c53e6c$export$82ed4b28ecb67608(_ref) {
3816
3820
  $b8hua$createRenderEffect(() => {
3817
3821
  set_view_more_button_below_group_(togglable_rest() ? $b8hua$createComponent((0, $3e850b2f2cca761f$export$ca21a16d65b3dd8), {
3818
3822
  show_extras_: show_extras_signal,
3819
- i18n_: i18n_
3823
+ i18n_: i18n_,
3824
+ expanding_container_element_: expanding_container_els
3820
3825
  }) : []);
3821
3826
  });
3822
3827
  $b8hua$onCleanup(() => set_view_more_button_below_group_());
@@ -4899,8 +4904,8 @@ var $bce10e104a1dd893$var$_tmpl$ = ["<svg", ' xmlns="http://www.w3.org/2000/svg"
4899
4904
  function $bce10e104a1dd893$export$cb808a3c41736d8e() {
4900
4905
  return $b8hua$ssr($bce10e104a1dd893$var$_tmpl$, $b8hua$ssrHydrationKey());
4901
4906
  }
4902
- var $7396052a1484264f$var$_tmpl$ = ["<div", ' class="filters"><div class="body">', "</div></div>"],
4903
- $7396052a1484264f$var$_tmpl$2 = ["<div", ' class="sorting"><div class="body">', "</div></div>"],
4907
+ var $7396052a1484264f$var$_tmpl$ = ["<section", ' class="filters"', '><div class="body">', "</div></section>"],
4908
+ $7396052a1484264f$var$_tmpl$2 = ["<section", ' class="sorting"', '><div class="body">', "</div></section>"],
4904
4909
  $7396052a1484264f$var$_tmpl$3 = ["<div", ' class="sort-and-filter-buttons"><div class="outer"><div class="inner"><!--$-->', "<!--/--><!--$-->", "<!--/--><!--$-->", "<!--/--></div></div></div>"],
4905
4910
  $7396052a1484264f$var$_tmpl$4 = ["<span", ' class="num-filters" style="', '">', "</span>"],
4906
4911
  $7396052a1484264f$var$_tmpl$5 = ["<div", ' class="open-filters-button-container" style="', '"><!--$-->', "<!--/--><button", ' class="', '" type="button"', ' style="', '"><!--$-->', "<!--/--><span>", "</span></button></div>"],
@@ -4977,6 +4982,27 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
4977
4982
  available_sortings_: available_sortings_,
4978
4983
  meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4979
4984
  };
4985
+ // Keyboard accessibility for the desktop panels (rendered after the product grid in the DOM): when the user
4986
+ // opens a panel we move focus into it, and restore focus to the toggle button on close. Intent is tracked with
4987
+ // a plain flag set in the buttons' click handlers - `filters_open`/`sorting_open` also change programmatically
4988
+ // (undo toast, history-state restore, SDK consumers), and those must not steal focus.
4989
+ let user_opened_panel = false;
4990
+ let filter_toggle_button;
4991
+ let sort_toggle_button;
4992
+ let current_panel;
4993
+ let current_panel_toggle_button;
4994
+ const focus_panel_when_in_dom = panel => $b8hua$catchify1(async () => {
4995
+ // Bounded wait: if the panel never lands in the DOM (e.g. it's superseded by a rapid re-render before
4996
+ // insertion), the timeout lets this promise resolve instead of keeping `panel` - and the observer
4997
+ // listener it registers - referenced forever.
4998
+ await (0, $b8hua$observer).wait_for_element(panel, 4000);
4999
+ if (panel.isConnected) panel.focus();
5000
+ })();
5001
+ const register_desktop_panel = (el, toggle_button, should_focus) => {
5002
+ current_panel = el;
5003
+ current_panel_toggle_button = toggle_button;
5004
+ if (should_focus) focus_panel_when_in_dom(el);
5005
+ };
4980
5006
  const make_open_filters_button = function () {
4981
5007
  let adhere_to_width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4982
5008
  let is_tabbable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@@ -4987,7 +5013,9 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
4987
5013
  search_sorting_open_: search_sorting_open_,
4988
5014
  number_of_rendered_selected_filters_items_: number_of_rendered_selected_filters_items_,
4989
5015
  filter_button_width_: adhere_to_width ? filter_button_width_ : undefined,
4990
- hide_button_: hide_filters
5016
+ hide_button_: hide_filters,
5017
+ on_user_open_: () => user_opened_panel = true,
5018
+ button_ref_: is_tabbable ? el => filter_toggle_button = el : undefined
4991
5019
  });
4992
5020
  };
4993
5021
  const make_open_sorting_button = function () {
@@ -5001,7 +5029,9 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
5001
5029
  search_sorting_open_: search_sorting_open_,
5002
5030
  available_sortings_: available_sortings_,
5003
5031
  sort_button_width_: adhere_to_width ? sort_button_width_ : undefined,
5004
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
5032
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
5033
+ on_user_open_: () => user_opened_panel = true,
5034
+ button_ref_: is_tabbable ? el => sort_toggle_button = el : undefined
5005
5035
  });
5006
5036
  };
5007
5037
  let open_modal_;
@@ -5021,10 +5051,35 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
5021
5051
  grid_is_in_original_state = true;
5022
5052
  }
5023
5053
  });
5054
+ // Restore focus to the relevant toggle button when a desktop panel is torn down while focus is still inside it.
5055
+ const restore_focus_to_toggle_on_close = () => {
5056
+ const button_to_restore = current_panel_toggle_button;
5057
+ const focus_was_in_panel = !!current_panel && current_panel.contains(document.activeElement);
5058
+ current_panel = undefined;
5059
+ current_panel_toggle_button = undefined;
5060
+ if (focus_was_in_panel) button_to_restore === null || button_to_restore === void 0 || button_to_restore.focus();
5061
+ };
5062
+ // `<section>` + `aria-label` so the panel announces itself ("Filters"/"Sort") when we move focus to it; the bare
5063
+ // tabindex=-1 container would otherwise give screen readers nothing to read on focus. A semantic <section> avoids
5064
+ // an ARIA role and the UA styling pitfalls of <fieldset>; the existing CSS targets the `.filters`/`.sorting` class.
5065
+ const FiltersPanel = should_focus => $b8hua$createComponent((0, $b8hua$Show), {
5066
+ get when() {
5067
+ return !hide_filters();
5068
+ },
5069
+ get children() {
5070
+ return $b8hua$ssr($7396052a1484264f$var$_tmpl$, $b8hua$ssrHydrationKey(), $b8hua$ssrAttribute("tabindex", -1, false) + $b8hua$ssrAttribute("aria-label", $b8hua$escape(i18n_.filters_(), true), false), $b8hua$escape($b8hua$createComponent((0, $f6b0500577e1b210$export$3f1a388cc0d8fed7), filter_options)));
5071
+ }
5072
+ });
5073
+ const SortingPanel = should_focus => $b8hua$ssr($7396052a1484264f$var$_tmpl$2, $b8hua$ssrHydrationKey(), $b8hua$ssrAttribute("tabindex", -1, false) + $b8hua$ssrAttribute("aria-label", $b8hua$escape(i18n_.sorting_text_(), true), false), $b8hua$escape($b8hua$createComponent((0, $cfdbd124dd09d713$export$1f1775a58da589b5), sorting_options)));
5024
5074
  $b8hua$createEffect(() => {
5075
+ // Consume the user-intent flag once per run, in every branch, so a stale flag can't leak into a later
5076
+ // resize-triggered re-render and steal focus.
5077
+ const should_focus_panel = user_opened_panel;
5078
+ user_opened_panel = false;
5025
5079
  if (!filters_open() && !sorting_open()) {
5026
5080
  var _close_modal_;
5027
5081
  (_close_modal_ = close_modal_) === null || _close_modal_ === void 0 || _close_modal_();
5082
+ restore_focus_to_toggle_on_close();
5028
5083
  set_extra_els_in_results_container_("");
5029
5084
  } else if (isSmall()()) {
5030
5085
  var _open_modal_;
@@ -5034,19 +5089,15 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
5034
5089
  set_sorting_open(false);
5035
5090
  return;
5036
5091
  }
5092
+ // The modal manages its own focus; just drop the desktop panel reference.
5093
+ current_panel = undefined;
5094
+ current_panel_toggle_button = undefined;
5037
5095
  (_open_modal_ = open_modal_) === null || _open_modal_ === void 0 || _open_modal_();
5038
5096
  set_extra_els_in_results_container_("");
5039
5097
  } else {
5040
5098
  var _close_modal_2;
5041
5099
  (_close_modal_2 = close_modal_) === null || _close_modal_2 === void 0 || _close_modal_2();
5042
- if (filters_open()) set_extra_els_in_results_container_(() => $b8hua$createComponent((0, $b8hua$Show), {
5043
- get when() {
5044
- return !hide_filters();
5045
- },
5046
- get children() {
5047
- return $b8hua$ssr($7396052a1484264f$var$_tmpl$, $b8hua$ssrHydrationKey(), $b8hua$escape($b8hua$createComponent((0, $f6b0500577e1b210$export$3f1a388cc0d8fed7), filter_options)));
5048
- }
5049
- }));else set_extra_els_in_results_container_($b8hua$ssr($7396052a1484264f$var$_tmpl$2, $b8hua$ssrHydrationKey(), $b8hua$escape($b8hua$createComponent((0, $cfdbd124dd09d713$export$1f1775a58da589b5), sorting_options))));
5100
+ if (filters_open()) set_extra_els_in_results_container_(() => FiltersPanel(should_focus_panel));else set_extra_els_in_results_container_(SortingPanel(should_focus_panel));
5050
5101
  }
5051
5102
  });
5052
5103
  $b8hua$catchify1(async () => {
@@ -5097,7 +5148,9 @@ function $7396052a1484264f$var$OpenFiltersButton(_ref3) {
5097
5148
  filter_button_width_: filter_button_width_,
5098
5149
  tabindex_: tabindex_,
5099
5150
  number_of_rendered_selected_filters_items_: [num_selected_filters],
5100
- hide_button_: hide_button_
5151
+ hide_button_: hide_button_,
5152
+ on_user_open_: on_user_open_,
5153
+ button_ref_: button_ref_
5101
5154
  } = _ref3;
5102
5155
  const filters_closed = $b8hua$createMemo(() => !search_filters_open_[0]());
5103
5156
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
@@ -5110,7 +5163,7 @@ function $7396052a1484264f$var$OpenFiltersButton(_ref3) {
5110
5163
  get children() {
5111
5164
  return $b8hua$ssr($7396052a1484264f$var$_tmpl$4, $b8hua$ssrHydrationKey(), $b8hua$ssrStyle(filters_closed() ? "" : "opacity:0"), $b8hua$escape(num_selected_filters()));
5112
5165
  }
5113
- })), $b8hua$ssrAttribute("tabindex", $b8hua$escape(tabindex_, true), false), "".concat(!filters_closed() ? "major" : "", " ").concat(filters_closed() ? "minor" : "").concat("filter toggle-button major-minor-transition" + ((0, $b8hua$isServer) ? " minor" : "")), $b8hua$ssrAttribute("aria-label", $b8hua$escape((filters_closed() ? i18n_.open_filters_ : i18n_.close_filters_)(), true), false), $b8hua$ssrStyle(filter_button_width_ !== null && filter_button_width_ !== void 0 && filter_button_width_() ? {
5166
+ })), $b8hua$ssrAttribute("tabindex", $b8hua$escape(tabindex_, true), false), "".concat(!filters_closed() ? "major" : "", " ").concat(filters_closed() ? "minor" : "").concat("filter toggle-button major-minor-transition" + ((0, $b8hua$isServer) ? " minor" : "")), $b8hua$ssrAttribute("aria-label", $b8hua$escape((filters_closed() ? i18n_.open_filters_ : i18n_.close_filters_)(), true), false) + $b8hua$ssrAttribute("aria-expanded", !filters_closed(), false), $b8hua$ssrStyle(filter_button_width_ !== null && filter_button_width_ !== void 0 && filter_button_width_() ? {
5114
5167
  width: filter_button_width_() + "px"
5115
5168
  } : {}), $b8hua$escape($b8hua$createComponent((0, $b8hua$Show), {
5116
5169
  get when() {
@@ -5134,11 +5187,13 @@ function $7396052a1484264f$var$OpenSortingButton(_ref4) {
5134
5187
  search_sorting_open_: search_sorting_open_,
5135
5188
  sort_button_width_: sort_button_width_,
5136
5189
  tabindex_: tabindex_,
5137
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
5190
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
5191
+ on_user_open_: on_user_open_,
5192
+ button_ref_: button_ref_
5138
5193
  } = _ref4;
5139
5194
  const sorting_closed = $b8hua$createMemo(() => !search_sorting_open_[0]());
5140
5195
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
5141
- return $b8hua$ssr($7396052a1484264f$var$_tmpl$6, $b8hua$ssrHydrationKey(), "".concat(!sorting_closed() ? "major" : "", " ").concat(sorting_closed() ? "minor" : "", " toggle-button for-sorting major-minor-transition"), $b8hua$ssrAttribute("tabindex", $b8hua$escape(tabindex_, true), false) + $b8hua$ssrAttribute("aria-label", $b8hua$escape((sorting_closed() ? i18n_.open_sorting_ : i18n_.close_sorting_)(), true), false), $b8hua$ssrStyle(sort_button_width_ !== null && sort_button_width_ !== void 0 && sort_button_width_() ? {
5196
+ return $b8hua$ssr($7396052a1484264f$var$_tmpl$6, $b8hua$ssrHydrationKey(), "".concat(!sorting_closed() ? "major" : "", " ").concat(sorting_closed() ? "minor" : "", " toggle-button for-sorting major-minor-transition"), $b8hua$ssrAttribute("tabindex", $b8hua$escape(tabindex_, true), false) + $b8hua$ssrAttribute("aria-label", $b8hua$escape((sorting_closed() ? i18n_.open_sorting_ : i18n_.close_sorting_)(), true), false) + $b8hua$ssrAttribute("aria-expanded", !sorting_closed(), false), $b8hua$ssrStyle(sort_button_width_ !== null && sort_button_width_ !== void 0 && sort_button_width_() ? {
5142
5197
  width: sort_button_width_() + "px"
5143
5198
  } : {}),
5144
5199
  // Show the title of the currently selected sorting when the sorting is closed, if there's currently a sorting selected
@@ -109,7 +109,7 @@ $parcel$export(module.exports, "BreadCrumbs", () => $1f4925833f07df29$export$5b7
109
109
  $parcel$export(module.exports, "QuickLinks", () => $1f4925833f07df29$export$de035477d6fef996);
110
110
  $parcel$export(module.exports, "CategoryPage", () => $14f289047713d67a$export$e2bf8ce7779e827e);
111
111
  /*! Depict.ai search and product listing SDK */
112
- const $b757f75811f3261f$export$83d89fbfd8236492 = "4.10.13";
112
+ const $b757f75811f3261f$export$83d89fbfd8236492 = "4.10.14";
113
113
  function $b54e6192d0caa293$export$d9f36cf74e24d595(media_query) {
114
114
  const signal = $5vyXB$solidjs.createSignal(false);
115
115
  $5vyXB$solidjs.onCleanup($5vyXB$depictaiutilishared.javascript_media_query(media_query, ({
@@ -2213,8 +2213,10 @@ function $cc43b6428000c4bf$export$f21ab0717a89c77f(props) {
2213
2213
  var $0fe1e7efdf4200d6$var$_tmpl$ = ["<button", ' type="button" class="', '"', "><!--$-->", "<!--/--><span>", "</span></button>"];
2214
2214
  function $0fe1e7efdf4200d6$export$ca21a16d65b3dd8({
2215
2215
  show_extras_: [get_show_extras, set_show_extras],
2216
- i18n_: i18n_
2216
+ i18n_: i18n_,
2217
+ expanding_container_element_: expanding_container_element_
2217
2218
  }) {
2219
+ let button;
2218
2220
  return $5vyXB$solidjsweb.ssr($0fe1e7efdf4200d6$var$_tmpl$, $5vyXB$solidjsweb.ssrHydrationKey(), `expand-filter ${get_show_extras() ? "expanded" : ""}`, $5vyXB$solidjsweb.ssrAttribute("aria-expanded", $5vyXB$solidjsweb.escape(get_show_extras(), true), false), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $cc43b6428000c4bf$export$f21ab0717a89c77f), {})), get_show_extras() ? $5vyXB$solidjsweb.escape(i18n_.view_less_()) : $5vyXB$solidjsweb.escape(i18n_.view_more_()));
2219
2221
  }
2220
2222
  var $d023ed916c84e75d$var$_tmpl$ = ["<span", ' class="highlighted-part">', "</span>"],
@@ -2367,7 +2369,8 @@ function $d94869c80e337a3d$export$dd948f91abc3a1c4({
2367
2369
  $5vyXB$solidjs.createRenderEffect(() => {
2368
2370
  set_view_more_button_below_group_(togglable_rest() ? $5vyXB$solidjsweb.createComponent((0, $0fe1e7efdf4200d6$export$ca21a16d65b3dd8), {
2369
2371
  show_extras_: show_extras_signal,
2370
- i18n_: i18n_
2372
+ i18n_: i18n_,
2373
+ expanding_container_element_: expanding_container_els
2371
2374
  }) : []);
2372
2375
  });
2373
2376
  $5vyXB$solidjs.onCleanup(() => set_view_more_button_below_group_());
@@ -3044,7 +3047,8 @@ function $3bdc00a1353c1150$export$a32086fa6616eafd({
3044
3047
  $5vyXB$solidjs.createRenderEffect(() => {
3045
3048
  set_view_more_button_below_group(some_top_level_are_hidden() ? $5vyXB$solidjsweb.createComponent((0, $0fe1e7efdf4200d6$export$ca21a16d65b3dd8), {
3046
3049
  show_extras_: show_extras,
3047
- i18n_: i18n_
3050
+ i18n_: i18n_,
3051
+ expanding_container_element_: expanding_container_els
3048
3052
  }) : []);
3049
3053
  });
3050
3054
  $5vyXB$solidjs.onCleanup(() => set_view_more_button_below_group());
@@ -3709,7 +3713,8 @@ function $b51a2b8b9355e66c$export$82ed4b28ecb67608({
3709
3713
  $5vyXB$solidjs.createRenderEffect(() => {
3710
3714
  set_view_more_button_below_group_(togglable_rest() ? $5vyXB$solidjsweb.createComponent((0, $0fe1e7efdf4200d6$export$ca21a16d65b3dd8), {
3711
3715
  show_extras_: show_extras_signal,
3712
- i18n_: i18n_
3716
+ i18n_: i18n_,
3717
+ expanding_container_element_: expanding_container_els
3713
3718
  }) : []);
3714
3719
  });
3715
3720
  $5vyXB$solidjs.onCleanup(() => set_view_more_button_below_group_());
@@ -4708,8 +4713,8 @@ var $f49857214f7675b1$var$_tmpl$ = ["<svg", ' xmlns="http://www.w3.org/2000/svg"
4708
4713
  function $f49857214f7675b1$export$cb808a3c41736d8e() {
4709
4714
  return $5vyXB$solidjsweb.ssr($f49857214f7675b1$var$_tmpl$, $5vyXB$solidjsweb.ssrHydrationKey());
4710
4715
  }
4711
- var $f8f64d05c525825b$var$_tmpl$ = ["<div", ' class="filters"><div class="body">', "</div></div>"],
4712
- $f8f64d05c525825b$var$_tmpl$2 = ["<div", ' class="sorting"><div class="body">', "</div></div>"],
4716
+ var $f8f64d05c525825b$var$_tmpl$ = ["<section", ' class="filters"', '><div class="body">', "</div></section>"],
4717
+ $f8f64d05c525825b$var$_tmpl$2 = ["<section", ' class="sorting"', '><div class="body">', "</div></section>"],
4713
4718
  $f8f64d05c525825b$var$_tmpl$3 = ["<div", ' class="sort-and-filter-buttons"><div class="outer"><div class="inner"><!--$-->', "<!--/--><!--$-->", "<!--/--><!--$-->", "<!--/--></div></div></div>"],
4714
4719
  $f8f64d05c525825b$var$_tmpl$4 = ["<span", ' class="num-filters" style="', '">', "</span>"],
4715
4720
  $f8f64d05c525825b$var$_tmpl$5 = ["<div", ' class="open-filters-button-container" style="', '"><!--$-->', "<!--/--><button", ' class="', '" type="button"', ' style="', '"><!--$-->', "<!--/--><span>", "</span></button></div>"],
@@ -4778,6 +4783,27 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4778
4783
  available_sortings_: available_sortings_,
4779
4784
  meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4780
4785
  };
4786
+ // Keyboard accessibility for the desktop panels (rendered after the product grid in the DOM): when the user
4787
+ // opens a panel we move focus into it, and restore focus to the toggle button on close. Intent is tracked with
4788
+ // a plain flag set in the buttons' click handlers - `filters_open`/`sorting_open` also change programmatically
4789
+ // (undo toast, history-state restore, SDK consumers), and those must not steal focus.
4790
+ let user_opened_panel = false;
4791
+ let filter_toggle_button;
4792
+ let sort_toggle_button;
4793
+ let current_panel;
4794
+ let current_panel_toggle_button;
4795
+ const focus_panel_when_in_dom = panel => $5vyXB$depictaiutilishared.catchify(async () => {
4796
+ // Bounded wait: if the panel never lands in the DOM (e.g. it's superseded by a rapid re-render before
4797
+ // insertion), the timeout lets this promise resolve instead of keeping `panel` - and the observer
4798
+ // listener it registers - referenced forever.
4799
+ await (0, $5vyXB$depictaiutilishared.observer).wait_for_element(panel, 4000);
4800
+ if (panel.isConnected) panel.focus();
4801
+ })();
4802
+ const register_desktop_panel = (el, toggle_button, should_focus) => {
4803
+ current_panel = el;
4804
+ current_panel_toggle_button = toggle_button;
4805
+ if (should_focus) focus_panel_when_in_dom(el);
4806
+ };
4781
4807
  const make_open_filters_button = (adhere_to_width = false, is_tabbable = false) => $5vyXB$solidjsweb.createComponent($f8f64d05c525825b$var$OpenFiltersButton, {
4782
4808
  tabindex_: is_tabbable ? 0 : -1,
4783
4809
  i18n_: i18n_,
@@ -4785,7 +4811,9 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4785
4811
  search_sorting_open_: search_sorting_open_,
4786
4812
  number_of_rendered_selected_filters_items_: number_of_rendered_selected_filters_items_,
4787
4813
  filter_button_width_: adhere_to_width ? filter_button_width_ : undefined,
4788
- hide_button_: hide_filters
4814
+ hide_button_: hide_filters,
4815
+ on_user_open_: () => user_opened_panel = true,
4816
+ button_ref_: is_tabbable ? el => filter_toggle_button = el : undefined
4789
4817
  });
4790
4818
  const make_open_sorting_button = (adhere_to_width = false, is_tabbable = false) => $5vyXB$solidjsweb.createComponent($f8f64d05c525825b$var$OpenSortingButton, {
4791
4819
  tabindex_: is_tabbable ? 0 : -1,
@@ -4795,7 +4823,9 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4795
4823
  search_sorting_open_: search_sorting_open_,
4796
4824
  available_sortings_: available_sortings_,
4797
4825
  sort_button_width_: adhere_to_width ? sort_button_width_ : undefined,
4798
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4826
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
4827
+ on_user_open_: () => user_opened_panel = true,
4828
+ button_ref_: is_tabbable ? el => sort_toggle_button = el : undefined
4799
4829
  });
4800
4830
  let open_modal_;
4801
4831
  let close_modal_;
@@ -4814,9 +4844,34 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4814
4844
  grid_is_in_original_state = true;
4815
4845
  }
4816
4846
  });
4847
+ // Restore focus to the relevant toggle button when a desktop panel is torn down while focus is still inside it.
4848
+ const restore_focus_to_toggle_on_close = () => {
4849
+ const button_to_restore = current_panel_toggle_button;
4850
+ const focus_was_in_panel = !!current_panel && current_panel.contains(document.activeElement);
4851
+ current_panel = undefined;
4852
+ current_panel_toggle_button = undefined;
4853
+ if (focus_was_in_panel) button_to_restore?.focus();
4854
+ };
4855
+ // `<section>` + `aria-label` so the panel announces itself ("Filters"/"Sort") when we move focus to it; the bare
4856
+ // tabindex=-1 container would otherwise give screen readers nothing to read on focus. A semantic <section> avoids
4857
+ // an ARIA role and the UA styling pitfalls of <fieldset>; the existing CSS targets the `.filters`/`.sorting` class.
4858
+ const FiltersPanel = should_focus => $5vyXB$solidjsweb.createComponent((0, $5vyXB$solidjs.Show), {
4859
+ get when() {
4860
+ return !hide_filters();
4861
+ },
4862
+ get children() {
4863
+ return $5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$, $5vyXB$solidjsweb.ssrHydrationKey(), $5vyXB$solidjsweb.ssrAttribute("tabindex", -1, false) + $5vyXB$solidjsweb.ssrAttribute("aria-label", $5vyXB$solidjsweb.escape(i18n_.filters_(), true), false), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $aff9a96d30ed3563$export$3f1a388cc0d8fed7), filter_options)));
4864
+ }
4865
+ });
4866
+ const SortingPanel = should_focus => $5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$2, $5vyXB$solidjsweb.ssrHydrationKey(), $5vyXB$solidjsweb.ssrAttribute("tabindex", -1, false) + $5vyXB$solidjsweb.ssrAttribute("aria-label", $5vyXB$solidjsweb.escape(i18n_.sorting_text_(), true), false), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $be89be42ce9ea60f$export$1f1775a58da589b5), sorting_options)));
4817
4867
  $5vyXB$solidjs.createEffect(() => {
4868
+ // Consume the user-intent flag once per run, in every branch, so a stale flag can't leak into a later
4869
+ // resize-triggered re-render and steal focus.
4870
+ const should_focus_panel = user_opened_panel;
4871
+ user_opened_panel = false;
4818
4872
  if (!filters_open() && !sorting_open()) {
4819
4873
  close_modal_?.();
4874
+ restore_focus_to_toggle_on_close();
4820
4875
  set_extra_els_in_results_container_("");
4821
4876
  } else if (isSmall()()) {
4822
4877
  if ($5vyXB$solidjs.untrack(() => input_modal_open_?.())) {
@@ -4825,18 +4880,14 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4825
4880
  set_sorting_open(false);
4826
4881
  return;
4827
4882
  }
4883
+ // The modal manages its own focus; just drop the desktop panel reference.
4884
+ current_panel = undefined;
4885
+ current_panel_toggle_button = undefined;
4828
4886
  open_modal_?.();
4829
4887
  set_extra_els_in_results_container_("");
4830
4888
  } else {
4831
4889
  close_modal_?.();
4832
- if (filters_open()) set_extra_els_in_results_container_(() => $5vyXB$solidjsweb.createComponent((0, $5vyXB$solidjs.Show), {
4833
- get when() {
4834
- return !hide_filters();
4835
- },
4836
- get children() {
4837
- return $5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$, $5vyXB$solidjsweb.ssrHydrationKey(), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $aff9a96d30ed3563$export$3f1a388cc0d8fed7), filter_options)));
4838
- }
4839
- }));else set_extra_els_in_results_container_($5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$2, $5vyXB$solidjsweb.ssrHydrationKey(), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $be89be42ce9ea60f$export$1f1775a58da589b5), sorting_options))));
4890
+ if (filters_open()) set_extra_els_in_results_container_(() => FiltersPanel(should_focus_panel));else set_extra_els_in_results_container_(SortingPanel(should_focus_panel));
4840
4891
  }
4841
4892
  });
4842
4893
  $5vyXB$depictaiutilishared.catchify(async () => {
@@ -4886,7 +4937,9 @@ function $f8f64d05c525825b$var$OpenFiltersButton({
4886
4937
  filter_button_width_: filter_button_width_,
4887
4938
  tabindex_: tabindex_,
4888
4939
  number_of_rendered_selected_filters_items_: [num_selected_filters],
4889
- hide_button_: hide_button_
4940
+ hide_button_: hide_button_,
4941
+ on_user_open_: on_user_open_,
4942
+ button_ref_: button_ref_
4890
4943
  }) {
4891
4944
  const filters_closed = $5vyXB$solidjs.createMemo(() => !search_filters_open_[0]());
4892
4945
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
@@ -4899,7 +4952,7 @@ function $f8f64d05c525825b$var$OpenFiltersButton({
4899
4952
  get children() {
4900
4953
  return $5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$4, $5vyXB$solidjsweb.ssrHydrationKey(), $5vyXB$solidjsweb.ssrStyle(filters_closed() ? `` : `opacity:0`), $5vyXB$solidjsweb.escape(num_selected_filters()));
4901
4954
  }
4902
- })), $5vyXB$solidjsweb.ssrAttribute("tabindex", $5vyXB$solidjsweb.escape(tabindex_, true), false), `${!filters_closed() ? "major" : ""} ${filters_closed() ? "minor" : ""} ${"filter toggle-button major-minor-transition" + ((0, $5vyXB$solidjsweb.isServer) ? " minor" : "")}`, $5vyXB$solidjsweb.ssrAttribute("aria-label", $5vyXB$solidjsweb.escape((filters_closed() ? i18n_.open_filters_ : i18n_.close_filters_)(), true), false), $5vyXB$solidjsweb.ssrStyle(filter_button_width_?.() ? {
4955
+ })), $5vyXB$solidjsweb.ssrAttribute("tabindex", $5vyXB$solidjsweb.escape(tabindex_, true), false), `${!filters_closed() ? "major" : ""} ${filters_closed() ? "minor" : ""} ${"filter toggle-button major-minor-transition" + ((0, $5vyXB$solidjsweb.isServer) ? " minor" : "")}`, $5vyXB$solidjsweb.ssrAttribute("aria-label", $5vyXB$solidjsweb.escape((filters_closed() ? i18n_.open_filters_ : i18n_.close_filters_)(), true), false) + $5vyXB$solidjsweb.ssrAttribute("aria-expanded", !filters_closed(), false), $5vyXB$solidjsweb.ssrStyle(filter_button_width_?.() ? {
4903
4956
  width: filter_button_width_() + "px"
4904
4957
  } : {}), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $5vyXB$solidjs.Show), {
4905
4958
  get when() {
@@ -4921,11 +4974,13 @@ function $f8f64d05c525825b$var$OpenSortingButton({
4921
4974
  search_sorting_open_: search_sorting_open_,
4922
4975
  sort_button_width_: sort_button_width_,
4923
4976
  tabindex_: tabindex_,
4924
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4977
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
4978
+ on_user_open_: on_user_open_,
4979
+ button_ref_: button_ref_
4925
4980
  }) {
4926
4981
  const sorting_closed = $5vyXB$solidjs.createMemo(() => !search_sorting_open_[0]());
4927
4982
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
4928
- return $5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$6, $5vyXB$solidjsweb.ssrHydrationKey(), `${!sorting_closed() ? "major" : ""} ${sorting_closed() ? "minor" : ""} toggle-button for-sorting major-minor-transition`, $5vyXB$solidjsweb.ssrAttribute("tabindex", $5vyXB$solidjsweb.escape(tabindex_, true), false) + $5vyXB$solidjsweb.ssrAttribute("aria-label", $5vyXB$solidjsweb.escape((sorting_closed() ? i18n_.open_sorting_ : i18n_.close_sorting_)(), true), false), $5vyXB$solidjsweb.ssrStyle(sort_button_width_?.() ? {
4983
+ return $5vyXB$solidjsweb.ssr($f8f64d05c525825b$var$_tmpl$6, $5vyXB$solidjsweb.ssrHydrationKey(), `${!sorting_closed() ? "major" : ""} ${sorting_closed() ? "minor" : ""} toggle-button for-sorting major-minor-transition`, $5vyXB$solidjsweb.ssrAttribute("tabindex", $5vyXB$solidjsweb.escape(tabindex_, true), false) + $5vyXB$solidjsweb.ssrAttribute("aria-label", $5vyXB$solidjsweb.escape((sorting_closed() ? i18n_.open_sorting_ : i18n_.close_sorting_)(), true), false) + $5vyXB$solidjsweb.ssrAttribute("aria-expanded", !sorting_closed(), false), $5vyXB$solidjsweb.ssrStyle(sort_button_width_?.() ? {
4929
4984
  width: sort_button_width_() + "px"
4930
4985
  } : {}),
4931
4986
  // Show the title of the currently selected sorting when the sorting is closed, if there's currently a sorting selected
@@ -11,7 +11,7 @@ import { GetListingRequest } from "@depict-ai/types/api/GetListingRequest";
11
11
  import { BaseSearchRequestV3 } from "@depict-ai/types/api/BaseSearchRequestV3";
12
12
  import { FeaturedInDisplay } from "@depict-ai/types/api/FeaturedInResponseV3";
13
13
  import { SearchFilter as _SearchFilter3 } from "@depict-ai/types/api/SearchRequestV2";
14
- export const version = "4.10.13";
14
+ export const version = "4.10.14";
15
15
  /**
16
16
  * Use `javascript_media_query` but return a reactive accessor instead of taking a callback function
17
17
  */
@@ -7,7 +7,7 @@ import { createStore as $i7OB2$createStore, reconcile as $i7OB2$reconcile } from
7
7
  /*! Depict.ai search and product listing SDK */
8
8
  import { register_es_version } from "../../multi_import_deduplicator.mjs";
9
9
  register_es_version("ui", "latest");
10
- const $ec291e0010116877$export$83d89fbfd8236492 = "4.10.13";
10
+ const $ec291e0010116877$export$83d89fbfd8236492 = "4.10.14";
11
11
  function $dc9262ef6f786812$export$d9f36cf74e24d595(media_query) {
12
12
  const signal = $i7OB2$createSignal(false);
13
13
  $i7OB2$onCleanup($i7OB2$javascript_media_query(media_query, ({
@@ -2111,8 +2111,10 @@ function $f8a56ba74eedd0c6$export$f21ab0717a89c77f(props) {
2111
2111
  var $67b173f9db427028$var$_tmpl$ = ["<button", ' type="button" class="', '"', "><!--$-->", "<!--/--><span>", "</span></button>"];
2112
2112
  function $67b173f9db427028$export$ca21a16d65b3dd8({
2113
2113
  show_extras_: [get_show_extras, set_show_extras],
2114
- i18n_: i18n_
2114
+ i18n_: i18n_,
2115
+ expanding_container_element_: expanding_container_element_
2115
2116
  }) {
2117
+ let button;
2116
2118
  return $i7OB2$ssr($67b173f9db427028$var$_tmpl$, $i7OB2$ssrHydrationKey(), `expand-filter ${get_show_extras() ? "expanded" : ""}`, $i7OB2$ssrAttribute("aria-expanded", $i7OB2$escape(get_show_extras(), true), false), $i7OB2$escape($i7OB2$createComponent((0, $f8a56ba74eedd0c6$export$f21ab0717a89c77f), {})), get_show_extras() ? $i7OB2$escape(i18n_.view_less_()) : $i7OB2$escape(i18n_.view_more_()));
2117
2119
  }
2118
2120
  var $f3213c0640246d58$var$_tmpl$ = ["<span", ' class="highlighted-part">', "</span>"],
@@ -2265,7 +2267,8 @@ function $a4601e6bea3ed1e6$export$dd948f91abc3a1c4({
2265
2267
  $i7OB2$createRenderEffect(() => {
2266
2268
  set_view_more_button_below_group_(togglable_rest() ? $i7OB2$createComponent((0, $67b173f9db427028$export$ca21a16d65b3dd8), {
2267
2269
  show_extras_: show_extras_signal,
2268
- i18n_: i18n_
2270
+ i18n_: i18n_,
2271
+ expanding_container_element_: expanding_container_els
2269
2272
  }) : []);
2270
2273
  });
2271
2274
  $i7OB2$onCleanup(() => set_view_more_button_below_group_());
@@ -2942,7 +2945,8 @@ function $1c8cac76cb67e9af$export$a32086fa6616eafd({
2942
2945
  $i7OB2$createRenderEffect(() => {
2943
2946
  set_view_more_button_below_group(some_top_level_are_hidden() ? $i7OB2$createComponent((0, $67b173f9db427028$export$ca21a16d65b3dd8), {
2944
2947
  show_extras_: show_extras,
2945
- i18n_: i18n_
2948
+ i18n_: i18n_,
2949
+ expanding_container_element_: expanding_container_els
2946
2950
  }) : []);
2947
2951
  });
2948
2952
  $i7OB2$onCleanup(() => set_view_more_button_below_group());
@@ -3607,7 +3611,8 @@ function $e731d52d97444b7c$export$82ed4b28ecb67608({
3607
3611
  $i7OB2$createRenderEffect(() => {
3608
3612
  set_view_more_button_below_group_(togglable_rest() ? $i7OB2$createComponent((0, $67b173f9db427028$export$ca21a16d65b3dd8), {
3609
3613
  show_extras_: show_extras_signal,
3610
- i18n_: i18n_
3614
+ i18n_: i18n_,
3615
+ expanding_container_element_: expanding_container_els
3611
3616
  }) : []);
3612
3617
  });
3613
3618
  $i7OB2$onCleanup(() => set_view_more_button_below_group_());
@@ -4606,8 +4611,8 @@ var $11d594c749b76228$var$_tmpl$ = ["<svg", ' xmlns="http://www.w3.org/2000/svg"
4606
4611
  function $11d594c749b76228$export$cb808a3c41736d8e() {
4607
4612
  return $i7OB2$ssr($11d594c749b76228$var$_tmpl$, $i7OB2$ssrHydrationKey());
4608
4613
  }
4609
- var $cdea4cf8c5c071ef$var$_tmpl$ = ["<div", ' class="filters"><div class="body">', "</div></div>"],
4610
- $cdea4cf8c5c071ef$var$_tmpl$2 = ["<div", ' class="sorting"><div class="body">', "</div></div>"],
4614
+ var $cdea4cf8c5c071ef$var$_tmpl$ = ["<section", ' class="filters"', '><div class="body">', "</div></section>"],
4615
+ $cdea4cf8c5c071ef$var$_tmpl$2 = ["<section", ' class="sorting"', '><div class="body">', "</div></section>"],
4611
4616
  $cdea4cf8c5c071ef$var$_tmpl$3 = ["<div", ' class="sort-and-filter-buttons"><div class="outer"><div class="inner"><!--$-->', "<!--/--><!--$-->", "<!--/--><!--$-->", "<!--/--></div></div></div>"],
4612
4617
  $cdea4cf8c5c071ef$var$_tmpl$4 = ["<span", ' class="num-filters" style="', '">', "</span>"],
4613
4618
  $cdea4cf8c5c071ef$var$_tmpl$5 = ["<div", ' class="open-filters-button-container" style="', '"><!--$-->', "<!--/--><button", ' class="', '" type="button"', ' style="', '"><!--$-->', "<!--/--><span>", "</span></button></div>"],
@@ -4676,6 +4681,27 @@ function $cdea4cf8c5c071ef$export$d7841e452f2e59a8({
4676
4681
  available_sortings_: available_sortings_,
4677
4682
  meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4678
4683
  };
4684
+ // Keyboard accessibility for the desktop panels (rendered after the product grid in the DOM): when the user
4685
+ // opens a panel we move focus into it, and restore focus to the toggle button on close. Intent is tracked with
4686
+ // a plain flag set in the buttons' click handlers - `filters_open`/`sorting_open` also change programmatically
4687
+ // (undo toast, history-state restore, SDK consumers), and those must not steal focus.
4688
+ let user_opened_panel = false;
4689
+ let filter_toggle_button;
4690
+ let sort_toggle_button;
4691
+ let current_panel;
4692
+ let current_panel_toggle_button;
4693
+ const focus_panel_when_in_dom = panel => $i7OB2$catchify1(async () => {
4694
+ // Bounded wait: if the panel never lands in the DOM (e.g. it's superseded by a rapid re-render before
4695
+ // insertion), the timeout lets this promise resolve instead of keeping `panel` - and the observer
4696
+ // listener it registers - referenced forever.
4697
+ await (0, $i7OB2$observer).wait_for_element(panel, 4000);
4698
+ if (panel.isConnected) panel.focus();
4699
+ })();
4700
+ const register_desktop_panel = (el, toggle_button, should_focus) => {
4701
+ current_panel = el;
4702
+ current_panel_toggle_button = toggle_button;
4703
+ if (should_focus) focus_panel_when_in_dom(el);
4704
+ };
4679
4705
  const make_open_filters_button = (adhere_to_width = false, is_tabbable = false) => $i7OB2$createComponent($cdea4cf8c5c071ef$var$OpenFiltersButton, {
4680
4706
  tabindex_: is_tabbable ? 0 : -1,
4681
4707
  i18n_: i18n_,
@@ -4683,7 +4709,9 @@ function $cdea4cf8c5c071ef$export$d7841e452f2e59a8({
4683
4709
  search_sorting_open_: search_sorting_open_,
4684
4710
  number_of_rendered_selected_filters_items_: number_of_rendered_selected_filters_items_,
4685
4711
  filter_button_width_: adhere_to_width ? filter_button_width_ : undefined,
4686
- hide_button_: hide_filters
4712
+ hide_button_: hide_filters,
4713
+ on_user_open_: () => user_opened_panel = true,
4714
+ button_ref_: is_tabbable ? el => filter_toggle_button = el : undefined
4687
4715
  });
4688
4716
  const make_open_sorting_button = (adhere_to_width = false, is_tabbable = false) => $i7OB2$createComponent($cdea4cf8c5c071ef$var$OpenSortingButton, {
4689
4717
  tabindex_: is_tabbable ? 0 : -1,
@@ -4693,7 +4721,9 @@ function $cdea4cf8c5c071ef$export$d7841e452f2e59a8({
4693
4721
  search_sorting_open_: search_sorting_open_,
4694
4722
  available_sortings_: available_sortings_,
4695
4723
  sort_button_width_: adhere_to_width ? sort_button_width_ : undefined,
4696
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4724
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
4725
+ on_user_open_: () => user_opened_panel = true,
4726
+ button_ref_: is_tabbable ? el => sort_toggle_button = el : undefined
4697
4727
  });
4698
4728
  let open_modal_;
4699
4729
  let close_modal_;
@@ -4712,9 +4742,34 @@ function $cdea4cf8c5c071ef$export$d7841e452f2e59a8({
4712
4742
  grid_is_in_original_state = true;
4713
4743
  }
4714
4744
  });
4745
+ // Restore focus to the relevant toggle button when a desktop panel is torn down while focus is still inside it.
4746
+ const restore_focus_to_toggle_on_close = () => {
4747
+ const button_to_restore = current_panel_toggle_button;
4748
+ const focus_was_in_panel = !!current_panel && current_panel.contains(document.activeElement);
4749
+ current_panel = undefined;
4750
+ current_panel_toggle_button = undefined;
4751
+ if (focus_was_in_panel) button_to_restore?.focus();
4752
+ };
4753
+ // `<section>` + `aria-label` so the panel announces itself ("Filters"/"Sort") when we move focus to it; the bare
4754
+ // tabindex=-1 container would otherwise give screen readers nothing to read on focus. A semantic <section> avoids
4755
+ // an ARIA role and the UA styling pitfalls of <fieldset>; the existing CSS targets the `.filters`/`.sorting` class.
4756
+ const FiltersPanel = should_focus => $i7OB2$createComponent((0, $i7OB2$Show), {
4757
+ get when() {
4758
+ return !hide_filters();
4759
+ },
4760
+ get children() {
4761
+ return $i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$, $i7OB2$ssrHydrationKey(), $i7OB2$ssrAttribute("tabindex", -1, false) + $i7OB2$ssrAttribute("aria-label", $i7OB2$escape(i18n_.filters_(), true), false), $i7OB2$escape($i7OB2$createComponent((0, $fab07f52c9861732$export$3f1a388cc0d8fed7), filter_options)));
4762
+ }
4763
+ });
4764
+ const SortingPanel = should_focus => $i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$2, $i7OB2$ssrHydrationKey(), $i7OB2$ssrAttribute("tabindex", -1, false) + $i7OB2$ssrAttribute("aria-label", $i7OB2$escape(i18n_.sorting_text_(), true), false), $i7OB2$escape($i7OB2$createComponent((0, $68a258a92b88f02f$export$1f1775a58da589b5), sorting_options)));
4715
4765
  $i7OB2$createEffect(() => {
4766
+ // Consume the user-intent flag once per run, in every branch, so a stale flag can't leak into a later
4767
+ // resize-triggered re-render and steal focus.
4768
+ const should_focus_panel = user_opened_panel;
4769
+ user_opened_panel = false;
4716
4770
  if (!filters_open() && !sorting_open()) {
4717
4771
  close_modal_?.();
4772
+ restore_focus_to_toggle_on_close();
4718
4773
  set_extra_els_in_results_container_("");
4719
4774
  } else if (isSmall()()) {
4720
4775
  if ($i7OB2$untrack(() => input_modal_open_?.())) {
@@ -4723,18 +4778,14 @@ function $cdea4cf8c5c071ef$export$d7841e452f2e59a8({
4723
4778
  set_sorting_open(false);
4724
4779
  return;
4725
4780
  }
4781
+ // The modal manages its own focus; just drop the desktop panel reference.
4782
+ current_panel = undefined;
4783
+ current_panel_toggle_button = undefined;
4726
4784
  open_modal_?.();
4727
4785
  set_extra_els_in_results_container_("");
4728
4786
  } else {
4729
4787
  close_modal_?.();
4730
- if (filters_open()) set_extra_els_in_results_container_(() => $i7OB2$createComponent((0, $i7OB2$Show), {
4731
- get when() {
4732
- return !hide_filters();
4733
- },
4734
- get children() {
4735
- return $i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$, $i7OB2$ssrHydrationKey(), $i7OB2$escape($i7OB2$createComponent((0, $fab07f52c9861732$export$3f1a388cc0d8fed7), filter_options)));
4736
- }
4737
- }));else set_extra_els_in_results_container_($i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$2, $i7OB2$ssrHydrationKey(), $i7OB2$escape($i7OB2$createComponent((0, $68a258a92b88f02f$export$1f1775a58da589b5), sorting_options))));
4788
+ if (filters_open()) set_extra_els_in_results_container_(() => FiltersPanel(should_focus_panel));else set_extra_els_in_results_container_(SortingPanel(should_focus_panel));
4738
4789
  }
4739
4790
  });
4740
4791
  $i7OB2$catchify1(async () => {
@@ -4784,7 +4835,9 @@ function $cdea4cf8c5c071ef$var$OpenFiltersButton({
4784
4835
  filter_button_width_: filter_button_width_,
4785
4836
  tabindex_: tabindex_,
4786
4837
  number_of_rendered_selected_filters_items_: [num_selected_filters],
4787
- hide_button_: hide_button_
4838
+ hide_button_: hide_button_,
4839
+ on_user_open_: on_user_open_,
4840
+ button_ref_: button_ref_
4788
4841
  }) {
4789
4842
  const filters_closed = $i7OB2$createMemo(() => !search_filters_open_[0]());
4790
4843
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
@@ -4797,7 +4850,7 @@ function $cdea4cf8c5c071ef$var$OpenFiltersButton({
4797
4850
  get children() {
4798
4851
  return $i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$4, $i7OB2$ssrHydrationKey(), $i7OB2$ssrStyle(filters_closed() ? `` : `opacity:0`), $i7OB2$escape(num_selected_filters()));
4799
4852
  }
4800
- })), $i7OB2$ssrAttribute("tabindex", $i7OB2$escape(tabindex_, true), false), `${!filters_closed() ? "major" : ""} ${filters_closed() ? "minor" : ""} ${"filter toggle-button major-minor-transition" + ((0, $i7OB2$isServer) ? " minor" : "")}`, $i7OB2$ssrAttribute("aria-label", $i7OB2$escape((filters_closed() ? i18n_.open_filters_ : i18n_.close_filters_)(), true), false), $i7OB2$ssrStyle(filter_button_width_?.() ? {
4853
+ })), $i7OB2$ssrAttribute("tabindex", $i7OB2$escape(tabindex_, true), false), `${!filters_closed() ? "major" : ""} ${filters_closed() ? "minor" : ""} ${"filter toggle-button major-minor-transition" + ((0, $i7OB2$isServer) ? " minor" : "")}`, $i7OB2$ssrAttribute("aria-label", $i7OB2$escape((filters_closed() ? i18n_.open_filters_ : i18n_.close_filters_)(), true), false) + $i7OB2$ssrAttribute("aria-expanded", !filters_closed(), false), $i7OB2$ssrStyle(filter_button_width_?.() ? {
4801
4854
  width: filter_button_width_() + "px"
4802
4855
  } : {}), $i7OB2$escape($i7OB2$createComponent((0, $i7OB2$Show), {
4803
4856
  get when() {
@@ -4819,11 +4872,13 @@ function $cdea4cf8c5c071ef$var$OpenSortingButton({
4819
4872
  search_sorting_open_: search_sorting_open_,
4820
4873
  sort_button_width_: sort_button_width_,
4821
4874
  tabindex_: tabindex_,
4822
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4875
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
4876
+ on_user_open_: on_user_open_,
4877
+ button_ref_: button_ref_
4823
4878
  }) {
4824
4879
  const sorting_closed = $i7OB2$createMemo(() => !search_sorting_open_[0]());
4825
4880
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
4826
- return $i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$6, $i7OB2$ssrHydrationKey(), `${!sorting_closed() ? "major" : ""} ${sorting_closed() ? "minor" : ""} toggle-button for-sorting major-minor-transition`, $i7OB2$ssrAttribute("tabindex", $i7OB2$escape(tabindex_, true), false) + $i7OB2$ssrAttribute("aria-label", $i7OB2$escape((sorting_closed() ? i18n_.open_sorting_ : i18n_.close_sorting_)(), true), false), $i7OB2$ssrStyle(sort_button_width_?.() ? {
4881
+ return $i7OB2$ssr($cdea4cf8c5c071ef$var$_tmpl$6, $i7OB2$ssrHydrationKey(), `${!sorting_closed() ? "major" : ""} ${sorting_closed() ? "minor" : ""} toggle-button for-sorting major-minor-transition`, $i7OB2$ssrAttribute("tabindex", $i7OB2$escape(tabindex_, true), false) + $i7OB2$ssrAttribute("aria-label", $i7OB2$escape((sorting_closed() ? i18n_.open_sorting_ : i18n_.close_sorting_)(), true), false) + $i7OB2$ssrAttribute("aria-expanded", !sorting_closed(), false), $i7OB2$ssrStyle(sort_button_width_?.() ? {
4827
4882
  width: sort_button_width_() + "px"
4828
4883
  } : {}),
4829
4884
  // Show the title of the currently selected sorting when the sorting is closed, if there's currently a sorting selected