@coveo/atomic 3.61.5 → 3.63.0

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.
Files changed (92) hide show
  1. package/custom-elements.json +189 -20
  2. package/dist/cjs/components/commerce/atomic-commerce-category-facet/atomic-commerce-category-facet.cjs +19 -7
  3. package/dist/cjs/components/commerce/atomic-commerce-interface/atomic-commerce-interface.cjs +25 -4
  4. package/dist/cjs/components/commerce/atomic-commerce-pager/atomic-commerce-pager.cjs +3 -2
  5. package/dist/cjs/components/commerce/atomic-commerce-products-per-page/atomic-commerce-products-per-page.cjs +1 -1
  6. package/dist/cjs/components/commerce/atomic-commerce-recommendation-interface/atomic-commerce-recommendation-interface.cjs +25 -4
  7. package/dist/cjs/components/common/facets/category-facet/active-value.cjs +69 -0
  8. package/dist/cjs/components/common/facets/category-facet/selected-value.cjs +78 -0
  9. package/dist/cjs/components/common/facets/category-facet/value-link.cjs +5 -6
  10. package/dist/cjs/components/common/interface/i18n.cjs +6 -2
  11. package/dist/cjs/components/common/interface/interface-controller.cjs +8 -4
  12. package/dist/cjs/components/common/pager/pager-fit-controller.cjs +72 -0
  13. package/dist/cjs/components/insight/atomic-insight-pager/atomic-insight-pager.cjs +3 -2
  14. package/dist/cjs/components/search/atomic-category-facet/atomic-category-facet.cjs +19 -8
  15. package/dist/cjs/components/search/atomic-pager/atomic-pager.cjs +3 -2
  16. package/dist/cjs/components/search/atomic-result-date/atomic-result-date.cjs +11 -16
  17. package/dist/cjs/components/search/atomic-results-per-page/atomic-results-per-page.cjs +1 -1
  18. package/dist/cjs/generated/dayjs-locales-data.cjs +43 -43
  19. package/dist/cjs/global/environment.cjs +1 -1
  20. package/dist/cjs/utils/dayjs-locales.cjs +23 -9
  21. package/dist/cjs/utils/field-utils.cjs +5 -1
  22. package/dist/cjs/{components/common/facets/category-facet/parent-value-link.cjs → utils/locale-utils.cjs} +14 -11
  23. package/dist/cjs/versions.cjs +1 -1
  24. package/dist/esm/components/commerce/atomic-commerce-category-facet/atomic-commerce-category-facet.js +19 -7
  25. package/dist/esm/components/commerce/atomic-commerce-interface/atomic-commerce-interface.js +25 -4
  26. package/dist/esm/components/commerce/atomic-commerce-pager/atomic-commerce-pager.js +3 -2
  27. package/dist/esm/components/commerce/atomic-commerce-products-per-page/atomic-commerce-products-per-page.js +1 -1
  28. package/dist/esm/components/commerce/atomic-commerce-recommendation-interface/atomic-commerce-recommendation-interface.js +25 -4
  29. package/dist/esm/components/common/facets/category-facet/active-value.js +31 -0
  30. package/dist/esm/components/common/facets/category-facet/selected-value.js +30 -0
  31. package/dist/esm/components/common/facets/category-facet/value-link.js +5 -6
  32. package/dist/esm/components/common/interface/i18n.js +6 -2
  33. package/dist/esm/components/common/interface/interface-controller.js +8 -4
  34. package/dist/esm/components/common/pager/pager-fit-controller.js +34 -0
  35. package/dist/esm/components/insight/atomic-insight-pager/atomic-insight-pager.js +3 -2
  36. package/dist/esm/components/search/atomic-category-facet/atomic-category-facet.js +19 -8
  37. package/dist/esm/components/search/atomic-pager/atomic-pager.js +3 -2
  38. package/dist/esm/components/search/atomic-result-date/atomic-result-date.js +10 -15
  39. package/dist/esm/components/search/atomic-results-per-page/atomic-results-per-page.js +1 -1
  40. package/dist/esm/generated/dayjs-locales-data.js +43 -43
  41. package/dist/esm/global/environment.js +1 -1
  42. package/dist/esm/utils/dayjs-locales.js +23 -9
  43. package/dist/esm/utils/field-utils.js +5 -1
  44. package/dist/esm/utils/locale-utils.js +12 -0
  45. package/dist/esm/versions.js +1 -1
  46. package/dist/lang/cs.json +1 -1
  47. package/dist/lang/da.json +1 -1
  48. package/dist/lang/de.json +1 -1
  49. package/dist/lang/el.json +1 -1
  50. package/dist/lang/es.json +1 -1
  51. package/dist/lang/fi.json +1 -1
  52. package/dist/lang/hu.json +1 -1
  53. package/dist/lang/id.json +1 -1
  54. package/dist/lang/it.json +1 -1
  55. package/dist/lang/ja.json +1 -1
  56. package/dist/lang/ko.json +1 -1
  57. package/dist/lang/nl.json +1 -1
  58. package/dist/lang/no.json +1 -1
  59. package/dist/lang/pl.json +1 -1
  60. package/dist/lang/pt-BR.json +1 -1
  61. package/dist/lang/pt.json +1 -1
  62. package/dist/lang/ru.json +1 -1
  63. package/dist/lang/sv.json +1 -1
  64. package/dist/lang/th.json +1 -1
  65. package/dist/lang/tr.json +1 -1
  66. package/dist/lang/zh-CN.json +1 -1
  67. package/dist/lang/zh-TW.json +1 -1
  68. package/dist/lang/zh.json +1 -1
  69. package/dist/types/components/commerce/atomic-commerce-category-facet/atomic-commerce-category-facet.d.ts +7 -1
  70. package/dist/types/components/commerce/atomic-commerce-interface/atomic-commerce-interface.d.ts +17 -0
  71. package/dist/types/components/commerce/atomic-commerce-pager/atomic-commerce-pager.d.ts +1 -0
  72. package/dist/types/components/commerce/atomic-commerce-recommendation-interface/atomic-commerce-recommendation-interface.d.ts +13 -0
  73. package/dist/types/components/common/facets/category-facet/active-value.d.ts +19 -0
  74. package/dist/types/components/common/facets/category-facet/selected-value.d.ts +22 -0
  75. package/dist/types/components/common/facets/category-facet/value-link.d.ts +0 -1
  76. package/dist/types/components/common/interface/i18n.d.ts +9 -5
  77. package/dist/types/components/common/pager/pager-fit-controller.d.ts +21 -0
  78. package/dist/types/components/common/suggestions/suggestion-manager.d.ts +1 -1
  79. package/dist/types/components/common/suggestions/suggestions-types.d.ts +1 -1
  80. package/dist/types/components/insight/atomic-insight-interface/atomic-insight-interface.d.ts +4 -0
  81. package/dist/types/components/insight/atomic-insight-pager/atomic-insight-pager.d.ts +1 -0
  82. package/dist/types/components/recommendations/atomic-recs-interface/atomic-recs-interface.d.ts +4 -0
  83. package/dist/types/components/search/atomic-category-facet/atomic-category-facet.d.ts +8 -2
  84. package/dist/types/components/search/atomic-pager/atomic-pager.d.ts +1 -0
  85. package/dist/types/components/search/atomic-result-date/atomic-result-date.d.ts +3 -0
  86. package/dist/types/components/search/atomic-search-interface/atomic-search-interface.d.ts +4 -0
  87. package/dist/types/utils/dayjs-locales.d.ts +1 -1
  88. package/dist/types/utils/field-utils.d.ts +1 -1
  89. package/dist/types/utils/locale-utils.d.ts +7 -0
  90. package/package.json +4 -4
  91. package/dist/esm/components/common/facets/category-facet/parent-value-link.js +0 -9
  92. package/dist/types/components/common/facets/category-facet/parent-value-link.d.ts +0 -6
@@ -30,9 +30,13 @@ function i18nBackendOptions(atomicInterface) {
30
30
  }
31
31
  };
32
32
  }
33
- function loadTranslations(atomicInterface, language) {
33
+ async function loadTranslations(atomicInterface, language) {
34
+ const { languageUtils } = atomicInterface.i18n.services;
35
+ const languages = languageUtils.toResolveHierarchy(languageUtils.formatLanguageCode(language), false);
36
+ await Promise.all(languages.filter(isI18nLocaleAvailable).map((lng)=>loadTranslationBundle(atomicInterface, lng)));
37
+ }
38
+ function loadTranslationBundle(atomicInterface, lng) {
34
39
  const { i18n } = atomicInterface;
35
- const lng = language.split('-')[0];
36
40
  return new Promise((resolve)=>{
37
41
  new i18next_http_backend(i18n.services, i18nBackendOptions(atomicInterface)).read(lng, i18nTranslationNamespace, (_error, data)=>{
38
42
  if (data) i18n.addResourceBundle(lng, i18nTranslationNamespace, data, true, false);
@@ -21,8 +21,10 @@ class InterfaceController {
21
21
  this.host.updateIconAssetsPath();
22
22
  initEngine();
23
23
  if (this.host.registerFieldsToInclude) this.host.registerFieldsToInclude();
24
- loadDayjsLocale(this.host.language || 'en');
25
- await this.i18nPromise;
24
+ await Promise.all([
25
+ this.i18nPromise,
26
+ loadDayjsLocale(this.host.language || 'en')
27
+ ]);
26
28
  this.initComponents();
27
29
  }
28
30
  onAnalyticsChange() {
@@ -35,8 +37,10 @@ class InterfaceController {
35
37
  const language = newLanguage ?? this.host.language;
36
38
  const languageWithFallback = language ?? 'en';
37
39
  const { i18n } = this.host;
38
- loadDayjsLocale(languageWithFallback);
39
- loadTranslations(this.host, languageWithFallback).then(()=>{
40
+ Promise.all([
41
+ loadDayjsLocale(languageWithFallback),
42
+ loadTranslations(this.host, languageWithFallback)
43
+ ]).then(()=>{
40
44
  i18n.changeLanguage(language);
41
45
  });
42
46
  }
@@ -0,0 +1,34 @@
1
+ class PagerFitController {
2
+ hostConnected() {
3
+ this.resizeObserver = new ResizeObserver(()=>requestAnimationFrame(()=>this.reset()));
4
+ this.resizeObserver.observe(document.documentElement);
5
+ if (this.host.parentElement) this.resizeObserver.observe(this.host.parentElement);
6
+ }
7
+ hostDisconnected() {
8
+ this.resizeObserver?.disconnect();
9
+ }
10
+ hostUpdated() {
11
+ const root = this.host.shadowRoot;
12
+ const previousButton = root?.querySelector('[part="previous-button"]');
13
+ const nextButton = root?.querySelector('[part="next-button"]');
14
+ const pageButtonCount = root?.querySelectorAll('[part~="page-button"]').length ?? 0;
15
+ const isWrapping = !!previousButton && !!nextButton && nextButton.offsetTop > previousButton.offsetTop;
16
+ if (isWrapping && pageButtonCount > 1) {
17
+ this.maxPages = pageButtonCount - 1;
18
+ queueMicrotask(()=>this.host.requestUpdate());
19
+ }
20
+ }
21
+ getNumberOfPagesToDisplay(numberOfPages) {
22
+ return Math.min(numberOfPages, this.maxPages);
23
+ }
24
+ reset() {
25
+ this.maxPages = 1 / 0;
26
+ this.host.requestUpdate();
27
+ }
28
+ constructor(host){
29
+ this.host = host;
30
+ this.maxPages = 1 / 0;
31
+ host.addController(this);
32
+ }
33
+ }
34
+ export { PagerFitController };
@@ -6,6 +6,7 @@ import { keyed } from "lit/directives/keyed.js";
6
6
  import { when } from "lit/directives/when.js";
7
7
  import { renderPageButtons, renderPagerNextButton, renderPagerPageButton, renderPagerPreviousButton } from "../../common/pager/pager-buttons.js";
8
8
  import { renderPagerNavigation } from "../../common/pager/pager-navigation.js";
9
+ import { PagerFitController } from "../../common/pager/pager-fit-controller.js";
9
10
  import { getCurrentPagesRange } from "../../common/pager/pager-utils.js";
10
11
  import { ValidatePropsController } from "../../common/validate-props-controller/validate-props-controller.js";
11
12
  import { bindStateToController } from "../../../decorators/bind-state.js";
@@ -37,7 +38,7 @@ class AtomicInsightPager extends LitElement {
37
38
  });
38
39
  }
39
40
  render() {
40
- const pagesRange = getCurrentPagesRange(this.pagerState.currentPage - 1, this.numberOfPages, this.pagerState.maxPage);
41
+ const pagesRange = getCurrentPagesRange(this.pagerState.currentPage - 1, this.pagerFit.getNumberOfPagesToDisplay(this.numberOfPages), this.pagerState.maxPage);
41
42
  return html`${when(this.pagerState.maxPage > 1, ()=>html`
42
43
  ${renderPagerNavigation({
43
44
  props: {
@@ -106,7 +107,7 @@ class AtomicInsightPager extends LitElement {
106
107
  });
107
108
  }
108
109
  constructor(){
109
- super(), this.numberOfPages = 5, this.ariaMessage = new AriaLiveRegionController(this, 'atomic-insight-pager');
110
+ super(), this.numberOfPages = 5, this.ariaMessage = new AriaLiveRegionController(this, 'atomic-insight-pager'), this.pagerFit = new PagerFitController(this);
110
111
  new ValidatePropsController(this, ()=>({
111
112
  numberOfPages: this.numberOfPages
112
113
  }), AtomicInsightPager.propsSchema);
@@ -4,13 +4,14 @@ import { LitElement, css, html, nothing } from "lit";
4
4
  import { customElement, property, state } from "lit/decorators.js";
5
5
  import { map } from "lit/directives/map.js";
6
6
  import { when } from "lit/directives/when.js";
7
+ import { renderCategoryFacetActiveValue } from "../../common/facets/category-facet/active-value.js";
7
8
  import { renderCategoryFacetAllCategoryButton } from "../../common/facets/category-facet/all-categories-button.js";
8
9
  import { renderCategoryFacetChildrenAsTreeContainer } from "../../common/facets/category-facet/children-as-tree-container.js";
9
10
  import { renderCategoryFacetParentAsTreeContainer } from "../../common/facets/category-facet/parent-as-tree-container.js";
10
11
  import { renderCategoryFacetParentButton } from "../../common/facets/category-facet/parent-button.js";
11
- import { renderCategoryFacetParentValueLink } from "../../common/facets/category-facet/parent-value-link.js";
12
12
  import { renderCategoryFacetSearchResultsContainer } from "../../common/facets/category-facet/search-results-container.js";
13
13
  import { renderCategoryFacetSearchValue } from "../../common/facets/category-facet/search-value.js";
14
+ import { renderCategoryFacetSelectedValue } from "../../common/facets/category-facet/selected-value.js";
14
15
  import { renderCategoryFacetTreeValueContainer } from "../../common/facets/category-facet/value-as-tree-container.js";
15
16
  import { renderCategoryFacetValueLink } from "../../common/facets/category-facet/value-link.js";
16
17
  import { parseDependsOn } from "../../common/facets/depends-on.js";
@@ -168,6 +169,21 @@ class AtomicCategoryFacet extends LitElement {
168
169
  }
169
170
  });
170
171
  }
172
+ renderSelectedValue() {
173
+ const activeValue = this.facetState.selectedValueAncestry.at(-1);
174
+ if (!activeValue) return nothing;
175
+ return renderCategoryFacetSelectedValue({
176
+ props: {
177
+ displayValue: getFieldValueCaption(this.field, activeValue.value, this.bindings.i18n),
178
+ label: this.label,
179
+ i18n: this.bindings.i18n,
180
+ onClearFilters: ()=>{
181
+ this.focusTargets.activeValueFocus.focusAfterSearch();
182
+ this.facet.deselectAll();
183
+ }
184
+ }
185
+ });
186
+ }
171
187
  renderValuesTree(valuesAsTrees, isRoot) {
172
188
  if (!this.hasParents) return this.renderChildren();
173
189
  if (isRoot) return renderCategoryFacetTreeValueContainer()(html`
@@ -212,16 +228,12 @@ class AtomicCategoryFacet extends LitElement {
212
228
  const activeParent = valuesAsTrees[0];
213
229
  const activeParentDisplayValue = getFieldValueCaption(this.field, activeParent.value, this.bindings.i18n);
214
230
  return html`
215
- ${renderCategoryFacetParentValueLink({
231
+ ${renderCategoryFacetActiveValue({
216
232
  props: {
217
233
  displayValue: activeParentDisplayValue,
218
234
  numberOfResults: activeParent.numberOfResults,
219
235
  i18n: this.bindings.i18n,
220
236
  isLeafValue: activeParent.isLeafValue,
221
- onClick: ()=>{
222
- this.focusTargets.activeValueFocus.focusAfterSearch();
223
- this.facet.deselectAll();
224
- },
225
237
  searchQuery: this.facetState.facetSearch.query,
226
238
  setRef: (el)=>{
227
239
  this.focusTargets.activeValueFocus.setTarget(el);
@@ -244,7 +256,6 @@ class AtomicCategoryFacet extends LitElement {
244
256
  this.focusTargets.activeValueFocus.focusAfterSearch();
245
257
  this.facet.toggleSelect(facetValue);
246
258
  },
247
- isParent: false,
248
259
  isSelected,
249
260
  searchQuery: this.facetState.facetSearch.query,
250
261
  isLeafValue: facetValue.isLeafValue,
@@ -326,7 +337,7 @@ class AtomicCategoryFacet extends LitElement {
326
337
  return renderFacetContainer()(html`
327
338
  ${this.renderHeader()}
328
339
  ${when(!this.isCollapsed, ()=>html`
329
- ${this.renderSearchInput()}
340
+ ${this.renderSearchInput()} ${this.renderSelectedValue()}
330
341
  ${when(shouldDisplaySearchResults(facetSearch), ()=>html`
331
342
  ${when(facetSearch.values.length > 0, ()=>renderFacetValuesGroup({
332
343
  props: {
@@ -7,6 +7,7 @@ import { when } from "lit/directives/when.js";
7
7
  import { createAppLoadedListener } from "../../common/interface/store.js";
8
8
  import { renderPageButtons, renderPagerNextButton, renderPagerPageButton, renderPagerPreviousButton } from "../../common/pager/pager-buttons.js";
9
9
  import { renderPagerNavigation } from "../../common/pager/pager-navigation.js";
10
+ import { PagerFitController } from "../../common/pager/pager-fit-controller.js";
10
11
  import { getCurrentPagesRange } from "../../common/pager/pager-utils.js";
11
12
  import { ValidatePropsController } from "../../common/validate-props-controller/validate-props-controller.js";
12
13
  import { bindStateToController } from "../../../decorators/bind-state.js";
@@ -42,7 +43,7 @@ class AtomicPager extends InitializeBindingsMixin(LitElement) {
42
43
  });
43
44
  }
44
45
  render() {
45
- const pagesRange = getCurrentPagesRange(this.pagerState.currentPage - 1, this.numberOfPages, this.pagerState.maxPage - 1);
46
+ const pagesRange = getCurrentPagesRange(this.pagerState.currentPage - 1, this.pagerFit.getNumberOfPagesToDisplay(this.numberOfPages), this.pagerState.maxPage - 1);
46
47
  return html`${when(this.pagerState.maxPage > 1 && this.isAppLoaded, ()=>html` ${renderPagerNavigation({
47
48
  props: {
48
49
  i18n: this.bindings.i18n
@@ -107,7 +108,7 @@ class AtomicPager extends InitializeBindingsMixin(LitElement) {
107
108
  });
108
109
  }
109
110
  constructor(){
110
- super(), this.isAppLoaded = false, this.numberOfPages = 5, this.previousButtonIcon = arrow_left_rounded, this.nextButtonIcon = arrow_right_rounded, this.ariaMessage = new AriaLiveRegionController(this, 'atomic-pager');
111
+ super(), this.isAppLoaded = false, this.numberOfPages = 5, this.previousButtonIcon = arrow_left_rounded, this.nextButtonIcon = arrow_right_rounded, this.ariaMessage = new AriaLiveRegionController(this, 'atomic-pager'), this.pagerFit = new PagerFitController(this);
111
112
  new ValidatePropsController(this, ()=>({
112
113
  numberOfPages: this.numberOfPages
113
114
  }), AtomicPager.propsSchema);
@@ -2,7 +2,7 @@ import { Schema, StringValue } from "@coveo/bueno";
2
2
  import { ResultTemplatesHelpers } from "@coveo/headless";
3
3
  import dayjs from "dayjs";
4
4
  import calendar from "dayjs/plugin/calendar";
5
- import updateLocale from "dayjs/plugin/updateLocale";
5
+ import localizedFormat from "dayjs/plugin/localizedFormat";
6
6
  import { LitElement, html, nothing } from "lit";
7
7
  import { customElement, property, state } from "lit/decorators.js";
8
8
  import { when } from "lit/directives/when.js";
@@ -23,7 +23,7 @@ function _ts_metadata(metadataKey, metadataValue) {
23
23
  if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(metadataKey, metadataValue);
24
24
  }
25
25
  dayjs.extend(calendar);
26
- dayjs.extend(updateLocale);
26
+ dayjs.extend(localizedFormat);
27
27
  class AtomicResultDate extends LightDomMixin(LitElement) {
28
28
  initialize() {
29
29
  if (!this.result && this.resultController.item) {
@@ -51,19 +51,14 @@ class AtomicResultDate extends LightDomMixin(LitElement) {
51
51
  this.error = new Error(`Field "${this.field}" does not contain a valid date.`);
52
52
  return null;
53
53
  }
54
- if (this.relativeTime) {
55
- dayjs.updateLocale(this.bindings.interfaceElement.language, {
56
- calendar: {
57
- sameDay: this.bindings.i18n.t('calendar-same-day'),
58
- nextDay: this.bindings.i18n.t('calendar-next-day'),
59
- nextWeek: this.bindings.i18n.t('calendar-next-week'),
60
- lastDay: this.bindings.i18n.t('calendar-last-day'),
61
- lastWeek: this.bindings.i18n.t('calendar-last-week'),
62
- sameElse: this.format
63
- }
64
- });
65
- return parsedValue.calendar();
66
- }
54
+ if (this.relativeTime) return parsedValue.calendar(null, {
55
+ sameDay: this.bindings.i18n.t('calendar-same-day'),
56
+ nextDay: this.bindings.i18n.t('calendar-next-day'),
57
+ nextWeek: this.bindings.i18n.t('calendar-next-week'),
58
+ lastDay: this.bindings.i18n.t('calendar-last-day'),
59
+ lastWeek: this.bindings.i18n.t('calendar-last-week'),
60
+ sameElse: this.format
61
+ });
67
62
  return parsedValue.format(this.format);
68
63
  }
69
64
  constructor(){
@@ -57,7 +57,7 @@ class AtomicResultsPerPage extends InitializeBindingsMixin(LitElement) {
57
57
  if (!this.searchStatusState) return html``;
58
58
  return html`
59
59
  ${when(!this.searchStatusState.hasError && this.isAppLoaded && this.searchStatusState.hasResults, ()=>html`
60
- <div class="flex items-center">
60
+ <div class="flex flex-wrap items-center">
61
61
  ${renderLabel()(html`${this.label}`)}
62
62
  ${renderFieldsetGroup({
63
63
  props: {
@@ -1,20 +1,20 @@
1
1
  const locales = {
2
2
  af: ()=>import("dayjs/locale/af"),
3
3
  am: ()=>import("dayjs/locale/am"),
4
- 'ar-IQ': ()=>import("dayjs/locale/ar-iq"),
5
- 'ar-DZ': ()=>import("dayjs/locale/ar-dz"),
6
- 'ar-KW': ()=>import("dayjs/locale/ar-kw"),
7
- 'ar-LY': ()=>import("dayjs/locale/ar-ly"),
8
- 'ar-MA': ()=>import("dayjs/locale/ar-ma"),
9
- 'ar-SA': ()=>import("dayjs/locale/ar-sa"),
10
- 'ar-TN': ()=>import("dayjs/locale/ar-tn"),
4
+ 'ar-iq': ()=>import("dayjs/locale/ar-iq"),
5
+ 'ar-dz': ()=>import("dayjs/locale/ar-dz"),
6
+ 'ar-kw': ()=>import("dayjs/locale/ar-kw"),
7
+ 'ar-ly': ()=>import("dayjs/locale/ar-ly"),
8
+ 'ar-ma': ()=>import("dayjs/locale/ar-ma"),
9
+ 'ar-sa': ()=>import("dayjs/locale/ar-sa"),
10
+ 'ar-tn': ()=>import("dayjs/locale/ar-tn"),
11
11
  ar: ()=>import("dayjs/locale/ar"),
12
12
  az: ()=>import("dayjs/locale/az"),
13
13
  be: ()=>import("dayjs/locale/be"),
14
14
  bg: ()=>import("dayjs/locale/bg"),
15
15
  bi: ()=>import("dayjs/locale/bi"),
16
16
  bm: ()=>import("dayjs/locale/bm"),
17
- 'bn-BD': ()=>import("dayjs/locale/bn-bd"),
17
+ 'bn-bd': ()=>import("dayjs/locale/bn-bd"),
18
18
  bn: ()=>import("dayjs/locale/bn"),
19
19
  bo: ()=>import("dayjs/locale/bo"),
20
20
  br: ()=>import("dayjs/locale/br"),
@@ -24,49 +24,49 @@ const locales = {
24
24
  cv: ()=>import("dayjs/locale/cv"),
25
25
  cy: ()=>import("dayjs/locale/cy"),
26
26
  da: ()=>import("dayjs/locale/da"),
27
- 'de-AT': ()=>import("dayjs/locale/de-at"),
28
- 'de-CH': ()=>import("dayjs/locale/de-ch"),
27
+ 'de-at': ()=>import("dayjs/locale/de-at"),
28
+ 'de-ch': ()=>import("dayjs/locale/de-ch"),
29
29
  de: ()=>import("dayjs/locale/de"),
30
30
  dv: ()=>import("dayjs/locale/dv"),
31
- 'en-AU': ()=>import("dayjs/locale/en-au"),
31
+ 'en-au': ()=>import("dayjs/locale/en-au"),
32
32
  el: ()=>import("dayjs/locale/el"),
33
- 'en-GB': ()=>import("dayjs/locale/en-gb"),
34
- 'en-IE': ()=>import("dayjs/locale/en-ie"),
35
- 'en-IL': ()=>import("dayjs/locale/en-il"),
36
- 'en-IN': ()=>import("dayjs/locale/en-in"),
37
- 'en-NZ': ()=>import("dayjs/locale/en-nz"),
38
- 'en-SG': ()=>import("dayjs/locale/en-sg"),
39
- 'en-TT': ()=>import("dayjs/locale/en-tt"),
40
- 'en-CA': ()=>import("dayjs/locale/en-ca"),
33
+ 'en-gb': ()=>import("dayjs/locale/en-gb"),
34
+ 'en-ie': ()=>import("dayjs/locale/en-ie"),
35
+ 'en-il': ()=>import("dayjs/locale/en-il"),
36
+ 'en-in': ()=>import("dayjs/locale/en-in"),
37
+ 'en-nz': ()=>import("dayjs/locale/en-nz"),
38
+ 'en-sg': ()=>import("dayjs/locale/en-sg"),
39
+ 'en-tt': ()=>import("dayjs/locale/en-tt"),
40
+ 'en-ca': ()=>import("dayjs/locale/en-ca"),
41
41
  en: ()=>import("dayjs/locale/en"),
42
42
  eo: ()=>import("dayjs/locale/eo"),
43
- 'es-MX': ()=>import("dayjs/locale/es-mx"),
44
- 'es-PR': ()=>import("dayjs/locale/es-pr"),
45
- 'es-US': ()=>import("dayjs/locale/es-us"),
46
- 'es-DO': ()=>import("dayjs/locale/es-do"),
43
+ 'es-mx': ()=>import("dayjs/locale/es-mx"),
44
+ 'es-pr': ()=>import("dayjs/locale/es-pr"),
45
+ 'es-us': ()=>import("dayjs/locale/es-us"),
46
+ 'es-do': ()=>import("dayjs/locale/es-do"),
47
47
  et: ()=>import("dayjs/locale/et"),
48
48
  eu: ()=>import("dayjs/locale/eu"),
49
49
  fa: ()=>import("dayjs/locale/fa"),
50
50
  fi: ()=>import("dayjs/locale/fi"),
51
- 'fr-CA': ()=>import("dayjs/locale/fr-ca"),
52
- 'fr-CH': ()=>import("dayjs/locale/fr-ch"),
51
+ 'fr-ca': ()=>import("dayjs/locale/fr-ca"),
52
+ 'fr-ch': ()=>import("dayjs/locale/fr-ch"),
53
53
  fr: ()=>import("dayjs/locale/fr"),
54
54
  fo: ()=>import("dayjs/locale/fo"),
55
55
  fy: ()=>import("dayjs/locale/fy"),
56
56
  ga: ()=>import("dayjs/locale/ga"),
57
57
  gd: ()=>import("dayjs/locale/gd"),
58
58
  gl: ()=>import("dayjs/locale/gl"),
59
- 'gom-LATN': ()=>import("dayjs/locale/gom-latn"),
59
+ 'gom-latn': ()=>import("dayjs/locale/gom-latn"),
60
60
  gu: ()=>import("dayjs/locale/gu"),
61
61
  he: ()=>import("dayjs/locale/he"),
62
62
  hi: ()=>import("dayjs/locale/hi"),
63
63
  hr: ()=>import("dayjs/locale/hr"),
64
64
  ht: ()=>import("dayjs/locale/ht"),
65
65
  hu: ()=>import("dayjs/locale/hu"),
66
- 'hy-AM': ()=>import("dayjs/locale/hy-am"),
66
+ 'hy-am': ()=>import("dayjs/locale/hy-am"),
67
67
  id: ()=>import("dayjs/locale/id"),
68
68
  is: ()=>import("dayjs/locale/is"),
69
- 'it-CH': ()=>import("dayjs/locale/it-ch"),
69
+ 'it-ch': ()=>import("dayjs/locale/it-ch"),
70
70
  it: ()=>import("dayjs/locale/it"),
71
71
  jv: ()=>import("dayjs/locale/jv"),
72
72
  ka: ()=>import("dayjs/locale/ka"),
@@ -86,7 +86,7 @@ const locales = {
86
86
  ml: ()=>import("dayjs/locale/ml"),
87
87
  mn: ()=>import("dayjs/locale/mn"),
88
88
  mr: ()=>import("dayjs/locale/mr"),
89
- 'ms-MY': ()=>import("dayjs/locale/ms-my"),
89
+ 'ms-my': ()=>import("dayjs/locale/ms-my"),
90
90
  ms: ()=>import("dayjs/locale/ms"),
91
91
  mt: ()=>import("dayjs/locale/mt"),
92
92
  lo: ()=>import("dayjs/locale/lo"),
@@ -94,11 +94,11 @@ const locales = {
94
94
  nb: ()=>import("dayjs/locale/nb"),
95
95
  ne: ()=>import("dayjs/locale/ne"),
96
96
  nl: ()=>import("dayjs/locale/nl"),
97
- 'nl-BE': ()=>import("dayjs/locale/nl-be"),
97
+ 'nl-be': ()=>import("dayjs/locale/nl-be"),
98
98
  nn: ()=>import("dayjs/locale/nn"),
99
- 'pa-IN': ()=>import("dayjs/locale/pa-in"),
99
+ 'pa-in': ()=>import("dayjs/locale/pa-in"),
100
100
  pl: ()=>import("dayjs/locale/pl"),
101
- 'pt-BR': ()=>import("dayjs/locale/pt-br"),
101
+ 'pt-br': ()=>import("dayjs/locale/pt-br"),
102
102
  pt: ()=>import("dayjs/locale/pt"),
103
103
  rn: ()=>import("dayjs/locale/rn"),
104
104
  ro: ()=>import("dayjs/locale/ro"),
@@ -110,12 +110,12 @@ const locales = {
110
110
  si: ()=>import("dayjs/locale/si"),
111
111
  sk: ()=>import("dayjs/locale/sk"),
112
112
  sl: ()=>import("dayjs/locale/sl"),
113
- 'oc-LNC': ()=>import("dayjs/locale/oc-lnc"),
113
+ 'oc-lnc': ()=>import("dayjs/locale/oc-lnc"),
114
114
  sq: ()=>import("dayjs/locale/sq"),
115
- 'sr-CYRL': ()=>import("dayjs/locale/sr-cyrl"),
115
+ 'sr-cyrl': ()=>import("dayjs/locale/sr-cyrl"),
116
116
  sr: ()=>import("dayjs/locale/sr"),
117
117
  ss: ()=>import("dayjs/locale/ss"),
118
- 'sv-FI': ()=>import("dayjs/locale/sv-fi"),
118
+ 'sv-fi': ()=>import("dayjs/locale/sv-fi"),
119
119
  sv: ()=>import("dayjs/locale/sv"),
120
120
  sw: ()=>import("dayjs/locale/sw"),
121
121
  ta: ()=>import("dayjs/locale/ta"),
@@ -123,24 +123,24 @@ const locales = {
123
123
  tet: ()=>import("dayjs/locale/tet"),
124
124
  tg: ()=>import("dayjs/locale/tg"),
125
125
  th: ()=>import("dayjs/locale/th"),
126
- 'tl-PH': ()=>import("dayjs/locale/tl-ph"),
126
+ 'tl-ph': ()=>import("dayjs/locale/tl-ph"),
127
127
  tlh: ()=>import("dayjs/locale/tlh"),
128
128
  tr: ()=>import("dayjs/locale/tr"),
129
129
  tzl: ()=>import("dayjs/locale/tzl"),
130
130
  tzm: ()=>import("dayjs/locale/tzm"),
131
- 'ug-CN': ()=>import("dayjs/locale/ug-cn"),
131
+ 'ug-cn': ()=>import("dayjs/locale/ug-cn"),
132
132
  uk: ()=>import("dayjs/locale/uk"),
133
133
  tk: ()=>import("dayjs/locale/tk"),
134
134
  ur: ()=>import("dayjs/locale/ur"),
135
- 'uz-LATN': ()=>import("dayjs/locale/uz-latn"),
135
+ 'uz-latn': ()=>import("dayjs/locale/uz-latn"),
136
136
  uz: ()=>import("dayjs/locale/uz"),
137
137
  vi: ()=>import("dayjs/locale/vi"),
138
- 'x-PSEUDO': ()=>import("dayjs/locale/x-pseudo"),
139
- 'tzm-LATN': ()=>import("dayjs/locale/tzm-latn"),
138
+ 'x-pseudo': ()=>import("dayjs/locale/x-pseudo"),
139
+ 'tzm-latn': ()=>import("dayjs/locale/tzm-latn"),
140
140
  yo: ()=>import("dayjs/locale/yo"),
141
- 'zh-CN': ()=>import("dayjs/locale/zh-cn"),
142
- 'zh-HK': ()=>import("dayjs/locale/zh-hk"),
143
- 'zh-TW': ()=>import("dayjs/locale/zh-tw"),
141
+ 'zh-cn': ()=>import("dayjs/locale/zh-cn"),
142
+ 'zh-hk': ()=>import("dayjs/locale/zh-hk"),
143
+ 'zh-tw': ()=>import("dayjs/locale/zh-tw"),
144
144
  zh: ()=>import("dayjs/locale/zh")
145
145
  };
146
146
  export { locales };
@@ -3,7 +3,7 @@ function getWindow() {
3
3
  }
4
4
  function getAtomicEnvironment(headlessVersion) {
5
5
  return {
6
- version: "3.61.5",
6
+ version: "3.63.0",
7
7
  headlessVersion
8
8
  };
9
9
  }
@@ -1,20 +1,34 @@
1
1
  import dayjs from "dayjs";
2
2
  import { locales } from "../generated/dayjs-locales-data.js";
3
3
  const warn = (language)=>console.warn(`Cannot load dayjs locale file for "${language}"`);
4
- const resolveLanguage = (languageInput)=>{
5
- if (locales[languageInput]) return languageInput;
6
- if (languageInput.includes('-')) {
7
- const regionlessLanguage = languageInput.split('-')[0];
8
- if (locales[regionlessLanguage]) return regionlessLanguage;
4
+ const getCandidateLocales = (languageInput)=>{
5
+ try {
6
+ const { language, script, region } = new Intl.Locale(languageInput);
7
+ return [
8
+ languageInput,
9
+ ...region ? [
10
+ `${language}-${region}`
11
+ ] : [],
12
+ ...script ? [
13
+ `${language}-${script}`
14
+ ] : [],
15
+ language
16
+ ];
17
+ } catch {
18
+ return [
19
+ languageInput,
20
+ languageInput.split('-')[0]
21
+ ];
9
22
  }
10
- return languageInput;
11
23
  };
12
- function loadDayjsLocale(languageInput) {
24
+ const resolveLanguage = (languageInput)=>getCandidateLocales(languageInput).map((locale)=>locale.toLowerCase()).find((locale)=>Object.hasOwn(locales, locale)) ?? languageInput;
25
+ async function loadDayjsLocale(languageInput) {
13
26
  const language = resolveLanguage(languageInput);
14
27
  if (!locales[language]) return void warn(language);
15
28
  try {
16
- locales[language]().then(()=>dayjs.locale(language));
17
- } catch (_) {
29
+ await locales[language]();
30
+ dayjs.locale(language);
31
+ } catch {
18
32
  warn(language);
19
33
  }
20
34
  }
@@ -2,7 +2,11 @@ function getFieldCaptionNamespace(field) {
2
2
  return `caption-${field}`;
3
3
  }
4
4
  function getFieldCaptions(field, i18n) {
5
- return i18n.getResourceBundle(i18n.language, getFieldCaptionNamespace(field)) || {};
5
+ const namespace = getFieldCaptionNamespace(field);
6
+ return (i18n.languages ?? []).reduceRight((captions, language)=>({
7
+ ...captions,
8
+ ...i18n.getResourceBundle(language, namespace)
9
+ }), {});
6
10
  }
7
11
  function getFieldValueCaption(field, facetValue, i18n) {
8
12
  return i18n.t(facetValue, {
@@ -0,0 +1,12 @@
1
+ function withCountry(language, country) {
2
+ if (!country) return language;
3
+ try {
4
+ if (new Intl.Locale(language).region) return language;
5
+ return new Intl.Locale(language, {
6
+ region: country
7
+ }).toString();
8
+ } catch {
9
+ return language;
10
+ }
11
+ }
12
+ export { withCountry };
@@ -1,3 +1,3 @@
1
- const atomicVersion = "3.61.5";
1
+ const atomicVersion = "3.63.0";
2
2
  export { version as headlessVersion } from "@coveo/headless/package.json";
3
3
  export { atomicVersion };