@owp/core 2.5.34 → 2.5.36

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 (88) hide show
  1. package/dist/_virtual/index3.js +2 -2
  2. package/dist/_virtual/index4.js +2 -2
  3. package/dist/components/OwpAutoLogoutDialog/OwpAutoLogoutDialog.js +68 -62
  4. package/dist/components/OwpAutoLogoutDialog/OwpAutoLogoutDialog.js.map +1 -1
  5. package/dist/components/OwpDialog/OwpAlertDialog.js +19 -18
  6. package/dist/components/OwpDialog/OwpAlertDialog.js.map +1 -1
  7. package/dist/components/OwpDialog/OwpDialog.js +34 -31
  8. package/dist/components/OwpDialog/OwpDialog.js.map +1 -1
  9. package/dist/components/OwpDialog/internal/useDialogOpenFocusCleanup.js +18 -0
  10. package/dist/components/OwpDialog/internal/useDialogOpenFocusCleanup.js.map +1 -0
  11. package/dist/components/OwpErrorBoundary/OwpErrorBoundary.js +25 -15
  12. package/dist/components/OwpErrorBoundary/OwpErrorBoundary.js.map +1 -1
  13. package/dist/components/OwpLayout/OwpLayout.js.map +1 -1
  14. package/dist/components/OwpNumberField/OwpNumberField.js +45 -24
  15. package/dist/components/OwpNumberField/OwpNumberField.js.map +1 -1
  16. package/dist/components/OwpScrollbars/OwpScrollbars.js +79 -52
  17. package/dist/components/OwpScrollbars/OwpScrollbars.js.map +1 -1
  18. package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js +157 -157
  19. package/dist/components/OwpSelectorBase/OwpSelectorAutocomplete.js.map +1 -1
  20. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js +298 -248
  21. package/dist/components/OwpTreeGrid/internal/treeGridTheme.js.map +1 -1
  22. package/dist/configs/layoutConfig.js +0 -6
  23. package/dist/configs/layoutConfig.js.map +1 -1
  24. package/dist/features/themePreview/dialogs/ThemePreviewDialog.js +15 -15
  25. package/dist/features/themePreview/dialogs/ThemePreviewDialog.js.map +1 -1
  26. package/dist/hooks/internal/useNavbar.js +4 -4
  27. package/dist/hooks/useConfirm.js +1 -1
  28. package/dist/hooks/useConfirm.js.map +1 -1
  29. package/dist/hooks/useOwpDialogs.js +19 -0
  30. package/dist/hooks/useOwpDialogs.js.map +1 -0
  31. package/dist/hooks.js +34 -32
  32. package/dist/hooks.js.map +1 -1
  33. package/dist/index.js +69 -71
  34. package/dist/index.js.map +1 -1
  35. package/dist/layout/Layout.js +23 -27
  36. package/dist/layout/Layout.js.map +1 -1
  37. package/dist/layout/components/layouts/FooterLayout.js.map +1 -1
  38. package/dist/layout/components/menus/PasswordChangeMenu.js +25 -25
  39. package/dist/layout/components/menus/PasswordChangeMenu.js.map +1 -1
  40. package/dist/layout/components/toggles/NavigationSearchToggle.js +1 -1
  41. package/dist/layout/components/toggles/NavigationSearchToggle.js.map +1 -1
  42. package/dist/layout/components/toggles/NavigationShortcutsToggle.js +1 -1
  43. package/dist/layout/components/toggles/NavigationShortcutsToggle.js.map +1 -1
  44. package/dist/layout/components/toggles/ThemePreviewToggle.js +14 -14
  45. package/dist/layout/components/toggles/ThemePreviewToggle.js.map +1 -1
  46. package/dist/node_modules/.pnpm/inko@1.1.1/node_modules/inko/index.js +1 -1
  47. package/dist/node_modules/.pnpm/jsbarcode@3.12.1/node_modules/jsbarcode/bin/barcodes/index.js +1 -1
  48. package/dist/types/components/OwpAutoLogoutDialog/OwpAutoLogoutDialog.d.ts +5 -3
  49. package/dist/types/components/OwpDialog/OwpAlertDialog.d.ts +1 -1
  50. package/dist/types/components/OwpDialog/internal/useDialogOpenFocusCleanup.d.ts +5 -0
  51. package/dist/types/components/OwpErrorBoundary/OwpErrorBoundary.d.ts +8 -14
  52. package/dist/types/components/OwpNumberField/OwpNumberField.d.ts +18 -4
  53. package/dist/types/components/OwpScrollbars/OwpScrollbars.d.ts +28 -14
  54. package/dist/types/configs/layoutConfig.d.ts +0 -6
  55. package/dist/types/features/themePreview/dialogs/ThemePreviewDialog.d.ts +1 -1
  56. package/dist/types/hooks/index.d.ts +1 -0
  57. package/dist/types/hooks/useOwpDialogs.d.ts +5 -0
  58. package/dist/types/hooks/useOwpSettings.d.ts +0 -6
  59. package/dist/types/index.d.ts +0 -1
  60. package/dist/types/store/atoms/owpSettingsAtoms.d.ts +0 -6
  61. package/dist/types/types/OwpDialogTypes.d.ts +1 -0
  62. package/dist/types/types/OwpRouteTypes.d.ts +25 -0
  63. package/dist/types/types/index.d.ts +2 -0
  64. package/dist/types/utils/index.d.ts +0 -1
  65. package/dist/types/utils/internal/blurActiveElement.d.ts +4 -0
  66. package/dist/utils/internal/blurActiveElement.js +12 -0
  67. package/dist/utils/internal/blurActiveElement.js.map +1 -0
  68. package/dist/utils/{navigationUtils.js → internal/navigationUtils.js} +3 -3
  69. package/dist/utils/internal/navigationUtils.js.map +1 -0
  70. package/dist/utils.js +23 -25
  71. package/dist/utils.js.map +1 -1
  72. package/package.json +1 -1
  73. package/dist/components/OwpEventEmitter/OwpEventEmitter.js +0 -51
  74. package/dist/components/OwpEventEmitter/OwpEventEmitter.js.map +0 -1
  75. package/dist/layout/components/layouts/LeftSideLayout.js +0 -13
  76. package/dist/layout/components/layouts/LeftSideLayout.js.map +0 -1
  77. package/dist/node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/array/some.js +0 -66
  78. package/dist/node_modules/.pnpm/es-toolkit@1.39.10/node_modules/es-toolkit/dist/compat/array/some.js.map +0 -1
  79. package/dist/node_modules/.pnpm/perfect-scrollbar@1.5.6/node_modules/perfect-scrollbar/css/perfect-scrollbar.css +0 -1
  80. package/dist/types/components/OwpEventEmitter/OwpEventEmitter.d.ts +0 -27
  81. package/dist/types/components/OwpEventEmitter/index.d.ts +0 -1
  82. package/dist/types/layout/components/layouts/LeftSideLayout.d.ts +0 -6
  83. package/dist/types/utils/common/OwpUtils.d.ts +0 -119
  84. package/dist/types/utils/common/index.d.ts +0 -1
  85. package/dist/utils/common/OwpUtils.js +0 -196
  86. package/dist/utils/common/OwpUtils.js.map +0 -1
  87. package/dist/utils/navigationUtils.js.map +0 -1
  88. /package/dist/types/utils/{navigationUtils.d.ts → internal/navigationUtils.d.ts} +0 -0
@@ -1,19 +1,18 @@
1
1
  var u = Object.defineProperty;
2
2
  var r = (i, a) => u(i, "name", { value: a, configurable: !0 });
3
- import { jsxs as e, jsx as t } from "../node_modules/.pnpm/@emotion_react@11.14.0_@types_react@19.2.14_react@19.2.4/node_modules/@emotion/react/jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js";
3
+ import { jsx as t, jsxs as e } from "../node_modules/.pnpm/@emotion_react@11.14.0_@types_react@19.2.14_react@19.2.4/node_modules/@emotion/react/jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js";
4
4
  import { useNavigationActiveRouteRemountKey as p } from "../hooks/internal/useNavigationActiveRouteRemount.js";
5
5
  import { useGetCurrentLayoutConfig as d } from "../hooks/useOwpSettings.js";
6
6
  import { LinearProgress as x } from "@mui/material";
7
- import { styled as y } from "@mui/material/styles";
8
- import { useIsFetching as h, useIsMutating as g } from "@tanstack/react-query";
7
+ import { styled as h } from "@mui/material/styles";
8
+ import { useIsFetching as y, useIsMutating as g } from "@tanstack/react-query";
9
9
  import { memo as v } from "react";
10
10
  import { Outlet as b } from "react-router-dom";
11
11
  import L from "./components/layouts/FooterLayout.js";
12
- import w from "./components/layouts/LeftSideLayout.js";
13
12
  import n from "./components/layouts/NavbarWrapperLayout.js";
14
- import N from "./components/toolbar/ToolbarLayout.js";
15
- import { OwpSuspense as R } from "../components/OwpSuspense/OwpSuspense.js";
16
- const W = y("div")(({ config: i }) => ({
13
+ import w from "./components/toolbar/ToolbarLayout.js";
14
+ import { OwpSuspense as N } from "../components/OwpSuspense/OwpSuspense.js";
15
+ const R = h("div")(({ config: i }) => ({
17
16
  ...i.mode === "boxed" && {
18
17
  clipPath: "inset(0)",
19
18
  maxWidth: i.containerWidth,
@@ -30,28 +29,25 @@ const W = y("div")(({ config: i }) => ({
30
29
  }
31
30
  }
32
31
  }));
33
- function C(i) {
34
- const { children: a, layoutConfig: l } = i, m = d(), s = p(), o = l ?? m, f = h(), c = g();
35
- return /* @__PURE__ */ e(W, { id: "owp-layout", config: o, className: "flex w-full", children: [
36
- o.leftSidePanel.display && /* @__PURE__ */ t(w, {}),
37
- /* @__PURE__ */ e("div", { className: "flex min-w-0 flex-auto", children: [
38
- o.navbar.display && o.navbar.position === "left" && /* @__PURE__ */ t(n, {}),
39
- /* @__PURE__ */ e("main", { id: "owp-main", className: "relative z-10 flex min-h-full min-w-0 flex-auto flex-col", children: [
40
- o.toolbar.display && /* @__PURE__ */ t(N, { className: o.toolbar.style === "fixed" ? "sticky top-0" : "" }),
41
- !!(f || c) && /* @__PURE__ */ t("div", { className: "fixed top-0 left-0 z-30 w-full", children: /* @__PURE__ */ t(x, { color: "secondary" }) }),
42
- /* @__PURE__ */ e("div", { className: "relative z-10 flex min-h-0 flex-auto flex-col", children: [
43
- /* @__PURE__ */ t(R, { children: /* @__PURE__ */ t(b, {}, s) }),
44
- a
45
- ] }),
46
- o.footer.display && /* @__PURE__ */ t(L, { className: o.footer.style === "fixed" ? "sticky bottom-0" : "" })
32
+ function W(i) {
33
+ const { children: a, layoutConfig: l } = i, s = d(), m = p(), o = l ?? s, c = y(), f = g();
34
+ return /* @__PURE__ */ t(R, { id: "owp-layout", config: o, className: "flex w-full", children: /* @__PURE__ */ e("div", { className: "flex min-w-0 flex-auto", children: [
35
+ o.navbar.display && o.navbar.position === "left" && /* @__PURE__ */ t(n, {}),
36
+ /* @__PURE__ */ e("main", { id: "owp-main", className: "relative z-10 flex min-h-full min-w-0 flex-auto flex-col", children: [
37
+ o.toolbar.display && /* @__PURE__ */ t(w, { className: o.toolbar.style === "fixed" ? "sticky top-0" : "" }),
38
+ !!(c || f) && /* @__PURE__ */ t("div", { className: "fixed top-0 left-0 z-30 w-full", children: /* @__PURE__ */ t(x, { color: "secondary" }) }),
39
+ /* @__PURE__ */ e("div", { className: "relative z-10 flex min-h-0 flex-auto flex-col", children: [
40
+ /* @__PURE__ */ t(N, { children: /* @__PURE__ */ t(b, {}, m) }),
41
+ a
47
42
  ] }),
48
- o.navbar.display && o.navbar.position === "right" && /* @__PURE__ */ t(n, {})
49
- ] })
50
- ] });
43
+ o.footer.display && /* @__PURE__ */ t(L, { className: o.footer.style === "fixed" ? "sticky bottom-0" : "" })
44
+ ] }),
45
+ o.navbar.display && o.navbar.position === "right" && /* @__PURE__ */ t(n, {})
46
+ ] }) });
51
47
  }
52
- r(C, "Layout");
53
- const $ = v(C);
48
+ r(W, "Layout");
49
+ const G = v(W);
54
50
  export {
55
- $ as default
51
+ G as default
56
52
  };
57
53
  //# sourceMappingURL=Layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","sources":["../../src/layout/Layout.tsx"],"sourcesContent":["import { LayoutConfigDefaultsType } from '@/configs/layoutConfig';\nimport { OwpSuspense } from '@/components/OwpSuspense';\nimport { useNavigationActiveRouteRemountKey } from '@/hooks/internal/useNavigationActiveRouteRemount';\nimport { useGetCurrentLayoutConfig } from '@/hooks/useOwpSettings';\nimport { LinearProgress } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport { useIsFetching, useIsMutating } from '@tanstack/react-query';\nimport { memo, ReactNode } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport FooterLayout from './components/layouts/FooterLayout';\nimport LeftSideLayout from './components/layouts/LeftSideLayout';\nimport NavbarWrapperLayout from './components/layouts/NavbarWrapperLayout';\nimport ToolbarLayout from './components/toolbar/ToolbarLayout';\n\nconst Root = styled('div')(({ config }: { config: LayoutConfigDefaultsType }) => ({\n ...(config.mode === 'boxed' && {\n clipPath: 'inset(0)',\n maxWidth: config.containerWidth,\n marginLeft: 'auto',\n marginRight: 'auto',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n }),\n ...(config.mode === 'container' && {\n '& .container': {\n maxWidth: config.containerWidth,\n width: '100%',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n }),\n}));\n\ntype LayoutProps = {\n layoutConfig?: LayoutConfigDefaultsType;\n children?: ReactNode;\n};\n\n/**\n * The layout.\n */\nfunction Layout(props: LayoutProps) {\n const { children, layoutConfig } = props;\n const currentLayoutConfig = useGetCurrentLayoutConfig() as LayoutConfigDefaultsType;\n const navigationActiveRouteRemountKey = useNavigationActiveRouteRemountKey();\n const config = layoutConfig ?? currentLayoutConfig;\n const isFetching = useIsFetching();\n const isMutating = useIsMutating();\n\n return (\n <Root id=\"owp-layout\" config={config} className=\"flex w-full\">\n {config.leftSidePanel.display && <LeftSideLayout />}\n\n <div className=\"flex min-w-0 flex-auto\">\n {config.navbar.display && config.navbar.position === 'left' && <NavbarWrapperLayout />}\n\n <main id=\"owp-main\" className=\"relative z-10 flex min-h-full min-w-0 flex-auto flex-col\">\n {config.toolbar.display && (\n <ToolbarLayout className={config.toolbar.style === 'fixed' ? 'sticky top-0' : ''} />\n )}\n {Boolean(isFetching || isMutating) && (\n <div className=\"fixed top-0 left-0 z-30 w-full\">\n <LinearProgress color=\"secondary\" />\n </div>\n )}\n\n <div className=\"relative z-10 flex min-h-0 flex-auto flex-col\">\n <OwpSuspense>\n <Outlet key={navigationActiveRouteRemountKey} />\n </OwpSuspense>\n {children}\n </div>\n\n {config.footer.display && (\n <FooterLayout className={config.footer.style === 'fixed' ? 'sticky bottom-0' : ''} />\n )}\n </main>\n\n {config.navbar.display && config.navbar.position === 'right' && <NavbarWrapperLayout />}\n </div>\n </Root>\n );\n}\n\nexport default memo(Layout);\n"],"names":["Root","styled","config","Layout","props","children","layoutConfig","currentLayoutConfig","useGetCurrentLayoutConfig","navigationActiveRouteRemountKey","useNavigationActiveRouteRemountKey","isFetching","useIsFetching","isMutating","useIsMutating","jsx","LeftSideLayout","jsxs","NavbarWrapperLayout","ToolbarLayout","LinearProgress","OwpSuspense","Outlet","FooterLayout","__name","Layout$1","memo"],"mappings":";;;;;;;;;;;;;;;AAcA,MAAMA,IAAOC,EAAO,KAAK,EAAE,CAAC,EAAE,QAAAC,SAAoD;AAAA,EAChF,GAAIA,EAAO,SAAS,WAAW;AAAA,IAC7B,UAAU;AAAA,IACV,UAAUA,EAAO;AAAA,IACjB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EAAA;AAAA,EAEb,GAAIA,EAAO,SAAS,eAAe;AAAA,IACjC,gBAAgB;AAAA,MACd,UAAUA,EAAO;AAAA,MACjB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,EAAE;AAUF,SAASC,EAAOC,GAAoB;AAClC,QAAM,EAAE,UAAAC,GAAU,cAAAC,EAAA,IAAiBF,GAC7BG,IAAsBC,EAAA,GACtBC,IAAkCC,EAAA,GAClCR,IAASI,KAAgBC,GACzBI,IAAaC,EAAA,GACbC,IAAaC,EAAA;AAEnB,2BACGd,GAAA,EAAK,IAAG,cAAa,QAAAE,GAAgB,WAAU,eAC7C,UAAA;AAAA,IAAAA,EAAO,cAAc,WAAW,gBAAAa,EAACC,GAAA,CAAA,CAAe;AAAA,IAEjD,gBAAAC,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,MAAAf,EAAO,OAAO,WAAWA,EAAO,OAAO,aAAa,4BAAWgB,GAAA,EAAoB;AAAA,MAEpF,gBAAAD,EAAC,QAAA,EAAK,IAAG,YAAW,WAAU,4DAC3B,UAAA;AAAA,QAAAf,EAAO,QAAQ,WACd,gBAAAa,EAACI,GAAA,EAAc,WAAWjB,EAAO,QAAQ,UAAU,UAAU,iBAAiB,GAAA,CAAI;AAAA,QAEnF,GAAQS,KAAcE,MACrB,gBAAAE,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA,gBAAAA,EAACK,GAAA,EAAe,OAAM,YAAA,CAAY,GACpC;AAAA,QAGF,gBAAAH,EAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,UAAA,gBAAAF,EAACM,GAAA,EACC,UAAA,gBAAAN,EAACO,GAAA,CAAA,GAAYb,CAAiC,GAChD;AAAA,UACCJ;AAAA,QAAA,GACH;AAAA,QAECH,EAAO,OAAO,WACb,gBAAAa,EAACQ,GAAA,EAAa,WAAWrB,EAAO,OAAO,UAAU,UAAU,oBAAoB,GAAA,CAAI;AAAA,MAAA,GAEvF;AAAA,MAECA,EAAO,OAAO,WAAWA,EAAO,OAAO,aAAa,6BAAYgB,GAAA,CAAA,CAAoB;AAAA,IAAA,EAAA,CACvF;AAAA,EAAA,GACF;AAEJ;AAzCSM,EAAArB,GAAA;AA2CT,MAAAsB,IAAeC,EAAKvB,CAAM;"}
1
+ {"version":3,"file":"Layout.js","sources":["../../src/layout/Layout.tsx"],"sourcesContent":["import { LayoutConfigDefaultsType } from '@/configs/layoutConfig';\nimport { OwpSuspense } from '@/components/OwpSuspense';\nimport { useNavigationActiveRouteRemountKey } from '@/hooks/internal/useNavigationActiveRouteRemount';\nimport { useGetCurrentLayoutConfig } from '@/hooks/useOwpSettings';\nimport { LinearProgress } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport { useIsFetching, useIsMutating } from '@tanstack/react-query';\nimport { memo, ReactNode } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport FooterLayout from './components/layouts/FooterLayout';\nimport NavbarWrapperLayout from './components/layouts/NavbarWrapperLayout';\nimport ToolbarLayout from './components/toolbar/ToolbarLayout';\n\nconst Root = styled('div')(({ config }: { config: LayoutConfigDefaultsType }) => ({\n ...(config.mode === 'boxed' && {\n clipPath: 'inset(0)',\n maxWidth: config.containerWidth,\n marginLeft: 'auto',\n marginRight: 'auto',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n }),\n ...(config.mode === 'container' && {\n '& .container': {\n maxWidth: config.containerWidth,\n width: '100%',\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n }),\n}));\n\ntype LayoutProps = {\n layoutConfig?: LayoutConfigDefaultsType;\n children?: ReactNode;\n};\n\n/**\n * The layout.\n */\nfunction Layout(props: LayoutProps) {\n const { children, layoutConfig } = props;\n const currentLayoutConfig = useGetCurrentLayoutConfig() as LayoutConfigDefaultsType;\n const navigationActiveRouteRemountKey = useNavigationActiveRouteRemountKey();\n const config = layoutConfig ?? currentLayoutConfig;\n const isFetching = useIsFetching();\n const isMutating = useIsMutating();\n\n return (\n <Root id=\"owp-layout\" config={config} className=\"flex w-full\">\n <div className=\"flex min-w-0 flex-auto\">\n {config.navbar.display && config.navbar.position === 'left' && <NavbarWrapperLayout />}\n\n <main id=\"owp-main\" className=\"relative z-10 flex min-h-full min-w-0 flex-auto flex-col\">\n {config.toolbar.display && (\n <ToolbarLayout className={config.toolbar.style === 'fixed' ? 'sticky top-0' : ''} />\n )}\n {Boolean(isFetching || isMutating) && (\n <div className=\"fixed top-0 left-0 z-30 w-full\">\n <LinearProgress color=\"secondary\" />\n </div>\n )}\n\n <div className=\"relative z-10 flex min-h-0 flex-auto flex-col\">\n <OwpSuspense>\n <Outlet key={navigationActiveRouteRemountKey} />\n </OwpSuspense>\n {children}\n </div>\n\n {config.footer.display && (\n <FooterLayout className={config.footer.style === 'fixed' ? 'sticky bottom-0' : ''} />\n )}\n </main>\n\n {config.navbar.display && config.navbar.position === 'right' && <NavbarWrapperLayout />}\n </div>\n </Root>\n );\n}\n\nexport default memo(Layout);\n"],"names":["Root","styled","config","Layout","props","children","layoutConfig","currentLayoutConfig","useGetCurrentLayoutConfig","navigationActiveRouteRemountKey","useNavigationActiveRouteRemountKey","isFetching","useIsFetching","isMutating","useIsMutating","jsx","jsxs","NavbarWrapperLayout","ToolbarLayout","LinearProgress","OwpSuspense","Outlet","FooterLayout","__name","Layout$1","memo"],"mappings":";;;;;;;;;;;;;;AAaA,MAAMA,IAAOC,EAAO,KAAK,EAAE,CAAC,EAAE,QAAAC,SAAoD;AAAA,EAChF,GAAIA,EAAO,SAAS,WAAW;AAAA,IAC7B,UAAU;AAAA,IACV,UAAUA,EAAO;AAAA,IACjB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EAAA;AAAA,EAEb,GAAIA,EAAO,SAAS,eAAe;AAAA,IACjC,gBAAgB;AAAA,MACd,UAAUA,EAAO;AAAA,MACjB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,aAAa;AAAA,IAAA;AAAA,EACf;AAEJ,EAAE;AAUF,SAASC,EAAOC,GAAoB;AAClC,QAAM,EAAE,UAAAC,GAAU,cAAAC,EAAA,IAAiBF,GAC7BG,IAAsBC,EAAA,GACtBC,IAAkCC,EAAA,GAClCR,IAASI,KAAgBC,GACzBI,IAAaC,EAAA,GACbC,IAAaC,EAAA;AAEnB,SACE,gBAAAC,EAACf,GAAA,EAAK,IAAG,cAAa,QAAAE,GAAgB,WAAU,eAC9C,UAAA,gBAAAc,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAA;AAAA,IAAAd,EAAO,OAAO,WAAWA,EAAO,OAAO,aAAa,4BAAWe,GAAA,EAAoB;AAAA,IAEpF,gBAAAD,EAAC,QAAA,EAAK,IAAG,YAAW,WAAU,4DAC3B,UAAA;AAAA,MAAAd,EAAO,QAAQ,WACd,gBAAAa,EAACG,GAAA,EAAc,WAAWhB,EAAO,QAAQ,UAAU,UAAU,iBAAiB,GAAA,CAAI;AAAA,MAEnF,GAAQS,KAAcE,MACrB,gBAAAE,EAAC,OAAA,EAAI,WAAU,kCACb,UAAA,gBAAAA,EAACI,GAAA,EAAe,OAAM,YAAA,CAAY,GACpC;AAAA,MAGF,gBAAAH,EAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,QAAA,gBAAAD,EAACK,GAAA,EACC,UAAA,gBAAAL,EAACM,GAAA,CAAA,GAAYZ,CAAiC,GAChD;AAAA,QACCJ;AAAA,MAAA,GACH;AAAA,MAECH,EAAO,OAAO,WACb,gBAAAa,EAACO,GAAA,EAAa,WAAWpB,EAAO,OAAO,UAAU,UAAU,oBAAoB,GAAA,CAAI;AAAA,IAAA,GAEvF;AAAA,IAECA,EAAO,OAAO,WAAWA,EAAO,OAAO,aAAa,6BAAYe,GAAA,CAAA,CAAoB;AAAA,EAAA,EAAA,CACvF,EAAA,CACF;AAEJ;AAvCSM,EAAApB,GAAA;AAyCT,MAAAqB,IAAeC,EAAKtB,CAAM;"}
@@ -1 +1 @@
1
- {"version":3,"file":"FooterLayout.js","sources":["../../../../src/layout/components/layouts/FooterLayout.tsx"],"sourcesContent":["import { useGetFooterTheme } from '@/hooks/useOwpSettings';\nimport AppBar from '@mui/material/AppBar';\nimport { ThemeProvider } from '@mui/material/styles';\nimport Toolbar from '@mui/material/Toolbar';\nimport clsx from 'clsx';\nimport { memo } from 'react';\n\ntype FooterLayoutProps = { className?: string };\n\n/**\n * The footer layout.\n */\nfunction FooterLayout(props: FooterLayoutProps) {\n const { className } = props;\n\n const footerTheme = useGetFooterTheme();\n\n return (\n <ThemeProvider theme={footerTheme}>\n <AppBar\n id=\"owp-footer\"\n className={clsx('relative z-20 border-t', className)}\n color=\"default\"\n sx={(theme) => ({\n backgroundColor: 'var(--default-background-footerTheme-palette)',\n ...theme.applyStyles('light', {\n backgroundColor: 'var(--paper-background-footerTheme-palette)',\n }),\n '--paper-background-footerTheme-palette': (footerTheme as any).palette.background.paper,\n '--default-background-footerTheme-palette': (footerTheme as any).palette.background\n .default,\n })}\n elevation={0}\n >\n <Toolbar className=\"min-h-48 md:min-h-64 px-8 sm:px-12 py-0 flex items-center overflow-x-auto\">\n Footer\n </Toolbar>\n </AppBar>\n </ThemeProvider>\n );\n}\n\nexport default memo(FooterLayout);\n"],"names":["FooterLayout","props","className","footerTheme","useGetFooterTheme","jsx","ThemeProvider","AppBar","clsx","__name","theme","Toolbar","FooterLayout$1","memo"],"mappings":";;;;;;;;;AAYA,SAASA,EAAaC,GAA0B;AAC9C,QAAM,EAAE,WAAAC,MAAcD,GAEhBE,IAAcC,EAAA;AAEpB,SACE,gBAAAC,EAACC,GAAA,EAAc,OAAOH,GACpB,UAAA,gBAAAE;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAWC,EAAK,0BAA0BN,CAAS;AAAA,MACnD,OAAM;AAAA,MACN,IAAI,gBAAAO,EAAA,CAACC,OAAW;AAAA,QACd,iBAAiB;AAAA,QACjB,GAAGA,EAAM,YAAY,SAAS;AAAA,UAC5B,iBAAiB;AAAA,QAAA,CAClB;AAAA,QACD,0CAA2CP,EAAoB,QAAQ,WAAW;AAAA,QAClF,4CAA6CA,EAAoB,QAAQ,WACtE;AAAA,MAAA,IAPD;AAAA,MASJ,WAAW;AAAA,MAEX,UAAA,gBAAAE,EAACM,GAAA,EAAQ,WAAU,6EAA4E,UAAA,SAAA,CAE/F;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AA5BSF,EAAAT,GAAA;AA8BT,MAAAY,IAAeC,EAAKb,CAAY;"}
1
+ {"version":3,"file":"FooterLayout.js","sources":["../../../../src/layout/components/layouts/FooterLayout.tsx"],"sourcesContent":["import { useGetFooterTheme } from '@/hooks/useOwpSettings';\nimport AppBar from '@mui/material/AppBar';\nimport { ThemeProvider } from '@mui/material/styles';\nimport Toolbar from '@mui/material/Toolbar';\nimport clsx from 'clsx';\nimport { memo } from 'react';\n\ntype FooterLayoutProps = { className?: string };\n\n/**\n * The footer layout.\n */\nfunction FooterLayout(props: FooterLayoutProps) {\n const { className } = props;\n\n const footerTheme = useGetFooterTheme();\n\n return (\n <ThemeProvider theme={footerTheme}>\n <AppBar\n id=\"owp-footer\"\n className={clsx('relative z-20 border-t', className)}\n color=\"default\"\n sx={(theme) => ({\n backgroundColor: 'var(--default-background-footerTheme-palette)',\n ...theme.applyStyles('light', {\n backgroundColor: 'var(--paper-background-footerTheme-palette)',\n }),\n '--paper-background-footerTheme-palette': footerTheme.palette.background.paper,\n '--default-background-footerTheme-palette': footerTheme.palette.background.default,\n })}\n elevation={0}\n >\n <Toolbar className=\"min-h-48 md:min-h-64 px-8 sm:px-12 py-0 flex items-center overflow-x-auto\">\n Footer\n </Toolbar>\n </AppBar>\n </ThemeProvider>\n );\n}\n\nexport default memo(FooterLayout);\n"],"names":["FooterLayout","props","className","footerTheme","useGetFooterTheme","jsx","ThemeProvider","AppBar","clsx","__name","theme","Toolbar","FooterLayout$1","memo"],"mappings":";;;;;;;;;AAYA,SAASA,EAAaC,GAA0B;AAC9C,QAAM,EAAE,WAAAC,MAAcD,GAEhBE,IAAcC,EAAA;AAEpB,SACE,gBAAAC,EAACC,GAAA,EAAc,OAAOH,GACpB,UAAA,gBAAAE;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,WAAWC,EAAK,0BAA0BN,CAAS;AAAA,MACnD,OAAM;AAAA,MACN,IAAI,gBAAAO,EAAA,CAACC,OAAW;AAAA,QACd,iBAAiB;AAAA,QACjB,GAAGA,EAAM,YAAY,SAAS;AAAA,UAC5B,iBAAiB;AAAA,QAAA,CAClB;AAAA,QACD,0CAA0CP,EAAY,QAAQ,WAAW;AAAA,QACzE,4CAA4CA,EAAY,QAAQ,WAAW;AAAA,MAAA,IANzE;AAAA,MAQJ,WAAW;AAAA,MAEX,UAAA,gBAAAE,EAACM,GAAA,EAAQ,WAAU,6EAA4E,UAAA,SAAA,CAE/F;AAAA,IAAA;AAAA,EAAA,GAEJ;AAEJ;AA3BSF,EAAAT,GAAA;AA6BT,MAAAY,IAAeC,EAAKb,CAAY;"}
@@ -2,20 +2,20 @@ var Q = Object.defineProperty;
2
2
  var s = (e, r) => Q(e, "name", { value: r, configurable: !0 });
3
3
  import { jsxs as d, jsx as t } from "../../../node_modules/.pnpm/@emotion_react@11.14.0_@types_react@19.2.14_react@19.2.4/node_modules/@emotion/react/jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js";
4
4
  import { useGetCurrentUser as X } from "../../../hooks/useCurrentUser.js";
5
+ import { useOwpDialogs as Z } from "../../../hooks/useOwpDialogs.js";
5
6
  import { useOwpTranslation as b } from "../../../hooks/useOwpTranslation.js";
6
- import { useStorage as Z } from "../../../hooks/useStorage.js";
7
+ import { useStorage as q } from "../../../hooks/useStorage.js";
7
8
  import N from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/Visibility.js";
8
9
  import T from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/VisibilityOff.js";
9
10
  import _ from "@mui/material/Alert";
10
- import q from "@mui/material/Button";
11
+ import J from "@mui/material/Button";
11
12
  import k from "@mui/material/IconButton";
12
13
  import L from "@mui/material/InputAdornment";
13
- import J from "@mui/material/ListItemIcon";
14
- import K from "@mui/material/ListItemText";
15
- import Y from "@mui/material/MenuItem";
14
+ import K from "@mui/material/ListItemIcon";
15
+ import Y from "@mui/material/ListItemText";
16
+ import ee from "@mui/material/MenuItem";
16
17
  import W from "@mui/material/TextField";
17
- import { useMutation as ee } from "@tanstack/react-query";
18
- import { useDialogs as te } from "@toolpad/core/useDialogs";
18
+ import { useMutation as te } from "@tanstack/react-query";
19
19
  import { useState as P, useMemo as D } from "react";
20
20
  import { useForm as ne, Controller as O } from "react-hook-form";
21
21
  import { OwpSvgIcon as se } from "../../../components/OwpSvgIcon/OwpSvgIcon.js";
@@ -33,27 +33,27 @@ function de() {
33
33
  Strong: e("Pages.ChangePassword.label.강력")
34
34
  }, { control: i, handleSubmit: c, watch: l, reset: B } = ne({
35
35
  defaultValues: { password: "", confirm: "" }
36
- }), [A, H] = P(!1), [E, j] = P(!1), [g, p] = P(null), f = X(), { getEnv: R } = Z(), S = D(() => {
36
+ }), [A, H] = P(!1), [E, j] = P(!1), [p, g] = P(null), f = X(), { getEnv: R } = q(), S = D(() => {
37
37
  try {
38
38
  return R();
39
39
  } catch (n) {
40
40
  return console.error("🚀 ~ getEnv ~ error:", n), {};
41
41
  }
42
42
  }, [R]), m = l("password"), v = l("confirm"), o = D(() => {
43
- const n = m.length >= 8, a = /[A-Za-z]/.test(m), x = /\d/.test(m), C = ce.test(m), F = m === v && m.length > 0, V = n && a && x && C, w = [n, a, x, C].filter(Boolean).length, G = w <= 2 ? "Weak" : w === 3 ? "Medium" : "Strong";
44
- return { len: n, hasLetter: a, hasNum: x, hasSpecial: C, match: F, valid: V, score: w, strength: G };
45
- }, [m, v]), z = oe(o.score / 4 * 100, 0, 100), M = { Weak: "bg-red-500", Medium: "bg-yellow-500", Strong: "bg-green-500" }, I = ee({
46
- mutationFn: /* @__PURE__ */ s(({ password: n }) => ge({
43
+ const n = m.length >= 8, a = /[A-Za-z]/.test(m), w = /\d/.test(m), x = ce.test(m), F = m === v && m.length > 0, V = n && a && w && x, C = [n, a, w, x].filter(Boolean).length, G = C <= 2 ? "Weak" : C === 3 ? "Medium" : "Strong";
44
+ return { len: n, hasLetter: a, hasNum: w, hasSpecial: x, match: F, valid: V, score: C, strength: G };
45
+ }, [m, v]), z = oe(o.score / 4 * 100, 0, 100), M = { Weak: "bg-red-500", Medium: "bg-yellow-500", Strong: "bg-green-500" }, I = te({
46
+ mutationFn: /* @__PURE__ */ s(({ password: n }) => pe({
47
47
  apiBaseUrl: S == null ? void 0 : S.apiBaseUrl,
48
48
  password: n,
49
49
  userSeq: f == null ? void 0 : f.USERSEQ
50
50
  }), "mutationFn"),
51
51
  onSuccess: /* @__PURE__ */ s((n) => {
52
- p(n), n === y && B();
52
+ g(n), n === y && B();
53
53
  }, "onSuccess")
54
54
  });
55
55
  return /* @__PURE__ */ d("form", { onSubmit: c(/* @__PURE__ */ s(async ({ password: n }) => {
56
- !o.valid || !o.match || (p(null), await I.mutateAsync({ password: n }));
56
+ !o.valid || !o.match || (g(null), await I.mutateAsync({ password: n }));
57
57
  }, "submit")), className: "w-full max-w-lg space-y-20", children: [
58
58
  /* @__PURE__ */ d("div", { className: "space-y-4", children: [
59
59
  /* @__PURE__ */ t(
@@ -84,7 +84,7 @@ function de() {
84
84
  }
85
85
  },
86
86
  onChange: /* @__PURE__ */ s((a) => {
87
- n.onChange(U(a.target.value)), g !== null && p(null);
87
+ n.onChange(U(a.target.value)), p !== null && g(null);
88
88
  }, "onChange"),
89
89
  helperText: e("Message.8자 이상, 영문·숫자·특수문자 포함")
90
90
  }
@@ -129,7 +129,7 @@ function de() {
129
129
  }
130
130
  },
131
131
  onChange: /* @__PURE__ */ s((a) => {
132
- n.onChange(U(a.target.value)), g !== null && p(null);
132
+ n.onChange(U(a.target.value)), p !== null && g(null);
133
133
  }, "onChange"),
134
134
  error: !!n.value && !o.match,
135
135
  helperText: n.value ? o.match ? e("Message.일치합니다.") : e("Message.비밀번호가 일치하지 않습니다.") : ""
@@ -145,7 +145,7 @@ function de() {
145
145
  /* @__PURE__ */ t(u, { ok: o.match, text: e("Message.비밀번호 일치") })
146
146
  ] }),
147
147
  /* @__PURE__ */ t(
148
- q,
148
+ J,
149
149
  {
150
150
  fullWidth: !0,
151
151
  type: "submit",
@@ -157,8 +157,8 @@ function de() {
157
157
  children: e("Button.변경")
158
158
  }
159
159
  ),
160
- g === y && /* @__PURE__ */ t(_, { severity: "success", children: e("Message.비밀번호가 변경되었습니다.") }),
161
- g === h && /* @__PURE__ */ t(_, { severity: "error", children: e("Message.변경에 실패했습니다. 다시 시도해주세요.") })
160
+ p === y && /* @__PURE__ */ t(_, { severity: "success", children: e("Message.비밀번호가 변경되었습니다.") }),
161
+ p === h && /* @__PURE__ */ t(_, { severity: "error", children: e("Message.변경에 실패했습니다. 다시 시도해주세요.") })
162
162
  ] });
163
163
  }
164
164
  s(de, "PasswordChangeContent");
@@ -179,17 +179,17 @@ function ue({ open: e, onClose: r }) {
179
179
  }
180
180
  s(ue, "PasswordChangeDialog");
181
181
  function Ue(e) {
182
- const { onAction: r } = e, { t: i } = b(), c = te();
182
+ const { onAction: r } = e, { t: i } = b(), c = Z();
183
183
  return /* @__PURE__ */ d(
184
- Y,
184
+ ee,
185
185
  {
186
186
  onClick: /* @__PURE__ */ s(async () => {
187
187
  r == null || r(), c.open(ue);
188
188
  }, "onClick"),
189
189
  children: [
190
- /* @__PURE__ */ t(J, { className: "min-w-36", children: /* @__PURE__ */ t(se, { children: "heroicons-outline:pencil-square" }) }),
190
+ /* @__PURE__ */ t(K, { className: "min-w-36", children: /* @__PURE__ */ t(se, { children: "heroicons-outline:pencil-square" }) }),
191
191
  /* @__PURE__ */ t(
192
- K,
192
+ Y,
193
193
  {
194
194
  primary: i("Button.패스워드 변경"),
195
195
  sx: { "& .MuiListItemText-primary": { letterSpacing: "0.02em" } }
@@ -204,7 +204,7 @@ const u = /* @__PURE__ */ s(({ ok: e, text: r }) => /* @__PURE__ */ d("div", { c
204
204
  /* @__PURE__ */ t("span", { className: `w-6 h-6 rounded-full ${e ? "bg-green-500" : "bg-gray-300"}` }),
205
205
  /* @__PURE__ */ t("span", { className: e ? "text-gray-800" : "text-gray-500", children: r })
206
206
  ] }), "Rule");
207
- async function ge({
207
+ async function pe({
208
208
  password: e,
209
209
  userSeq: r,
210
210
  apiBaseUrl: i
@@ -230,7 +230,7 @@ async function ge({
230
230
  }
231
231
  return h;
232
232
  }
233
- s(ge, "updateUserPassword");
233
+ s(pe, "updateUserPassword");
234
234
  export {
235
235
  Ue as default
236
236
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PasswordChangeMenu.js","sources":["../../../../src/layout/components/menus/PasswordChangeMenu.tsx"],"sourcesContent":["import { OwpDialog as Dialog } from '@/components/OwpDialog';\nimport { OwpSvgIcon as SvgIcon } from '@/components/OwpSvgIcon';\nimport { useGetCurrentUser } from '@/hooks/useCurrentUser';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { useStorage } from '@/hooks/useStorage';\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\nimport Alert from '@mui/material/Alert';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MenuItem from '@mui/material/MenuItem';\nimport TextField from '@mui/material/TextField';\nimport { useMutation } from '@tanstack/react-query';\nimport { DialogProps, useDialogs } from '@toolpad/core/useDialogs';\nimport { clamp } from 'es-toolkit';\nimport { toString } from 'es-toolkit/compat';\nimport { useMemo, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\n\nconst SUCCESS = 'success';\nconst FAIL = 'fail';\nconst PASSWORD_ALLOWED_SPECIAL_CHARS = `!@#$%^&*()_-+=[]{}:;'\",.<>/?\\`~|\\\\`;\n\n/**\n * 정규식 문자 클래스 이스케이프\n * @param value 원본 문자열\n */\nconst escapeRegExpCharacterClass = (value: string) => value.replace(/[[\\]\\\\^-]/g, '\\\\$&');\n\nconst ESCAPED_PASSWORD_SPECIAL_CHARS = escapeRegExpCharacterClass(PASSWORD_ALLOWED_SPECIAL_CHARS);\nconst PASSWORD_SPECIAL_CHAR_PATTERN = new RegExp(`[${ESCAPED_PASSWORD_SPECIAL_CHARS}]`);\nconst DISALLOWED_PASSWORD_CHAR_PATTERN = new RegExp(\n `[^A-Za-z0-9${ESCAPED_PASSWORD_SPECIAL_CHARS}]`,\n 'g',\n);\n\ntype FormValues = { password: string; confirm: string };\ntype PasswordChangeMenuProps = { onAction?: () => void };\n\n/**\n * 비밀번호 허용문자 정규화\n * @param value 입력 문자열\n */\nconst sanitizePasswordValue = (value: string) => value.replace(DISALLOWED_PASSWORD_CHAR_PATTERN, '');\n\n/**\n * Password change dialog content.\n */\nfunction PasswordChangeContent() {\n const { t } = useOwpTranslation();\n\n const STRENGTH = {\n Weak: t('Pages.ChangePassword.label.약함'),\n Medium: t('Pages.ChangePassword.label.보통'),\n Strong: t('Pages.ChangePassword.label.강력'),\n } as const;\n\n const { control, handleSubmit, watch, reset } = useForm<FormValues>({\n defaultValues: { password: '', confirm: '' },\n });\n\n const [showPwd, setShowPwd] = useState(false);\n const [showConfirm, setShowConfirm] = useState(false);\n const [done, setDone] = useState<typeof SUCCESS | typeof FAIL | null>(null);\n\n const currentUser = useGetCurrentUser();\n const { getEnv } = useStorage();\n\n const env = useMemo(() => {\n try {\n return getEnv();\n } catch (error) {\n console.error('🚀 ~ getEnv ~ error:', error);\n return {};\n }\n }, [getEnv]);\n\n const pwd = watch('password');\n const confirm = watch('confirm');\n\n const rules = useMemo(() => {\n const len = pwd.length >= 8;\n const hasLetter = /[A-Za-z]/.test(pwd);\n const hasNum = /\\d/.test(pwd);\n const hasSpecial = PASSWORD_SPECIAL_CHAR_PATTERN.test(pwd);\n const match = pwd === confirm && pwd.length > 0;\n const valid = len && hasLetter && hasNum && hasSpecial;\n const score = [len, hasLetter, hasNum, hasSpecial].filter(Boolean).length;\n const strength = score <= 2 ? 'Weak' : score === 3 ? 'Medium' : 'Strong';\n return { len, hasLetter, hasNum, hasSpecial, match, valid, score, strength };\n }, [pwd, confirm]);\n\n const pct = clamp((rules.score / 4) * 100, 0, 100);\n const colors = { Weak: 'bg-red-500', Medium: 'bg-yellow-500', Strong: 'bg-green-500' };\n\n const passwordChangeMutation = useMutation({\n mutationFn: ({ password }: Pick<FormValues, 'password'>) =>\n updateUserPassword({\n apiBaseUrl: env?.apiBaseUrl,\n password,\n userSeq: currentUser?.USERSEQ,\n }),\n onSuccess: (resultCode) => {\n setDone(resultCode);\n\n if (resultCode === SUCCESS) {\n reset();\n }\n },\n });\n\n const submit = async ({ password }: FormValues) => {\n if (!rules.valid || !rules.match) {\n return;\n }\n\n setDone(null);\n await passwordChangeMutation.mutateAsync({ password });\n };\n\n return (\n <form onSubmit={handleSubmit(submit)} className=\"w-full max-w-lg space-y-20\">\n <div className=\"space-y-4\">\n <Controller\n name=\"password\"\n control={control}\n render={({ field }) => (\n <TextField\n {...field}\n autoFocus\n label={t('Pages.ChangePassword.label.새 비밀번호')}\n variant=\"outlined\"\n fullWidth\n type={showPwd ? 'text' : 'password'}\n slotProps={{\n inputLabel: {\n sx: {\n backgroundColor: 'background.paper',\n px: 0.5,\n lineHeight: 1.2,\n zIndex: 1,\n },\n },\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton onClick={() => setShowPwd((v) => !v)}>\n {showPwd ? <VisibilityOff /> : <Visibility />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n onChange={(e) => {\n field.onChange(sanitizePasswordValue(e.target.value));\n\n if (done !== null) {\n setDone(null);\n }\n }}\n helperText={t('Message.8자 이상, 영문·숫자·특수문자 포함')}\n />\n )}\n />\n {!!pwd && (\n <div className=\"space-y-4\">\n <div className=\"h-2 w-full bg-gray-200 rounded\">\n <div\n className={`h-3 rounded transition-all ${colors[rules.strength]}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex justify-end text-sm font-medium text-gray-700\">\n <span className={`ml-1 ${colors[rules.strength].replace('bg-', 'text-')}`}>\n {STRENGTH[rules.strength]}\n </span>\n </div>\n </div>\n )}\n </div>\n <Controller\n name=\"confirm\"\n control={control}\n render={({ field }) => (\n <TextField\n {...field}\n label={t('Pages.ChangePassword.label.비밀번호 확인')}\n variant=\"outlined\"\n fullWidth\n type={showConfirm ? 'text' : 'password'}\n slotProps={{\n inputLabel: {\n sx: {\n backgroundColor: 'background.paper',\n px: 0.5,\n lineHeight: 1.2,\n zIndex: 1,\n },\n },\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton onClick={() => setShowConfirm((v) => !v)}>\n {showConfirm ? <VisibilityOff /> : <Visibility />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n onChange={(e) => {\n field.onChange(sanitizePasswordValue(e.target.value));\n\n if (done !== null) {\n setDone(null);\n }\n }}\n error={!!field.value && !rules.match}\n helperText={\n !field.value\n ? ''\n : !rules.match\n ? t('Message.비밀번호가 일치하지 않습니다.')\n : t('Message.일치합니다.')\n }\n />\n )}\n />\n\n <div className=\"grid grid-cols-2 gap-2 ml-12 text-md\">\n <Rule ok={rules.len} text={t('Message.8자 이상')} />\n <Rule ok={rules.hasLetter} text={t('Message.영문 포함')} />\n <Rule ok={rules.hasNum} text={t('Message.숫자 포함')} />\n <Rule ok={rules.hasSpecial} text={t('Message.특수문자 포함')} />\n <Rule ok={rules.match} text={t('Message.비밀번호 일치')} />\n </div>\n\n <Button\n fullWidth\n type=\"submit\"\n variant=\"contained\"\n color=\"secondary\"\n loading={passwordChangeMutation.isPending}\n disabled={!rules.valid || !rules.match}\n sx={{ letterSpacing: '0.06em' }}\n >\n {t('Button.변경')}\n </Button>\n\n {done === SUCCESS && (\n <Alert severity=\"success\">\n {t('Message.비밀번호가 변경되었습니다.')}\n </Alert>\n )}\n {done === FAIL && (\n <Alert severity=\"error\">\n {t('Message.변경에 실패했습니다. 다시 시도해주세요.')}\n </Alert>\n )}\n </form>\n );\n}\n\nfunction PasswordChangeDialog({ open, onClose }: DialogProps) {\n const { t } = useOwpTranslation();\n\n return (\n <Dialog\n title={t('Title.패스워드 변경')}\n canConfirm={false}\n cancelText={t('Button.닫기')}\n open={open}\n onClose={() => onClose()}\n maxWidth=\"xs\"\n >\n <PasswordChangeContent />\n </Dialog>\n );\n}\n\n/**\n * Password change menu item.\n */\nfunction PasswordChangeMenu(props: PasswordChangeMenuProps) {\n const { onAction } = props;\n const { t } = useOwpTranslation();\n const dialogs = useDialogs();\n\n return (\n <MenuItem\n onClick={async () => {\n onAction?.();\n dialogs.open(PasswordChangeDialog);\n }}\n >\n <ListItemIcon className=\"min-w-36\">\n <SvgIcon>heroicons-outline:pencil-square</SvgIcon>\n </ListItemIcon>\n <ListItemText\n primary={t('Button.패스워드 변경')}\n sx={{ '& .MuiListItemText-primary': { letterSpacing: '0.02em' } }}\n />\n </MenuItem>\n );\n}\n\nconst Rule = ({ ok, text }: { ok: boolean; text: string }) => (\n <div className=\"flex items-center gap-4\">\n <span className={`w-6 h-6 rounded-full ${ok ? 'bg-green-500' : 'bg-gray-300'}`} />\n <span className={ok ? 'text-gray-800' : 'text-gray-500'}>{text}</span>\n </div>\n);\n\nasync function updateUserPassword({\n password,\n userSeq,\n apiBaseUrl,\n}: {\n password?: string;\n apiBaseUrl?: string;\n userSeq?: number;\n}): Promise<typeof SUCCESS | typeof FAIL> {\n if (!apiBaseUrl || !password || userSeq == null) {\n return FAIL;\n }\n\n try {\n const res = await fetch(`${apiBaseUrl}/updateIpxUser_USERPASSWORD`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n 'IPX_USER.USERPASSWORD': password,\n 'IPX_USER.USERSEQ': toString(userSeq),\n }),\n });\n\n if (!res.ok) {\n return FAIL;\n }\n const result = await res.json();\n\n if (result?.resultCode === 'STATUS_1' && result?.resultCount === 1) {\n return SUCCESS;\n }\n } catch (error) {\n console.error(error);\n }\n\n return FAIL;\n}\n\nexport default PasswordChangeMenu;\n"],"names":["SUCCESS","FAIL","PASSWORD_ALLOWED_SPECIAL_CHARS","escapeRegExpCharacterClass","__name","value","ESCAPED_PASSWORD_SPECIAL_CHARS","PASSWORD_SPECIAL_CHAR_PATTERN","DISALLOWED_PASSWORD_CHAR_PATTERN","sanitizePasswordValue","PasswordChangeContent","t","useOwpTranslation","STRENGTH","control","handleSubmit","watch","reset","useForm","showPwd","setShowPwd","useState","showConfirm","setShowConfirm","done","setDone","currentUser","useGetCurrentUser","getEnv","useStorage","env","useMemo","error","pwd","confirm","rules","len","hasLetter","hasNum","hasSpecial","match","valid","score","strength","pct","clamp","colors","passwordChangeMutation","useMutation","password","updateUserPassword","resultCode","jsxs","jsx","Controller","field","TextField","InputAdornment","IconButton","v","VisibilityOff","Visibility","e","Rule","Button","Alert","PasswordChangeDialog","open","onClose","Dialog","PasswordChangeMenu","props","onAction","dialogs","useDialogs","MenuItem","ListItemIcon","SvgIcon","ListItemText","ok","text","userSeq","apiBaseUrl","res","toString","result"],"mappings":"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"}
1
+ {"version":3,"file":"PasswordChangeMenu.js","sources":["../../../../src/layout/components/menus/PasswordChangeMenu.tsx"],"sourcesContent":["import { OwpDialog as Dialog } from '@/components/OwpDialog';\nimport { OwpSvgIcon as SvgIcon } from '@/components/OwpSvgIcon';\nimport { useGetCurrentUser } from '@/hooks/useCurrentUser';\nimport { useOwpDialogs } from '@/hooks/useOwpDialogs';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport { useStorage } from '@/hooks/useStorage';\nimport type { DialogProps } from '@/types/OwpDialogTypes';\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\nimport Alert from '@mui/material/Alert';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MenuItem from '@mui/material/MenuItem';\nimport TextField from '@mui/material/TextField';\nimport { useMutation } from '@tanstack/react-query';\nimport { clamp } from 'es-toolkit';\nimport { toString } from 'es-toolkit/compat';\nimport { useMemo, useState } from 'react';\nimport { Controller, useForm } from 'react-hook-form';\n\nconst SUCCESS = 'success';\nconst FAIL = 'fail';\nconst PASSWORD_ALLOWED_SPECIAL_CHARS = `!@#$%^&*()_-+=[]{}:;'\",.<>/?\\`~|\\\\`;\n\n/**\n * 정규식 문자 클래스 이스케이프\n * @param value 원본 문자열\n */\nconst escapeRegExpCharacterClass = (value: string) => value.replace(/[[\\]\\\\^-]/g, '\\\\$&');\n\nconst ESCAPED_PASSWORD_SPECIAL_CHARS = escapeRegExpCharacterClass(PASSWORD_ALLOWED_SPECIAL_CHARS);\nconst PASSWORD_SPECIAL_CHAR_PATTERN = new RegExp(`[${ESCAPED_PASSWORD_SPECIAL_CHARS}]`);\nconst DISALLOWED_PASSWORD_CHAR_PATTERN = new RegExp(\n `[^A-Za-z0-9${ESCAPED_PASSWORD_SPECIAL_CHARS}]`,\n 'g',\n);\n\ntype FormValues = { password: string; confirm: string };\ntype PasswordChangeMenuProps = { onAction?: () => void };\n\n/**\n * 비밀번호 허용문자 정규화\n * @param value 입력 문자열\n */\nconst sanitizePasswordValue = (value: string) => value.replace(DISALLOWED_PASSWORD_CHAR_PATTERN, '');\n\n/**\n * Password change dialog content.\n */\nfunction PasswordChangeContent() {\n const { t } = useOwpTranslation();\n\n const STRENGTH = {\n Weak: t('Pages.ChangePassword.label.약함'),\n Medium: t('Pages.ChangePassword.label.보통'),\n Strong: t('Pages.ChangePassword.label.강력'),\n } as const;\n\n const { control, handleSubmit, watch, reset } = useForm<FormValues>({\n defaultValues: { password: '', confirm: '' },\n });\n\n const [showPwd, setShowPwd] = useState(false);\n const [showConfirm, setShowConfirm] = useState(false);\n const [done, setDone] = useState<typeof SUCCESS | typeof FAIL | null>(null);\n\n const currentUser = useGetCurrentUser();\n const { getEnv } = useStorage();\n\n const env = useMemo(() => {\n try {\n return getEnv();\n } catch (error) {\n console.error('🚀 ~ getEnv ~ error:', error);\n return {};\n }\n }, [getEnv]);\n\n const pwd = watch('password');\n const confirm = watch('confirm');\n\n const rules = useMemo(() => {\n const len = pwd.length >= 8;\n const hasLetter = /[A-Za-z]/.test(pwd);\n const hasNum = /\\d/.test(pwd);\n const hasSpecial = PASSWORD_SPECIAL_CHAR_PATTERN.test(pwd);\n const match = pwd === confirm && pwd.length > 0;\n const valid = len && hasLetter && hasNum && hasSpecial;\n const score = [len, hasLetter, hasNum, hasSpecial].filter(Boolean).length;\n const strength = score <= 2 ? 'Weak' : score === 3 ? 'Medium' : 'Strong';\n return { len, hasLetter, hasNum, hasSpecial, match, valid, score, strength };\n }, [pwd, confirm]);\n\n const pct = clamp((rules.score / 4) * 100, 0, 100);\n const colors = { Weak: 'bg-red-500', Medium: 'bg-yellow-500', Strong: 'bg-green-500' };\n\n const passwordChangeMutation = useMutation({\n mutationFn: ({ password }: Pick<FormValues, 'password'>) =>\n updateUserPassword({\n apiBaseUrl: env?.apiBaseUrl,\n password,\n userSeq: currentUser?.USERSEQ,\n }),\n onSuccess: (resultCode) => {\n setDone(resultCode);\n\n if (resultCode === SUCCESS) {\n reset();\n }\n },\n });\n\n const submit = async ({ password }: FormValues) => {\n if (!rules.valid || !rules.match) {\n return;\n }\n\n setDone(null);\n await passwordChangeMutation.mutateAsync({ password });\n };\n\n return (\n <form onSubmit={handleSubmit(submit)} className=\"w-full max-w-lg space-y-20\">\n <div className=\"space-y-4\">\n <Controller\n name=\"password\"\n control={control}\n render={({ field }) => (\n <TextField\n {...field}\n autoFocus\n label={t('Pages.ChangePassword.label.새 비밀번호')}\n variant=\"outlined\"\n fullWidth\n type={showPwd ? 'text' : 'password'}\n slotProps={{\n inputLabel: {\n sx: {\n backgroundColor: 'background.paper',\n px: 0.5,\n lineHeight: 1.2,\n zIndex: 1,\n },\n },\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton onClick={() => setShowPwd((v) => !v)}>\n {showPwd ? <VisibilityOff /> : <Visibility />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n onChange={(e) => {\n field.onChange(sanitizePasswordValue(e.target.value));\n\n if (done !== null) {\n setDone(null);\n }\n }}\n helperText={t('Message.8자 이상, 영문·숫자·특수문자 포함')}\n />\n )}\n />\n {!!pwd && (\n <div className=\"space-y-4\">\n <div className=\"h-2 w-full bg-gray-200 rounded\">\n <div\n className={`h-3 rounded transition-all ${colors[rules.strength]}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex justify-end text-sm font-medium text-gray-700\">\n <span className={`ml-1 ${colors[rules.strength].replace('bg-', 'text-')}`}>\n {STRENGTH[rules.strength]}\n </span>\n </div>\n </div>\n )}\n </div>\n <Controller\n name=\"confirm\"\n control={control}\n render={({ field }) => (\n <TextField\n {...field}\n label={t('Pages.ChangePassword.label.비밀번호 확인')}\n variant=\"outlined\"\n fullWidth\n type={showConfirm ? 'text' : 'password'}\n slotProps={{\n inputLabel: {\n sx: {\n backgroundColor: 'background.paper',\n px: 0.5,\n lineHeight: 1.2,\n zIndex: 1,\n },\n },\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <IconButton onClick={() => setShowConfirm((v) => !v)}>\n {showConfirm ? <VisibilityOff /> : <Visibility />}\n </IconButton>\n </InputAdornment>\n ),\n },\n }}\n onChange={(e) => {\n field.onChange(sanitizePasswordValue(e.target.value));\n\n if (done !== null) {\n setDone(null);\n }\n }}\n error={!!field.value && !rules.match}\n helperText={\n !field.value\n ? ''\n : !rules.match\n ? t('Message.비밀번호가 일치하지 않습니다.')\n : t('Message.일치합니다.')\n }\n />\n )}\n />\n\n <div className=\"grid grid-cols-2 gap-2 ml-12 text-md\">\n <Rule ok={rules.len} text={t('Message.8자 이상')} />\n <Rule ok={rules.hasLetter} text={t('Message.영문 포함')} />\n <Rule ok={rules.hasNum} text={t('Message.숫자 포함')} />\n <Rule ok={rules.hasSpecial} text={t('Message.특수문자 포함')} />\n <Rule ok={rules.match} text={t('Message.비밀번호 일치')} />\n </div>\n\n <Button\n fullWidth\n type=\"submit\"\n variant=\"contained\"\n color=\"secondary\"\n loading={passwordChangeMutation.isPending}\n disabled={!rules.valid || !rules.match}\n sx={{ letterSpacing: '0.06em' }}\n >\n {t('Button.변경')}\n </Button>\n\n {done === SUCCESS && (\n <Alert severity=\"success\">\n {t('Message.비밀번호가 변경되었습니다.')}\n </Alert>\n )}\n {done === FAIL && (\n <Alert severity=\"error\">\n {t('Message.변경에 실패했습니다. 다시 시도해주세요.')}\n </Alert>\n )}\n </form>\n );\n}\n\nfunction PasswordChangeDialog({ open, onClose }: DialogProps) {\n const { t } = useOwpTranslation();\n\n return (\n <Dialog\n title={t('Title.패스워드 변경')}\n canConfirm={false}\n cancelText={t('Button.닫기')}\n open={open}\n onClose={() => onClose()}\n maxWidth=\"xs\"\n >\n <PasswordChangeContent />\n </Dialog>\n );\n}\n\n/**\n * Password change menu item.\n */\nfunction PasswordChangeMenu(props: PasswordChangeMenuProps) {\n const { onAction } = props;\n const { t } = useOwpTranslation();\n const dialogs = useOwpDialogs();\n\n return (\n <MenuItem\n onClick={async () => {\n onAction?.();\n dialogs.open(PasswordChangeDialog);\n }}\n >\n <ListItemIcon className=\"min-w-36\">\n <SvgIcon>heroicons-outline:pencil-square</SvgIcon>\n </ListItemIcon>\n <ListItemText\n primary={t('Button.패스워드 변경')}\n sx={{ '& .MuiListItemText-primary': { letterSpacing: '0.02em' } }}\n />\n </MenuItem>\n );\n}\n\nconst Rule = ({ ok, text }: { ok: boolean; text: string }) => (\n <div className=\"flex items-center gap-4\">\n <span className={`w-6 h-6 rounded-full ${ok ? 'bg-green-500' : 'bg-gray-300'}`} />\n <span className={ok ? 'text-gray-800' : 'text-gray-500'}>{text}</span>\n </div>\n);\n\nasync function updateUserPassword({\n password,\n userSeq,\n apiBaseUrl,\n}: {\n password?: string;\n apiBaseUrl?: string;\n userSeq?: number;\n}): Promise<typeof SUCCESS | typeof FAIL> {\n if (!apiBaseUrl || !password || userSeq == null) {\n return FAIL;\n }\n\n try {\n const res = await fetch(`${apiBaseUrl}/updateIpxUser_USERPASSWORD`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n 'IPX_USER.USERPASSWORD': password,\n 'IPX_USER.USERSEQ': toString(userSeq),\n }),\n });\n\n if (!res.ok) {\n return FAIL;\n }\n const result = await res.json();\n\n if (result?.resultCode === 'STATUS_1' && result?.resultCount === 1) {\n return SUCCESS;\n }\n } catch (error) {\n console.error(error);\n }\n\n return FAIL;\n}\n\nexport default PasswordChangeMenu;\n"],"names":["SUCCESS","FAIL","PASSWORD_ALLOWED_SPECIAL_CHARS","escapeRegExpCharacterClass","__name","value","ESCAPED_PASSWORD_SPECIAL_CHARS","PASSWORD_SPECIAL_CHAR_PATTERN","DISALLOWED_PASSWORD_CHAR_PATTERN","sanitizePasswordValue","PasswordChangeContent","t","useOwpTranslation","STRENGTH","control","handleSubmit","watch","reset","useForm","showPwd","setShowPwd","useState","showConfirm","setShowConfirm","done","setDone","currentUser","useGetCurrentUser","getEnv","useStorage","env","useMemo","error","pwd","confirm","rules","len","hasLetter","hasNum","hasSpecial","match","valid","score","strength","pct","clamp","colors","passwordChangeMutation","useMutation","password","updateUserPassword","resultCode","jsxs","jsx","Controller","field","TextField","InputAdornment","IconButton","v","VisibilityOff","Visibility","e","Rule","Button","Alert","PasswordChangeDialog","open","onClose","Dialog","PasswordChangeMenu","props","onAction","dialogs","useOwpDialogs","MenuItem","ListItemIcon","SvgIcon","ListItemText","ok","text","userSeq","apiBaseUrl","res","toString","result"],"mappings":"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"}
@@ -3,7 +3,7 @@ var r = (e, o) => G(e, "name", { value: o, configurable: !0 });
3
3
  import { jsx as t, jsxs as f, Fragment as H } from "../../../node_modules/.pnpm/@emotion_react@11.14.0_@types_react@19.2.14_react@19.2.4/node_modules/@emotion/react/jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js";
4
4
  import { useGetNavigationList as K } from "../../../hooks/useNavigation.js";
5
5
  import { useOwpTranslation as _ } from "../../../hooks/useOwpTranslation.js";
6
- import { OwpNavigationHelper as J } from "../../../utils/navigationUtils.js";
6
+ import { OwpNavigationHelper as J } from "../../../utils/internal/navigationUtils.js";
7
7
  import Q from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/UnfoldLess.js";
8
8
  import { Stack as X } from "@mui/material";
9
9
  import Y from "@mui/material/ClickAwayListener";
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationSearchToggle.js","sources":["../../../../src/layout/components/toggles/NavigationSearchToggle.tsx"],"sourcesContent":["import { OwpSvgIcon } from '@/components/OwpSvgIcon';\nimport { useGetNavigationList } from '@/hooks/useNavigation';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport type { OwpFlatNavItemType as FlatNavItemType } from '@/types/OwpNavigationTypes';\nimport { OwpNavigationHelper as NavigationHelper } from '@/utils/navigationUtils';\nimport UnfoldLessIcon from '@mui/icons-material/UnfoldLess';\nimport { Stack } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport { grey } from '@mui/material/colors';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MenuItem from '@mui/material/MenuItem';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport { styled } from '@mui/material/styles';\nimport TextField from '@mui/material/TextField';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport match from 'autosuggest-highlight/match';\nimport parse from 'autosuggest-highlight/parse';\nimport clsx from 'clsx';\nimport { trim } from 'es-toolkit/compat';\nimport { type FormEvent, type ReactNode, useEffect, useMemo, useReducer, useRef } from 'react';\nimport Autosuggest, {\n ChangeEvent,\n RenderInputComponentProps,\n RenderSuggestionParams,\n} from 'react-autosuggest';\nimport { useNavigate } from 'react-router-dom';\nimport { toolbarToggleSx } from './toggleStyles';\n\nconst Root = styled('div')(({ theme }) => ({\n '& .OwpSearch-container': {\n position: 'relative',\n },\n '& .OwpSearch-suggestionsContainerOpen': {\n position: 'absolute',\n zIndex: 1,\n marginTop: theme.spacing(),\n left: 0,\n right: 0,\n },\n '& .OwpSearch-suggestion': {\n display: 'block',\n },\n '& .OwpSearch-suggestionsList': {\n margin: 0,\n padding: 0,\n listStyleType: 'none',\n },\n '& .OwpSearch-input': {\n transition: theme.transitions.create(['background-color'], {\n easing: theme.transitions.easing.easeInOut,\n duration: theme.transitions.duration.short,\n }),\n '&:focus': {\n backgroundColor: theme.palette.background.paper,\n },\n },\n}));\n\ntype RenderInputComponentType = {\n variant?: 'basic' | 'standard';\n inputRef?: (node: HTMLInputElement) => void;\n ref?: (node: HTMLInputElement) => void;\n key?: string;\n};\n\nfunction renderInputComponent(props: RenderInputComponentProps) {\n const { variant, ref, inputRef = () => {}, key, ...other } = props as RenderInputComponentType;\n return (\n <div className=\"relative w-full\" key={key}>\n {variant === 'basic' ? (\n \n <>\n <TextField\n fullWidth\n autoComplete=\"off\"\n variant=\"outlined\"\n {...other}\n slotProps={{\n input: {\n name: 'auto-complete-search',\n role: 'search',\n inputRef: (node: HTMLInputElement) => {\n ref?.(node);\n inputRef(node);\n },\n classes: {\n input: 'OwpSearch-input py-0 px-16 h-36 md:h-36 ltr:pr-36 rtl:pl-36',\n notchedOutline: 'rounded-lg',\n },\n },\n }}\n />\n <OwpSvgIcon\n className=\"pointer-events-none absolute top-0 h-36 w-36 p-8 ltr:right-0 rtl:left-0\"\n color=\"action\"\n size={20}\n >\n heroicons-outline:magnifying-glass\n </OwpSvgIcon>\n </>\n ) : (\n \n <TextField\n fullWidth\n variant=\"standard\"\n {...other}\n slotProps={{\n input: {\n disableUnderline: true,\n inputRef: (node: HTMLInputElement) => {\n ref?.(node);\n inputRef(node);\n },\n classes: {\n input: 'OwpSearch-input py-0 px-16 h-36',\n },\n },\n }}\n />\n )}\n </div>\n );\n}\n\nfunction renderSuggestion(\n suggestion: FlatNavItemType,\n { query, isHighlighted }: RenderSuggestionParams,\n) {\n const matches = match(suggestion?.title ?? '', query);\n const parts = parse(suggestion?.title ?? '', matches);\n\n return (\n <MenuItem selected={Boolean(isHighlighted)} component=\"div\">\n <ListItemIcon className=\"min-w-36\">\n {suggestion.icon ? (\n <OwpSvgIcon>{suggestion.icon}</OwpSvgIcon>\n ) : (\n <span className=\"w-24 text-center text-2xl font-semibold uppercase\">\n {suggestion?.title?.[0]}\n </span>\n )}\n </ListItemIcon>\n <ListItemText\n primary={parts?.map((part: { text: string; highlight?: boolean }, index: number) =>\n part.highlight ? (\n <span key={index} style={{ fontWeight: 600 }}>\n {part.text}\n </span>\n ) : (\n <strong key={index} style={{ fontWeight: 300 }}>\n {part.text}\n </strong>\n ),\n )}\n />\n </MenuItem>\n );\n}\n\nfunction getSuggestions(value: string, data: FlatNavItemType[]): FlatNavItemType[] {\n const inputValue = trim(value).toLowerCase();\n const inputLength = inputValue.length;\n let count = 0;\n\n if (inputLength === 0) {\n return [];\n }\n\n return data.filter((suggestion) => {\n const keep =\n count < 10 &&\n suggestion?.title &&\n match(suggestion?.title ?? '', inputValue, { requireMatchAll: true })?.length > 0;\n\n if (keep) {\n count += 1;\n }\n\n return keep;\n });\n}\n\nfunction getSuggestionValue(suggestion: FlatNavItemType) {\n return suggestion.title;\n}\n\ntype StateType = {\n searchText: string;\n navigation: FlatNavItemType[];\n suggestions: FlatNavItemType[];\n noSuggestions: boolean;\n opened: boolean;\n};\n\nconst initialState: StateType = {\n searchText: '',\n navigation: [],\n suggestions: [],\n noSuggestions: false,\n opened: false,\n};\n\ntype ActionType =\n | { type: 'setSearchText'; value: string }\n | { type: 'setNavigation'; data: FlatNavItemType[] }\n | { type: 'updateSuggestions'; value: string }\n | { type: 'clearSuggestions' }\n | { type: 'open' }\n | { type: 'close' };\n\nfunction reducer(state: StateType, action: ActionType): StateType {\n switch (action.type) {\n case 'open': {\n return {\n ...state,\n opened: true,\n };\n }\n case 'close': {\n return {\n ...state,\n opened: false,\n searchText: '',\n };\n }\n case 'setSearchText': {\n return {\n ...state,\n searchText: action.value,\n };\n }\n case 'setNavigation': {\n return {\n ...state,\n navigation: action.data,\n };\n }\n case 'updateSuggestions': {\n const suggestions = getSuggestions(action.value, state.navigation);\n const isInputBlank = typeof action.value === 'string' && action.value.trim() === '';\n const noSuggestions = !isInputBlank && suggestions.length === 0;\n\n return {\n ...state,\n suggestions,\n noSuggestions,\n };\n }\n case 'clearSuggestions': {\n return {\n ...state,\n suggestions: [],\n noSuggestions: false,\n };\n }\n default: {\n throw new Error();\n }\n }\n}\n\n/**\n * Props for navigation search toggle.\n */\ntype NavigationSearchToggleProps = {\n className?: string;\n variant?: 'basic' | 'full';\n trigger?: ReactNode;\n placeholder?: string;\n noResults?: string;\n};\n\n/**\n * Navigation search toggle.\n */\nfunction NavigationSearchToggle(props: NavigationSearchToggleProps) {\n const navigation = useGetNavigationList();\n const {\n className,\n variant = 'full',\n trigger = (\n <IconButton sx={toolbarToggleSx}>\n <OwpSvgIcon size={20}>heroicons-outline:magnifying-glass</OwpSvgIcon>\n </IconButton>\n ),\n } = props;\n const { t } = useOwpTranslation();\n const flatNavigation = useMemo(\n () => NavigationHelper.getFlatNavigation(navigation) as FlatNavItemType[],\n [navigation],\n );\n const placeholder = props?.placeholder ?? t('Common.검색');\n const noResults = props.noResults ?? t('Message.검색된 결과가 없습니다...');\n\n const [state, dispatch] = useReducer(reducer, initialState);\n const navigate = useNavigate();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsNode = useRef<HTMLDivElement>(null);\n const popperNode = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n dispatch({\n type: 'setNavigation',\n data: flatNavigation,\n });\n }, [flatNavigation]);\n\n function showSearch() {\n dispatch({ type: 'open' });\n document.addEventListener('keydown', escFunction, false);\n }\n\n function hideSearch() {\n dispatch({ type: 'close' });\n document.removeEventListener('keydown', escFunction, false);\n }\n\n function escFunction(event: KeyboardEvent) {\n if (event.key === 'Esc' || event.key === 'Escape') {\n hideSearch();\n }\n }\n\n function handleSuggestionsFetchRequested({ value }: { value: string }) {\n dispatch({\n type: 'updateSuggestions',\n value,\n });\n }\n\n function handleSuggestionSelected(\n event: FormEvent<unknown>,\n { suggestion }: { suggestion: FlatNavItemType },\n ) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!suggestion.url) {\n return;\n }\n\n navigate(suggestion.url);\n hideSearch();\n }\n\n function handleSuggestionsClearRequested() {\n dispatch({\n type: 'clearSuggestions',\n });\n }\n\n function handleChange(_event: FormEvent<HTMLElement>, { newValue }: ChangeEvent) {\n dispatch({\n type: 'setSearchText',\n value: newValue,\n });\n }\n\n function handleClickAway(event: MouseEvent | TouchEvent) {\n if (\n state.opened &&\n (!suggestionsNode.current ||\n !(event.target instanceof Node && suggestionsNode.current.contains(event.target)))\n ) {\n hideSearch();\n }\n }\n\n switch (variant) {\n case 'basic': {\n return (\n <div className={clsx('flex w-full items-center', className)} ref={popperNode}>\n <Autosuggest\n renderInputComponent={renderInputComponent}\n highlightFirstSuggestion\n suggestions={state.suggestions}\n onSuggestionsFetchRequested={handleSuggestionsFetchRequested}\n onSuggestionsClearRequested={handleSuggestionsClearRequested}\n onSuggestionSelected={handleSuggestionSelected}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={renderSuggestion}\n inputProps={{\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n inputRef: (node) => (inputRef.current = node),\n variant,\n placeholder,\n role: 'search',\n value: state.searchText,\n onChange: handleChange,\n onFocus: showSearch,\n InputLabelProps: {\n shrink: true,\n },\n autoFocus: false,\n }}\n theme={{\n container: 'flex flex-1 w-full',\n suggestionsList: 'OwpSearch-suggestionsList',\n suggestion: 'OwpSearch-suggestion',\n }}\n renderSuggestionsContainer={(options) => {\n const { containerProps } = options;\n const { key, ...restContainerProps } = containerProps;\n\n return (\n <Popper\n anchorEl={popperNode.current}\n open={Boolean(options.children) || state.noSuggestions}\n className=\"z-9999\"\n >\n <div ref={suggestionsNode}>\n <Paper\n key={key}\n {...restContainerProps}\n style={{\n width: popperNode.current ? popperNode.current.clientWidth : '',\n }}\n className=\"overflow-hidden rounded-lg shadow-lg\"\n >\n {options.children}\n {state.noSuggestions && (\n <Typography className=\"px-16 py-12\">{noResults}</Typography>\n )}\n </Paper>\n </div>\n </Popper>\n );\n }}\n />\n </div>\n );\n }\n case 'full': {\n return (\n <Root className={clsx('flex', className)}>\n <Tooltip title={t('Title.메뉴 검색')} placement=\"bottom\">\n <div\n onClick={showSearch}\n onKeyDown={showSearch}\n role=\"button\"\n tabIndex={0}\n >\n {trigger}\n </div>\n </Tooltip>\n\n {state.opened && (\n <ClickAwayListener onClickAway={handleClickAway}>\n <Paper className=\"absolute inset-x-0 top-0 z-9999 h-full shadow-0\" square>\n <div className=\"flex h-full w-full items-center\" ref={popperNode}>\n <Autosuggest\n renderInputComponent={renderInputComponent}\n highlightFirstSuggestion\n suggestions={state.suggestions}\n onSuggestionsFetchRequested={handleSuggestionsFetchRequested}\n onSuggestionsClearRequested={handleSuggestionsClearRequested}\n onSuggestionSelected={handleSuggestionSelected}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={renderSuggestion}\n inputProps={{\n placeholder,\n value: state.searchText,\n onChange: handleChange,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n inputRef: (node) => (inputRef.current = node),\n InputLabelProps: {\n shrink: true,\n },\n autoFocus: true,\n }}\n theme={{\n container: 'flex flex-1 w-full',\n suggestionsList: 'OwpSearch-suggestionsList',\n suggestion: 'OwpSearch-suggestion',\n }}\n renderSuggestionsContainer={(options) => {\n const { containerProps } = options;\n const { key, ...restContainerProps } = containerProps;\n\n return (\n <Popper\n anchorEl={popperNode.current}\n open={Boolean(options.children) || state.noSuggestions}\n className=\"z-9999\"\n >\n <div ref={suggestionsNode}>\n <Paper\n square\n key={key}\n {...restContainerProps}\n className=\"shadow-lg\"\n style={{\n width: popperNode.current ? popperNode.current.clientWidth : 'auto',\n }}\n >\n {options.children}\n {state.noSuggestions && (\n <Typography className=\"px-16 py-12\">{noResults}</Typography>\n )}\n </Paper>\n </div>\n </Popper>\n );\n }}\n />\n <Stack className=\"mx-12\" direction=\"row\" spacing={1}>\n <IconButton\n size=\"large\"\n sx={{ color: grey[600] }}\n onClick={() => {\n dispatch({\n type: 'setSearchText',\n value: '',\n });\n inputRef.current?.focus();\n }}\n >\n <OwpSvgIcon>heroicons-outline:x-mark</OwpSvgIcon>\n </IconButton>\n <IconButton sx={{ color: grey[600] }} size=\"large\" onClick={hideSearch}>\n <UnfoldLessIcon />\n </IconButton>\n </Stack>\n </div>\n </Paper>\n </ClickAwayListener>\n )}\n </Root>\n );\n }\n default: {\n return null;\n }\n }\n}\n\n/**\n * Memoized navigation search toggle.\n */\nexport default NavigationSearchToggle;\n"],"names":["Root","styled","theme","renderInputComponent","props","variant","ref","inputRef","__name","key","other","jsxs","Fragment","jsx","TextField","node","OwpSvgIcon","renderSuggestion","suggestion","query","isHighlighted","matches","match","parts","parse","MenuItem","ListItemIcon","ListItemText","part","index","getSuggestions","value","data","inputValue","trim","inputLength","count","keep","_a","getSuggestionValue","initialState","reducer","state","action","suggestions","noSuggestions","NavigationSearchToggle","navigation","useGetNavigationList","className","trigger","IconButton","toolbarToggleSx","t","useOwpTranslation","flatNavigation","useMemo","NavigationHelper","placeholder","noResults","dispatch","useReducer","navigate","useNavigate","useRef","suggestionsNode","popperNode","useEffect","showSearch","escFunction","hideSearch","event","handleSuggestionsFetchRequested","handleSuggestionSelected","handleSuggestionsClearRequested","handleChange","_event","newValue","handleClickAway","clsx","Autosuggest","options","containerProps","restContainerProps","Popper","Paper","Typography","Tooltip","ClickAwayListener","Stack","grey","UnfoldLessIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAMA,KAAOC,GAAO,KAAK,EAAE,CAAC,EAAE,OAAAC,SAAa;AAAA,EACzC,0BAA0B;AAAA,IACxB,UAAU;AAAA,EAAA;AAAA,EAEZ,yCAAyC;AAAA,IACvC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAWA,EAAM,QAAA;AAAA,IACjB,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAET,2BAA2B;AAAA,IACzB,SAAS;AAAA,EAAA;AAAA,EAEX,gCAAgC;AAAA,IAC9B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,EAAA;AAAA,EAEjB,sBAAsB;AAAA,IACpB,YAAYA,EAAM,YAAY,OAAO,CAAC,kBAAkB,GAAG;AAAA,MACzD,QAAQA,EAAM,YAAY,OAAO;AAAA,MACjC,UAAUA,EAAM,YAAY,SAAS;AAAA,IAAA,CACtC;AAAA,IACD,WAAW;AAAA,MACT,iBAAiBA,EAAM,QAAQ,WAAW;AAAA,IAAA;AAAA,EAC5C;AAEJ,EAAE;AASF,SAASC,EAAqBC,GAAkC;AAC9D,QAAM,EAAE,SAAAC,GAAS,KAAAC,GAAK,UAAAC,IAAW,gBAAAC,EAAA,MAAM;AAAA,EAAC,GAAP,aAAU,KAAAC,GAAK,GAAGC,EAAA,IAAUN;AAC7D,2BACG,OAAA,EAAI,WAAU,mBACZ,UAAAC,MAAY,UAEX,gBAAAM,EAAAC,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,WAAS;AAAA,QACT,cAAa;AAAA,QACb,SAAQ;AAAA,QACP,GAAGJ;AAAA,QACJ,WAAW;AAAA,UACT,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,UAAU,gBAAAF,EAAA,CAACO,MAA2B;AACpC,cAAAT,KAAA,QAAAA,EAAMS,IACNR,EAASQ,CAAI;AAAA,YACf,GAHU;AAAA,YAIV,SAAS;AAAA,cACP,OAAO;AAAA,cACP,gBAAgB;AAAA,YAAA;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAM;AAAA,QACN,MAAM;AAAA,QACP,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,EAAA,CACF,IAGA,gBAAAH;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAS;AAAA,MACT,SAAQ;AAAA,MACP,GAAGJ;AAAA,MACJ,WAAW;AAAA,QACT,OAAO;AAAA,UACL,kBAAkB;AAAA,UAClB,UAAU,gBAAAF,EAAA,CAACO,MAA2B;AACpC,YAAAT,KAAA,QAAAA,EAAMS,IACNR,EAASQ,CAAI;AAAA,UACf,GAHU;AAAA,UAIV,SAAS;AAAA,YACP,OAAO;AAAA,UAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EAAA,KAjDgCN,CAoDtC;AAEJ;AAzDSD,EAAAL,GAAA;AA2DT,SAASc,EACPC,GACA,EAAE,OAAAC,GAAO,eAAAC,KACT;;AACA,QAAMC,IAAUC,GAAMJ,KAAA,gBAAAA,EAAY,UAAS,IAAIC,CAAK,GAC9CI,IAAQC,IAAMN,KAAA,gBAAAA,EAAY,UAAS,IAAIG,CAAO;AAEpD,2BACGI,IAAA,EAAS,UAAU,EAAQL,GAAgB,WAAU,OACpD,UAAA;AAAA,IAAA,gBAAAP,EAACa,KAAa,WAAU,YACrB,YAAW,OACV,gBAAAb,EAACG,KAAY,UAAAE,EAAW,KAAA,CAAK,IAE7B,gBAAAL,EAAC,UAAK,WAAU,qDACb,sCAAY,4BAAQ,IACvB,EAAA,CAEJ;AAAA,IACA,gBAAAA;AAAA,MAACc;AAAA,MAAA;AAAA,QACC,SAASJ,KAAA,gBAAAA,EAAO;AAAA,UAAI,CAACK,GAA6CC,MAChED,EAAK,8BACF,QAAA,EAAiB,OAAO,EAAE,YAAY,IAAA,GACpC,YAAK,KAAA,GADGC,CAEX,IAEA,gBAAAhB,EAAC,UAAA,EAAmB,OAAO,EAAE,YAAY,IAAA,GACtC,UAAAe,EAAK,KAAA,GADKC,CAEb;AAAA;AAAA,MAEJ;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAjCSrB,EAAAS,GAAA;AAmCT,SAASa,GAAeC,GAAeC,GAA4C;AACjF,QAAMC,IAAaC,GAAKH,CAAK,EAAE,YAAA,GACzBI,IAAcF,EAAW;AAC/B,MAAIG,IAAQ;AAEZ,SAAID,MAAgB,IACX,CAAA,IAGFH,EAAK,OAAO,CAACd,MAAe;;AACjC,UAAMmB,IACJD,IAAQ,OACRlB,KAAA,gBAAAA,EAAY,YACZoB,IAAAhB,GAAMJ,KAAA,gBAAAA,EAAY,UAAS,IAAIe,GAAY,EAAE,iBAAiB,GAAA,CAAM,MAApE,gBAAAK,EAAuE,UAAS;AAElF,WAAID,MACFD,KAAS,IAGJC;AAAA,EACT,CAAC;AACH;AArBS7B,EAAAsB,IAAA;AAuBT,SAASS,EAAmBrB,GAA6B;AACvD,SAAOA,EAAW;AACpB;AAFSV,EAAA+B,GAAA;AAYT,MAAMC,KAA0B;AAAA,EAC9B,YAAY;AAAA,EACZ,YAAY,CAAA;AAAA,EACZ,aAAa,CAAA;AAAA,EACb,eAAe;AAAA,EACf,QAAQ;AACV;AAUA,SAASC,GAAQC,GAAkBC,GAA+B;AAChE,UAAQA,EAAO,MAAA;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL,GAAGD;AAAA,QACH,QAAQ;AAAA,MAAA;AAAA,IAGZ,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,QAAQ;AAAA,QACR,YAAY;AAAA,MAAA;AAAA,IAGhB,KAAK;AACH,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,YAAYC,EAAO;AAAA,MAAA;AAAA,IAGvB,KAAK;AACH,aAAO;AAAA,QACL,GAAGD;AAAA,QACH,YAAYC,EAAO;AAAA,MAAA;AAAA,IAGvB,KAAK,qBAAqB;AACxB,YAAMC,IAAcd,GAAea,EAAO,OAAOD,EAAM,UAAU,GAE3DG,IAAgB,EADD,OAAOF,EAAO,SAAU,YAAYA,EAAO,MAAM,WAAW,OAC1CC,EAAY,WAAW;AAE9D,aAAO;AAAA,QACL,GAAGF;AAAA,QACH,aAAAE;AAAA,QACA,eAAAC;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,GAAGH;AAAA,QACH,aAAa,CAAA;AAAA,QACb,eAAe;AAAA,MAAA;AAAA,IAGnB;AACE,YAAM,IAAI,MAAA;AAAA,EACZ;AAEJ;AAjDSlC,EAAAiC,IAAA;AAiET,SAASK,GAAuB1C,GAAoC;AAClE,QAAM2C,IAAaC,EAAA,GACb;AAAA,IACJ,WAAAC;AAAA,IACA,SAAA5C,IAAU;AAAA,IACV,SAAA6C,IACE,gBAAArC,EAACsC,GAAA,EAAW,IAAIC,IACd,4BAACpC,GAAA,EAAW,MAAM,IAAI,UAAA,qCAAA,CAAkC,EAAA,CAC1D;AAAA,EAAA,IAEAZ,GACE,EAAE,GAAAiD,EAAA,IAAMC,EAAA,GACRC,IAAiBC;AAAA,IACrB,MAAMC,EAAiB,kBAAkBV,CAAU;AAAA,IACnD,CAACA,CAAU;AAAA,EAAA,GAEPW,KAActD,KAAA,gBAAAA,EAAO,gBAAeiD,EAAE,WAAW,GACjDM,IAAYvD,EAAM,aAAaiD,EAAE,yBAAyB,GAE1D,CAACX,GAAOkB,CAAQ,IAAIC,GAAWpB,IAASD,EAAY,GACpDsB,IAAWC,GAAA,GAEXxD,IAAWyD,EAAyB,IAAI,GACxCC,IAAkBD,EAAuB,IAAI,GAC7CE,IAAaF,EAAuB,IAAI;AAE9C,EAAAG,GAAU,MAAM;AACd,IAAAP,EAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAML;AAAA,IAAA,CACP;AAAA,EACH,GAAG,CAACA,CAAc,CAAC;AAEnB,WAASa,IAAa;AACpB,IAAAR,EAAS,EAAE,MAAM,QAAQ,GACzB,SAAS,iBAAiB,WAAWS,GAAa,EAAK;AAAA,EACzD;AAHS,EAAA7D,EAAA4D,GAAA;AAKT,WAASE,IAAa;AACpB,IAAAV,EAAS,EAAE,MAAM,SAAS,GAC1B,SAAS,oBAAoB,WAAWS,GAAa,EAAK;AAAA,EAC5D;AAHS,EAAA7D,EAAA8D,GAAA;AAKT,WAASD,EAAYE,GAAsB;AACzC,KAAIA,EAAM,QAAQ,SAASA,EAAM,QAAQ,aACvCD,EAAA;AAAA,EAEJ;AAJS,EAAA9D,EAAA6D,GAAA;AAMT,WAASG,EAAgC,EAAE,OAAAzC,KAA4B;AACrE,IAAA6B,EAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAA7B;AAAA,IAAA,CACD;AAAA,EACH;AALS,EAAAvB,EAAAgE,GAAA;AAOT,WAASC,EACPF,GACA,EAAE,YAAArD,KACF;AAIA,IAHAqD,EAAM,eAAA,GACNA,EAAM,gBAAA,GAEDrD,EAAW,QAIhB4C,EAAS5C,EAAW,GAAG,GACvBoD,EAAA;AAAA,EACF;AAbS,EAAA9D,EAAAiE,GAAA;AAeT,WAASC,IAAkC;AACzC,IAAAd,EAAS;AAAA,MACP,MAAM;AAAA,IAAA,CACP;AAAA,EACH;AAJS,EAAApD,EAAAkE,GAAA;AAMT,WAASC,EAAaC,GAAgC,EAAE,UAAAC,KAAyB;AAC/E,IAAAjB,EAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAOiB;AAAA,IAAA,CACR;AAAA,EACH;AALS,EAAArE,EAAAmE,GAAA;AAOT,WAASG,EAAgBP,GAAgC;AACvD,IACE7B,EAAM,WACL,CAACuB,EAAgB,WAChB,EAAEM,EAAM,kBAAkB,QAAQN,EAAgB,QAAQ,SAASM,EAAM,MAAM,OAEjFD,EAAA;AAAA,EAEJ;AAEA,UAVS9D,EAAAsE,GAAA,oBAUDzE,GAAA;AAAA,IACN,KAAK;AACH,aACE,gBAAAQ,EAAC,SAAI,WAAWkE,EAAK,4BAA4B9B,CAAS,GAAG,KAAKiB,GAChE,UAAA,gBAAArD;AAAA,QAACmE;AAAA,QAAA;AAAA,UACC,sBAAA7E;AAAA,UACA,0BAAwB;AAAA,UACxB,aAAauC,EAAM;AAAA,UACnB,6BAA6B8B;AAAA,UAC7B,6BAA6BE;AAAA,UAC7B,sBAAsBD;AAAA,UACtB,oBAAAlC;AAAA,UACA,kBAAAtB;AAAA,UACA,YAAY;AAAA;AAAA;AAAA,YAGV,UAAU,gBAAAT,EAAA,CAACO,MAAUR,EAAS,UAAUQ,GAA9B;AAAA,YACV,SAAAV;AAAA,YACA,aAAAqD;AAAA,YACA,MAAM;AAAA,YACN,OAAOhB,EAAM;AAAA,YACb,UAAUiC;AAAA,YACV,SAASP;AAAA,YACT,iBAAiB;AAAA,cACf,QAAQ;AAAA,YAAA;AAAA,YAEV,WAAW;AAAA,UAAA;AAAA,UAEb,OAAO;AAAA,YACL,WAAW;AAAA,YACX,iBAAiB;AAAA,YACjB,YAAY;AAAA,UAAA;AAAA,UAEd,4BAA4B,gBAAA5D,EAAA,CAACyE,MAAY;AACvC,kBAAM,EAAE,gBAAAC,MAAmBD,GACrB,EAAE,KAAAxE,GAAK,GAAG0E,EAAA,IAAuBD;AAEvC,mBACE,gBAAArE;AAAA,cAACuE;AAAA,cAAA;AAAA,gBACC,UAAUlB,EAAW;AAAA,gBACrB,MAAM,EAAQe,EAAQ,YAAavC,EAAM;AAAA,gBACzC,WAAU;AAAA,gBAEV,UAAA,gBAAA7B,EAAC,OAAA,EAAI,KAAKoD,GACR,UAAA,gBAAAtD;AAAA,kBAAC0E;AAAA,kBAAA;AAAA,oBAEE,GAAGF;AAAA,oBACJ,OAAO;AAAA,sBACL,OAAOjB,EAAW,UAAUA,EAAW,QAAQ,cAAc;AAAA,oBAAA;AAAA,oBAE/D,WAAU;AAAA,oBAET,UAAA;AAAA,sBAAAe,EAAQ;AAAA,sBACRvC,EAAM,iBACL,gBAAA7B,EAACyE,GAAA,EAAW,WAAU,eAAe,UAAA3B,EAAA,CAAU;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAT5ClD;AAAA,gBAAA,EAWP,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,UAGN,GA3B4B;AAAA,QA2B5B;AAAA,MAAA,GAEJ;AAAA,IAGJ,KAAK;AACH,+BACGT,IAAA,EAAK,WAAW+E,EAAK,QAAQ9B,CAAS,GACrC,UAAA;AAAA,QAAA,gBAAApC,EAAC0E,MAAQ,OAAOlC,EAAE,aAAa,GAAG,WAAU,UAC1C,UAAA,gBAAAxC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASuD;AAAA,YACT,WAAWA;AAAA,YACX,MAAK;AAAA,YACL,UAAU;AAAA,YAET,UAAAlB;AAAA,UAAA;AAAA,QAAA,GAEL;AAAA,QAECR,EAAM,UACL,gBAAA7B,EAAC2E,GAAA,EAAkB,aAAaV,GAC9B,UAAA,gBAAAjE,EAACwE,GAAA,EAAM,WAAU,mDAAkD,QAAM,IACvE,UAAA,gBAAA1E,EAAC,SAAI,WAAU,mCAAkC,KAAKuD,GACpD,UAAA;AAAA,UAAA,gBAAArD;AAAA,YAACmE;AAAA,YAAA;AAAA,cACC,sBAAA7E;AAAA,cACA,0BAAwB;AAAA,cACxB,aAAauC,EAAM;AAAA,cACnB,6BAA6B8B;AAAA,cAC7B,6BAA6BE;AAAA,cAC7B,sBAAsBD;AAAA,cACtB,oBAAAlC;AAAA,cACA,kBAAAtB;AAAA,cACA,YAAY;AAAA,gBACV,aAAAyC;AAAA,gBACA,OAAOhB,EAAM;AAAA,gBACb,UAAUiC;AAAA;AAAA;AAAA,gBAGV,UAAU,gBAAAnE,EAAA,CAACO,MAAUR,EAAS,UAAUQ,GAA9B;AAAA,gBACV,iBAAiB;AAAA,kBACf,QAAQ;AAAA,gBAAA;AAAA,gBAEV,WAAW;AAAA,cAAA;AAAA,cAEb,OAAO;AAAA,gBACL,WAAW;AAAA,gBACX,iBAAiB;AAAA,gBACjB,YAAY;AAAA,cAAA;AAAA,cAEd,4BAA4B,gBAAAP,EAAA,CAACyE,MAAY;AACvC,sBAAM,EAAE,gBAAAC,MAAmBD,GACrB,EAAE,KAAAxE,GAAK,GAAG0E,EAAA,IAAuBD;AAEvC,uBACE,gBAAArE;AAAA,kBAACuE;AAAA,kBAAA;AAAA,oBACC,UAAUlB,EAAW;AAAA,oBACrB,MAAM,EAAQe,EAAQ,YAAavC,EAAM;AAAA,oBACzC,WAAU;AAAA,oBAEV,UAAA,gBAAA7B,EAAC,OAAA,EAAI,KAAKoD,GACR,UAAA,gBAAAtD;AAAA,sBAAC0E;AAAA,sBAAA;AAAA,wBACC,QAAM;AAAA,wBAEL,GAAGF;AAAA,wBACJ,WAAU;AAAA,wBACV,OAAO;AAAA,0BACL,OAAOjB,EAAW,UAAUA,EAAW,QAAQ,cAAc;AAAA,wBAAA;AAAA,wBAG9D,UAAA;AAAA,0BAAAe,EAAQ;AAAA,0BACRvC,EAAM,iBACL,gBAAA7B,EAACyE,GAAA,EAAW,WAAU,eAAe,UAAA3B,EAAA,CAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAT5ClD;AAAA,oBAAA,EAWP,CACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAGN,GA5B4B;AAAA,YA4B5B;AAAA,UAAA;AAAA,4BAEDgF,GAAA,EAAM,WAAU,SAAQ,WAAU,OAAM,SAAS,GAChD,UAAA;AAAA,YAAA,gBAAA5E;AAAA,cAACsC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,IAAI,EAAE,OAAOuC,EAAK,GAAG,EAAA;AAAA,gBACrB,SAAS,gBAAAlF,EAAA,MAAM;;AACb,kBAAAoD,EAAS;AAAA,oBACP,MAAM;AAAA,oBACN,OAAO;AAAA,kBAAA,CACR,IACDtB,IAAA/B,EAAS,YAAT,QAAA+B,EAAkB;AAAA,gBACpB,GANS;AAAA,gBAQT,UAAA,gBAAAzB,EAACG,KAAW,UAAA,2BAAA,CAAwB;AAAA,cAAA;AAAA,YAAA;AAAA,YAEtC,gBAAAH,EAACsC,GAAA,EAAW,IAAI,EAAE,OAAOuC,EAAK,GAAG,EAAA,GAAK,MAAK,SAAQ,SAASpB,GAC1D,UAAA,gBAAAzD,EAAC8E,KAAe,EAAA,CAClB;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF,GACF,EAAA,CACF;AAAA,MAAA,GAEJ;AAAA,IAGJ;AACE,aAAO;AAAA,EACT;AAEJ;AAtQSnF,EAAAsC,IAAA;"}
1
+ {"version":3,"file":"NavigationSearchToggle.js","sources":["../../../../src/layout/components/toggles/NavigationSearchToggle.tsx"],"sourcesContent":["import { OwpSvgIcon } from '@/components/OwpSvgIcon';\nimport { useGetNavigationList } from '@/hooks/useNavigation';\nimport { useOwpTranslation } from '@/hooks/useOwpTranslation';\nimport type { OwpFlatNavItemType as FlatNavItemType } from '@/types/OwpNavigationTypes';\nimport { OwpNavigationHelper as NavigationHelper } from '@/utils/internal/navigationUtils';\nimport UnfoldLessIcon from '@mui/icons-material/UnfoldLess';\nimport { Stack } from '@mui/material';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport { grey } from '@mui/material/colors';\nimport IconButton from '@mui/material/IconButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport MenuItem from '@mui/material/MenuItem';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport { styled } from '@mui/material/styles';\nimport TextField from '@mui/material/TextField';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport match from 'autosuggest-highlight/match';\nimport parse from 'autosuggest-highlight/parse';\nimport clsx from 'clsx';\nimport { trim } from 'es-toolkit/compat';\nimport { type FormEvent, type ReactNode, useEffect, useMemo, useReducer, useRef } from 'react';\nimport Autosuggest, {\n ChangeEvent,\n RenderInputComponentProps,\n RenderSuggestionParams,\n} from 'react-autosuggest';\nimport { useNavigate } from 'react-router-dom';\nimport { toolbarToggleSx } from './toggleStyles';\n\nconst Root = styled('div')(({ theme }) => ({\n '& .OwpSearch-container': {\n position: 'relative',\n },\n '& .OwpSearch-suggestionsContainerOpen': {\n position: 'absolute',\n zIndex: 1,\n marginTop: theme.spacing(),\n left: 0,\n right: 0,\n },\n '& .OwpSearch-suggestion': {\n display: 'block',\n },\n '& .OwpSearch-suggestionsList': {\n margin: 0,\n padding: 0,\n listStyleType: 'none',\n },\n '& .OwpSearch-input': {\n transition: theme.transitions.create(['background-color'], {\n easing: theme.transitions.easing.easeInOut,\n duration: theme.transitions.duration.short,\n }),\n '&:focus': {\n backgroundColor: theme.palette.background.paper,\n },\n },\n}));\n\ntype RenderInputComponentType = {\n variant?: 'basic' | 'standard';\n inputRef?: (node: HTMLInputElement) => void;\n ref?: (node: HTMLInputElement) => void;\n key?: string;\n};\n\nfunction renderInputComponent(props: RenderInputComponentProps) {\n const { variant, ref, inputRef = () => {}, key, ...other } = props as RenderInputComponentType;\n return (\n <div className=\"relative w-full\" key={key}>\n {variant === 'basic' ? (\n \n <>\n <TextField\n fullWidth\n autoComplete=\"off\"\n variant=\"outlined\"\n {...other}\n slotProps={{\n input: {\n name: 'auto-complete-search',\n role: 'search',\n inputRef: (node: HTMLInputElement) => {\n ref?.(node);\n inputRef(node);\n },\n classes: {\n input: 'OwpSearch-input py-0 px-16 h-36 md:h-36 ltr:pr-36 rtl:pl-36',\n notchedOutline: 'rounded-lg',\n },\n },\n }}\n />\n <OwpSvgIcon\n className=\"pointer-events-none absolute top-0 h-36 w-36 p-8 ltr:right-0 rtl:left-0\"\n color=\"action\"\n size={20}\n >\n heroicons-outline:magnifying-glass\n </OwpSvgIcon>\n </>\n ) : (\n \n <TextField\n fullWidth\n variant=\"standard\"\n {...other}\n slotProps={{\n input: {\n disableUnderline: true,\n inputRef: (node: HTMLInputElement) => {\n ref?.(node);\n inputRef(node);\n },\n classes: {\n input: 'OwpSearch-input py-0 px-16 h-36',\n },\n },\n }}\n />\n )}\n </div>\n );\n}\n\nfunction renderSuggestion(\n suggestion: FlatNavItemType,\n { query, isHighlighted }: RenderSuggestionParams,\n) {\n const matches = match(suggestion?.title ?? '', query);\n const parts = parse(suggestion?.title ?? '', matches);\n\n return (\n <MenuItem selected={Boolean(isHighlighted)} component=\"div\">\n <ListItemIcon className=\"min-w-36\">\n {suggestion.icon ? (\n <OwpSvgIcon>{suggestion.icon}</OwpSvgIcon>\n ) : (\n <span className=\"w-24 text-center text-2xl font-semibold uppercase\">\n {suggestion?.title?.[0]}\n </span>\n )}\n </ListItemIcon>\n <ListItemText\n primary={parts?.map((part: { text: string; highlight?: boolean }, index: number) =>\n part.highlight ? (\n <span key={index} style={{ fontWeight: 600 }}>\n {part.text}\n </span>\n ) : (\n <strong key={index} style={{ fontWeight: 300 }}>\n {part.text}\n </strong>\n ),\n )}\n />\n </MenuItem>\n );\n}\n\nfunction getSuggestions(value: string, data: FlatNavItemType[]): FlatNavItemType[] {\n const inputValue = trim(value).toLowerCase();\n const inputLength = inputValue.length;\n let count = 0;\n\n if (inputLength === 0) {\n return [];\n }\n\n return data.filter((suggestion) => {\n const keep =\n count < 10 &&\n suggestion?.title &&\n match(suggestion?.title ?? '', inputValue, { requireMatchAll: true })?.length > 0;\n\n if (keep) {\n count += 1;\n }\n\n return keep;\n });\n}\n\nfunction getSuggestionValue(suggestion: FlatNavItemType) {\n return suggestion.title;\n}\n\ntype StateType = {\n searchText: string;\n navigation: FlatNavItemType[];\n suggestions: FlatNavItemType[];\n noSuggestions: boolean;\n opened: boolean;\n};\n\nconst initialState: StateType = {\n searchText: '',\n navigation: [],\n suggestions: [],\n noSuggestions: false,\n opened: false,\n};\n\ntype ActionType =\n | { type: 'setSearchText'; value: string }\n | { type: 'setNavigation'; data: FlatNavItemType[] }\n | { type: 'updateSuggestions'; value: string }\n | { type: 'clearSuggestions' }\n | { type: 'open' }\n | { type: 'close' };\n\nfunction reducer(state: StateType, action: ActionType): StateType {\n switch (action.type) {\n case 'open': {\n return {\n ...state,\n opened: true,\n };\n }\n case 'close': {\n return {\n ...state,\n opened: false,\n searchText: '',\n };\n }\n case 'setSearchText': {\n return {\n ...state,\n searchText: action.value,\n };\n }\n case 'setNavigation': {\n return {\n ...state,\n navigation: action.data,\n };\n }\n case 'updateSuggestions': {\n const suggestions = getSuggestions(action.value, state.navigation);\n const isInputBlank = typeof action.value === 'string' && action.value.trim() === '';\n const noSuggestions = !isInputBlank && suggestions.length === 0;\n\n return {\n ...state,\n suggestions,\n noSuggestions,\n };\n }\n case 'clearSuggestions': {\n return {\n ...state,\n suggestions: [],\n noSuggestions: false,\n };\n }\n default: {\n throw new Error();\n }\n }\n}\n\n/**\n * Props for navigation search toggle.\n */\ntype NavigationSearchToggleProps = {\n className?: string;\n variant?: 'basic' | 'full';\n trigger?: ReactNode;\n placeholder?: string;\n noResults?: string;\n};\n\n/**\n * Navigation search toggle.\n */\nfunction NavigationSearchToggle(props: NavigationSearchToggleProps) {\n const navigation = useGetNavigationList();\n const {\n className,\n variant = 'full',\n trigger = (\n <IconButton sx={toolbarToggleSx}>\n <OwpSvgIcon size={20}>heroicons-outline:magnifying-glass</OwpSvgIcon>\n </IconButton>\n ),\n } = props;\n const { t } = useOwpTranslation();\n const flatNavigation = useMemo(\n () => NavigationHelper.getFlatNavigation(navigation) as FlatNavItemType[],\n [navigation],\n );\n const placeholder = props?.placeholder ?? t('Common.검색');\n const noResults = props.noResults ?? t('Message.검색된 결과가 없습니다...');\n\n const [state, dispatch] = useReducer(reducer, initialState);\n const navigate = useNavigate();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestionsNode = useRef<HTMLDivElement>(null);\n const popperNode = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n dispatch({\n type: 'setNavigation',\n data: flatNavigation,\n });\n }, [flatNavigation]);\n\n function showSearch() {\n dispatch({ type: 'open' });\n document.addEventListener('keydown', escFunction, false);\n }\n\n function hideSearch() {\n dispatch({ type: 'close' });\n document.removeEventListener('keydown', escFunction, false);\n }\n\n function escFunction(event: KeyboardEvent) {\n if (event.key === 'Esc' || event.key === 'Escape') {\n hideSearch();\n }\n }\n\n function handleSuggestionsFetchRequested({ value }: { value: string }) {\n dispatch({\n type: 'updateSuggestions',\n value,\n });\n }\n\n function handleSuggestionSelected(\n event: FormEvent<unknown>,\n { suggestion }: { suggestion: FlatNavItemType },\n ) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!suggestion.url) {\n return;\n }\n\n navigate(suggestion.url);\n hideSearch();\n }\n\n function handleSuggestionsClearRequested() {\n dispatch({\n type: 'clearSuggestions',\n });\n }\n\n function handleChange(_event: FormEvent<HTMLElement>, { newValue }: ChangeEvent) {\n dispatch({\n type: 'setSearchText',\n value: newValue,\n });\n }\n\n function handleClickAway(event: MouseEvent | TouchEvent) {\n if (\n state.opened &&\n (!suggestionsNode.current ||\n !(event.target instanceof Node && suggestionsNode.current.contains(event.target)))\n ) {\n hideSearch();\n }\n }\n\n switch (variant) {\n case 'basic': {\n return (\n <div className={clsx('flex w-full items-center', className)} ref={popperNode}>\n <Autosuggest\n renderInputComponent={renderInputComponent}\n highlightFirstSuggestion\n suggestions={state.suggestions}\n onSuggestionsFetchRequested={handleSuggestionsFetchRequested}\n onSuggestionsClearRequested={handleSuggestionsClearRequested}\n onSuggestionSelected={handleSuggestionSelected}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={renderSuggestion}\n inputProps={{\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n inputRef: (node) => (inputRef.current = node),\n variant,\n placeholder,\n role: 'search',\n value: state.searchText,\n onChange: handleChange,\n onFocus: showSearch,\n InputLabelProps: {\n shrink: true,\n },\n autoFocus: false,\n }}\n theme={{\n container: 'flex flex-1 w-full',\n suggestionsList: 'OwpSearch-suggestionsList',\n suggestion: 'OwpSearch-suggestion',\n }}\n renderSuggestionsContainer={(options) => {\n const { containerProps } = options;\n const { key, ...restContainerProps } = containerProps;\n\n return (\n <Popper\n anchorEl={popperNode.current}\n open={Boolean(options.children) || state.noSuggestions}\n className=\"z-9999\"\n >\n <div ref={suggestionsNode}>\n <Paper\n key={key}\n {...restContainerProps}\n style={{\n width: popperNode.current ? popperNode.current.clientWidth : '',\n }}\n className=\"overflow-hidden rounded-lg shadow-lg\"\n >\n {options.children}\n {state.noSuggestions && (\n <Typography className=\"px-16 py-12\">{noResults}</Typography>\n )}\n </Paper>\n </div>\n </Popper>\n );\n }}\n />\n </div>\n );\n }\n case 'full': {\n return (\n <Root className={clsx('flex', className)}>\n <Tooltip title={t('Title.메뉴 검색')} placement=\"bottom\">\n <div\n onClick={showSearch}\n onKeyDown={showSearch}\n role=\"button\"\n tabIndex={0}\n >\n {trigger}\n </div>\n </Tooltip>\n\n {state.opened && (\n <ClickAwayListener onClickAway={handleClickAway}>\n <Paper className=\"absolute inset-x-0 top-0 z-9999 h-full shadow-0\" square>\n <div className=\"flex h-full w-full items-center\" ref={popperNode}>\n <Autosuggest\n renderInputComponent={renderInputComponent}\n highlightFirstSuggestion\n suggestions={state.suggestions}\n onSuggestionsFetchRequested={handleSuggestionsFetchRequested}\n onSuggestionsClearRequested={handleSuggestionsClearRequested}\n onSuggestionSelected={handleSuggestionSelected}\n getSuggestionValue={getSuggestionValue}\n renderSuggestion={renderSuggestion}\n inputProps={{\n placeholder,\n value: state.searchText,\n onChange: handleChange,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n inputRef: (node) => (inputRef.current = node),\n InputLabelProps: {\n shrink: true,\n },\n autoFocus: true,\n }}\n theme={{\n container: 'flex flex-1 w-full',\n suggestionsList: 'OwpSearch-suggestionsList',\n suggestion: 'OwpSearch-suggestion',\n }}\n renderSuggestionsContainer={(options) => {\n const { containerProps } = options;\n const { key, ...restContainerProps } = containerProps;\n\n return (\n <Popper\n anchorEl={popperNode.current}\n open={Boolean(options.children) || state.noSuggestions}\n className=\"z-9999\"\n >\n <div ref={suggestionsNode}>\n <Paper\n square\n key={key}\n {...restContainerProps}\n className=\"shadow-lg\"\n style={{\n width: popperNode.current ? popperNode.current.clientWidth : 'auto',\n }}\n >\n {options.children}\n {state.noSuggestions && (\n <Typography className=\"px-16 py-12\">{noResults}</Typography>\n )}\n </Paper>\n </div>\n </Popper>\n );\n }}\n />\n <Stack className=\"mx-12\" direction=\"row\" spacing={1}>\n <IconButton\n size=\"large\"\n sx={{ color: grey[600] }}\n onClick={() => {\n dispatch({\n type: 'setSearchText',\n value: '',\n });\n inputRef.current?.focus();\n }}\n >\n <OwpSvgIcon>heroicons-outline:x-mark</OwpSvgIcon>\n </IconButton>\n <IconButton sx={{ color: grey[600] }} size=\"large\" onClick={hideSearch}>\n <UnfoldLessIcon />\n </IconButton>\n </Stack>\n </div>\n </Paper>\n </ClickAwayListener>\n )}\n </Root>\n );\n }\n default: {\n return null;\n }\n }\n}\n\n/**\n * Memoized navigation search toggle.\n */\nexport default NavigationSearchToggle;\n"],"names":["Root","styled","theme","renderInputComponent","props","variant","ref","inputRef","__name","key","other","jsxs","Fragment","jsx","TextField","node","OwpSvgIcon","renderSuggestion","suggestion","query","isHighlighted","matches","match","parts","parse","MenuItem","ListItemIcon","ListItemText","part","index","getSuggestions","value","data","inputValue","trim","inputLength","count","keep","_a","getSuggestionValue","initialState","reducer","state","action","suggestions","noSuggestions","NavigationSearchToggle","navigation","useGetNavigationList","className","trigger","IconButton","toolbarToggleSx","t","useOwpTranslation","flatNavigation","useMemo","NavigationHelper","placeholder","noResults","dispatch","useReducer","navigate","useNavigate","useRef","suggestionsNode","popperNode","useEffect","showSearch","escFunction","hideSearch","event","handleSuggestionsFetchRequested","handleSuggestionSelected","handleSuggestionsClearRequested","handleChange","_event","newValue","handleClickAway","clsx","Autosuggest","options","containerProps","restContainerProps","Popper","Paper","Typography","Tooltip","ClickAwayListener","Stack","grey","UnfoldLessIcon"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { jsxs as p, jsx as t } from "../../../node_modules/.pnpm/@emotion_react@
4
4
  import { useGetNavigationList as D } from "../../../hooks/useNavigation.js";
5
5
  import { useOwpTranslation as G } from "../../../hooks/useOwpTranslation.js";
6
6
  import { useSetShortcuts as A, useGetShortcuts as F } from "../../../hooks/internal/useShortcuts.js";
7
- import { OwpNavigationHelper as H } from "../../../utils/navigationUtils.js";
7
+ import { OwpNavigationHelper as H } from "../../../utils/internal/navigationUtils.js";
8
8
  import U from "../../../node_modules/.pnpm/@mui_icons-material@7.3.9_@mui_material@7.3.9_@emotion_react@11.14.0_@types_react@19.2._dc2be6bc014bebdac88a574e3e02c144/node_modules/@mui/icons-material/esm/Clear.js";
9
9
  import M from "@mui/material/Box";
10
10
  import { amber as L, grey as k } from "@mui/material/colors";