@uva-glass/component-library 3.47.1 → 3.47.2

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.
@@ -0,0 +1,17 @@
1
+ import './assets/SearchField.css';const _ = {
2
+ "search-field__input-wrapper": "_search-field__input-wrapper_223yn_1",
3
+ "search-field__input-field": "_search-field__input-field_223yn_8",
4
+ "search-field__icon": "_search-field__icon_223yn_35",
5
+ "search-field__result-wrapper": "_search-field__result-wrapper_223yn_43",
6
+ "search-field__input-container": "_search-field__input-container_223yn_57",
7
+ "search-field__input-container--hidden": "_search-field__input-container--hidden_223yn_62",
8
+ "search-field__input-container--visible": "_search-field__input-container--visible_223yn_66",
9
+ "search-field__compact-button": "_search-field__compact-button_223yn_76",
10
+ "search-field__compact-icon": "_search-field__compact-icon_223yn_93",
11
+ "search-field__result-list": "_search-field__result-list_223yn_97",
12
+ "search-field__result-item": "_search-field__result-item_223yn_110"
13
+ };
14
+ export {
15
+ _ as s
16
+ };
17
+ //# sourceMappingURL=SearchField.module-Be9ZoU-6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchField.module-Be9ZoU-6.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- ._search-field__input-wrapper_x3viy_1{display:flex;justify-content:flex-end;position:relative;width:100%}._search-field__input-field_x3viy_8{appearance:none;background-color:var(--new-color-uva-white);border:1px solid var(--new-color-grey-400);border-radius:.25rem;color:var(--new-color-uva-black);flex:1;font-family:inherit;font-size:inherit;height:2.35rem;margin:0;padding:0 2.75rem 0 1rem;text-align:inherit;width:100%}._search-field__input-field_x3viy_8::placeholder{color:var(--new-color-grey-700);font-size:inherit;opacity:1}._search-field__input-field_x3viy_8:focus-visible{background-color:var(--new-color-grey-300);outline:1px solid var(--new-color-grey-700)}._search-field__icon_x3viy_35{color:var(--new-color-grey-700);position:absolute;right:.5rem;top:50%;transform:translateY(-50%)}._search-field__result-wrapper_x3viy_43{background-color:var(--new-color-uva-white);border:1px solid var(--new-color-grey-700);border-radius:.25rem;display:flex;flex-direction:column;left:0;max-width:22rem;min-width:100%;overflow:hidden;position:absolute;top:calc(100% + .25rem);z-index:10}._search-field__input-container_x3viy_58{position:relative;width:100%}._search-field__input-container--hidden_x3viy_63{display:none}._search-field__input-container--visible_x3viy_67{display:block;max-width:22rem;min-width:100%;position:absolute;right:0;top:0;z-index:10}._search-field__compact-button_x3viy_77{align-items:center;appearance:none;background-color:transparent;background-color:var(--new-color-uva-white);border:1px solid var(--new-color-grey-400);border-radius:.25rem;color:var(--new-color-uva-black);cursor:pointer;display:flex;height:2.35rem;justify-content:center;margin:0;text-align:inherit;width:2.35rem}._search-field__compact-icon_x3viy_94{color:var(--new-color-grey-700)}._search-field__result-list_x3viy_98{border-bottom:1px solid var(--new-color-grey-700);list-style:none;margin:0;max-height:11.5rem;overflow-y:auto;padding:0}._search-field__result-list_x3viy_98:empty{display:none}._search-field__result-item_x3viy_111{font-size:inherit;max-width:100%;padding:.5rem 1rem;white-space:nowrap}._search-field__result-item_x3viy_111:focus-visible{background-color:var(--new-color-grey-300);outline:none}._search-field__result-item_x3viy_111:hover,._search-field__result-item_x3viy_111:focus-visible{background-color:var(--new-color-grey-300);cursor:pointer}._search-field__result-info_x3viy_129{background-color:var(--new-color-uva-white);border-radius:0 0 .25rem .25rem;border-top:1px solid var(--new-color-grey-400);font-size:inherit;max-width:100%;padding:.5rem 1rem;white-space:nowrap}
1
+ ._search-field__input-wrapper_223yn_1{display:flex;justify-content:flex-end;position:relative;width:100%}._search-field__input-field_223yn_8{appearance:none;background-color:var(--new-color-uva-white);border:1px solid var(--new-color-grey-400);border-radius:.25rem;color:var(--new-color-uva-black);flex:1;font-family:inherit;font-size:inherit;height:2.35rem;margin:0;padding:0 2.75rem 0 1rem;text-align:inherit;width:100%}._search-field__input-field_223yn_8::placeholder{color:var(--new-color-grey-700);font-size:inherit;opacity:1}._search-field__input-field_223yn_8:focus-visible{background-color:var(--new-color-grey-300);outline:1px solid var(--new-color-grey-700)}._search-field__icon_223yn_35{color:var(--new-color-grey-700);position:absolute;right:.5rem;top:50%;transform:translateY(-50%)}._search-field__result-wrapper_223yn_43{background-color:var(--new-color-uva-white);border:1px solid var(--new-color-grey-700);border-radius:.25rem;display:flex;flex-direction:column;left:0;overflow:hidden;position:absolute;top:calc(100% + .25rem);width:clamp(22rem,100%,24rem);z-index:10}._search-field__input-container_223yn_57{position:relative;width:100%}._search-field__input-container--hidden_223yn_62{display:none}._search-field__input-container--visible_223yn_66{display:block;max-width:22rem;min-width:100%;position:absolute;right:0;top:0;z-index:10}._search-field__compact-button_223yn_76{align-items:center;appearance:none;background-color:transparent;background-color:var(--new-color-uva-white);border:1px solid var(--new-color-grey-400);border-radius:.25rem;color:var(--new-color-uva-black);cursor:pointer;display:flex;height:2.35rem;justify-content:center;margin:0;text-align:inherit;width:2.35rem}._search-field__compact-icon_223yn_93{color:var(--new-color-grey-700)}._search-field__result-list_223yn_97{border-bottom:1px solid var(--new-color-grey-700);list-style:none;margin:0;max-height:min(23.75rem,50vh);overflow-y:auto;padding:0}._search-field__result-list_223yn_97:empty{display:none}._search-field__result-item_223yn_110{font-size:inherit;max-width:100%;padding:.5rem 1rem;white-space:nowrap}._search-field__result-item_223yn_110:focus-visible{background-color:var(--new-color-grey-300);outline:none}._search-field__result-item_223yn_110:hover,._search-field__result-item_223yn_110:focus-visible{background-color:var(--new-color-grey-300);cursor:pointer}._search-field__result-info_223yn_128{background-color:var(--new-color-uva-white);border-radius:0 0 .25rem .25rem;border-top:1px solid var(--new-color-grey-400);font-size:inherit;max-width:100%;padding:.5rem 1rem;white-space:nowrap}
@@ -10,15 +10,13 @@ export interface SearchFieldProps {
10
10
  /** If true, the search field is displayed in a compact style. */
11
11
  isCompact?: boolean;
12
12
  /** Callback function triggered when the input value changes. */
13
- onChange?: (query: string) => void;
14
- /** Callback function triggered when a result is selected. */
15
- onSelect?: (selectedValue: string | number) => void;
13
+ onChange: (query: string) => void;
16
14
  /** The children elements, typically ResultOption components. */
17
15
  children: ReactNode;
18
16
  /** Optional row to display the count of results. */
19
17
  resultCountRow?: ReactNode;
20
18
  }
21
19
  export declare const SearchField: {
22
- ({ id, placeholder, isLoading, isCompact, onChange, onSelect, children, resultCountRow, }: SearchFieldProps): import("react/jsx-runtime").JSX.Element;
23
- ResultOption: ({ value, key, children, onSelect, ariaLabel }: ResultOptionProps) => import("react/jsx-runtime").JSX.Element;
20
+ ({ id, placeholder, isLoading, isCompact, onChange, children, resultCountRow, }: SearchFieldProps): import("react/jsx-runtime").JSX.Element;
21
+ ResultOption: ({ value, key, ariaLabel, children, onSelect, onReset, onEscape }: ResultOptionProps) => import("react/jsx-runtime").JSX.Element;
24
22
  };
@@ -1,80 +1,96 @@
1
- import { jsxs as _, jsx as n } from "react/jsx-runtime";
2
- import { useRef as b, useState as R, useEffect as v, Children as l, isValidElement as S, cloneElement as D } from "react";
3
- import { c as F } from "../../clsx-OuTLNxxd.js";
4
- import { ResultOption as k } from "./components/ResultsOption.js";
5
- import { s as t } from "../../SearchField.module-DTDxokfU.js";
1
+ import { jsxs as x, jsx as s } from "react/jsx-runtime";
2
+ import { useRef as y, useState as k, useEffect as F, Children as m, isValidElement as N, cloneElement as O } from "react";
3
+ import { c as S } from "../../clsx-OuTLNxxd.js";
4
+ import { ResultOption as D } from "./components/ResultsOption.js";
5
+ import { s as n } from "../../SearchField.module-Be9ZoU-6.js";
6
6
  import { ResultOptionBox as E } from "./components/ResultOptionBox.js";
7
- import { Icon as g } from "../Icon/Icon.js";
8
- const O = ({
9
- id: s,
10
- placeholder: o,
11
- isLoading: c = !1,
12
- isCompact: r,
13
- onChange: u,
14
- onSelect: f,
15
- children: a,
16
- resultCountRow: p
7
+ import { Icon as w } from "../Icon/Icon.js";
8
+ import { useOnClickOutside as j } from "../hooks/useOnClickOutside.js";
9
+ const A = ({
10
+ id: d,
11
+ placeholder: u,
12
+ isLoading: b = !1,
13
+ isCompact: l,
14
+ onChange: c,
15
+ children: o,
16
+ resultCountRow: h
17
17
  }) => {
18
- const i = b(null), [m, d] = R(!1), h = b(null), x = (e) => {
19
- u && u(e.target.value);
20
- }, y = (e) => {
21
- i.current && (i.current.value = ""), f && f(e);
22
- }, N = (e) => {
23
- e.key === "ArrowDown" && (e.preventDefault(), h.current?.childNodes[0]?.childNodes[0]?.focus());
18
+ const t = y(null), [_, f] = k(!1), p = y(null), R = () => {
19
+ console.log("reset"), t.current && (t.current.value = "");
20
+ }, g = (e) => {
21
+ const a = e.target, r = a.value;
22
+ a.setSelectionRange(r.length, r.length), r && c(r);
23
+ }, v = (e) => {
24
+ switch (e.key) {
25
+ case "Escape":
26
+ e.preventDefault(), c(""), t.current && (t.current.value = ""), l && (f(!1), t.current?.blur());
27
+ break;
28
+ case "ArrowDown": {
29
+ e.preventDefault();
30
+ const r = p.current?.querySelector('li[role="option"]:not([tabindex="-1"])');
31
+ if (r) {
32
+ let i = r;
33
+ for (; i && i.getAttribute("tabindex") === "-1"; )
34
+ i = i.nextElementSibling;
35
+ i?.focus();
36
+ }
37
+ break;
38
+ }
39
+ }
24
40
  };
25
- return v(() => {
26
- l.count(a) || d(!1);
27
- }, [a]), /* @__PURE__ */ _("div", { className: t["search-field__input-wrapper"], children: [
28
- r && /* @__PURE__ */ n(
41
+ return F(() => {
42
+ m.count(o) || (f(!1), t.current && t.current.focus());
43
+ }, [o]), j(p, c.bind(null, "")), /* @__PURE__ */ x("div", { className: n["search-field__input-wrapper"], children: [
44
+ l && /* @__PURE__ */ s(
29
45
  "button",
30
46
  {
31
47
  type: "button",
32
- className: t["search-field__compact-button"],
33
- onClick: () => d(!0),
34
- "aria-label": o,
35
- children: /* @__PURE__ */ n(g, { name: "Magnify", className: t["search-field__compact-icon"], "aria-hidden": "true" })
48
+ className: n["search-field__compact-button"],
49
+ onClick: () => f(!0),
50
+ "aria-label": u,
51
+ children: /* @__PURE__ */ s(w, { name: "Magnify", className: n["search-field__compact-icon"], "aria-hidden": "true" })
36
52
  }
37
53
  ),
38
- /* @__PURE__ */ _(
54
+ /* @__PURE__ */ x(
39
55
  "div",
40
56
  {
41
- className: F(t["search-field__input-container"], {
42
- [t["search-field__input-container--hidden"]]: r && !m,
43
- [t["search-field__input-container--visible"]]: r && m
57
+ className: S(n["search-field__input-container"], {
58
+ [n["search-field__input-container--hidden"]]: l && !_,
59
+ [n["search-field__input-container--visible"]]: l && _
44
60
  }),
45
61
  children: [
46
- /* @__PURE__ */ n(g, { name: "Magnify", className: t["search-field__icon"], "aria-hidden": "true" }),
47
- /* @__PURE__ */ n(
62
+ /* @__PURE__ */ s(w, { name: "Magnify", className: n["search-field__icon"], "aria-hidden": "true" }),
63
+ /* @__PURE__ */ s(
48
64
  "input",
49
65
  {
50
66
  type: "text",
51
- className: t["search-field__input-field"],
52
- placeholder: o,
53
- id: s,
54
- onChange: x,
55
- onFocus: (e) => e.target.setSelectionRange(e.target.value.length, e.target.value.length),
56
- onKeyDown: N,
67
+ className: n["search-field__input-field"],
68
+ placeholder: u,
69
+ id: d,
70
+ onChange: (e) => c(e.target.value),
71
+ onFocus: g,
72
+ onKeyDown: v,
57
73
  role: "combobox",
58
- "aria-expanded": !!l.count(a) || c,
59
- "aria-controls": `${s}-results`,
74
+ "aria-expanded": !!m.count(o) || b,
75
+ "aria-controls": `${d}-results`,
60
76
  "aria-autocomplete": "list",
61
77
  "aria-haspopup": "listbox",
62
- "aria-label": o,
78
+ "aria-label": u,
63
79
  autoComplete: "off",
64
- ref: i
80
+ ref: t
65
81
  }
66
82
  )
67
83
  ]
68
84
  }
69
85
  ),
70
- (a || c) && /* @__PURE__ */ n(E, { resultCountRow: p || null, ref: h, children: l.map(a, (e, w) => S(e) ? D(e, {
71
- key: w,
72
- onSelect: y
86
+ (o || b) && /* @__PURE__ */ s(E, { resultCountRow: h || null, ref: p, children: m.map(o, (e, a) => N(e) ? O(e, {
87
+ key: a,
88
+ onReset: R
73
89
  }) : e) })
74
90
  ] });
75
91
  };
76
- O.ResultOption = k;
92
+ A.ResultOption = D;
77
93
  export {
78
- O as SearchField
94
+ A as SearchField
79
95
  };
80
96
  //# sourceMappingURL=SearchField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchField.js","sources":["../../../src/components/SearchField/SearchField.tsx"],"sourcesContent":["import { Children, cloneElement, isValidElement, useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\n\r\nimport type { ChangeEvent, KeyboardEvent, ReactNode } from 'react';\r\nimport type { ResultOptionProps } from './components/ResultsOption';\r\n\r\nimport { ResultOption } from './components/ResultsOption';\r\nimport styles from './SearchField.module.css';\r\nimport { ResultOptionBox } from './components/ResultOptionBox';\r\n\r\nimport { Icon } from 'components/Icon';\r\n\r\nexport interface SearchFieldProps {\r\n /** Unique identifier for the search field. */\r\n id: string;\r\n /** Placeholder text for the search input. */\r\n placeholder: string;\r\n /** Indicates if the search field is in a loading state. */\r\n isLoading?: boolean;\r\n /** If true, the search field is displayed in a compact style. */\r\n isCompact?: boolean;\r\n /** Callback function triggered when the input value changes. */\r\n onChange?: (query: string) => void;\r\n /** Callback function triggered when a result is selected. */\r\n onSelect?: (selectedValue: string | number) => void;\r\n /** The children elements, typically ResultOption components. */\r\n children: ReactNode;\r\n /** Optional row to display the count of results. */\r\n resultCountRow?: ReactNode;\r\n}\r\n\r\nexport const SearchField = ({\r\n id,\r\n placeholder,\r\n isLoading = false,\r\n isCompact,\r\n onChange,\r\n onSelect,\r\n children,\r\n resultCountRow,\r\n}: SearchFieldProps) => {\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [showField, setShowField] = useState<boolean>(false);\r\n const optionListRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n if (onChange) {\r\n onChange(event.target.value);\r\n }\r\n };\r\n\r\n const handleSelect = (selectedValue: string | number) => {\r\n if (inputRef.current) {\r\n inputRef.current.value = '';\r\n }\r\n if (onSelect) onSelect(selectedValue);\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n (optionListRef.current?.childNodes[0]?.childNodes[0] as HTMLElement)?.focus();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!Children.count(children)) {\r\n setShowField(false);\r\n }\r\n }, [children]);\r\n\r\n return (\r\n <div className={styles['search-field__input-wrapper']}>\r\n {isCompact && (\r\n <button\r\n type=\"button\"\r\n className={styles['search-field__compact-button']}\r\n onClick={() => setShowField(true)}\r\n aria-label={placeholder}\r\n >\r\n <Icon name=\"Magnify\" className={styles['search-field__compact-icon']} aria-hidden=\"true\" />\r\n </button>\r\n )}\r\n <div\r\n className={clsx(styles['search-field__input-container'], {\r\n [styles['search-field__input-container--hidden']]: isCompact && !showField,\r\n [styles['search-field__input-container--visible']]: isCompact && showField,\r\n })}\r\n >\r\n <Icon name=\"Magnify\" className={styles['search-field__icon']} aria-hidden=\"true\" />\r\n <input\r\n type=\"text\"\r\n className={styles['search-field__input-field']}\r\n placeholder={placeholder}\r\n id={id}\r\n onChange={handleChange}\r\n onFocus={(event) => event.target.setSelectionRange(event.target.value.length, event.target.value.length)}\r\n onKeyDown={handleKeyDown}\r\n role=\"combobox\"\r\n aria-expanded={Boolean(Children.count(children)) || isLoading}\r\n aria-controls={`${id}-results`}\r\n aria-autocomplete=\"list\"\r\n aria-haspopup=\"listbox\"\r\n aria-label={placeholder}\r\n autoComplete=\"off\"\r\n ref={inputRef}\r\n />\r\n </div>\r\n {(children || isLoading) && (\r\n <ResultOptionBox resultCountRow={resultCountRow ? resultCountRow : null} ref={optionListRef}>\r\n {Children.map(children, (child, index) => {\r\n if (isValidElement<ResultOptionProps>(child)) {\r\n return cloneElement(child, {\r\n key: index,\r\n onSelect: handleSelect,\r\n });\r\n }\r\n return child;\r\n })}\r\n </ResultOptionBox>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nSearchField.ResultOption = ResultOption;\r\n"],"names":["SearchField","id","placeholder","isLoading","isCompact","onChange","onSelect","children","resultCountRow","inputRef","useRef","showField","setShowField","useState","optionListRef","handleChange","event","handleSelect","selectedValue","handleKeyDown","useEffect","Children","jsxs","styles","jsx","Icon","clsx","ResultOptionBox","child","index","isValidElement","cloneElement","ResultOption"],"mappings":";;;;;;;AA+BO,MAAMA,IAAc,CAAC;AAAA,EAC1B,IAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,gBAAAC;AACF,MAAwB;AACtB,QAAMC,IAAWC,EAAyB,IAAI,GACxC,CAACC,GAAWC,CAAY,IAAIC,EAAkB,EAAK,GACnDC,IAAgBJ,EAAuB,IAAI,GAE3CK,IAAe,CAACC,MAAyC;AAC7D,IAAIX,KACFA,EAASW,EAAM,OAAO,KAAK;AAAA,EAE/B,GAEMC,IAAe,CAACC,MAAmC;AACvD,IAAIT,EAAS,YACXA,EAAS,QAAQ,QAAQ,KAEvBH,OAAmBY,CAAa;AAAA,EACtC,GAEMC,IAAgB,CAACH,MAA2C;AAChE,IAAIA,EAAM,QAAQ,gBAChBA,EAAM,eAAA,GACLF,EAAc,SAAS,WAAW,CAAC,GAAG,WAAW,CAAC,GAAmB,MAAA;AAAA,EAE1E;AAEA,SAAAM,EAAU,MAAM;AACd,IAAKC,EAAS,MAAMd,CAAQ,KAC1BK,EAAa,EAAK;AAAA,EAEtB,GAAG,CAACL,CAAQ,CAAC,GAGX,gBAAAe,EAAC,OAAA,EAAI,WAAWC,EAAO,6BAA6B,GACjD,UAAA;AAAA,IAAAnB,KACC,gBAAAoB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,EAAO,8BAA8B;AAAA,QAChD,SAAS,MAAMX,EAAa,EAAI;AAAA,QAChC,cAAYV;AAAA,QAEZ,UAAA,gBAAAsB,EAACC,KAAK,MAAK,WAAU,WAAWF,EAAO,4BAA4B,GAAG,eAAY,OAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAG7F,gBAAAD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWI,EAAKH,EAAO,+BAA+B,GAAG;AAAA,UACvD,CAACA,EAAO,uCAAuC,CAAC,GAAGnB,KAAa,CAACO;AAAA,UACjE,CAACY,EAAO,wCAAwC,CAAC,GAAGnB,KAAaO;AAAA,QAAA,CAClE;AAAA,QAED,UAAA;AAAA,UAAA,gBAAAa,EAACC,GAAA,EAAK,MAAK,WAAU,WAAWF,EAAO,oBAAoB,GAAG,eAAY,QAAO;AAAA,UACjF,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAWD,EAAO,2BAA2B;AAAA,cAC7C,aAAArB;AAAA,cACA,IAAAD;AAAA,cACA,UAAUc;AAAA,cACV,SAAS,CAACC,MAAUA,EAAM,OAAO,kBAAkBA,EAAM,OAAO,MAAM,QAAQA,EAAM,OAAO,MAAM,MAAM;AAAA,cACvG,WAAWG;AAAA,cACX,MAAK;AAAA,cACL,iBAAe,EAAQE,EAAS,MAAMd,CAAQ,KAAMJ;AAAA,cACpD,iBAAe,GAAGF,CAAE;AAAA,cACpB,qBAAkB;AAAA,cAClB,iBAAc;AAAA,cACd,cAAYC;AAAA,cACZ,cAAa;AAAA,cACb,KAAKO;AAAA,YAAA;AAAA,UAAA;AAAA,QACP;AAAA,MAAA;AAAA,IAAA;AAAA,KAEAF,KAAYJ,MACZ,gBAAAqB,EAACG,GAAA,EAAgB,gBAAgBnB,KAAkC,MAAM,KAAKM,GAC3E,UAAAO,EAAS,IAAId,GAAU,CAACqB,GAAOC,MAC1BC,EAAkCF,CAAK,IAClCG,EAAaH,GAAO;AAAA,MACzB,KAAKC;AAAA,MACL,UAAUZ;AAAA,IAAA,CACX,IAEIW,CACR,EAAA,CACH;AAAA,EAAA,GAEJ;AAEJ;AAEA5B,EAAY,eAAegC;"}
1
+ {"version":3,"file":"SearchField.js","sources":["../../../src/components/SearchField/SearchField.tsx"],"sourcesContent":["import { Children, cloneElement, isValidElement, useEffect, useRef, useState } from 'react';\r\nimport { clsx } from 'clsx';\r\n\r\nimport type { KeyboardEvent, ReactNode, RefObject } from 'react';\r\nimport type { ResultOptionProps } from './components/ResultsOption';\r\n\r\nimport { ResultOption } from './components/ResultsOption';\r\nimport styles from './SearchField.module.css';\r\nimport { ResultOptionBox } from './components/ResultOptionBox';\r\n\r\nimport { Icon } from 'components/Icon';\r\nimport { useOnClickOutside } from 'components/hooks/useOnClickOutside';\r\n\r\nexport interface SearchFieldProps {\r\n /** Unique identifier for the search field. */\r\n id: string;\r\n /** Placeholder text for the search input. */\r\n placeholder: string;\r\n /** Indicates if the search field is in a loading state. */\r\n isLoading?: boolean;\r\n /** If true, the search field is displayed in a compact style. */\r\n isCompact?: boolean;\r\n /** Callback function triggered when the input value changes. */\r\n onChange: (query: string) => void;\r\n /** The children elements, typically ResultOption components. */\r\n children: ReactNode;\r\n /** Optional row to display the count of results. */\r\n resultCountRow?: ReactNode;\r\n}\r\n\r\nexport const SearchField = ({\r\n id,\r\n placeholder,\r\n isLoading = false,\r\n isCompact,\r\n onChange,\r\n children,\r\n resultCountRow,\r\n}: SearchFieldProps) => {\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const [showField, setShowField] = useState<boolean>(false);\r\n const optionListRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleReset = () => {\r\n console.log('reset');\r\n if (inputRef.current) {\r\n inputRef.current.value = '';\r\n }\r\n };\r\n\r\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\r\n const target = event.target;\r\n const value = target.value;\r\n target.setSelectionRange(value.length, value.length);\r\n if (value) {\r\n onChange(value);\r\n }\r\n };\r\n\r\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\r\n switch (event.key) {\r\n case 'Escape':\r\n event.preventDefault();\r\n onChange('');\r\n if (inputRef.current) {\r\n inputRef.current.value = '';\r\n }\r\n if (isCompact) {\r\n setShowField(false);\r\n inputRef.current?.blur();\r\n }\r\n break;\r\n case 'ArrowDown': {\r\n event.preventDefault();\r\n const container = optionListRef.current;\r\n const firstFocusable = container?.querySelector<HTMLElement>('li[role=\"option\"]:not([tabindex=\"-1\"])');\r\n if (firstFocusable) {\r\n let currentOption: HTMLElement | null = firstFocusable;\r\n while (currentOption && currentOption.getAttribute('tabindex') === '-1') {\r\n currentOption = currentOption.nextElementSibling as HTMLElement;\r\n }\r\n currentOption?.focus();\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!Children.count(children)) {\r\n setShowField(false);\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }\r\n }, [children]);\r\n\r\n useOnClickOutside(optionListRef as RefObject<HTMLElement>, onChange.bind(null, ''));\r\n\r\n return (\r\n <div className={styles['search-field__input-wrapper']}>\r\n {isCompact && (\r\n <button\r\n type=\"button\"\r\n className={styles['search-field__compact-button']}\r\n onClick={() => setShowField(true)}\r\n aria-label={placeholder}\r\n >\r\n <Icon name=\"Magnify\" className={styles['search-field__compact-icon']} aria-hidden=\"true\" />\r\n </button>\r\n )}\r\n <div\r\n className={clsx(styles['search-field__input-container'], {\r\n [styles['search-field__input-container--hidden']]: isCompact && !showField,\r\n [styles['search-field__input-container--visible']]: isCompact && showField,\r\n })}\r\n >\r\n <Icon name=\"Magnify\" className={styles['search-field__icon']} aria-hidden=\"true\" />\r\n <input\r\n type=\"text\"\r\n className={styles['search-field__input-field']}\r\n placeholder={placeholder}\r\n id={id}\r\n onChange={(event) => onChange(event.target.value)}\r\n onFocus={handleFocus}\r\n onKeyDown={handleKeyDown}\r\n role=\"combobox\"\r\n aria-expanded={Boolean(Children.count(children)) || isLoading}\r\n aria-controls={`${id}-results`}\r\n aria-autocomplete=\"list\"\r\n aria-haspopup=\"listbox\"\r\n aria-label={placeholder}\r\n autoComplete=\"off\"\r\n ref={inputRef}\r\n />\r\n </div>\r\n {(children || isLoading) && (\r\n <ResultOptionBox resultCountRow={resultCountRow ? resultCountRow : null} ref={optionListRef}>\r\n {Children.map(children, (child, index) => {\r\n if (isValidElement<ResultOptionProps>(child)) {\r\n return cloneElement(child, {\r\n key: index,\r\n onReset: handleReset,\r\n });\r\n }\r\n return child;\r\n })}\r\n </ResultOptionBox>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nSearchField.ResultOption = ResultOption;\r\n"],"names":["SearchField","id","placeholder","isLoading","isCompact","onChange","children","resultCountRow","inputRef","useRef","showField","setShowField","useState","optionListRef","handleReset","handleFocus","event","target","value","handleKeyDown","firstFocusable","currentOption","useEffect","Children","useOnClickOutside","jsxs","styles","jsx","Icon","clsx","ResultOptionBox","child","index","isValidElement","cloneElement","ResultOption"],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  import { Meta } from '@storybook/react';
2
2
  import { SearchFieldProps } from './SearchField';
3
- declare const _default: Meta<SearchFieldProps>;
3
+ declare const _default: Meta<SearchFieldProps & {
4
+ onSelect: (value: string | number) => void;
5
+ }>;
4
6
  export default _default;
5
- export declare const InputExample: import('storybook/internal/csf').AnnotatedStoryFn<import('@storybook/react').ReactRenderer, SearchFieldProps>;
7
+ export declare const InputExample: import('storybook/internal/csf').AnnotatedStoryFn<import('@storybook/react').ReactRenderer, SearchFieldProps & {
8
+ onSelect: (value: string | number) => void;
9
+ }>;
@@ -1,8 +1,8 @@
1
- import { jsx as n, jsxs as w } from "react/jsx-runtime";
2
- import { useState as h } from "react";
3
- import { SearchField as l } from "./SearchField.js";
4
- import { MOCK_DATA as E } from "./mockData.js";
5
- const L = `
1
+ import { jsx as n, jsxs as E } from "react/jsx-runtime";
2
+ import { useState as m } from "react";
3
+ import { SearchField as r } from "./SearchField.js";
4
+ import { MOCK_DATA as L } from "./mockData.js";
5
+ const v = `
6
6
  // Has all HTMLInputElement props available except "className" and "style"
7
7
  <SearchField
8
8
  id={string}
@@ -10,19 +10,23 @@ const L = `
10
10
  placeholder?={string}
11
11
  isLoading?={boolean}
12
12
  isCompact?={boolean}
13
- onChange?={function}
14
- onSelect?={function}
13
+ onChange={function}
15
14
  children={ReactNode}
16
15
  resultCountRow?={ReactNode}
17
16
  >
18
- <SearchField.ResultOption>
17
+ <SearchField.ResultOption
18
+ onSelect={function}
19
+ onEscape={function}
20
+ value={string|number}
21
+ key={string|number}
22
+ ariaLabel={string}>
19
23
  {loop custom options here}
20
24
  </SearchField.ResultOption>
21
- </SearchField>`, v = 4, i = 12, T = 1e3;
22
- var m = /* @__PURE__ */ ((t) => (t.DEGREE = "degree-programme", t.CERTIFICATE = "certificate-programme", t.ADMINISTRATIVE = "administrative-programme", t))(m || {});
25
+ </SearchField>`, w = 4, i = 12, y = 1e3;
26
+ var h = /* @__PURE__ */ ((t) => (t.DEGREE = "degree-programme", t.CERTIFICATE = "certificate-programme", t.ADMINISTRATIVE = "administrative-programme", t))(h || {});
23
27
  const M = {
24
28
  title: "Molecules/SearchField",
25
- component: l,
29
+ component: r,
26
30
  args: {},
27
31
  argTypes: {
28
32
  onSelect: {
@@ -57,55 +61,56 @@ const M = {
57
61
  }
58
62
  },
59
63
  parameters: {
60
- inspectComponent: l,
61
- codeString: L
64
+ inspectComponent: r,
65
+ codeString: v
62
66
  }
63
- }, x = (t) => {
64
- const [c, d] = h(!1), [p, r] = h(), g = "2026", u = "NL", f = (e, o, s, a) => `education-preparation/${m[o]}/${e}/${s}/${a}`, C = (e) => {
65
- if (e.length < v) {
66
- r(null);
67
+ }, T = (t) => {
68
+ const [c, d] = m(!1), [u, o] = m(), g = "2026", p = "NL", f = (e, a, s, l) => `education-preparation/${h[a]}/${e}/${s}/${l}`, b = (e) => {
69
+ if (e.length < w) {
70
+ o(null);
67
71
  return;
68
72
  }
69
73
  d(!0);
70
- const o = e.toLowerCase(), s = E.filter(
71
- (a) => a.name.NL.toLowerCase().includes(o) || a.code.toLowerCase().includes(o)
74
+ const a = e.toLowerCase(), s = L.filter(
75
+ (l) => l.name.NL.toLowerCase().includes(a) || l.code.toLowerCase().includes(a)
72
76
  );
73
77
  setTimeout(() => {
74
- r(s), d(!1);
75
- }, T);
76
- }, S = (e) => e.length > i ? `${e.length} resultaten gevonden, alleen de ${i} beste resultaten worden weergegeven.` : e.length > 0 && e.length <= i ? `${e.length} resultaten gevonden.` : c ? "Zoeken..." : "Geen resultaten gevonden.", b = (e) => e ? /* @__PURE__ */ n("div", { style: { padding: "0.5rem 1rem", fontWeight: "600" }, children: S(e) }, "result-count") : null, R = (e) => {
77
- r(null), t.onSelect?.(e);
78
+ o(s), d(!1);
79
+ }, y);
80
+ }, C = (e) => e.length > i ? `${e.length} resultaten gevonden, alleen de ${i} beste resultaten worden weergegeven.` : e.length > 0 && e.length <= i ? `${e.length} resultaten gevonden.` : c ? "Zoeken..." : "Geen resultaten gevonden.", S = (e) => e ? /* @__PURE__ */ n("div", { style: { padding: "0.5rem 1rem", fontWeight: "600" }, children: C(e) }, "result-count") : null, R = (e) => {
81
+ o(null), t.onSelect(e);
78
82
  };
79
83
  return /* @__PURE__ */ n("div", { style: { width: "20rem", display: "flex", justifyContent: "flex-end" }, children: /* @__PURE__ */ n(
80
- l,
84
+ r,
81
85
  {
82
86
  placeholder: "Zoek...",
83
87
  id: "search-field-1",
84
88
  isLoading: c,
85
89
  isCompact: t.isCompact,
86
- onChange: (e) => C(e),
87
- onSelect: (e) => R(e),
88
- resultCountRow: b(p || []),
89
- children: p?.map((e) => /* @__PURE__ */ n(
90
- l.ResultOption,
90
+ onChange: (e) => b(e),
91
+ resultCountRow: S(u || []),
92
+ children: u?.map((e) => /* @__PURE__ */ n(
93
+ r.ResultOption,
91
94
  {
92
- ariaLabel: `${e.code}, ${e.name[u]}`,
95
+ ariaLabel: `${e.code}, ${e.name[p]}`,
93
96
  value: f(
94
97
  g,
95
98
  e.programmeType,
96
- e.programmeCode,
99
+ e.programmeCode || "",
97
100
  e.code
98
101
  ),
99
- children: /* @__PURE__ */ w("div", { style: { display: "flex", gap: "1rem" }, children: [
102
+ onSelect: R,
103
+ onEscape: () => o(null),
104
+ children: /* @__PURE__ */ E("div", { style: { display: "flex", gap: "1rem" }, children: [
100
105
  /* @__PURE__ */ n("span", { children: e.code }),
101
- /* @__PURE__ */ n("span", { style: { whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, children: e.name[u] })
106
+ /* @__PURE__ */ n("span", { style: { whiteSpace: "nowrap", overflow: "hidden", textOverflow: "ellipsis" }, children: e.name[p] })
102
107
  ] })
103
108
  },
104
109
  e.id
105
110
  ))
106
111
  }
107
112
  ) });
108
- }, N = x.bind({});
113
+ }, N = T.bind({});
109
114
  export {
110
115
  N as InputExample,
111
116
  M as default
@@ -1 +1 @@
1
- {"version":3,"file":"SearcheField.stories.js","sources":["../../../src/components/SearchField/SearcheField.stories.tsx"],"sourcesContent":["import { useState } from 'react';\r\n\r\nimport type { Meta, StoryFn } from '@storybook/react';\r\nimport type { SearchFieldProps } from './SearchField';\r\n\r\nimport { SearchField } from './SearchField';\r\nimport { MOCK_DATA } from './mockData';\r\n\r\nconst codeString = `\r\n// Has all HTMLInputElement props available except \"className\" and \"style\" \r\n<SearchField \r\n id={string} \r\n queryLength?={number}\r\n placeholder?={string} \r\n isLoading?={boolean} \r\n isCompact?={boolean} \r\n onChange?={function}\r\n onSelect?={function}\r\n children={ReactNode}\r\n resultCountRow?={ReactNode}\r\n>\r\n <SearchField.ResultOption>\r\n {loop custom options here}\r\n </SearchField.ResultOption>\r\n</SearchField>`;\r\n\r\nconst MIN_QUERY_LENGTH = 4;\r\nconst MAX_RESULTS = 12;\r\nconst QUERY_SPEED = 1000; // ms\r\n\r\nenum ProgrammeType {\r\n DEGREE = 'degree-programme',\r\n CERTIFICATE = 'certificate-programme',\r\n ADMINISTRATIVE = 'administrative-programme',\r\n}\r\n\r\ninterface SearchResult {\r\n __typename: string;\r\n id: string;\r\n code: string;\r\n name: {\r\n EN: string;\r\n NL: string;\r\n };\r\n programmeType: string;\r\n programmeCode: string;\r\n}\r\n\r\n// eslint-disable-next-line import/no-default-export\r\nexport default {\r\n title: 'Molecules/SearchField',\r\n component: SearchField,\r\n args: {},\r\n argTypes: {\r\n onSelect: {\r\n action: 'selected url',\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n onChange: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n children: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n id: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n resultCountRow: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n isCompact: {\r\n control: 'boolean',\r\n default: false,\r\n },\r\n },\r\n parameters: {\r\n inspectComponent: SearchField,\r\n codeString: codeString,\r\n },\r\n} as Meta<SearchFieldProps>;\r\n\r\nconst Template: StoryFn<SearchFieldProps> = (args) => {\r\n const [loading, setLoading] = useState(false);\r\n const [searchResults, setSearchResults] = useState<SearchResult[] | null>();\r\n const academicYear = '2026';\r\n const currentLanguage = 'NL';\r\n\r\n const createUrl = (\r\n academicYear: string,\r\n programmeType: keyof typeof ProgrammeType,\r\n programmeCode: string,\r\n code: string\r\n ) => `education-preparation/${ProgrammeType[programmeType]}/${academicYear}/${programmeCode}/${code}`;\r\n\r\n const searchInMockData = (query: string) => {\r\n if (query.length < MIN_QUERY_LENGTH) {\r\n setSearchResults(null);\r\n return;\r\n }\r\n setLoading(true);\r\n\r\n const lowerCaseQuery = query.toLowerCase();\r\n\r\n const mockResults = MOCK_DATA.filter(\r\n (item) => item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\r\n );\r\n\r\n setTimeout(() => {\r\n setSearchResults(mockResults);\r\n setLoading(false);\r\n }, QUERY_SPEED);\r\n };\r\n\r\n const getResultMessage = (results: SearchResult[]) => {\r\n if (results.length > MAX_RESULTS) {\r\n return `${results.length} resultaten gevonden, alleen de ${MAX_RESULTS} beste resultaten worden weergegeven.`;\r\n } else if (results.length > 0 && results.length <= MAX_RESULTS) {\r\n return `${results.length} resultaten gevonden.`;\r\n } else if (loading) {\r\n return 'Zoeken...';\r\n } else {\r\n return 'Geen resultaten gevonden.';\r\n }\r\n };\r\n\r\n const resultBar = (results: SearchResult[]) =>\r\n results ? (\r\n <div key={'result-count'} style={{ padding: '0.5rem 1rem', fontWeight: '600' }}>\r\n {getResultMessage(results)}\r\n </div>\r\n ) : null;\r\n\r\n const handleSelect = (value: string | number) => {\r\n setSearchResults(null);\r\n args.onSelect?.(value);\r\n };\r\n\r\n return (\r\n <div style={{ width: '20rem', display: 'flex', justifyContent: 'flex-end' }}>\r\n <SearchField\r\n placeholder=\"Zoek...\"\r\n id=\"search-field-1\"\r\n isLoading={loading}\r\n isCompact={args.isCompact}\r\n onChange={(event) => searchInMockData(event)}\r\n onSelect={(event) => handleSelect(event)}\r\n resultCountRow={resultBar(searchResults || [])}\r\n >\r\n {searchResults?.map((result) => (\r\n <SearchField.ResultOption\r\n key={result.id}\r\n ariaLabel={`${result.code}, ${result.name[currentLanguage]}`}\r\n value={createUrl(\r\n academicYear,\r\n result.programmeType as keyof typeof ProgrammeType,\r\n result.programmeCode,\r\n result.code\r\n )}\r\n >\r\n <div style={{ display: 'flex', gap: '1rem' }}>\r\n <span>{result.code}</span>\r\n <span style={{ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {result.name[currentLanguage]}\r\n </span>\r\n </div>\r\n </SearchField.ResultOption>\r\n ))}\r\n </SearchField>\r\n </div>\r\n );\r\n};\r\n\r\nexport const InputExample = Template.bind({});\r\n"],"names":["codeString","MIN_QUERY_LENGTH","MAX_RESULTS","QUERY_SPEED","ProgrammeType","SearcheField_stories","SearchField","Template","args","loading","setLoading","useState","searchResults","setSearchResults","academicYear","currentLanguage","createUrl","programmeType","programmeCode","code","searchInMockData","query","lowerCaseQuery","mockResults","MOCK_DATA","item","getResultMessage","results","resultBar","jsx","handleSelect","value","event","result","jsxs","InputExample"],"mappings":"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"}
1
+ {"version":3,"file":"SearcheField.stories.js","sources":["../../../src/components/SearchField/SearcheField.stories.tsx"],"sourcesContent":["import { useState } from 'react';\r\n\r\nimport type { Meta, StoryFn } from '@storybook/react';\r\nimport type { SearchFieldProps } from './SearchField';\r\n\r\nimport { SearchField } from './SearchField';\r\nimport { MOCK_DATA } from './mockData';\r\n\r\nconst codeString = `\r\n// Has all HTMLInputElement props available except \"className\" and \"style\" \r\n<SearchField \r\n id={string} \r\n queryLength?={number}\r\n placeholder?={string} \r\n isLoading?={boolean} \r\n isCompact?={boolean} \r\n onChange={function}\r\n children={ReactNode}\r\n resultCountRow?={ReactNode}\r\n>\r\n <SearchField.ResultOption \r\n onSelect={function} \r\n onEscape={function} \r\n value={string|number} \r\n key={string|number} \r\n ariaLabel={string}>\r\n {loop custom options here}\r\n </SearchField.ResultOption>\r\n</SearchField>`;\r\n\r\nconst MIN_QUERY_LENGTH = 4;\r\nconst MAX_RESULTS = 12;\r\nconst QUERY_SPEED = 1000; // ms\r\n\r\nenum ProgrammeType {\r\n DEGREE = 'degree-programme',\r\n CERTIFICATE = 'certificate-programme',\r\n ADMINISTRATIVE = 'administrative-programme',\r\n}\r\n\r\ninterface SearchResult {\r\n __typename: string;\r\n id: string;\r\n code: string;\r\n name: {\r\n EN: string;\r\n NL: string;\r\n };\r\n programmeType: string;\r\n programmeCode?: string;\r\n}\r\n\r\n// eslint-disable-next-line import/no-default-export\r\nexport default {\r\n title: 'Molecules/SearchField',\r\n component: SearchField,\r\n args: {},\r\n argTypes: {\r\n onSelect: {\r\n action: 'selected url',\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n onChange: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n children: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n id: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n resultCountRow: {\r\n table: {\r\n disable: true,\r\n },\r\n },\r\n isCompact: {\r\n control: 'boolean',\r\n default: false,\r\n },\r\n },\r\n parameters: {\r\n inspectComponent: SearchField,\r\n codeString: codeString,\r\n },\r\n} as Meta<SearchFieldProps & { onSelect: (value: string | number) => void }>;\r\n\r\nconst Template: StoryFn<SearchFieldProps & { onSelect: (value: string | number) => void }> = (args) => {\r\n const [loading, setLoading] = useState(false);\r\n const [searchResults, setSearchResults] = useState<SearchResult[] | null>();\r\n const academicYear = '2026';\r\n const currentLanguage = 'NL';\r\n\r\n const createUrl = (\r\n academicYear: string,\r\n programmeType: keyof typeof ProgrammeType,\r\n programmeCode: string,\r\n code: string\r\n ) => `education-preparation/${ProgrammeType[programmeType]}/${academicYear}/${programmeCode}/${code}`;\r\n\r\n const searchInMockData = (query: string) => {\r\n if (query.length < MIN_QUERY_LENGTH) {\r\n setSearchResults(null);\r\n return;\r\n }\r\n setLoading(true);\r\n\r\n const lowerCaseQuery = query.toLowerCase();\r\n\r\n const mockResults = MOCK_DATA.filter(\r\n (item) => item.name.NL.toLowerCase().includes(lowerCaseQuery) || item.code.toLowerCase().includes(lowerCaseQuery)\r\n );\r\n\r\n setTimeout(() => {\r\n setSearchResults(mockResults);\r\n setLoading(false);\r\n }, QUERY_SPEED);\r\n };\r\n\r\n const getResultMessage = (results: SearchResult[]) => {\r\n if (results.length > MAX_RESULTS) {\r\n return `${results.length} resultaten gevonden, alleen de ${MAX_RESULTS} beste resultaten worden weergegeven.`;\r\n } else if (results.length > 0 && results.length <= MAX_RESULTS) {\r\n return `${results.length} resultaten gevonden.`;\r\n } else if (loading) {\r\n return 'Zoeken...';\r\n } else {\r\n return 'Geen resultaten gevonden.';\r\n }\r\n };\r\n\r\n const resultBar = (results: SearchResult[]) =>\r\n results ? (\r\n <div key={'result-count'} style={{ padding: '0.5rem 1rem', fontWeight: '600' }}>\r\n {getResultMessage(results)}\r\n </div>\r\n ) : null;\r\n\r\n const handleSelect = (value: string | number) => {\r\n setSearchResults(null);\r\n args.onSelect(value);\r\n };\r\n\r\n return (\r\n <div style={{ width: '20rem', display: 'flex', justifyContent: 'flex-end' }}>\r\n <SearchField\r\n placeholder=\"Zoek...\"\r\n id=\"search-field-1\"\r\n isLoading={loading}\r\n isCompact={args.isCompact}\r\n onChange={(event) => searchInMockData(event)}\r\n resultCountRow={resultBar(searchResults || [])}\r\n >\r\n {searchResults?.map((result) => (\r\n <SearchField.ResultOption\r\n key={result.id}\r\n ariaLabel={`${result.code}, ${result.name[currentLanguage]}`}\r\n value={createUrl(\r\n academicYear,\r\n result.programmeType as keyof typeof ProgrammeType,\r\n result.programmeCode || '',\r\n result.code\r\n )}\r\n onSelect={handleSelect}\r\n onEscape={() => setSearchResults(null)}\r\n >\r\n <div style={{ display: 'flex', gap: '1rem' }}>\r\n <span>{result.code}</span>\r\n <span style={{ whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {result.name[currentLanguage]}\r\n </span>\r\n </div>\r\n </SearchField.ResultOption>\r\n ))}\r\n </SearchField>\r\n </div>\r\n );\r\n};\r\n\r\nexport const InputExample = Template.bind({});\r\n"],"names":["codeString","MIN_QUERY_LENGTH","MAX_RESULTS","QUERY_SPEED","ProgrammeType","SearcheField_stories","SearchField","Template","args","loading","setLoading","useState","searchResults","setSearchResults","academicYear","currentLanguage","createUrl","programmeType","programmeCode","code","searchInMockData","query","lowerCaseQuery","mockResults","MOCK_DATA","item","getResultMessage","results","resultBar","jsx","handleSelect","value","event","result","jsxs","InputExample"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs as o, jsx as r } from "react/jsx-runtime";
2
2
  import { forwardRef as a, Fragment as i } from "react";
3
- import { s } from "../../../SearchField.module-DTDxokfU.js";
3
+ import { s } from "../../../SearchField.module-Be9ZoU-6.js";
4
4
  const m = a(({ children: t, resultCountRow: e }, l) => /* @__PURE__ */ o("div", { className: s["search-field__result-wrapper"], ref: l, children: [
5
5
  /* @__PURE__ */ r("ul", { className: s["search-field__result-list"], role: "listbox", tabIndex: -1, children: t }),
6
6
  e && /* @__PURE__ */ r(i, { children: e }, "result-count")
@@ -4,6 +4,8 @@ export interface ResultOptionProps {
4
4
  key: string | number;
5
5
  ariaLabel: string;
6
6
  children: ReactNode;
7
- onSelect?: (value: string | number) => void;
7
+ onEscape: () => void;
8
+ onReset?: () => void;
9
+ onSelect: (value: string | number) => void;
8
10
  }
9
- export declare const ResultOption: ({ value, key, children, onSelect, ariaLabel }: ResultOptionProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const ResultOption: ({ value, key, ariaLabel, children, onSelect, onReset, onEscape }: ResultOptionProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,37 +1,56 @@
1
- import { jsx as i } from "react/jsx-runtime";
2
- import { s as c } from "../../../SearchField.module-DTDxokfU.js";
3
- const f = ({ value: o, key: a, children: s, onSelect: r, ariaLabel: l }) => {
4
- const t = (e) => {
5
- e.stopPropagation(), r && r(o);
6
- }, n = (e) => {
1
+ import { jsx as b } from "react/jsx-runtime";
2
+ import { s as c } from "../../../SearchField.module-Be9ZoU-6.js";
3
+ const m = ({ value: o, key: i, ariaLabel: n, children: s, onSelect: p, onReset: a, onEscape: r }) => {
4
+ const l = (e) => {
5
+ e.stopPropagation(), r(), a && a(), p(o);
6
+ }, u = (e) => {
7
7
  switch (e.key) {
8
+ case "Escape":
9
+ e.preventDefault(), e.stopPropagation(), r();
10
+ break;
8
11
  case "Enter":
9
- e.preventDefault(), t(e);
12
+ e.preventDefault(), l(e);
13
+ break;
14
+ case "ArrowDown": {
15
+ e.preventDefault(), e.stopPropagation();
16
+ let t = e.currentTarget.nextElementSibling;
17
+ for (; t?.getAttribute("tabindex") === "-1"; )
18
+ t = t.nextElementSibling;
19
+ t?.focus();
20
+ break;
21
+ }
22
+ case "ArrowUp": {
23
+ e.preventDefault(), e.stopPropagation();
24
+ let t = e.currentTarget.previousElementSibling;
25
+ for (; t?.getAttribute("tabindex") === "-1"; )
26
+ t = t.previousElementSibling;
27
+ t?.focus();
10
28
  break;
11
- case "ArrowDown":
12
- e.preventDefault(), e.currentTarget.nextElementSibling?.focus();
29
+ }
30
+ case "Tab":
31
+ e.preventDefault(), r();
13
32
  break;
14
- case "ArrowUp":
15
- e.preventDefault(), e.currentTarget.previousElementSibling?.focus();
33
+ default:
34
+ e.preventDefault();
16
35
  break;
17
36
  }
18
37
  };
19
- return /* @__PURE__ */ i(
38
+ return /* @__PURE__ */ b(
20
39
  "li",
21
40
  {
22
41
  className: c["search-field__result-item"],
23
- onClick: t,
24
- onKeyDown: n,
42
+ onClick: l,
43
+ onKeyDown: u,
25
44
  role: "option",
26
45
  "aria-selected": "false",
27
46
  tabIndex: 0,
28
- "aria-label": l,
47
+ "aria-label": n,
29
48
  children: s
30
49
  },
31
- a
50
+ i
32
51
  );
33
52
  };
34
53
  export {
35
- f as ResultOption
54
+ m as ResultOption
36
55
  };
37
56
  //# sourceMappingURL=ResultsOption.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResultsOption.js","sources":["../../../../src/components/SearchField/components/ResultsOption.tsx"],"sourcesContent":["import type { ReactNode, KeyboardEvent } from 'react';\r\n\r\nimport styles from 'components/SearchField/SearchField.module.css';\r\n\r\nexport interface ResultOptionProps {\r\n value: string | number;\r\n key: string | number;\r\n ariaLabel: string;\r\n children: ReactNode;\r\n onSelect?: (value: string | number) => void;\r\n}\r\n\r\nexport const ResultOption = ({ value, key, children, onSelect, ariaLabel }: ResultOptionProps) => {\r\n const handleSelect = (event: React.MouseEvent | React.KeyboardEvent) => {\r\n event.stopPropagation();\r\n if (onSelect) {\r\n onSelect(value);\r\n }\r\n };\r\n\r\n const onOptionKeyDown = (event: KeyboardEvent<HTMLLIElement>) => {\r\n switch (event.key) {\r\n case 'Enter':\r\n event.preventDefault();\r\n handleSelect(event);\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n (event.currentTarget.nextElementSibling as HTMLLIElement)?.focus();\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n (event.currentTarget.previousElementSibling as HTMLLIElement)?.focus();\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <li\r\n className={styles['search-field__result-item']}\r\n key={key}\r\n onClick={handleSelect}\r\n onKeyDown={onOptionKeyDown}\r\n role=\"option\"\r\n aria-selected=\"false\"\r\n tabIndex={0}\r\n aria-label={ariaLabel}\r\n >\r\n {children}\r\n </li>\r\n );\r\n};\r\n"],"names":["ResultOption","value","key","children","onSelect","ariaLabel","handleSelect","event","onOptionKeyDown","jsx","styles"],"mappings":";;AAYO,MAAMA,IAAe,CAAC,EAAE,OAAAC,GAAO,KAAAC,GAAK,UAAAC,GAAU,UAAAC,GAAU,WAAAC,QAAmC;AAChG,QAAMC,IAAe,CAACC,MAAkD;AACtE,IAAAA,EAAM,gBAAA,GACFH,KACFA,EAASH,CAAK;AAAA,EAElB,GAEMO,IAAkB,CAACD,MAAwC;AAC/D,YAAQA,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAA,EAAM,eAAA,GACND,EAAaC,CAAK;AAClB;AAAA,MACF,KAAK;AACH,QAAAA,EAAM,eAAA,GACLA,EAAM,cAAc,oBAAsC,MAAA;AAC3D;AAAA,MACF,KAAK;AACH,QAAAA,EAAM,eAAA,GACLA,EAAM,cAAc,wBAA0C,MAAA;AAC/D;AAAA,IAAA;AAAA,EAEN;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO,2BAA2B;AAAA,MAE7C,SAASJ;AAAA,MACT,WAAWE;AAAA,MACX,MAAK;AAAA,MACL,iBAAc;AAAA,MACd,UAAU;AAAA,MACV,cAAYH;AAAA,MAEX,UAAAF;AAAA,IAAA;AAAA,IARID;AAAA,EAAA;AAWX;"}
1
+ {"version":3,"file":"ResultsOption.js","sources":["../../../../src/components/SearchField/components/ResultsOption.tsx"],"sourcesContent":["import type { ReactNode, KeyboardEvent } from 'react';\r\n\r\nimport styles from 'components/SearchField/SearchField.module.css';\r\n\r\nexport interface ResultOptionProps {\r\n value: string | number;\r\n key: string | number;\r\n ariaLabel: string;\r\n children: ReactNode;\r\n onEscape: () => void;\r\n onReset?: () => void;\r\n onSelect: (value: string | number) => void;\r\n}\r\n\r\nexport const ResultOption = ({ value, key, ariaLabel, children, onSelect, onReset, onEscape }: ResultOptionProps) => {\r\n const handleSelect = (event: React.MouseEvent | React.KeyboardEvent) => {\r\n event.stopPropagation();\r\n onEscape();\r\n if (onReset) onReset();\r\n onSelect(value);\r\n };\r\n\r\n const onOptionKeyDown = (event: KeyboardEvent<HTMLLIElement>) => {\r\n switch (event.key) {\r\n case 'Escape':\r\n event.preventDefault();\r\n event.stopPropagation();\r\n onEscape();\r\n break;\r\n case 'Enter':\r\n event.preventDefault();\r\n handleSelect(event);\r\n break;\r\n case 'ArrowDown': {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let nextElement = event.currentTarget.nextElementSibling;\r\n while (nextElement?.getAttribute('tabindex') === '-1') {\r\n nextElement = nextElement.nextElementSibling;\r\n }\r\n (nextElement as HTMLLIElement)?.focus();\r\n break;\r\n }\r\n case 'ArrowUp': {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n let previousElement = event.currentTarget.previousElementSibling;\r\n while (previousElement?.getAttribute('tabindex') === '-1') {\r\n previousElement = previousElement.previousElementSibling;\r\n }\r\n (previousElement as HTMLLIElement)?.focus();\r\n break;\r\n }\r\n case 'Tab':\r\n event.preventDefault();\r\n onEscape();\r\n break;\r\n default:\r\n event.preventDefault();\r\n break;\r\n }\r\n };\r\n\r\n return (\r\n <li\r\n className={styles['search-field__result-item']}\r\n key={key}\r\n onClick={handleSelect}\r\n onKeyDown={onOptionKeyDown}\r\n role=\"option\"\r\n aria-selected=\"false\"\r\n tabIndex={0}\r\n aria-label={ariaLabel}\r\n >\r\n {children}\r\n </li>\r\n );\r\n};\r\n"],"names":["ResultOption","value","key","ariaLabel","children","onSelect","onReset","onEscape","handleSelect","event","onOptionKeyDown","nextElement","previousElement","jsx","styles"],"mappings":";;AAcO,MAAMA,IAAe,CAAC,EAAE,OAAAC,GAAO,KAAAC,GAAK,WAAAC,GAAW,UAAAC,GAAU,UAAAC,GAAU,SAAAC,GAAS,UAAAC,QAAkC;AACnH,QAAMC,IAAe,CAACC,MAAkD;AACtE,IAAAA,EAAM,gBAAA,GACNF,EAAA,GACID,KAASA,EAAA,GACbD,EAASJ,CAAK;AAAA,EAChB,GAEMS,IAAkB,CAACD,MAAwC;AAC/D,YAAQA,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNF,EAAA;AACA;AAAA,MACF,KAAK;AACH,QAAAE,EAAM,eAAA,GACND,EAAaC,CAAK;AAClB;AAAA,MACF,KAAK,aAAa;AAChB,QAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN,YAAIE,IAAcF,EAAM,cAAc;AACtC,eAAOE,GAAa,aAAa,UAAU,MAAM;AAC/C,UAAAA,IAAcA,EAAY;AAE3B,QAAAA,GAA+B,MAAA;AAChC;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,QAAAF,EAAM,eAAA,GACNA,EAAM,gBAAA;AACN,YAAIG,IAAkBH,EAAM,cAAc;AAC1C,eAAOG,GAAiB,aAAa,UAAU,MAAM;AACnD,UAAAA,IAAkBA,EAAgB;AAEnC,QAAAA,GAAmC,MAAA;AACpC;AAAA,MACF;AAAA,MACA,KAAK;AACH,QAAAH,EAAM,eAAA,GACNF,EAAA;AACA;AAAA,MACF;AACE,QAAAE,EAAM,eAAA;AACN;AAAA,IAAA;AAAA,EAEN;AAEA,SACE,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO,2BAA2B;AAAA,MAE7C,SAASN;AAAA,MACT,WAAWE;AAAA,MACX,MAAK;AAAA,MACL,iBAAc;AAAA,MACd,UAAU;AAAA,MACV,cAAYP;AAAA,MAEX,UAAAC;AAAA,IAAA;AAAA,IARIF;AAAA,EAAA;AAWX;"}
@@ -1,4 +1,4 @@
1
- export declare const MOCK_DATA: {
1
+ export declare const MOCK_DATA: ({
2
2
  __typename: string;
3
3
  code: string;
4
4
  id: string;
@@ -8,4 +8,14 @@ export declare const MOCK_DATA: {
8
8
  };
9
9
  programmeType: string;
10
10
  programmeCode: string;
11
- }[];
11
+ } | {
12
+ __typename: string;
13
+ code: string;
14
+ id: string;
15
+ name: {
16
+ EN: string;
17
+ NL: string;
18
+ };
19
+ programmeType: string;
20
+ programmeCode?: undefined;
21
+ })[];
@@ -1,234 +1,133 @@
1
1
  const e = [
2
2
  {
3
3
  __typename: "EduPrepCourseSearchHit",
4
- code: "6414M0208Y",
5
- id: "oh:course:6414M0208Y",
4
+ code: "6614ZM038Y",
5
+ id: "oh:course:6614ZM038Y",
6
6
  name: {
7
- EN: "Tax Accounting",
8
- NL: "Tax Accounting"
9
- },
10
- programmeType: "DEGREE",
11
- programmeCode: "EMA_FEC"
12
- },
13
- {
14
- __typename: "EduPrepCourseSearchHit",
15
- code: "3354TAXAVY",
16
- id: "oh:course:3354TAXAVY",
17
- name: {
18
- EN: "Tax Accounting I",
19
- NL: "Tax Accounting I"
20
- },
21
- programmeType: "DEGREE",
22
- programmeCode: "RMA_FISREC"
23
- },
24
- {
25
- __typename: "EduPrepCourseSearchHit",
26
- code: "3354TAX2VY",
27
- id: "oh:course:3354TAX2VY",
28
- name: {
29
- EN: "Tax Accounting II",
30
- NL: "Tax Accounting II"
31
- },
32
- programmeType: "DEGREE",
33
- programmeCode: "RMA_FISREC"
34
- },
35
- {
36
- __typename: "EduPrepCourseSearchHit",
37
- code: "6614ZD028Y",
38
- id: "oh:course:6614ZD028Y",
39
- name: {
40
- EN: "Financial Accounting",
41
- NL: "Financial Accounting"
42
- },
43
- programmeType: "DEGREE",
44
- programmeCode: "EMA_BA"
45
- },
46
- {
47
- __typename: "EduPrepCourseSearchHit",
48
- code: "6614ZH027Y",
49
- id: "oh:course:6614ZH027Y",
50
- name: {
51
- EN: "Financial Accounting",
52
- NL: "Financial Accounting"
7
+ EN: "Digital Business",
8
+ NL: "Digital Business"
53
9
  },
54
10
  programmeType: "DEGREE",
55
11
  programmeCode: "EMA_BA"
56
12
  },
57
13
  {
58
14
  __typename: "EduPrepCourseSearchHit",
59
- code: "6614ZI011Y",
60
- id: "oh:course:6614ZI011Y",
61
- name: {
62
- EN: "Management Accounting",
63
- NL: "Management Accounting"
64
- },
65
- programmeType: "DEGREE",
66
- programmeCode: "EMA_EMAS"
67
- },
68
- {
69
- __typename: "EduPrepCourseSearchHit",
70
- code: "6012B0806Y",
71
- id: "oh:course:6012B0806Y",
15
+ code: "6013B0522Y",
16
+ id: "oh:course:6013B0522Y",
72
17
  name: {
73
- EN: "Accounting and Control",
74
- NL: "Accounting and Control"
75
- },
76
- programmeType: "DEGREE",
77
- programmeCode: "EBA_ANALY"
78
- },
79
- {
80
- __typename: "EduPrepCourseSearchHit",
81
- code: "6013B0511Y",
82
- id: "oh:course:6013B0511Y",
83
- name: {
84
- EN: "Financial Accounting 2",
85
- NL: "Financial Accounting 2"
18
+ EN: "Business Analytics",
19
+ NL: "Business Analytics"
86
20
  },
87
21
  programmeType: "DEGREE",
88
22
  programmeCode: "EBA_BUSAD"
89
23
  },
90
24
  {
91
25
  __typename: "EduPrepCourseSearchHit",
92
- code: "133221146Y",
93
- id: "oh:course:133221146Y",
26
+ code: "6314M0573Y",
27
+ id: "oh:course:6314M0573Y",
94
28
  name: {
95
- EN: "Language Contact",
96
- NL: "Language Contact"
29
+ EN: "Business Seminar 1",
30
+ NL: "Business Seminar 1"
97
31
  },
98
32
  programmeType: "DEGREE",
99
- programmeCode: "HBA_SL"
33
+ programmeCode: "EMA_BAD"
100
34
  },
101
35
  {
102
36
  __typename: "EduPrepCourseSearchHit",
103
- code: "184410096Y",
104
- id: "oh:course:184410096Y",
37
+ code: "6314M0574Y",
38
+ id: "oh:course:6314M0574Y",
105
39
  name: {
106
- EN: "Language Assessment",
107
- NL: "Language Assessment"
40
+ EN: "Business Seminar 2",
41
+ NL: "Business Seminar 2"
108
42
  },
109
43
  programmeType: "DEGREE",
110
- programmeCode: "HMA_TW"
44
+ programmeCode: "EMA_BAD"
111
45
  },
112
46
  {
113
47
  __typename: "EduPrepCourseSearchHit",
114
- code: "6614ZD020Y",
115
- id: "oh:course:6614ZD020Y",
48
+ code: "6614ZB008Y",
49
+ id: "oh:course:6614ZB008Y",
116
50
  name: {
117
- EN: "Language Technology",
118
- NL: "Language Technology"
51
+ EN: "New Business Models",
52
+ NL: "New Business Models"
119
53
  },
120
54
  programmeType: "DEGREE",
121
- programmeCode: "EMA_BA"
55
+ programmeCode: "EMA_EPMS"
122
56
  },
123
57
  {
124
58
  __typename: "EduPrepCourseSearchHit",
125
- code: "17842A016Y",
126
- id: "oh:course:17842A016Y",
59
+ code: "5394QUIB3Y",
60
+ id: "oh:course:5394QUIB3Y",
127
61
  name: {
128
- EN: "Masterlanguage course",
129
- NL: "Masterlanguage course"
62
+ EN: "Quantum in Business",
63
+ NL: "Quantum in Business"
130
64
  },
131
65
  programmeType: "DEGREE",
132
- programmeCode: "HMA_LS"
66
+ programmeCode: "NMA_QCS"
133
67
  },
134
68
  {
135
- __typename: "EduPrepCourseSearchHit",
136
- code: "136213116Y",
137
- id: "oh:course:136213116Y",
69
+ __typename: "EduPrepProgrammeSearchHit",
70
+ code: "EBA_ANALY",
71
+ id: "oh:programme:EBA_ANALY",
138
72
  name: {
139
- EN: "Language and Cognition",
140
- NL: "Language and Cognition"
73
+ EN: "B Business Analytics",
74
+ NL: "B Business Analytics"
141
75
  },
142
- programmeType: "DEGREE",
143
- programmeCode: "HBA_FI"
76
+ programmeType: "DEGREE"
144
77
  },
145
78
  {
146
- __typename: "EduPrepCourseSearchHit",
147
- code: "133221166Y",
148
- id: "oh:course:133221166Y",
79
+ __typename: "EduPrepProgrammeSearchHit",
80
+ code: "EMA_BE",
81
+ id: "oh:programme:EMA_BE",
149
82
  name: {
150
- EN: "The World in Languages",
151
- NL: "The World in Languages"
83
+ EN: "M Business Economics",
84
+ NL: "M Business Economics"
152
85
  },
153
- programmeType: "DEGREE",
154
- programmeCode: "HBA_SL"
86
+ programmeType: "DEGREE"
155
87
  },
156
88
  {
157
89
  __typename: "EduPrepCourseSearchHit",
158
- code: "6013B0539Y",
159
- id: "oh:course:6013B0539Y",
90
+ code: "6314M0341Y",
91
+ id: "oh:course:6314M0341Y",
160
92
  name: {
161
- EN: "Dutch Language Skills 1a",
162
- NL: "Dutch Language Skills 1a"
93
+ EN: "Business Negotiations",
94
+ NL: "Business Negotiations"
163
95
  },
164
96
  programmeType: "DEGREE",
165
- programmeCode: "EBA_BUSAD"
97
+ programmeCode: "EMA_BAD"
166
98
  },
167
99
  {
168
100
  __typename: "EduPrepCourseSearchHit",
169
- code: "133219002Y",
170
- id: "oh:course:133219002Y",
101
+ code: "6614ZB043Y",
102
+ id: "oh:course:6614ZB043Y",
171
103
  name: {
172
- EN: "BA thesis Slavic Languages and Cultures",
173
- NL: "Bachelorscriptie Slavische talen en culturen"
104
+ EN: "Business Negotiations",
105
+ NL: "Business Negotiations"
174
106
  },
175
107
  programmeType: "DEGREE",
176
- programmeCode: "HBA_SL"
108
+ programmeCode: "EMA_EPMS"
177
109
  },
178
110
  {
179
111
  __typename: "EduPrepCourseSearchHit",
180
- code: "133219026Y",
181
- id: "oh:course:133219026Y",
112
+ code: "6614ZM051Y",
113
+ id: "oh:course:6614ZM051Y",
182
114
  name: {
183
- EN: "Slavic Research Lab",
184
- NL: "Slavisch onderzoekslab"
115
+ EN: "Business Negotiations",
116
+ NL: "Business Negotiations"
185
117
  },
186
118
  programmeType: "DEGREE",
187
- programmeCode: "HBA_SL"
188
- },
189
- {
190
- __typename: "EduPrepCourseSearchHit",
191
- code: "133221006Y",
192
- id: "oh:course:133221006Y",
193
- name: {
194
- EN: "Czech Language Acquisition 5",
195
- NL: "Taalvaardigheid Tsjechisch 5"
196
- },
197
- programmeType: "DEGREE",
198
- programmeCode: "HBA_SL"
199
- },
200
- {
201
- __typename: "EduPrepCourseSearchHit",
202
- code: "133221016Y",
203
- id: "oh:course:133221016Y",
204
- name: {
205
- EN: "Czech Language Acquisition 6",
206
- NL: "Taalvaardigheid Tsjechisch 6"
207
- },
208
- programmeType: "DEGREE",
209
- programmeCode: "HBA_SL"
210
- },
211
- {
212
- __typename: "EduPrepCourseSearchHit",
213
- code: "133221018Y",
214
- id: "oh:course:133221018Y",
215
- name: {
216
- EN: "Study Abroad Slavonic Languages and Cultures",
217
- NL: "Buitenlandverblijf Slavische talen en culturen"
218
- },
219
- programmeType: "DEGREE",
220
- programmeCode: "HBA_SL"
119
+ programmeCode: "EMA_BA"
221
120
  },
222
121
  {
223
122
  __typename: "EduPrepCourseSearchHit",
224
- code: "133221046Y",
225
- id: "oh:course:133221046Y",
123
+ code: "6614ZM044Y",
124
+ id: "oh:course:6614ZM044Y",
226
125
  name: {
227
- EN: "The World in Languages",
228
- NL: "De wereld in talen"
126
+ EN: "Scaling-up Businesses",
127
+ NL: "Scaling-up Businesses"
229
128
  },
230
129
  programmeType: "DEGREE",
231
- programmeCode: "HBA_SL"
130
+ programmeCode: "EMA_BA"
232
131
  }
233
132
  ];
234
133
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"mockData.js","sources":["../../../src/components/SearchField/mockData.ts"],"sourcesContent":["export const MOCK_DATA = [\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6414M0208Y',\r\n id: 'oh:course:6414M0208Y',\r\n name: {\r\n EN: 'Tax Accounting',\r\n NL: 'Tax Accounting',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_FEC',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '3354TAXAVY',\r\n id: 'oh:course:3354TAXAVY',\r\n name: {\r\n EN: 'Tax Accounting I',\r\n NL: 'Tax Accounting I',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'RMA_FISREC',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '3354TAX2VY',\r\n id: 'oh:course:3354TAX2VY',\r\n name: {\r\n EN: 'Tax Accounting II',\r\n NL: 'Tax Accounting II',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'RMA_FISREC',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZD028Y',\r\n id: 'oh:course:6614ZD028Y',\r\n name: {\r\n EN: 'Financial Accounting',\r\n NL: 'Financial Accounting',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BA',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZH027Y',\r\n id: 'oh:course:6614ZH027Y',\r\n name: {\r\n EN: 'Financial Accounting',\r\n NL: 'Financial Accounting',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BA',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZI011Y',\r\n id: 'oh:course:6614ZI011Y',\r\n name: {\r\n EN: 'Management Accounting',\r\n NL: 'Management Accounting',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_EMAS',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6012B0806Y',\r\n id: 'oh:course:6012B0806Y',\r\n name: {\r\n EN: 'Accounting and Control',\r\n NL: 'Accounting and Control',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EBA_ANALY',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6013B0511Y',\r\n id: 'oh:course:6013B0511Y',\r\n name: {\r\n EN: 'Financial Accounting 2',\r\n NL: 'Financial Accounting 2',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EBA_BUSAD',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133221146Y',\r\n id: 'oh:course:133221146Y',\r\n name: {\r\n EN: 'Language Contact',\r\n NL: 'Language Contact',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '184410096Y',\r\n id: 'oh:course:184410096Y',\r\n name: {\r\n EN: 'Language Assessment',\r\n NL: 'Language Assessment',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HMA_TW',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZD020Y',\r\n id: 'oh:course:6614ZD020Y',\r\n name: {\r\n EN: 'Language Technology',\r\n NL: 'Language Technology',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BA',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '17842A016Y',\r\n id: 'oh:course:17842A016Y',\r\n name: {\r\n EN: 'Masterlanguage course',\r\n NL: 'Masterlanguage course',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HMA_LS',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '136213116Y',\r\n id: 'oh:course:136213116Y',\r\n name: {\r\n EN: 'Language and Cognition',\r\n NL: 'Language and Cognition',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_FI',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133221166Y',\r\n id: 'oh:course:133221166Y',\r\n name: {\r\n EN: 'The World in Languages',\r\n NL: 'The World in Languages',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6013B0539Y',\r\n id: 'oh:course:6013B0539Y',\r\n name: {\r\n EN: 'Dutch Language Skills 1a',\r\n NL: 'Dutch Language Skills 1a',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EBA_BUSAD',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133219002Y',\r\n id: 'oh:course:133219002Y',\r\n name: {\r\n EN: 'BA thesis Slavic Languages and Cultures',\r\n NL: 'Bachelorscriptie Slavische talen en culturen',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133219026Y',\r\n id: 'oh:course:133219026Y',\r\n name: {\r\n EN: 'Slavic Research Lab',\r\n NL: 'Slavisch onderzoekslab',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133221006Y',\r\n id: 'oh:course:133221006Y',\r\n name: {\r\n EN: 'Czech Language Acquisition 5',\r\n NL: 'Taalvaardigheid Tsjechisch 5',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133221016Y',\r\n id: 'oh:course:133221016Y',\r\n name: {\r\n EN: 'Czech Language Acquisition 6',\r\n NL: 'Taalvaardigheid Tsjechisch 6',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133221018Y',\r\n id: 'oh:course:133221018Y',\r\n name: {\r\n EN: 'Study Abroad Slavonic Languages and Cultures',\r\n NL: 'Buitenlandverblijf Slavische talen en culturen',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '133221046Y',\r\n id: 'oh:course:133221046Y',\r\n name: {\r\n EN: 'The World in Languages',\r\n NL: 'De wereld in talen',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'HBA_SL',\r\n },\r\n];\r\n"],"names":["MOCK_DATA"],"mappings":"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"}
1
+ {"version":3,"file":"mockData.js","sources":["../../../src/components/SearchField/mockData.ts"],"sourcesContent":["export const MOCK_DATA = [\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZM038Y',\r\n id: 'oh:course:6614ZM038Y',\r\n name: {\r\n EN: 'Digital Business',\r\n NL: 'Digital Business',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BA',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6013B0522Y',\r\n id: 'oh:course:6013B0522Y',\r\n name: {\r\n EN: 'Business Analytics',\r\n NL: 'Business Analytics',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EBA_BUSAD',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6314M0573Y',\r\n id: 'oh:course:6314M0573Y',\r\n name: {\r\n EN: 'Business Seminar 1',\r\n NL: 'Business Seminar 1',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BAD',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6314M0574Y',\r\n id: 'oh:course:6314M0574Y',\r\n name: {\r\n EN: 'Business Seminar 2',\r\n NL: 'Business Seminar 2',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BAD',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZB008Y',\r\n id: 'oh:course:6614ZB008Y',\r\n name: {\r\n EN: 'New Business Models',\r\n NL: 'New Business Models',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_EPMS',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '5394QUIB3Y',\r\n id: 'oh:course:5394QUIB3Y',\r\n name: {\r\n EN: 'Quantum in Business',\r\n NL: 'Quantum in Business',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'NMA_QCS',\r\n },\r\n {\r\n __typename: 'EduPrepProgrammeSearchHit',\r\n code: 'EBA_ANALY',\r\n id: 'oh:programme:EBA_ANALY',\r\n name: {\r\n EN: 'B Business Analytics',\r\n NL: 'B Business Analytics',\r\n },\r\n programmeType: 'DEGREE',\r\n },\r\n {\r\n __typename: 'EduPrepProgrammeSearchHit',\r\n code: 'EMA_BE',\r\n id: 'oh:programme:EMA_BE',\r\n name: {\r\n EN: 'M Business Economics',\r\n NL: 'M Business Economics',\r\n },\r\n programmeType: 'DEGREE',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6314M0341Y',\r\n id: 'oh:course:6314M0341Y',\r\n name: {\r\n EN: 'Business Negotiations',\r\n NL: 'Business Negotiations',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BAD',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZB043Y',\r\n id: 'oh:course:6614ZB043Y',\r\n name: {\r\n EN: 'Business Negotiations',\r\n NL: 'Business Negotiations',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_EPMS',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZM051Y',\r\n id: 'oh:course:6614ZM051Y',\r\n name: {\r\n EN: 'Business Negotiations',\r\n NL: 'Business Negotiations',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BA',\r\n },\r\n {\r\n __typename: 'EduPrepCourseSearchHit',\r\n code: '6614ZM044Y',\r\n id: 'oh:course:6614ZM044Y',\r\n name: {\r\n EN: 'Scaling-up Businesses',\r\n NL: 'Scaling-up Businesses',\r\n },\r\n programmeType: 'DEGREE',\r\n programmeCode: 'EMA_BA',\r\n },\r\n];\r\n"],"names":["MOCK_DATA"],"mappings":"AAAO,MAAMA,IAAY;AAAA,EACvB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAAA,EAEjB;AAAA,IACE,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,IAEN,eAAe;AAAA,IACf,eAAe;AAAA,EAAA;AAEnB;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@uva-glass/component-library",
3
3
  "author": "Team Glass - Frontend vrienden",
4
4
  "private": false,
5
- "version": "3.47.1",
5
+ "version": "3.47.2",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
@@ -43,8 +43,8 @@
43
43
  "react-dom": "^19.1.1"
44
44
  },
45
45
  "devDependencies": {
46
- "@commitlint/cli": "^19.8.1",
47
- "@commitlint/config-conventional": "^19.8.1",
46
+ "@commitlint/cli": "^20.0.0",
47
+ "@commitlint/config-conventional": "^20.0.0",
48
48
  "@react-aria/button": "^3.14.1",
49
49
  "@react-aria/dialog": "^3.5.30",
50
50
  "@react-aria/overlays": "^3.29.1",
@@ -61,26 +61,26 @@
61
61
  "@testing-library/react": "^16.3.0",
62
62
  "@types/jest": "^30.0.0",
63
63
  "@types/node": "^22.18.6",
64
- "@types/react": "^19.1.13",
64
+ "@types/react": "^19.1.15",
65
65
  "@types/react-dom": "^19.1.9",
66
66
  "@uva-glass/eslint-config": "^1.3.11",
67
67
  "@uva-glass/stylelint-config": "^1.2.3",
68
- "@vitejs/plugin-react": "^5.0.3",
69
- "babel-jest": "^30.1.2",
68
+ "@vitejs/plugin-react": "^5.0.4",
69
+ "babel-jest": "^30.2.0",
70
70
  "babel-plugin-transform-vite-meta-env": "^1.0.3",
71
71
  "clsx": "^2.1.1",
72
72
  "eslint-plugin-react-hooks": "^6.0.0",
73
73
  "glob": "^11.0.3",
74
74
  "husky": "^9.1.7",
75
75
  "identity-obj-proxy": "^3.0.0",
76
- "jest": "^30.1.3",
77
- "jest-environment-jsdom": "^30.1.2",
76
+ "jest": "^30.2.0",
77
+ "jest-environment-jsdom": "^30.2.0",
78
78
  "jest-junit": "^16.0.0",
79
79
  "jsdom": "^27.0.0",
80
80
  "npm-run-all2": "^8.0.4",
81
81
  "react": "^19.1.1",
82
82
  "react-dom": "^19.1.1",
83
- "react-router": "^7.9.2",
83
+ "react-router": "^7.9.3",
84
84
  "semantic-release": "^24.2.9",
85
85
  "storybook": "^9.1.8",
86
86
  "style-dictionary": "^5.0.4",
@@ -109,8 +109,8 @@
109
109
  },
110
110
  "optionalDependencies": {
111
111
  "@ast-grep/napi-linux-x64-gnu": "0.39.5",
112
- "@rollup/rollup-linux-x64-gnu": "^4.52.2",
113
- "@rspack/binding-darwin-arm64": "1.5.7",
114
- "@rspack/binding-linux-x64-gnu": "1.5.7"
112
+ "@rollup/rollup-linux-x64-gnu": "^4.52.3",
113
+ "@rspack/binding-darwin-arm64": "1.5.8",
114
+ "@rspack/binding-linux-x64-gnu": "1.5.8"
115
115
  }
116
116
  }
@@ -1,17 +0,0 @@
1
- import './assets/SearchField.css';const _ = {
2
- "search-field__input-wrapper": "_search-field__input-wrapper_x3viy_1",
3
- "search-field__input-field": "_search-field__input-field_x3viy_8",
4
- "search-field__icon": "_search-field__icon_x3viy_35",
5
- "search-field__result-wrapper": "_search-field__result-wrapper_x3viy_43",
6
- "search-field__input-container": "_search-field__input-container_x3viy_58",
7
- "search-field__input-container--hidden": "_search-field__input-container--hidden_x3viy_63",
8
- "search-field__input-container--visible": "_search-field__input-container--visible_x3viy_67",
9
- "search-field__compact-button": "_search-field__compact-button_x3viy_77",
10
- "search-field__compact-icon": "_search-field__compact-icon_x3viy_94",
11
- "search-field__result-list": "_search-field__result-list_x3viy_98",
12
- "search-field__result-item": "_search-field__result-item_x3viy_111"
13
- };
14
- export {
15
- _ as s
16
- };
17
- //# sourceMappingURL=SearchField.module-DTDxokfU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchField.module-DTDxokfU.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}