chordia-ui 4.0.7 → 4.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DataTable2.cjs.js +1 -1
- package/dist/DataTable2.cjs.js.map +1 -1
- package/dist/DataTable2.es.js +936 -814
- package/dist/DataTable2.es.js.map +1 -1
- package/dist/components/policies.cjs.js +1 -1
- package/dist/components/policies.cjs.js.map +1 -1
- package/dist/components/policies.es.js +48 -49
- package/dist/components/policies.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/data/DataTable2.jsx +168 -6
- package/src/components/policies/PoliciesPage.jsx +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.es.js","sources":["../../src/components/policies/PolicyCard.jsx","../../src/components/policies/FilterDropdown.jsx","../../src/components/policies/PolicyDetailsDrawer.jsx","../../src/components/policies/PoliciesPage.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { CloudCheck, CloudOff, CloudDownload, FileStack, MoreHorizontal } from \"lucide-react\";\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n cardBorder: \"var(--neutral-300, #B2B2B0)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n btnBorder: \"var(--Grey-absent, #D9D9D9)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n menuHover: \"var(--neutral-100, #E6E6E6)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n// Two-line clamp helper (used for the policy description).\nconst clampStyle = (lines) => ({\n display: \"-webkit-box\",\n WebkitLineClamp: lines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n});\n\n// Status that reads as \"off\" gets the slashed-cloud icon (Figma: Disabled).\nconst isDisabledStatus = (status) => /disabled|inactive|off|available/i.test(String(status || \"\"));\n\nfunction OutlineButton({ children, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 28,\n padding: \"0 10px\",\n borderRadius: 10,\n border: `1px solid ${C.btnBorder}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction PrimaryButton({ children, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 28,\n padding: \"0 16px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\n// Kebab (⋯) popover menu — outside-click / Escape to close. `items` is a list\n// of { label, onClick }; empty items render nothing.\nfunction KebabMenu({ items, onClose }) {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) onClose?.();\n };\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n role=\"menu\"\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n right: 0,\n zIndex: 50,\n minWidth: 168,\n display: \"flex\",\n flexDirection: \"column\",\n background: C.white,\n border: `1px solid ${C.btnBorder}`,\n borderRadius: 8,\n boxShadow: \"var(--shadow-popover, 0 12px 32px rgba(11,11,11,0.12))\",\n overflow: \"hidden\",\n }}\n >\n {items.map((item, idx) => (\n <button\n key={item.label}\n type=\"button\"\n role=\"menuitem\"\n onClick={item.onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n padding: \"10px 12px\",\n border: \"none\",\n borderTop: idx === 0 ? \"none\" : `1px solid var(--color-divider, #E5E7EB)`,\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = C.menuHover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * PolicyCard — single policy / template card used on both the Active and\n * Browse tabs of the Policies page. Purely presentational; all actions are\n * delegated to the host via callbacks.\n *\n * The two variants (Figma nodes 66:1849 / 73:1099 / 73:1259 vs 73:1150):\n * - \"active\": paradigms line, Updated meta, footer = Test + View Details, and\n * a kebab (⋯) menu with Enable/Disable + Edit definition.\n * - \"browse\": no paradigms line, Policy Count meta, footer = View Details +\n * Apply.\n *\n * Props:\n * - policy { id, name, paradigms, description, updatedLabel, updated_by, status, policyCount }\n * - variant \"active\" | \"browse\" Default \"active\"\n * - onTest function(policy) active — renders the \"Test\" button when provided\n * - onViewDetails function(policy) renders the \"View Details\" button when provided\n * - onApply function(policy) browse — renders the \"Apply\" button when provided\n * - onToggleStatus function(policy) active — kebab \"Enable/Disable Policy\" item\n * - onEdit function(policy) active — kebab \"Edit definition\" item\n */\nexport default function PolicyCard({\n policy = {},\n variant = \"active\",\n onTest,\n onViewDetails,\n onApply,\n onToggleStatus,\n onEdit,\n}) {\n const isBrowse = variant === \"browse\";\n // Browse templates aren't \"disabled\" — they're available to apply. Default\n // their status to \"Available\" and give it its own (non-slashed) icon.\n const status = policy.status || (isBrowse ? \"Available\" : \"Active\");\n const isAvailable = /available/i.test(String(status || \"\"));\n const disabled = !isAvailable && isDisabledStatus(status);\n const StatusIcon = isAvailable ? CloudDownload : disabled ? CloudOff : CloudCheck;\n\n const [menuOpen, setMenuOpen] = useState(false);\n\n const menuItems = [];\n if (onToggleStatus) {\n menuItems.push({\n label: disabled ? \"Enable Policy\" : \"Disable Policy\",\n onClick: () => {\n setMenuOpen(false);\n onToggleStatus(policy);\n },\n });\n }\n if (onEdit) {\n menuItems.push({\n label: \"Edit definition\",\n onClick: () => {\n setMenuOpen(false);\n onEdit(policy);\n },\n });\n }\n const hasMenu = menuItems.length > 0;\n\n return (\n <article\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n alignItems: \"flex-start\",\n minHeight: 82,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${C.cardBorder}`,\n background: C.white,\n boxSizing: \"border-box\",\n width: \"100%\",\n fontFamily: FONT,\n }}\n >\n {/* Content */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, width: \"100%\" }}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\", width: \"100%\" }}>\n <p\n style={{\n flex: 1,\n minWidth: 0,\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: C.ink,\n lineHeight: \"normal\",\n }}\n >\n {policy.name || \"Untitled policy\"}\n </p>\n {hasMenu && (\n <div style={{ position: \"relative\", display: \"inline-flex\", flexShrink: 0 }}>\n <button\n type=\"button\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: C.ink,\n cursor: \"pointer\",\n }}\n >\n <MoreHorizontal size={16} strokeWidth={2} />\n </button>\n {menuOpen && <KebabMenu items={menuItems} onClose={() => setMenuOpen(false)} />}\n </div>\n )}\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 5, width: \"100%\" }}>\n {!isBrowse && (\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.ink,\n lineHeight: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n }}\n >\n {policy.paradigms || \"All paradigms\"}\n </p>\n )}\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.muted,\n lineHeight: \"normal\",\n minHeight: 32,\n width: \"100%\",\n ...clampStyle(2),\n }}\n >\n {policy.description || \"\"}\n </p>\n </div>\n </div>\n\n {/* Meta */}\n <div style={{ display: \"flex\", flexDirection: \"column\", width: \"100%\" }}>\n {isBrowse ? (\n <PolicyCountChip count={policy.policyCount} />\n ) : (\n <>\n <MetaRow label=\"Updated\" value={policy.updatedLabel || \"—\"} />\n <MetaRow label=\"Updated By\" value={policy.updatedBy || \"—\"} />\n </>\n )}\n </div>\n\n {/* Footer — status + actions */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n width: \"100%\",\n }}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 12,\n color: C.ink,\n lineHeight: \"16px\",\n }}\n >\n <StatusIcon size={20} strokeWidth={1.5} style={{ color: C.ink }} />\n {status}\n </span>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {isBrowse ? (\n <>\n {onViewDetails && (\n <OutlineButton onClick={() => onViewDetails(policy)}>View Details</OutlineButton>\n )}\n {onApply && <PrimaryButton onClick={() => onApply(policy)}>Apply</PrimaryButton>}\n </>\n ) : (\n <>\n {onTest && <OutlineButton onClick={() => onTest(policy)}>Test</OutlineButton>}\n {onViewDetails && (\n <PrimaryButton onClick={() => onViewDetails(policy)}>View Details</PrimaryButton>\n )}\n </>\n )}\n </div>\n </div>\n </article>\n );\n}\n\n// Browse-template meta: a chip showing how many policies the template groups,\n// e.g. a stacked-documents icon + \"5 Policies\".\nfunction PolicyCountChip({ count }) {\n const n = parseInt(count, 10);\n const hasCount = Number.isFinite(n);\n const label = hasCount ? n : count ?? \"—\";\n const noun = hasCount && n === 1 ? \"Policy\" : \"Policies\";\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: \"20px\",\n color: C.ink,\n }}\n >\n <FileStack size={18} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />\n <span>\n {label} {noun}\n </span>\n </div>\n );\n}\n\nfunction MetaRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 24,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: 1.2,\n }}\n >\n <span style={{ width: 80, color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { Check } from \"lucide-react\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n/**\n * FilterDropdown — \"Filter by\" category popover (Figma node 74:3118).\n *\n * Props:\n * - options [{ id, label }] Category options (an \"All\" row is always prepended)\n * - value string Currently selected option id (\"all\" by default)\n * - onChange function(id)\n * - onClose function Called on outside-click / Escape\n */\nexport default function FilterDropdown({ options = [], value = \"all\", onChange, onClose }) {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) onClose?.();\n };\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n const rows = [{ id: \"all\", label: \"All\" }, ...options];\n\n return (\n <div\n ref={ref}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: \"calc(100% + 6px)\",\n left: 0,\n zIndex: 50,\n minWidth: 200,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 4,\n boxShadow: \"var(--shadow-dropdown, -2px 2px 1px rgba(0,0,0,0.25))\",\n fontFamily: FONT,\n overflow: \"hidden\",\n }}\n >\n <div style={{ padding: 12 }}>\n <p style={{ margin: 0, fontSize: 13, fontWeight: 700, color: C.ink, lineHeight: 1.2 }}>\n Filter by\n </p>\n </div>\n {rows.map((row) => {\n const selected = row.id === value;\n return (\n <button\n key={row.id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onClick={() => onChange?.(row.id)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n // Selected row shows the check at pl-12; unselected rows indent to\n // pl-40 (12 + 20 check + 8 gap) so their labels line up.\n padding: selected ? \"12px\" : \"12px 12px 12px 40px\",\n borderTop: `1px solid ${C.border}`,\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {selected && <Check size={20} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />}\n {row.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { X, SquareChartGantt, Pencil, Check } from \"lucide-react\";\nimport { useMediaQuery } from \"../../utils/useMediaQuery\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n cardBorder: \"var(--neutral-300, #B2B2B0)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n btnBorder: \"var(--Grey-absent, #D9D9D9)\",\n editBorder: \"var(--neutral-250, #BFBFBF)\",\n editText: \"var(--neutral-800, #323232)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n iconBg: \"var(--surface-hover, #F3F7F7)\",\n line: \"var(--color-divider, #E5E7EB)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst Divider = () => <div style={{ width: \"100%\", height: 1, background: C.line, flexShrink: 0 }} />;\n\nfunction MetaRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 24,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: 1.2,\n }}\n >\n <span style={{ width: 80, color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\n/**\n * PolicyDetailsDrawer — slide-in \"View Details\" panel.\n *\n * Two layouts (Figma nodes 73:1111 vs 74:2974):\n * - mode=\"active\": paradigms title → description → Definition section (with\n * optional Edit button) → definition text → Updated / Created By meta.\n * Footer primary action is the enable/disable toggle.\n * - mode=\"browse\": description → list of constituent policy items. Footer\n * primary action is \"Apply Policy\".\n *\n * Props:\n * - open, onClose\n * - mode \"active\" | \"browse\" Default \"browse\"\n * - title string\n * - paradigms string (active)\n * - description string\n * - definition string (active)\n * - updatedLabel string (active)\n * - updatedBy string (active)\n * - onEdit function (active — renders the Edit button when provided)\n * - items [{ title, description }] (browse)\n * - primaryLabel string Optional — renders the primary footer button when set\n * - onPrimary function\n * - primaryDisabled boolean\n * - secondaryLabel string Default \"Cancel\"\n * - topOffset number|string\n */\nexport default function PolicyDetailsDrawer({\n open,\n onClose,\n mode = \"browse\",\n title,\n paradigms,\n description,\n definition,\n updatedLabel,\n updatedBy,\n onEdit,\n items = [],\n primaryLabel,\n onPrimary,\n primaryDisabled = false,\n secondaryLabel = \"Cancel\",\n topOffset,\n}) {\n const isPhone = useMediaQuery(\"(max-width: 640px)\");\n const hasTopOffset = topOffset !== undefined && topOffset !== null;\n const normalizedTopOffset = typeof topOffset === \"number\" ? `${topOffset}px` : topOffset;\n const isActive = mode === \"active\";\n\n const itemId = (item, idx) => item?.id ?? idx;\n\n // Browse mode: the user picks which policies from the template to apply.\n // Checkboxes are seeded from each item's `defaultChecked` (the project's\n // current enabled state for that policy); Apply stays disabled until at\n // least one is checked.\n const [selectedIds, setSelectedIds] = useState(() => new Set());\n useEffect(() => {\n if (open && !isActive) {\n setSelectedIds(\n new Set(\n items\n .map((it, idx) => (it?.defaultChecked ? itemId(it, idx) : null))\n .filter((id) => id !== null)\n )\n );\n }\n // Reset only when the drawer opens (or the mode flips) — not on every\n // parent re-render, so the user's checks aren't wiped out mid-interaction.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, isActive]);\n\n const toggleItem = (id) =>\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const selectedCount = selectedIds.size;\n\n useEffect(() => {\n if (!open) return undefined;\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: \"fixed\", inset: 0, zIndex: 1200, background: \"rgba(0,0,0,0.20)\" }}\n />\n <div\n style={{\n position: \"fixed\",\n top: isPhone ? 0 : hasTopOffset ? normalizedTopOffset : 0,\n right: 0,\n zIndex: 1201,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n width: isPhone ? \"100vw\" : 490,\n maxWidth: \"100vw\",\n height: isPhone ? \"100dvh\" : hasTopOffset ? `calc(100vh - ${normalizedTopOffset})` : \"100vh\",\n padding: 20,\n boxSizing: \"border-box\",\n background: C.white,\n borderRadius: isPhone ? 0 : \"12px 0 0 12px\",\n boxShadow: \"-8px 0 40px rgba(0,0,0,0.18)\",\n fontFamily: FONT,\n }}\n >\n {/* Header */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, width: \"100%\", flexShrink: 0 }}>\n <div style={{ display: \"flex\", flex: 1, minWidth: 0, gap: 8, alignItems: \"center\" }}>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconBg,\n flexShrink: 0,\n }}\n >\n <SquareChartGantt size={20} strokeWidth={1.75} style={{ color: C.ink }} />\n </span>\n <p\n style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 550,\n color: C.ink,\n lineHeight: 1.2,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </p>\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 20,\n height: 20,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: C.ink,\n cursor: \"pointer\",\n flexShrink: 0,\n }}\n >\n <X size={20} strokeWidth={2} />\n </button>\n </div>\n\n <Divider />\n\n {/* Body — scrollable */}\n <div\n className=\"custom-thin-scrollbar\"\n style={{\n flex: 1,\n minHeight: 0,\n width: \"100%\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n {isActive ? (\n <>\n <p style={{ margin: 0, fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {paradigms || \"All Paradigms\"}\n </p>\n {description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {description}\n </p>\n )}\n\n <Divider />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 24,\n width: \"100%\",\n }}\n >\n <span style={{ fontSize: 13, color: C.ink, lineHeight: 1.5 }}>Definition</span>\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 10px\",\n borderRadius: 10,\n border: `1px solid ${C.editBorder}`,\n background: C.white,\n color: C.editText,\n fontFamily: FONT,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n <Pencil size={16} strokeWidth={1.75} style={{ color: C.editText }} />\n Edit\n </button>\n )}\n </div>\n\n {definition && (\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.muted,\n lineHeight: \"normal\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {definition}\n </p>\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", width: \"100%\" }}>\n <MetaRow label=\"Updated\" value={updatedLabel || \"—\"} />\n <MetaRow label=\"Updated By\" value={updatedBy || \"—\"} />\n </div>\n </>\n ) : (\n <>\n {description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {description}\n </p>\n )}\n <Divider />\n {items.length === 0 ? (\n <p style={{ margin: 0, fontSize: 13, color: C.muted }}>No details available.</p>\n ) : (\n <p style={{ margin: 0, fontSize: 13, color: C.ink, lineHeight: \"normal\" }}>\n {selectedCount} of {items.length} {items.length === 1 ? \"Policy\" : \"Policies\"} Selected\n </p>\n )}\n {items.map((item, idx) => {\n const id = itemId(item, idx);\n const checked = selectedIds.has(id);\n return (\n <button\n type=\"button\"\n key={item.id || `${item.title}-${idx}`}\n onClick={() => toggleItem(id)}\n aria-pressed={checked}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${checked ? C.ink : C.cardBorder}`,\n background: C.white,\n width: \"100%\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n marginTop: 2,\n borderRadius: 5,\n flexShrink: 0,\n border: `1px solid ${checked ? \"#0B0B0B\" : \"#676767\"}`,\n background: checked ? \"#0B0B0B\" : \"#FFFFFF\",\n }}\n >\n {checked && <Check size={11} color=\"#FFFFFF\" strokeWidth={3} />}\n </span>\n <span style={{ display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <span style={{ fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {item.title}\n </span>\n {item.description && (\n <span style={{ fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {item.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </>\n )}\n </div>\n\n <Divider />\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 12,\n width: \"100%\",\n flexShrink: 0,\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.btnBorder}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {secondaryLabel}\n </button>\n {primaryLabel && (\n <button\n type=\"button\"\n onClick={() =>\n isActive ? onPrimary?.() : onPrimary?.(Array.from(selectedIds))\n }\n disabled={primaryDisabled || (!isActive && selectedCount === 0)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 550,\n cursor:\n primaryDisabled || (!isActive && selectedCount === 0) ? \"default\" : \"pointer\",\n opacity: primaryDisabled || (!isActive && selectedCount === 0) ? 0.5 : 1,\n }}\n >\n {primaryLabel}\n </button>\n )}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState } from \"react\";\nimport { Filter, Search, ScrollText, Plus } from \"lucide-react\";\nimport PolicyCard from \"./PolicyCard\";\nimport FilterDropdown from \"./FilterDropdown\";\nimport PolicyDetailsDrawer from \"./PolicyDetailsDrawer\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n tabBorder: \"var(--color-divider, #F2F1EF)\",\n tabActive: \"var(--neutral-900, #0B0B0B)\",\n pillActive: \"var(--neutral-900, #0B0B0B)\",\n pillIdle: \"var(--rail-surface-2, #E3E1D7)\",\n searchTrack: \"var(--neutral-150, #D8D8D8)\",\n searchText: \"var(--neutral-400, #989898)\",\n accent: \"var(--rail-orange, #C98A5A)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst pad2 = (n) => String(n).padStart(2, \"0\");\n\nconst matchesSearch = (policy, term) => {\n if (!term) return true;\n const haystack = `${policy?.name || \"\"} ${policy?.description || \"\"} ${policy?.paradigms || \"\"}`.toLowerCase();\n return haystack.includes(term);\n};\n\n/**\n * PoliciesPage — full Policies page (Figma: Active Policies, Browse Policies,\n * filter + search, filter dropdown, view-details drawer).\n *\n * Presentational: data arrives via props, all mutations are delegated to the\n * host via callbacks. Tab / search / filter / drawer state is owned here.\n *\n * Props:\n * - activePolicies [{ id, name, paradigms, description, updatedLabel, updatedBy, status, category, definition }]\n * - activeSectionLabel string Default \"Custom Policies\"\n * - browseCategories [{ id, name, policies: [...] }]\n * - defaultTab \"active\" | \"browse\"\n * - isAdmin boolean\n * - onTest function(policy) Renders the card \"Test\" button when provided\n * - onApplyPolicy function(policy) Apply action in the browse details drawer\n * - topOffset number|string Drawer top offset (e.g. below a navbar)\n * - emptyActiveMessage string\n * - emptyBrowseMessage string\n */\nexport default function PoliciesPage({\n activePolicies = [],\n activeSectionLabel = \"Custom Policies\",\n browseCategories = [],\n defaultTab = \"active\",\n isAdmin = false,\n onTest,\n onApplyPolicy,\n onAddPolicy,\n onEditPolicy,\n onToggleStatus,\n topOffset,\n emptyActiveMessage = \"No active policies yet.\",\n emptyBrowseMessage = \"No policies available to browse.\",\n}) {\n const [tab, setTab] = useState(defaultTab === \"browse\" ? \"browse\" : \"active\");\n const [search, setSearch] = useState(\"\");\n const [filterCategory, setFilterCategory] = useState(\"all\");\n const [filterOpen, setFilterOpen] = useState(false);\n const [details, setDetails] = useState(null); // { policy, mode }\n\n const term = search.trim().toLowerCase();\n\n const filterOptions = useMemo(\n () => browseCategories.map((cat) => ({ id: cat.id, label: cat.name })),\n [browseCategories]\n );\n\n // The Filters button shows the active selection (defaults to \"All\").\n const selectedFilterLabel =\n filterCategory === \"all\"\n ? \"All\"\n : filterOptions.find((o) => o.id === filterCategory)?.label || \"All\";\n\n // Active tab supports search only (the category filter belongs to Browse).\n const filteredActive = useMemo(\n () => activePolicies.filter((p) => matchesSearch(p, term)),\n [activePolicies, term]\n );\n\n const filteredBrowse = useMemo(\n () =>\n browseCategories\n .filter((cat) => filterCategory === \"all\" || cat.id === filterCategory)\n .map((cat) => ({\n ...cat,\n policies: (cat.policies || []).filter((p) => matchesSearch(p, term)),\n }))\n .filter((cat) => cat.policies.length > 0),\n [browseCategories, term, filterCategory]\n );\n\n // Count of browse templates after the current search / category filter, so\n // the tab badge reflects what's actually shown.\n const filteredBrowseCount = useMemo(\n () => filteredBrowse.reduce((sum, cat) => sum + (cat.policies?.length || 0), 0),\n [filteredBrowse]\n );\n\n const openActiveDetails = (policy) => setDetails({ policy, mode: \"active\" });\n const openBrowseDetails = (policy) => setDetails({ policy, mode: \"browse\" });\n const closeDetails = () => setDetails(null);\n\n const TabCell = ({ id, label, count }) => {\n const active = tab === id;\n return (\n <button\n type=\"button\"\n onClick={() => setTab(id)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n padding: \"4px 4px 12px\",\n border: \"none\",\n borderBottom: active ? `2px solid ${C.tabActive}` : \"2px solid transparent\",\n borderRadius: \"4px 4px 0 0\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span style={{ fontSize: 14, color: active ? \"#1E1E1E\" : \"#313131\", lineHeight: 1.2 }}>\n {label}\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n padding: \"2px 6px\",\n borderRadius: 9,\n background: active ? C.pillActive : C.pillIdle,\n color: active ? \"#FFFFFF\" : \"#313131\",\n fontSize: 12,\n lineHeight: 1.2,\n }}\n >\n {count}\n </span>\n </button>\n );\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, fontFamily: FONT }}>\n {/* Heading row: title + filters + search */}\n <div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 12, width: \"100%\" }}>\n {/* The host app renders the page title (via its PageHeader). This flex\n spacer keeps the filters + search right-aligned in this row. */}\n <div style={{ flex: 1, minWidth: 160 }} />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n {tab === \"active\"\n ? onAddPolicy && (\n <button\n type=\"button\"\n onClick={() => onAddPolicy()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px 0 12px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n <Plus size={20} strokeWidth={2} style={{ color: C.onDark }} />\n Policy\n </button>\n )\n : (\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n onClick={() => setFilterOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={filterOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.border}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n <Filter size={20} strokeWidth={1.75} style={{ color: C.ink }} />\n {selectedFilterLabel}\n </button>\n\n {filterOpen && (\n <FilterDropdown\n options={filterOptions}\n value={filterCategory}\n onChange={(id) => {\n setFilterCategory(id);\n setFilterOpen(false);\n }}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Search — shared by both tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: 32,\n width: 260,\n padding: 2,\n borderRadius: 11,\n background: C.searchTrack,\n boxSizing: \"border-box\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flex: 1,\n minWidth: 0,\n alignItems: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 8px\",\n borderRadius: 10,\n background: C.white,\n }}\n >\n <Search size={18} strokeWidth={2} style={{ color: C.searchText, flexShrink: 0 }} />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search\"\n style={{\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: FONT,\n fontSize: 14,\n color: C.ink,\n }}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n borderBottom: `1px solid ${C.tabBorder}`,\n }}\n >\n <TabCell id=\"active\" label=\"Active Policies\" count={pad2(filteredActive.length)} />\n <TabCell id=\"browse\" label=\"Browse Policies\" count={pad2(filteredBrowseCount)} />\n </div>\n\n {/* Content */}\n {tab === \"active\" ? (\n <Section icon label={activeSectionLabel}>\n {filteredActive.length === 0 ? (\n <EmptyMessage text={term ? \"No policies match your search.\" : emptyActiveMessage} />\n ) : (\n <CardGrid>\n {filteredActive.map((policy) => (\n <PolicyCard\n key={policy.id}\n policy={policy}\n variant=\"active\"\n onTest={onTest ? () => onTest(policy) : undefined}\n onViewDetails={() => openActiveDetails(policy)}\n onToggleStatus={isAdmin && onToggleStatus ? onToggleStatus : undefined}\n onEdit={isAdmin && onEditPolicy ? onEditPolicy : undefined}\n />\n ))}\n </CardGrid>\n )}\n </Section>\n ) : filteredBrowse.length === 0 ? (\n <EmptyMessage text={term || filterCategory !== \"all\" ? \"No policies match your search.\" : emptyBrowseMessage} />\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n {filteredBrowse.map((cat) => (\n <Section key={cat.id} icon label={cat.name}>\n <CardGrid>\n {cat.policies.map((policy) => (\n <PolicyCard\n key={policy.id}\n policy={policy}\n variant=\"browse\"\n onViewDetails={() => openBrowseDetails(policy)}\n onApply={isAdmin ? () => openBrowseDetails(policy) : undefined}\n />\n ))}\n </CardGrid>\n </Section>\n ))}\n </div>\n )}\n\n <PolicyDetailsDrawer\n open={Boolean(details)}\n onClose={closeDetails}\n mode={details?.mode}\n title={details?.policy?.name}\n paradigms={details?.policy?.paradigms}\n description={details?.policy?.description}\n definition={details?.policy?.definition}\n updatedLabel={details?.policy?.updatedLabel}\n updatedBy={details?.policy?.updatedBy}\n items={details?.policy?.items || []}\n topOffset={topOffset}\n onEdit={\n details?.mode === \"active\" && isAdmin && onEditPolicy\n ? () => {\n const p = details.policy;\n closeDetails();\n onEditPolicy(p);\n }\n : undefined\n }\n primaryLabel={\n details?.mode === \"browse\"\n ? isAdmin\n ? \"Apply Policy\"\n : undefined\n : isAdmin && onToggleStatus\n ? details?.policy?.status === \"Active\"\n ? \"Disable Policy\"\n : \"Enable Policy\"\n : undefined\n }\n onPrimary={(selectedIds) => {\n const p = details?.policy;\n if (!p) return;\n closeDetails();\n // Browse mode passes the ids of the policies the user checked so the\n // host applies just those, not the whole template.\n if (details.mode === \"browse\") onApplyPolicy?.(p, selectedIds);\n else onToggleStatus?.(p);\n }}\n />\n </div>\n );\n}\n\nfunction Section({ label, icon, children }) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 16, width: \"100%\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, height: 40 }}>\n {icon && <ScrollText size={24} strokeWidth={1.75} style={{ color: C.accent }} />}\n <span\n style={{\n fontFamily: FONT,\n fontSize: 16,\n fontWeight: 600,\n color: C.ink,\n textTransform: \"uppercase\",\n lineHeight: 1.2,\n }}\n >\n {label}\n </span>\n </div>\n {children}\n </section>\n );\n}\n\nfunction CardGrid({ children }) {\n return (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(320px, 360px))\",\n gap: 24,\n width: \"100%\",\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction EmptyMessage({ text }) {\n return <p style={{ margin: 0, fontSize: 14, color: C.muted, fontFamily: FONT }}>{text}</p>;\n}\n"],"names":["C","FONT","clampStyle","lines","isDisabledStatus","status","OutlineButton","children","onClick","jsx","PrimaryButton","KebabMenu","items","onClose","ref","useRef","useEffect","handleClick","e","handleKey","item","idx","PolicyCard","policy","variant","onTest","onViewDetails","onApply","onToggleStatus","onEdit","isBrowse","isAvailable","disabled","StatusIcon","CloudDownload","CloudOff","CloudCheck","menuOpen","setMenuOpen","useState","menuItems","hasMenu","jsxs","v","MoreHorizontal","PolicyCountChip","Fragment","MetaRow","count","n","hasCount","label","noun","FileStack","value","FilterDropdown","options","onChange","rows","row","selected","Check","Divider","PolicyDetailsDrawer","open","mode","title","paradigms","description","definition","updatedLabel","updatedBy","primaryLabel","onPrimary","primaryDisabled","secondaryLabel","topOffset","isPhone","useMediaQuery","hasTopOffset","normalizedTopOffset","isActive","itemId","selectedIds","setSelectedIds","it","id","toggleItem","prev","next","selectedCount","SquareChartGantt","X","Pencil","checked","pad2","matchesSearch","term","PoliciesPage","activePolicies","activeSectionLabel","browseCategories","defaultTab","isAdmin","onApplyPolicy","onAddPolicy","onEditPolicy","emptyActiveMessage","emptyBrowseMessage","tab","setTab","search","setSearch","filterCategory","setFilterCategory","filterOpen","setFilterOpen","details","setDetails","filterOptions","useMemo","cat","selectedFilterLabel","_a","o","filteredActive","p","filteredBrowse","filteredBrowseCount","sum","openActiveDetails","openBrowseDetails","closeDetails","TabCell","active","Plus","Filter","Search","Section","EmptyMessage","CardGrid","_b","_c","_d","_e","_f","_g","_h","_i","icon","ScrollText","text"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"policies.es.js","sources":["../../src/components/policies/PolicyCard.jsx","../../src/components/policies/FilterDropdown.jsx","../../src/components/policies/PolicyDetailsDrawer.jsx","../../src/components/policies/PoliciesPage.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { CloudCheck, CloudOff, CloudDownload, FileStack, MoreHorizontal } from \"lucide-react\";\n\n// Color values resolve to CSS variables declared in `src/tokens/colors.css`.\n// Anything new added here MUST first be added to that file as a `--*` token.\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n cardBorder: \"var(--neutral-300, #B2B2B0)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n btnBorder: \"var(--Grey-absent, #D9D9D9)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n menuHover: \"var(--neutral-100, #E6E6E6)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n// Two-line clamp helper (used for the policy description).\nconst clampStyle = (lines) => ({\n display: \"-webkit-box\",\n WebkitLineClamp: lines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n});\n\n// Status that reads as \"off\" gets the slashed-cloud icon (Figma: Disabled).\nconst isDisabledStatus = (status) => /disabled|inactive|off|available/i.test(String(status || \"\"));\n\nfunction OutlineButton({ children, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 28,\n padding: \"0 10px\",\n borderRadius: 10,\n border: `1px solid ${C.btnBorder}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction PrimaryButton({ children, onClick }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 28,\n padding: \"0 16px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n }}\n >\n {children}\n </button>\n );\n}\n\n// Kebab (⋯) popover menu — outside-click / Escape to close. `items` is a list\n// of { label, onClick }; empty items render nothing.\nfunction KebabMenu({ items, onClose }) {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) onClose?.();\n };\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n return (\n <div\n ref={ref}\n role=\"menu\"\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n right: 0,\n zIndex: 50,\n minWidth: 168,\n display: \"flex\",\n flexDirection: \"column\",\n background: C.white,\n border: `1px solid ${C.btnBorder}`,\n borderRadius: 8,\n boxShadow: \"var(--shadow-popover, 0 12px 32px rgba(11,11,11,0.12))\",\n overflow: \"hidden\",\n }}\n >\n {items.map((item, idx) => (\n <button\n key={item.label}\n type=\"button\"\n role=\"menuitem\"\n onClick={item.onClick}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n padding: \"10px 12px\",\n border: \"none\",\n borderTop: idx === 0 ? \"none\" : `1px solid var(--color-divider, #E5E7EB)`,\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n whiteSpace: \"nowrap\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = C.menuHover;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * PolicyCard — single policy / template card used on both the Active and\n * Browse tabs of the Policies page. Purely presentational; all actions are\n * delegated to the host via callbacks.\n *\n * The two variants (Figma nodes 66:1849 / 73:1099 / 73:1259 vs 73:1150):\n * - \"active\": paradigms line, Updated meta, footer = Test + View Details, and\n * a kebab (⋯) menu with Enable/Disable + Edit definition.\n * - \"browse\": no paradigms line, Policy Count meta, footer = View Details +\n * Apply.\n *\n * Props:\n * - policy { id, name, paradigms, description, updatedLabel, updated_by, status, policyCount }\n * - variant \"active\" | \"browse\" Default \"active\"\n * - onTest function(policy) active — renders the \"Test\" button when provided\n * - onViewDetails function(policy) renders the \"View Details\" button when provided\n * - onApply function(policy) browse — renders the \"Apply\" button when provided\n * - onToggleStatus function(policy) active — kebab \"Enable/Disable Policy\" item\n * - onEdit function(policy) active — kebab \"Edit definition\" item\n */\nexport default function PolicyCard({\n policy = {},\n variant = \"active\",\n onTest,\n onViewDetails,\n onApply,\n onToggleStatus,\n onEdit,\n}) {\n const isBrowse = variant === \"browse\";\n // Browse templates aren't \"disabled\" — they're available to apply. Default\n // their status to \"Available\" and give it its own (non-slashed) icon.\n const status = policy.status || (isBrowse ? \"Available\" : \"Active\");\n const isAvailable = /available/i.test(String(status || \"\"));\n const disabled = !isAvailable && isDisabledStatus(status);\n const StatusIcon = isAvailable ? CloudDownload : disabled ? CloudOff : CloudCheck;\n\n const [menuOpen, setMenuOpen] = useState(false);\n\n const menuItems = [];\n if (onToggleStatus) {\n menuItems.push({\n label: disabled ? \"Enable Policy\" : \"Disable Policy\",\n onClick: () => {\n setMenuOpen(false);\n onToggleStatus(policy);\n },\n });\n }\n if (onEdit) {\n menuItems.push({\n label: \"Edit definition\",\n onClick: () => {\n setMenuOpen(false);\n onEdit(policy);\n },\n });\n }\n const hasMenu = menuItems.length > 0;\n\n return (\n <article\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n alignItems: \"flex-start\",\n minHeight: 82,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${C.cardBorder}`,\n background: C.white,\n boxSizing: \"border-box\",\n width: \"100%\",\n fontFamily: FONT,\n }}\n >\n {/* Content */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, width: \"100%\" }}>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\", width: \"100%\" }}>\n <p\n style={{\n flex: 1,\n minWidth: 0,\n margin: 0,\n fontSize: 14,\n fontWeight: 600,\n color: C.ink,\n lineHeight: \"normal\",\n }}\n >\n {policy.name || \"Untitled policy\"}\n </p>\n {hasMenu && (\n <div style={{ position: \"relative\", display: \"inline-flex\", flexShrink: 0 }}>\n <button\n type=\"button\"\n aria-label=\"More actions\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: C.ink,\n cursor: \"pointer\",\n }}\n >\n <MoreHorizontal size={16} strokeWidth={2} />\n </button>\n {menuOpen && <KebabMenu items={menuItems} onClose={() => setMenuOpen(false)} />}\n </div>\n )}\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 5, width: \"100%\" }}>\n {!isBrowse && (\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.ink,\n lineHeight: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n width: \"100%\",\n }}\n >\n {policy.paradigms || \"All paradigms\"}\n </p>\n )}\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.muted,\n lineHeight: \"normal\",\n minHeight: 32,\n width: \"100%\",\n ...clampStyle(2),\n }}\n >\n {policy.description || \"\"}\n </p>\n </div>\n </div>\n\n {/* Meta */}\n <div style={{ display: \"flex\", flexDirection: \"column\", width: \"100%\" }}>\n {isBrowse ? (\n <PolicyCountChip count={policy.policyCount} />\n ) : (\n <>\n <MetaRow label=\"Updated\" value={policy.updatedLabel || \"—\"} />\n <MetaRow label=\"Updated By\" value={policy.updatedBy || \"—\"} />\n </>\n )}\n </div>\n\n {/* Footer — status + actions */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n width: \"100%\",\n }}\n >\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 12,\n color: C.ink,\n lineHeight: \"16px\",\n }}\n >\n <StatusIcon size={20} strokeWidth={1.5} style={{ color: C.ink }} />\n {status}\n </span>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n {isBrowse ? (\n <>\n {onViewDetails && (\n <OutlineButton onClick={() => onViewDetails(policy)}>View Details</OutlineButton>\n )}\n {onApply && <PrimaryButton onClick={() => onApply(policy)}>Apply</PrimaryButton>}\n </>\n ) : (\n <>\n {onTest && <OutlineButton onClick={() => onTest(policy)}>Test</OutlineButton>}\n {onViewDetails && (\n <PrimaryButton onClick={() => onViewDetails(policy)}>View Details</PrimaryButton>\n )}\n </>\n )}\n </div>\n </div>\n </article>\n );\n}\n\n// Browse-template meta: a chip showing how many policies the template groups,\n// e.g. a stacked-documents icon + \"5 Policies\".\nfunction PolicyCountChip({ count }) {\n const n = parseInt(count, 10);\n const hasCount = Number.isFinite(n);\n const label = hasCount ? n : count ?? \"—\";\n const noun = hasCount && n === 1 ? \"Policy\" : \"Policies\";\n return (\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: \"20px\",\n color: C.ink,\n }}\n >\n <FileStack size={18} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />\n <span>\n {label} {noun}\n </span>\n </div>\n );\n}\n\nfunction MetaRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 24,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: 1.2,\n }}\n >\n <span style={{ width: 80, color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { Check } from \"lucide-react\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\n/**\n * FilterDropdown — \"Filter by\" category popover (Figma node 74:3118).\n *\n * Props:\n * - options [{ id, label }] Category options (an \"All\" row is always prepended)\n * - value string Currently selected option id (\"all\" by default)\n * - onChange function(id)\n * - onClose function Called on outside-click / Escape\n */\nexport default function FilterDropdown({ options = [], value = \"all\", onChange, onClose }) {\n const ref = useRef(null);\n\n useEffect(() => {\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) onClose?.();\n };\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"mousedown\", handleClick);\n document.addEventListener(\"keydown\", handleKey);\n return () => {\n document.removeEventListener(\"mousedown\", handleClick);\n document.removeEventListener(\"keydown\", handleKey);\n };\n }, [onClose]);\n\n const rows = [{ id: \"all\", label: \"All\" }, ...options];\n\n return (\n <div\n ref={ref}\n role=\"listbox\"\n style={{\n position: \"absolute\",\n top: \"calc(100% + 6px)\",\n left: 0,\n zIndex: 50,\n minWidth: 200,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"stretch\",\n background: C.white,\n border: `1px solid ${C.border}`,\n borderRadius: 4,\n boxShadow: \"var(--shadow-dropdown, -2px 2px 1px rgba(0,0,0,0.25))\",\n fontFamily: FONT,\n overflow: \"hidden\",\n }}\n >\n <div style={{ padding: 12 }}>\n <p style={{ margin: 0, fontSize: 13, fontWeight: 700, color: C.ink, lineHeight: 1.2 }}>\n Filter by\n </p>\n </div>\n {rows.map((row) => {\n const selected = row.id === value;\n return (\n <button\n key={row.id}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onClick={() => onChange?.(row.id)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n // Selected row shows the check at pl-12; unselected rows indent to\n // pl-40 (12 + 20 check + 8 gap) so their labels line up.\n padding: selected ? \"12px\" : \"12px 12px 12px 40px\",\n borderTop: `1px solid ${C.border}`,\n background: \"transparent\",\n cursor: \"pointer\",\n textAlign: \"left\",\n fontFamily: FONT,\n fontSize: 13,\n color: C.ink,\n lineHeight: 1.2,\n }}\n >\n {selected && <Check size={20} strokeWidth={2} style={{ color: C.ink, flexShrink: 0 }} />}\n {row.label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { X, SquareChartGantt, Pencil, Check } from \"lucide-react\";\nimport { useMediaQuery } from \"../../utils/useMediaQuery\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n cardBorder: \"var(--neutral-300, #B2B2B0)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n btnBorder: \"var(--Grey-absent, #D9D9D9)\",\n editBorder: \"var(--neutral-250, #BFBFBF)\",\n editText: \"var(--neutral-800, #323232)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n iconBg: \"var(--surface-hover, #F3F7F7)\",\n line: \"var(--color-divider, #E5E7EB)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst Divider = () => <div style={{ width: \"100%\", height: 1, background: C.line, flexShrink: 0 }} />;\n\nfunction MetaRow({ label, value }) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: 24,\n padding: \"8px 8px 12px 0\",\n fontSize: 13,\n lineHeight: 1.2,\n }}\n >\n <span style={{ width: 80, color: C.ink }}>{label}</span>\n <span style={{ color: C.muted }}>{value}</span>\n </div>\n );\n}\n\n/**\n * PolicyDetailsDrawer — slide-in \"View Details\" panel.\n *\n * Two layouts (Figma nodes 73:1111 vs 74:2974):\n * - mode=\"active\": paradigms title → description → Definition section (with\n * optional Edit button) → definition text → Updated / Created By meta.\n * Footer primary action is the enable/disable toggle.\n * - mode=\"browse\": description → list of constituent policy items. Footer\n * primary action is \"Apply Policy\".\n *\n * Props:\n * - open, onClose\n * - mode \"active\" | \"browse\" Default \"browse\"\n * - title string\n * - paradigms string (active)\n * - description string\n * - definition string (active)\n * - updatedLabel string (active)\n * - updatedBy string (active)\n * - onEdit function (active — renders the Edit button when provided)\n * - items [{ title, description }] (browse)\n * - primaryLabel string Optional — renders the primary footer button when set\n * - onPrimary function\n * - primaryDisabled boolean\n * - secondaryLabel string Default \"Cancel\"\n * - topOffset number|string\n */\nexport default function PolicyDetailsDrawer({\n open,\n onClose,\n mode = \"browse\",\n title,\n paradigms,\n description,\n definition,\n updatedLabel,\n updatedBy,\n onEdit,\n items = [],\n primaryLabel,\n onPrimary,\n primaryDisabled = false,\n secondaryLabel = \"Cancel\",\n topOffset,\n}) {\n const isPhone = useMediaQuery(\"(max-width: 640px)\");\n const hasTopOffset = topOffset !== undefined && topOffset !== null;\n const normalizedTopOffset = typeof topOffset === \"number\" ? `${topOffset}px` : topOffset;\n const isActive = mode === \"active\";\n\n const itemId = (item, idx) => item?.id ?? idx;\n\n // Browse mode: the user picks which policies from the template to apply.\n // Checkboxes are seeded from each item's `defaultChecked` (the project's\n // current enabled state for that policy); Apply stays disabled until at\n // least one is checked.\n const [selectedIds, setSelectedIds] = useState(() => new Set());\n useEffect(() => {\n if (open && !isActive) {\n setSelectedIds(\n new Set(\n items\n .map((it, idx) => (it?.defaultChecked ? itemId(it, idx) : null))\n .filter((id) => id !== null)\n )\n );\n }\n // Reset only when the drawer opens (or the mode flips) — not on every\n // parent re-render, so the user's checks aren't wiped out mid-interaction.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, isActive]);\n\n const toggleItem = (id) =>\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n\n const selectedCount = selectedIds.size;\n\n useEffect(() => {\n if (!open) return undefined;\n const handleKey = (e) => {\n if (e.key === \"Escape\") onClose?.();\n };\n document.addEventListener(\"keydown\", handleKey);\n return () => document.removeEventListener(\"keydown\", handleKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n <div\n onClick={onClose}\n style={{ position: \"fixed\", inset: 0, zIndex: 1200, background: \"rgba(0,0,0,0.20)\" }}\n />\n <div\n style={{\n position: \"fixed\",\n top: isPhone ? 0 : hasTopOffset ? normalizedTopOffset : 0,\n right: 0,\n zIndex: 1201,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n width: isPhone ? \"100vw\" : 490,\n maxWidth: \"100vw\",\n height: isPhone ? \"100dvh\" : hasTopOffset ? `calc(100vh - ${normalizedTopOffset})` : \"100vh\",\n padding: 20,\n boxSizing: \"border-box\",\n background: C.white,\n borderRadius: isPhone ? 0 : \"12px 0 0 12px\",\n boxShadow: \"-8px 0 40px rgba(0,0,0,0.18)\",\n fontFamily: FONT,\n }}\n >\n {/* Header */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, width: \"100%\", flexShrink: 0 }}>\n <div style={{ display: \"flex\", flex: 1, minWidth: 0, gap: 8, alignItems: \"center\" }}>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 34,\n height: 34,\n borderRadius: 9999,\n background: C.iconBg,\n flexShrink: 0,\n }}\n >\n <SquareChartGantt size={20} strokeWidth={1.75} style={{ color: C.ink }} />\n </span>\n <p\n style={{\n margin: 0,\n fontSize: 16,\n fontWeight: 550,\n color: C.ink,\n lineHeight: 1.2,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </p>\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 20,\n height: 20,\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: C.ink,\n cursor: \"pointer\",\n flexShrink: 0,\n }}\n >\n <X size={20} strokeWidth={2} />\n </button>\n </div>\n\n <Divider />\n\n {/* Body — scrollable */}\n <div\n className=\"custom-thin-scrollbar\"\n style={{\n flex: 1,\n minHeight: 0,\n width: \"100%\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n {isActive ? (\n <>\n <p style={{ margin: 0, fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {paradigms || \"All Paradigms\"}\n </p>\n {description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {description}\n </p>\n )}\n\n <Divider />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 24,\n width: \"100%\",\n }}\n >\n <span style={{ fontSize: 13, color: C.ink, lineHeight: 1.5 }}>Definition</span>\n {onEdit && (\n <button\n type=\"button\"\n onClick={onEdit}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 10px\",\n borderRadius: 10,\n border: `1px solid ${C.editBorder}`,\n background: C.white,\n color: C.editText,\n fontFamily: FONT,\n fontSize: 14,\n cursor: \"pointer\",\n }}\n >\n <Pencil size={16} strokeWidth={1.75} style={{ color: C.editText }} />\n Edit\n </button>\n )}\n </div>\n\n {definition && (\n <p\n style={{\n margin: 0,\n fontSize: 13,\n color: C.muted,\n lineHeight: \"normal\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {definition}\n </p>\n )}\n\n <div style={{ display: \"flex\", flexDirection: \"column\", width: \"100%\" }}>\n <MetaRow label=\"Updated\" value={updatedLabel || \"—\"} />\n <MetaRow label=\"Updated By\" value={updatedBy || \"—\"} />\n </div>\n </>\n ) : (\n <>\n {description && (\n <p style={{ margin: 0, fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {description}\n </p>\n )}\n <Divider />\n {items.length === 0 ? (\n <p style={{ margin: 0, fontSize: 13, color: C.muted }}>No details available.</p>\n ) : (\n <p style={{ margin: 0, fontSize: 13, color: C.ink, lineHeight: \"normal\" }}>\n {selectedCount} of {items.length} {items.length === 1 ? \"Policy\" : \"Policies\"} Selected\n </p>\n )}\n {items.map((item, idx) => {\n const id = itemId(item, idx);\n const checked = selectedIds.has(id);\n return (\n <button\n type=\"button\"\n key={item.id || `${item.title}-${idx}`}\n onClick={() => toggleItem(id)}\n aria-pressed={checked}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 16,\n borderRadius: 8,\n border: `1px solid ${checked ? C.ink : C.cardBorder}`,\n background: C.white,\n width: \"100%\",\n boxSizing: \"border-box\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span\n aria-hidden=\"true\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n height: 16,\n marginTop: 2,\n borderRadius: 5,\n flexShrink: 0,\n border: `1px solid ${checked ? \"#0B0B0B\" : \"#676767\"}`,\n background: checked ? \"#0B0B0B\" : \"#FFFFFF\",\n }}\n >\n {checked && <Check size={11} color=\"#FFFFFF\" strokeWidth={3} />}\n </span>\n <span style={{ display: \"flex\", flexDirection: \"column\", gap: 8, minWidth: 0 }}>\n <span style={{ fontSize: 14, fontWeight: 600, color: C.ink, lineHeight: \"normal\" }}>\n {item.title}\n </span>\n {item.description && (\n <span style={{ fontSize: 13, color: C.muted, lineHeight: \"normal\" }}>\n {item.description}\n </span>\n )}\n </span>\n </button>\n );\n })}\n </>\n )}\n </div>\n\n <Divider />\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n gap: 12,\n width: \"100%\",\n flexShrink: 0,\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.btnBorder}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n {secondaryLabel}\n </button>\n {primaryLabel && (\n <button\n type=\"button\"\n onClick={() =>\n isActive ? onPrimary?.() : onPrimary?.(Array.from(selectedIds))\n }\n disabled={primaryDisabled || (!isActive && selectedCount === 0)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 550,\n cursor:\n primaryDisabled || (!isActive && selectedCount === 0) ? \"default\" : \"pointer\",\n opacity: primaryDisabled || (!isActive && selectedCount === 0) ? 0.5 : 1,\n }}\n >\n {primaryLabel}\n </button>\n )}\n </div>\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport React, { useMemo, useState } from \"react\";\nimport { Filter, Search, ScrollText, Plus } from \"lucide-react\";\nimport PolicyCard from \"./PolicyCard\";\nimport FilterDropdown from \"./FilterDropdown\";\nimport PolicyDetailsDrawer from \"./PolicyDetailsDrawer\";\n\nconst C = {\n ink: \"var(--Grey-Strong, #2E3236)\",\n muted: \"var(--Grey-Muted, #808183)\",\n white: \"var(--Grey-White, #FFFFFF)\",\n border: \"var(--Grey-absent, #D9D9D9)\",\n tabBorder: \"var(--color-divider, #F2F1EF)\",\n tabActive: \"var(--neutral-900, #0B0B0B)\",\n pillActive: \"var(--neutral-900, #0B0B0B)\",\n pillIdle: \"var(--rail-surface-2, #E3E1D7)\",\n searchTrack: \"var(--neutral-150, #D8D8D8)\",\n searchText: \"var(--neutral-400, #989898)\",\n accent: \"var(--rail-orange, #C98A5A)\",\n dark: \"var(--neutral-850, #272727)\",\n onDark: \"var(--neutral-50, #F2F2F0)\",\n};\n\nconst FONT = \"var(--font-sans, 'Averta', ui-sans-serif, system-ui, sans-serif)\";\n\nconst pad2 = (n) => String(n).padStart(2, \"0\");\n\nconst matchesSearch = (policy, term) => {\n if (!term) return true;\n const haystack = `${policy?.name || \"\"} ${policy?.description || \"\"} ${policy?.paradigms || \"\"}`.toLowerCase();\n return haystack.includes(term);\n};\n\n/**\n * PoliciesPage — full Policies page (Figma: Active Policies, Browse Policies,\n * filter + search, filter dropdown, view-details drawer).\n *\n * Presentational: data arrives via props, all mutations are delegated to the\n * host via callbacks. Tab / search / filter / drawer state is owned here.\n *\n * Props:\n * - activePolicies [{ id, name, paradigms, description, updatedLabel, updatedBy, status, category, definition }]\n * - activeSectionLabel string Default \"Custom Policies\"\n * - browseCategories [{ id, name, policies: [...] }]\n * - defaultTab \"active\" | \"browse\"\n * - isAdmin boolean\n * - onTest function(policy) Renders the card \"Test\" button when provided\n * - onApplyPolicy function(policy) Apply action in the browse details drawer\n * - topOffset number|string Drawer top offset (e.g. below a navbar)\n * - emptyActiveMessage string\n * - emptyBrowseMessage string\n */\nexport default function PoliciesPage({\n activePolicies = [],\n activeSectionLabel = \"Custom Policies\",\n browseCategories = [],\n defaultTab = \"active\",\n isAdmin = false,\n onTest,\n onApplyPolicy,\n onAddPolicy,\n onEditPolicy,\n onToggleStatus,\n topOffset,\n emptyActiveMessage = \"No active policies yet.\",\n emptyBrowseMessage = \"No policies available to browse.\",\n}) {\n const [tab, setTab] = useState(defaultTab === \"browse\" ? \"browse\" : \"active\");\n const [search, setSearch] = useState(\"\");\n const [filterCategory, setFilterCategory] = useState(\"all\");\n const [filterOpen, setFilterOpen] = useState(false);\n const [details, setDetails] = useState(null); // { policy, mode }\n\n const term = search.trim().toLowerCase();\n\n const filterOptions = useMemo(\n () => browseCategories.map((cat) => ({ id: cat.id, label: cat.name })),\n [browseCategories]\n );\n\n // The Filters button shows the active selection (defaults to \"All\").\n const selectedFilterLabel =\n filterCategory === \"all\"\n ? \"All\"\n : filterOptions.find((o) => o.id === filterCategory)?.label || \"All\";\n\n // Active tab supports search only (the category filter belongs to Browse).\n const filteredActive = useMemo(\n () => activePolicies.filter((p) => matchesSearch(p, term)),\n [activePolicies, term]\n );\n\n const filteredBrowse = useMemo(\n () =>\n browseCategories\n .filter((cat) => filterCategory === \"all\" || cat.id === filterCategory)\n .map((cat) => ({\n ...cat,\n policies: (cat.policies || []).filter((p) => matchesSearch(p, term)),\n }))\n .filter((cat) => cat.policies.length > 0),\n [browseCategories, term, filterCategory]\n );\n\n // Count of browse templates after the current search / category filter, so\n // the tab badge reflects what's actually shown.\n const filteredBrowseCount = useMemo(\n () => filteredBrowse.reduce((sum, cat) => sum + (cat.policies?.length || 0), 0),\n [filteredBrowse]\n );\n\n const openActiveDetails = (policy) => setDetails({ policy, mode: \"active\" });\n const openBrowseDetails = (policy) => setDetails({ policy, mode: \"browse\" });\n const closeDetails = () => setDetails(null);\n\n const TabCell = ({ id, label, count }) => {\n const active = tab === id;\n return (\n <button\n type=\"button\"\n onClick={() => setTab(id)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 4,\n padding: \"4px 4px 12px\",\n border: \"none\",\n borderBottom: active ? `2px solid ${C.tabActive}` : \"2px solid transparent\",\n borderRadius: \"4px 4px 0 0\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontFamily: FONT,\n }}\n >\n <span style={{ fontSize: 14, color: active ? \"#1E1E1E\" : \"#313131\", lineHeight: 1.2 }}>\n {label}\n </span>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n padding: \"2px 6px\",\n borderRadius: 9,\n background: active ? C.pillActive : C.pillIdle,\n color: active ? \"#FFFFFF\" : \"#313131\",\n fontSize: 12,\n lineHeight: 1.2,\n }}\n >\n {count}\n </span>\n </button>\n );\n };\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16, fontFamily: FONT }}>\n {/* Heading row: title + filters + search */}\n <div style={{ display: \"flex\", flexWrap: \"wrap\", alignItems: \"center\", gap: 12, width: \"100%\" }}>\n {/* The host app renders the page title (via its PageHeader). This flex\n spacer keeps the filters + search right-aligned in this row. */}\n <div style={{ flex: 1, minWidth: 160 }} />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n {tab === \"active\"\n ? onAddPolicy && (\n <button\n type=\"button\"\n onClick={() => onAddPolicy()}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n height: 32,\n padding: \"0 16px 0 12px\",\n borderRadius: 10,\n border: \"none\",\n background: C.dark,\n color: C.onDark,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n <Plus size={20} strokeWidth={2} style={{ color: C.onDark }} />\n Policy\n </button>\n )\n : (\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n onClick={() => setFilterOpen((v) => !v)}\n aria-haspopup=\"listbox\"\n aria-expanded={filterOpen}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n height: 32,\n padding: \"0 16px\",\n borderRadius: 10,\n border: `1px solid ${C.border}`,\n background: C.white,\n color: C.ink,\n fontFamily: FONT,\n fontSize: 14,\n fontWeight: 600,\n cursor: \"pointer\",\n }}\n >\n <Filter size={20} strokeWidth={1.75} style={{ color: C.ink }} />\n {selectedFilterLabel}\n </button>\n\n {filterOpen && (\n <FilterDropdown\n options={filterOptions}\n value={filterCategory}\n onChange={(id) => {\n setFilterCategory(id);\n setFilterOpen(false);\n }}\n onClose={() => setFilterOpen(false)}\n />\n )}\n </div>\n )}\n\n {/* Search — shared by both tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: 32,\n width: 260,\n padding: 2,\n borderRadius: 11,\n background: C.searchTrack,\n boxSizing: \"border-box\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flex: 1,\n minWidth: 0,\n alignItems: \"center\",\n gap: 8,\n height: 28,\n padding: \"0 8px\",\n borderRadius: 10,\n background: C.white,\n }}\n >\n <Search size={18} strokeWidth={2} style={{ color: C.searchText, flexShrink: 0 }} />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search\"\n style={{\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontFamily: FONT,\n fontSize: 14,\n color: C.ink,\n }}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n width: \"100%\",\n borderBottom: `1px solid ${C.tabBorder}`,\n }}\n >\n <TabCell id=\"active\" label=\"Active Policies\" count={pad2(filteredActive.length)} />\n <TabCell id=\"browse\" label=\"Browse Policies\" count={pad2(filteredBrowseCount)} />\n </div>\n\n {/* Content */}\n {tab === \"active\" ? (\n <Section icon label={activeSectionLabel}>\n {filteredActive.length === 0 ? (\n <EmptyMessage text={term ? \"No policies match your search.\" : emptyActiveMessage} />\n ) : (\n <CardGrid>\n {filteredActive.map((policy) => (\n <PolicyCard\n key={policy.id}\n policy={policy}\n variant=\"active\"\n onTest={onTest ? () => onTest(policy) : undefined}\n onViewDetails={() => openActiveDetails(policy)}\n onToggleStatus={isAdmin && onToggleStatus ? onToggleStatus : undefined}\n onEdit={isAdmin && onEditPolicy ? onEditPolicy : undefined}\n />\n ))}\n </CardGrid>\n )}\n </Section>\n ) : filteredBrowse.length === 0 ? (\n <EmptyMessage text={term || filterCategory !== \"all\" ? \"No policies match your search.\" : emptyBrowseMessage} />\n ) : (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 24 }}>\n {filteredBrowse.map((cat) => (\n <Section key={cat.id} icon label={cat.name}>\n <CardGrid>\n {cat.policies.map((policy) => (\n <PolicyCard\n key={policy.id}\n policy={policy}\n variant=\"browse\"\n onViewDetails={() => openBrowseDetails(policy)}\n />\n ))}\n </CardGrid>\n </Section>\n ))}\n </div>\n )}\n\n <PolicyDetailsDrawer\n open={Boolean(details)}\n onClose={closeDetails}\n mode={details?.mode}\n title={details?.policy?.name}\n paradigms={details?.policy?.paradigms}\n description={details?.policy?.description}\n definition={details?.policy?.definition}\n updatedLabel={details?.policy?.updatedLabel}\n updatedBy={details?.policy?.updatedBy}\n items={details?.policy?.items || []}\n topOffset={topOffset}\n onEdit={\n details?.mode === \"active\" && isAdmin && onEditPolicy\n ? () => {\n const p = details.policy;\n closeDetails();\n onEditPolicy(p);\n }\n : undefined\n }\n primaryLabel={\n details?.mode === \"browse\"\n ? isAdmin\n ? \"Apply Policy\"\n : undefined\n : isAdmin && onToggleStatus\n ? details?.policy?.status === \"Active\"\n ? \"Disable Policy\"\n : \"Enable Policy\"\n : undefined\n }\n onPrimary={(selectedIds) => {\n const p = details?.policy;\n if (!p) return;\n closeDetails();\n // Browse mode passes the ids of the policies the user checked so the\n // host applies just those, not the whole template.\n if (details.mode === \"browse\") onApplyPolicy?.(p, selectedIds);\n else onToggleStatus?.(p);\n }}\n />\n </div>\n );\n}\n\nfunction Section({ label, icon, children }) {\n return (\n <section style={{ display: \"flex\", flexDirection: \"column\", gap: 16, width: \"100%\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8, height: 40 }}>\n {icon && <ScrollText size={24} strokeWidth={1.75} style={{ color: C.accent }} />}\n <span\n style={{\n fontFamily: FONT,\n fontSize: 16,\n fontWeight: 600,\n color: C.ink,\n textTransform: \"uppercase\",\n lineHeight: 1.2,\n }}\n >\n {label}\n </span>\n </div>\n {children}\n </section>\n );\n}\n\nfunction CardGrid({ children }) {\n return (\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(320px, 360px))\",\n gap: 24,\n width: \"100%\",\n }}\n >\n {children}\n </div>\n );\n}\n\nfunction EmptyMessage({ text }) {\n return <p style={{ margin: 0, fontSize: 14, color: C.muted, fontFamily: FONT }}>{text}</p>;\n}\n"],"names":["C","FONT","clampStyle","lines","isDisabledStatus","status","OutlineButton","children","onClick","jsx","PrimaryButton","KebabMenu","items","onClose","ref","useRef","useEffect","handleClick","e","handleKey","item","idx","PolicyCard","policy","variant","onTest","onViewDetails","onApply","onToggleStatus","onEdit","isBrowse","isAvailable","disabled","StatusIcon","CloudDownload","CloudOff","CloudCheck","menuOpen","setMenuOpen","useState","menuItems","hasMenu","jsxs","v","MoreHorizontal","PolicyCountChip","Fragment","MetaRow","count","n","hasCount","label","noun","FileStack","value","FilterDropdown","options","onChange","rows","row","selected","Check","Divider","PolicyDetailsDrawer","open","mode","title","paradigms","description","definition","updatedLabel","updatedBy","primaryLabel","onPrimary","primaryDisabled","secondaryLabel","topOffset","isPhone","useMediaQuery","hasTopOffset","normalizedTopOffset","isActive","itemId","selectedIds","setSelectedIds","it","id","toggleItem","prev","next","selectedCount","SquareChartGantt","X","Pencil","checked","pad2","matchesSearch","term","PoliciesPage","activePolicies","activeSectionLabel","browseCategories","defaultTab","isAdmin","onApplyPolicy","onAddPolicy","onEditPolicy","emptyActiveMessage","emptyBrowseMessage","tab","setTab","search","setSearch","filterCategory","setFilterCategory","filterOpen","setFilterOpen","details","setDetails","filterOptions","useMemo","cat","selectedFilterLabel","_a","o","filteredActive","p","filteredBrowse","filteredBrowseCount","sum","openActiveDetails","openBrowseDetails","closeDetails","TabCell","active","Plus","Filter","Search","Section","EmptyMessage","CardGrid","_b","_c","_d","_e","_f","_g","_h","_i","icon","ScrollText","text"],"mappings":";;;;AAOA,MAAMA,IAAI;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AACb,GAEMC,IAAO,oEAGPC,KAAa,CAACC,OAAW;AAAA,EAC7B,SAAS;AAAA,EACT,iBAAiBA;AAAA,EACjB,iBAAiB;AAAA,EACjB,UAAU;AACZ,IAGMC,KAAmB,CAACC,MAAW,mCAAmC,KAAK,OAAOA,KAAU,EAAE,CAAC;AAEjG,SAASC,GAAc,EAAE,UAAAC,GAAU,SAAAC,KAAW;AAE1C,SAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAAD;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ,aAAaR,EAAE,SAAS;AAAA,QAChC,YAAYA,EAAE;AAAA,QACd,OAAOA,EAAE;AAAA,QACT,YAAYC;AAAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,MAEC,UAAAM;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASG,GAAc,EAAE,UAAAH,GAAU,SAAAC,KAAW;AAE1C,SAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAAD;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,YAAYR,EAAE;AAAA,QACd,OAAOA,EAAE;AAAA,QACT,YAAYC;AAAAA,QACZ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,MAEC,UAAAM;AAAA,IAAA;AAAA,EAAA;AAGP;AAIA,SAASI,GAAU,EAAE,OAAAC,GAAO,SAAAC,KAAW;AAC/B,QAAAC,IAAMC,GAAO,IAAI;AAEvB,SAAAC,EAAU,MAAM;AACR,UAAAC,IAAc,CAACC,MAAM;AACzB,MAAIJ,EAAI,WAAW,CAACA,EAAI,QAAQ,SAASI,EAAE,MAAM,MAAaL,KAAA,QAAAA;AAAA,IAAA,GAE1DM,IAAY,CAACD,MAAM;AACvB,MAAIA,EAAE,QAAQ,aAAoBL,KAAA,QAAAA;AAAA,IAAA;AAE3B,oBAAA,iBAAiB,aAAaI,CAAW,GACzC,SAAA,iBAAiB,WAAWE,CAAS,GACvC,MAAM;AACF,eAAA,oBAAoB,aAAaF,CAAW,GAC5C,SAAA,oBAAoB,WAAWE,CAAS;AAAA,IAAA;AAAA,EACnD,GACC,CAACN,CAAO,CAAC,GAGV,gBAAAJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAK;AAAA,MACA,MAAK;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAYd,EAAE;AAAA,QACd,QAAQ,aAAaA,EAAE,SAAS;AAAA,QAChC,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AAAA,MAEC,UAAMY,EAAA,IAAI,CAACQ,GAAMC,MAChB,gBAAAZ;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,MAAK;AAAA,UACL,SAASW,EAAK;AAAA,UACd,OAAO;AAAA,YACL,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,WAAWC,MAAQ,IAAI,SAAS;AAAA,YAChC,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,YAAYpB;AAAAA,YACZ,UAAU;AAAA,YACV,OAAOD,EAAE;AAAA,YACT,YAAY;AAAA,YACZ,YAAY;AAAA,UACd;AAAA,UACA,cAAc,CAACkB,MAAM;AACjB,YAAAA,EAAA,cAAc,MAAM,aAAalB,EAAE;AAAA,UACvC;AAAA,UACA,cAAc,CAACkB,MAAM;AACjB,YAAAA,EAAA,cAAc,MAAM,aAAa;AAAA,UACrC;AAAA,UAEC,UAAKE,EAAA;AAAA,QAAA;AAAA,QA3BDA,EAAK;AAAA,MAAA,CA6Bb;AAAA,IAAA;AAAA,EAAA;AAGP;AAsBA,SAAwBE,GAAW;AAAA,EACjC,QAAAC,IAAS,CAAC;AAAA,EACV,SAAAC,IAAU;AAAA,EACV,QAAAC;AAAA,EACA,eAAAC;AAAA,EACA,SAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,QAAAC;AACF,GAAG;AACD,QAAMC,IAAWN,MAAY,UAGvBnB,IAASkB,EAAO,WAAWO,IAAW,cAAc,WACpDC,IAAc,aAAa,KAAK,OAAO1B,KAAU,EAAE,CAAC,GACpD2B,IAAW,CAACD,KAAe3B,GAAiBC,CAAM,GAClD4B,IAAaF,IAAcG,KAAgBF,IAAWG,KAAWC,IAEjE,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GAExCC,IAAY,CAAA;AAClB,EAAIZ,KACFY,EAAU,KAAK;AAAA,IACb,OAAOR,IAAW,kBAAkB;AAAA,IACpC,SAAS,MAAM;AACb,MAAAM,EAAY,EAAK,GACjBV,EAAeL,CAAM;AAAA,IACvB;AAAA,EAAA,CACD,GAECM,KACFW,EAAU,KAAK;AAAA,IACb,OAAO;AAAA,IACP,SAAS,MAAM;AACb,MAAAF,EAAY,EAAK,GACjBT,EAAON,CAAM;AAAA,IACf;AAAA,EAAA,CACD;AAEG,QAAAkB,IAAUD,EAAU,SAAS;AAGjC,SAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ,aAAa1C,EAAE,UAAU;AAAA,QACjC,YAAYA,EAAE;AAAA,QACd,WAAW;AAAA,QACX,OAAO;AAAA,QACP,YAAYC;AAAAA,MACd;AAAA,MAGA,UAAA;AAAA,QAAC,gBAAAyC,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,OAAO,OAAA,GACrE,UAAA;AAAA,UAAC,gBAAAA,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,GAAG,YAAY,UAAU,OAAO,OAAA,GAClE,UAAA;AAAA,YAAA,gBAAAjC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,UAAU;AAAA,kBACV,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAOT,EAAE;AAAA,kBACT,YAAY;AAAA,gBACd;AAAA,gBAEC,YAAO,QAAQ;AAAA,cAAA;AAAA,YAClB;AAAA,YACCyC,KACE,gBAAAC,EAAA,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,SAAS,eAAe,YAAY,EAAA,GACtE,UAAA;AAAA,cAAA,gBAAAjC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAW;AAAA,kBACX,iBAAc;AAAA,kBACd,iBAAe4B;AAAA,kBACf,SAAS,MAAMC,EAAY,CAACK,MAAM,CAACA,CAAC;AAAA,kBACpC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,YAAY;AAAA,oBACZ,OAAO3C,EAAE;AAAA,oBACT,QAAQ;AAAA,kBACV;AAAA,kBAEA,UAAC,gBAAAS,EAAAmC,IAAA,EAAe,MAAM,IAAI,aAAa,GAAG;AAAA,gBAAA;AAAA,cAC5C;AAAA,cACCP,uBAAa1B,IAAU,EAAA,OAAO6B,GAAW,SAAS,MAAMF,EAAY,EAAK,GAAG;AAAA,YAAA,GAC/E;AAAA,UAAA,GAEJ;AAAA,UAEC,gBAAAI,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,OAAO,OAAA,GACpE,UAAA;AAAA,YAAA,CAACZ,KACA,gBAAArB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,OAAOT,EAAE;AAAA,kBACT,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,OAAO;AAAA,gBACT;AAAA,gBAEC,YAAO,aAAa;AAAA,cAAA;AAAA,YACvB;AAAA,YAEF,gBAAAS;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,OAAOT,EAAE;AAAA,kBACT,YAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,OAAO;AAAA,kBACP,GAAGE,GAAW,CAAC;AAAA,gBACjB;AAAA,gBAEC,YAAO,eAAe;AAAA,cAAA;AAAA,YACzB;AAAA,UAAA,GACF;AAAA,QAAA,GACF;AAAA,0BAGC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,OAAO,UAC5D,cACE,gBAAAO,EAAAoC,IAAA,EAAgB,OAAOtB,EAAO,YAAa,CAAA,IAG1C,gBAAAmB,EAAAI,GAAA,EAAA,UAAA;AAAA,UAAA,gBAAArC,EAACsC,MAAQ,OAAM,WAAU,OAAOxB,EAAO,gBAAgB,KAAK;AAAA,4BAC3DwB,IAAQ,EAAA,OAAM,cAAa,OAAOxB,EAAO,aAAa,KAAK;AAAA,QAAA,EAAA,CAC9D,EAEJ,CAAA;AAAA,QAGA,gBAAAmB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,OAAO;AAAA,YACT;AAAA,YAEA,UAAA;AAAA,cAAA,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,UAAU;AAAA,oBACV,OAAO1C,EAAE;AAAA,oBACT,YAAY;AAAA,kBACd;AAAA,kBAEA,UAAA;AAAA,oBAAC,gBAAAS,EAAAwB,GAAA,EAAW,MAAM,IAAI,aAAa,KAAK,OAAO,EAAE,OAAOjC,EAAE,IAAO,EAAA,CAAA;AAAA,oBAChEK;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACH;AAAA,cAEC,gBAAAI,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GACvD,GAAA,UAAAqB,IAEI,gBAAAY,EAAAI,GAAA,EAAA,UAAA;AAAA,gBAAApB,uBACEpB,IAAc,EAAA,SAAS,MAAMoB,EAAcH,CAAM,GAAG,UAAY,gBAAA;AAAA,gBAElEI,uBAAYjB,IAAc,EAAA,SAAS,MAAMiB,EAAQJ,CAAM,GAAG,UAAK,SAAA;AAAA,cAAA,EAAA,CAClE,IAGG,gBAAAmB,EAAAI,GAAA,EAAA,UAAA;AAAA,gBAAArB,uBAAWnB,IAAc,EAAA,SAAS,MAAMmB,EAAOF,CAAM,GAAG,UAAI,QAAA;AAAA,gBAC5DG,uBACEhB,IAAc,EAAA,SAAS,MAAMgB,EAAcH,CAAM,GAAG,UAAY,gBAAA;AAAA,cAAA,EAAA,CAErE,EAEJ,CAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAIA,SAASsB,GAAgB,EAAE,OAAAG,KAAS;AAC5B,QAAAC,IAAI,SAASD,GAAO,EAAE,GACtBE,IAAW,OAAO,SAASD,CAAC,GAC5BE,IAAQD,IAAWD,IAAID,KAAS,KAChCI,IAAOF,KAAYD,MAAM,IAAI,WAAW;AAE5C,SAAA,gBAAAP;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO1C,EAAE;AAAA,MACX;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAS,EAAC4C,IAAU,EAAA,MAAM,IAAI,aAAa,GAAG,OAAO,EAAE,OAAOrD,EAAE,KAAK,YAAY,EAAK,EAAA,CAAA;AAAA,0BAC5E,QACE,EAAA,UAAA;AAAA,UAAAmD;AAAA,UAAM;AAAA,UAAEC;AAAA,QAAA,GACX;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAASL,GAAQ,EAAE,OAAAI,GAAO,OAAAG,KAAS;AAE/B,SAAA,gBAAAZ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MAEA,UAAA;AAAA,QAAC,gBAAAjC,EAAA,QAAA,EAAK,OAAO,EAAE,OAAO,IAAI,OAAOT,EAAE,IAAI,GAAI,UAAMmD,EAAA,CAAA;AAAA,QACjD,gBAAA1C,EAAC,UAAK,OAAO,EAAE,OAAOT,EAAE,SAAU,UAAMsD,GAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG9C;AC3ZA,MAAMtD,IAAI;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AACT,GAEMC,KAAO;AAWW,SAAAsD,GAAe,EAAE,SAAAC,IAAU,IAAI,OAAAF,IAAQ,OAAO,UAAAG,GAAU,SAAA5C,KAAW;AACnF,QAAAC,IAAMC,GAAO,IAAI;AAEvB,EAAAC,EAAU,MAAM;AACR,UAAAC,IAAc,CAACC,MAAM;AACzB,MAAIJ,EAAI,WAAW,CAACA,EAAI,QAAQ,SAASI,EAAE,MAAM,MAAaL,KAAA,QAAAA;AAAA,IAAA,GAE1DM,IAAY,CAACD,MAAM;AACvB,MAAIA,EAAE,QAAQ,aAAoBL,KAAA,QAAAA;AAAA,IAAA;AAE3B,oBAAA,iBAAiB,aAAaI,CAAW,GACzC,SAAA,iBAAiB,WAAWE,CAAS,GACvC,MAAM;AACF,eAAA,oBAAoB,aAAaF,CAAW,GAC5C,SAAA,oBAAoB,WAAWE,CAAS;AAAA,IAAA;AAAA,EACnD,GACC,CAACN,CAAO,CAAC;AAEN,QAAA6C,IAAO,CAAC,EAAE,IAAI,OAAO,OAAO,MAAA,GAAS,GAAGF,CAAO;AAGnD,SAAA,gBAAAd;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAA5B;AAAA,MACA,MAAK;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,YAAYd,EAAE;AAAA,QACd,QAAQ,aAAaA,EAAE,MAAM;AAAA,QAC7B,cAAc;AAAA,QACd,WAAW;AAAA,QACX,YAAYC;AAAAA,QACZ,UAAU;AAAA,MACZ;AAAA,MAEA,UAAA;AAAA,QAAC,gBAAAQ,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,MACrB,UAAA,gBAAAA,EAAC,KAAE,EAAA,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,YAAY,KAAK,OAAOT,EAAE,KAAK,YAAY,IAAA,GAAO,UAAA,YAAA,CAEvF,EACF,CAAA;AAAA,QACC0D,EAAK,IAAI,CAACC,MAAQ;AACX,gBAAAC,IAAWD,EAAI,OAAOL;AAE1B,iBAAA,gBAAAZ;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,iBAAekB;AAAA,cACf,SAAS,MAAMH,KAAA,gBAAAA,EAAWE,EAAI;AAAA,cAC9B,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,OAAO;AAAA;AAAA;AAAA,gBAGP,SAASC,IAAW,SAAS;AAAA,gBAC7B,WAAW,aAAa5D,EAAE,MAAM;AAAA,gBAChC,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,YAAYC;AAAAA,gBACZ,UAAU;AAAA,gBACV,OAAOD,EAAE;AAAA,gBACT,YAAY;AAAA,cACd;AAAA,cAEC,UAAA;AAAA,gBAAA4D,KAAa,gBAAAnD,EAAAoD,IAAA,EAAM,MAAM,IAAI,aAAa,GAAG,OAAO,EAAE,OAAO7D,EAAE,KAAK,YAAY,KAAK;AAAA,gBACrF2D,EAAI;AAAA,cAAA;AAAA,YAAA;AAAA,YAxBAA,EAAI;AAAA,UAAA;AAAA,QAyBX,CAEH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AChGA,MAAM3D,IAAI;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR,GAEMC,IAAO,oEAEP6D,IAAU,MAAO,gBAAArD,EAAA,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,GAAG,YAAYT,EAAE,MAAM,YAAY,EAAK,EAAA,CAAA;AAEnG,SAAS+C,GAAQ,EAAE,OAAAI,GAAO,OAAAG,KAAS;AAE/B,SAAA,gBAAAZ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MAEA,UAAA;AAAA,QAAC,gBAAAjC,EAAA,QAAA,EAAK,OAAO,EAAE,OAAO,IAAI,OAAOT,EAAE,IAAI,GAAI,UAAMmD,EAAA,CAAA;AAAA,QACjD,gBAAA1C,EAAC,UAAK,OAAO,EAAE,OAAOT,EAAE,SAAU,UAAMsD,GAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG9C;AA6BA,SAAwBS,GAAoB;AAAA,EAC1C,MAAAC;AAAA,EACA,SAAAnD;AAAA,EACA,MAAAoD,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAA1C;AAAA,EACA,OAAAjB,IAAQ,CAAC;AAAA,EACT,cAAA4D;AAAA,EACA,WAAAC;AAAA,EACA,iBAAAC,IAAkB;AAAA,EAClB,gBAAAC,IAAiB;AAAA,EACjB,WAAAC;AACF,GAAG;AACK,QAAAC,IAAUC,GAAc,oBAAoB,GAC5CC,IAA0CH,KAAc,MACxDI,IAAsB,OAAOJ,KAAc,WAAW,GAAGA,CAAS,OAAOA,GACzEK,IAAWhB,MAAS,UAEpBiB,IAAS,CAAC9D,GAAMC,OAAQD,KAAA,gBAAAA,EAAM,OAAMC,GAMpC,CAAC8D,GAAaC,CAAc,IAAI7C,EAAS,MAAM,oBAAI,KAAK;AAC9D,EAAAvB,EAAU,MAAM;AACV,IAAAgD,KAAQ,CAACiB,KACXG;AAAA,MACE,IAAI;AAAA,QACFxE,EACG,IAAI,CAACyE,GAAIhE,MAASgE,KAAA,QAAAA,EAAI,iBAAiBH,EAAOG,GAAIhE,CAAG,IAAI,IAAK,EAC9D,OAAO,CAACiE,MAAOA,MAAO,IAAI;AAAA,MAC/B;AAAA,IAAA;AAAA,EAEJ,GAIC,CAACtB,GAAMiB,CAAQ,CAAC;AAEnB,QAAMM,IAAa,CAACD,MAClBF,EAAe,CAACI,MAAS;AACjB,UAAAC,IAAO,IAAI,IAAID,CAAI;AACrB,WAAAC,EAAK,IAAIH,CAAE,IAAGG,EAAK,OAAOH,CAAE,IAC3BG,EAAK,IAAIH,CAAE,GACTG;AAAA,EAAA,CACR,GAEGC,IAAgBP,EAAY;AAWlC,SATAnE,EAAU,MAAM;AACd,QAAI,CAACgD;AAAa;AACZ,UAAA7C,IAAY,CAACD,MAAM;AACvB,MAAIA,EAAE,QAAQ,aAAoBL,KAAA,QAAAA;AAAA,IAAA;AAE3B,oBAAA,iBAAiB,WAAWM,CAAS,GACvC,MAAM,SAAS,oBAAoB,WAAWA,CAAS;AAAA,EAAA,GAC7D,CAAC6C,GAAMnD,CAAO,CAAC,GAEbmD,IAID,gBAAAtB,EAAAI,GAAA,EAAA,UAAA;AAAA,IAAA,gBAAArC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAASI;AAAA,QACT,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,QAAQ,MAAM,YAAY,mBAAmB;AAAA,MAAA;AAAA,IACrF;AAAA,IACA,gBAAA6B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAKmC,IAAU,IAAIE,IAAeC,IAAsB;AAAA,UACxD,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,eAAe;AAAA,UACf,KAAK;AAAA,UACL,OAAOH,IAAU,UAAU;AAAA,UAC3B,UAAU;AAAA,UACV,QAAQA,IAAU,WAAWE,IAAe,gBAAgBC,CAAmB,MAAM;AAAA,UACrF,SAAS;AAAA,UACT,WAAW;AAAA,UACX,YAAYhF,EAAE;AAAA,UACd,cAAc6E,IAAU,IAAI;AAAA,UAC5B,WAAW;AAAA,UACX,YAAY5E;AAAAA,QACd;AAAA,QAGA,UAAA;AAAA,UAAA,gBAAAyC,EAAC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,OAAO,QAAQ,YAAY,EACtF,GAAA,UAAA;AAAA,YAAA,gBAAAA,EAAC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,YAAY,SACvE,GAAA,UAAA;AAAA,cAAA,gBAAAjC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,YAAYT,EAAE;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBAEA,UAAA,gBAAAS,EAACkF,IAAiB,EAAA,MAAM,IAAI,aAAa,MAAM,OAAO,EAAE,OAAO3F,EAAE,IAAO,EAAA,CAAA;AAAA,gBAAA;AAAA,cAC1E;AAAA,cACA,gBAAAS;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,OAAOT,EAAE;AAAA,oBACT,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,cAAc;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBAEC,UAAAkE;AAAA,gBAAA;AAAA,cACH;AAAA,YAAA,GACF;AAAA,YACA,gBAAAzD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAASI;AAAA,gBACT,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,YAAY;AAAA,kBACZ,OAAOb,EAAE;AAAA,kBACT,QAAQ;AAAA,kBACR,YAAY;AAAA,gBACd;AAAA,gBAEA,UAAC,gBAAAS,EAAAmF,IAAA,EAAE,MAAM,IAAI,aAAa,GAAG;AAAA,cAAA;AAAA,YAC/B;AAAA,UAAA,GACF;AAAA,4BAEC9B,GAAQ,EAAA;AAAA,UAGT,gBAAArD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,KAAK;AAAA,cACP;AAAA,cAEC,cAEG,gBAAAiC,EAAAI,GAAA,EAAA,UAAA;AAAA,gBAAA,gBAAArC,EAAC,OAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,YAAY,KAAK,OAAOT,EAAE,KAAK,YAAY,SAAS,GACtF,eAAa,iBAChB;AAAA,gBACCoE,KACC,gBAAA3D,EAAC,KAAE,EAAA,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,OAAOT,EAAE,OAAO,YAAY,YAC9D,UACHoE,GAAA;AAAA,kCAGDN,GAAQ,EAAA;AAAA,gBAET,gBAAApB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,KAAK;AAAA,sBACL,OAAO;AAAA,oBACT;AAAA,oBAEA,UAAA;AAAA,sBAAC,gBAAAjC,EAAA,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,OAAOT,EAAE,KAAK,YAAY,IAAI,GAAG,UAAU,aAAA,CAAA;AAAA,sBACvE6B,KACC,gBAAAa;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAASb;AAAA,0BACT,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,gBAAgB;AAAA,4BAChB,KAAK;AAAA,4BACL,QAAQ;AAAA,4BACR,SAAS;AAAA,4BACT,cAAc;AAAA,4BACd,QAAQ,aAAa7B,EAAE,UAAU;AAAA,4BACjC,YAAYA,EAAE;AAAA,4BACd,OAAOA,EAAE;AAAA,4BACT,YAAYC;AAAAA,4BACZ,UAAU;AAAA,4BACV,QAAQ;AAAA,0BACV;AAAA,0BAEA,UAAA;AAAA,4BAAC,gBAAAQ,EAAAoF,IAAA,EAAO,MAAM,IAAI,aAAa,MAAM,OAAO,EAAE,OAAO7F,EAAE,SAAY,EAAA,CAAA;AAAA,4BAAE;AAAA,0BAAA;AAAA,wBAAA;AAAA,sBAEvE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEJ;AAAA,gBAECqE,KACC,gBAAA5D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,QAAQ;AAAA,sBACR,UAAU;AAAA,sBACV,OAAOT,EAAE;AAAA,sBACT,YAAY;AAAA,sBACZ,YAAY;AAAA,oBACd;AAAA,oBAEC,UAAAqE;AAAA,kBAAA;AAAA,gBACH;AAAA,gBAGF,gBAAA3B,EAAC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,OAAO,OAAA,GAC7D,UAAA;AAAA,kBAAA,gBAAAjC,EAACsC,IAAQ,EAAA,OAAM,WAAU,OAAOuB,KAAgB,KAAK;AAAA,oCACpDvB,IAAQ,EAAA,OAAM,cAAa,OAAOwB,KAAa,KAAK;AAAA,gBAAA,GACvD;AAAA,cAAA,EAAA,CACF,IAGG,gBAAA7B,EAAAI,GAAA,EAAA,UAAA;AAAA,gBAAAsB,KACE,gBAAA3D,EAAA,KAAA,EAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,OAAOT,EAAE,OAAO,YAAY,YAC9D,UACHoE,GAAA;AAAA,kCAEDN,GAAQ,EAAA;AAAA,gBACRlD,EAAM,WAAW,IAChB,gBAAAH,EAAC,KAAE,EAAA,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,OAAOT,EAAE,MAAM,GAAG,UAAqB,wBAAA,CAAA,IAE3E,gBAAA0C,EAAA,KAAA,EAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,OAAO1C,EAAE,KAAK,YAAY,SAC5D,GAAA,UAAA;AAAA,kBAAA0F;AAAA,kBAAc;AAAA,kBAAK9E,EAAM;AAAA,kBAAO;AAAA,kBAAEA,EAAM,WAAW,IAAI,WAAW;AAAA,kBAAW;AAAA,gBAAA,GAChF;AAAA,gBAEDA,EAAM,IAAI,CAACQ,GAAMC,MAAQ;AAClB,wBAAAiE,IAAKJ,EAAO9D,GAAMC,CAAG,GACrByE,IAAUX,EAAY,IAAIG,CAAE;AAEhC,yBAAA,gBAAA5C;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBAEL,SAAS,MAAM6C,EAAWD,CAAE;AAAA,sBAC5B,gBAAcQ;AAAA,sBACd,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,KAAK;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ,aAAaA,IAAU9F,EAAE,MAAMA,EAAE,UAAU;AAAA,wBACnD,YAAYA,EAAE;AAAA,wBACd,OAAO;AAAA,wBACP,WAAW;AAAA,wBACX,WAAW;AAAA,wBACX,QAAQ;AAAA,wBACR,YAAYC;AAAAA,sBACd;AAAA,sBAEA,UAAA;AAAA,wBAAA,gBAAAQ;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BACC,eAAY;AAAA,4BACZ,OAAO;AAAA,8BACL,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,gBAAgB;AAAA,8BAChB,OAAO;AAAA,8BACP,QAAQ;AAAA,8BACR,WAAW;AAAA,8BACX,cAAc;AAAA,8BACd,YAAY;AAAA,8BACZ,QAAQ,aAAaqF,IAAU,YAAY,SAAS;AAAA,8BACpD,YAAYA,IAAU,YAAY;AAAA,4BACpC;AAAA,4BAEC,UAAAA,uBAAYjC,IAAM,EAAA,MAAM,IAAI,OAAM,WAAU,aAAa,EAAG,CAAA;AAAA,0BAAA;AAAA,wBAC/D;AAAA,wBACC,gBAAAnB,EAAA,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,GAAG,UAAU,EAAA,GACzE,UAAA;AAAA,0BAAA,gBAAAjC,EAAC,QAAK,EAAA,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAOT,EAAE,KAAK,YAAY,SAAS,GAC9E,YAAK,OACR;AAAA,0BACCoB,EAAK,eACH,gBAAAX,EAAA,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,OAAOT,EAAE,OAAO,YAAY,SAAS,GAC/D,YAAK,aACR;AAAA,wBAAA,GAEJ;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBA5CKoB,EAAK,MAAM,GAAGA,EAAK,KAAK,IAAIC,CAAG;AAAA,kBAAA;AAAA,gBA6CtC,CAEH;AAAA,cAAA,GACH;AAAA,YAAA;AAAA,UAEJ;AAAA,4BAECyC,GAAQ,EAAA;AAAA,UAGT,gBAAApB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,YAAY;AAAA,cACd;AAAA,cAEA,UAAA;AAAA,gBAAA,gBAAAjC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAASI;AAAA,oBACT,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,cAAc;AAAA,sBACd,QAAQ,aAAab,EAAE,SAAS;AAAA,sBAChC,YAAYA,EAAE;AAAA,sBACd,OAAOA,EAAE;AAAA,sBACT,YAAYC;AAAAA,sBACZ,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,QAAQ;AAAA,oBACV;AAAA,oBAEC,UAAA0E;AAAA,kBAAA;AAAA,gBACH;AAAA,gBACCH,KACC,gBAAA/D;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MACPwE,IAAWR,KAAA,gBAAAA,MAAgBA,KAAA,gBAAAA,EAAY,MAAM,KAAKU,CAAW;AAAA,oBAE/D,UAAUT,KAAoB,CAACO,KAAYS,MAAkB;AAAA,oBAC7D,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,cAAc;AAAA,sBACd,QAAQ;AAAA,sBACR,YAAY1F,EAAE;AAAA,sBACd,OAAOA,EAAE;AAAA,sBACT,YAAYC;AAAAA,sBACZ,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,QACEyE,KAAoB,CAACO,KAAYS,MAAkB,IAAK,YAAY;AAAA,sBACtE,SAAShB,KAAoB,CAACO,KAAYS,MAAkB,IAAK,MAAM;AAAA,oBACzE;AAAA,oBAEC,UAAAlB;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,YAAA;AAAA,UAEJ;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA,IA9SgB;AAgTpB;AC9aA,MAAMxE,IAAI;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AACV,GAEMC,IAAO,oEAEP8F,KAAO,CAAC9C,MAAM,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG,GAEvC+C,KAAgB,CAACzE,GAAQ0E,MACxBA,IACY,IAAG1E,KAAA,gBAAAA,EAAQ,SAAQ,EAAE,KAAIA,KAAA,gBAAAA,EAAQ,gBAAe,EAAE,KAAIA,KAAA,gBAAAA,EAAQ,cAAa,EAAE,GAAG,cACjF,SAAS0E,CAAI,IAFX;AAwBpB,SAAwBC,GAAa;AAAA,EACnC,gBAAAC,IAAiB,CAAC;AAAA,EAClB,oBAAAC,IAAqB;AAAA,EACrB,kBAAAC,IAAmB,CAAC;AAAA,EACpB,YAAAC,IAAa;AAAA,EACb,SAAAC,IAAU;AAAA,EACV,QAAA9E;AAAA,EACA,eAAA+E;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAA9E;AAAA,EACA,WAAAgD;AAAA,EACA,oBAAA+B,IAAqB;AAAA,EACrB,oBAAAC,IAAqB;AACvB,GAAG;;AACK,QAAA,CAACC,GAAKC,CAAM,IAAIvE,EAAS+D,MAAe,WAAW,WAAW,QAAQ,GACtE,CAACS,GAAQC,CAAS,IAAIzE,EAAS,EAAE,GACjC,CAAC0E,GAAgBC,CAAiB,IAAI3E,EAAS,KAAK,GACpD,CAAC4E,GAAYC,CAAa,IAAI7E,EAAS,EAAK,GAC5C,CAAC8E,GAASC,CAAU,IAAI/E,EAAS,IAAI,GAErC0D,IAAOc,EAAO,KAAK,EAAE,YAAY,GAEjCQ,IAAgBC;AAAA,IACpB,MAAMnB,EAAiB,IAAI,CAACoB,OAAS,EAAE,IAAIA,EAAI,IAAI,OAAOA,EAAI,KAAO,EAAA;AAAA,IACrE,CAACpB,CAAgB;AAAA,EAAA,GAIbqB,IACJT,MAAmB,QACf,UACAU,IAAAJ,EAAc,KAAK,CAACK,MAAMA,EAAE,OAAOX,CAAc,MAAjD,gBAAAU,EAAoD,UAAS,OAG7DE,IAAiBL;AAAA,IACrB,MAAMrB,EAAe,OAAO,CAAC2B,MAAM9B,GAAc8B,GAAG7B,CAAI,CAAC;AAAA,IACzD,CAACE,GAAgBF,CAAI;AAAA,EAAA,GAGjB8B,IAAiBP;AAAA,IACrB,MACEnB,EACG,OAAO,CAACoB,MAAQR,MAAmB,SAASQ,EAAI,OAAOR,CAAc,EACrE,IAAI,CAACQ,OAAS;AAAA,MACb,GAAGA;AAAA,MACH,WAAWA,EAAI,YAAY,IAAI,OAAO,CAACK,MAAM9B,GAAc8B,GAAG7B,CAAI,CAAC;AAAA,IAAA,EACnE,EACD,OAAO,CAACwB,MAAQA,EAAI,SAAS,SAAS,CAAC;AAAA,IAC5C,CAACpB,GAAkBJ,GAAMgB,CAAc;AAAA,EAAA,GAKnCe,IAAsBR;AAAA,IAC1B,MAAMO,EAAe,OAAO,CAACE,GAAKR,MAAQ;;AAAA,aAAAQ,OAAON,IAAAF,EAAI,aAAJ,gBAAAE,EAAc,WAAU;AAAA,OAAI,CAAC;AAAA,IAC9E,CAACI,CAAc;AAAA,EAAA,GAGXG,KAAoB,CAAC3G,MAAW+F,EAAW,EAAE,QAAA/F,GAAQ,MAAM,UAAU,GACrE4G,KAAoB,CAAC5G,MAAW+F,EAAW,EAAE,QAAA/F,GAAQ,MAAM,UAAU,GACrE6G,IAAe,MAAMd,EAAW,IAAI,GAEpCe,IAAU,CAAC,EAAE,IAAA/C,GAAI,OAAAnC,GAAO,OAAAH,QAAY;AACxC,UAAMsF,IAASzB,MAAQvB;AAErB,WAAA,gBAAA5C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAMoE,EAAOxB,CAAE;AAAA,QACxB,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAcgD,IAAS,aAAatI,EAAE,SAAS,KAAK;AAAA,UACpD,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAYC;AAAA,QACd;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAQ,EAAC,QAAK,EAAA,OAAO,EAAE,UAAU,IAAI,OAAO6H,IAAS,YAAY,WAAW,YAAY,IAAI,GACjF,UACHnF,GAAA;AAAA,UACA,gBAAA1C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,YAAY6H,IAAStI,EAAE,aAAaA,EAAE;AAAA,gBACtC,OAAOsI,IAAS,YAAY;AAAA,gBAC5B,UAAU;AAAA,gBACV,YAAY;AAAA,cACd;AAAA,cAEC,UAAAtF;AAAA,YAAA;AAAA,UACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAIJ,SACG,gBAAAN,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,IAAI,YAAYzC,EAAA,GAE3E,UAAA;AAAA,IAAA,gBAAAyC,EAAC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,YAAY,UAAU,KAAK,IAAI,OAAO,OAGrF,GAAA,UAAA;AAAA,MAAA,gBAAAjC,EAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,OAAO;AAAA,MACxC,gBAAAiC,EAAC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAA,GACvD,UAAA;AAAA,QAAAmE,MAAQ,WACLJ,KACE,gBAAA/D;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM+D,EAAY;AAAA,YAC3B,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,YAAYzG,EAAE;AAAA,cACd,OAAOA,EAAE;AAAA,cACT,YAAYC;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YAEA,UAAA;AAAA,cAAC,gBAAAQ,EAAA8H,IAAA,EAAK,MAAM,IAAI,aAAa,GAAG,OAAO,EAAE,OAAOvI,EAAE,OAAU,EAAA,CAAA;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,sBAKjE,OAAI,EAAA,OAAO,EAAE,UAAU,YAAY,SAAS,cAC3C,GAAA,UAAA;AAAA,UAAA,gBAAA0C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM0E,EAAc,CAACzE,MAAM,CAACA,CAAC;AAAA,cACtC,iBAAc;AAAA,cACd,iBAAewE;AAAA,cACf,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ,aAAanH,EAAE,MAAM;AAAA,gBAC7B,YAAYA,EAAE;AAAA,gBACd,OAAOA,EAAE;AAAA,gBACT,YAAYC;AAAA,gBACZ,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,QAAQ;AAAA,cACV;AAAA,cAEA,UAAA;AAAA,gBAAC,gBAAAQ,EAAA+H,IAAA,EAAO,MAAM,IAAI,aAAa,MAAM,OAAO,EAAE,OAAOxI,EAAE,IAAO,EAAA,CAAA;AAAA,gBAC7D0H;AAAA,cAAA;AAAA,YAAA;AAAA,UACH;AAAA,UAECP,KACC,gBAAA1G;AAAA,YAAC8C;AAAA,YAAA;AAAA,cACC,SAASgE;AAAA,cACT,OAAON;AAAA,cACP,UAAU,CAAC3B,MAAO;AAChB,gBAAA4B,EAAkB5B,CAAE,GACpB8B,EAAc,EAAK;AAAA,cACrB;AAAA,cACA,SAAS,MAAMA,EAAc,EAAK;AAAA,YAAA;AAAA,UACpC;AAAA,QAAA,GAEJ;AAAA,QAIJ,gBAAA3G;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,SAAS;AAAA,cACT,cAAc;AAAA,cACd,YAAYT,EAAE;AAAA,cACd,WAAW;AAAA,YACb;AAAA,YAEA,UAAA,gBAAA0C;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,MAAM;AAAA,kBACN,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,YAAY1C,EAAE;AAAA,gBAChB;AAAA,gBAEA,UAAA;AAAA,kBAAA,gBAAAS,EAACgI,IAAO,EAAA,MAAM,IAAI,aAAa,GAAG,OAAO,EAAE,OAAOzI,EAAE,YAAY,YAAY,EAAK,EAAA,CAAA;AAAA,kBACjF,gBAAAS;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAOsG;AAAA,sBACP,UAAU,CAAC7F,MAAM8F,EAAU9F,EAAE,OAAO,KAAK;AAAA,sBACzC,aAAY;AAAA,sBACZ,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,UAAU;AAAA,wBACV,QAAQ;AAAA,wBACR,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,YAAYjB;AAAA,wBACZ,UAAU;AAAA,wBACV,OAAOD,EAAE;AAAA,sBACX;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QACF;AAAA,MAAA,GACF;AAAA,IAAA,GACF;AAAA,IAGA,gBAAA0C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,OAAO;AAAA,UACP,cAAc,aAAa1C,EAAE,SAAS;AAAA,QACxC;AAAA,QAEA,UAAA;AAAA,UAAC,gBAAAS,EAAA4H,GAAA,EAAQ,IAAG,UAAS,OAAM,mBAAkB,OAAOtC,GAAK8B,EAAe,MAAM,EAAG,CAAA;AAAA,UACjF,gBAAApH,EAAC4H,KAAQ,IAAG,UAAS,OAAM,mBAAkB,OAAOtC,GAAKiC,CAAmB,GAAG;AAAA,QAAA;AAAA,MAAA;AAAA,IACjF;AAAA,IAGCnB,MAAQ,WACN,gBAAApG,EAAAiI,IAAA,EAAQ,MAAI,IAAC,OAAOtC,GAClB,UAAAyB,EAAe,WAAW,sBACxBc,IAAa,EAAA,MAAM1C,IAAO,mCAAmCU,EAAoB,CAAA,sBAEjFiC,IACE,EAAA,UAAAf,EAAe,IAAI,CAACtG,MACnB,gBAAAd;AAAA,MAACa;AAAA,MAAA;AAAA,QAEC,QAAAC;AAAA,QACA,SAAQ;AAAA,QACR,QAAQE,IAAS,MAAMA,EAAOF,CAAM,IAAI;AAAA,QACxC,eAAe,MAAM2G,GAAkB3G,CAAM;AAAA,QAC7C,gBAAgBgF,KAAW3E,IAAiBA,IAAiB;AAAA,QAC7D,QAAQ2E,KAAWG,IAAeA,IAAe;AAAA,MAAA;AAAA,MAN5CnF,EAAO;AAAA,IAQf,CAAA,GACH,EAEJ,CAAA,IACEwG,EAAe,WAAW,sBAC3BY,IAAa,EAAA,MAAM1C,KAAQgB,MAAmB,QAAQ,mCAAmCL,GAAoB,sBAE7G,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAC1D,UAAAmB,EAAe,IAAI,CAACN,wBAClBiB,IAAqB,EAAA,MAAI,IAAC,OAAOjB,EAAI,MACpC,UAAC,gBAAAhH,EAAAmI,IAAA,EACE,YAAI,SAAS,IAAI,CAACrH,MACjB,gBAAAd;AAAA,MAACa;AAAA,MAAA;AAAA,QAEC,QAAAC;AAAA,QACA,SAAQ;AAAA,QACR,eAAe,MAAM4G,GAAkB5G,CAAM;AAAA,MAAA;AAAA,MAHxCA,EAAO;AAAA,IAKf,CAAA,EACH,CAAA,EAAA,GAVYkG,EAAI,EAWlB,CACD,EACH,CAAA;AAAA,IAGF,gBAAAhH;AAAA,MAACsD;AAAA,MAAA;AAAA,QACC,MAAM,EAAQsD;AAAA,QACd,SAASe;AAAA,QACT,MAAMf,KAAA,gBAAAA,EAAS;AAAA,QACf,QAAOwB,IAAAxB,KAAA,gBAAAA,EAAS,WAAT,gBAAAwB,EAAiB;AAAA,QACxB,YAAWC,IAAAzB,KAAA,gBAAAA,EAAS,WAAT,gBAAAyB,EAAiB;AAAA,QAC5B,cAAaC,IAAA1B,KAAA,gBAAAA,EAAS,WAAT,gBAAA0B,EAAiB;AAAA,QAC9B,aAAYC,IAAA3B,KAAA,gBAAAA,EAAS,WAAT,gBAAA2B,EAAiB;AAAA,QAC7B,eAAcC,KAAA5B,KAAA,gBAAAA,EAAS,WAAT,gBAAA4B,GAAiB;AAAA,QAC/B,YAAWC,KAAA7B,KAAA,gBAAAA,EAAS,WAAT,gBAAA6B,GAAiB;AAAA,QAC5B,SAAOC,KAAA9B,KAAA,gBAAAA,EAAS,WAAT,gBAAA8B,GAAiB,UAAS,CAAC;AAAA,QAClC,WAAAvE;AAAA,QACA,SACEyC,KAAA,gBAAAA,EAAS,UAAS,YAAYd,KAAWG,IACrC,MAAM;AACJ,gBAAMoB,IAAIT,EAAQ;AACL,UAAAe,KACb1B,EAAaoB,CAAC;AAAA,QAEhB,IAAA;AAAA,QAEN,eACET,KAAA,gBAAAA,EAAS,UAAS,WACdd,IACE,iBACA,SACFA,KAAW3E,MACXwH,KAAA/B,KAAA,gBAAAA,EAAS,WAAT,gBAAA+B,GAAiB,YAAW,WAC1B,mBACA,kBACF;AAAA,QAEN,WAAW,CAACjE,MAAgB;AAC1B,gBAAM2C,IAAIT,KAAA,gBAAAA,EAAS;AACnB,UAAKS,MACQM,KAGTf,EAAQ,SAAS,WAAUb,KAAA,QAAAA,EAAgBsB,GAAG3C,KAC7CvD,KAAA,QAAAA,EAAiBkG;AAAA,QACxB;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;AAEA,SAASY,GAAQ,EAAE,OAAAvF,GAAO,MAAAkG,GAAM,UAAA9I,KAAY;AAC1C,SACG,gBAAAmC,EAAA,WAAA,EAAQ,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,IAAI,OAAO,OAAA,GAC1E,UAAA;AAAA,IAAC,gBAAAA,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,QAAQ,GAAA,GAClE,UAAA;AAAA,MAAQ2G,KAAA,gBAAA5I,EAAC6I,IAAW,EAAA,MAAM,IAAI,aAAa,MAAM,OAAO,EAAE,OAAOtJ,EAAE,OAAU,EAAA,CAAA;AAAA,MAC9E,gBAAAS;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,YAAYR;AAAA,YACZ,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,OAAOD,EAAE;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,UACd;AAAA,UAEC,UAAAmD;AAAA,QAAA;AAAA,MACH;AAAA,IAAA,GACF;AAAA,IACC5C;AAAA,EACH,EAAA,CAAA;AAEJ;AAEA,SAASqI,GAAS,EAAE,UAAArI,KAAY;AAE5B,SAAA,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MAEC,UAAAF;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAASoI,GAAa,EAAE,MAAAY,KAAQ;AAC9B,SAAQ,gBAAA9I,EAAA,KAAA,EAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,IAAI,OAAOT,EAAE,OAAO,YAAYC,EAAA,GAAS,UAAKsJ,EAAA,CAAA;AACxF;"}
|