@city-of-baltimore/bromo 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +97 -0
  3. package/dist-kit/Alert-Cw_gMn8C.js +295 -0
  4. package/dist-kit/EmptyState-BjrPSxNz.js +651 -0
  5. package/dist-kit/GeoMapCanvas-qbPIJXuA.js +716 -0
  6. package/dist-kit/SectionHeader-D2kyZqwI.js +379 -0
  7. package/dist-kit/api.js +93 -0
  8. package/dist-kit/charts.js +117 -0
  9. package/dist-kit/index.js +3223 -0
  10. package/dist-kit/map.js +476 -0
  11. package/dist-kit/themeTokens-CAvxuaP0.js +266 -0
  12. package/dist-kit/tokens.js +2 -0
  13. package/dist-kit/types/app/BromoProvider.d.ts +30 -0
  14. package/dist-kit/types/app/BromoProvider.d.ts.map +1 -0
  15. package/dist-kit/types/app/assertFontsLoaded.d.ts +2 -0
  16. package/dist-kit/types/app/assertFontsLoaded.d.ts.map +1 -0
  17. package/dist-kit/types/app/bromoConfig.d.ts +46 -0
  18. package/dist-kit/types/app/bromoConfig.d.ts.map +1 -0
  19. package/dist-kit/types/app/colorMode.d.ts +17 -0
  20. package/dist-kit/types/app/colorMode.d.ts.map +1 -0
  21. package/dist-kit/types/app/colorModeDefaults.d.ts +7 -0
  22. package/dist-kit/types/app/colorModeDefaults.d.ts.map +1 -0
  23. package/dist-kit/types/app/theme.d.ts +42 -0
  24. package/dist-kit/types/app/theme.d.ts.map +1 -0
  25. package/dist-kit/types/app/themeTokens.d.ts +36 -0
  26. package/dist-kit/types/app/themeTokens.d.ts.map +1 -0
  27. package/dist-kit/types/components/AdminLanding.d.ts +21 -0
  28. package/dist-kit/types/components/AdminLanding.d.ts.map +1 -0
  29. package/dist-kit/types/components/Alert.d.ts +14 -0
  30. package/dist-kit/types/components/Alert.d.ts.map +1 -0
  31. package/dist-kit/types/components/AppliedFilters.d.ts +16 -0
  32. package/dist-kit/types/components/AppliedFilters.d.ts.map +1 -0
  33. package/dist-kit/types/components/BarList.d.ts +27 -0
  34. package/dist-kit/types/components/BarList.d.ts.map +1 -0
  35. package/dist-kit/types/components/BrandLockup.d.ts +14 -0
  36. package/dist-kit/types/components/BrandLockup.d.ts.map +1 -0
  37. package/dist-kit/types/components/Button.d.ts +20 -0
  38. package/dist-kit/types/components/Button.d.ts.map +1 -0
  39. package/dist-kit/types/components/Chart.d.ts +25 -0
  40. package/dist-kit/types/components/Chart.d.ts.map +1 -0
  41. package/dist-kit/types/components/DataTable.d.ts +47 -0
  42. package/dist-kit/types/components/DataTable.d.ts.map +1 -0
  43. package/dist-kit/types/components/DetailsDrawer.d.ts +18 -0
  44. package/dist-kit/types/components/DetailsDrawer.d.ts.map +1 -0
  45. package/dist-kit/types/components/DiagnosticsSummary.d.ts +20 -0
  46. package/dist-kit/types/components/DiagnosticsSummary.d.ts.map +1 -0
  47. package/dist-kit/types/components/EmptyState.d.ts +21 -0
  48. package/dist-kit/types/components/EmptyState.d.ts.map +1 -0
  49. package/dist-kit/types/components/ErrorState.d.ts +25 -0
  50. package/dist-kit/types/components/ErrorState.d.ts.map +1 -0
  51. package/dist-kit/types/components/ExportButton.d.ts +13 -0
  52. package/dist-kit/types/components/ExportButton.d.ts.map +1 -0
  53. package/dist-kit/types/components/FileUpload.d.ts +42 -0
  54. package/dist-kit/types/components/FileUpload.d.ts.map +1 -0
  55. package/dist-kit/types/components/FilterDrawer.d.ts +26 -0
  56. package/dist-kit/types/components/FilterDrawer.d.ts.map +1 -0
  57. package/dist-kit/types/components/FilterPanel.d.ts +19 -0
  58. package/dist-kit/types/components/FilterPanel.d.ts.map +1 -0
  59. package/dist-kit/types/components/Filters.d.ts +54 -0
  60. package/dist-kit/types/components/Filters.d.ts.map +1 -0
  61. package/dist-kit/types/components/GeoMap.d.ts +45 -0
  62. package/dist-kit/types/components/GeoMap.d.ts.map +1 -0
  63. package/dist-kit/types/components/GovBanner.d.ts +16 -0
  64. package/dist-kit/types/components/GovBanner.d.ts.map +1 -0
  65. package/dist-kit/types/components/HeaderButton.d.ts +20 -0
  66. package/dist-kit/types/components/HeaderButton.d.ts.map +1 -0
  67. package/dist-kit/types/components/HeaderUserMenu.d.ts +35 -0
  68. package/dist-kit/types/components/HeaderUserMenu.d.ts.map +1 -0
  69. package/dist-kit/types/components/IconButton.d.ts +10 -0
  70. package/dist-kit/types/components/IconButton.d.ts.map +1 -0
  71. package/dist-kit/types/components/LanguageAccessPanel.d.ts +12 -0
  72. package/dist-kit/types/components/LanguageAccessPanel.d.ts.map +1 -0
  73. package/dist-kit/types/components/LoadingState.d.ts +19 -0
  74. package/dist-kit/types/components/LoadingState.d.ts.map +1 -0
  75. package/dist-kit/types/components/MapA11ySummary.d.ts +11 -0
  76. package/dist-kit/types/components/MapA11ySummary.d.ts.map +1 -0
  77. package/dist-kit/types/components/MapFrame.d.ts +18 -0
  78. package/dist-kit/types/components/MapFrame.d.ts.map +1 -0
  79. package/dist-kit/types/components/MapLegend.d.ts +21 -0
  80. package/dist-kit/types/components/MapLegend.d.ts.map +1 -0
  81. package/dist-kit/types/components/MetricRow.d.ts +32 -0
  82. package/dist-kit/types/components/MetricRow.d.ts.map +1 -0
  83. package/dist-kit/types/components/MetricTile.d.ts +30 -0
  84. package/dist-kit/types/components/MetricTile.d.ts.map +1 -0
  85. package/dist-kit/types/components/MissingValue.d.ts +8 -0
  86. package/dist-kit/types/components/MissingValue.d.ts.map +1 -0
  87. package/dist-kit/types/components/MultiSelect.d.ts +15 -0
  88. package/dist-kit/types/components/MultiSelect.d.ts.map +1 -0
  89. package/dist-kit/types/components/PageHeader.d.ts +27 -0
  90. package/dist-kit/types/components/PageHeader.d.ts.map +1 -0
  91. package/dist-kit/types/components/PageShell.d.ts +25 -0
  92. package/dist-kit/types/components/PageShell.d.ts.map +1 -0
  93. package/dist-kit/types/components/SectionHeader.d.ts +16 -0
  94. package/dist-kit/types/components/SectionHeader.d.ts.map +1 -0
  95. package/dist-kit/types/components/SideNav.d.ts +18 -0
  96. package/dist-kit/types/components/SideNav.d.ts.map +1 -0
  97. package/dist-kit/types/components/SignInScreen.d.ts +27 -0
  98. package/dist-kit/types/components/SignInScreen.d.ts.map +1 -0
  99. package/dist-kit/types/components/SiteFooter.d.ts +11 -0
  100. package/dist-kit/types/components/SiteFooter.d.ts.map +1 -0
  101. package/dist-kit/types/components/SiteHeader.d.ts +21 -0
  102. package/dist-kit/types/components/SiteHeader.d.ts.map +1 -0
  103. package/dist-kit/types/components/Stat.d.ts +47 -0
  104. package/dist-kit/types/components/Stat.d.ts.map +1 -0
  105. package/dist-kit/types/components/StatRow.d.ts +31 -0
  106. package/dist-kit/types/components/StatRow.d.ts.map +1 -0
  107. package/dist-kit/types/components/SummaryCard.d.ts +17 -0
  108. package/dist-kit/types/components/SummaryCard.d.ts.map +1 -0
  109. package/dist-kit/types/components/Surface.d.ts +14 -0
  110. package/dist-kit/types/components/Surface.d.ts.map +1 -0
  111. package/dist-kit/types/components/Tag.d.ts +21 -0
  112. package/dist-kit/types/components/Tag.d.ts.map +1 -0
  113. package/dist-kit/types/components/UploadQueue.d.ts +29 -0
  114. package/dist-kit/types/components/UploadQueue.d.ts.map +1 -0
  115. package/dist-kit/types/components/UserMenu.d.ts +18 -0
  116. package/dist-kit/types/components/UserMenu.d.ts.map +1 -0
  117. package/dist-kit/types/components/UserSummary.d.ts +21 -0
  118. package/dist-kit/types/components/UserSummary.d.ts.map +1 -0
  119. package/dist-kit/types/components/WorkflowActionBar.d.ts +36 -0
  120. package/dist-kit/types/components/WorkflowActionBar.d.ts.map +1 -0
  121. package/dist-kit/types/components/WorkflowErrorPanel.d.ts +16 -0
  122. package/dist-kit/types/components/WorkflowErrorPanel.d.ts.map +1 -0
  123. package/dist-kit/types/components/WorkflowStatusPanel.d.ts +21 -0
  124. package/dist-kit/types/components/WorkflowStatusPanel.d.ts.map +1 -0
  125. package/dist-kit/types/components/archetypes/Dashboard.d.ts +37 -0
  126. package/dist-kit/types/components/archetypes/Dashboard.d.ts.map +1 -0
  127. package/dist-kit/types/components/archetypes/DetailView.d.ts +43 -0
  128. package/dist-kit/types/components/archetypes/DetailView.d.ts.map +1 -0
  129. package/dist-kit/types/components/archetypes/ListView.d.ts +50 -0
  130. package/dist-kit/types/components/archetypes/ListView.d.ts.map +1 -0
  131. package/dist-kit/types/components/archetypes/PageTemplate.d.ts +35 -0
  132. package/dist-kit/types/components/archetypes/PageTemplate.d.ts.map +1 -0
  133. package/dist-kit/types/components/archetypes/index.d.ts +12 -0
  134. package/dist-kit/types/components/archetypes/index.d.ts.map +1 -0
  135. package/dist-kit/types/components/layout/Center.d.ts +19 -0
  136. package/dist-kit/types/components/layout/Center.d.ts.map +1 -0
  137. package/dist-kit/types/components/layout/Grid.d.ts +22 -0
  138. package/dist-kit/types/components/layout/Grid.d.ts.map +1 -0
  139. package/dist-kit/types/components/layout/Inline.d.ts +20 -0
  140. package/dist-kit/types/components/layout/Inline.d.ts.map +1 -0
  141. package/dist-kit/types/components/layout/SidebarLayout.d.ts +30 -0
  142. package/dist-kit/types/components/layout/SidebarLayout.d.ts.map +1 -0
  143. package/dist-kit/types/components/layout/Stack.d.ts +19 -0
  144. package/dist-kit/types/components/layout/Stack.d.ts.map +1 -0
  145. package/dist-kit/types/components/layout/Switcher.d.ts +28 -0
  146. package/dist-kit/types/components/layout/Switcher.d.ts.map +1 -0
  147. package/dist-kit/types/components/layout/index.d.ts +12 -0
  148. package/dist-kit/types/components/layout/index.d.ts.map +1 -0
  149. package/dist-kit/types/components/map/GeoMapCanvas.d.ts +37 -0
  150. package/dist-kit/types/components/map/GeoMapCanvas.d.ts.map +1 -0
  151. package/dist-kit/types/components/map/GeoMapLegend.d.ts +14 -0
  152. package/dist-kit/types/components/map/GeoMapLegend.d.ts.map +1 -0
  153. package/dist-kit/types/components/map/GeoMapSurfaceActions.d.ts +9 -0
  154. package/dist-kit/types/components/map/GeoMapSurfaceActions.d.ts.map +1 -0
  155. package/dist-kit/types/components/map/mapFocus.d.ts +27 -0
  156. package/dist-kit/types/components/map/mapFocus.d.ts.map +1 -0
  157. package/dist-kit/types/components/map/mapInteractions.d.ts +8 -0
  158. package/dist-kit/types/components/map/mapInteractions.d.ts.map +1 -0
  159. package/dist-kit/types/components/map/mapPolicy.d.ts +29 -0
  160. package/dist-kit/types/components/map/mapPolicy.d.ts.map +1 -0
  161. package/dist-kit/types/components/map/mapRuntime.d.ts +9 -0
  162. package/dist-kit/types/components/map/mapRuntime.d.ts.map +1 -0
  163. package/dist-kit/types/components/map/mapScene.d.ts +14 -0
  164. package/dist-kit/types/components/map/mapScene.d.ts.map +1 -0
  165. package/dist-kit/types/components/map/mapSync.d.ts +43 -0
  166. package/dist-kit/types/components/map/mapSync.d.ts.map +1 -0
  167. package/dist-kit/types/components/map/types.d.ts +105 -0
  168. package/dist-kit/types/components/map/types.d.ts.map +1 -0
  169. package/dist-kit/types/components/surfaceStyles.d.ts +200 -0
  170. package/dist-kit/types/components/surfaceStyles.d.ts.map +1 -0
  171. package/dist-kit/types/components/table/DataTableEmptyState.d.ts +9 -0
  172. package/dist-kit/types/components/table/DataTableEmptyState.d.ts.map +1 -0
  173. package/dist-kit/types/components/table/DataTableGrid.d.ts +21 -0
  174. package/dist-kit/types/components/table/DataTableGrid.d.ts.map +1 -0
  175. package/dist-kit/types/components/table/DataTableMobileList.d.ts +30 -0
  176. package/dist-kit/types/components/table/DataTableMobileList.d.ts.map +1 -0
  177. package/dist-kit/types/components/table/DataTablePagination.d.ts +7 -0
  178. package/dist-kit/types/components/table/DataTablePagination.d.ts.map +1 -0
  179. package/dist-kit/types/components/table/types.d.ts +24 -0
  180. package/dist-kit/types/components/table/types.d.ts.map +1 -0
  181. package/dist-kit/types/design-system/api.d.ts +2 -0
  182. package/dist-kit/types/design-system/api.d.ts.map +1 -0
  183. package/dist-kit/types/design-system/charts.d.ts +7 -0
  184. package/dist-kit/types/design-system/charts.d.ts.map +1 -0
  185. package/dist-kit/types/design-system/components.d.ts +112 -0
  186. package/dist-kit/types/design-system/components.d.ts.map +1 -0
  187. package/dist-kit/types/design-system/kit.d.ts +5 -0
  188. package/dist-kit/types/design-system/kit.d.ts.map +1 -0
  189. package/dist-kit/types/design-system/map.d.ts +8 -0
  190. package/dist-kit/types/design-system/map.d.ts.map +1 -0
  191. package/dist-kit/types/design-system/providers.d.ts +5 -0
  192. package/dist-kit/types/design-system/providers.d.ts.map +1 -0
  193. package/dist-kit/types/design-system/systems/container.d.ts +22 -0
  194. package/dist-kit/types/design-system/systems/container.d.ts.map +1 -0
  195. package/dist-kit/types/design-system/systems/elevation.d.ts +22 -0
  196. package/dist-kit/types/design-system/systems/elevation.d.ts.map +1 -0
  197. package/dist-kit/types/design-system/systems/format.d.ts +39 -0
  198. package/dist-kit/types/design-system/systems/format.d.ts.map +1 -0
  199. package/dist-kit/types/design-system/systems/index.d.ts +11 -0
  200. package/dist-kit/types/design-system/systems/index.d.ts.map +1 -0
  201. package/dist-kit/types/design-system/systems/motion.d.ts +38 -0
  202. package/dist-kit/types/design-system/systems/motion.d.ts.map +1 -0
  203. package/dist-kit/types/design-system/systems/space.d.ts +42 -0
  204. package/dist-kit/types/design-system/systems/space.d.ts.map +1 -0
  205. package/dist-kit/types/design-system/systems/statusTaxonomy.d.ts +34 -0
  206. package/dist-kit/types/design-system/systems/statusTaxonomy.d.ts.map +1 -0
  207. package/dist-kit/types/design-system/tokens.d.ts +2 -0
  208. package/dist-kit/types/design-system/tokens.d.ts.map +1 -0
  209. package/dist-kit/types/i18n/messages.d.ts +14 -0
  210. package/dist-kit/types/i18n/messages.d.ts.map +1 -0
  211. package/dist-kit/types/lib/api.d.ts +14 -0
  212. package/dist-kit/types/lib/api.d.ts.map +1 -0
  213. package/dist-kit/types/lib/apiFactory.d.ts +55 -0
  214. package/dist-kit/types/lib/apiFactory.d.ts.map +1 -0
  215. package/dist-kit/types/lib/geojson.d.ts +12 -0
  216. package/dist-kit/types/lib/geojson.d.ts.map +1 -0
  217. package/dist-kit/types/lib/mapStyle.d.ts +14 -0
  218. package/dist-kit/types/lib/mapStyle.d.ts.map +1 -0
  219. package/dist-kit/types/lib/mergeSx.d.ts +12 -0
  220. package/dist-kit/types/lib/mergeSx.d.ts.map +1 -0
  221. package/dist-kit/types-DD6Pi727.js +10 -0
  222. package/package.json +171 -0
  223. package/src/styles/global.css +194 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 City of Baltimore
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # Bromo Design System
2
+
3
+ React components, design tokens, and an app shell for City of Baltimore civic
4
+ applications — one visual and interaction language across the city's digital
5
+ services, built on [MUI](https://mui.com) 7 and React 19.
6
+
7
+ **Component catalog / Storybook:** https://bromo.fly.dev
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install @city-of-baltimore/bromo
13
+ ```
14
+
15
+ No registry configuration or tokens required.
16
+
17
+ ## Quick start
18
+
19
+ Wrap your app once, import the stylesheet once, and use the shell:
20
+
21
+ ```tsx
22
+ // main.tsx
23
+ import "@city-of-baltimore/bromo/styles.css"; // loads the city fonts
24
+ import { BrowserRouter } from "react-router-dom";
25
+ import { BromoProvider } from "@city-of-baltimore/bromo";
26
+
27
+ createRoot(document.getElementById("root")!).render(
28
+ <BrowserRouter>
29
+ <BromoProvider config={{ productTitle: "311 Explorer" }}>
30
+ <App />
31
+ </BromoProvider>
32
+ </BrowserRouter>,
33
+ );
34
+ ```
35
+
36
+ ```tsx
37
+ import { AppShell, SectionSurface, Button } from "@city-of-baltimore/bromo";
38
+
39
+ export function HomePage() {
40
+ return (
41
+ <AppShell eyebrow="Operations" title="Service requests" subtitle="Citywide view">
42
+ <SectionSurface>
43
+ <Button>Export</Button>
44
+ </SectionSurface>
45
+ </AppShell>
46
+ );
47
+ }
48
+ ```
49
+
50
+ `BromoProvider` wires the theme, `CssBaseline`, light/dark color mode,
51
+ and the `--bromo-*` design tokens — don't add your own `ThemeProvider` around it.
52
+ A `react-router` router is required (shell components render router links).
53
+
54
+ ## Entry points
55
+
56
+ Heavy optional dependencies never ride along with a button: chart, map, and
57
+ API client components live on their own subpaths, each behind an optional
58
+ peer dependency.
59
+
60
+ | Import | Contents | Optional peer |
61
+ | --- | --- | --- |
62
+ | `@city-of-baltimore/bromo` | components, providers, theme/color-mode helpers, systems token layer | — |
63
+ | `…/tokens` | theme + color-mode helpers only | — |
64
+ | `…/charts` | `AppChart` (+ `AppTable` re-export) | `@mui/x-charts` |
65
+ | `…/map` | `AppMap`, `MapFrame`, `MapLegend`, `MapA11ySummary` | `maplibre-gl` |
66
+ | `…/api` | typed BFF/auth client factory | `openapi-fetch` |
67
+ | `…/styles.css` | kit stylesheet (loads the city font families) | — |
68
+
69
+ Required peers: `react` / `react-dom` 19, `react-router-dom` 7, `@mui/material`
70
+ (+ icons/system/utils) 7, `@emotion/react` / `@emotion/styled` 11. Exact ranges
71
+ live in this package's `peerDependencies`.
72
+
73
+ ## Versioning
74
+
75
+ Semantic versioning over a frozen public API: every export of the root entry,
76
+ the subpath layout, and the `--bromo-*` CSS custom property names. Deprecations
77
+ ship at least one minor release before removal, with migration notes in the
78
+ [CHANGELOG](https://github.com/city-of-baltimore/bromo/blob/main/CHANGELOG.md).
79
+
80
+ ## Accessibility
81
+
82
+ Components target WCAG 2.1 AA: two-tone focus indicators, AA-checked status
83
+ inks in both color modes, selection states that don't rely on color alone, and
84
+ an axe audit over the component showcase in CI. A formal conformance statement
85
+ and per-component ledger are in progress.
86
+
87
+ ## License
88
+
89
+ [MIT](./LICENSE) — the same license as the GOV.UK Design System. This design
90
+ system is public infrastructure: any government, civic organization, or vendor
91
+ is welcome to use, adapt, and build on it — that's the point. The "City of
92
+ Baltimore" name, seal, and brand assets identify official city services and
93
+ remain protected by trademark law; don't use them to imply endorsement.
94
+
95
+ ---
96
+
97
+ Built by the City of Baltimore.
@@ -0,0 +1,295 @@
1
+ import { l as e, m as t } from "./SectionHeader-D2kyZqwI.js";
2
+ import { n, r } from "./themeTokens-CAvxuaP0.js";
3
+ import { Alert as i, AlertTitle as a, Box as o, CssBaseline as s, GlobalStyles as c, ThemeProvider as l, Typography as u } from "@mui/material";
4
+ import { createContext as d, useContext as f, useEffect as p, useMemo as m, useState as h, useSyncExternalStore as g } from "react";
5
+ import { jsx as _, jsxs as v } from "react/jsx-runtime";
6
+ import { alpha as y, createTheme as b, responsiveFontSizes as x, useTheme as S } from "@mui/material/styles";
7
+ //#region src/app/assertFontsLoaded.ts
8
+ var C = !1;
9
+ function w() {
10
+ if (typeof document > "u" || C) return;
11
+ let e = window.location.hostname;
12
+ if (!(e === "localhost" || e === "127.0.0.1" || e.endsWith(".local"))) return;
13
+ let t = () => {
14
+ let e = ["proxima-nova", "Nunito Sans"].filter((e) => !document.fonts.check(`16px "${e}"`));
15
+ e.length !== 0 && (C = !0, console.warn(`[bromo] Theme font(s) not loaded: ${e.join(", ")}. Import "@city-of-baltimore/bromo/styles.css" once near your app root, otherwise headings fall back to a system sans. See docs/toolkit_troubleshooting.md §1.`));
16
+ };
17
+ document.fonts.status === "loaded" ? t() : document.fonts.ready.then(t);
18
+ }
19
+ //#endregion
20
+ //#region src/app/theme.ts
21
+ var T = {
22
+ control: 8,
23
+ inset: 6,
24
+ surface: 8,
25
+ overlay: 10,
26
+ pill: 999
27
+ }, E = "\"Nunito Sans\", \"Segoe UI\", system-ui, sans-serif", D = "\"proxima-nova\", \"Segoe UI\", system-ui, sans-serif";
28
+ function O(e, t) {
29
+ let n = r(e), i = e === "dark", a = b({
30
+ palette: {
31
+ mode: e,
32
+ primary: {
33
+ main: n.palette.primary,
34
+ dark: n.palette.primaryDark,
35
+ contrastText: i ? n.palette.primaryDark : "#ffffff"
36
+ },
37
+ secondary: {
38
+ main: n.palette.secondary,
39
+ contrastText: n.palette.primaryDark
40
+ },
41
+ background: {
42
+ default: n.palette.backgroundDefault,
43
+ paper: n.palette.backgroundPaper
44
+ },
45
+ text: {
46
+ primary: n.palette.textPrimary,
47
+ secondary: n.palette.textSecondary
48
+ },
49
+ divider: n.palette.divider,
50
+ warning: {
51
+ main: n.palette.warning,
52
+ light: n.palette.accentSoft,
53
+ dark: "#d79f18",
54
+ contrastText: n.palette.primaryDark
55
+ },
56
+ error: { main: n.palette.error },
57
+ success: { main: n.palette.success },
58
+ info: { main: n.palette.info }
59
+ },
60
+ shape: { borderRadius: T.surface },
61
+ spacing: 8,
62
+ typography: {
63
+ fontFamily: E,
64
+ h1: {
65
+ fontFamily: D,
66
+ fontWeight: 800,
67
+ letterSpacing: 0
68
+ },
69
+ h2: {
70
+ fontFamily: D,
71
+ fontWeight: 700,
72
+ letterSpacing: 0
73
+ },
74
+ h3: {
75
+ fontFamily: D,
76
+ fontWeight: 700,
77
+ letterSpacing: 0
78
+ },
79
+ h4: {
80
+ fontFamily: D,
81
+ fontWeight: 700,
82
+ letterSpacing: 0
83
+ },
84
+ h5: {
85
+ fontFamily: D,
86
+ fontWeight: 700
87
+ },
88
+ h6: {
89
+ fontFamily: D,
90
+ fontWeight: 700
91
+ },
92
+ body1: {
93
+ fontSize: "1rem",
94
+ lineHeight: 1.65
95
+ },
96
+ body2: {
97
+ fontSize: "0.95rem",
98
+ lineHeight: 1.6
99
+ },
100
+ caption: {
101
+ fontSize: "0.75rem",
102
+ lineHeight: 1.4
103
+ },
104
+ subtitle2: {
105
+ textTransform: "uppercase",
106
+ letterSpacing: "0.18em",
107
+ fontWeight: 700,
108
+ fontSize: "0.72rem"
109
+ },
110
+ button: {
111
+ fontWeight: 700,
112
+ textTransform: "none"
113
+ }
114
+ },
115
+ components: {
116
+ MuiCssBaseline: { styleOverrides: { body: {
117
+ backgroundColor: n.palette.backgroundDefault,
118
+ color: n.palette.textPrimary
119
+ } } },
120
+ MuiButton: {
121
+ styleOverrides: {
122
+ root: {
123
+ borderRadius: T.control,
124
+ paddingInline: 18
125
+ },
126
+ outlined: {
127
+ borderColor: y(n.palette.primary, i ? .32 : .16),
128
+ backgroundColor: i ? y(n.palette.backgroundPaper, .56) : y("#ffffff", .84)
129
+ }
130
+ },
131
+ variants: [{
132
+ props: {
133
+ variant: "contained",
134
+ color: "primary"
135
+ },
136
+ style: {
137
+ boxShadow: "none",
138
+ "&:hover": { boxShadow: "none" }
139
+ }
140
+ }]
141
+ },
142
+ MuiChip: { styleOverrides: { root: {
143
+ borderRadius: T.control,
144
+ fontWeight: 700
145
+ } } },
146
+ MuiPaper: { styleOverrides: { root: {
147
+ backgroundImage: "none",
148
+ border: `1px solid ${n.palette.divider}`,
149
+ boxShadow: i ? "0 18px 40px rgba(4, 8, 18, 0.38)" : "0 12px 30px rgba(25, 14, 33, 0.08)"
150
+ } } },
151
+ MuiCard: { styleOverrides: { root: { borderRadius: T.surface } } },
152
+ MuiOutlinedInput: { styleOverrides: { root: {
153
+ borderRadius: T.control,
154
+ backgroundColor: y(n.palette.backgroundPaper, i ? .88 : .75)
155
+ } } },
156
+ MuiInputLabel: { styleOverrides: { root: {
157
+ color: n.palette.textSecondary,
158
+ "&.Mui-disabled": { color: n.palette.textSecondary },
159
+ "&.Mui-focused": { color: n.palette.primary }
160
+ } } },
161
+ MuiMenu: { styleOverrides: { paper: {
162
+ borderRadius: T.overlay,
163
+ backgroundColor: y(n.palette.surfaceElevated, i ? .96 : .94)
164
+ } } },
165
+ MuiDrawer: { styleOverrides: { paper: { backgroundImage: "none" } } },
166
+ MuiTableCell: { styleOverrides: {
167
+ head: {
168
+ backgroundColor: y(n.palette.surfaceAlt, i ? .96 : .88),
169
+ borderBottom: `1px solid ${n.palette.dividerStrong}`,
170
+ fontWeight: 700
171
+ },
172
+ body: { borderBottom: `1px solid ${y(n.palette.divider, .9)}` }
173
+ } }
174
+ },
175
+ toolkitTokens: {
176
+ focusRing: n.cssVariables["--bromo-focus-ring"],
177
+ radii: T,
178
+ chart: n.chart
179
+ }
180
+ });
181
+ return x(t ? b(a, t) : a);
182
+ }
183
+ //#endregion
184
+ //#region src/app/colorModeDefaults.ts
185
+ var k = "system", A = /* @__PURE__ */ new Set();
186
+ function j() {
187
+ if (typeof window > "u") return null;
188
+ let e = window.localStorage.getItem("bromo-color-mode");
189
+ return e === "light" || e === "dark" || e === "system" ? e : null;
190
+ }
191
+ function M() {
192
+ return j() ?? k;
193
+ }
194
+ function N(e) {
195
+ return A.add(e), () => {
196
+ A.delete(e);
197
+ };
198
+ }
199
+ //#endregion
200
+ //#region src/app/colorMode.tsx
201
+ var P = "bromo-color-mode", F = d(null), I = "(prefers-color-scheme: dark)";
202
+ function L() {
203
+ return typeof window > "u" ? !1 : window.matchMedia(I).matches;
204
+ }
205
+ function R(e) {
206
+ if (typeof window > "u") return () => {};
207
+ let t = window.matchMedia(I);
208
+ return t.addEventListener("change", e), () => t.removeEventListener("change", e);
209
+ }
210
+ function z({ children: e, themeOverrides: t }) {
211
+ let [r, i] = h(() => M()), [a, o] = h(() => j() !== null), u = g(R, L, () => !1), d = r === "system" ? u ? "dark" : "light" : r, f = m(() => O(d, t), [d, t]);
212
+ return p(() => {
213
+ w();
214
+ }, []), p(() => N((e) => {
215
+ a || i(e);
216
+ }), [a]), p(() => {
217
+ typeof window > "u" || (a ? window.localStorage.setItem(P, r) : window.localStorage.removeItem(P), n(d));
218
+ }, [
219
+ a,
220
+ r,
221
+ d
222
+ ]), /* @__PURE__ */ _(F.Provider, {
223
+ value: {
224
+ preference: r,
225
+ resolvedMode: d,
226
+ setPreference: (e) => {
227
+ o(!0), i(e);
228
+ }
229
+ },
230
+ children: /* @__PURE__ */ v(l, {
231
+ theme: f,
232
+ children: [
233
+ /* @__PURE__ */ _(s, {}),
234
+ /* @__PURE__ */ _(c, { styles: {
235
+ "html, body, #root": { minHeight: "100%" },
236
+ "*": { boxSizing: "border-box" },
237
+ "[data-color-scheme='dark']": { colorScheme: "dark" },
238
+ "[data-color-scheme='light']": { colorScheme: "light" },
239
+ "a:focus-visible, button:focus-visible, [role='button']:focus-visible": {
240
+ outline: "var(--bromo-focus-width) solid var(--bromo-focus-ring)",
241
+ outlineOffset: "var(--bromo-focus-offset)",
242
+ boxShadow: "0 0 0 var(--bromo-focus-width) var(--bromo-focus-ring-inner)"
243
+ }
244
+ } }),
245
+ e
246
+ ]
247
+ })
248
+ });
249
+ }
250
+ function B() {
251
+ let e = f(F);
252
+ if (!e) throw Error("useColorMode must be used inside ColorModeProvider.");
253
+ return e;
254
+ }
255
+ //#endregion
256
+ //#region src/components/Alert.tsx
257
+ function V({ tone: n = "info", title: r, message: s, actionLabel: c, onAction: l, requestId: d, testId: f = "status-banner" }) {
258
+ let p = S(), m = n === "danger" || n === "error" ? "error" : n;
259
+ return /* @__PURE__ */ v(i, {
260
+ action: c && l ? /* @__PURE__ */ _(t, {
261
+ color: "inherit",
262
+ emphasis: "subtle",
263
+ size: "small",
264
+ onClick: l,
265
+ children: c
266
+ }) : null,
267
+ "data-testid": f,
268
+ role: m === "error" ? "alert" : "status",
269
+ severity: m,
270
+ sx: e(p, m),
271
+ children: [
272
+ /* @__PURE__ */ _(a, { children: r }),
273
+ /* @__PURE__ */ _(o, {
274
+ "data-testid": `${f}-message`,
275
+ children: s
276
+ }),
277
+ d ? /* @__PURE__ */ v(u, {
278
+ "data-testid": `${f}-request-id`,
279
+ variant: "body2",
280
+ sx: { color: "text.secondary" },
281
+ children: [
282
+ "Request ID:",
283
+ " ",
284
+ /* @__PURE__ */ _(o, {
285
+ component: "span",
286
+ sx: { fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace" },
287
+ children: d
288
+ })
289
+ ]
290
+ }) : null
291
+ ]
292
+ });
293
+ }
294
+ //#endregion
295
+ export { D as a, E as i, z as n, O as o, B as r, V as t };