@rivm-loculus-tools/common-frontend 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/@types/common-frontend.d.ts +2 -0
  2. package/dist/@types/mui.d.ts +48 -0
  3. package/dist/components/fasta/FastaDataImportDialog/index.js +3 -3
  4. package/dist/components/fasta/FastaDataImportDialog/index.js.map +1 -1
  5. package/dist/components/fasta/FastaPageHeaderCenterComponent/FastaPageHeaderCenterComponent.d.ts +4 -0
  6. package/dist/components/fasta/FastaPageHeaderCenterComponent/index.js +18 -22
  7. package/dist/components/fasta/FastaPageHeaderCenterComponent/index.js.map +1 -1
  8. package/dist/components/fasta/FastaPageHeaderImportButton/FastaPageHeaderImportButton.d.ts +4 -0
  9. package/dist/components/fasta/FastaPageHeaderImportButton/index.js +17 -15
  10. package/dist/components/fasta/FastaPageHeaderImportButton/index.js.map +1 -1
  11. package/dist/components/ui/ButtonWithMenu/ButtonWithMenu.d.ts +7 -1
  12. package/dist/components/ui/ButtonWithMenu/index.js +32 -27
  13. package/dist/components/ui/ButtonWithMenu/index.js.map +1 -1
  14. package/dist/components/ui/PageCommon/index.js +1 -1
  15. package/dist/components/ui/PageCommonDrawer/index.js +1 -1
  16. package/dist/components/ui/PageCommonHeader/PageCommonHeader.d.ts +5 -1
  17. package/dist/components/ui/PageCommonHeader/index.js +42 -35
  18. package/dist/components/ui/PageCommonHeader/index.js.map +1 -1
  19. package/dist/components/ui/SearchBar/SearchBar.d.ts +15 -0
  20. package/dist/components/ui/SearchBar/SearchBarNodeCounter.d.ts +8 -0
  21. package/dist/components/ui/SearchBar/index.js +136 -0
  22. package/dist/components/ui/SearchBar/index.js.map +1 -0
  23. package/dist/constants/page.constants.d.ts +1 -1
  24. package/dist/constants/page.constants.js +1 -1
  25. package/dist/constants/page.constants.js.map +1 -1
  26. package/dist/theme/demoTheme/index.js +26 -1
  27. package/dist/theme/demoTheme/index.js.map +1 -1
  28. package/dist/utils/UrlUtil/UrlUtil.d.ts +1 -0
  29. package/dist/utils/UrlUtil/index.js +4 -0
  30. package/dist/utils/UrlUtil/index.js.map +1 -1
  31. package/package.json +9 -5
  32. package/dist/components/SearchBar/SearchBar.d.ts +0 -10
  33. package/dist/components/SearchBar/SearchBarNodeCounter.d.ts +0 -4
  34. package/dist/components/SearchBar/index.js +0 -128
  35. package/dist/components/SearchBar/index.js.map +0 -1
  36. /package/dist/components/{SearchBar → ui/SearchBar}/index.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_Fragment","MenuIcon","PageCommonHeader","theme","useTheme","use","PageCommonContext","onToggleDrawerButtonClick","useCallback","isDrawerOpen","setIsDrawerOpen","Box","beforeAppBarComponent","AppBar","appBarHeight","Toolbar","isNoInteraction","IconButton","appBarIcon","Fragment","Typography","title","centerComponent","beforeAppBarRightComponent","rightComponent","afterAppBarRightComponent","afterAppBarComponent"],"sources":["../../../../src/components/ui/PageCommonHeader/PageCommonHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n use,\n useCallback,\n} from 'react';\nimport {\n AppBar,\n Box,\n IconButton,\n Toolbar,\n Typography,\n useTheme,\n} from '@mui/material';\nimport MenuIcon from '@mui/icons-material/Menu';\n\nimport { PageCommonContext } from '../../../context/pageCommonContext';\n\n\nexport type PageCommonHeaderProps = {\n readonly centerComponent?: ReactNode;\n readonly rightComponent?: ReactNode;\n readonly title: string;\n};\n\nexport const PageCommonHeader = ({ centerComponent, rightComponent, title }: PageCommonHeaderProps) => {\n const theme = useTheme();\n const { afterAppBarComponent, afterAppBarRightComponent, appBarHeight = 48, appBarIcon, beforeAppBarComponent, beforeAppBarRightComponent, isDrawerOpen, isNoInteraction, setIsDrawerOpen } = use(PageCommonContext);\n\n const onToggleDrawerButtonClick = useCallback(() => {\n setIsDrawerOpen(!isDrawerOpen);\n }, [isDrawerOpen, setIsDrawerOpen]);\n\n return (\n <Box>\n {beforeAppBarComponent}\n <AppBar\n elevation={1}\n position={'static'}\n sx={{\n backgroundColor: 'primary.main',\n color: '#FFFFFF',\n height: appBarHeight,\n justifyContent: 'center',\n zIndex: theme.zIndex.drawer + 1,\n }}\n >\n <Toolbar\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n px: `${theme.spacing(1)} !important`, // using !important to override media queries\n }}\n variant={'dense'}\n >\n {/* Left: Menu toggle and App Branding */}\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1.5 }}>\n {!isNoInteraction && (\n <IconButton\n aria-label={'open drawer'}\n color={'inherit'}\n edge={'start'}\n onClick={onToggleDrawerButtonClick}\n size={'small'}\n >\n <MenuIcon />\n </IconButton>\n )}\n {appBarIcon && (\n <>\n {appBarIcon}\n </>\n )}\n <Typography\n component={'div'}\n noWrap\n sx={{ color: 'inherit', fontSize: '1.05rem', fontWeight: 700, letterSpacing: '-0.01em' }}\n variant={'h6'}\n >\n {title}\n </Typography>\n </Box>\n {!isNoInteraction && (\n <>\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {centerComponent}\n </Box>\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {beforeAppBarRightComponent && (\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {beforeAppBarRightComponent}\n </Box>\n )}\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {rightComponent}\n </Box>\n {afterAppBarRightComponent && (\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {afterAppBarRightComponent}\n </Box>\n )}\n </Box>\n </>\n )}\n </Toolbar>\n </AppBar>\n {afterAppBarComponent}\n </Box>\n );\n};\n"],"mappings":";;;;;;AAwBA,IAAaE,KAAoB,EAAE,oBAAiB,mBAAgB,eAAmC;CACrG,IAAMC,IAAQC,EAAS,GACjB,EAAE,yBAAsB,8BAA2B,kBAAe,IAAI,eAAY,0BAAuB,+BAA4B,iBAAc,oBAAiB,uBAAoBC,EAAIC,CAAiB,GAE7MC,IAA4BC,QAAkB;EAClD,EAAgB,CAACC,CAAY;CAC/B,GAAG,CAACA,GAAcC,CAAe,CAAC;CAElC,OACE,kBAACC,GAAD,EAAA,UAAA;EACGC;EACD,kBAACC,GAAD;GACE,WAAW;GACX,UAAU;GACV,IAAI;IACF,iBAAiB;IACjB,OAAO;IACP,QAAQC;IACR,gBAAgB;IAChB,QAAQX,EAAM,OAAO,SAAS;GAChC;GAEA,UAAA,kBAACY,GAAD;IACE,IAAI;KACF,SAAS;KACT,gBAAgB;KAChB,IAAI,GAAGZ,EAAM,QAAQ,CAAC,EAAE;IAC1B;IACA,SAAS;IANX,UAAA,CASE,kBAACQ,GAAD;KAAK,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAI;KAA3D,UAAA;MACG,CAACK,KACA,kBAACC,GAAD;OACE,cAAY;OACZ,OAAO;OACP,MAAM;OACN,SAASV;OACT,MAAM;OAEN,UAAA,kBAACN,GAAD,CAAW,CAAA;MACD,CAAA;MAEbiB,KACC,kBAAAlB,GAAA,EAAA,UACGkB,EACD,CAAA;MAEJ,kBAACE,GAAD;OACE,WAAW;OACX,QAAA;OACA,IAAI;QAAE,OAAO;QAAW,UAAU;QAAW,YAAY;QAAK,eAAe;OAAU;OACvF,SAAS;OAER,UAAAC;MACS,CAAA;KACT;IACJ,CAAA,GAAA,CAACL,KACA,kBAAAhB,GAAA,EAAA,UAAA,CACE,kBAACW,GAAD;KAAK,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAE;KACtD,UAAAW;IACE,CAAA,GACL,kBAACX,GAAD;KAAK,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAE;KAAzD,UAAA;MACGY,KACC,kBAACZ,GAAD;OAAK,IAAI;QAAE,YAAY;QAAU,SAAS;QAAQ,KAAK;OAAE;OACtD,UAAAY;MACE,CAAA;MAEP,kBAACZ,GAAD;OAAK,IAAI;QAAE,YAAY;QAAU,SAAS;QAAQ,KAAK;OAAE;OACtD,UAAAa;MACE,CAAA;MACJC,KACC,kBAACd,GAAD;OAAK,IAAI;QAAE,YAAY;QAAU,SAAS;QAAQ,KAAK;OAAE;OACtD,UAAAc;MACE,CAAA;KAEJ;IACL,CAAA,CAAA,EAAA,CAAA,CAEG;;EACH,CAAA;EACPC;CACE,EAAA,CAAA;AAET"}
1
+ {"version":3,"file":"index.js","names":["_Fragment","MenuIcon","PageCommonHeader","useThemeProps","inProps","theme","useTheme","pageCommonHeaderTheme","useMemo","use","PageCommonContext","onToggleDrawerButtonClick","useCallback","isDrawerOpen","setIsDrawerOpen","Box","beforeAppBarComponent","AppBar","appBarHeight","Toolbar","isNoInteraction","IconButton","appBarIcon","Fragment","Typography","title","centerComponent","beforeAppBarRightComponent","rightComponent","afterAppBarRightComponent","afterAppBarComponent"],"sources":["../../../../src/components/ui/PageCommonHeader/PageCommonHeader.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n use,\n useCallback,\n useMemo,\n} from 'react';\nimport {\n AppBar,\n Box,\n IconButton,\n Toolbar,\n Typography,\n useTheme,\n useThemeProps,\n} from '@mui/material';\nimport MenuIcon from '@mui/icons-material/Menu';\n\nimport { PageCommonContext } from '../../../context/pageCommonContext';\n\nexport type PageCommonHeaderProps = {\n readonly centerComponent?: ReactNode;\n readonly rightComponent?: ReactNode;\n readonly title: string;\n};\n\nexport interface PageCommonHeaderTheme {\n backgroundColor: string;\n color: string;\n}\n\nexport const PageCommonHeader = (inProps: PageCommonHeaderProps) => {\n const { centerComponent, rightComponent, title } = useThemeProps({ name: 'RivmLoculusToolsCommonFrontendPageCommonHeader', props: inProps });\n const theme = useTheme();\n const pageCommonHeaderTheme = useMemo<PageCommonHeaderTheme>(() => ({\n ...{\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n } satisfies PageCommonHeaderTheme,\n ...(theme.components?.RivmLoculusToolsCommonFrontendPageCommonHeader ?? {}),\n }), [theme]);\n\n\n const { afterAppBarComponent, afterAppBarRightComponent, appBarHeight = 48, appBarIcon, beforeAppBarComponent, beforeAppBarRightComponent, isDrawerOpen, isNoInteraction, setIsDrawerOpen } = use(PageCommonContext);\n\n const onToggleDrawerButtonClick = useCallback(() => {\n setIsDrawerOpen(!isDrawerOpen);\n }, [isDrawerOpen, setIsDrawerOpen]);\n\n return (\n <Box>\n {beforeAppBarComponent}\n <AppBar\n elevation={1}\n position={'static'}\n sx={{\n backgroundColor: pageCommonHeaderTheme.backgroundColor,\n color: pageCommonHeaderTheme.color,\n height: appBarHeight,\n justifyContent: 'center',\n zIndex: theme.zIndex.drawer + 1,\n }}\n >\n <Toolbar\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n px: `${theme.spacing(1)} !important`, // using !important to override media queries\n }}\n variant={'dense'}\n >\n {/* Left: Menu toggle and App Branding */}\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1.5 }}>\n {!isNoInteraction && (\n <IconButton\n aria-label={'open drawer'}\n color={'inherit'}\n edge={'start'}\n onClick={onToggleDrawerButtonClick}\n size={'small'}\n >\n <MenuIcon />\n </IconButton>\n )}\n {appBarIcon && (\n <>\n {appBarIcon}\n </>\n )}\n <Typography\n component={'div'}\n noWrap\n sx={{ color: 'inherit', fontSize: '1.05rem', fontWeight: 700, letterSpacing: '-0.01em' }}\n variant={'h6'}\n >\n {title}\n </Typography>\n </Box>\n {!isNoInteraction && (\n <>\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {centerComponent}\n </Box>\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {beforeAppBarRightComponent && (\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {beforeAppBarRightComponent}\n </Box>\n )}\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {rightComponent}\n </Box>\n {afterAppBarRightComponent && (\n <Box sx={{ alignItems: 'center', display: 'flex', gap: 1 }}>\n {afterAppBarRightComponent}\n </Box>\n )}\n </Box>\n </>\n )}\n </Toolbar>\n </AppBar>\n {afterAppBarComponent}\n </Box>\n );\n};\n"],"mappings":";;;;;;AA8BA,IAAaE,KAAoB,MAAmC;CAClE,IAAM,EAAE,oBAAiB,mBAAgB,aAAUC,EAAc;EAAE,MAAM;EAAkD,OAAOC;CAAQ,CAAC,GACrIC,IAAQC,EAAS,GACjBC,IAAwBC,SAAsC;EAEhE,iBAAiBH,EAAM,QAAQ,QAAQ;EACvC,OAAOA,EAAM,QAAQ,QAAQ;EAE/B,GAAIA,EAAM,YAAY,kDAAkD,CAAC;CAC3E,IAAI,CAACA,CAAK,CAAC,GAGL,EAAE,yBAAsB,8BAA2B,kBAAe,IAAI,eAAY,0BAAuB,+BAA4B,iBAAc,oBAAiB,uBAAoBI,EAAIC,CAAiB,GAE7MC,IAA4BC,QAAkB;EAClD,EAAgB,CAACC,CAAY;CAC/B,GAAG,CAACA,GAAcC,CAAe,CAAC;CAElC,OACE,kBAACC,GAAD,EAAA,UAAA;EACGC;EACD,kBAACC,GAAD;GACE,WAAW;GACX,UAAU;GACV,IAAI;IACF,iBAAiBV,EAAsB;IACvC,OAAOA,EAAsB;IAC7B,QAAQW;IACR,gBAAgB;IAChB,QAAQb,EAAM,OAAO,SAAS;GAChC;GAEA,UAAA,kBAACc,GAAD;IACE,IAAI;KACF,SAAS;KACT,gBAAgB;KAChB,IAAI,GAAGd,EAAM,QAAQ,CAAC,EAAE;IAC1B;IACA,SAAS;IANX,UAAA,CASE,kBAACU,GAAD;KAAK,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAI;KAA3D,UAAA;MACG,CAACK,KACA,kBAACC,GAAD;OACE,cAAY;OACZ,OAAO;OACP,MAAM;OACN,SAASV;OACT,MAAM;OAEN,UAAA,kBAACV,GAAD,CAAW,CAAA;MACD,CAAA;MAEbqB,KACC,kBAAAtB,GAAA,EAAA,UACGsB,EACD,CAAA;MAEJ,kBAACE,GAAD;OACE,WAAW;OACX,QAAA;OACA,IAAI;QAAE,OAAO;QAAW,UAAU;QAAW,YAAY;QAAK,eAAe;OAAU;OACvF,SAAS;OAER,UAAAC;MACS,CAAA;KACT;IACJ,CAAA,GAAA,CAACL,KACA,kBAAApB,GAAA,EAAA,UAAA,CACE,kBAACe,GAAD;KAAK,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAE;KACtD,UAAAW;IACE,CAAA,GACL,kBAACX,GAAD;KAAK,IAAI;MAAE,YAAY;MAAU,SAAS;MAAQ,KAAK;KAAE;KAAzD,UAAA;MACGY,KACC,kBAACZ,GAAD;OAAK,IAAI;QAAE,YAAY;QAAU,SAAS;QAAQ,KAAK;OAAE;OACtD,UAAAY;MACE,CAAA;MAEP,kBAACZ,GAAD;OAAK,IAAI;QAAE,YAAY;QAAU,SAAS;QAAQ,KAAK;OAAE;OACtD,UAAAa;MACE,CAAA;MACJC,KACC,kBAACd,GAAD;OAAK,IAAI;QAAE,YAAY;QAAU,SAAS;QAAQ,KAAK;OAAE;OACtD,UAAAc;MACE,CAAA;KAEJ;IACL,CAAA,CAAA,EAAA,CAAA,CAEG;;EACH,CAAA;EACPC;CACE,EAAA,CAAA;AAET"}
@@ -0,0 +1,15 @@
1
+ import { ComponentsOverrides, Theme } from '@mui/material/styles';
2
+ export type SearchBarProps = {
3
+ allowNavigation?: boolean;
4
+ highlightedIndex?: null | number;
5
+ numResults?: number;
6
+ onHighlightedIndexChange?: (index: number) => void;
7
+ onSearchQueryChange: (query: string) => void;
8
+ searchQuery: string;
9
+ truncated?: boolean;
10
+ };
11
+ export interface SearchBarTheme {
12
+ buttonColor: string;
13
+ styleOverrides?: ComponentsOverrides<Theme>['MuiFilledInput'];
14
+ }
15
+ export declare const SearchBar: (inProps: SearchBarProps) => import('react').JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { ChipOwnProps } from '@mui/material';
2
+ export type SearchBarNodeCounterProps = {
3
+ hasResultsChipColor?: ChipOwnProps['color'];
4
+ noResultsChipColor?: ChipOwnProps['color'];
5
+ numResults?: number;
6
+ };
7
+ export type SearchBarNodeCounterTheme = object;
8
+ export declare const SearchBarNodeCounter: (inProps: SearchBarNodeCounterProps) => import('react').JSX.Element | null;
@@ -0,0 +1,136 @@
1
+ import { Box as e, FilledInput as t, IconButton as n, InputAdornment as r, styled as i, useTheme as a, useThemeProps as o } from "@mui/material";
2
+ import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
3
+ import { useCallback as u, useMemo as d, useRef as f } from "react";
4
+ import p from "@mui/icons-material/Search";
5
+ import m from "@mui/icons-material/KeyboardArrowUp";
6
+ import h from "@mui/icons-material/KeyboardArrowDown";
7
+ import g from "@mui/icons-material/Close";
8
+ // src/components/ui/SearchBar/SearchBar.tsx
9
+ var _ = i(t, {
10
+ name: "RivmLoculusToolsCommonFrontendSearchBar",
11
+ slot: "Root"
12
+ })(({ theme: e }) => ({
13
+ backgroundColor: e.palette.background.paper,
14
+ height: e.spacing(4)
15
+ })), v = (t) => {
16
+ let { allowNavigation: i, highlightedIndex: v, numResults: y = 0, onHighlightedIndexChange: b, onSearchQueryChange: x, searchQuery: S, truncated: C } = o({
17
+ name: "RivmLoculusToolsCommonFrontendSearchBar",
18
+ props: t
19
+ }), w = a(), T = d(() => ({
20
+ buttonColor: w.palette.primary.main,
21
+ ...w.components?.RivmLoculusToolsCommonFrontendSearchBar ?? {}
22
+ }), [w]), E = f(null), D = f(null), O = f(null), k = u((e) => {
23
+ let t = e.target.value;
24
+ x(t);
25
+ }, [x]), A = u(() => {
26
+ x(""), E.current?.focus();
27
+ }, [x]), j = u((e) => {
28
+ if (e.key === "Enter") {
29
+ if (!y) return;
30
+ e.preventDefault(), b?.(0), O.current?.focus();
31
+ }
32
+ }, [y, b]), M = u(() => {
33
+ if (!y) return;
34
+ let e = v == null || Number.isNaN(v) || v <= 0 ? y - 1 : v - 1;
35
+ b?.(e);
36
+ }, [
37
+ y,
38
+ v,
39
+ b
40
+ ]), N = u(() => {
41
+ if (!y) return;
42
+ let e = v == null || Number.isNaN(v) || v >= y - 1 ? 0 : v + 1;
43
+ b?.(e);
44
+ }, [
45
+ y,
46
+ v,
47
+ b
48
+ ]), P = u((e) => {
49
+ if (e.key === "ArrowRight") {
50
+ e.preventDefault();
51
+ let t = e.currentTarget.nextElementSibling;
52
+ t && t.focus();
53
+ }
54
+ if (e.key === "ArrowLeft") {
55
+ if (e.preventDefault(), e.target === D.current) {
56
+ E.current?.focus();
57
+ return;
58
+ }
59
+ let t = e.currentTarget.previousElementSibling;
60
+ t && t.focus();
61
+ }
62
+ }, []), F = d(() => S ? S && (Number.isNaN(y) || y <= 0) ? "No results" : v == null || Number.isNaN(v) || v < 0 || !i ? `${y}${C ? "+" : ""} results` : i ? `${v + 1}/${y}${C ? "+" : ""} results` : "" : "", [
63
+ S,
64
+ y,
65
+ v,
66
+ i,
67
+ C
68
+ ]);
69
+ return /* @__PURE__ */ c(_, {
70
+ endAdornment: /* @__PURE__ */ l(r, {
71
+ position: "end",
72
+ children: [
73
+ F && /* @__PURE__ */ c(e, {
74
+ "aria-atomic": "true",
75
+ "aria-live": "polite",
76
+ role: "status",
77
+ sx: { fontSize: "1rem" },
78
+ children: F
79
+ }),
80
+ y > 0 && i && /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ c(n, {
81
+ "aria-label": "Goto previous search result",
82
+ disabled: !y,
83
+ edge: "end",
84
+ onClick: M,
85
+ onKeyDown: P,
86
+ ref: D,
87
+ sx: { color: T.buttonColor },
88
+ children: /* @__PURE__ */ c(m, {})
89
+ }), /* @__PURE__ */ c(n, {
90
+ "aria-label": "Goto next search result",
91
+ disabled: !y,
92
+ edge: "end",
93
+ onClick: N,
94
+ onKeyDown: P,
95
+ ref: O,
96
+ sx: { color: T.buttonColor },
97
+ children: /* @__PURE__ */ c(h, {})
98
+ })] }),
99
+ S && /* @__PURE__ */ c(n, {
100
+ "aria-label": "Clear",
101
+ edge: "end",
102
+ onClick: A,
103
+ onKeyDown: P,
104
+ children: /* @__PURE__ */ c(g, {})
105
+ })
106
+ ]
107
+ }),
108
+ fullWidth: !0,
109
+ inputRef: E,
110
+ name: "Search",
111
+ onChange: k,
112
+ onKeyDown: j,
113
+ placeholder: "Search",
114
+ size: "small",
115
+ slotProps: { input: {
116
+ "aria-label": "Search",
117
+ sx: {
118
+ "&::-webkit-search-cancel-button": { display: "none" },
119
+ fontSize: "1rem",
120
+ height: w.spacing(4),
121
+ outline: "none !important",
122
+ paddingBottom: "0 !important",
123
+ paddingTop: "0 !important"
124
+ }
125
+ } },
126
+ startAdornment: /* @__PURE__ */ c(r, {
127
+ position: "start",
128
+ children: /* @__PURE__ */ c(p, { fontSize: "small" })
129
+ }),
130
+ type: "search",
131
+ value: S
132
+ });
133
+ };
134
+ export { v as SearchBar };
135
+
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_Fragment","SearchIcon","KeyboardArrowUpIcon","KeyboardArrowDownIcon","CloseIcon","SearchBarFilledInput","styled","FilledInput","theme","SearchBar","useThemeProps","inProps","useTheme","searchBarTheme","useMemo","inputRef","useRef","arrowUpButtonRef","arrowDownButtonRef","onTextInputChange","useCallback","nextSearchText","event","onSearchQueryChange","onClearButtonClick","onTextInputKeyDown","numResults","onHighlightedIndexChange","onUpArrowButtonClick","newHighlightedIndex","highlightedIndex","onDownArrowButtonClick","onGenericKeyDown","nextFocusableElement","previousFocusableElement","searchResultStatusText","searchQuery","allowNavigation","truncated","InputAdornment","Box","Fragment","IconButton"],"sources":["../../../../src/components/ui/SearchBar/SearchBar.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n KeyboardEvent,\n} from 'react';\nimport {\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport {\n Box,\n FilledInput,\n IconButton,\n InputAdornment,\n styled,\n useTheme,\n useThemeProps,\n} from '@mui/material';\nimport type {\n ComponentsOverrides,\n Theme,\n} from '@mui/material/styles';\nimport SearchIcon from '@mui/icons-material/Search';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport CloseIcon from '@mui/icons-material/Close';\n\nexport type SearchBarProps = {\n allowNavigation?: boolean;\n highlightedIndex?: null | number;\n numResults?: number;\n onHighlightedIndexChange?: (index: number) => void;\n onSearchQueryChange: (query: string) => void;\n searchQuery: string;\n truncated?: boolean;\n};\n\nexport interface SearchBarTheme {\n buttonColor: string;\n styleOverrides?: ComponentsOverrides<Theme>['MuiFilledInput'];\n}\n\nconst SearchBarFilledInput = styled(FilledInput, {\n name: 'RivmLoculusToolsCommonFrontendSearchBar',\n slot: 'Root',\n})(({ theme }) => ({\n backgroundColor: theme.palette.background.paper,\n height: theme.spacing(4),\n}));\n\nexport const SearchBar = (inProps: SearchBarProps) => {\n const {\n allowNavigation,\n highlightedIndex,\n numResults = 0,\n onHighlightedIndexChange,\n onSearchQueryChange,\n searchQuery,\n truncated,\n } = useThemeProps({ name: 'RivmLoculusToolsCommonFrontendSearchBar', props: inProps });\n const theme = useTheme();\n const searchBarTheme = useMemo<SearchBarTheme>(() => ({\n ...{\n buttonColor: theme.palette.primary.main,\n } satisfies SearchBarTheme,\n ...(theme.components?.RivmLoculusToolsCommonFrontendSearchBar ?? {}),\n }), [theme]);\n\n\n const inputRef = useRef<HTMLInputElement>(null);\n const arrowUpButtonRef = useRef<HTMLButtonElement>(null);\n const arrowDownButtonRef = useRef<HTMLButtonElement>(null);\n\n const onTextInputChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n const nextSearchText = event.target.value;\n onSearchQueryChange(nextSearchText);\n }, [onSearchQueryChange]);\n\n const onClearButtonClick = useCallback(() => {\n onSearchQueryChange('');\n inputRef.current?.focus();\n }, [onSearchQueryChange]);\n\n const onTextInputKeyDown = useCallback((event: KeyboardEvent<HTMLInputElement>) => {\n // on enter press, highlight the first result and focus the down arrow button\n if (event.key === 'Enter') {\n if (!numResults) {\n return;\n }\n event.preventDefault();\n onHighlightedIndexChange?.(0);\n arrowDownButtonRef.current?.focus();\n }\n }, [numResults, onHighlightedIndexChange]);\n\n const onUpArrowButtonClick = useCallback(() => {\n // goto previous result\n if (!numResults) {\n return;\n }\n const newHighlightedIndex = highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex <= 0 ? numResults - 1 : highlightedIndex - 1;\n\n onHighlightedIndexChange?.(newHighlightedIndex);\n }, [numResults, highlightedIndex, onHighlightedIndexChange]);\n\n const onDownArrowButtonClick = useCallback(() => {\n // goto next result\n if (!numResults) {\n return;\n }\n const newHighlightedIndex = highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex >= numResults - 1 ? 0 : highlightedIndex + 1;\n onHighlightedIndexChange?.(newHighlightedIndex);\n }, [numResults, highlightedIndex, onHighlightedIndexChange]);\n\n const onGenericKeyDown = useCallback((event: KeyboardEvent<HTMLButtonElement>) => {\n // arrow right, focus the next focusable element\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n const nextFocusableElement = event.currentTarget.nextElementSibling as HTMLElement;\n if (nextFocusableElement) {\n nextFocusableElement.focus();\n }\n }\n // arrow left, focus the previous focusable element\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (event.target === arrowUpButtonRef.current) {\n inputRef.current?.focus();\n return;\n }\n const previousFocusableElement = event.currentTarget.previousElementSibling as HTMLElement;\n if (previousFocusableElement) {\n previousFocusableElement.focus();\n }\n }\n }, []);\n\n const searchResultStatusText = useMemo(() => {\n if (!searchQuery) {\n return '';\n }\n if (searchQuery && (Number.isNaN(numResults) || numResults <= 0)) {\n return 'No results';\n } else if (highlightedIndex === null || highlightedIndex === undefined || Number.isNaN(highlightedIndex) || highlightedIndex < 0 || !allowNavigation) {\n return `${numResults}${truncated ? '+' : ''} results`;\n } else if (allowNavigation) {\n return `${highlightedIndex + 1}/${numResults}${truncated ? '+' : ''} results`;\n }\n return '';\n }, [searchQuery, numResults, highlightedIndex, allowNavigation, truncated]);\n\n\n return (\n <SearchBarFilledInput\n endAdornment={(\n <InputAdornment position={'end'}>\n {searchResultStatusText && (\n <Box\n aria-atomic={'true'}\n aria-live={'polite'}\n role={'status'}\n sx={{\n fontSize: '1rem',\n }}\n >\n {searchResultStatusText}\n </Box>\n )}\n {numResults > 0 && allowNavigation && (\n <>\n <IconButton\n aria-label={'Goto previous search result'}\n disabled={!numResults}\n edge={'end'}\n onClick={onUpArrowButtonClick}\n onKeyDown={onGenericKeyDown}\n ref={arrowUpButtonRef}\n sx={{ color: searchBarTheme.buttonColor }}\n >\n <KeyboardArrowUpIcon />\n </IconButton>\n <IconButton\n aria-label={'Goto next search result'}\n disabled={!numResults}\n edge={'end'}\n onClick={onDownArrowButtonClick}\n onKeyDown={onGenericKeyDown}\n ref={arrowDownButtonRef}\n sx={{ color: searchBarTheme.buttonColor }}\n >\n <KeyboardArrowDownIcon />\n </IconButton>\n </>\n )}\n {searchQuery && (\n <IconButton\n aria-label={'Clear'}\n edge={'end'}\n onClick={onClearButtonClick}\n onKeyDown={onGenericKeyDown}\n >\n <CloseIcon />\n </IconButton>\n )}\n </InputAdornment>\n )}\n fullWidth\n inputRef={inputRef}\n name={'Search'}\n onChange={onTextInputChange}\n onKeyDown={onTextInputKeyDown}\n placeholder={'Search'}\n size={'small'}\n slotProps={{\n input: {\n 'aria-label': 'Search',\n sx: {\n '&::-webkit-search-cancel-button': {\n display: 'none',\n },\n fontSize: '1rem',\n height: theme.spacing(4),\n outline: 'none !important',\n paddingBottom: '0 !important',\n paddingTop: '0 !important',\n },\n },\n }}\n startAdornment={(\n <InputAdornment position={'start'}>\n <SearchIcon fontSize={'small'} />\n </InputAdornment>\n )}\n type={'search'}\n value={searchQuery}\n />\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- export declare const DRAWER_WIDTH = 340;
1
+ export declare const DRAWER_WIDTH = 540;
@@ -1,5 +1,5 @@
1
1
  // src/constants/page.constants.ts
2
- var e = 340;
2
+ var e = 540;
3
3
  export { e as DRAWER_WIDTH };
4
4
 
5
5
  //# sourceMappingURL=page.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.constants.js","names":["DRAWER_WIDTH"],"sources":["../../src/constants/page.constants.ts"],"sourcesContent":["export const DRAWER_WIDTH = 340;\n"],"mappings":";AAAA,IAAaA,IAAe"}
1
+ {"version":3,"file":"page.constants.js","names":["DRAWER_WIDTH"],"sources":["../../src/constants/page.constants.ts"],"sourcesContent":["export const DRAWER_WIDTH = 540;\n"],"mappings":";AAAA,IAAaA,IAAe"}
@@ -214,7 +214,32 @@ var t = "data:font/woff2;base64,d09GMgABAAAAC2dAABUAAAAZt9gAC2a/AAEAAAAAAAAAAAAA
214
214
  fontSize: "1.143rem",
215
215
  fontWeight: 700
216
216
  }
217
- } }
217
+ } },
218
+ RivmLoculusToolsCommonFrontendButtonWithMenu: { styleOverrides: { root: {
219
+ "&:hover": { backgroundColor: "rgba(255, 255, 255, 0.25)" },
220
+ backgroundColor: "rgba(255, 255, 255, 0.15)",
221
+ color: "#FFFFFF"
222
+ } } },
223
+ RivmLoculusToolsCommonFrontendFastaPageHeaderCenterComponent: { styleOverrides: { root: {
224
+ backgroundColor: "rgba(255, 255, 255, 0.2)",
225
+ color: "#FFFFFF",
226
+ fontSize: "0.75rem",
227
+ fontWeight: 600
228
+ } } },
229
+ RivmLoculusToolsCommonFrontendFastaPageHeaderImportButton: { styleOverrides: { root: {
230
+ "&:hover": { backgroundColor: "rgba(255, 255, 255, 0.25)" },
231
+ backgroundColor: "rgba(255, 255, 255, 0.15)",
232
+ color: "#FFFFFF"
233
+ } } },
234
+ RivmLoculusToolsCommonFrontendPageCommonHeader: {
235
+ backgroundColor: "#5160ab",
236
+ color: "#fff"
237
+ },
238
+ RivmLoculusToolsCommonFrontendSearchBar: {
239
+ buttonColor: "#5160ab",
240
+ styleOverrides: { root: { backgroundColor: e === "light" ? "#fff" : "#121212" } }
241
+ },
242
+ RivmLoculusToolsCommonFrontendSearchBarNodeCounter: {}
218
243
  },
219
244
  palette: {
220
245
  divider: "#eeeeee",