@almadar/ui 2.51.0 → 2.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/avl/index.js CHANGED
@@ -19342,13 +19342,13 @@ var MapViewImpl = lazy(async () => {
19342
19342
  shadowSize: [41, 41]
19343
19343
  });
19344
19344
  L.Marker.prototype.options.icon = defaultIcon;
19345
- const { useEffect: useEffect87, useRef: useRef87, useCallback: useCallback124, useState: useState124 } = React125__default;
19345
+ const { useEffect: useEffect88, useRef: useRef88, useCallback: useCallback124, useState: useState124 } = React125__default;
19346
19346
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
19347
19347
  const { useEventBus: useEventBus3 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
19348
19348
  function MapUpdater({ centerLat, centerLng, zoom }) {
19349
19349
  const map = useMap();
19350
- const prevRef = useRef87({ centerLat, centerLng, zoom });
19351
- useEffect87(() => {
19350
+ const prevRef = useRef88({ centerLat, centerLng, zoom });
19351
+ useEffect88(() => {
19352
19352
  const prev = prevRef.current;
19353
19353
  if (prev.centerLat !== centerLat || prev.centerLng !== centerLng || prev.zoom !== zoom) {
19354
19354
  map.setView([centerLat, centerLng], zoom);
@@ -19359,7 +19359,7 @@ var MapViewImpl = lazy(async () => {
19359
19359
  }
19360
19360
  function MapClickHandler({ onMapClick }) {
19361
19361
  const map = useMap();
19362
- useEffect87(() => {
19362
+ useEffect88(() => {
19363
19363
  if (!onMapClick) return;
19364
19364
  const handler = (e) => {
19365
19365
  onMapClick(e.latlng.lat, e.latlng.lng);
@@ -22086,6 +22086,26 @@ var CodeBlock = React125__default.memo(
22086
22086
  const codeRef = useRef(null);
22087
22087
  const savedScrollLeftRef = useRef(0);
22088
22088
  const [copied, setCopied] = useState(false);
22089
+ const [editableValue, setEditableValue] = useState(code);
22090
+ const [editableTextareaKey, setEditableTextareaKey] = useState(0);
22091
+ const lastPropCodeRef = useRef(code);
22092
+ const editableTextareaRef = useRef(null);
22093
+ const editableOverlayRef = useRef(null);
22094
+ useEffect(() => {
22095
+ if (code !== lastPropCodeRef.current) {
22096
+ lastPropCodeRef.current = code;
22097
+ setEditableValue(code);
22098
+ setEditableTextareaKey((k) => k + 1);
22099
+ }
22100
+ }, [code]);
22101
+ const handleEditableScroll = useCallback(() => {
22102
+ const ta = editableTextareaRef.current;
22103
+ const ov = editableOverlayRef.current;
22104
+ if (ta && ov) {
22105
+ ov.scrollTop = ta.scrollTop;
22106
+ ov.scrollLeft = ta.scrollLeft;
22107
+ }
22108
+ }, []);
22089
22109
  const isFoldable = foldableProp ?? (language === "orb" || language === "json");
22090
22110
  const [collapsed, setCollapsed] = useState(() => /* @__PURE__ */ new Set());
22091
22111
  const foldRegions = useMemo(
@@ -22246,33 +22266,106 @@ var CodeBlock = React125__default.memo(
22246
22266
  }
22247
22267
  ),
22248
22268
  editable ? (
22249
- /* GAP-51: editable mode composes the Textarea atom. Plain text editing,
22250
- no Prism highlighting overlay (follow-up). The textarea is uncontrolled
22251
- on the value side: we pass `code` as the initial value and forward
22252
- every keystroke via onChange the consumer is responsible for
22253
- debouncing and re-deriving `code` only after the user stops typing
22254
- so the cursor doesn't fight a re-render. */
22255
- /* @__PURE__ */ jsx(
22256
- Textarea,
22269
+ /* GAP-77: editable mode = transparent Textarea on top + Prism-highlighted
22270
+ overlay underneath. The textarea is uncontrolled (defaultValue + key)
22271
+ to avoid cursor jumps; the overlay reads `editableValue` which is
22272
+ mirrored from the textarea via onChange. Both elements share IDENTICAL
22273
+ font / line-height / padding so the highlighted text aligns with the
22274
+ textarea's invisible glyphs.
22275
+
22276
+ Scroll sync: the overlay has `pointer-events: none` and the textarea
22277
+ scrolls; `handleEditableScroll` keeps the overlay's scroll matched. */
22278
+ /* @__PURE__ */ jsxs(
22279
+ Box,
22257
22280
  {
22258
- defaultValue: code,
22259
- onChange: (e) => onChange?.(e.target.value),
22260
- spellCheck: false,
22261
22281
  style: {
22262
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Courier New", monospace',
22263
- fontSize: "13px",
22264
- lineHeight: "1.5",
22282
+ position: "relative",
22265
22283
  backgroundColor: "#1e1e1e",
22266
- color: "#e6e6e6",
22267
22284
  borderRadius: hasHeader ? "0 0 0.5rem 0.5rem" : "0.5rem",
22268
- border: "none",
22269
- padding: "1rem",
22270
- resize: "none",
22271
22285
  minHeight: "160px",
22272
22286
  maxHeight,
22273
- width: "100%",
22274
- outline: "none"
22275
- }
22287
+ overflow: "hidden"
22288
+ },
22289
+ children: [
22290
+ /* @__PURE__ */ jsx(
22291
+ "div",
22292
+ {
22293
+ ref: editableOverlayRef,
22294
+ "aria-hidden": true,
22295
+ style: {
22296
+ position: "absolute",
22297
+ inset: 0,
22298
+ overflow: "hidden",
22299
+ pointerEvents: "none",
22300
+ maxHeight
22301
+ },
22302
+ children: /* @__PURE__ */ jsx(
22303
+ SyntaxHighlighter,
22304
+ {
22305
+ PreTag: "div",
22306
+ language,
22307
+ style: activeStyle,
22308
+ customStyle: {
22309
+ backgroundColor: "transparent",
22310
+ borderRadius: 0,
22311
+ padding: "1rem",
22312
+ margin: 0,
22313
+ whiteSpace: "pre",
22314
+ minWidth: "100%",
22315
+ minHeight: "160px",
22316
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Courier New", monospace',
22317
+ fontSize: "13px",
22318
+ lineHeight: "1.5"
22319
+ },
22320
+ codeTagProps: {
22321
+ style: {
22322
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Courier New", monospace',
22323
+ fontSize: "13px",
22324
+ lineHeight: "1.5"
22325
+ }
22326
+ },
22327
+ children: editableValue || " "
22328
+ }
22329
+ )
22330
+ }
22331
+ ),
22332
+ /* @__PURE__ */ jsx(
22333
+ Textarea,
22334
+ {
22335
+ ref: editableTextareaRef,
22336
+ defaultValue: code,
22337
+ onChange: (e) => {
22338
+ setEditableValue(e.target.value);
22339
+ onChange?.(e.target.value);
22340
+ },
22341
+ onScroll: handleEditableScroll,
22342
+ spellCheck: false,
22343
+ style: {
22344
+ position: "relative",
22345
+ zIndex: 1,
22346
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Cascadia Mono", "Courier New", monospace',
22347
+ fontSize: "13px",
22348
+ lineHeight: "1.5",
22349
+ backgroundColor: "transparent",
22350
+ color: "transparent",
22351
+ caretColor: "#e6e6e6",
22352
+ borderRadius: hasHeader ? "0 0 0.5rem 0.5rem" : "0.5rem",
22353
+ border: "none",
22354
+ padding: "1rem",
22355
+ resize: "none",
22356
+ minHeight: "160px",
22357
+ maxHeight,
22358
+ width: "100%",
22359
+ height: "100%",
22360
+ outline: "none",
22361
+ whiteSpace: "pre",
22362
+ overflowWrap: "normal",
22363
+ overflow: "auto"
22364
+ }
22365
+ },
22366
+ editableTextareaKey
22367
+ )
22368
+ ]
22276
22369
  }
22277
22370
  )
22278
22371
  ) : /* @__PURE__ */ jsx(
@@ -47729,12 +47822,18 @@ var OrbPreviewNodeInner = (props) => {
47729
47822
  el = el.parentElement;
47730
47823
  if (!el || el === contentRef.current) break;
47731
47824
  }
47825
+ const containerNode = {
47826
+ orbitalName: data.orbitalName,
47827
+ traitName: data.traitName,
47828
+ transitionEvent: data.transitionEvent
47829
+ };
47732
47830
  const containerPath = el?.dataset?.patternPath;
47733
47831
  if (!containerPath) {
47734
- eventBus.emit("UI:PATTERN_INSERT", {
47832
+ eventBus.emit("UI:PATTERN_DROP", {
47735
47833
  parentPath: "root",
47736
47834
  patternType: payload.data.type,
47737
- index: 0
47835
+ index: 0,
47836
+ containerNode
47738
47837
  });
47739
47838
  return;
47740
47839
  }
@@ -47751,12 +47850,13 @@ var OrbPreviewNodeInner = (props) => {
47751
47850
  break;
47752
47851
  }
47753
47852
  }
47754
- eventBus.emit("UI:PATTERN_INSERT", {
47853
+ eventBus.emit("UI:PATTERN_DROP", {
47755
47854
  parentPath: containerPath,
47756
47855
  patternType: payload.data.type,
47757
- index: insertIndex
47856
+ index: insertIndex,
47857
+ containerNode
47758
47858
  });
47759
- }, [eventBus]);
47859
+ }, [eventBus, data.orbitalName, data.traitName, data.transitionEvent]);
47760
47860
  const handlePreviewDragOver = useCallback((e) => {
47761
47861
  if (!e.dataTransfer.types.includes(ALMADAR_DND_MIME)) return;
47762
47862
  e.preventDefault();
@@ -48396,7 +48496,7 @@ function OrbInspector({ node, schema, editable = false, onSchemaChange, onClose
48396
48496
  onBlur: (e) => handlePropChange(propName, e.target.value)
48397
48497
  }
48398
48498
  ) : /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "text-[11px] text-muted-foreground", children: [
48399
- displayValue || (ps.types?.join(" | ") ?? "string"),
48499
+ displayValue || "\u2014",
48400
48500
  ps.required ? " *" : ""
48401
48501
  ] })
48402
48502
  ] }, propName);
@@ -48667,6 +48767,7 @@ function FlowCanvasInner({
48667
48767
  onNodeClick,
48668
48768
  onLevelChange,
48669
48769
  onOrbitalDoubleClick,
48770
+ cosmicEntryLevel = "expanded",
48670
48771
  initialOrbital,
48671
48772
  initialLevel,
48672
48773
  initialSelectedNode,
@@ -48740,19 +48841,24 @@ function FlowCanvasInner({
48740
48841
  }
48741
48842
  if (level === "overview") {
48742
48843
  const d = node.data;
48743
- setExpandedOrbital(d.orbitalName ?? node.id);
48844
+ const orbitalName = d.orbitalName ?? node.id;
48845
+ if (onOrbitalDoubleClick && (cosmicEntryLevel === "overview" || cosmicEntryLevel === "both")) {
48846
+ onOrbitalDoubleClick(orbitalName);
48847
+ return;
48848
+ }
48849
+ setExpandedOrbital(orbitalName);
48744
48850
  setLevel("expanded");
48745
- onLevelChange?.("expanded", d.orbitalName ?? node.id);
48851
+ onLevelChange?.("expanded", orbitalName);
48746
48852
  return;
48747
48853
  }
48748
48854
  if (level === "expanded") {
48749
48855
  const d = node.data;
48750
48856
  const orbitalName = d.orbitalName ?? node.id;
48751
- if (orbitalName && onOrbitalDoubleClick) {
48857
+ if (orbitalName && onOrbitalDoubleClick && (cosmicEntryLevel === "expanded" || cosmicEntryLevel === "both")) {
48752
48858
  onOrbitalDoubleClick(orbitalName);
48753
48859
  }
48754
48860
  }
48755
- }, [level, onLevelChange, onOrbitalDoubleClick, atBehaviorLevel, composeLevel]);
48861
+ }, [level, onLevelChange, onOrbitalDoubleClick, cosmicEntryLevel, atBehaviorLevel, composeLevel]);
48756
48862
  const handleNodeClick = useCallback((_, node) => {
48757
48863
  const nodeData = node.data;
48758
48864
  if (level === "expanded") {
@@ -49288,7 +49394,10 @@ var AvlOrbitalsCosmicZoom = ({
49288
49394
  animated = true,
49289
49395
  width = "100%",
49290
49396
  height = 450,
49291
- highlightedOrbital
49397
+ highlightedOrbital,
49398
+ onOrbitalSelect,
49399
+ minZoom = 0.4,
49400
+ maxZoom = 3
49292
49401
  }) => {
49293
49402
  const parsedSchema = useMemo(() => {
49294
49403
  if (typeof schemaProp === "string") return JSON.parse(schemaProp);
@@ -49319,10 +49428,83 @@ var AvlOrbitalsCosmicZoom = ({
49319
49428
  );
49320
49429
  const [selected, setSelected] = useState(null);
49321
49430
  const handleSelect = useCallback(
49322
- (name) => setSelected((prev) => prev === name ? null : name),
49323
- []
49431
+ (name) => {
49432
+ setSelected((prev) => prev === name ? null : name);
49433
+ onOrbitalSelect?.(name);
49434
+ },
49435
+ [onOrbitalSelect]
49324
49436
  );
49325
49437
  const selectedView = orbitalViews.find((o) => o.name === selected);
49438
+ const [zoom, setZoom] = useState(1);
49439
+ const [pan, setPan] = useState({ x: 0, y: 0 });
49440
+ const dragStateRef = useRef(null);
49441
+ const transformWrapperRef = useRef(null);
49442
+ const clampZoom = useCallback(
49443
+ (z) => Math.max(minZoom, Math.min(maxZoom, z)),
49444
+ [minZoom, maxZoom]
49445
+ );
49446
+ const handlePointerDown = useCallback((e) => {
49447
+ if (e.target.closest("[data-orbital-tile]")) return;
49448
+ dragStateRef.current = {
49449
+ startX: e.clientX,
49450
+ startY: e.clientY,
49451
+ panX: pan.x,
49452
+ panY: pan.y
49453
+ };
49454
+ e.target.setPointerCapture(e.pointerId);
49455
+ }, [pan]);
49456
+ const handlePointerMove = useCallback((e) => {
49457
+ const drag = dragStateRef.current;
49458
+ if (!drag) return;
49459
+ setPan({
49460
+ x: drag.panX + (e.clientX - drag.startX),
49461
+ y: drag.panY + (e.clientY - drag.startY)
49462
+ });
49463
+ }, []);
49464
+ const handlePointerUp = useCallback((e) => {
49465
+ if (!dragStateRef.current) return;
49466
+ dragStateRef.current = null;
49467
+ try {
49468
+ e.target.releasePointerCapture(e.pointerId);
49469
+ } catch {
49470
+ }
49471
+ }, []);
49472
+ const panRef = useRef(pan);
49473
+ const zoomRef = useRef(zoom);
49474
+ useEffect(() => {
49475
+ panRef.current = pan;
49476
+ }, [pan]);
49477
+ useEffect(() => {
49478
+ zoomRef.current = zoom;
49479
+ }, [zoom]);
49480
+ useEffect(() => {
49481
+ const wrapper = transformWrapperRef.current;
49482
+ if (!wrapper) return;
49483
+ const wheelListener = (e) => {
49484
+ e.preventDefault();
49485
+ const rect = wrapper.getBoundingClientRect();
49486
+ const cursorX = e.clientX - rect.left;
49487
+ const cursorY = e.clientY - rect.top;
49488
+ const currentZoom = zoomRef.current;
49489
+ const currentPan = panRef.current;
49490
+ const worldX = (cursorX - currentPan.x) / currentZoom;
49491
+ const worldY = (cursorY - currentPan.y) / currentZoom;
49492
+ const delta = e.deltaY > 0 ? -0.1 : 0.1;
49493
+ const nextZoom = clampZoom(currentZoom * (1 + delta));
49494
+ const nextPanX = cursorX - worldX * nextZoom;
49495
+ const nextPanY = cursorY - worldY * nextZoom;
49496
+ setZoom(nextZoom);
49497
+ setPan({ x: nextPanX, y: nextPanY });
49498
+ };
49499
+ wrapper.addEventListener("wheel", wheelListener, { passive: false });
49500
+ return () => wrapper.removeEventListener("wheel", wheelListener);
49501
+ }, [clampZoom]);
49502
+ const zoomIn = useCallback(() => setZoom((z) => clampZoom(z * 1.2)), [clampZoom]);
49503
+ const zoomOut = useCallback(() => setZoom((z) => clampZoom(z / 1.2)), [clampZoom]);
49504
+ const resetZoom = useCallback(() => {
49505
+ setZoom(1);
49506
+ setPan({ x: 0, y: 0 });
49507
+ }, []);
49326
49508
  return /* @__PURE__ */ jsxs(
49327
49509
  Box,
49328
49510
  {
@@ -49332,65 +49514,115 @@ var AvlOrbitalsCosmicZoom = ({
49332
49514
  style: { width, height: containerH },
49333
49515
  children: [
49334
49516
  /* @__PURE__ */ jsx(
49335
- EventWireOverlay,
49517
+ "div",
49336
49518
  {
49337
- orbitalViews,
49338
- crossLinks,
49339
- color,
49340
- animated,
49341
- containerW,
49342
- containerH
49343
- }
49344
- ),
49345
- orbitalViews.map((view) => {
49346
- const isHighlighted = view.name === highlightedOrbital;
49347
- return /* @__PURE__ */ jsx(
49348
- Box,
49349
- {
49350
- role: "button",
49351
- tabIndex: 0,
49352
- onClick: () => handleSelect(view.name),
49353
- onKeyDown: (e) => {
49354
- if (e.key === "Enter" || e.key === " ") handleSelect(view.name);
49355
- },
49356
- "aria-label": `Orbital: ${view.name}${isHighlighted ? " (highlighted)" : ""}`,
49519
+ ref: transformWrapperRef,
49520
+ onPointerDown: handlePointerDown,
49521
+ onPointerMove: handlePointerMove,
49522
+ onPointerUp: handlePointerUp,
49523
+ onPointerCancel: handlePointerUp,
49524
+ style: {
49357
49525
  position: "absolute",
49358
- style: {
49359
- left: view.cx - UNIT_DISPLAY_W / 2,
49360
- top: view.cy - UNIT_DISPLAY_H / 2,
49361
- width: UNIT_DISPLAY_W,
49362
- height: UNIT_DISPLAY_H,
49363
- cursor: "pointer",
49364
- transition: "transform 0.2s ease, filter 0.2s ease, box-shadow 0.3s ease",
49365
- transform: selected === view.name ? "scale(1.05)" : "scale(1)",
49366
- filter: selected && selected !== view.name ? "opacity(0.5)" : "none",
49367
- // GAP-52: persistent highlight ring (independent from user selection)
49368
- boxShadow: isHighlighted ? `0 0 0 3px ${color}, 0 0 24px 4px ${color}` : "none",
49369
- borderRadius: isHighlighted ? "12px" : void 0,
49370
- zIndex: isHighlighted ? 11 : selected === view.name ? 10 : 1
49371
- },
49372
- children: /* @__PURE__ */ jsx(
49373
- AvlOrbitalUnit,
49374
- {
49375
- entityName: view.entityName,
49376
- fields: view.fieldCount,
49377
- persistence: view.persistence,
49378
- traits: view.traits,
49379
- pages: view.pages,
49380
- color,
49381
- animated: animated && (selected === view.name || isHighlighted)
49382
- }
49383
- )
49526
+ inset: 0,
49527
+ overflow: "hidden",
49528
+ cursor: dragStateRef.current ? "grabbing" : "grab",
49529
+ touchAction: "none"
49384
49530
  },
49385
- view.name
49386
- );
49387
- }),
49388
- selectedView && /* @__PURE__ */ jsx(
49389
- InfoPanel,
49531
+ children: /* @__PURE__ */ jsxs(
49532
+ "div",
49533
+ {
49534
+ style: {
49535
+ position: "absolute",
49536
+ inset: 0,
49537
+ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`,
49538
+ transformOrigin: "0 0"
49539
+ },
49540
+ children: [
49541
+ /* @__PURE__ */ jsx(
49542
+ EventWireOverlay,
49543
+ {
49544
+ orbitalViews,
49545
+ crossLinks,
49546
+ color,
49547
+ animated,
49548
+ containerW,
49549
+ containerH
49550
+ }
49551
+ ),
49552
+ orbitalViews.map((view) => {
49553
+ const isHighlighted = view.name === highlightedOrbital;
49554
+ return /* @__PURE__ */ jsx(
49555
+ Box,
49556
+ {
49557
+ role: "button",
49558
+ tabIndex: 0,
49559
+ "data-orbital-tile": "true",
49560
+ onClick: () => handleSelect(view.name),
49561
+ onKeyDown: (e) => {
49562
+ if (e.key === "Enter" || e.key === " ") handleSelect(view.name);
49563
+ },
49564
+ "aria-label": `Orbital: ${view.name}${isHighlighted ? " (highlighted)" : ""}`,
49565
+ position: "absolute",
49566
+ style: {
49567
+ left: view.cx - UNIT_DISPLAY_W / 2,
49568
+ top: view.cy - UNIT_DISPLAY_H / 2,
49569
+ width: UNIT_DISPLAY_W,
49570
+ height: UNIT_DISPLAY_H,
49571
+ cursor: "pointer",
49572
+ transition: "transform 0.2s ease, filter 0.2s ease, box-shadow 0.3s ease",
49573
+ transform: selected === view.name ? "scale(1.05)" : "scale(1)",
49574
+ filter: selected && selected !== view.name ? "opacity(0.5)" : "none",
49575
+ // GAP-52: persistent highlight ring (independent from user selection)
49576
+ boxShadow: isHighlighted ? `0 0 0 3px ${color}, 0 0 24px 4px ${color}` : "none",
49577
+ borderRadius: isHighlighted ? "12px" : void 0,
49578
+ zIndex: isHighlighted ? 11 : selected === view.name ? 10 : 1
49579
+ },
49580
+ children: /* @__PURE__ */ jsx(
49581
+ AvlOrbitalUnit,
49582
+ {
49583
+ entityName: view.entityName,
49584
+ fields: view.fieldCount,
49585
+ persistence: view.persistence,
49586
+ traits: view.traits,
49587
+ pages: view.pages,
49588
+ color,
49589
+ animated: animated && (selected === view.name || isHighlighted)
49590
+ }
49591
+ )
49592
+ },
49593
+ view.name
49594
+ );
49595
+ }),
49596
+ selectedView && /* @__PURE__ */ jsx(
49597
+ InfoPanel,
49598
+ {
49599
+ view: selectedView,
49600
+ crossLinks,
49601
+ color
49602
+ }
49603
+ )
49604
+ ]
49605
+ }
49606
+ )
49607
+ }
49608
+ ),
49609
+ /* @__PURE__ */ jsxs(
49610
+ Box,
49390
49611
  {
49391
- view: selectedView,
49392
- crossLinks,
49393
- color
49612
+ position: "absolute",
49613
+ style: {
49614
+ top: 12,
49615
+ right: 12,
49616
+ display: "flex",
49617
+ flexDirection: "column",
49618
+ gap: 4,
49619
+ zIndex: 30
49620
+ },
49621
+ children: [
49622
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: zoomIn, title: "Zoom in", action: "COSMIC_ZOOM_IN", children: /* @__PURE__ */ jsx(Icon, { name: "plus", size: "sm" }) }),
49623
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: zoomOut, title: "Zoom out", action: "COSMIC_ZOOM_OUT", children: /* @__PURE__ */ jsx(Icon, { name: "minus", size: "sm" }) }),
49624
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", size: "sm", onClick: resetZoom, title: "Reset", action: "COSMIC_ZOOM_RESET", children: /* @__PURE__ */ jsx(Icon, { name: "maximize", size: "sm" }) })
49625
+ ]
49394
49626
  }
49395
49627
  )
49396
49628
  ]