@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.
- package/LICENSE +21 -0
- package/README.md +97 -0
- package/dist-kit/Alert-Cw_gMn8C.js +295 -0
- package/dist-kit/EmptyState-BjrPSxNz.js +651 -0
- package/dist-kit/GeoMapCanvas-qbPIJXuA.js +716 -0
- package/dist-kit/SectionHeader-D2kyZqwI.js +379 -0
- package/dist-kit/api.js +93 -0
- package/dist-kit/charts.js +117 -0
- package/dist-kit/index.js +3223 -0
- package/dist-kit/map.js +476 -0
- package/dist-kit/themeTokens-CAvxuaP0.js +266 -0
- package/dist-kit/tokens.js +2 -0
- package/dist-kit/types/app/BromoProvider.d.ts +30 -0
- package/dist-kit/types/app/BromoProvider.d.ts.map +1 -0
- package/dist-kit/types/app/assertFontsLoaded.d.ts +2 -0
- package/dist-kit/types/app/assertFontsLoaded.d.ts.map +1 -0
- package/dist-kit/types/app/bromoConfig.d.ts +46 -0
- package/dist-kit/types/app/bromoConfig.d.ts.map +1 -0
- package/dist-kit/types/app/colorMode.d.ts +17 -0
- package/dist-kit/types/app/colorMode.d.ts.map +1 -0
- package/dist-kit/types/app/colorModeDefaults.d.ts +7 -0
- package/dist-kit/types/app/colorModeDefaults.d.ts.map +1 -0
- package/dist-kit/types/app/theme.d.ts +42 -0
- package/dist-kit/types/app/theme.d.ts.map +1 -0
- package/dist-kit/types/app/themeTokens.d.ts +36 -0
- package/dist-kit/types/app/themeTokens.d.ts.map +1 -0
- package/dist-kit/types/components/AdminLanding.d.ts +21 -0
- package/dist-kit/types/components/AdminLanding.d.ts.map +1 -0
- package/dist-kit/types/components/Alert.d.ts +14 -0
- package/dist-kit/types/components/Alert.d.ts.map +1 -0
- package/dist-kit/types/components/AppliedFilters.d.ts +16 -0
- package/dist-kit/types/components/AppliedFilters.d.ts.map +1 -0
- package/dist-kit/types/components/BarList.d.ts +27 -0
- package/dist-kit/types/components/BarList.d.ts.map +1 -0
- package/dist-kit/types/components/BrandLockup.d.ts +14 -0
- package/dist-kit/types/components/BrandLockup.d.ts.map +1 -0
- package/dist-kit/types/components/Button.d.ts +20 -0
- package/dist-kit/types/components/Button.d.ts.map +1 -0
- package/dist-kit/types/components/Chart.d.ts +25 -0
- package/dist-kit/types/components/Chart.d.ts.map +1 -0
- package/dist-kit/types/components/DataTable.d.ts +47 -0
- package/dist-kit/types/components/DataTable.d.ts.map +1 -0
- package/dist-kit/types/components/DetailsDrawer.d.ts +18 -0
- package/dist-kit/types/components/DetailsDrawer.d.ts.map +1 -0
- package/dist-kit/types/components/DiagnosticsSummary.d.ts +20 -0
- package/dist-kit/types/components/DiagnosticsSummary.d.ts.map +1 -0
- package/dist-kit/types/components/EmptyState.d.ts +21 -0
- package/dist-kit/types/components/EmptyState.d.ts.map +1 -0
- package/dist-kit/types/components/ErrorState.d.ts +25 -0
- package/dist-kit/types/components/ErrorState.d.ts.map +1 -0
- package/dist-kit/types/components/ExportButton.d.ts +13 -0
- package/dist-kit/types/components/ExportButton.d.ts.map +1 -0
- package/dist-kit/types/components/FileUpload.d.ts +42 -0
- package/dist-kit/types/components/FileUpload.d.ts.map +1 -0
- package/dist-kit/types/components/FilterDrawer.d.ts +26 -0
- package/dist-kit/types/components/FilterDrawer.d.ts.map +1 -0
- package/dist-kit/types/components/FilterPanel.d.ts +19 -0
- package/dist-kit/types/components/FilterPanel.d.ts.map +1 -0
- package/dist-kit/types/components/Filters.d.ts +54 -0
- package/dist-kit/types/components/Filters.d.ts.map +1 -0
- package/dist-kit/types/components/GeoMap.d.ts +45 -0
- package/dist-kit/types/components/GeoMap.d.ts.map +1 -0
- package/dist-kit/types/components/GovBanner.d.ts +16 -0
- package/dist-kit/types/components/GovBanner.d.ts.map +1 -0
- package/dist-kit/types/components/HeaderButton.d.ts +20 -0
- package/dist-kit/types/components/HeaderButton.d.ts.map +1 -0
- package/dist-kit/types/components/HeaderUserMenu.d.ts +35 -0
- package/dist-kit/types/components/HeaderUserMenu.d.ts.map +1 -0
- package/dist-kit/types/components/IconButton.d.ts +10 -0
- package/dist-kit/types/components/IconButton.d.ts.map +1 -0
- package/dist-kit/types/components/LanguageAccessPanel.d.ts +12 -0
- package/dist-kit/types/components/LanguageAccessPanel.d.ts.map +1 -0
- package/dist-kit/types/components/LoadingState.d.ts +19 -0
- package/dist-kit/types/components/LoadingState.d.ts.map +1 -0
- package/dist-kit/types/components/MapA11ySummary.d.ts +11 -0
- package/dist-kit/types/components/MapA11ySummary.d.ts.map +1 -0
- package/dist-kit/types/components/MapFrame.d.ts +18 -0
- package/dist-kit/types/components/MapFrame.d.ts.map +1 -0
- package/dist-kit/types/components/MapLegend.d.ts +21 -0
- package/dist-kit/types/components/MapLegend.d.ts.map +1 -0
- package/dist-kit/types/components/MetricRow.d.ts +32 -0
- package/dist-kit/types/components/MetricRow.d.ts.map +1 -0
- package/dist-kit/types/components/MetricTile.d.ts +30 -0
- package/dist-kit/types/components/MetricTile.d.ts.map +1 -0
- package/dist-kit/types/components/MissingValue.d.ts +8 -0
- package/dist-kit/types/components/MissingValue.d.ts.map +1 -0
- package/dist-kit/types/components/MultiSelect.d.ts +15 -0
- package/dist-kit/types/components/MultiSelect.d.ts.map +1 -0
- package/dist-kit/types/components/PageHeader.d.ts +27 -0
- package/dist-kit/types/components/PageHeader.d.ts.map +1 -0
- package/dist-kit/types/components/PageShell.d.ts +25 -0
- package/dist-kit/types/components/PageShell.d.ts.map +1 -0
- package/dist-kit/types/components/SectionHeader.d.ts +16 -0
- package/dist-kit/types/components/SectionHeader.d.ts.map +1 -0
- package/dist-kit/types/components/SideNav.d.ts +18 -0
- package/dist-kit/types/components/SideNav.d.ts.map +1 -0
- package/dist-kit/types/components/SignInScreen.d.ts +27 -0
- package/dist-kit/types/components/SignInScreen.d.ts.map +1 -0
- package/dist-kit/types/components/SiteFooter.d.ts +11 -0
- package/dist-kit/types/components/SiteFooter.d.ts.map +1 -0
- package/dist-kit/types/components/SiteHeader.d.ts +21 -0
- package/dist-kit/types/components/SiteHeader.d.ts.map +1 -0
- package/dist-kit/types/components/Stat.d.ts +47 -0
- package/dist-kit/types/components/Stat.d.ts.map +1 -0
- package/dist-kit/types/components/StatRow.d.ts +31 -0
- package/dist-kit/types/components/StatRow.d.ts.map +1 -0
- package/dist-kit/types/components/SummaryCard.d.ts +17 -0
- package/dist-kit/types/components/SummaryCard.d.ts.map +1 -0
- package/dist-kit/types/components/Surface.d.ts +14 -0
- package/dist-kit/types/components/Surface.d.ts.map +1 -0
- package/dist-kit/types/components/Tag.d.ts +21 -0
- package/dist-kit/types/components/Tag.d.ts.map +1 -0
- package/dist-kit/types/components/UploadQueue.d.ts +29 -0
- package/dist-kit/types/components/UploadQueue.d.ts.map +1 -0
- package/dist-kit/types/components/UserMenu.d.ts +18 -0
- package/dist-kit/types/components/UserMenu.d.ts.map +1 -0
- package/dist-kit/types/components/UserSummary.d.ts +21 -0
- package/dist-kit/types/components/UserSummary.d.ts.map +1 -0
- package/dist-kit/types/components/WorkflowActionBar.d.ts +36 -0
- package/dist-kit/types/components/WorkflowActionBar.d.ts.map +1 -0
- package/dist-kit/types/components/WorkflowErrorPanel.d.ts +16 -0
- package/dist-kit/types/components/WorkflowErrorPanel.d.ts.map +1 -0
- package/dist-kit/types/components/WorkflowStatusPanel.d.ts +21 -0
- package/dist-kit/types/components/WorkflowStatusPanel.d.ts.map +1 -0
- package/dist-kit/types/components/archetypes/Dashboard.d.ts +37 -0
- package/dist-kit/types/components/archetypes/Dashboard.d.ts.map +1 -0
- package/dist-kit/types/components/archetypes/DetailView.d.ts +43 -0
- package/dist-kit/types/components/archetypes/DetailView.d.ts.map +1 -0
- package/dist-kit/types/components/archetypes/ListView.d.ts +50 -0
- package/dist-kit/types/components/archetypes/ListView.d.ts.map +1 -0
- package/dist-kit/types/components/archetypes/PageTemplate.d.ts +35 -0
- package/dist-kit/types/components/archetypes/PageTemplate.d.ts.map +1 -0
- package/dist-kit/types/components/archetypes/index.d.ts +12 -0
- package/dist-kit/types/components/archetypes/index.d.ts.map +1 -0
- package/dist-kit/types/components/layout/Center.d.ts +19 -0
- package/dist-kit/types/components/layout/Center.d.ts.map +1 -0
- package/dist-kit/types/components/layout/Grid.d.ts +22 -0
- package/dist-kit/types/components/layout/Grid.d.ts.map +1 -0
- package/dist-kit/types/components/layout/Inline.d.ts +20 -0
- package/dist-kit/types/components/layout/Inline.d.ts.map +1 -0
- package/dist-kit/types/components/layout/SidebarLayout.d.ts +30 -0
- package/dist-kit/types/components/layout/SidebarLayout.d.ts.map +1 -0
- package/dist-kit/types/components/layout/Stack.d.ts +19 -0
- package/dist-kit/types/components/layout/Stack.d.ts.map +1 -0
- package/dist-kit/types/components/layout/Switcher.d.ts +28 -0
- package/dist-kit/types/components/layout/Switcher.d.ts.map +1 -0
- package/dist-kit/types/components/layout/index.d.ts +12 -0
- package/dist-kit/types/components/layout/index.d.ts.map +1 -0
- package/dist-kit/types/components/map/GeoMapCanvas.d.ts +37 -0
- package/dist-kit/types/components/map/GeoMapCanvas.d.ts.map +1 -0
- package/dist-kit/types/components/map/GeoMapLegend.d.ts +14 -0
- package/dist-kit/types/components/map/GeoMapLegend.d.ts.map +1 -0
- package/dist-kit/types/components/map/GeoMapSurfaceActions.d.ts +9 -0
- package/dist-kit/types/components/map/GeoMapSurfaceActions.d.ts.map +1 -0
- package/dist-kit/types/components/map/mapFocus.d.ts +27 -0
- package/dist-kit/types/components/map/mapFocus.d.ts.map +1 -0
- package/dist-kit/types/components/map/mapInteractions.d.ts +8 -0
- package/dist-kit/types/components/map/mapInteractions.d.ts.map +1 -0
- package/dist-kit/types/components/map/mapPolicy.d.ts +29 -0
- package/dist-kit/types/components/map/mapPolicy.d.ts.map +1 -0
- package/dist-kit/types/components/map/mapRuntime.d.ts +9 -0
- package/dist-kit/types/components/map/mapRuntime.d.ts.map +1 -0
- package/dist-kit/types/components/map/mapScene.d.ts +14 -0
- package/dist-kit/types/components/map/mapScene.d.ts.map +1 -0
- package/dist-kit/types/components/map/mapSync.d.ts +43 -0
- package/dist-kit/types/components/map/mapSync.d.ts.map +1 -0
- package/dist-kit/types/components/map/types.d.ts +105 -0
- package/dist-kit/types/components/map/types.d.ts.map +1 -0
- package/dist-kit/types/components/surfaceStyles.d.ts +200 -0
- package/dist-kit/types/components/surfaceStyles.d.ts.map +1 -0
- package/dist-kit/types/components/table/DataTableEmptyState.d.ts +9 -0
- package/dist-kit/types/components/table/DataTableEmptyState.d.ts.map +1 -0
- package/dist-kit/types/components/table/DataTableGrid.d.ts +21 -0
- package/dist-kit/types/components/table/DataTableGrid.d.ts.map +1 -0
- package/dist-kit/types/components/table/DataTableMobileList.d.ts +30 -0
- package/dist-kit/types/components/table/DataTableMobileList.d.ts.map +1 -0
- package/dist-kit/types/components/table/DataTablePagination.d.ts +7 -0
- package/dist-kit/types/components/table/DataTablePagination.d.ts.map +1 -0
- package/dist-kit/types/components/table/types.d.ts +24 -0
- package/dist-kit/types/components/table/types.d.ts.map +1 -0
- package/dist-kit/types/design-system/api.d.ts +2 -0
- package/dist-kit/types/design-system/api.d.ts.map +1 -0
- package/dist-kit/types/design-system/charts.d.ts +7 -0
- package/dist-kit/types/design-system/charts.d.ts.map +1 -0
- package/dist-kit/types/design-system/components.d.ts +112 -0
- package/dist-kit/types/design-system/components.d.ts.map +1 -0
- package/dist-kit/types/design-system/kit.d.ts +5 -0
- package/dist-kit/types/design-system/kit.d.ts.map +1 -0
- package/dist-kit/types/design-system/map.d.ts +8 -0
- package/dist-kit/types/design-system/map.d.ts.map +1 -0
- package/dist-kit/types/design-system/providers.d.ts +5 -0
- package/dist-kit/types/design-system/providers.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/container.d.ts +22 -0
- package/dist-kit/types/design-system/systems/container.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/elevation.d.ts +22 -0
- package/dist-kit/types/design-system/systems/elevation.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/format.d.ts +39 -0
- package/dist-kit/types/design-system/systems/format.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/index.d.ts +11 -0
- package/dist-kit/types/design-system/systems/index.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/motion.d.ts +38 -0
- package/dist-kit/types/design-system/systems/motion.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/space.d.ts +42 -0
- package/dist-kit/types/design-system/systems/space.d.ts.map +1 -0
- package/dist-kit/types/design-system/systems/statusTaxonomy.d.ts +34 -0
- package/dist-kit/types/design-system/systems/statusTaxonomy.d.ts.map +1 -0
- package/dist-kit/types/design-system/tokens.d.ts +2 -0
- package/dist-kit/types/design-system/tokens.d.ts.map +1 -0
- package/dist-kit/types/i18n/messages.d.ts +14 -0
- package/dist-kit/types/i18n/messages.d.ts.map +1 -0
- package/dist-kit/types/lib/api.d.ts +14 -0
- package/dist-kit/types/lib/api.d.ts.map +1 -0
- package/dist-kit/types/lib/apiFactory.d.ts +55 -0
- package/dist-kit/types/lib/apiFactory.d.ts.map +1 -0
- package/dist-kit/types/lib/geojson.d.ts +12 -0
- package/dist-kit/types/lib/geojson.d.ts.map +1 -0
- package/dist-kit/types/lib/mapStyle.d.ts +14 -0
- package/dist-kit/types/lib/mapStyle.d.ts.map +1 -0
- package/dist-kit/types/lib/mergeSx.d.ts +12 -0
- package/dist-kit/types/lib/mergeSx.d.ts.map +1 -0
- package/dist-kit/types-DD6Pi727.js +10 -0
- package/package.json +171 -0
- 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 };
|