react-cheminfo 0.64.1 → 0.65.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/README.md +282 -0
- package/lib/card/core/cardAddress.d.ts +70 -0
- package/lib/card/core/cardAddress.d.ts.map +1 -0
- package/lib/card/core/cardAddress.js +59 -0
- package/lib/card/core/cardAddress.js.map +1 -0
- package/lib/card/core/cardPageUrl.d.ts +49 -0
- package/lib/card/core/cardPageUrl.d.ts.map +1 -0
- package/lib/card/core/cardPageUrl.js +59 -0
- package/lib/card/core/cardPageUrl.js.map +1 -0
- package/lib/card/core/index.d.ts +7 -0
- package/lib/card/core/index.d.ts.map +1 -0
- package/lib/card/core/index.js +4 -0
- package/lib/card/core/index.js.map +1 -0
- package/lib/card/core/panelRoom.d.ts +40 -0
- package/lib/card/core/panelRoom.d.ts.map +1 -0
- package/lib/card/core/panelRoom.js +40 -0
- package/lib/card/core/panelRoom.js.map +1 -0
- package/lib/card/ui/CardDetailsButton.d.ts +38 -0
- package/lib/card/ui/CardDetailsButton.d.ts.map +1 -0
- package/lib/card/ui/CardDetailsButton.js +50 -0
- package/lib/card/ui/CardDetailsButton.js.map +1 -0
- package/lib/card/ui/CardFigure.d.ts +51 -0
- package/lib/card/ui/CardFigure.d.ts.map +1 -0
- package/lib/card/ui/CardFigure.js +27 -0
- package/lib/card/ui/CardFigure.js.map +1 -0
- package/lib/card/ui/CardFrame.d.ts +30 -0
- package/lib/card/ui/CardFrame.d.ts.map +1 -0
- package/lib/card/ui/CardFrame.js +20 -0
- package/lib/card/ui/CardFrame.js.map +1 -0
- package/lib/card/ui/CopyTableButton.d.ts +37 -0
- package/lib/card/ui/CopyTableButton.d.ts.map +1 -0
- package/lib/card/ui/CopyTableButton.js +19 -0
- package/lib/card/ui/CopyTableButton.js.map +1 -0
- package/lib/card/ui/cardTooltip.d.ts +14 -0
- package/lib/card/ui/cardTooltip.d.ts.map +1 -0
- package/lib/card/ui/cardTooltip.js +15 -0
- package/lib/card/ui/cardTooltip.js.map +1 -0
- package/lib/card/ui/embed.d.ts +15 -0
- package/lib/card/ui/embed.d.ts.map +1 -0
- package/lib/card/ui/embed.js +24 -0
- package/lib/card/ui/embed.js.map +1 -0
- package/lib/card/ui/fitCardToFrame.d.ts +31 -0
- package/lib/card/ui/fitCardToFrame.d.ts.map +1 -0
- package/lib/card/ui/fitCardToFrame.js +66 -0
- package/lib/card/ui/fitCardToFrame.js.map +1 -0
- package/lib/card/ui/holdRoomForPanels.d.ts +16 -0
- package/lib/card/ui/holdRoomForPanels.d.ts.map +1 -0
- package/lib/card/ui/holdRoomForPanels.js +76 -0
- package/lib/card/ui/holdRoomForPanels.js.map +1 -0
- package/lib/card/ui/index.d.ts +11 -0
- package/lib/card/ui/index.d.ts.map +1 -0
- package/lib/card/ui/index.js +7 -0
- package/lib/card/ui/index.js.map +1 -0
- package/lib/card/ui/openPanels.d.ts +25 -0
- package/lib/card/ui/openPanels.d.ts.map +1 -0
- package/lib/card/ui/openPanels.js +85 -0
- package/lib/card/ui/openPanels.js.map +1 -0
- package/lib/card.d.ts +13 -0
- package/lib/card.d.ts.map +1 -0
- package/lib/card.js +13 -0
- package/lib/card.js.map +1 -0
- package/lib/conformers.d.ts +1 -0
- package/lib/conformers.d.ts.map +1 -1
- package/lib/conformers.js +1 -0
- package/lib/conformers.js.map +1 -1
- package/lib/core.d.ts +4 -0
- package/lib/core.d.ts.map +1 -1
- package/lib/core.js +5 -0
- package/lib/core.js.map +1 -1
- package/lib/fetch/core/apiError.d.ts +56 -0
- package/lib/fetch/core/apiError.d.ts.map +1 -0
- package/lib/fetch/core/apiError.js +43 -0
- package/lib/fetch/core/apiError.js.map +1 -0
- package/lib/fetch/core/fetchJson.d.ts +47 -0
- package/lib/fetch/core/fetchJson.d.ts.map +1 -0
- package/lib/fetch/core/fetchJson.js +109 -0
- package/lib/fetch/core/fetchJson.js.map +1 -0
- package/lib/fetch/core/index.d.ts +5 -0
- package/lib/fetch/core/index.d.ts.map +1 -0
- package/lib/fetch/core/index.js +3 -0
- package/lib/fetch/core/index.js.map +1 -0
- package/lib/formula/core/formulaText.d.ts +46 -0
- package/lib/formula/core/formulaText.d.ts.map +1 -0
- package/lib/formula/core/formulaText.js +74 -0
- package/lib/formula/core/formulaText.js.map +1 -0
- package/lib/formula/core/index.d.ts +6 -0
- package/lib/formula/core/index.d.ts.map +1 -0
- package/lib/formula/core/index.js +4 -0
- package/lib/formula/core/index.js.map +1 -0
- package/lib/formula/core/normalizeFormula.d.ts +22 -0
- package/lib/formula/core/normalizeFormula.d.ts.map +1 -0
- package/lib/formula/core/normalizeFormula.js +46 -0
- package/lib/formula/core/normalizeFormula.js.map +1 -0
- package/lib/formula/core/readFormula.d.ts +73 -0
- package/lib/formula/core/readFormula.d.ts.map +1 -0
- package/lib/formula/core/readFormula.js +132 -0
- package/lib/formula/core/readFormula.js.map +1 -0
- package/lib/formula/ui/CopyableFormula.d.ts +31 -0
- package/lib/formula/ui/CopyableFormula.d.ts.map +1 -0
- package/lib/formula/ui/CopyableFormula.js +19 -0
- package/lib/formula/ui/CopyableFormula.js.map +1 -0
- package/lib/formula/ui/FormulaInput.d.ts +29 -0
- package/lib/formula/ui/FormulaInput.d.ts.map +1 -0
- package/lib/formula/ui/FormulaInput.js +16 -0
- package/lib/formula/ui/FormulaInput.js.map +1 -0
- package/lib/formula/ui/QuestionFormula.d.ts +14 -0
- package/lib/formula/ui/QuestionFormula.d.ts.map +1 -0
- package/lib/formula/ui/QuestionFormula.js +13 -0
- package/lib/formula/ui/QuestionFormula.js.map +1 -0
- package/lib/formula/ui/index.d.ts +7 -0
- package/lib/formula/ui/index.d.ts.map +1 -0
- package/lib/formula/ui/index.js +4 -0
- package/lib/formula/ui/index.js.map +1 -0
- package/lib/formula.d.ts +11 -0
- package/lib/formula.d.ts.map +1 -0
- package/lib/formula.js +11 -0
- package/lib/formula.js.map +1 -0
- package/lib/hooks/ui/index.d.ts +1 -0
- package/lib/hooks/ui/index.d.ts.map +1 -1
- package/lib/hooks/ui/index.js.map +1 -1
- package/lib/hooks/ui/keyTargets.d.ts +4 -2
- package/lib/hooks/ui/keyTargets.d.ts.map +1 -1
- package/lib/hooks/ui/keyTargets.js +5 -3
- package/lib/hooks/ui/keyTargets.js.map +1 -1
- package/lib/hooks/ui/useAsync.d.ts +20 -5
- package/lib/hooks/ui/useAsync.d.ts.map +1 -1
- package/lib/hooks/ui/useAsync.js +29 -14
- package/lib/hooks/ui/useAsync.js.map +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts +1 -1
- package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
- package/lib/locales/de.json +37 -0
- package/lib/locales/en.json +37 -0
- package/lib/locales/es.json +37 -0
- package/lib/locales/fr.json +37 -0
- package/lib/locales/it.json +37 -0
- package/lib/moleculesClient/core/index.d.ts +5 -0
- package/lib/moleculesClient/core/index.d.ts.map +1 -0
- package/lib/moleculesClient/core/index.js +3 -0
- package/lib/moleculesClient/core/index.js.map +1 -0
- package/lib/moleculesClient/core/moleculesClient.d.ts +12 -0
- package/lib/moleculesClient/core/moleculesClient.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesClient.js +105 -0
- package/lib/moleculesClient/core/moleculesClient.js.map +1 -0
- package/lib/moleculesClient/core/moleculesClientApi.d.ts +100 -0
- package/lib/moleculesClient/core/moleculesClientApi.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesClientApi.js +20 -0
- package/lib/moleculesClient/core/moleculesClientApi.js.map +1 -0
- package/lib/moleculesClient/core/moleculesTypes.d.ts +154 -0
- package/lib/moleculesClient/core/moleculesTypes.d.ts.map +1 -0
- package/lib/moleculesClient/core/moleculesTypes.js +2 -0
- package/lib/moleculesClient/core/moleculesTypes.js.map +1 -0
- package/lib/moleculesClient/core/requestRetry.d.ts +50 -0
- package/lib/moleculesClient/core/requestRetry.d.ts.map +1 -0
- package/lib/moleculesClient/core/requestRetry.js +108 -0
- package/lib/moleculesClient/core/requestRetry.js.map +1 -0
- package/lib/molstar/core/camera.d.ts +2 -1
- package/lib/molstar/core/camera.d.ts.map +1 -1
- package/lib/molstar/core/camera.js +3 -2
- package/lib/molstar/core/camera.js.map +1 -1
- package/lib/molstar/core/framing.d.ts +102 -0
- package/lib/molstar/core/framing.d.ts.map +1 -0
- package/lib/molstar/core/framing.js +120 -0
- package/lib/molstar/core/framing.js.map +1 -0
- package/lib/molstar/core/hover.d.ts +16 -0
- package/lib/molstar/core/hover.d.ts.map +1 -1
- package/lib/molstar/core/hover.js +14 -0
- package/lib/molstar/core/hover.js.map +1 -1
- package/lib/molstar/core/index.d.ts +4 -1
- package/lib/molstar/core/index.d.ts.map +1 -1
- package/lib/molstar/core/index.js +2 -1
- package/lib/molstar/core/index.js.map +1 -1
- package/lib/pedagogy/core/answers.d.ts +46 -0
- package/lib/pedagogy/core/answers.d.ts.map +1 -0
- package/lib/pedagogy/core/answers.js +77 -0
- package/lib/pedagogy/core/answers.js.map +1 -0
- package/lib/pedagogy/core/attempts.d.ts +86 -0
- package/lib/pedagogy/core/attempts.d.ts.map +1 -0
- package/lib/pedagogy/core/attempts.js +117 -0
- package/lib/pedagogy/core/attempts.js.map +1 -0
- package/lib/pedagogy/core/index.d.ts +8 -0
- package/lib/pedagogy/core/index.d.ts.map +1 -1
- package/lib/pedagogy/core/index.js +4 -0
- package/lib/pedagogy/core/index.js.map +1 -1
- package/lib/pedagogy/core/progressController.d.ts +64 -0
- package/lib/pedagogy/core/progressController.d.ts.map +1 -0
- package/lib/pedagogy/core/progressController.js +56 -0
- package/lib/pedagogy/core/progressController.js.map +1 -0
- package/lib/pedagogy/core/seed.d.ts +96 -0
- package/lib/pedagogy/core/seed.d.ts.map +1 -0
- package/lib/pedagogy/core/seed.js +128 -0
- package/lib/pedagogy/core/seed.js.map +1 -0
- package/lib/pedagogy/core/series.d.ts +77 -0
- package/lib/pedagogy/core/series.d.ts.map +1 -0
- package/lib/pedagogy/core/series.js +10 -0
- package/lib/pedagogy/core/series.js.map +1 -0
- package/lib/pedagogy/ui/AnswerFields.d.ts +21 -0
- package/lib/pedagogy/ui/AnswerFields.d.ts.map +1 -0
- package/lib/pedagogy/ui/AnswerFields.js +24 -0
- package/lib/pedagogy/ui/AnswerFields.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseList.d.ts +82 -0
- package/lib/pedagogy/ui/ExerciseList.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseList.js +53 -0
- package/lib/pedagogy/ui/ExerciseList.js.map +1 -0
- package/lib/pedagogy/ui/ExerciseSeries.d.ts +95 -0
- package/lib/pedagogy/ui/ExerciseSeries.d.ts.map +1 -0
- package/lib/pedagogy/ui/ExerciseSeries.js +74 -0
- package/lib/pedagogy/ui/ExerciseSeries.js.map +1 -0
- package/lib/pedagogy/ui/QuestionCard.d.ts +64 -0
- package/lib/pedagogy/ui/QuestionCard.d.ts.map +1 -0
- package/lib/pedagogy/ui/QuestionCard.js +73 -0
- package/lib/pedagogy/ui/QuestionCard.js.map +1 -0
- package/lib/pedagogy/ui/index.d.ts +10 -0
- package/lib/pedagogy/ui/index.d.ts.map +1 -1
- package/lib/pedagogy/ui/index.js +6 -0
- package/lib/pedagogy/ui/index.js.map +1 -1
- package/lib/pedagogy/ui/seriesCounts.d.ts +17 -0
- package/lib/pedagogy/ui/seriesCounts.d.ts.map +1 -0
- package/lib/pedagogy/ui/seriesCounts.js +27 -0
- package/lib/pedagogy/ui/seriesCounts.js.map +1 -0
- package/lib/pedagogy/ui/seriesParts.d.ts +55 -0
- package/lib/pedagogy/ui/seriesParts.d.ts.map +1 -0
- package/lib/pedagogy/ui/seriesParts.js +38 -0
- package/lib/pedagogy/ui/seriesParts.js.map +1 -0
- package/lib/pedagogy/ui/useAttemptRecords.d.ts +10 -0
- package/lib/pedagogy/ui/useAttemptRecords.d.ts.map +1 -0
- package/lib/pedagogy/ui/useAttemptRecords.js +11 -0
- package/lib/pedagogy/ui/useAttemptRecords.js.map +1 -0
- package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
- package/lib/periodic/ui/PeriodicTable.js +6 -3
- package/lib/periodic/ui/PeriodicTable.js.map +1 -1
- package/lib/property/core/copyableText.d.ts +14 -0
- package/lib/property/core/copyableText.d.ts.map +1 -0
- package/lib/property/core/copyableText.js +21 -0
- package/lib/property/core/copyableText.js.map +1 -0
- package/lib/property/core/index.d.ts +2 -0
- package/lib/property/core/index.d.ts.map +1 -0
- package/lib/property/core/index.js +2 -0
- package/lib/property/core/index.js.map +1 -0
- package/lib/property/ui/PropertyTable.d.ts +43 -0
- package/lib/property/ui/PropertyTable.d.ts.map +1 -0
- package/lib/property/ui/PropertyTable.js +19 -0
- package/lib/property/ui/PropertyTable.js.map +1 -0
- package/lib/property/ui/index.d.ts +3 -0
- package/lib/property/ui/index.d.ts.map +1 -0
- package/lib/property/ui/index.js +2 -0
- package/lib/property/ui/index.js.map +1 -0
- package/lib/router/core/history.d.ts +24 -3
- package/lib/router/core/history.d.ts.map +1 -1
- package/lib/router/core/history.js +55 -7
- package/lib/router/core/history.js.map +1 -1
- package/lib/router/core/index.d.ts +3 -3
- package/lib/router/core/index.d.ts.map +1 -1
- package/lib/router/core/index.js +2 -2
- package/lib/router/core/index.js.map +1 -1
- package/lib/router/core/languageRoute.d.ts +61 -0
- package/lib/router/core/languageRoute.d.ts.map +1 -0
- package/lib/router/core/languageRoute.js +96 -0
- package/lib/router/core/languageRoute.js.map +1 -0
- package/lib/router/core/siteAddresses.d.ts +23 -0
- package/lib/router/core/siteAddresses.d.ts.map +1 -1
- package/lib/router/core/siteAddresses.js +26 -0
- package/lib/router/core/siteAddresses.js.map +1 -1
- package/lib/router/core/tabRouter.d.ts +2 -108
- package/lib/router/core/tabRouter.d.ts.map +1 -1
- package/lib/router/core/tabRouter.js +38 -5
- package/lib/router/core/tabRouter.js.map +1 -1
- package/lib/router/core/tabRouterTypes.d.ts +154 -0
- package/lib/router/core/tabRouterTypes.d.ts.map +1 -0
- package/lib/router/core/tabRouterTypes.js +2 -0
- package/lib/router/core/tabRouterTypes.js.map +1 -0
- package/lib/seo/core/fitDescription.d.ts +40 -0
- package/lib/seo/core/fitDescription.d.ts.map +1 -0
- package/lib/seo/core/fitDescription.js +45 -0
- package/lib/seo/core/fitDescription.js.map +1 -0
- package/lib/seo/core/index.d.ts +7 -0
- package/lib/seo/core/index.d.ts.map +1 -1
- package/lib/seo/core/index.js +4 -0
- package/lib/seo/core/index.js.map +1 -1
- package/lib/seo/core/limits.d.ts +24 -0
- package/lib/seo/core/limits.d.ts.map +1 -0
- package/lib/seo/core/limits.js +24 -0
- package/lib/seo/core/limits.js.map +1 -0
- package/lib/seo/core/pageContent.d.ts +25 -0
- package/lib/seo/core/pageContent.d.ts.map +1 -0
- package/lib/seo/core/pageContent.js +25 -0
- package/lib/seo/core/pageContent.js.map +1 -0
- package/lib/seo/core/plainDescription.d.ts.map +1 -1
- package/lib/seo/core/plainDescription.js +3 -2
- package/lib/seo/core/plainDescription.js.map +1 -1
- package/lib/seo/core/routeProblems.d.ts.map +1 -1
- package/lib/seo/core/routeProblems.js +1 -6
- package/lib/seo/core/routeProblems.js.map +1 -1
- package/lib/seo/core/routeTable.d.ts +31 -0
- package/lib/seo/core/routeTable.d.ts.map +1 -0
- package/lib/seo/core/routeTable.js +96 -0
- package/lib/seo/core/routeTable.js.map +1 -0
- package/lib/seo/vite/index.d.ts +2 -0
- package/lib/seo/vite/index.d.ts.map +1 -1
- package/lib/seo/vite/index.js +1 -0
- package/lib/seo/vite/index.js.map +1 -1
- package/lib/seo/vite/prerender.d.ts +10 -0
- package/lib/seo/vite/prerender.d.ts.map +1 -1
- package/lib/seo/vite/prerender.js +12 -1
- package/lib/seo/vite/prerender.js.map +1 -1
- package/lib/seo/vite/routeTable.d.ts +40 -0
- package/lib/seo/vite/routeTable.d.ts.map +1 -0
- package/lib/seo/vite/routeTable.js +44 -0
- package/lib/seo/vite/routeTable.js.map +1 -0
- package/lib/server/answerAddresses.d.ts +51 -0
- package/lib/server/answerAddresses.d.ts.map +1 -0
- package/lib/server/answerAddresses.js +72 -0
- package/lib/server/answerAddresses.js.map +1 -0
- package/lib/server/cardMeta.d.ts +57 -0
- package/lib/server/cardMeta.d.ts.map +1 -0
- package/lib/server/cardMeta.js +52 -0
- package/lib/server/cardMeta.js.map +1 -0
- package/lib/server/config.d.ts +72 -0
- package/lib/server/config.d.ts.map +1 -0
- package/lib/server/config.js +67 -0
- package/lib/server/config.js.map +1 -0
- package/lib/server/envNumber.d.ts +35 -0
- package/lib/server/envNumber.d.ts.map +1 -0
- package/lib/server/envNumber.js +42 -0
- package/lib/server/envNumber.js.map +1 -0
- package/lib/server/healthRoute.d.ts +26 -0
- package/lib/server/healthRoute.d.ts.map +1 -0
- package/lib/server/healthRoute.js +22 -0
- package/lib/server/healthRoute.js.map +1 -0
- package/lib/server/listenSite.d.ts +38 -0
- package/lib/server/listenSite.d.ts.map +1 -0
- package/lib/server/listenSite.js +60 -0
- package/lib/server/listenSite.js.map +1 -0
- package/lib/server/mcpServer.d.ts +8 -0
- package/lib/server/mcpServer.d.ts.map +1 -0
- package/lib/server/mcpServer.js +11 -0
- package/lib/server/mcpServer.js.map +1 -0
- package/lib/server/repositoryVersion.d.ts +16 -0
- package/lib/server/repositoryVersion.d.ts.map +1 -0
- package/lib/server/repositoryVersion.js +33 -0
- package/lib/server/repositoryVersion.js.map +1 -0
- package/lib/server/routeOptions.d.ts +23 -0
- package/lib/server/routeOptions.d.ts.map +1 -0
- package/lib/server/routeOptions.js +20 -0
- package/lib/server/routeOptions.js.map +1 -0
- package/lib/server/routeTable.d.ts +14 -0
- package/lib/server/routeTable.d.ts.map +1 -0
- package/lib/server/routeTable.js +32 -0
- package/lib/server/routeTable.js.map +1 -0
- package/lib/server/siteView.d.ts +29 -0
- package/lib/server/siteView.d.ts.map +1 -0
- package/lib/server/siteView.js +21 -0
- package/lib/server/siteView.js.map +1 -0
- package/lib/server/spaPages.d.ts +32 -0
- package/lib/server/spaPages.d.ts.map +1 -0
- package/lib/server/spaPages.js +126 -0
- package/lib/server/spaPages.js.map +1 -0
- package/lib/server/spaSite.d.ts +30 -0
- package/lib/server/spaSite.d.ts.map +1 -0
- package/lib/server/spaSite.js +170 -0
- package/lib/server/spaSite.js.map +1 -0
- package/lib/server/spaSiteOptions.d.ts +126 -0
- package/lib/server/spaSiteOptions.d.ts.map +1 -0
- package/lib/server/spaSiteOptions.js +2 -0
- package/lib/server/spaSiteOptions.js.map +1 -0
- package/lib/server/staticSite.d.ts +9 -0
- package/lib/server/staticSite.d.ts.map +1 -1
- package/lib/server/staticSite.js +41 -19
- package/lib/server/staticSite.js.map +1 -1
- package/lib/server/toolSiteServer.d.ts +77 -0
- package/lib/server/toolSiteServer.d.ts.map +1 -0
- package/lib/server/toolSiteServer.js +58 -0
- package/lib/server/toolSiteServer.js.map +1 -0
- package/lib/server/trustProxy.d.ts +20 -0
- package/lib/server/trustProxy.d.ts.map +1 -0
- package/lib/server/trustProxy.js +32 -0
- package/lib/server/trustProxy.js.map +1 -0
- package/lib/server/types.d.ts +13 -0
- package/lib/server/types.d.ts.map +1 -0
- package/lib/server/types.js +2 -0
- package/lib/server/types.js.map +1 -0
- package/lib/server.d.ts +22 -0
- package/lib/server.d.ts.map +1 -1
- package/lib/server.js +12 -0
- package/lib/server.js.map +1 -1
- package/lib/share/core/config.d.ts +18 -0
- package/lib/share/core/config.d.ts.map +1 -1
- package/lib/share/core/config.js +33 -2
- package/lib/share/core/config.js.map +1 -1
- package/lib/share/core/index.d.ts +3 -1
- package/lib/share/core/index.d.ts.map +1 -1
- package/lib/share/core/index.js +2 -1
- package/lib/share/core/index.js.map +1 -1
- package/lib/share/core/keySetParam.d.ts +40 -0
- package/lib/share/core/keySetParam.d.ts.map +1 -0
- package/lib/share/core/keySetParam.js +60 -0
- package/lib/share/core/keySetParam.js.map +1 -0
- package/lib/share/core/vocabulary.d.ts +8 -0
- package/lib/share/core/vocabulary.d.ts.map +1 -1
- package/lib/shell/ui/ShareControl.d.ts +75 -0
- package/lib/shell/ui/ShareControl.d.ts.map +1 -0
- package/lib/shell/ui/ShareControl.js +40 -0
- package/lib/shell/ui/ShareControl.js.map +1 -0
- package/lib/shell/ui/ShellFrame.d.ts +14 -0
- package/lib/shell/ui/ShellFrame.d.ts.map +1 -0
- package/lib/shell/ui/ShellFrame.js +45 -0
- package/lib/shell/ui/ShellFrame.js.map +1 -0
- package/lib/shell/ui/SiteShell.d.ts +251 -0
- package/lib/shell/ui/SiteShell.d.ts.map +1 -0
- package/lib/shell/ui/SiteShell.js +39 -0
- package/lib/shell/ui/SiteShell.js.map +1 -0
- package/lib/shell/ui/index.d.ts +5 -0
- package/lib/shell/ui/index.d.ts.map +1 -0
- package/lib/shell/ui/index.js +3 -0
- package/lib/shell/ui/index.js.map +1 -0
- package/lib/state/core/index.d.ts +1 -0
- package/lib/state/core/index.d.ts.map +1 -1
- package/lib/state/core/index.js.map +1 -1
- package/lib/state/core/legacyEntries.d.ts +30 -0
- package/lib/state/core/legacyEntries.d.ts.map +1 -0
- package/lib/state/core/legacyEntries.js +51 -0
- package/lib/state/core/legacyEntries.js.map +1 -0
- package/lib/state/core/persistBucket.d.ts +26 -2
- package/lib/state/core/persistBucket.d.ts.map +1 -1
- package/lib/state/core/persistBucket.js +26 -9
- package/lib/state/core/persistBucket.js.map +1 -1
- package/lib/state/core/persistSignalBucket.d.ts +26 -0
- package/lib/state/core/persistSignalBucket.d.ts.map +1 -1
- package/lib/state/core/persistSignalBucket.js +31 -0
- package/lib/state/core/persistSignalBucket.js.map +1 -1
- package/lib/state/core/storageEntry.d.ts +15 -0
- package/lib/state/core/storageEntry.d.ts.map +1 -1
- package/lib/state/core/storageEntry.js +33 -0
- package/lib/state/core/storageEntry.js.map +1 -1
- package/lib/structure/ui/StructureExportButton.d.ts +27 -0
- package/lib/structure/ui/StructureExportButton.d.ts.map +1 -0
- package/lib/structure/ui/StructureExportButton.js +21 -0
- package/lib/structure/ui/StructureExportButton.js.map +1 -0
- package/lib/structure/ui/index.d.ts +4 -0
- package/lib/structure/ui/index.d.ts.map +1 -1
- package/lib/structure/ui/index.js +2 -0
- package/lib/structure/ui/index.js.map +1 -1
- package/lib/structure/ui/useStructureDraft.d.ts +32 -0
- package/lib/structure/ui/useStructureDraft.d.ts.map +1 -0
- package/lib/structure/ui/useStructureDraft.js +20 -0
- package/lib/structure/ui/useStructureDraft.js.map +1 -0
- package/lib/ui.d.ts +2 -0
- package/lib/ui.d.ts.map +1 -1
- package/lib/ui.js +2 -0
- package/lib/ui.js.map +1 -1
- package/lib/worker/core/index.d.ts +1 -1
- package/lib/worker/core/index.d.ts.map +1 -1
- package/lib/worker/core/messages.d.ts +4 -2
- package/lib/worker/core/messages.d.ts.map +1 -1
- package/lib/worker/core/messages.js.map +1 -1
- package/lib/worker/core/oclResourcesUrl.d.ts +16 -0
- package/lib/worker/core/oclResourcesUrl.d.ts.map +1 -0
- package/lib/worker/core/oclResourcesUrl.js +19 -0
- package/lib/worker/core/oclResourcesUrl.js.map +1 -0
- package/lib/worker/core/serveWorkerRequests.d.ts +8 -0
- package/lib/worker/core/serveWorkerRequests.d.ts.map +1 -1
- package/lib/worker/core/serveWorkerRequests.js +15 -2
- package/lib/worker/core/serveWorkerRequests.js.map +1 -1
- package/lib/worker/core/workerChannel.d.ts +3 -4
- package/lib/worker/core/workerChannel.d.ts.map +1 -1
- package/lib/worker/core/workerChannel.js +72 -67
- package/lib/worker/core/workerChannel.js.map +1 -1
- package/lib/worker/core/workerChannelParts.d.ts +17 -6
- package/lib/worker/core/workerChannelParts.d.ts.map +1 -1
- package/lib/worker/core/workerChannelParts.js +20 -4
- package/lib/worker/core/workerChannelParts.js.map +1 -1
- package/lib/worker/core/workerChannelTypes.d.ts +46 -2
- package/lib/worker/core/workerChannelTypes.d.ts.map +1 -1
- package/lib/worker/core/workerSlot.d.ts +66 -0
- package/lib/worker/core/workerSlot.d.ts.map +1 -0
- package/lib/worker/core/workerSlot.js +107 -0
- package/lib/worker/core/workerSlot.js.map +1 -0
- package/package.json +16 -1
- package/src/card/core/cardAddress.ts +100 -0
- package/src/card/core/cardPageUrl.ts +97 -0
- package/src/card/core/index.ts +6 -0
- package/src/card/core/panelRoom.ts +66 -0
- package/src/card/ui/CardDetailsButton.tsx +104 -0
- package/src/card/ui/CardFigure.tsx +86 -0
- package/src/card/ui/CardFrame.tsx +46 -0
- package/src/card/ui/CopyTableButton.tsx +81 -0
- package/src/card/ui/cardTooltip.ts +18 -0
- package/src/card/ui/embed.ts +27 -0
- package/src/card/ui/fitCardToFrame.ts +76 -0
- package/src/card/ui/holdRoomForPanels.ts +83 -0
- package/src/card/ui/index.ts +14 -0
- package/src/card/ui/openPanels.ts +106 -0
- package/src/card.ts +13 -0
- package/src/conformers.ts +4 -0
- package/src/core.ts +5 -0
- package/src/fetch/core/apiError.ts +65 -0
- package/src/fetch/core/fetchJson.ts +129 -0
- package/src/fetch/core/index.ts +4 -0
- package/src/formula/core/formulaText.ts +96 -0
- package/src/formula/core/index.ts +20 -0
- package/src/formula/core/normalizeFormula.ts +50 -0
- package/src/formula/core/readFormula.ts +211 -0
- package/src/formula/ui/CopyableFormula.tsx +51 -0
- package/src/formula/ui/FormulaInput.tsx +50 -0
- package/src/formula/ui/QuestionFormula.tsx +20 -0
- package/src/formula/ui/index.ts +6 -0
- package/src/formula.ts +11 -0
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/keyTargets.ts +5 -3
- package/src/hooks/ui/useAsync.ts +50 -14
- package/src/locales/de.json +37 -0
- package/src/locales/en.json +37 -0
- package/src/locales/es.json +37 -0
- package/src/locales/fr.json +37 -0
- package/src/locales/it.json +37 -0
- package/src/moleculesClient/core/index.ts +19 -0
- package/src/moleculesClient/core/moleculesClient.ts +175 -0
- package/src/moleculesClient/core/moleculesClientApi.ts +120 -0
- package/src/moleculesClient/core/moleculesTypes.ts +163 -0
- package/src/moleculesClient/core/requestRetry.ts +118 -0
- package/src/molstar/core/camera.ts +3 -2
- package/src/molstar/core/framing.ts +200 -0
- package/src/molstar/core/hover.ts +26 -0
- package/src/molstar/core/index.ts +21 -1
- package/src/pedagogy/core/answers.ts +94 -0
- package/src/pedagogy/core/attempts.ts +205 -0
- package/src/pedagogy/core/index.ts +36 -0
- package/src/pedagogy/core/progressController.ts +116 -0
- package/src/pedagogy/core/seed.ts +177 -0
- package/src/pedagogy/core/series.ts +82 -0
- package/src/pedagogy/ui/AnswerFields.tsx +63 -0
- package/src/pedagogy/ui/ExerciseList.tsx +202 -0
- package/src/pedagogy/ui/ExerciseSeries.tsx +250 -0
- package/src/pedagogy/ui/QuestionCard.tsx +231 -0
- package/src/pedagogy/ui/index.ts +18 -0
- package/src/pedagogy/ui/seriesCounts.ts +34 -0
- package/src/pedagogy/ui/seriesParts.tsx +127 -0
- package/src/pedagogy/ui/useAttemptRecords.ts +16 -0
- package/src/periodic/ui/PeriodicTable.tsx +6 -3
- package/src/property/core/copyableText.ts +20 -0
- package/src/property/core/index.ts +1 -0
- package/src/property/ui/PropertyTable.tsx +83 -0
- package/src/property/ui/index.ts +2 -0
- package/src/router/core/history.ts +61 -7
- package/src/router/core/index.ts +3 -2
- package/src/router/core/languageRoute.ts +136 -0
- package/src/router/core/siteAddresses.ts +38 -0
- package/src/router/core/tabRouter.ts +59 -117
- package/src/router/core/tabRouterTypes.ts +158 -0
- package/src/seo/core/fitDescription.ts +74 -0
- package/src/seo/core/index.ts +17 -0
- package/src/seo/core/limits.ts +27 -0
- package/src/seo/core/pageContent.ts +42 -0
- package/src/seo/core/plainDescription.ts +4 -2
- package/src/seo/core/routeProblems.ts +1 -7
- package/src/seo/core/routeTable.ts +103 -0
- package/src/seo/vite/index.ts +2 -0
- package/src/seo/vite/prerender.ts +26 -1
- package/src/seo/vite/routeTable.ts +79 -0
- package/src/server/answerAddresses.ts +92 -0
- package/src/server/cardMeta.ts +88 -0
- package/src/server/config.ts +125 -0
- package/src/server/envNumber.ts +65 -0
- package/src/server/healthRoute.ts +42 -0
- package/src/server/listenSite.ts +90 -0
- package/src/server/mcpServer.ts +14 -0
- package/src/server/repositoryVersion.ts +33 -0
- package/src/server/routeOptions.ts +26 -0
- package/src/server/routeTable.ts +35 -0
- package/src/server/siteView.ts +42 -0
- package/src/server/spaPages.ts +179 -0
- package/src/server/spaSite.ts +216 -0
- package/src/server/spaSiteOptions.ts +133 -0
- package/src/server/staticSite.ts +65 -35
- package/src/server/toolSiteServer.ts +127 -0
- package/src/server/trustProxy.ts +32 -0
- package/src/server/types.ts +25 -0
- package/src/server.ts +40 -0
- package/src/share/core/config.ts +45 -2
- package/src/share/core/index.ts +4 -0
- package/src/share/core/keySetParam.ts +92 -0
- package/src/share/core/vocabulary.ts +8 -0
- package/src/shell/ui/ShareControl.tsx +150 -0
- package/src/shell/ui/ShellFrame.tsx +180 -0
- package/src/shell/ui/SiteShell.tsx +297 -0
- package/src/shell/ui/index.ts +9 -0
- package/src/state/core/index.ts +1 -0
- package/src/state/core/legacyEntries.ts +76 -0
- package/src/state/core/persistBucket.ts +50 -10
- package/src/state/core/persistSignalBucket.ts +52 -0
- package/src/state/core/storageEntry.ts +32 -0
- package/src/structure/ui/StructureExportButton.tsx +57 -0
- package/src/structure/ui/index.ts +4 -0
- package/src/structure/ui/useStructureDraft.ts +47 -0
- package/src/ui.ts +2 -0
- package/src/worker/core/index.ts +1 -0
- package/src/worker/core/messages.ts +4 -3
- package/src/worker/core/oclResourcesUrl.ts +21 -0
- package/src/worker/core/serveWorkerRequests.ts +30 -2
- package/src/worker/core/workerChannel.ts +74 -74
- package/src/worker/core/workerChannelParts.ts +33 -13
- package/src/worker/core/workerChannelTypes.ts +47 -2
- package/src/worker/core/workerSlot.ts +181 -0
- package/styles/card.css +145 -0
- package/styles/chrome.css +248 -0
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { toError } from '../../error/core/toError.ts';
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
WorkerEventLike,
|
|
5
|
+
WorkerLike,
|
|
6
|
+
WorkerResponseMessage,
|
|
7
|
+
} from './messages.ts';
|
|
4
8
|
import { isProgressMessage, isResponseMessage } from './messages.ts';
|
|
5
|
-
import type { WorkerJobContext } from './workerChannelTypes.ts';
|
|
9
|
+
import type { WorkerFailure, WorkerJobContext } from './workerChannelTypes.ts';
|
|
6
10
|
|
|
7
11
|
/** How long a request waits when neither the call nor the channel says. */
|
|
8
12
|
export const DEFAULT_TIMEOUT_MS = 120_000;
|
|
@@ -62,10 +66,13 @@ export type Outcome<TResponse> =
|
|
|
62
66
|
interface WorkerMessageHandlers {
|
|
63
67
|
/** News about a running job. */
|
|
64
68
|
progress: (id: number, progress: unknown) => void;
|
|
65
|
-
/** The end of a job. */
|
|
66
|
-
answer: (id: number,
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
+
/** The end of a job, as the worker posted it. */
|
|
70
|
+
answer: (id: number, message: WorkerResponseMessage<unknown>) => void;
|
|
71
|
+
/**
|
|
72
|
+
* The worker failed outright, with what it said — possibly nothing — and
|
|
73
|
+
* the error event itself.
|
|
74
|
+
*/
|
|
75
|
+
failure: (detail: string, event: WorkerEventLike) => void;
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
/**
|
|
@@ -121,19 +128,32 @@ export function subscribeToWorker(
|
|
|
121
128
|
if (isProgressMessage(message)) {
|
|
122
129
|
handlers.progress(message.id, message.progress);
|
|
123
130
|
} else if (isResponseMessage(message)) {
|
|
124
|
-
handlers.answer(
|
|
125
|
-
message.id,
|
|
126
|
-
message.ok
|
|
127
|
-
? { ok: true, response: message.response }
|
|
128
|
-
: { ok: false, error: new Error(message.message) },
|
|
129
|
-
);
|
|
131
|
+
handlers.answer(message.id, message);
|
|
130
132
|
}
|
|
131
133
|
});
|
|
132
134
|
target.addEventListener('error', (event) => {
|
|
133
|
-
handlers.failure(event.message ?? '');
|
|
135
|
+
handlers.failure(event.message ?? '', event);
|
|
134
136
|
});
|
|
135
137
|
}
|
|
136
138
|
|
|
139
|
+
/**
|
|
140
|
+
* The error a failure rejects its requests with when the channel is given no
|
|
141
|
+
* `failure` of its own: the job's own error or message, `<name> failed: …` for
|
|
142
|
+
* a worker that died, and what creating the worker threw.
|
|
143
|
+
* @param failure - What went wrong.
|
|
144
|
+
* @returns The error.
|
|
145
|
+
*/
|
|
146
|
+
export function defaultFailureError(failure: WorkerFailure): Error {
|
|
147
|
+
if (failure.kind === 'worker') {
|
|
148
|
+
const suffix = failure.message === '' ? '' : `: ${failure.message}`;
|
|
149
|
+
return new Error(`${failure.name} failed${suffix}`);
|
|
150
|
+
}
|
|
151
|
+
if (failure.cause instanceof Error) return failure.cause;
|
|
152
|
+
return failure.kind === 'job'
|
|
153
|
+
? new Error(failure.message)
|
|
154
|
+
: toError(failure.cause);
|
|
155
|
+
}
|
|
156
|
+
|
|
137
157
|
/**
|
|
138
158
|
* Run one job on this thread as a worker would: with a signal the channel
|
|
139
159
|
* aborts, progress routed back, and every outcome — a throw included —
|
|
@@ -63,14 +63,59 @@ export interface WorkerChannelOptions<TRequest, TResponse, TProgress = never> {
|
|
|
63
63
|
cooperativeCancel?: boolean;
|
|
64
64
|
/**
|
|
65
65
|
* The same job run on this thread, used instead of the worker where the page
|
|
66
|
-
* has no `Worker` at all — Node.js, a unit test
|
|
67
|
-
*
|
|
66
|
+
* has no `Worker` at all — Node.js, a unit test — or where creating one
|
|
67
|
+
* throws, as a browser refuses a page framed under an opaque origin a worker
|
|
68
|
+
* from its own server; every later job then runs here too. Only a channel
|
|
69
|
+
* built from a function that creates the worker falls back to it.
|
|
68
70
|
* @default undefined — every job goes to the worker
|
|
69
71
|
*/
|
|
70
72
|
runInProcess?: (
|
|
71
73
|
request: TRequest,
|
|
72
74
|
context: WorkerJobContext<TProgress>,
|
|
73
75
|
) => Promise<TResponse>;
|
|
76
|
+
/**
|
|
77
|
+
* Turn what went wrong into the error the requests reject with, so a page
|
|
78
|
+
* can say it in its own words — a translated message, an error class of its
|
|
79
|
+
* own. Answering `undefined` keeps the default error. Cancellations and
|
|
80
|
+
* timeouts are not failures: they keep their own error classes.
|
|
81
|
+
* @default undefined — the job's message, or `<name> failed: …`
|
|
82
|
+
*/
|
|
83
|
+
failure?: (failure: WorkerFailure) => Error | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Post a job again, once, on a fresh worker when its worker failed before
|
|
86
|
+
* answering, rather than reporting the failure: a worker whose module graph
|
|
87
|
+
* was still loading when the channel replaced it dies without having run
|
|
88
|
+
* anything. A job posted with buffers to transfer is not posted twice. Only
|
|
89
|
+
* a channel built from a function that creates the worker can do it.
|
|
90
|
+
* @default false
|
|
91
|
+
*/
|
|
92
|
+
retryAfterWorkerFailure?: boolean;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** What went wrong, before it becomes the error a request rejects with. */
|
|
96
|
+
export interface WorkerFailure {
|
|
97
|
+
/**
|
|
98
|
+
* `job`: the job failed — its worker answered with a failure, or its
|
|
99
|
+
* in-process run threw. `worker`: the worker itself failed outright; an
|
|
100
|
+
* empty `message` means it never ran at all, its module graph not loading.
|
|
101
|
+
* `start`: creating the worker threw, and no in-process run stood in.
|
|
102
|
+
*/
|
|
103
|
+
kind: 'job' | 'worker' | 'start';
|
|
104
|
+
/** The channel's name, e.g. `conformers`. */
|
|
105
|
+
name: string;
|
|
106
|
+
/** What was said: the job's message, the error event's, or the thrown error's. */
|
|
107
|
+
message: string;
|
|
108
|
+
/**
|
|
109
|
+
* The `detail` a failed answer carried, as `serveWorkerRequests` was told to
|
|
110
|
+
* write it — the key of a translatable message, say.
|
|
111
|
+
* @default undefined
|
|
112
|
+
*/
|
|
113
|
+
detail?: unknown;
|
|
114
|
+
/**
|
|
115
|
+
* What the failure came with: the failed answer the worker posted, the error
|
|
116
|
+
* the in-process run threw, the error event, or what the factory threw.
|
|
117
|
+
*/
|
|
118
|
+
cause: unknown;
|
|
74
119
|
}
|
|
75
120
|
|
|
76
121
|
/** What one call may ask of the channel. */
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { errorMessage } from '../../error/core/toError.ts';
|
|
2
|
+
|
|
3
|
+
import { CancelledRequestError } from './errors.ts';
|
|
4
|
+
import type { WorkerLike, WorkerResponseMessage } from './messages.ts';
|
|
5
|
+
import type { Outcome } from './workerChannelParts.ts';
|
|
6
|
+
import {
|
|
7
|
+
defaultFailureError,
|
|
8
|
+
subscribeToWorker,
|
|
9
|
+
} from './workerChannelParts.ts';
|
|
10
|
+
import type {
|
|
11
|
+
WorkerFailure,
|
|
12
|
+
WorkerJobContext,
|
|
13
|
+
WorkerSource,
|
|
14
|
+
} from './workerChannelTypes.ts';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The one worker a channel posts to, kept, replaced and listened to.
|
|
18
|
+
*
|
|
19
|
+
* Handed a worker, the slot holds it until it is terminated. Handed a function,
|
|
20
|
+
* it creates the worker on first use and again after one failed or was let go,
|
|
21
|
+
* and runs the jobs on this thread instead — where there is no `Worker`, or
|
|
22
|
+
* where creating one throws — when the channel was given an in-process run.
|
|
23
|
+
* What a worker posts is heard only while it is the slot's current one, so a
|
|
24
|
+
* worker already let go cannot settle a job it no longer runs.
|
|
25
|
+
* @param source - The worker, or the function that creates it.
|
|
26
|
+
* @param options - What the slot reports to, and how failures are worded.
|
|
27
|
+
* @returns The slot.
|
|
28
|
+
*/
|
|
29
|
+
export function createWorkerSlot<TRequest, TResponse, TProgress>(
|
|
30
|
+
source: WorkerSource,
|
|
31
|
+
options: WorkerSlotOptions<TRequest, TResponse, TProgress>,
|
|
32
|
+
): WorkerSlot<TRequest, TResponse, TProgress> {
|
|
33
|
+
const { name, runInProcess, failure, isWaited, report } = options;
|
|
34
|
+
const factory = typeof source === 'function' ? source : undefined;
|
|
35
|
+
let worker: WorkerLike | null = null;
|
|
36
|
+
let local =
|
|
37
|
+
factory !== undefined && !('Worker' in globalThis)
|
|
38
|
+
? runInProcess
|
|
39
|
+
: undefined;
|
|
40
|
+
if (typeof source !== 'function') {
|
|
41
|
+
worker = source;
|
|
42
|
+
listen(source);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function fail(described: WorkerFailure): Error {
|
|
46
|
+
return failure?.(described) ?? defaultFailureError(described);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function acquire(): WorkerLike | null {
|
|
50
|
+
if (local !== undefined) return null;
|
|
51
|
+
if (worker !== null) return worker;
|
|
52
|
+
if (factory === undefined) {
|
|
53
|
+
throw new CancelledRequestError(`${name} was terminated`);
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
worker = factory();
|
|
57
|
+
} catch (error) {
|
|
58
|
+
if (runInProcess === undefined) {
|
|
59
|
+
const message = errorMessage(error);
|
|
60
|
+
throw fail({ kind: 'start', name, message, cause: error });
|
|
61
|
+
}
|
|
62
|
+
local = runInProcess;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
listen(worker);
|
|
66
|
+
return worker;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function outcomeOf(
|
|
70
|
+
id: number,
|
|
71
|
+
message: WorkerResponseMessage<unknown>,
|
|
72
|
+
): Outcome<TResponse> {
|
|
73
|
+
if (message.ok) {
|
|
74
|
+
return { ok: true, response: message.response as TResponse };
|
|
75
|
+
}
|
|
76
|
+
if (!isWaited(id)) return { ok: false, error: new Error(message.message) };
|
|
77
|
+
const { detail } = message;
|
|
78
|
+
const described = { kind: 'job', name, message: message.message } as const;
|
|
79
|
+
return { ok: false, error: fail({ ...described, detail, cause: message }) };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function listen(target: WorkerLike): void {
|
|
83
|
+
subscribeToWorker(target, {
|
|
84
|
+
progress: (id, progress) => {
|
|
85
|
+
if (target === worker) report.progress(id, progress);
|
|
86
|
+
},
|
|
87
|
+
answer: (id, message) => {
|
|
88
|
+
if (target === worker) report.answer(id, outcomeOf(id, message));
|
|
89
|
+
},
|
|
90
|
+
failure: (detail, event) => {
|
|
91
|
+
if (target !== worker) return;
|
|
92
|
+
if (factory !== undefined) {
|
|
93
|
+
target.terminate();
|
|
94
|
+
worker = null;
|
|
95
|
+
}
|
|
96
|
+
report.failure(
|
|
97
|
+
fail({ kind: 'worker', name, message: detail, cause: event }),
|
|
98
|
+
);
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
hasFactory: factory !== undefined,
|
|
105
|
+
get current() {
|
|
106
|
+
return worker;
|
|
107
|
+
},
|
|
108
|
+
acquire,
|
|
109
|
+
runLocally: (payload, context) =>
|
|
110
|
+
local === undefined
|
|
111
|
+
? Promise.reject(new Error(`${name} has no in-process run`))
|
|
112
|
+
: local(payload, context),
|
|
113
|
+
jobFailed: (error) =>
|
|
114
|
+
fail({ kind: 'job', name, message: error.message, cause: error }),
|
|
115
|
+
abandon: () => {
|
|
116
|
+
if (factory === undefined || worker === null) return;
|
|
117
|
+
worker.terminate();
|
|
118
|
+
worker = null;
|
|
119
|
+
},
|
|
120
|
+
terminate: () => {
|
|
121
|
+
worker?.terminate();
|
|
122
|
+
if (factory !== undefined) worker = null;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** What a slot is told about its channel. */
|
|
128
|
+
export interface WorkerSlotOptions<TRequest, TResponse, TProgress> {
|
|
129
|
+
/** The channel's name, for its errors. */
|
|
130
|
+
name: string;
|
|
131
|
+
/**
|
|
132
|
+
* The job run on this thread instead of a worker.
|
|
133
|
+
* @default undefined — every job goes to the worker
|
|
134
|
+
*/
|
|
135
|
+
runInProcess?: (
|
|
136
|
+
request: TRequest,
|
|
137
|
+
context: WorkerJobContext<TProgress>,
|
|
138
|
+
) => Promise<TResponse>;
|
|
139
|
+
/**
|
|
140
|
+
* The channel's own wording of a failure.
|
|
141
|
+
* @default undefined — the default errors
|
|
142
|
+
*/
|
|
143
|
+
failure?: (failure: WorkerFailure) => Error | undefined;
|
|
144
|
+
/** Whether somebody still waits for a request. */
|
|
145
|
+
isWaited: (id: number) => boolean;
|
|
146
|
+
/** Where what the current worker posts goes. */
|
|
147
|
+
report: {
|
|
148
|
+
/** News about a running job. */
|
|
149
|
+
progress: (id: number, progress: unknown) => void;
|
|
150
|
+
/** The end of a job. */
|
|
151
|
+
answer: (id: number, outcome: Outcome<TResponse>) => void;
|
|
152
|
+
/** The worker failed outright, and a factory's was let go. */
|
|
153
|
+
failure: (error: Error) => void;
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** The worker of a channel; see {@link createWorkerSlot}. */
|
|
158
|
+
export interface WorkerSlot<TRequest, TResponse, TProgress> {
|
|
159
|
+
/** Whether the slot creates its workers, and can therefore replace one. */
|
|
160
|
+
readonly hasFactory: boolean;
|
|
161
|
+
/** The worker posted to now, if there is one. */
|
|
162
|
+
readonly current: WorkerLike | null;
|
|
163
|
+
/**
|
|
164
|
+
* The worker a job goes to, created if need be.
|
|
165
|
+
* @returns It, or `null` when the job runs on this thread instead.
|
|
166
|
+
* @throws {CancelledRequestError} When a worker handed over was terminated.
|
|
167
|
+
* @throws {Error} What creating the worker threw, worded by the channel.
|
|
168
|
+
*/
|
|
169
|
+
acquire: () => WorkerLike | null;
|
|
170
|
+
/** Run a job on this thread, as the channel's in-process run. */
|
|
171
|
+
runLocally: (
|
|
172
|
+
payload: TRequest,
|
|
173
|
+
context: WorkerJobContext<TProgress>,
|
|
174
|
+
) => Promise<TResponse>;
|
|
175
|
+
/** The error an in-process run that failed rejects with. */
|
|
176
|
+
jobFailed: (error: Error) => Error;
|
|
177
|
+
/** End a factory's worker, so the next job starts on a fresh one. */
|
|
178
|
+
abandon: () => void;
|
|
179
|
+
/** End the worker, whatever made it. */
|
|
180
|
+
terminate: () => void;
|
|
181
|
+
}
|
package/styles/card.css
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The card an answer is shown as in a chat: a site's own page under
|
|
3
|
+
* `?embed=1&card=1`, which mcp.cheminfo.org frames inline. Imported once by
|
|
4
|
+
* the site's card, after `chrome.css`, whose tokens it reads; `CardFrame` and
|
|
5
|
+
* the components of `react-cheminfo/card` carry the classes.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/* The frame is exactly as tall as the card reports, so nothing around the card
|
|
9
|
+
may add a pixel, and the page behind it takes the card's colour. */
|
|
10
|
+
body:has(.card) {
|
|
11
|
+
margin: 0;
|
|
12
|
+
background: var(--surface);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.card {
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
padding: 0.6rem 0.75rem;
|
|
18
|
+
background: var(--surface);
|
|
19
|
+
color: var(--text);
|
|
20
|
+
font-size: 0.875rem;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.card a:not(.bp6-button) {
|
|
24
|
+
color: var(--accent);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* The chat floats its own full-screen control over the top right corner of
|
|
28
|
+
the frame, about 40px square: the first line of a card leaves it empty. */
|
|
29
|
+
.card__header {
|
|
30
|
+
padding-right: 2.75rem;
|
|
31
|
+
margin: 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.card__title {
|
|
35
|
+
min-width: 0;
|
|
36
|
+
margin: 0;
|
|
37
|
+
font-size: 1.0625rem;
|
|
38
|
+
line-height: 1.35;
|
|
39
|
+
overflow-wrap: anywhere;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.card__muted {
|
|
43
|
+
color: var(--text-muted);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* The last row of a card: a remark, then the actions — copying its table, the
|
|
47
|
+
way to the site's page — keeping its right edge together. */
|
|
48
|
+
.card__end {
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-wrap: wrap;
|
|
51
|
+
align-items: center;
|
|
52
|
+
justify-content: flex-end;
|
|
53
|
+
margin-top: 0.35rem;
|
|
54
|
+
gap: 0.25rem 0.5rem;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.card__note {
|
|
58
|
+
min-width: 0;
|
|
59
|
+
flex: 1;
|
|
60
|
+
margin: 0;
|
|
61
|
+
color: var(--text-muted);
|
|
62
|
+
font-size: 0.8125rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* A dialog a card opens is as tall as what it holds: the card grows to hold
|
|
66
|
+
it, where Blueprint would cut its body to seven tenths of a frame that is
|
|
67
|
+
only as tall as the card. */
|
|
68
|
+
body:has(.card) .bp6-dialog-body-scroll-container {
|
|
69
|
+
max-height: none;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* The tooltip of a card's action names it in a few words: the family's help
|
|
73
|
+
card, at the width of its text rather than at the measure of a paragraph. */
|
|
74
|
+
.help-tooltip.card-tooltip .bp6-popover-content {
|
|
75
|
+
width: auto;
|
|
76
|
+
max-width: 300px;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ── A figure, and the glyphs that take it away ─────────────────────────── */
|
|
80
|
+
|
|
81
|
+
/* The glyphs stand in a column beside the figure's top right corner: over the
|
|
82
|
+
drawing they would hide part of a curve or an atom. */
|
|
83
|
+
.card-figure {
|
|
84
|
+
position: relative;
|
|
85
|
+
width: fit-content;
|
|
86
|
+
min-width: 0;
|
|
87
|
+
max-width: 100%;
|
|
88
|
+
padding-right: 30px;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* A grid of structures takes the width it is given. */
|
|
92
|
+
.card-figure--fill {
|
|
93
|
+
width: auto;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Faded until the figure is pointed at, as the chat's own glyphs are, and at
|
|
97
|
+
full strength while one holds the focus or has its panel open. Inset by the
|
|
98
|
+
width of a focus ring, which the layer around them would otherwise cut. */
|
|
99
|
+
.card-figure__tools {
|
|
100
|
+
position: absolute;
|
|
101
|
+
top: 3px;
|
|
102
|
+
right: 3px;
|
|
103
|
+
display: flex;
|
|
104
|
+
flex-direction: column;
|
|
105
|
+
gap: 2px;
|
|
106
|
+
opacity: 0.6;
|
|
107
|
+
pointer-events: auto;
|
|
108
|
+
transition: opacity 120ms ease;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.card-figure:hover .card-figure__tools,
|
|
112
|
+
.card-figure__tools:focus-within,
|
|
113
|
+
.card-figure__tools:has([aria-expanded='true']) {
|
|
114
|
+
opacity: 1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* A finger has nothing to point with before it taps, and gets the larger
|
|
118
|
+
glyphs: the column widens with them. */
|
|
119
|
+
@media (hover: none) {
|
|
120
|
+
.card-figure__tools {
|
|
121
|
+
opacity: 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@media (pointer: coarse) {
|
|
126
|
+
.card-figure {
|
|
127
|
+
padding-right: 46px;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* ── Copying a table ────────────────────────────────────────────────────── */
|
|
132
|
+
|
|
133
|
+
/* A heading of a few letters has room for the glyph alone; the label stays the
|
|
134
|
+
button's accessible name. */
|
|
135
|
+
.card__copy-table--glyph .bp6-button-text {
|
|
136
|
+
display: none;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* On a narrow frame the last row has no room for two labelled buttons: the
|
|
140
|
+
table's copy keeps its glyph, and its tooltip says what it does. */
|
|
141
|
+
@media (width <= 30rem) {
|
|
142
|
+
.card__copy-table .bp6-button-text {
|
|
143
|
+
display: none;
|
|
144
|
+
}
|
|
145
|
+
}
|
package/styles/chrome.css
CHANGED
|
@@ -1574,3 +1574,251 @@ span.taxon-lineage__name {
|
|
|
1574
1574
|
display: none !important;
|
|
1575
1575
|
}
|
|
1576
1576
|
}
|
|
1577
|
+
|
|
1578
|
+
/* ── The footer's note ───────────────────────────────────────────────────── */
|
|
1579
|
+
|
|
1580
|
+
/* One line a site adds under the family — what its links can be handed out as.
|
|
1581
|
+
The footer stacks only when it carries one, so a footer without a note is
|
|
1582
|
+
laid out as it always was, and no site re-declares `.app-footer__inner`. */
|
|
1583
|
+
.app-footer__inner:has(> .app-footer__note) {
|
|
1584
|
+
display: flex;
|
|
1585
|
+
flex-direction: column;
|
|
1586
|
+
gap: 0.75rem;
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
.app-footer__note {
|
|
1590
|
+
margin: 0;
|
|
1591
|
+
color: var(--text-muted);
|
|
1592
|
+
font-size: 0.8125rem;
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
.app-footer__note a {
|
|
1596
|
+
color: var(--accent);
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
/* ── The site shell ──────────────────────────────────────────────────────── */
|
|
1600
|
+
|
|
1601
|
+
/* The bar and the page own the screen they open on, so the family links in
|
|
1602
|
+
the footer are always reached by scrolling. */
|
|
1603
|
+
.site-shell {
|
|
1604
|
+
display: flex;
|
|
1605
|
+
min-height: 100dvh;
|
|
1606
|
+
flex-direction: column;
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
.site-shell__main {
|
|
1610
|
+
width: 100%;
|
|
1611
|
+
max-width: var(--page-max);
|
|
1612
|
+
flex: 1 1 auto;
|
|
1613
|
+
padding: 16px 1.25rem 24px;
|
|
1614
|
+
margin: 0 auto;
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1617
|
+
/* Under a bar that runs full width, the page does too. */
|
|
1618
|
+
.site-shell__main--full {
|
|
1619
|
+
max-width: none;
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
/* Framed in another site: the frame is the margin, and it is usually narrow. */
|
|
1623
|
+
.site-shell__main--embedded {
|
|
1624
|
+
max-width: none;
|
|
1625
|
+
padding: 8px;
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
@media (max-width: 40rem) {
|
|
1629
|
+
.site-shell__main:not(.site-shell__main--embedded) {
|
|
1630
|
+
padding-inline: 0.5rem;
|
|
1631
|
+
}
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
/* ── A graded series ─────────────────────────────────────────────────────── */
|
|
1635
|
+
|
|
1636
|
+
.exercise-series {
|
|
1637
|
+
display: flex;
|
|
1638
|
+
flex-direction: column;
|
|
1639
|
+
gap: 0.75rem;
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
.exercise-series__head {
|
|
1643
|
+
display: flex;
|
|
1644
|
+
flex-wrap: wrap;
|
|
1645
|
+
align-items: center;
|
|
1646
|
+
justify-content: space-between;
|
|
1647
|
+
gap: 0.5rem;
|
|
1648
|
+
}
|
|
1649
|
+
|
|
1650
|
+
.exercise-series__title {
|
|
1651
|
+
margin: 0;
|
|
1652
|
+
font-size: 1rem;
|
|
1653
|
+
font-weight: 700;
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
.exercise-series__controls {
|
|
1657
|
+
display: flex;
|
|
1658
|
+
flex-wrap: wrap;
|
|
1659
|
+
gap: 0.5rem;
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1662
|
+
/* The list and the open question share the row at the share the address
|
|
1663
|
+
names, so no width is written here: `SplitRow` divides it. */
|
|
1664
|
+
.exercise-series__list {
|
|
1665
|
+
display: flex;
|
|
1666
|
+
flex-direction: column;
|
|
1667
|
+
gap: 2px;
|
|
1668
|
+
}
|
|
1669
|
+
|
|
1670
|
+
.exercise-series__number {
|
|
1671
|
+
color: var(--text-muted);
|
|
1672
|
+
font-variant-numeric: tabular-nums;
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
.series-question {
|
|
1676
|
+
display: flex;
|
|
1677
|
+
min-width: 0;
|
|
1678
|
+
flex-direction: column;
|
|
1679
|
+
gap: 0.75rem;
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
.series-question__meta {
|
|
1683
|
+
display: flex;
|
|
1684
|
+
align-items: center;
|
|
1685
|
+
color: var(--text-muted);
|
|
1686
|
+
font-size: 0.8125rem;
|
|
1687
|
+
gap: 0.5rem;
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
.series-question__prompt p {
|
|
1691
|
+
margin: 0;
|
|
1692
|
+
font-size: 1.0625rem;
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
.series-question__solution {
|
|
1696
|
+
margin: 0 0 0.5rem;
|
|
1697
|
+
}
|
|
1698
|
+
|
|
1699
|
+
.series-question__next {
|
|
1700
|
+
margin-left: 0.75rem;
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
.series-answers {
|
|
1704
|
+
display: flex;
|
|
1705
|
+
flex-wrap: wrap;
|
|
1706
|
+
gap: 0 1rem;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
.series-answers__field {
|
|
1710
|
+
width: 10rem;
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
/* A formula is read character by character, so its box is set monospace. */
|
|
1714
|
+
.formula-input input {
|
|
1715
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
/* ── A list of exercises ─────────────────────────────────────────────────── */
|
|
1719
|
+
|
|
1720
|
+
.exercise-list {
|
|
1721
|
+
display: flex;
|
|
1722
|
+
flex-direction: column;
|
|
1723
|
+
gap: 10px;
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
.exercise-list__rows {
|
|
1727
|
+
display: flex;
|
|
1728
|
+
overflow: auto;
|
|
1729
|
+
max-height: 30rem;
|
|
1730
|
+
flex-direction: column;
|
|
1731
|
+
gap: 2px;
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
.exercise-list__item {
|
|
1735
|
+
display: flex;
|
|
1736
|
+
flex-wrap: wrap;
|
|
1737
|
+
align-items: center;
|
|
1738
|
+
padding: 5px 7px;
|
|
1739
|
+
border: 1px solid transparent;
|
|
1740
|
+
border-radius: var(--radius);
|
|
1741
|
+
background: none;
|
|
1742
|
+
color: var(--text-muted);
|
|
1743
|
+
font: inherit;
|
|
1744
|
+
font-size: 0.875rem;
|
|
1745
|
+
gap: 6px;
|
|
1746
|
+
text-align: left;
|
|
1747
|
+
cursor: pointer;
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
.exercise-list__item:hover {
|
|
1751
|
+
background: var(--surface-sunken);
|
|
1752
|
+
color: var(--text);
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
/* The brand tint says which one is open, as it says which page is. */
|
|
1756
|
+
.exercise-list__item--active,
|
|
1757
|
+
.exercise-list__item--active:hover {
|
|
1758
|
+
border-color: color-mix(in oklab, var(--accent) 30%, white);
|
|
1759
|
+
background: color-mix(in oklab, var(--accent) 12%, white);
|
|
1760
|
+
color: var(--accent);
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
.exercise-list__title {
|
|
1764
|
+
min-width: 0;
|
|
1765
|
+
flex: 1 1 6rem;
|
|
1766
|
+
font-weight: 600;
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
/* The tags travel together: left loose in the row, a long title strands the
|
|
1770
|
+
level at the end of one line and drops the kind onto the next. */
|
|
1771
|
+
.exercise-list__tags {
|
|
1772
|
+
display: inline-flex;
|
|
1773
|
+
flex: 0 0 auto;
|
|
1774
|
+
flex-wrap: nowrap;
|
|
1775
|
+
align-items: center;
|
|
1776
|
+
gap: 6px;
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
/* ── A table of properties ───────────────────────────────────────────────── */
|
|
1780
|
+
|
|
1781
|
+
.properties__title {
|
|
1782
|
+
margin: 0 0 0.35rem;
|
|
1783
|
+
color: var(--text-muted);
|
|
1784
|
+
font-size: 0.75rem;
|
|
1785
|
+
font-weight: 700;
|
|
1786
|
+
letter-spacing: 0.04em;
|
|
1787
|
+
text-transform: uppercase;
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
.properties__table {
|
|
1791
|
+
width: 100%;
|
|
1792
|
+
border-collapse: collapse;
|
|
1793
|
+
font-size: 0.875rem;
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
.properties__table th {
|
|
1797
|
+
padding: 0.3rem 0.75rem 0.3rem 0;
|
|
1798
|
+
color: var(--text-muted);
|
|
1799
|
+
font-weight: 500;
|
|
1800
|
+
text-align: left;
|
|
1801
|
+
vertical-align: top;
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1804
|
+
.properties__table td {
|
|
1805
|
+
padding: 0.3rem 22px 0.3rem 0;
|
|
1806
|
+
font-variant-numeric: tabular-nums;
|
|
1807
|
+
text-align: right;
|
|
1808
|
+
vertical-align: top;
|
|
1809
|
+
word-break: break-all;
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
.properties__note {
|
|
1813
|
+
display: block;
|
|
1814
|
+
color: var(--text-faint);
|
|
1815
|
+
font-size: 0.75rem;
|
|
1816
|
+
}
|
|
1817
|
+
|
|
1818
|
+
.properties__table td code {
|
|
1819
|
+
display: inline-block;
|
|
1820
|
+
max-width: 100%;
|
|
1821
|
+
font-size: 0.8125rem;
|
|
1822
|
+
text-align: left;
|
|
1823
|
+
word-break: break-all;
|
|
1824
|
+
}
|