hisd3-ui-kit 4.2.0 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -3
- package/dist/index.cjs.js +126 -59
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +17 -1
- package/dist/index.js +138 -71
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/theme/layout.ts","../src/theme/antd.ts","../src/components/Provider/index.tsx","../src/components/Sidebar/index.styled.tsx","../src/components/Sidebar/menu.ts","../src/components/Sidebar/UserMenu.tsx","../src/components/Sidebar/index.tsx","../src/components/PageHeader/index.tsx","../src/components/HeaderActions/NotificationButton.tsx","../src/components/HeaderActions/AvatarMenu.tsx","../src/components/HeaderActions/index.tsx","../src/components/Table/index.tsx","../src/components/Tabs/index.tsx","../src/components/Tag/index.tsx","../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/enum/theme.ts"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/** Shared layout metrics so the sidebar brand block and page top bar line up. */\nexport const HISD3_LAYOUT = {\n siderWidth: 260,\n siderCollapsedWidth: 64,\n /** Height of both the sidebar brand block and the page top bar. */\n topBarHeight: 60,\n /** Horizontal padding used by the top bar, title block and page body. */\n pageGutter: 28,\n} as const;\n","import type { ThemeConfig } from \"antd\";\n\nimport { HISD3_LAYOUT } from \"./layout\";\n\n/** Named primary-color presets. Any hex string is also accepted. */\nexport const HISD3_PRESETS = {\n red: \"#E5401C\",\n orange: \"#F26B1D\",\n teal: \"#00796B\",\n blue: \"#1D5FD1\",\n green: \"#2E7D32\",\n purple: \"#6A3FD6\",\n} as const;\n\nexport type HISD3Preset = keyof typeof HISD3_PRESETS;\n\n/** Neutral palette shared by every preset (the \"Backoffice\" look). */\nexport const HISD3_NEUTRALS = {\n bgLayout: \"#F3F2F0\",\n bgContainer: \"#F3F2F0\",\n bgElevated: \"#FFFFFF\",\n bgFilled: \"#E6E4E1\",\n bgFilledHover: \"#DBD8D4\",\n text: \"#171717\",\n textSecondary: \"#4A4A4A\",\n textTertiary: \"#6E6E6E\",\n /** Structural rules: sidebar edge, header bottom, table header. */\n border: \"#D9D5CE\",\n /** Quieter rules: table rows, dividers inside popups. */\n borderSecondary: \"#E7E4DE\",\n /** Near-black, used for hover/focus emphasis on controls. */\n borderStrong: \"#1F1F1F\",\n white: \"#FFFFFF\",\n} as const;\n\n/** Border weights. \"hairline\" is the default modern look. */\nexport const HISD3_BORDER_PRESETS = {\n hairline: { width: 1, border: \"#D9D5CE\", borderSecondary: \"#E7E4DE\" },\n bold: { width: 2, border: \"#1F1F1F\", borderSecondary: \"#CFCDC9\" },\n} as const;\n\nexport type HISD3Borders = keyof typeof HISD3_BORDER_PRESETS;\n\nexport const HISD3_FONT_FAMILY =\n \"'Archivo', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\";\n/** Archivo is used for both body (400) and headings (800). */\nexport const HISD3_FONT_WEIGHT_HEADING = 800;\nexport const HISD3_FONT_WEIGHT_BODY = 400;\n\nexport interface HISD3ThemeOptions {\n /** Preset name or any hex color. Default \"red\". */\n primary?: HISD3Preset | string;\n /** Corner radius in px. The Backoffice look is square (0). */\n radius?: number;\n /**\n * Border treatment. \"hairline\" (default) uses 1px warm-grey rules;\n * \"bold\" restores the 2px near-black look.\n */\n borders?: HISD3Borders;\n /** Explicit border width in px; overrides the `borders` preset. */\n lineWidth?: number;\n /** Override / extend the generated antd theme. */\n overrides?: ThemeConfig;\n}\n\nexport const resolvePrimary = (primary: HISD3Preset | string = \"red\"): string =>\n (HISD3_PRESETS as Record<string, string>)[primary] ?? primary;\n\n/** Mix a hex color with white: amount 0 → color, 1 → white. */\nexport const tint = (hex: string, amount: number): string => {\n const h = hex.replace(\"#\", \"\");\n const full = h.length === 3 ? h.split(\"\").map((c) => c + c).join(\"\") : h;\n const n = parseInt(full, 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n const mix = (c: number) => Math.round(c + (255 - c) * amount);\n return `#${[mix(r), mix(g), mix(b)]\n .map((c) => c.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n};\n\n/**\n * Build the HISD3 Ant Design v6 theme.\n *\n * ```ts\n * <ConfigProvider theme={createHisd3Theme({ primary: \"teal\" })}>\n * ```\n */\nexport const createHisd3Theme = ({\n primary,\n radius = 0,\n borders = \"hairline\",\n lineWidth,\n overrides,\n}: HISD3ThemeOptions = {}): ThemeConfig => {\n const p = resolvePrimary(primary);\n const b = HISD3_BORDER_PRESETS[borders] ?? HISD3_BORDER_PRESETS.hairline;\n const width = lineWidth ?? b.width;\n const n = {\n ...HISD3_NEUTRALS,\n border: b.border,\n borderSecondary: b.borderSecondary,\n };\n\n const base: ThemeConfig = {\n cssVar: { key: \"hisd3\" },\n token: {\n colorPrimary: p,\n colorInfo: p,\n colorLink: p,\n colorPrimaryBg: tint(p, 0.92),\n colorPrimaryBgHover: tint(p, 0.86),\n colorPrimaryBorder: tint(p, 0.6),\n fontFamily: HISD3_FONT_FAMILY,\n fontSize: 14,\n fontWeightStrong: 700,\n borderRadius: radius,\n borderRadiusLG: radius,\n borderRadiusSM: radius,\n borderRadiusXS: radius,\n lineWidth: width,\n colorBgLayout: n.bgLayout,\n colorBgContainer: n.bgContainer,\n colorBgElevated: n.bgElevated,\n colorText: n.text,\n colorTextSecondary: n.textSecondary,\n colorTextTertiary: n.textTertiary,\n colorTextHeading: n.text,\n colorBorder: n.border,\n colorBorderSecondary: n.borderSecondary,\n colorSplit: n.borderSecondary,\n controlHeight: 40,\n controlHeightLG: 52,\n controlHeightSM: 32,\n boxShadow: \"none\",\n boxShadowSecondary:\n \"0 2px 6px rgba(16,15,14,0.06), 0 12px 32px rgba(16,15,14,0.14)\",\n },\n components: {\n Layout: {\n siderBg: n.bgLayout,\n headerBg: n.bgLayout,\n bodyBg: n.bgLayout,\n headerPadding: `0 ${HISD3_LAYOUT.pageGutter}px`,\n },\n Menu: {\n itemBg: \"transparent\",\n subMenuItemBg: \"transparent\",\n itemColor: n.text,\n itemHoverColor: n.text,\n itemHoverBg: \"rgba(0,0,0,0.04)\",\n itemSelectedBg: tint(p, 0.9),\n itemSelectedColor: p,\n itemActiveBg: tint(p, 0.86),\n subMenuItemSelectedColor: p,\n groupTitleColor: n.textTertiary,\n groupTitleFontSize: 12,\n itemBorderRadius: 0,\n itemMarginInline: 0,\n itemMarginBlock: 0,\n itemHeight: 40,\n itemPaddingInline: HISD3_LAYOUT.pageGutter,\n iconSize: 16,\n collapsedIconSize: 18,\n activeBarBorderWidth: 0,\n activeBarWidth: 0,\n },\n Button: {\n fontWeight: 600,\n primaryShadow: \"none\",\n defaultShadow: \"none\",\n dangerShadow: \"none\",\n defaultBorderColor: n.border,\n defaultColor: n.text,\n defaultBg: n.bgLayout,\n defaultHoverBg: n.white,\n defaultHoverBorderColor: n.borderStrong,\n defaultHoverColor: n.text,\n defaultActiveBorderColor: n.borderStrong,\n paddingInline: 16,\n contentFontSize: 14,\n contentFontSizeLG: 16,\n contentFontSizeSM: 13,\n },\n Input: {\n activeShadow: \"none\",\n colorBorder: n.border,\n hoverBorderColor: n.borderStrong,\n activeBorderColor: n.borderStrong,\n paddingInline: 16,\n },\n Select: { optionSelectedBg: tint(p, 0.9), colorBorder: n.border },\n Table: {\n headerBg: \"transparent\",\n headerColor: n.textTertiary,\n headerSplitColor: \"transparent\",\n headerBorderRadius: 0,\n borderColor: n.borderSecondary,\n rowHoverBg: \"rgba(0,0,0,0.03)\",\n cellPaddingBlock: 20,\n cellPaddingInline: 16,\n cellFontSize: 16,\n footerBg: \"transparent\",\n },\n Tabs: {\n inkBarColor: p,\n itemColor: n.text,\n itemSelectedColor: p,\n itemHoverColor: p,\n titleFontSize: 18,\n horizontalItemGutter: 48,\n horizontalMargin: \"0\",\n lineWidthBold: 4,\n },\n Tag: { borderRadiusSM: 0, defaultBg: \"transparent\" },\n Pagination: {\n itemBg: n.bgLayout,\n itemActiveBg: p,\n itemSize: 48,\n itemInputBg: n.bgLayout,\n },\n Dropdown: { paddingBlock: 10 },\n Breadcrumb: {\n itemColor: n.textTertiary,\n lastItemColor: n.text,\n linkColor: n.textTertiary,\n linkHoverColor: p,\n separatorColor: n.textTertiary,\n },\n Card: { headerFontSize: 20 },\n },\n };\n\n if (!overrides) return base;\n return {\n ...base,\n ...overrides,\n token: { ...base.token, ...overrides.token },\n components: { ...base.components, ...overrides.components },\n };\n};\n\n/** CSS emitted by HISD3Provider so styled components follow the border preset. */\nexport const borderVarsCss = (\n borders: HISD3Borders = \"hairline\",\n lineWidth?: number,\n): string => {\n const b = HISD3_BORDER_PRESETS[borders] ?? HISD3_BORDER_PRESETS.hairline;\n return `:root{--hisd3-rule-width:${lineWidth ?? b.width}px;--hisd3-control-bg:${HISD3_NEUTRALS.bgFilled};--hisd3-control-bg-hover:${HISD3_NEUTRALS.bgFilledHover};}`;\n};\n\n/** Default HISD3 theme — the red \"Backoffice\" look. */\nexport const hisd3AntdTheme: ThemeConfig = createHisd3Theme();\n\n/** @deprecated use HISD3_PRESETS / createHisd3Theme */\nexport const HISD3_COLORS = {\n primary: HISD3_PRESETS.red,\n primaryLight: tint(HISD3_PRESETS.red, 0.9),\n headerSelectedBg: \"rgba(0,0,0,0.04)\",\n} as const;\n","import { App as AntdApp, ConfigProvider, type ThemeConfig } from \"antd\";\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport { ThemeProvider } from \"styled-components\";\n\nimport {\n borderVarsCss,\n createHisd3Theme,\n type HISD3Preset,\n type HISD3ThemeOptions,\n} from \"../../theme/antd\";\nimport type { StyledTheme } from \"../../types/theme\";\n\nconst HISD3ProviderContext = createContext(false);\n\n/** True when rendered somewhere below an `HISD3Provider`. */\nexport const useInsideHISD3Provider = () => useContext(HISD3ProviderContext);\n\nexport interface HISD3ProviderProps extends HISD3ThemeOptions {\n /** Shorthand: preset name or hex. Same as `options.primary`. */\n primary?: HISD3Preset | string;\n /** Legacy styled-components theme object used by older HISD3 screens. */\n styledTheme?: StyledTheme;\n /** Fully custom antd theme — skips `createHisd3Theme` entirely. */\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\n/**\n * Root provider for HISD3 apps. Put it once at the top of the tree:\n *\n * ```tsx\n * <HISD3Provider primary=\"teal\">\n * <App />\n * </HISD3Provider>\n * ```\n *\n * It wires the antd `ConfigProvider` (with CSS variables enabled so every\n * kit component follows the chosen primary), antd `App` (for themed\n * `modal.confirm` / `message`), and the styled-components `ThemeProvider`.\n */\nexport const HISD3Provider: React.FC<HISD3ProviderProps> = ({\n primary,\n radius,\n borders = \"hairline\",\n lineWidth,\n overrides,\n theme,\n styledTheme = {},\n children,\n}) => {\n const antdTheme = useMemo(\n () =>\n theme ??\n createHisd3Theme({ primary, radius, borders, lineWidth, overrides }),\n [theme, primary, radius, borders, lineWidth, overrides],\n );\n\n const vars = useMemo(\n () => borderVarsCss(borders, lineWidth),\n [borders, lineWidth],\n );\n\n return (\n <HISD3ProviderContext.Provider value={true}>\n {/* CSS variables the styled components read (rule width, control fills) */}\n <style dangerouslySetInnerHTML={{ __html: vars }} />\n <ConfigProvider theme={antdTheme}>\n <ThemeProvider theme={styledTheme}>\n <AntdApp component={false}>{children}</AntdApp>\n </ThemeProvider>\n </ConfigProvider>\n </HISD3ProviderContext.Provider>\n );\n};\n\nexport default HISD3Provider;\n","import styled from \"styled-components\";\nimport { Layout } from \"antd\";\n\nimport { HISD3_LAYOUT } from \"../../theme/layout\";\n\nconst { Header, Content } = Layout;\n\nexport const SIDER_WIDTH = HISD3_LAYOUT.siderWidth;\nexport const SIDER_COLLAPSED_WIDTH = HISD3_LAYOUT.siderCollapsedWidth;\nexport const HEADER_HEIGHT = HISD3_LAYOUT.topBarHeight;\n\nexport const StyledRoot = styled(Layout)<{ $appShell?: boolean }>`\n background: var(--ant-color-bg-layout);\n\n /*\n * App-shell mode: the shell is exactly one viewport tall and never scrolls,\n * so the document has no scrollbar and cannot rubber-band. The content\n * column (StyledMain) is the scroller instead.\n */\n ${({ $appShell }) =>\n $appShell\n ? `height: 100vh; max-height: 100vh; overflow: hidden;`\n : `min-height: 100vh;`}\n\n /*\n * The Sider is rendered as a plain antd <Sider> (not styled(Sider)) because\n * styled-components would swallow its \\`theme\\` prop; style it from here.\n */\n > .ant-layout-sider.hisd3-sider {\n position: sticky;\n top: 0;\n height: ${({ $appShell }) => ($appShell ? \"100%\" : \"100vh\")};\n overflow: hidden;\n background: var(--ant-color-bg-layout);\n border-right: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .ant-layout-sider-children {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n }\n`;\n\n/** Content column. In app-shell mode this is the element that scrolls. */\nexport const StyledMain = styled(Layout)<{ $scroll?: boolean }>`\n background: transparent;\n min-width: 0;\n\n ${({ $scroll }) =>\n $scroll\n ? `\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n /* keep scroll chaining (and its bounce) out of the document */\n overscroll-behavior: contain;\n `\n : \"\"}\n`;\n\nexport const StyledSiderMenuWrap = styled.div`\n flex: 1 1 auto;\n overflow-y: auto;\n overflow-x: hidden;\n overscroll-behavior: contain;\n padding-top: 4px;\n\n .ant-menu-inline,\n .ant-menu-vertical {\n border-inline-end: none !important;\n background: transparent;\n }\n\n /* Section titles: \"RECEIVABLES AND COLLECTIONS\" */\n .ant-menu-item-group-title {\n padding: 16px ${HISD3_LAYOUT.pageGutter}px 4px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n }\n\n .ant-menu-item-group + .ant-menu-item-group > .ant-menu-item-group-title,\n .ant-menu-item-group + .ant-menu-item-group::before {\n border-top: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n margin-top: 10px;\n padding-top: 20px;\n }\n .ant-menu-item-group + .ant-menu-item-group::before {\n content: none;\n }\n\n .ant-menu-item,\n .ant-menu-submenu-title {\n font-size: 14px;\n font-weight: 500;\n position: relative;\n width: 100%;\n }\n\n .ant-menu-item .ant-menu-item-icon,\n .ant-menu-submenu-title .ant-menu-item-icon {\n font-size: 16px;\n }\n\n /* open parent (\"Billing\") in primary */\n .ant-menu-submenu-open > .ant-menu-submenu-title,\n .ant-menu-submenu-selected > .ant-menu-submenu-title {\n color: var(--ant-color-primary);\n font-weight: 700;\n }\n\n /* child items are indented by antd; keep them slightly smaller */\n .ant-menu-sub.ant-menu-inline > .ant-menu-item {\n font-size: 13.5px;\n }\n\n /* active item: tint + 4px accent bar */\n .ant-menu-item-selected {\n font-weight: 700;\n\n &::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: var(--ant-color-primary);\n }\n }\n\n &.hisd3-collapsed .ant-menu-item-group-title {\n display: none;\n }\n`;\n\nexport const StyledBrand = styled.a<{ $collapsed?: boolean }>`\n display: flex;\n align-items: center;\n gap: 10px;\n height: ${HEADER_HEIGHT}px;\n padding: 0 ${({ $collapsed }) => ($collapsed ? 12 : HISD3_LAYOUT.pageGutter)}px;\n justify-content: ${({ $collapsed }) => ($collapsed ? \"center\" : \"flex-start\")};\n color: inherit;\n text-decoration: none;\n overflow: hidden;\n white-space: nowrap;\n flex: 0 0 auto;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .hisd3-brand-mark {\n width: 28px;\n height: 28px;\n flex: 0 0 auto;\n background: var(--ant-color-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n img {\n height: 28px;\n width: 28px;\n object-fit: contain;\n flex: 0 0 auto;\n }\n\n h1 {\n margin: 0;\n font-family: var(--font-heading);\n font-size: 16px;\n font-weight: var(--font-weight-heading, 800);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--ant-color-text);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nexport const StyledHeader = styled(Header)`\n display: flex;\n align-items: center;\n gap: 24px;\n flex: 0 0 ${HEADER_HEIGHT}px;\n height: ${HEADER_HEIGHT}px;\n line-height: ${HEADER_HEIGHT}px;\n padding: 0 ${HISD3_LAYOUT.pageGutter}px;\n position: sticky;\n top: 0;\n z-index: 100;\n background: var(--ant-color-bg-layout);\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .ant-menu-horizontal {\n flex: 1 1 auto;\n min-width: 0;\n border-bottom: none;\n background: transparent;\n line-height: ${HEADER_HEIGHT - 2}px;\n font-size: 14px;\n font-weight: 500;\n }\n`;\n\nexport const StyledSiderHeader = styled(Header)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 0 0 ${HEADER_HEIGHT}px;\n height: ${HEADER_HEIGHT}px;\n line-height: ${HEADER_HEIGHT}px;\n padding: 0 ${HISD3_LAYOUT.pageGutter}px;\n position: sticky;\n top: 0;\n z-index: 99;\n background: var(--ant-color-bg-layout);\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n`;\n\nexport const StyledCollapseTrigger = styled.button`\n border: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n width: 32px;\n height: 32px;\n color: inherit;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n`;\n\nexport const StyledContent = styled(Content)`\n flex: 1 0 auto;\n padding: 24px ${HISD3_LAYOUT.pageGutter}px 40px;\n`;\n\n/* ---------- account card (sider footer / header) ---------- */\n\nexport const StyledCrUserInfo = styled.div<{\n $collapsed?: boolean;\n $inHeader?: boolean;\n}>`\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n line-height: 1.25;\n transition: all 0.2s ease;\n padding: ${({ $inHeader, $collapsed }) =>\n $inHeader ? \"0 4px\" : $collapsed ? \"12px 0\" : `12px ${HISD3_LAYOUT.pageGutter}px`};\n min-width: ${({ $inHeader }) => ($inHeader ? \"220px\" : \"0\")};\n border-top: ${({ $inHeader }) =>\n $inHeader ? \"none\" : \"var(--hisd3-rule-width, 1px) solid var(--ant-color-border)\"};\n\n & .ant-dropdown-link {\n color: inherit;\n }\n`;\n\nexport const StyledCrUserInfoInner = styled.a`\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: inherit;\n gap: 10px;\n`;\n\nexport const StyledCrUserInfoAvatar = styled.span<{ $src?: string }>`\n width: 34px;\n height: 34px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 700;\n color: var(--ant-color-text);\n background: ${({ $src }) =>\n $src ? `center / cover no-repeat url(\"${$src}\")` : \"#D9D6D2\"};\n`;\n\nexport const StyledCrUserInfoContent = styled.span`\n flex: 1 1 auto;\n min-width: 0;\n`;\n\nexport const StyledUsernameInfo = styled.span`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n`;\n\nexport const StyledUsername = styled.h3`\n margin: 0;\n font-family: var(--font-body);\n font-size: 14px;\n font-weight: 700;\n letter-spacing: 0;\n color: var(--ant-color-text);\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n`;\n\nexport const StyledUserArrow = styled.span`\n width: 20px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n color: var(--ant-color-text);\n\n & svg {\n display: block;\n }\n`;\n\nexport const StyledCrUserDesignation = styled.span`\n display: block;\n margin-top: 3px;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n","import type { MenuProps } from \"antd\";\nimport { createElement, type ReactNode } from \"react\";\n\nexport type AntdMenuItem = Required<MenuProps>[\"items\"][number];\n\n/**\n * Menu item shape accepted by HISD3Sidebar.\n *\n * This intentionally mirrors the `MenuDataItem` shape that the previous\n * ProLayout-based sidebar consumed (`path`, `name`, `icon`, `children`,\n * `hideInMenu`), so existing apps keep passing the same `menuItems`.\n */\nexport interface HISD3MenuItem {\n key?: string;\n path?: string;\n name?: ReactNode;\n icon?: ReactNode;\n children?: HISD3MenuItem[];\n hideInMenu?: boolean;\n disabled?: boolean;\n /** When true the item is rendered as a group title (like ProLayout's `flatMenu`). */\n group?: boolean;\n [key: string]: unknown;\n}\n\nexport const itemKey = (item: HISD3MenuItem, index: number): string =>\n item.key ?? item.path ?? `menu-${index}`;\n\n/** Convert HISD3MenuItem[] to antd `Menu` items, rendering leaf items as anchors. */\nexport const toAntdMenuItems = (\n items: HISD3MenuItem[] | undefined,\n renderLink: (item: HISD3MenuItem, label: ReactNode) => ReactNode,\n): AntdMenuItem[] =>\n (items ?? [])\n .filter((item) => item && !item.hideInMenu)\n .map((item, index): AntdMenuItem => {\n const key = itemKey(item, index);\n const hasChildren = Array.isArray(item.children) && item.children.length > 0;\n\n if (hasChildren) {\n return {\n key,\n icon: item.icon,\n label: item.name,\n disabled: item.disabled,\n type: item.group ? \"group\" : undefined,\n children: toAntdMenuItems(item.children, renderLink),\n } as AntdMenuItem;\n }\n\n return {\n key,\n icon: item.icon,\n disabled: item.disabled,\n label: renderLink(item, item.name),\n } as AntdMenuItem;\n });\n\n/**\n * Find the key of the item whose `path` best matches `pathname`\n * (longest prefix wins) together with the keys of all its ancestors,\n * so the correct submenu can be opened.\n */\nexport const findSelection = (\n items: HISD3MenuItem[] | undefined,\n pathname: string,\n): { selectedKey?: string; openKeys: string[] } => {\n let best: { key: string; parents: string[]; length: number } | undefined;\n\n const walk = (list: HISD3MenuItem[] | undefined, parents: string[]) => {\n (list ?? []).forEach((item, index) => {\n const key = itemKey(item, index);\n if (item.path && pathname.startsWith(item.path)) {\n const exact = pathname === item.path;\n const length = item.path.length + (exact ? 1 : 0);\n if (!best || length > best.length) {\n best = { key, parents, length };\n }\n }\n if (item.children?.length) {\n walk(item.children, [...parents, key]);\n }\n });\n };\n\n walk(items, []);\n return { selectedKey: best?.key, openKeys: best?.parents ?? [] };\n};\n\n/** Default anchor renderer used when no `renderMenuLink` is supplied. */\nexport const defaultRenderLink = (item: HISD3MenuItem, label: ReactNode) =>\n createElement(\"a\", { href: item.path || \"/\" }, label);\n","import {\n DownOutlined,\n ExclamationCircleOutlined,\n LogoutOutlined,\n SettingOutlined,\n} from \"@ant-design/icons\";\nimport { App, Dropdown, type MenuProps } from \"antd\";\nimport React from \"react\";\n\nimport type { IUserEmployee } from \"../../types/account\";\nimport {\n StyledCrUserDesignation,\n StyledCrUserInfo,\n StyledCrUserInfoAvatar,\n StyledCrUserInfoContent,\n StyledCrUserInfoInner,\n StyledUserArrow,\n StyledUsername,\n StyledUsernameInfo,\n} from \"./index.styled\";\n\nexport interface UserMenuProps {\n account: IUserEmployee;\n avatarSrc?: string;\n settingsUrl?: string;\n onLogout: () => Promise<void> | void;\n collapsed?: boolean;\n /** \"topRight\" for the sider footer, \"bottomRight\" for the top header. */\n placement?: \"topRight\" | \"bottomRight\";\n extraItems?: MenuProps[\"items\"];\n}\n\n/**\n * Account dropdown (Settings / Logout) shown in the sider footer or header.\n * Uses `App.useApp()` so the confirm modal picks up the surrounding\n * ConfigProvider theme — the static `Modal.confirm` cannot in antd v6.\n */\nexport const UserMenu: React.FC<UserMenuProps> = ({\n account,\n avatarSrc,\n settingsUrl,\n onLogout,\n collapsed = false,\n placement = \"topRight\",\n extraItems = [],\n}) => {\n const { modal } = App.useApp();\n\n const confirmLogout = () => {\n modal.confirm({\n title: \"Are you sure you want to logout?\",\n content: \"Please click OK to continue\",\n icon: <ExclamationCircleOutlined />,\n onOk: onLogout,\n });\n };\n\n const items: MenuProps[\"items\"] = [\n ...(extraItems ?? []),\n {\n key: \"settings\",\n icon: <SettingOutlined />,\n label: \"Settings\",\n onClick: () => {\n window.location.href = settingsUrl ?? \"/settings\";\n },\n },\n {\n key: \"logout\",\n icon: <LogoutOutlined />,\n label: \"Logout\",\n onClick: confirmLogout,\n },\n ];\n\n const initials =\n (account.fullName || \"\")\n .replace(/\\(.*?\\)/g, \" \")\n .split(/[\\s,]+/)\n .map((w) => w.replace(/[^\\p{L}\\p{N}]/gu, \"\"))\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0].toUpperCase())\n .join(\"\") || \"?\";\n\n return (\n <StyledCrUserInfo\n className=\"cr-user-info-light\"\n $collapsed={collapsed}\n $inHeader={placement === \"bottomRight\"}\n >\n <Dropdown trigger={[\"click\"]} placement={placement} menu={{ items }}>\n <StyledCrUserInfoInner\n className=\"ant-dropdown-link\"\n onClick={(e) => e.preventDefault()}\n >\n <StyledCrUserInfoAvatar $src={avatarSrc} aria-hidden>\n {!avatarSrc && initials}\n </StyledCrUserInfoAvatar>\n {!collapsed && (\n <StyledCrUserInfoContent>\n <StyledUsernameInfo>\n <StyledUsername title={account.fullName}>\n {account.fullName}\n </StyledUsername>\n <StyledUserArrow>\n <DownOutlined />\n </StyledUserArrow>\n </StyledUsernameInfo>\n {account.positionType && (\n <StyledCrUserDesignation title={account.positionType}>\n {account.positionType}\n </StyledCrUserDesignation>\n )}\n </StyledCrUserInfoContent>\n )}\n </StyledCrUserInfoInner>\n </Dropdown>\n </StyledCrUserInfo>\n );\n};\n\nexport default UserMenu;\n","import { MenuFoldOutlined, MenuUnfoldOutlined } from \"@ant-design/icons\";\nimport {\n App as AntdApp,\n ConfigProvider,\n Layout,\n Menu,\n Spin,\n type MenuProps,\n type ThemeConfig,\n} from \"antd\";\nimport React, { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { ThemeProvider } from \"styled-components\";\n\nimport { hisd3AntdTheme } from \"../../theme/antd\";\nimport { useInsideHISD3Provider } from \"../Provider\";\nimport type { IUserEmployee } from \"../../types/account\";\nimport type { StyledTheme } from \"../../types/theme\";\nimport {\n SIDER_COLLAPSED_WIDTH,\n SIDER_WIDTH,\n StyledBrand,\n StyledCollapseTrigger,\n StyledContent,\n StyledHeader,\n StyledRoot,\n StyledMain,\n StyledSiderHeader,\n StyledSiderMenuWrap,\n} from \"./index.styled\";\nimport {\n defaultRenderLink,\n findSelection,\n toAntdMenuItems,\n type HISD3MenuItem,\n} from \"./menu\";\nimport { UserMenu } from \"./UserMenu\";\n\nconst { Sider } = Layout;\n\nexport interface HISD3SidebarProps {\n account: IUserEmployee;\n /** Logo image URL. When omitted a square block in the primary color is shown. */\n logoUrl?: string;\n appName: string;\n /** Same shape as before (ProLayout `MenuDataItem`): `{ path, name, icon, children }`. */\n menuItems: HISD3MenuItem[];\n onLogout: () => Promise<void> | void;\n /** Current location pathname, used to highlight the active menu item. */\n pathname: string;\n /** styled-components theme; optional when inside HISD3Provider. */\n styledTheme?: StyledTheme;\n collapsed?: boolean;\n /** Called when the user toggles the sider (controlled usage). */\n onCollapse?: (collapsed: boolean) => void;\n loading?: boolean;\n hideSidebar?: boolean;\n /** Render the navigation as a top header bar instead of a left sider. */\n layoutTop?: boolean;\n avatarSrc?: string;\n settingsUrl?: string;\n /**\n * Ant Design theme applied via a nested `ConfigProvider`.\n * Defaults to `hisd3AntdTheme` (red) when used standalone. Inside an\n * `HISD3Provider` nothing is applied so the provider's primary is inherited.\n * Pass `null` to force inheritance, or a ThemeConfig to override.\n */\n antdTheme?: ThemeConfig | null;\n /**\n * Custom link renderer, e.g. to use react-router's `<Link>`:\n * `(item, label) => <Link to={item.path!}>{label}</Link>`\n */\n renderMenuLink?: (item: HISD3MenuItem, label: ReactNode) => ReactNode;\n /** Extra content rendered in the header, right side (top layout) or sider header (side layout). */\n headerExtra?: ReactNode;\n /** Extra items prepended to the account dropdown. */\n userMenuItems?: MenuProps[\"items\"];\n /** Hide the collapse trigger button. */\n hideCollapseTrigger?: boolean;\n /** Width in px of the expanded sider. Default 220. */\n siderWidth?: number;\n /** Disable the built-in content padding wrapper and render children directly. */\n bareContent?: boolean;\n /**\n * Hide the sider layout's own top bar (collapse trigger + headerExtra).\n * Use together with `HISD3PageHeader`, which renders its own top bar.\n */\n hideHeaderBar?: boolean;\n /** Where the brand block links to. Default \"/\". */\n brandHref?: string;\n /**\n * App-shell scrolling (default). The shell fills exactly one viewport and\n * the content column scrolls inside it, so the page header stays pinned and\n * the document cannot rubber-band (\"bounce\") at the top or bottom.\n * Set to `false` to scroll the window instead, as in 4.1 and earlier.\n */\n scrollContent?: boolean;\n /**\n * Hide the account card in the sider footer / top nav — use when the account\n * lives in the header instead (`HISD3AvatarMenu`).\n */\n hideAccountCard?: boolean;\n children: React.ReactNode;\n}\n\nexport const HISD3Sidebar: React.FC<HISD3SidebarProps> = ({\n children,\n account,\n logoUrl,\n appName,\n menuItems,\n onLogout,\n pathname,\n avatarSrc,\n styledTheme,\n settingsUrl,\n antdTheme,\n renderMenuLink = defaultRenderLink,\n headerExtra,\n userMenuItems,\n onCollapse,\n collapsed = false,\n loading = false,\n hideSidebar = false,\n layoutTop = false,\n hideCollapseTrigger = false,\n siderWidth = SIDER_WIDTH,\n bareContent = false,\n hideHeaderBar = false,\n brandHref = \"/\",\n hideAccountCard = false,\n scrollContent = true,\n}) => {\n const insideProvider = useInsideHISD3Provider();\n const resolvedTheme =\n antdTheme === undefined ? (insideProvider ? null : hisd3AntdTheme) : antdTheme;\n const [isCollapsed, setIsCollapsed] = useState(collapsed);\n\n useEffect(() => {\n setIsCollapsed(collapsed);\n }, [collapsed]);\n\n const items = useMemo(\n () => toAntdMenuItems(menuItems, renderMenuLink),\n [menuItems, renderMenuLink],\n );\n\n const selection = useMemo(\n () => findSelection(menuItems, pathname),\n [menuItems, pathname],\n );\n\n // Start with the active route's submenu open so there is no flash on first paint.\n const [openKeys, setOpenKeys] = useState<string[]>(() => selection.openKeys);\n\n // Open the submenu that contains the active route whenever the route changes.\n useEffect(() => {\n setOpenKeys((prev) =>\n Array.from(new Set([...prev, ...selection.openKeys])),\n );\n }, [selection.openKeys.join(\"|\")]);\n\n const toggleCollapse = (next: boolean) => {\n setIsCollapsed(next);\n onCollapse?.(next);\n };\n\n const selectedKeys = selection.selectedKey ? [selection.selectedKey] : [];\n\n const brand = (\n <StyledBrand href={brandHref} $collapsed={!layoutTop && isCollapsed}>\n {logoUrl ? (\n <img src={logoUrl} alt={appName} />\n ) : (\n <span className=\"hisd3-brand-mark\" aria-hidden />\n )}\n {(layoutTop || !isCollapsed) && <h1>{appName}</h1>}\n </StyledBrand>\n );\n\n const content = bareContent ? (\n children\n ) : (\n <StyledContent>{children}</StyledContent>\n );\n\n const renderBody = () => {\n if (hideSidebar) {\n return <>{children}</>;\n }\n\n if (layoutTop) {\n return (\n <StyledRoot $appShell={scrollContent}>\n <StyledHeader>\n {brand}\n <Menu\n mode=\"horizontal\"\n items={items}\n selectedKeys={selectedKeys}\n />\n {headerExtra}\n {!hideAccountCard && (\n <UserMenu\n account={account}\n avatarSrc={avatarSrc}\n settingsUrl={settingsUrl}\n onLogout={onLogout}\n placement=\"bottomRight\"\n extraItems={userMenuItems}\n />\n )}\n </StyledHeader>\n <StyledMain $scroll={scrollContent}>{content}</StyledMain>\n </StyledRoot>\n );\n }\n\n return (\n <StyledRoot hasSider $appShell={scrollContent}>\n <Sider\n className=\"hisd3-sider\"\n width={siderWidth}\n collapsedWidth={SIDER_COLLAPSED_WIDTH}\n collapsible\n collapsed={isCollapsed}\n trigger={null}\n theme=\"light\"\n breakpoint=\"lg\"\n onBreakpoint={(broken) => {\n if (broken) toggleCollapse(true);\n }}\n >\n {brand}\n <StyledSiderMenuWrap className={isCollapsed ? \"hisd3-collapsed\" : undefined}>\n <Menu\n mode=\"inline\"\n theme=\"light\"\n inlineCollapsed={isCollapsed}\n items={items}\n selectedKeys={selectedKeys}\n openKeys={isCollapsed ? undefined : openKeys}\n onOpenChange={(keys) => setOpenKeys(keys as string[])}\n />\n </StyledSiderMenuWrap>\n {!hideAccountCard && (\n <UserMenu\n account={account}\n avatarSrc={avatarSrc}\n settingsUrl={settingsUrl}\n onLogout={onLogout}\n collapsed={isCollapsed}\n placement=\"topRight\"\n extraItems={userMenuItems}\n />\n )}\n </Sider>\n\n <StyledMain $scroll={scrollContent}>\n {!hideHeaderBar && (\n <StyledSiderHeader>\n {!hideCollapseTrigger && (\n <StyledCollapseTrigger\n type=\"button\"\n aria-label={isCollapsed ? \"Expand menu\" : \"Collapse menu\"}\n onClick={() => toggleCollapse(!isCollapsed)}\n >\n {isCollapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n </StyledCollapseTrigger>\n )}\n <span style={{ flex: 1 }} />\n {headerExtra}\n </StyledSiderHeader>\n )}\n {content}\n </StyledMain>\n </StyledRoot>\n );\n };\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n const body = (\n <AntdApp component={false}>\n <Spin spinning={loading} size=\"large\">\n {renderBody()}\n </Spin>\n </AntdApp>\n );\n\n if (insideProvider && !styledTheme) {\n return resolvedTheme ? (\n <ConfigProvider theme={resolvedTheme}>{body}</ConfigProvider>\n ) : (\n body\n );\n }\n\n return (\n <ThemeProvider theme={styledTheme ?? {}}>\n {resolvedTheme ? (\n <ConfigProvider theme={resolvedTheme}>{body}</ConfigProvider>\n ) : (\n body\n )}\n </ThemeProvider>\n );\n};\n\nexport default HISD3Sidebar;\n","import { Breadcrumb } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport { HISD3_LAYOUT } from \"../../theme/layout\";\n\nexport interface HISD3BreadcrumbItem {\n title: React.ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface HISD3PageHeaderProps {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n breadcrumb?: HISD3BreadcrumbItem[];\n /** Action buttons rendered on the right of the top bar. */\n extra?: React.ReactNode;\n /** Content rendered to the left of the breadcrumb (e.g. the sidebar collapse trigger). */\n leading?: React.ReactNode;\n /** Hide the top bar entirely and render only the title block. */\n hideTopBar?: boolean;\n className?: string;\n}\n\nexport const PAGE_GUTTER = HISD3_LAYOUT.pageGutter;\n\n/*\n * `display: contents` so TopBar and TitleBlock become direct children of the\n * scrolling column — a sticky child cannot outlive its own wrapper's box, so\n * without this the bar scrolls away with the header element.\n */\nconst HeaderWrap = styled.header`\n display: contents;\n`;\n\nconst TopBar = styled.div`\n display: flex;\n align-items: center;\n gap: 16px;\n height: ${HISD3_LAYOUT.topBarHeight}px; /* same as the sidebar brand block */\n /* never shrink: these are flex items of the scrolling column */\n flex: 0 0 ${HISD3_LAYOUT.topBarHeight}px;\n padding: 0 ${PAGE_GUTTER}px;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: var(--ant-color-bg-layout);\n position: sticky;\n top: 0;\n z-index: 20;\n\n .ant-breadcrumb {\n font-size: 14px;\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .ant-breadcrumb ol {\n flex-wrap: nowrap;\n }\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 0 0 auto;\n`;\n\nconst TitleBlock = styled.div`\n display: flex;\n align-items: baseline;\n gap: 16px;\n flex-wrap: wrap;\n flex: 0 0 auto;\n padding: 20px ${PAGE_GUTTER}px 18px;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n\n h1 {\n margin: 0;\n font-family: var(--font-heading);\n font-size: 32px;\n line-height: 1.1;\n font-weight: var(--font-weight-heading, 800);\n letter-spacing: -0.02em;\n color: var(--ant-color-text);\n }\n\n p {\n margin: 0;\n font-size: 15px;\n color: var(--ant-color-text-secondary);\n }\n`;\n\n/** Padded body area that lines up with the header gutters. */\nexport const HISD3PageBody = styled.div`\n flex: 1 0 auto;\n padding: 24px ${PAGE_GUTTER}px 40px;\n`;\n\n/**\n * Sticky top bar (breadcrumb + actions) followed by a big page title block.\n * Designed to sit directly inside `HISD3Sidebar` with `bareContent` and\n * `hideHeaderBar`.\n */\nexport const HISD3PageHeader: React.FC<HISD3PageHeaderProps> = ({\n title,\n subtitle,\n breadcrumb,\n extra,\n leading,\n hideTopBar = false,\n className,\n}) => (\n <HeaderWrap className={className}>\n {!hideTopBar && (\n <TopBar>\n {leading}\n {breadcrumb && breadcrumb.length > 0 && (\n <Breadcrumb\n items={breadcrumb.map((b) => ({\n title: b.href ? <a href={b.href}>{b.title}</a> : b.title,\n onClick: b.onClick,\n }))}\n />\n )}\n {!breadcrumb?.length && <span style={{ flex: 1 }} />}\n {extra && <Actions>{extra}</Actions>}\n </TopBar>\n )}\n <TitleBlock>\n <h1>{title}</h1>\n {subtitle && <p>{subtitle}</p>}\n </TitleBlock>\n </HeaderWrap>\n);\n\nexport default HISD3PageHeader;\n","import { BellOutlined } from \"@ant-design/icons\";\nimport { Badge, Dropdown, Empty, Spin } from \"antd\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface HISD3Notification {\n id: string;\n title: React.ReactNode;\n /** Secondary line, e.g. \"Folio 19370 was posted\". */\n description?: React.ReactNode;\n /** Right-aligned relative time, e.g. \"2h\". */\n time?: React.ReactNode;\n /** Unread items get a tinted row and a dot. */\n unread?: boolean;\n /** Leading avatar image; falls back to `icon`. */\n avatarSrc?: string;\n icon?: React.ReactNode;\n onClick?: (notification: HISD3Notification) => void;\n}\n\nexport interface HISD3NotificationButtonProps {\n items?: HISD3Notification[];\n /** Diameter of the circular button in px. Default 40. */\n size?: number;\n /** Badge count. Defaults to the number of unread items. */\n count?: number;\n loading?: boolean;\n title?: React.ReactNode;\n /** Shown as a link in the panel header when there are unread items. */\n onMarkAllRead?: () => void;\n /** Renders a footer row, e.g. \"See all notifications\". */\n onSeeAll?: () => void;\n seeAllLabel?: React.ReactNode;\n emptyText?: React.ReactNode;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nexport const HeaderIconButton = styled.button<{ $size?: number }>`\n position: relative;\n width: ${({ $size = 40 }) => $size}px;\n height: ${({ $size = 40 }) => $size}px;\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-size: ${({ $size = 40 }) => Math.round($size * 0.45)}px;\n line-height: 1;\n color: var(--ant-color-text);\n background: var(--hisd3-control-bg, #e6e4e1);\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n\n &:hover {\n background: var(--hisd3-control-bg-hover, #dbd8d4);\n }\n\n /* open state: tinted with the app's primary, like Facebook's blue */\n &[aria-expanded=\"true\"] {\n background: var(--ant-color-primary-bg);\n color: var(--ant-color-primary);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ant-color-primary);\n outline-offset: 2px;\n }\n\n .ant-badge {\n color: inherit;\n line-height: 0;\n }\n`;\n\nconst Panel = styled.div`\n width: 360px;\n max-width: calc(100vw - 32px);\n overflow: hidden;\n background: var(--ant-color-bg-elevated);\n border: 1px solid var(--ant-color-border-secondary);\n border-radius: var(--hisd3-popup-radius, 10px);\n box-shadow: 0 2px 6px rgba(16, 15, 14, 0.06),\n 0 12px 32px rgba(16, 15, 14, 0.14);\n`;\n\nconst PanelHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--ant-color-border-secondary);\n\n h4 {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n letter-spacing: 0;\n }\n\n button {\n border: 0;\n background: none;\n padding: 0;\n font: inherit;\n font-size: 13px;\n color: var(--ant-color-primary);\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\nconst List = styled.div`\n max-height: 380px;\n overflow-y: auto;\n`;\n\nconst Row = styled.button<{ $unread?: boolean }>`\n display: flex;\n align-items: flex-start;\n gap: 12px;\n width: 100%;\n padding: 12px 16px;\n text-align: left;\n font: inherit;\n border: 0;\n cursor: pointer;\n background: ${({ $unread }) =>\n $unread ? \"var(--ant-color-primary-bg)\" : \"transparent\"};\n\n &:hover {\n background: ${({ $unread }) =>\n $unread ? \"var(--ant-color-primary-bg-hover)\" : \"rgba(0,0,0,0.04)\"};\n }\n`;\n\nconst RowIcon = styled.span<{ $src?: string }>`\n width: 36px;\n height: 36px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--ant-color-text);\n border-radius: 50%;\n background: ${({ $src }) =>\n $src ? `center / cover no-repeat url(\"${$src}\")` : \"rgba(0,0,0,0.06)\"};\n`;\n\nconst RowBody = styled.span`\n flex: 1 1 auto;\n min-width: 0;\n\n strong {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--ant-color-text);\n }\n\n span {\n display: block;\n font-size: 13px;\n color: var(--ant-color-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n time {\n display: block;\n margin-top: 2px;\n font-size: 12px;\n color: var(--ant-color-text-tertiary);\n }\n`;\n\nconst UnreadDot = styled.span`\n width: 8px;\n height: 8px;\n margin-top: 6px;\n flex: 0 0 auto;\n border-radius: 50%;\n background: var(--ant-color-primary);\n`;\n\nconst PanelFooter = styled.button`\n display: block;\n width: 100%;\n padding: 12px 16px;\n font: inherit;\n font-size: 13px;\n font-weight: 600;\n color: var(--ant-color-primary);\n text-align: center;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--ant-color-border-secondary);\n cursor: pointer;\n\n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n`;\n\nconst EmptyWrap = styled.div`\n padding: 28px 16px;\n`;\n\n/** Bell button with an unread badge and a Facebook-style notifications panel. */\nexport const HISD3NotificationButton: React.FC<HISD3NotificationButtonProps> = ({\n items = [],\n count,\n loading = false,\n title = \"Notifications\",\n onMarkAllRead,\n onSeeAll,\n seeAllLabel = \"See all notifications\",\n emptyText = \"You're all caught up\",\n onOpenChange,\n size = 40,\n className,\n}) => {\n const [open, setOpen] = useState(false);\n const unread = count ?? items.filter((i) => i.unread).length;\n\n const panel = (\n <Panel>\n <PanelHeader>\n <h4>{title}</h4>\n {onMarkAllRead && unread > 0 && (\n <button type=\"button\" onClick={onMarkAllRead}>\n Mark all as read\n </button>\n )}\n </PanelHeader>\n\n {loading ? (\n <EmptyWrap style={{ textAlign: \"center\" }}>\n <Spin />\n </EmptyWrap>\n ) : items.length === 0 ? (\n <EmptyWrap>\n <Empty\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n description={emptyText}\n />\n </EmptyWrap>\n ) : (\n <List>\n {items.map((item) => (\n <Row\n key={item.id}\n type=\"button\"\n $unread={item.unread}\n onClick={() => {\n item.onClick?.(item);\n setOpen(false);\n onOpenChange?.(false);\n }}\n >\n <RowIcon $src={item.avatarSrc}>\n {!item.avatarSrc && (item.icon ?? <BellOutlined />)}\n </RowIcon>\n <RowBody>\n <strong>{item.title}</strong>\n {item.description && <span>{item.description}</span>}\n {item.time && <time>{item.time}</time>}\n </RowBody>\n {item.unread && <UnreadDot />}\n </Row>\n ))}\n </List>\n )}\n\n {onSeeAll && (\n <PanelFooter\n type=\"button\"\n onClick={() => {\n onSeeAll();\n setOpen(false);\n onOpenChange?.(false);\n }}\n >\n {seeAllLabel}\n </PanelFooter>\n )}\n </Panel>\n );\n\n return (\n <Dropdown\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n onOpenChange?.(next);\n }}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n popupRender={() => panel}\n >\n <HeaderIconButton\n type=\"button\"\n $size={size}\n className={className}\n aria-label={`${title}${unread ? ` (${unread} unread)` : \"\"}`}\n >\n <Badge count={unread} size=\"small\" offset={[2, -2]}>\n <BellOutlined />\n </Badge>\n </HeaderIconButton>\n </Dropdown>\n );\n};\n\nexport default HISD3NotificationButton;\n","import {\n DownOutlined,\n ExclamationCircleOutlined,\n LogoutOutlined,\n SettingOutlined,\n} from \"@ant-design/icons\";\nimport { App, Dropdown, type MenuProps } from \"antd\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport type { IUserEmployee } from \"../../types/account\";\n\nexport interface HISD3AvatarMenuProps {\n account: IUserEmployee;\n avatarSrc?: string;\n /** Settings entry target. Pass `null` to hide the Settings entry. */\n settingsUrl?: string | null;\n onSettings?: () => void;\n onLogout: () => Promise<void> | void;\n /** Ask for confirmation before logging out. Default true. */\n confirmLogout?: boolean;\n /** Extra entries above Settings / Logout. */\n extraItems?: MenuProps[\"items\"];\n /** Circle (Facebook-style) or square to match the rest of the design. */\n shape?: \"circle\" | \"square\";\n /** Diameter in px. Default 40. */\n size?: number;\n /** Hide the small chevron badge on the avatar. */\n hideChevron?: boolean;\n className?: string;\n}\n\nconst Trigger = styled.button<{ $shape: \"circle\" | \"square\"; $size: number }>`\n position: relative;\n width: ${({ $size }) => $size}px;\n height: ${({ $size }) => $size}px;\n flex: 0 0 auto;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: ${({ $size }) => Math.round($size * 0.36)}px;\n font-weight: 700;\n color: var(--ant-color-text);\n background: var(--hisd3-control-bg, #e6e4e1);\n border: 0;\n border-radius: ${({ $shape }) => ($shape === \"circle\" ? \"50%\" : \"0\")};\n cursor: pointer;\n transition: filter 0.15s ease;\n\n &:hover {\n filter: brightness(0.94);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ant-color-primary);\n outline-offset: 2px;\n }\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n border-radius: inherit;\n }\n`;\n\n/** Small chevron badge pinned to the bottom-right of the avatar. */\nconst Chevron = styled.span<{ $size: number }>`\n position: absolute;\n right: ${({ $size }) => -Math.round($size * 0.05)}px;\n bottom: ${({ $size }) => -Math.round($size * 0.05)}px;\n width: ${({ $size }) => Math.round($size * 0.45)}px;\n height: ${({ $size }) => Math.round($size * 0.45)}px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: ${({ $size }) => Math.round($size * 0.2)}px;\n color: var(--ant-color-text);\n background: var(--hisd3-control-bg, #e6e4e1);\n border: 2px solid var(--ant-color-bg-layout, #f3f2f0);\n border-radius: 50%;\n pointer-events: none;\n\n ${Trigger}[aria-expanded=\"true\"] & {\n background: var(--ant-color-primary);\n color: #fff;\n }\n\n & svg {\n display: block;\n }\n`;\n\nconst Identity = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n min-width: 230px;\n border-bottom: 1px solid var(--ant-color-border-secondary);\n\n .hisd3-identity-text {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .hisd3-identity-name {\n display: block;\n font-size: 14px;\n font-weight: 700;\n color: var(--ant-color-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .hisd3-identity-role {\n display: block;\n margin-top: 2px;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nconst IdentityAvatar = styled.span<{ $src?: string }>`\n width: 40px;\n height: 40px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 700;\n border-radius: 50%;\n background: ${({ $src }) =>\n $src ? `center / cover no-repeat url(\"${$src}\")` : \"rgba(0,0,0,0.08)\"};\n`;\n\nconst Panel = styled.div`\n overflow: hidden;\n background: var(--ant-color-bg-elevated);\n border: 1px solid var(--ant-color-border-secondary);\n border-radius: var(--hisd3-popup-radius, 10px);\n box-shadow: 0 2px 6px rgba(16, 15, 14, 0.06),\n 0 12px 32px rgba(16, 15, 14, 0.14);\n\n .ant-menu {\n border-inline-end: none !important;\n background: transparent;\n }\n\n .ant-menu {\n padding: 6px;\n }\n\n .ant-menu-item {\n margin: 0;\n width: 100%;\n border-radius: 8px;\n font-size: 14px;\n }\n`;\n\nexport const getInitials = (fullName?: string): string =>\n (fullName || \"\")\n .replace(/\\(.*?\\)/g, \" \")\n .split(/[\\s,]+/)\n .map((w) => w.replace(/[^\\p{L}\\p{N}]/gu, \"\"))\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0].toUpperCase())\n .join(\"\") || \"?\";\n\n/**\n * Circular avatar button for the top-right of the header. Clicking it opens a\n * menu showing who is signed in, plus Settings and Logout (with a confirm\n * dialog by default).\n */\nexport const HISD3AvatarMenu: React.FC<HISD3AvatarMenuProps> = ({\n account,\n avatarSrc,\n settingsUrl = \"/settings\",\n onSettings,\n onLogout,\n confirmLogout = true,\n extraItems,\n shape = \"circle\",\n size = 40,\n hideChevron = false,\n className,\n}) => {\n const { modal } = App.useApp();\n const [open, setOpen] = useState(false);\n\n const handleLogout = () => {\n if (!confirmLogout) {\n void onLogout();\n return;\n }\n modal.confirm({\n title: \"Are you sure you want to logout?\",\n content: \"Please click OK to continue\",\n icon: <ExclamationCircleOutlined />,\n okText: \"Logout\",\n onOk: onLogout,\n });\n };\n\n const items: MenuProps[\"items\"] = [\n ...(extraItems ?? []),\n ...(settingsUrl !== null || onSettings\n ? [\n {\n key: \"settings\",\n icon: <SettingOutlined />,\n label: \"Settings\",\n onClick: () => {\n if (onSettings) onSettings();\n else if (settingsUrl) window.location.href = settingsUrl;\n },\n },\n ]\n : []),\n {\n key: \"logout\",\n icon: <LogoutOutlined />,\n label: \"Logout\",\n onClick: handleLogout,\n },\n ];\n\n return (\n <Dropdown\n open={open}\n onOpenChange={setOpen}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n menu={{ items, onClick: () => setOpen(false) }}\n popupRender={(menu) => (\n <Panel>\n <Identity>\n <IdentityAvatar $src={avatarSrc}>\n {!avatarSrc && getInitials(account.fullName)}\n </IdentityAvatar>\n <span className=\"hisd3-identity-text\">\n <span className=\"hisd3-identity-name\">{account.fullName}</span>\n {account.positionType && (\n <span className=\"hisd3-identity-role\">\n {account.positionType}\n </span>\n )}\n </span>\n </Identity>\n {menu}\n </Panel>\n )}\n >\n <Trigger\n type=\"button\"\n className={className}\n $shape={shape}\n $size={size}\n aria-label={`Account menu for ${account.fullName}`}\n >\n {avatarSrc ? (\n <img src={avatarSrc} alt=\"\" />\n ) : (\n getInitials(account.fullName)\n )}\n {!hideChevron && (\n <Chevron $size={size} aria-hidden>\n <DownOutlined />\n </Chevron>\n )}\n </Trigger>\n </Dropdown>\n );\n};\n\nexport default HISD3AvatarMenu;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport { HISD3NotificationButton, HeaderIconButton } from \"./NotificationButton\";\nexport type {\n HISD3NotificationButtonProps,\n HISD3Notification,\n} from \"./NotificationButton\";\nexport { HISD3AvatarMenu, getInitials } from \"./AvatarMenu\";\nexport type { HISD3AvatarMenuProps } from \"./AvatarMenu\";\n\nconst Wrap = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 0 0 auto;\n`;\n\nconst Divider = styled.span`\n width: 2px;\n height: 24px;\n background: var(--ant-color-border-secondary);\n flex: 0 0 auto;\n`;\n\nexport interface HISD3HeaderActionsProps {\n children: React.ReactNode;\n /** Insert a vertical rule before the last child (e.g. before the avatar). */\n divided?: boolean;\n className?: string;\n}\n\n/** Spacing wrapper for the top-right header controls. */\nexport const HISD3HeaderActions: React.FC<HISD3HeaderActionsProps> = ({\n children,\n divided = false,\n className,\n}) => {\n const kids = React.Children.toArray(children).filter(Boolean);\n return (\n <Wrap className={className}>\n {kids.map((child, i) => (\n <React.Fragment key={i}>\n {divided && i === kids.length - 1 && i > 0 && <Divider />}\n {child}\n </React.Fragment>\n ))}\n </Wrap>\n );\n};\n\nexport default HISD3HeaderActions;\n","import { LeftOutlined, RightOutlined } from \"@ant-design/icons\";\nimport { Pagination, Table, type TableProps } from \"antd\";\nimport type { AnyObject } from \"antd/es/_util/type\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface HISD3TablePagination {\n current: number;\n pageSize: number;\n total: number;\n onChange: (page: number, pageSize: number) => void;\n /** Page-size toggle buttons on the right. Default [10, 20, 50]. */\n pageSizeOptions?: number[];\n /** Custom total text. Default \"Total 7,223 items\". */\n renderTotal?: (total: number, range: [number, number]) => React.ReactNode;\n /** Hide the page-size buttons. */\n hidePageSize?: boolean;\n}\n\nexport interface HISD3TableProps<T extends AnyObject>\n extends Omit<TableProps<T>, \"pagination\" | \"footer\"> {\n /** HISD3 pagination bar (total · pages · page-size). Omit for no pagination. */\n pagination?: HISD3TablePagination | false;\n /** Optional summary strip rendered between the rows and the pagination bar. */\n footer?: React.ReactNode;\n}\n\nconst Wrap = styled.div`\n .ant-table-wrapper .ant-table {\n background: transparent;\n }\n\n .ant-table-wrapper .ant-table-thead > tr > th {\n font-size: 13px;\n font-weight: 700;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n padding-block: 14px;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: transparent;\n }\n\n .ant-table-wrapper .ant-table-tbody > tr > td {\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n font-size: 16px;\n }\n\n .ant-table-wrapper .ant-table-tbody > tr:last-child > td {\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n }\n\n .ant-table-wrapper .ant-table-thead > tr > th:first-child,\n .ant-table-wrapper .ant-table-tbody > tr > td:first-child {\n padding-left: 0;\n }\n\n .ant-table-wrapper .ant-table-thead > tr > th:last-child,\n .ant-table-wrapper .ant-table-tbody > tr > td:last-child {\n padding-right: 0;\n }\n\n .ant-table-wrapper .ant-table-cell-row-hover {\n background: rgba(0, 0, 0, 0.025) !important;\n }\n\n /* Highlighted / linked cell text, e.g. bill numbers */\n .hisd3-cell-primary {\n color: var(--ant-color-primary);\n font-weight: 700;\n }\n .hisd3-cell-link {\n color: var(--ant-color-primary);\n }\n .hisd3-cell-muted {\n color: var(--ant-color-text-tertiary);\n }\n`;\n\nconst FooterStrip = styled.div`\n padding: 22px 0 14px;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n`;\n\nconst PagerBar = styled.div`\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 0 8px;\n\n .hisd3-total {\n flex: 1 1 auto;\n font-size: 16px;\n color: var(--ant-color-text-secondary);\n }\n\n .ant-pagination {\n display: inline-flex;\n border: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .ant-pagination-item,\n .ant-pagination-prev,\n .ant-pagination-next,\n .ant-pagination-jump-prev,\n .ant-pagination-jump-next {\n margin: 0;\n min-width: 56px;\n height: 56px;\n line-height: 56px;\n border: 0;\n border-right: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n border-radius: 0;\n font-weight: 700;\n font-size: 16px;\n background: transparent;\n\n &:last-child {\n border-right: 0;\n }\n\n a {\n color: var(--ant-color-text);\n }\n }\n\n .ant-pagination-item-active {\n background: var(--ant-color-primary);\n a {\n color: #fff;\n }\n }\n\n .ant-pagination-prev .ant-pagination-item-link,\n .ant-pagination-next .ant-pagination-item-link {\n color: var(--ant-color-text);\n font-size: 14px;\n }\n\n .ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,\n .ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis {\n color: var(--ant-color-text);\n font-weight: 700;\n }\n }\n`;\n\nconst SizeGroup = styled.div`\n display: inline-flex;\n border: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n button {\n height: 56px;\n padding: 0 22px;\n border: 0;\n border-right: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: transparent;\n font: inherit;\n font-size: 16px;\n color: var(--ant-color-text);\n cursor: pointer;\n\n &:last-child {\n border-right: 0;\n }\n\n &[aria-pressed=\"true\"] {\n background: var(--ant-color-primary);\n color: #fff;\n }\n }\n`;\n\nconst defaultTotal = (total: number) =>\n `Total ${total.toLocaleString()} items`;\n\nexport function HISD3Table<T extends AnyObject>({\n pagination,\n footer,\n ...tableProps\n}: HISD3TableProps<T>) {\n const p = pagination || undefined;\n const sizes = p?.pageSizeOptions ?? [10, 20, 50];\n\n return (\n <Wrap>\n <Table<T> {...tableProps} pagination={false} />\n\n {footer && <FooterStrip>{footer}</FooterStrip>}\n\n {p && (\n <PagerBar>\n <span className=\"hisd3-total\">\n {(p.renderTotal ?? defaultTotal)(p.total, [\n (p.current - 1) * p.pageSize + 1,\n Math.min(p.current * p.pageSize, p.total),\n ])}\n </span>\n <Pagination\n current={p.current}\n pageSize={p.pageSize}\n total={p.total}\n showSizeChanger={false}\n onChange={(page, size) => p.onChange(page, size)}\n itemRender={(_, type, el) => {\n if (type === \"prev\") return <span className=\"ant-pagination-item-link\"><LeftOutlined /></span>;\n if (type === \"next\") return <span className=\"ant-pagination-item-link\"><RightOutlined /></span>;\n return el;\n }}\n />\n {!p.hidePageSize && (\n <SizeGroup role=\"group\" aria-label=\"Rows per page\">\n {sizes.map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={s === p.pageSize}\n onClick={() => p.onChange(1, s)}\n >\n {s} / page\n </button>\n ))}\n </SizeGroup>\n )}\n </PagerBar>\n )}\n </Wrap>\n );\n}\n\nexport default HISD3Table;\n","import { Tabs, type TabsProps } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface HISD3TabItem {\n key: string;\n label: React.ReactNode;\n /** Optional count badge rendered after the label (e.g. \"All Patients 10\"). */\n count?: number | string;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nexport interface HISD3TabsProps extends Omit<TabsProps, \"items\"> {\n items: HISD3TabItem[];\n}\n\nconst StyledTabs = styled(Tabs)`\n &.ant-tabs .ant-tabs-nav {\n margin: 0;\n\n &::before {\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n }\n }\n\n &.ant-tabs .ant-tabs-tab {\n padding: 14px 0 18px;\n font-weight: 600;\n font-size: 18px;\n\n + .ant-tabs-tab {\n margin-left: 48px;\n }\n }\n\n &.ant-tabs .ant-tabs-ink-bar {\n height: 4px;\n }\n\n .hisd3-tab-count {\n margin-left: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--ant-color-text-tertiary);\n }\n\n .ant-tabs-tab-active .hisd3-tab-count {\n color: var(--ant-color-primary);\n }\n`;\n\n/** Underlined filter tabs with optional counts. */\nexport const HISD3Tabs: React.FC<HISD3TabsProps> = ({ items, ...rest }) => (\n <StyledTabs\n {...rest}\n items={items.map(({ count, label, ...item }) => ({\n ...item,\n label: (\n <>\n {label}\n {count !== undefined && <span className=\"hisd3-tab-count\">{count}</span>}\n </>\n ),\n }))}\n />\n);\n\nexport default HISD3Tabs;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport type HISD3TagVariant = \"neutral\" | \"soft\" | \"outline\" | \"solid\";\nexport type HISD3TagTone = \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface HISD3TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * neutral → light grey fill, dark text (ACTIVE, IN PATIENT)\n * soft → primary tint fill, primary text (ER PATIENT)\n * outline → 2px primary border, primary text (OUT PATIENT)\n * solid → primary fill, white text\n */\n variant?: HISD3TagVariant;\n tone?: HISD3TagTone;\n children: React.ReactNode;\n}\n\nconst toneVar: Record<HISD3TagTone, string> = {\n default: \"var(--ant-color-text)\",\n primary: \"var(--ant-color-primary)\",\n success: \"var(--ant-color-success)\",\n warning: \"var(--ant-color-warning)\",\n danger: \"var(--ant-color-error)\",\n};\n\nconst toneBgVar: Record<HISD3TagTone, string> = {\n default: \"rgba(0,0,0,0.05)\",\n primary: \"var(--ant-color-primary-bg)\",\n success: \"var(--ant-color-success-bg)\",\n warning: \"var(--ant-color-warning-bg)\",\n danger: \"var(--ant-color-error-bg)\",\n};\n\nconst StyledTag = styled.span<{ $variant: HISD3TagVariant; $tone: HISD3TagTone }>`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n padding: 0 14px;\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n white-space: nowrap;\n line-height: 1;\n border: var(--hisd3-rule-width, 1px) solid transparent;\n border-radius: 0;\n\n ${({ $variant, $tone }) => {\n const color = toneVar[$tone];\n const bg = toneBgVar[$tone];\n switch ($variant) {\n case \"soft\":\n return `color: ${color}; background: ${bg};`;\n case \"outline\":\n return `color: ${color}; border-color: ${color}; background: transparent;`;\n case \"solid\":\n return `color: #fff; background: ${$tone === \"default\" ? \"var(--ant-color-text)\" : color};`;\n default:\n return `color: var(--ant-color-text); background: rgba(0,0,0,0.05);`;\n }\n }}\n`;\n\nexport const HISD3Tag: React.FC<HISD3TagProps> = ({\n variant = \"neutral\",\n tone = variant === \"neutral\" ? \"default\" : \"primary\",\n children,\n ...rest\n}) => (\n <StyledTag $variant={variant} $tone={tone} {...rest}>\n {children}\n </StyledTag>\n);\n\nexport default HISD3Tag;\n","import { Button, type ButtonProps } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport type HISD3ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\n\nexport interface HISD3ButtonProps extends Omit<ButtonProps, \"variant\" | \"color\" | \"type\"> {\n /**\n * primary → filled with the theme primary (e.g. \"New folio\")\n * secondary → outlined, dark 2px border (e.g. \"Refresh\", \"Export\")\n * ghost → text only\n * danger → filled red\n */\n variant?: HISD3ButtonVariant;\n}\n\nconst StyledButton = styled(Button)`\n &.ant-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 40px;\n padding-inline: 16px;\n font-size: 14px;\n font-weight: 600;\n box-shadow: none;\n }\n\n &.ant-btn-sm {\n height: 32px;\n padding-inline: 12px;\n font-size: 13px;\n gap: 6px;\n }\n\n &.ant-btn-lg {\n height: 52px;\n padding-inline: 20px;\n font-size: 16px;\n }\n\n &.ant-btn-default {\n border-width: var(--hisd3-rule-width, 1px);\n }\n\n .anticon {\n font-size: 1.05em;\n }\n`;\n\nconst map: Record<HISD3ButtonVariant, Pick<ButtonProps, \"type\" | \"danger\">> = {\n primary: { type: \"primary\" },\n secondary: { type: \"default\" },\n ghost: { type: \"text\" },\n danger: { type: \"primary\", danger: true },\n};\n\nexport const HISD3Button: React.FC<HISD3ButtonProps> = ({\n variant = \"secondary\",\n ...rest\n}) => <StyledButton {...map[variant]} {...rest} />;\n\nexport default HISD3Button;\n","import { SearchOutlined } from \"@ant-design/icons\";\nimport { Input, type InputProps } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport type HISD3InputProps = InputProps;\n\nconst StyledInput = styled(Input)`\n &.ant-input,\n &.ant-input-affix-wrapper {\n border-width: var(--hisd3-rule-width, 1px);\n font-size: 16px;\n }\n\n &.ant-input-affix-wrapper .ant-input-prefix {\n margin-inline-end: 14px;\n color: var(--ant-color-text-tertiary);\n font-size: 18px;\n }\n`;\n\n/** Plain text input with the HISD3 2px border. */\nexport const HISD3Input: React.FC<HISD3InputProps> = (props) => (\n <StyledInput {...props} />\n);\n\nconst StyledSearch = styled(StyledInput)`\n &.ant-input-affix-wrapper {\n background: var(--hisd3-bg-filled, #e6e4e1);\n border-color: var(--ant-color-border-secondary);\n height: 72px;\n padding-inline: 24px;\n\n &:hover,\n &:focus-within {\n border-color: var(--ant-color-border);\n background: var(--hisd3-bg-filled, #e6e4e1);\n }\n\n .ant-input {\n background: transparent;\n font-size: 20px;\n }\n\n .ant-input-prefix {\n font-size: 22px;\n }\n }\n\n &.hisd3-search-compact.ant-input-affix-wrapper {\n height: 48px;\n padding-inline: 16px;\n\n .ant-input {\n font-size: 16px;\n }\n .ant-input-prefix {\n font-size: 18px;\n }\n }\n`;\n\nexport interface HISD3SearchInputProps extends InputProps {\n /** 48px tall instead of the 72px hero search. */\n compact?: boolean;\n}\n\n/** Grey filled search field with leading icon (the page-level search bar). */\nexport const HISD3SearchInput: React.FC<HISD3SearchInputProps> = ({\n compact = false,\n className,\n ...props\n}) => (\n <StyledSearch\n allowClear\n prefix={<SearchOutlined />}\n className={[compact ? \"hisd3-search-compact\" : \"\", className ?? \"\"].join(\" \").trim()}\n {...props}\n />\n);\n\nexport default HISD3Input;\n","export enum ThemeStyle {\n MODERN = \"modern\",\n STANDARD = \"standard\",\n}\nexport enum ThemeStyleRadius {\n MODERN = \"30px\",\n STANDARD = \"16px\",\n}\nexport enum ThemeMode {\n LIGHT = \"light\",\n SEMI_DARK = \"semi-dark\",\n DARK = \"dark\",\n}\nexport enum LayoutType {\n FULL_WIDTH = \"full-width\",\n BOXED = \"boxed\",\n FRAMED = \"framed\",\n}\n\nexport enum MenuStyle {\n DEFAULT = \"default\",\n STANDARD = \"standard\",\n ROUNDED = \"rounded\",\n ROUNDED_REVERSE = \"rounded-reverse\",\n CURVED_MENU = \"curved-menu\",\n}\n\nexport enum NavStyle {\n DEFAULT = \"default\",\n MINI = \"mini\",\n MINI_SIDEBAR_TOGGLE = \"mini-sidebar-toggle\",\n STANDARD = \"standard\",\n HEADER_USER = \"user-header\",\n HEADER_USER_MINI = \"user-mini-header\",\n DRAWER = \"drawer\",\n BIT_BUCKET = \"bit-bucket\",\n H_DEFAULT = \"h-default\",\n HOR_HEADER_FIXED = \"hor-header-fixed\",\n HOR_DARK_LAYOUT = \"hor-dark-layout\",\n}\nexport enum FooterType {\n FIXED = \"fixed\",\n FLUID = \"fluid\",\n}\nexport enum LayoutDirection {\n RTL = \"rtl\",\n LTR = \"ltr\",\n}\nexport enum HeaderType {\n DARK = \"dark\",\n LIGHT = \"light\",\n}\nexport enum RouteTransition {\n NONE = \"none\",\n FADE = \"fade\",\n SLIDE_LEFT = \"slideLeft\",\n SLIDE_RIGHT = \"slideRight\",\n SLIDE_UP = \"slideUp\",\n SLIDE_DOWN = \"slideDown\",\n}\nexport enum Fonts {\n LIGHT = \"300\",\n REGULAR = \"400\",\n MEDIUM = \"500\",\n BOLD = \"600\",\n}\n\nexport enum AuthType {\n FIREBASE = \"firebase\",\n AWS_COGNITO = \"aws_cognito\",\n AUTH0 = \"auth0\",\n JWT_AUTH = \"jwt_auth\",\n}\n\nexport enum AppAnimates {\n SLIDEUPIN = \"transition.slideUpIn\",\n SLIDEUPOUT = \"transition.slideUpOut\",\n SLIDEDOWNIN = \"transition.slideDownIn\",\n SLIDEDOWNOUT = \"transition.slideDownOut\",\n SLIDELEFTIN = \"transition.slideLeftIn\",\n SLIDELEFTOUT = \"transition.slideLeftOut\",\n SLIDERIGHTIN = \"transition.slideRightIn\",\n SLIDERIGHTOUT = \"transition.slideRightOut\",\n FADEIN = \"transition.fadeIn\",\n FADEOUT = \"transition.fadeOut\",\n}\n\nexport const AppAnimateGroups = {\n SLIDEUPIN: {\n hidden: {\n y: 0,\n },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.2,\n staggerChildren: 0.05,\n },\n },\n },\n SLIDEUPOUT: {\n hidden: {\n y: 0,\n },\n visible: {\n opacity: 0,\n y: \"100vh\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDEDOWNIN: {\n hidden: {\n opacity: 0,\n y: \"-100vh\",\n },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDEDOWNOUT: {\n hidden: {\n y: 0,\n },\n visible: {\n opacity: 0,\n y: \"-100vh\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDELEFTIN: {\n hidden: {\n x: \"100vw\",\n },\n visible: {\n opacity: 1,\n x: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDELEFTOUT: {\n hidden: {\n x: 0,\n },\n visible: {\n opacity: 0,\n x: \"100vw\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDERIGHTIN: {\n hidden: {\n x: \"-100vw\",\n },\n visible: {\n opacity: 1,\n x: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDERIGHTOUT: {\n hidden: {\n x: 0,\n },\n visible: {\n opacity: 0,\n x: \"-100vw\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n FADEIN: {\n hidden: {\n opacity: 0,\n scale: 1,\n },\n visible: {\n opacity: 1,\n scale: 1,\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n staggerChildren: 0.15,\n },\n },\n },\n FADEOUT: {\n hidden: {\n opacity: 1,\n scale: 1,\n },\n visible: {\n opacity: 0,\n scale: 1,\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n staggerChildren: 0.15,\n },\n },\n },\n NOANIMATION: {\n hidden: {\n opacity: 1,\n },\n visible: {\n opacity: 1,\n },\n },\n};\n\nexport const AppMotionAnimate = {\n SLIDEUPIN: {\n variants: {\n hidden: {\n y: 100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n y: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDEUPOUT: {\n variants: {\n hidden: {\n y: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n y: \"-100vh\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n SLIDEDOWNIN: {\n variants: {\n hidden: {\n y: -100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n y: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDEDOWNOUT: {\n variants: {\n hidden: {\n y: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n y: \"100vh\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n SLIDELEFTIN: {\n variants: {\n hidden: {\n x: 100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n x: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDELEFTOUT: {\n variants: {\n hidden: {\n x: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n x: \"-100vw\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n SLIDERIGHTIN: {\n variants: {\n hidden: {\n x: -100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n x: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDERIGHTOUT: {\n variants: {\n hidden: {\n x: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n x: \"-100vw\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n FADEIN: {\n variants: {\n hidden: {\n opacity: 0,\n },\n visible: {\n opacity: 1,\n },\n },\n transition: {\n duration: 0.1,\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n FADEOUT: {\n variants: {\n hidden: {\n opacity: 1,\n },\n visible: {\n opacity: 0,\n },\n },\n transition: {\n duration: 0.1,\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n};\n\nexport enum MessageType {\n MEDIA = 1,\n TEXT = 2,\n}\n\nexport enum RoutePermittedRole {\n Admin = \"admin\",\n User = \"user\",\n}\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","HISD3_LAYOUT","siderWidth","siderCollapsedWidth","topBarHeight","pageGutter","HISD3_PRESETS","red","orange","teal","blue","green","purple","HISD3_NEUTRALS","bgLayout","bgContainer","bgElevated","bgFilled","bgFilledHover","text","textSecondary","textTertiary","border","borderSecondary","borderStrong","white","HISD3_BORDER_PRESETS","hairline","width","bold","HISD3_FONT_FAMILY","resolvePrimary","primary","tint","hex","amount","h","replace","full","length","split","map","c","join","n","parseInt","g","b","mix","Math","round","toString","padStart","createHisd3Theme","radius","borders","lineWidth","overrides","p","base","cssVar","key","token","colorPrimary","colorInfo","colorLink","colorPrimaryBg","colorPrimaryBgHover","colorPrimaryBorder","fontFamily","fontSize","fontWeightStrong","borderRadius","borderRadiusLG","borderRadiusSM","borderRadiusXS","colorBgLayout","colorBgContainer","colorBgElevated","colorText","colorTextSecondary","colorTextTertiary","colorTextHeading","colorBorder","colorBorderSecondary","colorSplit","controlHeight","controlHeightLG","controlHeightSM","boxShadow","boxShadowSecondary","components","Layout","siderBg","headerBg","bodyBg","headerPadding","Menu","itemBg","subMenuItemBg","itemColor","itemHoverColor","itemHoverBg","itemSelectedBg","itemSelectedColor","itemActiveBg","subMenuItemSelectedColor","groupTitleColor","groupTitleFontSize","itemBorderRadius","itemMarginInline","itemMarginBlock","itemHeight","itemPaddingInline","iconSize","collapsedIconSize","activeBarBorderWidth","activeBarWidth","Button","fontWeight","primaryShadow","defaultShadow","dangerShadow","defaultBorderColor","defaultColor","defaultBg","defaultHoverBg","defaultHoverBorderColor","defaultHoverColor","defaultActiveBorderColor","paddingInline","contentFontSize","contentFontSizeLG","contentFontSizeSM","Input","activeShadow","hoverBorderColor","activeBorderColor","Select","optionSelectedBg","Table","headerColor","headerSplitColor","headerBorderRadius","borderColor","rowHoverBg","cellPaddingBlock","cellPaddingInline","cellFontSize","footerBg","Tabs","inkBarColor","titleFontSize","horizontalItemGutter","horizontalMargin","lineWidthBold","Tag","Pagination","itemSize","itemInputBg","Dropdown","paddingBlock","Breadcrumb","lastItemColor","linkColor","linkHoverColor","separatorColor","Card","headerFontSize","borderVarsCss","hisd3AntdTheme","HISD3_COLORS","primaryLight","headerSelectedBg","HISD3ProviderContext","createContext","useInsideHISD3Provider","useContext","Header","Content","SIDER_WIDTH","SIDER_COLLAPSED_WIDTH","HEADER_HEIGHT","StyledRoot","styled","$appShell","StyledMain","$scroll","StyledSiderMenuWrap","div","StyledBrand","a","$collapsed","StyledHeader","StyledSiderHeader","StyledCollapseTrigger","button","StyledContent","StyledCrUserInfo","$inHeader","StyledCrUserInfoInner","StyledCrUserInfoAvatar","span","$src","StyledCrUserInfoContent","StyledUsernameInfo","StyledUsername","h3","StyledUserArrow","StyledCrUserDesignation","itemKey","item","index","path","toAntdMenuItems","items","renderLink","filter","hideInMenu","Array","isArray","children","icon","label","name","disabled","group","undefined","defaultRenderLink","href","UserMenu","account","avatarSrc","settingsUrl","onLogout","collapsed","placement","extraItems","modal","App","useApp","_jsx","SettingOutlined","onClick","window","location","LogoutOutlined","confirm","title","content","ExclamationCircleOutlined","onOk","initials","fullName","w","Boolean","slice","toUpperCase","jsx","className","trigger","menu","_jsxs","e","preventDefault","jsxs","DownOutlined","positionType","Sider","PAGE_GUTTER","HeaderWrap","header","TopBar","Actions","TitleBlock","HISD3PageBody","HeaderIconButton","$size","Panel","PanelHeader","List","Row","$unread","RowIcon","RowBody","UnreadDot","PanelFooter","EmptyWrap","Trigger","$shape","Chevron","Identity","IdentityAvatar","getInitials","Wrap","Divider","FooterStrip","PagerBar","SizeGroup","defaultTotal","total","toLocaleString","StyledTabs","toneVar","default","success","warning","danger","toneBgVar","StyledTag","$variant","$tone","color","bg","StyledButton","secondary","ghost","StyledInput","StyledSearch","ThemeStyle","ThemeStyleRadius","ThemeMode","LayoutType","MenuStyle","NavStyle","FooterType","LayoutDirection","HeaderType","RouteTransition","Fonts","AuthType","AppAnimates","MessageType","RoutePermittedRole","SLIDEUPIN","hidden","y","visible","opacity","transition","ease","delay","when","duration","staggerChildren","SLIDEUPOUT","SLIDEDOWNIN","SLIDEDOWNOUT","SLIDELEFTIN","x","SLIDELEFTOUT","SLIDERIGHTIN","SLIDERIGHTOUT","FADEIN","scale","FADEOUT","NOANIMATION","variants","onSettings","confirmLogout","shape","size","hideChevron","open","setOpen","useState","okText","onOpenChange","popupRender","src","alt","variant","rest","divided","kids","React","Children","toArray","child","i","Fragment","props","count","loading","onMarkAllRead","onSeeAll","seeAllLabel","emptyText","unread","panel","textAlign","Spin","Empty","image","PRESENTED_IMAGE_SIMPLE","description","BellOutlined","time","id","next","Badge","offset","subtitle","breadcrumb","extra","leading","hideTopBar","flex","theme","styledTheme","antdTheme","useMemo","vars","Provider","value","dangerouslySetInnerHTML","__html","ConfigProvider","ThemeProvider","AntdApp","component","compact","allowClear","prefix","SearchOutlined","trim","logoUrl","appName","menuItems","pathname","renderMenuLink","headerExtra","userMenuItems","onCollapse","hideSidebar","layoutTop","hideCollapseTrigger","bareContent","hideHeaderBar","brandHref","hideAccountCard","scrollContent","insideProvider","resolvedTheme","isCollapsed","setIsCollapsed","useEffect","selection","best","walk","list","parents","forEach","startsWith","exact","selectedKey","openKeys","findSelection","setOpenKeys","prev","from","Set","toggleCollapse","selectedKeys","brand","body","spinning","_Fragment","mode","hasSider","collapsedWidth","collapsible","breakpoint","onBreakpoint","broken","inlineCollapsed","keys","MenuUnfoldOutlined","MenuFoldOutlined","pagination","footer","tableProps","sizes","pageSizeOptions","renderTotal","current","pageSize","min","showSizeChanger","onChange","page","itemRender","_","el","LeftOutlined","RightOutlined","hidePageSize","role","s","tone"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/theme/layout.ts","../src/theme/antd.ts","../src/components/Provider/index.tsx","../src/components/Sidebar/index.styled.tsx","../src/components/Sidebar/menu.ts","../src/components/Sidebar/UserMenu.tsx","../src/components/Sidebar/index.tsx","../src/components/PageHeader/index.tsx","../src/components/HeaderActions/NotificationButton.tsx","../src/components/HeaderActions/AvatarMenu.tsx","../src/components/HeaderActions/index.tsx","../src/components/Table/index.tsx","../src/components/Tabs/index.tsx","../src/components/Tag/index.tsx","../src/components/Button/index.tsx","../src/components/Input/index.tsx","../src/enum/theme.ts"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/** Shared layout metrics so the sidebar brand block and page top bar line up. */\nexport const HISD3_LAYOUT = {\n siderWidth: 260,\n siderCollapsedWidth: 64,\n /** Height of both the sidebar brand block and the page top bar. */\n topBarHeight: 60,\n /** Horizontal padding used by the top bar, title block and page body. */\n pageGutter: 28,\n} as const;\n","import type { ThemeConfig } from \"antd\";\n\nimport { HISD3_LAYOUT } from \"./layout\";\n\n/** Named primary-color presets. Any hex string is also accepted. */\nexport const HISD3_PRESETS = {\n red: \"#E5401C\",\n orange: \"#F26B1D\",\n teal: \"#00796B\",\n blue: \"#1D5FD1\",\n green: \"#2E7D32\",\n purple: \"#6A3FD6\",\n} as const;\n\nexport type HISD3Preset = keyof typeof HISD3_PRESETS;\n\n/** Neutral palette shared by every preset (the \"Backoffice\" look). */\nexport const HISD3_NEUTRALS = {\n bgLayout: \"#F3F2F0\",\n bgContainer: \"#F3F2F0\",\n bgElevated: \"#FFFFFF\",\n bgFilled: \"#E6E4E1\",\n bgFilledHover: \"#DBD8D4\",\n text: \"#171717\",\n textSecondary: \"#4A4A4A\",\n textTertiary: \"#6E6E6E\",\n /** Structural rules: sidebar edge, header bottom, table header. */\n border: \"#D9D5CE\",\n /** Quieter rules: table rows, dividers inside popups. */\n borderSecondary: \"#E7E4DE\",\n /** Near-black, used for hover/focus emphasis on controls. */\n borderStrong: \"#1F1F1F\",\n white: \"#FFFFFF\",\n} as const;\n\n/** Border weights. \"hairline\" is the default modern look. */\nexport const HISD3_BORDER_PRESETS = {\n hairline: { width: 1, border: \"#D9D5CE\", borderSecondary: \"#E7E4DE\" },\n bold: { width: 2, border: \"#1F1F1F\", borderSecondary: \"#CFCDC9\" },\n} as const;\n\nexport type HISD3Borders = keyof typeof HISD3_BORDER_PRESETS;\n\nexport const HISD3_FONT_FAMILY =\n \"'Archivo', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\";\n/** Archivo is used for both body (400) and headings (800). */\nexport const HISD3_FONT_WEIGHT_HEADING = 800;\nexport const HISD3_FONT_WEIGHT_BODY = 400;\n\nexport interface HISD3ThemeOptions {\n /** Preset name or any hex color. Default \"red\". */\n primary?: HISD3Preset | string;\n /** Corner radius in px. The Backoffice look is square (0). */\n radius?: number;\n /**\n * Border treatment. \"hairline\" (default) uses 1px warm-grey rules;\n * \"bold\" restores the 2px near-black look.\n */\n borders?: HISD3Borders;\n /** Explicit border width in px; overrides the `borders` preset. */\n lineWidth?: number;\n /** Override / extend the generated antd theme. */\n overrides?: ThemeConfig;\n}\n\nexport const resolvePrimary = (primary: HISD3Preset | string = \"red\"): string =>\n (HISD3_PRESETS as Record<string, string>)[primary] ?? primary;\n\n/** Mix a hex color with white: amount 0 → color, 1 → white. */\nexport const tint = (hex: string, amount: number): string => {\n const h = hex.replace(\"#\", \"\");\n const full = h.length === 3 ? h.split(\"\").map((c) => c + c).join(\"\") : h;\n const n = parseInt(full, 16);\n const r = (n >> 16) & 255;\n const g = (n >> 8) & 255;\n const b = n & 255;\n const mix = (c: number) => Math.round(c + (255 - c) * amount);\n return `#${[mix(r), mix(g), mix(b)]\n .map((c) => c.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n};\n\n/**\n * Build the HISD3 Ant Design v6 theme.\n *\n * ```ts\n * <ConfigProvider theme={createHisd3Theme({ primary: \"teal\" })}>\n * ```\n */\nexport const createHisd3Theme = ({\n primary,\n radius = 0,\n borders = \"hairline\",\n lineWidth,\n overrides,\n}: HISD3ThemeOptions = {}): ThemeConfig => {\n const p = resolvePrimary(primary);\n const b = HISD3_BORDER_PRESETS[borders] ?? HISD3_BORDER_PRESETS.hairline;\n const width = lineWidth ?? b.width;\n const n = {\n ...HISD3_NEUTRALS,\n border: b.border,\n borderSecondary: b.borderSecondary,\n };\n\n const base: ThemeConfig = {\n cssVar: { key: \"hisd3\" },\n token: {\n colorPrimary: p,\n colorInfo: p,\n colorLink: p,\n colorPrimaryBg: tint(p, 0.92),\n colorPrimaryBgHover: tint(p, 0.86),\n colorPrimaryBorder: tint(p, 0.6),\n fontFamily: HISD3_FONT_FAMILY,\n fontSize: 14,\n fontWeightStrong: 700,\n borderRadius: radius,\n borderRadiusLG: radius,\n borderRadiusSM: radius,\n borderRadiusXS: radius,\n lineWidth: width,\n colorBgLayout: n.bgLayout,\n colorBgContainer: n.bgContainer,\n colorBgElevated: n.bgElevated,\n colorText: n.text,\n colorTextSecondary: n.textSecondary,\n colorTextTertiary: n.textTertiary,\n colorTextHeading: n.text,\n colorBorder: n.border,\n colorBorderSecondary: n.borderSecondary,\n colorSplit: n.borderSecondary,\n controlHeight: 40,\n controlHeightLG: 52,\n controlHeightSM: 32,\n boxShadow: \"none\",\n boxShadowSecondary:\n \"0 2px 6px rgba(16,15,14,0.06), 0 12px 32px rgba(16,15,14,0.14)\",\n },\n components: {\n Layout: {\n siderBg: n.bgLayout,\n headerBg: n.bgLayout,\n bodyBg: n.bgLayout,\n headerPadding: `0 ${HISD3_LAYOUT.pageGutter}px`,\n },\n Menu: {\n itemBg: \"transparent\",\n subMenuItemBg: \"transparent\",\n itemColor: n.text,\n itemHoverColor: n.text,\n itemHoverBg: \"rgba(0,0,0,0.04)\",\n itemSelectedBg: tint(p, 0.9),\n itemSelectedColor: p,\n itemActiveBg: tint(p, 0.86),\n subMenuItemSelectedColor: p,\n groupTitleColor: n.textTertiary,\n groupTitleFontSize: 12,\n itemBorderRadius: 0,\n itemMarginInline: 0,\n itemMarginBlock: 0,\n itemHeight: 40,\n itemPaddingInline: HISD3_LAYOUT.pageGutter,\n iconSize: 16,\n collapsedIconSize: 18,\n activeBarBorderWidth: 0,\n activeBarWidth: 0,\n },\n Button: {\n fontWeight: 600,\n primaryShadow: \"none\",\n defaultShadow: \"none\",\n dangerShadow: \"none\",\n defaultBorderColor: n.border,\n defaultColor: n.text,\n defaultBg: n.bgLayout,\n defaultHoverBg: n.white,\n defaultHoverBorderColor: n.borderStrong,\n defaultHoverColor: n.text,\n defaultActiveBorderColor: n.borderStrong,\n paddingInline: 16,\n contentFontSize: 14,\n contentFontSizeLG: 16,\n contentFontSizeSM: 13,\n },\n Input: {\n activeShadow: \"none\",\n colorBorder: n.border,\n hoverBorderColor: n.borderStrong,\n activeBorderColor: n.borderStrong,\n paddingInline: 16,\n },\n Select: { optionSelectedBg: tint(p, 0.9), colorBorder: n.border },\n Table: {\n headerBg: \"transparent\",\n headerColor: n.textTertiary,\n headerSplitColor: \"transparent\",\n headerBorderRadius: 0,\n borderColor: n.borderSecondary,\n rowHoverBg: \"rgba(0,0,0,0.03)\",\n cellPaddingBlock: 20,\n cellPaddingInline: 16,\n cellFontSize: 16,\n footerBg: \"transparent\",\n },\n Tabs: {\n inkBarColor: p,\n itemColor: n.text,\n itemSelectedColor: p,\n itemHoverColor: p,\n titleFontSize: 18,\n horizontalItemGutter: 48,\n horizontalMargin: \"0\",\n lineWidthBold: 4,\n },\n Tag: { borderRadiusSM: 0, defaultBg: \"transparent\" },\n Pagination: {\n itemBg: n.bgLayout,\n itemActiveBg: p,\n itemSize: 48,\n itemInputBg: n.bgLayout,\n },\n Dropdown: { paddingBlock: 10 },\n Breadcrumb: {\n itemColor: n.textTertiary,\n lastItemColor: n.text,\n linkColor: n.textTertiary,\n linkHoverColor: p,\n separatorColor: n.textTertiary,\n },\n Card: { headerFontSize: 20 },\n },\n };\n\n if (!overrides) return base;\n return {\n ...base,\n ...overrides,\n token: { ...base.token, ...overrides.token },\n components: { ...base.components, ...overrides.components },\n };\n};\n\n/** CSS emitted by HISD3Provider so styled components follow the border preset. */\nexport const borderVarsCss = (\n borders: HISD3Borders = \"hairline\",\n lineWidth?: number,\n): string => {\n const b = HISD3_BORDER_PRESETS[borders] ?? HISD3_BORDER_PRESETS.hairline;\n return `:root{--hisd3-rule-width:${lineWidth ?? b.width}px;--hisd3-control-bg:${HISD3_NEUTRALS.bgFilled};--hisd3-control-bg-hover:${HISD3_NEUTRALS.bgFilledHover};}`;\n};\n\n/** Default HISD3 theme — the red \"Backoffice\" look. */\nexport const hisd3AntdTheme: ThemeConfig = createHisd3Theme();\n\n/** @deprecated use HISD3_PRESETS / createHisd3Theme */\nexport const HISD3_COLORS = {\n primary: HISD3_PRESETS.red,\n primaryLight: tint(HISD3_PRESETS.red, 0.9),\n headerSelectedBg: \"rgba(0,0,0,0.04)\",\n} as const;\n","import { App as AntdApp, ConfigProvider, type ThemeConfig } from \"antd\";\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport { ThemeProvider } from \"styled-components\";\n\nimport {\n borderVarsCss,\n createHisd3Theme,\n type HISD3Preset,\n type HISD3ThemeOptions,\n} from \"../../theme/antd\";\nimport type { StyledTheme } from \"../../types/theme\";\n\nconst HISD3ProviderContext = createContext(false);\n\n/** True when rendered somewhere below an `HISD3Provider`. */\nexport const useInsideHISD3Provider = () => useContext(HISD3ProviderContext);\n\nexport interface HISD3ProviderProps extends HISD3ThemeOptions {\n /** Shorthand: preset name or hex. Same as `options.primary`. */\n primary?: HISD3Preset | string;\n /** Legacy styled-components theme object used by older HISD3 screens. */\n styledTheme?: StyledTheme;\n /** Fully custom antd theme — skips `createHisd3Theme` entirely. */\n theme?: ThemeConfig;\n children: React.ReactNode;\n}\n\n/**\n * Root provider for HISD3 apps. Put it once at the top of the tree:\n *\n * ```tsx\n * <HISD3Provider primary=\"teal\">\n * <App />\n * </HISD3Provider>\n * ```\n *\n * It wires the antd `ConfigProvider` (with CSS variables enabled so every\n * kit component follows the chosen primary), antd `App` (for themed\n * `modal.confirm` / `message`), and the styled-components `ThemeProvider`.\n */\nexport const HISD3Provider: React.FC<HISD3ProviderProps> = ({\n primary,\n radius,\n borders = \"hairline\",\n lineWidth,\n overrides,\n theme,\n styledTheme = {},\n children,\n}) => {\n const antdTheme = useMemo(\n () =>\n theme ??\n createHisd3Theme({ primary, radius, borders, lineWidth, overrides }),\n [theme, primary, radius, borders, lineWidth, overrides],\n );\n\n const vars = useMemo(\n () => borderVarsCss(borders, lineWidth),\n [borders, lineWidth],\n );\n\n return (\n <HISD3ProviderContext.Provider value={true}>\n {/* CSS variables the styled components read (rule width, control fills) */}\n <style dangerouslySetInnerHTML={{ __html: vars }} />\n <ConfigProvider theme={antdTheme}>\n <ThemeProvider theme={styledTheme}>\n <AntdApp component={false}>{children}</AntdApp>\n </ThemeProvider>\n </ConfigProvider>\n </HISD3ProviderContext.Provider>\n );\n};\n\nexport default HISD3Provider;\n","import styled from \"styled-components\";\nimport { Layout } from \"antd\";\n\nimport { HISD3_LAYOUT } from \"../../theme/layout\";\n\nconst { Header, Content } = Layout;\n\nexport const SIDER_WIDTH = HISD3_LAYOUT.siderWidth;\nexport const SIDER_COLLAPSED_WIDTH = HISD3_LAYOUT.siderCollapsedWidth;\nexport const HEADER_HEIGHT = HISD3_LAYOUT.topBarHeight;\n\nexport const StyledRoot = styled(Layout)<{ $appShell?: boolean }>`\n position: relative; /* anchor for the edge collapse trigger */\n background: var(--ant-color-bg-layout);\n\n /*\n * App-shell mode: the shell is exactly one viewport tall and never scrolls,\n * so the document has no scrollbar and cannot rubber-band. The content\n * column (StyledMain) is the scroller instead.\n */\n ${({ $appShell }) =>\n $appShell\n ? `height: 100vh; max-height: 100vh; overflow: hidden;`\n : `min-height: 100vh;`}\n\n /*\n * The Sider is rendered as a plain antd <Sider> (not styled(Sider)) because\n * styled-components would swallow its \\`theme\\` prop; style it from here.\n */\n /* the whole sidebar is chrome: never select its text on drag */\n > .ant-layout-sider.hisd3-sider {\n user-select: none;\n -webkit-user-select: none;\n position: sticky;\n top: 0;\n height: ${({ $appShell }) => ($appShell ? \"100%\" : \"100vh\")};\n overflow: hidden;\n background: var(--ant-color-bg-layout);\n border-right: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .ant-layout-sider-children {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n }\n`;\n\n/** Content column. In app-shell mode this is the element that scrolls. */\nexport const StyledMain = styled(Layout)<{ $scroll?: boolean }>`\n background: transparent;\n min-width: 0;\n\n ${({ $scroll }) =>\n $scroll\n ? `\n height: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n /* keep scroll chaining (and its bounce) out of the document */\n overscroll-behavior: contain;\n `\n : \"\"}\n`;\n\nexport const StyledSiderMenuWrap = styled.div`\n flex: 1 1 auto;\n overflow-y: auto;\n overflow-x: hidden;\n overscroll-behavior: contain;\n padding-top: 4px;\n\n .ant-menu-inline,\n .ant-menu-vertical {\n border-inline-end: none !important;\n background: transparent;\n }\n\n /* Section titles: \"RECEIVABLES AND COLLECTIONS\" */\n .ant-menu-item-group-title {\n padding: 16px ${HISD3_LAYOUT.pageGutter}px 4px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n }\n\n .ant-menu-item-group + .ant-menu-item-group > .ant-menu-item-group-title,\n .ant-menu-item-group + .ant-menu-item-group::before {\n border-top: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n margin-top: 10px;\n padding-top: 20px;\n }\n .ant-menu-item-group + .ant-menu-item-group::before {\n content: none;\n }\n\n .ant-menu-item,\n .ant-menu-submenu-title {\n font-size: 14px;\n font-weight: 500;\n position: relative;\n width: 100%;\n }\n\n .ant-menu-item .ant-menu-item-icon,\n .ant-menu-submenu-title .ant-menu-item-icon {\n font-size: 16px;\n }\n\n /* open parent (\"Billing\") in primary */\n .ant-menu-submenu-open > .ant-menu-submenu-title,\n .ant-menu-submenu-selected > .ant-menu-submenu-title {\n color: var(--ant-color-primary);\n font-weight: 700;\n }\n\n /* child items are indented by antd; keep them slightly smaller */\n .ant-menu-sub.ant-menu-inline > .ant-menu-item {\n font-size: 13.5px;\n }\n\n /* active item: tint + 4px accent bar */\n .ant-menu-item-selected {\n font-weight: 700;\n\n &::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n background: var(--ant-color-primary);\n }\n }\n\n &.hisd3-collapsed .ant-menu-item-group-title {\n display: none;\n }\n`;\n\nexport const StyledBrand = styled.a<{ $collapsed?: boolean }>`\n display: flex;\n align-items: center;\n gap: 10px;\n height: ${HEADER_HEIGHT}px;\n padding: 0 ${({ $collapsed }) => ($collapsed ? 12 : HISD3_LAYOUT.pageGutter)}px;\n justify-content: ${({ $collapsed }) => ($collapsed ? \"center\" : \"flex-start\")};\n color: inherit;\n text-decoration: none;\n overflow: hidden;\n white-space: nowrap;\n flex: 0 0 auto;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .hisd3-brand-mark {\n width: 28px;\n height: 28px;\n flex: 0 0 auto;\n background: var(--ant-color-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n img {\n height: 28px;\n width: 28px;\n object-fit: contain;\n flex: 0 0 auto;\n }\n\n h1 {\n margin: 0;\n font-family: var(--font-heading);\n font-size: 16px;\n font-weight: var(--font-weight-heading, 800);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--ant-color-text);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nexport const StyledHeader = styled(Header)`\n display: flex;\n align-items: center;\n gap: 24px;\n flex: 0 0 ${HEADER_HEIGHT}px;\n height: ${HEADER_HEIGHT}px;\n line-height: ${HEADER_HEIGHT}px;\n padding: 0 ${HISD3_LAYOUT.pageGutter}px;\n position: sticky;\n top: 0;\n z-index: 100;\n background: var(--ant-color-bg-layout);\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .ant-menu-horizontal {\n flex: 1 1 auto;\n min-width: 0;\n border-bottom: none;\n background: transparent;\n line-height: ${HEADER_HEIGHT - 2}px;\n font-size: 14px;\n font-weight: 500;\n }\n`;\n\nexport const StyledSiderHeader = styled(Header)`\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 0 0 ${HEADER_HEIGHT}px;\n height: ${HEADER_HEIGHT}px;\n line-height: ${HEADER_HEIGHT}px;\n padding: 0 ${HISD3_LAYOUT.pageGutter}px;\n position: sticky;\n top: 0;\n z-index: 99;\n background: var(--ant-color-bg-layout);\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n`;\n\nexport const StyledCollapseTrigger = styled.button`\n border: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: transparent;\n cursor: pointer;\n font-size: 14px;\n width: 32px;\n height: 32px;\n color: inherit;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n\n &:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n`;\n\n/**\n * Circular collapse trigger that straddles the sidebar's right edge.\n * `$top` is the distance from the top of the shell to its centre; it defaults\n * to the middle of the top bar so it lines up with the brand block.\n */\nexport const StyledEdgeTrigger = styled.button<{\n $left: number;\n $top: number;\n}>`\n user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: ${({ $top }) => $top}px;\n left: ${({ $left }) => $left}px;\n transform: translate(-50%, -50%);\n z-index: 30;\n width: 28px;\n height: 28px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: var(--hisd3-edge-trigger-color, #fff);\n background: var(--hisd3-edge-trigger-bg, var(--ant-color-primary));\n border: 2px solid var(--ant-color-bg-layout, #f3f2f0);\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 1px 3px rgba(16, 15, 14, 0.12),\n 0 4px 12px rgba(16, 15, 14, 0.14);\n transition: left 0.2s ease, filter 0.15s ease;\n\n &:hover {\n filter: brightness(1.08);\n }\n\n &:active {\n filter: brightness(0.94);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ant-color-primary);\n outline-offset: 2px;\n }\n\n & svg {\n display: block;\n }\n`;\n\nexport const StyledContent = styled(Content)`\n flex: 1 0 auto;\n padding: 24px ${HISD3_LAYOUT.pageGutter}px 40px;\n`;\n\n/* ---------- account card (sider footer / header) ---------- */\n\nexport const StyledCrUserInfo = styled.div<{\n $collapsed?: boolean;\n $inHeader?: boolean;\n}>`\n flex: 0 0 auto;\n display: flex;\n flex-direction: column;\n justify-content: center;\n line-height: 1.25;\n transition: all 0.2s ease;\n padding: ${({ $inHeader, $collapsed }) =>\n $inHeader ? \"0 4px\" : $collapsed ? \"12px 0\" : `12px ${HISD3_LAYOUT.pageGutter}px`};\n min-width: ${({ $inHeader }) => ($inHeader ? \"220px\" : \"0\")};\n border-top: ${({ $inHeader }) =>\n $inHeader ? \"none\" : \"var(--hisd3-rule-width, 1px) solid var(--ant-color-border)\"};\n\n & .ant-dropdown-link {\n color: inherit;\n }\n`;\n\nexport const StyledCrUserInfoInner = styled.a`\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n color: inherit;\n gap: 10px;\n`;\n\nexport const StyledCrUserInfoAvatar = styled.span<{ $src?: string }>`\n width: 34px;\n height: 34px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 13px;\n font-weight: 700;\n color: var(--ant-color-text);\n background: ${({ $src }) =>\n $src ? `center / cover no-repeat url(\"${$src}\")` : \"#D9D6D2\"};\n`;\n\nexport const StyledCrUserInfoContent = styled.span`\n flex: 1 1 auto;\n min-width: 0;\n`;\n\nexport const StyledUsernameInfo = styled.span`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 8px;\n`;\n\nexport const StyledUsername = styled.h3`\n margin: 0;\n font-family: var(--font-body);\n font-size: 14px;\n font-weight: 700;\n letter-spacing: 0;\n color: var(--ant-color-text);\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n`;\n\nexport const StyledUserArrow = styled.span`\n width: 20px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n color: var(--ant-color-text);\n\n & svg {\n display: block;\n }\n`;\n\nexport const StyledCrUserDesignation = styled.span`\n display: block;\n margin-top: 3px;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n","import type { MenuProps } from \"antd\";\nimport { createElement, type ReactNode } from \"react\";\n\nexport type AntdMenuItem = Required<MenuProps>[\"items\"][number];\n\n/**\n * Menu item shape accepted by HISD3Sidebar.\n *\n * This intentionally mirrors the `MenuDataItem` shape that the previous\n * ProLayout-based sidebar consumed (`path`, `name`, `icon`, `children`,\n * `hideInMenu`), so existing apps keep passing the same `menuItems`.\n */\nexport interface HISD3MenuItem {\n key?: string;\n path?: string;\n name?: ReactNode;\n icon?: ReactNode;\n children?: HISD3MenuItem[];\n hideInMenu?: boolean;\n disabled?: boolean;\n /** When true the item is rendered as a group title (like ProLayout's `flatMenu`). */\n group?: boolean;\n [key: string]: unknown;\n}\n\nexport const itemKey = (item: HISD3MenuItem, index: number): string =>\n item.key ?? item.path ?? `menu-${index}`;\n\n/** Convert HISD3MenuItem[] to antd `Menu` items, rendering leaf items as anchors. */\nexport const toAntdMenuItems = (\n items: HISD3MenuItem[] | undefined,\n renderLink: (item: HISD3MenuItem, label: ReactNode) => ReactNode,\n): AntdMenuItem[] =>\n (items ?? [])\n .filter((item) => item && !item.hideInMenu)\n .map((item, index): AntdMenuItem => {\n const key = itemKey(item, index);\n const hasChildren = Array.isArray(item.children) && item.children.length > 0;\n\n if (hasChildren) {\n return {\n key,\n icon: item.icon,\n label: item.name,\n disabled: item.disabled,\n type: item.group ? \"group\" : undefined,\n children: toAntdMenuItems(item.children, renderLink),\n } as AntdMenuItem;\n }\n\n return {\n key,\n icon: item.icon,\n disabled: item.disabled,\n label: renderLink(item, item.name),\n } as AntdMenuItem;\n });\n\n/**\n * Find the key of the item whose `path` best matches `pathname`\n * (longest prefix wins) together with the keys of all its ancestors,\n * so the correct submenu can be opened.\n */\nexport const findSelection = (\n items: HISD3MenuItem[] | undefined,\n pathname: string,\n): { selectedKey?: string; openKeys: string[] } => {\n let best: { key: string; parents: string[]; length: number } | undefined;\n\n const walk = (list: HISD3MenuItem[] | undefined, parents: string[]) => {\n (list ?? []).forEach((item, index) => {\n const key = itemKey(item, index);\n if (item.path && pathname.startsWith(item.path)) {\n const exact = pathname === item.path;\n const length = item.path.length + (exact ? 1 : 0);\n if (!best || length > best.length) {\n best = { key, parents, length };\n }\n }\n if (item.children?.length) {\n walk(item.children, [...parents, key]);\n }\n });\n };\n\n walk(items, []);\n return { selectedKey: best?.key, openKeys: best?.parents ?? [] };\n};\n\n/** Default anchor renderer used when no `renderMenuLink` is supplied. */\nexport const defaultRenderLink = (item: HISD3MenuItem, label: ReactNode) =>\n createElement(\"a\", { href: item.path || \"/\" }, label);\n","import {\n DownOutlined,\n ExclamationCircleOutlined,\n LogoutOutlined,\n SettingOutlined,\n} from \"@ant-design/icons\";\nimport { App, Dropdown, type MenuProps } from \"antd\";\nimport React from \"react\";\n\nimport type { IUserEmployee } from \"../../types/account\";\nimport {\n StyledCrUserDesignation,\n StyledCrUserInfo,\n StyledCrUserInfoAvatar,\n StyledCrUserInfoContent,\n StyledCrUserInfoInner,\n StyledUserArrow,\n StyledUsername,\n StyledUsernameInfo,\n} from \"./index.styled\";\n\nexport interface UserMenuProps {\n account: IUserEmployee;\n avatarSrc?: string;\n settingsUrl?: string;\n onLogout: () => Promise<void> | void;\n collapsed?: boolean;\n /** \"topRight\" for the sider footer, \"bottomRight\" for the top header. */\n placement?: \"topRight\" | \"bottomRight\";\n extraItems?: MenuProps[\"items\"];\n}\n\n/**\n * Account dropdown (Settings / Logout) shown in the sider footer or header.\n * Uses `App.useApp()` so the confirm modal picks up the surrounding\n * ConfigProvider theme — the static `Modal.confirm` cannot in antd v6.\n */\nexport const UserMenu: React.FC<UserMenuProps> = ({\n account,\n avatarSrc,\n settingsUrl,\n onLogout,\n collapsed = false,\n placement = \"topRight\",\n extraItems = [],\n}) => {\n const { modal } = App.useApp();\n\n const confirmLogout = () => {\n modal.confirm({\n title: \"Are you sure you want to logout?\",\n content: \"Please click OK to continue\",\n icon: <ExclamationCircleOutlined />,\n onOk: onLogout,\n });\n };\n\n const items: MenuProps[\"items\"] = [\n ...(extraItems ?? []),\n {\n key: \"settings\",\n icon: <SettingOutlined />,\n label: \"Settings\",\n onClick: () => {\n window.location.href = settingsUrl ?? \"/settings\";\n },\n },\n {\n key: \"logout\",\n icon: <LogoutOutlined />,\n label: \"Logout\",\n onClick: confirmLogout,\n },\n ];\n\n const initials =\n (account.fullName || \"\")\n .replace(/\\(.*?\\)/g, \" \")\n .split(/[\\s,]+/)\n .map((w) => w.replace(/[^\\p{L}\\p{N}]/gu, \"\"))\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0].toUpperCase())\n .join(\"\") || \"?\";\n\n return (\n <StyledCrUserInfo\n className=\"cr-user-info-light\"\n $collapsed={collapsed}\n $inHeader={placement === \"bottomRight\"}\n >\n <Dropdown trigger={[\"click\"]} placement={placement} menu={{ items }}>\n <StyledCrUserInfoInner\n className=\"ant-dropdown-link\"\n onClick={(e) => e.preventDefault()}\n >\n <StyledCrUserInfoAvatar $src={avatarSrc} aria-hidden>\n {!avatarSrc && initials}\n </StyledCrUserInfoAvatar>\n {!collapsed && (\n <StyledCrUserInfoContent>\n <StyledUsernameInfo>\n <StyledUsername title={account.fullName}>\n {account.fullName}\n </StyledUsername>\n <StyledUserArrow>\n <DownOutlined />\n </StyledUserArrow>\n </StyledUsernameInfo>\n {account.positionType && (\n <StyledCrUserDesignation title={account.positionType}>\n {account.positionType}\n </StyledCrUserDesignation>\n )}\n </StyledCrUserInfoContent>\n )}\n </StyledCrUserInfoInner>\n </Dropdown>\n </StyledCrUserInfo>\n );\n};\n\nexport default UserMenu;\n","import {\n LeftOutlined,\n MenuFoldOutlined,\n MenuUnfoldOutlined,\n RightOutlined,\n} from \"@ant-design/icons\";\nimport {\n App as AntdApp,\n ConfigProvider,\n Layout,\n Menu,\n Spin,\n type MenuProps,\n type ThemeConfig,\n} from \"antd\";\nimport React, { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { ThemeProvider } from \"styled-components\";\n\nimport { hisd3AntdTheme } from \"../../theme/antd\";\nimport { useInsideHISD3Provider } from \"../Provider\";\nimport type { IUserEmployee } from \"../../types/account\";\nimport type { StyledTheme } from \"../../types/theme\";\nimport {\n HEADER_HEIGHT,\n SIDER_COLLAPSED_WIDTH,\n SIDER_WIDTH,\n StyledBrand,\n StyledCollapseTrigger,\n StyledContent,\n StyledEdgeTrigger,\n StyledHeader,\n StyledRoot,\n StyledMain,\n StyledSiderHeader,\n StyledSiderMenuWrap,\n} from \"./index.styled\";\nimport {\n defaultRenderLink,\n findSelection,\n toAntdMenuItems,\n type HISD3MenuItem,\n} from \"./menu\";\nimport { UserMenu } from \"./UserMenu\";\n\nconst { Sider } = Layout;\n\nexport interface HISD3SidebarProps {\n account: IUserEmployee;\n /** Logo image URL. When omitted a square block in the primary color is shown. */\n logoUrl?: string;\n appName: string;\n /** Same shape as before (ProLayout `MenuDataItem`): `{ path, name, icon, children }`. */\n menuItems: HISD3MenuItem[];\n onLogout: () => Promise<void> | void;\n /** Current location pathname, used to highlight the active menu item. */\n pathname: string;\n /** styled-components theme; optional when inside HISD3Provider. */\n styledTheme?: StyledTheme;\n collapsed?: boolean;\n /** Called when the user toggles the sider (controlled usage). */\n onCollapse?: (collapsed: boolean) => void;\n loading?: boolean;\n hideSidebar?: boolean;\n /** Render the navigation as a top header bar instead of a left sider. */\n layoutTop?: boolean;\n avatarSrc?: string;\n settingsUrl?: string;\n /**\n * Ant Design theme applied via a nested `ConfigProvider`.\n * Defaults to `hisd3AntdTheme` (red) when used standalone. Inside an\n * `HISD3Provider` nothing is applied so the provider's primary is inherited.\n * Pass `null` to force inheritance, or a ThemeConfig to override.\n */\n antdTheme?: ThemeConfig | null;\n /**\n * Custom link renderer, e.g. to use react-router's `<Link>`:\n * `(item, label) => <Link to={item.path!}>{label}</Link>`\n */\n renderMenuLink?: (item: HISD3MenuItem, label: ReactNode) => ReactNode;\n /** Extra content rendered in the header, right side (top layout) or sider header (side layout). */\n headerExtra?: ReactNode;\n /** Extra items prepended to the account dropdown. */\n userMenuItems?: MenuProps[\"items\"];\n /**\n * Where the collapse control lives:\n * \"edge\" (default) floats a round chevron on the sidebar's right edge, so it\n * works even when the top bar is hidden; \"header\" puts a square button in the\n * shell's own top bar; \"none\" renders neither (supply your own).\n */\n collapseTrigger?: \"edge\" | \"header\" | \"none\";\n /** @deprecated use `collapseTrigger=\"none\"`. */\n hideCollapseTrigger?: boolean;\n /**\n * Distance in px from the top of the shell to the centre of the edge\n * trigger. Defaults to the middle of the top bar, so it lines up with the\n * brand block; pass a larger number to move it down.\n */\n collapseTriggerOffset?: number;\n /** Width in px of the expanded sider. Default 220. */\n siderWidth?: number;\n /** Disable the built-in content padding wrapper and render children directly. */\n bareContent?: boolean;\n /**\n * Hide the sider layout's own top bar (collapse trigger + headerExtra).\n * Use together with `HISD3PageHeader`, which renders its own top bar.\n */\n hideHeaderBar?: boolean;\n /** Where the brand block links to. Default \"/\". */\n brandHref?: string;\n /**\n * App-shell scrolling (default). The shell fills exactly one viewport and\n * the content column scrolls inside it, so the page header stays pinned and\n * the document cannot rubber-band (\"bounce\") at the top or bottom.\n * Set to `false` to scroll the window instead, as in 4.1 and earlier.\n */\n scrollContent?: boolean;\n /**\n * Hide the account card in the sider footer / top nav — use when the account\n * lives in the header instead (`HISD3AvatarMenu`).\n */\n hideAccountCard?: boolean;\n children: React.ReactNode;\n}\n\nexport const HISD3Sidebar: React.FC<HISD3SidebarProps> = ({\n children,\n account,\n logoUrl,\n appName,\n menuItems,\n onLogout,\n pathname,\n avatarSrc,\n styledTheme,\n settingsUrl,\n antdTheme,\n renderMenuLink = defaultRenderLink,\n headerExtra,\n userMenuItems,\n onCollapse,\n collapsed = false,\n loading = false,\n hideSidebar = false,\n layoutTop = false,\n hideCollapseTrigger = false,\n collapseTrigger = \"edge\",\n collapseTriggerOffset = Math.round(HEADER_HEIGHT / 2),\n siderWidth = SIDER_WIDTH,\n bareContent = false,\n hideHeaderBar = false,\n brandHref = \"/\",\n hideAccountCard = false,\n scrollContent = true,\n}) => {\n const insideProvider = useInsideHISD3Provider();\n const resolvedTheme =\n antdTheme === undefined ? (insideProvider ? null : hisd3AntdTheme) : antdTheme;\n const [isCollapsed, setIsCollapsed] = useState(collapsed);\n\n useEffect(() => {\n setIsCollapsed(collapsed);\n }, [collapsed]);\n\n const items = useMemo(\n () => toAntdMenuItems(menuItems, renderMenuLink),\n [menuItems, renderMenuLink],\n );\n\n const selection = useMemo(\n () => findSelection(menuItems, pathname),\n [menuItems, pathname],\n );\n\n // Start with the active route's submenu open so there is no flash on first paint.\n const [openKeys, setOpenKeys] = useState<string[]>(() => selection.openKeys);\n\n // Open the submenu that contains the active route whenever the route changes.\n useEffect(() => {\n setOpenKeys((prev) =>\n Array.from(new Set([...prev, ...selection.openKeys])),\n );\n }, [selection.openKeys.join(\"|\")]);\n\n const toggleCollapse = (next: boolean) => {\n setIsCollapsed(next);\n onCollapse?.(next);\n };\n\n const selectedKeys = selection.selectedKey ? [selection.selectedKey] : [];\n\n const trigger = hideCollapseTrigger ? \"none\" : collapseTrigger;\n const collapseLabel = isCollapsed ? \"Expand menu\" : \"Collapse menu\";\n\n const brand = (\n <StyledBrand href={brandHref} $collapsed={!layoutTop && isCollapsed}>\n {logoUrl ? (\n <img src={logoUrl} alt={appName} />\n ) : (\n <span className=\"hisd3-brand-mark\" aria-hidden />\n )}\n {(layoutTop || !isCollapsed) && <h1>{appName}</h1>}\n </StyledBrand>\n );\n\n const content = bareContent ? (\n children\n ) : (\n <StyledContent>{children}</StyledContent>\n );\n\n const renderBody = () => {\n if (hideSidebar) {\n return <>{children}</>;\n }\n\n if (layoutTop) {\n return (\n <StyledRoot $appShell={scrollContent}>\n <StyledHeader>\n {brand}\n <Menu\n mode=\"horizontal\"\n items={items}\n selectedKeys={selectedKeys}\n />\n {headerExtra}\n {!hideAccountCard && (\n <UserMenu\n account={account}\n avatarSrc={avatarSrc}\n settingsUrl={settingsUrl}\n onLogout={onLogout}\n placement=\"bottomRight\"\n extraItems={userMenuItems}\n />\n )}\n </StyledHeader>\n <StyledMain $scroll={scrollContent}>{content}</StyledMain>\n </StyledRoot>\n );\n }\n\n return (\n <StyledRoot hasSider $appShell={scrollContent}>\n <Sider\n className=\"hisd3-sider\"\n width={siderWidth}\n collapsedWidth={SIDER_COLLAPSED_WIDTH}\n collapsible\n collapsed={isCollapsed}\n trigger={null}\n theme=\"light\"\n breakpoint=\"lg\"\n onBreakpoint={(broken) => {\n if (broken) toggleCollapse(true);\n }}\n >\n {brand}\n <StyledSiderMenuWrap className={isCollapsed ? \"hisd3-collapsed\" : undefined}>\n <Menu\n mode=\"inline\"\n theme=\"light\"\n inlineCollapsed={isCollapsed}\n items={items}\n selectedKeys={selectedKeys}\n openKeys={isCollapsed ? undefined : openKeys}\n onOpenChange={(keys) => setOpenKeys(keys as string[])}\n />\n </StyledSiderMenuWrap>\n {!hideAccountCard && (\n <UserMenu\n account={account}\n avatarSrc={avatarSrc}\n settingsUrl={settingsUrl}\n onLogout={onLogout}\n collapsed={isCollapsed}\n placement=\"topRight\"\n extraItems={userMenuItems}\n />\n )}\n </Sider>\n\n <StyledMain $scroll={scrollContent}>\n {!hideHeaderBar && (\n <StyledSiderHeader>\n {trigger === \"header\" && (\n <StyledCollapseTrigger\n type=\"button\"\n aria-label={collapseLabel}\n onClick={() => toggleCollapse(!isCollapsed)}\n >\n {isCollapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}\n </StyledCollapseTrigger>\n )}\n <span style={{ flex: 1 }} />\n {headerExtra}\n </StyledSiderHeader>\n )}\n {content}\n </StyledMain>\n\n {trigger === \"edge\" && (\n <StyledEdgeTrigger\n type=\"button\"\n aria-label={collapseLabel}\n title={collapseLabel}\n $left={isCollapsed ? SIDER_COLLAPSED_WIDTH : siderWidth}\n $top={collapseTriggerOffset}\n onClick={() => toggleCollapse(!isCollapsed)}\n >\n {isCollapsed ? <RightOutlined /> : <LeftOutlined />}\n </StyledEdgeTrigger>\n )}\n </StyledRoot>\n );\n };\n\n if (typeof document === \"undefined\") {\n return null;\n }\n\n const body = (\n <AntdApp component={false}>\n <Spin spinning={loading} size=\"large\">\n {renderBody()}\n </Spin>\n </AntdApp>\n );\n\n if (insideProvider && !styledTheme) {\n return resolvedTheme ? (\n <ConfigProvider theme={resolvedTheme}>{body}</ConfigProvider>\n ) : (\n body\n );\n }\n\n return (\n <ThemeProvider theme={styledTheme ?? {}}>\n {resolvedTheme ? (\n <ConfigProvider theme={resolvedTheme}>{body}</ConfigProvider>\n ) : (\n body\n )}\n </ThemeProvider>\n );\n};\n\nexport default HISD3Sidebar;\n","import { Breadcrumb } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport { HISD3_LAYOUT } from \"../../theme/layout\";\n\nexport interface HISD3BreadcrumbItem {\n title: React.ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface HISD3PageHeaderProps {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n breadcrumb?: HISD3BreadcrumbItem[];\n /** Action buttons rendered on the right of the top bar. */\n extra?: React.ReactNode;\n /** Content rendered to the left of the breadcrumb (e.g. the sidebar collapse trigger). */\n leading?: React.ReactNode;\n /** Hide the top bar entirely and render only the title block. */\n hideTopBar?: boolean;\n className?: string;\n}\n\nexport const PAGE_GUTTER = HISD3_LAYOUT.pageGutter;\n\n/*\n * `display: contents` so TopBar and TitleBlock become direct children of the\n * scrolling column — a sticky child cannot outlive its own wrapper's box, so\n * without this the bar scrolls away with the header element.\n */\nconst HeaderWrap = styled.header`\n display: contents;\n`;\n\nconst TopBar = styled.div`\n user-select: none;\n -webkit-user-select: none;\n display: flex;\n align-items: center;\n gap: 16px;\n height: ${HISD3_LAYOUT.topBarHeight}px; /* same as the sidebar brand block */\n /* never shrink: these are flex items of the scrolling column */\n flex: 0 0 ${HISD3_LAYOUT.topBarHeight}px;\n padding: 0 ${PAGE_GUTTER}px;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: var(--ant-color-bg-layout);\n position: sticky;\n top: 0;\n z-index: 20;\n\n .ant-breadcrumb {\n font-size: 14px;\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .ant-breadcrumb ol {\n flex-wrap: nowrap;\n }\n`;\n\nconst Actions = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 0 0 auto;\n`;\n\nconst TitleBlock = styled.div`\n display: flex;\n align-items: baseline;\n gap: 16px;\n flex-wrap: wrap;\n flex: 0 0 auto;\n padding: 20px ${PAGE_GUTTER}px 18px;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n\n h1 {\n margin: 0;\n font-family: var(--font-heading);\n font-size: 32px;\n line-height: 1.1;\n font-weight: var(--font-weight-heading, 800);\n letter-spacing: -0.02em;\n color: var(--ant-color-text);\n }\n\n p {\n margin: 0;\n font-size: 15px;\n color: var(--ant-color-text-secondary);\n }\n`;\n\n/** Padded body area that lines up with the header gutters. */\nexport const HISD3PageBody = styled.div`\n flex: 1 0 auto;\n padding: 24px ${PAGE_GUTTER}px 40px;\n`;\n\n/**\n * Sticky top bar (breadcrumb + actions) followed by a big page title block.\n * Designed to sit directly inside `HISD3Sidebar` with `bareContent` and\n * `hideHeaderBar`.\n */\nexport const HISD3PageHeader: React.FC<HISD3PageHeaderProps> = ({\n title,\n subtitle,\n breadcrumb,\n extra,\n leading,\n hideTopBar = false,\n className,\n}) => (\n <HeaderWrap className={className}>\n {!hideTopBar && (\n <TopBar>\n {leading}\n {breadcrumb && breadcrumb.length > 0 && (\n <Breadcrumb\n items={breadcrumb.map((b) => ({\n title: b.href ? <a href={b.href}>{b.title}</a> : b.title,\n onClick: b.onClick,\n }))}\n />\n )}\n {!breadcrumb?.length && <span style={{ flex: 1 }} />}\n {extra && <Actions>{extra}</Actions>}\n </TopBar>\n )}\n <TitleBlock>\n <h1>{title}</h1>\n {subtitle && <p>{subtitle}</p>}\n </TitleBlock>\n </HeaderWrap>\n);\n\nexport default HISD3PageHeader;\n","import { BellFilled } from \"@ant-design/icons\";\nimport { Dropdown, Empty, Spin } from \"antd\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nexport interface HISD3Notification {\n id: string;\n title: React.ReactNode;\n /** Secondary line, e.g. \"Folio 19370 was posted\". */\n description?: React.ReactNode;\n /** Right-aligned relative time, e.g. \"2h\". */\n time?: React.ReactNode;\n /** Unread items get a tinted row and a dot. */\n unread?: boolean;\n /** Leading avatar image; falls back to `icon`. */\n avatarSrc?: string;\n icon?: React.ReactNode;\n onClick?: (notification: HISD3Notification) => void;\n}\n\nexport interface HISD3NotificationButtonProps {\n items?: HISD3Notification[];\n /** Diameter of the circular button in px. Default 40. */\n size?: number;\n /** Badge count. Defaults to the number of unread items. */\n count?: number;\n loading?: boolean;\n title?: React.ReactNode;\n /** Shown as a link in the panel header when there are unread items. */\n onMarkAllRead?: () => void;\n /** Renders a footer row, e.g. \"See all notifications\". */\n onSeeAll?: () => void;\n seeAllLabel?: React.ReactNode;\n emptyText?: React.ReactNode;\n onOpenChange?: (open: boolean) => void;\n /** Replace the bell glyph. Defaults to a solid bell. */\n icon?: React.ReactNode;\n className?: string;\n}\n\nexport const HeaderIconButton = styled.button<{ $size?: number; $open?: boolean }>`\n user-select: none;\n -webkit-user-select: none;\n position: relative;\n width: ${({ $size = 40 }) => $size}px;\n height: ${({ $size = 40 }) => $size}px;\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-size: ${({ $size = 40 }) => Math.round($size * 0.54)}px;\n line-height: 1;\n color: var(--ant-color-text);\n background: var(--hisd3-control-bg, #e6e4e1);\n border: 0;\n border-radius: 50%;\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n\n &:hover {\n background: var(--hisd3-control-bg-hover, #dbd8d4);\n }\n\n /* open state: tinted with the app's primary, like Facebook's blue */\n ${({ $open }) =>\n $open\n ? `\n background: var(--ant-color-primary-bg);\n color: var(--ant-color-primary);\n &:hover { background: var(--ant-color-primary-bg-hover); }\n `\n : \"\"}\n\n &:focus-visible {\n outline: 2px solid var(--ant-color-primary);\n outline-offset: 2px;\n }\n\n & > .anticon {\n line-height: 0;\n /* the stock bell is narrow; widen it a touch for a fuller silhouette */\n transform: scaleX(var(--hisd3-bell-stretch, 1.12));\n }\n`;\n\n/** Count pill on the circle's top-right edge, ringed in the page background. */\nconst CountBadge = styled.span<{ $size: number }>`\n position: absolute;\n top: ${({ $size }) => -Math.round($size * 0.05)}px;\n right: ${({ $size }) => -Math.round($size * 0.05)}px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n background: var(--ant-color-error, #e5401c);\n border: 2px solid var(--ant-color-bg-layout, #f3f2f0);\n border-radius: 999px;\n pointer-events: none;\n`;\n\nconst Panel = styled.div`\n width: 360px;\n max-width: calc(100vw - 32px);\n overflow: hidden;\n background: var(--ant-color-bg-elevated);\n border: 1px solid var(--ant-color-border-secondary);\n border-radius: var(--hisd3-popup-radius, 10px);\n box-shadow: 0 2px 6px rgba(16, 15, 14, 0.06),\n 0 12px 32px rgba(16, 15, 14, 0.14);\n`;\n\nconst PanelHeader = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 16px;\n border-bottom: 1px solid var(--ant-color-border-secondary);\n\n h4 {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n letter-spacing: 0;\n }\n\n button {\n border: 0;\n background: none;\n padding: 0;\n font: inherit;\n font-size: 13px;\n color: var(--ant-color-primary);\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\nconst List = styled.div`\n max-height: 380px;\n overflow-y: auto;\n`;\n\nconst Row = styled.button<{ $unread?: boolean }>`\n display: flex;\n align-items: flex-start;\n gap: 12px;\n width: 100%;\n padding: 12px 16px;\n text-align: left;\n font: inherit;\n border: 0;\n cursor: pointer;\n background: ${({ $unread }) =>\n $unread ? \"var(--ant-color-primary-bg)\" : \"transparent\"};\n\n &:hover {\n background: ${({ $unread }) =>\n $unread ? \"var(--ant-color-primary-bg-hover)\" : \"rgba(0,0,0,0.04)\"};\n }\n`;\n\nconst RowIcon = styled.span<{ $src?: string }>`\n width: 36px;\n height: 36px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--ant-color-text);\n border-radius: 50%;\n background: ${({ $src }) =>\n $src ? `center / cover no-repeat url(\"${$src}\")` : \"rgba(0,0,0,0.06)\"};\n`;\n\nconst RowBody = styled.span`\n flex: 1 1 auto;\n min-width: 0;\n\n strong {\n display: block;\n font-size: 14px;\n font-weight: 600;\n color: var(--ant-color-text);\n }\n\n span {\n display: block;\n font-size: 13px;\n color: var(--ant-color-text-secondary);\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n time {\n display: block;\n margin-top: 2px;\n font-size: 12px;\n color: var(--ant-color-text-tertiary);\n }\n`;\n\nconst UnreadDot = styled.span`\n width: 8px;\n height: 8px;\n margin-top: 6px;\n flex: 0 0 auto;\n border-radius: 50%;\n background: var(--ant-color-primary);\n`;\n\nconst PanelFooter = styled.button`\n display: block;\n width: 100%;\n padding: 12px 16px;\n font: inherit;\n font-size: 13px;\n font-weight: 600;\n color: var(--ant-color-primary);\n text-align: center;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--ant-color-border-secondary);\n cursor: pointer;\n\n &:hover {\n background: rgba(0, 0, 0, 0.04);\n }\n`;\n\nconst EmptyWrap = styled.div`\n padding: 28px 16px;\n`;\n\n/** Bell button with an unread badge and a Facebook-style notifications panel. */\nexport const HISD3NotificationButton: React.FC<HISD3NotificationButtonProps> = ({\n items = [],\n count,\n loading = false,\n title = \"Notifications\",\n onMarkAllRead,\n onSeeAll,\n seeAllLabel = \"See all notifications\",\n emptyText = \"You're all caught up\",\n onOpenChange,\n size = 40,\n icon,\n className,\n}) => {\n const [open, setOpen] = useState(false);\n const unread = count ?? items.filter((i) => i.unread).length;\n\n const panel = (\n <Panel>\n <PanelHeader>\n <h4>{title}</h4>\n {onMarkAllRead && unread > 0 && (\n <button type=\"button\" onClick={onMarkAllRead}>\n Mark all as read\n </button>\n )}\n </PanelHeader>\n\n {loading ? (\n <EmptyWrap style={{ textAlign: \"center\" }}>\n <Spin />\n </EmptyWrap>\n ) : items.length === 0 ? (\n <EmptyWrap>\n <Empty\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n description={emptyText}\n />\n </EmptyWrap>\n ) : (\n <List>\n {items.map((item) => (\n <Row\n key={item.id}\n type=\"button\"\n $unread={item.unread}\n onClick={() => {\n item.onClick?.(item);\n setOpen(false);\n onOpenChange?.(false);\n }}\n >\n <RowIcon $src={item.avatarSrc}>\n {!item.avatarSrc && (item.icon ?? <BellFilled />)}\n </RowIcon>\n <RowBody>\n <strong>{item.title}</strong>\n {item.description && <span>{item.description}</span>}\n {item.time && <time>{item.time}</time>}\n </RowBody>\n {item.unread && <UnreadDot />}\n </Row>\n ))}\n </List>\n )}\n\n {onSeeAll && (\n <PanelFooter\n type=\"button\"\n onClick={() => {\n onSeeAll();\n setOpen(false);\n onOpenChange?.(false);\n }}\n >\n {seeAllLabel}\n </PanelFooter>\n )}\n </Panel>\n );\n\n return (\n <Dropdown\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n onOpenChange?.(next);\n }}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n popupRender={() => panel}\n >\n <HeaderIconButton\n type=\"button\"\n $size={size}\n $open={open}\n className={className}\n aria-label={`${title}${unread ? ` (${unread} unread)` : \"\"}`}\n >\n {icon ?? <BellFilled />}\n {unread > 0 && (\n <CountBadge $size={size}>{unread > 99 ? \"99+\" : unread}</CountBadge>\n )}\n </HeaderIconButton>\n </Dropdown>\n );\n};\n\nexport default HISD3NotificationButton;\n","import {\n DownOutlined,\n ExclamationCircleOutlined,\n LogoutOutlined,\n SettingOutlined,\n} from \"@ant-design/icons\";\nimport { App, Dropdown, type MenuProps } from \"antd\";\nimport React, { useState } from \"react\";\nimport styled from \"styled-components\";\n\nimport type { IUserEmployee } from \"../../types/account\";\n\nexport interface HISD3AvatarMenuProps {\n account: IUserEmployee;\n avatarSrc?: string;\n /** Settings entry target. Pass `null` to hide the Settings entry. */\n settingsUrl?: string | null;\n onSettings?: () => void;\n onLogout: () => Promise<void> | void;\n /** Ask for confirmation before logging out. Default true. */\n confirmLogout?: boolean;\n /** Extra entries above Settings / Logout. */\n extraItems?: MenuProps[\"items\"];\n /** Circle (Facebook-style) or square to match the rest of the design. */\n shape?: \"circle\" | \"square\";\n /** Diameter in px. Default 40. */\n size?: number;\n /** Hide the small chevron badge on the avatar. */\n hideChevron?: boolean;\n className?: string;\n}\n\nconst Trigger = styled.button<{\n $shape: \"circle\" | \"square\";\n $size: number;\n $open?: boolean;\n}>`\n user-select: none;\n -webkit-user-select: none;\n position: relative;\n width: ${({ $size }) => $size}px;\n height: ${({ $size }) => $size}px;\n flex: 0 0 auto;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: ${({ $size }) => Math.round($size * 0.36)}px;\n font-weight: 700;\n color: var(--ant-color-text);\n background: var(--hisd3-control-bg, #e6e4e1);\n border: 0;\n border-radius: ${({ $shape }) => ($shape === \"circle\" ? \"50%\" : \"0\")};\n cursor: pointer;\n transition: filter 0.15s ease;\n\n &:hover {\n filter: brightness(0.94);\n }\n\n &:focus-visible {\n outline: 2px solid var(--ant-color-primary);\n outline-offset: 2px;\n }\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n border-radius: inherit;\n }\n`;\n\n/** Small chevron badge pinned to the bottom-right of the avatar. */\nconst Chevron = styled.span<{ $size: number; $open?: boolean }>`\n position: absolute;\n right: ${({ $size }) => -Math.round($size * 0.05)}px;\n bottom: ${({ $size }) => -Math.round($size * 0.05)}px;\n width: ${({ $size }) => Math.round($size * 0.45)}px;\n height: ${({ $size }) => Math.round($size * 0.45)}px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: ${({ $size }) => Math.round($size * 0.2)}px;\n color: var(--ant-color-text);\n background: var(--hisd3-control-bg, #e6e4e1);\n border: 2px solid var(--ant-color-bg-layout, #f3f2f0);\n border-radius: 50%;\n pointer-events: none;\n\n ${({ $open }) =>\n $open\n ? `\n background: var(--ant-color-primary);\n color: #fff;\n `\n : \"\"}\n\n & svg {\n display: block;\n }\n`;\n\nconst Identity = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n min-width: 230px;\n border-bottom: 1px solid var(--ant-color-border-secondary);\n\n .hisd3-identity-text {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .hisd3-identity-name {\n display: block;\n font-size: 14px;\n font-weight: 700;\n color: var(--ant-color-text);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .hisd3-identity-role {\n display: block;\n margin-top: 2px;\n font-size: 11px;\n font-weight: 500;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nconst IdentityAvatar = styled.span<{ $src?: string }>`\n width: 40px;\n height: 40px;\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 700;\n border-radius: 50%;\n background: ${({ $src }) =>\n $src ? `center / cover no-repeat url(\"${$src}\")` : \"rgba(0,0,0,0.08)\"};\n`;\n\nconst Panel = styled.div`\n overflow: hidden;\n background: var(--ant-color-bg-elevated);\n border: 1px solid var(--ant-color-border-secondary);\n border-radius: var(--hisd3-popup-radius, 10px);\n box-shadow: 0 2px 6px rgba(16, 15, 14, 0.06),\n 0 12px 32px rgba(16, 15, 14, 0.14);\n\n .ant-menu {\n border-inline-end: none !important;\n background: transparent;\n }\n\n .ant-menu {\n padding: 6px;\n }\n\n .ant-menu-item {\n margin: 0;\n width: 100%;\n border-radius: 8px;\n font-size: 14px;\n }\n`;\n\nexport const getInitials = (fullName?: string): string =>\n (fullName || \"\")\n .replace(/\\(.*?\\)/g, \" \")\n .split(/[\\s,]+/)\n .map((w) => w.replace(/[^\\p{L}\\p{N}]/gu, \"\"))\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0].toUpperCase())\n .join(\"\") || \"?\";\n\n/**\n * Circular avatar button for the top-right of the header. Clicking it opens a\n * menu showing who is signed in, plus Settings and Logout (with a confirm\n * dialog by default).\n */\nexport const HISD3AvatarMenu: React.FC<HISD3AvatarMenuProps> = ({\n account,\n avatarSrc,\n settingsUrl = \"/settings\",\n onSettings,\n onLogout,\n confirmLogout = true,\n extraItems,\n shape = \"circle\",\n size = 40,\n hideChevron = false,\n className,\n}) => {\n const { modal } = App.useApp();\n const [open, setOpen] = useState(false);\n\n const handleLogout = () => {\n if (!confirmLogout) {\n void onLogout();\n return;\n }\n modal.confirm({\n title: \"Are you sure you want to logout?\",\n content: \"Please click OK to continue\",\n icon: <ExclamationCircleOutlined />,\n okText: \"Logout\",\n onOk: onLogout,\n });\n };\n\n const items: MenuProps[\"items\"] = [\n ...(extraItems ?? []),\n ...(settingsUrl !== null || onSettings\n ? [\n {\n key: \"settings\",\n icon: <SettingOutlined />,\n label: \"Settings\",\n onClick: () => {\n if (onSettings) onSettings();\n else if (settingsUrl) window.location.href = settingsUrl;\n },\n },\n ]\n : []),\n {\n key: \"logout\",\n icon: <LogoutOutlined />,\n label: \"Logout\",\n onClick: handleLogout,\n },\n ];\n\n return (\n <Dropdown\n open={open}\n onOpenChange={setOpen}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n menu={{ items, onClick: () => setOpen(false) }}\n popupRender={(menu) => (\n <Panel>\n <Identity>\n <IdentityAvatar $src={avatarSrc}>\n {!avatarSrc && getInitials(account.fullName)}\n </IdentityAvatar>\n <span className=\"hisd3-identity-text\">\n <span className=\"hisd3-identity-name\">{account.fullName}</span>\n {account.positionType && (\n <span className=\"hisd3-identity-role\">\n {account.positionType}\n </span>\n )}\n </span>\n </Identity>\n {menu}\n </Panel>\n )}\n >\n <Trigger\n type=\"button\"\n className={className}\n $shape={shape}\n $size={size}\n $open={open}\n aria-label={`Account menu for ${account.fullName}`}\n >\n {avatarSrc ? (\n <img src={avatarSrc} alt=\"\" />\n ) : (\n getInitials(account.fullName)\n )}\n {!hideChevron && (\n <Chevron $size={size} $open={open} aria-hidden>\n <DownOutlined />\n </Chevron>\n )}\n </Trigger>\n </Dropdown>\n );\n};\n\nexport default HISD3AvatarMenu;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport { HISD3NotificationButton, HeaderIconButton } from \"./NotificationButton\";\nexport type {\n HISD3NotificationButtonProps,\n HISD3Notification,\n} from \"./NotificationButton\";\nexport { HISD3AvatarMenu, getInitials } from \"./AvatarMenu\";\nexport type { HISD3AvatarMenuProps } from \"./AvatarMenu\";\n\nconst Wrap = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 0 0 auto;\n`;\n\nconst Divider = styled.span`\n width: 2px;\n height: 24px;\n background: var(--ant-color-border-secondary);\n flex: 0 0 auto;\n`;\n\nexport interface HISD3HeaderActionsProps {\n children: React.ReactNode;\n /** Insert a vertical rule before the last child (e.g. before the avatar). */\n divided?: boolean;\n className?: string;\n}\n\n/** Spacing wrapper for the top-right header controls. */\nexport const HISD3HeaderActions: React.FC<HISD3HeaderActionsProps> = ({\n children,\n divided = false,\n className,\n}) => {\n const kids = React.Children.toArray(children).filter(Boolean);\n return (\n <Wrap className={className}>\n {kids.map((child, i) => (\n <React.Fragment key={i}>\n {divided && i === kids.length - 1 && i > 0 && <Divider />}\n {child}\n </React.Fragment>\n ))}\n </Wrap>\n );\n};\n\nexport default HISD3HeaderActions;\n","import { LeftOutlined, RightOutlined } from \"@ant-design/icons\";\nimport { Pagination, Table, type TableProps } from \"antd\";\nimport type { AnyObject } from \"antd/es/_util/type\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface HISD3TablePagination {\n current: number;\n pageSize: number;\n total: number;\n onChange: (page: number, pageSize: number) => void;\n /** Page-size toggle buttons on the right. Default [10, 20, 50]. */\n pageSizeOptions?: number[];\n /** Custom total text. Default \"Total 7,223 items\". */\n renderTotal?: (total: number, range: [number, number]) => React.ReactNode;\n /** Hide the page-size buttons. */\n hidePageSize?: boolean;\n}\n\nexport interface HISD3TableProps<T extends AnyObject>\n extends Omit<TableProps<T>, \"pagination\" | \"footer\"> {\n /** HISD3 pagination bar (total · pages · page-size). Omit for no pagination. */\n pagination?: HISD3TablePagination | false;\n /** Optional summary strip rendered between the rows and the pagination bar. */\n footer?: React.ReactNode;\n}\n\nconst Wrap = styled.div`\n .ant-table-wrapper .ant-table {\n background: transparent;\n }\n\n .ant-table-wrapper .ant-table-thead > tr > th {\n font-size: 13px;\n font-weight: 700;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n padding-block: 14px;\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: transparent;\n }\n\n .ant-table-wrapper .ant-table-tbody > tr > td {\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n font-size: 16px;\n }\n\n .ant-table-wrapper .ant-table-tbody > tr:last-child > td {\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n }\n\n .ant-table-wrapper .ant-table-thead > tr > th:first-child,\n .ant-table-wrapper .ant-table-tbody > tr > td:first-child {\n padding-left: 0;\n }\n\n .ant-table-wrapper .ant-table-thead > tr > th:last-child,\n .ant-table-wrapper .ant-table-tbody > tr > td:last-child {\n padding-right: 0;\n }\n\n .ant-table-wrapper .ant-table-cell-row-hover {\n background: rgba(0, 0, 0, 0.025) !important;\n }\n\n /* Highlighted / linked cell text, e.g. bill numbers */\n .hisd3-cell-primary {\n color: var(--ant-color-primary);\n font-weight: 700;\n }\n .hisd3-cell-link {\n color: var(--ant-color-primary);\n }\n .hisd3-cell-muted {\n color: var(--ant-color-text-tertiary);\n }\n`;\n\nconst FooterStrip = styled.div`\n padding: 22px 0 14px;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.1em;\n text-transform: uppercase;\n color: var(--ant-color-text-tertiary);\n`;\n\nconst PagerBar = styled.div`\n user-select: none;\n -webkit-user-select: none;\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 20px 0 8px;\n\n .hisd3-total {\n flex: 1 1 auto;\n font-size: 16px;\n color: var(--ant-color-text-secondary);\n }\n\n .ant-pagination {\n display: inline-flex;\n border: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n .ant-pagination-item,\n .ant-pagination-prev,\n .ant-pagination-next,\n .ant-pagination-jump-prev,\n .ant-pagination-jump-next {\n margin: 0;\n min-width: 56px;\n height: 56px;\n line-height: 56px;\n border: 0;\n border-right: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n border-radius: 0;\n font-weight: 700;\n font-size: 16px;\n background: transparent;\n\n &:last-child {\n border-right: 0;\n }\n\n a {\n color: var(--ant-color-text);\n }\n }\n\n .ant-pagination-item-active {\n background: var(--ant-color-primary);\n a {\n color: #fff;\n }\n }\n\n .ant-pagination-prev .ant-pagination-item-link,\n .ant-pagination-next .ant-pagination-item-link {\n color: var(--ant-color-text);\n font-size: 14px;\n }\n\n .ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,\n .ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis {\n color: var(--ant-color-text);\n font-weight: 700;\n }\n }\n`;\n\nconst SizeGroup = styled.div`\n display: inline-flex;\n border: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n\n button {\n height: 56px;\n padding: 0 22px;\n border: 0;\n border-right: var(--hisd3-rule-width, 1px) solid var(--ant-color-border);\n background: transparent;\n font: inherit;\n font-size: 16px;\n color: var(--ant-color-text);\n cursor: pointer;\n\n &:last-child {\n border-right: 0;\n }\n\n &[aria-pressed=\"true\"] {\n background: var(--ant-color-primary);\n color: #fff;\n }\n }\n`;\n\nconst defaultTotal = (total: number) =>\n `Total ${total.toLocaleString()} items`;\n\nexport function HISD3Table<T extends AnyObject>({\n pagination,\n footer,\n ...tableProps\n}: HISD3TableProps<T>) {\n const p = pagination || undefined;\n const sizes = p?.pageSizeOptions ?? [10, 20, 50];\n\n return (\n <Wrap>\n <Table<T> {...tableProps} pagination={false} />\n\n {footer && <FooterStrip>{footer}</FooterStrip>}\n\n {p && (\n <PagerBar>\n <span className=\"hisd3-total\">\n {(p.renderTotal ?? defaultTotal)(p.total, [\n (p.current - 1) * p.pageSize + 1,\n Math.min(p.current * p.pageSize, p.total),\n ])}\n </span>\n <Pagination\n current={p.current}\n pageSize={p.pageSize}\n total={p.total}\n showSizeChanger={false}\n onChange={(page, size) => p.onChange(page, size)}\n itemRender={(_, type, el) => {\n if (type === \"prev\") return <span className=\"ant-pagination-item-link\"><LeftOutlined /></span>;\n if (type === \"next\") return <span className=\"ant-pagination-item-link\"><RightOutlined /></span>;\n return el;\n }}\n />\n {!p.hidePageSize && (\n <SizeGroup role=\"group\" aria-label=\"Rows per page\">\n {sizes.map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={s === p.pageSize}\n onClick={() => p.onChange(1, s)}\n >\n {s} / page\n </button>\n ))}\n </SizeGroup>\n )}\n </PagerBar>\n )}\n </Wrap>\n );\n}\n\nexport default HISD3Table;\n","import { Tabs, type TabsProps } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport interface HISD3TabItem {\n key: string;\n label: React.ReactNode;\n /** Optional count badge rendered after the label (e.g. \"All Patients 10\"). */\n count?: number | string;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nexport interface HISD3TabsProps extends Omit<TabsProps, \"items\"> {\n items: HISD3TabItem[];\n}\n\nconst StyledTabs = styled(Tabs)`\n &.ant-tabs .ant-tabs-nav {\n user-select: none;\n -webkit-user-select: none;\n margin: 0;\n\n &::before {\n border-bottom: var(--hisd3-rule-width, 1px) solid var(--ant-color-border-secondary);\n }\n }\n\n &.ant-tabs .ant-tabs-tab {\n padding: 14px 0 18px;\n font-weight: 600;\n font-size: 18px;\n\n + .ant-tabs-tab {\n margin-left: 48px;\n }\n }\n\n &.ant-tabs .ant-tabs-ink-bar {\n height: 4px;\n }\n\n .hisd3-tab-count {\n margin-left: 10px;\n font-size: 14px;\n font-weight: 500;\n color: var(--ant-color-text-tertiary);\n }\n\n .ant-tabs-tab-active .hisd3-tab-count {\n color: var(--ant-color-primary);\n }\n`;\n\n/** Underlined filter tabs with optional counts. */\nexport const HISD3Tabs: React.FC<HISD3TabsProps> = ({ items, ...rest }) => (\n <StyledTabs\n {...rest}\n items={items.map(({ count, label, ...item }) => ({\n ...item,\n label: (\n <>\n {label}\n {count !== undefined && <span className=\"hisd3-tab-count\">{count}</span>}\n </>\n ),\n }))}\n />\n);\n\nexport default HISD3Tabs;\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport type HISD3TagVariant = \"neutral\" | \"soft\" | \"outline\" | \"solid\";\nexport type HISD3TagTone = \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface HISD3TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * neutral → light grey fill, dark text (ACTIVE, IN PATIENT)\n * soft → primary tint fill, primary text (ER PATIENT)\n * outline → 2px primary border, primary text (OUT PATIENT)\n * solid → primary fill, white text\n */\n variant?: HISD3TagVariant;\n tone?: HISD3TagTone;\n children: React.ReactNode;\n}\n\nconst toneVar: Record<HISD3TagTone, string> = {\n default: \"var(--ant-color-text)\",\n primary: \"var(--ant-color-primary)\",\n success: \"var(--ant-color-success)\",\n warning: \"var(--ant-color-warning)\",\n danger: \"var(--ant-color-error)\",\n};\n\nconst toneBgVar: Record<HISD3TagTone, string> = {\n default: \"rgba(0,0,0,0.05)\",\n primary: \"var(--ant-color-primary-bg)\",\n success: \"var(--ant-color-success-bg)\",\n warning: \"var(--ant-color-warning-bg)\",\n danger: \"var(--ant-color-error-bg)\",\n};\n\nconst StyledTag = styled.span<{ $variant: HISD3TagVariant; $tone: HISD3TagTone }>`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 32px;\n padding: 0 14px;\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n white-space: nowrap;\n line-height: 1;\n border: var(--hisd3-rule-width, 1px) solid transparent;\n border-radius: 0;\n\n ${({ $variant, $tone }) => {\n const color = toneVar[$tone];\n const bg = toneBgVar[$tone];\n switch ($variant) {\n case \"soft\":\n return `color: ${color}; background: ${bg};`;\n case \"outline\":\n return `color: ${color}; border-color: ${color}; background: transparent;`;\n case \"solid\":\n return `color: #fff; background: ${$tone === \"default\" ? \"var(--ant-color-text)\" : color};`;\n default:\n return `color: var(--ant-color-text); background: rgba(0,0,0,0.05);`;\n }\n }}\n`;\n\nexport const HISD3Tag: React.FC<HISD3TagProps> = ({\n variant = \"neutral\",\n tone = variant === \"neutral\" ? \"default\" : \"primary\",\n children,\n ...rest\n}) => (\n <StyledTag $variant={variant} $tone={tone} {...rest}>\n {children}\n </StyledTag>\n);\n\nexport default HISD3Tag;\n","import { Button, type ButtonProps } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport type HISD3ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\n\nexport interface HISD3ButtonProps extends Omit<ButtonProps, \"variant\" | \"color\" | \"type\"> {\n /**\n * primary → filled with the theme primary (e.g. \"New folio\")\n * secondary → outlined, dark 2px border (e.g. \"Refresh\", \"Export\")\n * ghost → text only\n * danger → filled red\n */\n variant?: HISD3ButtonVariant;\n}\n\nconst StyledButton = styled(Button)`\n &.ant-btn {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n height: 40px;\n padding-inline: 16px;\n font-size: 14px;\n font-weight: 600;\n box-shadow: none;\n }\n\n &.ant-btn-sm {\n height: 32px;\n padding-inline: 12px;\n font-size: 13px;\n gap: 6px;\n }\n\n &.ant-btn-lg {\n height: 52px;\n padding-inline: 20px;\n font-size: 16px;\n }\n\n &.ant-btn-default {\n border-width: var(--hisd3-rule-width, 1px);\n }\n\n .anticon {\n font-size: 1.05em;\n }\n`;\n\nconst map: Record<HISD3ButtonVariant, Pick<ButtonProps, \"type\" | \"danger\">> = {\n primary: { type: \"primary\" },\n secondary: { type: \"default\" },\n ghost: { type: \"text\" },\n danger: { type: \"primary\", danger: true },\n};\n\nexport const HISD3Button: React.FC<HISD3ButtonProps> = ({\n variant = \"secondary\",\n ...rest\n}) => <StyledButton {...map[variant]} {...rest} />;\n\nexport default HISD3Button;\n","import { SearchOutlined } from \"@ant-design/icons\";\nimport { Input, type InputProps } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nexport type HISD3InputProps = InputProps;\n\nconst StyledInput = styled(Input)`\n &.ant-input,\n &.ant-input-affix-wrapper {\n border-width: var(--hisd3-rule-width, 1px);\n font-size: 16px;\n }\n\n &.ant-input-affix-wrapper .ant-input-prefix {\n margin-inline-end: 14px;\n color: var(--ant-color-text-tertiary);\n font-size: 18px;\n }\n`;\n\n/** Plain text input with the HISD3 2px border. */\nexport const HISD3Input: React.FC<HISD3InputProps> = (props) => (\n <StyledInput {...props} />\n);\n\nconst StyledSearch = styled(StyledInput)`\n &.ant-input-affix-wrapper {\n background: var(--hisd3-bg-filled, #e6e4e1);\n border-color: var(--ant-color-border-secondary);\n height: 72px;\n padding-inline: 24px;\n\n &:hover,\n &:focus-within {\n border-color: var(--ant-color-border);\n background: var(--hisd3-bg-filled, #e6e4e1);\n }\n\n .ant-input {\n background: transparent;\n font-size: 20px;\n }\n\n .ant-input-prefix {\n font-size: 22px;\n }\n }\n\n &.hisd3-search-compact.ant-input-affix-wrapper {\n height: 48px;\n padding-inline: 16px;\n\n .ant-input {\n font-size: 16px;\n }\n .ant-input-prefix {\n font-size: 18px;\n }\n }\n`;\n\nexport interface HISD3SearchInputProps extends InputProps {\n /** 48px tall instead of the 72px hero search. */\n compact?: boolean;\n}\n\n/** Grey filled search field with leading icon (the page-level search bar). */\nexport const HISD3SearchInput: React.FC<HISD3SearchInputProps> = ({\n compact = false,\n className,\n ...props\n}) => (\n <StyledSearch\n allowClear\n prefix={<SearchOutlined />}\n className={[compact ? \"hisd3-search-compact\" : \"\", className ?? \"\"].join(\" \").trim()}\n {...props}\n />\n);\n\nexport default HISD3Input;\n","export enum ThemeStyle {\n MODERN = \"modern\",\n STANDARD = \"standard\",\n}\nexport enum ThemeStyleRadius {\n MODERN = \"30px\",\n STANDARD = \"16px\",\n}\nexport enum ThemeMode {\n LIGHT = \"light\",\n SEMI_DARK = \"semi-dark\",\n DARK = \"dark\",\n}\nexport enum LayoutType {\n FULL_WIDTH = \"full-width\",\n BOXED = \"boxed\",\n FRAMED = \"framed\",\n}\n\nexport enum MenuStyle {\n DEFAULT = \"default\",\n STANDARD = \"standard\",\n ROUNDED = \"rounded\",\n ROUNDED_REVERSE = \"rounded-reverse\",\n CURVED_MENU = \"curved-menu\",\n}\n\nexport enum NavStyle {\n DEFAULT = \"default\",\n MINI = \"mini\",\n MINI_SIDEBAR_TOGGLE = \"mini-sidebar-toggle\",\n STANDARD = \"standard\",\n HEADER_USER = \"user-header\",\n HEADER_USER_MINI = \"user-mini-header\",\n DRAWER = \"drawer\",\n BIT_BUCKET = \"bit-bucket\",\n H_DEFAULT = \"h-default\",\n HOR_HEADER_FIXED = \"hor-header-fixed\",\n HOR_DARK_LAYOUT = \"hor-dark-layout\",\n}\nexport enum FooterType {\n FIXED = \"fixed\",\n FLUID = \"fluid\",\n}\nexport enum LayoutDirection {\n RTL = \"rtl\",\n LTR = \"ltr\",\n}\nexport enum HeaderType {\n DARK = \"dark\",\n LIGHT = \"light\",\n}\nexport enum RouteTransition {\n NONE = \"none\",\n FADE = \"fade\",\n SLIDE_LEFT = \"slideLeft\",\n SLIDE_RIGHT = \"slideRight\",\n SLIDE_UP = \"slideUp\",\n SLIDE_DOWN = \"slideDown\",\n}\nexport enum Fonts {\n LIGHT = \"300\",\n REGULAR = \"400\",\n MEDIUM = \"500\",\n BOLD = \"600\",\n}\n\nexport enum AuthType {\n FIREBASE = \"firebase\",\n AWS_COGNITO = \"aws_cognito\",\n AUTH0 = \"auth0\",\n JWT_AUTH = \"jwt_auth\",\n}\n\nexport enum AppAnimates {\n SLIDEUPIN = \"transition.slideUpIn\",\n SLIDEUPOUT = \"transition.slideUpOut\",\n SLIDEDOWNIN = \"transition.slideDownIn\",\n SLIDEDOWNOUT = \"transition.slideDownOut\",\n SLIDELEFTIN = \"transition.slideLeftIn\",\n SLIDELEFTOUT = \"transition.slideLeftOut\",\n SLIDERIGHTIN = \"transition.slideRightIn\",\n SLIDERIGHTOUT = \"transition.slideRightOut\",\n FADEIN = \"transition.fadeIn\",\n FADEOUT = \"transition.fadeOut\",\n}\n\nexport const AppAnimateGroups = {\n SLIDEUPIN: {\n hidden: {\n y: 0,\n },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.2,\n staggerChildren: 0.05,\n },\n },\n },\n SLIDEUPOUT: {\n hidden: {\n y: 0,\n },\n visible: {\n opacity: 0,\n y: \"100vh\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDEDOWNIN: {\n hidden: {\n opacity: 0,\n y: \"-100vh\",\n },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDEDOWNOUT: {\n hidden: {\n y: 0,\n },\n visible: {\n opacity: 0,\n y: \"-100vh\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDELEFTIN: {\n hidden: {\n x: \"100vw\",\n },\n visible: {\n opacity: 1,\n x: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDELEFTOUT: {\n hidden: {\n x: 0,\n },\n visible: {\n opacity: 0,\n x: \"100vw\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDERIGHTIN: {\n hidden: {\n x: \"-100vw\",\n },\n visible: {\n opacity: 1,\n x: 0,\n transition: {\n ease: \"easeIn\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n SLIDERIGHTOUT: {\n hidden: {\n x: 0,\n },\n visible: {\n opacity: 0,\n x: \"-100vw\",\n transition: {\n ease: \"easeOut\",\n delay: 0,\n when: \"beforeChildren\",\n duration: 0.4,\n staggerChildren: 0.15,\n },\n },\n },\n FADEIN: {\n hidden: {\n opacity: 0,\n scale: 1,\n },\n visible: {\n opacity: 1,\n scale: 1,\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n staggerChildren: 0.15,\n },\n },\n },\n FADEOUT: {\n hidden: {\n opacity: 1,\n scale: 1,\n },\n visible: {\n opacity: 0,\n scale: 1,\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n staggerChildren: 0.15,\n },\n },\n },\n NOANIMATION: {\n hidden: {\n opacity: 1,\n },\n visible: {\n opacity: 1,\n },\n },\n};\n\nexport const AppMotionAnimate = {\n SLIDEUPIN: {\n variants: {\n hidden: {\n y: 100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n y: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDEUPOUT: {\n variants: {\n hidden: {\n y: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n y: \"-100vh\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n SLIDEDOWNIN: {\n variants: {\n hidden: {\n y: -100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n y: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDEDOWNOUT: {\n variants: {\n hidden: {\n y: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n y: \"100vh\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n SLIDELEFTIN: {\n variants: {\n hidden: {\n x: 100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n x: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDELEFTOUT: {\n variants: {\n hidden: {\n x: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n x: \"-100vw\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n SLIDERIGHTIN: {\n variants: {\n hidden: {\n x: -100,\n opacity: 0,\n },\n visible: {\n opacity: 1,\n x: 0,\n },\n },\n transition: {\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n SLIDERIGHTOUT: {\n variants: {\n hidden: {\n x: 0,\n opacity: 1,\n },\n visible: {\n opacity: 0,\n x: \"-100vw\",\n },\n },\n transition: {\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n FADEIN: {\n variants: {\n hidden: {\n opacity: 0,\n },\n visible: {\n opacity: 1,\n },\n },\n transition: {\n duration: 0.1,\n ease: \"easeIn\",\n when: \"beforeChildren\",\n },\n },\n FADEOUT: {\n variants: {\n hidden: {\n opacity: 1,\n },\n visible: {\n opacity: 0,\n },\n },\n transition: {\n duration: 0.1,\n ease: \"easeOut\",\n when: \"beforeChildren\",\n },\n },\n};\n\nexport enum MessageType {\n MEDIA = 1,\n TEXT = 2,\n}\n\nexport enum RoutePermittedRole {\n Admin = \"admin\",\n User = \"user\",\n}\n"],"names":["styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","HISD3_LAYOUT","siderWidth","siderCollapsedWidth","topBarHeight","pageGutter","HISD3_PRESETS","red","orange","teal","blue","green","purple","HISD3_NEUTRALS","bgLayout","bgContainer","bgElevated","bgFilled","bgFilledHover","text","textSecondary","textTertiary","border","borderSecondary","borderStrong","white","HISD3_BORDER_PRESETS","hairline","width","bold","HISD3_FONT_FAMILY","resolvePrimary","primary","tint","hex","amount","h","replace","full","length","split","map","c","join","n","parseInt","g","b","mix","Math","round","toString","padStart","createHisd3Theme","radius","borders","lineWidth","overrides","p","base","cssVar","key","token","colorPrimary","colorInfo","colorLink","colorPrimaryBg","colorPrimaryBgHover","colorPrimaryBorder","fontFamily","fontSize","fontWeightStrong","borderRadius","borderRadiusLG","borderRadiusSM","borderRadiusXS","colorBgLayout","colorBgContainer","colorBgElevated","colorText","colorTextSecondary","colorTextTertiary","colorTextHeading","colorBorder","colorBorderSecondary","colorSplit","controlHeight","controlHeightLG","controlHeightSM","boxShadow","boxShadowSecondary","components","Layout","siderBg","headerBg","bodyBg","headerPadding","Menu","itemBg","subMenuItemBg","itemColor","itemHoverColor","itemHoverBg","itemSelectedBg","itemSelectedColor","itemActiveBg","subMenuItemSelectedColor","groupTitleColor","groupTitleFontSize","itemBorderRadius","itemMarginInline","itemMarginBlock","itemHeight","itemPaddingInline","iconSize","collapsedIconSize","activeBarBorderWidth","activeBarWidth","Button","fontWeight","primaryShadow","defaultShadow","dangerShadow","defaultBorderColor","defaultColor","defaultBg","defaultHoverBg","defaultHoverBorderColor","defaultHoverColor","defaultActiveBorderColor","paddingInline","contentFontSize","contentFontSizeLG","contentFontSizeSM","Input","activeShadow","hoverBorderColor","activeBorderColor","Select","optionSelectedBg","Table","headerColor","headerSplitColor","headerBorderRadius","borderColor","rowHoverBg","cellPaddingBlock","cellPaddingInline","cellFontSize","footerBg","Tabs","inkBarColor","titleFontSize","horizontalItemGutter","horizontalMargin","lineWidthBold","Tag","Pagination","itemSize","itemInputBg","Dropdown","paddingBlock","Breadcrumb","lastItemColor","linkColor","linkHoverColor","separatorColor","Card","headerFontSize","borderVarsCss","hisd3AntdTheme","HISD3_COLORS","primaryLight","headerSelectedBg","HISD3ProviderContext","createContext","useInsideHISD3Provider","useContext","Header","Content","SIDER_WIDTH","SIDER_COLLAPSED_WIDTH","HEADER_HEIGHT","StyledRoot","styled","$appShell","StyledMain","$scroll","StyledSiderMenuWrap","div","StyledBrand","a","$collapsed","StyledHeader","StyledSiderHeader","StyledCollapseTrigger","button","StyledEdgeTrigger","$top","$left","StyledContent","StyledCrUserInfo","$inHeader","StyledCrUserInfoInner","StyledCrUserInfoAvatar","span","$src","StyledCrUserInfoContent","StyledUsernameInfo","StyledUsername","h3","StyledUserArrow","StyledCrUserDesignation","itemKey","item","index","path","toAntdMenuItems","items","renderLink","filter","hideInMenu","Array","isArray","children","icon","label","name","disabled","group","undefined","defaultRenderLink","href","UserMenu","account","avatarSrc","settingsUrl","onLogout","collapsed","placement","extraItems","modal","App","useApp","_jsx","SettingOutlined","onClick","window","location","LogoutOutlined","confirm","title","content","ExclamationCircleOutlined","onOk","initials","fullName","w","Boolean","slice","toUpperCase","jsx","className","trigger","menu","_jsxs","e","preventDefault","jsxs","DownOutlined","positionType","Sider","PAGE_GUTTER","HeaderWrap","header","TopBar","Actions","TitleBlock","HISD3PageBody","HeaderIconButton","$size","$open","CountBadge","Panel","PanelHeader","List","Row","$unread","RowIcon","RowBody","UnreadDot","PanelFooter","EmptyWrap","Trigger","$shape","Chevron","Identity","IdentityAvatar","getInitials","Wrap","Divider","FooterStrip","PagerBar","SizeGroup","defaultTotal","total","toLocaleString","StyledTabs","toneVar","default","success","warning","danger","toneBgVar","StyledTag","$variant","$tone","color","bg","StyledButton","secondary","ghost","StyledInput","StyledSearch","ThemeStyle","ThemeStyleRadius","ThemeMode","LayoutType","MenuStyle","NavStyle","FooterType","LayoutDirection","HeaderType","RouteTransition","Fonts","AuthType","AppAnimates","MessageType","RoutePermittedRole","SLIDEUPIN","hidden","y","visible","opacity","transition","ease","delay","when","duration","staggerChildren","SLIDEUPOUT","SLIDEDOWNIN","SLIDEDOWNOUT","SLIDELEFTIN","x","SLIDELEFTOUT","SLIDERIGHTIN","SLIDERIGHTOUT","FADEIN","scale","FADEOUT","NOANIMATION","variants","onSettings","confirmLogout","shape","size","hideChevron","open","setOpen","useState","okText","onOpenChange","popupRender","src","alt","variant","rest","divided","kids","React","Children","toArray","child","i","Fragment","props","count","loading","onMarkAllRead","onSeeAll","seeAllLabel","emptyText","unread","panel","textAlign","Spin","Empty","image","PRESENTED_IMAGE_SIMPLE","description","BellFilled","time","id","next","subtitle","breadcrumb","extra","leading","hideTopBar","flex","theme","styledTheme","antdTheme","useMemo","vars","Provider","value","dangerouslySetInnerHTML","__html","ConfigProvider","ThemeProvider","AntdApp","component","compact","allowClear","prefix","SearchOutlined","trim","logoUrl","appName","menuItems","pathname","renderMenuLink","headerExtra","userMenuItems","onCollapse","hideSidebar","layoutTop","hideCollapseTrigger","collapseTrigger","collapseTriggerOffset","bareContent","hideHeaderBar","brandHref","hideAccountCard","scrollContent","insideProvider","resolvedTheme","isCollapsed","setIsCollapsed","useEffect","selection","best","walk","list","parents","forEach","startsWith","exact","selectedKey","openKeys","findSelection","setOpenKeys","prev","from","Set","toggleCollapse","selectedKeys","collapseLabel","brand","body","spinning","_Fragment","mode","hasSider","collapsedWidth","collapsible","breakpoint","onBreakpoint","broken","inlineCollapsed","keys","MenuUnfoldOutlined","MenuFoldOutlined","RightOutlined","LeftOutlined","pagination","footer","tableProps","sizes","pageSizeOptions","renderTotal","current","pageSize","min","showSizeChanger","onChange","page","itemRender","_","el","hidePageSize","role","s","tone"],"mappings":"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","x_google_ignoreList":[0]}
|