react-cheminfo 0.64.0 → 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/molecule3d/core/highlight.d.ts.map +1 -1
- package/lib/molecule3d/core/highlight.js +2 -8
- package/lib/molecule3d/core/highlight.js.map +1 -1
- package/lib/molecule3d/core/index.d.ts +1 -1
- package/lib/molecule3d/core/index.d.ts.map +1 -1
- package/lib/molecule3d/core/index.js +1 -1
- package/lib/molecule3d/core/index.js.map +1 -1
- package/lib/molecule3d/core/measurement.d.ts +17 -0
- package/lib/molecule3d/core/measurement.d.ts.map +1 -1
- package/lib/molecule3d/core/measurement.js +43 -0
- package/lib/molecule3d/core/measurement.js.map +1 -1
- package/lib/molecule3d/ui/drawScene.d.ts +4 -2
- package/lib/molecule3d/ui/drawScene.d.ts.map +1 -1
- package/lib/molecule3d/ui/drawScene.js +1 -1
- package/lib/molecule3d/ui/drawScene.js.map +1 -1
- package/lib/molecule3d/ui/moleculeViewer3DProps.d.ts +3 -1
- package/lib/molecule3d/ui/moleculeViewer3DProps.d.ts.map +1 -1
- package/lib/molecule3d/ui/sceneDrawer.d.ts +47 -0
- package/lib/molecule3d/ui/sceneDrawer.d.ts.map +1 -0
- package/lib/molecule3d/ui/sceneDrawer.js +103 -0
- package/lib/molecule3d/ui/sceneDrawer.js.map +1 -0
- package/lib/molecule3d/ui/useMoleculeScene.d.ts +2 -1
- package/lib/molecule3d/ui/useMoleculeScene.d.ts.map +1 -1
- package/lib/molecule3d/ui/useMoleculeScene.js +13 -22
- package/lib/molecule3d/ui/useMoleculeScene.js.map +1 -1
- package/lib/molecule3d/ui/useSharedCamera.d.ts +1 -3
- package/lib/molecule3d/ui/useSharedCamera.d.ts.map +1 -1
- package/lib/molecule3d/ui/useSharedCamera.js.map +1 -1
- 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/molecule3d/core/highlight.ts +2 -8
- package/src/molecule3d/core/index.ts +1 -0
- package/src/molecule3d/core/measurement.ts +47 -0
- package/src/molecule3d/ui/drawScene.ts +13 -2
- package/src/molecule3d/ui/moleculeViewer3DProps.ts +3 -1
- package/src/molecule3d/ui/sceneDrawer.ts +132 -0
- package/src/molecule3d/ui/useMoleculeScene.ts +16 -26
- package/src/molecule3d/ui/useSharedCamera.ts +1 -3
- 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
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { ShareParamCodec } from './params.ts';
|
|
2
|
+
|
|
3
|
+
/** What {@link keySetParam} is configured with. */
|
|
4
|
+
export interface KeySetParamOptions<Key extends string> {
|
|
5
|
+
/**
|
|
6
|
+
* The word an empty set is written as. An empty value is dropped from the
|
|
7
|
+
* address, so a link switching every key off has to say so in a word.
|
|
8
|
+
* @default 'none'
|
|
9
|
+
*/
|
|
10
|
+
none?: string;
|
|
11
|
+
/**
|
|
12
|
+
* The set a link carrying nothing stands for, and the one deleted rather
|
|
13
|
+
* than written. `null` means the link then says nothing about the keys, so
|
|
14
|
+
* whatever the visitor stored is left alone.
|
|
15
|
+
* @default null
|
|
16
|
+
*/
|
|
17
|
+
default?: readonly Key[] | null;
|
|
18
|
+
/**
|
|
19
|
+
* The set deleted from a link rather than written, when it is not the
|
|
20
|
+
* default — a site whose absent parameter leaves the visitor's stored keys
|
|
21
|
+
* alone, and whose own initial keys must not grow a plain visit a query
|
|
22
|
+
* string.
|
|
23
|
+
* @default the default set
|
|
24
|
+
*/
|
|
25
|
+
omitted?: readonly Key[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* A set of keys a link switches on — the layers a figure draws,
|
|
30
|
+
* `?flags=breakdown,working` — written comma separated, in the order the keys
|
|
31
|
+
* are listed, so one selection always produces one link.
|
|
32
|
+
*
|
|
33
|
+
* A key the tool does not list is dropped rather than refused, so a link
|
|
34
|
+
* written before a key was renamed still opens; the word for nothing, `none`
|
|
35
|
+
* by default, reads as the empty set, and an absent or empty parameter as the
|
|
36
|
+
* default.
|
|
37
|
+
* @param keys - Every key the tool understands, in the order links write them.
|
|
38
|
+
* @param options - The word for nothing, and the default set.
|
|
39
|
+
* @returns The codec.
|
|
40
|
+
*/
|
|
41
|
+
export function keySetParam<Key extends string>(
|
|
42
|
+
keys: readonly Key[],
|
|
43
|
+
options: KeySetParamOptions<Key> = {},
|
|
44
|
+
): ShareParamCodec<ReadonlySet<Key> | null> {
|
|
45
|
+
const none = options.none ?? 'none';
|
|
46
|
+
const fallback =
|
|
47
|
+
options.default === undefined || options.default === null
|
|
48
|
+
? null
|
|
49
|
+
: orderKeys(new Set<string>(options.default), keys);
|
|
50
|
+
const omitted =
|
|
51
|
+
options.omitted === undefined
|
|
52
|
+
? fallback
|
|
53
|
+
: orderKeys(new Set<string>(options.omitted), keys);
|
|
54
|
+
const omittedText = omitted === null ? null : writeKeys(omitted, keys);
|
|
55
|
+
return {
|
|
56
|
+
parse(raw) {
|
|
57
|
+
if (raw === null || raw.trim() === '') return fallback;
|
|
58
|
+
if (raw.trim() === none) return new Set<Key>();
|
|
59
|
+
const asked = new Set<string>();
|
|
60
|
+
for (const name of raw.split(',')) asked.add(name.trim());
|
|
61
|
+
return orderKeys(asked, keys);
|
|
62
|
+
},
|
|
63
|
+
serialize(value) {
|
|
64
|
+
if (value === null) return null;
|
|
65
|
+
const text = writeKeys(value, keys);
|
|
66
|
+
if (text === omittedText) return null;
|
|
67
|
+
return text === '' ? none : text;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function orderKeys<Key extends string>(
|
|
73
|
+
asked: ReadonlySet<string>,
|
|
74
|
+
keys: readonly Key[],
|
|
75
|
+
): ReadonlySet<Key> {
|
|
76
|
+
const ordered = new Set<Key>();
|
|
77
|
+
for (const key of keys) {
|
|
78
|
+
if (asked.has(key)) ordered.add(key);
|
|
79
|
+
}
|
|
80
|
+
return ordered;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function writeKeys<Key extends string>(
|
|
84
|
+
value: ReadonlySet<Key>,
|
|
85
|
+
keys: readonly Key[],
|
|
86
|
+
): string {
|
|
87
|
+
const on: string[] = [];
|
|
88
|
+
for (const key of keys) {
|
|
89
|
+
if (value.has(key)) on.push(key);
|
|
90
|
+
}
|
|
91
|
+
return on.join(',');
|
|
92
|
+
}
|
|
@@ -65,4 +65,12 @@ export interface ShareVocabulary<
|
|
|
65
65
|
* @default {}
|
|
66
66
|
*/
|
|
67
67
|
params?: Codecs;
|
|
68
|
+
/**
|
|
69
|
+
* The `?hide=` keys older links dropped the chrome with, before the site
|
|
70
|
+
* spoke `?embed` — `header`, `menu`. A link naming one still opens framed,
|
|
71
|
+
* because course pages built then must keep opening bare; the key is no part
|
|
72
|
+
* of the page, so it is never offered and never written back.
|
|
73
|
+
* @default []
|
|
74
|
+
*/
|
|
75
|
+
legacyEmbedParts?: readonly string[];
|
|
68
76
|
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { ReactElement } from 'react';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
|
|
4
|
+
import { siteById } from '../../ecosystem/core/lookup.ts';
|
|
5
|
+
import type { SiteId } from '../../ecosystem/core/sites.ts';
|
|
6
|
+
import { useChromeT } from '../../i18n/ui/useT.ts';
|
|
7
|
+
import type { ShareParamCodecs } from '../../share/core/index.ts';
|
|
8
|
+
import type { ShareButtonVariant } from '../../share/ui/ShareButton.tsx';
|
|
9
|
+
import { ShareButton } from '../../share/ui/ShareButton.tsx';
|
|
10
|
+
import type { ShareDialogProps } from '../../share/ui/ShareDialog.tsx';
|
|
11
|
+
import { ShareDialog } from '../../share/ui/ShareDialog.tsx';
|
|
12
|
+
|
|
13
|
+
/** What {@link ShareControl} needs: the dialog's props, and the button's. */
|
|
14
|
+
export interface ShareControlProps<
|
|
15
|
+
Codecs extends ShareParamCodecs = Record<string, never>,
|
|
16
|
+
> extends Omit<
|
|
17
|
+
ShareDialogProps<Codecs>,
|
|
18
|
+
'isOpen' | 'onClose' | 'search' | 'frameTitle'
|
|
19
|
+
> {
|
|
20
|
+
/**
|
|
21
|
+
* The site the page belongs to, which names the frame `<host> — <title>`.
|
|
22
|
+
* @default undefined — the frame is named by the title alone
|
|
23
|
+
*/
|
|
24
|
+
siteId?: SiteId;
|
|
25
|
+
/**
|
|
26
|
+
* What a screen reader announces the frame as.
|
|
27
|
+
* @default `<host> — <title>` with a `siteId`, the title without one
|
|
28
|
+
*/
|
|
29
|
+
frameTitle?: string;
|
|
30
|
+
/**
|
|
31
|
+
* The address as it stands, so the tool's inputs travel with the link. A
|
|
32
|
+
* function is called only while the dialog is open, so a value that is costly
|
|
33
|
+
* to write — a pinned preference, a list of molecules — is written when a
|
|
34
|
+
* link is asked for and not on every render of the header.
|
|
35
|
+
* @default the query string of the page
|
|
36
|
+
*/
|
|
37
|
+
search?: string | (() => string | undefined);
|
|
38
|
+
/**
|
|
39
|
+
* Whether the button keeps only its icon, in a bar that has run out of room.
|
|
40
|
+
* @default false
|
|
41
|
+
*/
|
|
42
|
+
compact?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Text of the button.
|
|
45
|
+
* @default the chrome's own word for it, in the language of the page
|
|
46
|
+
*/
|
|
47
|
+
buttonLabel?: string;
|
|
48
|
+
/**
|
|
49
|
+
* What the pointer is told over the button.
|
|
50
|
+
* @default the chrome's own line, in the language of the page
|
|
51
|
+
*/
|
|
52
|
+
buttonTitle?: string;
|
|
53
|
+
/**
|
|
54
|
+
* A plain bar entry, or a Blueprint button for a toolbar made of them.
|
|
55
|
+
* @default 'nav-link'
|
|
56
|
+
*/
|
|
57
|
+
variant?: ShareButtonVariant;
|
|
58
|
+
/**
|
|
59
|
+
* Whether the dialog is open, for a page that has to know — to compute what
|
|
60
|
+
* the dialog shows only while it is. Pass it with `onOpenChange`.
|
|
61
|
+
* @default undefined — the control keeps the state itself
|
|
62
|
+
*/
|
|
63
|
+
open?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Called when the dialog opens or closes.
|
|
66
|
+
* @default undefined
|
|
67
|
+
*/
|
|
68
|
+
onOpenChange?: (open: boolean) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Called as the button is pressed, before the dialog opens — to write the
|
|
71
|
+
* page's state into the address the link is read from.
|
|
72
|
+
* @default undefined
|
|
73
|
+
*/
|
|
74
|
+
onOpen?: () => void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The Share entry of a header and the dialog it opens: the page handed out as a
|
|
79
|
+
* link, or as the iframe that frames it in somebody else's site.
|
|
80
|
+
*
|
|
81
|
+
* It is what a header's `share` prop takes, so the entry lands after Contact on
|
|
82
|
+
* every site. Everything the dialog can be told is passed straight through; the
|
|
83
|
+
* control adds the open state, and the frame's name read off the site.
|
|
84
|
+
* @param props - The dialog's props, and how the button is dressed.
|
|
85
|
+
* @returns The button, and the dialog while it is open.
|
|
86
|
+
*/
|
|
87
|
+
export function ShareControl<
|
|
88
|
+
Codecs extends ShareParamCodecs = Record<string, never>,
|
|
89
|
+
>(props: ShareControlProps<Codecs>): ReactElement {
|
|
90
|
+
const {
|
|
91
|
+
siteId,
|
|
92
|
+
frameTitle,
|
|
93
|
+
search,
|
|
94
|
+
compact = false,
|
|
95
|
+
buttonLabel,
|
|
96
|
+
buttonTitle,
|
|
97
|
+
variant,
|
|
98
|
+
open,
|
|
99
|
+
onOpenChange,
|
|
100
|
+
onOpen,
|
|
101
|
+
title,
|
|
102
|
+
...dialog
|
|
103
|
+
} = props;
|
|
104
|
+
const t = useChromeT();
|
|
105
|
+
const [ownOpen, setOwnOpen] = useState(false);
|
|
106
|
+
const isOpen = open ?? ownOpen;
|
|
107
|
+
|
|
108
|
+
function setOpen(next: boolean): void {
|
|
109
|
+
if (open === undefined) setOwnOpen(next);
|
|
110
|
+
onOpenChange?.(next);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const host = siteId === undefined ? undefined : siteById(siteId).host;
|
|
114
|
+
const named =
|
|
115
|
+
frameTitle ??
|
|
116
|
+
(host === undefined ? title : t('share.frameTitle', { site: host, title }));
|
|
117
|
+
|
|
118
|
+
return (
|
|
119
|
+
<>
|
|
120
|
+
<ShareButton
|
|
121
|
+
compact={compact}
|
|
122
|
+
label={buttonLabel}
|
|
123
|
+
title={buttonTitle}
|
|
124
|
+
variant={variant}
|
|
125
|
+
onClick={() => {
|
|
126
|
+
onOpen?.();
|
|
127
|
+
setOpen(true);
|
|
128
|
+
}}
|
|
129
|
+
/>
|
|
130
|
+
<ShareDialog<Codecs>
|
|
131
|
+
{...dialog}
|
|
132
|
+
title={title}
|
|
133
|
+
frameTitle={named}
|
|
134
|
+
search={
|
|
135
|
+
isOpen && typeof search === 'function' ? search() : searchText(search)
|
|
136
|
+
}
|
|
137
|
+
isOpen={isOpen}
|
|
138
|
+
onClose={() => {
|
|
139
|
+
setOpen(false);
|
|
140
|
+
}}
|
|
141
|
+
/>
|
|
142
|
+
</>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function searchText(
|
|
147
|
+
search: string | (() => string | undefined) | undefined,
|
|
148
|
+
): string | undefined {
|
|
149
|
+
return typeof search === 'string' ? search : undefined;
|
|
150
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The body of `SiteShell`, once the route has been read: the theme, the bar,
|
|
3
|
+
* the page and the footer.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { ReactElement, ReactNode } from 'react';
|
|
7
|
+
import { isValidElement } from 'react';
|
|
8
|
+
|
|
9
|
+
import { AboutPage } from '../../about/ui/AboutPage.tsx';
|
|
10
|
+
import { AboutButton } from '../../chrome/ui/AboutButton.tsx';
|
|
11
|
+
import { SiteFooter } from '../../chrome/ui/SiteFooter.tsx';
|
|
12
|
+
import { SiteHeader } from '../../chrome/ui/SiteHeader.tsx';
|
|
13
|
+
import { useCompactHeader } from '../../chrome/ui/useCompactHeader.ts';
|
|
14
|
+
import { CiteButton } from '../../citation/ui/CiteButton.tsx';
|
|
15
|
+
import { EcosystemButton } from '../../ecosystem/ui/EcosystemButton.tsx';
|
|
16
|
+
import { SiteTheme } from '../../ecosystem/ui/SiteTheme.tsx';
|
|
17
|
+
import type { ShareParamCodecs } from '../../share/core/index.ts';
|
|
18
|
+
import { HiddenPartsProvider } from '../../share/ui/HiddenPartsProvider.tsx';
|
|
19
|
+
import { joinClassNames } from '../../shared/ui/joinClassNames.ts';
|
|
20
|
+
|
|
21
|
+
import { ShareControl } from './ShareControl.tsx';
|
|
22
|
+
import type { ShellSlot, SiteShellProps } from './SiteShell.tsx';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Draw the shell.
|
|
26
|
+
* @param props - The shell's props, the route already read.
|
|
27
|
+
* @returns The page in its chrome.
|
|
28
|
+
*/
|
|
29
|
+
export function ShellFrame<Codecs extends ShareParamCodecs, Tab extends string>(
|
|
30
|
+
props: SiteShellProps<Codecs, Tab>,
|
|
31
|
+
): ReactElement {
|
|
32
|
+
const {
|
|
33
|
+
siteId,
|
|
34
|
+
site,
|
|
35
|
+
mark,
|
|
36
|
+
markSize,
|
|
37
|
+
nav,
|
|
38
|
+
activeId,
|
|
39
|
+
homeHref,
|
|
40
|
+
onHome,
|
|
41
|
+
renderNavItem,
|
|
42
|
+
navPart = 'tabs',
|
|
43
|
+
width = 'page',
|
|
44
|
+
embedded = false,
|
|
45
|
+
hidden,
|
|
46
|
+
about = false,
|
|
47
|
+
contact,
|
|
48
|
+
belowHeader,
|
|
49
|
+
mainClassName,
|
|
50
|
+
mainTestId,
|
|
51
|
+
footer = {},
|
|
52
|
+
account,
|
|
53
|
+
children,
|
|
54
|
+
} = props;
|
|
55
|
+
const compact = useCompactHeader();
|
|
56
|
+
const footerSiteId = footer === false ? undefined : (footer.siteId ?? siteId);
|
|
57
|
+
const aboutOnShow = about !== false && about.active === true;
|
|
58
|
+
|
|
59
|
+
const page = (
|
|
60
|
+
<>
|
|
61
|
+
{siteId === undefined ? (
|
|
62
|
+
<SiteTheme site={site} />
|
|
63
|
+
) : (
|
|
64
|
+
<SiteTheme siteId={siteId} />
|
|
65
|
+
)}
|
|
66
|
+
<div className="site-shell">
|
|
67
|
+
<SiteHeader
|
|
68
|
+
siteId={siteId}
|
|
69
|
+
site={site}
|
|
70
|
+
mark={mark}
|
|
71
|
+
markSize={markSize}
|
|
72
|
+
embedded={embedded}
|
|
73
|
+
width={width}
|
|
74
|
+
nav={hidden?.includes(navPart) ? [] : nav}
|
|
75
|
+
activeId={aboutOnShow ? (about.id ?? 'about') : activeId}
|
|
76
|
+
homeHref={homeHref}
|
|
77
|
+
onHome={onHome}
|
|
78
|
+
renderNavItem={renderNavItem}
|
|
79
|
+
contact={contact}
|
|
80
|
+
actions={<ShellActions {...props} compact={compact} />}
|
|
81
|
+
share={<ShellShare {...props} compact={compact} />}
|
|
82
|
+
account={account}
|
|
83
|
+
/>
|
|
84
|
+
{embedded ? null : belowHeader}
|
|
85
|
+
<main
|
|
86
|
+
className={joinClassNames(
|
|
87
|
+
'site-shell__main',
|
|
88
|
+
width === 'full' ? 'site-shell__main--full' : undefined,
|
|
89
|
+
embedded ? 'site-shell__main--embedded' : undefined,
|
|
90
|
+
mainClassName,
|
|
91
|
+
)}
|
|
92
|
+
data-testid={mainTestId}
|
|
93
|
+
>
|
|
94
|
+
{aboutOnShow
|
|
95
|
+
? (about.page ?? <AboutPage content={about.content} />)
|
|
96
|
+
: children}
|
|
97
|
+
</main>
|
|
98
|
+
</div>
|
|
99
|
+
{footer === false || footerSiteId === undefined ? null : (
|
|
100
|
+
<SiteFooter
|
|
101
|
+
siteId={footerSiteId}
|
|
102
|
+
embedded={embedded}
|
|
103
|
+
width={width}
|
|
104
|
+
heading={footer.heading}
|
|
105
|
+
layout={footer.layout}
|
|
106
|
+
>
|
|
107
|
+
{footer.note === undefined ? null : (
|
|
108
|
+
<p className="app-footer__note">{footer.note}</p>
|
|
109
|
+
)}
|
|
110
|
+
{footer.children}
|
|
111
|
+
</SiteFooter>
|
|
112
|
+
)}
|
|
113
|
+
</>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
return hidden === undefined ? (
|
|
117
|
+
page
|
|
118
|
+
) : (
|
|
119
|
+
<HiddenPartsProvider hidden={hidden}>{page}</HiddenPartsProvider>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
type ActionProps<
|
|
124
|
+
Codecs extends ShareParamCodecs,
|
|
125
|
+
Tab extends string,
|
|
126
|
+
> = SiteShellProps<Codecs, Tab> & { compact: boolean };
|
|
127
|
+
|
|
128
|
+
function ShellActions<Codecs extends ShareParamCodecs, Tab extends string>(
|
|
129
|
+
props: ActionProps<Codecs, Tab>,
|
|
130
|
+
): ReactNode {
|
|
131
|
+
const {
|
|
132
|
+
siteId,
|
|
133
|
+
about = false,
|
|
134
|
+
cite,
|
|
135
|
+
ecosystem = true,
|
|
136
|
+
actionsAfterAbout,
|
|
137
|
+
actionsAfterCite,
|
|
138
|
+
actions,
|
|
139
|
+
language,
|
|
140
|
+
compact,
|
|
141
|
+
} = props;
|
|
142
|
+
const works = cite ?? (about === false ? [] : (about.content.cite ?? []));
|
|
143
|
+
return (
|
|
144
|
+
<>
|
|
145
|
+
{about === false ? null : (
|
|
146
|
+
<AboutButton
|
|
147
|
+
id={about.id}
|
|
148
|
+
href={about.href ?? '/about'}
|
|
149
|
+
active={about.active}
|
|
150
|
+
onSelect={about.onSelect}
|
|
151
|
+
label={about.label}
|
|
152
|
+
title={about.title}
|
|
153
|
+
/>
|
|
154
|
+
)}
|
|
155
|
+
{fill(actionsAfterAbout, compact)}
|
|
156
|
+
{works === false || works.length === 0 ? null : (
|
|
157
|
+
<CiteButton works={works} compact={compact} />
|
|
158
|
+
)}
|
|
159
|
+
{fill(actionsAfterCite, compact)}
|
|
160
|
+
{ecosystem ? (
|
|
161
|
+
<EcosystemButton currentSiteId={siteId} compact={compact} />
|
|
162
|
+
) : null}
|
|
163
|
+
{fill(actions, compact)}
|
|
164
|
+
{fill(language, compact)}
|
|
165
|
+
</>
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function ShellShare<Codecs extends ShareParamCodecs, Tab extends string>(
|
|
170
|
+
props: ActionProps<Codecs, Tab>,
|
|
171
|
+
): ReactNode {
|
|
172
|
+
const { share, siteId, compact } = props;
|
|
173
|
+
if (share === undefined) return null;
|
|
174
|
+
if (isValidElement(share)) return share;
|
|
175
|
+
return <ShareControl<Codecs> siteId={siteId} compact={compact} {...share} />;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function fill(slot: ShellSlot, compact: boolean): ReactNode {
|
|
179
|
+
return typeof slot === 'function' ? slot(compact) : slot;
|
|
180
|
+
}
|