@depict-ai/ui 4.10.13 → 4.10.15

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.15";
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,40 @@ 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 a11y for desktop panels (DOM order: after the grid). Keyboard opens move focus into the panel and
4986
+ // restore it to the toggle on close; mouse opens skip the focus move (already visible, and it'd jump the viewport).
4987
+ // `user_opened_panel` is set only on keyboard activation - `filters_open`/`sorting_open` also change
4988
+ // programmatically (undo toast, history restore, SDK consumers), which 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) {
5000
+ var _panel$querySelector;
5001
+ // Focus the first interactive control (often a group's <summary>), not the <section>: the section has no
5002
+ // visible focus ring and is flex-stretched to full grid height (scrolling it mis-aligns). The first
5003
+ // control keeps focus visible and lets Tab walk through the panel. `summary` is focusable but not matched
5004
+ // by the input/button/etc. selectors, so it must be listed explicitly.
5005
+ const focus_target = (_panel$querySelector = panel.querySelector("summary, input:not([type='hidden']):not(:disabled), button:not(:disabled), a[href], select:not(:disabled), [tabindex]:not([tabindex='-1'])")) !== null && _panel$querySelector !== void 0 ? _panel$querySelector : panel;
5006
+ focus_target.focus({
5007
+ preventScroll: true
5008
+ });
5009
+ focus_target.scrollIntoView({
5010
+ block: "nearest"
5011
+ });
5012
+ }
5013
+ })();
5014
+ const register_desktop_panel = (el, toggle_button, should_focus) => {
5015
+ current_panel = el;
5016
+ current_panel_toggle_button = toggle_button;
5017
+ if (should_focus) focus_panel_when_in_dom(el);
5018
+ };
4980
5019
  const make_open_filters_button = function () {
4981
5020
  let adhere_to_width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
4982
5021
  let is_tabbable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@@ -4987,7 +5026,11 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
4987
5026
  search_sorting_open_: search_sorting_open_,
4988
5027
  number_of_rendered_selected_filters_items_: number_of_rendered_selected_filters_items_,
4989
5028
  filter_button_width_: adhere_to_width ? filter_button_width_ : undefined,
4990
- hide_button_: hide_filters
5029
+ hide_button_: hide_filters,
5030
+ on_user_open_: keyboard_activated => {
5031
+ if (keyboard_activated) user_opened_panel = true;
5032
+ },
5033
+ button_ref_: is_tabbable ? el => filter_toggle_button = el : undefined
4991
5034
  });
4992
5035
  };
4993
5036
  const make_open_sorting_button = function () {
@@ -5001,7 +5044,11 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
5001
5044
  search_sorting_open_: search_sorting_open_,
5002
5045
  available_sortings_: available_sortings_,
5003
5046
  sort_button_width_: adhere_to_width ? sort_button_width_ : undefined,
5004
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
5047
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
5048
+ on_user_open_: keyboard_activated => {
5049
+ if (keyboard_activated) user_opened_panel = true;
5050
+ },
5051
+ button_ref_: is_tabbable ? el => sort_toggle_button = el : undefined
5005
5052
  });
5006
5053
  };
5007
5054
  let open_modal_;
@@ -5021,10 +5068,37 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
5021
5068
  grid_is_in_original_state = true;
5022
5069
  }
5023
5070
  });
5071
+ // Restore focus to the relevant toggle button when a desktop panel is torn down while focus is still inside it.
5072
+ const restore_focus_to_toggle_on_close = () => {
5073
+ const button_to_restore = current_panel_toggle_button;
5074
+ const focus_was_in_panel = !!current_panel && current_panel.contains(document.activeElement);
5075
+ current_panel = undefined;
5076
+ current_panel_toggle_button = undefined;
5077
+ if (focus_was_in_panel && button_to_restore) button_to_restore.focus({
5078
+ preventScroll: true
5079
+ });
5080
+ };
5081
+ // `<section>` + `aria-label` so the panel announces itself ("Filters"/"Sort") when we move focus to it; the bare
5082
+ // tabindex=-1 container would otherwise give screen readers nothing to read on focus. A semantic <section> avoids
5083
+ // an ARIA role and the UA styling pitfalls of <fieldset>; the existing CSS targets the `.filters`/`.sorting` class.
5084
+ const FiltersPanel = should_focus => $b8hua$createComponent((0, $b8hua$Show), {
5085
+ get when() {
5086
+ return !hide_filters();
5087
+ },
5088
+ get children() {
5089
+ 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)));
5090
+ }
5091
+ });
5092
+ 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
5093
  $b8hua$createEffect(() => {
5094
+ // Consume the user-intent flag once per run, in every branch, so a stale flag can't leak into a later
5095
+ // resize-triggered re-render and steal focus.
5096
+ const should_focus_panel = user_opened_panel;
5097
+ user_opened_panel = false;
5025
5098
  if (!filters_open() && !sorting_open()) {
5026
5099
  var _close_modal_;
5027
5100
  (_close_modal_ = close_modal_) === null || _close_modal_ === void 0 || _close_modal_();
5101
+ restore_focus_to_toggle_on_close();
5028
5102
  set_extra_els_in_results_container_("");
5029
5103
  } else if (isSmall()()) {
5030
5104
  var _open_modal_;
@@ -5034,19 +5108,15 @@ function $7396052a1484264f$export$d7841e452f2e59a8(_ref) {
5034
5108
  set_sorting_open(false);
5035
5109
  return;
5036
5110
  }
5111
+ // The modal manages its own focus; just drop the desktop panel reference.
5112
+ current_panel = undefined;
5113
+ current_panel_toggle_button = undefined;
5037
5114
  (_open_modal_ = open_modal_) === null || _open_modal_ === void 0 || _open_modal_();
5038
5115
  set_extra_els_in_results_container_("");
5039
5116
  } else {
5040
5117
  var _close_modal_2;
5041
5118
  (_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))));
5119
+ 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
5120
  }
5051
5121
  });
5052
5122
  $b8hua$catchify1(async () => {
@@ -5097,7 +5167,9 @@ function $7396052a1484264f$var$OpenFiltersButton(_ref3) {
5097
5167
  filter_button_width_: filter_button_width_,
5098
5168
  tabindex_: tabindex_,
5099
5169
  number_of_rendered_selected_filters_items_: [num_selected_filters],
5100
- hide_button_: hide_button_
5170
+ hide_button_: hide_button_,
5171
+ on_user_open_: on_user_open_,
5172
+ button_ref_: button_ref_
5101
5173
  } = _ref3;
5102
5174
  const filters_closed = $b8hua$createMemo(() => !search_filters_open_[0]());
5103
5175
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
@@ -5110,7 +5182,7 @@ function $7396052a1484264f$var$OpenFiltersButton(_ref3) {
5110
5182
  get children() {
5111
5183
  return $b8hua$ssr($7396052a1484264f$var$_tmpl$4, $b8hua$ssrHydrationKey(), $b8hua$ssrStyle(filters_closed() ? "" : "opacity:0"), $b8hua$escape(num_selected_filters()));
5112
5184
  }
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_() ? {
5185
+ })), $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
5186
  width: filter_button_width_() + "px"
5115
5187
  } : {}), $b8hua$escape($b8hua$createComponent((0, $b8hua$Show), {
5116
5188
  get when() {
@@ -5134,11 +5206,13 @@ function $7396052a1484264f$var$OpenSortingButton(_ref4) {
5134
5206
  search_sorting_open_: search_sorting_open_,
5135
5207
  sort_button_width_: sort_button_width_,
5136
5208
  tabindex_: tabindex_,
5137
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
5209
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
5210
+ on_user_open_: on_user_open_,
5211
+ button_ref_: button_ref_
5138
5212
  } = _ref4;
5139
5213
  const sorting_closed = $b8hua$createMemo(() => !search_sorting_open_[0]());
5140
5214
  // 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_() ? {
5215
+ 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
5216
  width: sort_button_width_() + "px"
5143
5217
  } : {}),
5144
5218
  // 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.15";
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,39 @@ 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 a11y for desktop panels (DOM order: after the grid). Keyboard opens move focus into the panel and
4787
+ // restore it to the toggle on close; mouse opens skip the focus move (already visible, and it'd jump the viewport).
4788
+ // `user_opened_panel` is set only on keyboard activation - `filters_open`/`sorting_open` also change
4789
+ // programmatically (undo toast, history restore, SDK consumers), which 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) {
4801
+ // Focus the first interactive control (often a group's <summary>), not the <section>: the section has no
4802
+ // visible focus ring and is flex-stretched to full grid height (scrolling it mis-aligns). The first
4803
+ // control keeps focus visible and lets Tab walk through the panel. `summary` is focusable but not matched
4804
+ // by the input/button/etc. selectors, so it must be listed explicitly.
4805
+ const focus_target = panel.querySelector("summary, input:not([type='hidden']):not(:disabled), button:not(:disabled), a[href], select:not(:disabled), [tabindex]:not([tabindex='-1'])") ?? panel;
4806
+ focus_target.focus({
4807
+ preventScroll: true
4808
+ });
4809
+ focus_target.scrollIntoView({
4810
+ block: "nearest"
4811
+ });
4812
+ }
4813
+ })();
4814
+ const register_desktop_panel = (el, toggle_button, should_focus) => {
4815
+ current_panel = el;
4816
+ current_panel_toggle_button = toggle_button;
4817
+ if (should_focus) focus_panel_when_in_dom(el);
4818
+ };
4781
4819
  const make_open_filters_button = (adhere_to_width = false, is_tabbable = false) => $5vyXB$solidjsweb.createComponent($f8f64d05c525825b$var$OpenFiltersButton, {
4782
4820
  tabindex_: is_tabbable ? 0 : -1,
4783
4821
  i18n_: i18n_,
@@ -4785,7 +4823,11 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4785
4823
  search_sorting_open_: search_sorting_open_,
4786
4824
  number_of_rendered_selected_filters_items_: number_of_rendered_selected_filters_items_,
4787
4825
  filter_button_width_: adhere_to_width ? filter_button_width_ : undefined,
4788
- hide_button_: hide_filters
4826
+ hide_button_: hide_filters,
4827
+ on_user_open_: keyboard_activated => {
4828
+ if (keyboard_activated) user_opened_panel = true;
4829
+ },
4830
+ button_ref_: is_tabbable ? el => filter_toggle_button = el : undefined
4789
4831
  });
4790
4832
  const make_open_sorting_button = (adhere_to_width = false, is_tabbable = false) => $5vyXB$solidjsweb.createComponent($f8f64d05c525825b$var$OpenSortingButton, {
4791
4833
  tabindex_: is_tabbable ? 0 : -1,
@@ -4795,7 +4837,11 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4795
4837
  search_sorting_open_: search_sorting_open_,
4796
4838
  available_sortings_: available_sortings_,
4797
4839
  sort_button_width_: adhere_to_width ? sort_button_width_ : undefined,
4798
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4840
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
4841
+ on_user_open_: keyboard_activated => {
4842
+ if (keyboard_activated) user_opened_panel = true;
4843
+ },
4844
+ button_ref_: is_tabbable ? el => sort_toggle_button = el : undefined
4799
4845
  });
4800
4846
  let open_modal_;
4801
4847
  let close_modal_;
@@ -4814,9 +4860,36 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4814
4860
  grid_is_in_original_state = true;
4815
4861
  }
4816
4862
  });
4863
+ // Restore focus to the relevant toggle button when a desktop panel is torn down while focus is still inside it.
4864
+ const restore_focus_to_toggle_on_close = () => {
4865
+ const button_to_restore = current_panel_toggle_button;
4866
+ const focus_was_in_panel = !!current_panel && current_panel.contains(document.activeElement);
4867
+ current_panel = undefined;
4868
+ current_panel_toggle_button = undefined;
4869
+ if (focus_was_in_panel && button_to_restore) button_to_restore.focus({
4870
+ preventScroll: true
4871
+ });
4872
+ };
4873
+ // `<section>` + `aria-label` so the panel announces itself ("Filters"/"Sort") when we move focus to it; the bare
4874
+ // tabindex=-1 container would otherwise give screen readers nothing to read on focus. A semantic <section> avoids
4875
+ // an ARIA role and the UA styling pitfalls of <fieldset>; the existing CSS targets the `.filters`/`.sorting` class.
4876
+ const FiltersPanel = should_focus => $5vyXB$solidjsweb.createComponent((0, $5vyXB$solidjs.Show), {
4877
+ get when() {
4878
+ return !hide_filters();
4879
+ },
4880
+ get children() {
4881
+ 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)));
4882
+ }
4883
+ });
4884
+ 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
4885
  $5vyXB$solidjs.createEffect(() => {
4886
+ // Consume the user-intent flag once per run, in every branch, so a stale flag can't leak into a later
4887
+ // resize-triggered re-render and steal focus.
4888
+ const should_focus_panel = user_opened_panel;
4889
+ user_opened_panel = false;
4818
4890
  if (!filters_open() && !sorting_open()) {
4819
4891
  close_modal_?.();
4892
+ restore_focus_to_toggle_on_close();
4820
4893
  set_extra_els_in_results_container_("");
4821
4894
  } else if (isSmall()()) {
4822
4895
  if ($5vyXB$solidjs.untrack(() => input_modal_open_?.())) {
@@ -4825,18 +4898,14 @@ function $f8f64d05c525825b$export$d7841e452f2e59a8({
4825
4898
  set_sorting_open(false);
4826
4899
  return;
4827
4900
  }
4901
+ // The modal manages its own focus; just drop the desktop panel reference.
4902
+ current_panel = undefined;
4903
+ current_panel_toggle_button = undefined;
4828
4904
  open_modal_?.();
4829
4905
  set_extra_els_in_results_container_("");
4830
4906
  } else {
4831
4907
  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))));
4908
+ 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
4909
  }
4841
4910
  });
4842
4911
  $5vyXB$depictaiutilishared.catchify(async () => {
@@ -4886,7 +4955,9 @@ function $f8f64d05c525825b$var$OpenFiltersButton({
4886
4955
  filter_button_width_: filter_button_width_,
4887
4956
  tabindex_: tabindex_,
4888
4957
  number_of_rendered_selected_filters_items_: [num_selected_filters],
4889
- hide_button_: hide_button_
4958
+ hide_button_: hide_button_,
4959
+ on_user_open_: on_user_open_,
4960
+ button_ref_: button_ref_
4890
4961
  }) {
4891
4962
  const filters_closed = $5vyXB$solidjs.createMemo(() => !search_filters_open_[0]());
4892
4963
  // We assume in embedded_num_products that this is a single HTMLElement so pls change there if you change it here
@@ -4899,7 +4970,7 @@ function $f8f64d05c525825b$var$OpenFiltersButton({
4899
4970
  get children() {
4900
4971
  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
4972
  }
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_?.() ? {
4973
+ })), $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
4974
  width: filter_button_width_() + "px"
4904
4975
  } : {}), $5vyXB$solidjsweb.escape($5vyXB$solidjsweb.createComponent((0, $5vyXB$solidjs.Show), {
4905
4976
  get when() {
@@ -4921,11 +4992,13 @@ function $f8f64d05c525825b$var$OpenSortingButton({
4921
4992
  search_sorting_open_: search_sorting_open_,
4922
4993
  sort_button_width_: sort_button_width_,
4923
4994
  tabindex_: tabindex_,
4924
- meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_
4995
+ meta_of_currently_selected_sorting_: meta_of_currently_selected_sorting_,
4996
+ on_user_open_: on_user_open_,
4997
+ button_ref_: button_ref_
4925
4998
  }) {
4926
4999
  const sorting_closed = $5vyXB$solidjs.createMemo(() => !search_sorting_open_[0]());
4927
5000
  // 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_?.() ? {
5001
+ 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
5002
  width: sort_button_width_() + "px"
4930
5003
  } : {}),
4931
5004
  // 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.15";
15
15
  /**
16
16
  * Use `javascript_media_query` but return a reactive accessor instead of taking a callback function
17
17
  */