@the-portland-company/shell 0.76.1 → 0.76.3
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/chrome.css +5 -2
- package/dist/index.cjs +6 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/tokens.generated.ts","../src/theme/colors.ts","../src/theme/components.ts","../src/theme/index.ts","../src/components/Card.tsx","../src/components/PageHeader.tsx","../src/components/PageContainer.tsx","../src/components/BreadcrumbBar.tsx","../src/components/HeaderTabBar.tsx","../src/providers/GlobalUiIdProvider.tsx","../src/theme/colorMode.tsx","../src/providers/ShellProvider.tsx","../src/hooks/useShellAuth.ts","../src/hooks/useAppRegistry.ts","../src/hooks/useShellOrganization.ts","../src/hooks/useShellLinkedAccounts.ts","../src/hooks/useShellSupport.ts","../src/hooks/useShellChrome.ts","../src/hooks/useShellMode.ts","../src/hooks/useShellNavItems.ts","../src/hooks/useShellNavigationPreference.ts","../src/hooks/useShellRole.ts","../src/hooks/useShellFooter.ts","../src/components/BrandLogo.tsx","../src/components/BrandIcon.tsx","../src/lib/orgColors.ts","../src/lib/userDisplay.ts","../src/sw/registerShellPrecache.ts"],"names":["jsxs","jsx","clsx","Link","useEffect","useContext"],"mappings":"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","file":"index.js","sourcesContent":["// GENERATED by scripts/gen-tokens.mjs from Specs (/api/tokens). DO NOT EDIT.\n// The Chakra theme imports these so its colors derive from the same source\n// of truth (Admin Brand API → Specs) as chrome.css.\n// brandRamp = Specs colors.raceRed (primary brand), not shellChrome.brandRamp.\n\nexport const brandRamp = { 50: '#FDECEE', 100: '#FCE0E3', 200: '#F8B6BD', 300: '#EF6671', 400: '#EA4751', 500: '#E63946', 600: '#C42E3A', 700: '#9F252E', 800: '#660F17', 900: '#39080D' } as const;\nexport const grayRamp = { 50: '#F7FAFC', 100: '#EDF2F7', 200: '#E2E8F0', 300: '#CBD5E0', 400: '#A0AEC0', 500: '#718096', 600: '#4A5568', 700: '#2D3748', 800: '#1A202C', 900: '#171923' } as const;\nexport const buttonPrimaryBg = '#E63946';\nexport const buttonPrimaryBgHover = '#C42E3A';\nexport const fieldFocus = '#E63946';\n","// Theme color definitions for light and dark modes.\n// The primary brand ramp is GENERATED from Specs (the styling source of truth)\n// so the Chakra theme stays in lockstep with chrome.css — edit it in Admin →\n// sync to Specs → `npm run gen:tokens`, never hand-edit the ramp here.\nimport { brandRamp } from './tokens.generated';\n\nexport const colors = {\n // Primary brand = Specs race-red (#E63946 ramp). Generated via gen:tokens.\n brand: { ...brandRamp },\n\n // Politogy Brand Colors\n politogy: {\n // Legacy Blue - kept for reference\n blue: {\n 50: '#e8f4fd',\n 100: '#bee3f8',\n 200: '#90cdf4',\n 300: '#63b3ed',\n 400: '#4299e1',\n 500: '#3182ce',\n 600: '#2b6cb0',\n 700: '#2c5282',\n 800: '#2a4365',\n 900: '#1a365d',\n },\n // Race-red (Specs primary brand). Same ramp as `brand`.\n red: { ...brandRamp },\n // Navy - Professional & Authoritative\n navy: {\n 50: '#e8eef6',\n 100: '#c5d4e8',\n 200: '#9fb8d9',\n 300: '#789cca',\n 400: '#5b86be',\n 500: '#3e70b2',\n 600: '#325a8e',\n 700: '#26446a',\n 800: '#1a2e47',\n 900: '#0e1823',\n },\n // White & Off-white\n white: '#ffffff',\n offWhite: '#f8fafc',\n // Text colors\n text: {\n primary: '#1a202c',\n secondary: '#4a5568',\n muted: '#718096',\n light: '#a0aec0',\n },\n },\n\n // Semantic color tokens that will switch based on color mode\n gray: {\n 50: '#f7fafc',\n 100: '#edf2f7',\n 200: '#e2e8f0',\n 300: '#cbd5e0',\n 400: '#a0aec0',\n 500: '#718096',\n 600: '#4a5568',\n 700: '#2d3748',\n 800: '#1a202c',\n 900: '#171923',\n },\n\n // The neutral-black dark ramp from Reference/Global-Rules → Dark Mode. Every\n // value is hue-free (R = G = B); layering is expressed by lightness only.\n //\n // The `gray` ramp above is Chakra's, which is BLUE-TINTED (#2d3748, #1a202c,\n // #171923). Every dark value in the theme used to point into it, so dark mode\n // rendered navy against the black chrome — the single most common way dark\n // mode drifts off-brand, and explicitly called out in the spec. Dark values\n // resolve here instead.\n neutral: {\n page: '#0A0A0A',\n surface: '#161616',\n raised: '#1F1F1F',\n raised2: '#212121',\n hover: '#2B2B2B',\n border: '#333333',\n borderStrong: '#404040',\n textMuted: '#A3A3A3',\n textDim: '#8A8A8A',\n text: '#E8E8E8',\n textStrong: '#F5F5F5',\n },\n};\n\n// Semantic tokens for automatic color mode switching\nexport const semanticTokens = {\n colors: {\n // Every _dark value resolves to the NEUTRAL ramp (colors.neutral), never to\n // Chakra's blue-tinted `gray` scale. See the note on `neutral` above.\n\n // Text colors\n 'text.primary': { default: 'gray.900', _dark: 'neutral.text' },\n 'text.secondary': { default: 'gray.600', _dark: 'neutral.textMuted' },\n 'text.muted': { default: 'gray.500', _dark: 'neutral.textDim' },\n\n // Background colors\n 'bg.primary': { default: 'white', _dark: 'neutral.surface' },\n 'bg.secondary': { default: 'gray.50', _dark: 'neutral.page' },\n 'bg.surface': { default: 'white', _dark: 'neutral.raised' },\n 'bg.hover': { default: 'gray.50', _dark: 'neutral.hover' },\n\n // Border colors\n 'border.default': { default: 'gray.200', _dark: 'neutral.border' },\n 'border.muted': { default: 'gray.100', _dark: 'neutral.border' },\n\n // Component specific\n 'heading.fg': { default: 'politogy.navy.800', _dark: 'neutral.textStrong' },\n 'card.bg': { default: 'white', _dark: 'neutral.surface' },\n 'card.border': { default: 'gray.200', _dark: 'neutral.border' },\n 'input.bg': { default: 'white', _dark: 'neutral.raised' },\n 'input.border': { default: 'gray.200', _dark: 'neutral.border' },\n 'input.hover': { default: 'gray.400', _dark: 'neutral.borderStrong' },\n\n // Navigation\n 'nav.bg': { default: 'white', _dark: 'neutral.surface' },\n 'nav.border': { default: 'gray.200', _dark: 'neutral.border' },\n\n // Sidebar\n 'sidebar.bg': { default: 'gray.50', _dark: 'neutral.surface' },\n 'sidebar.hover': { default: 'gray.100', _dark: 'neutral.hover' },\n 'sidebar.active': { default: 'brand.50', _dark: 'brand.900' },\n\n // Status surfaces. In dark mode these become neutral raised surfaces — the\n // meaning is carried by the icon/text accent, not by a pale tint that would\n // glare against black (and would break the hue-free surface rule).\n 'success.bg': { default: 'green.50', _dark: 'neutral.raised' },\n 'error.bg': { default: 'red.50', _dark: 'neutral.raised' },\n 'warning.bg': { default: 'yellow.50', _dark: 'neutral.raised' },\n 'info.bg': { default: 'blue.50', _dark: 'neutral.raised' },\n\n // ---------------------------------------------------------------------\n // Raw palette remap — the high-leverage half of the dark-mode fix.\n //\n // The app carries ~650 hardcoded Chakra literals (`bg=\"gray.50\"`,\n // `borderColor=\"gray.200\"`, `color=\"gray.600\"`, ...) that no semantic token\n // can reach. Making the SCALE ITSELF color-mode-aware fixes them all at\n // once, centrally, with no app edits.\n //\n // The mapping INVERTS: in dark mode a low number (used as a pale surface)\n // becomes a dark surface, and a high number (used as dark text) becomes\n // light text. That is what makes one remap correct for both background and\n // foreground usage.\n 'gray.50': { default: '#f7fafc', _dark: 'neutral.raised' },\n 'gray.100': { default: '#edf2f7', _dark: 'neutral.raised2' },\n 'gray.200': { default: '#e2e8f0', _dark: 'neutral.border' },\n 'gray.300': { default: '#cbd5e0', _dark: 'neutral.borderStrong' },\n 'gray.400': { default: '#a0aec0', _dark: '#6B6B6B' },\n 'gray.500': { default: '#718096', _dark: 'neutral.textDim' },\n 'gray.600': { default: '#4a5568', _dark: 'neutral.textMuted' },\n 'gray.700': { default: '#2d3748', _dark: '#C6C6C6' },\n 'gray.800': { default: '#1a202c', _dark: 'neutral.text' },\n 'gray.900': { default: '#171923', _dark: 'neutral.textStrong' },\n\n // Pale status tints used directly as card/callout surfaces. Same reasoning\n // as the *.bg tokens above.\n 'blue.50': { default: '#ebf8ff', _dark: 'neutral.raised' },\n 'green.50': { default: '#f0fff4', _dark: 'neutral.raised' },\n 'red.50': { default: '#fff5f5', _dark: 'neutral.raised' },\n 'yellow.50': { default: '#fffff0', _dark: 'neutral.raised' },\n 'orange.50': { default: '#fffaf0', _dark: 'neutral.raised' },\n\n // Dark status TEXT. The deep shades are picked for contrast against a pale\n // tint; against a #1F1F1F surface they are unreadable — measured on the live\n // info alert, whose description rendered #2c5282 (blue.700) on near-black.\n // In dark mode they lighten to the 200/300 band so the hue still reads as\n // informational/success/error without losing legibility.\n 'blue.600': { default: '#2b6cb0', _dark: '#7CC0F5' },\n 'blue.700': { default: '#2c5282', _dark: '#9AD1F8' },\n 'blue.800': { default: '#2a4365', _dark: '#BFE3FB' },\n 'green.600': { default: '#38a169', _dark: '#68D391' },\n 'green.700': { default: '#2f855a', _dark: '#8EE0AE' },\n 'green.800': { default: '#276749', _dark: '#B6ECCB' },\n 'red.600': { default: '#e53e3e', _dark: '#FC8181' },\n 'red.700': { default: '#c53030', _dark: '#FEA8A8' },\n 'red.800': { default: '#9b2c2c', _dark: '#FECACA' },\n 'orange.600': { default: '#dd6b20', _dark: '#F6AD55' },\n 'orange.700': { default: '#c05621', _dark: '#FBC98A' },\n 'orange.800': { default: '#9c4221', _dark: '#FDDCB4' },\n 'yellow.600': { default: '#d69e2e', _dark: '#ECC94B' },\n 'yellow.700': { default: '#b7791f', _dark: '#F3DC85' },\n 'yellow.800': { default: '#975a16', _dark: '#F8EAB4' },\n },\n};\n","// Component style overrides for theme using Politogy brand colors\nexport const components = {\n Button: {\n baseStyle: {\n fontWeight: 'medium',\n },\n defaultProps: {\n colorScheme: 'brand',\n },\n variants: {\n primary: {\n bg: 'brand.500',\n color: 'white',\n _hover: {\n bg: 'brand.600',\n _disabled: {\n bg: 'brand.500',\n },\n },\n _active: {\n bg: 'brand.700',\n },\n },\n secondary: {\n borderWidth: '1px',\n borderColor: 'gray.300',\n // `card.bg`, not a raw `white` — a literal white here rendered a light\n // pill on the black page in dark mode. (`gray.*` is color-mode-aware via\n // the semanticTokens remap, so those are already safe.)\n bg: 'card.bg',\n color: 'gray.700',\n _hover: {\n bg: 'gray.50',\n },\n },\n solid: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n // For brand colorScheme, use explicit colors\n if (c === 'brand') {\n return {\n bg: 'brand.500',\n color: 'white',\n _hover: {\n bg: 'brand.600',\n _disabled: {\n bg: 'brand.500',\n },\n },\n _active: {\n bg: 'brand.700',\n },\n };\n }\n // For other colorSchemes, use standard pattern with explicit bg and white text\n return {\n bg: `${c}.500`,\n color: 'white',\n _hover: {\n bg: `${c}.600`,\n _disabled: {\n bg: `${c}.500`,\n },\n },\n _active: {\n bg: `${c}.700`,\n },\n };\n },\n ghost: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n return {\n color: `${c}.600`,\n _hover: {\n bg: `${c}.50`,\n },\n };\n },\n outline: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n return {\n borderColor: `${c}.500`,\n color: `${c}.600`,\n _hover: {\n bg: `${c}.50`,\n },\n };\n },\n link: {\n color: 'brand.500',\n _hover: {\n color: 'brand.600',\n textDecoration: 'underline',\n },\n },\n },\n },\n\n Heading: {\n baseStyle: {\n // Was a hard `politogy.navy.800` (#1a2e47) — near-invisible against the\n // black page in dark mode, and off-brand navy besides. Every heading in\n // every app went through this one style.\n color: 'heading.fg',\n fontWeight: 'semibold',\n },\n },\n\n Card: {\n baseStyle: {\n container: {\n bg: 'card.bg',\n borderWidth: '1px',\n borderColor: 'card.border',\n borderRadius: 'lg',\n },\n },\n },\n\n Input: {\n baseStyle: {\n field: {\n bg: 'input.bg',\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n field: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n },\n\n NumberInput: {\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n field: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n },\n\n Select: {\n baseStyle: {\n field: {\n bg: 'input.bg',\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n field: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n },\n\n Textarea: {\n baseStyle: {\n bg: 'input.bg',\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n\n Menu: {\n baseStyle: {\n list: {\n bg: 'bg.surface',\n borderColor: 'var(--mode-input-border-color)',\n boxShadow: 'lg',\n },\n item: {\n bg: 'transparent',\n _hover: {\n bg: 'bg.hover',\n },\n _focus: {\n bg: 'bg.hover',\n },\n },\n },\n },\n\n Modal: {\n baseStyle: {\n dialog: {\n bg: 'bg.surface',\n },\n overlay: {\n bg: 'blackAlpha.600',\n },\n },\n },\n\n Popover: {\n baseStyle: {\n content: {\n bg: 'bg.surface',\n borderColor: 'border.default',\n boxShadow: 'lg',\n },\n },\n },\n\n Drawer: {\n baseStyle: {\n dialog: {\n bg: 'bg.surface',\n },\n overlay: {\n bg: 'blackAlpha.600',\n },\n },\n },\n\n Tabs: {\n baseStyle: {\n root: {\n width: '100%',\n },\n tablist: {\n width: '100%',\n alignItems: 'flex-end',\n gap: 'var(--app-tab-gap)',\n },\n tabpanels: {\n width: '100%',\n },\n tabpanel: {\n width: '100%',\n },\n tab: {\n minHeight: 'var(--app-tab-height)',\n height: 'var(--app-tab-height)',\n lineHeight: 1,\n borderTopLeftRadius: 'var(--app-tab-radius)',\n borderTopRightRadius: 'var(--app-tab-radius)',\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n color: 'text.secondary',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n borderColor: 'brand.500',\n fontWeight: 'semibold',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n },\n variants: {\n enclosed: {\n tab: {\n color: 'gray.600',\n bg: 'transparent',\n borderColor: 'gray.200',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n borderColor: 'brand.500',\n borderBottomColor: 'brand.500',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n },\n 'enclosed-colored': {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n 'soft-rounded': {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n 'solid-rounded': {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n line: {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n borderColor: 'brand.500',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n },\n unstyled: {\n tab: {\n // Allow inline styles to take precedence for unstyled variant\n },\n },\n },\n defaultProps: {\n colorScheme: 'brand',\n },\n },\n\n Badge: {\n baseStyle: {\n borderRadius: 'md',\n px: 2,\n py: 1,\n fontWeight: 'medium',\n },\n defaultProps: {\n colorScheme: 'brand',\n },\n },\n\n Link: {\n baseStyle: {\n color: 'brand.500',\n _hover: {\n color: 'brand.600',\n textDecoration: 'underline',\n },\n },\n },\n\n // Reference/UI-Platform: every top-bar control and every panel it opens share\n // ONE surface treatment — one definition of background, border, blur and\n // radius, not a per-component re-style. Chakra's stock Tooltip INVERTS\n // (dark text surface in light mode, LIGHT surface in dark mode), so in dark\n // mode every `div#tooltip-*` rendered a near-white #E8E8E8 slab against the\n // black chrome — measured on 15 of 29 pages, including inside the\n // Communications Fuel panel. Pin it to the shared panel surface instead, so a\n // Chakra tooltip and the native chrome's TopBarTooltip look identical.\n Tooltip: {\n baseStyle: {\n // Chakra's own baseStyle sets `bg: var(--tooltip-bg)` and then assigns\n // `--tooltip-bg` from its palette, so overriding `bg` alone loses — the\n // variable still resolves to Chakra's value and the bubble stayed light\n // (measured #E8E8E8 live after a first attempt that set only `bg`). Pin\n // the VARIABLE, which is what both the bubble and the arrow read.\n '--tooltip-bg': 'var(--panel-elevated, #1F1F1F)',\n '--tooltip-fg': 'var(--foreground, #E8E8E8)',\n '--popper-arrow-bg': 'var(--panel-elevated, #1F1F1F)',\n // Chakra ALSO ships a `_dark` block that re-assigns those two variables\n // to `colors.gray.300` / `colors.gray.900` — i.e. it deliberately INVERTS\n // in dark mode. That block wins over the base keys, so it has to be\n // overridden explicitly or the bubble goes light again.\n _dark: {\n '--tooltip-bg': 'var(--panel-elevated, #1F1F1F)',\n '--tooltip-fg': 'var(--foreground, #E8E8E8)',\n '--popper-arrow-bg': 'var(--panel-elevated, #1F1F1F)',\n },\n bg: 'var(--panel-elevated, #1F1F1F)',\n color: 'var(--foreground, #E8E8E8)',\n border: '1px solid',\n borderColor: 'var(--line, #333333)',\n borderRadius: 'var(--radius-lg, 0.5rem)',\n boxShadow: 'var(--shadow-soft)',\n fontSize: '12px',\n paddingX: 3,\n paddingY: 2,\n },\n },\n\n Alert: {\n baseStyle: {\n container: {\n borderRadius: 'md',\n },\n },\n variants: {\n subtle: (props: { colorScheme: string; colorMode?: string }) => {\n const { colorScheme: c, colorMode } = props;\n // In DARK mode a \"subtle\" alert must not paint a pale tint: Chakra's\n // default resolves `<scheme>.200` for both the surface AND the icon, so\n // an error alert rendered a near-white pink (#FEB2B2 — measured live on\n // app) against the black page. Global-Rules → Dark Mode: every dark\n // surface is hue-free; meaning is carried by the icon/text accent, not\n // by the fill. Reds also reconcile to brand #E63946, not Chakra #E53E3E.\n if (colorMode === 'dark') {\n const accent =\n c === 'blue' || c === 'info'\n ? '#7CC0F5'\n : c === 'green' || c === 'success'\n ? '#68D391'\n : c === 'orange' || c === 'yellow' || c === 'warning'\n ? '#F6AD55'\n : 'var(--color-race-red-300, #EF6671)';\n return {\n container: { bg: 'neutral.raised', borderLeftColor: accent },\n icon: { color: accent },\n title: { color: 'neutral.text' },\n description: { color: 'neutral.textMuted' },\n };\n }\n // Keep info alerts blue\n if (c === 'blue' || c === 'info') {\n return {\n container: {\n bg: 'blue.50',\n },\n icon: {\n color: 'blue.500',\n },\n title: {\n color: 'blue.800',\n },\n description: {\n color: 'blue.700',\n },\n };\n }\n return {};\n },\n 'left-accent': (props: { colorScheme: string; colorMode?: string }) => {\n const { colorScheme: c, colorMode } = props;\n if (colorMode === 'dark') {\n const accent =\n c === 'blue' || c === 'info'\n ? '#7CC0F5'\n : c === 'green' || c === 'success'\n ? '#68D391'\n : c === 'orange' || c === 'yellow' || c === 'warning'\n ? '#F6AD55'\n : 'var(--color-race-red-300, #EF6671)';\n return {\n container: { bg: 'neutral.raised', borderLeftColor: accent },\n icon: { color: accent },\n title: { color: 'neutral.text' },\n description: { color: 'neutral.textMuted' },\n };\n }\n if (c === 'blue' || c === 'info') {\n return {\n container: {\n bg: 'blue.50',\n borderLeftColor: 'blue.500',\n },\n icon: {\n color: 'blue.500',\n },\n };\n }\n return {};\n },\n solid: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n if (c === 'blue' || c === 'info') {\n return {\n container: {\n bg: 'blue.500',\n color: 'white',\n },\n };\n }\n return {};\n },\n },\n },\n\n Table: {\n baseStyle: {\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n borderSpacing: '0',\n borderColor: 'gray.200',\n },\n th: {\n borderColor: 'gray.200',\n borderBottom: 'none',\n bg: 'gray.200',\n color: 'text.secondary',\n fontWeight: 'semibold',\n px: 3,\n py: 2.5,\n minHeight: '44px',\n height: '44px',\n verticalAlign: 'middle',\n },\n td: {\n borderColor: 'gray.200',\n borderBottom: 'none',\n px: 3,\n py: 2.5,\n minHeight: '44px',\n height: '44px',\n verticalAlign: 'middle',\n },\n tr: {\n borderBottom: 'none',\n borderColor: 'transparent',\n _odd: {\n bg: 'card.bg',\n },\n _even: {\n bg: 'gray.50',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n tbody: {\n tr: {\n _odd: {\n bg: 'card.bg',\n },\n _even: {\n bg: 'gray.50',\n },\n _hover: {\n bg: 'blue.100',\n },\n },\n },\n },\n variants: {\n simple: {},\n striped: {},\n },\n defaultProps: {\n variant: 'striped',\n },\n },\n\n Divider: {\n baseStyle: {\n borderColor: 'border.default',\n },\n },\n};\n","import { extendTheme } from '@chakra-ui/react';\nimport { colors, semanticTokens } from './colors';\nimport { components } from './components';\n\n// Define the theme configuration\n// Chakra's color mode is driven by `politogyColorModeManager` (theme/colorMode),\n// which reads the resolved universal Politogy theme. These values are only the\n// pre-manager default; `useSystemColorMode` stays false on purpose, because the\n// OS scheme is consulted by `resolveTheme('system')` — letting Chakra ALSO watch\n// the media query would give it a second, competing opinion, which is exactly\n// the desync this manager exists to remove.\nconst config = {\n initialColorMode: 'light',\n useSystemColorMode: false,\n};\n\n// Global styles\nconst styles = {\n global: () => ({\n // Body surface comes from the chrome aliases that chrome.css emits in light\n // AND neutral-black dark, so the page follows `.dark` instead of forcing\n // white underneath dark chrome. Chakra's global styles beat app CSS, so\n // hardcoding `white`/`gray.900` here made every app light-only from the\n // inside no matter what the tokens said (Reference/Global-Rules → Dark Mode:\n // the neutral-black rule binds the entire app UI, not just the chrome).\n body: {\n bg: 'var(--color-bg, white)',\n color: 'var(--color-text, #1a202c)',\n },\n ':root': {\n '--mode-primary-color': 'var(--app-color-brand-500)',\n '--mode-input-border-color': 'var(--app-color-brand-500)',\n '--mode-input-hover-border-color': 'var(--app-color-brand-600)',\n '--mode-input-focus-shadow-color': 'var(--app-color-brand-500)',\n },\n // Ensure non-Chakra/native text-like inputs follow mode border colors as well.\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]):not([type=\"file\"]):not([type=\"color\"]), textarea, select':\n {\n borderColor: 'var(--mode-input-border-color)',\n },\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]):not([type=\"file\"]):not([type=\"color\"]):hover, textarea:hover, select:hover':\n {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]):not([type=\"file\"]):not([type=\"color\"]):focus, textarea:focus, select:focus':\n {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n }),\n};\n\n// Fonts — Brand-token driven, exactly like color.\n//\n// These were hardcoded to the system stack, and because Chakra's global styles\n// beat app CSS, VRM rendered in -apple-system while every app on the native\n// chrome rendered the Brand family. A font change is supposed to ship from the\n// Brand editor without a redeploy, so heading/body resolve `--font-family` (and\n// mono resolves the shared mono token) with the old stacks as the pre-tokens\n// fallback only (Reference/UI-Platform → Typography; HITL 2026-07-23).\nconst SYSTEM_SANS =\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif'\nconst SYSTEM_MONO =\n 'SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace'\n\nconst fonts = {\n heading: `var(--font-family, ${SYSTEM_SANS})`,\n body: `var(--font-family, ${SYSTEM_SANS})`,\n mono: `var(--font-mono, ${SYSTEM_MONO})`,\n};\n\n// Create and export the theme\nexport const politogyTheme = extendTheme({\n config,\n colors,\n semanticTokens,\n components,\n styles,\n fonts,\n\n // Additional theme configurations\n shadows: {\n outline: '0 0 0 3px var(--app-color-brand-500)',\n },\n\n radii: {\n none: '0',\n sm: '0.125rem',\n base: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n '3xl': '1.5rem',\n full: '9999px',\n },\n});\n\nexport { politogyTheme as default };\n","import type { CSSProperties, ReactNode } from 'react';\ntype CardProps = {\n title?: string;\n children: ReactNode;\n minH?: string | number;\n className?: string;\n style?: CSSProperties;\n [key: string]: unknown;\n};\n\nexport default function Card({\n title,\n children,\n minH,\n className,\n style,\n ...props\n}: CardProps) {\n return (\n <div\n className={`rounded-lg border border-slate-200 bg-white p-6 shadow-sm ${className || ''}`}\n style={{ minHeight: minH, ...style }}\n {...props}\n >\n {title && <h3 className=\"mb-4 text-lg font-semibold\">{title}</h3>}\n {children}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\ntype BreadcrumbItem = {\n label: string;\n href?: string;\n};\n\n/** The three Modes a page header's eyebrow can announce (Reference/UI-Platform\n * → \"Per-mode branding\"). */\nexport type PageHeaderMode = 'relationship' | 'campaign' | 'petition';\n\nconst MODE_EYEBROW_LABEL: Record<PageHeaderMode, string> = {\n relationship: 'Relationship mode',\n campaign: 'Campaign mode',\n petition: 'Petition mode',\n};\n\ntype PageHeaderProps = {\n title?: ReactNode;\n /**\n * The operating Mode this page belongs to. When set, the 11px uppercase\n * mode eyebrow (\"Relationship mode\" / \"Campaign mode\" / \"Petition mode\")\n * renders above the title by DEFAULT — Reference/UI-Platform → \"Page\n * header\": \"Left: an 11px uppercase mode eyebrow ... in the mode color\n * (`modes.<mode>.primary`)\". Pass `showEyebrow={false}` to suppress it.\n */\n mode?: PageHeaderMode;\n /** Overrides the eyebrow text the `mode` default would produce. */\n eyebrow?: string;\n /** Set false to suppress the eyebrow even when `mode` is passed. Default true. */\n showEyebrow?: boolean;\n /** Optional one-line subtitle, 15px G4, directly under the title. */\n subtitle?: ReactNode;\n breadcrumbs?: BreadcrumbItem[];\n actions?: ReactNode;\n tabBar?: ReactNode;\n maxW?: string;\n hideSidebar?: boolean;\n};\n\nconst resolveMaxWidthClass = (maxW: string) => {\n if (maxW === 'full') return 'max-w-none';\n if (maxW === 'container.lg') return 'max-w-6xl';\n if (maxW === 'container.md') return 'max-w-5xl';\n return 'max-w-7xl';\n};\n\nexport default function PageHeader({\n title,\n mode,\n eyebrow,\n showEyebrow = true,\n subtitle,\n breadcrumbs = [],\n actions = null,\n tabBar = null,\n maxW = 'full',\n hideSidebar = false,\n}: PageHeaderProps) {\n const maxWClass = resolveMaxWidthClass(maxW);\n const titleText = typeof title === 'string' ? title.trim() : '';\n const normalizedTitle = titleText.toLowerCase();\n const breadcrumbsWithoutCurrent = [...breadcrumbs];\n const last = breadcrumbsWithoutCurrent[breadcrumbsWithoutCurrent.length - 1];\n // Only remove a trailing breadcrumb that duplicates the page title when there's\n // still at least one breadcrumb left to show.\n if (\n breadcrumbsWithoutCurrent.length > 1 &&\n normalizedTitle &&\n last &&\n last.label.trim().toLowerCase() === normalizedTitle\n ) {\n breadcrumbsWithoutCurrent.pop();\n }\n\n // The eyebrow renders whenever there's text for it to show — from an\n // explicit `eyebrow` override, or derived from `mode` by default — unless\n // the caller opts out with `showEyebrow={false}`.\n const eyebrowText = showEyebrow ? eyebrow ?? (mode ? MODE_EYEBROW_LABEL[mode] : undefined) : undefined;\n\n // Avoid rendering an empty header bar (no title, no breadcrumbs, no actions, no tabs).\n if (!title && !eyebrowText && breadcrumbsWithoutCurrent.length === 0 && !actions && !tabBar) {\n return null;\n }\n\n return (\n <div\n style={{ backgroundColor: 'var(--app-tab-header-bg, #888888)' }}\n className={clsx('text-slate-100', tabBar ? 'pt-3 pb-0' : 'py-3 border-b border-gray-200', {\n 'md:ml-60': !hideSidebar,\n })}\n >\n <div className={clsx('w-full px-4', maxWClass)}>\n <div className=\"flex w-full flex-nowrap items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {eyebrowText ? (\n <div\n className=\"truncate text-[11px] font-bold uppercase leading-[1.2] tracking-[0.09em]\"\n style={{ color: 'var(--mode-accent, var(--color-accent, #E63946))' }}\n >\n {eyebrowText}\n </div>\n ) : null}\n {title ? (\n <div className=\"min-w-0\">\n <div\n className=\"truncate font-bold text-white\"\n style={{\n fontFamily: 'var(--font-family, ui-sans-serif, system-ui, sans-serif)',\n fontSize: 'var(--type-h2-size, 1.875rem)',\n lineHeight: 'var(--type-h2-line-height, 1.25)',\n }}\n >\n {title}\n </div>\n </div>\n ) : null}\n {subtitle ? (\n <div className=\"mt-1 truncate text-[15px] text-[color:var(--color-g4,#929599)]\">\n {subtitle}\n </div>\n ) : null}\n {breadcrumbsWithoutCurrent.length > 0 ? (\n <nav\n aria-label=\"Breadcrumb\"\n className={clsx('min-w-0 text-slate-100', title ? 'mt-1' : '')}\n >\n <ol className=\"flex flex-nowrap items-center gap-2 overflow-hidden text-sm text-gray-600\">\n {breadcrumbsWithoutCurrent.map((item, index) => (\n <li\n key={`${item.label}-${index}`}\n className=\"flex min-w-0 flex-shrink-0 items-center gap-2\"\n >\n {index > 0 ? <span className=\"text-gray-400\">></span> : null}\n {item.href ? (\n <Link to={item.href} className=\"truncate text-slate-100 hover:underline\">\n {item.label}\n </Link>\n ) : (\n <span className=\"truncate text-slate-100\">{item.label}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n ) : null}\n </div>\n {actions ? <div className=\"flex-shrink-0\">{actions}</div> : null}\n </div>\n </div>\n {tabBar ? (\n <div className=\"m-0 w-full px-0\" style={{ backgroundColor: 'transparent' }}>\n {tabBar}\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { warnDeprecated } from '../lib/deprecation';\n\ntype PageContainerProps = {\n children: ReactNode;\n maxW?: string;\n px?: number | string;\n py?: number | string;\n lockHeight?: boolean;\n};\n\n/**\n * @deprecated Not for app use. The frame's `<main>` is fluid (Brand guideline\n * \"Content width is fluid\"): apps never emit their own page container, a\n * second `<main>`, a max-width or an `mx-auto` wrapper. Render page content\n * directly inside `<PolitogyAppFrame>`; for form and settings pages use\n * `<FormColumn>` (960px, left-aligned). Warns in development.\n */\nexport default function PageContainer({\n children,\n maxW = 'container.xl',\n px,\n py,\n lockHeight = true,\n}: PageContainerProps) {\n warnDeprecated(\n 'PageContainer',\n '<PageContainer> is deprecated for apps: the frame owns a fluid <main>. Render content directly inside <PolitogyAppFrame>, and use <FormColumn> for form/settings pages.',\n );\n const isFullWidth = maxW === 'full';\n const effectivePx = isFullWidth ? 0 : px === undefined ? 4 : Number(px);\n const effectivePy = py === undefined ? (isFullWidth ? 0 : 4) : py;\n const pxValue = String(effectivePx);\n const pyValue = String(effectivePy);\n\n const maxWClass = isFullWidth\n ? 'max-w-none'\n : maxW === 'container.xl'\n ? 'max-w-7xl'\n : maxW === 'container.lg'\n ? 'max-w-6xl'\n : maxW === 'container.md'\n ? 'max-w-5xl'\n : typeof maxW === 'string' && /^(\\d+)px$/.test(maxW)\n ? ''\n : 'max-w-7xl';\n\n const pxClass =\n pxValue === '0'\n ? 'px-0'\n : pxValue === '1'\n ? 'px-1'\n : pxValue === '2'\n ? 'px-2'\n : pxValue === '3'\n ? 'px-3'\n : pxValue === '4'\n ? 'px-4'\n : 'px-4';\n\n const pyClass =\n pyValue === '0'\n ? 'py-0'\n : pyValue === '4'\n ? 'py-4'\n : pyValue === '5'\n ? 'py-5'\n : pyValue === '6'\n ? 'py-6'\n : 'py-6';\n\n const inlineMaxWStyle =\n typeof maxW === 'string' && /^(\\d+)px$/.test(maxW) ? { maxWidth: maxW } : undefined;\n\n return (\n <main\n className={lockHeight ? 'h-[calc(100vh-80px)] min-h-[calc(100vh-80px)]' : ''}\n style={{ background: 'var(--app-tab-content-bg)' }}\n >\n <div\n className={clsx(\n 'mx-auto w-full',\n maxWClass,\n pxClass,\n pyClass,\n lockHeight ? 'h-full' : 'h-auto'\n )}\n style={inlineMaxWStyle}\n >\n {children}\n </div>\n </main>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport clsx from 'clsx';\nimport { warnDeprecated } from '../lib/deprecation';\n\ntype BreadcrumbItem = {\n label: string;\n href?: string;\n};\n\ntype BreadcrumbBarProps = {\n breadcrumbs?: BreadcrumbItem[];\n actions?: ReactNode;\n maxW?: string;\n};\n\n/**\n * @deprecated Not for app use. The breadcrumb trail is retired\n * (Reference/UI-Platform → Page header): the mode eyebrow, the page title, the\n * active left-bar row and the selected tab already say where the user is.\n * Warns in development.\n */\nexport default function BreadcrumbBar({\n breadcrumbs = [],\n actions = null,\n maxW = 'full',\n}: BreadcrumbBarProps) {\n warnDeprecated(\n 'BreadcrumbBar',\n '<BreadcrumbBar> is deprecated for apps: the breadcrumb trail is retired. Use the page header (mode eyebrow + title) instead.',\n );\n if ((!breadcrumbs || breadcrumbs.length === 0) && !actions) {\n return null;\n }\n\n const maxWClass =\n maxW === 'full'\n ? 'max-w-none'\n : maxW === 'container.xl'\n ? 'max-w-7xl'\n : maxW === 'container.lg'\n ? 'max-w-6xl'\n : maxW === 'container.md'\n ? 'max-w-5xl'\n : 'max-w-7xl';\n\n return (\n <div\n className=\"ml-0 border-b border-gray-200 px-4 py-3 md:ml-60\"\n style={{ backgroundColor: 'var(--app-tab-header-bg, #888888)' }}\n >\n <div className={clsx('mx-auto w-full px-0', maxWClass)}>\n <div className=\"flex w-full items-center justify-between\">\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex items-center gap-2 text-sm text-slate-100\">\n {breadcrumbs.map((item, index) => (\n <li key={index} className=\"flex items-center gap-2\">\n {index > 0 ? <span className=\"text-gray-400\">></span> : null}\n {item.href ? (\n <Link to={item.href} className=\"text-slate-100 hover:underline\">\n {item.label}\n </Link>\n ) : (\n <span className=\"text-slate-100\">{item.label}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )}\n {actions && <div>{actions}</div>}\n </div>\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { Tooltip } from '@chakra-ui/react';\nimport { warnDeprecated } from '../lib/deprecation';\n\nexport type HeaderTabBarItem = {\n id: string;\n label: string;\n icon: ReactNode;\n disabled?: boolean;\n};\n\ntype HeaderTabBarProps = {\n items: HeaderTabBarItem[];\n activeId: string;\n onChange: (id: string) => void;\n className?: string;\n ariaLabel?: string;\n};\n\n/**\n * @deprecated Use `NavTabStrip` from `@the-portland-company/shell/native` —\n * the ONE canonical page tab strip (underlined text tabs with a 2px underline\n * in the mode color, Brand guideline \"Tabs are an underlined strip\").\n * `HeaderTabBar` is icon-only and filled, cannot render link tabs, and needs\n * Chakra. Warns in development.\n */\nexport default function HeaderTabBar({\n items,\n activeId,\n onChange,\n className,\n ariaLabel = 'Tabs',\n}: HeaderTabBarProps) {\n warnDeprecated(\n 'HeaderTabBar',\n '<HeaderTabBar> is deprecated: use <NavTabStrip> from @the-portland-company/shell/native, the canonical page tab strip.',\n );\n return (\n <div\n role=\"tablist\"\n aria-label={ariaLabel}\n className={clsx(\n // Header-wide tab strip: background + bottom border only (no outer box).\n 'app-header-tab-bar m-0 flex w-full bg-slate-100 p-0',\n 'border-b border-slate-200',\n className\n )}\n >\n {items.map((item, idx) => {\n const isActive = item.id === activeId;\n const isDisabled = Boolean(item.disabled);\n return (\n <Tooltip\n key={item.id}\n label={item.label}\n placement=\"top\"\n hasArrow\n bg=\"black\"\n color=\"white\"\n isDisabled={isDisabled}\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-label={item.label}\n disabled={isDisabled}\n onClick={() => onChange(item.id)}\n className={clsx(\n 'app-header-tab-button relative inline-flex flex-1 items-center justify-center',\n 'transition-colors',\n 'rounded-none',\n idx === 0 ? 'rounded-tl-lg' : null,\n idx === items.length - 1 ? 'rounded-tr-lg' : null,\n isActive\n ? 'text-white'\n : 'bg-transparent text-slate-600 hover:bg-white/60 hover:text-slate-900',\n isDisabled ? 'cursor-not-allowed opacity-50' : null\n )}\n style={{\n background: isActive\n ? 'var(--mode-primary-color, var(--app-btn-primary-bg))'\n : undefined,\n }}\n >\n <span className=\"inline-flex items-center justify-center text-[14px] leading-none\">\n {item.icon}\n </span>\n </button>\n </Tooltip>\n );\n })}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\n// Inlined feature-flag check (originally in react/app/src/utils/runtimeFeatureFlags.ts).\n// The shell package is self-contained; keeping this helper local avoids a\n// cross-app import while preserving identical runtime behavior.\nconst FLAG_PREFIX = ['__', 'politogy', 'enable'].join('');\nconst GLOBAL_UI_IDS_FLAG = [FLAG_PREFIX, 'global', 'ui', 'ids'].join('_');\n\nfunction isFlagEnabled(name: string): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n const params = new URLSearchParams(window.location.search);\n if (params.get(name) === '1') return true;\n } catch {\n // Ignore malformed location access.\n }\n\n try {\n return window.localStorage.getItem(name) === '1';\n } catch {\n return false;\n }\n}\n\nfunction isGlobalUiIdsEnabled(): boolean {\n return isFlagEnabled(GLOBAL_UI_IDS_FLAG);\n}\n\nconst TARGET_SELECTOR = [\n 'main',\n 'header',\n 'footer',\n 'aside',\n 'nav',\n 'section',\n '[role=\"region\"]',\n '[role=\"banner\"]',\n '[role=\"main\"]',\n '[role=\"navigation\"]',\n '[role=\"complementary\"]',\n 'button',\n '[role=\"button\"]',\n 'a[role=\"button\"]',\n 'input',\n 'textarea',\n 'select',\n '[role=\"combobox\"]',\n '[role=\"listbox\"]',\n '[role=\"option\"]',\n '[role=\"textbox\"]',\n '[role=\"tablist\"]',\n '[role=\"tab\"]',\n '[role=\"tabpanel\"]',\n '[role=\"menu\"]',\n '[role=\"menuitem\"]',\n '[role=\"menuitemcheckbox\"]',\n '[role=\"menuitemradio\"]',\n 'svg',\n '[data-icon]',\n].join(',');\n\nfunction sanitizeToken(raw: string | null | undefined, fallback: string): string {\n if (!raw) return fallback;\n const cleaned = raw\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40);\n return cleaned || fallback;\n}\n\nfunction pageToken(pathname: string): string {\n if (!pathname || pathname === '/') return 'home';\n return sanitizeToken(pathname.replace(/\\//g, '-'), 'page');\n}\n\nfunction inferCategory(el: Element): string {\n const role = (el.getAttribute('role') || '').toLowerCase();\n const tag = el.tagName.toLowerCase();\n\n if (role.includes('tab') || tag === 'tabs') return 'tabs';\n if (role.startsWith('menu') || role === 'menu') return 'menu';\n if (tag === 'button' || role === 'button') return 'button';\n if (tag === 'input' || tag === 'textarea' || tag === 'select' || role === 'combobox')\n return 'field';\n if (tag === 'svg' || el.hasAttribute('data-icon')) return 'icon';\n if (\n ['main', 'header', 'footer', 'aside', 'nav', 'section'].includes(tag) ||\n ['region', 'banner', 'main', 'navigation', 'complementary'].includes(role)\n ) {\n return 'layout';\n }\n\n return 'ui';\n}\n\nfunction inferName(el: Element): string {\n const htmlEl = el as HTMLElement;\n return sanitizeToken(\n el.getAttribute('data-testid') ||\n el.getAttribute('aria-label') ||\n el.getAttribute('name') ||\n el.getAttribute('title') ||\n (htmlEl as HTMLInputElement).placeholder ||\n htmlEl.innerText ||\n el.getAttribute('class'),\n 'item'\n );\n}\n\nfunction assignUiIds(pathname: string): void {\n const used = new Set<string>();\n document.querySelectorAll('[id]').forEach((el) => {\n const id = el.id?.trim();\n if (id) used.add(id);\n });\n\n const counters: Record<string, number> = {};\n const page = pageToken(pathname);\n const elements = document.querySelectorAll(TARGET_SELECTOR);\n\n elements.forEach((el) => {\n const category = inferCategory(el);\n const name = inferName(el);\n const stableKey = `ui-${category}-${name}`;\n\n el.setAttribute('data-ui-category', category);\n el.setAttribute('data-ui-key', stableKey);\n el.setAttribute('data-ui-page', page);\n\n if (el.id) {\n return;\n }\n\n const counterKey = `${page}-${category}-${name}`;\n counters[counterKey] = (counters[counterKey] || 0) + 1;\n\n let nextId = `ui-${page}-${category}-${name}-${counters[counterKey]}`;\n while (used.has(nextId)) {\n counters[counterKey] += 1;\n nextId = `ui-${page}-${category}-${name}-${counters[counterKey]}`;\n }\n\n el.id = nextId;\n used.add(nextId);\n });\n}\n\nexport default function GlobalUiIdProvider() {\n const location = useLocation();\n const enabled = isGlobalUiIdsEnabled();\n\n useEffect(() => {\n if (!enabled) return;\n\n let rafId = 0;\n\n const schedule = () => {\n if (rafId) return;\n rafId = window.requestAnimationFrame(() => {\n rafId = 0;\n assignUiIds(location.pathname);\n });\n };\n\n schedule();\n\n const observer = new MutationObserver(() => {\n schedule();\n });\n\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['role', 'aria-label', 'name', 'title', 'placeholder', 'class', 'data-icon'],\n });\n\n return () => {\n if (rafId) window.cancelAnimationFrame(rafId);\n observer.disconnect();\n };\n }, [enabled, location.pathname]);\n\n return null;\n}\n","'use client'\n\n// Chakra's color mode is a SLAVE to the universal Politogy theme preference.\n//\n// Two independent theme systems used to run side by side inside the shell:\n//\n// 1. `theme-preference.ts` — the cross-app contract. Resolves the stored\n// preference (cookie -> localStorage -> `'system'`) and toggles `.dark` on\n// <html>, which is what makes the Brand stylesheet's complete `.dark {}`\n// win for every `--app-*` / `--sidebar-*` / `--topbar-*` token.\n// 2. Chakra, pinned to light by `politogyTheme`'s\n// `config.initialColorMode: 'light'` + `useSystemColorMode: false`.\n//\n// So any user whose resolved theme was dark — including the DEFAULT `'system'`\n// on a machine with a dark OS appearance — got dark chrome token values over\n// light Chakra content: a near-black sidebar and top bar beside a white page,\n// and floating field labels whose `--app-floating-label-bg` resolved dark while\n// their text stayed a light-mode slate. That reads as a wrong colour but it is\n// a desync: both halves were internally correct and simply disagreed.\n//\n// The fix is to give Chakra no opinion of its own. This manager makes Chakra\n// READ the resolved Politogy theme, and `ChakraColorModeSync` keeps it in step\n// as the preference changes. Writes are deliberately dropped: the My Account\n// Appearance control owns the preference, and `applyThemePreference` +\n// `writeThemeCookie` are the only writers.\n\nimport { useEffect } from 'react'\nimport { useColorMode, type ColorMode } from '@chakra-ui/react'\nimport { readResolvedTheme, THEME_STORAGE_KEY } from '../theme-preference'\n\ninterface ColorModeManager {\n type: 'localStorage' | 'cookie'\n ssr?: boolean\n get(init?: ColorMode): ColorMode | undefined\n set(value: ColorMode): void\n}\n\n/**\n * Pass as `<ChakraProvider colorModeManager={politogyColorModeManager}>`. Chakra\n * then boots in whatever light/dark the pre-paint script already applied, so\n * there is no light-Chakra-over-dark-chrome frame on first render.\n */\nexport const politogyColorModeManager: ColorModeManager = {\n type: 'localStorage',\n ssr: false,\n get(init) {\n if (typeof window === 'undefined') return init\n return readResolvedTheme()\n },\n set() {\n // Intentionally a no-op. Chakra must never persist a color mode of its own —\n // that is how the two systems drifted apart. The preference is written only\n // by the Appearance control via writeThemeCookie/applyThemePreference.\n },\n}\n\n/**\n * Keeps Chakra's `colorMode` equal to the resolved Politogy theme for the life\n * of the app. Render once inside `ChakraProvider`.\n *\n * Mirrors the live-sync surface documented in the theme contract: the shell's\n * own preference event, `storage` for same-app tabs, `focus` /\n * `visibilitychange` cookie re-reads for cross-app tabs, and the OS media query\n * so `'system'` follows the scheme live.\n */\nexport function ChakraColorModeSync(): null {\n const { colorMode, setColorMode } = useColorMode()\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const sync = () => {\n const resolved = readResolvedTheme()\n if (resolved !== colorMode) setColorMode(resolved)\n }\n\n sync()\n\n window.addEventListener('politogy:theme-preference', sync)\n window.addEventListener('storage', sync)\n window.addEventListener('focus', sync)\n document.addEventListener('visibilitychange', sync)\n\n\n return () => {\n window.removeEventListener('politogy:theme-preference', sync)\n window.removeEventListener('storage', sync)\n window.removeEventListener('focus', sync)\n document.removeEventListener('visibilitychange', sync)\n }\n }, [colorMode, setColorMode])\n\n return null\n}\n\nexport { THEME_STORAGE_KEY }\n","import { createContext, useEffect, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { ChakraProvider } from '@chakra-ui/react'\nimport type { Session } from '@supabase/supabase-js'\nimport { politogyTheme } from '../theme'\nimport {\n ChakraColorModeSync,\n politogyColorModeManager,\n} from '../theme/colorMode'\nimport type {\n AppRegistryEntry,\n ShellAuthStatus,\n ShellAuthValue,\n ShellFooterValue,\n ShellLinkedAccountsValue,\n ShellModeValue,\n ShellNavItemsValue,\n ShellNavigationPreferenceValue,\n ShellOrganizationValue,\n ShellProviderProps,\n ShellRoleValue,\n ShellSupportValue,\n ShellUser,\n} from '../types'\n\nexport const ShellAuthContext = createContext<ShellAuthValue | null>(null)\n\ninterface ShellMetaValue {\n currentApp: string\n appRegistry: AppRegistryEntry[]\n basename: string\n}\n\nexport const ShellMetaContext = createContext<ShellMetaValue | null>(null)\n\nexport const ShellOrgContext = createContext<ShellOrganizationValue | null>(null)\nexport const ShellLinkedAccountsContext = createContext<ShellLinkedAccountsValue | null>(null)\nexport const ShellSupportProviderContext = createContext<ShellSupportValue | null>(null)\nexport const ShellModeContext = createContext<ShellModeValue | null>(null)\nexport const ShellNavItemsContext = createContext<ShellNavItemsValue | null>(null)\nexport const ShellNavigationPreferenceContext =\n createContext<ShellNavigationPreferenceValue | null>(null)\nexport const ShellRoleContext = createContext<ShellRoleValue | null>(null)\nexport const ShellFooterContext = createContext<ShellFooterValue | null>(null)\n\nexport interface ShellChromeValue {\n devNotesMenu: ReactNode | null\n myProfileHref: string\n brandLogoSrc?: string\n headerIconsSlot?: ReactNode\n organizationSettingsHref?: string\n showContinueOnboarding?: boolean\n onContinueOnboarding?: () => void\n pageTitle?: string\n breadcrumbs?: Array<{ label: string; href?: string }>\n headerActions?: ReactNode\n /** Avatar URL override for UserMenu. Apps that store the avatar in their own\n * profile table or localStorage should pass it here. */\n userAvatarUrl?: string\n}\n\nexport const ShellChromeContext = createContext<ShellChromeValue | null>(null)\n\nfunction toShellUser(session: Session | null): ShellUser | null {\n if (!session?.user) return null\n const su = session.user\n const fullName = (su.user_metadata as { full_name?: string } | null)?.full_name ?? null\n return {\n id: su.id,\n email: su.email ?? null,\n displayName: fullName ?? su.email ?? null,\n raw: su,\n }\n}\n\nexport function ShellProvider({\n children,\n supabaseClient,\n auth,\n currentApp,\n appRegistry,\n basename,\n organization,\n linkedAccounts,\n support,\n devNotesMenu,\n myProfileHref,\n userAvatarUrl,\n}: ShellProviderProps) {\n const [status, setStatus] = useState<ShellAuthStatus>('loading')\n const [session, setSession] = useState<Session | null>(null)\n\n useEffect(() => {\n // Host-driven auth (or no client at all): Supabase session tracking is off.\n if (auth || !supabaseClient) {\n setSession(null)\n if (!auth) setStatus('unauthenticated')\n return\n }\n let cancelled = false\n supabaseClient.auth.getSession().then(({ data }) => {\n if (cancelled) return\n setSession(data.session)\n setStatus(data.session ? 'authenticated' : 'unauthenticated')\n })\n const sub = supabaseClient.auth.onAuthStateChange((_event, newSession) => {\n setSession(newSession)\n setStatus(newSession ? 'authenticated' : 'unauthenticated')\n })\n return () => {\n cancelled = true\n sub.data.subscription.unsubscribe()\n }\n }, [supabaseClient, auth])\n\n const value = useMemo<ShellAuthValue>(() => {\n if (auth) {\n return {\n status: auth.status,\n session: null,\n user: auth.user,\n signOut: async () => {\n await auth.signOut()\n },\n }\n }\n return {\n status,\n session,\n user: toShellUser(session),\n signOut: async () => {\n await supabaseClient?.auth.signOut()\n },\n }\n }, [auth, status, session, supabaseClient])\n\n const meta = useMemo<ShellMetaValue>(\n () => ({\n currentApp,\n appRegistry: appRegistry ?? [],\n basename: basename ?? '',\n }),\n [currentApp, appRegistry, basename],\n )\n\n const chrome = useMemo<ShellChromeValue>(\n () => ({\n devNotesMenu: devNotesMenu ?? null,\n myProfileHref: myProfileHref ?? '/my-profile',\n userAvatarUrl,\n }),\n [devNotesMenu, myProfileHref, userAvatarUrl],\n )\n\n return (\n <ShellAuthContext.Provider value={value}>\n <ShellMetaContext.Provider value={meta}>\n <ShellOrgContext.Provider value={organization ?? null}>\n <ShellLinkedAccountsContext.Provider value={linkedAccounts ?? null}>\n <ShellSupportProviderContext.Provider value={support ?? null}>\n <ShellModeContext.Provider value={null}>\n <ShellNavItemsContext.Provider value={null}>\n <ShellNavigationPreferenceContext.Provider value={null}>\n <ShellRoleContext.Provider value={null}>\n <ShellFooterContext.Provider value={null}>\n <ShellChromeContext.Provider value={chrome}>\n <ChakraProvider\n theme={politogyTheme}\n colorModeManager={politogyColorModeManager}\n >\n <ChakraColorModeSync />\n {children}\n </ChakraProvider>\n </ShellChromeContext.Provider>\n </ShellFooterContext.Provider>\n </ShellRoleContext.Provider>\n </ShellNavigationPreferenceContext.Provider>\n </ShellNavItemsContext.Provider>\n </ShellModeContext.Provider>\n </ShellSupportProviderContext.Provider>\n </ShellLinkedAccountsContext.Provider>\n </ShellOrgContext.Provider>\n </ShellMetaContext.Provider>\n </ShellAuthContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ShellAuthContext } from '../providers/ShellProvider'\nimport type { ShellAuthValue } from '../types'\n\nexport function useShellAuth(): ShellAuthValue {\n const ctx = useContext(ShellAuthContext)\n if (!ctx) {\n throw new Error('useShellAuth must be used inside <ShellProvider>')\n }\n return ctx\n}\n","import { useContext } from 'react'\nimport { ShellMetaContext } from '../providers/ShellProvider'\nimport type { AppRegistryEntry } from '../types'\n\nexport function useAppRegistry(): AppRegistryEntry[] {\n const meta = useContext(ShellMetaContext)\n if (!meta) {\n throw new Error('useAppRegistry must be used inside <ShellProvider>')\n }\n return meta.appRegistry\n}\n\nexport function useCurrentApp(): string {\n const meta = useContext(ShellMetaContext)\n if (!meta) {\n throw new Error('useCurrentApp must be used inside <ShellProvider>')\n }\n return meta.currentApp\n}\n","import { useContext } from 'react'\nimport { ShellOrgContext } from '../providers/ShellProvider'\nimport type { ShellOrganizationValue } from '../types'\n\n/**\n * Returns the organization value supplied to ShellProvider, or null if the\n * host app didn't pass an `organization` prop. Returning null lets chrome\n * components (e.g., <OrgSelector />) render nothing instead of erroring.\n */\nexport function useShellOrganization(): ShellOrganizationValue | null {\n return useContext(ShellOrgContext)\n}\n","import { useContext } from 'react'\nimport { ShellLinkedAccountsContext } from '../providers/ShellProvider'\nimport type { ShellLinkedAccountsValue } from '../types'\n\n/**\n * Returns the linked-accounts value supplied to ShellProvider, or null if not\n * provided. UserMenu uses this to decide whether to render the\n * \"switch account\" section.\n */\nexport function useShellLinkedAccounts(): ShellLinkedAccountsValue | null {\n return useContext(ShellLinkedAccountsContext)\n}\n","import { useContext } from 'react'\nimport { ShellSupportProviderContext } from '../providers/ShellProvider'\nimport type { ShellSupportValue } from '../types'\n\n/**\n * Returns the support handler supplied to ShellProvider, or null if not\n * provided. SupportRequestButton uses this to decide whether to render.\n */\nexport function useShellSupport(): ShellSupportValue | null {\n return useContext(ShellSupportProviderContext)\n}\n","import { useContext } from 'react'\nimport { ShellChromeContext } from '../providers/ShellProvider'\nimport type { ShellChromeValue } from '../providers/ShellProvider'\n\nexport type { ShellChromeValue }\n\n/**\n * Returns chrome-level options supplied to ShellProvider/ShellChrome\n * (devNotesMenu slot, myProfileHref, header data, brand logo src, etc.).\n * Throws if used outside <ShellProvider>.\n */\nexport function useShellChrome(): ShellChromeValue {\n const ctx = useContext(ShellChromeContext)\n if (!ctx) {\n throw new Error('useShellChrome must be used inside <ShellProvider>')\n }\n return ctx\n}\n","import { useContext } from 'react'\nimport { ShellModeContext } from '../providers/ShellProvider'\nimport type { ShellModeValue } from '../types'\n\n/**\n * Returns the mode value supplied to ShellProvider/ShellChrome, or null if\n * the host app didn't pass a `mode` prop. Components like <ModePill /> use\n * this to conditionally render.\n */\nexport function useShellMode(): ShellModeValue | null {\n return useContext(ShellModeContext)\n}\n","import { useContext } from 'react'\nimport { ShellNavItemsContext } from '../providers/ShellProvider'\nimport type { ShellNavItemsValue } from '../types'\n\n/**\n * Returns the nav items value supplied to ShellChrome, or null if the host\n * app didn't pass a `navItems` prop. The sidebar uses this to decide what\n * rows to render.\n */\nexport function useShellNavItems(): ShellNavItemsValue | null {\n return useContext(ShellNavItemsContext)\n}\n","import { useContext } from 'react'\nimport { ShellNavigationPreferenceContext } from '../providers/ShellProvider'\nimport type { ShellNavigationPreferenceValue } from '../types'\n\n/**\n * Returns the user's navigation rendering preference supplied to\n * ShellChrome, or null if not provided. NavItem uses this to decide\n * whether to expand sub-menus.\n */\nexport function useShellNavigationPreference(): ShellNavigationPreferenceValue | null {\n return useContext(ShellNavigationPreferenceContext)\n}\n","import { useContext } from 'react'\nimport { ShellRoleContext } from '../providers/ShellProvider'\nimport type { ShellRoleValue } from '../types'\n\n/**\n * Returns the active-role info supplied to ShellChrome, or null if not\n * provided. UserMenu uses this to render the ROLES & ORGANIZATIONS badge.\n */\nexport function useShellRole(): ShellRoleValue | null {\n return useContext(ShellRoleContext)\n}\n","import { useContext } from 'react'\nimport { ShellFooterContext } from '../providers/ShellProvider'\nimport type { ShellFooterValue } from '../types'\n\n/**\n * Returns the footer data supplied to ShellChrome (links, commit/version\n * info), or null if not provided. The Sidebar footer reads this to render\n * Privacy / Terms / Subscriptions + commit copy button.\n */\nexport function useShellFooter(): ShellFooterValue | null {\n return useContext(ShellFooterContext)\n}\n","import type { CSSProperties } from 'react'\n\nexport interface BrandLogoProps {\n src?: string\n alt?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * Mode-aware brand logo rendered in the sidebar header. The host app\n * supplies `src` (e.g., a different image per mode); the shell wraps it\n * in a non-draggable <img> so it never accidentally drags on click.\n *\n * Render returns null when no src is supplied so consuming chrome can\n * gracefully omit the slot.\n */\nexport function BrandLogo({ src, alt = 'Brand', className, style }: BrandLogoProps) {\n if (!src) return null\n return (\n <img\n src={src}\n alt={alt}\n className={className}\n style={style}\n draggable={false}\n />\n )\n}\n\nexport default BrandLogo\n","import type { CSSProperties } from 'react'\n\nexport interface BrandIconProps {\n /** Brand-icon name keyed off `/brand/icons/<name>.svg` in the app's public dir. */\n name: string\n /** Pixel size shorthand — sets both width and height. */\n size?: number\n className?: string\n style?: CSSProperties\n alt?: string\n /** Optional prefix for the icon path. Defaults to '/brand/icons/'. */\n basePath?: string\n}\n\n/**\n * Brand-icon component used by sidebar NavItems. The actual SVG assets live\n * in the consuming app's `public/brand/icons/<name>.svg` — shell never\n * imports them directly, only references them by URL.\n */\nexport function BrandIcon({\n name,\n size,\n className,\n style,\n alt,\n basePath = '/brand/icons/',\n}: BrandIconProps) {\n const a11yLabel = alt ?? ''\n const isDecorative = a11yLabel === ''\n const inlineSize = size ? { width: size, height: size, ...style } : style\n\n return (\n <img\n src={`${basePath}${name}.svg`}\n alt={a11yLabel}\n role={isDecorative ? 'presentation' : undefined}\n aria-hidden={isDecorative ? true : undefined}\n className={className}\n style={inlineSize}\n draggable={false}\n />\n )\n}\n\nexport default BrandIcon\n","// Color + badge helpers used by sidebar/header chrome. Ported verbatim from\n// react/app/src/layouts/AuthenticatedLayout.tsx (lines 725–786, 2026-05-13).\n\nconst HEX_COLOR_PATTERN = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/\n\n/** Returns a normalized 7-char hex color, or null if the input isn't valid. */\nexport function normalizeHexColor(value?: string | null): string | null {\n const trimmed = value?.trim()\n if (!trimmed || !HEX_COLOR_PATTERN.test(trimmed)) return null\n if (trimmed.length === 7) return trimmed\n const [r, g, b] = trimmed.slice(1).split('')\n return `#${r}${r}${g}${g}${b}${b}`\n}\n\n/**\n * Returns an `rgba(...)` string lightened toward white by `amount` (0–1),\n * or null if the input isn't a valid hex.\n */\nexport function hexToRgba(hex: string, alpha: number): string | null {\n const normalized = normalizeHexColor(hex)\n if (!normalized) return null\n const red = parseInt(normalized.slice(1, 3), 16)\n const green = parseInt(normalized.slice(3, 5), 16)\n const blue = parseInt(normalized.slice(5, 7), 16)\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`\n}\n\n/**\n * Returns a hex color that is `amount` (0–1) blended from `hex` toward\n * white. Used for the org-menu hover background.\n */\nexport function lightenHexColor(hex: string, amount: number): string | null {\n const normalized = normalizeHexColor(hex)\n if (!normalized) return null\n\n const clamp = (value: number) => Math.max(0, Math.min(255, Math.round(value)))\n const blend = (channel: number) => clamp(channel + (255 - channel) * amount)\n\n const red = parseInt(normalized.slice(1, 3), 16)\n const green = parseInt(normalized.slice(3, 5), 16)\n const blue = parseInt(normalized.slice(5, 7), 16)\n\n return `#${blend(red).toString(16).padStart(2, '0')}${blend(green)\n .toString(16)\n .padStart(2, '0')}${blend(blue).toString(16).padStart(2, '0')}`\n}\n\n/**\n * Reads `settings.brand_colors[0].value` off an org-like input and returns\n * the first valid normalized hex. Returns null if the input doesn't have\n * a usable brand color.\n */\nexport function getOrganizationBrandColor(organization?: {\n brandColor?: string | null\n settings?: {\n brand_colors?: Array<{ value?: string | null }> | null\n } | null\n} | null): string | null {\n if (!organization) return null\n // Direct brandColor (shell's ShellOrganization shape).\n const direct = normalizeHexColor(organization.brandColor)\n if (direct) return direct\n // Legacy settings.brand_colors shape.\n const brandColors = Array.isArray(organization.settings?.brand_colors)\n ? organization.settings?.brand_colors\n : []\n const firstBrandColor = brandColors?.find(\n (entry) => typeof entry?.value === 'string' && normalizeHexColor(entry.value),\n )\n return normalizeHexColor(firstBrandColor?.value ?? null)\n}\n\n/**\n * Returns the two-letter badge for an organization name (e.g., \"The Portland\n * Company\" -> \"TP\"). Falls back to \"OR\" when the input has no letters.\n */\nexport function getOrganizationBadgeLetters(name?: string | null): string {\n const normalizedName = String(name || '')\n .trim()\n .replace(/[^a-zA-Z0-9\\s]+/g, ' ')\n const parts = normalizedName.split(/\\s+/).filter(Boolean)\n\n if (parts.length >= 2) {\n return `${parts[0][0] || ''}${parts[1][0] || ''}`.toUpperCase()\n }\n\n const compact = parts[0] || normalizedName.replace(/\\s+/g, '')\n return compact.slice(0, 2).toUpperCase() || 'OR'\n}\n","// Display-name helper for user-menu / avatar fallbacks. Ported from\n// react/app/src/layouts/AuthenticatedLayout.tsx line 697 (2026-05-13).\n\ninterface UserLike {\n profile?: {\n full_name?: string | null\n name?: string | null\n } | null\n user_metadata?: {\n full_name?: string | null\n name?: string | null\n } | null\n email?: string | null\n}\n\n/**\n * Resolves a user-facing display name from a user object. Tries profile\n * fields first, then user_metadata, then the email local-part, then the\n * raw email, finally falling back to \"User\".\n */\nexport function getUserDisplayName(user: UserLike | null | undefined): string {\n if (!user) return 'User'\n return (\n user.profile?.full_name ||\n user.profile?.name ||\n user.user_metadata?.full_name ||\n user.user_metadata?.name ||\n (typeof user.email === 'string' ? user.email.split('@')[0] : '') ||\n user.email ||\n 'User'\n )\n}\n","export interface RegisterShellPrecacheOptions {\n /** Path the host app serves the SW from. Default: '/sw-shell.js'. */\n scriptUrl?: string\n /** Scope the SW controls. Default: '/'. */\n scope?: string\n}\n\n/**\n * Register the shell precache service worker. Silently no-ops in browsers that\n * don't support service workers (e.g., old Safari) and during SSR.\n *\n * Hosts must copy `node_modules/@the-portland-company/shell/dist/shell-precache.worker.js`\n * to the URL specified by `scriptUrl` (default `/sw-shell.js`) in their public\n * directory so the browser can fetch it at registration time.\n */\nexport async function registerShellPrecache(opts: RegisterShellPrecacheOptions = {}): Promise<void> {\n if (typeof window === 'undefined') return\n if (!('serviceWorker' in navigator)) return\n const scriptUrl = opts.scriptUrl ?? '/sw-shell.js'\n const scope = opts.scope ?? '/'\n try {\n await navigator.serviceWorker.register(scriptUrl, { scope })\n } catch (err) {\n // Registration failures are not user-visible. Log for ops, swallow.\n // eslint-disable-next-line no-console\n console.warn('[shell] precache SW registration failed:', err)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/theme/tokens.generated.ts","../src/theme/colors.ts","../src/theme/components.ts","../src/theme/index.ts","../src/components/Card.tsx","../src/components/PageHeader.tsx","../src/components/PageContainer.tsx","../src/components/BreadcrumbBar.tsx","../src/components/HeaderTabBar.tsx","../src/providers/GlobalUiIdProvider.tsx","../src/theme/colorMode.tsx","../src/providers/ShellProvider.tsx","../src/hooks/useShellAuth.ts","../src/hooks/useAppRegistry.ts","../src/hooks/useShellOrganization.ts","../src/hooks/useShellLinkedAccounts.ts","../src/hooks/useShellSupport.ts","../src/hooks/useShellChrome.ts","../src/hooks/useShellMode.ts","../src/hooks/useShellNavItems.ts","../src/hooks/useShellNavigationPreference.ts","../src/hooks/useShellRole.ts","../src/hooks/useShellFooter.ts","../src/components/BrandLogo.tsx","../src/components/BrandIcon.tsx","../src/lib/orgColors.ts","../src/lib/userDisplay.ts","../src/sw/registerShellPrecache.ts"],"names":["jsxs","jsx","clsx","Link","useEffect","useContext"],"mappings":"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","file":"index.js","sourcesContent":["// GENERATED by scripts/gen-tokens.mjs from Specs (/api/tokens). DO NOT EDIT.\n// The Chakra theme imports these so its colors derive from the same source\n// of truth (Admin Brand API → Specs) as chrome.css.\n// brandRamp = Specs colors.raceRed (primary brand), not shellChrome.brandRamp.\n\nexport const brandRamp = { 50: '#FDECEE', 100: '#FCE0E3', 200: '#F8B6BD', 300: '#EF6671', 400: '#EA4751', 500: '#E63946', 600: '#C42E3A', 700: '#9F252E', 800: '#660F17', 900: '#39080D' } as const;\nexport const grayRamp = { 50: '#F7FAFC', 100: '#EDF2F7', 200: '#E2E8F0', 300: '#CBD5E0', 400: '#A0AEC0', 500: '#718096', 600: '#4A5568', 700: '#2D3748', 800: '#1A202C', 900: '#171923' } as const;\nexport const buttonPrimaryBg = '#E63946';\nexport const buttonPrimaryBgHover = '#C42E3A';\nexport const fieldFocus = '#E63946';\n","// Theme color definitions for light and dark modes.\n// The primary brand ramp is GENERATED from Specs (the styling source of truth)\n// so the Chakra theme stays in lockstep with chrome.css — edit it in Admin →\n// sync to Specs → `npm run gen:tokens`, never hand-edit the ramp here.\nimport { brandRamp } from './tokens.generated';\n\nexport const colors = {\n // Primary brand = Specs race-red (#E63946 ramp). Generated via gen:tokens.\n brand: { ...brandRamp },\n\n // Politogy Brand Colors\n politogy: {\n // Legacy Blue - kept for reference\n blue: {\n 50: '#e8f4fd',\n 100: '#bee3f8',\n 200: '#90cdf4',\n 300: '#63b3ed',\n 400: '#4299e1',\n 500: '#3182ce',\n 600: '#2b6cb0',\n 700: '#2c5282',\n 800: '#2a4365',\n 900: '#1a365d',\n },\n // Race-red (Specs primary brand). Same ramp as `brand`.\n red: { ...brandRamp },\n // Navy - Professional & Authoritative\n navy: {\n 50: '#e8eef6',\n 100: '#c5d4e8',\n 200: '#9fb8d9',\n 300: '#789cca',\n 400: '#5b86be',\n 500: '#3e70b2',\n 600: '#325a8e',\n 700: '#26446a',\n 800: '#1a2e47',\n 900: '#0e1823',\n },\n // White & Off-white\n white: '#ffffff',\n offWhite: '#f8fafc',\n // Text colors\n text: {\n primary: '#1a202c',\n secondary: '#4a5568',\n muted: '#718096',\n light: '#a0aec0',\n },\n },\n\n // Semantic color tokens that will switch based on color mode\n gray: {\n 50: '#f7fafc',\n 100: '#edf2f7',\n 200: '#e2e8f0',\n 300: '#cbd5e0',\n 400: '#a0aec0',\n 500: '#718096',\n 600: '#4a5568',\n 700: '#2d3748',\n 800: '#1a202c',\n 900: '#171923',\n },\n\n // The neutral-black dark ramp from Reference/Global-Rules → Dark Mode. Every\n // value is hue-free (R = G = B); layering is expressed by lightness only.\n //\n // The `gray` ramp above is Chakra's, which is BLUE-TINTED (#2d3748, #1a202c,\n // #171923). Every dark value in the theme used to point into it, so dark mode\n // rendered navy against the black chrome — the single most common way dark\n // mode drifts off-brand, and explicitly called out in the spec. Dark values\n // resolve here instead.\n neutral: {\n page: '#0A0A0A',\n surface: '#161616',\n raised: '#1F1F1F',\n raised2: '#212121',\n hover: '#2B2B2B',\n border: '#333333',\n borderStrong: '#404040',\n textMuted: '#A3A3A3',\n textDim: '#8A8A8A',\n text: '#E8E8E8',\n textStrong: '#F5F5F5',\n },\n};\n\n// Semantic tokens for automatic color mode switching\nexport const semanticTokens = {\n colors: {\n // Every _dark value resolves to the NEUTRAL ramp (colors.neutral), never to\n // Chakra's blue-tinted `gray` scale. See the note on `neutral` above.\n\n // Text colors\n 'text.primary': { default: 'gray.900', _dark: 'neutral.text' },\n 'text.secondary': { default: 'gray.600', _dark: 'neutral.textMuted' },\n 'text.muted': { default: 'gray.500', _dark: 'neutral.textDim' },\n\n // Background colors\n 'bg.primary': { default: 'white', _dark: 'neutral.surface' },\n 'bg.secondary': { default: 'gray.50', _dark: 'neutral.page' },\n 'bg.surface': { default: 'white', _dark: 'neutral.raised' },\n 'bg.hover': { default: 'gray.50', _dark: 'neutral.hover' },\n\n // Border colors\n 'border.default': { default: 'gray.200', _dark: 'neutral.border' },\n 'border.muted': { default: 'gray.100', _dark: 'neutral.border' },\n\n // Component specific\n 'heading.fg': { default: 'politogy.navy.800', _dark: 'neutral.textStrong' },\n 'card.bg': { default: 'white', _dark: 'neutral.surface' },\n 'card.border': { default: 'gray.200', _dark: 'neutral.border' },\n 'input.bg': { default: 'white', _dark: 'neutral.raised' },\n 'input.border': { default: 'gray.200', _dark: 'neutral.border' },\n 'input.hover': { default: 'gray.400', _dark: 'neutral.borderStrong' },\n\n // Navigation\n 'nav.bg': { default: 'white', _dark: 'neutral.surface' },\n 'nav.border': { default: 'gray.200', _dark: 'neutral.border' },\n\n // Sidebar\n 'sidebar.bg': { default: 'gray.50', _dark: 'neutral.surface' },\n 'sidebar.hover': { default: 'gray.100', _dark: 'neutral.hover' },\n 'sidebar.active': { default: 'brand.50', _dark: 'brand.900' },\n\n // Status surfaces. In dark mode these become neutral raised surfaces — the\n // meaning is carried by the icon/text accent, not by a pale tint that would\n // glare against black (and would break the hue-free surface rule).\n 'success.bg': { default: 'green.50', _dark: 'neutral.raised' },\n 'error.bg': { default: 'red.50', _dark: 'neutral.raised' },\n 'warning.bg': { default: 'yellow.50', _dark: 'neutral.raised' },\n 'info.bg': { default: 'blue.50', _dark: 'neutral.raised' },\n\n // ---------------------------------------------------------------------\n // Raw palette remap — the high-leverage half of the dark-mode fix.\n //\n // The app carries ~650 hardcoded Chakra literals (`bg=\"gray.50\"`,\n // `borderColor=\"gray.200\"`, `color=\"gray.600\"`, ...) that no semantic token\n // can reach. Making the SCALE ITSELF color-mode-aware fixes them all at\n // once, centrally, with no app edits.\n //\n // The mapping INVERTS: in dark mode a low number (used as a pale surface)\n // becomes a dark surface, and a high number (used as dark text) becomes\n // light text. That is what makes one remap correct for both background and\n // foreground usage.\n 'gray.50': { default: '#f7fafc', _dark: 'neutral.raised' },\n 'gray.100': { default: '#edf2f7', _dark: 'neutral.raised2' },\n 'gray.200': { default: '#e2e8f0', _dark: 'neutral.border' },\n 'gray.300': { default: '#cbd5e0', _dark: 'neutral.borderStrong' },\n 'gray.400': { default: '#a0aec0', _dark: '#6B6B6B' },\n // #718096 was 4.02:1 on white and only 2.72-3.01:1 on apps' light,\n // slightly-tinted surfaces (card/page backgrounds) — below WCAG 2.2 AA\n // 4.5:1. Darkened to #58657A to clear 4.5:1 with margin on every light\n // surface in use (white through gray.100), keeping the same slate-blue\n // hue family as --topbar-breadcrumb-color's own 2026 fix.\n 'gray.500': { default: '#58657a', _dark: 'neutral.textDim' },\n 'gray.600': { default: '#4a5568', _dark: 'neutral.textMuted' },\n 'gray.700': { default: '#2d3748', _dark: '#C6C6C6' },\n 'gray.800': { default: '#1a202c', _dark: 'neutral.text' },\n 'gray.900': { default: '#171923', _dark: 'neutral.textStrong' },\n\n // Pale status tints used directly as card/callout surfaces. Same reasoning\n // as the *.bg tokens above.\n 'blue.50': { default: '#ebf8ff', _dark: 'neutral.raised' },\n 'green.50': { default: '#f0fff4', _dark: 'neutral.raised' },\n 'red.50': { default: '#fff5f5', _dark: 'neutral.raised' },\n 'yellow.50': { default: '#fffff0', _dark: 'neutral.raised' },\n 'orange.50': { default: '#fffaf0', _dark: 'neutral.raised' },\n\n // Dark status TEXT. The deep shades are picked for contrast against a pale\n // tint; against a #1F1F1F surface they are unreadable — measured on the live\n // info alert, whose description rendered #2c5282 (blue.700) on near-black.\n // In dark mode they lighten to the 200/300 band so the hue still reads as\n // informational/success/error without losing legibility.\n 'blue.600': { default: '#2b6cb0', _dark: '#7CC0F5' },\n 'blue.700': { default: '#2c5282', _dark: '#9AD1F8' },\n 'blue.800': { default: '#2a4365', _dark: '#BFE3FB' },\n 'green.600': { default: '#38a169', _dark: '#68D391' },\n 'green.700': { default: '#2f855a', _dark: '#8EE0AE' },\n 'green.800': { default: '#276749', _dark: '#B6ECCB' },\n 'red.600': { default: '#e53e3e', _dark: '#FC8181' },\n 'red.700': { default: '#c53030', _dark: '#FEA8A8' },\n 'red.800': { default: '#9b2c2c', _dark: '#FECACA' },\n 'orange.600': { default: '#dd6b20', _dark: '#F6AD55' },\n 'orange.700': { default: '#c05621', _dark: '#FBC98A' },\n 'orange.800': { default: '#9c4221', _dark: '#FDDCB4' },\n 'yellow.600': { default: '#d69e2e', _dark: '#ECC94B' },\n 'yellow.700': { default: '#b7791f', _dark: '#F3DC85' },\n 'yellow.800': { default: '#975a16', _dark: '#F8EAB4' },\n },\n};\n","// Component style overrides for theme using Politogy brand colors\nexport const components = {\n Button: {\n baseStyle: {\n fontWeight: 'medium',\n },\n defaultProps: {\n colorScheme: 'brand',\n },\n variants: {\n primary: {\n bg: 'brand.500',\n color: 'white',\n _hover: {\n bg: 'brand.600',\n _disabled: {\n bg: 'brand.500',\n },\n },\n _active: {\n bg: 'brand.700',\n },\n },\n secondary: {\n borderWidth: '1px',\n borderColor: 'gray.300',\n // `card.bg`, not a raw `white` — a literal white here rendered a light\n // pill on the black page in dark mode. (`gray.*` is color-mode-aware via\n // the semanticTokens remap, so those are already safe.)\n bg: 'card.bg',\n color: 'gray.700',\n _hover: {\n bg: 'gray.50',\n },\n },\n solid: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n // For brand colorScheme, use explicit colors\n if (c === 'brand') {\n return {\n bg: 'brand.500',\n color: 'white',\n _hover: {\n bg: 'brand.600',\n _disabled: {\n bg: 'brand.500',\n },\n },\n _active: {\n bg: 'brand.700',\n },\n };\n }\n // For other colorSchemes, use standard pattern with explicit bg and white text\n return {\n bg: `${c}.500`,\n color: 'white',\n _hover: {\n bg: `${c}.600`,\n _disabled: {\n bg: `${c}.500`,\n },\n },\n _active: {\n bg: `${c}.700`,\n },\n };\n },\n ghost: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n return {\n color: `${c}.600`,\n _hover: {\n bg: `${c}.50`,\n },\n };\n },\n outline: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n return {\n borderColor: `${c}.500`,\n color: `${c}.600`,\n _hover: {\n bg: `${c}.50`,\n },\n };\n },\n link: {\n color: 'brand.500',\n _hover: {\n color: 'brand.600',\n textDecoration: 'underline',\n },\n },\n },\n },\n\n Heading: {\n baseStyle: {\n // Was a hard `politogy.navy.800` (#1a2e47) — near-invisible against the\n // black page in dark mode, and off-brand navy besides. Every heading in\n // every app went through this one style.\n color: 'heading.fg',\n fontWeight: 'semibold',\n },\n },\n\n Card: {\n baseStyle: {\n container: {\n bg: 'card.bg',\n borderWidth: '1px',\n borderColor: 'card.border',\n borderRadius: 'lg',\n },\n },\n },\n\n Input: {\n baseStyle: {\n field: {\n bg: 'input.bg',\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n field: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n },\n\n NumberInput: {\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n field: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n },\n\n Select: {\n baseStyle: {\n field: {\n bg: 'input.bg',\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n field: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n },\n\n Textarea: {\n baseStyle: {\n bg: 'input.bg',\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n defaultProps: {\n variant: 'outline',\n },\n variants: {\n outline: {\n borderColor: 'var(--mode-input-border-color)',\n _hover: {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n _focus: {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n },\n },\n },\n\n Menu: {\n baseStyle: {\n list: {\n bg: 'bg.surface',\n borderColor: 'var(--mode-input-border-color)',\n boxShadow: 'lg',\n },\n item: {\n bg: 'transparent',\n _hover: {\n bg: 'bg.hover',\n },\n _focus: {\n bg: 'bg.hover',\n },\n },\n },\n },\n\n Modal: {\n baseStyle: {\n dialog: {\n bg: 'bg.surface',\n },\n overlay: {\n bg: 'blackAlpha.600',\n },\n },\n },\n\n Popover: {\n baseStyle: {\n content: {\n bg: 'bg.surface',\n borderColor: 'border.default',\n boxShadow: 'lg',\n },\n },\n },\n\n Drawer: {\n baseStyle: {\n dialog: {\n bg: 'bg.surface',\n },\n overlay: {\n bg: 'blackAlpha.600',\n },\n },\n },\n\n Tabs: {\n baseStyle: {\n root: {\n width: '100%',\n },\n tablist: {\n width: '100%',\n alignItems: 'flex-end',\n gap: 'var(--app-tab-gap)',\n },\n tabpanels: {\n width: '100%',\n },\n tabpanel: {\n width: '100%',\n },\n tab: {\n minHeight: 'var(--app-tab-height)',\n height: 'var(--app-tab-height)',\n lineHeight: 1,\n borderTopLeftRadius: 'var(--app-tab-radius)',\n borderTopRightRadius: 'var(--app-tab-radius)',\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n color: 'text.secondary',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n borderColor: 'brand.500',\n fontWeight: 'semibold',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n },\n variants: {\n enclosed: {\n tab: {\n color: 'gray.600',\n bg: 'transparent',\n borderColor: 'gray.200',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n borderColor: 'brand.500',\n borderBottomColor: 'brand.500',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n },\n 'enclosed-colored': {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n 'soft-rounded': {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n 'solid-rounded': {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n },\n },\n },\n line: {\n tab: {\n color: 'gray.600',\n _selected: {\n color: 'white',\n bg: 'brand.500',\n borderColor: 'brand.500',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n },\n unstyled: {\n tab: {\n // Allow inline styles to take precedence for unstyled variant\n },\n },\n },\n defaultProps: {\n colorScheme: 'brand',\n },\n },\n\n Badge: {\n baseStyle: {\n borderRadius: 'md',\n px: 2,\n py: 1,\n fontWeight: 'medium',\n },\n defaultProps: {\n colorScheme: 'brand',\n },\n },\n\n Link: {\n baseStyle: {\n color: 'brand.500',\n _hover: {\n color: 'brand.600',\n textDecoration: 'underline',\n },\n },\n },\n\n // Reference/UI-Platform: every top-bar control and every panel it opens share\n // ONE surface treatment — one definition of background, border, blur and\n // radius, not a per-component re-style. Chakra's stock Tooltip INVERTS\n // (dark text surface in light mode, LIGHT surface in dark mode), so in dark\n // mode every `div#tooltip-*` rendered a near-white #E8E8E8 slab against the\n // black chrome — measured on 15 of 29 pages, including inside the\n // Communications Fuel panel. Pin it to the shared panel surface instead, so a\n // Chakra tooltip and the native chrome's TopBarTooltip look identical.\n Tooltip: {\n baseStyle: {\n // Chakra's own baseStyle sets `bg: var(--tooltip-bg)` and then assigns\n // `--tooltip-bg` from its palette, so overriding `bg` alone loses — the\n // variable still resolves to Chakra's value and the bubble stayed light\n // (measured #E8E8E8 live after a first attempt that set only `bg`). Pin\n // the VARIABLE, which is what both the bubble and the arrow read.\n '--tooltip-bg': 'var(--panel-elevated, #1F1F1F)',\n '--tooltip-fg': 'var(--foreground, #E8E8E8)',\n '--popper-arrow-bg': 'var(--panel-elevated, #1F1F1F)',\n // Chakra ALSO ships a `_dark` block that re-assigns those two variables\n // to `colors.gray.300` / `colors.gray.900` — i.e. it deliberately INVERTS\n // in dark mode. That block wins over the base keys, so it has to be\n // overridden explicitly or the bubble goes light again.\n _dark: {\n '--tooltip-bg': 'var(--panel-elevated, #1F1F1F)',\n '--tooltip-fg': 'var(--foreground, #E8E8E8)',\n '--popper-arrow-bg': 'var(--panel-elevated, #1F1F1F)',\n },\n bg: 'var(--panel-elevated, #1F1F1F)',\n color: 'var(--foreground, #E8E8E8)',\n border: '1px solid',\n borderColor: 'var(--line, #333333)',\n borderRadius: 'var(--radius-lg, 0.5rem)',\n boxShadow: 'var(--shadow-soft)',\n fontSize: '12px',\n paddingX: 3,\n paddingY: 2,\n },\n },\n\n Alert: {\n baseStyle: {\n container: {\n borderRadius: 'md',\n },\n },\n variants: {\n subtle: (props: { colorScheme: string; colorMode?: string }) => {\n const { colorScheme: c, colorMode } = props;\n // In DARK mode a \"subtle\" alert must not paint a pale tint: Chakra's\n // default resolves `<scheme>.200` for both the surface AND the icon, so\n // an error alert rendered a near-white pink (#FEB2B2 — measured live on\n // app) against the black page. Global-Rules → Dark Mode: every dark\n // surface is hue-free; meaning is carried by the icon/text accent, not\n // by the fill. Reds also reconcile to brand #E63946, not Chakra #E53E3E.\n if (colorMode === 'dark') {\n const accent =\n c === 'blue' || c === 'info'\n ? '#7CC0F5'\n : c === 'green' || c === 'success'\n ? '#68D391'\n : c === 'orange' || c === 'yellow' || c === 'warning'\n ? '#F6AD55'\n : 'var(--color-race-red-300, #EF6671)';\n return {\n container: { bg: 'neutral.raised', borderLeftColor: accent },\n icon: { color: accent },\n title: { color: 'neutral.text' },\n description: { color: 'neutral.textMuted' },\n };\n }\n // Keep info alerts blue\n if (c === 'blue' || c === 'info') {\n return {\n container: {\n bg: 'blue.50',\n },\n icon: {\n color: 'blue.500',\n },\n title: {\n color: 'blue.800',\n },\n description: {\n color: 'blue.700',\n },\n };\n }\n return {};\n },\n 'left-accent': (props: { colorScheme: string; colorMode?: string }) => {\n const { colorScheme: c, colorMode } = props;\n if (colorMode === 'dark') {\n const accent =\n c === 'blue' || c === 'info'\n ? '#7CC0F5'\n : c === 'green' || c === 'success'\n ? '#68D391'\n : c === 'orange' || c === 'yellow' || c === 'warning'\n ? '#F6AD55'\n : 'var(--color-race-red-300, #EF6671)';\n return {\n container: { bg: 'neutral.raised', borderLeftColor: accent },\n icon: { color: accent },\n title: { color: 'neutral.text' },\n description: { color: 'neutral.textMuted' },\n };\n }\n if (c === 'blue' || c === 'info') {\n return {\n container: {\n bg: 'blue.50',\n borderLeftColor: 'blue.500',\n },\n icon: {\n color: 'blue.500',\n },\n };\n }\n return {};\n },\n solid: (props: { colorScheme: string }) => {\n const { colorScheme: c } = props;\n if (c === 'blue' || c === 'info') {\n return {\n container: {\n bg: 'blue.500',\n color: 'white',\n },\n };\n }\n return {};\n },\n },\n },\n\n Table: {\n baseStyle: {\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n borderSpacing: '0',\n borderColor: 'gray.200',\n },\n th: {\n borderColor: 'gray.200',\n borderBottom: 'none',\n bg: 'gray.200',\n color: 'text.secondary',\n fontWeight: 'semibold',\n px: 3,\n py: 2.5,\n minHeight: '44px',\n height: '44px',\n verticalAlign: 'middle',\n },\n td: {\n borderColor: 'gray.200',\n borderBottom: 'none',\n px: 3,\n py: 2.5,\n minHeight: '44px',\n height: '44px',\n verticalAlign: 'middle',\n },\n tr: {\n borderBottom: 'none',\n borderColor: 'transparent',\n _odd: {\n bg: 'card.bg',\n },\n _even: {\n bg: 'gray.50',\n },\n _hover: {\n bg: 'gray.100',\n },\n },\n tbody: {\n tr: {\n _odd: {\n bg: 'card.bg',\n },\n _even: {\n bg: 'gray.50',\n },\n _hover: {\n bg: 'blue.100',\n },\n },\n },\n },\n variants: {\n simple: {},\n striped: {},\n },\n defaultProps: {\n variant: 'striped',\n },\n },\n\n Divider: {\n baseStyle: {\n borderColor: 'border.default',\n },\n },\n};\n","import { extendTheme } from '@chakra-ui/react';\nimport { colors, semanticTokens } from './colors';\nimport { components } from './components';\n\n// Define the theme configuration\n// Chakra's color mode is driven by `politogyColorModeManager` (theme/colorMode),\n// which reads the resolved universal Politogy theme. These values are only the\n// pre-manager default; `useSystemColorMode` stays false on purpose, because the\n// OS scheme is consulted by `resolveTheme('system')` — letting Chakra ALSO watch\n// the media query would give it a second, competing opinion, which is exactly\n// the desync this manager exists to remove.\nconst config = {\n initialColorMode: 'light',\n useSystemColorMode: false,\n};\n\n// Global styles\nconst styles = {\n global: () => ({\n // Body surface comes from the chrome aliases that chrome.css emits in light\n // AND neutral-black dark, so the page follows `.dark` instead of forcing\n // white underneath dark chrome. Chakra's global styles beat app CSS, so\n // hardcoding `white`/`gray.900` here made every app light-only from the\n // inside no matter what the tokens said (Reference/Global-Rules → Dark Mode:\n // the neutral-black rule binds the entire app UI, not just the chrome).\n body: {\n bg: 'var(--color-bg, white)',\n color: 'var(--color-text, #1a202c)',\n },\n ':root': {\n '--mode-primary-color': 'var(--app-color-brand-500)',\n '--mode-input-border-color': 'var(--app-color-brand-500)',\n '--mode-input-hover-border-color': 'var(--app-color-brand-600)',\n '--mode-input-focus-shadow-color': 'var(--app-color-brand-500)',\n },\n // Ensure non-Chakra/native text-like inputs follow mode border colors as well.\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]):not([type=\"file\"]):not([type=\"color\"]), textarea, select':\n {\n borderColor: 'var(--mode-input-border-color)',\n },\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]):not([type=\"file\"]):not([type=\"color\"]):hover, textarea:hover, select:hover':\n {\n borderColor: 'var(--mode-input-hover-border-color)',\n },\n 'input:not([type=\"checkbox\"]):not([type=\"radio\"]):not([type=\"range\"]):not([type=\"file\"]):not([type=\"color\"]):focus, textarea:focus, select:focus':\n {\n borderColor: 'var(--mode-primary-color)',\n boxShadow: '0 0 0 1px var(--mode-input-focus-shadow-color)',\n },\n }),\n};\n\n// Fonts — Brand-token driven, exactly like color.\n//\n// These were hardcoded to the system stack, and because Chakra's global styles\n// beat app CSS, VRM rendered in -apple-system while every app on the native\n// chrome rendered the Brand family. A font change is supposed to ship from the\n// Brand editor without a redeploy, so heading/body resolve `--font-family` (and\n// mono resolves the shared mono token) with the old stacks as the pre-tokens\n// fallback only (Reference/UI-Platform → Typography; HITL 2026-07-23).\nconst SYSTEM_SANS =\n 'ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif'\nconst SYSTEM_MONO =\n 'SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace'\n\nconst fonts = {\n heading: `var(--font-family, ${SYSTEM_SANS})`,\n body: `var(--font-family, ${SYSTEM_SANS})`,\n mono: `var(--font-mono, ${SYSTEM_MONO})`,\n};\n\n// Create and export the theme\nexport const politogyTheme = extendTheme({\n config,\n colors,\n semanticTokens,\n components,\n styles,\n fonts,\n\n // Additional theme configurations\n shadows: {\n outline: '0 0 0 3px var(--app-color-brand-500)',\n },\n\n radii: {\n none: '0',\n sm: '0.125rem',\n base: '0.25rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n '3xl': '1.5rem',\n full: '9999px',\n },\n});\n\nexport { politogyTheme as default };\n","import type { CSSProperties, ReactNode } from 'react';\ntype CardProps = {\n title?: string;\n children: ReactNode;\n minH?: string | number;\n className?: string;\n style?: CSSProperties;\n [key: string]: unknown;\n};\n\nexport default function Card({\n title,\n children,\n minH,\n className,\n style,\n ...props\n}: CardProps) {\n return (\n <div\n className={`rounded-lg border border-slate-200 bg-white p-6 shadow-sm ${className || ''}`}\n style={{ minHeight: minH, ...style }}\n {...props}\n >\n {title && <h3 className=\"mb-4 text-lg font-semibold\">{title}</h3>}\n {children}\n </div>\n );\n}\n","import { Link } from 'react-router-dom';\nimport clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\ntype BreadcrumbItem = {\n label: string;\n href?: string;\n};\n\n/** The three Modes a page header's eyebrow can announce (Reference/UI-Platform\n * → \"Per-mode branding\"). */\nexport type PageHeaderMode = 'relationship' | 'campaign' | 'petition';\n\nconst MODE_EYEBROW_LABEL: Record<PageHeaderMode, string> = {\n relationship: 'Relationship mode',\n campaign: 'Campaign mode',\n petition: 'Petition mode',\n};\n\ntype PageHeaderProps = {\n title?: ReactNode;\n /**\n * The operating Mode this page belongs to. When set, the 11px uppercase\n * mode eyebrow (\"Relationship mode\" / \"Campaign mode\" / \"Petition mode\")\n * renders above the title by DEFAULT — Reference/UI-Platform → \"Page\n * header\": \"Left: an 11px uppercase mode eyebrow ... in the mode color\n * (`modes.<mode>.primary`)\". Pass `showEyebrow={false}` to suppress it.\n */\n mode?: PageHeaderMode;\n /** Overrides the eyebrow text the `mode` default would produce. */\n eyebrow?: string;\n /** Set false to suppress the eyebrow even when `mode` is passed. Default true. */\n showEyebrow?: boolean;\n /** Optional one-line subtitle, 15px G4, directly under the title. */\n subtitle?: ReactNode;\n breadcrumbs?: BreadcrumbItem[];\n actions?: ReactNode;\n tabBar?: ReactNode;\n maxW?: string;\n hideSidebar?: boolean;\n};\n\nconst resolveMaxWidthClass = (maxW: string) => {\n if (maxW === 'full') return 'max-w-none';\n if (maxW === 'container.lg') return 'max-w-6xl';\n if (maxW === 'container.md') return 'max-w-5xl';\n return 'max-w-7xl';\n};\n\nexport default function PageHeader({\n title,\n mode,\n eyebrow,\n showEyebrow = true,\n subtitle,\n breadcrumbs = [],\n actions = null,\n tabBar = null,\n maxW = 'full',\n hideSidebar = false,\n}: PageHeaderProps) {\n const maxWClass = resolveMaxWidthClass(maxW);\n const titleText = typeof title === 'string' ? title.trim() : '';\n const normalizedTitle = titleText.toLowerCase();\n const breadcrumbsWithoutCurrent = [...breadcrumbs];\n const last = breadcrumbsWithoutCurrent[breadcrumbsWithoutCurrent.length - 1];\n // Only remove a trailing breadcrumb that duplicates the page title when there's\n // still at least one breadcrumb left to show.\n if (\n breadcrumbsWithoutCurrent.length > 1 &&\n normalizedTitle &&\n last &&\n last.label.trim().toLowerCase() === normalizedTitle\n ) {\n breadcrumbsWithoutCurrent.pop();\n }\n\n // The eyebrow renders whenever there's text for it to show — from an\n // explicit `eyebrow` override, or derived from `mode` by default — unless\n // the caller opts out with `showEyebrow={false}`.\n const eyebrowText = showEyebrow ? eyebrow ?? (mode ? MODE_EYEBROW_LABEL[mode] : undefined) : undefined;\n\n // Avoid rendering an empty header bar (no title, no breadcrumbs, no actions, no tabs).\n if (!title && !eyebrowText && breadcrumbsWithoutCurrent.length === 0 && !actions && !tabBar) {\n return null;\n }\n\n return (\n <div\n style={{ backgroundColor: 'var(--app-tab-header-bg, #888888)' }}\n className={clsx('text-slate-100', tabBar ? 'pt-3 pb-0' : 'py-3 border-b border-gray-200', {\n 'md:ml-60': !hideSidebar,\n })}\n >\n <div className={clsx('w-full px-4', maxWClass)}>\n <div className=\"flex w-full flex-nowrap items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {eyebrowText ? (\n <div\n className=\"truncate text-[11px] font-bold uppercase leading-[1.2] tracking-[0.09em]\"\n style={{ color: 'var(--mode-accent, var(--color-accent, #E63946))' }}\n >\n {eyebrowText}\n </div>\n ) : null}\n {title ? (\n <div className=\"min-w-0\">\n <div\n className=\"truncate font-bold text-white\"\n style={{\n fontFamily: 'var(--font-family, ui-sans-serif, system-ui, sans-serif)',\n fontSize: 'var(--type-h2-size, 1.875rem)',\n lineHeight: 'var(--type-h2-line-height, 1.25)',\n }}\n >\n {title}\n </div>\n </div>\n ) : null}\n {subtitle ? (\n <div className=\"mt-1 truncate text-[15px] text-[color:var(--color-g4,#929599)]\">\n {subtitle}\n </div>\n ) : null}\n {breadcrumbsWithoutCurrent.length > 0 ? (\n <nav\n aria-label=\"Breadcrumb\"\n className={clsx('min-w-0 text-slate-100', title ? 'mt-1' : '')}\n >\n <ol className=\"flex flex-nowrap items-center gap-2 overflow-hidden text-sm text-gray-600\">\n {breadcrumbsWithoutCurrent.map((item, index) => (\n <li\n key={`${item.label}-${index}`}\n className=\"flex min-w-0 flex-shrink-0 items-center gap-2\"\n >\n {index > 0 ? <span className=\"text-gray-400\">></span> : null}\n {item.href ? (\n <Link to={item.href} className=\"truncate text-slate-100 hover:underline\">\n {item.label}\n </Link>\n ) : (\n <span className=\"truncate text-slate-100\">{item.label}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n ) : null}\n </div>\n {actions ? <div className=\"flex-shrink-0\">{actions}</div> : null}\n </div>\n </div>\n {tabBar ? (\n <div className=\"m-0 w-full px-0\" style={{ backgroundColor: 'transparent' }}>\n {tabBar}\n </div>\n ) : null}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { warnDeprecated } from '../lib/deprecation';\n\ntype PageContainerProps = {\n children: ReactNode;\n maxW?: string;\n px?: number | string;\n py?: number | string;\n lockHeight?: boolean;\n};\n\n/**\n * @deprecated Not for app use. The frame's `<main>` is fluid (Brand guideline\n * \"Content width is fluid\"): apps never emit their own page container, a\n * second `<main>`, a max-width or an `mx-auto` wrapper. Render page content\n * directly inside `<PolitogyAppFrame>`; for form and settings pages use\n * `<FormColumn>` (960px, left-aligned). Warns in development.\n */\nexport default function PageContainer({\n children,\n maxW = 'container.xl',\n px,\n py,\n lockHeight = true,\n}: PageContainerProps) {\n warnDeprecated(\n 'PageContainer',\n '<PageContainer> is deprecated for apps: the frame owns a fluid <main>. Render content directly inside <PolitogyAppFrame>, and use <FormColumn> for form/settings pages.',\n );\n const isFullWidth = maxW === 'full';\n const effectivePx = isFullWidth ? 0 : px === undefined ? 4 : Number(px);\n const effectivePy = py === undefined ? (isFullWidth ? 0 : 4) : py;\n const pxValue = String(effectivePx);\n const pyValue = String(effectivePy);\n\n const maxWClass = isFullWidth\n ? 'max-w-none'\n : maxW === 'container.xl'\n ? 'max-w-7xl'\n : maxW === 'container.lg'\n ? 'max-w-6xl'\n : maxW === 'container.md'\n ? 'max-w-5xl'\n : typeof maxW === 'string' && /^(\\d+)px$/.test(maxW)\n ? ''\n : 'max-w-7xl';\n\n const pxClass =\n pxValue === '0'\n ? 'px-0'\n : pxValue === '1'\n ? 'px-1'\n : pxValue === '2'\n ? 'px-2'\n : pxValue === '3'\n ? 'px-3'\n : pxValue === '4'\n ? 'px-4'\n : 'px-4';\n\n const pyClass =\n pyValue === '0'\n ? 'py-0'\n : pyValue === '4'\n ? 'py-4'\n : pyValue === '5'\n ? 'py-5'\n : pyValue === '6'\n ? 'py-6'\n : 'py-6';\n\n const inlineMaxWStyle =\n typeof maxW === 'string' && /^(\\d+)px$/.test(maxW) ? { maxWidth: maxW } : undefined;\n\n return (\n <main\n className={lockHeight ? 'h-[calc(100vh-80px)] min-h-[calc(100vh-80px)]' : ''}\n style={{ background: 'var(--app-tab-content-bg)' }}\n >\n <div\n className={clsx(\n 'mx-auto w-full',\n maxWClass,\n pxClass,\n pyClass,\n lockHeight ? 'h-full' : 'h-auto'\n )}\n style={inlineMaxWStyle}\n >\n {children}\n </div>\n </main>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport clsx from 'clsx';\nimport { warnDeprecated } from '../lib/deprecation';\n\ntype BreadcrumbItem = {\n label: string;\n href?: string;\n};\n\ntype BreadcrumbBarProps = {\n breadcrumbs?: BreadcrumbItem[];\n actions?: ReactNode;\n maxW?: string;\n};\n\n/**\n * @deprecated Not for app use. The breadcrumb trail is retired\n * (Reference/UI-Platform → Page header): the mode eyebrow, the page title, the\n * active left-bar row and the selected tab already say where the user is.\n * Warns in development.\n */\nexport default function BreadcrumbBar({\n breadcrumbs = [],\n actions = null,\n maxW = 'full',\n}: BreadcrumbBarProps) {\n warnDeprecated(\n 'BreadcrumbBar',\n '<BreadcrumbBar> is deprecated for apps: the breadcrumb trail is retired. Use the page header (mode eyebrow + title) instead.',\n );\n if ((!breadcrumbs || breadcrumbs.length === 0) && !actions) {\n return null;\n }\n\n const maxWClass =\n maxW === 'full'\n ? 'max-w-none'\n : maxW === 'container.xl'\n ? 'max-w-7xl'\n : maxW === 'container.lg'\n ? 'max-w-6xl'\n : maxW === 'container.md'\n ? 'max-w-5xl'\n : 'max-w-7xl';\n\n return (\n <div\n className=\"ml-0 border-b border-gray-200 px-4 py-3 md:ml-60\"\n style={{ backgroundColor: 'var(--app-tab-header-bg, #888888)' }}\n >\n <div className={clsx('mx-auto w-full px-0', maxWClass)}>\n <div className=\"flex w-full items-center justify-between\">\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav aria-label=\"Breadcrumb\">\n <ol className=\"flex items-center gap-2 text-sm text-slate-100\">\n {breadcrumbs.map((item, index) => (\n <li key={index} className=\"flex items-center gap-2\">\n {index > 0 ? <span className=\"text-gray-400\">></span> : null}\n {item.href ? (\n <Link to={item.href} className=\"text-slate-100 hover:underline\">\n {item.label}\n </Link>\n ) : (\n <span className=\"text-slate-100\">{item.label}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )}\n {actions && <div>{actions}</div>}\n </div>\n </div>\n </div>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\nimport { Tooltip } from '@chakra-ui/react';\nimport { warnDeprecated } from '../lib/deprecation';\n\nexport type HeaderTabBarItem = {\n id: string;\n label: string;\n icon: ReactNode;\n disabled?: boolean;\n};\n\ntype HeaderTabBarProps = {\n items: HeaderTabBarItem[];\n activeId: string;\n onChange: (id: string) => void;\n className?: string;\n ariaLabel?: string;\n};\n\n/**\n * @deprecated Use `NavTabStrip` from `@the-portland-company/shell/native` —\n * the ONE canonical page tab strip (underlined text tabs with a 2px underline\n * in the mode color, Brand guideline \"Tabs are an underlined strip\").\n * `HeaderTabBar` is icon-only and filled, cannot render link tabs, and needs\n * Chakra. Warns in development.\n */\nexport default function HeaderTabBar({\n items,\n activeId,\n onChange,\n className,\n ariaLabel = 'Tabs',\n}: HeaderTabBarProps) {\n warnDeprecated(\n 'HeaderTabBar',\n '<HeaderTabBar> is deprecated: use <NavTabStrip> from @the-portland-company/shell/native, the canonical page tab strip.',\n );\n return (\n <div\n role=\"tablist\"\n aria-label={ariaLabel}\n className={clsx(\n // Header-wide tab strip: background + bottom border only (no outer box).\n 'app-header-tab-bar m-0 flex w-full bg-slate-100 p-0',\n 'border-b border-slate-200',\n className\n )}\n >\n {items.map((item, idx) => {\n const isActive = item.id === activeId;\n const isDisabled = Boolean(item.disabled);\n return (\n <Tooltip\n key={item.id}\n label={item.label}\n placement=\"top\"\n hasArrow\n bg=\"black\"\n color=\"white\"\n isDisabled={isDisabled}\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-label={item.label}\n disabled={isDisabled}\n onClick={() => onChange(item.id)}\n className={clsx(\n 'app-header-tab-button relative inline-flex flex-1 items-center justify-center',\n 'transition-colors',\n 'rounded-none',\n idx === 0 ? 'rounded-tl-lg' : null,\n idx === items.length - 1 ? 'rounded-tr-lg' : null,\n isActive\n ? 'text-white'\n : 'bg-transparent text-slate-600 hover:bg-white/60 hover:text-slate-900',\n isDisabled ? 'cursor-not-allowed opacity-50' : null\n )}\n style={{\n background: isActive\n ? 'var(--mode-primary-color, var(--app-btn-primary-bg))'\n : undefined,\n }}\n >\n <span className=\"inline-flex items-center justify-center text-[14px] leading-none\">\n {item.icon}\n </span>\n </button>\n </Tooltip>\n );\n })}\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\n// Inlined feature-flag check (originally in react/app/src/utils/runtimeFeatureFlags.ts).\n// The shell package is self-contained; keeping this helper local avoids a\n// cross-app import while preserving identical runtime behavior.\nconst FLAG_PREFIX = ['__', 'politogy', 'enable'].join('');\nconst GLOBAL_UI_IDS_FLAG = [FLAG_PREFIX, 'global', 'ui', 'ids'].join('_');\n\nfunction isFlagEnabled(name: string): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n const params = new URLSearchParams(window.location.search);\n if (params.get(name) === '1') return true;\n } catch {\n // Ignore malformed location access.\n }\n\n try {\n return window.localStorage.getItem(name) === '1';\n } catch {\n return false;\n }\n}\n\nfunction isGlobalUiIdsEnabled(): boolean {\n return isFlagEnabled(GLOBAL_UI_IDS_FLAG);\n}\n\nconst TARGET_SELECTOR = [\n 'main',\n 'header',\n 'footer',\n 'aside',\n 'nav',\n 'section',\n '[role=\"region\"]',\n '[role=\"banner\"]',\n '[role=\"main\"]',\n '[role=\"navigation\"]',\n '[role=\"complementary\"]',\n 'button',\n '[role=\"button\"]',\n 'a[role=\"button\"]',\n 'input',\n 'textarea',\n 'select',\n '[role=\"combobox\"]',\n '[role=\"listbox\"]',\n '[role=\"option\"]',\n '[role=\"textbox\"]',\n '[role=\"tablist\"]',\n '[role=\"tab\"]',\n '[role=\"tabpanel\"]',\n '[role=\"menu\"]',\n '[role=\"menuitem\"]',\n '[role=\"menuitemcheckbox\"]',\n '[role=\"menuitemradio\"]',\n 'svg',\n '[data-icon]',\n].join(',');\n\nfunction sanitizeToken(raw: string | null | undefined, fallback: string): string {\n if (!raw) return fallback;\n const cleaned = raw\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40);\n return cleaned || fallback;\n}\n\nfunction pageToken(pathname: string): string {\n if (!pathname || pathname === '/') return 'home';\n return sanitizeToken(pathname.replace(/\\//g, '-'), 'page');\n}\n\nfunction inferCategory(el: Element): string {\n const role = (el.getAttribute('role') || '').toLowerCase();\n const tag = el.tagName.toLowerCase();\n\n if (role.includes('tab') || tag === 'tabs') return 'tabs';\n if (role.startsWith('menu') || role === 'menu') return 'menu';\n if (tag === 'button' || role === 'button') return 'button';\n if (tag === 'input' || tag === 'textarea' || tag === 'select' || role === 'combobox')\n return 'field';\n if (tag === 'svg' || el.hasAttribute('data-icon')) return 'icon';\n if (\n ['main', 'header', 'footer', 'aside', 'nav', 'section'].includes(tag) ||\n ['region', 'banner', 'main', 'navigation', 'complementary'].includes(role)\n ) {\n return 'layout';\n }\n\n return 'ui';\n}\n\nfunction inferName(el: Element): string {\n const htmlEl = el as HTMLElement;\n return sanitizeToken(\n el.getAttribute('data-testid') ||\n el.getAttribute('aria-label') ||\n el.getAttribute('name') ||\n el.getAttribute('title') ||\n (htmlEl as HTMLInputElement).placeholder ||\n htmlEl.innerText ||\n el.getAttribute('class'),\n 'item'\n );\n}\n\nfunction assignUiIds(pathname: string): void {\n const used = new Set<string>();\n document.querySelectorAll('[id]').forEach((el) => {\n const id = el.id?.trim();\n if (id) used.add(id);\n });\n\n const counters: Record<string, number> = {};\n const page = pageToken(pathname);\n const elements = document.querySelectorAll(TARGET_SELECTOR);\n\n elements.forEach((el) => {\n const category = inferCategory(el);\n const name = inferName(el);\n const stableKey = `ui-${category}-${name}`;\n\n el.setAttribute('data-ui-category', category);\n el.setAttribute('data-ui-key', stableKey);\n el.setAttribute('data-ui-page', page);\n\n if (el.id) {\n return;\n }\n\n const counterKey = `${page}-${category}-${name}`;\n counters[counterKey] = (counters[counterKey] || 0) + 1;\n\n let nextId = `ui-${page}-${category}-${name}-${counters[counterKey]}`;\n while (used.has(nextId)) {\n counters[counterKey] += 1;\n nextId = `ui-${page}-${category}-${name}-${counters[counterKey]}`;\n }\n\n el.id = nextId;\n used.add(nextId);\n });\n}\n\nexport default function GlobalUiIdProvider() {\n const location = useLocation();\n const enabled = isGlobalUiIdsEnabled();\n\n useEffect(() => {\n if (!enabled) return;\n\n let rafId = 0;\n\n const schedule = () => {\n if (rafId) return;\n rafId = window.requestAnimationFrame(() => {\n rafId = 0;\n assignUiIds(location.pathname);\n });\n };\n\n schedule();\n\n const observer = new MutationObserver(() => {\n schedule();\n });\n\n observer.observe(document.body, {\n subtree: true,\n childList: true,\n attributes: true,\n attributeFilter: ['role', 'aria-label', 'name', 'title', 'placeholder', 'class', 'data-icon'],\n });\n\n return () => {\n if (rafId) window.cancelAnimationFrame(rafId);\n observer.disconnect();\n };\n }, [enabled, location.pathname]);\n\n return null;\n}\n","'use client'\n\n// Chakra's color mode is a SLAVE to the universal Politogy theme preference.\n//\n// Two independent theme systems used to run side by side inside the shell:\n//\n// 1. `theme-preference.ts` — the cross-app contract. Resolves the stored\n// preference (cookie -> localStorage -> `'system'`) and toggles `.dark` on\n// <html>, which is what makes the Brand stylesheet's complete `.dark {}`\n// win for every `--app-*` / `--sidebar-*` / `--topbar-*` token.\n// 2. Chakra, pinned to light by `politogyTheme`'s\n// `config.initialColorMode: 'light'` + `useSystemColorMode: false`.\n//\n// So any user whose resolved theme was dark — including the DEFAULT `'system'`\n// on a machine with a dark OS appearance — got dark chrome token values over\n// light Chakra content: a near-black sidebar and top bar beside a white page,\n// and floating field labels whose `--app-floating-label-bg` resolved dark while\n// their text stayed a light-mode slate. That reads as a wrong colour but it is\n// a desync: both halves were internally correct and simply disagreed.\n//\n// The fix is to give Chakra no opinion of its own. This manager makes Chakra\n// READ the resolved Politogy theme, and `ChakraColorModeSync` keeps it in step\n// as the preference changes. Writes are deliberately dropped: the My Account\n// Appearance control owns the preference, and `applyThemePreference` +\n// `writeThemeCookie` are the only writers.\n\nimport { useEffect } from 'react'\nimport { useColorMode, type ColorMode } from '@chakra-ui/react'\nimport { readResolvedTheme, THEME_STORAGE_KEY } from '../theme-preference'\n\ninterface ColorModeManager {\n type: 'localStorage' | 'cookie'\n ssr?: boolean\n get(init?: ColorMode): ColorMode | undefined\n set(value: ColorMode): void\n}\n\n/**\n * Pass as `<ChakraProvider colorModeManager={politogyColorModeManager}>`. Chakra\n * then boots in whatever light/dark the pre-paint script already applied, so\n * there is no light-Chakra-over-dark-chrome frame on first render.\n */\nexport const politogyColorModeManager: ColorModeManager = {\n type: 'localStorage',\n ssr: false,\n get(init) {\n if (typeof window === 'undefined') return init\n return readResolvedTheme()\n },\n set() {\n // Intentionally a no-op. Chakra must never persist a color mode of its own —\n // that is how the two systems drifted apart. The preference is written only\n // by the Appearance control via writeThemeCookie/applyThemePreference.\n },\n}\n\n/**\n * Keeps Chakra's `colorMode` equal to the resolved Politogy theme for the life\n * of the app. Render once inside `ChakraProvider`.\n *\n * Mirrors the live-sync surface documented in the theme contract: the shell's\n * own preference event, `storage` for same-app tabs, `focus` /\n * `visibilitychange` cookie re-reads for cross-app tabs, and the OS media query\n * so `'system'` follows the scheme live.\n */\nexport function ChakraColorModeSync(): null {\n const { colorMode, setColorMode } = useColorMode()\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const sync = () => {\n const resolved = readResolvedTheme()\n if (resolved !== colorMode) setColorMode(resolved)\n }\n\n sync()\n\n window.addEventListener('politogy:theme-preference', sync)\n window.addEventListener('storage', sync)\n window.addEventListener('focus', sync)\n document.addEventListener('visibilitychange', sync)\n\n\n return () => {\n window.removeEventListener('politogy:theme-preference', sync)\n window.removeEventListener('storage', sync)\n window.removeEventListener('focus', sync)\n document.removeEventListener('visibilitychange', sync)\n }\n }, [colorMode, setColorMode])\n\n return null\n}\n\nexport { THEME_STORAGE_KEY }\n","import { createContext, useEffect, useMemo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { ChakraProvider } from '@chakra-ui/react'\nimport type { Session } from '@supabase/supabase-js'\nimport { politogyTheme } from '../theme'\nimport {\n ChakraColorModeSync,\n politogyColorModeManager,\n} from '../theme/colorMode'\nimport type {\n AppRegistryEntry,\n ShellAuthStatus,\n ShellAuthValue,\n ShellFooterValue,\n ShellLinkedAccountsValue,\n ShellModeValue,\n ShellNavItemsValue,\n ShellNavigationPreferenceValue,\n ShellOrganizationValue,\n ShellProviderProps,\n ShellRoleValue,\n ShellSupportValue,\n ShellUser,\n} from '../types'\n\nexport const ShellAuthContext = createContext<ShellAuthValue | null>(null)\n\ninterface ShellMetaValue {\n currentApp: string\n appRegistry: AppRegistryEntry[]\n basename: string\n}\n\nexport const ShellMetaContext = createContext<ShellMetaValue | null>(null)\n\nexport const ShellOrgContext = createContext<ShellOrganizationValue | null>(null)\nexport const ShellLinkedAccountsContext = createContext<ShellLinkedAccountsValue | null>(null)\nexport const ShellSupportProviderContext = createContext<ShellSupportValue | null>(null)\nexport const ShellModeContext = createContext<ShellModeValue | null>(null)\nexport const ShellNavItemsContext = createContext<ShellNavItemsValue | null>(null)\nexport const ShellNavigationPreferenceContext =\n createContext<ShellNavigationPreferenceValue | null>(null)\nexport const ShellRoleContext = createContext<ShellRoleValue | null>(null)\nexport const ShellFooterContext = createContext<ShellFooterValue | null>(null)\n\nexport interface ShellChromeValue {\n devNotesMenu: ReactNode | null\n myProfileHref: string\n brandLogoSrc?: string\n headerIconsSlot?: ReactNode\n organizationSettingsHref?: string\n showContinueOnboarding?: boolean\n onContinueOnboarding?: () => void\n pageTitle?: string\n breadcrumbs?: Array<{ label: string; href?: string }>\n headerActions?: ReactNode\n /** Avatar URL override for UserMenu. Apps that store the avatar in their own\n * profile table or localStorage should pass it here. */\n userAvatarUrl?: string\n}\n\nexport const ShellChromeContext = createContext<ShellChromeValue | null>(null)\n\nfunction toShellUser(session: Session | null): ShellUser | null {\n if (!session?.user) return null\n const su = session.user\n const fullName = (su.user_metadata as { full_name?: string } | null)?.full_name ?? null\n return {\n id: su.id,\n email: su.email ?? null,\n displayName: fullName ?? su.email ?? null,\n raw: su,\n }\n}\n\nexport function ShellProvider({\n children,\n supabaseClient,\n auth,\n currentApp,\n appRegistry,\n basename,\n organization,\n linkedAccounts,\n support,\n devNotesMenu,\n myProfileHref,\n userAvatarUrl,\n}: ShellProviderProps) {\n const [status, setStatus] = useState<ShellAuthStatus>('loading')\n const [session, setSession] = useState<Session | null>(null)\n\n useEffect(() => {\n // Host-driven auth (or no client at all): Supabase session tracking is off.\n if (auth || !supabaseClient) {\n setSession(null)\n if (!auth) setStatus('unauthenticated')\n return\n }\n let cancelled = false\n supabaseClient.auth.getSession().then(({ data }) => {\n if (cancelled) return\n setSession(data.session)\n setStatus(data.session ? 'authenticated' : 'unauthenticated')\n })\n const sub = supabaseClient.auth.onAuthStateChange((_event, newSession) => {\n setSession(newSession)\n setStatus(newSession ? 'authenticated' : 'unauthenticated')\n })\n return () => {\n cancelled = true\n sub.data.subscription.unsubscribe()\n }\n }, [supabaseClient, auth])\n\n const value = useMemo<ShellAuthValue>(() => {\n if (auth) {\n return {\n status: auth.status,\n session: null,\n user: auth.user,\n signOut: async () => {\n await auth.signOut()\n },\n }\n }\n return {\n status,\n session,\n user: toShellUser(session),\n signOut: async () => {\n await supabaseClient?.auth.signOut()\n },\n }\n }, [auth, status, session, supabaseClient])\n\n const meta = useMemo<ShellMetaValue>(\n () => ({\n currentApp,\n appRegistry: appRegistry ?? [],\n basename: basename ?? '',\n }),\n [currentApp, appRegistry, basename],\n )\n\n const chrome = useMemo<ShellChromeValue>(\n () => ({\n devNotesMenu: devNotesMenu ?? null,\n myProfileHref: myProfileHref ?? '/my-profile',\n userAvatarUrl,\n }),\n [devNotesMenu, myProfileHref, userAvatarUrl],\n )\n\n return (\n <ShellAuthContext.Provider value={value}>\n <ShellMetaContext.Provider value={meta}>\n <ShellOrgContext.Provider value={organization ?? null}>\n <ShellLinkedAccountsContext.Provider value={linkedAccounts ?? null}>\n <ShellSupportProviderContext.Provider value={support ?? null}>\n <ShellModeContext.Provider value={null}>\n <ShellNavItemsContext.Provider value={null}>\n <ShellNavigationPreferenceContext.Provider value={null}>\n <ShellRoleContext.Provider value={null}>\n <ShellFooterContext.Provider value={null}>\n <ShellChromeContext.Provider value={chrome}>\n <ChakraProvider\n theme={politogyTheme}\n colorModeManager={politogyColorModeManager}\n >\n <ChakraColorModeSync />\n {children}\n </ChakraProvider>\n </ShellChromeContext.Provider>\n </ShellFooterContext.Provider>\n </ShellRoleContext.Provider>\n </ShellNavigationPreferenceContext.Provider>\n </ShellNavItemsContext.Provider>\n </ShellModeContext.Provider>\n </ShellSupportProviderContext.Provider>\n </ShellLinkedAccountsContext.Provider>\n </ShellOrgContext.Provider>\n </ShellMetaContext.Provider>\n </ShellAuthContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ShellAuthContext } from '../providers/ShellProvider'\nimport type { ShellAuthValue } from '../types'\n\nexport function useShellAuth(): ShellAuthValue {\n const ctx = useContext(ShellAuthContext)\n if (!ctx) {\n throw new Error('useShellAuth must be used inside <ShellProvider>')\n }\n return ctx\n}\n","import { useContext } from 'react'\nimport { ShellMetaContext } from '../providers/ShellProvider'\nimport type { AppRegistryEntry } from '../types'\n\nexport function useAppRegistry(): AppRegistryEntry[] {\n const meta = useContext(ShellMetaContext)\n if (!meta) {\n throw new Error('useAppRegistry must be used inside <ShellProvider>')\n }\n return meta.appRegistry\n}\n\nexport function useCurrentApp(): string {\n const meta = useContext(ShellMetaContext)\n if (!meta) {\n throw new Error('useCurrentApp must be used inside <ShellProvider>')\n }\n return meta.currentApp\n}\n","import { useContext } from 'react'\nimport { ShellOrgContext } from '../providers/ShellProvider'\nimport type { ShellOrganizationValue } from '../types'\n\n/**\n * Returns the organization value supplied to ShellProvider, or null if the\n * host app didn't pass an `organization` prop. Returning null lets chrome\n * components (e.g., <OrgSelector />) render nothing instead of erroring.\n */\nexport function useShellOrganization(): ShellOrganizationValue | null {\n return useContext(ShellOrgContext)\n}\n","import { useContext } from 'react'\nimport { ShellLinkedAccountsContext } from '../providers/ShellProvider'\nimport type { ShellLinkedAccountsValue } from '../types'\n\n/**\n * Returns the linked-accounts value supplied to ShellProvider, or null if not\n * provided. UserMenu uses this to decide whether to render the\n * \"switch account\" section.\n */\nexport function useShellLinkedAccounts(): ShellLinkedAccountsValue | null {\n return useContext(ShellLinkedAccountsContext)\n}\n","import { useContext } from 'react'\nimport { ShellSupportProviderContext } from '../providers/ShellProvider'\nimport type { ShellSupportValue } from '../types'\n\n/**\n * Returns the support handler supplied to ShellProvider, or null if not\n * provided. SupportRequestButton uses this to decide whether to render.\n */\nexport function useShellSupport(): ShellSupportValue | null {\n return useContext(ShellSupportProviderContext)\n}\n","import { useContext } from 'react'\nimport { ShellChromeContext } from '../providers/ShellProvider'\nimport type { ShellChromeValue } from '../providers/ShellProvider'\n\nexport type { ShellChromeValue }\n\n/**\n * Returns chrome-level options supplied to ShellProvider/ShellChrome\n * (devNotesMenu slot, myProfileHref, header data, brand logo src, etc.).\n * Throws if used outside <ShellProvider>.\n */\nexport function useShellChrome(): ShellChromeValue {\n const ctx = useContext(ShellChromeContext)\n if (!ctx) {\n throw new Error('useShellChrome must be used inside <ShellProvider>')\n }\n return ctx\n}\n","import { useContext } from 'react'\nimport { ShellModeContext } from '../providers/ShellProvider'\nimport type { ShellModeValue } from '../types'\n\n/**\n * Returns the mode value supplied to ShellProvider/ShellChrome, or null if\n * the host app didn't pass a `mode` prop. Components like <ModePill /> use\n * this to conditionally render.\n */\nexport function useShellMode(): ShellModeValue | null {\n return useContext(ShellModeContext)\n}\n","import { useContext } from 'react'\nimport { ShellNavItemsContext } from '../providers/ShellProvider'\nimport type { ShellNavItemsValue } from '../types'\n\n/**\n * Returns the nav items value supplied to ShellChrome, or null if the host\n * app didn't pass a `navItems` prop. The sidebar uses this to decide what\n * rows to render.\n */\nexport function useShellNavItems(): ShellNavItemsValue | null {\n return useContext(ShellNavItemsContext)\n}\n","import { useContext } from 'react'\nimport { ShellNavigationPreferenceContext } from '../providers/ShellProvider'\nimport type { ShellNavigationPreferenceValue } from '../types'\n\n/**\n * Returns the user's navigation rendering preference supplied to\n * ShellChrome, or null if not provided. NavItem uses this to decide\n * whether to expand sub-menus.\n */\nexport function useShellNavigationPreference(): ShellNavigationPreferenceValue | null {\n return useContext(ShellNavigationPreferenceContext)\n}\n","import { useContext } from 'react'\nimport { ShellRoleContext } from '../providers/ShellProvider'\nimport type { ShellRoleValue } from '../types'\n\n/**\n * Returns the active-role info supplied to ShellChrome, or null if not\n * provided. UserMenu uses this to render the ROLES & ORGANIZATIONS badge.\n */\nexport function useShellRole(): ShellRoleValue | null {\n return useContext(ShellRoleContext)\n}\n","import { useContext } from 'react'\nimport { ShellFooterContext } from '../providers/ShellProvider'\nimport type { ShellFooterValue } from '../types'\n\n/**\n * Returns the footer data supplied to ShellChrome (links, commit/version\n * info), or null if not provided. The Sidebar footer reads this to render\n * Privacy / Terms / Subscriptions + commit copy button.\n */\nexport function useShellFooter(): ShellFooterValue | null {\n return useContext(ShellFooterContext)\n}\n","import type { CSSProperties } from 'react'\n\nexport interface BrandLogoProps {\n src?: string\n alt?: string\n className?: string\n style?: CSSProperties\n}\n\n/**\n * Mode-aware brand logo rendered in the sidebar header. The host app\n * supplies `src` (e.g., a different image per mode); the shell wraps it\n * in a non-draggable <img> so it never accidentally drags on click.\n *\n * Render returns null when no src is supplied so consuming chrome can\n * gracefully omit the slot.\n */\nexport function BrandLogo({ src, alt = 'Brand', className, style }: BrandLogoProps) {\n if (!src) return null\n return (\n <img\n src={src}\n alt={alt}\n className={className}\n style={style}\n draggable={false}\n />\n )\n}\n\nexport default BrandLogo\n","import type { CSSProperties } from 'react'\n\nexport interface BrandIconProps {\n /** Brand-icon name keyed off `/brand/icons/<name>.svg` in the app's public dir. */\n name: string\n /** Pixel size shorthand — sets both width and height. */\n size?: number\n className?: string\n style?: CSSProperties\n alt?: string\n /** Optional prefix for the icon path. Defaults to '/brand/icons/'. */\n basePath?: string\n}\n\n/**\n * Brand-icon component used by sidebar NavItems. The actual SVG assets live\n * in the consuming app's `public/brand/icons/<name>.svg` — shell never\n * imports them directly, only references them by URL.\n */\nexport function BrandIcon({\n name,\n size,\n className,\n style,\n alt,\n basePath = '/brand/icons/',\n}: BrandIconProps) {\n const a11yLabel = alt ?? ''\n const isDecorative = a11yLabel === ''\n const inlineSize = size ? { width: size, height: size, ...style } : style\n\n return (\n <img\n src={`${basePath}${name}.svg`}\n alt={a11yLabel}\n role={isDecorative ? 'presentation' : undefined}\n aria-hidden={isDecorative ? true : undefined}\n className={className}\n style={inlineSize}\n draggable={false}\n />\n )\n}\n\nexport default BrandIcon\n","// Color + badge helpers used by sidebar/header chrome. Ported verbatim from\n// react/app/src/layouts/AuthenticatedLayout.tsx (lines 725–786, 2026-05-13).\n\nconst HEX_COLOR_PATTERN = /^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/\n\n/** Returns a normalized 7-char hex color, or null if the input isn't valid. */\nexport function normalizeHexColor(value?: string | null): string | null {\n const trimmed = value?.trim()\n if (!trimmed || !HEX_COLOR_PATTERN.test(trimmed)) return null\n if (trimmed.length === 7) return trimmed\n const [r, g, b] = trimmed.slice(1).split('')\n return `#${r}${r}${g}${g}${b}${b}`\n}\n\n/**\n * Returns an `rgba(...)` string lightened toward white by `amount` (0–1),\n * or null if the input isn't a valid hex.\n */\nexport function hexToRgba(hex: string, alpha: number): string | null {\n const normalized = normalizeHexColor(hex)\n if (!normalized) return null\n const red = parseInt(normalized.slice(1, 3), 16)\n const green = parseInt(normalized.slice(3, 5), 16)\n const blue = parseInt(normalized.slice(5, 7), 16)\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`\n}\n\n/**\n * Returns a hex color that is `amount` (0–1) blended from `hex` toward\n * white. Used for the org-menu hover background.\n */\nexport function lightenHexColor(hex: string, amount: number): string | null {\n const normalized = normalizeHexColor(hex)\n if (!normalized) return null\n\n const clamp = (value: number) => Math.max(0, Math.min(255, Math.round(value)))\n const blend = (channel: number) => clamp(channel + (255 - channel) * amount)\n\n const red = parseInt(normalized.slice(1, 3), 16)\n const green = parseInt(normalized.slice(3, 5), 16)\n const blue = parseInt(normalized.slice(5, 7), 16)\n\n return `#${blend(red).toString(16).padStart(2, '0')}${blend(green)\n .toString(16)\n .padStart(2, '0')}${blend(blue).toString(16).padStart(2, '0')}`\n}\n\n/**\n * Reads `settings.brand_colors[0].value` off an org-like input and returns\n * the first valid normalized hex. Returns null if the input doesn't have\n * a usable brand color.\n */\nexport function getOrganizationBrandColor(organization?: {\n brandColor?: string | null\n settings?: {\n brand_colors?: Array<{ value?: string | null }> | null\n } | null\n} | null): string | null {\n if (!organization) return null\n // Direct brandColor (shell's ShellOrganization shape).\n const direct = normalizeHexColor(organization.brandColor)\n if (direct) return direct\n // Legacy settings.brand_colors shape.\n const brandColors = Array.isArray(organization.settings?.brand_colors)\n ? organization.settings?.brand_colors\n : []\n const firstBrandColor = brandColors?.find(\n (entry) => typeof entry?.value === 'string' && normalizeHexColor(entry.value),\n )\n return normalizeHexColor(firstBrandColor?.value ?? null)\n}\n\n/**\n * Returns the two-letter badge for an organization name (e.g., \"The Portland\n * Company\" -> \"TP\"). Falls back to \"OR\" when the input has no letters.\n */\nexport function getOrganizationBadgeLetters(name?: string | null): string {\n const normalizedName = String(name || '')\n .trim()\n .replace(/[^a-zA-Z0-9\\s]+/g, ' ')\n const parts = normalizedName.split(/\\s+/).filter(Boolean)\n\n if (parts.length >= 2) {\n return `${parts[0][0] || ''}${parts[1][0] || ''}`.toUpperCase()\n }\n\n const compact = parts[0] || normalizedName.replace(/\\s+/g, '')\n return compact.slice(0, 2).toUpperCase() || 'OR'\n}\n","// Display-name helper for user-menu / avatar fallbacks. Ported from\n// react/app/src/layouts/AuthenticatedLayout.tsx line 697 (2026-05-13).\n\ninterface UserLike {\n profile?: {\n full_name?: string | null\n name?: string | null\n } | null\n user_metadata?: {\n full_name?: string | null\n name?: string | null\n } | null\n email?: string | null\n}\n\n/**\n * Resolves a user-facing display name from a user object. Tries profile\n * fields first, then user_metadata, then the email local-part, then the\n * raw email, finally falling back to \"User\".\n */\nexport function getUserDisplayName(user: UserLike | null | undefined): string {\n if (!user) return 'User'\n return (\n user.profile?.full_name ||\n user.profile?.name ||\n user.user_metadata?.full_name ||\n user.user_metadata?.name ||\n (typeof user.email === 'string' ? user.email.split('@')[0] : '') ||\n user.email ||\n 'User'\n )\n}\n","export interface RegisterShellPrecacheOptions {\n /** Path the host app serves the SW from. Default: '/sw-shell.js'. */\n scriptUrl?: string\n /** Scope the SW controls. Default: '/'. */\n scope?: string\n}\n\n/**\n * Register the shell precache service worker. Silently no-ops in browsers that\n * don't support service workers (e.g., old Safari) and during SSR.\n *\n * Hosts must copy `node_modules/@the-portland-company/shell/dist/shell-precache.worker.js`\n * to the URL specified by `scriptUrl` (default `/sw-shell.js`) in their public\n * directory so the browser can fetch it at registration time.\n */\nexport async function registerShellPrecache(opts: RegisterShellPrecacheOptions = {}): Promise<void> {\n if (typeof window === 'undefined') return\n if (!('serviceWorker' in navigator)) return\n const scriptUrl = opts.scriptUrl ?? '/sw-shell.js'\n const scope = opts.scope ?? '/'\n try {\n await navigator.serviceWorker.register(scriptUrl, { scope })\n } catch (err) {\n // Registration failures are not user-visible. Log for ops, swallow.\n // eslint-disable-next-line no-console\n console.warn('[shell] precache SW registration failed:', err)\n }\n}\n"]}
|