@searchcraft/javascript-sdk 0.10.7 → 0.11.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 (135) hide show
  1. package/dist/components/defineCustomElements.js +4 -0
  2. package/dist/components/index.d.ts +530 -217
  3. package/dist/components/index.js +1655 -8
  4. package/dist/components/index.js.map +1 -1
  5. package/dist/components/{p-e99cd628.js → p-0c495408.js} +30 -20
  6. package/dist/components/p-0c495408.js.map +1 -0
  7. package/dist/components/{p-b4cac872.js → p-1d5c5536.js} +18 -8
  8. package/dist/components/p-1d5c5536.js.map +1 -0
  9. package/dist/components/{p-274c5cc8.js → p-3286bbb3.js} +22 -10
  10. package/dist/components/p-3286bbb3.js.map +1 -0
  11. package/dist/components/{p-ea48ccae.js → p-3e41546c.js} +17 -8
  12. package/dist/components/p-3e41546c.js.map +1 -0
  13. package/dist/components/{p-adc6236e.js → p-87435aac.js} +31 -20
  14. package/dist/components/p-87435aac.js.map +1 -0
  15. package/dist/components/p-919734fe.js +31 -0
  16. package/dist/components/p-919734fe.js.map +1 -0
  17. package/dist/components/{p-b01f8216.js → p-b13c7fbb.js} +48 -33
  18. package/dist/components/p-b13c7fbb.js.map +1 -0
  19. package/dist/components/{p-810a7850.js → p-b4b67072.js} +2 -2
  20. package/dist/components/p-b4b67072.js.map +1 -0
  21. package/dist/components/{p-acab4d41.js → p-b7e99386.js} +22 -22
  22. package/dist/components/p-b7e99386.js.map +1 -0
  23. package/dist/components/{p-4dd1995c.js → p-c9b65e8f.js} +4 -4
  24. package/dist/components/{p-4dd1995c.js.map → p-c9b65e8f.js.map} +1 -1
  25. package/dist/components/p-d54771ef.js.map +1 -1
  26. package/dist/components/{p-a64b4cba.js → p-e2a10337.js} +2 -2
  27. package/dist/components/{p-a64b4cba.js.map → p-e2a10337.js.map} +1 -1
  28. package/dist/components/p-e30203b1.js +62 -0
  29. package/dist/components/p-e30203b1.js.map +1 -0
  30. package/dist/components/{p-320e3895.js → p-fc8ccffa.js} +22 -11
  31. package/dist/components/p-fc8ccffa.js.map +1 -0
  32. package/dist/components/searchcraft-ad.js +1 -1
  33. package/dist/components/searchcraft-facet-list.js +1 -1
  34. package/dist/components/searchcraft-filter-panel.js +51 -23
  35. package/dist/components/searchcraft-filter-panel.js.map +1 -1
  36. package/dist/components/searchcraft-input-form.js +1 -1
  37. package/dist/components/searchcraft-loading.d.ts +11 -0
  38. package/dist/components/searchcraft-loading.js +8 -0
  39. package/dist/components/searchcraft-loading.js.map +1 -0
  40. package/dist/components/searchcraft-pagination.js +13 -3
  41. package/dist/components/searchcraft-pagination.js.map +1 -1
  42. package/dist/components/searchcraft-popover-button.js +21 -9
  43. package/dist/components/searchcraft-popover-button.js.map +1 -1
  44. package/dist/components/searchcraft-popover-footer.js +1 -1
  45. package/dist/components/searchcraft-popover-form.js +32 -20
  46. package/dist/components/searchcraft-popover-form.js.map +1 -1
  47. package/dist/components/searchcraft-popover-list-item.js +1 -1
  48. package/dist/components/searchcraft-popover-list-view.js +1 -1
  49. package/dist/components/searchcraft-results-info.js +15 -7
  50. package/dist/components/searchcraft-results-info.js.map +1 -1
  51. package/dist/components/searchcraft-search-result.js +1 -1
  52. package/dist/components/searchcraft-search-results-per-page.js +14 -4
  53. package/dist/components/searchcraft-search-results-per-page.js.map +1 -1
  54. package/dist/components/searchcraft-search-results.js +50 -69
  55. package/dist/components/searchcraft-search-results.js.map +1 -1
  56. package/dist/components/searchcraft-slider.js +1 -1
  57. package/dist/components/searchcraft-summary-box.d.ts +11 -0
  58. package/dist/components/searchcraft-summary-box.js +2287 -0
  59. package/dist/components/searchcraft-summary-box.js.map +1 -0
  60. package/dist/components/searchcraft-theme.js +2 -2
  61. package/dist/components/searchcraft-theme.js.map +1 -1
  62. package/dist/components/searchcraft-toggle-button.js +1 -1
  63. package/dist/hydrate/index.js +6072 -4862
  64. package/dist/hydrate/index.mjs +6072 -4862
  65. package/dist/themes/hologram.css +1 -1
  66. package/dist/themes/hologram.css.map +1 -1
  67. package/dist/types/classes/CoreInstanceRegistry.d.ts +38 -0
  68. package/dist/types/classes/Logger.d.ts +25 -0
  69. package/dist/types/classes/SearchcraftCore.d.ts +50 -0
  70. package/dist/types/classes/index.d.ts +3 -0
  71. package/dist/types/clients/MeasureClient.d.ts +27 -0
  72. package/dist/types/clients/SearchClient.d.ts +35 -0
  73. package/dist/types/clients/SummaryClient.d.ts +10 -0
  74. package/dist/types/clients/ad-clients/AdClient.d.ts +20 -0
  75. package/dist/types/clients/ad-clients/AdMarketplaceClient.d.ts +14 -0
  76. package/dist/types/clients/ad-clients/CustomAdClient.d.ts +6 -0
  77. package/dist/types/clients/ad-clients/NativoClient.d.ts +14 -0
  78. package/dist/types/clients/ad-clients/index.d.ts +5 -0
  79. package/dist/types/clients/index.d.ts +4 -0
  80. package/dist/types/components/searchcraft-ad/searchcraft-ad.d.ts +10 -3
  81. package/dist/types/components/searchcraft-facet-list/searchcraft-facet-list.d.ts +9 -2
  82. package/dist/types/components/searchcraft-filter-panel/searchcraft-filter-panel.d.ts +14 -3
  83. package/dist/types/components/searchcraft-input-form/searchcraft-input-form.d.ts +9 -6
  84. package/dist/types/components/searchcraft-loading/searchcraft-loading.d.ts +10 -0
  85. package/dist/types/components/searchcraft-pagination/searchcraft-pagination.d.ts +8 -1
  86. package/dist/types/components/searchcraft-popover-button/searchcraft-popover-button.d.ts +10 -2
  87. package/dist/types/components/searchcraft-popover-footer/searchcraft-popover-footer.d.ts +8 -1
  88. package/dist/types/components/searchcraft-popover-form/searchcraft-popover-form.d.ts +11 -3
  89. package/dist/types/components/searchcraft-popover-list-item/searchcraft-popover-list-item.d.ts +9 -1
  90. package/dist/types/components/searchcraft-popover-list-view/searchcraft-popover-list-view.d.ts +11 -3
  91. package/dist/types/components/searchcraft-results-info/searchcraft-results-info.d.ts +8 -1
  92. package/dist/types/components/searchcraft-search-result/searchcraft-search-result.d.ts +10 -1
  93. package/dist/types/components/searchcraft-search-results/searchcraft-search-results.d.ts +11 -5
  94. package/dist/types/components/searchcraft-search-results-per-page/searchcraft-search-results-per-page.d.ts +8 -1
  95. package/dist/types/components/searchcraft-summary-box/searchcraft-summary-box.d.ts +49 -0
  96. package/dist/types/components/searchcraft-toggle-button/searchcraft-toggle-button.d.ts +8 -1
  97. package/dist/types/components.d.ts +256 -6
  98. package/dist/types/index.d.ts +4 -5
  99. package/dist/types/store/SearchcraftStore.types.d.ts +14 -15
  100. package/dist/types/store/SearchcraftStoreFactory.d.ts +13 -0
  101. package/dist/types/store/index.d.ts +1 -1
  102. package/dist/types/types/core-types/AdClientResponses.types.d.ts +24 -0
  103. package/dist/types/types/core-types/Facets.types.d.ts +39 -0
  104. package/dist/types/types/core-types/Measure.types.d.ts +52 -0
  105. package/dist/types/types/core-types/SearchClient.types.d.ts +67 -0
  106. package/dist/types/types/core-types/SearchClientResponses.types.d.ts +7 -0
  107. package/dist/types/types/core-types/SearchcraftAdConfig.types.d.ts +76 -0
  108. package/dist/types/types/core-types/SearchcraftConfig.types.d.ts +65 -0
  109. package/dist/types/types/core-types/SearchcraftResponse.types.d.ts +46 -0
  110. package/dist/types/types/core-types/SubscriptionEvents.types.d.ts +51 -0
  111. package/dist/types/types/core-types/index.d.ts +10 -0
  112. package/dist/types/types/index.d.ts +3 -0
  113. package/dist/types/types/sdk-types/index.d.ts +4 -0
  114. package/dist/types/types/sdk-types/result-mappings.types.d.ts +58 -0
  115. package/dist/types/types/sdk-types/searchcraft-filter-panel.types.d.ts +44 -0
  116. package/dist/types/types/sdk-types/templates.types.d.ts +29 -0
  117. package/dist/types/utils/core-utils/index.d.ts +3 -0
  118. package/dist/types/utils/core-utils/sanitize.d.ts +2 -0
  119. package/dist/types/utils/core-utils/url.d.ts +2 -0
  120. package/dist/types/utils/facets.d.ts +1 -1
  121. package/dist/types/utils/html.d.ts +1 -1
  122. package/dist/types/utils/units.d.ts +1 -1
  123. package/package.json +5 -3
  124. package/dist/components/p-062d6b80.js +0 -1940
  125. package/dist/components/p-062d6b80.js.map +0 -1
  126. package/dist/components/p-274c5cc8.js.map +0 -1
  127. package/dist/components/p-320e3895.js.map +0 -1
  128. package/dist/components/p-810a7850.js.map +0 -1
  129. package/dist/components/p-acab4d41.js.map +0 -1
  130. package/dist/components/p-adc6236e.js.map +0 -1
  131. package/dist/components/p-b01f8216.js.map +0 -1
  132. package/dist/components/p-b4cac872.js.map +0 -1
  133. package/dist/components/p-e99cd628.js.map +0 -1
  134. package/dist/components/p-ea48ccae.js.map +0 -1
  135. package/dist/types/store/SearchcraftStore.d.ts +0 -4
@@ -1,13 +1,17 @@
1
1
  import { p as proxyCustomElement, H, h } from './p-5365011f.js';
2
- import { s as searchcraftStore } from './p-062d6b80.js';
3
- import { d as defineCustomElement$2 } from './p-adc6236e.js';
4
- import { d as defineCustomElement$1 } from './p-320e3895.js';
2
+ import { r as registry } from './p-e30203b1.js';
3
+ import { d as defineCustomElement$2 } from './p-87435aac.js';
4
+ import { d as defineCustomElement$1 } from './p-fc8ccffa.js';
5
5
 
6
6
  const SearchcraftPopoverListView = /*@__PURE__*/ proxyCustomElement(class SearchcraftPopoverListView extends H {
7
7
  constructor() {
8
8
  super();
9
9
  this.__registerHost();
10
10
  }
11
+ /**
12
+ * The id of the Searchcraft instance that this component should use.
13
+ */
14
+ searchcraftId;
11
15
  /**
12
16
  * The mappings that define how the data in the documents are mapped to the
13
17
  * list-view-item elements.
@@ -20,20 +24,30 @@ const SearchcraftPopoverListView = /*@__PURE__*/ proxyCustomElement(class Search
20
24
  adClientResponseItems;
21
25
  searchResultsPage;
22
26
  searchResultsPerPage;
23
- config = searchcraftStore.getState().core?.config;
27
+ config;
28
+ cleanupCore;
29
+ onCoreAvailable(core) {
30
+ this.config = core.config;
31
+ }
32
+ connectedCallback() {
33
+ this.cleanupCore = registry.useCoreInstance(this.searchcraftId, this.onCoreAvailable.bind(this));
34
+ }
35
+ disconnectedCallback() {
36
+ this.cleanupCore?.();
37
+ }
24
38
  renderWithADMAds() {
25
- return (h("div", { class: 'searchcraft-popover-list-view' }, this.adClientResponseItems?.map((item) => (h("searchcraft-ad", { adClientResponseItem: item, adSource: 'adMarketplace', key: item.id, renderPosition: 'top' }))), this.searchClientResponseItems?.map((item, index) => (h("searchcraft-popover-list-item", { item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index })))));
39
+ return (h("div", { class: 'searchcraft-popover-list-view' }, this.adClientResponseItems?.map((item) => (h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adClientResponseItem: item, adSource: 'adMarketplace', key: item.id, renderPosition: 'top' }))), this.searchClientResponseItems?.map((item, index) => (h("searchcraft-popover-list-item", { "searchcraft-id": this.searchcraftId, item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index })))));
26
40
  }
27
41
  renderWithCustomAds() {
28
42
  const itemsToRender = [];
29
- const interstitialInterval = this.config?.customAdInterstitialInterval || 0;
30
- const interstitialQuantity = this.config?.customAdInterstitialQuantity || 1;
31
- const adStartQuantity = this.config?.customAdStartQuantity || 0;
32
- const adEndQuantity = this.config?.customAdEndQuantity || 0;
43
+ const interstitialInterval = this.config?.customAdConfig?.adInterstitialInterval || 0;
44
+ const interstitialQuantity = this.config?.customAdConfig?.adInterstitialQuantity || 1;
45
+ const adStartQuantity = this.config?.customAdConfig?.adStartQuantity || 0;
46
+ const adEndQuantity = this.config?.customAdConfig?.adEndQuantity || 0;
33
47
  const searchItems = this.searchClientResponseItems || [];
34
48
  // Renders ads at beginning
35
49
  for (let n = 0; n < adStartQuantity; n++) {
36
- itemsToRender.push(h("searchcraft-ad", { adSource: 'Custom', key: `${n}-ad`, renderPosition: 'top' }));
50
+ itemsToRender.push(h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adSource: 'Custom', key: `${n}-ad`, renderPosition: 'top' }));
37
51
  }
38
52
  // Renders search results + interstitial ads
39
53
  searchItems.forEach((item, index) => {
@@ -42,28 +56,28 @@ const SearchcraftPopoverListView = /*@__PURE__*/ proxyCustomElement(class Search
42
56
  index + interstitialInterval < searchItems.length &&
43
57
  index >= interstitialInterval) {
44
58
  for (let n = 0; n < interstitialQuantity; n++) {
45
- itemsToRender.push(h("searchcraft-ad", { adSource: 'Custom', key: `${item.id}-ad-${n}`, renderPosition: 'interstitial' }));
59
+ itemsToRender.push(h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adSource: 'Custom', key: `${item.id}-ad-${n}`, renderPosition: 'interstitial' }));
46
60
  }
47
61
  }
48
- itemsToRender.push(h("searchcraft-popover-list-item", { item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index }));
62
+ itemsToRender.push(h("searchcraft-popover-list-item", { "searchcraft-id": this.searchcraftId, item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index }));
49
63
  });
50
64
  // Renders ads at end
51
65
  for (let n = 0; n < adEndQuantity; n++) {
52
- itemsToRender.push(h("searchcraft-ad", { adSource: 'Custom', key: `${n}-ad`, renderPosition: 'bottom' }));
66
+ itemsToRender.push(h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adSource: 'Custom', key: `${n}-ad`, renderPosition: 'bottom' }));
53
67
  }
54
68
  return h("div", { class: 'searchcraft-popover-list-view' }, itemsToRender);
55
69
  }
56
70
  renderWithNativoAds() {
57
71
  const itemsToRender = [];
58
- const interstitialStartIndex = this.config?.nativoAdInterstialStartIndex || 0;
59
- const interstitialInterval = this.config?.nativoAdInterstitialInterval || 0;
60
- const interstitialQuantity = this.config?.nativoAdInterstitialQuantity || 1;
61
- const adStartQuantity = this.config?.nativoAdStartQuantity || 0;
62
- const adEndQuantity = this.config?.nativoAdEndQuantity || 0;
72
+ const interstitialStartIndex = this.config?.nativoConfig?.adInterstialStartIndex || 0;
73
+ const interstitialInterval = this.config?.nativoConfig?.adInterstitialInterval || 0;
74
+ const interstitialQuantity = this.config?.nativoConfig?.adInterstitialQuantity || 1;
75
+ const adStartQuantity = this.config?.nativoConfig?.adStartQuantity || 0;
76
+ const adEndQuantity = this.config?.nativoConfig?.adEndQuantity || 0;
63
77
  const searchItems = this.searchClientResponseItems || [];
64
78
  // Renders ads at beginning
65
79
  for (let n = 0; n < adStartQuantity; n++) {
66
- itemsToRender.push(h("searchcraft-ad", { adSource: 'Nativo', key: `${n}-ad`, renderPosition: 'top' }));
80
+ itemsToRender.push(h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adSource: 'Nativo', key: `${n}-ad`, renderPosition: 'top' }));
67
81
  }
68
82
  // Renders search results + interstitial ads
69
83
  searchItems.forEach((item, index) => {
@@ -72,33 +86,34 @@ const SearchcraftPopoverListView = /*@__PURE__*/ proxyCustomElement(class Search
72
86
  index + interstitialInterval < searchItems.length &&
73
87
  index >= interstitialInterval) {
74
88
  for (let n = 0; n < interstitialQuantity; n++) {
75
- itemsToRender.push(h("searchcraft-ad", { adSource: 'Nativo', key: `${item.id}-ad-${n}`, renderPosition: 'interstitial' }));
89
+ itemsToRender.push(h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adSource: 'Nativo', key: `${item.id}-ad-${n}`, renderPosition: 'interstitial' }));
76
90
  }
77
91
  }
78
- itemsToRender.push(h("searchcraft-popover-list-item", { item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index }));
92
+ itemsToRender.push(h("searchcraft-popover-list-item", { "searchcraft-id": this.searchcraftId, item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index }));
79
93
  });
80
94
  // Renders ads at end
81
95
  for (let n = 0; n < adEndQuantity; n++) {
82
- itemsToRender.push(h("searchcraft-ad", { adSource: 'Nativo', key: `${n}-ad`, renderPosition: 'bottom' }));
96
+ itemsToRender.push(h("searchcraft-ad", { "searchcraft-id": this.searchcraftId, adSource: 'Nativo', key: `${n}-ad`, renderPosition: 'bottom' }));
83
97
  }
84
98
  return h("div", { class: 'searchcraft-popover-list-view' }, itemsToRender);
85
99
  }
86
100
  renderWithNoAds() {
87
- return (h("div", { class: 'searchcraft-popover-list-view' }, this.searchClientResponseItems?.map((item, index) => (h("searchcraft-popover-list-item", { item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index })))));
101
+ return (h("div", { class: 'searchcraft-popover-list-view' }, this.searchClientResponseItems?.map((item, index) => (h("searchcraft-popover-list-item", { "searchcraft-id": this.searchcraftId, item: item, key: item.id, popoverResultMappings: this.popoverResultMappings, documentPosition: this.searchResultsPerPage * (this.searchResultsPage - 1) + index })))));
88
102
  }
89
103
  render() {
90
- switch (this.config?.adSource || 'None') {
91
- case 'adMarketplace':
92
- return this.renderWithADMAds();
93
- case 'Custom':
94
- return this.renderWithCustomAds();
95
- case 'Nativo':
96
- return this.renderWithNativoAds();
97
- default:
98
- return this.renderWithNoAds();
104
+ if (this.config?.customAdConfig) {
105
+ return this.renderWithCustomAds();
106
+ }
107
+ if (this.config?.nativoConfig) {
108
+ return this.renderWithNativoAds();
109
+ }
110
+ if (this.config?.admAdConfig) {
111
+ return this.renderWithADMAds();
99
112
  }
113
+ return this.renderWithNoAds();
100
114
  }
101
115
  }, [0, "searchcraft-popover-list-view", {
116
+ "searchcraftId": [1, "searchcraft-id"],
102
117
  "popoverResultMappings": [16],
103
118
  "searchClientResponseItems": [16],
104
119
  "adClientResponseItems": [16],
@@ -131,4 +146,4 @@ function defineCustomElement() {
131
146
 
132
147
  export { SearchcraftPopoverListView as S, defineCustomElement as d };
133
148
 
134
- //# sourceMappingURL=p-b01f8216.js.map
149
+ //# sourceMappingURL=p-b13c7fbb.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-b13c7fbb.js","mappings":"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","names":[],"sources":["src/components/searchcraft-popover-list-view/searchcraft-popover-list-view.tsx"],"sourcesContent":["import type {\n AdClientResponseItem,\n SearchClientResponseItem,\n PopoverResultMappings,\n SearchcraftConfig,\n} from '@types';\nimport { Component, h, Prop, type JSX } from '@stencil/core';\nimport type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\n\n/**\n * This web component is designed to display a list of results within a popover interface.\n * It is consumed within the `searchcraft-popover-form` component.\n *\n * @js-example\n * ```html\n * <searchcraft-popover-list-view />\n * ```\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-popover-list-view',\n shadow: false,\n})\nexport class SearchcraftPopoverListView {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The mappings that define how the data in the documents are mapped to the\n * list-view-item elements.\n */\n @Prop() popoverResultMappings: PopoverResultMappings | undefined;\n /**\n * The items to render in the list view.\n */\n @Prop() searchClientResponseItems: SearchClientResponseItem[] | undefined;\n @Prop() adClientResponseItems: AdClientResponseItem[] | undefined;\n @Prop() searchResultsPage!: number;\n @Prop() searchResultsPerPage!: number;\n\n private config?: SearchcraftConfig;\n private cleanupCore?: () => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.config = core.config;\n }\n\n connectedCallback() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.cleanupCore?.();\n }\n\n renderWithADMAds() {\n return (\n <div class='searchcraft-popover-list-view'>\n {this.adClientResponseItems?.map((item) => (\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adClientResponseItem={item}\n adSource='adMarketplace'\n key={item.id}\n renderPosition='top'\n />\n ))}\n {this.searchClientResponseItems?.map((item, index) => (\n <searchcraft-popover-list-item\n searchcraft-id={this.searchcraftId}\n item={item}\n key={item.id}\n popoverResultMappings={this.popoverResultMappings}\n documentPosition={\n this.searchResultsPerPage * (this.searchResultsPage - 1) + index\n }\n />\n ))}\n </div>\n );\n }\n\n renderWithCustomAds() {\n const itemsToRender: JSX.Element[] = [];\n const interstitialInterval =\n this.config?.customAdConfig?.adInterstitialInterval || 0;\n const interstitialQuantity =\n this.config?.customAdConfig?.adInterstitialQuantity || 1;\n const adStartQuantity = this.config?.customAdConfig?.adStartQuantity || 0;\n const adEndQuantity = this.config?.customAdConfig?.adEndQuantity || 0;\n const searchItems = this.searchClientResponseItems || [];\n\n // Renders ads at beginning\n for (let n = 0; n < adStartQuantity; n++) {\n itemsToRender.push(\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adSource='Custom'\n key={`${n}-ad`}\n renderPosition='top'\n />,\n );\n }\n\n // Renders search results + interstitial ads\n searchItems.forEach((item, index) => {\n if (\n interstitialInterval &&\n index % interstitialInterval === 0 &&\n index + interstitialInterval < searchItems.length &&\n index >= interstitialInterval\n ) {\n for (let n = 0; n < interstitialQuantity; n++) {\n itemsToRender.push(\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adSource='Custom'\n key={`${item.id}-ad-${n}`}\n renderPosition='interstitial'\n />,\n );\n }\n }\n\n itemsToRender.push(\n <searchcraft-popover-list-item\n searchcraft-id={this.searchcraftId}\n item={item}\n key={item.id}\n popoverResultMappings={this.popoverResultMappings}\n documentPosition={\n this.searchResultsPerPage * (this.searchResultsPage - 1) + index\n }\n />,\n );\n });\n\n // Renders ads at end\n for (let n = 0; n < adEndQuantity; n++) {\n itemsToRender.push(\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adSource='Custom'\n key={`${n}-ad`}\n renderPosition='bottom'\n />,\n );\n }\n\n return <div class='searchcraft-popover-list-view'>{itemsToRender}</div>;\n }\n\n renderWithNativoAds() {\n const itemsToRender: JSX.Element[] = [];\n const interstitialStartIndex =\n this.config?.nativoConfig?.adInterstialStartIndex || 0;\n const interstitialInterval =\n this.config?.nativoConfig?.adInterstitialInterval || 0;\n const interstitialQuantity =\n this.config?.nativoConfig?.adInterstitialQuantity || 1;\n const adStartQuantity = this.config?.nativoConfig?.adStartQuantity || 0;\n const adEndQuantity = this.config?.nativoConfig?.adEndQuantity || 0;\n const searchItems = this.searchClientResponseItems || [];\n\n // Renders ads at beginning\n for (let n = 0; n < adStartQuantity; n++) {\n itemsToRender.push(\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adSource='Nativo'\n key={`${n}-ad`}\n renderPosition='top'\n />,\n );\n }\n\n // Renders search results + interstitial ads\n searchItems.forEach((item, index) => {\n if (\n interstitialInterval &&\n (index + interstitialStartIndex) % interstitialInterval === 0 &&\n index + interstitialInterval < searchItems.length &&\n index >= interstitialInterval\n ) {\n for (let n = 0; n < interstitialQuantity; n++) {\n itemsToRender.push(\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adSource='Nativo'\n key={`${item.id}-ad-${n}`}\n renderPosition='interstitial'\n />,\n );\n }\n }\n\n itemsToRender.push(\n <searchcraft-popover-list-item\n searchcraft-id={this.searchcraftId}\n item={item}\n key={item.id}\n popoverResultMappings={this.popoverResultMappings}\n documentPosition={\n this.searchResultsPerPage * (this.searchResultsPage - 1) + index\n }\n />,\n );\n });\n\n // Renders ads at end\n for (let n = 0; n < adEndQuantity; n++) {\n itemsToRender.push(\n <searchcraft-ad\n searchcraft-id={this.searchcraftId}\n adSource='Nativo'\n key={`${n}-ad`}\n renderPosition='bottom'\n />,\n );\n }\n\n return <div class='searchcraft-popover-list-view'>{itemsToRender}</div>;\n }\n\n renderWithNoAds() {\n return (\n <div class='searchcraft-popover-list-view'>\n {this.searchClientResponseItems?.map((item, index) => (\n <searchcraft-popover-list-item\n searchcraft-id={this.searchcraftId}\n item={item}\n key={item.id}\n popoverResultMappings={this.popoverResultMappings}\n documentPosition={\n this.searchResultsPerPage * (this.searchResultsPage - 1) + index\n }\n />\n ))}\n </div>\n );\n }\n\n render() {\n if (this.config?.customAdConfig) {\n return this.renderWithCustomAds();\n }\n if (this.config?.nativoConfig) {\n return this.renderWithNativoAds();\n }\n if (this.config?.admAdConfig) {\n return this.renderWithADMAds();\n }\n return this.renderWithNoAds();\n }\n}\n"],"version":3}
@@ -1,4 +1,4 @@
1
- import { D as DOMPurify } from './p-a64b4cba.js';
1
+ import { D as DOMPurify } from './p-e2a10337.js';
2
2
 
3
3
  /**
4
4
  * This allows you to parse a template string with a function.
@@ -14,4 +14,4 @@ const html = (strings, ...values) => {
14
14
 
15
15
  export { html as h };
16
16
 
17
- //# sourceMappingURL=p-810a7850.js.map
17
+ //# sourceMappingURL=p-b4b67072.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-b4b67072.js","mappings":";;AAGA;;;MAGa,IAAI,GAAiB,CAAC,OAAO,EAAE,GAAG,MAAM;IACnD,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM;YACJ,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KAC3E;IAED,OAAO,MAAM,IAAI,EAAE,CAAC;AACtB;;;;","names":[],"sources":["src/utils/html.ts"],"sourcesContent":["import DOMPurify from 'dompurify';\n\nimport type { TemplateHtml } from '@types';\n/**\n * This allows you to parse a template string with a function.\n */\nexport const html: TemplateHtml = (strings, ...values) => {\n let result = strings[0];\n\n for (let i = 0; i < values.length; i++) {\n result +=\n DOMPurify.sanitize(values[i] ? String(values[i]) : '') + strings[i + 1];\n }\n\n return result || '';\n};\n"],"version":3}
@@ -1,6 +1,6 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-5365011f.js';
2
2
  import { c as classNames } from './p-5cdc6210.js';
3
- import { s as searchcraftStore } from './p-062d6b80.js';
3
+ import { r as registry } from './p-e30203b1.js';
4
4
  import { d as defineCustomElement$3 } from './p-acf23bab.js';
5
5
  import { d as defineCustomElement$2 } from './p-f2585cdf.js';
6
6
  import { d as defineCustomElement$1 } from './p-1adf78b9.js';
@@ -13,6 +13,10 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
13
13
  this.inputBlur = createEvent(this, "inputBlur", 7);
14
14
  this.inputInit = createEvent(this, "inputInit", 7);
15
15
  }
16
+ /**
17
+ * The id of the Searchcraft instance that this component should use.
18
+ */
19
+ searchcraftId;
16
20
  /**
17
21
  * Whether or not to automatically submit the search term when the input changes.
18
22
  */
@@ -55,34 +59,35 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
55
59
  searchTerm = '';
56
60
  error = false;
57
61
  core;
58
- searchcraftStore = searchcraftStore.getState();
59
- unsubscribe = () => { };
62
+ unsubscribe;
63
+ cleanupCore;
60
64
  init() {
61
65
  if (this.core) {
62
- this.searchcraftStore.init(this.core);
63
66
  this.inputInit?.emit();
64
67
  }
65
68
  }
66
69
  onCoreChange() {
67
70
  this.init();
68
71
  }
69
- connectedCallback() {
72
+ onCoreAvailable(core) {
73
+ this.core = core;
70
74
  this.init();
71
- }
72
- componentDidLoad() {
73
- this.unsubscribe = searchcraftStore.subscribe((state) => {
75
+ this.unsubscribe = core.store.subscribe((state) => {
74
76
  this.searchTerm = state.searchTerm;
75
77
  this.inputValue = state.searchTerm;
76
78
  });
77
79
  }
80
+ connectedCallback() {
81
+ this.cleanupCore = registry.useCoreInstance(this.searchcraftId, this.onCoreAvailable.bind(this));
82
+ }
78
83
  disconnectedCallback() {
79
- this.handleReset();
80
84
  this.unsubscribe?.();
85
+ this.cleanupCore?.();
81
86
  }
82
87
  handleInput = (event) => {
83
88
  const input = event.target;
84
89
  this.inputValue = input.value;
85
- this.searchcraftStore.setSearchTerm(input.value);
90
+ this.core?.store.getState().setSearchTerm(input.value);
86
91
  if (!this.autoSearch) {
87
92
  return;
88
93
  }
@@ -91,20 +96,15 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
91
96
  performSearch = async () => {
92
97
  this.error = false;
93
98
  try {
94
- await this.searchcraftStore.search();
99
+ await this.core?.store.getState().search();
95
100
  }
96
101
  catch (error) {
97
102
  this.error = true;
98
103
  }
99
104
  };
100
- handleReset = () => {
101
- this.searchcraftStore.setSearchResultsCount(0);
102
- this.searchcraftStore.setSearchTerm('');
103
- this.searchcraftStore.setSearchClientResponseItems([]);
104
- this.error = false;
105
- };
106
105
  handleClearInput = () => {
107
- this.handleReset();
106
+ this.core?.store.getState().resetSearchValues();
107
+ this.error = false;
108
108
  };
109
109
  handleFormSubmit = async (event) => {
110
110
  event.preventDefault();
@@ -121,23 +121,23 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
121
121
  const inputGridStyles = {
122
122
  gap: shouldHaveVerticalGap ? '4px 8px' : '0px 8px',
123
123
  };
124
- return (h("form", { key: 'd0654def009278279b7edeeccc6044d999c0d5b0', class: 'searchcraft-input-form', onSubmit: this.handleFormSubmit }, h("div", { key: '27978b08e46e0f8ecdf6dc95a74c962d85f5e9ff', class: inputGridClassNames, style: inputGridStyles }, h("div", { key: '1f7cecc80a84bfc46c994971cd751d2b65af6d83', class: 'searchcraft-input-form-button' }, h("searchcraft-button", { key: 'b3f2078604c380eef895be103b2bdf5cef6bca84', onButtonClick: this.handleFormSubmit, label: this.buttonLabel })), this.inputLabel && (h("div", { key: 'b33c0d3cbb3512964c3a47a2c354a610fa6faa09', class: 'searchcraft-input-form-label' }, h("searchcraft-input-label", { key: 'e620088318c82e2e70d885bd3ee2c88ef8118e7c', label: this.inputLabel }))), this.error && (h("div", { key: 'c3a20576917aaa33cc12df5ee5b479f87d628de7', class: 'searchcraft-input-form-error-message' }, h("searchcraft-error-message", { key: 'f48e54a236b7a33fa55bab7f29d3b321be0bbb77' }, "Something went wrong."))), h("div", { key: 'ebda089a3b8698892fd6cebcbaf89582a1bb21a2', class: 'searchcraft-input-form-input-wrapper' }, h("input", { key: 'd7ea7b49f7d65067924168fc281033841a71d419', autoComplete: 'off', class: classNames('searchcraft-input-form-input', {
124
+ return (h("form", { key: 'c1eea324038f640a9075d5714378d5c4b97168e0', class: 'searchcraft-input-form', onSubmit: this.handleFormSubmit }, h("div", { key: 'f157c00510e5c3e75dd703996be24de5e97bbcd9', class: inputGridClassNames, style: inputGridStyles }, h("div", { key: 'c97f3e5ef9ed6aee103dedc76b3ee1620b69ebba', class: 'searchcraft-input-form-button' }, h("searchcraft-button", { key: '4bb5dfea8b9f8f2f0a7e5fc5c1b199ef9d209278', onButtonClick: this.handleFormSubmit, label: this.buttonLabel })), this.inputLabel && (h("div", { key: 'aa8beca21ce414d645687ee73b7ca29c740438a2', class: 'searchcraft-input-form-label' }, h("searchcraft-input-label", { key: '8c15364abcf2e43354b445be6c7ceb9387ea4a67', label: this.inputLabel }))), this.error && (h("div", { key: '5987b6da22a25da50613ceb277bfe44b31ba8f37', class: 'searchcraft-input-form-error-message' }, h("searchcraft-error-message", { key: 'f2a230f0cf3cf0bbaddbb37ef2f38afdf73b28f6' }, "Something went wrong."))), h("div", { key: 'a0862217135ac6f9a96d9e64e6fca5f772eb8f51', class: 'searchcraft-input-form-input-wrapper' }, h("input", { key: '7071be386f0c73a0230e0815640b134ee5139262', autoComplete: 'off', class: classNames('searchcraft-input-form-input', {
125
125
  'searchcraft-placeholder-hide-on-focus': this.placeholderBehavior === 'hide-on-focus',
126
126
  }), onFocus: () => this.inputFocus?.emit(), onBlur: () => this.inputBlur?.emit(), onInput: (event) => {
127
127
  this.handleInput(event);
128
- }, placeholder: this.placeholderValue, type: 'text', value: this.inputValue }), h("div", { key: '6dd4a02322072467a104938a47626592658eaa1e', class: 'searchcraft-input-form-input-icon' }, h("svg", { key: '26a4deabe9149db6db219e49fcccbbe7688e9f0a', class: 'searchcraft-input-form-input-search-icon', viewBox: '0 0 20 20', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'searchcraft-title' }, h("title", { key: 'eff07788d2edaead45a60d8ac20e5d1d694c5165' }, "Search icon"), h("path", { key: '9083cf32c8f749210232b51b1f5934a3c32b109f', d: 'M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))), isShowingClearButton && (h("button", { key: '0b2117ae2510fe743b11d8e638e981ee0f7e4760', type: 'button', class: 'searchcraft-input-form-clear-button', onClick: this.handleClearInput }, h("svg", { key: '3fbb57c1b6486638286e1010639751a83a75f489', class: 'searchcraft-input-form-clear-icon', viewBox: '0 0 22 22', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'icon-title' }, h("title", { key: '84ce771c55c072b4339babb136639469b68a1f9b' }, "Clear icon"), h("path", { key: '811f5fc9cc708f80004f1cf50ddcd85de05f3b6b', d: 'M14 8L8 14M8 8L14 14M21 11C21 16.5228 16.5228 21 11 21C5.47715 21 1 16.5228 1 11C1 5.47715 5.47715 1 11 1C16.5228 1 21 5.47715 21 11Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))))))));
128
+ }, placeholder: this.placeholderValue, type: 'text', value: this.inputValue }), h("div", { key: '178a7a21a84f012662312dc2b9145fff0aec6a44', class: 'searchcraft-input-form-input-icon' }, h("svg", { key: '7fb86586c155f7075fb65280482eb2ab5ff8a9db', class: 'searchcraft-input-form-input-search-icon', viewBox: '0 0 20 20', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'searchcraft-title' }, h("title", { key: '0a48667010f2c998917271f941877c5ec826329f' }, "Search icon"), h("path", { key: '94c54dfa1406bdc6c2f87f3b31e1b01862b58e08', d: 'M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))), isShowingClearButton && (h("button", { key: '931fc5e8842de1e8f3bab3fa163261c54c24148c', type: 'button', class: 'searchcraft-input-form-clear-button', onClick: this.handleClearInput }, h("svg", { key: '0676b050222eb9a7bf2f7c7c112ae40c0644ecf7', class: 'searchcraft-input-form-clear-icon', viewBox: '0 0 22 22', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'icon-title' }, h("title", { key: '002b23596bc977b5a942776e4f7b513db4584361' }, "Clear icon"), h("path", { key: '05346b8f1ede39b9e1924760f400df10d8b0aa49', d: 'M14 8L8 14M8 8L14 14M21 11C21 16.5228 16.5228 21 11 21C5.47715 21 1 16.5228 1 11C1 5.47715 5.47715 1 11 1C16.5228 1 21 5.47715 21 11Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))))))));
129
129
  }
130
130
  static get watchers() { return {
131
131
  "core": ["onCoreChange"]
132
132
  }; }
133
133
  }, [0, "searchcraft-input-form", {
134
+ "searchcraftId": [1, "searchcraft-id"],
134
135
  "autoSearch": [4, "auto-search"],
135
136
  "buttonPlacement": [1, "button-placement"],
136
137
  "buttonLabel": [1, "button-label"],
137
138
  "inputLabel": [1, "input-label"],
138
139
  "placeholderValue": [1, "placeholder-value"],
139
140
  "placeholderBehavior": [1, "placeholder-behavior"],
140
- "core": [16],
141
141
  "inputValue": [32],
142
142
  "searchTerm": [32],
143
143
  "error": [32]
@@ -175,4 +175,4 @@ function defineCustomElement() {
175
175
 
176
176
  export { SearchcraftInputForm as S, defineCustomElement as d };
177
177
 
178
- //# sourceMappingURL=p-acab4d41.js.map
178
+ //# sourceMappingURL=p-b7e99386.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-b7e99386.js","mappings":"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","names":[],"sources":["src/components/searchcraft-input-form/searchcraft-input-form.tsx"],"sourcesContent":["import {\n Component,\n h,\n Prop,\n State,\n Event,\n type EventEmitter,\n Watch,\n} from '@stencil/core';\nimport classNames from 'classnames';\n\nimport type { SearchcraftCore } from '@classes';\nimport type { SearchcraftState } from '@store';\nimport { registry } from '@classes/CoreInstanceRegistry';\n\n/**\n * This web component provides a user-friendly interface for querying an indexed dataset, enabling users to easily search large collections of data.\n * It abstracts the complexities of index-based searching, making it accessible to users of all technical levels.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftInputForm } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftInputForm } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <searchcraft-input-form auto-search />\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftInputForm autoSearch />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftInputForm autoSearch />\n * ```\n */\n@Component({\n tag: 'searchcraft-input-form',\n shadow: false,\n})\nexport class SearchcraftInputForm {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * Whether or not to automatically submit the search term when the input changes.\n */\n @Prop() autoSearch?: boolean = true;\n /**\n * Where to place the search button.\n */\n @Prop() buttonPlacement?: 'left' | 'right' | 'none' = 'none';\n /**\n * The label for the submit button.\n */\n @Prop() buttonLabel?: string;\n /**\n * The label rendered above the input.\n */\n @Prop() inputLabel?: string;\n /**\n * The input element's placeholder value.\n */\n @Prop() placeholderValue?: string = 'Enter Search';\n /**\n * The placeholder's render behavior.\n * 'hide-on-focus' - Hide the placeholder text immediately when the input form gains focus.\n * 'hide-on-text-entered' - Only hide the placeholder when the input form has text entered into it.\n */\n @Prop() placeholderBehavior?: 'hide-on-focus' | 'hide-on-text-entered';\n /**\n * When the input becomes focused.\n */\n @Event() inputFocus?: EventEmitter<void>;\n /**\n * When the input becomes unfocused.\n */\n @Event() inputBlur?: EventEmitter<void>;\n /**\n * Event emitted when input initializes.\n */\n @Event() inputInit?: EventEmitter<void>;\n\n @State() inputValue = '';\n @State() searchTerm = '';\n @State() error = false;\n\n private core?: SearchcraftCore;\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n\n init() {\n if (this.core) {\n this.inputInit?.emit();\n }\n }\n\n @Watch('core')\n onCoreChange() {\n this.init();\n }\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n this.init();\n this.unsubscribe = core.store.subscribe((state: SearchcraftState) => {\n this.searchTerm = state.searchTerm;\n this.inputValue = state.searchTerm;\n });\n }\n\n connectedCallback() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\n }\n\n handleInput = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.inputValue = input.value;\n this.core?.store.getState().setSearchTerm(input.value);\n\n if (!this.autoSearch) {\n return;\n }\n\n this.performSearch();\n };\n\n private performSearch = async () => {\n this.error = false;\n\n try {\n await this.core?.store.getState().search();\n } catch (error) {\n this.error = true;\n }\n };\n\n handleClearInput = () => {\n this.core?.store.getState().resetSearchValues();\n this.error = false;\n };\n\n handleFormSubmit = async (event: Event) => {\n event.preventDefault();\n await this.performSearch();\n };\n\n render() {\n const isShowingClearButton = this.inputValue.length > 0;\n const inputGridClassNames = classNames('searchcraft-input-form-grid', {\n 'searchcraft-input-form-grid-button-left':\n this.buttonPlacement === 'left',\n 'searchcraft-input-form-grid-button-right':\n this.buttonPlacement === 'right',\n 'searchcraft-input-form-grid-button-none':\n this.buttonPlacement === 'none',\n });\n const shouldHaveVerticalGap = this.inputLabel || this.error;\n const inputGridStyles = {\n gap: shouldHaveVerticalGap ? '4px 8px' : '0px 8px',\n };\n return (\n <form class='searchcraft-input-form' onSubmit={this.handleFormSubmit}>\n <div class={inputGridClassNames} style={inputGridStyles}>\n <div class='searchcraft-input-form-button'>\n <searchcraft-button\n onButtonClick={this.handleFormSubmit}\n label={this.buttonLabel}\n />\n </div>\n {this.inputLabel && (\n <div class='searchcraft-input-form-label'>\n <searchcraft-input-label label={this.inputLabel} />\n </div>\n )}\n {this.error && (\n <div class='searchcraft-input-form-error-message'>\n <searchcraft-error-message>\n Something went wrong.\n </searchcraft-error-message>\n </div>\n )}\n <div class='searchcraft-input-form-input-wrapper'>\n <input\n autoComplete='off'\n class={classNames('searchcraft-input-form-input', {\n 'searchcraft-placeholder-hide-on-focus':\n this.placeholderBehavior === 'hide-on-focus',\n })}\n onFocus={() => this.inputFocus?.emit()}\n onBlur={() => this.inputBlur?.emit()}\n onInput={(event) => {\n this.handleInput(event);\n }}\n placeholder={this.placeholderValue}\n type='text'\n value={this.inputValue}\n />\n <div class='searchcraft-input-form-input-icon'>\n <svg\n class='searchcraft-input-form-input-search-icon'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-labelledby='searchcraft-title'\n >\n <title>Search icon</title>\n <path\n d='M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n {isShowingClearButton && (\n <button\n type='button'\n class='searchcraft-input-form-clear-button'\n onClick={this.handleClearInput}\n >\n <svg\n class='searchcraft-input-form-clear-icon'\n viewBox='0 0 22 22'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-labelledby='icon-title'\n >\n <title>Clear icon</title>\n <path\n d='M14 8L8 14M8 8L14 14M21 11C21 16.5228 16.5228 21 11 21C5.47715 21 1 16.5228 1 11C1 5.47715 5.47715 1 11 1C16.5228 1 21 5.47715 21 11Z'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n </form>\n );\n }\n}\n"],"version":3}
@@ -1,6 +1,6 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-5365011f.js';
2
2
  import { a as getDifferenceInUnits, b as getStartOf, c as getFormattedDateString } from './p-d54771ef.js';
3
- import './p-a64b4cba.js';
3
+ import './p-e2a10337.js';
4
4
  import { c as classNames } from './p-5cdc6210.js';
5
5
 
6
6
  /**
@@ -157,10 +157,10 @@ const SearchcraftSlider = /*@__PURE__*/ proxyCustomElement(class SearchcraftSlid
157
157
  100;
158
158
  const startLabel = this.getLabel(this.startValue);
159
159
  const endLabel = this.getLabel(this.endValue);
160
- return (h("div", { key: '3b2e8576d64826f123d40deff3b0df9316649a03', class: 'searchcraft-slider' }, h("div", { key: 'ecaa546b96855aad4e839c5e34e995da0925e0b6', class: 'searchcraft-slider-range' }, h("div", { key: 'f37fc0329249857a29f77d9e3739d10f05f6bf62', class: 'searchcraft-slider-active-range', style: {
160
+ return (h("div", { key: '2c72254f52151edd2e2fa89c092fc788db0b5562', class: 'searchcraft-slider' }, h("div", { key: '98c25badf2c9386d7173ea552e510dcc168e7fc7', class: 'searchcraft-slider-range' }, h("div", { key: '50774db2253e34b1bce68acc0a40b2706cab542d', class: 'searchcraft-slider-active-range', style: {
161
161
  left: `${startPercent}%`,
162
162
  width: `${endPercent - startPercent}%`,
163
- } }), h("input", { key: '7b5e6f3983b7c109ea0a3f2b248c35d0e225400b', class: classNames('searchcraft-slider-input', 'searchcraft-slider-input-min-handle'), max: this.upperBound, min: this.lowerBound, onInput: this.handleStartValueChange.bind(this), step: this.step, style: { zIndex: this.lastFocusedHandle === 'min' ? '2' : '1' }, type: 'range', value: this.startValue }), h("input", { key: 'b5bb628b73c8b582a31453e73cb3ef38579eeea5', class: classNames('searchcraft-slider-input', 'searchcraft-slider-input-max-handle'), max: this.upperBound, min: this.lowerBound, onInput: this.handleEndValueChange.bind(this), step: this.step, style: { zIndex: this.lastFocusedHandle === 'max' ? '2' : '1' }, type: 'range', value: this.endValue })), h("div", { key: 'ecb379babd244e3205f30d45628506566fbeff3c', class: 'searchcraft-slider-label' }, h("span", { key: '2be886d05c323f7da1059be88c0cb8ede2e1e98b', class: 'searchcraft-slider-start-label' }, startLabel), h("span", { key: 'bf66fcab3fae565980a4637cb13b14589ffcb5ba', class: 'searchcraft-slider-end-label' }, endLabel))));
163
+ } }), h("input", { key: '229afedc1318a63cbd75806805210cf4f5695e6e', class: classNames('searchcraft-slider-input', 'searchcraft-slider-input-min-handle'), max: this.upperBound, min: this.lowerBound, onInput: this.handleStartValueChange.bind(this), step: this.step, style: { zIndex: this.lastFocusedHandle === 'min' ? '2' : '1' }, type: 'range', value: this.startValue }), h("input", { key: '6aa038b01daaba86f501ebbbec30fc6720b549b3', class: classNames('searchcraft-slider-input', 'searchcraft-slider-input-max-handle'), max: this.upperBound, min: this.lowerBound, onInput: this.handleEndValueChange.bind(this), step: this.step, style: { zIndex: this.lastFocusedHandle === 'max' ? '2' : '1' }, type: 'range', value: this.endValue })), h("div", { key: 'f70501538635c3b08ad1e6ac101d0b3192ef8e04', class: 'searchcraft-slider-label' }, h("span", { key: 'ddd539b86774f8900771d77d5ef7eb3a67c98d59', class: 'searchcraft-slider-start-label' }, startLabel), h("span", { key: 'b754a9c8d284e0623032cee6b92f9df88873ec04', class: 'searchcraft-slider-end-label' }, endLabel))));
164
164
  }
165
165
  }, [0, "searchcraft-slider", {
166
166
  "max": [2],
@@ -190,4 +190,4 @@ function defineCustomElement() {
190
190
 
191
191
  export { SearchcraftSlider as S, defineCustomElement as d };
192
192
 
193
- //# sourceMappingURL=p-4dd1995c.js.map
193
+ //# sourceMappingURL=p-c9b65e8f.js.map
@@ -1 +1 @@
1
- {"file":"p-4dd1995c.js","mappings":"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","names":[],"sources":["src/utils/throttle.ts","src/components/searchcraft-slider/searchcraft-slider.tsx"],"sourcesContent":["/**\n * Creates a throttled version of the given function that only invokes\n * the original function at most once every specified number of milliseconds.\n *\n * The logic is written in a way that the last invocation is always called, after the\n * throttle cooldown period has ended.\n *\n * @template Arguments - The argument types for the function to throttle\n * @param callback - The function to throttle\n * @param delayInMilliseconds - The number of milliseconds to wait before allowing the next invocation\n * @returns A throttled version of the original function\n */\nexport function throttle<\n // biome-ignore lint/suspicious/noExplicitAny: To be an effective util, this needs to be flexibile enough allow any type of arguments.\n Arguments extends any[],\n>(\n callback: (...args: Arguments) => void,\n delayInMilliseconds: number,\n): (...args: Arguments) => void {\n let isThrottleOnCooldown = false;\n let trailingCallArgs: Arguments | null = null;\n\n const invokeAction = (args: Arguments) => {\n callback(...args);\n isThrottleOnCooldown = true;\n setTimeout(() => {\n isThrottleOnCooldown = false;\n if (trailingCallArgs) {\n const nextArgs = trailingCallArgs;\n trailingCallArgs = null;\n invokeAction(nextArgs);\n }\n }, delayInMilliseconds);\n };\n\n return (...args: Arguments) => {\n if (!isThrottleOnCooldown) {\n invokeAction(args);\n } else {\n trailingCallArgs = args;\n }\n };\n}\n","import {\n Component,\n Event,\n type EventEmitter,\n h,\n State,\n Prop,\n} from '@stencil/core';\nimport {\n getDifferenceInUnits,\n getFormattedDateString,\n getStartOf,\n} from '@utils';\nimport { throttle } from '@utils/throttle';\nimport classNames from 'classnames';\n\n/**\n * This web component is designed to allow users to select a value from a range defined by a minimum and maximum value. The component renders a slider interface, which can be used to visually choose a value between two boundaries.\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-slider',\n shadow: false,\n})\nexport class SearchcraftSlider {\n /**\n * The maximum value allowed.\n */\n @Prop() max = 100;\n /**\n * The minimum value allowed.\n */\n @Prop() min = 0;\n /**\n * The step amount for the slider inputs.\n */\n @Prop() step = 1;\n /** The type of data the sliders are using. */\n @Prop() dataType: 'number' | 'date' = 'number';\n /** The date granularity to use. Used to format date labels. */\n @Prop() dateGranularity?: 'year' | 'month' | 'day' | 'hour';\n\n @State() lowerBound = 0;\n @State() upperBound = 1;\n @State() endValue = 0;\n @State() startValue = 0;\n @State() lastFocusedHandle: 'min' | 'max' = 'max';\n\n throttledEmitUpdate: () => void = () => {};\n\n /**\n * When the range has changed.\n * */\n @Event() rangeChanged:\n | EventEmitter<{ startValue: number; endValue: number }>\n | undefined;\n\n connectedCallback() {\n switch (this.dataType) {\n case 'number':\n this.startValue = this.min;\n this.endValue = this.max;\n this.lowerBound = this.min;\n this.upperBound = this.max;\n break;\n case 'date': {\n this.startValue = 0;\n this.endValue = getDifferenceInUnits(\n this.dateGranularity || 'year',\n this.min,\n this.max,\n );\n this.lowerBound = 0;\n this.upperBound = this.endValue;\n\n break;\n }\n }\n\n this.throttledEmitUpdate = throttle(this.emitUpdate, 120);\n }\n\n private emitUpdate = async () => {\n switch (this.dataType) {\n case 'number':\n this.rangeChanged?.emit({\n startValue: this.startValue,\n endValue: this.endValue,\n });\n break;\n case 'date': {\n const granularity = this.dateGranularity || 'year';\n const startTimestamp = getStartOf(\n this.min,\n granularity,\n this.lowerBound + this.startValue,\n );\n const endTimestamp = getStartOf(\n this.min,\n granularity,\n this.lowerBound + this.endValue + 1,\n );\n this.rangeChanged?.emit({\n startValue: startTimestamp,\n endValue: endTimestamp,\n });\n break;\n }\n }\n };\n\n private handleStartValueChange = (event: InputEvent) => {\n const inputElement = event.target as HTMLInputElement;\n const value = Number.parseInt(inputElement.value, 10);\n this.lastFocusedHandle = 'min';\n\n if (value <= this.endValue) {\n this.startValue = value;\n this.throttledEmitUpdate();\n } else {\n this.startValue = this.endValue;\n inputElement.value = `${this.endValue}`;\n }\n };\n\n private handleEndValueChange = (event: InputEvent) => {\n const inputElement = event.target as HTMLInputElement;\n const value = Number.parseInt(inputElement.value, 10);\n this.lastFocusedHandle = 'max';\n\n if (value >= this.startValue) {\n this.endValue = value;\n this.throttledEmitUpdate();\n } else {\n this.endValue = this.startValue;\n inputElement.value = `${this.startValue}`;\n }\n };\n\n private getLabel = (value): string => {\n switch (this.dataType) {\n case 'number':\n return `${this.startValue}`;\n case 'date': {\n const granularity = this.dateGranularity || 'year';\n const dateOffset = this.lowerBound + value;\n const timestamp = getStartOf(this.min, granularity, dateOffset);\n\n return getFormattedDateString(\n this.dateGranularity || 'year',\n new Date(timestamp),\n );\n }\n }\n };\n\n render() {\n const startPercent =\n ((this.startValue - this.lowerBound) /\n (this.upperBound - this.lowerBound)) *\n 100;\n const endPercent =\n ((this.endValue - this.lowerBound) /\n (this.upperBound - this.lowerBound)) *\n 100;\n\n const startLabel = this.getLabel(this.startValue);\n const endLabel = this.getLabel(this.endValue);\n\n return (\n <div class='searchcraft-slider'>\n <div class='searchcraft-slider-range'>\n <div\n class='searchcraft-slider-active-range'\n style={{\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n }}\n />\n <input\n class={classNames(\n 'searchcraft-slider-input',\n 'searchcraft-slider-input-min-handle',\n )}\n max={this.upperBound}\n min={this.lowerBound}\n onInput={this.handleStartValueChange.bind(this)}\n step={this.step}\n style={{ zIndex: this.lastFocusedHandle === 'min' ? '2' : '1' }}\n type='range'\n value={this.startValue}\n />\n <input\n class={classNames(\n 'searchcraft-slider-input',\n 'searchcraft-slider-input-max-handle',\n )}\n max={this.upperBound}\n min={this.lowerBound}\n onInput={this.handleEndValueChange.bind(this)}\n step={this.step}\n style={{ zIndex: this.lastFocusedHandle === 'max' ? '2' : '1' }}\n type='range'\n value={this.endValue}\n />\n </div>\n <div class='searchcraft-slider-label'>\n <span class='searchcraft-slider-start-label'>{startLabel}</span>\n <span class='searchcraft-slider-end-label'>{endLabel}</span>\n </div>\n </div>\n );\n }\n}\n"],"version":3}
1
+ {"file":"p-c9b65e8f.js","mappings":"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","names":[],"sources":["src/utils/throttle.ts","src/components/searchcraft-slider/searchcraft-slider.tsx"],"sourcesContent":["/**\n * Creates a throttled version of the given function that only invokes\n * the original function at most once every specified number of milliseconds.\n *\n * The logic is written in a way that the last invocation is always called, after the\n * throttle cooldown period has ended.\n *\n * @template Arguments - The argument types for the function to throttle\n * @param callback - The function to throttle\n * @param delayInMilliseconds - The number of milliseconds to wait before allowing the next invocation\n * @returns A throttled version of the original function\n */\nexport function throttle<\n // biome-ignore lint/suspicious/noExplicitAny: To be an effective util, this needs to be flexibile enough allow any type of arguments.\n Arguments extends any[],\n>(\n callback: (...args: Arguments) => void,\n delayInMilliseconds: number,\n): (...args: Arguments) => void {\n let isThrottleOnCooldown = false;\n let trailingCallArgs: Arguments | null = null;\n\n const invokeAction = (args: Arguments) => {\n callback(...args);\n isThrottleOnCooldown = true;\n setTimeout(() => {\n isThrottleOnCooldown = false;\n if (trailingCallArgs) {\n const nextArgs = trailingCallArgs;\n trailingCallArgs = null;\n invokeAction(nextArgs);\n }\n }, delayInMilliseconds);\n };\n\n return (...args: Arguments) => {\n if (!isThrottleOnCooldown) {\n invokeAction(args);\n } else {\n trailingCallArgs = args;\n }\n };\n}\n","import {\n Component,\n Event,\n type EventEmitter,\n h,\n State,\n Prop,\n} from '@stencil/core';\nimport {\n getDifferenceInUnits,\n getFormattedDateString,\n getStartOf,\n} from '@utils';\nimport { throttle } from '@utils/throttle';\nimport classNames from 'classnames';\n\n/**\n * This web component is designed to allow users to select a value from a range defined by a minimum and maximum value. The component renders a slider interface, which can be used to visually choose a value between two boundaries.\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-slider',\n shadow: false,\n})\nexport class SearchcraftSlider {\n /**\n * The maximum value allowed.\n */\n @Prop() max = 100;\n /**\n * The minimum value allowed.\n */\n @Prop() min = 0;\n /**\n * The step amount for the slider inputs.\n */\n @Prop() step = 1;\n /** The type of data the sliders are using. */\n @Prop() dataType: 'number' | 'date' = 'number';\n /** The date granularity to use. Used to format date labels. */\n @Prop() dateGranularity?: 'year' | 'month' | 'day' | 'hour';\n\n @State() lowerBound = 0;\n @State() upperBound = 1;\n @State() endValue = 0;\n @State() startValue = 0;\n @State() lastFocusedHandle: 'min' | 'max' = 'max';\n\n throttledEmitUpdate: () => void = () => {};\n\n /**\n * When the range has changed.\n * */\n @Event() rangeChanged:\n | EventEmitter<{ startValue: number; endValue: number }>\n | undefined;\n\n connectedCallback() {\n switch (this.dataType) {\n case 'number':\n this.startValue = this.min;\n this.endValue = this.max;\n this.lowerBound = this.min;\n this.upperBound = this.max;\n break;\n case 'date': {\n this.startValue = 0;\n this.endValue = getDifferenceInUnits(\n this.dateGranularity || 'year',\n this.min,\n this.max,\n );\n this.lowerBound = 0;\n this.upperBound = this.endValue;\n\n break;\n }\n }\n\n this.throttledEmitUpdate = throttle(this.emitUpdate, 120);\n }\n\n private emitUpdate = async () => {\n switch (this.dataType) {\n case 'number':\n this.rangeChanged?.emit({\n startValue: this.startValue,\n endValue: this.endValue,\n });\n break;\n case 'date': {\n const granularity = this.dateGranularity || 'year';\n const startTimestamp = getStartOf(\n this.min,\n granularity,\n this.lowerBound + this.startValue,\n );\n const endTimestamp = getStartOf(\n this.min,\n granularity,\n this.lowerBound + this.endValue + 1,\n );\n this.rangeChanged?.emit({\n startValue: startTimestamp,\n endValue: endTimestamp,\n });\n break;\n }\n }\n };\n\n private handleStartValueChange = (event: InputEvent) => {\n const inputElement = event.target as HTMLInputElement;\n const value = Number.parseInt(inputElement.value, 10);\n this.lastFocusedHandle = 'min';\n\n if (value <= this.endValue) {\n this.startValue = value;\n this.throttledEmitUpdate();\n } else {\n this.startValue = this.endValue;\n inputElement.value = `${this.endValue}`;\n }\n };\n\n private handleEndValueChange = (event: InputEvent) => {\n const inputElement = event.target as HTMLInputElement;\n const value = Number.parseInt(inputElement.value, 10);\n this.lastFocusedHandle = 'max';\n\n if (value >= this.startValue) {\n this.endValue = value;\n this.throttledEmitUpdate();\n } else {\n this.endValue = this.startValue;\n inputElement.value = `${this.startValue}`;\n }\n };\n\n private getLabel = (value): string => {\n switch (this.dataType) {\n case 'number':\n return `${this.startValue}`;\n case 'date': {\n const granularity = this.dateGranularity || 'year';\n const dateOffset = this.lowerBound + value;\n const timestamp = getStartOf(this.min, granularity, dateOffset);\n\n return getFormattedDateString(\n this.dateGranularity || 'year',\n new Date(timestamp),\n );\n }\n }\n };\n\n render() {\n const startPercent =\n ((this.startValue - this.lowerBound) /\n (this.upperBound - this.lowerBound)) *\n 100;\n const endPercent =\n ((this.endValue - this.lowerBound) /\n (this.upperBound - this.lowerBound)) *\n 100;\n\n const startLabel = this.getLabel(this.startValue);\n const endLabel = this.getLabel(this.endValue);\n\n return (\n <div class='searchcraft-slider'>\n <div class='searchcraft-slider-range'>\n <div\n class='searchcraft-slider-active-range'\n style={{\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n }}\n />\n <input\n class={classNames(\n 'searchcraft-slider-input',\n 'searchcraft-slider-input-min-handle',\n )}\n max={this.upperBound}\n min={this.lowerBound}\n onInput={this.handleStartValueChange.bind(this)}\n step={this.step}\n style={{ zIndex: this.lastFocusedHandle === 'min' ? '2' : '1' }}\n type='range'\n value={this.startValue}\n />\n <input\n class={classNames(\n 'searchcraft-slider-input',\n 'searchcraft-slider-input-max-handle',\n )}\n max={this.upperBound}\n min={this.lowerBound}\n onInput={this.handleEndValueChange.bind(this)}\n step={this.step}\n style={{ zIndex: this.lastFocusedHandle === 'max' ? '2' : '1' }}\n type='range'\n value={this.endValue}\n />\n </div>\n <div class='searchcraft-slider-label'>\n <span class='searchcraft-slider-start-label'>{startLabel}</span>\n <span class='searchcraft-slider-end-label'>{endLabel}</span>\n </div>\n </div>\n );\n }\n}\n"],"version":3}
@@ -1 +1 @@
1
- {"file":"p-d54771ef.js","mappings":"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","names":[],"sources":["src/utils/units.ts"],"sourcesContent":["import type { SearchResultMapping } from '@searchcraft/core';\n\n/**\n * Given a document and a SearchResultMapping, return a mapped value from the document.\n * Applies formatting based on the values specified in the `SearchResultFieldName` values.\n *\n * @param document\n * @param {SearchResultMapping} mapping\n * @returns {string | undefined}\n */\nexport function getDocumentValueFromSearchResultMapping(\n document: Record<string, unknown> | undefined,\n mapping: SearchResultMapping | undefined,\n): string | undefined {\n if (document && mapping) {\n return mapping.fieldNames\n .map((fieldNameDetails) => {\n let valueFound = document[fieldNameDetails.fieldName];\n\n if (valueFound) {\n switch (fieldNameDetails.dataType) {\n case 'date': {\n valueFound = formatRelativeDate(\n valueFound as string | Date,\n fieldNameDetails.dateFormatLocale,\n fieldNameDetails.dateFormatOptions,\n );\n break;\n }\n case 'number': {\n valueFound = Intl.NumberFormat(\n fieldNameDetails.numberFormatLocale,\n fieldNameDetails.numberFormatOptions,\n ).format(\n (valueFound as number) * (fieldNameDetails.numberScale || 1),\n );\n break;\n }\n default:\n break;\n }\n }\n\n return valueFound;\n })\n .filter((value) => !!value)\n .join(mapping.delimiter || ' ');\n }\n}\n\n/**\n * Convert different units of time to milliseconds.\n *\n * @param unit - The unit of time\n * @returns {number}\n */\nexport function getMillis(unit: 'year' | 'month' | 'day' | 'hour'): number {\n const millisInHour = 60 * 60 * 1000;\n const millisInDay = 24 * millisInHour;\n const millisInMonth = 30 * millisInDay;\n const millisInYear = 365 * millisInDay;\n\n switch (unit) {\n case 'hour':\n return millisInHour;\n case 'day':\n return millisInDay;\n case 'month':\n return millisInMonth;\n case 'year':\n return millisInYear;\n default:\n return 3600000;\n }\n}\n\n/**\n * Format a number with commas as thousands separators.\n *\n * @param number - The number to be formatted.\n * @returns {string} - The formatted number as a string.\n */\nexport function formatNumberWithCommas(number) {\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\n/**\n * Format a date or date string. The string is formatted relative to today's date\n * (e.g. 2 days ago) until the date range is greater than a month.\n *\n * @param dateInput - The date to be formatted.\n * @param locale - The language used for formatting the date.\n * @param options - The non-default options used for formatting the date.\n * @returns {string} - The formatted date as a string.\n */\nexport function formatRelativeDate(\n dateInput: string | Date,\n locale = 'en-US',\n options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n },\n): string {\n const date = new Date(dateInput);\n const now = new Date();\n const diffMillis = now.getTime() - date.getTime();\n const oneMonthInMillis = 30 * 24 * 60 * 60 * 1000; // Approx. 1 month in ms\n\n if (diffMillis < oneMonthInMillis) {\n const diffSeconds = Math.trunc(diffMillis / 1000);\n const diffMinutes = Math.trunc(diffSeconds / 60);\n const diffHours = Math.trunc(diffMinutes / 60);\n const diffDays = Math.trunc(diffHours / 24);\n const relativeTimeFormat = new Intl.RelativeTimeFormat(locale, options);\n\n if (diffDays >= 1) {\n return relativeTimeFormat.format(-diffDays, 'day');\n }\n\n if (diffHours >= 1) {\n return relativeTimeFormat.format(-diffHours, 'hour');\n }\n\n if (diffMinutes >= 1) {\n return relativeTimeFormat.format(-diffMinutes, 'minute');\n }\n\n return relativeTimeFormat.format(0, 'second');\n }\n\n return new Intl.DateTimeFormat(locale, options).format(date);\n}\n\n/**\n * Given a date, returns the timestamp (in ms) for the start of the specified unit.\n *\n * @param unit - The unit to calculate the start of ('year' | 'month' | 'day' | 'hour').\n * @param timestamp - The date to evaluate.\n * @param offset - The number of units to offset by.\n * @returns The timestamp (in ms) for the start of the specified unit.\n */\nexport function getStartOf(\n timestamp: number,\n unit: 'year' | 'month' | 'day' | 'hour',\n offset = 0,\n): number {\n const d = new Date(timestamp);\n\n switch (unit) {\n case 'year':\n return new Date(d.getFullYear() + offset, 0, 1, 0, 0, 0, 0).getTime();\n case 'month':\n return new Date(\n d.getFullYear(),\n d.getMonth() + offset,\n 1,\n 0,\n 0,\n 0,\n 0,\n ).getTime();\n case 'day':\n return new Date(\n d.getFullYear(),\n d.getMonth(),\n d.getDate() + offset,\n 0,\n 0,\n 0,\n 0,\n ).getTime();\n case 'hour':\n return new Date(\n d.getFullYear(),\n d.getMonth(),\n d.getDate(),\n d.getHours() + offset,\n 0,\n 0,\n 0,\n ).getTime();\n default:\n throw new Error(`Unsupported unit: ${unit}`);\n }\n}\n\n/**\n * Given a start and end date, returns the difference in the number of the specified units.\n *\n * @param units - The unit to measure ('year' | 'month' | 'day' | 'hour').\n * @param startDate - The start date.\n * @param endDate - The end date.\n * @returns The difference in the given unit.\n */\nexport function getDifferenceInUnits(\n unit: 'year' | 'month' | 'day' | 'hour',\n startTime: number,\n endTime: number,\n): number {\n const start = new Date(startTime);\n const end = new Date(endTime);\n\n switch (unit) {\n case 'year':\n return Math.abs(end.getFullYear() - start.getFullYear());\n\n case 'month':\n return Math.abs(\n end.getFullYear() * 12 +\n end.getMonth() -\n (start.getFullYear() * 12 + start.getMonth()),\n );\n\n case 'day':\n return Math.floor(\n Math.abs(end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24),\n );\n\n case 'hour':\n return Math.floor(\n Math.abs(end.getTime() - start.getTime()) / (1000 * 60 * 60),\n );\n\n default:\n throw new Error(`Unsupported unit: ${unit}`);\n }\n}\n\n/**\n * Returns the ordinal representation of a day of the month.\n */\nconst getOrdinal = (n: number): string => {\n if (n >= 11 && n <= 13) return `${n}th`;\n switch (n % 10) {\n case 1:\n return `${n}st`;\n case 2:\n return `${n}nd`;\n case 3:\n return `${n}rd`;\n default:\n return `${n}th`;\n }\n};\n\n/**\n * Given a granularity level, returns a formatted, human-readable, date string.\n *\n * @param granularity - The granularity level to display. The granularity level dictates how the date is formatted.\n * @param date - The date to format.\n *\n * @returns A formatted string representing the date at the specified granularity.\n *\n * @example\n * getFormattedDateString('year', new Date('2023-01-01')) // \"2023\"\n * getFormattedDateString('month', new Date('2023-01-01')) // \"Jan 2023\"\n * getFormattedDateString('day', new Date('2023-01-31')) // \"Jan 31st, 2023\"\n * getFormattedDateString('hour', new Date('2023-01-31T12:00:00')) // \"Jan 31st, 12:00 PM\"\n */\nexport function getFormattedDateString(\n granularity: 'year' | 'month' | 'day' | 'hour',\n date: Date,\n): string {\n const monthFormatter = new Intl.DateTimeFormat('en-US', { month: 'short' });\n\n switch (granularity) {\n case 'year':\n return date.getFullYear().toString();\n\n case 'month':\n return `${monthFormatter.format(date)} ${date.getFullYear()}`;\n\n case 'day':\n return `${monthFormatter.format(date)} ${getOrdinal(date.getDate())}, ${date.getFullYear()}`;\n\n case 'hour': {\n const timeFormatter = new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n return `${monthFormatter.format(date)} ${getOrdinal(date.getDate())}, ${timeFormatter.format(date)}`;\n }\n default:\n throw new Error(`Unsupported granularity: ${granularity}`);\n }\n}\n"],"version":3}
1
+ {"file":"p-d54771ef.js","mappings":"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","names":[],"sources":["src/utils/units.ts"],"sourcesContent":["import type { SearchResultMapping } from '@types';\n\n/**\n * Given a document and a SearchResultMapping, return a mapped value from the document.\n * Applies formatting based on the values specified in the `SearchResultFieldName` values.\n *\n * @param document\n * @param {SearchResultMapping} mapping\n * @returns {string | undefined}\n */\nexport function getDocumentValueFromSearchResultMapping(\n document: Record<string, unknown> | undefined,\n mapping: SearchResultMapping | undefined,\n): string | undefined {\n if (document && mapping) {\n return mapping.fieldNames\n .map((fieldNameDetails) => {\n let valueFound = document[fieldNameDetails.fieldName];\n\n if (valueFound) {\n switch (fieldNameDetails.dataType) {\n case 'date': {\n valueFound = formatRelativeDate(\n valueFound as string | Date,\n fieldNameDetails.dateFormatLocale,\n fieldNameDetails.dateFormatOptions,\n );\n break;\n }\n case 'number': {\n valueFound = Intl.NumberFormat(\n fieldNameDetails.numberFormatLocale,\n fieldNameDetails.numberFormatOptions,\n ).format(\n (valueFound as number) * (fieldNameDetails.numberScale || 1),\n );\n break;\n }\n default:\n break;\n }\n }\n\n return valueFound;\n })\n .filter((value) => !!value)\n .join(mapping.delimiter || ' ');\n }\n}\n\n/**\n * Convert different units of time to milliseconds.\n *\n * @param unit - The unit of time\n * @returns {number}\n */\nexport function getMillis(unit: 'year' | 'month' | 'day' | 'hour'): number {\n const millisInHour = 60 * 60 * 1000;\n const millisInDay = 24 * millisInHour;\n const millisInMonth = 30 * millisInDay;\n const millisInYear = 365 * millisInDay;\n\n switch (unit) {\n case 'hour':\n return millisInHour;\n case 'day':\n return millisInDay;\n case 'month':\n return millisInMonth;\n case 'year':\n return millisInYear;\n default:\n return 3600000;\n }\n}\n\n/**\n * Format a number with commas as thousands separators.\n *\n * @param number - The number to be formatted.\n * @returns {string} - The formatted number as a string.\n */\nexport function formatNumberWithCommas(number) {\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\n/**\n * Format a date or date string. The string is formatted relative to today's date\n * (e.g. 2 days ago) until the date range is greater than a month.\n *\n * @param dateInput - The date to be formatted.\n * @param locale - The language used for formatting the date.\n * @param options - The non-default options used for formatting the date.\n * @returns {string} - The formatted date as a string.\n */\nexport function formatRelativeDate(\n dateInput: string | Date,\n locale = 'en-US',\n options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n },\n): string {\n const date = new Date(dateInput);\n const now = new Date();\n const diffMillis = now.getTime() - date.getTime();\n const oneMonthInMillis = 30 * 24 * 60 * 60 * 1000; // Approx. 1 month in ms\n\n if (diffMillis < oneMonthInMillis) {\n const diffSeconds = Math.trunc(diffMillis / 1000);\n const diffMinutes = Math.trunc(diffSeconds / 60);\n const diffHours = Math.trunc(diffMinutes / 60);\n const diffDays = Math.trunc(diffHours / 24);\n const relativeTimeFormat = new Intl.RelativeTimeFormat(locale, options);\n\n if (diffDays >= 1) {\n return relativeTimeFormat.format(-diffDays, 'day');\n }\n\n if (diffHours >= 1) {\n return relativeTimeFormat.format(-diffHours, 'hour');\n }\n\n if (diffMinutes >= 1) {\n return relativeTimeFormat.format(-diffMinutes, 'minute');\n }\n\n return relativeTimeFormat.format(0, 'second');\n }\n\n return new Intl.DateTimeFormat(locale, options).format(date);\n}\n\n/**\n * Given a date, returns the timestamp (in ms) for the start of the specified unit.\n *\n * @param unit - The unit to calculate the start of ('year' | 'month' | 'day' | 'hour').\n * @param timestamp - The date to evaluate.\n * @param offset - The number of units to offset by.\n * @returns The timestamp (in ms) for the start of the specified unit.\n */\nexport function getStartOf(\n timestamp: number,\n unit: 'year' | 'month' | 'day' | 'hour',\n offset = 0,\n): number {\n const d = new Date(timestamp);\n\n switch (unit) {\n case 'year':\n return new Date(d.getFullYear() + offset, 0, 1, 0, 0, 0, 0).getTime();\n case 'month':\n return new Date(\n d.getFullYear(),\n d.getMonth() + offset,\n 1,\n 0,\n 0,\n 0,\n 0,\n ).getTime();\n case 'day':\n return new Date(\n d.getFullYear(),\n d.getMonth(),\n d.getDate() + offset,\n 0,\n 0,\n 0,\n 0,\n ).getTime();\n case 'hour':\n return new Date(\n d.getFullYear(),\n d.getMonth(),\n d.getDate(),\n d.getHours() + offset,\n 0,\n 0,\n 0,\n ).getTime();\n default:\n throw new Error(`Unsupported unit: ${unit}`);\n }\n}\n\n/**\n * Given a start and end date, returns the difference in the number of the specified units.\n *\n * @param units - The unit to measure ('year' | 'month' | 'day' | 'hour').\n * @param startDate - The start date.\n * @param endDate - The end date.\n * @returns The difference in the given unit.\n */\nexport function getDifferenceInUnits(\n unit: 'year' | 'month' | 'day' | 'hour',\n startTime: number,\n endTime: number,\n): number {\n const start = new Date(startTime);\n const end = new Date(endTime);\n\n switch (unit) {\n case 'year':\n return Math.abs(end.getFullYear() - start.getFullYear());\n\n case 'month':\n return Math.abs(\n end.getFullYear() * 12 +\n end.getMonth() -\n (start.getFullYear() * 12 + start.getMonth()),\n );\n\n case 'day':\n return Math.floor(\n Math.abs(end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24),\n );\n\n case 'hour':\n return Math.floor(\n Math.abs(end.getTime() - start.getTime()) / (1000 * 60 * 60),\n );\n\n default:\n throw new Error(`Unsupported unit: ${unit}`);\n }\n}\n\n/**\n * Returns the ordinal representation of a day of the month.\n */\nconst getOrdinal = (n: number): string => {\n if (n >= 11 && n <= 13) return `${n}th`;\n switch (n % 10) {\n case 1:\n return `${n}st`;\n case 2:\n return `${n}nd`;\n case 3:\n return `${n}rd`;\n default:\n return `${n}th`;\n }\n};\n\n/**\n * Given a granularity level, returns a formatted, human-readable, date string.\n *\n * @param granularity - The granularity level to display. The granularity level dictates how the date is formatted.\n * @param date - The date to format.\n *\n * @returns A formatted string representing the date at the specified granularity.\n *\n * @example\n * getFormattedDateString('year', new Date('2023-01-01')) // \"2023\"\n * getFormattedDateString('month', new Date('2023-01-01')) // \"Jan 2023\"\n * getFormattedDateString('day', new Date('2023-01-31')) // \"Jan 31st, 2023\"\n * getFormattedDateString('hour', new Date('2023-01-31T12:00:00')) // \"Jan 31st, 12:00 PM\"\n */\nexport function getFormattedDateString(\n granularity: 'year' | 'month' | 'day' | 'hour',\n date: Date,\n): string {\n const monthFormatter = new Intl.DateTimeFormat('en-US', { month: 'short' });\n\n switch (granularity) {\n case 'year':\n return date.getFullYear().toString();\n\n case 'month':\n return `${monthFormatter.format(date)} ${date.getFullYear()}`;\n\n case 'day':\n return `${monthFormatter.format(date)} ${getOrdinal(date.getDate())}, ${date.getFullYear()}`;\n\n case 'hour': {\n const timeFormatter = new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n return `${monthFormatter.format(date)} ${getOrdinal(date.getDate())}, ${timeFormatter.format(date)}`;\n }\n default:\n throw new Error(`Unsupported granularity: ${granularity}`);\n }\n}\n"],"version":3}
@@ -1350,6 +1350,6 @@ var purify = {exports: {}};
1350
1350
 
1351
1351
  const DOMPurify = purify.exports;
1352
1352
 
1353
- export { DOMPurify as D };
1353
+ export { DOMPurify as D, commonjsGlobal as c };
1354
1354
 
1355
- //# sourceMappingURL=p-a64b4cba.js.map
1355
+ //# sourceMappingURL=p-e2a10337.js.map