2021-11-01 16:42:52 -06:00
|
|
|
{
|
2021-11-02 10:26:07 -06:00
|
|
|
"name": "wrolpi-app",
|
2021-11-01 16:42:52 -06:00
|
|
|
"version": "0.1.0",
|
|
|
|
|
"private": true,
|
|
|
|
|
"dependencies": {
|
2026-03-29 18:58:31 -06:00
|
|
|
"@acalcutt/maplibre-contour-pmtiles": "^0.1.2",
|
2026-07-01 10:04:18 +00:00
|
|
|
"@artsy/fresnel": "^8.5.0",
|
2024-11-02 15:14:02 -06:00
|
|
|
"@cypress/react18": "^2.0.1",
|
ui: token-driven component library on Mantine
Adds src/components/ui: buttons, messages, labels, progress, status, tables,
form controls, panels, cards, statistics, modals, tooltips, tabs, and icons.
Everything resolves its colors through theme tokens, so no component branches
on the current theme, and Semantic UI keeps rendering the app meanwhile.
Mantine is bridged rather than restyled: its own CSS variables are pointed at
our tokens. Four details were not obvious, and each caused a visible defect
in night mode before being fixed:
- Structural colors must go in the resolver's light/dark blocks. Mantine
emits its values under [data-mantine-color-scheme], which outranks the
:root block that `variables` becomes, so its grays were winning.
- The dark and gray palettes are mapped shade by shade to tokens. Mantine
reads them directly for table borders, zebra stripes and input chrome;
they can be neither flattened nor left alone.
- Mantine writes --button-* as inline styles, which no stylesheet can
outrank, so the dashed danger treatment sets real properties instead.
- Switch colors are written onto inner elements, so they need scoped CSS
rather than a variable on the root. Adds a --knob token for control
handles, because Mantine's default thumb follows theme.white, which is
near-black in the dark-based themes.
An audit of every painted pixel in the /theme-sample gallery now finds no
non-red channel in night mode.
Icons come from @tabler/icons-react with the 102 Semantic names the app uses
mapped to components; they stroke with currentColor, so they follow the theme
without any rule of their own. Toasts keep the react-semantic-toasts-2
signature so those call sites migrate by changing an import.
TypeScript 5 is required: Mantine's declarations use `const` type parameters,
which 4.9 cannot parse (Mantine 7 is the same, so downgrading is no escape).
That needs two npm overrides to keep clean installs working, both verified
against a Docker build: react-scripts declares peerOptional typescript ^3||^4,
and fork-ts-checker 6.5.2 assigns typescript.performance.mark, which TS 5
made getter-only - crashing the dev server's type checker on every rebuild.
semantic-baseline.test.js ratchets the removal: it fails if a file not already
listed imports Semantic UI. An ESLint rule would have printed 75 warnings per
rebuild, and CI unsets CI= for its build step, so it would guard nothing there.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 19:22:03 -06:00
|
|
|
"@mantine/core": "^8.3.18",
|
|
|
|
|
"@mantine/hooks": "^8.3.18",
|
|
|
|
|
"@mantine/notifications": "^8.3.18",
|
2026-10-03 10:08:32 -06:00
|
|
|
"@tabler/icons-react": "^3.48.0",
|
2023-01-07 18:53:22 -07:00
|
|
|
"@testing-library/react": "^13.4.0",
|
2026-10-03 10:08:32 -06:00
|
|
|
"@testing-library/user-event": "^14.6.7",
|
2026-09-03 16:51:13 -06:00
|
|
|
"cypress": "^15.21.1",
|
Preview markdown files formatted, with a raw toggle (#780)
* Preview markdown files formatted, with a raw toggle
Markdown files are typed text/markdown (libmagic reports them as text/plain, or
as a programming language when they hold code) and keep the text indexer, so
they stay deep-searchable. Existing files switch type on their next refresh.
The file preview renders markdown with markdown-it into the page, so it follows
the theme tokens and the night media filter. A Formatted/Raw toggle shows the
source instead, and the choice is remembered. Relative links and images
resolve against the file's directory; URLs that climb out of /media/ are
dropped. Raw HTML in a file is escaped rather than parsed, and the output is
also sanitized with DOMPurify.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Do not load images from other sites in the markdown preview
An image from another site (http:, https:, or protocol-relative //) loaded as
soon as the preview opened, telling that site who was reading the file and
when. Such an image now becomes a link labeled with its alt text, so the
reader chooses whether to follow it. Inside a link (a README badge) it becomes
the outer link's text, since links cannot nest. Media and embedded data:
images still load.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 13:26:37 -06:00
|
|
|
"dompurify": "^3.4.16",
|
2026-10-03 10:08:32 -06:00
|
|
|
"esptool-js": "^0.7.0",
|
2026-04-04 19:49:36 +00:00
|
|
|
"lodash": "^4.18.1",
|
2026-06-03 18:05:08 -06:00
|
|
|
"maplibre-gl": "^5.24.0",
|
Preview markdown files formatted, with a raw toggle (#780)
* Preview markdown files formatted, with a raw toggle
Markdown files are typed text/markdown (libmagic reports them as text/plain, or
as a programming language when they hold code) and keep the text indexer, so
they stay deep-searchable. Existing files switch type on their next refresh.
The file preview renders markdown with markdown-it into the page, so it follows
the theme tokens and the night media filter. A Formatted/Raw toggle shows the
source instead, and the choice is remembered. Relative links and images
resolve against the file's directory; URLs that climb out of /media/ are
dropped. Raw HTML in a file is escaped rather than parsed, and the output is
also sanitized with DOMPurify.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Do not load images from other sites in the markdown preview
An image from another site (http:, https:, or protocol-relative //) loaded as
soon as the preview opened, telling that site who was reading the file and
when. Such an image now becomes a link labeled with its alt text, so the
reader chooses whether to follow it. Inside a link (a README badge) it becomes
the outer link's text, since links cannot nest. Media and embedded data:
images still load.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 13:26:37 -06:00
|
|
|
"markdown-it": "^15.0.2",
|
2026-04-10 22:51:14 +00:00
|
|
|
"mathjs": "^15.2.0",
|
2026-09-03 16:51:13 -06:00
|
|
|
"pmtiles": "^4.5.0",
|
2026-03-29 18:58:31 -06:00
|
|
|
"protomaps-themes-base": "^4.5.0",
|
2026-09-03 16:34:34 -06:00
|
|
|
"query-string": "^9.5.1",
|
2026-10-03 10:33:11 -06:00
|
|
|
"react": "^18.3.1",
|
2026-10-03 10:08:32 -06:00
|
|
|
"react-colorful": "^5.8.1",
|
2026-10-03 10:33:11 -06:00
|
|
|
"react-dom": "^18.3.1",
|
|
|
|
|
"react-dropzone": "^14.4.1",
|
2026-07-14 20:25:34 -06:00
|
|
|
"react-hotkeys-hook": "^5.3.3",
|
|
|
|
|
"react-qr-code": "^2.2.0",
|
2026-10-03 10:44:22 -06:00
|
|
|
"react-router": "^7.18.4",
|
2023-01-31 18:08:07 -07:00
|
|
|
"react-scripts": "5.0.1",
|
2024-05-08 18:37:46 -06:00
|
|
|
"react-stl-viewer": "^2.5.0",
|
2026-10-03 10:08:32 -06:00
|
|
|
"three": "^0.186",
|
2026-10-03 10:33:23 -06:00
|
|
|
"web-vitals": "^6.2.2"
|
2021-11-01 16:42:52 -06:00
|
|
|
},
|
|
|
|
|
"scripts": {
|
|
|
|
|
"start": "react-scripts start",
|
2025-10-29 22:16:33 -06:00
|
|
|
"build": "BROWSERSLIST_IGNORE_OLD_DATA=true react-scripts build",
|
2021-11-01 16:42:52 -06:00
|
|
|
"test": "react-scripts test",
|
2025-10-29 22:16:33 -06:00
|
|
|
"eject": "react-scripts eject",
|
|
|
|
|
"cy:run": "cypress run",
|
|
|
|
|
"cy:open": "cypress open"
|
2021-11-01 16:42:52 -06:00
|
|
|
},
|
|
|
|
|
"eslintConfig": {
|
2023-01-31 18:08:07 -07:00
|
|
|
"extends": [
|
2024-11-02 15:14:02 -06:00
|
|
|
"react-app"
|
2023-01-31 18:08:07 -07:00
|
|
|
]
|
2021-11-01 16:42:52 -06:00
|
|
|
},
|
|
|
|
|
"browserslist": {
|
|
|
|
|
"production": [
|
|
|
|
|
">0.2%",
|
|
|
|
|
"not dead",
|
|
|
|
|
"not op_mini all"
|
|
|
|
|
],
|
|
|
|
|
"development": [
|
|
|
|
|
"last 1 chrome version",
|
|
|
|
|
"last 1 firefox version",
|
|
|
|
|
"last 1 safari version"
|
|
|
|
|
]
|
2025-10-29 22:16:33 -06:00
|
|
|
},
|
|
|
|
|
"devDependencies": {
|
2026-10-03 10:08:32 -06:00
|
|
|
"@testing-library/dom": "^10.4.2",
|
2026-09-03 16:51:13 -06:00
|
|
|
"@testing-library/jest-dom": "^7.0.1",
|
|
|
|
|
"@types/lodash": "^4.17.25",
|
2026-10-03 10:08:32 -06:00
|
|
|
"@types/node": "^26.6.3",
|
2025-12-07 11:32:07 -07:00
|
|
|
"@types/react": "^18.3.17",
|
|
|
|
|
"@types/react-dom": "^18.3.5",
|
test: the component suite has not run since cypress 15, on any machine (#661)
* test: the component suite has not run since cypress 15, on any machine
Six component spec files -- 334 tests, including the 4,300-line layout suite -- could not
start. Cypress exited before printing anything, and under its default Electron browser it
did not even do that: it hung at 0% CPU until killed. Chrome prints the error in seconds,
which is the only reason this was findable.
Three things broke, all of them from the 13.17.0 -> 15.20.0 bump.
`baseUrl: "src"`. Cypress 15 loads its config with tsx, and tsx honours tsconfig path
resolution. Cypress requires Node's core `events` module; with that baseUrl the bare
specifier resolves against `src`, and on a case-insensitive filesystem it matches
`src/Events.js`. That file imports the app, so the whole component tree was required in
Node: JSX in `.js` files, which esbuild will not parse.
This is why CI stayed green while every local run died. Linux is case-sensitive, `events`
never matched `Events.js`, and it resolved to the built-in. The baseUrl buys nothing --
there is not one absolute import in the codebase -- so it goes.
`framework: "create-react-app"`. Cypress 14 removed that dev server; the handler is in the
13.17.0 binary and absent from 15. The webpack config is handed over explicitly now, taken
from react-scripts so components compile exactly as `npm start` compiles them. Two things
follow from that: `webpack-dev-server` 5 is a devDependency because Cypress requires 5 and
react-scripts pins 4 (npm nests react-scripts' copy, and the production build is unchanged),
and babel-loader is widened to `cypress/`, which react-scripts does not compile -- the
support file is JSX and was reaching babel with no preset.
The suite ran nowhere. `cypress run` means e2e -- its specPattern is `cypress/e2e/**` --
and these specs sit beside the components in `src`, so no job has ever executed them. A
`cypress-component-tests` job runs them now; without it this breaks again in silence.
One test fails the moment the suite can run, and it is mine, from #660: it asserted the URL
column is the widest in the row. It is not, and never was -- at that width the fixed columns
take ~307px of 400, leaving the URL ~93 against Control's 146. It shipped green because
nothing could run it. It asserts a usable remainder instead.
334 component tests pass, 69 suites / 1214 jest tests pass, `npm run build` is clean.
* review: an assertion with a floor, and comments that told the story instead of the rule
The leftover-width test had a lower bound and nothing else, so it passed on any column
wide enough to have padding -- including one that had grown, which is what losing
table-layout: fixed does. It measures the leftover now: the sized columns are held to
the widths they declare, and the truncating column to exactly what they did not take.
Comments in the config, the CI job and the spec cut back to the rule a reader needs. The
version history and the measurements are in the PR.
2026-08-12 21:57:07 -06:00
|
|
|
"typescript": "^5.9.3",
|
2026-10-03 11:00:27 -06:00
|
|
|
"webpack-dev-server": "^5.2.6"
|
2025-12-26 18:59:13 -07:00
|
|
|
},
|
|
|
|
|
"jest": {
|
|
|
|
|
"transformIgnorePatterns": [
|
|
|
|
|
"node_modules/(?!(react-hotkeys-hook)/)"
|
|
|
|
|
]
|
2026-07-16 15:47:29 -06:00
|
|
|
},
|
|
|
|
|
"overrides": {
|
2026-08-08 18:51:57 -06:00
|
|
|
"@babel/code-frame": "7.29.0",
|
|
|
|
|
"@babel/compat-data": "7.20.14",
|
|
|
|
|
"@babel/core": "7.20.12",
|
|
|
|
|
"@babel/generator": "7.29.1",
|
|
|
|
|
"@babel/helper-compilation-targets": "7.20.7",
|
|
|
|
|
"@babel/helper-globals": "7.28.0",
|
|
|
|
|
"@babel/helper-module-imports": "7.28.6",
|
|
|
|
|
"@babel/helper-module-transforms": "7.28.6",
|
|
|
|
|
"@babel/helper-string-parser": "7.27.1",
|
|
|
|
|
"@babel/helper-validator-identifier": "7.28.5",
|
|
|
|
|
"@babel/helper-validator-option": "7.18.6",
|
|
|
|
|
"@babel/helpers": "7.27.0",
|
|
|
|
|
"@babel/parser": "7.29.3",
|
|
|
|
|
"@babel/template": "7.28.6",
|
|
|
|
|
"@babel/traverse": "7.29.0",
|
|
|
|
|
"@babel/types": "7.29.0",
|
ui: token-driven component library on Mantine
Adds src/components/ui: buttons, messages, labels, progress, status, tables,
form controls, panels, cards, statistics, modals, tooltips, tabs, and icons.
Everything resolves its colors through theme tokens, so no component branches
on the current theme, and Semantic UI keeps rendering the app meanwhile.
Mantine is bridged rather than restyled: its own CSS variables are pointed at
our tokens. Four details were not obvious, and each caused a visible defect
in night mode before being fixed:
- Structural colors must go in the resolver's light/dark blocks. Mantine
emits its values under [data-mantine-color-scheme], which outranks the
:root block that `variables` becomes, so its grays were winning.
- The dark and gray palettes are mapped shade by shade to tokens. Mantine
reads them directly for table borders, zebra stripes and input chrome;
they can be neither flattened nor left alone.
- Mantine writes --button-* as inline styles, which no stylesheet can
outrank, so the dashed danger treatment sets real properties instead.
- Switch colors are written onto inner elements, so they need scoped CSS
rather than a variable on the root. Adds a --knob token for control
handles, because Mantine's default thumb follows theme.white, which is
near-black in the dark-based themes.
An audit of every painted pixel in the /theme-sample gallery now finds no
non-red channel in night mode.
Icons come from @tabler/icons-react with the 102 Semantic names the app uses
mapped to components; they stroke with currentColor, so they follow the theme
without any rule of their own. Toasts keep the react-semantic-toasts-2
signature so those call sites migrate by changing an import.
TypeScript 5 is required: Mantine's declarations use `const` type parameters,
which 4.9 cannot parse (Mantine 7 is the same, so downgrading is no escape).
That needs two npm overrides to keep clean installs working, both verified
against a Docker build: react-scripts declares peerOptional typescript ^3||^4,
and fork-ts-checker 6.5.2 assigns typescript.performance.mark, which TS 5
made getter-only - crashing the dev server's type checker on every rebuild.
semantic-baseline.test.js ratchets the removal: it fails if a file not already
listed imports Semantic UI. An ESLint rule would have printed 75 warnings per
rebuild, and CI unsets CI= for its build step, so it would guard nothing there.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 19:22:03 -06:00
|
|
|
"react-scripts": {
|
|
|
|
|
"typescript": "$typescript"
|
|
|
|
|
},
|
|
|
|
|
"fork-ts-checker-webpack-plugin": "^6.5.3"
|
2021-11-01 16:42:52 -06:00
|
|
|
}
|
|
|
|
|
}
|