camox 0.10.0 → 0.10.1

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.
@@ -20,6 +20,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@camox/ui/popover";
20
20
  import { toast } from "@camox/ui/toaster";
21
21
  import { Type as Type$1 } from "@sinclair/typebox";
22
22
  import { useMutation, useQuery } from "@tanstack/react-query";
23
+ import { useLocation } from "@tanstack/react-router";
23
24
  import { useSelector } from "@xstate/store/react";
24
25
  import { generateKeyBetween } from "fractional-indexing";
25
26
  import * as React from "react";
@@ -35,9 +36,16 @@ const normalizeLinkValue = (value) => {
35
36
  };
36
37
  return value;
37
38
  };
38
- /** Resolve a LinkValue to an href string */
39
- const resolveLinkHref = (link, pages) => {
40
- if (link.type === "page") return (pages?.find((p) => String(p.id) === link.pageId))?.fullPath ?? "#";
39
+ /**
40
+ * Resolve a LinkValue to an href string.
41
+ *
42
+ * Hash-only and empty hrefs are anchored to `currentPathname` so TanStack Router's
43
+ * `<Link to>` builds the same `href` on SSR and client — bare `"#"` otherwise
44
+ * resolves inconsistently across environments, causing hydration mismatches.
45
+ */
46
+ const resolveLinkHref = (link, pages, currentPathname) => {
47
+ if (link.type === "page") return (pages?.find((p) => String(p.id) === link.pageId))?.fullPath ?? currentPathname;
48
+ if (!link.href || link.href.startsWith("#")) return `${currentPathname}${link.href ?? ""}`;
41
49
  return link.href;
42
50
  };
43
51
  let hasShownEmbedLockToast = false;
@@ -506,7 +514,7 @@ function createBlock(options) {
506
514
  return t28;
507
515
  };
508
516
  const Link = (t0) => {
509
- const $ = c(36);
517
+ const $ = c(37);
510
518
  const { name, children } = t0;
511
519
  const blockContext = React.use(Context);
512
520
  if (!blockContext) throw new Error("Link must be used within a Block Component");
@@ -554,7 +562,12 @@ function createBlock(options) {
554
562
  $[8] = t6;
555
563
  } else t6 = $[8];
556
564
  const { data: pages } = useQuery(t6);
557
- const resolvedHref = resolveLinkHref(fieldValue, pages);
565
+ let t7;
566
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
567
+ t7 = { select: _temp2 };
568
+ $[9] = t7;
569
+ } else t7 = $[9];
570
+ const resolvedHref = resolveLinkHref(fieldValue, pages, useLocation(t7));
558
571
  const fieldId = getOverlayFieldId(blockId, repeaterContext, String(name));
559
572
  const [isEditing, setIsEditing] = React.useState(false);
560
573
  const [displayText, setDisplayText] = React.useState(fieldValue.text);
@@ -566,24 +579,24 @@ function createBlock(options) {
566
579
  if (!isEditing) setDisplayText(fieldValue.text);
567
580
  }, [fieldValue.text, isEditing]);
568
581
  const isHoveredFromSidebar = useOverlayMessage(iframeWindow, isContentEditable, "CAMOX_HOVER_FIELD", "CAMOX_HOVER_FIELD_END", { fieldId });
569
- let t7;
570
582
  let t8;
571
- if ($[9] !== isHoveredFromSidebar) {
572
- t7 = () => {
583
+ let t9;
584
+ if ($[10] !== isHoveredFromSidebar) {
585
+ t8 = () => {
573
586
  setIsHovered(isHoveredFromSidebar);
574
587
  };
575
- t8 = [isHoveredFromSidebar];
576
- $[9] = isHoveredFromSidebar;
577
- $[10] = t7;
588
+ t9 = [isHoveredFromSidebar];
589
+ $[10] = isHoveredFromSidebar;
578
590
  $[11] = t8;
591
+ $[12] = t9;
579
592
  } else {
580
- t7 = $[10];
581
593
  t8 = $[11];
594
+ t9 = $[12];
582
595
  }
583
- React.useEffect(t7, t8);
584
- let t9;
585
- if ($[12] !== blockId || $[13] !== name || $[14] !== repeaterContext || $[15] !== updateBlockContent || $[16] !== updateRepeatableContent) {
586
- t9 = (newLinkValue) => {
596
+ React.useEffect(t8, t9);
597
+ let t10;
598
+ if ($[13] !== blockId || $[14] !== name || $[15] !== repeaterContext || $[16] !== updateBlockContent || $[17] !== updateRepeatableContent) {
599
+ t10 = (newLinkValue) => {
587
600
  if (repeaterContext?.itemId != null) updateRepeatableContent.mutate({
588
601
  id: repeaterContext.itemId,
589
602
  content: { [name]: newLinkValue }
@@ -593,14 +606,14 @@ function createBlock(options) {
593
606
  content: { [name]: newLinkValue }
594
607
  });
595
608
  };
596
- $[12] = blockId;
597
- $[13] = name;
598
- $[14] = repeaterContext;
599
- $[15] = updateBlockContent;
600
- $[16] = updateRepeatableContent;
601
- $[17] = t9;
602
- } else t9 = $[17];
603
- const saveLinkValue = t9;
609
+ $[13] = blockId;
610
+ $[14] = name;
611
+ $[15] = repeaterContext;
612
+ $[16] = updateBlockContent;
613
+ $[17] = updateRepeatableContent;
614
+ $[18] = t10;
615
+ } else t10 = $[18];
616
+ const saveLinkValue = t10;
604
617
  const handleInput = (e) => {
605
618
  const newText = e.target.textContent || "";
606
619
  saveLinkValue({
@@ -608,9 +621,9 @@ function createBlock(options) {
608
621
  text: newText
609
622
  });
610
623
  };
611
- let t10;
612
- if ($[18] !== blockId || $[19] !== name || $[20] !== repeaterContext) {
613
- t10 = () => {
624
+ let t11;
625
+ if ($[19] !== blockId || $[20] !== name || $[21] !== repeaterContext) {
626
+ t11 = () => {
614
627
  setIsEditing(true);
615
628
  setIsEditorFocused(true);
616
629
  if (repeaterContext?.itemId != null) previewStore.send({
@@ -627,32 +640,32 @@ function createBlock(options) {
627
640
  fieldType: "Link"
628
641
  });
629
642
  };
630
- $[18] = blockId;
631
- $[19] = name;
632
- $[20] = repeaterContext;
633
- $[21] = t10;
634
- } else t10 = $[21];
635
- const handleFocus = t10;
636
- let t11;
637
- if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
638
- t11 = () => {
639
- setIsEditing(false);
640
- setIsEditorFocused(false);
641
- };
643
+ $[19] = blockId;
644
+ $[20] = name;
645
+ $[21] = repeaterContext;
642
646
  $[22] = t11;
643
647
  } else t11 = $[22];
644
- const handleBlur = t11;
648
+ const handleFocus = t11;
645
649
  let t12;
646
650
  if ($[23] === Symbol.for("react.memo_cache_sentinel")) {
647
- t12 = (e_0) => {
651
+ t12 = () => {
652
+ setIsEditing(false);
653
+ setIsEditorFocused(false);
654
+ };
655
+ $[23] = t12;
656
+ } else t12 = $[23];
657
+ const handleBlur = t12;
658
+ let t13;
659
+ if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
660
+ t13 = (e_0) => {
648
661
  e_0.stopPropagation();
649
662
  previewStore.send({ type: "toggleContentSheet" });
650
663
  setIsEditorFocused(false);
651
664
  setIsEditing(false);
652
665
  };
653
- $[23] = t12;
654
- } else t12 = $[23];
655
- const handleEditLink = t12;
666
+ $[24] = t13;
667
+ } else t13 = $[24];
668
+ const handleEditLink = t13;
656
669
  const linkData = {
657
670
  text: displayText,
658
671
  href: resolvedHref,
@@ -664,16 +677,16 @@ function createBlock(options) {
664
677
  rel: fieldValue.newTab ? "noreferrer" : void 0,
665
678
  children: fieldValue.text
666
679
  }, linkData) });
667
- let t13;
668
680
  let t14;
669
- if ($[24] === Symbol.for("react.memo_cache_sentinel")) {
670
- t13 = () => setIsHovered(true);
671
- t14 = () => setIsHovered(false);
672
- $[24] = t13;
681
+ let t15;
682
+ if ($[25] === Symbol.for("react.memo_cache_sentinel")) {
683
+ t14 = () => setIsHovered(true);
684
+ t15 = () => setIsHovered(false);
673
685
  $[25] = t14;
686
+ $[26] = t15;
674
687
  } else {
675
- t13 = $[24];
676
688
  t14 = $[25];
689
+ t15 = $[26];
677
690
  }
678
691
  const linkProps = {
679
692
  ref: elementRef,
@@ -686,56 +699,56 @@ function createBlock(options) {
686
699
  "data-camox-focused": isFocused || void 0,
687
700
  "data-camox-overlay-mode": mode === "layout" ? "layout" : void 0,
688
701
  contentEditable: true,
689
- onClick: _temp2,
702
+ onClick: _temp3,
690
703
  onInput: handleInput,
691
704
  onFocus: handleFocus,
692
705
  onBlur: handleBlur,
693
- onMouseEnter: t13,
694
- onMouseLeave: t14,
695
- onKeyDown: _temp3,
706
+ onMouseEnter: t14,
707
+ onMouseLeave: t15,
708
+ onKeyDown: _temp4,
696
709
  spellCheck: false,
697
710
  suppressContentEditableWarning: true
698
711
  };
699
712
  const T0 = Popover;
700
- const t15 = children(linkProps, linkData);
701
- let t16;
702
- if ($[26] !== handleEditLink) {
703
- t16 = /* @__PURE__ */ jsx("button", {
713
+ const t16 = children(linkProps, linkData);
714
+ let t17;
715
+ if ($[27] !== handleEditLink) {
716
+ t17 = /* @__PURE__ */ jsx("button", {
704
717
  type: "button",
705
718
  className: "hover:bg-accent flex items-center gap-1.5 rounded-md px-2 py-1 text-sm transition-colors",
706
- onMouseDown: _temp4,
719
+ onMouseDown: _temp5,
707
720
  onClick: handleEditLink,
708
721
  children: "Edit link"
709
722
  });
710
- $[26] = handleEditLink;
711
- $[27] = t16;
712
- } else t16 = $[27];
713
- let t17;
714
- if ($[28] !== elementRef || $[29] !== t16) {
715
- t17 = /* @__PURE__ */ jsx(PopoverContent, {
723
+ $[27] = handleEditLink;
724
+ $[28] = t17;
725
+ } else t17 = $[28];
726
+ let t18;
727
+ if ($[29] !== elementRef || $[30] !== t17) {
728
+ t18 = /* @__PURE__ */ jsx(PopoverContent, {
716
729
  className: "w-auto p-2",
717
730
  initialFocus: false,
718
731
  anchor: elementRef,
719
732
  align: "end",
720
- children: t16
733
+ children: t17
721
734
  });
722
- $[28] = elementRef;
723
- $[29] = t16;
735
+ $[29] = elementRef;
724
736
  $[30] = t17;
725
- } else t17 = $[30];
726
- let t18;
727
- if ($[31] !== T0 || $[32] !== isEditorFocused || $[33] !== t15 || $[34] !== t17) {
728
- t18 = /* @__PURE__ */ jsxs(T0, {
737
+ $[31] = t18;
738
+ } else t18 = $[31];
739
+ let t19;
740
+ if ($[32] !== T0 || $[33] !== isEditorFocused || $[34] !== t16 || $[35] !== t18) {
741
+ t19 = /* @__PURE__ */ jsxs(T0, {
729
742
  open: isEditorFocused,
730
- children: [t15, t17]
743
+ children: [t16, t18]
731
744
  });
732
- $[31] = T0;
733
- $[32] = isEditorFocused;
734
- $[33] = t15;
735
- $[34] = t17;
745
+ $[32] = T0;
746
+ $[33] = isEditorFocused;
747
+ $[34] = t16;
736
748
  $[35] = t18;
737
- } else t18 = $[35];
738
- return t18;
749
+ $[36] = t19;
750
+ } else t19 = $[36];
751
+ return t19;
739
752
  };
740
753
  const Image = (t0) => {
741
754
  const $ = c(25);
@@ -1048,9 +1061,9 @@ function createBlock(options) {
1048
1061
  const isContentEditable = useIsEditable(mode);
1049
1062
  const { window: iframeWindow } = useFrame();
1050
1063
  const [isHovered, setIsHovered] = React.useState(false);
1051
- const selection = useSelector(previewStore, _temp5);
1052
- const isPageContentSheetOpen = useSelector(previewStore, _temp6);
1053
- const isAddBlockSheetOpen = useSelector(previewStore, _temp7);
1064
+ const selection = useSelector(previewStore, _temp6);
1065
+ const isPageContentSheetOpen = useSelector(previewStore, _temp7);
1066
+ const isAddBlockSheetOpen = useSelector(previewStore, _temp8);
1054
1067
  const isAnySideSheetOpen = useIsPreviewSheetOpen();
1055
1068
  const isBlockSelected = selection?.blockId === blockData._id;
1056
1069
  const ref = React.useRef(null);
@@ -1123,7 +1136,7 @@ function createBlock(options) {
1123
1136
  result = { ...blockData.content };
1124
1137
  for (const key in result) {
1125
1138
  const value = result[key];
1126
- if (Array.isArray(value) && value.length > 0 && value[0]?.content !== void 0) result[key] = value.map(_temp8);
1139
+ if (Array.isArray(value) && value.length > 0 && value[0]?.content !== void 0) result[key] = value.map(_temp9);
1127
1140
  }
1128
1141
  $[15] = blockData.content;
1129
1142
  $[16] = result;
@@ -1348,9 +1361,9 @@ function createBlock(options) {
1348
1361
  const { blockId, mode, isHovered, setIsHovered } = ctx;
1349
1362
  const isContentEditable = useIsEditable(mode);
1350
1363
  const { window: iframeWindow } = useFrame();
1351
- const selection = useSelector(previewStore, _temp9);
1352
- const isAddBlockSheetOpen = useSelector(previewStore, _temp0);
1353
- const isPageContentSheetOpen = useSelector(previewStore, _temp1);
1364
+ const selection = useSelector(previewStore, _temp0);
1365
+ const isAddBlockSheetOpen = useSelector(previewStore, _temp1);
1366
+ const isPageContentSheetOpen = useSelector(previewStore, _temp10);
1354
1367
  const isBlockSelected = selection?.blockId === blockId;
1355
1368
  const t1 = String(blockId);
1356
1369
  let t2;
@@ -1538,34 +1551,37 @@ function _temp() {
1538
1551
  " to interact with the embed content"
1539
1552
  ] }));
1540
1553
  }
1541
- function _temp2(e_1) {
1554
+ function _temp2(l) {
1555
+ return l.pathname;
1556
+ }
1557
+ function _temp3(e_1) {
1542
1558
  return e_1.preventDefault();
1543
1559
  }
1544
- function _temp3(e_2) {
1560
+ function _temp4(e_2) {
1545
1561
  if (e_2.key === "Escape") e_2.target.blur();
1546
1562
  }
1547
- function _temp4(e_3) {
1563
+ function _temp5(e_3) {
1548
1564
  return e_3.preventDefault();
1549
1565
  }
1550
- function _temp5(state) {
1566
+ function _temp6(state) {
1551
1567
  return state.context.selection;
1552
1568
  }
1553
- function _temp6(state_0) {
1569
+ function _temp7(state_0) {
1554
1570
  return state_0.context.isPageContentSheetOpen;
1555
1571
  }
1556
- function _temp7(state_1) {
1572
+ function _temp8(state_1) {
1557
1573
  return state_1.context.isAddBlockSheetOpen;
1558
1574
  }
1559
- function _temp8(item) {
1575
+ function _temp9(item) {
1560
1576
  return item.content;
1561
1577
  }
1562
- function _temp9(state) {
1578
+ function _temp0(state) {
1563
1579
  return state.context.selection;
1564
1580
  }
1565
- function _temp0(state_0) {
1581
+ function _temp1(state_0) {
1566
1582
  return state_0.context.isAddBlockSheetOpen;
1567
1583
  }
1568
- function _temp1(state_1) {
1584
+ function _temp10(state_1) {
1569
1585
  return state_1.context.isPageContentSheetOpen;
1570
1586
  }
1571
1587
 
@@ -19,6 +19,7 @@ import { PeekedBlock } from "./components/PeekedBlock.js";
19
19
  import { PreviewFrame, PreviewPanel } from "./components/PreviewPanel.js";
20
20
  import { c } from "react/compiler-runtime";
21
21
  import { keepPreviousData, useQuery, useQueryClient, useSuspenseQuery } from "@tanstack/react-query";
22
+ import { useLocation, useNavigate } from "@tanstack/react-router";
22
23
  import { useSelector } from "@xstate/store/react";
23
24
  import * as React from "react";
24
25
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -26,7 +27,6 @@ import { queryKeys } from "@camox/api-contract/query-keys";
26
27
  import { Button } from "@camox/ui/button";
27
28
  import { PanelContent, PanelHeader } from "@camox/ui/panel";
28
29
  import { Tooltip, TooltipContent, TooltipTrigger } from "@camox/ui/tooltip";
29
- import { useLocation, useNavigate } from "@tanstack/react-router";
30
30
  import { Info } from "lucide-react";
31
31
 
32
32
  //#region src/features/preview/CamoxPreview.tsx
@@ -8,13 +8,13 @@ import { trackClientEvent } from "../../../lib/analytics-client.js";
8
8
  import { usePreviewedPage } from "../CamoxPreview.js";
9
9
  import { c } from "react/compiler-runtime";
10
10
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
11
+ import { useLocation } from "@tanstack/react-router";
11
12
  import { useSelector } from "@xstate/store/react";
12
13
  import { generateKeyBetween } from "fractional-indexing";
13
14
  import * as React from "react";
14
15
  import { jsx, jsxs } from "react/jsx-runtime";
15
16
  import { queryKeys } from "@camox/api-contract/query-keys";
16
17
  import { Tooltip, TooltipContent, TooltipTrigger } from "@camox/ui/tooltip";
17
- import { useLocation } from "@tanstack/react-router";
18
18
  import { InfoIcon } from "lucide-react";
19
19
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@camox/ui/command";
20
20
 
@@ -7,11 +7,11 @@ import { PageLocationFieldset } from "./PageLocationFieldset.js";
7
7
  import { Label } from "@camox/ui/label";
8
8
  import { toast } from "@camox/ui/toaster";
9
9
  import { useMutation, useQuery } from "@tanstack/react-query";
10
+ import { useNavigate } from "@tanstack/react-router";
10
11
  import { useSelector } from "@xstate/store/react";
11
12
  import { useEffect } from "react";
12
13
  import { jsx, jsxs } from "react/jsx-runtime";
13
14
  import { Button } from "@camox/ui/button";
14
- import { useNavigate } from "@tanstack/react-router";
15
15
  import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@camox/ui/dialog";
16
16
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@camox/ui/select";
17
17
  import { Spinner } from "@camox/ui/spinner";
@@ -11,12 +11,12 @@ import { c } from "react/compiler-runtime";
11
11
  import { Label } from "@camox/ui/label";
12
12
  import { toast } from "@camox/ui/toaster";
13
13
  import { useMutation, useQuery } from "@tanstack/react-query";
14
+ import { useNavigate } from "@tanstack/react-router";
14
15
  import { useSelector } from "@xstate/store/react";
15
16
  import * as React from "react";
16
17
  import { jsx, jsxs } from "react/jsx-runtime";
17
18
  import { Button } from "@camox/ui/button";
18
19
  import { Tooltip, TooltipContent, TooltipTrigger } from "@camox/ui/tooltip";
19
- import { useNavigate } from "@tanstack/react-router";
20
20
  import { Globe, Info } from "lucide-react";
21
21
  import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@camox/ui/dialog";
22
22
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@camox/ui/select";
@@ -5,11 +5,11 @@ import { cn, formatPathSegment } from "../../../lib/utils.js";
5
5
  import { Popover, PopoverContent, PopoverTrigger } from "@camox/ui/popover";
6
6
  import { toast } from "@camox/ui/toaster";
7
7
  import { useMutation, useQuery } from "@tanstack/react-query";
8
+ import { useLocation, useNavigate } from "@tanstack/react-router";
8
9
  import { useSelector } from "@xstate/store/react";
9
10
  import * as React from "react";
10
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
12
  import { Button } from "@camox/ui/button";
12
- import { useLocation, useNavigate } from "@tanstack/react-router";
13
13
  import { Check, ChevronsUpDown, Pencil, Plus, Trash2 } from "lucide-react";
14
14
  import { Skeleton } from "@camox/ui/skeleton";
15
15
  import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator } from "@camox/ui/command";
@@ -2,10 +2,10 @@ import { previewStore } from "../previewStore.js";
2
2
  import { blockMutations } from "../../../lib/queries.js";
3
3
  import { c } from "react/compiler-runtime";
4
4
  import { useMutation, useQueryClient } from "@tanstack/react-query";
5
+ import { useLocation } from "@tanstack/react-router";
5
6
  import { useSelector } from "@xstate/store/react";
6
7
  import { generateKeyBetween } from "fractional-indexing";
7
8
  import { queryKeys } from "@camox/api-contract/query-keys";
8
- import { useLocation } from "@tanstack/react-router";
9
9
 
10
10
  //#region src/features/preview/components/useUpdateBlockPosition.ts
11
11
  function useUpdateBlockPosition() {
@@ -93,7 +93,7 @@ const UnauthenticatedCamoxProvider = (t0) => {
93
93
  let t4;
94
94
  if ($[5] !== signInRedirect) {
95
95
  t3 = () => {
96
- if (!import.meta.env.PROD) return;
96
+ if (import.meta.env.PROD) return;
97
97
  const toastId = toast("Sign in to open Camox Studio", {
98
98
  duration: Infinity,
99
99
  action: {
@@ -2,11 +2,11 @@ import { seedBlockCaches } from "../../lib/normalized-data.js";
2
2
  import { CamoxPreview, PageContent } from "../preview/CamoxPreview.js";
3
3
  import { trackEvent } from "../../lib/analytics.js";
4
4
  import { c } from "react/compiler-runtime";
5
+ import { notFound } from "@tanstack/react-router";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  import { queryKeys } from "@camox/api-contract/query-keys";
7
8
  import { createORPCClient } from "@orpc/client";
8
9
  import { RPCLink } from "@orpc/client/fetch";
9
- import { notFound } from "@tanstack/react-router";
10
10
  import { createMiddleware, createServerFn } from "@tanstack/react-start";
11
11
  import { getRequest } from "@tanstack/react-start/server";
12
12
 
@@ -70,11 +70,12 @@ function createPageLoader(apiUrl, projectSlug, environmentName) {
70
70
  const [page, origin] = await Promise.all([context.queryClient.ensureQueryData({
71
71
  queryKey: queryKeys.pages.getByPath(location.pathname),
72
72
  queryFn: async () => {
73
- const data = await serverApi.pages.getByPath({
73
+ const [data, pagesList] = await Promise.all([serverApi.pages.getByPath({
74
74
  path: location.pathname,
75
75
  projectSlug
76
- });
76
+ }), serverApi.pages.listBySlug({ projectSlug }).catch(() => null)]);
77
77
  seedBlockCaches(context.queryClient, data);
78
+ if (pagesList) context.queryClient.setQueryData(queryKeys.pages.list, pagesList);
78
79
  return {
79
80
  page: data.page,
80
81
  layout: data.layout,
@@ -1,9 +1,9 @@
1
1
  import { useAuthState, useSignInRedirect } from "../../lib/auth.js";
2
2
  import { Navbar } from "./components/Navbar.js";
3
3
  import { c } from "react/compiler-runtime";
4
+ import { Navigate, useLocation } from "@tanstack/react-router";
4
5
  import * as React from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
- import { Navigate, useLocation } from "@tanstack/react-router";
7
7
 
8
8
  //#region src/features/studio/CamoxStudio.tsx
9
9
  const CamoxStudio = (t0) => {
@@ -10,10 +10,10 @@ import { UserButton } from "./UserButton.js";
10
10
  import { c } from "react/compiler-runtime";
11
11
  import { Kbd } from "@camox/ui/kbd";
12
12
  import { useQuery } from "@tanstack/react-query";
13
+ import { Link, useLocation, useNavigate } from "@tanstack/react-router";
13
14
  import * as React from "react";
14
15
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
16
  import { Button } from "@camox/ui/button";
16
- import { Link, useLocation, useNavigate } from "@tanstack/react-router";
17
17
  import { Database, Globe, SearchIcon } from "lucide-react";
18
18
 
19
19
  //#region src/features/studio/components/Navbar.tsx
@@ -2,10 +2,10 @@ import { AuthContext } from "../../../lib/auth.js";
2
2
  import { projectQueries } from "../../../lib/queries.js";
3
3
  import { c } from "react/compiler-runtime";
4
4
  import { useQuery } from "@tanstack/react-query";
5
+ import { Link } from "@tanstack/react-router";
5
6
  import * as React from "react";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import { Button } from "@camox/ui/button";
8
- import { Link } from "@tanstack/react-router";
9
9
  import { ChevronDown, Globe, Info, Settings, Users } from "lucide-react";
10
10
  import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "@camox/ui/dropdown-menu";
11
11
  import { Skeleton } from "@camox/ui/skeleton";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camox",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "bin": {
5
5
  "camox": "./bin/camox.mjs"
6
6
  },
@@ -97,9 +97,9 @@
97
97
  "react-dom": "^19.2.5",
98
98
  "react-og-preview": "^0.2.0",
99
99
  "shiki": "^4.0.2",
100
- "@camox/api-contract": "0.10.0",
101
- "@camox/cli": "0.10.0",
102
- "@camox/ui": "0.10.0"
100
+ "@camox/cli": "0.10.1",
101
+ "@camox/api-contract": "0.10.1",
102
+ "@camox/ui": "0.10.1"
103
103
  },
104
104
  "devDependencies": {
105
105
  "@babel/core": "^7.29.0",