@omnitron-dev/prism 0.3.1 → 0.3.3
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 +68 -2
- package/THIRD-PARTY-NOTICES.txt +26 -0
- package/dist/accessibility/index.js +2 -0
- package/dist/accessibility/index.js.map +1 -1
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/blocks/auth-block/guards.d.ts +3 -2
- package/dist/blocks/auth-block/guards.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/dashboard-block.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/types.d.ts +4 -2
- package/dist/blocks/dashboard-block/types.d.ts.map +1 -1
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts +2 -2
- package/dist/blocks/dashboard-block/use-dashboard-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/data-grid-block.d.ts.map +1 -1
- package/dist/blocks/data-grid-block/types.d.ts +3 -0
- package/dist/blocks/data-grid-block/types.d.ts.map +1 -1
- package/dist/blocks/index.js +80 -255
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-2AB7VGPW.js +447 -0
- package/dist/chunk-2AB7VGPW.js.map +1 -0
- package/dist/{chunk-LOY2NPCO.js → chunk-2E67PQ4T.js} +3 -3
- package/dist/{chunk-LOY2NPCO.js.map → chunk-2E67PQ4T.js.map} +1 -1
- package/dist/chunk-2KG2NI73.js +84 -0
- package/dist/chunk-2KG2NI73.js.map +1 -0
- package/dist/chunk-2UYRW6X3.js +44 -0
- package/dist/chunk-2UYRW6X3.js.map +1 -0
- package/dist/chunk-36C5H56C.js +208 -0
- package/dist/chunk-36C5H56C.js.map +1 -0
- package/dist/chunk-36FOXX25.js +73 -0
- package/dist/chunk-36FOXX25.js.map +1 -0
- package/dist/{chunk-52PQL67Q.js → chunk-3VSM7NZG.js} +18 -15
- package/dist/chunk-3VSM7NZG.js.map +1 -0
- package/dist/{chunk-GUGTDURV.js → chunk-4B2LTPK2.js} +2 -2
- package/dist/{chunk-GUGTDURV.js.map → chunk-4B2LTPK2.js.map} +1 -1
- package/dist/chunk-4HUGZJKU.js +108 -0
- package/dist/chunk-4HUGZJKU.js.map +1 -0
- package/dist/{chunk-PXXPLHIY.js → chunk-4Q5L7LDG.js} +3 -3
- package/dist/{chunk-PXXPLHIY.js.map → chunk-4Q5L7LDG.js.map} +1 -1
- package/dist/{chunk-BRDWQVRT.js → chunk-4R7EZ7GQ.js} +3 -2
- package/dist/chunk-4R7EZ7GQ.js.map +1 -0
- package/dist/chunk-6IANOSMD.js +185 -0
- package/dist/chunk-6IANOSMD.js.map +1 -0
- package/dist/{chunk-YHE7HXSG.js → chunk-7ATBURW2.js} +3 -3
- package/dist/{chunk-YHE7HXSG.js.map → chunk-7ATBURW2.js.map} +1 -1
- package/dist/{chunk-7G5D5PTC.js → chunk-AATAOOSF.js} +4 -4
- package/dist/{chunk-7G5D5PTC.js.map → chunk-AATAOOSF.js.map} +1 -1
- package/dist/chunk-AKLRKCYH.js +128 -0
- package/dist/chunk-AKLRKCYH.js.map +1 -0
- package/dist/chunk-CT46KJOR.js +133 -0
- package/dist/chunk-CT46KJOR.js.map +1 -0
- package/dist/{chunk-LSPFFEJT.js → chunk-D4GFAJAZ.js} +298 -3900
- package/dist/chunk-D4GFAJAZ.js.map +1 -0
- package/dist/{chunk-BJE2AKD4.js → chunk-D5J3KW6Q.js} +3 -2
- package/dist/chunk-D5J3KW6Q.js.map +1 -0
- package/dist/chunk-DEPJRTVT.js +3 -0
- package/dist/{chunk-FU52GL2E.js.map → chunk-DEPJRTVT.js.map} +1 -1
- package/dist/{chunk-472SOF76.js → chunk-DHTYHUYI.js} +85 -107
- package/dist/chunk-DHTYHUYI.js.map +1 -0
- package/dist/{chunk-FF5RF32O.js → chunk-E7WM2RXA.js} +3 -2
- package/dist/chunk-E7WM2RXA.js.map +1 -0
- package/dist/chunk-F6RZ7LW6.js +1271 -0
- package/dist/chunk-F6RZ7LW6.js.map +1 -0
- package/dist/chunk-FOGY3HA4.js +217 -0
- package/dist/chunk-FOGY3HA4.js.map +1 -0
- package/dist/chunk-G2GANYMW.js +139 -0
- package/dist/chunk-G2GANYMW.js.map +1 -0
- package/dist/chunk-I6DILPFE.js +293 -0
- package/dist/chunk-I6DILPFE.js.map +1 -0
- package/dist/{chunk-HOXFSQUV.js → chunk-IRYU3NTG.js} +2 -2
- package/dist/{chunk-HOXFSQUV.js.map → chunk-IRYU3NTG.js.map} +1 -1
- package/dist/chunk-JTIUGPW5.js +284 -0
- package/dist/chunk-JTIUGPW5.js.map +1 -0
- package/dist/{chunk-GUFHFEPZ.js → chunk-JZBSPDED.js} +2 -2
- package/dist/{chunk-GUFHFEPZ.js.map → chunk-JZBSPDED.js.map} +1 -1
- package/dist/{chunk-PFT2BNYO.js → chunk-KPY7TA4D.js} +5 -5
- package/dist/{chunk-PFT2BNYO.js.map → chunk-KPY7TA4D.js.map} +1 -1
- package/dist/{chunk-GMIE6III.js → chunk-LFWKGNCX.js} +50 -623
- package/dist/chunk-LFWKGNCX.js.map +1 -0
- package/dist/chunk-LH4ZZZYB.js +37 -0
- package/dist/chunk-LH4ZZZYB.js.map +1 -0
- package/dist/chunk-NFJ7CPG3.js +13 -0
- package/dist/chunk-NFJ7CPG3.js.map +1 -0
- package/dist/chunk-NFPOIHD4.js +3 -0
- package/dist/{chunk-JSQTYDPG.js.map → chunk-NFPOIHD4.js.map} +1 -1
- package/dist/{chunk-XIXSSI3B.js → chunk-NJM5AVBM.js} +3 -2
- package/dist/chunk-NJM5AVBM.js.map +1 -0
- package/dist/{chunk-4Z5DE5GK.js → chunk-NSNM53WI.js} +133 -115
- package/dist/chunk-NSNM53WI.js.map +1 -0
- package/dist/chunk-NTREGTG7.js +31 -0
- package/dist/chunk-NTREGTG7.js.map +1 -0
- package/dist/{chunk-ADG4HZEP.js → chunk-OKJA6SJM.js} +4 -4
- package/dist/chunk-OKJA6SJM.js.map +1 -0
- package/dist/{chunk-SU3LVQ7N.js → chunk-Q6JDNFSG.js} +11 -226
- package/dist/chunk-Q6JDNFSG.js.map +1 -0
- package/dist/chunk-RPOGINR5.js +115 -0
- package/dist/chunk-RPOGINR5.js.map +1 -0
- package/dist/{chunk-KQ67XB6T.js → chunk-RSWVYIXK.js} +151 -114
- package/dist/chunk-RSWVYIXK.js.map +1 -0
- package/dist/chunk-SSEHL5VP.js +110 -0
- package/dist/chunk-SSEHL5VP.js.map +1 -0
- package/dist/chunk-TEIGUOWN.js +523 -0
- package/dist/chunk-TEIGUOWN.js.map +1 -0
- package/dist/{chunk-AYYFMTMI.js → chunk-TJ7DHXUX.js} +2 -2
- package/dist/{chunk-AYYFMTMI.js.map → chunk-TJ7DHXUX.js.map} +1 -1
- package/dist/{chunk-75FQ5IW3.js → chunk-TZHWYT34.js} +3 -3
- package/dist/{chunk-75FQ5IW3.js.map → chunk-TZHWYT34.js.map} +1 -1
- package/dist/chunk-TZWHELY4.js +45 -0
- package/dist/chunk-TZWHELY4.js.map +1 -0
- package/dist/{chunk-OKTLA23Q.js → chunk-UEINJFLS.js} +6 -6
- package/dist/chunk-UEINJFLS.js.map +1 -0
- package/dist/chunk-URFQX3I6.js +129 -0
- package/dist/chunk-URFQX3I6.js.map +1 -0
- package/dist/chunk-VG6FOMOH.js +187 -0
- package/dist/chunk-VG6FOMOH.js.map +1 -0
- package/dist/{chunk-PGHEP4JD.js → chunk-VQVVHMPG.js} +3 -3
- package/dist/{chunk-PGHEP4JD.js.map → chunk-VQVVHMPG.js.map} +1 -1
- package/dist/{chunk-DRFNMZLG.js → chunk-VUKOT432.js} +3 -2
- package/dist/chunk-VUKOT432.js.map +1 -0
- package/dist/chunk-WD4N72DL.js +315 -0
- package/dist/chunk-WD4N72DL.js.map +1 -0
- package/dist/chunk-XBYMG4QK.js +119 -0
- package/dist/chunk-XBYMG4QK.js.map +1 -0
- package/dist/chunk-YHM6GIHV.js +3 -0
- package/dist/chunk-YHM6GIHV.js.map +1 -0
- package/dist/{chunk-SNZK5X6F.js → chunk-Z2AN43YU.js} +4 -2
- package/dist/chunk-Z2AN43YU.js.map +1 -0
- package/dist/chunk-ZNWHMQRM.js +171 -0
- package/dist/chunk-ZNWHMQRM.js.map +1 -0
- package/dist/{chunk-YSIG2XYH.js → chunk-ZRJYQN6Y.js} +2 -2
- package/dist/{chunk-YSIG2XYH.js.map → chunk-ZRJYQN6Y.js.map} +1 -1
- package/dist/{chunk-AD4W7HYC.js → chunk-ZYI3MHLE.js} +3 -2
- package/dist/chunk-ZYI3MHLE.js.map +1 -0
- package/dist/cli/index.js +59 -421
- package/dist/cli/index.js.map +1 -1
- package/dist/components/admin-filters/admin-data-table.d.ts +7 -1
- package/dist/components/admin-filters/admin-data-table.d.ts.map +1 -1
- package/dist/components/admin-filters/filter-toolbar.d.ts.map +1 -1
- package/dist/components/admin-filters/index.js +8 -0
- package/dist/components/admin-filters/index.js.map +1 -0
- package/dist/components/alert/alert.d.ts.map +1 -1
- package/dist/components/alert/index.js +5 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/animate/index.js +5 -0
- package/dist/components/animate/index.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/components/breadcrumbs/index.js +4 -0
- package/dist/components/breadcrumbs/index.js.map +1 -0
- package/dist/components/card/index.js +4 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/chart/chart.d.ts.map +1 -1
- package/dist/components/chart/index.css +52 -0
- package/dist/components/chart/index.css.map +1 -0
- package/dist/components/chart/index.js +5 -0
- package/dist/components/chart/index.js.map +1 -0
- package/dist/components/chart/types.d.ts +3 -1
- package/dist/components/chart/types.d.ts.map +1 -1
- package/dist/components/chart/use-chart.d.ts.map +1 -1
- package/dist/components/command-palette/command-palette.d.ts +3 -1
- package/dist/components/command-palette/command-palette.d.ts.map +1 -1
- package/dist/components/command-palette/index.js +4 -0
- package/dist/components/command-palette/index.js.map +1 -0
- package/dist/components/confirm-dialog/index.js +4 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/date-input/date-input.d.ts +1 -0
- package/dist/components/date-input/date-input.d.ts.map +1 -1
- package/dist/components/date-input/index.d.ts +0 -1
- package/dist/components/date-input/index.d.ts.map +1 -1
- package/dist/components/doc-layout/index.js +5 -4
- package/dist/components/doc-layout/index.js.map +1 -1
- package/dist/components/editor/index.js +4 -3
- package/dist/components/editor/index.js.map +1 -1
- package/dist/components/emoji-picker/index.js +2 -1
- package/dist/components/emoji-picker/index.js.map +1 -1
- package/dist/components/empty-content/empty-content.d.ts.map +1 -1
- package/dist/components/empty-content/index.js +4 -0
- package/dist/components/empty-content/index.js.map +1 -0
- package/dist/components/error-boundary/index.js +6 -0
- package/dist/components/error-boundary/index.js.map +1 -0
- package/dist/components/index.css +13 -10
- package/dist/components/index.css.map +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +47 -21
- package/dist/components/index.js.map +1 -1
- package/dist/components/knowledge-graph/edge-labels.d.ts.map +1 -1
- package/dist/components/knowledge-graph/index.js +18 -16
- package/dist/components/knowledge-graph/index.js.map +1 -1
- package/dist/components/label/index.js +5 -0
- package/dist/components/label/index.js.map +1 -0
- package/dist/components/label/label.d.ts.map +1 -1
- package/dist/components/loading-screen/index.js +4 -0
- package/dist/components/loading-screen/index.js.map +1 -0
- package/dist/components/map/MapPointPicker.d.ts.map +1 -1
- package/dist/components/map/index.js +2 -1
- package/dist/components/map/index.js.map +1 -1
- package/dist/components/navigation-progress/index.js +4 -0
- package/dist/components/navigation-progress/index.js.map +1 -0
- package/dist/components/page-content/index.js +4 -0
- package/dist/components/page-content/index.js.map +1 -0
- package/dist/components/popover/index.js +4 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/research/diagram.d.ts.map +1 -1
- package/dist/components/research/index.js +6 -4
- package/dist/components/research/index.js.map +1 -1
- package/dist/components/research-editor/extensions.d.ts +1 -1
- package/dist/components/research-editor/index.js +11 -10
- package/dist/components/research-editor/index.js.map +1 -1
- package/dist/components/research-editor/math-navigation.d.ts +2 -2
- package/dist/components/research-editor/math-navigation.d.ts.map +1 -1
- package/dist/components/scroll-to-top/index.js +4 -0
- package/dist/components/scroll-to-top/index.js.map +1 -0
- package/dist/components/search-input/index.js +7 -0
- package/dist/components/search-input/index.js.map +1 -0
- package/dist/components/search-input/search-input.d.ts +3 -1
- package/dist/components/search-input/search-input.d.ts.map +1 -1
- package/dist/components/skeleton/index.js +4 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/snackbar/index.js +6 -0
- package/dist/components/snackbar/index.js.map +1 -0
- package/dist/components/stepper/index.js +4 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/table/index.d.ts +1 -0
- package/dist/components/table/index.d.ts.map +1 -1
- package/dist/components/table/index.js +5 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/table/table-viewport.d.ts +13 -0
- package/dist/components/table/table-viewport.d.ts.map +1 -0
- package/dist/components/table/table.d.ts +3 -1
- package/dist/components/table/table.d.ts.map +1 -1
- package/dist/components/tabs/index.js +6 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +12 -1
- package/dist/components/tabs/tabs.d.ts.map +1 -1
- package/dist/core/index.js +12 -10
- package/dist/core/index.js.map +1 -1
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -1
- package/dist/hooks/index.js +14 -12
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-config-from-query.d.ts +2 -0
- package/dist/hooks/use-config-from-query.d.ts.map +1 -1
- package/dist/hooks/use-image-dimensions.d.ts.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -1
- package/dist/hooks/use-scroll-position.d.ts.map +1 -1
- package/dist/hooks/use-window-size.d.ts.map +1 -1
- package/dist/icons/context.d.ts.map +1 -1
- package/dist/icons/index.js +3 -2
- package/dist/icons/index.js.map +1 -1
- package/dist/index.css +13 -10
- package/dist/index.css.map +1 -1
- package/dist/index.js +57 -31
- package/dist/index.js.map +1 -1
- package/dist/internal/research-parser.js +3 -0
- package/dist/internal/research-parser.js.map +1 -0
- package/dist/layouts/core/header-section.d.ts +1 -0
- package/dist/layouts/core/header-section.d.ts.map +1 -1
- package/dist/layouts/dashboard/layout.d.ts +3 -1
- package/dist/layouts/dashboard/layout.d.ts.map +1 -1
- package/dist/layouts/dashboard/sidenav.d.ts.map +1 -1
- package/dist/layouts/index.js +9 -8
- package/dist/layouts/index.js.map +1 -1
- package/dist/netron/index.js +2 -1
- package/dist/netron/index.js.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/state/create-store.d.ts.map +1 -1
- package/dist/state/index.js +3 -2
- package/dist/state/index.js.map +1 -1
- package/dist/state/settings-version.d.ts.map +1 -1
- package/dist/theme/components/Chip.d.ts.map +1 -1
- package/dist/theme/components/Dialog.d.ts.map +1 -1
- package/dist/theme/components/TextField.d.ts.map +1 -1
- package/dist/theme/components/index.d.ts.map +1 -1
- package/dist/theme/components/theme-utils.d.ts +2 -2
- package/dist/theme/components/theme-utils.d.ts.map +1 -1
- package/dist/theme/index.js +8 -6
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/palette/overrides.d.ts +1 -0
- package/dist/theme/palette/overrides.d.ts.map +1 -1
- package/dist/theme/semantic-surface.d.ts +8 -0
- package/dist/theme/semantic-surface.d.ts.map +1 -0
- package/dist/types/index.js +2 -2
- package/dist/ui/index.js +6 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/async-lock.d.ts.map +1 -1
- package/package.json +143 -37
- package/dist/chunk-472SOF76.js.map +0 -1
- package/dist/chunk-4Z5DE5GK.js.map +0 -1
- package/dist/chunk-52PQL67Q.js.map +0 -1
- package/dist/chunk-AD4W7HYC.js.map +0 -1
- package/dist/chunk-ADG4HZEP.js.map +0 -1
- package/dist/chunk-BJE2AKD4.js.map +0 -1
- package/dist/chunk-BRDWQVRT.js.map +0 -1
- package/dist/chunk-DRFNMZLG.js.map +0 -1
- package/dist/chunk-FF5RF32O.js.map +0 -1
- package/dist/chunk-FU52GL2E.js +0 -3
- package/dist/chunk-GMIE6III.js.map +0 -1
- package/dist/chunk-JSQTYDPG.js +0 -3
- package/dist/chunk-KQ67XB6T.js.map +0 -1
- package/dist/chunk-LSPFFEJT.js.map +0 -1
- package/dist/chunk-OKTLA23Q.js.map +0 -1
- package/dist/chunk-SNZK5X6F.js.map +0 -1
- package/dist/chunk-SU3LVQ7N.js.map +0 -1
- package/dist/chunk-XIXSSI3B.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/map/Map.tsx","../src/components/map/MapMarker.tsx","../src/components/map/coordinates.ts","../src/components/map/MapPointPicker.tsx","../src/components/map/MapCoverageLayer.tsx","../src/components/map/MapPlaceSearch.tsx"],"names":["ReactMapGL","useTheme","useState","jsxs","Fragment","jsx","useEffect","Box","Marker","Alert","defaults","useRef","useCallback","CircularProgress","Button"],"mappings":"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","file":"chunk-3VSM7NZG.js","sourcesContent":["'use client';\n\nimport './map.css';\nimport { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { Alert, Box, LinearProgress } from '@mui/material';\nimport { useTheme } from '@mui/material/styles';\nimport { Map as ReactMapGL, NavigationControl, ScaleControl } from 'react-map-gl/maplibre';\nimport type { MapProps as EngineProps, MapRef } from 'react-map-gl/maplibre';\nimport { addProtocol } from 'maplibre-gl';\nimport type { StyleSpecification } from 'maplibre-gl';\nimport { Protocol } from 'pmtiles';\n\n// Register before creating a map; style loading can begin before parent effects.\n// PMTiles maintains its own bounded archive/directory cache. Map instances do not\n// remove this shared protocol when another instance might still be using it.\nconst protocol = new Protocol();\naddProtocol('pmtiles', protocol.tile);\n\nexport interface MapViewport {\n longitude: number;\n latitude: number;\n zoom: number;\n bearing?: number;\n pitch?: number;\n}\nexport type MapStyle = string | StyleSpecification;\nexport interface MapMessages {\n label: string;\n missingStyle: string;\n loading: string;\n error: string;\n}\nconst messages: MapMessages = {\n label: 'Interactive map',\n missingStyle: 'A map source has not been configured.',\n loading: 'Loading map',\n error: 'Some map data could not be loaded. Check the connection or map source.',\n};\nexport interface MapProps extends Omit<EngineProps, 'mapStyle' | 'style' | 'children'> {\n /** Explicit style, or legacy host-injected window.__MAP_STYLE_URL__. No public fallback. */\n styleUrl?: MapStyle;\n /** Separate complete styles; selecting a theme does not rewrite provider layers. */\n styles?: { light: MapStyle; dark: MapStyle };\n viewport?: Partial<MapViewport>;\n initialViewport?: Partial<MapViewport>;\n onViewportChange?: (next: MapViewport) => void;\n showNavigation?: boolean;\n showScale?: boolean;\n showAttribution?: boolean;\n style?: CSSProperties;\n messages?: Partial<MapMessages>;\n children?: ReactNode;\n}\nconst world: MapViewport = { longitude: 0, latitude: 0, zoom: 1, bearing: 0, pitch: 0 };\n\n/** Provider-neutral MapLibre surface. Sources/layers/events remain fully typed. */\nexport const Map = forwardRef<MapRef, MapProps>(function MapView(\n {\n styleUrl,\n styles,\n viewport,\n initialViewport,\n onViewportChange,\n showNavigation = true,\n showScale = true,\n showAttribution = true,\n style,\n messages: overrides,\n children,\n onMove,\n onLoad,\n onError,\n cooperativeGestures = true,\n ...engine\n },\n forwardedRef\n) {\n const theme = useTheme();\n const copy = { ...messages, ...overrides };\n const legacyStyle =\n typeof window !== 'undefined' ? (window as Window & { __MAP_STYLE_URL__?: string }).__MAP_STYLE_URL__ : undefined;\n const mapStyle = styleUrl ?? styles?.[theme.palette.mode] ?? legacyStyle;\n const initial = { ...world, ...initialViewport };\n const host = useRef<HTMLDivElement>(null);\n const map = useRef<MapRef | null>(null);\n const [readyStyle, setReadyStyle] = useState<MapStyle>();\n const [error, setError] = useState(false);\n const setMap = useCallback(\n (value: MapRef | null) => {\n map.current = value;\n if (typeof forwardedRef === 'function') forwardedRef(value);\n else if (forwardedRef) forwardedRef.current = value;\n },\n [forwardedRef]\n );\n useEffect(() => {\n if (!host.current || typeof ResizeObserver === 'undefined') return undefined;\n const observer = new ResizeObserver(() => map.current?.resize());\n observer.observe(host.current);\n return () => observer.disconnect();\n }, []);\n useEffect(() => setError(false), [mapStyle]);\n return (\n <Box\n ref={host}\n role=\"region\"\n aria-label={copy.label}\n style={style}\n sx={{\n width: '100%',\n height: 400,\n position: 'relative',\n borderRadius: 1,\n overflow: 'hidden',\n bgcolor: 'background.paper',\n '& .maplibregl-ctrl-group, & .maplibregl-popup-content': {\n bgcolor: 'background.paper',\n color: 'text.primary',\n boxShadow: theme.shadows[2],\n borderRadius: 1,\n border: 1,\n borderColor: 'divider',\n },\n '& .maplibregl-ctrl-group button': { color: 'text.primary', borderColor: 'divider' },\n '& .maplibregl-ctrl-icon': { filter: theme.palette.mode === 'dark' ? 'invert(1)' : 'none' },\n '& .maplibregl-ctrl-attrib': { bgcolor: 'background.paper', color: 'text.secondary' },\n '& .maplibregl-ctrl-attrib a': { color: 'inherit' },\n '& .maplibregl-ctrl-scale': {\n bgcolor: 'background.paper',\n color: 'text.primary',\n borderColor: 'text.secondary',\n },\n '& .maplibregl-ctrl button:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }}\n >\n {!mapStyle ? (\n <Alert severity=\"info\" sx={{ m: 2 }}>\n {copy.missingStyle}\n </Alert>\n ) : (\n <>\n <ReactMapGL\n {...engine}\n ref={setMap}\n mapStyle={mapStyle}\n cooperativeGestures={cooperativeGestures}\n {...(viewport\n ? { ...initial, ...viewport }\n : {\n initialViewState: initial,\n ...(engine.initialViewState ? { initialViewState: engine.initialViewState } : {}),\n })}\n onMove={(event) => {\n onViewportChange?.(event.viewState);\n onMove?.(event);\n }}\n onLoad={(event) => {\n setReadyStyle(mapStyle);\n onLoad?.(event);\n }}\n onIdle={(event) => {\n setReadyStyle(mapStyle);\n engine.onIdle?.(event);\n }}\n onError={(event) => {\n setError(true);\n onError?.(event);\n }}\n attributionControl={showAttribution ? (engine.attributionControl ?? {}) : false}\n style={{ width: '100%', height: '100%' }}\n >\n {showNavigation && <NavigationControl position=\"top-right\" />}\n {showScale && <ScaleControl position=\"bottom-left\" />}\n {children}\n </ReactMapGL>\n {readyStyle !== mapStyle && !error && (\n <LinearProgress aria-label={copy.loading} sx={{ position: 'absolute', top: 0, left: 0, right: 0 }} />\n )}\n {error && (\n <Alert\n severity=\"warning\"\n onClose={() => setError(false)}\n sx={{ position: 'absolute', left: 8, right: 8, top: 8 }}\n >\n {copy.error}\n </Alert>\n )}\n </>\n )}\n </Box>\n );\n});\n","'use client';\n\n/**\n * MapMarker Component\n *\n * Decorative marker pinned at `[longitude, latitude]` on the\n * parent `<Map>`. Renders a HugeIcons-styled pin by default;\n * pass `children` for a fully custom marker DOM. Optional\n * `popup` opens a Popup on click.\n *\n * @module components/map\n */\n\nimport { useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Marker, Popup } from 'react-map-gl/maplibre';\nimport { useTheme } from '@mui/material/styles';\n\nexport interface MapMarkerProps {\n longitude: number;\n latitude: number;\n /** Marker fill colour. Defaults to theme primary. */\n color?: string;\n /** Custom DOM (overrides the default pin icon). */\n children?: ReactNode;\n /** Popup body shown on click. */\n popup?: ReactNode;\n /** Anchor side. Defaults to bottom (pin tip at coordinate). */\n anchor?: 'center' | 'top' | 'bottom' | 'left' | 'right';\n /** Click-through handler. */\n onClick?: () => void;\n}\n\nexport function MapMarker({ longitude, latitude, color, children, popup, anchor = 'bottom', onClick }: MapMarkerProps) {\n const theme = useTheme();\n const [open, setOpen] = useState(false);\n const fill = color ?? theme.palette.primary.main;\n\n const handleClick = (e: { originalEvent?: { stopPropagation?: () => void } }) => {\n e.originalEvent?.stopPropagation?.();\n if (popup) setOpen((v) => !v);\n onClick?.();\n };\n\n return (\n <>\n <Marker longitude={longitude} latitude={latitude} anchor={anchor} onClick={handleClick}>\n {children ?? (\n <svg width=\"24\" height=\"32\" viewBox=\"0 0 24 32\" aria-hidden style={{ display: 'block' }}>\n <path d=\"M12 0C5.4 0 0 5.4 0 12c0 9 12 20 12 20s12-11 12-20C24 5.4 18.6 0 12 0z\" fill={fill} />\n <circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"#fff\" />\n </svg>\n )}\n </Marker>\n {popup && open && (\n <Popup\n longitude={longitude}\n latitude={latitude}\n anchor=\"top\"\n offset={[0, -32]}\n closeOnClick={false}\n onClose={() => setOpen(false)}\n >\n {popup}\n </Popup>\n )}\n </>\n );\n}\n","/** WGS84 geographic coordinates. Camera constraints never alter the stored point. */\nexport interface MapPointPickerValue {\n lng: number;\n lat: number;\n}\nexport function isMapPoint(value: MapPointPickerValue): boolean {\n return (\n Number.isFinite(value.lng) &&\n Number.isFinite(value.lat) &&\n value.lng >= -180 &&\n value.lng <= 180 &&\n value.lat >= -90 &&\n value.lat <= 90\n );\n}\n/** MapLibre may emit a longitude in another world copy after panning. */\nexport function normalizeMapPoint(lng: number, lat: number): MapPointPickerValue | null {\n if (!Number.isFinite(lng) || !Number.isFinite(lat) || Math.abs(lat) > 90) return null;\n return { lng: lng >= -180 && lng <= 180 ? lng : ((((lng + 180) % 360) + 360) % 360) - 180, lat };\n}\nexport function mapCameraLatitude(latitude: number): number {\n return Math.max(-85.0511287798066, Math.min(85.0511287798066, latitude));\n}\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport { Marker } from 'react-map-gl/maplibre';\nimport { Stack, Paper, Typography, CircularProgress, Box, Button, Alert } from '@mui/material';\nimport { Map } from './Map.js';\nimport type { MapProps, MapViewport } from './Map.js';\nimport { isMapPoint, normalizeMapPoint, mapCameraLatitude } from './coordinates.js';\nimport type { MapPointPickerValue } from './coordinates.js';\nexport type { MapPointPickerValue } from './coordinates.js';\n\nexport interface MapPointPickerLabels {\n placeholder: string;\n coordinates: string;\n place: string;\n loading: string;\n unknown: string;\n chooseCenter: string;\n clear: string;\n marker: string;\n}\nconst defaults: MapPointPickerLabels = {\n placeholder: 'Choose a point on the map, or move the map and select its centre.',\n coordinates: 'Coordinates',\n place: 'Place',\n loading: 'Finding place…',\n unknown: 'No place name for this point',\n chooseCenter: 'Select map centre',\n clear: 'Clear selection',\n marker: 'Selected point',\n};\nexport interface MapPointPickerProps {\n value: MapPointPickerValue | null;\n onChange: (next: MapPointPickerValue) => void;\n onClear?: () => void;\n initialViewport?: Partial<MapViewport>;\n /** Minimum zoom when receiving a newly selected point. */\n selectionZoom?: number;\n styleUrl?: MapProps['styleUrl'];\n height?: number;\n geocodeResult?: ReactNode;\n geocodeLoading?: boolean;\n geocodeError?: ReactNode;\n placeholder?: string;\n labels?: Partial<MapPointPickerLabels>;\n readOnly?: boolean;\n showDetails?: boolean;\n /** MapLibre sources, overlays and interaction configuration are reusable. */\n mapProps?: Omit<MapProps, 'viewport' | 'onViewportChange' | 'onClick' | 'styleUrl' | 'initialViewport'>;\n}\nexport function MapPointPicker({\n value,\n onChange,\n onClear,\n initialViewport,\n selectionZoom = 10,\n styleUrl,\n height = 480,\n geocodeResult,\n geocodeLoading = false,\n geocodeError,\n placeholder,\n labels,\n readOnly = false,\n showDetails = true,\n mapProps,\n}: MapPointPickerProps) {\n const copy = { ...defaults, ...labels, ...(placeholder ? { placeholder } : {}) };\n const valid = value && isMapPoint(value) ? value : null;\n const [camera, setCamera] = useState<MapViewport>(() => ({\n longitude: valid?.lng ?? 0,\n latitude: valid ? mapCameraLatitude(valid.lat) : 0,\n zoom: valid ? 10 : 1,\n ...initialViewport,\n }));\n const [loaded, setLoaded] = useState(false);\n const longitude = valid?.lng;\n const latitude = valid?.lat;\n useEffect(() => {\n if (longitude !== undefined && latitude !== undefined)\n setCamera((old) => ({\n ...old,\n longitude,\n latitude: mapCameraLatitude(latitude),\n zoom: Math.max(old.zoom, selectionZoom),\n }));\n }, [longitude, latitude, selectionZoom]);\n function choose(lng: number, lat: number) {\n const point = normalizeMapPoint(lng, lat);\n if (point && !readOnly) onChange(point);\n }\n return (\n <Stack sx={{ gap: 2, width: '100%' }}>\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: showDetails ? { xs: '1fr', md: 'minmax(0,1fr) 280px' } : '1fr',\n gap: 2,\n }}\n >\n <Map\n {...mapProps}\n styleUrl={styleUrl}\n viewport={camera}\n onViewportChange={setCamera}\n cursor={readOnly ? 'grab' : 'crosshair'}\n onClick={(event) => choose(event.lngLat.lng, event.lngLat.lat)}\n onLoad={(event) => {\n setLoaded(true);\n mapProps?.onLoad?.(event);\n }}\n style={{ ...mapProps?.style, height }}\n >\n {mapProps?.children}\n {valid && (\n <Marker\n longitude={valid.lng}\n latitude={valid.lat}\n anchor=\"center\"\n draggable={!readOnly}\n onDragEnd={(event) => choose(event.lngLat.lng, event.lngLat.lat)}\n >\n <Box\n role=\"img\"\n aria-label={copy.marker}\n sx={{\n width: 22,\n height: 22,\n borderRadius: '50%',\n bgcolor: 'primary.main',\n border: '3px solid',\n borderColor: 'background.paper',\n boxShadow: 2,\n }}\n />\n </Marker>\n )}\n </Map>\n {showDetails && (\n <Paper variant=\"outlined\" sx={{ p: 2, minWidth: 0 }}>\n {valid ? (\n <Stack sx={{ gap: 1.5 }}>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {copy.coordinates}\n </Typography>\n <Typography variant=\"body2\" sx={{ fontVariantNumeric: 'tabular-nums' }}>\n {valid.lat.toFixed(5)}, {valid.lng.toFixed(5)}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {copy.place}\n </Typography>\n {geocodeLoading ? (\n <Stack direction=\"row\" sx={{ gap: 1, alignItems: 'center' }} role=\"status\">\n <CircularProgress size={16} />\n <Typography variant=\"body2\">{copy.loading}</Typography>\n </Stack>\n ) : geocodeError ? (\n <Alert severity=\"warning\">{geocodeError}</Alert>\n ) : (\n <Box sx={{ overflowWrap: 'anywhere' }}>\n {geocodeResult ?? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {copy.unknown}\n </Typography>\n )}\n </Box>\n )}\n </Stack>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {copy.placeholder}\n </Typography>\n )}\n </Paper>\n )}\n </Box>\n {!readOnly && (\n <Stack direction=\"row\" sx={{ gap: 1, flexWrap: 'wrap' }}>\n <Button type=\"button\" disabled={!loaded} onClick={() => choose(camera.longitude, camera.latitude)}>\n {copy.chooseCenter}\n </Button>\n {onClear && (\n <Button type=\"button\" disabled={!value} onClick={onClear}>\n {copy.clear}\n </Button>\n )}\n </Stack>\n )}\n </Stack>\n );\n}\n","'use client';\n\n/**\n * MapCoverageLayer Component\n *\n * Renders an array of typed points on the parent `<Map>` as\n * colour-coded circles. Designed for \"coverage\" use cases\n * (dead-drops by status, pickup points by enabled/disabled,\n * shops by tier). Uses a single MapLibre symbol layer driven by\n * an in-memory GeoJSON source so rendering scales to a few\n * thousand points without DOM thrash.\n *\n * For < ~200 points, prefer composing `<MapMarker>` directly —\n * it gives you click + popup affordances per marker. This layer\n * is for the \"show me the whole network\" view.\n *\n * @module components/map\n */\n\nimport { useMemo } from 'react';\nimport { Source, Layer } from 'react-map-gl/maplibre';\nimport { useTheme } from '@mui/material/styles';\n\nexport interface CoveragePoint {\n /** Unique id within the layer; used as feature id for clicks. */\n id: string;\n longitude: number;\n latitude: number;\n /** Free-form bucket; the layer maps it to a colour via\n * the `colorByStatus` prop. Default mapping covers the\n * generic 'active'/'pending'/'expired'/'disabled' buckets. */\n status?: string;\n /** Optional label shown next to the point when zoomed in. */\n label?: string;\n}\n\nexport interface MapCoverageLayerProps {\n id: string;\n points: CoveragePoint[];\n /** Map of status → colour. Override to project custom domain\n * semantics. Default uses theme palette. */\n colorByStatus?: Record<string, string>;\n /** Marker radius in pixels (zoom-stable). Default 6. */\n radius?: number;\n /** Show label text alongside each marker (zoom 12+). */\n showLabels?: boolean;\n}\n\nexport function MapCoverageLayer({ id, points, colorByStatus, radius = 6, showLabels = false }: MapCoverageLayerProps) {\n const theme = useTheme();\n\n const palette = useMemo<Record<string, string>>(\n () => ({\n active: theme.palette.success.main,\n pending: theme.palette.warning.main,\n expired: theme.palette.text.disabled,\n disabled: theme.palette.text.disabled,\n retired: theme.palette.text.disabled,\n ...(colorByStatus ?? {}),\n }),\n [theme, colorByStatus]\n );\n\n const geojson = useMemo(\n () => ({\n type: 'FeatureCollection' as const,\n features: points.map((p) => ({\n type: 'Feature' as const,\n id: p.id,\n geometry: {\n type: 'Point' as const,\n coordinates: [p.longitude, p.latitude],\n },\n properties: {\n status: p.status ?? 'active',\n label: p.label ?? '',\n color: palette[p.status ?? 'active'] ?? theme.palette.primary.main,\n },\n })),\n }),\n [points, palette, theme]\n );\n\n return (\n <Source id={id} type=\"geojson\" data={geojson}>\n <Layer\n id={`${id}-circles`}\n type=\"circle\"\n paint={{\n 'circle-radius': radius,\n 'circle-color': ['get', 'color'],\n 'circle-stroke-color': theme.palette.background.paper,\n 'circle-stroke-width': 1.5,\n }}\n />\n {showLabels && (\n <Layer\n id={`${id}-labels`}\n type=\"symbol\"\n minzoom={11}\n layout={{\n 'text-field': ['get', 'label'],\n 'text-size': 11,\n 'text-offset': [0, 1.2],\n 'text-anchor': 'top',\n 'text-font': ['Noto Sans Regular'],\n }}\n paint={{\n 'text-color': theme.palette.text.primary,\n 'text-halo-color': theme.palette.background.paper,\n 'text-halo-width': 1,\n }}\n />\n )}\n </Source>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Alert, Autocomplete, Box, Button, CircularProgress, TextField } from '@mui/material';\nimport { isMapPoint } from './coordinates.js';\nimport type { MapPointPickerValue } from './coordinates.js';\n\nexport interface MapPlace {\n /** Provider-stable identifier, qualified with the provider name. */\n id: string;\n label: string;\n point: MapPointPickerValue;\n}\nexport interface MapPlaceSearchLabels {\n label: string;\n search: string;\n clear: string;\n loading: string;\n empty: string;\n hint: string;\n error: string;\n}\nconst defaults: MapPlaceSearchLabels = {\n label: 'Find a place',\n search: 'Search',\n clear: 'Clear',\n loading: 'Searching…',\n empty: 'No places found',\n hint: 'Enter a place and search',\n error: 'Place search is unavailable. Try again.',\n};\nexport interface MapPlaceSearchProps<T extends MapPlace = MapPlace> {\n /** Supply a Netron/API adapter. Prism makes no requests to a provider itself. */\n search: (query: string, options: { signal: AbortSignal; limit: number }) => Promise<readonly T[]>;\n onSelect: (place: T) => void;\n /** Explicit submission works with every geocoder; autocomplete must be provider-supported. */\n mode?: 'submit' | 'autocomplete';\n debounceMs?: number;\n minLength?: number;\n limit?: number;\n disabled?: boolean;\n labels?: Partial<MapPlaceSearchLabels>;\n}\nexport function MapPlaceSearch<T extends MapPlace>({\n search,\n onSelect,\n mode = 'submit',\n debounceMs = 300,\n minLength = 2,\n limit = 8,\n disabled = false,\n labels,\n}: MapPlaceSearchProps<T>) {\n const copy = { ...defaults, ...labels };\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<T[]>([]);\n const [selected, setSelected] = useState<T | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(false);\n const [searched, setSearched] = useState(false);\n const [open, setOpen] = useState(false);\n const generation = useRef(0),\n active = useRef<AbortController | null>(null);\n const highlighted = useRef<T | null>(null);\n const provider = useRef(search);\n provider.current = search;\n const validQuery = query.trim().length >= minLength && query.length <= 200;\n const cancel = useCallback(() => {\n generation.current++;\n active.current?.abort();\n active.current = null;\n }, []);\n const run = useCallback(async () => {\n cancel();\n if (!validQuery || disabled) return;\n const id = generation.current;\n const controller = new AbortController();\n active.current = controller;\n setLoading(true);\n setError(false);\n setSearched(true);\n setOpen(true);\n try {\n const values = await provider.current(query.trim(), { signal: controller.signal, limit });\n if (id !== generation.current || controller.signal.aborted) return;\n if (!Array.isArray(values) || values.some((v) => !v || !v.id || !v.label || !v.point || !isMapPoint(v.point)))\n throw new Error('Invalid geocoder response');\n const ids = new Set<string>();\n setResults(\n values\n .filter((v) => {\n if (ids.has(v.id)) return false;\n ids.add(v.id);\n return true;\n })\n .slice(0, limit)\n );\n } catch {\n if (id === generation.current && !controller.signal.aborted) {\n setError(true);\n setResults([]);\n setOpen(false);\n }\n } finally {\n if (id === generation.current) setLoading(false);\n }\n }, [cancel, validQuery, disabled, query, limit]);\n useEffect(() => {\n if (mode !== 'autocomplete' || !validQuery || disabled || selected) return undefined;\n const timer = setTimeout(() => void run(), debounceMs);\n return () => clearTimeout(timer);\n }, [run, validQuery, mode, debounceMs, disabled, selected]);\n useEffect(() => {\n if (disabled) {\n cancel();\n setLoading(false);\n setOpen(false);\n }\n }, [disabled, cancel]);\n useEffect(() => () => cancel(), [cancel]);\n function input(value: string) {\n cancel();\n setQuery(value);\n setSelected(null);\n setResults([]);\n setError(false);\n setLoading(false);\n setSearched(false);\n highlighted.current = null;\n }\n return (\n <Box sx={{ display: 'grid', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'flex-start', gap: 1 }}>\n <Autocomplete<T, false, false, false>\n sx={{ flex: 1, minWidth: 0 }}\n disabled={disabled}\n options={results}\n value={selected}\n inputValue={query}\n open={open}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n onInputChange={(_, value, reason) => {\n if (reason === 'input' || reason === 'clear') input(value);\n }}\n onChange={(_, place) => {\n if (place) {\n cancel();\n setLoading(false);\n setSelected(place);\n setQuery(place.label);\n setOpen(false);\n onSelect(place);\n }\n }}\n onHighlightChange={(_, option) => {\n highlighted.current = option;\n }}\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return;\n event.preventDefault();\n if (!highlighted.current) {\n (event as typeof event & { defaultMuiPrevented: boolean }).defaultMuiPrevented = true;\n void run();\n }\n }}\n getOptionLabel={(place) => place.label}\n getOptionKey={(place) => place.id}\n isOptionEqualToValue={(a, b) => a.id === b.id}\n filterOptions={(options) => options}\n loading={loading}\n loadingText={copy.loading}\n clearText={copy.clear}\n noOptionsText={searched ? copy.empty : copy.hint}\n forcePopupIcon={false}\n renderInput={(params) => (\n <TextField\n {...params}\n label={copy.label}\n slotProps={{\n ...params.slotProps,\n htmlInput: { ...params.slotProps.htmlInput, maxLength: 200 },\n input: {\n ...params.slotProps.input,\n endAdornment: (\n <>\n {loading && <CircularProgress color=\"inherit\" size={18} />}\n {params.slotProps.input.endAdornment}\n </>\n ),\n },\n }}\n />\n )}\n />\n {mode === 'submit' && (\n <Button\n type=\"button\"\n variant=\"outlined\"\n disabled={disabled || loading || !validQuery}\n onClick={() => void run()}\n sx={{ minHeight: 40 }}\n >\n {copy.search}\n </Button>\n )}\n </Box>\n {error && <Alert severity=\"warning\">{copy.error}</Alert>}\n </Box>\n );\n}\n"]}
|
|
@@ -822,5 +822,5 @@ function TipTapRenderer({
|
|
|
822
822
|
}
|
|
823
823
|
|
|
824
824
|
export { ContentRoot, TipTapRenderer, contentClasses, registerTipTapNode };
|
|
825
|
-
//# sourceMappingURL=chunk-
|
|
826
|
-
//# sourceMappingURL=chunk-
|
|
825
|
+
//# sourceMappingURL=chunk-4B2LTPK2.js.map
|
|
826
|
+
//# sourceMappingURL=chunk-4B2LTPK2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/content-renderer/classes.ts","../src/components/content-renderer/styles.ts","../src/components/tiptap-renderer/tiptap-renderer.tsx"],"names":[],"mappings":"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","file":"chunk-GUGTDURV.js","sourcesContent":["// ---------------------------------------------------------------------------\n// CSS class names for content renderer components\n// ---------------------------------------------------------------------------\n\nconst PREFIX = 'prism-content';\n\nexport const contentClasses = {\n root: `${PREFIX}__root`,\n compact: `${PREFIX}__compact`,\n tiptap: `${PREFIX}__tiptap`,\n markdown: `${PREFIX}__markdown`,\n image: `${PREFIX}__image`,\n link: `${PREFIX}__link`,\n checkbox: `${PREFIX}__checkbox`,\n codeBlock: `${PREFIX}__code-block`,\n codeBlockTitle: `${PREFIX}__code-block-title`,\n codeBlockCopy: `${PREFIX}__code-block-copy`,\n codeBlockHighlight: `${PREFIX}__code-block-highlight`,\n codeInline: `${PREFIX}__code-inline`,\n spoiler: `${PREFIX}__spoiler`,\n admonition: `${PREFIX}__admonition`,\n admonitionNote: `${PREFIX}__admonition-note`,\n admonitionTip: `${PREFIX}__admonition-tip`,\n admonitionWarning: `${PREFIX}__admonition-warning`,\n admonitionDanger: `${PREFIX}__admonition-danger`,\n admonitionInfo: `${PREFIX}__admonition-info`,\n admonitionCaution: `${PREFIX}__admonition-caution`,\n admonitionTitle: `${PREFIX}__admonition-title`,\n admonitionContent: `${PREFIX}__admonition-content`,\n tabs: `${PREFIX}__tabs`,\n tabsHeader: `${PREFIX}__tabs-header`,\n tabsTab: `${PREFIX}__tabs-tab`,\n tabsTabActive: `${PREFIX}__tabs-tab-active`,\n tabsPanel: `${PREFIX}__tabs-panel`,\n figure: `${PREFIX}__figure`,\n figcaption: `${PREFIX}__figcaption`,\n kbd: `${PREFIX}__kbd`,\n};\n","'use client';\n\nimport { styled, alpha } from '@mui/material/styles';\nimport { contentClasses } from './classes.js';\n\n// ---------------------------------------------------------------------------\n// Shared content root — applies rich typography and element styling.\n// Used by both TipTapRenderer (for TipTap JSON) and Markdown (for MD strings).\n// ---------------------------------------------------------------------------\n\nconst MARGIN = '0.75em';\nconst CODE_FONT = \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', Menlo, Monaco, 'Courier New', monospace\";\n\nexport const ContentRoot = styled('div')(({ theme }) => ({\n // General spacing between adjacent elements\n '> * + *': {\n marginTop: 0,\n marginBottom: MARGIN,\n },\n\n // ─── Headings ───────────────────────────────────────────────\n '& h1, & h2, & h3, & h4, & h5, & h6': {\n scrollMarginTop: 100, // Account for sticky header on anchor jump\n },\n // Heading margins. Top margins are applied via the adjacent-sibling\n // combinator (`* + hN`) rather than a `:first-child` reset: a heading\n // takes its top margin ONLY when it follows another element, so a\n // heading at the very top of its container carries none. This is\n // SSR-safe (avoids Emotion's `:first-child` warning) and yields the\n // same result the previous `& > :first-child:is(h1,h2,h3)` reset did.\n h1: { ...theme.typography.h1, marginTop: 0, marginBottom: 12 },\n h2: { ...theme.typography.h2, marginTop: 0, marginBottom: 12 },\n h3: { ...theme.typography.h3, marginTop: 0, marginBottom: 8 },\n h4: { ...theme.typography.h4, marginTop: 0, marginBottom: 8 },\n h5: { ...theme.typography.h5, marginTop: 0, marginBottom: 8 },\n h6: { ...theme.typography.h6, marginTop: 0, marginBottom: 8 },\n '& * + h1, & * + h2': { marginTop: 40 },\n '& * + h3': { marginTop: 32 },\n '& * + h4, & * + h5, & * + h6': { marginTop: 24 },\n\n // ─── Paragraph ──────────────────────────────────────────────\n p: {\n ...theme.typography.body1,\n marginBottom: '1.25rem',\n lineHeight: 1.8,\n },\n\n // ─── Horizontal rule ───────────────────────────────────────\n hr: {\n flexShrink: 0,\n borderWidth: 0,\n margin: '2em 0',\n borderStyle: 'solid',\n borderBottomWidth: 'thin',\n borderColor: theme.palette.divider,\n },\n\n // ─── Images ─────────────────────────────────────────────────\n [`& .${contentClasses.image}`]: {\n width: '100%',\n height: 'auto',\n maxWidth: '100%',\n margin: 'auto auto 1.25em',\n borderRadius: Number(theme.shape.borderRadius) * 2,\n },\n // Plain img fallback\n '& img:not([class])': {\n maxWidth: '100%',\n height: 'auto',\n borderRadius: Number(theme.shape.borderRadius) * 2,\n marginBottom: '1.25em',\n },\n\n // ─── Links ──────────────────────────────────────────────────\n '& a': {\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n\n // ─── Lists ──────────────────────────────────────────────────\n '& ul': {\n listStyleType: 'disc',\n },\n '& ul, & ol': {\n paddingLeft: 24,\n marginBottom: '1.25rem',\n '& > li': {\n lineHeight: 2,\n // Markdown wraps every list-item body in a `<p>`. With\n // `display: inline-block` (the previous setting), Chromium\n // refuses to render the `<li>`'s ::marker at all — the\n // disc/decimal vanishes and the list looks like a series of\n // bullet-less paragraphs. `display: inline` collapses the\n // `<p>` into inline flow so the marker positions normally;\n // `margin: 0` keeps the LI height tight against the marker\n // baseline. Multi-paragraph list items (rare here, but\n // possible) still render — subsequent `<p>` siblings get a\n // line break by the inline-flow rules.\n '& > p': {\n margin: 0,\n display: 'inline',\n },\n },\n },\n // Nested lists\n '& ul ul, & ol ol, & ul ol, & ol ul': {\n marginBottom: 0,\n },\n\n // ─── Task list (TipTap taskList / GFM checkboxes) ──────────\n '& ul[data-type=\"taskList\"]': {\n listStyle: 'none',\n paddingLeft: 4,\n '& li': {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n '& > label': {\n marginTop: 4,\n },\n },\n },\n\n // ─── Blockquote ─────────────────────────────────────────────\n '& blockquote': {\n lineHeight: 1.6,\n fontSize: '1em',\n margin: '24px 0',\n position: 'relative',\n padding: theme.spacing(2.5, 3, 2.5, 7),\n color: theme.palette.text.secondary,\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n '& p': {\n margin: 0,\n fontSize: 'inherit',\n },\n '& p + p': {\n marginTop: 8,\n },\n '&::before': {\n left: 16,\n top: 8,\n display: 'block',\n fontSize: '2.5em',\n content: '\"\\\\201C\"',\n position: 'absolute',\n color: alpha(theme.palette.primary.main, 0.3),\n lineHeight: 1,\n },\n },\n\n // ─── Inline code ────────────────────────────────────────────\n [`& .${contentClasses.codeInline}`]: {\n padding: theme.spacing(0.25, 0.75),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n borderRadius: Number(theme.shape.borderRadius) / 2,\n backgroundColor: alpha(theme.palette.grey[500], 0.2),\n fontFamily: CODE_FONT,\n },\n // Fallback for code not inside pre\n '& :not(pre) > code:not([class])': {\n padding: theme.spacing(0.25, 0.75),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n borderRadius: Number(theme.shape.borderRadius) / 2,\n backgroundColor: alpha(theme.palette.grey[500], 0.2),\n fontFamily: CODE_FONT,\n },\n\n // ─── Code block ─────────────────────────────────────────────\n [`& .${contentClasses.codeBlock}`]: {\n position: 'relative',\n marginBottom: '1.25rem',\n '& pre': {\n overflowX: 'auto',\n padding: theme.spacing(3),\n color: theme.palette.common.white,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n fontFamily: CODE_FONT,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1.7,\n backgroundColor: theme.palette.grey[900],\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: alpha(theme.palette.grey[800], 0.9),\n }),\n '& code': {\n fontSize: 'inherit',\n fontFamily: 'inherit',\n backgroundColor: 'transparent',\n padding: 0,\n borderRadius: 0,\n color: 'inherit',\n },\n },\n },\n // Fallback for bare pre blocks\n '& pre:not([class])': {\n overflowX: 'auto',\n padding: theme.spacing(3),\n color: theme.palette.common.white,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n fontFamily: CODE_FONT,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1.7,\n backgroundColor: theme.palette.grey[900],\n marginBottom: '1.25rem',\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: alpha(theme.palette.grey[800], 0.9),\n }),\n '& code': {\n fontSize: 'inherit',\n fontFamily: 'inherit',\n backgroundColor: 'transparent',\n padding: 0,\n color: 'inherit',\n },\n },\n\n // ─── Table ──────────────────────────────────────────────────\n '& table': {\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: theme.typography.body2.fontSize,\n border: `1px solid ${theme.palette.divider}`,\n marginBottom: '1.25rem',\n '& th, & td': {\n padding: theme.spacing(1, 1.5),\n border: `1px solid ${theme.palette.divider}`,\n verticalAlign: 'top',\n },\n '& th': {\n fontWeight: 700,\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n // Zebra rows. `:nth-of-type` (not `:nth-child`) is SSR-safe and\n // exactly equivalent here — a `<tbody>` contains only `<tr>`\n // children, so type-position and child-position coincide.\n '& tbody tr:nth-of-type(odd)': {\n backgroundColor: alpha(theme.palette.grey[500], 0.04),\n },\n },\n\n // ─── Checkbox (GFM task lists) ──────────────────────────────\n [`& .${contentClasses.checkbox}`]: {\n cursor: 'pointer',\n position: 'relative',\n '&:before': {\n content: '\"\"',\n top: -2,\n left: -2,\n width: 17,\n height: 17,\n borderRadius: 3,\n position: 'absolute',\n backgroundColor: theme.palette.grey[300],\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: theme.palette.grey[700],\n }),\n },\n '&:checked': {\n '&:before': {\n backgroundColor: theme.palette.primary.main,\n },\n '&:after': {\n top: 1,\n left: 5,\n width: 4,\n height: 9,\n content: '\"\"',\n position: 'absolute',\n borderStyle: 'solid',\n transform: 'rotate(45deg)',\n borderWidth: '0 2px 2px 0',\n borderColor: theme.palette.common.white,\n },\n },\n },\n\n // ─── Details / Summary ──────────────────────────────────────\n '& details': {\n marginBottom: '1rem',\n '& summary': {\n cursor: 'pointer',\n fontWeight: 600,\n marginBottom: 8,\n },\n },\n\n // ─── Definition list ────────────────────────────────────────\n '& dl': {\n marginBottom: '1.25rem',\n '& dt': {\n fontWeight: 700,\n marginTop: 12,\n },\n '& dd': {\n marginLeft: 24,\n marginBottom: 4,\n },\n },\n\n // ─── Kbd (keyboard shortcut) ────────────────────────────────\n '& kbd': {\n display: 'inline-block',\n padding: theme.spacing(0.25, 0.5),\n fontSize: '0.8em',\n fontFamily: CODE_FONT,\n borderRadius: 4,\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: `0 1px 0 ${alpha(theme.palette.grey[500], 0.1)}`,\n backgroundColor: alpha(theme.palette.grey[500], 0.06),\n },\n\n // ─── Mark (highlight) ──────────────────────────────────────\n '& mark': {\n padding: theme.spacing(0, 0.5),\n borderRadius: 2,\n backgroundColor: alpha(theme.palette.warning.main, 0.3),\n },\n\n // ─── Sup / Sub ──────────────────────────────────────────────\n '& sup, & sub': {\n fontSize: '0.75em',\n },\n\n // ─── Spoiler (||hidden text||) ────────────────────────────\n [`& .${contentClasses.spoiler}`]: {\n backgroundColor: theme.palette.text.primary,\n color: theme.palette.text.primary,\n borderRadius: 4,\n padding: theme.spacing(0, 0.5),\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n userSelect: 'none',\n '&:hover, &[data-revealed=\"true\"]': {\n backgroundColor: 'transparent',\n color: 'inherit',\n userSelect: 'auto',\n },\n },\n\n // ─── Admonition (callout) ─────────────────────────────────\n [`& .${contentClasses.admonition}`]: {\n margin: theme.spacing(2, 0),\n padding: theme.spacing(1.5, 2),\n borderRadius: theme.shape.borderRadius,\n borderLeft: `4px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n '& > :last-child': { marginBottom: 0 },\n },\n [`& .${contentClasses.admonitionTitle}`]: {\n fontWeight: 600,\n textTransform: 'uppercase',\n fontSize: '0.75rem',\n letterSpacing: '0.05em',\n marginBottom: theme.spacing(0.75),\n opacity: 0.85,\n },\n [`& .${contentClasses.admonitionContent}`]: {\n '& p:last-child': { marginBottom: 0 },\n },\n [`& .${contentClasses.admonitionNote}`]: {\n borderLeftColor: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n },\n [`& .${contentClasses.admonitionTip}`]: {\n borderLeftColor: theme.palette.success.main,\n backgroundColor: alpha(theme.palette.success.main, 0.08),\n },\n [`& .${contentClasses.admonitionWarning}`]: {\n borderLeftColor: theme.palette.warning.main,\n backgroundColor: alpha(theme.palette.warning.main, 0.08),\n },\n [`& .${contentClasses.admonitionDanger}`]: {\n borderLeftColor: theme.palette.error.main,\n backgroundColor: alpha(theme.palette.error.main, 0.08),\n },\n [`& .${contentClasses.admonitionInfo}`]: {\n borderLeftColor: theme.palette.info.main,\n backgroundColor: alpha(theme.palette.info.main, 0.08),\n },\n [`& .${contentClasses.admonitionCaution}`]: {\n borderLeftColor: theme.palette.warning.dark,\n backgroundColor: alpha(theme.palette.warning.dark, 0.08),\n },\n\n // ─── Tabs ───────────────────────────────────────────────────\n [`& .${contentClasses.tabs}`]: {\n margin: theme.spacing(2, 0),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n },\n [`& .${contentClasses.tabsHeader}`]: {\n display: 'flex',\n gap: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.text.primary, 0.03),\n },\n [`& .${contentClasses.tabsTab}`]: {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n padding: theme.spacing(1, 2),\n fontFamily: 'inherit',\n fontSize: '0.8125rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n cursor: 'pointer',\n borderBottom: '2px solid transparent',\n transition: 'all 0.15s ease',\n '&:hover': { color: theme.palette.text.primary },\n },\n [`& .${contentClasses.tabsTabActive}`]: {\n color: theme.palette.text.primary,\n borderBottomColor: theme.palette.primary.main,\n },\n [`& .${contentClasses.tabsPanel}`]: {\n padding: theme.spacing(2),\n // No `:first-child` reset needed: headings only take a top margin\n // when preceded by a sibling (see heading rules above) and\n // paragraphs carry only a bottom margin, so the panel's first\n // child never has an excess top margin. (SSR-safe.)\n '& > :last-child': { marginBottom: 0 },\n },\n\n // ─── Code block — title + copy button ───────────────────────\n [`& .${contentClasses.codeBlockTitle}`]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(0.75, 1.5),\n fontSize: '0.75rem',\n fontFamily: 'ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.text.primary, 0.06),\n borderTopLeftRadius: theme.shape.borderRadius,\n borderTopRightRadius: theme.shape.borderRadius,\n },\n [`& .${contentClasses.codeBlockCopy}`]: {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n color: 'inherit',\n cursor: 'pointer',\n padding: theme.spacing(0.25, 0.75),\n fontSize: '0.875rem',\n borderRadius: theme.shape.borderRadius,\n '&:hover': { backgroundColor: alpha(theme.palette.text.primary, 0.08) },\n },\n\n // ─── Figure ─────────────────────────────────────────────────\n [`& .${contentClasses.figure}`]: {\n margin: theme.spacing(2, 0),\n textAlign: 'center',\n },\n [`& .${contentClasses.figcaption}`]: {\n fontSize: '0.8125rem',\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.75),\n },\n\n // ─── kbd ────────────────────────────────────────────────────\n [`& .${contentClasses.kbd}`]: {\n display: 'inline-block',\n padding: theme.spacing(0, 0.5),\n fontFamily: 'ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n fontSize: '0.8em',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n borderBottomWidth: 2,\n borderRadius: 4,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n boxShadow: `0 1px 0 ${alpha(theme.palette.text.primary, 0.15)}`,\n minWidth: '1.5em',\n textAlign: 'center',\n },\n\n // ─── Compact mode (chat messages, comments, etc.) ─────────\n [`&.${contentClasses.compact}`]: {\n '> * + *': { marginTop: 0, marginBottom: 2 },\n // (Dropped an SSR-unsafe `& > :first-child:not(p)` 4px top-margin\n // tweak — cosmetically negligible in compact mode, and `:first-child`\n // triggered Emotion's SSR warning.)\n '& h1, & h2, & h3, & h4, & h5, & h6': { marginTop: 0, marginBottom: 2 },\n h1: { fontSize: '1.25rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n h2: { fontSize: '1.125rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n h3: { fontSize: '1rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n 'h4, h5, h6': { fontSize: '0.875rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n p: {\n fontSize: '0.8125rem',\n lineHeight: 1.5,\n marginBottom: 2,\n '&:last-child': { marginBottom: 0 },\n },\n hr: { margin: '4px 0' },\n '& blockquote': {\n margin: '4px 0',\n padding: theme.spacing(0.5, 0, 0.5, 1.5),\n borderRadius: 0,\n backgroundColor: 'transparent',\n '&::before': { display: 'none' },\n },\n '& ul, & ol': {\n paddingLeft: 20,\n marginBottom: 2,\n '& > li': { lineHeight: 1.5, fontSize: '0.8125rem' },\n },\n '& img:not([class])': { marginBottom: 4 },\n [`& .${contentClasses.codeBlock}`]: { marginBottom: 4 },\n [`& .${contentClasses.codeBlock} pre, & pre:not([class])`]: {\n padding: theme.spacing(1.5),\n fontSize: '0.75rem',\n lineHeight: 1.5,\n marginBottom: 4,\n },\n [`& .${contentClasses.codeInline}, & :not(pre) > code:not([class])`]: {\n fontSize: '0.75rem',\n },\n '& table': {\n fontSize: '0.75rem',\n marginBottom: 4,\n },\n },\n}));\n","'use client';\n\nimport {\n type ReactNode,\n type ComponentType,\n type ElementType,\n Fragment,\n useState,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport { ContentRoot } from '../content-renderer/styles.js';\nimport { contentClasses } from '../content-renderer/classes.js';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// ---------------------------------------------------------------------------\n// URL safety (XSS hardening, T#347)\n// ---------------------------------------------------------------------------\n//\n// Every URL that lands in an `href`, `src`, or other navigable attribute\n// MUST be schema-validated. Cookie-mode auth makes any rendered\n// javascript:/data:/vbscript:/blob: URI catastrophic — an attacker who\n// crafts a TipTap document with a `link` mark or `image` node carrying\n// a `javascript:alert(...)` href gets full session control on click.\n// These guards are intentionally conservative: anything that isn't\n// unambiguously a same-origin path or an http(s) URL collapses to a\n// safe sentinel (`#` for links, undefined for image src so the <img>\n// renders nothing rather than load a hostile resource).\n\nfunction isSafeHref(url: unknown): url is string {\n if (typeof url !== 'string' || url.length === 0) return false;\n // Written as escapes, not as the literal bytes: the source used to hold\n // real control characters, so this read as `/[ -]/` — \"a space or a\n // dash\" — in every editor and diff. What it actually rejects is the\n // C0 range plus DEL, which is what makes `java\\tscript:` and friends\n // parse as `javascript:` in some URL parsers.\n // eslint-disable-next-line no-control-regex -- rejecting control characters is the point\n if (/[\\x00-\\x1f\\x7f]/.test(url)) return false;\n if (url !== url.trim() || url.includes('\\\\') || url.startsWith('//')) return false;\n if (url.startsWith('#')) return true;\n if (url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\\\')) return true;\n const lower = url.toLowerCase().trimStart();\n if (lower.startsWith('http://') || lower.startsWith('https://')) return true;\n // A path relative to the source document is useful for corpus navigation.\n // A scheme (including unknown schemes) or network-path authority is not a relative path.\n return !/^[a-z][a-z0-9+.-]*:/i.test(url);\n}\n\n/** Return the URL if safe to interpolate into href/src; otherwise undefined. */\nexport function sanitizeHref(url: unknown): string | undefined {\n return isSafeHref(url) ? (url as string) : undefined;\n}\n\n/**\n * Restrictive iframe-src validator for embed nodes (youtube et al.).\n * Accepts only https://www.youtube.com / https://www.youtube-nocookie.com.\n * Anything else collapses to undefined so the iframe doesn't render.\n */\nfunction sanitizeEmbedSrc(url: unknown): string | undefined {\n if (typeof url !== 'string') return undefined;\n if (!isSafeHref(url)) return undefined;\n const lower = url.toLowerCase();\n if (lower.startsWith('https://www.youtube.com/') || lower.startsWith('https://www.youtube-nocookie.com/')) {\n return url;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TipTapMark {\n type: string;\n attrs?: Record<string, any>;\n}\n\nexport interface TipTapNode {\n type: string;\n content?: TipTapNode[];\n text?: string;\n marks?: TipTapMark[];\n attrs?: Record<string, any>;\n}\n\nexport interface TipTapDoc {\n type: 'doc';\n content: TipTapNode[];\n}\n\n// ---------------------------------------------------------------------------\n// Custom node registry\n// ---------------------------------------------------------------------------\n\nexport type CustomNodeRenderer = ComponentType<{ node: TipTapNode }>;\nconst customNodeRegistry = new Map<string, CustomNodeRenderer>();\n\nexport function registerTipTapNode(type: string, component: CustomNodeRenderer) {\n customNodeRegistry.set(type, component);\n}\n\n// ---------------------------------------------------------------------------\n// Render context\n//\n// Lets the host app inject:\n// - `linkComponent`: a router-aware Link (e.g. react-router-dom's Link)\n// used by the `internalLink` mark to avoid full-page reloads.\n// ---------------------------------------------------------------------------\n\ninterface TipTapRenderContext {\n nodeRenderers?: Readonly<Record<string, CustomNodeRenderer>>;\n inheritRegisteredNodes?: boolean;\n linkComponent?: ElementType<{ to: string; children?: ReactNode; className?: string }>;\n}\n\nconst TipTapContext = createContext<TipTapRenderContext>({});\n\n// ---------------------------------------------------------------------------\n// Mark rendering\n// ---------------------------------------------------------------------------\n\nfunction renderMarks(text: string, marks: TipTapMark[] = [], ctx?: TipTapRenderContext): ReactNode {\n return marks.reduce<ReactNode>((acc, mark) => {\n switch (mark.type) {\n case 'bold':\n return <strong>{acc}</strong>;\n case 'italic':\n return <em>{acc}</em>;\n case 'code':\n return <code className={contentClasses.codeInline}>{acc}</code>;\n case 'underline':\n return <u>{acc}</u>;\n case 'strike':\n return <s>{acc}</s>;\n case 'link': {\n // T#347 — href is attacker-controlled (post author chose it).\n // sanitizeHref rejects javascript:/data:/vbscript:/etc. — falls\n // back to `#` so the link is inert rather than dangerous.\n const safeHref = sanitizeHref(mark.attrs?.href) ?? '#';\n // Same-origin paths route through the host app's Link (router-\n // aware) so cross-doc navigation doesn't full-reload. External\n // http(s) URLs keep <a target=\"_blank\"> behaviour.\n const Link = ctx?.linkComponent;\n if (Link && safeHref.startsWith('/') && !safeHref.startsWith('//')) {\n return (\n <Link to={safeHref} className={contentClasses.link}>\n {acc}\n </Link>\n );\n }\n return (\n <a href={safeHref} target={mark.attrs?.target ?? '_blank'} rel=\"noopener noreferrer\">\n {acc}\n </a>\n );\n }\n case 'internalLink': {\n const to = sanitizeHref(mark.attrs?.to ?? mark.attrs?.href) ?? '#';\n const Link = ctx?.linkComponent;\n return Link ? (\n <Link to={to} className={contentClasses.link}>\n {acc}\n </Link>\n ) : (\n <a href={to}>{acc}</a>\n );\n }\n case 'highlight':\n return <mark style={mark.attrs?.color ? { backgroundColor: mark.attrs.color } : undefined}>{acc}</mark>;\n case 'subscript':\n return <sub>{acc}</sub>;\n case 'superscript':\n return <sup>{acc}</sup>;\n case 'textStyle':\n return <span style={{ color: mark.attrs?.color }}>{acc}</span>;\n case 'kbd':\n return <kbd className={contentClasses.kbd}>{acc}</kbd>;\n default:\n return acc;\n }\n }, text);\n}\n\n// ---------------------------------------------------------------------------\n// Slug generation for heading anchors\n// ---------------------------------------------------------------------------\n\nfunction slugify(nodes?: TipTapNode[]): string | undefined {\n if (!nodes) return undefined;\n const text = nodes.map((n) => n.text ?? '').join('');\n if (!text) return undefined;\n return text\n .toLowerCase()\n .replace(/[^a-z0-9а-яё]+/gi, '-')\n .replace(/^-|-$/g, '');\n}\n\n// ---------------------------------------------------------------------------\n// Code block — pre-rendered HTML support + copy button\n// ---------------------------------------------------------------------------\n\nfunction CodeBlock({ node }: { node: TipTapNode }) {\n const language = node.attrs?.language as string | null | undefined;\n const title = node.attrs?.title as string | undefined;\n // T#347 — XSS hardening: the prior implementation read `node.attrs.html`\n // and injected it via dangerouslySetInnerHTML on the premise that it was\n // \"Shiki-rendered HTML pre-sanitised at build time\". That premise is\n // false in the portal context: `node.attrs` come from a TipTap document\n // authored at runtime by an arbitrary user. An attacker who can post a\n // codeBlock could set `attrs.html` to a script-carrying payload and\n // achieve stored XSS. We drop the html-attr path entirely; if syntax\n // highlighting is needed, the consumer can pass a custom CodeBlock via\n // the customNodeRegistry that highlights from the trusted text content.\n const code = node.content?.map((n) => n.text ?? '').join('\\n') ?? '';\n const [copied, setCopied] = useState(false);\n\n const onCopy = useCallback(() => {\n navigator.clipboard?.writeText(code).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n },\n () => {\n // Clipboard API unavailable (insecure context). Silently no-op.\n }\n );\n }, [code]);\n\n return (\n <div className={contentClasses.codeBlock} data-language={language ?? undefined}>\n {(title || language) && (\n <div className={contentClasses.codeBlockTitle}>\n <span>{title ?? language}</span>\n <button type=\"button\" onClick={onCopy} className={contentClasses.codeBlockCopy} aria-label=\"Copy code\">\n {copied ? '✓' : '⧉'}\n </button>\n </div>\n )}\n <pre>\n <code className={language ? `language-${language}` : undefined}>{code}</code>\n </pre>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Admonition (callout)\n// ---------------------------------------------------------------------------\n\nconst ADMONITION_LABEL: Record<string, string> = {\n note: 'Note',\n tip: 'Tip',\n warning: 'Warning',\n danger: 'Danger',\n info: 'Info',\n caution: 'Caution',\n};\n\nconst ADMONITION_CLASS: Record<string, string> = {\n note: contentClasses.admonitionNote,\n tip: contentClasses.admonitionTip,\n warning: contentClasses.admonitionWarning,\n danger: contentClasses.admonitionDanger,\n info: contentClasses.admonitionInfo,\n caution: contentClasses.admonitionCaution,\n};\n\nfunction Admonition({ node }: { node: TipTapNode }) {\n const kind = String(node.attrs?.kind ?? 'note');\n const title = (node.attrs?.title as string | undefined) ?? ADMONITION_LABEL[kind] ?? kind;\n const variantClass = ADMONITION_CLASS[kind] ?? contentClasses.admonitionNote;\n return (\n <aside className={`${contentClasses.admonition} ${variantClass}`} data-kind={kind}>\n <div className={contentClasses.admonitionTitle}>{title}</div>\n <div className={contentClasses.admonitionContent}>{node.content?.map(renderNode)}</div>\n </aside>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\nfunction Tabs({ node }: { node: TipTapNode }) {\n const items = (node.content ?? []).filter((c) => c.type === 'tabItem');\n const [active, setActive] = useState(0);\n if (items.length === 0) return null;\n\n const safeActive = Math.min(active, items.length - 1);\n\n return (\n <div className={contentClasses.tabs}>\n <div className={contentClasses.tabsHeader} role=\"tablist\">\n {items.map((item, i) => {\n const label = item.attrs?.label ?? item.attrs?.value ?? `Tab ${i + 1}`;\n const isActive = i === safeActive;\n return (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n className={`${contentClasses.tabsTab} ${isActive ? contentClasses.tabsTabActive : ''}`}\n onClick={() => setActive(i)}\n >\n {label}\n </button>\n );\n })}\n </div>\n <div className={contentClasses.tabsPanel} role=\"tabpanel\">\n {items[safeActive]?.content?.map(renderNode)}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node rendering\n// ---------------------------------------------------------------------------\n\nfunction renderNode(node: TipTapNode, index: number): ReactNode {\n return <ScopedNode key={index} node={node} index={index} />;\n}\nfunction ScopedNode({ node, index }: { node: TipTapNode; index: number }): ReactNode {\n const context = useContext(TipTapContext);\n const CustomRenderer =\n context.nodeRenderers?.[node.type] ??\n (context.inheritRegisteredNodes !== false ? customNodeRegistry.get(node.type) : undefined);\n if (CustomRenderer) return <CustomRenderer key={index} node={node} />;\n\n switch (node.type) {\n case 'text':\n return <TextNode key={index} node={node} />;\n\n case 'paragraph':\n return <p key={index}>{node.content?.map(renderNode)}</p>;\n\n case 'heading': {\n const level = Math.min(Math.max(node.attrs?.level ?? 2, 1), 6);\n const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n // Prefer the build-time-supplied id (kept consistent with the engine's\n // slugifyHeading); fall back to runtime slugification for legacy content.\n const id = node.attrs?.id ?? slugify(node.content);\n return (\n <Tag key={index} id={id}>\n {node.content?.map(renderNode)}\n </Tag>\n );\n }\n\n case 'bulletList':\n return <ul key={index}>{node.content?.map(renderNode)}</ul>;\n\n case 'orderedList':\n return (\n <ol key={index} start={node.attrs?.start ?? 1}>\n {node.content?.map(renderNode)}\n </ol>\n );\n\n case 'listItem':\n return <li key={index}>{node.content?.map(renderNode)}</li>;\n\n case 'taskList':\n return (\n <ul key={index} data-type=\"taskList\">\n {node.content?.map(renderNode)}\n </ul>\n );\n\n case 'taskItem': {\n const checked = node.attrs?.checked ?? false;\n return (\n <li key={index} data-type=\"taskItem\" data-checked={checked}>\n <label>\n <input type=\"checkbox\" checked={checked} readOnly className={contentClasses.checkbox} />\n </label>\n <div>{node.content?.map(renderNode)}</div>\n </li>\n );\n }\n\n case 'blockquote':\n return <blockquote key={index}>{node.content?.map(renderNode)}</blockquote>;\n\n case 'codeBlock':\n return <CodeBlock key={index} node={node} />;\n\n case 'horizontalRule':\n return <hr key={index} />;\n\n case 'image': {\n // T#347 — XSS hardening: image src in a TipTap doc is post-author\n // controlled. A `data:text/html` URL would let the browser load\n // a script-bearing document under the portal's origin. Reject\n // anything that isn't a same-origin path or http(s) URL — the\n // image silently doesn't render if the src is unsafe.\n const safeSrc = sanitizeHref(node.attrs?.src);\n if (!safeSrc) return null;\n return (\n <img\n key={index}\n src={safeSrc}\n alt={node.attrs?.alt ?? ''}\n title={node.attrs?.title}\n className={contentClasses.image}\n loading=\"lazy\"\n />\n );\n }\n\n case 'figure':\n return (\n <figure key={index} className={contentClasses.figure}>\n {node.content?.map(renderNode)}\n </figure>\n );\n\n case 'figcaption':\n return (\n <figcaption key={index} className={contentClasses.figcaption}>\n {node.content?.map(renderNode)}\n </figcaption>\n );\n\n case 'hardBreak':\n return <br key={index} />;\n\n // ─── Admonition / Tabs ──────────────────────────────────\n case 'admonition':\n return <Admonition key={index} node={node} />;\n\n case 'tabs':\n return <Tabs key={index} node={node} />;\n\n case 'tabItem':\n // tabItem is rendered by Tabs; if it appears outside, fall back to a\n // plain section so the content isn't lost.\n return (\n <section key={index} data-type=\"tabItem\">\n {node.content?.map(renderNode)}\n </section>\n );\n\n // ─── Table ──────────────────────────────────────────────\n case 'table':\n return (\n <div key={index} style={{ overflowX: 'auto' }}>\n <table>\n <tbody>{node.content?.map(renderNode)}</tbody>\n </table>\n </div>\n );\n\n case 'tableRow':\n return <tr key={index}>{node.content?.map(renderNode)}</tr>;\n\n case 'tableCell':\n return (\n <td key={index} colSpan={node.attrs?.colspan ?? 1} rowSpan={node.attrs?.rowspan ?? 1}>\n {node.content?.map(renderNode)}\n </td>\n );\n\n case 'tableHeader':\n return (\n <th key={index} colSpan={node.attrs?.colspan ?? 1} rowSpan={node.attrs?.rowspan ?? 1}>\n {node.content?.map(renderNode)}\n </th>\n );\n\n // ─── Details / Summary (collapsible) ────────────────────\n case 'details':\n return (\n <details key={index} open={node.attrs?.open}>\n {node.content?.map(renderNode)}\n </details>\n );\n\n case 'detailsSummary':\n return <summary key={index}>{node.content?.map(renderNode)}</summary>;\n\n case 'detailsContent':\n return <div key={index}>{node.content?.map(renderNode)}</div>;\n\n // ─── YouTube embed ──────────────────────────────────────\n case 'youtube': {\n // T#347 — XSS hardening: iframes are powerful (can frame any URL\n // the host allows X-Frame'ing). Restrict src to the YouTube\n // origins we actually want — anything else collapses to null\n // and the iframe doesn't render. Without this, a post author\n // could embed an arbitrary attacker-controlled page in an\n // iframe with autoplay + fullscreen permissions.\n const safeSrc = sanitizeEmbedSrc(node.attrs?.src);\n if (!safeSrc) return null;\n return (\n <div key={index} style={{ position: 'relative', paddingBottom: '56.25%', height: 0, marginBottom: '1.25rem' }}>\n <iframe\n src={safeSrc}\n title=\"YouTube video\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n border: 'none',\n borderRadius: 8,\n }}\n />\n </div>\n );\n }\n\n default:\n // Fallback: render children if present\n if (node.content) {\n return <Fragment key={index}>{node.content.map(renderNode)}</Fragment>;\n }\n return null;\n }\n}\n\nfunction TextNode({ node }: { node: TipTapNode }) {\n const ctx = useContext(TipTapContext);\n return <Fragment>{renderMarks(node.text ?? '', node.marks, ctx)}</Fragment>;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface TipTapRendererProps {\n nodeRenderers?: Readonly<Record<string, CustomNodeRenderer>>;\n inheritRegisteredNodes?: boolean;\n /** TipTap JSON document */\n content: TipTapDoc | Record<string, unknown> | null;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /**\n * Component used to render `internalLink` marks. Pass a router-aware\n * component (e.g. `Link` from react-router-dom) to avoid full reloads.\n */\n linkComponent?: ElementType<{ to: string; children?: ReactNode; className?: string }>;\n}\n\nexport function TipTapRenderer({\n content,\n className,\n sx,\n compact,\n linkComponent,\n nodeRenderers,\n inheritRegisteredNodes,\n}: TipTapRendererProps) {\n if (!content || !('content' in content) || !Array.isArray(content.content)) {\n return null;\n }\n\n const ctxValue: TipTapRenderContext = { linkComponent, nodeRenderers, inheritRegisteredNodes };\n\n return (\n <TipTapContext.Provider value={ctxValue}>\n <ContentRoot\n className={[contentClasses.root, contentClasses.tiptap, compact && contentClasses.compact, className]\n .filter(Boolean)\n .join(' ')}\n sx={sx}\n >\n {(content as TipTapDoc).content.map(renderNode)}\n </ContentRoot>\n </TipTapContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/content-renderer/classes.ts","../src/components/content-renderer/styles.ts","../src/components/tiptap-renderer/tiptap-renderer.tsx"],"names":[],"mappings":"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","file":"chunk-4B2LTPK2.js","sourcesContent":["// ---------------------------------------------------------------------------\n// CSS class names for content renderer components\n// ---------------------------------------------------------------------------\n\nconst PREFIX = 'prism-content';\n\nexport const contentClasses = {\n root: `${PREFIX}__root`,\n compact: `${PREFIX}__compact`,\n tiptap: `${PREFIX}__tiptap`,\n markdown: `${PREFIX}__markdown`,\n image: `${PREFIX}__image`,\n link: `${PREFIX}__link`,\n checkbox: `${PREFIX}__checkbox`,\n codeBlock: `${PREFIX}__code-block`,\n codeBlockTitle: `${PREFIX}__code-block-title`,\n codeBlockCopy: `${PREFIX}__code-block-copy`,\n codeBlockHighlight: `${PREFIX}__code-block-highlight`,\n codeInline: `${PREFIX}__code-inline`,\n spoiler: `${PREFIX}__spoiler`,\n admonition: `${PREFIX}__admonition`,\n admonitionNote: `${PREFIX}__admonition-note`,\n admonitionTip: `${PREFIX}__admonition-tip`,\n admonitionWarning: `${PREFIX}__admonition-warning`,\n admonitionDanger: `${PREFIX}__admonition-danger`,\n admonitionInfo: `${PREFIX}__admonition-info`,\n admonitionCaution: `${PREFIX}__admonition-caution`,\n admonitionTitle: `${PREFIX}__admonition-title`,\n admonitionContent: `${PREFIX}__admonition-content`,\n tabs: `${PREFIX}__tabs`,\n tabsHeader: `${PREFIX}__tabs-header`,\n tabsTab: `${PREFIX}__tabs-tab`,\n tabsTabActive: `${PREFIX}__tabs-tab-active`,\n tabsPanel: `${PREFIX}__tabs-panel`,\n figure: `${PREFIX}__figure`,\n figcaption: `${PREFIX}__figcaption`,\n kbd: `${PREFIX}__kbd`,\n};\n","'use client';\n\nimport { styled, alpha } from '@mui/material/styles';\nimport { contentClasses } from './classes.js';\n\n// ---------------------------------------------------------------------------\n// Shared content root — applies rich typography and element styling.\n// Used by both TipTapRenderer (for TipTap JSON) and Markdown (for MD strings).\n// ---------------------------------------------------------------------------\n\nconst MARGIN = '0.75em';\nconst CODE_FONT = \"'JetBrains Mono', 'Fira Code', 'Cascadia Code', Menlo, Monaco, 'Courier New', monospace\";\n\nexport const ContentRoot = styled('div')(({ theme }) => ({\n // General spacing between adjacent elements\n '> * + *': {\n marginTop: 0,\n marginBottom: MARGIN,\n },\n\n // ─── Headings ───────────────────────────────────────────────\n '& h1, & h2, & h3, & h4, & h5, & h6': {\n scrollMarginTop: 100, // Account for sticky header on anchor jump\n },\n // Heading margins. Top margins are applied via the adjacent-sibling\n // combinator (`* + hN`) rather than a `:first-child` reset: a heading\n // takes its top margin ONLY when it follows another element, so a\n // heading at the very top of its container carries none. This is\n // SSR-safe (avoids Emotion's `:first-child` warning) and yields the\n // same result the previous `& > :first-child:is(h1,h2,h3)` reset did.\n h1: { ...theme.typography.h1, marginTop: 0, marginBottom: 12 },\n h2: { ...theme.typography.h2, marginTop: 0, marginBottom: 12 },\n h3: { ...theme.typography.h3, marginTop: 0, marginBottom: 8 },\n h4: { ...theme.typography.h4, marginTop: 0, marginBottom: 8 },\n h5: { ...theme.typography.h5, marginTop: 0, marginBottom: 8 },\n h6: { ...theme.typography.h6, marginTop: 0, marginBottom: 8 },\n '& * + h1, & * + h2': { marginTop: 40 },\n '& * + h3': { marginTop: 32 },\n '& * + h4, & * + h5, & * + h6': { marginTop: 24 },\n\n // ─── Paragraph ──────────────────────────────────────────────\n p: {\n ...theme.typography.body1,\n marginBottom: '1.25rem',\n lineHeight: 1.8,\n },\n\n // ─── Horizontal rule ───────────────────────────────────────\n hr: {\n flexShrink: 0,\n borderWidth: 0,\n margin: '2em 0',\n borderStyle: 'solid',\n borderBottomWidth: 'thin',\n borderColor: theme.palette.divider,\n },\n\n // ─── Images ─────────────────────────────────────────────────\n [`& .${contentClasses.image}`]: {\n width: '100%',\n height: 'auto',\n maxWidth: '100%',\n margin: 'auto auto 1.25em',\n borderRadius: Number(theme.shape.borderRadius) * 2,\n },\n // Plain img fallback\n '& img:not([class])': {\n maxWidth: '100%',\n height: 'auto',\n borderRadius: Number(theme.shape.borderRadius) * 2,\n marginBottom: '1.25em',\n },\n\n // ─── Links ──────────────────────────────────────────────────\n '& a': {\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n },\n\n // ─── Lists ──────────────────────────────────────────────────\n '& ul': {\n listStyleType: 'disc',\n },\n '& ul, & ol': {\n paddingLeft: 24,\n marginBottom: '1.25rem',\n '& > li': {\n lineHeight: 2,\n // Markdown wraps every list-item body in a `<p>`. With\n // `display: inline-block` (the previous setting), Chromium\n // refuses to render the `<li>`'s ::marker at all — the\n // disc/decimal vanishes and the list looks like a series of\n // bullet-less paragraphs. `display: inline` collapses the\n // `<p>` into inline flow so the marker positions normally;\n // `margin: 0` keeps the LI height tight against the marker\n // baseline. Multi-paragraph list items (rare here, but\n // possible) still render — subsequent `<p>` siblings get a\n // line break by the inline-flow rules.\n '& > p': {\n margin: 0,\n display: 'inline',\n },\n },\n },\n // Nested lists\n '& ul ul, & ol ol, & ul ol, & ol ul': {\n marginBottom: 0,\n },\n\n // ─── Task list (TipTap taskList / GFM checkboxes) ──────────\n '& ul[data-type=\"taskList\"]': {\n listStyle: 'none',\n paddingLeft: 4,\n '& li': {\n display: 'flex',\n alignItems: 'flex-start',\n gap: 8,\n '& > label': {\n marginTop: 4,\n },\n },\n },\n\n // ─── Blockquote ─────────────────────────────────────────────\n '& blockquote': {\n lineHeight: 1.6,\n fontSize: '1em',\n margin: '24px 0',\n position: 'relative',\n padding: theme.spacing(2.5, 3, 2.5, 7),\n color: theme.palette.text.secondary,\n borderLeft: `4px solid ${theme.palette.primary.main}`,\n borderRadius: Number(theme.shape.borderRadius) * 2,\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n '& p': {\n margin: 0,\n fontSize: 'inherit',\n },\n '& p + p': {\n marginTop: 8,\n },\n '&::before': {\n left: 16,\n top: 8,\n display: 'block',\n fontSize: '2.5em',\n content: '\"\\\\201C\"',\n position: 'absolute',\n color: alpha(theme.palette.primary.main, 0.3),\n lineHeight: 1,\n },\n },\n\n // ─── Inline code ────────────────────────────────────────────\n [`& .${contentClasses.codeInline}`]: {\n padding: theme.spacing(0.25, 0.75),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n borderRadius: Number(theme.shape.borderRadius) / 2,\n backgroundColor: alpha(theme.palette.grey[500], 0.2),\n fontFamily: CODE_FONT,\n },\n // Fallback for code not inside pre\n '& :not(pre) > code:not([class])': {\n padding: theme.spacing(0.25, 0.75),\n color: theme.palette.text.secondary,\n fontSize: theme.typography.body2.fontSize,\n borderRadius: Number(theme.shape.borderRadius) / 2,\n backgroundColor: alpha(theme.palette.grey[500], 0.2),\n fontFamily: CODE_FONT,\n },\n\n // ─── Code block ─────────────────────────────────────────────\n [`& .${contentClasses.codeBlock}`]: {\n position: 'relative',\n marginBottom: '1.25rem',\n '& pre': {\n overflowX: 'auto',\n padding: theme.spacing(3),\n color: theme.palette.common.white,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n fontFamily: CODE_FONT,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1.7,\n backgroundColor: theme.palette.grey[900],\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: alpha(theme.palette.grey[800], 0.9),\n }),\n '& code': {\n fontSize: 'inherit',\n fontFamily: 'inherit',\n backgroundColor: 'transparent',\n padding: 0,\n borderRadius: 0,\n color: 'inherit',\n },\n },\n },\n // Fallback for bare pre blocks\n '& pre:not([class])': {\n overflowX: 'auto',\n padding: theme.spacing(3),\n color: theme.palette.common.white,\n borderRadius: Number(theme.shape.borderRadius) * 1.5,\n fontFamily: CODE_FONT,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1.7,\n backgroundColor: theme.palette.grey[900],\n marginBottom: '1.25rem',\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: alpha(theme.palette.grey[800], 0.9),\n }),\n '& code': {\n fontSize: 'inherit',\n fontFamily: 'inherit',\n backgroundColor: 'transparent',\n padding: 0,\n color: 'inherit',\n },\n },\n\n // ─── Table ──────────────────────────────────────────────────\n '& table': {\n width: '100%',\n borderCollapse: 'collapse',\n fontSize: theme.typography.body2.fontSize,\n border: `1px solid ${theme.palette.divider}`,\n marginBottom: '1.25rem',\n '& th, & td': {\n padding: theme.spacing(1, 1.5),\n border: `1px solid ${theme.palette.divider}`,\n verticalAlign: 'top',\n },\n '& th': {\n fontWeight: 700,\n backgroundColor: alpha(theme.palette.grey[500], 0.08),\n },\n // Zebra rows. `:nth-of-type` (not `:nth-child`) is SSR-safe and\n // exactly equivalent here — a `<tbody>` contains only `<tr>`\n // children, so type-position and child-position coincide.\n '& tbody tr:nth-of-type(odd)': {\n backgroundColor: alpha(theme.palette.grey[500], 0.04),\n },\n },\n\n // ─── Checkbox (GFM task lists) ──────────────────────────────\n [`& .${contentClasses.checkbox}`]: {\n cursor: 'pointer',\n position: 'relative',\n '&:before': {\n content: '\"\"',\n top: -2,\n left: -2,\n width: 17,\n height: 17,\n borderRadius: 3,\n position: 'absolute',\n backgroundColor: theme.palette.grey[300],\n ...(theme.palette.mode === 'dark' && {\n backgroundColor: theme.palette.grey[700],\n }),\n },\n '&:checked': {\n '&:before': {\n backgroundColor: theme.palette.primary.main,\n },\n '&:after': {\n top: 1,\n left: 5,\n width: 4,\n height: 9,\n content: '\"\"',\n position: 'absolute',\n borderStyle: 'solid',\n transform: 'rotate(45deg)',\n borderWidth: '0 2px 2px 0',\n borderColor: theme.palette.common.white,\n },\n },\n },\n\n // ─── Details / Summary ──────────────────────────────────────\n '& details': {\n marginBottom: '1rem',\n '& summary': {\n cursor: 'pointer',\n fontWeight: 600,\n marginBottom: 8,\n },\n },\n\n // ─── Definition list ────────────────────────────────────────\n '& dl': {\n marginBottom: '1.25rem',\n '& dt': {\n fontWeight: 700,\n marginTop: 12,\n },\n '& dd': {\n marginLeft: 24,\n marginBottom: 4,\n },\n },\n\n // ─── Kbd (keyboard shortcut) ────────────────────────────────\n '& kbd': {\n display: 'inline-block',\n padding: theme.spacing(0.25, 0.5),\n fontSize: '0.8em',\n fontFamily: CODE_FONT,\n borderRadius: 4,\n border: `1px solid ${theme.palette.divider}`,\n boxShadow: `0 1px 0 ${alpha(theme.palette.grey[500], 0.1)}`,\n backgroundColor: alpha(theme.palette.grey[500], 0.06),\n },\n\n // ─── Mark (highlight) ──────────────────────────────────────\n '& mark': {\n padding: theme.spacing(0, 0.5),\n borderRadius: 2,\n backgroundColor: alpha(theme.palette.warning.main, 0.3),\n },\n\n // ─── Sup / Sub ──────────────────────────────────────────────\n '& sup, & sub': {\n fontSize: '0.75em',\n },\n\n // ─── Spoiler (||hidden text||) ────────────────────────────\n [`& .${contentClasses.spoiler}`]: {\n backgroundColor: theme.palette.text.primary,\n color: theme.palette.text.primary,\n borderRadius: 4,\n padding: theme.spacing(0, 0.5),\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n userSelect: 'none',\n '&:hover, &[data-revealed=\"true\"]': {\n backgroundColor: 'transparent',\n color: 'inherit',\n userSelect: 'auto',\n },\n },\n\n // ─── Admonition (callout) ─────────────────────────────────\n [`& .${contentClasses.admonition}`]: {\n margin: theme.spacing(2, 0),\n padding: theme.spacing(1.5, 2),\n borderRadius: theme.shape.borderRadius,\n borderLeft: `4px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n '& > :last-child': { marginBottom: 0 },\n },\n [`& .${contentClasses.admonitionTitle}`]: {\n fontWeight: 600,\n textTransform: 'uppercase',\n fontSize: '0.75rem',\n letterSpacing: '0.05em',\n marginBottom: theme.spacing(0.75),\n opacity: 0.85,\n },\n [`& .${contentClasses.admonitionContent}`]: {\n '& p:last-child': { marginBottom: 0 },\n },\n [`& .${contentClasses.admonitionNote}`]: {\n borderLeftColor: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n },\n [`& .${contentClasses.admonitionTip}`]: {\n borderLeftColor: theme.palette.success.main,\n backgroundColor: alpha(theme.palette.success.main, 0.08),\n },\n [`& .${contentClasses.admonitionWarning}`]: {\n borderLeftColor: theme.palette.warning.main,\n backgroundColor: alpha(theme.palette.warning.main, 0.08),\n },\n [`& .${contentClasses.admonitionDanger}`]: {\n borderLeftColor: theme.palette.error.main,\n backgroundColor: alpha(theme.palette.error.main, 0.08),\n },\n [`& .${contentClasses.admonitionInfo}`]: {\n borderLeftColor: theme.palette.info.main,\n backgroundColor: alpha(theme.palette.info.main, 0.08),\n },\n [`& .${contentClasses.admonitionCaution}`]: {\n borderLeftColor: theme.palette.warning.dark,\n backgroundColor: alpha(theme.palette.warning.dark, 0.08),\n },\n\n // ─── Tabs ───────────────────────────────────────────────────\n [`& .${contentClasses.tabs}`]: {\n margin: theme.spacing(2, 0),\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n overflow: 'hidden',\n },\n [`& .${contentClasses.tabsHeader}`]: {\n display: 'flex',\n gap: 0,\n borderBottom: `1px solid ${theme.palette.divider}`,\n backgroundColor: alpha(theme.palette.text.primary, 0.03),\n },\n [`& .${contentClasses.tabsTab}`]: {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n padding: theme.spacing(1, 2),\n fontFamily: 'inherit',\n fontSize: '0.8125rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n cursor: 'pointer',\n borderBottom: '2px solid transparent',\n transition: 'all 0.15s ease',\n '&:hover': { color: theme.palette.text.primary },\n },\n [`& .${contentClasses.tabsTabActive}`]: {\n color: theme.palette.text.primary,\n borderBottomColor: theme.palette.primary.main,\n },\n [`& .${contentClasses.tabsPanel}`]: {\n padding: theme.spacing(2),\n // No `:first-child` reset needed: headings only take a top margin\n // when preceded by a sibling (see heading rules above) and\n // paragraphs carry only a bottom margin, so the panel's first\n // child never has an excess top margin. (SSR-safe.)\n '& > :last-child': { marginBottom: 0 },\n },\n\n // ─── Code block — title + copy button ───────────────────────\n [`& .${contentClasses.codeBlockTitle}`]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1),\n padding: theme.spacing(0.75, 1.5),\n fontSize: '0.75rem',\n fontFamily: 'ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n color: theme.palette.text.secondary,\n backgroundColor: alpha(theme.palette.text.primary, 0.06),\n borderTopLeftRadius: theme.shape.borderRadius,\n borderTopRightRadius: theme.shape.borderRadius,\n },\n [`& .${contentClasses.codeBlockCopy}`]: {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n color: 'inherit',\n cursor: 'pointer',\n padding: theme.spacing(0.25, 0.75),\n fontSize: '0.875rem',\n borderRadius: theme.shape.borderRadius,\n '&:hover': { backgroundColor: alpha(theme.palette.text.primary, 0.08) },\n },\n\n // ─── Figure ─────────────────────────────────────────────────\n [`& .${contentClasses.figure}`]: {\n margin: theme.spacing(2, 0),\n textAlign: 'center',\n },\n [`& .${contentClasses.figcaption}`]: {\n fontSize: '0.8125rem',\n color: theme.palette.text.secondary,\n marginTop: theme.spacing(0.75),\n },\n\n // ─── kbd ────────────────────────────────────────────────────\n [`& .${contentClasses.kbd}`]: {\n display: 'inline-block',\n padding: theme.spacing(0, 0.5),\n fontFamily: 'ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n fontSize: '0.8em',\n color: theme.palette.text.primary,\n border: `1px solid ${theme.palette.divider}`,\n borderBottomWidth: 2,\n borderRadius: 4,\n backgroundColor: alpha(theme.palette.text.primary, 0.04),\n boxShadow: `0 1px 0 ${alpha(theme.palette.text.primary, 0.15)}`,\n minWidth: '1.5em',\n textAlign: 'center',\n },\n\n // ─── Compact mode (chat messages, comments, etc.) ─────────\n [`&.${contentClasses.compact}`]: {\n '> * + *': { marginTop: 0, marginBottom: 2 },\n // (Dropped an SSR-unsafe `& > :first-child:not(p)` 4px top-margin\n // tweak — cosmetically negligible in compact mode, and `:first-child`\n // triggered Emotion's SSR warning.)\n '& h1, & h2, & h3, & h4, & h5, & h6': { marginTop: 0, marginBottom: 2 },\n h1: { fontSize: '1.25rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n h2: { fontSize: '1.125rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n h3: { fontSize: '1rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n 'h4, h5, h6': { fontSize: '0.875rem', fontWeight: 600, marginTop: 0, marginBottom: 2 },\n p: {\n fontSize: '0.8125rem',\n lineHeight: 1.5,\n marginBottom: 2,\n '&:last-child': { marginBottom: 0 },\n },\n hr: { margin: '4px 0' },\n '& blockquote': {\n margin: '4px 0',\n padding: theme.spacing(0.5, 0, 0.5, 1.5),\n borderRadius: 0,\n backgroundColor: 'transparent',\n '&::before': { display: 'none' },\n },\n '& ul, & ol': {\n paddingLeft: 20,\n marginBottom: 2,\n '& > li': { lineHeight: 1.5, fontSize: '0.8125rem' },\n },\n '& img:not([class])': { marginBottom: 4 },\n [`& .${contentClasses.codeBlock}`]: { marginBottom: 4 },\n [`& .${contentClasses.codeBlock} pre, & pre:not([class])`]: {\n padding: theme.spacing(1.5),\n fontSize: '0.75rem',\n lineHeight: 1.5,\n marginBottom: 4,\n },\n [`& .${contentClasses.codeInline}, & :not(pre) > code:not([class])`]: {\n fontSize: '0.75rem',\n },\n '& table': {\n fontSize: '0.75rem',\n marginBottom: 4,\n },\n },\n}));\n","'use client';\n\nimport {\n type ReactNode,\n type ComponentType,\n type ElementType,\n Fragment,\n useState,\n useCallback,\n createContext,\n useContext,\n} from 'react';\nimport { ContentRoot } from '../content-renderer/styles.js';\nimport { contentClasses } from '../content-renderer/classes.js';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\n// ---------------------------------------------------------------------------\n// URL safety (XSS hardening, T#347)\n// ---------------------------------------------------------------------------\n//\n// Every URL that lands in an `href`, `src`, or other navigable attribute\n// MUST be schema-validated. Cookie-mode auth makes any rendered\n// javascript:/data:/vbscript:/blob: URI catastrophic — an attacker who\n// crafts a TipTap document with a `link` mark or `image` node carrying\n// a `javascript:alert(...)` href gets full session control on click.\n// These guards are intentionally conservative: anything that isn't\n// unambiguously a same-origin path or an http(s) URL collapses to a\n// safe sentinel (`#` for links, undefined for image src so the <img>\n// renders nothing rather than load a hostile resource).\n\nfunction isSafeHref(url: unknown): url is string {\n if (typeof url !== 'string' || url.length === 0) return false;\n // Written as escapes, not as the literal bytes: the source used to hold\n // real control characters, so this read as `/[ -]/` — \"a space or a\n // dash\" — in every editor and diff. What it actually rejects is the\n // C0 range plus DEL, which is what makes `java\\tscript:` and friends\n // parse as `javascript:` in some URL parsers.\n // eslint-disable-next-line no-control-regex -- rejecting control characters is the point\n if (/[\\x00-\\x1f\\x7f]/.test(url)) return false;\n if (url !== url.trim() || url.includes('\\\\') || url.startsWith('//')) return false;\n if (url.startsWith('#')) return true;\n if (url.startsWith('/') && !url.startsWith('//') && !url.startsWith('/\\\\')) return true;\n const lower = url.toLowerCase().trimStart();\n if (lower.startsWith('http://') || lower.startsWith('https://')) return true;\n // A path relative to the source document is useful for corpus navigation.\n // A scheme (including unknown schemes) or network-path authority is not a relative path.\n return !/^[a-z][a-z0-9+.-]*:/i.test(url);\n}\n\n/** Return the URL if safe to interpolate into href/src; otherwise undefined. */\nexport function sanitizeHref(url: unknown): string | undefined {\n return isSafeHref(url) ? (url as string) : undefined;\n}\n\n/**\n * Restrictive iframe-src validator for embed nodes (youtube et al.).\n * Accepts only https://www.youtube.com / https://www.youtube-nocookie.com.\n * Anything else collapses to undefined so the iframe doesn't render.\n */\nfunction sanitizeEmbedSrc(url: unknown): string | undefined {\n if (typeof url !== 'string') return undefined;\n if (!isSafeHref(url)) return undefined;\n const lower = url.toLowerCase();\n if (lower.startsWith('https://www.youtube.com/') || lower.startsWith('https://www.youtube-nocookie.com/')) {\n return url;\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TipTapMark {\n type: string;\n attrs?: Record<string, any>;\n}\n\nexport interface TipTapNode {\n type: string;\n content?: TipTapNode[];\n text?: string;\n marks?: TipTapMark[];\n attrs?: Record<string, any>;\n}\n\nexport interface TipTapDoc {\n type: 'doc';\n content: TipTapNode[];\n}\n\n// ---------------------------------------------------------------------------\n// Custom node registry\n// ---------------------------------------------------------------------------\n\nexport type CustomNodeRenderer = ComponentType<{ node: TipTapNode }>;\nconst customNodeRegistry = new Map<string, CustomNodeRenderer>();\n\nexport function registerTipTapNode(type: string, component: CustomNodeRenderer) {\n customNodeRegistry.set(type, component);\n}\n\n// ---------------------------------------------------------------------------\n// Render context\n//\n// Lets the host app inject:\n// - `linkComponent`: a router-aware Link (e.g. react-router-dom's Link)\n// used by the `internalLink` mark to avoid full-page reloads.\n// ---------------------------------------------------------------------------\n\ninterface TipTapRenderContext {\n nodeRenderers?: Readonly<Record<string, CustomNodeRenderer>>;\n inheritRegisteredNodes?: boolean;\n linkComponent?: ElementType<{ to: string; children?: ReactNode; className?: string }>;\n}\n\nconst TipTapContext = createContext<TipTapRenderContext>({});\n\n// ---------------------------------------------------------------------------\n// Mark rendering\n// ---------------------------------------------------------------------------\n\nfunction renderMarks(text: string, marks: TipTapMark[] = [], ctx?: TipTapRenderContext): ReactNode {\n return marks.reduce<ReactNode>((acc, mark) => {\n switch (mark.type) {\n case 'bold':\n return <strong>{acc}</strong>;\n case 'italic':\n return <em>{acc}</em>;\n case 'code':\n return <code className={contentClasses.codeInline}>{acc}</code>;\n case 'underline':\n return <u>{acc}</u>;\n case 'strike':\n return <s>{acc}</s>;\n case 'link': {\n // T#347 — href is attacker-controlled (post author chose it).\n // sanitizeHref rejects javascript:/data:/vbscript:/etc. — falls\n // back to `#` so the link is inert rather than dangerous.\n const safeHref = sanitizeHref(mark.attrs?.href) ?? '#';\n // Same-origin paths route through the host app's Link (router-\n // aware) so cross-doc navigation doesn't full-reload. External\n // http(s) URLs keep <a target=\"_blank\"> behaviour.\n const Link = ctx?.linkComponent;\n if (Link && safeHref.startsWith('/') && !safeHref.startsWith('//')) {\n return (\n <Link to={safeHref} className={contentClasses.link}>\n {acc}\n </Link>\n );\n }\n return (\n <a href={safeHref} target={mark.attrs?.target ?? '_blank'} rel=\"noopener noreferrer\">\n {acc}\n </a>\n );\n }\n case 'internalLink': {\n const to = sanitizeHref(mark.attrs?.to ?? mark.attrs?.href) ?? '#';\n const Link = ctx?.linkComponent;\n return Link ? (\n <Link to={to} className={contentClasses.link}>\n {acc}\n </Link>\n ) : (\n <a href={to}>{acc}</a>\n );\n }\n case 'highlight':\n return <mark style={mark.attrs?.color ? { backgroundColor: mark.attrs.color } : undefined}>{acc}</mark>;\n case 'subscript':\n return <sub>{acc}</sub>;\n case 'superscript':\n return <sup>{acc}</sup>;\n case 'textStyle':\n return <span style={{ color: mark.attrs?.color }}>{acc}</span>;\n case 'kbd':\n return <kbd className={contentClasses.kbd}>{acc}</kbd>;\n default:\n return acc;\n }\n }, text);\n}\n\n// ---------------------------------------------------------------------------\n// Slug generation for heading anchors\n// ---------------------------------------------------------------------------\n\nfunction slugify(nodes?: TipTapNode[]): string | undefined {\n if (!nodes) return undefined;\n const text = nodes.map((n) => n.text ?? '').join('');\n if (!text) return undefined;\n return text\n .toLowerCase()\n .replace(/[^a-z0-9а-яё]+/gi, '-')\n .replace(/^-|-$/g, '');\n}\n\n// ---------------------------------------------------------------------------\n// Code block — pre-rendered HTML support + copy button\n// ---------------------------------------------------------------------------\n\nfunction CodeBlock({ node }: { node: TipTapNode }) {\n const language = node.attrs?.language as string | null | undefined;\n const title = node.attrs?.title as string | undefined;\n // T#347 — XSS hardening: the prior implementation read `node.attrs.html`\n // and injected it via dangerouslySetInnerHTML on the premise that it was\n // \"Shiki-rendered HTML pre-sanitised at build time\". That premise is\n // false in the portal context: `node.attrs` come from a TipTap document\n // authored at runtime by an arbitrary user. An attacker who can post a\n // codeBlock could set `attrs.html` to a script-carrying payload and\n // achieve stored XSS. We drop the html-attr path entirely; if syntax\n // highlighting is needed, the consumer can pass a custom CodeBlock via\n // the customNodeRegistry that highlights from the trusted text content.\n const code = node.content?.map((n) => n.text ?? '').join('\\n') ?? '';\n const [copied, setCopied] = useState(false);\n\n const onCopy = useCallback(() => {\n navigator.clipboard?.writeText(code).then(\n () => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n },\n () => {\n // Clipboard API unavailable (insecure context). Silently no-op.\n }\n );\n }, [code]);\n\n return (\n <div className={contentClasses.codeBlock} data-language={language ?? undefined}>\n {(title || language) && (\n <div className={contentClasses.codeBlockTitle}>\n <span>{title ?? language}</span>\n <button type=\"button\" onClick={onCopy} className={contentClasses.codeBlockCopy} aria-label=\"Copy code\">\n {copied ? '✓' : '⧉'}\n </button>\n </div>\n )}\n <pre>\n <code className={language ? `language-${language}` : undefined}>{code}</code>\n </pre>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Admonition (callout)\n// ---------------------------------------------------------------------------\n\nconst ADMONITION_LABEL: Record<string, string> = {\n note: 'Note',\n tip: 'Tip',\n warning: 'Warning',\n danger: 'Danger',\n info: 'Info',\n caution: 'Caution',\n};\n\nconst ADMONITION_CLASS: Record<string, string> = {\n note: contentClasses.admonitionNote,\n tip: contentClasses.admonitionTip,\n warning: contentClasses.admonitionWarning,\n danger: contentClasses.admonitionDanger,\n info: contentClasses.admonitionInfo,\n caution: contentClasses.admonitionCaution,\n};\n\nfunction Admonition({ node }: { node: TipTapNode }) {\n const kind = String(node.attrs?.kind ?? 'note');\n const title = (node.attrs?.title as string | undefined) ?? ADMONITION_LABEL[kind] ?? kind;\n const variantClass = ADMONITION_CLASS[kind] ?? contentClasses.admonitionNote;\n return (\n <aside className={`${contentClasses.admonition} ${variantClass}`} data-kind={kind}>\n <div className={contentClasses.admonitionTitle}>{title}</div>\n <div className={contentClasses.admonitionContent}>{node.content?.map(renderNode)}</div>\n </aside>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Tabs\n// ---------------------------------------------------------------------------\n\nfunction Tabs({ node }: { node: TipTapNode }) {\n const items = (node.content ?? []).filter((c) => c.type === 'tabItem');\n const [active, setActive] = useState(0);\n if (items.length === 0) return null;\n\n const safeActive = Math.min(active, items.length - 1);\n\n return (\n <div className={contentClasses.tabs}>\n <div className={contentClasses.tabsHeader} role=\"tablist\">\n {items.map((item, i) => {\n const label = item.attrs?.label ?? item.attrs?.value ?? `Tab ${i + 1}`;\n const isActive = i === safeActive;\n return (\n <button\n key={i}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n className={`${contentClasses.tabsTab} ${isActive ? contentClasses.tabsTabActive : ''}`}\n onClick={() => setActive(i)}\n >\n {label}\n </button>\n );\n })}\n </div>\n <div className={contentClasses.tabsPanel} role=\"tabpanel\">\n {items[safeActive]?.content?.map(renderNode)}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Node rendering\n// ---------------------------------------------------------------------------\n\nfunction renderNode(node: TipTapNode, index: number): ReactNode {\n return <ScopedNode key={index} node={node} index={index} />;\n}\nfunction ScopedNode({ node, index }: { node: TipTapNode; index: number }): ReactNode {\n const context = useContext(TipTapContext);\n const CustomRenderer =\n context.nodeRenderers?.[node.type] ??\n (context.inheritRegisteredNodes !== false ? customNodeRegistry.get(node.type) : undefined);\n if (CustomRenderer) return <CustomRenderer key={index} node={node} />;\n\n switch (node.type) {\n case 'text':\n return <TextNode key={index} node={node} />;\n\n case 'paragraph':\n return <p key={index}>{node.content?.map(renderNode)}</p>;\n\n case 'heading': {\n const level = Math.min(Math.max(node.attrs?.level ?? 2, 1), 6);\n const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n // Prefer the build-time-supplied id (kept consistent with the engine's\n // slugifyHeading); fall back to runtime slugification for legacy content.\n const id = node.attrs?.id ?? slugify(node.content);\n return (\n <Tag key={index} id={id}>\n {node.content?.map(renderNode)}\n </Tag>\n );\n }\n\n case 'bulletList':\n return <ul key={index}>{node.content?.map(renderNode)}</ul>;\n\n case 'orderedList':\n return (\n <ol key={index} start={node.attrs?.start ?? 1}>\n {node.content?.map(renderNode)}\n </ol>\n );\n\n case 'listItem':\n return <li key={index}>{node.content?.map(renderNode)}</li>;\n\n case 'taskList':\n return (\n <ul key={index} data-type=\"taskList\">\n {node.content?.map(renderNode)}\n </ul>\n );\n\n case 'taskItem': {\n const checked = node.attrs?.checked ?? false;\n return (\n <li key={index} data-type=\"taskItem\" data-checked={checked}>\n <label>\n <input type=\"checkbox\" checked={checked} readOnly className={contentClasses.checkbox} />\n </label>\n <div>{node.content?.map(renderNode)}</div>\n </li>\n );\n }\n\n case 'blockquote':\n return <blockquote key={index}>{node.content?.map(renderNode)}</blockquote>;\n\n case 'codeBlock':\n return <CodeBlock key={index} node={node} />;\n\n case 'horizontalRule':\n return <hr key={index} />;\n\n case 'image': {\n // T#347 — XSS hardening: image src in a TipTap doc is post-author\n // controlled. A `data:text/html` URL would let the browser load\n // a script-bearing document under the portal's origin. Reject\n // anything that isn't a same-origin path or http(s) URL — the\n // image silently doesn't render if the src is unsafe.\n const safeSrc = sanitizeHref(node.attrs?.src);\n if (!safeSrc) return null;\n return (\n <img\n key={index}\n src={safeSrc}\n alt={node.attrs?.alt ?? ''}\n title={node.attrs?.title}\n className={contentClasses.image}\n loading=\"lazy\"\n />\n );\n }\n\n case 'figure':\n return (\n <figure key={index} className={contentClasses.figure}>\n {node.content?.map(renderNode)}\n </figure>\n );\n\n case 'figcaption':\n return (\n <figcaption key={index} className={contentClasses.figcaption}>\n {node.content?.map(renderNode)}\n </figcaption>\n );\n\n case 'hardBreak':\n return <br key={index} />;\n\n // ─── Admonition / Tabs ──────────────────────────────────\n case 'admonition':\n return <Admonition key={index} node={node} />;\n\n case 'tabs':\n return <Tabs key={index} node={node} />;\n\n case 'tabItem':\n // tabItem is rendered by Tabs; if it appears outside, fall back to a\n // plain section so the content isn't lost.\n return (\n <section key={index} data-type=\"tabItem\">\n {node.content?.map(renderNode)}\n </section>\n );\n\n // ─── Table ──────────────────────────────────────────────\n case 'table':\n return (\n <div key={index} style={{ overflowX: 'auto' }}>\n <table>\n <tbody>{node.content?.map(renderNode)}</tbody>\n </table>\n </div>\n );\n\n case 'tableRow':\n return <tr key={index}>{node.content?.map(renderNode)}</tr>;\n\n case 'tableCell':\n return (\n <td key={index} colSpan={node.attrs?.colspan ?? 1} rowSpan={node.attrs?.rowspan ?? 1}>\n {node.content?.map(renderNode)}\n </td>\n );\n\n case 'tableHeader':\n return (\n <th key={index} colSpan={node.attrs?.colspan ?? 1} rowSpan={node.attrs?.rowspan ?? 1}>\n {node.content?.map(renderNode)}\n </th>\n );\n\n // ─── Details / Summary (collapsible) ────────────────────\n case 'details':\n return (\n <details key={index} open={node.attrs?.open}>\n {node.content?.map(renderNode)}\n </details>\n );\n\n case 'detailsSummary':\n return <summary key={index}>{node.content?.map(renderNode)}</summary>;\n\n case 'detailsContent':\n return <div key={index}>{node.content?.map(renderNode)}</div>;\n\n // ─── YouTube embed ──────────────────────────────────────\n case 'youtube': {\n // T#347 — XSS hardening: iframes are powerful (can frame any URL\n // the host allows X-Frame'ing). Restrict src to the YouTube\n // origins we actually want — anything else collapses to null\n // and the iframe doesn't render. Without this, a post author\n // could embed an arbitrary attacker-controlled page in an\n // iframe with autoplay + fullscreen permissions.\n const safeSrc = sanitizeEmbedSrc(node.attrs?.src);\n if (!safeSrc) return null;\n return (\n <div key={index} style={{ position: 'relative', paddingBottom: '56.25%', height: 0, marginBottom: '1.25rem' }}>\n <iframe\n src={safeSrc}\n title=\"YouTube video\"\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n border: 'none',\n borderRadius: 8,\n }}\n />\n </div>\n );\n }\n\n default:\n // Fallback: render children if present\n if (node.content) {\n return <Fragment key={index}>{node.content.map(renderNode)}</Fragment>;\n }\n return null;\n }\n}\n\nfunction TextNode({ node }: { node: TipTapNode }) {\n const ctx = useContext(TipTapContext);\n return <Fragment>{renderMarks(node.text ?? '', node.marks, ctx)}</Fragment>;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface TipTapRendererProps {\n nodeRenderers?: Readonly<Record<string, CustomNodeRenderer>>;\n inheritRegisteredNodes?: boolean;\n /** TipTap JSON document */\n content: TipTapDoc | Record<string, unknown> | null;\n /** Additional CSS class */\n className?: string;\n /** MUI sx prop */\n sx?: SxProps<Theme>;\n /** Compact mode for chat messages, comments, etc. */\n compact?: boolean;\n /**\n * Component used to render `internalLink` marks. Pass a router-aware\n * component (e.g. `Link` from react-router-dom) to avoid full reloads.\n */\n linkComponent?: ElementType<{ to: string; children?: ReactNode; className?: string }>;\n}\n\nexport function TipTapRenderer({\n content,\n className,\n sx,\n compact,\n linkComponent,\n nodeRenderers,\n inheritRegisteredNodes,\n}: TipTapRendererProps) {\n if (!content || !('content' in content) || !Array.isArray(content.content)) {\n return null;\n }\n\n const ctxValue: TipTapRenderContext = { linkComponent, nodeRenderers, inheritRegisteredNodes };\n\n return (\n <TipTapContext.Provider value={ctxValue}>\n <ContentRoot\n className={[contentClasses.root, contentClasses.tiptap, compact && contentClasses.compact, className]\n .filter(Boolean)\n .join(' ')}\n sx={sx}\n >\n {(content as TipTapDoc).content.map(renderNode)}\n </ContentRoot>\n </TipTapContext.Provider>\n );\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/blocks/auth-block/guards.tsx
|
|
4
|
+
function AuthGuard({
|
|
5
|
+
children,
|
|
6
|
+
useAuth,
|
|
7
|
+
loadingComponent = null,
|
|
8
|
+
onUnauthenticated,
|
|
9
|
+
unauthenticatedComponent = null
|
|
10
|
+
}) {
|
|
11
|
+
const { isAuthenticated, isLoading } = useAuth();
|
|
12
|
+
const [checked, setChecked] = useState(false);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!isLoading) {
|
|
15
|
+
if (!isAuthenticated) {
|
|
16
|
+
onUnauthenticated?.();
|
|
17
|
+
}
|
|
18
|
+
setChecked(true);
|
|
19
|
+
}
|
|
20
|
+
}, [isAuthenticated, isLoading, onUnauthenticated]);
|
|
21
|
+
if (isLoading || !checked) {
|
|
22
|
+
return loadingComponent;
|
|
23
|
+
}
|
|
24
|
+
if (!isAuthenticated) {
|
|
25
|
+
return unauthenticatedComponent;
|
|
26
|
+
}
|
|
27
|
+
return children;
|
|
28
|
+
}
|
|
29
|
+
function GuestGuard({
|
|
30
|
+
children,
|
|
31
|
+
useAuth,
|
|
32
|
+
loadingComponent = null,
|
|
33
|
+
onAuthenticated,
|
|
34
|
+
authenticatedComponent = null
|
|
35
|
+
}) {
|
|
36
|
+
const { isAuthenticated, isLoading } = useAuth();
|
|
37
|
+
const [checked, setChecked] = useState(false);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (!isLoading) {
|
|
40
|
+
if (isAuthenticated) {
|
|
41
|
+
onAuthenticated?.();
|
|
42
|
+
}
|
|
43
|
+
setChecked(true);
|
|
44
|
+
}
|
|
45
|
+
}, [isAuthenticated, isLoading, onAuthenticated]);
|
|
46
|
+
if (isLoading || !checked) {
|
|
47
|
+
return loadingComponent;
|
|
48
|
+
}
|
|
49
|
+
if (isAuthenticated) {
|
|
50
|
+
return authenticatedComponent;
|
|
51
|
+
}
|
|
52
|
+
return children;
|
|
53
|
+
}
|
|
54
|
+
function RoleBasedGuard({
|
|
55
|
+
children,
|
|
56
|
+
useAuth,
|
|
57
|
+
roles = [],
|
|
58
|
+
permissions = [],
|
|
59
|
+
permissionStrategy = "all",
|
|
60
|
+
requireEmailVerified = false,
|
|
61
|
+
roleMatchStrategy = "any",
|
|
62
|
+
loadingComponent = null,
|
|
63
|
+
onAccessDenied,
|
|
64
|
+
accessDeniedComponent = null
|
|
65
|
+
}) {
|
|
66
|
+
const { isAuthenticated, isLoading, user } = useAuth();
|
|
67
|
+
let reason = null;
|
|
68
|
+
if (!isAuthenticated || !user) reason = "not_authenticated";
|
|
69
|
+
else if (requireEmailVerified && !user.emailVerified) reason = "email_not_verified";
|
|
70
|
+
else if (roles.length > 0 && !hasRole(user, roles, roleMatchStrategy)) reason = "missing_role";
|
|
71
|
+
else if (permissions.length > 0 && !hasPermission(user, permissions, permissionStrategy)) reason = "missing_permission";
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (!isLoading && reason) onAccessDenied?.(reason);
|
|
74
|
+
}, [isLoading, reason, onAccessDenied]);
|
|
75
|
+
if (isLoading) return loadingComponent;
|
|
76
|
+
if (reason) return accessDeniedComponent;
|
|
77
|
+
return children;
|
|
78
|
+
}
|
|
79
|
+
function hasRole(user, role, strategy = "any") {
|
|
80
|
+
if (!user?.roles?.length) return false;
|
|
81
|
+
const roles = Array.isArray(role) ? role : [role];
|
|
82
|
+
if (roles.length === 0) return false;
|
|
83
|
+
return strategy === "all" ? roles.every((r) => user.roles.includes(r)) : roles.some((r) => user.roles.includes(r));
|
|
84
|
+
}
|
|
85
|
+
function hasPermission(user, permission, strategy = "all") {
|
|
86
|
+
if (!user?.permissions?.length) return false;
|
|
87
|
+
const permissions = Array.isArray(permission) ? permission : [permission];
|
|
88
|
+
if (permissions.length === 0) return false;
|
|
89
|
+
return strategy === "all" ? permissions.every((p) => user.permissions.includes(p)) : permissions.some((p) => user.permissions.includes(p));
|
|
90
|
+
}
|
|
91
|
+
function createConditionalRender(user) {
|
|
92
|
+
return {
|
|
93
|
+
canRender: (options) => {
|
|
94
|
+
const { roles = [], permissions = [], roleMatchStrategy = "any" } = options;
|
|
95
|
+
if (roles.length > 0 && !hasRole(user, roles, roleMatchStrategy)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
if (permissions.length > 0 && !hasPermission(user, permissions, "all")) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { AuthGuard, GuestGuard, RoleBasedGuard, createConditionalRender, hasPermission, hasRole };
|
|
107
|
+
//# sourceMappingURL=chunk-4HUGZJKU.js.map
|
|
108
|
+
//# sourceMappingURL=chunk-4HUGZJKU.js.map
|