@tldiagram/core-ui 1.87.0 → 1.89.7

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/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@tldiagram/core-ui",
3
- "version": "1.87.0",
3
+ "version": "1.89.7",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/Mertcikla/tld"
7
+ "url": "git+https://github.com/Mertcikla/tld.git"
8
8
  },
9
9
  "main": "./dist/index.js",
10
10
  "module": "./dist/index.js",
package/src/index.ts CHANGED
@@ -99,7 +99,7 @@ export { HeaderProvider, useSetHeader, useHeader } from './components/HeaderCont
99
99
  export * from './types'
100
100
 
101
101
  // ─── Platform ────────────────────────────────────────────────────────────────
102
- export type { PlatformFeatures } from './platform/types'
102
+ export type { PlatformFeatures, PlatformRouteContext } from './platform/types'
103
103
  export { platform as localPlatform } from './platform/local'
104
104
  export { PlatformProvider } from './platform/PlatformContext'
105
105
  export { usePlatform } from './platform/context'
@@ -18,7 +18,6 @@ import {
18
18
  useDisclosure,
19
19
  VStack,
20
20
  } from '@chakra-ui/react'
21
- import { useSetHeader } from '../components/HeaderContext'
22
21
  import { api } from '../api/client'
23
22
  import type { ExploreData, ViewLayer } from '../types'
24
23
  import { FitViewIcon as FitViewSvg, TagsIcon, EyeIcon, EyeOffIcon, FocusIcon as FocusSvg } from '../components/Icons'
@@ -40,7 +39,6 @@ const MINI_ONBOARDING_KEY = 'shared_zoom_onboarding_dismissed'
40
39
  // ── Inner component ────────────────────────────────────────────────
41
40
  function InfiniteZoomInner({ sharedToken, shareSlot }: Props) {
42
41
  const navigate = useNavigate()
43
- const setHeader = useSetHeader()
44
42
 
45
43
  const [data, setData] = useState<ExploreData | null>(null)
46
44
  const [loading, setLoading] = useState(true)
@@ -111,11 +109,6 @@ function InfiniteZoomInner({ sharedToken, shareSlot }: Props) {
111
109
  setHiddenTags(prev => prev.includes(tag) ? prev.filter(t => t !== tag) : [...prev, tag])
112
110
  }, [])
113
111
 
114
- // Set page header
115
- useEffect(() => {
116
- setHeader({ node: <Text fontWeight="medium" fontSize="sm" color="gray.300">Explore</Text> })
117
- return () => setHeader(null)
118
- }, [setHeader])
119
112
  useEffect(() => {
120
113
  if (sharedToken && canvasReady && !localStorage.getItem(MINI_ONBOARDING_KEY)) {
121
114
  setShowMiniOnboarding(true)
@@ -860,9 +860,11 @@ function ViewEditorInner({
860
860
 
861
861
  // ── Dynamic viewport bounds ────────────────────────────────────────────────
862
862
  useEffect(() => {
863
+ const vw = window.innerWidth; const vh = window.innerHeight
864
+ const emptyExtent: [[number, number], [number, number]] = [[-vw, -vh], [vw, vh]]
863
865
  if (flowNodes.length === 0 && drawingPaths.length === 0) {
864
866
  setComputedMinZoom((prev) => prev === 0.05 ? prev : 0.05)
865
- setComputedTranslateExtent((prev) => prev === undefined ? prev : undefined)
867
+ setComputedTranslateExtent((prev) => areTranslateExtentsEqual(prev, emptyExtent) ? prev : emptyExtent)
866
868
  return
867
869
  }
868
870
  let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity
@@ -875,17 +877,23 @@ function ViewEditorInner({
875
877
  }
876
878
  if (!isFinite(minX)) {
877
879
  setComputedMinZoom((prev) => prev === 0.05 ? prev : 0.05)
878
- setComputedTranslateExtent((prev) => prev === undefined ? prev : undefined)
880
+ setComputedTranslateExtent((prev) => areTranslateExtentsEqual(prev, emptyExtent) ? prev : emptyExtent)
879
881
  return
880
882
  }
881
- const vw = window.innerWidth; const vh = window.innerHeight
882
883
  const bboxW = maxX - minX; const bboxH = maxY - minY
883
884
  let minZoom = Math.sqrt((0.12 * vw * vh) / Math.max(1, bboxW * bboxH))
884
885
  if (!isFinite(minZoom) || isNaN(minZoom) || minZoom <= 0) minZoom = 0.05
885
886
  const nextMinZoom = Math.max(0.05, Math.min(minZoom, 1))
886
887
  setComputedMinZoom((prev) => prev === nextMinZoom ? prev : nextMinZoom)
887
- const pmX = Math.max(vw * 2, 2000); const pmY = Math.max(vh * 2, 2000)
888
- const nextTranslateExtent: [[number, number], [number, number]] = [[minX - pmX, minY - pmY], [maxX + pmX, maxY + pmY]]
888
+ // Extent must be viewport at minZoom (else pan locks). Center on content bbox.
889
+ // Slack = content-proportional so user can always pan a bit past content edges.
890
+ const vwFlowMax = vw / nextMinZoom; const vhFlowMax = vh / nextMinZoom
891
+ const slackX = Math.max(bboxW * 0.5, 400)
892
+ const slackY = Math.max(bboxH * 0.5, 400)
893
+ const spanX = Math.max(bboxW + 2 * slackX, vwFlowMax + 2 * slackX)
894
+ const spanY = Math.max(bboxH + 2 * slackY, vhFlowMax + 2 * slackY)
895
+ const cx = (minX + maxX) / 2; const cy = (minY + maxY) / 2
896
+ const nextTranslateExtent: [[number, number], [number, number]] = [[cx - spanX / 2, cy - spanY / 2], [cx + spanX / 2, cy + spanY / 2]]
889
897
  setComputedTranslateExtent((prev) => areTranslateExtentsEqual(prev, nextTranslateExtent) ? prev : nextTranslateExtent)
890
898
  }, [flowNodes, drawingPaths])
891
899
 
@@ -1133,7 +1141,7 @@ function ViewEditorInner({
1133
1141
  onPaneContextMenu={onPaneContextMenu} onPaneClick={onPaneClick}
1134
1142
  onPaneMouseMove={onPaneMouseMove}
1135
1143
  onMoveStart={onMoveStart} onMove={onMove} onMoveEnd={onMoveEnd}
1136
- translateExtent={computedTranslateExtent} minZoom={computedMinZoom}
1144
+ translateExtent={computedTranslateExtent} nodeExtent={computedTranslateExtent} minZoom={computedMinZoom} maxZoom={4}
1137
1145
  onReconnect={onReconnect} onReconnectStart={onReconnectStart} onReconnectEnd={onReconnectEnd}
1138
1146
  nodeTypes={nodeTypesMemo} edgeTypes={edgeTypesMemo}
1139
1147
  nodesDraggable={canEdit} connectionMode={ConnectionMode.Loose} connectionRadius={25}
package/dist/favicon.svg DELETED
@@ -1,35 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
3
- <defs>
4
- <clipPath id="roundsq">
5
- <rect width="1024" height="1024" rx="224" ry="224" />
6
- </clipPath>
7
- <filter id="dshadow" x="-50%" y="-50%" width="200%" height="200%">
8
- <feGaussianBlur in="SourceAlpha" stdDeviation="32" result="blur1" />
9
- <feFlood flood-color="#63b3ed" flood-opacity="0.3" result="c1" />
10
- <feComposite in="c1" in2="blur1" operator="in" result="glow1" />
11
- <feGaussianBlur in="SourceAlpha" stdDeviation="10" result="blur2" />
12
- <feFlood flood-color="#90cdf4" flood-opacity="0.5" result="c2" />
13
- <feComposite in="c2" in2="blur2" operator="in" result="glow2" />
14
- <feDropShadow dx="0" dy="20" stdDeviation="20" flood-color="#000" flood-opacity="0.9"
15
- result="drop" />
16
- <feMerge>
17
- <feMergeNode in="glow1" />
18
- <feMergeNode in="glow2" />
19
- <feMergeNode in="SourceGraphic" />
20
- </feMerge>
21
- </filter>
22
- <linearGradient id="dgrad" x1="0" y1="0" x2="0.6" y2="1">
23
- <stop offset="0" stop-color="#90cdf4" />
24
- <stop offset="0.45" stop-color="#63b3ed" />
25
- <stop offset="1" stop-color="#2b6cb0" />
26
- </linearGradient>
27
- </defs>
28
- <g clip-path="url(#roundsq)" transform="matrix(1, 0, 0, 1, -1.4210854715202004e-14, 0)">
29
- <g filter="url(#dshadow)" transform="translate(78, 118) scale(0.8)" fill-rule="evenodd">
30
- <path
31
- d="M201 18s169-39 340-2c171 38 342 152 342 457S713 902 544 949c-170 48-344 19-344 19l1-566h302V217H201z M455 715c-67 83-122 141-62 48q23-35 33-62h-4a78 78 0 1 1 78-78q0 24-12 44-11 21-33 48"
32
- fill="url(#dgrad)" />
33
- </g>
34
- </g>
35
- </svg>
package/dist/logo-120.png DELETED
Binary file
package/dist/logo-bw.png DELETED
Binary file
package/dist/logo-bw.svg DELETED
@@ -1,15 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
3
- <defs>
4
- <clipPath id="roundsq">
5
- <rect width="1024" height="1024" rx="224" ry="224" />
6
- </clipPath>
7
- </defs>
8
- <g clip-path="url(#roundsq)">
9
- <g transform="translate(78, 118) scale(0.8)" fill-rule="evenodd">
10
- <path
11
- d="M201 18s169-39 340-2c171 38 342 152 342 457S713 902 544 949c-170 48-344 19-344 19l1-566h302V217H201z M455 715c-67 83-122 141-62 48q23-35 33-62h-4a78 78 0 1 1 78-78q0 24-12 44-11 21-33 48"
12
- fill="#000000" />
13
- </g>
14
- </g>
15
- </svg>