@searchcraft/javascript-sdk 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/index.d.ts +73 -1
- package/dist/components/index.js +58 -634
- package/dist/components/index.js.map +1 -1
- package/dist/components/{p-e8d97093.js → p-BV4HUriZ.js} +15 -10
- package/dist/components/p-BV4HUriZ.js.map +1 -0
- package/dist/components/{p-46ddde99.js → p-B_415D4A.js} +8 -5
- package/dist/components/p-B_415D4A.js.map +1 -0
- package/dist/components/{p-afe7ce60.js → p-BbSxfaD7.js} +12 -9
- package/dist/components/p-BbSxfaD7.js.map +1 -0
- package/dist/components/p-BfTCfPZ1.js +95 -0
- package/dist/components/p-BfTCfPZ1.js.map +1 -0
- package/dist/components/p-BlYgaV0q.js +1373 -0
- package/dist/components/p-BlYgaV0q.js.map +1 -0
- package/dist/components/{p-76d95772.js → p-C-wcIch1.js} +16 -13
- package/dist/components/p-C-wcIch1.js.map +1 -0
- package/dist/components/{p-87435aac.js → p-C1S92_N8.js} +12 -8
- package/dist/components/p-C1S92_N8.js.map +1 -0
- package/dist/components/{p-acf23bab.js → p-C681KruS.js} +10 -7
- package/dist/components/p-C681KruS.js.map +1 -0
- package/dist/components/{p-3d2107af.js → p-C7ZK8CYu.js} +11 -8
- package/dist/components/p-C7ZK8CYu.js.map +1 -0
- package/dist/components/{p-38b2dad0.js → p-Cju73I1E.js} +11 -8
- package/dist/components/p-Cju73I1E.js.map +1 -0
- package/dist/components/{p-e30203b1.js → p-D0j0UFpV.js} +2 -1
- package/dist/components/p-D0j0UFpV.js.map +1 -0
- package/dist/components/{p-16181756.js → p-D5p2scT9.js} +11 -8
- package/dist/components/p-D5p2scT9.js.map +1 -0
- package/dist/components/{p-5365011f.js → p-DO5g2x-l.js} +861 -186
- package/dist/components/p-DO5g2x-l.js.map +1 -0
- package/dist/components/{p-73db9122.js → p-Dc7S4y3b.js} +9 -6
- package/dist/components/p-Dc7S4y3b.js.map +1 -0
- package/dist/components/{p-f2585cdf.js → p-DjPZkCLP.js} +8 -5
- package/dist/components/p-DjPZkCLP.js.map +1 -0
- package/dist/components/{p-3286bbb3.js → p-DotXR-Gz.js} +10 -7
- package/dist/components/p-DotXR-Gz.js.map +1 -0
- package/dist/components/{p-90bc1590.js → p-Dr9rPC9v.js} +11 -8
- package/dist/components/p-Dr9rPC9v.js.map +1 -0
- package/dist/components/{p-fa799946.js → p-L4PwHqQC.js} +9 -6
- package/dist/components/p-L4PwHqQC.js.map +1 -0
- package/dist/components/{p-b4b67072.js → p-_aHgRsRD.js} +4 -3
- package/dist/components/p-_aHgRsRD.js.map +1 -0
- package/dist/components/{p-d54771ef.js → p-i8oXh7db.js} +2 -1
- package/dist/components/p-i8oXh7db.js.map +1 -0
- package/dist/components/searchcraft-ad.js +2 -1
- package/dist/components/searchcraft-button.js +2 -1
- package/dist/components/searchcraft-error-message.js +2 -1
- package/dist/components/searchcraft-facet-list.js +2 -1
- package/dist/components/searchcraft-filter-panel.js +11 -8
- package/dist/components/searchcraft-filter-panel.js.map +1 -1
- package/dist/components/searchcraft-input-form.js +2 -1
- package/dist/components/searchcraft-input-label.js +2 -1
- package/dist/components/searchcraft-loading.js +2 -1
- package/dist/components/searchcraft-pagination.js +12 -8
- package/dist/components/searchcraft-pagination.js.map +1 -1
- package/dist/components/searchcraft-popover-button.js +9 -6
- package/dist/components/searchcraft-popover-button.js.map +1 -1
- package/dist/components/searchcraft-popover-footer.js +2 -1
- package/dist/components/searchcraft-popover-form.js +17 -14
- package/dist/components/searchcraft-popover-form.js.map +1 -1
- package/dist/components/searchcraft-popover-list-item.js +2 -1
- package/dist/components/searchcraft-popover-list-view.js +2 -1
- package/dist/components/searchcraft-results-info.js +10 -7
- package/dist/components/searchcraft-results-info.js.map +1 -1
- package/dist/components/searchcraft-search-result.js +2 -1
- package/dist/components/searchcraft-search-results-per-page.js +11 -7
- package/dist/components/searchcraft-search-results-per-page.js.map +1 -1
- package/dist/components/searchcraft-search-results.js +11 -8
- package/dist/components/searchcraft-search-results.js.map +1 -1
- package/dist/components/searchcraft-select.js +2 -1
- package/dist/components/searchcraft-slider.js +2 -1
- package/dist/components/searchcraft-summary-box.js +12 -67
- package/dist/components/searchcraft-summary-box.js.map +1 -1
- package/dist/components/searchcraft-theme.js +8 -5
- package/dist/components/searchcraft-theme.js.map +1 -1
- package/dist/components/searchcraft-toggle-button.js +2 -1
- package/dist/hydrate/index.d.ts +40 -7
- package/dist/hydrate/index.js +3095 -2370
- package/dist/hydrate/index.mjs +3094 -2369
- package/dist/types/classes/SearchcraftCore.d.ts +1 -0
- package/dist/types/clients/MeasureClient.d.ts +2 -1
- package/dist/types/clients/SearchClient.d.ts +1 -1
- package/dist/types/clients/ad-clients/AdClient.d.ts +1 -1
- package/dist/types/clients/ad-clients/NativoClient.d.ts +1 -1
- package/dist/types/components/searchcraft-popover-form/searchcraft-popover-form.d.ts +1 -1
- package/dist/types/components/searchcraft-popover-list-item/searchcraft-popover-list-item.d.ts +1 -1
- package/dist/types/components/searchcraft-popover-list-view/searchcraft-popover-list-view.d.ts +1 -1
- package/dist/types/components/searchcraft-search-results/searchcraft-search-results.d.ts +2 -2
- package/dist/types/components.d.ts +70 -0
- package/dist/types/stencil-public-runtime.d.ts +84 -8
- package/package.json +2 -2
- package/dist/components/p-16181756.js.map +0 -1
- package/dist/components/p-3286bbb3.js.map +0 -1
- package/dist/components/p-38b2dad0.js.map +0 -1
- package/dist/components/p-3d2107af.js.map +0 -1
- package/dist/components/p-46ddde99.js.map +0 -1
- package/dist/components/p-5365011f.js.map +0 -1
- package/dist/components/p-5cdc6210.js +0 -82
- package/dist/components/p-5cdc6210.js.map +0 -1
- package/dist/components/p-73db9122.js.map +0 -1
- package/dist/components/p-76d95772.js.map +0 -1
- package/dist/components/p-87435aac.js.map +0 -1
- package/dist/components/p-90bc1590.js.map +0 -1
- package/dist/components/p-acf23bab.js.map +0 -1
- package/dist/components/p-afe7ce60.js.map +0 -1
- package/dist/components/p-b4b67072.js.map +0 -1
- package/dist/components/p-d54771ef.js.map +0 -1
- package/dist/components/p-e2a10337.js +0 -1355
- package/dist/components/p-e2a10337.js.map +0 -1
- package/dist/components/p-e30203b1.js.map +0 -1
- package/dist/components/p-e8d97093.js.map +0 -1
- package/dist/components/p-f2585cdf.js.map +0 -1
- package/dist/components/p-fa799946.js.map +0 -1
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
var classnames = {exports: {}};
|
|
2
|
-
|
|
3
|
-
/*!
|
|
4
|
-
Copyright (c) 2018 Jed Watson.
|
|
5
|
-
Licensed under the MIT License (MIT), see
|
|
6
|
-
http://jedwatson.github.io/classnames
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
(function (module) {
|
|
10
|
-
/* global define */
|
|
11
|
-
|
|
12
|
-
(function () {
|
|
13
|
-
|
|
14
|
-
var hasOwn = {}.hasOwnProperty;
|
|
15
|
-
|
|
16
|
-
function classNames () {
|
|
17
|
-
var classes = '';
|
|
18
|
-
|
|
19
|
-
for (var i = 0; i < arguments.length; i++) {
|
|
20
|
-
var arg = arguments[i];
|
|
21
|
-
if (arg) {
|
|
22
|
-
classes = appendClass(classes, parseValue(arg));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return classes;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function parseValue (arg) {
|
|
30
|
-
if (typeof arg === 'string' || typeof arg === 'number') {
|
|
31
|
-
return arg;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (typeof arg !== 'object') {
|
|
35
|
-
return '';
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (Array.isArray(arg)) {
|
|
39
|
-
return classNames.apply(null, arg);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
|
|
43
|
-
return arg.toString();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
var classes = '';
|
|
47
|
-
|
|
48
|
-
for (var key in arg) {
|
|
49
|
-
if (hasOwn.call(arg, key) && arg[key]) {
|
|
50
|
-
classes = appendClass(classes, key);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return classes;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function appendClass (value, newClass) {
|
|
58
|
-
if (!newClass) {
|
|
59
|
-
return value;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (value) {
|
|
63
|
-
return value + ' ' + newClass;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return value + newClass;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (module.exports) {
|
|
70
|
-
classNames.default = classNames;
|
|
71
|
-
module.exports = classNames;
|
|
72
|
-
} else {
|
|
73
|
-
window.classNames = classNames;
|
|
74
|
-
}
|
|
75
|
-
}());
|
|
76
|
-
}(classnames));
|
|
77
|
-
|
|
78
|
-
const classNames = classnames.exports;
|
|
79
|
-
|
|
80
|
-
export { classNames as c };
|
|
81
|
-
|
|
82
|
-
//# sourceMappingURL=p-5cdc6210.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"file":"p-5cdc6210.js","mappings":";;;;;;;;;AAKA;AACA;AACA,CAAC,YAAY;AAEb;AACA,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC;AAChC;AACA,CAAC,SAAS,UAAU,IAAI;AACxB,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC7C,GAAG,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC1B,GAAG,IAAI,GAAG,EAAE;AACZ,IAAI,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,IAAI;AACJ,GAAG;AACH;AACA,EAAE,OAAO,OAAO,CAAC;AACjB,EAAE;AACF;AACA,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE;AAC3B,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC1D,GAAG,OAAO,GAAG,CAAC;AACd,GAAG;AACH;AACA,EAAE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC/B,GAAG,OAAO,EAAE,CAAC;AACb,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC1B,GAAG,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACtC,GAAG;AACH;AACA,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;AACxG,GAAG,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzB,GAAG;AACH;AACA,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE;AACvB,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE;AAC1C,IAAI,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACxC,IAAI;AACJ,GAAG;AACH;AACA,EAAE,OAAO,OAAO,CAAC;AACjB,EAAE;AACF;AACA,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE;AACxC,EAAE,IAAI,CAAC,QAAQ,EAAE;AACjB,GAAG,OAAO,KAAK,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,KAAK,EAAE;AACb,GAAG,OAAO,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC;AACjC,GAAG;AACH;AACA,EAAE,OAAO,KAAK,GAAG,QAAQ,CAAC;AAC1B,EAAE;AACF;AACA,CAAC,IAAqC,MAAM,CAAC,OAAO,EAAE;AACtD,EAAE,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC;AAClC,EAAE,iBAAiB,UAAU,CAAC;AAC9B,EAAE,MAKM;AACR,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;AACjC,EAAE;AACF,CAAC,EAAE;;;;;;;","names":[],"sources":["../../node_modules/classnames/index.js"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n"],"version":3}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"file":"p-73db9122.js","mappings":";;MAkCa,iBAAiB;;;;;;;;;IAIpB,OAAO,CAAU;;;;IAIjB,QAAQ,GAAa,KAAK,CAAC;;;;IAI3B,OAAO,CAAU;;;;IAIjB,KAAK,CAAU;;;;IAIf,OAAO,CAAU;;;;IAIjB,IAAI,CAAU;;;;IAId,OAAO,GAAuC,EAAE,CAAC;;;;IAIhD,YAAY,CAAwB;IAEpC,oBAAoB,CAAC;IAErB,oBAAoB,GAA2B,SAAQ,CAAC;IACxD,uBAAuB,GAA8B,SAAQ,CAAC;IAE/D,kBAAkB,GAAG,CAAC,KAAK;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KAC5C,CAAC;IAEF,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;KACjC;IAED,MAAM;QACJ,QACE,4DAAK,KAAK,EAAC,oBAAoB,IAC5B,IAAI,CAAC,KAAK,KACT,8DACE,KAAK,EAAC,0BAA0B,EAChC,EAAE,EAAE,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,CAAC,OAAO,QAAQ,EAC3C,OAAO,EAAE,IAAI,CAAC,OAAO,IAEpB,IAAI,CAAC,KAAK,CACL,CACT,EACD,4DAAK,KAAK,EAAC,kCAAkC,IAC3C,kFAEI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,CAAC,OAAO,QAAQ,GAAG,SAAS,EAElE,KAAK,EAAC,0BAA0B,EAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,EAAE,EAAE,IAAI,CAAC,OAAO,EAChB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,IAAI,CAAC,kBAAkB,IAEhC,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;cAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;cACxB,IAAI,CAAC,OAAO,EACd,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC/B,QACE,cAAQ,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,IACjD,KAAK,CACC,EACT;SACH,CAAC,CACK,EACT,4DACE,KAAK,EAAC,+BAA+B,EACrC,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,KAAK,EAAC,4BAA4B,IAElC,uFAAmC,EACnC,6DACE,CAAC,EAAC,uBAAuB,EACzB,MAAM,EAAC,cAAc,kBACR,KAAK,oBACH,OAAO,qBACN,OAAO,GACvB,CACE,CACF,EACL,IAAI,CAAC,OAAO,KACX,0DAAG,KAAK,EAAC,4BAA4B,IAAE,IAAI,CAAC,OAAO,CAAK,CACzD,CACG,EACN;KACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":["src/components/searchcraft-select/searchcraft-select.tsx"],"sourcesContent":["import {\n Component,\n h,\n State,\n Prop,\n type EventEmitter,\n Event,\n} from '@stencil/core';\n\nexport type SearchcraftSelectOption = {\n label: string;\n value: string | number;\n selected?: boolean;\n};\n\n/**\n * This web component is designed to allow users to select between a group of options.\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-select\n * inputId=\"searchcraft-select\"\n * name=\"searchcraft-select\"\n * options=\"[{ label: 'label', value: 'value' }]\"\n * />\n * ```\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-select',\n shadow: false,\n})\nexport class SearchcraftSelect {\n /**\n * The caption displayed below the select input.\n */\n @Prop() caption?: string;\n /**\n * Whether the select input is disabled.\n */\n @Prop() disabled?: boolean = false;\n /**\n * The ID for the select input.\n */\n @Prop() inputId!: string;\n /**\n * The label of the select input.\n */\n @Prop() label?: string;\n /**\n * The ID for the label of the select input.\n */\n @Prop() labelId?: string;\n /**\n * The name of the select input.\n */\n @Prop() name!: string;\n /**\n * The options for the select input.\n */\n @Prop() options: SearchcraftSelectOption[] | string = [];\n /**\n * The event fired when the select is changed.\n */\n @Event() selectChange!: EventEmitter<string>;\n\n @State() searchResultsPerPage;\n\n @State() setSearchResultsPage: (page: number) => void = () => {};\n @State() setSearchResultsPerPage: (perPage: number) => void = () => {};\n\n private handleSelectChange = (event) => {\n this.selectChange.emit(event.target.value);\n };\n\n handleGoToPage(page: number) {\n this.setSearchResultsPage(page);\n }\n\n render() {\n return (\n <div class='searchcraft-select'>\n {this.label && (\n <label\n class='searchcraft-select-label'\n id={this.labelId || `${this.inputId}-label`}\n htmlFor={this.inputId}\n >\n {this.label}\n </label>\n )}\n <div class='searchcraft-select-input-wrapper'>\n <select\n aria-labelledby={\n this.label ? this.labelId || `${this.inputId}-label` : undefined\n }\n class='searchcraft-select-input'\n disabled={this.disabled}\n id={this.inputId}\n name={this.name}\n onChange={this.handleSelectChange}\n >\n {(typeof this.options === 'string'\n ? JSON.parse(this.options)\n : this.options\n ).map(({ label, value, selected }) => {\n return (\n <option key={value} value={value} selected={selected}>\n {label}\n </option>\n );\n })}\n </select>\n <svg\n class='searchcraft-select-input-icon'\n width='20'\n height='20'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <title>Select dropdown icon</title>\n <path\n d='M5 7.5L10 12.5L15 7.5'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n {this.caption && (\n <p class='searchcraft-select-caption'>{this.caption}</p>\n )}\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"file":"p-76d95772.js","mappings":"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","names":[],"sources":["src/components/searchcraft-input-form/searchcraft-input-form.tsx"],"sourcesContent":["import {\n Component,\n Event,\n type EventEmitter,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport classNames from 'classnames';\n\nimport type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport type { SearchcraftState } from '@store';\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 * The value to display in the input field.\n */\n @Prop() value?: string;\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 // Initialize inputValue from prop if provided\n if (this.value !== undefined && this.value.trim().length > 0) {\n this.inputValue = this.value;\n this.core.store.getState().setSearchTerm(this.value);\n // Trigger search if autoSearch is enabled\n if (this.autoSearch) {\n this.core.store.getState().search();\n }\n }\n this.inputInit?.emit();\n }\n }\n\n @Watch('core')\n onCoreChange() {\n this.init();\n }\n\n @Watch('value')\n onValueChange(newValue: string | undefined) {\n if (newValue !== undefined && newValue !== this.inputValue) {\n this.inputValue = newValue;\n this.core?.store.getState().setSearchTerm(newValue);\n // Trigger search if autoSearch is enabled and value is not empty\n if (this.autoSearch && newValue.trim().length > 0) {\n this.core?.store.getState().search();\n }\n }\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 // Only update inputValue from store if value prop is not set\n // OR if the store was cleared (empty string)\n if (this.value === undefined || state.searchTerm === '') {\n this.inputValue = state.searchTerm;\n }\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 // Clear the input value even if controlled by prop\n this.inputValue = '';\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 +0,0 @@
|
|
|
1
|
-
{"file":"p-87435aac.js","mappings":"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","names":["scopedUrlAlphabet"],"sources":["../../node_modules/nanoid/url-alphabet/index.js","../../node_modules/nanoid/index.browser.js","src/components/searchcraft-ad/searchcraft-ad.tsx"],"sourcesContent":["export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import type { AdClientResponseItem, ADMClientResponseItem } from '@types';\nimport { Component, Element, h, Prop, State } from '@stencil/core';\nimport { nanoid } from 'nanoid';\nimport classNames from 'classnames';\n\nimport type { SearchcraftState } from '@store';\n\nimport { html } from '@utils';\nimport type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\n\n/**\n * An inline ad meant to be rendered in a list of search results.\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-ad',\n shadow: false,\n})\nexport class SearchcraftPopoverListItemAd {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n @Prop() adSource: 'Custom' | 'Nativo' | 'adMarketplace' = 'Custom';\n @Prop() adClientResponseItem?: AdClientResponseItem;\n\n /**\n * Where the ad is being rendered within the search results div.\n * Lifecycle behavior differs for ads being rendered in different positions,\n * so we need to be able to handle all of those cases.\n */\n @Prop() renderPosition: 'interstitial' | 'top' | 'bottom' = 'interstitial';\n\n @State() searchTerm?: string;\n @State() isSearchInProgress = false;\n @State() searchResultCount = 0;\n @Element() hostElement?: HTMLElement;\n\n private core?: SearchcraftCore;\n\n private intersectionObserver?: IntersectionObserver;\n private storeUnsubscribe?: () => void;\n private cleanupCore?: () => void;\n private adContainerRenderedTimeout?: NodeJS.Timeout;\n private isComponentConnected = false;\n private timeTaken?: number;\n\n @State() adContainerId = '';\n\n /**\n * Handles when an ad container is first rendered.\n * Core emits an ad_container_rendered event and performs ad client side effects\n *\n */\n handleAdRendered() {\n this.adContainerId = nanoid();\n\n if (this.isComponentConnected && this.searchResultCount > 0) {\n clearTimeout(this.adContainerRenderedTimeout);\n this.adContainerRenderedTimeout = setTimeout(() => {\n this.core?.handleAdContainerRendered({\n adClientResponseItem: this.adClientResponseItem,\n adContainerId: this.adContainerId,\n searchTerm: this.searchTerm || '',\n });\n }, this.core?.config?.customAdConfig?.adContainerRenderedDebounceDelay ||\n 300);\n }\n }\n\n handleAdViewed() {\n this.core?.handleAdContainerViewed({\n adClientResponseItem: this.adClientResponseItem,\n adContainerId: this.adContainerId,\n searchTerm: this.searchTerm || '',\n });\n }\n\n /**\n * Things to do when there's a new incoming search request.\n */\n handleNewIncomingSearchRequest(state: SearchcraftState) {\n const requestProperties = state.searchClientRequestProperties;\n if (requestProperties && typeof requestProperties === 'object') {\n this.searchTerm = requestProperties.searchTerm;\n }\n\n this.searchResultCount = state.searchClientResponseItems.length;\n\n this.handleAdRendered();\n\n this.startIntersectionObserver();\n }\n\n onCoreAvailable(core: SearchcraftCore) {\n const currentState = core.store.getState();\n\n this.isComponentConnected = true;\n this.core = currentState.core;\n this.isSearchInProgress = currentState.isSearchInProgress;\n this.searchResultCount = currentState.searchClientResponseItems.length;\n this.timeTaken = currentState.searchResponseTimeTaken;\n\n const requestProperties = currentState.searchClientRequestProperties;\n if (requestProperties && typeof requestProperties === 'object') {\n this.searchTerm = requestProperties.searchTerm;\n }\n\n /**\n * Interstial ads have a different lifecycle, where we need handle an incoming search\n * request immediately, because they are rendered alongside the search results.\n */\n if (this.renderPosition === 'interstitial') {\n this.handleNewIncomingSearchRequest(currentState);\n }\n\n // Subscribes to store changes (for search term).\n this.storeUnsubscribe = core.store.subscribe((state) => {\n if (this.timeTaken !== state.searchResponseTimeTaken) {\n this.handleNewIncomingSearchRequest(state);\n }\n this.timeTaken = state.searchResponseTimeTaken;\n this.isSearchInProgress = state.isSearchInProgress;\n });\n }\n\n connectedCallback() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n startIntersectionObserver() {\n this.intersectionObserver?.disconnect();\n /**\n * Handles when an ad container is viewable within the document,\n * Core emits an ad_container_viewed event and performs ad client side effects\n */\n if (this.hostElement) {\n this.intersectionObserver = new IntersectionObserver(\n ([entry]) => {\n if (entry?.isIntersecting && this.searchResultCount > 0) {\n this.handleAdViewed();\n }\n },\n { threshold: 0 },\n );\n\n this.intersectionObserver.observe(this.hostElement);\n }\n }\n\n disconnectedCallback() {\n this.storeUnsubscribe?.();\n this.cleanupCore?.();\n this.intersectionObserver?.disconnect();\n this.isComponentConnected = false;\n clearTimeout(this.adContainerRenderedTimeout);\n }\n\n renderADMAd() {\n const item = this.adClientResponseItem as ADMClientResponseItem;\n\n if (!item.admAd) {\n return;\n }\n\n let templateHtml = '<p>Ad Marketplace Ad Placeholder</p>';\n\n if (this.core?.config?.admAdConfig?.template) {\n templateHtml = this.core?.config?.admAdConfig.template(item.admAd, {\n html,\n });\n }\n\n return (\n <div\n class='searchcraft-ad searchcraft-adm-ad'\n data-searchcraft-ad-container-id={this.adContainerId}\n id={`searchcraft-adm-ad-${this.adContainerId}`}\n innerHTML={templateHtml}\n />\n );\n }\n\n renderCustomAd() {\n const templateRenderFunction = this.core?.config?.customAdConfig?.template;\n const containerId = `searchcraft-custom-ad-${this.adContainerId}`;\n let templateHtml = '<p>Custom Ad Placeholder</p>';\n\n if (templateRenderFunction) {\n templateHtml = templateRenderFunction(\n {\n searchTerm: this.searchTerm || '',\n adContainerId: this.adContainerId,\n },\n { html },\n );\n }\n\n return (\n <div\n class='searchcraft-ad searchcraft-custom-ad'\n id={containerId}\n data-searchcraft-ad-container-id={this.adContainerId}\n innerHTML={templateHtml}\n />\n );\n }\n\n renderNativoAd() {\n const nativoClassName =\n this.core?.config.nativoConfig?.adClassName || 'ntv-item';\n return (\n <div\n id={`searchcraft-native-ad-${this.adContainerId}`}\n class={classNames('searchcraft-ad', nativoClassName)}\n data-searchcraft-ad-container-id={this.adContainerId}\n />\n );\n }\n\n render() {\n // Don't render ads if no search results\n if (this.searchResultCount === 0) {\n return;\n }\n\n switch (this.adSource) {\n case 'adMarketplace':\n return this.renderADMAd();\n case 'Custom':\n return this.renderCustomAd();\n case 'Nativo':\n return this.renderNativoAd();\n default:\n return;\n }\n }\n}\n"],"version":3}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"file":"p-90bc1590.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 +0,0 @@
|
|
|
1
|
-
{"file":"p-acf23bab.js","mappings":";;;MAoBa,iBAAiB;;;;;;;;;IAIpB,SAAS,GAA4B,SAAS,CAAC;;;;IAI/C,QAAQ,GAAa,KAAK,CAAC;;;;IAI3B,IAAI,CAAW;;;;IAIf,QAAQ,GAAa,KAAK,CAAC;;;;IAI3B,YAAY,GAAsB,MAAM,CAAC;;;;IAIzC,KAAK,GAAG,QAAQ,CAAC;;;;IAIjB,IAAI,GAAmC,QAAQ,CAAC;;;;IAI/C,WAAW,CAAsB;IAElC,iBAAiB,GAAG;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;KACzB,CAAC;IAEF,MAAM;QACJ,QACE,6EACc,IAAI,CAAC,KAAK,EACtB,KAAK,EAAE,UAAU,CAAC,oBAAoB,EAAE;gBACtC,4BAA4B,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS;gBAC1D,6BAA6B,EAAE,IAAI,CAAC,SAAS,KAAK,UAAU;gBAC5D,6BAA6B,EAAE,IAAI,CAAC,QAAQ;aAC7C,CAAC,EACF,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,IAEd,IAAI,CAAC,QAAQ,IACZ,IAAI,CAAC,IAAI,KAET,EAAC,QAAQ,QACN,IAAI,CAAC,YAAY,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAC1C,gBAAO,IAAI,CAAC,KAAK,CAAQ,EACxB,IAAI,CAAC,YAAY,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAClC,CACZ,CACM,EACT;KACH;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":["src/components/searchcraft-button/searchcraft-button.tsx"],"sourcesContent":["import {\n Component,\n Event,\n type EventEmitter,\n Prop,\n h,\n Fragment,\n} from '@stencil/core';\nimport classNames from 'classnames';\n\n/**\n * This web component represents a button.\n * It provides a clear, interactive way for users to submit search queries or trigger actions in a search interface.\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-button',\n shadow: false,\n})\nexport class SearchcraftButton {\n /**\n * Controls the visual representation of the button.\n */\n @Prop() hierarchy?: 'primary' | 'tertiary' = 'primary';\n /**\n * Whether the button is disabled.\n */\n @Prop() disabled?: boolean = false;\n /**\n * The icon element.\n */\n @Prop() icon?: Element;\n /**\n * Should the button only display an icon.\n */\n @Prop() iconOnly?: boolean = false;\n /**\n * The position of the icon.\n */\n @Prop() iconPosition?: 'left' | 'right' = 'left';\n /**\n * The label for the button.\n */\n @Prop() label = 'Search';\n /**\n * The type of the button.\n */\n @Prop() type?: 'submit' | 'reset' | 'button' = 'button';\n /**\n * The event fired when the button is clicked.\n */\n @Event() buttonClick!: EventEmitter<void>;\n\n private handleButtonClick = () => {\n this.buttonClick.emit();\n };\n\n render() {\n return (\n <button\n aria-label={this.label}\n class={classNames('searchcraft-button', {\n 'searchcraft-button-primary': this.hierarchy === 'primary',\n 'searchcraft-button-tertiary': this.hierarchy === 'tertiary',\n 'searchcraft-button-disabled': this.disabled,\n })}\n disabled={this.disabled}\n onClick={this.handleButtonClick}\n type={this.type}\n >\n {this.iconOnly ? (\n this.icon\n ) : (\n <Fragment>\n {this.iconPosition === 'left' && this.icon}\n <span>{this.label}</span>\n {this.iconPosition === 'right' && this.icon}\n </Fragment>\n )}\n </button>\n );\n }\n}\n"],"version":3}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"file":"p-afe7ce60.js","mappings":";;;;;AAAA;;;;;;;;;;;;SAYgB,QAAQ,CAItB,QAAsC,EACtC,mBAA2B;IAE3B,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,IAAI,gBAAgB,GAAqB,IAAI,CAAC;IAE9C,MAAM,YAAY,GAAG,CAAC,IAAe;QACnC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAClB,oBAAoB,GAAG,IAAI,CAAC;QAC5B,UAAU,CAAC;YACT,oBAAoB,GAAG,KAAK,CAAC;YAC7B,IAAI,gBAAgB,EAAE;gBACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC;gBAClC,gBAAgB,GAAG,IAAI,CAAC;gBACxB,YAAY,CAAC,QAAQ,CAAC,CAAC;aACxB;SACF,EAAE,mBAAmB,CAAC,CAAC;KACzB,CAAC;IAEF,OAAO,CAAC,GAAG,IAAe;QACxB,IAAI,CAAC,oBAAoB,EAAE;YACzB,YAAY,CAAC,IAAI,CAAC,CAAC;SACpB;aAAM;YACL,gBAAgB,GAAG,IAAI,CAAC;SACzB;KACF,CAAC;AACJ;;MCjBa,iBAAiB;;;;;;;;;IAIpB,GAAG,GAAG,GAAG,CAAC;;;;IAIV,GAAG,GAAG,CAAC,CAAC;;;;IAIR,IAAI,GAAG,CAAC,CAAC;;IAET,QAAQ,GAAsB,QAAQ,CAAC;;IAEvC,eAAe,CAAqC;IAEnD,UAAU,GAAG,CAAC,CAAC;IACf,UAAU,GAAG,CAAC,CAAC;IACf,QAAQ,GAAG,CAAC,CAAC;IACb,UAAU,GAAG,CAAC,CAAC;IACf,iBAAiB,GAAkB,KAAK,CAAC;IAElD,mBAAmB,GAAe,SAAQ,CAAC;;;;IAKlC,YAAY,CAEP;IAEd,iBAAiB;QACf,QAAQ,IAAI,CAAC,QAAQ;YACnB,KAAK,QAAQ;gBACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC;gBACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;gBAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;gBAC3B,MAAM;YACR,KAAK,MAAM,EAAE;gBACX,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBACpB,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAClC,IAAI,CAAC,eAAe,IAAI,MAAM,EAC9B,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,GAAG,CACT,CAAC;gBACF,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAEhC,MAAM;aACP;SACF;QAED,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;KAC3D;IAEO,UAAU,GAAG;QACnB,QAAQ,IAAI,CAAC,QAAQ;YACnB,KAAK,QAAQ;gBACX,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;oBACtB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,MAAM,EAAE;gBACX,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;gBACnD,MAAM,cAAc,GAAG,UAAU,CAC/B,IAAI,CAAC,GAAG,EACR,WAAW,EACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAClC,CAAC;gBACF,MAAM,YAAY,GAAG,UAAU,CAC7B,IAAI,CAAC,GAAG,EACR,WAAW,EACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CACpC,CAAC;gBACF,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;oBACtB,UAAU,EAAE,cAAc;oBAC1B,QAAQ,EAAE,YAAY;iBACvB,CAAC,CAAC;gBACH,MAAM;aACP;SACF;KACF,CAAC;IAEM,sBAAsB,GAAG,CAAC,KAAiB;QACjD,MAAM,YAAY,GAAG,KAAK,CAAC,MAA0B,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAE/B,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC1B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;SAC5B;aAAM;YACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChC,YAAY,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;SACzC;KACF,CAAC;IAEM,oBAAoB,GAAG,CAAC,KAAiB;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,MAA0B,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAE/B,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE;YAC5B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;SAC5B;aAAM;YACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;YAChC,YAAY,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;SAC3C;KACF,CAAC;IAEM,QAAQ,GAAG,CAAC,KAAK;QACvB,QAAQ,IAAI,CAAC,QAAQ;YACnB,KAAK,QAAQ;gBACX,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9B,KAAK,MAAM,EAAE;gBACX,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;gBAEhE,OAAO,sBAAsB,CAC3B,IAAI,CAAC,eAAe,IAAI,MAAM,EAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,CACpB,CAAC;aACH;SACF;KACF,CAAC;IAEF,MAAM;QACJ,MAAM,YAAY,GAChB,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;aAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACrC,GAAG,CAAC;QACN,MAAM,UAAU,GACd,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU;aAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACrC,GAAG,CAAC;QAEN,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9C,QACE,4DAAK,KAAK,EAAC,oBAAoB,IAC7B,4DAAK,KAAK,EAAC,0BAA0B,IACnC,4DACE,KAAK,EAAC,iCAAiC,EACvC,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,YAAY,GAAG;gBACxB,KAAK,EAAE,GAAG,UAAU,GAAG,YAAY,GAAG;aACvC,GACD,EACF,8DACE,KAAK,EAAE,UAAU,CACf,0BAA0B,EAC1B,qCAAqC,CACtC,EACD,GAAG,EAAE,IAAI,CAAC,UAAU,EACpB,GAAG,EAAE,IAAI,CAAC,UAAU,EACpB,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAC/C,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,iBAAiB,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE,EAC/D,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,IAAI,CAAC,UAAU,GACtB,EACF,8DACE,KAAK,EAAE,UAAU,CACf,0BAA0B,EAC1B,qCAAqC,CACtC,EACD,GAAG,EAAE,IAAI,CAAC,UAAU,EACpB,GAAG,EAAE,IAAI,CAAC,UAAU,EACpB,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7C,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,iBAAiB,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE,EAC/D,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,IAAI,CAAC,QAAQ,GACpB,CACE,EACN,4DAAK,KAAK,EAAC,0BAA0B,IACnC,6DAAM,KAAK,EAAC,gCAAgC,IAAE,UAAU,CAAQ,EAChE,6DAAM,KAAK,EAAC,8BAA8B,IAAE,QAAQ,CAAQ,CACxD,CACF,EACN;KACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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}
|